From a8ccee6b8ace43dd2b7a20c72c36d07d1d90d96d Mon Sep 17 00:00:00 2001 From: Johan Nordberg Date: Thu, 10 Jan 2019 22:55:28 +0900 Subject: [PATCH 01/46] Move memory accessors from module to memory instance --- lib/loader/index.d.ts | 36 +++++++++- lib/loader/index.js | 153 +++++++++++++++++++++++++----------------- 2 files changed, 127 insertions(+), 62 deletions(-) diff --git a/lib/loader/index.d.ts b/lib/loader/index.d.ts index b4814d273f..dabec499dd 100644 --- a/lib/loader/index.d.ts +++ b/lib/loader/index.d.ts @@ -52,15 +52,17 @@ interface ASUtil { readonly F32: Float32Array; /** A 64-bit float view on the memory. */ readonly F64: Float64Array; + /** The extended module memory. */ + readonly memory: ASMemory; /** Allocates a new string in the module's memory and returns its pointer. */ newString(str: string): number; - /** Gets a string from the module's memory by its pointer. */ + /** Gets a string from the module's memory by its pointer. Alias for memory.getString.*/ getString(ptr: number): string; /** Copies a typed array into the module's memory and returns its pointer. */ newArray(view: TypedArray, length?: number): number; /** Creates a typed array in the module's memory and returns its pointer. */ newArray(ctor: TypedArrayConstructor, length: number, unsafe?: boolean): number; - /** Gets a view on a typed array in the module's memory by its pointer. */ + /** Gets a view on a typed array in the module's memory by its pointer. Alias for memory.getArray. */ getArray(ctor: TypedArrayConstructor, ptr: number): T; /** Frees a typed array in the module's memory. Must not be accessed anymore afterwards. */ freeArray(ptr: number): void; @@ -73,6 +75,33 @@ interface ASUtil { newFunction(fn: (...args: any[]) => any): number; } +interface ASMemory extends WebAssembly.Memory { + /** An 8-bit signed integer view on the memory. */ + readonly I8: Uint8Array; + /** An 8-bit unsigned integer view on the memory. */ + readonly U8: Uint8Array; + /** A 16-bit signed integer view on the memory. */ + readonly I16: Uint16Array; + /** A 16-bit unsigned integer view on the memory. */ + readonly U16: Uint16Array; + /** A 32-bit signed integer view on the memory. */ + readonly I32: Uint32Array; + /** A 32-bit unsigned integer view on the memory. */ + readonly U32: Uint32Array; + /** A 64-bit signed integer view on the memory. */ + readonly I64: any; // BigInt64Array + /** A 64-bit unsigned integer vieww on the memory. */ + readonly U64: any; // BigUint64Array + /** A 32-bit float view on the memory. */ + readonly F32: Float32Array; + /** A 64-bit float view on the memory. */ + readonly F64: Float64Array; + /** Gets a string from the module's memory by its pointer. */ + getString(ptr: number): string; + /** Gets a view on a typed array in the module's memory by its pointer. */ + getArray(ctor: TypedArrayConstructor, ptr: number): T; +} + /** Instantiates an AssemblyScript module using the specified imports. */ export declare function instantiate(module: WebAssembly.Module, imports?: ImportsObject): ASUtil & T; @@ -84,3 +113,6 @@ export declare function instantiateStreaming(result: Promise(exports: {}, baseModule?: {}): T; + +/** Creates a wrapped memory instance. */ +export declare function createMemory(descriptor: WebAssembly.MemoryDescriptor): ASMemory; diff --git a/lib/loader/index.js b/lib/loader/index.js index 7f79027bdb..966a536421 100644 --- a/lib/loader/index.js +++ b/lib/loader/index.js @@ -20,12 +20,78 @@ function getStringImpl(U32, U16, ptr) { return parts.join("") + String.fromCharCode.apply(String, U16.subarray(dataOffset, dataOffset + dataRemain)); } +/** Extends memory with accessor functions. */ +function extendMemory(memory) { + if (memory.__extended) return; + + // Provide views for all sorts of basic values + var buffer, I8, U8, I16, U16, I32, U32, F32, F64, I64, U64; + + /** Updates memory views if memory has grown meanwhile. */ + function checkMem() { + // see: https://github.com/WebAssembly/design/issues/1210 + if (buffer !== memory.buffer) { + buffer = memory.buffer; + I8 = new Int8Array(buffer); + U8 = new Uint8Array(buffer); + I16 = new Int16Array(buffer); + U16 = new Uint16Array(buffer); + I32 = new Int32Array(buffer); + U32 = new Uint32Array(buffer); + if (hasBigInt64) { + I64 = new BigInt64Array(buffer); + U64 = new BigUint64Array(buffer); + } + F32 = new Float32Array(buffer); + F64 = new Float64Array(buffer); + } + } + checkMem(); + + /** Gets a string from the module's memory by its pointer. */ + function getString(ptr) { + checkMem(); + return getStringImpl(U32, U16, ptr); + } + + memory.getString = getString; + + /** Gets a view on a typed array in the module's memory by its pointer. */ + function getArray(ctor, ptr) { + var elementSize = ctor.BYTES_PER_ELEMENT; + if (!elementSize) throw Error("not a typed array"); + checkMem(); + var buf = U32[ ptr >>> 2]; + var byteOffset = U32[(ptr + 4) >>> 2]; + var byteLength = U32[(ptr + 8) >>> 2]; + return new ctor(buffer, buf + 8 + byteOffset, (byteLength - byteOffset) / elementSize); + } + + memory.getArray = getArray; + + Object.defineProperties(memory, { + I8: { get: function() { checkMem(); return I8; } }, + U8: { get: function() { checkMem(); return U8; } }, + I16: { get: function() { checkMem(); return I16; } }, + U16: { get: function() { checkMem(); return U16; } }, + I32: { get: function() { checkMem(); return I32; } }, + U32: { get: function() { checkMem(); return U32; } }, + I64: { get: function() { checkMem(); return I64; } }, + U64: { get: function() { checkMem(); return U64; } }, + F32: { get: function() { checkMem(); return F32; } }, + F64: { get: function() { checkMem(); return F64; } } + }) + + memory.__extended = true; +} + /** Prepares the base module prior to instantiation. */ function preInstantiate(imports) { var baseModule = {}; function getString(memory, ptr) { if (!memory) return ""; + if (memory.getString) return memory.getString(ptr); var buffer = memory.buffer; return getStringImpl(new Uint32Array(buffer), new Uint16Array(buffer), ptr); } @@ -56,36 +122,17 @@ function postInstantiate(baseModule, instance) { var table = rawExports.table; var setargc = rawExports._setargc || function() {}; - // Provide views for all sorts of basic values - var buffer, I8, U8, I16, U16, I32, U32, F32, F64, I64, U64; - - /** Updates memory views if memory has grown meanwhile. */ - function checkMem() { - // see: https://github.com/WebAssembly/design/issues/1210 - if (buffer !== memory.buffer) { - buffer = memory.buffer; - I8 = new Int8Array(buffer); - U8 = new Uint8Array(buffer); - I16 = new Int16Array(buffer); - U16 = new Uint16Array(buffer); - I32 = new Int32Array(buffer); - U32 = new Uint32Array(buffer); - if (hasBigInt64) { - I64 = new BigInt64Array(buffer); - U64 = new BigUint64Array(buffer); - } - F32 = new Float32Array(buffer); - F64 = new Float64Array(buffer); - } - } - checkMem(); + extendMemory(memory); + baseModule.memory = memory; + baseModule.getString = memory.getString; + baseModule.getArray = memory.getArray; /** Allocates a new string in the module's memory and returns its pointer. */ function newString(str) { var dataLength = str.length; var ptr = memory_allocate(4 + (dataLength << 1)); var dataOffset = (4 + ptr) >>> 1; - checkMem(); + let U32 = memory.U32, U16 = memory.U16; U32[ptr >>> 2] = dataLength; for (let i = 0; i < dataLength; ++i) U16[dataOffset + i] = str.charCodeAt(i); return ptr; @@ -93,14 +140,6 @@ function postInstantiate(baseModule, instance) { baseModule.newString = newString; - /** Gets a string from the module's memory by its pointer. */ - function getString(ptr) { - checkMem(); - return getStringImpl(U32, U16, ptr); - } - - baseModule.getString = getString; - function computeBufferSize(byteLength) { const HEADER_SIZE = 8; return 1 << (32 - Math.clz32(byteLength + HEADER_SIZE - 1)); @@ -120,14 +159,14 @@ function postInstantiate(baseModule, instance) { var byteLength = elementSize * length; var ptr = memory_allocate(12); // TypedArray header var buf = memory_allocate(computeBufferSize(byteLength)); // ArrayBuffer - checkMem(); + let U32 = memory.U32; U32[ ptr >>> 2] = buf; // .buffer U32[(ptr + 4) >>> 2] = 0; // .byteOffset U32[(ptr + 8) >>> 2] = byteLength; // .byteLength U32[ buf >>> 2] = byteLength; // .byteLength U32[(buf + 4) >>> 2] = 0; // 0 if (view) { - new ctor(buffer, buf + 8, length).set(view); + new ctor(memory.buffer, buf + 8, length).set(view); if (view.length < length && !unsafe) { let setLength = elementSize * view.length; memory_fill(buf + 8 + setLength, 0, byteLength - setLength); @@ -140,23 +179,9 @@ function postInstantiate(baseModule, instance) { baseModule.newArray = newArray; - /** Gets a view on a typed array in the module's memory by its pointer. */ - function getArray(ctor, ptr) { - var elementSize = ctor.BYTES_PER_ELEMENT; - if (!elementSize) throw Error("not a typed array"); - checkMem(); - var buf = U32[ ptr >>> 2]; - var byteOffset = U32[(ptr + 4) >>> 2]; - var byteLength = U32[(ptr + 8) >>> 2]; - return new ctor(buffer, buf + 8 + byteOffset, (byteLength - byteOffset) / elementSize); - } - - baseModule.getArray = getArray; - /** Frees a typed array in the module's memory. Must not be accessed anymore afterwards. */ function freeArray(ptr) { - checkMem(); - var buf = U32[ptr >>> 2]; + var buf = memory.U32[ptr >>> 2]; memory_free(buf); memory_free(ptr); } @@ -185,21 +210,20 @@ function postInstantiate(baseModule, instance) { baseModule.getFunction = getFunction; // Pull basic exports to baseModule so code in preInstantiate can use them - baseModule.memory = baseModule.memory || memory; baseModule.table = baseModule.table || table; // Demangle exports and provide the usual utility on the prototype return demangle(rawExports, Object.defineProperties(baseModule, { - I8: { get: function() { checkMem(); return I8; } }, - U8: { get: function() { checkMem(); return U8; } }, - I16: { get: function() { checkMem(); return I16; } }, - U16: { get: function() { checkMem(); return U16; } }, - I32: { get: function() { checkMem(); return I32; } }, - U32: { get: function() { checkMem(); return U32; } }, - I64: { get: function() { checkMem(); return I64; } }, - U64: { get: function() { checkMem(); return U64; } }, - F32: { get: function() { checkMem(); return F32; } }, - F64: { get: function() { checkMem(); return F64; } } + I8: { get: function() { return memory.I8; } }, + U8: { get: function() { return memory.U8; } }, + I16: { get: function() { return memory.I16; } }, + U16: { get: function() { return memory.U16; } }, + I32: { get: function() { return memory.I32; } }, + U32: { get: function() { return memory.U32; } }, + I64: { get: function() { return memory.I64; } }, + U64: { get: function() { return memory.U64; } }, + F32: { get: function() { return memory.F32; } }, + F64: { get: function() { return memory.F64; } } })); } @@ -322,3 +346,12 @@ function demangle(exports, baseModule) { } exports.demangle = demangle; + +/** Creates a wrapped memory instance. */ +function createMemory(descriptor) { + const memory = new WebAssembly.Memory(descriptor); + extendMemory(memory); + return memory; +} + +exports.createMemory = createMemory; \ No newline at end of file From 4253285c9671f3985ea2719711062b82bea7ca62 Mon Sep 17 00:00:00 2001 From: Johan Nordberg Date: Fri, 11 Jan 2019 18:32:53 +0900 Subject: [PATCH 02/46] Refactor --- lib/loader/index.d.ts | 118 -------- lib/loader/index.js | 357 ------------------------ lib/loader/package.json | 19 +- lib/loader/src/index.ts | 553 ++++++++++++++++++++++++++++++++++++++ lib/loader/tests/index.js | 37 ++- lib/loader/tsconfig.json | 14 + 6 files changed, 595 insertions(+), 503 deletions(-) delete mode 100644 lib/loader/index.d.ts delete mode 100644 lib/loader/index.js create mode 100644 lib/loader/src/index.ts create mode 100644 lib/loader/tsconfig.json diff --git a/lib/loader/index.d.ts b/lib/loader/index.d.ts deleted file mode 100644 index dabec499dd..0000000000 --- a/lib/loader/index.d.ts +++ /dev/null @@ -1,118 +0,0 @@ -import "@types/webassembly-js-api"; - -/** WebAssembly imports with two levels of nesting. */ -interface ImportsObject { - [key: string]: {}, - env: { - memory?: WebAssembly.Memory, - table?: WebAssembly.Table, - abort?: (msg: number, file: number, line: number, column: number) => void - } -} - -type TypedArray - = Int8Array - | Uint8Array - | Int16Array - | Uint16Array - | Int32Array - | Uint32Array - | Float32Array - | Float64Array; - -type TypedArrayConstructor - = Int8ArrayConstructor - | Uint8ArrayConstructor - | Int16ArrayConstructor - | Uint16ArrayConstructor - | Int32ArrayConstructor - | Uint32ArrayConstructor - | Float32ArrayConstructor - | Float32ArrayConstructor; - -/** Utility mixed in by the loader. */ -interface ASUtil { - /** An 8-bit signed integer view on the memory. */ - readonly I8: Uint8Array; - /** An 8-bit unsigned integer view on the memory. */ - readonly U8: Uint8Array; - /** A 16-bit signed integer view on the memory. */ - readonly I16: Uint16Array; - /** A 16-bit unsigned integer view on the memory. */ - readonly U16: Uint16Array; - /** A 32-bit signed integer view on the memory. */ - readonly I32: Uint32Array; - /** A 32-bit unsigned integer view on the memory. */ - readonly U32: Uint32Array; - /** A 64-bit signed integer view on the memory. */ - readonly I64: any; // BigInt64Array - /** A 64-bit unsigned integer vieww on the memory. */ - readonly U64: any; // BigUint64Array - /** A 32-bit float view on the memory. */ - readonly F32: Float32Array; - /** A 64-bit float view on the memory. */ - readonly F64: Float64Array; - /** The extended module memory. */ - readonly memory: ASMemory; - /** Allocates a new string in the module's memory and returns its pointer. */ - newString(str: string): number; - /** Gets a string from the module's memory by its pointer. Alias for memory.getString.*/ - getString(ptr: number): string; - /** Copies a typed array into the module's memory and returns its pointer. */ - newArray(view: TypedArray, length?: number): number; - /** Creates a typed array in the module's memory and returns its pointer. */ - newArray(ctor: TypedArrayConstructor, length: number, unsafe?: boolean): number; - /** Gets a view on a typed array in the module's memory by its pointer. Alias for memory.getArray. */ - getArray(ctor: TypedArrayConstructor, ptr: number): T; - /** Frees a typed array in the module's memory. Must not be accessed anymore afterwards. */ - freeArray(ptr: number): void; - /** Gets a function by its pointer. */ - getFunction(ptr: number): (...args: any[]) => R; - /** - * Creates a new function in the module's table and returns its pointer. Note that only actual - * WebAssembly functions, i.e. as exported by the module, are supported. - */ - newFunction(fn: (...args: any[]) => any): number; -} - -interface ASMemory extends WebAssembly.Memory { - /** An 8-bit signed integer view on the memory. */ - readonly I8: Uint8Array; - /** An 8-bit unsigned integer view on the memory. */ - readonly U8: Uint8Array; - /** A 16-bit signed integer view on the memory. */ - readonly I16: Uint16Array; - /** A 16-bit unsigned integer view on the memory. */ - readonly U16: Uint16Array; - /** A 32-bit signed integer view on the memory. */ - readonly I32: Uint32Array; - /** A 32-bit unsigned integer view on the memory. */ - readonly U32: Uint32Array; - /** A 64-bit signed integer view on the memory. */ - readonly I64: any; // BigInt64Array - /** A 64-bit unsigned integer vieww on the memory. */ - readonly U64: any; // BigUint64Array - /** A 32-bit float view on the memory. */ - readonly F32: Float32Array; - /** A 64-bit float view on the memory. */ - readonly F64: Float64Array; - /** Gets a string from the module's memory by its pointer. */ - getString(ptr: number): string; - /** Gets a view on a typed array in the module's memory by its pointer. */ - getArray(ctor: TypedArrayConstructor, ptr: number): T; -} - -/** Instantiates an AssemblyScript module using the specified imports. */ -export declare function instantiate(module: WebAssembly.Module, imports?: ImportsObject): ASUtil & T; - -/** Instantiates an AssemblyScript module from a buffer using the specified imports. */ -export declare function instantiateBuffer(buffer: Uint8Array, imports?: ImportsObject): ASUtil & T; - -/** Instantiates an AssemblyScript module from a response using the specified imports. */ -export declare function instantiateStreaming(result: Promise, imports?: ImportsObject): Promise; - -/** Demangles an AssemblyScript module's exports to a friendly object structure. */ -export declare function demangle(exports: {}, baseModule?: {}): T; - -/** Creates a wrapped memory instance. */ -export declare function createMemory(descriptor: WebAssembly.MemoryDescriptor): ASMemory; diff --git a/lib/loader/index.js b/lib/loader/index.js deleted file mode 100644 index 966a536421..0000000000 --- a/lib/loader/index.js +++ /dev/null @@ -1,357 +0,0 @@ -"use strict"; - -const hasBigInt64 = typeof BigUint64Array !== "undefined"; -const thisPtr = Symbol(); - -/** Gets a string from an U32 and an U16 view on a memory. */ -function getStringImpl(U32, U16, ptr) { - var dataLength = U32[ptr >>> 2]; - var dataOffset = (ptr + 4) >>> 1; - var dataRemain = dataLength; - var parts = []; - const chunkSize = 1024; - while (dataRemain > chunkSize) { - let last = U16[dataOffset + chunkSize - 1]; - let size = last >= 0xD800 && last < 0xDC00 ? chunkSize - 1 : chunkSize; - let part = U16.subarray(dataOffset, dataOffset += size); - parts.push(String.fromCharCode.apply(String, part)); - dataRemain -= size; - } - return parts.join("") + String.fromCharCode.apply(String, U16.subarray(dataOffset, dataOffset + dataRemain)); -} - -/** Extends memory with accessor functions. */ -function extendMemory(memory) { - if (memory.__extended) return; - - // Provide views for all sorts of basic values - var buffer, I8, U8, I16, U16, I32, U32, F32, F64, I64, U64; - - /** Updates memory views if memory has grown meanwhile. */ - function checkMem() { - // see: https://github.com/WebAssembly/design/issues/1210 - if (buffer !== memory.buffer) { - buffer = memory.buffer; - I8 = new Int8Array(buffer); - U8 = new Uint8Array(buffer); - I16 = new Int16Array(buffer); - U16 = new Uint16Array(buffer); - I32 = new Int32Array(buffer); - U32 = new Uint32Array(buffer); - if (hasBigInt64) { - I64 = new BigInt64Array(buffer); - U64 = new BigUint64Array(buffer); - } - F32 = new Float32Array(buffer); - F64 = new Float64Array(buffer); - } - } - checkMem(); - - /** Gets a string from the module's memory by its pointer. */ - function getString(ptr) { - checkMem(); - return getStringImpl(U32, U16, ptr); - } - - memory.getString = getString; - - /** Gets a view on a typed array in the module's memory by its pointer. */ - function getArray(ctor, ptr) { - var elementSize = ctor.BYTES_PER_ELEMENT; - if (!elementSize) throw Error("not a typed array"); - checkMem(); - var buf = U32[ ptr >>> 2]; - var byteOffset = U32[(ptr + 4) >>> 2]; - var byteLength = U32[(ptr + 8) >>> 2]; - return new ctor(buffer, buf + 8 + byteOffset, (byteLength - byteOffset) / elementSize); - } - - memory.getArray = getArray; - - Object.defineProperties(memory, { - I8: { get: function() { checkMem(); return I8; } }, - U8: { get: function() { checkMem(); return U8; } }, - I16: { get: function() { checkMem(); return I16; } }, - U16: { get: function() { checkMem(); return U16; } }, - I32: { get: function() { checkMem(); return I32; } }, - U32: { get: function() { checkMem(); return U32; } }, - I64: { get: function() { checkMem(); return I64; } }, - U64: { get: function() { checkMem(); return U64; } }, - F32: { get: function() { checkMem(); return F32; } }, - F64: { get: function() { checkMem(); return F64; } } - }) - - memory.__extended = true; -} - -/** Prepares the base module prior to instantiation. */ -function preInstantiate(imports) { - var baseModule = {}; - - function getString(memory, ptr) { - if (!memory) return ""; - if (memory.getString) return memory.getString(ptr); - var buffer = memory.buffer; - return getStringImpl(new Uint32Array(buffer), new Uint16Array(buffer), ptr); - } - - // add common imports used by stdlib for convenience - var env = (imports.env = imports.env || {}); - env.abort = env.abort || function abort(mesg, file, line, colm) { - var memory = baseModule.memory || env.memory; // prefer exported, otherwise try imported - throw Error("abort: " + getString(memory, mesg) + " at " + getString(memory, file) + ":" + line + ":" + colm); - } - env.trace = env.trace || function trace(mesg, n) { - var memory = baseModule.memory || env.memory; - console.log("trace: " + getString(memory, mesg) + (n ? " " : "") + Array.prototype.slice.call(arguments, 2, 2 + n).join(", ")); - } - imports.Math = imports.Math || Math; - imports.Date = imports.Date || Date; - - return baseModule; -} - -/** Prepares the final module once instantiation is complete. */ -function postInstantiate(baseModule, instance) { - var rawExports = instance.exports; - var memory = rawExports.memory; - var memory_allocate = rawExports["memory.allocate"]; - var memory_fill = rawExports["memory.fill"]; - var memory_free = rawExports["memory.free"]; - var table = rawExports.table; - var setargc = rawExports._setargc || function() {}; - - extendMemory(memory); - baseModule.memory = memory; - baseModule.getString = memory.getString; - baseModule.getArray = memory.getArray; - - /** Allocates a new string in the module's memory and returns its pointer. */ - function newString(str) { - var dataLength = str.length; - var ptr = memory_allocate(4 + (dataLength << 1)); - var dataOffset = (4 + ptr) >>> 1; - let U32 = memory.U32, U16 = memory.U16; - U32[ptr >>> 2] = dataLength; - for (let i = 0; i < dataLength; ++i) U16[dataOffset + i] = str.charCodeAt(i); - return ptr; - } - - baseModule.newString = newString; - - function computeBufferSize(byteLength) { - const HEADER_SIZE = 8; - return 1 << (32 - Math.clz32(byteLength + HEADER_SIZE - 1)); - } - - /** Creates a new typed array in the module's memory and returns its pointer. */ - function newArray(view, length, unsafe) { - var ctor = view.constructor; - if (ctor === Function) { // TypedArray constructor created in memory - ctor = view; - view = null; - } else { // TypedArray instance copied into memory - if (length === undefined) length = view.length; - } - var elementSize = ctor.BYTES_PER_ELEMENT; - if (!elementSize) throw Error("not a typed array"); - var byteLength = elementSize * length; - var ptr = memory_allocate(12); // TypedArray header - var buf = memory_allocate(computeBufferSize(byteLength)); // ArrayBuffer - let U32 = memory.U32; - U32[ ptr >>> 2] = buf; // .buffer - U32[(ptr + 4) >>> 2] = 0; // .byteOffset - U32[(ptr + 8) >>> 2] = byteLength; // .byteLength - U32[ buf >>> 2] = byteLength; // .byteLength - U32[(buf + 4) >>> 2] = 0; // 0 - if (view) { - new ctor(memory.buffer, buf + 8, length).set(view); - if (view.length < length && !unsafe) { - let setLength = elementSize * view.length; - memory_fill(buf + 8 + setLength, 0, byteLength - setLength); - } - } else if (!unsafe) { - memory_fill(buf + 8, 0, byteLength); - } - return ptr; - } - - baseModule.newArray = newArray; - - /** Frees a typed array in the module's memory. Must not be accessed anymore afterwards. */ - function freeArray(ptr) { - var buf = memory.U32[ptr >>> 2]; - memory_free(buf); - memory_free(ptr); - } - - baseModule.freeArray = freeArray; - - /** - * Creates a new function in the module's table and returns its pointer. Note that only actual - * WebAssembly functions, i.e. as exported by the module, are supported. - */ - function newFunction(fn) { - if (typeof fn.original === "function") fn = fn.original; - var index = table.length; - table.grow(1); - table.set(index, fn); - return index; - } - - baseModule.newFunction = newFunction; - - /** Gets a function by its pointer. */ - function getFunction(ptr) { - return wrapFunction(table.get(ptr), setargc); - } - - baseModule.getFunction = getFunction; - - // Pull basic exports to baseModule so code in preInstantiate can use them - baseModule.table = baseModule.table || table; - - // Demangle exports and provide the usual utility on the prototype - return demangle(rawExports, Object.defineProperties(baseModule, { - I8: { get: function() { return memory.I8; } }, - U8: { get: function() { return memory.U8; } }, - I16: { get: function() { return memory.I16; } }, - U16: { get: function() { return memory.U16; } }, - I32: { get: function() { return memory.I32; } }, - U32: { get: function() { return memory.U32; } }, - I64: { get: function() { return memory.I64; } }, - U64: { get: function() { return memory.U64; } }, - F32: { get: function() { return memory.F32; } }, - F64: { get: function() { return memory.F64; } } - })); -} - -/** Wraps a WebAssembly function while also taking care of variable arguments. */ -function wrapFunction(fn, setargc) { - var wrap = (...args) => { - setargc(args.length); - return fn(...args); - } - // adding a function to the table with `newFunction` is limited to actual WebAssembly functions, - // hence we can't use the wrapper and instead need to provide a reference to the original - wrap.original = fn; - return wrap; -} - -/** Instantiates an AssemblyScript module using the specified imports. */ -function instantiate(module, imports) { - return postInstantiate( - preInstantiate(imports || (imports = {})), - new WebAssembly.Instance(module, imports) - ); -} - -exports.instantiate = instantiate; - -/** Instantiates an AssemblyScript module from a buffer using the specified imports. */ -function instantiateBuffer(buffer, imports) { - return instantiate(new WebAssembly.Module(buffer), imports); -} - -exports.instantiateBuffer = instantiateBuffer; - -/** Instantiates an AssemblyScript module from a response using the specified imports. */ -async function instantiateStreaming(response, imports) { - return postInstantiate( - preInstantiate(imports || (imports = {})), - (await WebAssembly.instantiateStreaming(response, imports)).instance - ); -} - -exports.instantiateStreaming = instantiateStreaming; - -/** Demangles an AssemblyScript module's exports to a friendly object structure. */ -function demangle(exports, baseModule) { - var module = baseModule ? Object.create(baseModule) : {}; - var setargc = exports._setargc || function() {}; - function hasOwnProperty(elem, prop) { - return Object.prototype.hasOwnProperty.call(elem, prop); - } - for (let internalName in exports) { - if (!hasOwnProperty(exports, internalName)) continue; - let elem = exports[internalName]; - let parts = internalName.split("."); - let curr = module; - while (parts.length > 1) { - let part = parts.shift(); - if (!hasOwnProperty(curr, part)) curr[part] = {}; - curr = curr[part]; - } - let name = parts[0]; - let hash = name.indexOf("#"); - if (hash >= 0) { - let className = name.substring(0, hash); - let classElem = curr[className]; - if (typeof classElem === "undefined" || !classElem.prototype) { - let ctor = function(...args) { - return ctor.wrap(ctor.prototype.constructor(0, ...args)); - }; - ctor.prototype = {}; - ctor.wrap = function(thisValue) { - return Object.create(ctor.prototype, { [thisPtr]: { value: thisValue, writable: false } }); - }; - if (classElem) Object.getOwnPropertyNames(classElem).forEach(name => - Object.defineProperty(ctor, name, Object.getOwnPropertyDescriptor(classElem, name)) - ); - curr[className] = ctor; - } - name = name.substring(hash + 1); - curr = curr[className].prototype; - if (/^(get|set):/.test(name)) { - if (!hasOwnProperty(curr, name = name.substring(4))) { - let getter = exports[internalName.replace("set:", "get:")]; - let setter = exports[internalName.replace("get:", "set:")]; - Object.defineProperty(curr, name, { - get: function() { return getter(this[thisPtr]); }, - set: function(value) { setter(this[thisPtr], value); }, - enumerable: true - }); - } - } else { - if (name === 'constructor') { - curr[name] = wrapFunction(elem, setargc); - } else { // for methods - Object.defineProperty(curr, name, { - value: function (...args) { - setargc(args.length); - return elem(this[thisPtr], ...args); - } - }); - } - } - } else { - if (/^(get|set):/.test(name)) { - if (!hasOwnProperty(curr, name = name.substring(4))) { - Object.defineProperty(curr, name, { - get: exports[internalName.replace("set:", "get:")], - set: exports[internalName.replace("get:", "set:")], - enumerable: true - }); - } - } else if (typeof elem === "function") { - curr[name] = wrapFunction(elem, setargc); - } else { - curr[name] = elem; - } - } - } - - return module; -} - -exports.demangle = demangle; - -/** Creates a wrapped memory instance. */ -function createMemory(descriptor) { - const memory = new WebAssembly.Memory(descriptor); - extendMemory(memory); - return memory; -} - -exports.createMemory = createMemory; \ No newline at end of file diff --git a/lib/loader/package.json b/lib/loader/package.json index 0edaf3fab3..a012749de1 100644 --- a/lib/loader/package.json +++ b/lib/loader/package.json @@ -1,19 +1,20 @@ { "name": "@assemblyscript/loader", - "version": "1.0.0", - "main": "index.js", - "types": "index.d.ts", + "version": "2.0.0", + "license": "Apache-2.0", + "main": "./lib/index", + "typings": "./lib/index", "scripts": { + "build": "tsc", + "prepublishOnly": "tsc", "test:build": "asc tests/assembly/index.ts -b tests/build/untouched.wasm", "test": "node tests" }, "files": [ - "index.d.ts", - "index.js", - "package.json", - "README.md" + "lib/*" ], - "dependencies": { - "@types/webassembly-js-api": "0.0.1" + "devDependencies": { + "@types/webassembly-js-api": "0.0.1", + "typescript": "^3.2.2" } } diff --git a/lib/loader/src/index.ts b/lib/loader/src/index.ts new file mode 100644 index 0000000000..7e2467385a --- /dev/null +++ b/lib/loader/src/index.ts @@ -0,0 +1,553 @@ +/** AssemblyScript module loader. */ + +export type TypedArray = Int8Array + | Uint8Array + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | Float32Array + | Float64Array + +export type TypedArrayConstructor = Int8ArrayConstructor + | Uint8ArrayConstructor + | Int16ArrayConstructor + | Uint16ArrayConstructor + | Int32ArrayConstructor + | Uint32ArrayConstructor + | Float32ArrayConstructor + | Float32ArrayConstructor + +export type ASExport = { [key: string]: any } + +export interface ASInstance extends WebAssembly.Instance { + readonly memory: ASMemory + readonly table: ASTable +} + +export interface ASTable extends WebAssembly.Table { + /** Gets a function by its pointer. */ + getFunction(ptr: number): (...args: any[]) => R + /** + * Creates a new function in the module's table and returns its pointer. Note that only actual + * WebAssembly functions, i.e. as exported by the module, are supported. + */ + newFunction(fn: (...args: any[]) => any): number +} + +export interface ASMemory extends WebAssembly.Memory { + /** An 8-bit signed integer view on the memory. */ + readonly I8: Int8Array; + /** An 8-bit unsigned integer view on the memory. */ + readonly U8: Uint8Array; + /** A 16-bit signed integer view on the memory. */ + readonly I16: Int16Array; + /** A 16-bit unsigned integer view on the memory. */ + readonly U16: Uint16Array; + /** A 32-bit signed integer view on the memory. */ + readonly I32: Int32Array; + /** A 32-bit unsigned integer view on the memory. */ + readonly U32: Uint32Array; + /** A 64-bit signed integer view on the memory. */ + readonly I64?: BigInt64Array + /** A 64-bit unsigned integer vieww on the memory. */ + readonly U64?: BigUint64Array + /** A 32-bit float view on the memory. */ + readonly F32: Float32Array; + /** A 64-bit float view on the memory. */ + readonly F64: Float64Array; + /** Allocates a new string in the module's memory and returns its pointer. */ + newString(str: string): number + /** Gets a string from the module's memory by its pointer. Alias for memory.getString.*/ + getString(ptr: number): string + /** Copies a typed array into the module's memory and returns its pointer. */ + newArray(view: TypedArray, length?: number): number + /** Creates a typed array in the module's memory and returns its pointer. */ + newArray(ctor: TypedArrayConstructor, length: number, unsafe?: boolean): number + /** Gets a view on a typed array in the module's memory by its pointer. Alias for memory.getArray. */ + getArray(ctor: TypedArrayConstructor, ptr: number): T + /** Frees a typed array in the module's memory. Must not be accessed anymore afterwards. */ + freeArray(ptr: number): void + // exported methods + allocate(size: number): number + compare(vl: number, vr: number, n: number): number + copy(dest: number, src: number, n: number): void + fill(ptr: number, value: number, size: number): void + free(ptr: number): void + reset(): void +} + +const ORIG_REF = Symbol('original') +const SELF_REF = Symbol('self') + +export namespace utils { + export const hasBigInt64 = typeof BigUint64Array !== 'undefined' + export function readString(U32: Uint32Array, U16: Uint16Array, ptr: number): string { + const chunkSize = 1024 + const dataLength = U32[ptr >>> 2] + let dataOffset = (ptr + 4) >>> 1 + let dataRemain = dataLength + let parts: string[] = [] + while (dataRemain > chunkSize) { + let last = U16[dataOffset + chunkSize - 1] + let size = last >= 0xD800 && last < 0xDC00 ? chunkSize - 1 : chunkSize + let part: any = U16.subarray(dataOffset, dataOffset += size) + parts.push(String.fromCharCode.apply(String, part)) + dataRemain -= size + } + const lastPart: any = U16.subarray(dataOffset, dataOffset + dataRemain) + parts.push(String.fromCharCode.apply(String, lastPart)) + return parts.join('') + } + export function computeBufferSize(byteLength: number) { + const HEADER_SIZE = 8 + return 1 << (32 - Math.clz32(byteLength + HEADER_SIZE - 1)) + } + export function hasOwnProperty(obj: any, key: any): boolean { + return Object.prototype.hasOwnProperty.call(obj, key) + } +} + +class MemoryWrapper implements ASMemory { + + static resolve(value: MemoryWrapper | WebAssembly.Memory): MemoryWrapper { + if (value instanceof MemoryWrapper) { + return value + } else { + return new MemoryWrapper(value) + } + } + + /** The underlying memory instance. */ + raw: WebAssembly.Memory + + private _U8?: Uint8Array + private _U16?: Uint16Array + private _U32?: Uint32Array + private _U64?: BigUint64Array + + private _I8?: Int8Array + private _I16?: Int16Array + private _I32?: Int32Array + private _I64?: BigInt64Array + + private _F32?: Float32Array + private _F64?: Float64Array + + constructor(memory: WebAssembly.Memory) { + this.raw = memory + } + + // ASMemory conformance + + newString(str: string): number { + let dataLength = str.length + let ptr = this.allocate(4 + (dataLength << 1)) + let dataOffset = (4 + ptr) >>> 1 + let U32 = this.U32, U16 = this.U16 + U32[ptr >>> 2] = dataLength + for (let i = 0; i < dataLength; ++i) { + U16[dataOffset + i] = str.charCodeAt(i) + } + return ptr + } + + getString(ptr: number): string { + return utils.readString(this.U32, this.U16, ptr) + } + + newArray(viewOrCtor: TypedArray | TypedArrayConstructor, length?: number, unsafe?: boolean): number { + let ctor: TypedArrayConstructor + let view: TypedArray | null + if (viewOrCtor.constructor === Function) { // TypedArray constructor created in memory + ctor = viewOrCtor as TypedArrayConstructor + view = null + } else { // TypedArray instance copied into memory + ctor = viewOrCtor.constructor as TypedArrayConstructor + view = viewOrCtor as TypedArray + if (length === undefined) { + length = viewOrCtor.length + } + } + if (length === undefined) { + throw new Error('Length missing') + } + const elementSize = ctor.BYTES_PER_ELEMENT + if (!elementSize) throw Error('Not a typed array') + const byteLength = elementSize * length + const ptr = this.allocate(12) // TypedArray header + const buf = this.allocate(utils.computeBufferSize(byteLength)) // ArrayBuffer + const U32 = this.U32 + U32[ ptr >>> 2] = buf // .buffer + U32[(ptr + 4) >>> 2] = 0 // .byteOffset + U32[(ptr + 8) >>> 2] = byteLength // .byteLength + U32[ buf >>> 2] = byteLength // .byteLength + U32[(buf + 4) >>> 2] = 0 // 0 + if (view) { + new ctor(this.buffer, buf + 8, length).set(view as TypedArray) + if (view.length < length && !unsafe) { + let setLength = elementSize * view.length + this.fill(buf + 8 + setLength, 0, byteLength - setLength) + } + } else if (!unsafe) { + this.fill(buf + 8, 0, byteLength) + } + return ptr + } + + getArray(ctor: TypedArrayConstructor, ptr: number): T { + const elementSize = ctor.BYTES_PER_ELEMENT; + if (!elementSize) throw Error('Not a typed array') + const U32 = this.U32 + const buf = U32[ ptr >>> 2] + const byteOffset = U32[(ptr + 4) >>> 2] + const byteLength = U32[(ptr + 8) >>> 2] + return new ctor( + this.buffer, + buf + 8 + byteOffset, + (byteLength - byteOffset) / elementSize + ) as T + } + + freeArray(ptr: number) { + const buf = this.U32[ptr >>> 2] + this.free(buf) + this.free(ptr) + } + + get U8(): Uint8Array { + if (!this._U8 || this._U8.buffer !== this.raw.buffer) { + this._U8 = new Uint8Array(this.raw.buffer) + } + return this._U8 + } + + get U16(): Uint16Array { + if (!this._U16 || this._U16.buffer !== this.raw.buffer) { + this._U16 = new Uint16Array(this.raw.buffer) + } + return this._U16 + } + + get U32(): Uint32Array { + if (!this._U32 || this._U32.buffer !== this.raw.buffer) { + this._U32 = new Uint32Array(this.raw.buffer) + } + return this._U32 + } + + get U64(): BigUint64Array | undefined { + if (!utils.hasBigInt64) { return } + if (!this._U64 || this._U64.buffer !== this.raw.buffer) { + this._U64 = new BigUint64Array(this.raw.buffer) + } + return this._U64 + } + + get I8(): Int8Array { + if (!this._I8 || this._I8.buffer !== this.raw.buffer) { + this._I8 = new Int8Array(this.raw.buffer) + } + return this._I8 + } + + get I16(): Int16Array { + if (!this._I16 || this._I16.buffer !== this.raw.buffer) { + this._I16 = new Int16Array(this.raw.buffer) + } + return this._I16 + } + + get I32(): Int32Array { + if (!this._I32 || this._I32.buffer !== this.raw.buffer) { + this._I32 = new Int32Array(this.raw.buffer) + } + return this._I32 + } + + get I64(): BigInt64Array | undefined { + if (!utils.hasBigInt64) { return } + if (!this._I64 || this._I64.buffer !== this.raw.buffer) { + this._I64 = new BigInt64Array(this.raw.buffer) + } + return this._I64 + } + + get F32(): Float32Array { + if (!this._F32 || this._F32.buffer !== this.raw.buffer) { + this._F32 = new Float32Array(this.raw.buffer) + } + return this._F32 + } + + get F64(): Float64Array { + if (!this._F64 || this._F64.buffer !== this.raw.buffer) { + this._F64 = new Float64Array(this.raw.buffer) + } + return this._F64 + } + + allocate(size: number): number { + throw new Error('Memory not initialized') + } + + compare(vl: number, vr: number, n: number): number { + throw new Error('Memory not initialized') + } + + copy(dest: number, src: number, n: number) { + throw new Error('Memory not initialized') + } + + fill(ptr: number, value: number, size: number) { + throw new Error('Memory not initialized') + } + + free(ptr: number) { + throw new Error('Memory not initialized') + } + + reset() { + throw new Error('Memory not initialized') + } + + // WebAssembly.Memory conformance + + public grow(numPages: number): number { + return this.raw.grow(numPages) + } + + public get buffer(): ArrayBuffer { + return this.raw.buffer + } + + // Internal methods + + setExports(rawExports: any) { + const methods = ['allocate', 'compare', 'copy', 'fill', 'free', 'reset'] + for (const method of methods) { + const exportedMethod = `memory.${ method }` + if (rawExports[exportedMethod]) { + (this)[method] = rawExports[exportedMethod] + } else { + (this)[method] = () => { throw new Error('Method not exported') } + } + } + } +} + +class TableWrapper implements ASTable { + + /** The underlying table instance. */ + raw: WebAssembly.Table + + constructor(table: WebAssembly.Table) { + this.raw = table + } + + // ASTable conformance + + getFunction(ptr: number): (...args: any[]) => R { + return this.wrapFunction(this.get(ptr)) + } + + newFunction(fn: (...args: any[]) => any): number { + if (typeof (fn)[ORIG_REF] === 'function') fn = (fn)[ORIG_REF] + const index = this.length + this.grow(1) + this.set(index, fn) + return index + } + + // WebAssembly.Table conformance + + grow(numElements: number): number { + return this.raw.grow(numElements) + } + + set(index: number, value: (args: any[]) => any) { + return this.raw.set(index, value) + } + + get(index: number): (args: any[]) => any { + return this.raw.get(index) + } + + get length(): number { + return this.raw.length + } + + // Internal methods + + setargc(n: number) {} + + /** Wraps a WebAssembly function while also taking care of variable arguments. */ + wrapFunction(fn: any) { + const wrap: any = (...args: any[]) => { + this.setargc(args.length) + return fn(...args) + } + // adding a function to the table with `newFunction` is limited to actual WebAssembly functions, + // hence we can't use the wrapper and instead need to provide a reference to the original + wrap[ORIG_REF] = fn + return wrap + } + + setExports(rawExports: any) { + if (rawExports['_setargc']) { + this.setargc = rawExports['_setargc'] + } + } +} + +interface InstanceContext { + memory: MemoryWrapper | null + imports: any +} + +function createContext(imports: any = {}) { + const ctx: InstanceContext = { + imports, + memory: imports.memory ? MemoryWrapper.resolve(imports.memory) : null + } + const env = (imports.env = imports.env || {}) + const getString = (ptr: number) => ctx.memory ? ctx.memory.getString(ptr) : '' + if (!env.abort) { + env.abort = function abort(mesg: number, file: number, line: number, colm: number) { + throw Error(`Abort: ${ getString(mesg) } at ${ getString(file) }: ${ line }:${ colm }`) + } + } + if (!env.trace) { + env.trace = function trace(mesg: number, n: number, ...args: number[]) { + let msg = `trace: ${ getString(mesg) }` + if (n) { msg += ` ${ args.slice(0, n).join(', ') }` } + console.log(msg) + } + } + return ctx +} + +function resolveContext(instance: WebAssembly.Instance, ctx: InstanceContext): ASInstance & T { + const table = new TableWrapper(instance.exports.table) + table.setExports(instance.exports) + + ctx.memory = MemoryWrapper.resolve(instance.exports.memory) + ctx.memory.setExports(instance.exports) + + let resolved: any = {} + for (const internalName in instance.exports) { + if (!utils.hasOwnProperty(instance.exports, internalName)) { continue } + // resolve nested objects + let parts = internalName.split('.') + let name = parts[0] + // ignore internals + if (name === 'memory' || name === 'table' || name === '_setargc') { continue } + let curr = resolved + while (parts.length > 1) { + const part = parts.shift()! + if (!utils.hasOwnProperty(curr, part)) { + curr[part] = {} + } + curr = curr[part] + } + const elem = instance.exports[internalName] + let hash = name.indexOf('#') + if (hash >= 0) { + // resolve classes + const className = name.substring(0, hash) + const classElem = curr[className] + if (typeof classElem === 'undefined' || !classElem.prototype) { + const ctor: any = function(...args: any[]) { + return ctor.wrap(ctor.prototype.constructor(0, ...args)) + } + ctor.prototype = {} + ctor.wrap = function(thisValue: any) { + return Object.create(ctor.prototype, { + [SELF_REF]: {value: thisValue, writable: false} + }) + } + if (classElem) { + Object.getOwnPropertyNames(classElem).forEach((propName) => { + Object.defineProperty(ctor, propName, Object.getOwnPropertyDescriptor(classElem, propName)!) + }) + } + curr[className] = ctor + } + name = name.substring(hash + 1) + curr = curr[className].prototype + if (/^(get|set):/.test(name)) { + name = name.substring(4) + if (!utils.hasOwnProperty(curr, name)) { + const getter = instance.exports[internalName.replace("set:", "get:")] + const setter = instance.exports[internalName.replace("get:", "set:")] + Object.defineProperty(curr, name, { + get: function() { return getter(this[SELF_REF]) }, + set: function(value) { setter(this[SELF_REF], value) }, + enumerable: true + }) + } + } else { + if (name === 'constructor') { + curr[name] = table.wrapFunction(elem) + } else { // for methods + Object.defineProperty(curr, name, { + value: function(...args: any[]) { + table.setargc(args.length) + return elem(this[SELF_REF], ...args) + } + }) + } + } + } else { + // resolve props + if (/^(get|set):/.test(name)) { + name = name.substring(4) + if (!utils.hasOwnProperty(curr, name)) { + Object.defineProperty(curr, name, { + get: instance.exports[internalName.replace("set:", "get:")], + set: instance.exports[internalName.replace("get:", "set:")], + enumerable: true + }) + } + } else if (typeof elem === "function") { + curr[name] = table.wrapFunction(elem) + } else { + curr[name] = elem + } + } + } + return { + memory: ctx.memory, + table, + ...resolved + } +} + +/** Instantiates an AssemblyScript module using the specified imports. */ +export function instantiate(module: WebAssembly.Module, imports: any = {}): ASInstance & T { + const ctx = createContext(imports) + const instance = new WebAssembly.Instance(module, ctx.imports) + return resolveContext(instance, ctx) +} + +/** Instantiates an AssemblyScript module from a buffer using the specified imports. */ +export function instantiateBuffer(buffer: any, imports: any = {}): ASInstance & T { + return instantiate(new WebAssembly.Module(buffer), imports); +} + +/** Instantiates an AssemblyScript module from a response using the specified imports. */ +async function instantiateStreaming(response: any, imports: any = {}): Promise { + const ctx = createContext(imports) + const {instance} = await (WebAssembly as any).instantiateStreaming(response, ctx.imports) + return resolveContext(instance, ctx) +} + +/** Creates a wrapped memory instance. */ +export function createMemory(descriptor: WebAssembly.MemoryDescriptor): ASMemory { + return new MemoryWrapper(new WebAssembly.Memory(descriptor)) +} + +/** Demangles an AssemblyScript module's exports to a friendly object structure. */ +export function demangle(instance: WebAssembly.Instance) { + return resolveContext(instance, createContext()) +} diff --git a/lib/loader/tests/index.js b/lib/loader/tests/index.js index 133dda77f7..d6ac0ee603 100644 --- a/lib/loader/tests/index.js +++ b/lib/loader/tests/index.js @@ -9,40 +9,39 @@ var module = loader.instantiateBuffer(buffer, {}); console.log(inspect(module, true, 100, true)); // should inherit the usual utility -var proto = Object.getPrototypeOf(module); -assert(proto.I8 instanceof Int8Array); -assert(proto.U8 instanceof Uint8Array); -assert(proto.I16 instanceof Int16Array); -assert(proto.U16 instanceof Uint16Array); -assert(proto.I32 instanceof Int32Array); -assert(proto.U32 instanceof Uint32Array); -assert(proto.F32 instanceof Float32Array); -assert(proto.F64 instanceof Float64Array); +assert(module.memory.I8 instanceof Int8Array); +assert(module.memory.U8 instanceof Uint8Array); +assert(module.memory.I16 instanceof Int16Array); +assert(module.memory.U16 instanceof Uint16Array); +assert(module.memory.I32 instanceof Int32Array); +assert(module.memory.U32 instanceof Uint32Array); +assert(module.memory.F32 instanceof Float32Array); +assert(module.memory.F64 instanceof Float64Array); // should export memory -assert(module.memory instanceof WebAssembly.Memory); +assert(typeof module.memory.grow === "function"); assert(typeof module.memory.free === "function"); // should be able to get an exported string -assert.strictEqual(module.getString(module.COLOR), "red"); +assert.strictEqual(module.memory.getString(module.COLOR), "red"); // should be able to allocate and work with a new string var str = "Hello world!𤭢"; -var ptr = module.newString(str); -assert.strictEqual(module.getString(ptr), str); +var ptr = module.memory.newString(str); +assert.strictEqual(module.memory.getString(ptr), str); assert.strictEqual(module.strlen(ptr), str.length); // should be able to allocate a typed array and sum up its values var arr = [1, 2, 3, 4, 5, 0x7fffffff]; -ptr = module.newArray(new Int32Array(arr)); +ptr = module.memory.newArray(new Int32Array(arr)); assert.strictEqual(module.sum(ptr), arr.reduce((a, b) => a + b, 0) | 0); // should be able to get a view on an internal typed array -assert.deepEqual(module.getArray(Int32Array, ptr), arr); +assert.deepEqual(module.memory.getArray(Int32Array, ptr), arr); // should be able to free and reuse the space of an internal typed array -module.freeArray(ptr); -var ptr2 = module.newArray(new Int32Array(arr)); +module.memory.freeArray(ptr); +var ptr2 = module.memory.newArray(new Int32Array(arr)); assert.strictEqual(ptr, ptr2); // should be able to just call a function with variable arguments @@ -51,13 +50,13 @@ assert.strictEqual(module.varadd(2, 3), 5); assert.strictEqual(module.varadd(2), 4); // should be able to get a function from the table and just call it with variable arguments -var fn = module.getFunction(module.varadd_ptr); +var fn = module.table.getFunction(module.varadd_ptr); assert.strictEqual(fn(), 3); assert.strictEqual(fn(2, 3), 5); assert.strictEqual(fn(2), 4); // should be able to create a new function and call it from WASM -ptr = module.newFunction(module.varadd); +ptr = module.table.newFunction(module.varadd); assert.strictEqual(module.calladd(ptr, 2, 3), 5); // should be able to use a class diff --git a/lib/loader/tsconfig.json b/lib/loader/tsconfig.json new file mode 100644 index 0000000000..5f94b88338 --- /dev/null +++ b/lib/loader/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "declaration": true, + "lib": ["dom", "es2015", "esnext.bigint", "es2017.typedarrays"], + "module": "commonjs", + "moduleResolution": "node", + "outDir": "lib", + "target": "es6", + "strict": true, + }, + "include": [ + "src/**/*.ts" + ] +} \ No newline at end of file From 4e7a1fe071b01b89c07d5508b8b89fd3b4344f35 Mon Sep 17 00:00:00 2001 From: Johan Nordberg Date: Sat, 12 Jan 2019 22:17:15 +0900 Subject: [PATCH 03/46] Fix bug when instantiating with wrapped memory --- lib/loader/src/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/loader/src/index.ts b/lib/loader/src/index.ts index 7e2467385a..036a10ed7d 100644 --- a/lib/loader/src/index.ts +++ b/lib/loader/src/index.ts @@ -424,6 +424,9 @@ function createContext(imports: any = {}) { console.log(msg) } } + if (env.memory instanceof MemoryWrapper) { + env.memory = env.memory.raw + } return ctx } From 184da678bfc8a8d1c826ecd836bbfd57d12c09e5 Mon Sep 17 00:00:00 2001 From: Johan Nordberg Date: Fri, 18 Jan 2019 18:23:17 +0900 Subject: [PATCH 04/46] Add semicolons and lint --- lib/loader/src/index.ts | 490 ++++++++++++++++++++-------------------- 1 file changed, 245 insertions(+), 245 deletions(-) diff --git a/lib/loader/src/index.ts b/lib/loader/src/index.ts index 036a10ed7d..49ed0c3698 100644 --- a/lib/loader/src/index.ts +++ b/lib/loader/src/index.ts @@ -7,7 +7,7 @@ export type TypedArray = Int8Array | Int32Array | Uint32Array | Float32Array - | Float64Array + | Float64Array; export type TypedArrayConstructor = Int8ArrayConstructor | Uint8ArrayConstructor @@ -16,23 +16,23 @@ export type TypedArrayConstructor = Int8ArrayConstructor | Int32ArrayConstructor | Uint32ArrayConstructor | Float32ArrayConstructor - | Float32ArrayConstructor + | Float32ArrayConstructor; -export type ASExport = { [key: string]: any } +export interface ASExport { [key: string]: any } export interface ASInstance extends WebAssembly.Instance { - readonly memory: ASMemory - readonly table: ASTable + readonly memory: ASMemory; + readonly table: ASTable; } export interface ASTable extends WebAssembly.Table { /** Gets a function by its pointer. */ - getFunction(ptr: number): (...args: any[]) => R + getFunction(ptr: number): (...args: any[]) => R; /** * Creates a new function in the module's table and returns its pointer. Note that only actual * WebAssembly functions, i.e. as exported by the module, are supported. */ - newFunction(fn: (...args: any[]) => any): number + newFunction(fn: (...args: any[]) => any): number; } export interface ASMemory extends WebAssembly.Memory { @@ -49,288 +49,288 @@ export interface ASMemory extends WebAssembly.Memory { /** A 32-bit unsigned integer view on the memory. */ readonly U32: Uint32Array; /** A 64-bit signed integer view on the memory. */ - readonly I64?: BigInt64Array + readonly I64?: BigInt64Array; /** A 64-bit unsigned integer vieww on the memory. */ - readonly U64?: BigUint64Array + readonly U64?: BigUint64Array; /** A 32-bit float view on the memory. */ readonly F32: Float32Array; /** A 64-bit float view on the memory. */ readonly F64: Float64Array; /** Allocates a new string in the module's memory and returns its pointer. */ - newString(str: string): number - /** Gets a string from the module's memory by its pointer. Alias for memory.getString.*/ - getString(ptr: number): string + newString(str: string): number; + /** Gets a string from the module's memory by its pointer. Alias for memory.getString. */ + getString(ptr: number): string; /** Copies a typed array into the module's memory and returns its pointer. */ - newArray(view: TypedArray, length?: number): number + newArray(view: TypedArray, length?: number): number; /** Creates a typed array in the module's memory and returns its pointer. */ - newArray(ctor: TypedArrayConstructor, length: number, unsafe?: boolean): number + newArray(ctor: TypedArrayConstructor, length: number, unsafe?: boolean): number; /** Gets a view on a typed array in the module's memory by its pointer. Alias for memory.getArray. */ - getArray(ctor: TypedArrayConstructor, ptr: number): T + getArray(ctor: TypedArrayConstructor, ptr: number): T; /** Frees a typed array in the module's memory. Must not be accessed anymore afterwards. */ - freeArray(ptr: number): void + freeArray(ptr: number): void; // exported methods - allocate(size: number): number - compare(vl: number, vr: number, n: number): number - copy(dest: number, src: number, n: number): void - fill(ptr: number, value: number, size: number): void - free(ptr: number): void - reset(): void + allocate(size: number): number; + compare(vl: number, vr: number, n: number): number; + copy(dest: number, src: number, n: number): void; + fill(ptr: number, value: number, size: number): void; + free(ptr: number): void; + reset(): void; } -const ORIG_REF = Symbol('original') -const SELF_REF = Symbol('self') +const ORIG_REF = Symbol('original'); +const SELF_REF = Symbol('self'); export namespace utils { - export const hasBigInt64 = typeof BigUint64Array !== 'undefined' + export const hasBigInt64 = typeof BigUint64Array !== 'undefined'; export function readString(U32: Uint32Array, U16: Uint16Array, ptr: number): string { - const chunkSize = 1024 - const dataLength = U32[ptr >>> 2] - let dataOffset = (ptr + 4) >>> 1 - let dataRemain = dataLength - let parts: string[] = [] + const chunkSize = 1024; + const dataLength = U32[ptr >>> 2]; + let dataOffset = (ptr + 4) >>> 1; + let dataRemain = dataLength; + const parts: string[] = []; while (dataRemain > chunkSize) { - let last = U16[dataOffset + chunkSize - 1] - let size = last >= 0xD800 && last < 0xDC00 ? chunkSize - 1 : chunkSize - let part: any = U16.subarray(dataOffset, dataOffset += size) - parts.push(String.fromCharCode.apply(String, part)) - dataRemain -= size + const last = U16[dataOffset + chunkSize - 1]; + const size = last >= 0xD800 && last < 0xDC00 ? chunkSize - 1 : chunkSize; + const part: any = U16.subarray(dataOffset, dataOffset += size); + parts.push(String.fromCharCode.apply(String, part)); + dataRemain -= size; } - const lastPart: any = U16.subarray(dataOffset, dataOffset + dataRemain) - parts.push(String.fromCharCode.apply(String, lastPart)) - return parts.join('') + const lastPart: any = U16.subarray(dataOffset, dataOffset + dataRemain); + parts.push(String.fromCharCode.apply(String, lastPart)); + return parts.join(''); } export function computeBufferSize(byteLength: number) { - const HEADER_SIZE = 8 - return 1 << (32 - Math.clz32(byteLength + HEADER_SIZE - 1)) + const HEADER_SIZE = 8; + return 1 << (32 - Math.clz32(byteLength + HEADER_SIZE - 1)); } export function hasOwnProperty(obj: any, key: any): boolean { - return Object.prototype.hasOwnProperty.call(obj, key) + return Object.prototype.hasOwnProperty.call(obj, key); } } class MemoryWrapper implements ASMemory { - static resolve(value: MemoryWrapper | WebAssembly.Memory): MemoryWrapper { + public static resolve(value: MemoryWrapper | WebAssembly.Memory): MemoryWrapper { if (value instanceof MemoryWrapper) { - return value + return value; } else { - return new MemoryWrapper(value) + return new MemoryWrapper(value); } } /** The underlying memory instance. */ - raw: WebAssembly.Memory + public raw: WebAssembly.Memory; - private _U8?: Uint8Array - private _U16?: Uint16Array - private _U32?: Uint32Array - private _U64?: BigUint64Array + private _U8?: Uint8Array; + private _U16?: Uint16Array; + private _U32?: Uint32Array; + private _U64?: BigUint64Array; - private _I8?: Int8Array - private _I16?: Int16Array - private _I32?: Int32Array - private _I64?: BigInt64Array + private _I8?: Int8Array; + private _I16?: Int16Array; + private _I32?: Int32Array; + private _I64?: BigInt64Array; - private _F32?: Float32Array - private _F64?: Float64Array + private _F32?: Float32Array; + private _F64?: Float64Array; constructor(memory: WebAssembly.Memory) { - this.raw = memory + this.raw = memory; } // ASMemory conformance - newString(str: string): number { - let dataLength = str.length - let ptr = this.allocate(4 + (dataLength << 1)) - let dataOffset = (4 + ptr) >>> 1 - let U32 = this.U32, U16 = this.U16 - U32[ptr >>> 2] = dataLength + public newString(str: string): number { + const dataLength = str.length; + const ptr = this.allocate(4 + (dataLength << 1)); + const dataOffset = (4 + ptr) >>> 1; + const U32 = this.U32, U16 = this.U16; + U32[ptr >>> 2] = dataLength; for (let i = 0; i < dataLength; ++i) { - U16[dataOffset + i] = str.charCodeAt(i) + U16[dataOffset + i] = str.charCodeAt(i); } - return ptr + return ptr; } - getString(ptr: number): string { - return utils.readString(this.U32, this.U16, ptr) + public getString(ptr: number): string { + return utils.readString(this.U32, this.U16, ptr); } - newArray(viewOrCtor: TypedArray | TypedArrayConstructor, length?: number, unsafe?: boolean): number { - let ctor: TypedArrayConstructor - let view: TypedArray | null + public newArray(viewOrCtor: TypedArray | TypedArrayConstructor, length?: number, unsafe?: boolean): number { + let ctor: TypedArrayConstructor; + let view: TypedArray | null; if (viewOrCtor.constructor === Function) { // TypedArray constructor created in memory - ctor = viewOrCtor as TypedArrayConstructor - view = null + ctor = viewOrCtor as TypedArrayConstructor; + view = null; } else { // TypedArray instance copied into memory - ctor = viewOrCtor.constructor as TypedArrayConstructor - view = viewOrCtor as TypedArray + ctor = viewOrCtor.constructor as TypedArrayConstructor; + view = viewOrCtor as TypedArray; if (length === undefined) { - length = viewOrCtor.length + length = viewOrCtor.length; } } if (length === undefined) { - throw new Error('Length missing') + throw new Error('Length missing'); } - const elementSize = ctor.BYTES_PER_ELEMENT - if (!elementSize) throw Error('Not a typed array') - const byteLength = elementSize * length - const ptr = this.allocate(12) // TypedArray header - const buf = this.allocate(utils.computeBufferSize(byteLength)) // ArrayBuffer - const U32 = this.U32 - U32[ ptr >>> 2] = buf // .buffer - U32[(ptr + 4) >>> 2] = 0 // .byteOffset - U32[(ptr + 8) >>> 2] = byteLength // .byteLength - U32[ buf >>> 2] = byteLength // .byteLength - U32[(buf + 4) >>> 2] = 0 // 0 + const elementSize = ctor.BYTES_PER_ELEMENT; + if (!elementSize) { throw Error('Not a typed array'); } + const byteLength = elementSize * length; + const ptr = this.allocate(12); // TypedArray header + const buf = this.allocate(utils.computeBufferSize(byteLength)); // ArrayBuffer + const U32 = this.U32; + U32[ ptr >>> 2] = buf; // .buffer + U32[(ptr + 4) >>> 2] = 0; // .byteOffset + U32[(ptr + 8) >>> 2] = byteLength; // .byteLength + U32[ buf >>> 2] = byteLength; // .byteLength + U32[(buf + 4) >>> 2] = 0; // 0 if (view) { - new ctor(this.buffer, buf + 8, length).set(view as TypedArray) + new ctor(this.buffer, buf + 8, length).set(view as TypedArray); if (view.length < length && !unsafe) { - let setLength = elementSize * view.length - this.fill(buf + 8 + setLength, 0, byteLength - setLength) + const setLength = elementSize * view.length; + this.fill(buf + 8 + setLength, 0, byteLength - setLength); } } else if (!unsafe) { - this.fill(buf + 8, 0, byteLength) + this.fill(buf + 8, 0, byteLength); } - return ptr + return ptr; } - getArray(ctor: TypedArrayConstructor, ptr: number): T { + public getArray(ctor: TypedArrayConstructor, ptr: number): T { const elementSize = ctor.BYTES_PER_ELEMENT; - if (!elementSize) throw Error('Not a typed array') - const U32 = this.U32 - const buf = U32[ ptr >>> 2] - const byteOffset = U32[(ptr + 4) >>> 2] - const byteLength = U32[(ptr + 8) >>> 2] + if (!elementSize) { throw Error('Not a typed array'); } + const U32 = this.U32; + const buf = U32[ ptr >>> 2]; + const byteOffset = U32[(ptr + 4) >>> 2]; + const byteLength = U32[(ptr + 8) >>> 2]; return new ctor( this.buffer, buf + 8 + byteOffset, - (byteLength - byteOffset) / elementSize - ) as T + (byteLength - byteOffset) / elementSize, + ) as T; } - freeArray(ptr: number) { - const buf = this.U32[ptr >>> 2] - this.free(buf) - this.free(ptr) + public freeArray(ptr: number) { + const buf = this.U32[ptr >>> 2]; + this.free(buf); + this.free(ptr); } get U8(): Uint8Array { if (!this._U8 || this._U8.buffer !== this.raw.buffer) { - this._U8 = new Uint8Array(this.raw.buffer) + this._U8 = new Uint8Array(this.raw.buffer); } - return this._U8 + return this._U8; } get U16(): Uint16Array { if (!this._U16 || this._U16.buffer !== this.raw.buffer) { - this._U16 = new Uint16Array(this.raw.buffer) + this._U16 = new Uint16Array(this.raw.buffer); } - return this._U16 + return this._U16; } get U32(): Uint32Array { if (!this._U32 || this._U32.buffer !== this.raw.buffer) { - this._U32 = new Uint32Array(this.raw.buffer) + this._U32 = new Uint32Array(this.raw.buffer); } - return this._U32 + return this._U32; } get U64(): BigUint64Array | undefined { - if (!utils.hasBigInt64) { return } + if (!utils.hasBigInt64) { return; } if (!this._U64 || this._U64.buffer !== this.raw.buffer) { - this._U64 = new BigUint64Array(this.raw.buffer) + this._U64 = new BigUint64Array(this.raw.buffer); } - return this._U64 + return this._U64; } get I8(): Int8Array { if (!this._I8 || this._I8.buffer !== this.raw.buffer) { - this._I8 = new Int8Array(this.raw.buffer) + this._I8 = new Int8Array(this.raw.buffer); } - return this._I8 + return this._I8; } get I16(): Int16Array { if (!this._I16 || this._I16.buffer !== this.raw.buffer) { - this._I16 = new Int16Array(this.raw.buffer) + this._I16 = new Int16Array(this.raw.buffer); } - return this._I16 + return this._I16; } get I32(): Int32Array { if (!this._I32 || this._I32.buffer !== this.raw.buffer) { - this._I32 = new Int32Array(this.raw.buffer) + this._I32 = new Int32Array(this.raw.buffer); } - return this._I32 + return this._I32; } get I64(): BigInt64Array | undefined { - if (!utils.hasBigInt64) { return } + if (!utils.hasBigInt64) { return; } if (!this._I64 || this._I64.buffer !== this.raw.buffer) { - this._I64 = new BigInt64Array(this.raw.buffer) + this._I64 = new BigInt64Array(this.raw.buffer); } - return this._I64 + return this._I64; } get F32(): Float32Array { if (!this._F32 || this._F32.buffer !== this.raw.buffer) { - this._F32 = new Float32Array(this.raw.buffer) + this._F32 = new Float32Array(this.raw.buffer); } - return this._F32 + return this._F32; } get F64(): Float64Array { if (!this._F64 || this._F64.buffer !== this.raw.buffer) { - this._F64 = new Float64Array(this.raw.buffer) + this._F64 = new Float64Array(this.raw.buffer); } - return this._F64 + return this._F64; } - allocate(size: number): number { - throw new Error('Memory not initialized') + public allocate(size: number): number { + throw new Error('Memory not initialized'); } - compare(vl: number, vr: number, n: number): number { - throw new Error('Memory not initialized') + public compare(vl: number, vr: number, n: number): number { + throw new Error('Memory not initialized'); } - copy(dest: number, src: number, n: number) { - throw new Error('Memory not initialized') + public copy(dest: number, src: number, n: number) { + throw new Error('Memory not initialized'); } - fill(ptr: number, value: number, size: number) { - throw new Error('Memory not initialized') + public fill(ptr: number, value: number, size: number) { + throw new Error('Memory not initialized'); } - free(ptr: number) { - throw new Error('Memory not initialized') + public free(ptr: number) { + throw new Error('Memory not initialized'); } - reset() { - throw new Error('Memory not initialized') + public reset() { + throw new Error('Memory not initialized'); } // WebAssembly.Memory conformance public grow(numPages: number): number { - return this.raw.grow(numPages) + return this.raw.grow(numPages); } - public get buffer(): ArrayBuffer { - return this.raw.buffer + get buffer(): ArrayBuffer { + return this.raw.buffer; } // Internal methods - setExports(rawExports: any) { - const methods = ['allocate', 'compare', 'copy', 'fill', 'free', 'reset'] + public setExports(rawExports: any) { + const methods = ['allocate', 'compare', 'copy', 'fill', 'free', 'reset']; for (const method of methods) { - const exportedMethod = `memory.${ method }` + const exportedMethod = `memory.${ method }`; if (rawExports[exportedMethod]) { - (this)[method] = rawExports[exportedMethod] + (this as any)[method] = rawExports[exportedMethod]; } else { - (this)[method] = () => { throw new Error('Method not exported') } + (this as any)[method] = () => { throw new Error('Method not exported'); }; } } } @@ -339,198 +339,198 @@ class MemoryWrapper implements ASMemory { class TableWrapper implements ASTable { /** The underlying table instance. */ - raw: WebAssembly.Table + public raw: WebAssembly.Table; constructor(table: WebAssembly.Table) { - this.raw = table + this.raw = table; } // ASTable conformance - getFunction(ptr: number): (...args: any[]) => R { - return this.wrapFunction(this.get(ptr)) + public getFunction(ptr: number): (...args: any[]) => R { + return this.wrapFunction(this.get(ptr)); } - newFunction(fn: (...args: any[]) => any): number { - if (typeof (fn)[ORIG_REF] === 'function') fn = (fn)[ORIG_REF] - const index = this.length - this.grow(1) - this.set(index, fn) - return index + public newFunction(fn: (...args: any[]) => any): number { + if (typeof (fn as any)[ORIG_REF] === 'function') { fn = (fn as any)[ORIG_REF]; } + const index = this.length; + this.grow(1); + this.set(index, fn); + return index; } // WebAssembly.Table conformance - grow(numElements: number): number { - return this.raw.grow(numElements) + public grow(numElements: number): number { + return this.raw.grow(numElements); } - set(index: number, value: (args: any[]) => any) { - return this.raw.set(index, value) + public set(index: number, value: (args: any[]) => any) { + return this.raw.set(index, value); } - get(index: number): (args: any[]) => any { - return this.raw.get(index) + public get(index: number): (args: any[]) => any { + return this.raw.get(index); } get length(): number { - return this.raw.length + return this.raw.length; } // Internal methods - setargc(n: number) {} + public setargc(n: number) {} /** Wraps a WebAssembly function while also taking care of variable arguments. */ - wrapFunction(fn: any) { + public wrapFunction(fn: any) { const wrap: any = (...args: any[]) => { - this.setargc(args.length) - return fn(...args) - } + this.setargc(args.length); + return fn(...args); + }; // adding a function to the table with `newFunction` is limited to actual WebAssembly functions, // hence we can't use the wrapper and instead need to provide a reference to the original - wrap[ORIG_REF] = fn - return wrap + wrap[ORIG_REF] = fn; + return wrap; } - setExports(rawExports: any) { - if (rawExports['_setargc']) { - this.setargc = rawExports['_setargc'] + public setExports(rawExports: any) { + if (rawExports._setargc) { + this.setargc = rawExports._setargc; } } } interface InstanceContext { - memory: MemoryWrapper | null - imports: any + memory: MemoryWrapper | null; + imports: any; } function createContext(imports: any = {}) { const ctx: InstanceContext = { imports, - memory: imports.memory ? MemoryWrapper.resolve(imports.memory) : null - } - const env = (imports.env = imports.env || {}) - const getString = (ptr: number) => ctx.memory ? ctx.memory.getString(ptr) : '' + memory: imports.memory ? MemoryWrapper.resolve(imports.memory) : null, + }; + const env = (imports.env = imports.env || {}); + const getString = (ptr: number) => ctx.memory ? ctx.memory.getString(ptr) : ''; if (!env.abort) { env.abort = function abort(mesg: number, file: number, line: number, colm: number) { - throw Error(`Abort: ${ getString(mesg) } at ${ getString(file) }: ${ line }:${ colm }`) - } + throw Error(`Abort: ${ getString(mesg) } at ${ getString(file) }: ${ line }:${ colm }`); + }; } if (!env.trace) { env.trace = function trace(mesg: number, n: number, ...args: number[]) { - let msg = `trace: ${ getString(mesg) }` - if (n) { msg += ` ${ args.slice(0, n).join(', ') }` } - console.log(msg) - } + let msg = `trace: ${ getString(mesg) }`; + if (n) { msg += ` ${ args.slice(0, n).join(', ') }`; } + console.log(msg); + }; } if (env.memory instanceof MemoryWrapper) { - env.memory = env.memory.raw + env.memory = env.memory.raw; } - return ctx + return ctx; } function resolveContext(instance: WebAssembly.Instance, ctx: InstanceContext): ASInstance & T { - const table = new TableWrapper(instance.exports.table) - table.setExports(instance.exports) + const table = new TableWrapper(instance.exports.table); + table.setExports(instance.exports); - ctx.memory = MemoryWrapper.resolve(instance.exports.memory) - ctx.memory.setExports(instance.exports) + ctx.memory = MemoryWrapper.resolve(instance.exports.memory); + ctx.memory.setExports(instance.exports); - let resolved: any = {} + const resolved: any = {}; for (const internalName in instance.exports) { - if (!utils.hasOwnProperty(instance.exports, internalName)) { continue } + if (!utils.hasOwnProperty(instance.exports, internalName)) { continue; } // resolve nested objects - let parts = internalName.split('.') - let name = parts[0] + const parts = internalName.split('.'); + let name = parts[0]; // ignore internals - if (name === 'memory' || name === 'table' || name === '_setargc') { continue } - let curr = resolved + if (name === 'memory' || name === 'table' || name === '_setargc') { continue; } + let curr = resolved; while (parts.length > 1) { - const part = parts.shift()! + const part = parts.shift()!; if (!utils.hasOwnProperty(curr, part)) { - curr[part] = {} + curr[part] = {}; } - curr = curr[part] + curr = curr[part]; } - const elem = instance.exports[internalName] - let hash = name.indexOf('#') + const elem = instance.exports[internalName]; + const hash = name.indexOf('#'); if (hash >= 0) { // resolve classes - const className = name.substring(0, hash) - const classElem = curr[className] + const className = name.substring(0, hash); + const classElem = curr[className]; if (typeof classElem === 'undefined' || !classElem.prototype) { const ctor: any = function(...args: any[]) { - return ctor.wrap(ctor.prototype.constructor(0, ...args)) - } - ctor.prototype = {} + return ctor.wrap(ctor.prototype.constructor(0, ...args)); + }; + ctor.prototype = {}; ctor.wrap = function(thisValue: any) { return Object.create(ctor.prototype, { - [SELF_REF]: {value: thisValue, writable: false} - }) - } + [SELF_REF]: {value: thisValue, writable: false}, + }); + }; if (classElem) { Object.getOwnPropertyNames(classElem).forEach((propName) => { - Object.defineProperty(ctor, propName, Object.getOwnPropertyDescriptor(classElem, propName)!) - }) + Object.defineProperty(ctor, propName, Object.getOwnPropertyDescriptor(classElem, propName)!); + }); } - curr[className] = ctor + curr[className] = ctor; } - name = name.substring(hash + 1) - curr = curr[className].prototype + name = name.substring(hash + 1); + curr = curr[className].prototype; if (/^(get|set):/.test(name)) { - name = name.substring(4) + name = name.substring(4); if (!utils.hasOwnProperty(curr, name)) { - const getter = instance.exports[internalName.replace("set:", "get:")] - const setter = instance.exports[internalName.replace("get:", "set:")] + const getter = instance.exports[internalName.replace('set:', 'get:')]; + const setter = instance.exports[internalName.replace('get:', 'set:')]; Object.defineProperty(curr, name, { - get: function() { return getter(this[SELF_REF]) }, - set: function(value) { setter(this[SELF_REF], value) }, - enumerable: true - }) + get() { return getter(this[SELF_REF]); }, + set(value) { setter(this[SELF_REF], value); }, + enumerable: true, + }); } } else { if (name === 'constructor') { - curr[name] = table.wrapFunction(elem) + curr[name] = table.wrapFunction(elem); } else { // for methods Object.defineProperty(curr, name, { - value: function(...args: any[]) { - table.setargc(args.length) - return elem(this[SELF_REF], ...args) - } - }) + value(...args: any[]) { + table.setargc(args.length); + return elem(this[SELF_REF], ...args); + }, + }); } } } else { // resolve props if (/^(get|set):/.test(name)) { - name = name.substring(4) + name = name.substring(4); if (!utils.hasOwnProperty(curr, name)) { Object.defineProperty(curr, name, { - get: instance.exports[internalName.replace("set:", "get:")], - set: instance.exports[internalName.replace("get:", "set:")], - enumerable: true - }) + get: instance.exports[internalName.replace('set:', 'get:')], + set: instance.exports[internalName.replace('get:', 'set:')], + enumerable: true, + }); } - } else if (typeof elem === "function") { - curr[name] = table.wrapFunction(elem) + } else if (typeof elem === 'function') { + curr[name] = table.wrapFunction(elem); } else { - curr[name] = elem + curr[name] = elem; } } } return { memory: ctx.memory, table, - ...resolved - } + ...resolved, + }; } /** Instantiates an AssemblyScript module using the specified imports. */ export function instantiate(module: WebAssembly.Module, imports: any = {}): ASInstance & T { - const ctx = createContext(imports) - const instance = new WebAssembly.Instance(module, ctx.imports) - return resolveContext(instance, ctx) + const ctx = createContext(imports); + const instance = new WebAssembly.Instance(module, ctx.imports); + return resolveContext(instance, ctx); } /** Instantiates an AssemblyScript module from a buffer using the specified imports. */ @@ -540,17 +540,17 @@ export function instantiateBuffer(buffer: any, imports: any = {}): /** Instantiates an AssemblyScript module from a response using the specified imports. */ async function instantiateStreaming(response: any, imports: any = {}): Promise { - const ctx = createContext(imports) - const {instance} = await (WebAssembly as any).instantiateStreaming(response, ctx.imports) - return resolveContext(instance, ctx) + const ctx = createContext(imports); + const {instance} = await (WebAssembly as any).instantiateStreaming(response, ctx.imports); + return resolveContext(instance, ctx); } /** Creates a wrapped memory instance. */ export function createMemory(descriptor: WebAssembly.MemoryDescriptor): ASMemory { - return new MemoryWrapper(new WebAssembly.Memory(descriptor)) + return new MemoryWrapper(new WebAssembly.Memory(descriptor)); } /** Demangles an AssemblyScript module's exports to a friendly object structure. */ export function demangle(instance: WebAssembly.Instance) { - return resolveContext(instance, createContext()) + return resolveContext(instance, createContext()); } From 7e387779bfea4f3877e3ef7eee57faf475a2a37c Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Wed, 2 Jan 2019 13:50:48 +0100 Subject: [PATCH 05/46] new Branch for parser --- lib/parse/assembly/buffer/index.ts | 94 + lib/parse/assembly/host/index.ts | 26 + lib/parse/assembly/index.ts | 477 +- lib/parse/assembly/module/exports.ts | 14 + lib/parse/assembly/module/imports.ts | 10 + lib/parse/assembly/module/index.ts | 493 ++ .../assembly/module/instructions/index.ts | 360 ++ lib/parse/assembly/options.ts | 20 - lib/parse/build/index.wat | 4805 ++++++++++++++++- lib/parse/index.js | 4 + lib/parse/index.js.map | 6 +- lib/parse/package-lock.json | 4064 ++++++++++++++ lib/parse/package.json | 1 + lib/parse/src/common.ts | 337 +- lib/parse/src/index.ts | 75 +- lib/parse/tests/index.ts | 2 +- 16 files changed, 10047 insertions(+), 741 deletions(-) create mode 100644 lib/parse/assembly/buffer/index.ts create mode 100644 lib/parse/assembly/host/index.ts create mode 100644 lib/parse/assembly/module/exports.ts create mode 100644 lib/parse/assembly/module/imports.ts create mode 100644 lib/parse/assembly/module/index.ts create mode 100644 lib/parse/assembly/module/instructions/index.ts delete mode 100644 lib/parse/assembly/options.ts create mode 100644 lib/parse/package-lock.json diff --git a/lib/parse/assembly/buffer/index.ts b/lib/parse/assembly/buffer/index.ts new file mode 100644 index 0000000000..647a901440 --- /dev/null +++ b/lib/parse/assembly/buffer/index.ts @@ -0,0 +1,94 @@ +import "allocator/arena"; + +export class Buffer { + buffer: Uint8Array; + length: usize; + off: usize; + + /** Current offset in memory. */ + constructor(array: Uint8Array){ + this.buffer = array + this.off = array.buffer.data; + this.length = array.byteLength; + } + + + /** Reads an unsigned integer from memory. */ + readUint(): u32 { + var pos = this.off; + var val = load(pos); + this.off = pos + sizeof(); + return val; + } + + peakUint(): u32 { + return (load(this.off)); + } + + /** Reads an unsigned 64-bit integer from memory. */ + readUint64(): u64 { + var pos = this.off; + var val = load(pos); + this.off = pos + 8; + return val; + } + + /** Reads a LEB128-encoded unsigned integer from memory. */ + readVaruint(size: u32): u32 { + var val: u32 = 0; + var shl: u32 = 0; + var byt: u32; + var pos = this.off; + do { + byt = load(pos++); + val |= (byt & 0x7F) << shl; + if (!(byt & 0x80)) break; + shl += 7; + } while (true); + this.off = pos; + return val; + } + + peekVaruint(size: u32): u32 { + let before = this.off; + let res = this.readVaruint(size); + this .off = before; + return res; + } + + /** Reads a LEB128-encoded signed integer from memory. */ + readVarint(size: u32): i32 { + var val: u32 = 0; + var shl: u32 = 0; + var byt: u32; + var pos = this.off; + do { + byt = load(pos++); + val |= (byt & 0x7F) << shl; + shl += 7; + } while (byt & 0x80); + this.off = pos; + return select(val | (~0 << shl), val, shl < size && (byt & 0x40) != 0); + } + + readVarint8(size: u32): i8 { + return changetype(this.readVarint(size)); + } + + /** Reads a LEB128-encoded signed 64-bit integer from memory. */ + readVarint64(): i64 { + var val: u64 = 0; + var shl: u64 = 0; + var byt: u64; + var pos = this.off; + do { + byt = load(pos++); + val |= (byt & 0x7F) << shl; + shl += 7; + } while (byt & 0x80); + this.off = pos; + return select(val | (~0 << shl), val, shl < 64 && (byt & 0x40) != 0); + } + + +} diff --git a/lib/parse/assembly/host/index.ts b/lib/parse/assembly/host/index.ts new file mode 100644 index 0000000000..a5ab069c08 --- /dev/null +++ b/lib/parse/assembly/host/index.ts @@ -0,0 +1,26 @@ +// Imported callbacks +export declare function _log(x: T, size: usize): void; +export declare function _log_str(x: string): void; +export declare function _logi(x: i32): void; +export declare function _logf(x: f32): void; + + +export function log(item: T):void { + if (isReference()) { + if (isString()) { + _log_str(changetype(item)); + } else { + _log(changetype(item), offsetof()); + } + } else { + if (isInteger()) { + _logi(item); + } else { + _logf(item); + } + } +} + +export function log_str(item: string): void { + log(item); +} diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index ed11da9a3f..7a156dfff5 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -11,397 +11,114 @@ import { Opcode } from "../src/common"; -import * as opt from "./options"; +export {memory} +import {Buffer} from './buffer'; +import {SectionHeader, + TypeSection, + Module} from './module'; +import {log} from './host'; -/** Current offset in memory. */ -var off: usize = 0; +declare function debug():void; -/** Reads an unsigned integer from memory. */ -function readUint(): u32 { - var pos = off; - var val = load(pos); - off = pos + sizeof(); - return val; -} +// type FunctionName = string | symbol; +// type Instance = [Function, Object]; +// +// let instance: Object; +// let methods: Map = new Map(); -/** Reads an unsigned 64-bit integer from memory. */ -function readUint64(): u64 { - var pos = off; - var val = load(pos); - off = pos + 8; - return val; -} +// function registerClass(name:string): any { +// type Ctor = new (...args: any[]) => T; +// return (target: T): Ctor => { +// // Save a reference to the original constructor +// const Original = target; +// let self:T = this; +// debugger; +// // the new constructor behaviour +// let decoratedConstructor: any = function(...args: any[]): void { +// // log("Before construction:"); +// // +// Original.apply(this, args); +// instance = this; +// // console.log("After construction: ", self.instance !== undefined); +// }; +// +// // Copy prototype so intanceof operator still works +// decoratedConstructor.prototype = Original.prototype; +// // Copy static members too +// Object.keys(Original).forEach((name: string) => +// { decoratedConstructor[name] = (Original)[name]; }); +// +// // Return new constructor (will override original) +// return decoratedConstructor; +// }; +// +// } -/** Reads a LEB128-encoded unsigned integer from memory. */ -function readVaruint(size: u32): u32 { - var val: u32 = 0; - var shl: u32 = 0; - var byt: u32; - var pos = off; - do { - byt = load(pos++); - val |= (byt & 0x7F) << shl; - if (!(byt & 0x80)) break; - shl += 7; - } while (true); - off = pos; - return val; -} +let type: TypeSection; -/** Reads a LEB128-encoded signed integer from memory. */ -function readVarint(size: u32): i32 { - var val: u32 = 0; - var shl: u32 = 0; - var byt: u32; - var pos = off; - do { - byt = load(pos++); - val |= (byt & 0x7F) << shl; - shl += 7; - } while (byt & 0x80); - off = pos; - return select(val | (~0 << shl), val, shl < size && (byt & 0x40) != 0); +export function getType(m: Module): string { + let headers:SectionHeader[] = m.getID(SectionId.Type); + let section = new TypeSection(headers[0]); + type = section.parse(m.buf); + return type.toString(); } -/** Reads a LEB128-encoded signed 64-bit integer from memory. */ -function readVarint64(): i64 { - var val: u64 = 0; - var shl: u64 = 0; - var byt: u64; - var pos = off; - do { - byt = load(pos++); - val |= (byt & 0x7F) << shl; - shl += 7; - } while (byt & 0x80); - off = pos; - return select(val | (~0 << shl), val, shl < 64 && (byt & 0x40) != 0); +export function toString(t:TypeSection): string { + return t.toString(); } -function skipInitExpr(): void { - var op = readUint(); - switch (op) { - case Opcode.i32_const: { - readVarint(32); - break; - } - case Opcode.i64_const: { - readVarint64(); - break; - } - case Opcode.f32_const: { - readUint(); - break; - } - case Opcode.f64_const: { - readUint64(); - break; - } - case Opcode.get_global: { - readVaruint(32); - break; - } - default: unreachable(); // MVP - } - if (readUint() != Opcode.end) unreachable(); -} +export class Parser { + buf: Buffer; + module: Module; + constructor(buf: Buffer){ + this.buf = buf; + this.module = new Module(buf); + } + + parseString(): String { + return String.fromUTF8(this.buf.off,this.buf.readVaruint(32)); + } + + readVaruint(len: usize): u32 { + return this.buf.readVaruint(len); + } + + get off(): usize { + return this.buf.off; + } + + set off(u: usize) { + this.buf.off = u; + } /** Starts parsing the module that has been placed in memory. */ -export function parse(begin: usize, end: usize): void { - off = begin; - var magic = readUint(); - if (magic != 0x6D736100) unreachable(); - var version = readUint(); - if (version != 1) unreachable(); - var fun_space_index: u32 = 0; - var glo_space_index: u32 = 0; - var mem_space_index: u32 = 0; - var tbl_space_index: u32 = 0; - while (off < end) { - let section_off = off; - let id = readVaruint(7); - let payload_len = readVaruint(32); - let name_off = 0; - let name_len = 0; - if (!id) { - let before = off; - name_len = readVaruint(32); - name_off = off; - off += name_len; - payload_len -= off - before; - } else if (id > SectionId.Data) unreachable(); - let payload_off = off; - if (opt.onSection( - id, - payload_off, - payload_len, - name_off, - name_len - )) { - switch (id) { - case SectionId.Type: { - let count = readVaruint(32); - for (let index: u32 = 0; index < count; ++index) { - let form = readVarint(7) & 0x7f; - opt.onType( - index, - form - ); - let paramCount = readVaruint(32); - for (let paramIndex: u32 = 0; paramIndex < paramCount; ++paramIndex) { - let paramType = readVarint(7) & 0x7f; - opt.onTypeParam( - index, - paramIndex, - paramType - ); - } - let returnCount = readVaruint(1); // MVP - for (let returnIndex: u32 = 0; returnIndex < returnCount; ++returnIndex) { - let returnType = readVarint(7) & 0x7f; - opt.onTypeReturn( - index, - returnIndex, - returnType - ); - } - } - break; - } - case SectionId.Import: { - let count = readVaruint(32); - for (let index: u32 = 0; index < count; ++index) { - let module_len = readVaruint(32); - let module_off = off; - off += module_len; - let field_len = readVaruint(32); - let field_off = off; - off += field_len; - let kind = readUint(); - opt.onImport( - index, - kind, - module_off, - module_len, - field_off, - field_len - ); - switch (kind) { - case ExternalKind.Function: { - let type = readVaruint(32); - opt.onFunctionImport( - fun_space_index++, - type - ); - break; - } - case ExternalKind.Table: { - let type = readVarint(7) & 0x7f; - let flags = readVaruint(1); - let initial = readVaruint(32); - let maximum = flags & 1 ? readVaruint(32) : MAX_ELEMS; - opt.onTableImport( - tbl_space_index++, - type, - initial, - maximum, - flags - ); - break; - } - case ExternalKind.Memory: { - let flags = readVaruint(1); - let initial = readVaruint(32); - let maximum = flags & 1 ? readVaruint(32) : MAX_PAGES; - opt.onMemoryImport( - mem_space_index++, - initial, - maximum, - flags - ); - break; - } - case ExternalKind.Global: { - let type = readVarint(7) & 0x7f; - let mutability = readVaruint(1); - opt.onGlobalImport( - glo_space_index++, - type, - mutability - ); - break; - } - default: unreachable(); - } - } - break; - } - case SectionId.Function: { - let count = readVaruint(32); - for (let i: u32 = 0; i < count; ++i) { - let typeIndex = readVaruint(32); - opt.onFunction( - fun_space_index++, - typeIndex - ); - } - break; - } - case SectionId.Table: { - let count = readVaruint(32); - for (let index: u32 = 0; index < count; ++index) { - let type = readVaruint(7) & 0x7f; - let flags = readVaruint(1); - let initial = readVaruint(32); - let maximum = flags & 1 ? readVaruint(32) : MAX_ELEMS; - opt.onTable( - tbl_space_index++, - type, - initial, - maximum, - flags - ); - } - break; - } - case SectionId.Memory: { - let count = readVaruint(32); - for (let index: u32 = 0; index < count; ++index) { - let flags = readVaruint(1); - let initial = readVaruint(32); - let maximum = flags & 1 ? readVaruint(32) : MAX_PAGES; - opt.onMemory( - mem_space_index++, - initial, - maximum, - flags - ); - } - break; - } - case SectionId.Global: { - let count = readVaruint(32); - for (let i: u32 = 0; i < count; ++i) { - let type = readVarint(7) & 0x7f; - let mutability = readVaruint(1); - skipInitExpr(); - opt.onGlobal( - glo_space_index++, - type, - mutability - ); - } - break; - } - case SectionId.Export: { - let count = readVaruint(32); - for (let index: u32 = 0; index < count; ++index) { - let field_len = readVaruint(32); - let field_off = off; - off += field_len; - let kind = readUint(); - let kind_index = readVaruint(32); - opt.onExport( - index, - kind, - kind_index, - field_off, - field_len - ); - } - break; - } - case SectionId.Start: { - let index = readVaruint(32); - opt.onStart( - index - ); - break; - } - case SectionId.Custom: { - if ( - name_len == 4 && - load(name_off) == 0x656D616E // "name" - ) { - let name_type = readVaruint(7); - let name_payload_len = readVaruint(32); - let name_payload_off = off; - switch (name_type) { - case NameType.Module: { - let module_name_len = readVaruint(32); - let module_name_off = off; - opt.onModuleName( - module_name_off, - module_name_len - ); - break; - } - case NameType.Function: { - let count = readVaruint(32); - for (let i: u32 = 0; i < count; ++i) { - let fn_index = readVaruint(32); - let fn_name_len = readVaruint(32); - let fn_name_off = off; - off += fn_name_len; - opt.onFunctionName( - fn_index, - fn_name_off, - fn_name_len - ); - } - break; - } - case NameType.Local: { - let count = readVaruint(32); - for (let i: u32 = 0; i < count; ++i) { - let fn_index = readVaruint(32); - let lc_count = readVaruint(32); - for (let j: u32 = 0; j < lc_count; ++j) { - let lc_index = readVaruint(32); - let lc_name_len = readVaruint(32); - let lc_name_off = off; - off += lc_name_len; - opt.onLocalName( - fn_index, - lc_index, - lc_name_off, - lc_name_len - ); - } - } - break; - } - default: unreachable(); - } - off = name_payload_off + name_payload_len; // ignore errors - break; - } else if ( - name_len == 16 && - load(name_off ) == 0x614D656372756F73 && // "sourceMa" - load(name_off + 8) == 0x4C5255676E697070 // "ppingURL" - ) { - let url_len = readVaruint(32); - let url_off = off; - off += url_len; - opt.onSourceMappingURL( - url_off, - url_len - ); - } - off = payload_off + payload_len; // ignore errors - break; - } - case SectionId.Element: - case SectionId.Code: - case SectionId.Data: { // skip - off += payload_len; - break; - } - default: unreachable(); - } - } else { // skip - off += payload_len; + parse(): void { + var magic = this.buf.readUint(); + if (magic != 0x6D736100) unreachable(); + var version = this.buf.readUint(); + if (version != 1) unreachable(); + var fun_space_index: u32 = 0; + var glo_space_index: u32 = 0; + var mem_space_index: u32 = 0; + var tbl_space_index: u32 = 0; + while (this.buf.off < this.buf.length) { + // log("parsing next section", true); + let header: SectionHeader = new SectionHeader(this.buf); + this.module.parseSection(header); + this.off = header.end; + // log(this.off); } + // log(this.buf.length); + // if (this.off != this.buf.length) unreachable(); } - if (off != end) unreachable(); + +} + +export function newParser(buf: Uint8Array): Parser { + let buffer = new Buffer(buf); + return new Parser(buffer); +} +export function parse(p: Parser): Module { + p.parse(); + return p.module; } diff --git a/lib/parse/assembly/module/exports.ts b/lib/parse/assembly/module/exports.ts new file mode 100644 index 0000000000..e1ba6bb519 --- /dev/null +++ b/lib/parse/assembly/module/exports.ts @@ -0,0 +1,14 @@ + + +export class Export { + name: String; + + constructor(public index: u32, public kind: u32, public kindIndex: u32, public nameOffset: u32, nameLength: u32){ + this.name = String.fromUTF8(nameOffset, nameLength); + + } +} + +export function onExport(index: u32, kind: u32, kindIndex: u32, nameOffset: u32, nameLength: u32): Export { + return new Export(index, kind, kindIndex, nameOffset, nameLength); +} diff --git a/lib/parse/assembly/module/imports.ts b/lib/parse/assembly/module/imports.ts new file mode 100644 index 0000000000..dbbd223f85 --- /dev/null +++ b/lib/parse/assembly/module/imports.ts @@ -0,0 +1,10 @@ + + +export class Import { + + constructor(public index: u32, public kind: u32, public moduleOff: u32, public moduleLen: u32, public fieldOff: u32, public fieldLen: u32){} +} + +export function onImport(index: u32, kind: u32, moduleOff: u32, moduleLen: u32, fieldOff: u32, fieldLen: u32): Import { + return new Import(index, kind, moduleOff, moduleLen, fieldOff, fieldLen); +} diff --git a/lib/parse/assembly/module/index.ts b/lib/parse/assembly/module/index.ts new file mode 100644 index 0000000000..34db29b570 --- /dev/null +++ b/lib/parse/assembly/module/index.ts @@ -0,0 +1,493 @@ +import { + Type, + SectionId, + ExternalKind, + NameType, + MAX_PAGES, + MAX_ELEMS, + Opcode +} from "../../src/common"; + +import {Buffer} from '../buffer'; + +import {log, log_str} from "../host"; + +import {itoa} from 'internal/number'; + +type byte = u8; + + +export class Module { + Headers: SectionHeader[]; + buf: Buffer; + // Custom: TypeSection[]; + + constructor(buf: Buffer){ + this.buf = buf; + this.Headers = []; + } + + + get Type(): SectionHeader[]{ + return this.getID(SectionId.Type); + } + // Import: TypeSection[]; + // Function: TypeSection[]; + // Table: TypeSection[]; + // Memory: TypeSection[]; + // Global: TypeSection[]; + // Export: TypeSection[]; + // Start: TypeSection[]; + // Element: TypeSection[]; + // Code: TypeSection[]; + // Data: TypeSection[]; + + + parseSection(header: SectionHeader): void { + this.Headers.push(header); + switch (header.id){ + case SectionId.Type: + // this._Type.push(header); + break; + default: + } + // log_str(header.name); + } + + public getID(id: SectionId): SectionHeader[] { + let res: SectionHeader[] = []; + let x: i32 = this.Headers.length; + for (let i=0; i < x; i++){ + if (this.Headers[i].id == id){ + res.push(this.Headers[i]); + } + } + return res; + } + + getType(): TypeSection { + let Types = this.Type; + let section = new TypeSection(Types[0]); + return section.parse(this.buf); + } + +} + +function typeName(t: Type): string{ + switch (t){ + case 0x7f: + return 'i32'; + case 0x7e: + return 'i64'; + case 0x7d: + return 'f32'; + case 0x7c: + return 'f64'; + case 0x70: + return 'anyfunc'; + case 0x60: + return 'func'; + case 0x40: + return 'none'; + default: + unreachable(); + } + return "" +} + +function sectionName(s: SectionId): string { + switch (s){ + case 0: + return "Custom" + case 1: + return "Type" + case 2: + return "Import" + case 3: + return "Function" + case 4: + return "Table" + case 5: + return "Memory" + case 6: + return "Global" + case 7: + return "Export" + case 8: + return "Start" + case 9: + return "Element" + case 10: + return "Code" + case 11: + return "Data" + default: + unreachable(); + } + + return ""; +} + +export class SectionHeader { + public ref: u32; + public id: u32; + public payload_len: u32; + public payload_off: u32; + public name: string = ""; + + constructor (buf: Buffer){ + this.ref = buf.off; + this.id = buf.readVaruint(7); + this.payload_len = buf.readVaruint(32); + if (this.id == 0){ + let before = buf.off; + let name_len = buf.readVaruint(32); + let name_off = buf.off; + this.name = "'" + String.fromUTF8(name_off, name_len) + "'"; + buf.off += name_len; + this.payload_len -= buf.off - before; + } else if (this.id <= SectionId.Data){ + this.name = sectionName(this.id); + } else { + unreachable(); + } + this.payload_off = buf.off; + } + + get end(): u32{ + return this.payload_off + this.payload_len; + } + +} + +class Section { + constructor(public header: SectionHeader){} +} +// static create(buf: Buffer): Section { +// // log("Creating Section", true); +// let header = new SectionHeader(buf); +// let off = buf.off; +// let id = buf.peekVaruint(7); +// assert (off == buf.off); +// switch (id){ +// case SectionId.Type: +// let s = new TypeSection(header); +// return (s.parse(buf)); +// default: +// } +// let s = (new BaseSection(header)) +// return s.parse(buf); +// } +// } +// +// +// export class BaseSection extends Section { +// +// // constructor(public header: SectionHeader){} +// +// parse(buf: Buffer): BaseSection { +// log("SubClass", true); +// return this; +// } +// } + + +class FuncType { + public parameters: i32[]; + public returnVals: i32[]; + constructor(public index: u32, public form: i8){ + } + + + + toString(): string { + let index = itoa(this.index); + let form = typeName(this.form); + let parameters:string = ""; + for (let i = 0; i< this.parameters.length; i++){ + parameters += typeName(this.parameters[i]); + parameters = i < this.parameters.length -1 ? parameters += ", ": parameters; + } + let returnVal = this.returnVals.length == 1 ? typeName(this.returnVals[0]) : "void"; + return "index: " + index + ", " + "form: " + form + ", (" + parameters + ") => " + returnVal; + } +} + +export class TypeSection { + header: SectionHeader + funcs: FuncType[]; + constructor(header: SectionHeader){ + this.header = header; + this.funcs = []; + } + + // constructor(public header: SectionHeader){} + parse(buf: Buffer): TypeSection { + buf.off = this.header.payload_off; + let count = buf.readVaruint(32); + let func: FuncType[] = new Array(count); + for (let index: u32 = 0; index < count; ++index) { + let form = buf.readVarint8(7) & 0x7f; + let fun = new FuncType(index, form); + func[index] = fun; + let paramCount = buf.readVaruint(32); + fun.parameters = new Array(paramCount); + for (let paramIndex: u32 = 0; paramIndex < paramCount; ++paramIndex) { + let paramType = buf.readVarint8(7) & 0x7f; + func[index].parameters[paramIndex]=paramType; + } + + let returnCount = buf.readVaruint(1); // MVP + func[index].returnVals = new Array(returnCount); + for (let returnIndex: u32 = 0; returnIndex < returnCount; ++returnIndex) { + let returnType = buf.readVarint8(7) & 0x7f; + func[index].returnVals[returnIndex] = returnType; + } + log(func[index].toString()); + } + return this; + } + + toString(): string { + let strs: string[] = []; + for (let i=0; i< this.funcs.length; i++){ + strs.push(this.funcs[i].toString()); + } + return strs.join('\n'); + } + +} + +/* +case SectionId.Import: { + let count = buf.readVaruint(32); + for (let index: u32 = 0; index < count; ++index) { + let module_len = buf.readVaruint(32); + let module_off = off; + off += module_len; + let field_len = buf.readVaruint(32); + let field_off = off; + off += field_len; + let kind = readUint(); + opt.onImport( + index, + kind, + module_off, + module_len, + field_off, + field_len + ); + switch (kind) { + case ExternalKind.Function: { + let type = buf.readVaruint(32); + opt.onFunctionImport( + fun_space_index++, + type + ); + break; + } + case ExternalKind.Table: { + let type = buf.readVarint(7) & 0x7f; + let flags = buf.readVaruint(1); + let initial = buf.readVaruint(32); + let maximum = flags & 1 ? buf.readVaruint(32) : MAX_ELEMS; + opt.onTableImport( + tbl_space_index++, + type, + initial, + maximum, + flags + ); + break; + } + case ExternalKind.Memory: { + let flags = buf.readVaruint(1); + let initial = buf.readVaruint(32); + let maximum = flags & 1 ? buf.readVaruint(32) : MAX_PAGES; + opt.onMemoryImport( + mem_space_index++, + initial, + maximum, + flags + ); + break; + } + case ExternalKind.Global: { + let type = buf.readVarint(7) & 0x7f; + let mutability = buf.readVaruint(1); + opt.onGlobalImport( + glo_space_index++, + type, + mutability + ); + break; + } + default: unreachable(); + } + } + break; +} +case SectionId.Function: { + let count = buf.readVaruint(32); + for (let i: u32 = 0; i < count; ++i) { + let typeIndex = buf.readVaruint(32); + opt.onFunction( + fun_space_index++, + typeIndex + ); + } + break; +} +case SectionId.Table: { + let count = buf.readVaruint(32); + for (let index: u32 = 0; index < count; ++index) { + let type = buf.readVaruint(7) & 0x7f; + let flags = buf.readVaruint(1); + let initial = buf.readVaruint(32); + let maximum = flags & 1 ? buf.readVaruint(32) : MAX_ELEMS; + opt.onTable( + tbl_space_index++, + type, + initial, + maximum, + flags + ); + } + break; +} +case SectionId.Memory: { + let count = buf.readVaruint(32); + for (let index: u32 = 0; index < count; ++index) { + let flags = buf.readVaruint(1); + let initial = buf.readVaruint(32); + let maximum = flags & 1 ? buf.readVaruint(32) : MAX_PAGES; + opt.onMemory( + mem_space_index++, + initial, + maximum, + flags + ); + } + break; +} +case SectionId.Global: { + let count = buf.readVaruint(32); + for (let i: u32 = 0; i < count; ++i) { + let type = buf.readVarint(7) & 0x7f; + let mutability = buf.readVaruint(1); + skipInitExpr(); + opt.onGlobal( + glo_space_index++, + type, + mutability + ); + } + break; +} +case SectionId.Export: { + let count = buf.readVaruint(32); + for (let index: u32 = 0; index < count; ++index) { + let field_len = buf.readVaruint(32); + let field_off = off; + off += field_len; + let kind = readUint(); + let kind_index = buf.readVaruint(32); + opt.onExport( + index, + kind, + kind_index, + field_off, + field_len + ); + } + break; +} +case SectionId.Start: { + let index = buf.readVaruint(32); + opt.onStart( + index + ); + break; +} +case SectionId.Custom: { + if ( + name_len == 4 && + load(name_off) == 0x656D616E // "name" + ) { + let name_type = buf.readVaruint(7); + let name_payload_len = buf.readVaruint(32); + let name_payload_off = off; + switch (name_type) { + case NameType.Module: { + let module_name_len = buf.readVaruint(32); + let module_name_off = off; + opt.onModuleName( + module_name_off, + module_name_len + ); + break; + } + case NameType.Function: { + let count = buf.readVaruint(32); + for (let i: u32 = 0; i < count; ++i) { + let fn_index = buf.readVaruint(32); + let fn_name_len = buf.readVaruint(32); + let fn_name_off = off; + off += fn_name_len; + opt.onFunctionName( + fn_index, + fn_name_off, + fn_name_len + ); + } + break; + } + case NameType.Local: { + let count = buf.readVaruint(32); + for (let i: u32 = 0; i < count; ++i) { + let fn_index = buf.readVaruint(32); + let lc_count = buf.readVaruint(32); + for (let j: u32 = 0; j < lc_count; ++j) { + let lc_index = buf.readVaruint(32); + let lc_name_len = buf.readVaruint(32); + let lc_name_off = off; + off += lc_name_len; + opt.onLocalName( + fn_index, + lc_index, + lc_name_off, + lc_name_len + ); + } + } + break; + } + default: unreachable(); + } + off = name_payload_off + name_payload_len; // ignore errors + break; + } else if ( + name_len == 16 && + load(name_off ) == 0x614D656372756F73 && // "sourceMa" + load(name_off + 8) == 0x4C5255676E697070 // "ppingURL" + ) { + let url_len = buf.readVaruint(32); + let url_off = off; + off += url_len; + opt.onSourceMappingURL( + url_off, + url_len + ); + } + off = payload_off + payload_len; // ignore errors + break; +} +case SectionId.Element: +case SectionId.Code: +case SectionId.Data: { // skip + off += payload_len; + break; +} +default: unreachable(); +} +*/ diff --git a/lib/parse/assembly/module/instructions/index.ts b/lib/parse/assembly/module/instructions/index.ts new file mode 100644 index 0000000000..ed78d5e57a --- /dev/null +++ b/lib/parse/assembly/module/instructions/index.ts @@ -0,0 +1,360 @@ + +import { + Type, + Opcode +} from "../../src/common"; + +import {Buffer} from "../buffer"; + + +// export function parseExpr(): Instruction[] { +// let inst = Instruction.parse(); +// let instructions: Instruction[] = []; +// while (inst.opcode != Opcode.end && inst.opcode != Opcode.else_){ +// instructions.push(inst); +// // inst = Instruction.parse(); +// } +// instructions.push(inst) +// return instructions +// +// } + +export class Instruction { + constructor(public opcode: Opcode){ + } + + static parse(buf: Buffer): Instruction { + let byte: u8 = changetype(buf.readUint()); + switch(byte){ + case Opcode.unreachable: + case Opcode.nop: + case Opcode.block: + case Opcode.loop: + case Opcode.if_: + case Opcode.else_: + case Opcode.end: + case Opcode.br: + case Opcode.br_if: + case Opcode.br_table: + case Opcode.return_: + case Opcode.call: + case Opcode.call_indirect: { + return ControlInstruction.parse(byte); + } + case Opcode.drop: + case Opcode.select: + return new ParametricInstruction(byte); + case Opcode.get_local: + case Opcode.set_local: + case Opcode.tee_local: + case Opcode.get_global: + case Opcode.set_global: + return new VariableInstruction(byte); + case Opcode.i32_load: + case Opcode.i64_load: + case Opcode.f32_load: + case Opcode.f64_load: + case Opcode.i32_load8_s: + case Opcode.i32_load8_u: + case Opcode.i32_load16_s: + case Opcode.i32_load16_u: + case Opcode.i64_load8_s: + case Opcode.i64_load8_u: + case Opcode.i64_load16_s: + case Opcode.i64_load16_u: + case Opcode.i64_load32_s: + case Opcode.i64_load32_u: + case Opcode.i32_store: + case Opcode.i64_store: + case Opcode.f32_store: + case Opcode.f64_store: + case Opcode.i32_store8: + case Opcode.i32_store16: + case Opcode.i64_store8: + case Opcode.i64_store16: + case Opcode.i64_store32: + case Opcode.current_memory: + case Opcode.grow_memory: + return new MemoryInstruction(byte); + case Opcode.i32_const: + return new I32_Const(byte); + case Opcode.i64_const: + return new I64_Const(byte); + case Opcode.f32_const: + return new F32_Const(byte); + case Opcode.f64_const: + return new F64_Const(byte); + case Opcode.i32_eqz: + case Opcode.i32_eq: + case Opcode.i32_ne: + case Opcode.i32_lt_s: + case Opcode.i32_lt_u: + case Opcode.i32_gt_s: + case Opcode.i32_gt_u: + case Opcode.i32_le_s: + case Opcode.i32_le_u: + case Opcode.i32_ge_s: + case Opcode.i32_ge_u: + case Opcode.i64_eqz: + case Opcode.i64_eq: + case Opcode.i64_ne: + case Opcode.i64_lt_s: + case Opcode.i64_lt_u: + case Opcode.i64_gt_s: + case Opcode.i64_gt_u: + case Opcode.i64_le_s: + case Opcode.i64_le_u: + case Opcode.i64_ge_s: + case Opcode.i64_ge_u: + case Opcode.f32_eq: + case Opcode.f32_ne: + case Opcode.f32_lt: + case Opcode.f32_gt: + case Opcode.f32_le: + case Opcode.f32_ge: + case Opcode.f64_eq: + case Opcode.f64_ne: + case Opcode.f64_lt: + case Opcode.f64_gt: + case Opcode.f64_le: + case Opcode.f64_ge: + case Opcode.i32_clz: + case Opcode.i32_ctz: + case Opcode.i32_popcnt: + case Opcode.i32_add: + case Opcode.i32_sub: + case Opcode.i32_mul: + case Opcode.i32_div_s: + case Opcode.i32_div_u: + case Opcode.i32_rem_s: + case Opcode.i32_rem_u: + case Opcode.i32_and: + case Opcode.i32_or: + case Opcode.i32_xor: + case Opcode.i32_shl: + case Opcode.i32_shr_s: + case Opcode.i32_shr_u: + case Opcode.i32_rotl: + case Opcode.i32_rotr: + case Opcode.i64_clz: + case Opcode.i64_ctz: + case Opcode.i64_popcnt: + case Opcode.i64_add: + case Opcode.i64_sub: + case Opcode.i64_mul: + case Opcode.i64_div_s: + case Opcode.i64_div_u: + case Opcode.i64_rem_s: + case Opcode.i64_rem_u: + case Opcode.i64_and: + case Opcode.i64_or: + case Opcode.i64_xor: + case Opcode.i64_shl: + case Opcode.i64_shr_s: + case Opcode.i64_shr_u: + case Opcode.i64_rotl: + case Opcode.i64_rotr: + case Opcode.f32_abs: + case Opcode.f32_neg: + case Opcode.f32_ceil: + case Opcode.f32_floor: + case Opcode.f32_trunc: + case Opcode.f32_nearest: + case Opcode.f32_sqrt: + case Opcode.f32_add: + case Opcode.f32_sub: + case Opcode.f32_mul: + case Opcode.f32_div: + case Opcode.f32_min: + case Opcode.f32_max: + case Opcode.f32_copysign: + case Opcode.f64_abs: + case Opcode.f64_neg: + case Opcode.f64_ceil: + case Opcode.f64_floor: + case Opcode.f64_trunc: + case Opcode.f64_nearest: + case Opcode.f64_sqrt: + case Opcode.f64_add: + case Opcode.f64_sub: + case Opcode.f64_mul: + case Opcode.f64_div: + case Opcode.f64_min: + case Opcode.f64_max: + case Opcode.f64_copysign: + case Opcode.i32_wrap_i64: + case Opcode.i32_trunc_s_f32: + case Opcode.i32_trunc_u_f32: + case Opcode.i32_trunc_s_f64: + case Opcode.i32_trunc_u_f64: + case Opcode.i64_extend_s_i32: + case Opcode.i64_extend_u_i32: + case Opcode.i64_trunc_s_f32: + case Opcode.i64_trunc_u_f32: + case Opcode.i64_trunc_s_f64: + case Opcode.i64_trunc_u_f64: + case Opcode.f32_convert_s_i32: + case Opcode.f32_convert_u_i32: + case Opcode.f32_convert_s_i64: + case Opcode.f32_convert_u_i64: + case Opcode.f32_demote_f64: + case Opcode.f64_convert_s_i32: + case Opcode.f64_convert_u_i32: + case Opcode.f64_convert_s_i64: + case Opcode.f64_convert_u_i64: + case Opcode.f64_promote_f32: + case Opcode.i32_reinterpret_f32: + case Opcode.i64_reinterpret_f64: + case Opcode.f32_reinterpret_i32: + case Opcode.f64_reinterpret_i64: + return new NumericInstruction(byte); + default: + return new Instruction(byte); + + } + + } +} + +class ControlInstruction extends Instruction{ + internalInstructions:Instruction[] = []; + elseInstructions: Instruction[] = []; + blockType: Type; + isNested: bool = false; + label: u32; + labels: u32[] = []; + constructor(opcode: u8){ + super(opcode); + switch (this.opcode){ + case Opcode.unreachable: + case Opcode.nop: + case Opcode.return_: + break; + case Opcode.block: + case Opcode.loop:{ + this.isNested = true; + this.blockType = readUint(); + // this.internalInstructions = parseExpr(); + break; + } + case Opcode.if_: + case Opcode.else_:{ + this.isNested = true; + this.blockType = readUint(); + // this.internalInstructions = parseExpr(); + // if (this.peak().opcode == Opcode.else_){ + // this.elseInstructions = parseExpr(); + // } + break; + } + case Opcode.br_table: + let length = readVaruint(32); + for (let i:u32 = 0; i < length; i++){ + this.labels.push(readVaruint(32)); + } + this.label = readVaruint(32); + break; + case Opcode.call: + case Opcode.call_indirect: + case Opcode.br: + case Opcode.br_if: + this.label = readVaruint(32); + break; + + } + } + + peak(): Instruction { + return this.internalInstructions[this.internalInstructions.length-1]; + } +} +// +class ParametricInstruction extends Instruction{ + +} + +class VariableInstruction extends Instruction{ + index: u32; + constructor(opcode: u8){ + super(opcode); + this.index = readVaruint(32); + } +} + +class MemoryInstruction extends Instruction{ + align: u32; + offset: u32; + + constructor(opcode: u8){ + super(opcode); + switch (opcode){ + case Opcode.i32_load: + case Opcode.i64_load: + case Opcode.f32_load: + case Opcode.f64_load: + case Opcode.i32_load8_s: + case Opcode.i32_load8_u: + case Opcode.i32_load16_s: + case Opcode.i32_load16_u: + case Opcode.i64_load8_s: + case Opcode.i64_load8_u: + case Opcode.i64_load16_s: + case Opcode.i64_load16_u: + case Opcode.i64_load32_s: + case Opcode.i64_load32_u: + case Opcode.i32_store: + case Opcode.i64_store: + case Opcode.f32_store: + case Opcode.f64_store: + case Opcode.i32_store8: + case Opcode.i32_store16: + case Opcode.i64_store8: + case Opcode.i64_store16: + case Opcode.i64_store32:{ + this.align = readVaruint(32); + this.offset = readVaruint(32); + break; + } + case Opcode.current_memory: + case Opcode.grow_memory: + let end = readUint(); + break; + default: + break; + } + } +} + +class ConstInstruction extends Instruction{} + +export class I32_Const extends ConstInstruction { + value: u32; + constructor(opcode: Opcode){ + super(opcode); + this.value = readVaruint(32); + } +} +class F32_Const extends ConstInstruction { + value: u32; + constructor(opcode: u8){ + super(opcode); + this.value = readVaruint(32); + } +} + +class I64_Const extends ConstInstruction { + value: u64; + constructor(opcode: u8){ + super(opcode); + this.value = readVaruint(64); + } +} +class F64_Const extends Instruction { + value: u64; + constructor(opcode: u8){ + super(opcode); + this.value = readVaruint(64); + } +} + +class NumericInstruction extends Instruction{} diff --git a/lib/parse/assembly/options.ts b/lib/parse/assembly/options.ts deleted file mode 100644 index e4ca8ad219..0000000000 --- a/lib/parse/assembly/options.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Imported callbacks -export declare function onSection(id: u32, offset: u32, length: u32, nameOffset: u32, nameLength: u32): bool; -export declare function onType(index: u32, form: u32): void; -export declare function onTypeParam(index: u32, paramIndex: u32, paramType: u32): void; -export declare function onTypeReturn(index: u32, returnIndex: u32, returnType: u32): void; -export declare function onImport(index: u32, kind: u32, moduleOff: u32, moduleLen: u32, fieldOff: u32, fieldLen: u32): void; -export declare function onFunctionImport(index: u32, type: u32): void; -export declare function onTableImport(index: u32, type: u32, initial: u32, maximum: u32, flags: u32): void; -export declare function onMemoryImport(index: u32, initial: u32, maximum: u32, flags: u32): void; -export declare function onGlobalImport(index: u32, type: u32, mutability: u32): void; -export declare function onMemory(index: u32, initial: u32, maximum: u32, flags: u32): void; -export declare function onFunction(index: u32, typeIndex: u32): void; -export declare function onTable(index: u32, type: u32, initial: u32, maximum: u32, flags: u32): void; -export declare function onGlobal(index: u32, type: u32, mutability: u32): void; -export declare function onExport(index: u32, kind: u32, kindIndex: u32, nameOffset: u32, nameLength: u32): void; -export declare function onStart(index: u32): void; -export declare function onSourceMappingURL(offset: u32, length: u32): void; -export declare function onModuleName(offset: u32, length: u32): void; -export declare function onFunctionName(index: u32, offset: u32, length: u32): void; -export declare function onLocalName(funcIndex: u32, index: u32, offset: u32, length: u32): void; diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index 164090ef15..6639fd36bb 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -1,38 +1,83 @@ (module - (type $iiv (func (param i32 i32))) - (type $ii (func (param i32) (result i32))) - (type $iiiiii (func (param i32 i32 i32 i32 i32) (result i32))) (type $iiiv (func (param i32 i32 i32))) - (type $iiiiiiv (func (param i32 i32 i32 i32 i32 i32))) - (type $iiiiiv (func (param i32 i32 i32 i32 i32))) - (type $iiiiv (func (param i32 i32 i32 i32))) - (type $v (func)) - (type $I (func (result i64))) + (type $iiii (func (param i32 i32 i32) (result i32))) + (type $ii (func (param i32) (result i32))) (type $iv (func (param i32))) - (type $FUNCSIG$i (func (result i32))) - (import "env" "memory" (memory $0 0)) - (import "options" "onSection" (func $assembly/options/onSection (param i32 i32 i32 i32 i32) (result i32))) - (import "options" "onType" (func $assembly/options/onType (param i32 i32))) - (import "options" "onTypeParam" (func $assembly/options/onTypeParam (param i32 i32 i32))) - (import "options" "onTypeReturn" (func $assembly/options/onTypeReturn (param i32 i32 i32))) - (import "options" "onImport" (func $assembly/options/onImport (param i32 i32 i32 i32 i32 i32))) - (import "options" "onFunctionImport" (func $assembly/options/onFunctionImport (param i32 i32))) - (import "options" "onTableImport" (func $assembly/options/onTableImport (param i32 i32 i32 i32 i32))) - (import "options" "onMemoryImport" (func $assembly/options/onMemoryImport (param i32 i32 i32 i32))) - (import "options" "onGlobalImport" (func $assembly/options/onGlobalImport (param i32 i32 i32))) - (import "options" "onFunction" (func $assembly/options/onFunction (param i32 i32))) - (import "options" "onTable" (func $assembly/options/onTable (param i32 i32 i32 i32 i32))) - (import "options" "onMemory" (func $assembly/options/onMemory (param i32 i32 i32 i32))) - (import "options" "onGlobal" (func $assembly/options/onGlobal (param i32 i32 i32))) - (import "options" "onExport" (func $assembly/options/onExport (param i32 i32 i32 i32 i32))) - (import "options" "onStart" (func $assembly/options/onStart (param i32))) - (import "options" "onModuleName" (func $assembly/options/onModuleName (param i32 i32))) - (import "options" "onFunctionName" (func $assembly/options/onFunctionName (param i32 i32 i32))) - (import "options" "onLocalName" (func $assembly/options/onLocalName (param i32 i32 i32 i32))) - (import "options" "onSourceMappingURL" (func $assembly/options/onSourceMappingURL (param i32 i32))) + (type $v (func)) + (type $iii (func (param i32 i32) (result i32))) + (type $iiiiv (func (param i32 i32 i32 i32))) + (type $iiiiiv (func (param i32 i32 i32 i32 i32))) + (type $iiv (func (param i32 i32))) + (import "env" "memory" (memory $0 1)) + (data (i32.const 8) "\00\00\00\00\00\00\00\00") + (data (i32.const 16) "\08\00\00\00\00\00\00\00") + (data (i32.const 24) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") + (data (i32.const 56) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") + (data (i32.const 120) "\00\00\00\00\00\00\00\00") + (data (i32.const 128) "x\00\00\00\00\00\00\00") + (data (i32.const 136) "\01\00\00\000\00") + (data (i32.const 144) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 200) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\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 712) "\c8\00\00\00d\00\00\00") + (data (i32.const 720) "\03\00\00\00i\003\002\00") + (data (i32.const 736) "\03\00\00\00i\006\004\00") + (data (i32.const 752) "\03\00\00\00f\003\002\00") + (data (i32.const 768) "\03\00\00\00f\006\004\00") + (data (i32.const 784) "\07\00\00\00a\00n\00y\00f\00u\00n\00c\00") + (data (i32.const 808) "\04\00\00\00f\00u\00n\00c\00") + (data (i32.const 824) "\04\00\00\00n\00o\00n\00e\00") + (data (i32.const 840) "\00\00\00\00") + (data (i32.const 848) "\04\00\00\00n\00u\00l\00l\00") + (data (i32.const 864) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 896) "\02\00\00\00,\00 \00") + (data (i32.const 904) "\04\00\00\00v\00o\00i\00d\00") + (data (i32.const 920) "\07\00\00\00i\00n\00d\00e\00x\00:\00 \00") + (data (i32.const 944) "\06\00\00\00f\00o\00r\00m\00:\00 \00") + (data (i32.const 960) "\03\00\00\00,\00 \00(\00") + (data (i32.const 976) "\05\00\00\00)\00 \00=\00>\00 \00") + (data (i32.const 992) "\00\00\00\00\00\00\00\00") + (data (i32.const 1000) "\e0\03\00\00\00\00\00\00") + (data (i32.const 1008) "\01\00\00\00\n\00") + (data (i32.const 1016) "\00\00\00\00\00\00\00\00") + (data (i32.const 1024) "\f8\03\00\00\00\00\00\00") + (data (i32.const 1032) "\01\00\00\00\'\00") + (data (i32.const 1040) "\06\00\00\00C\00u\00s\00t\00o\00m\00") + (data (i32.const 1056) "\04\00\00\00T\00y\00p\00e\00") + (data (i32.const 1072) "\06\00\00\00I\00m\00p\00o\00r\00t\00") + (data (i32.const 1088) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n\00") + (data (i32.const 1112) "\05\00\00\00T\00a\00b\00l\00e\00") + (data (i32.const 1128) "\06\00\00\00M\00e\00m\00o\00r\00y\00") + (data (i32.const 1144) "\06\00\00\00G\00l\00o\00b\00a\00l\00") + (data (i32.const 1160) "\06\00\00\00E\00x\00p\00o\00r\00t\00") + (data (i32.const 1176) "\05\00\00\00S\00t\00a\00r\00t\00") + (data (i32.const 1192) "\07\00\00\00E\00l\00e\00m\00e\00n\00t\00") + (data (i32.const 1216) "\04\00\00\00C\00o\00d\00e\00") + (data (i32.const 1232) "\04\00\00\00D\00a\00t\00a\00") + (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) + (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) (table $0 1 anyfunc) (elem (i32.const 0) $null) - (global $assembly/index/off (mut i32) (i32.const 0)) + (global $src/common/MAX_PAGES i32 (i32.const 65535)) + (global $src/common/MAX_ELEMS i32 (i32.const -1)) + (global $~lib/internal/allocator/MAX_SIZE_32 i32 (i32.const 1073741824)) + (global $~lib/internal/allocator/AL_BITS i32 (i32.const 3)) + (global $~lib/internal/allocator/AL_SIZE i32 (i32.const 8)) + (global $~lib/internal/allocator/AL_MASK i32 (i32.const 7)) + (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) + (global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) + (global $~lib/internal/arraybuffer/HEADER_SIZE i32 (i32.const 8)) + (global $~lib/internal/arraybuffer/MAX_BLENGTH i32 (i32.const 1073741816)) + (global $~lib/internal/string/HEADER_SIZE i32 (i32.const 4)) + (global $~lib/internal/string/MAX_LENGTH i32 (i32.const 536870910)) + (global $~lib/internal/number/MAX_DOUBLE_LENGTH i32 (i32.const 28)) + (global $~lib/internal/number/_K (mut i32) (i32.const 0)) + (global $~lib/internal/number/_frc (mut i64) (i64.const 0)) + (global $~lib/internal/number/_exp (mut i32) (i32.const 0)) + (global $~lib/internal/number/_frc_minus (mut i64) (i64.const 0)) + (global $~lib/internal/number/_frc_plus (mut i64) (i64.const 0)) + (global $~lib/internal/number/_frc_pow (mut i64) (i64.const 0)) + (global $~lib/internal/number/_exp_pow (mut i32) (i32.const 0)) + (global $assembly/index/type (mut i32) (i32.const 0)) (global $src/common/SectionId.Custom (mut i32) (i32.const 0)) (global $src/common/SectionId.Type (mut i32) (i32.const 1)) (global $src/common/SectionId.Import (mut i32) (i32.const 2)) @@ -45,27 +90,61 @@ (global $src/common/SectionId.Element (mut i32) (i32.const 9)) (global $src/common/SectionId.Code (mut i32) (i32.const 10)) (global $src/common/SectionId.Data (mut i32) (i32.const 11)) - (global $src/common/ExternalKind.Function (mut i32) (i32.const 0)) - (global $src/common/ExternalKind.Table (mut i32) (i32.const 1)) - (global $src/common/ExternalKind.Memory (mut i32) (i32.const 2)) - (global $src/common/ExternalKind.Global (mut i32) (i32.const 3)) - (global $src/common/Opcode.end (mut i32) (i32.const 11)) - (global $src/common/Opcode.get_global (mut i32) (i32.const 35)) - (global $src/common/Opcode.i32_const (mut i32) (i32.const 65)) - (global $src/common/Opcode.i64_const (mut i32) (i32.const 66)) - (global $src/common/Opcode.f32_const (mut i32) (i32.const 67)) - (global $src/common/Opcode.f64_const (mut i32) (i32.const 68)) - (global $src/common/NameType.Module (mut i32) (i32.const 0)) - (global $src/common/NameType.Function (mut i32) (i32.const 1)) - (global $src/common/NameType.Local (mut i32) (i32.const 2)) + (global $ASC_SHRINK_LEVEL i32 (i32.const 0)) + (global $~lib/internal/string/CharCode.PLUS i32 (i32.const 43)) + (global $~lib/internal/string/CharCode.MINUS i32 (i32.const 45)) + (global $~lib/internal/string/CharCode.DOT i32 (i32.const 46)) + (global $~lib/internal/string/CharCode._0 i32 (i32.const 48)) + (global $~lib/internal/string/CharCode._1 i32 (i32.const 49)) + (global $~lib/internal/string/CharCode._2 i32 (i32.const 50)) + (global $~lib/internal/string/CharCode._3 i32 (i32.const 51)) + (global $~lib/internal/string/CharCode._4 i32 (i32.const 52)) + (global $~lib/internal/string/CharCode._5 i32 (i32.const 53)) + (global $~lib/internal/string/CharCode._6 i32 (i32.const 54)) + (global $~lib/internal/string/CharCode._7 i32 (i32.const 55)) + (global $~lib/internal/string/CharCode._8 i32 (i32.const 56)) + (global $~lib/internal/string/CharCode._9 i32 (i32.const 57)) + (global $~lib/internal/string/CharCode.A i32 (i32.const 65)) + (global $~lib/internal/string/CharCode.B i32 (i32.const 66)) + (global $~lib/internal/string/CharCode.E i32 (i32.const 69)) + (global $~lib/internal/string/CharCode.N i32 (i32.const 78)) + (global $~lib/internal/string/CharCode.O i32 (i32.const 79)) + (global $~lib/internal/string/CharCode.X i32 (i32.const 88)) + (global $~lib/internal/string/CharCode.Z i32 (i32.const 90)) + (global $~lib/internal/string/CharCode.a i32 (i32.const 97)) + (global $~lib/internal/string/CharCode.b i32 (i32.const 98)) + (global $~lib/internal/string/CharCode.e i32 (i32.const 101)) + (global $~lib/internal/string/CharCode.n i32 (i32.const 110)) + (global $~lib/internal/string/CharCode.o i32 (i32.const 111)) + (global $~lib/internal/string/CharCode.x i32 (i32.const 120)) + (global $~lib/internal/string/CharCode.z i32 (i32.const 122)) + (global $HEAP_BASE i32 (i32.const 1244)) (export "memory" (memory $0)) (export "table" (table $0)) + (export "getType" (func $assembly/index/getType)) + (export "toString" (func $assembly/index/toString)) + (export "Parser#constructor" (func $assembly/index/Parser#constructor)) + (export "Parser#get:buf" (func $Parser#get:buf)) + (export "Parser#set:buf" (func $Parser#set:buf)) + (export "Parser#get:module" (func $Parser#get:module)) + (export "Parser#set:module" (func $Parser#set:module)) + (export "Parser#parseString" (func $assembly/index/Parser#parseString)) + (export "Parser#readVaruint" (func $assembly/index/Parser#readVaruint)) + (export "Parser#get:off" (func $assembly/index/Parser#get:off)) + (export "Parser#set:off" (func $assembly/index/Parser#set:off)) + (export "Parser#parse" (func $assembly/index/Parser#parse)) + (export "newParser" (func $assembly/index/newParser)) (export "parse" (func $assembly/index/parse)) - (func $assembly/index/readVaruint (; 19 ;) (type $FUNCSIG$i) (result i32) - (local $0 i32) - (local $1 i32) - (local $2 i32) + (export "memory.fill" (func $~lib/memory/memory.fill)) + (export "memory.copy" (func $~lib/memory/memory.copy)) + (export "memory.compare" (func $~lib/memory/memory.compare)) + (export "memory.allocate" (func $~lib/memory/memory.allocate)) + (export "memory.free" (func $~lib/memory/memory.free)) + (export "memory.reset" (func $~lib/memory/memory.reset)) + (start $start) + (func $~lib/internal/memory/memset (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) +<<<<<<< loader-memory-accessors get_global $assembly/index/off set_local $0 loop $continue|0 @@ -94,10 +173,21 @@ set_local $3 br $continue|0 end +======= + (local $4 i32) + (local $5 i64) + get_local $2 + i32.eqz + if + return +>>>>>>> new Branch for parser end get_local $0 - set_global $assembly/index/off + get_local $1 + i32.store8 + get_local $0 get_local $2 +<<<<<<< loader-memory-accessors ) (func $assembly/index/readVarint (; 20 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) @@ -140,19 +230,32 @@ get_local $3 i32.or set_local $2 +======= + i32.add + i32.const 1 + i32.sub get_local $1 - get_local $0 - i32.lt_u - tee_local $4 + i32.store8 + get_local $2 + i32.const 2 + i32.le_u if - get_local $5 - i32.const 64 - i32.and - i32.const 0 - i32.ne - set_local $4 + return end + get_local $0 + i32.const 1 + i32.add + get_local $1 + i32.store8 + get_local $0 + i32.const 2 + i32.add +>>>>>>> new Branch for parser + get_local $1 + i32.store8 + get_local $0 get_local $2 +<<<<<<< loader-memory-accessors get_local $3 get_local $4 select @@ -201,21 +304,34 @@ get_local $1 i64.or set_local $5 +======= + i32.add + i32.const 2 + i32.sub + get_local $1 + i32.store8 +>>>>>>> new Branch for parser get_local $0 - i64.const 64 - i64.lt_u - tee_local $2 + get_local $2 + i32.add + i32.const 3 + i32.sub + get_local $1 + i32.store8 + get_local $2 + i32.const 6 + i32.le_u if - get_local $4 - i64.const 64 - i64.and - i64.const 0 - i64.ne - set_local $2 + return end - get_local $5 + get_local $0 + i32.const 3 + i32.add get_local $1 + i32.store8 + get_local $0 get_local $2 +<<<<<<< loader-memory-accessors select ) (func $assembly/index/skipInitExpr (; 22 ;) (type $v) @@ -291,37 +407,72 @@ br $break|0 end unreachable +======= + i32.add + i32.const 4 + i32.sub + get_local $1 + i32.store8 + get_local $2 + i32.const 8 + i32.le_u + if + return +>>>>>>> new Branch for parser end - get_global $assembly/index/off - tee_local $1 - i32.load8_u + i32.const 0 + get_local $0 + i32.sub + i32.const 3 + i32.and + set_local $3 + get_local $0 + get_local $3 + i32.add set_local $0 + get_local $2 + get_local $3 + i32.sub + set_local $2 + get_local $2 + i32.const -4 + i32.and + set_local $2 + i32.const -1 + i32.const 255 + i32.div_u get_local $1 +<<<<<<< loader-memory-accessors i32.const 1 i32.add set_global $assembly/index/off get_global $src/common/Opcode.end get_local $0 i32.ne +======= + i32.const 255 + i32.and + i32.mul + set_local $4 + get_local $0 + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 4 + i32.sub + get_local $4 + i32.store + get_local $2 + i32.const 8 + i32.le_u +>>>>>>> new Branch for parser if - unreachable + return end - ) - (func $assembly/index/parse (; 23 ;) (type $iiv) (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) - (local $14 i32) get_local $0 +<<<<<<< loader-memory-accessors set_global $assembly/index/off get_global $assembly/index/off tee_local $0 @@ -334,84 +485,3562 @@ get_local $6 i32.const 1836278016 i32.ne +======= + i32.const 4 + i32.add + get_local $4 + i32.store + get_local $0 + i32.const 8 + i32.add + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 12 + i32.sub + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 8 + i32.sub + get_local $4 + i32.store + get_local $2 + i32.const 24 + i32.le_u +>>>>>>> new Branch for parser if - unreachable + return end +<<<<<<< loader-memory-accessors get_global $assembly/index/off tee_local $0 i32.load set_local $6 +======= + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.store + get_local $0 + i32.const 16 + i32.add + get_local $4 + i32.store + get_local $0 + i32.const 20 + i32.add + get_local $4 + i32.store + get_local $0 + i32.const 24 + i32.add + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 28 + i32.sub + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 24 + i32.sub + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 20 + i32.sub + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 16 + i32.sub + get_local $4 + i32.store + i32.const 24 +>>>>>>> new Branch for parser get_local $0 i32.const 4 + i32.and i32.add +<<<<<<< loader-memory-accessors set_global $assembly/index/off get_local $6 i32.const 1 - i32.ne - if - unreachable +======= + set_local $3 + get_local $0 + get_local $3 + i32.add + set_local $0 + get_local $2 + get_local $3 + i32.sub + set_local $2 + get_local $4 + i64.extend_u/i32 + get_local $4 + i64.extend_u/i32 + i64.const 32 + i64.shl + i64.or + set_local $5 + block $break|0 + loop $continue|0 + get_local $2 + i32.const 32 + i32.ge_u + if + block + get_local $0 + get_local $5 + i64.store + get_local $0 + i32.const 8 + i32.add + get_local $5 + i64.store + get_local $0 + i32.const 16 + i32.add + get_local $5 + i64.store + get_local $0 + i32.const 24 + i32.add + get_local $5 + i64.store + get_local $2 + i32.const 32 + i32.sub + set_local $2 + get_local $0 + i32.const 32 + i32.add + set_local $0 + end + br $continue|0 + end + end end - loop $continue|0 - get_global $assembly/index/off - get_local $1 - i32.lt_u - if - call $assembly/index/readVaruint - set_local $2 - call $assembly/index/readVaruint - set_local $8 - i32.const 0 - set_local $4 - i32.const 0 - set_local $0 + ) + (func $~lib/memory/memory.fill (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memset + ) + (func $~lib/internal/memory/memcpy (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + block $break|0 + loop $continue|0 get_local $2 + if (result i32) + get_local $1 + i32.const 3 + i32.and + else + get_local $2 + end if + block + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + end + br $continue|0 + end + end + end + get_local $0 + i32.const 3 + i32.and + i32.const 0 + i32.eq + if + block $break|1 + loop $continue|1 get_local $2 - get_global $src/common/SectionId.Data - i32.gt_u + i32.const 16 + i32.ge_u if - unreachable + block + get_local $0 + get_local $1 + i32.load + i32.store + get_local $0 + i32.const 4 + i32.add + get_local $1 + i32.const 4 + i32.add + i32.load + i32.store + get_local $0 + i32.const 8 + i32.add + get_local $1 + i32.const 8 + i32.add + i32.load + i32.store + get_local $0 + i32.const 12 + i32.add + get_local $1 + i32.const 12 + i32.add + i32.load + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|1 end - else - get_global $assembly/index/off - set_local $5 - call $assembly/index/readVaruint - tee_local $0 - get_global $assembly/index/off - tee_local $4 - i32.add - set_global $assembly/index/off - get_local $8 - get_global $assembly/index/off - get_local $5 - i32.sub - i32.sub - set_local $8 end - get_local $2 - get_global $assembly/index/off - tee_local $5 - get_local $8 - get_local $4 + end + get_local $2 + i32.const 8 + i32.and + if get_local $0 - call $assembly/options/onSection - if - block $break|1 - block $case12|1 - block $case11|1 - block $case8|1 - block $case7|1 - block $case6|1 - block $case5|1 - block $case4|1 - block $case3|1 - block $case2|1 - block $case1|1 - get_global $src/common/SectionId.Type - get_local $2 - i32.ne - if - get_global $src/common/SectionId.Import + get_local $1 + i32.load + i32.store + get_local $0 + i32.const 4 + i32.add + get_local $1 + i32.const 4 + i32.add + i32.load + i32.store + get_local $0 + i32.const 8 + i32.add + set_local $0 + get_local $1 + i32.const 8 + i32.add + set_local $1 + end + get_local $2 + i32.const 4 + i32.and + if + get_local $0 + get_local $1 + i32.load + i32.store + get_local $0 + i32.const 4 + i32.add + set_local $0 + get_local $1 + i32.const 4 + i32.add + set_local $1 + end + get_local $2 + i32.const 2 + i32.and + if + get_local $0 + get_local $1 + i32.load16_u + i32.store16 + get_local $0 + i32.const 2 + i32.add + set_local $0 + get_local $1 + i32.const 2 + i32.add + set_local $1 + end + get_local $2 + i32.const 1 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + return + end + get_local $2 + i32.const 32 + i32.ge_u + if + block $break|2 + block $case2|2 + block $case1|2 + block $case0|2 + get_local $0 + i32.const 3 + i32.and + set_local $5 + get_local $5 + i32.const 1 + i32.eq + br_if $case0|2 + get_local $5 + i32.const 2 + i32.eq + br_if $case1|2 + get_local $5 + i32.const 3 + i32.eq + br_if $case2|2 + br $break|2 + end + block + get_local $1 + i32.load + set_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 3 + i32.sub + set_local $2 + block $break|3 + loop $continue|3 + get_local $2 + i32.const 17 + i32.ge_u + if + block + get_local $1 + i32.const 1 + i32.add + i32.load + set_local $4 + get_local $0 + get_local $3 + i32.const 24 + i32.shr_u + get_local $4 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 5 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.const 24 + i32.shr_u + get_local $3 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 9 + i32.add + i32.load + set_local $4 + get_local $0 + i32.const 8 + i32.add + get_local $3 + i32.const 24 + i32.shr_u + get_local $4 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 13 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.const 24 + i32.shr_u + get_local $3 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|3 + end + end + end + br $break|2 + unreachable + end + unreachable + end + block + get_local $1 + i32.load + set_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 2 + i32.sub + set_local $2 + block $break|4 + loop $continue|4 + get_local $2 + i32.const 18 + i32.ge_u + if + block + get_local $1 + i32.const 2 + i32.add + i32.load + set_local $4 + get_local $0 + get_local $3 + i32.const 16 + i32.shr_u + get_local $4 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 6 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.const 16 + i32.shr_u + get_local $3 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 10 + i32.add + i32.load + set_local $4 + get_local $0 + i32.const 8 + i32.add + get_local $3 + i32.const 16 + i32.shr_u + get_local $4 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 14 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.const 16 + i32.shr_u + get_local $3 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|4 + end + end + end + br $break|2 + unreachable + end + unreachable + end + block + get_local $1 + i32.load + set_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + block $break|5 + loop $continue|5 + get_local $2 + i32.const 19 + i32.ge_u + if + block + get_local $1 + i32.const 3 + i32.add + i32.load + set_local $4 + get_local $0 + get_local $3 + i32.const 8 + i32.shr_u + get_local $4 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 7 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.const 8 + i32.shr_u + get_local $3 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 11 + i32.add + i32.load + set_local $4 + get_local $0 + i32.const 8 + i32.add + get_local $3 + i32.const 8 + i32.shr_u + get_local $4 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 15 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.const 8 + i32.shr_u + get_local $3 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|5 + end + end + end + br $break|2 + unreachable + end + unreachable + end + end + get_local $2 + i32.const 16 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 8 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 4 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 2 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 1 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + ) + (func $~lib/internal/memory/memmove (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + get_local $0 + get_local $1 + i32.eq + if + return + end + get_local $1 + get_local $2 + i32.add + get_local $0 + i32.le_u + tee_local $3 + if (result i32) + get_local $3 + else + get_local $0 + get_local $2 + i32.add + get_local $1 + i32.le_u + end + if + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memcpy + return + end + get_local $0 + get_local $1 + i32.lt_u + if + get_local $1 + i32.const 7 + i32.and + get_local $0 + i32.const 7 + i32.and + i32.eq + if + block $break|0 + loop $continue|0 + get_local $0 + i32.const 7 + i32.and + if + block + get_local $2 + i32.eqz + if + return + end + get_local $2 + i32.const 1 + i32.sub + set_local $2 + block (result i32) + get_local $0 + tee_local $3 + i32.const 1 + i32.add + set_local $0 + get_local $3 + end + block (result i32) + get_local $1 + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $3 + end + i32.load8_u + i32.store8 + end + br $continue|0 + end + end + end + block $break|1 + loop $continue|1 + get_local $2 + i32.const 8 + i32.ge_u + if + block + get_local $0 + get_local $1 + i64.load + i64.store + get_local $2 + i32.const 8 + i32.sub + set_local $2 + get_local $0 + i32.const 8 + i32.add + set_local $0 + get_local $1 + i32.const 8 + i32.add + set_local $1 + end + br $continue|1 + end + end + end + end + block $break|2 + loop $continue|2 + get_local $2 + if + block + block (result i32) + get_local $0 + tee_local $3 + i32.const 1 + i32.add + set_local $0 + get_local $3 + end + block (result i32) + get_local $1 + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $3 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + end + br $continue|2 + end + end + end + else + get_local $1 + i32.const 7 + i32.and + get_local $0 + i32.const 7 + i32.and + i32.eq + if + block $break|3 + loop $continue|3 + get_local $0 + get_local $2 + i32.add + i32.const 7 + i32.and + if + block + get_local $2 + i32.eqz + if + return + end + get_local $0 + get_local $2 + i32.const 1 + i32.sub + tee_local $2 + i32.add + get_local $1 + get_local $2 + i32.add + i32.load8_u + i32.store8 + end + br $continue|3 + end + end + end + block $break|4 + loop $continue|4 + get_local $2 + i32.const 8 + i32.ge_u + if + block + get_local $2 + i32.const 8 + i32.sub + set_local $2 + get_local $0 + get_local $2 + i32.add + get_local $1 + get_local $2 + i32.add + i64.load + i64.store + end + br $continue|4 + end + end + end + end + block $break|5 + loop $continue|5 + get_local $2 + if + get_local $0 + get_local $2 + i32.const 1 + i32.sub + tee_local $2 + i32.add + get_local $1 + get_local $2 + i32.add + i32.load8_u + i32.store8 + br $continue|5 + end + end + end + end + ) + (func $~lib/memory/memory.copy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memmove + ) + (func $~lib/internal/memory/memcmp (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + get_local $0 + get_local $1 + i32.eq + if + i32.const 0 + return + end + block $break|0 + loop $continue|0 + get_local $2 + i32.const 0 + i32.ne + tee_local $3 + if (result i32) + get_local $0 + i32.load8_u + get_local $1 + i32.load8_u + i32.eq + else + get_local $3 + end + if + block + get_local $2 + i32.const 1 + i32.sub + set_local $2 + get_local $0 + i32.const 1 + i32.add + set_local $0 + get_local $1 + i32.const 1 + i32.add + set_local $1 + end + br $continue|0 + end + end + end + get_local $2 + if (result i32) + get_local $0 + i32.load8_u + get_local $1 + i32.load8_u + i32.sub + else + i32.const 0 + end + ) + (func $~lib/memory/memory.compare (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memcmp + ) + (func $~lib/allocator/arena/__memory_allocate (; 9 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + get_global $~lib/internal/allocator/MAX_SIZE_32 + i32.gt_u + if + unreachable + end + get_global $~lib/allocator/arena/offset + set_local $1 + get_local $1 + get_local $0 + tee_local $2 + i32.const 1 + tee_local $3 + get_local $2 + get_local $3 + i32.gt_u + select + i32.add + get_global $~lib/internal/allocator/AL_MASK + i32.add + get_global $~lib/internal/allocator/AL_MASK + i32.const -1 + i32.xor + i32.and + set_local $4 + current_memory + set_local $5 + get_local $4 + get_local $5 + i32.const 16 + i32.shl + i32.gt_u + if + get_local $4 + get_local $1 + i32.sub + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + set_local $2 + get_local $5 + tee_local $3 + get_local $2 + tee_local $6 + get_local $3 + get_local $6 + i32.gt_s + select + set_local $3 + get_local $3 + grow_memory + i32.const 0 + i32.lt_s + if + get_local $2 + grow_memory + i32.const 0 + i32.lt_s + if + unreachable + end + end + end + get_local $4 + set_global $~lib/allocator/arena/offset + get_local $1 + ) + (func $~lib/memory/memory.allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $~lib/allocator/arena/__memory_allocate + return + ) + (func $~lib/allocator/arena/__memory_free (; 11 ;) (type $iv) (param $0 i32) + nop + ) + (func $~lib/memory/memory.free (; 12 ;) (type $iv) (param $0 i32) + get_local $0 + call $~lib/allocator/arena/__memory_free + return + ) + (func $~lib/allocator/arena/__memory_reset (; 13 ;) (type $v) + get_global $~lib/allocator/arena/startOffset + set_global $~lib/allocator/arena/offset + ) + (func $~lib/memory/memory.reset (; 14 ;) (type $v) + call $~lib/allocator/arena/__memory_reset + return + ) + (func $~lib/array/Array#__get (; 15 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + get_local $0 + i32.load + set_local $2 + get_local $1 + get_local $2 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + i32.const 0 + set_local $3 + get_local $2 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + ) + (func $~lib/internal/arraybuffer/computeSize (; 16 ;) (type $ii) (param $0 i32) (result i32) + i32.const 1 + i32.const 32 + get_local $0 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + i32.const 1 + i32.sub + i32.clz + i32.sub + i32.shl + ) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 17 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + get_global $~lib/internal/arraybuffer/MAX_BLENGTH + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 56 + i32.const 26 + i32.const 2 + call $~lib/env/abort + unreachable + end + block $~lib/memory/memory.allocate|inlined.0 (result i32) + get_local $0 + call $~lib/internal/arraybuffer/computeSize + set_local $2 + get_local $2 + call $~lib/allocator/arena/__memory_allocate + br $~lib/memory/memory.allocate|inlined.0 + end + set_local $1 + get_local $1 + get_local $0 + i32.store + get_local $1 + ) + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.load + set_local $2 + get_local $1 + get_local $2 + i32.gt_s + if + get_local $1 + get_global $~lib/internal/arraybuffer/MAX_BLENGTH + i32.le_s + i32.eqz + if + i32.const 0 + i32.const 56 + i32.const 40 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $1 + get_local $2 + call $~lib/internal/arraybuffer/computeSize + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.sub + i32.le_s + if + get_local $0 + get_local $1 + i32.store + else + get_local $1 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $4 + get_local $0 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $5 + get_local $4 + get_local $5 + get_local $2 + call $~lib/internal/memory/memmove + block $~lib/memory/memory.free|inlined.0 + block + get_local $0 + call $~lib/allocator/arena/__memory_free + br $~lib/memory/memory.free|inlined.0 + unreachable + end + unreachable + end + get_local $3 + set_local $0 + end + get_local $0 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + get_local $2 + i32.add + set_local $3 + i32.const 0 + set_local $5 + get_local $1 + get_local $2 + i32.sub + set_local $4 + get_local $3 + get_local $5 + get_local $4 + call $~lib/internal/memory/memset + else + get_local $1 + get_local $2 + i32.lt_s + if + get_local $1 + i32.const 0 + i32.ge_s + i32.eqz + if + i32.const 0 + i32.const 56 + i32.const 62 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $0 + get_local $1 + i32.store + end + end + get_local $0 + ) + (func $~lib/array/Array#push (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + i32.load offset=4 + set_local $2 + get_local $0 + i32.load + set_local $3 + get_local $3 + i32.load + i32.const 2 + i32.shr_u + set_local $4 + get_local $2 + i32.const 1 + i32.add + set_local $5 + get_local $2 + get_local $4 + i32.ge_u + if + get_local $2 + i32.const 268435454 + i32.ge_u + if + i32.const 0 + i32.const 24 + i32.const 184 + i32.const 42 + call $~lib/env/abort + unreachable + end + get_local $3 + get_local $5 + i32.const 2 + i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + set_local $3 + get_local $0 + get_local $3 + i32.store + end + get_local $0 + get_local $5 + i32.store offset=4 + i32.const 0 + set_local $6 + get_local $3 + get_local $2 + i32.const 2 + i32.shl + i32.add + get_local $6 + i32.add + get_local $1 + i32.store offset=8 + get_local $5 + ) + (func $assembly/module/index/Module#getID (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + i32.const 16 + set_local $2 + block $~lib/array/Array#get:length|inlined.0 (result i32) + get_local $0 + i32.load + set_local $3 + get_local $3 + i32.load offset=4 + end + set_local $3 + block $break|0 + i32.const 0 + set_local $4 + loop $repeat|0 + get_local $4 + get_local $3 + i32.lt_s + i32.eqz + br_if $break|0 + get_local $0 + i32.load + get_local $4 + call $~lib/array/Array#__get + i32.load offset=4 + get_local $1 + i32.eq + if + get_local $2 + get_local $0 + i32.load + get_local $4 + call $~lib/array/Array#__get + call $~lib/array/Array#push + drop + end + get_local $4 + i32.const 1 + i32.add + set_local $4 + br $repeat|0 + unreachable + end + unreachable + end + get_local $2 + ) + (func $assembly/module/index/TypeSection#constructor (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 8 + call $~lib/memory/memory.allocate + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + end + tee_local $0 + end + tee_local $0 + get_local $1 + i32.store + get_local $0 + i32.const 128 + i32.store offset=4 + get_local $0 + ) + (func $assembly/buffer/index/Buffer#readVaruint (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + i32.const 0 + set_local $2 + i32.const 0 + set_local $3 + get_local $0 + i32.load offset=8 + set_local $5 + block $break|0 + loop $continue|0 + block + block (result i32) + get_local $5 + tee_local $6 + i32.const 1 + i32.add + set_local $5 + get_local $6 + end + i32.load8_u + set_local $4 + get_local $2 + get_local $4 + i32.const 127 + i32.and + get_local $3 + i32.shl + i32.or + set_local $2 + get_local $4 + i32.const 128 + i32.and + i32.eqz + if + br $break|0 + end + get_local $3 + i32.const 7 + i32.add + set_local $3 + end + i32.const 1 + br_if $continue|0 + end + end + get_local $0 + get_local $5 + i32.store offset=8 + get_local $2 + ) + (func $~lib/array/Array#constructor (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $1 + i32.const 268435454 + i32.gt_u + if + i32.const 0 + i32.const 24 + i32.const 45 + i32.const 39 + call $~lib/env/abort + unreachable + end + get_local $1 + i32.const 2 + i32.shl + set_local $2 + get_local $2 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 8 + call $~lib/memory/memory.allocate + set_local $4 + get_local $4 + i32.const 0 + i32.store + get_local $4 + i32.const 0 + i32.store offset=4 + get_local $4 + end + tee_local $0 + end + tee_local $0 + get_local $3 + i32.store + get_local $0 + get_local $1 + i32.store offset=4 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $4 + i32.const 0 + set_local $5 + get_local $4 + get_local $5 + get_local $2 + call $~lib/internal/memory/memset + get_local $0 + ) + (func $assembly/buffer/index/Buffer#readVarint (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + i32.const 0 + set_local $2 + i32.const 0 + set_local $3 + get_local $0 + i32.load offset=8 + set_local $5 + block $break|0 + loop $continue|0 + block + block (result i32) + get_local $5 + tee_local $6 + i32.const 1 + i32.add + set_local $5 + get_local $6 + end + i32.load8_u + set_local $4 + get_local $2 + get_local $4 + i32.const 127 + i32.and + get_local $3 + i32.shl + i32.or + set_local $2 + get_local $3 + i32.const 7 + i32.add + set_local $3 + end + get_local $4 + i32.const 128 + i32.and + br_if $continue|0 + end + end + get_local $0 + get_local $5 + i32.store offset=8 + get_local $2 + i32.const 0 + i32.const -1 + i32.xor + get_local $3 + i32.shl + i32.or + get_local $2 + get_local $3 + get_local $1 + i32.lt_u + tee_local $6 + if (result i32) + get_local $4 + i32.const 64 + i32.and + i32.const 0 + i32.ne + else + get_local $6 + end + select + ) + (func $assembly/buffer/index/Buffer#readVarint8 (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + get_local $1 + call $assembly/buffer/index/Buffer#readVarint + ) + (func $assembly/module/index/FuncType#constructor (; 26 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 13 + call $~lib/memory/memory.allocate + set_local $3 + get_local $3 + i32.const 0 + i32.store + get_local $3 + i32.const 0 + i32.store offset=4 + get_local $3 + get_local $1 + i32.store offset=8 + get_local $3 + get_local $2 + i32.store8 offset=12 + get_local $3 + end + tee_local $0 + end + tee_local $0 + ) + (func $~lib/array/Array#__set (; 27 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.load + set_local $3 + get_local $3 + i32.load + i32.const 2 + i32.shr_u + set_local $4 + get_local $1 + get_local $4 + i32.ge_u + if + get_local $1 + i32.const 268435454 + i32.ge_u + if + i32.const 0 + i32.const 24 + i32.const 109 + i32.const 41 + call $~lib/env/abort + unreachable + end + get_local $3 + get_local $1 + i32.const 1 + i32.add + i32.const 2 + i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + set_local $3 + get_local $0 + get_local $3 + i32.store + get_local $0 + get_local $1 + i32.const 1 + i32.add + i32.store offset=4 + end + i32.const 0 + set_local $5 + get_local $3 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $5 + i32.add + get_local $2 + i32.store offset=8 + ) + (func $~lib/array/Array#constructor (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $1 + i32.const 268435454 + i32.gt_u + if + i32.const 0 + i32.const 24 + i32.const 45 + i32.const 39 + call $~lib/env/abort + unreachable + end + get_local $1 + i32.const 2 + i32.shl + set_local $2 + get_local $2 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 8 + call $~lib/memory/memory.allocate + set_local $4 + get_local $4 + i32.const 0 + i32.store + get_local $4 + i32.const 0 + i32.store offset=4 + get_local $4 + end + tee_local $0 + end + tee_local $0 + get_local $3 + i32.store + get_local $0 + get_local $1 + i32.store offset=4 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $4 + i32.const 0 + set_local $5 + get_local $4 + get_local $5 + get_local $2 + call $~lib/internal/memory/memset + get_local $0 + ) + (func $~lib/array/Array#__get (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + get_local $0 + i32.load + set_local $2 + get_local $1 + get_local $2 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + i32.const 0 + set_local $3 + get_local $2 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + ) + (func $~lib/array/Array#__set (; 30 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.load + set_local $3 + get_local $3 + i32.load + i32.const 2 + i32.shr_u + set_local $4 + get_local $1 + get_local $4 + i32.ge_u + if + get_local $1 + i32.const 268435454 + i32.ge_u + if + i32.const 0 + i32.const 24 + i32.const 109 + i32.const 41 + call $~lib/env/abort + unreachable + end + get_local $3 + get_local $1 + i32.const 1 + i32.add + i32.const 2 + i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + set_local $3 + get_local $0 + get_local $3 + i32.store + get_local $0 + get_local $1 + i32.const 1 + i32.add + i32.store offset=4 + end + i32.const 0 + set_local $5 + get_local $3 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $5 + i32.add + get_local $2 + i32.store offset=8 + ) + (func $~lib/internal/number/decimalCount32 (; 31 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + get_local $0 + i32.const 100000 + i32.lt_u + if + get_local $0 + i32.const 100 + i32.lt_u + if + i32.const 1 + i32.const 2 + get_local $0 + i32.const 10 + i32.lt_u + select + return + else + i32.const 4 + i32.const 5 + get_local $0 + i32.const 10000 + i32.lt_u + select + set_local $1 + i32.const 3 + get_local $1 + get_local $0 + i32.const 1000 + i32.lt_u + select + return + end + unreachable + unreachable + else + get_local $0 + i32.const 10000000 + i32.lt_u + if + i32.const 6 + i32.const 7 + get_local $0 + i32.const 1000000 + i32.lt_u + select + return + else + i32.const 9 + i32.const 10 + get_local $0 + i32.const 1000000000 + i32.lt_u + select + set_local $1 + i32.const 8 + get_local $1 + get_local $0 + i32.const 100000000 + i32.lt_u + select + return + end + unreachable + unreachable + end + unreachable + unreachable + ) + (func $~lib/internal/string/allocateUnsafe (; 32 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + i32.const 0 + i32.gt_s + tee_local $1 + if (result i32) + get_local $0 + get_global $~lib/internal/string/MAX_LENGTH + i32.le_s + else + get_local $1 + end + i32.eqz + if + i32.const 0 + i32.const 144 + i32.const 14 + i32.const 2 + call $~lib/env/abort + unreachable + end + block $~lib/memory/memory.allocate|inlined.1 (result i32) + get_global $~lib/internal/string/HEADER_SIZE + get_local $0 + i32.const 1 + i32.shl + i32.add + set_local $1 + get_local $1 + call $~lib/allocator/arena/__memory_allocate + br $~lib/memory/memory.allocate|inlined.1 + end + set_local $2 + get_local $2 + get_local $0 + i32.store + get_local $2 + ) + (func $~lib/internal/number/utoa32_lut (; 33 ;) (type $iiiv) (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 i64) + block $~lib/internal/number/DIGITS|inlined.0 (result i32) + i32.const 712 + end + i32.load + set_local $3 + block $break|0 + loop $continue|0 + get_local $1 + i32.const 10000 + i32.ge_u + if + block + get_local $1 + i32.const 10000 + i32.div_u + set_local $4 + get_local $1 + i32.const 10000 + i32.rem_u + set_local $5 + get_local $4 + set_local $1 + get_local $5 + i32.const 100 + i32.div_u + set_local $6 + get_local $5 + i32.const 100 + i32.rem_u + set_local $7 + block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i64) + i32.const 0 + set_local $8 + get_local $3 + get_local $6 + i32.const 2 + i32.shl + i32.add + get_local $8 + i32.add + i64.load32_u offset=8 + end + set_local $9 + block $~lib/internal/arraybuffer/LOAD|inlined.1 (result i64) + i32.const 0 + set_local $8 + get_local $3 + get_local $7 + i32.const 2 + i32.shl + i32.add + get_local $8 + i32.add + i64.load32_u offset=8 + end + set_local $10 + get_local $2 + i32.const 4 + i32.sub + set_local $2 + get_local $0 + get_local $2 + i32.const 1 + i32.shl + i32.add + get_local $9 + get_local $10 + i64.const 32 + i64.shl + i64.or + i64.store offset=4 + end + br $continue|0 + end + end + end + get_local $1 + i32.const 100 + i32.ge_u + if + get_local $1 + i32.const 100 + i32.div_u + set_local $7 + get_local $1 + i32.const 100 + i32.rem_u + set_local $6 + get_local $7 + set_local $1 + get_local $2 + i32.const 2 + i32.sub + set_local $2 + block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) + i32.const 0 + set_local $5 + get_local $3 + get_local $6 + i32.const 2 + i32.shl + i32.add + get_local $5 + i32.add + i32.load offset=8 + end + set_local $5 + get_local $0 + get_local $2 + i32.const 1 + i32.shl + i32.add + get_local $5 + i32.store offset=4 + end + get_local $1 + i32.const 10 + i32.ge_u + if + get_local $2 + i32.const 2 + i32.sub + set_local $2 + block $~lib/internal/arraybuffer/LOAD|inlined.1 (result i32) + i32.const 0 + set_local $5 + get_local $3 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $5 + i32.add + i32.load offset=8 + end + set_local $5 + get_local $0 + get_local $2 + i32.const 1 + i32.shl + i32.add + get_local $5 + i32.store offset=4 + else + get_local $2 + i32.const 1 + i32.sub + set_local $2 + get_global $~lib/internal/string/CharCode._0 + get_local $1 + i32.add + set_local $5 + get_local $0 + get_local $2 + i32.const 1 + i32.shl + i32.add + get_local $5 + i32.store16 offset=4 + end + ) + (func $~lib/internal/number/utoa32 (; 34 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + i32.eqz + if + i32.const 136 + return + end + get_local $0 + call $~lib/internal/number/decimalCount32 + set_local $1 + get_local $1 + call $~lib/internal/string/allocateUnsafe + set_local $2 + get_local $2 + get_local $0 + get_local $1 + call $~lib/internal/number/utoa32_lut + get_local $2 + ) + (func $~lib/internal/number/itoa (; 35 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $~lib/internal/number/utoa32 + return + ) + (func $assembly/module/index/typeName (; 36 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + block $break|0 + block $case7|0 + block $case6|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + block $case0|0 + get_local $0 + set_local $1 + get_local $1 + i32.const 127 + i32.eq + br_if $case0|0 + get_local $1 + i32.const 126 + i32.eq + br_if $case1|0 + get_local $1 + i32.const 125 + i32.eq + br_if $case2|0 + get_local $1 + i32.const 124 + i32.eq + br_if $case3|0 + get_local $1 + i32.const 112 + i32.eq + br_if $case4|0 + get_local $1 + i32.const 96 + i32.eq + br_if $case5|0 + get_local $1 + i32.const 64 + i32.eq + br_if $case6|0 + br $case7|0 + end + i32.const 720 + return + end + i32.const 736 + return + end + i32.const 752 + return + end + i32.const 768 + return + end + i32.const 784 + return + end + i32.const 808 + return + end + i32.const 824 + return + end + unreachable + unreachable + end + unreachable + i32.const 840 + ) + (func $~lib/array/Array#__get (; 37 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + get_local $0 + i32.load + set_local $2 + get_local $1 + get_local $2 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + i32.const 0 + set_local $3 + get_local $2 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + ) + (func $~lib/internal/string/copyUnsafe (; 38 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + get_local $0 + get_local $1 + i32.const 1 + i32.shl + i32.add + get_global $~lib/internal/string/HEADER_SIZE + i32.add + set_local $5 + get_local $2 + get_local $3 + i32.const 1 + i32.shl + i32.add + get_global $~lib/internal/string/HEADER_SIZE + i32.add + set_local $6 + get_local $4 + i32.const 1 + i32.shl + set_local $7 + get_local $5 + get_local $6 + get_local $7 + call $~lib/internal/memory/memmove + ) + (func $~lib/string/String#concat (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.const 0 +>>>>>>> new Branch for parser + i32.ne + i32.eqz + if + i32.const 0 + i32.const 864 + i32.const 110 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $1 + i32.const 0 + i32.eq + if + i32.const 848 + set_local $1 + end + get_local $0 + i32.load + set_local $2 + get_local $1 + i32.load + set_local $3 + get_local $2 + get_local $3 + i32.add + set_local $4 + get_local $4 + i32.const 0 + i32.eq + if + i32.const 840 + return + end + get_local $4 + call $~lib/internal/string/allocateUnsafe + set_local $5 + get_local $5 + i32.const 0 + get_local $0 + i32.const 0 + get_local $2 + call $~lib/internal/string/copyUnsafe + get_local $5 + get_local $2 + get_local $1 + i32.const 0 + get_local $3 + call $~lib/internal/string/copyUnsafe + get_local $5 + ) + (func $~lib/string/String.__concat (; 40 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 848 + set_local $0 + end + get_local $0 + get_local $1 + call $~lib/string/String#concat + ) + (func $assembly/module/index/FuncType#toString (; 41 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.load offset=8 + call $~lib/internal/number/itoa + set_local $1 + get_local $0 + i32.load8_s offset=12 + call $assembly/module/index/typeName + set_local $2 + i32.const 840 + set_local $3 + block $break|0 + i32.const 0 + set_local $4 + loop $repeat|0 + get_local $4 + block $~lib/array/Array#get:length|inlined.1 (result i32) + get_local $0 + i32.load + set_local $5 + get_local $5 + i32.load offset=4 + end + i32.lt_s + i32.eqz + br_if $break|0 + block + get_local $3 + get_local $0 + i32.load + get_local $4 + call $~lib/array/Array#__get + call $assembly/module/index/typeName + call $~lib/string/String.__concat + set_local $3 + get_local $4 + block $~lib/array/Array#get:length|inlined.3 (result i32) + get_local $0 + i32.load + set_local $5 + get_local $5 + i32.load offset=4 + end + i32.const 1 + i32.sub + i32.lt_s + if (result i32) + get_local $3 + i32.const 896 + call $~lib/string/String.__concat + tee_local $3 + else + get_local $3 + end + set_local $3 + end + get_local $4 + i32.const 1 + i32.add + set_local $4 + br $repeat|0 + unreachable + end + unreachable + end + block $~lib/array/Array#get:length|inlined.5 (result i32) + get_local $0 + i32.load offset=4 + set_local $4 + get_local $4 + i32.load offset=4 + end + i32.const 1 + i32.eq + if (result i32) + get_local $0 + i32.load offset=4 + i32.const 0 + call $~lib/array/Array#__get + call $assembly/module/index/typeName + else + i32.const 904 + end + set_local $4 + i32.const 920 + get_local $1 + call $~lib/string/String.__concat + i32.const 896 + call $~lib/string/String.__concat + i32.const 944 + call $~lib/string/String.__concat + get_local $2 + call $~lib/string/String.__concat + i32.const 960 + call $~lib/string/String.__concat + get_local $3 + call $~lib/string/String.__concat + i32.const 976 + call $~lib/string/String.__concat + get_local $4 + call $~lib/string/String.__concat + ) + (func $assembly/host/index/log (; 42 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_log_str + ) + (func $assembly/module/index/TypeSection#parse (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + get_local $1 + get_local $0 + i32.load + i32.load offset=12 + i32.store offset=8 + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $2 + i32.const 0 + get_local $2 + call $~lib/array/Array#constructor + set_local $3 + block $break|0 + i32.const 0 + set_local $4 + loop $repeat|0 + get_local $4 + get_local $2 + i32.lt_u + i32.eqz + br_if $break|0 + block + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint8 + i32.const 127 + i32.and + set_local $5 + i32.const 0 + get_local $4 + get_local $5 + call $assembly/module/index/FuncType#constructor + set_local $6 + get_local $3 + get_local $4 + get_local $6 + call $~lib/array/Array#__set + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $7 + get_local $6 + i32.const 0 + get_local $7 + call $~lib/array/Array#constructor + i32.store + block $break|1 + i32.const 0 + set_local $8 + loop $repeat|1 + get_local $8 + get_local $7 + i32.lt_u + i32.eqz + br_if $break|1 + block + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint8 + i32.const 127 + i32.and + set_local $9 + get_local $3 + get_local $4 + call $~lib/array/Array#__get + i32.load + get_local $8 + get_local $9 + call $~lib/array/Array#__set + end + get_local $8 + i32.const 1 + i32.add + set_local $8 + br $repeat|1 + unreachable + end + unreachable + end + get_local $1 + i32.const 1 + call $assembly/buffer/index/Buffer#readVaruint + set_local $8 + get_local $3 + get_local $4 + call $~lib/array/Array#__get + i32.const 0 + get_local $8 + call $~lib/array/Array#constructor + i32.store offset=4 + block $break|2 + i32.const 0 + set_local $9 + loop $repeat|2 + get_local $9 + get_local $8 + i32.lt_u + i32.eqz + br_if $break|2 + block + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint8 + i32.const 127 + i32.and + set_local $10 + get_local $3 + get_local $4 + call $~lib/array/Array#__get + i32.load offset=4 + get_local $9 + get_local $10 + call $~lib/array/Array#__set + end + get_local $9 + i32.const 1 + i32.add + set_local $9 + br $repeat|2 + unreachable + end + unreachable + end + get_local $3 + get_local $4 + call $~lib/array/Array#__get + call $assembly/module/index/FuncType#toString + call $assembly/host/index/log + end + get_local $4 + i32.const 1 + i32.add + set_local $4 + br $repeat|0 + unreachable + end + unreachable + end + get_local $0 + ) + (func $~lib/array/Array#push (; 44 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + i32.load offset=4 + set_local $2 + get_local $0 + i32.load + set_local $3 + get_local $3 + i32.load + i32.const 2 + i32.shr_u + set_local $4 + get_local $2 + i32.const 1 + i32.add + set_local $5 + get_local $2 + get_local $4 + i32.ge_u + if + get_local $2 + i32.const 268435454 + i32.ge_u + if + i32.const 0 + i32.const 24 + i32.const 184 + i32.const 42 + call $~lib/env/abort + unreachable + end + get_local $3 + get_local $5 + i32.const 2 + i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + set_local $3 + get_local $0 + get_local $3 + i32.store + end + get_local $0 + get_local $5 + i32.store offset=4 + i32.const 0 + set_local $6 + get_local $3 + get_local $2 + i32.const 2 + i32.shl + i32.add + get_local $6 + i32.add + get_local $1 + i32.store offset=8 + get_local $5 + ) + (func $~lib/array/Array#join (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + get_local $0 + i32.load offset=4 + i32.const 1 + i32.sub + set_local $2 + get_local $2 + i32.const 0 + i32.lt_s + if + i32.const 840 + return + end + i32.const 840 + set_local $3 + get_local $0 + i32.load + set_local $5 + get_local $1 + i32.load + set_local $6 + get_local $6 + i32.const 0 + i32.ne + set_local $7 + get_local $2 + i32.eqz + if + block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) + i32.const 0 + set_local $8 + i32.const 0 +<<<<<<< loader-memory-accessors + set_local $4 +======= + set_local $9 + get_local $5 + get_local $8 + i32.const 2 + i32.shl + i32.add + get_local $9 + i32.add + i32.load offset=8 + end + return + end + i32.const 0 + set_local $9 + block $break|0 + block +>>>>>>> new Branch for parser + i32.const 0 + set_local $8 + get_local $2 + i32.const 1 + i32.add + set_local $10 + end + loop $repeat|0 + get_local $8 + get_local $10 + i32.lt_s + i32.eqz + br_if $break|0 + get_local $9 + block $~lib/internal/arraybuffer/LOAD|inlined.1 (result i32) + i32.const 0 + set_local $11 + get_local $5 + get_local $8 + i32.const 2 + i32.shl + i32.add + get_local $11 + i32.add + i32.load offset=8 + end + i32.load + i32.add + set_local $9 + get_local $8 + i32.const 1 + i32.add + set_local $8 + br $repeat|0 + unreachable + end + unreachable + end + i32.const 0 + set_local $10 + get_local $9 + get_local $6 + get_local $2 + i32.mul + i32.add + call $~lib/internal/string/allocateUnsafe + set_local $8 + block $break|1 + i32.const 0 + set_local $11 + loop $repeat|1 + get_local $11 + get_local $2 + i32.lt_s + i32.eqz + br_if $break|1 + block + block $~lib/internal/arraybuffer/LOAD|inlined.2 (result i32) + i32.const 0 + set_local $12 + get_local $5 + get_local $11 + i32.const 2 + i32.shl + i32.add + get_local $12 + i32.add + i32.load offset=8 + end +<<<<<<< loader-memory-accessors + else + get_global $assembly/index/off + set_local $5 + call $assembly/index/readVaruint + tee_local $0 + get_global $assembly/index/off + tee_local $4 + i32.add + set_global $assembly/index/off + get_local $8 + get_global $assembly/index/off + get_local $5 + i32.sub + i32.sub + set_local $8 +======= + set_local $4 + get_local $4 + if + get_local $4 + i32.load + set_local $12 + get_local $8 + get_local $10 + get_local $4 + i32.const 0 + get_local $12 + call $~lib/internal/string/copyUnsafe + get_local $10 + get_local $12 + i32.add + set_local $10 + end + get_local $7 + if + get_local $8 + get_local $10 + get_local $1 + i32.const 0 + get_local $6 + call $~lib/internal/string/copyUnsafe + get_local $10 + get_local $6 + i32.add + set_local $10 + end +>>>>>>> new Branch for parser + end + get_local $11 + i32.const 1 + i32.add + set_local $11 + br $repeat|1 + unreachable + end + unreachable + end + block $~lib/internal/arraybuffer/LOAD|inlined.3 (result i32) + i32.const 0 + set_local $11 + get_local $5 + get_local $2 + i32.const 2 + i32.shl + i32.add + get_local $11 + i32.add + i32.load offset=8 + end + set_local $4 + get_local $4 + if + get_local $4 + i32.load + set_local $11 + get_local $8 + get_local $10 + get_local $4 + i32.const 0 + get_local $11 + call $~lib/internal/string/copyUnsafe + end + get_local $8 + return + ) + (func $assembly/module/index/TypeSection#toString (; 46 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + i32.const 1000 + set_local $1 + block $break|0 + i32.const 0 + set_local $2 + loop $repeat|0 + get_local $2 +<<<<<<< loader-memory-accessors + get_global $assembly/index/off + tee_local $5 + get_local $8 + get_local $4 + get_local $0 + call $assembly/options/onSection + if + block $break|1 + block $case12|1 + block $case11|1 + block $case8|1 + block $case7|1 + block $case6|1 + block $case5|1 + block $case4|1 + block $case3|1 + block $case2|1 + block $case1|1 + get_global $src/common/SectionId.Type + get_local $2 + i32.ne + if + get_global $src/common/SectionId.Import get_local $2 i32.eq br_if $case1|1 @@ -854,8 +4483,219 @@ call $assembly/index/readVaruint call $assembly/options/onStart br $break|1 +======= + block $~lib/array/Array#get:length|inlined.1 (result i32) + get_local $0 + i32.load offset=4 + set_local $3 + get_local $3 + i32.load offset=4 + end + i32.lt_s + i32.eqz + br_if $break|0 + get_local $1 + get_local $0 + i32.load offset=4 + get_local $2 + call $~lib/array/Array#__get + call $assembly/module/index/FuncType#toString + call $~lib/array/Array#push + drop + get_local $2 + i32.const 1 + i32.add + set_local $2 + br $repeat|0 + unreachable + end + unreachable + end + get_local $1 + i32.const 1008 + call $~lib/array/Array#join + ) + (func $assembly/index/getType (; 47 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + get_global $src/common/SectionId.Type + call $assembly/module/index/Module#getID + set_local $1 + i32.const 0 + get_local $1 + i32.const 0 + call $~lib/array/Array#__get + call $assembly/module/index/TypeSection#constructor + set_local $2 + get_local $2 + get_local $0 + i32.load offset=4 + call $assembly/module/index/TypeSection#parse + set_global $assembly/index/type + get_global $assembly/index/type + call $assembly/module/index/TypeSection#toString + ) + (func $assembly/index/toString (; 48 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $assembly/module/index/TypeSection#toString + ) + (func $assembly/module/index/Module#constructor (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 8 + call $~lib/memory/memory.allocate + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + end + tee_local $0 + end + tee_local $0 + get_local $1 + i32.store offset=4 + get_local $0 + i32.const 1024 + i32.store + get_local $0 + ) + (func $assembly/index/Parser#constructor (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 8 + call $~lib/memory/memory.allocate + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + end + tee_local $0 + end + tee_local $0 + get_local $1 + i32.store + get_local $0 + i32.const 0 + get_local $1 + call $assembly/module/index/Module#constructor + i32.store offset=4 + get_local $0 + ) + (func $~lib/string/String.fromUTF8 (; 51 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + get_local $1 + i32.const 1 + i32.lt_u + if + i32.const 840 + return + end + i32.const 0 + set_local $2 + block $~lib/memory/memory.allocate|inlined.2 (result i32) + get_local $1 + i32.const 1 + i32.shl + set_local $3 + get_local $3 + call $~lib/allocator/arena/__memory_allocate + br $~lib/memory/memory.allocate|inlined.2 + end + set_local $4 + i32.const 0 + set_local $5 + block $break|0 + loop $continue|0 + get_local $2 + get_local $1 + i32.lt_u + if + block + get_local $0 + block (result i32) + get_local $2 + tee_local $3 + i32.const 1 + i32.add + set_local $2 + get_local $3 + end + i32.add + i32.load8_u + set_local $3 + get_local $3 + i32.const 128 + i32.lt_u + if + get_local $4 + get_local $5 + i32.add + get_local $3 + i32.store16 + get_local $5 + i32.const 2 + i32.add + set_local $5 + else + get_local $3 + i32.const 191 + i32.gt_u + tee_local $6 + if (result i32) + get_local $3 + i32.const 224 + i32.lt_u + else + get_local $6 + end + if + get_local $2 + i32.const 1 + i32.add + get_local $1 + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 864 + i32.const 510 + i32.const 8 + call $~lib/env/abort + unreachable +>>>>>>> new Branch for parser end + get_local $4 + get_local $5 + i32.add + get_local $3 + i32.const 31 + i32.and + i32.const 6 + i32.shl get_local $0 +<<<<<<< loader-memory-accessors i32.const 4 i32.eq tee_local $2 @@ -980,14 +4820,135 @@ end br $break|12 end +======= + block (result i32) + get_local $2 + tee_local $6 + i32.const 1 + i32.add + set_local $2 + get_local $6 + end + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.or + i32.store16 + get_local $5 + i32.const 2 + i32.add + set_local $5 + else + get_local $3 + i32.const 239 + i32.gt_u + tee_local $6 + if (result i32) + get_local $3 + i32.const 365 + i32.lt_u + else + get_local $6 + end + if + get_local $2 + i32.const 3 + i32.add + get_local $1 + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 864 + i32.const 514 + i32.const 8 + call $~lib/env/abort +>>>>>>> new Branch for parser unreachable end + get_local $3 + i32.const 7 + i32.and + i32.const 18 + i32.shl + get_local $0 + block (result i32) + get_local $2 + tee_local $6 + i32.const 1 + i32.add + set_local $2 + get_local $6 + end + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.const 12 + i32.shl + i32.or + get_local $0 + block (result i32) + get_local $2 + tee_local $6 + i32.const 1 + i32.add + set_local $2 + get_local $6 + end + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.const 6 + i32.shl + i32.or get_local $0 + block (result i32) + get_local $2 + tee_local $6 + i32.const 1 + i32.add + set_local $2 + get_local $6 + end + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.or + i32.const 65536 + i32.sub + set_local $3 + get_local $4 + get_local $5 + i32.add + i32.const 55296 get_local $3 + i32.const 10 + i32.shr_u i32.add - set_global $assembly/index/off - br $break|1 + i32.store16 + get_local $5 + i32.const 2 + i32.add + set_local $5 + get_local $4 + get_local $5 + i32.add + i32.const 56320 + get_local $3 + i32.const 1023 + i32.and + i32.add + i32.store16 + get_local $5 + i32.const 2 + i32.add + set_local $5 else +<<<<<<< loader-memory-accessors block (result i32) get_local $0 i32.const 16 @@ -1017,44 +4978,560 @@ tee_local $0 get_global $assembly/index/off tee_local $3 +======= + get_local $2 + i32.const 2 + i32.add + get_local $1 + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 864 + i32.const 526 + i32.const 8 + call $~lib/env/abort + unreachable + end + get_local $4 + get_local $5 + i32.add + get_local $3 + i32.const 15 + i32.and + i32.const 12 + i32.shl + get_local $0 + block (result i32) + get_local $2 + tee_local $6 + i32.const 1 i32.add - set_global $assembly/index/off - get_local $3 - get_local $0 - call $assembly/options/onSourceMappingURL + set_local $2 + get_local $6 + end + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.const 6 + i32.shl + i32.or + get_local $0 + block (result i32) + get_local $2 + tee_local $6 + i32.const 1 +>>>>>>> new Branch for parser + i32.add + set_local $2 + get_local $6 end + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.or + i32.store16 + get_local $5 + i32.const 2 + i32.add + set_local $5 end +<<<<<<< loader-memory-accessors get_local $5 get_local $8 i32.add set_global $assembly/index/off br $break|1 +======= +>>>>>>> new Branch for parser end - get_global $assembly/index/off - get_local $8 - i32.add - set_global $assembly/index/off - br $break|1 end - unreachable end - else - get_global $assembly/index/off - get_local $8 - i32.add - set_global $assembly/index/off + br $continue|0 end - br $continue|0 end end - get_global $assembly/index/off + get_local $2 + get_local $1 + i32.eq + i32.eqz + if + i32.const 0 + i32.const 864 + i32.const 535 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $5 + i32.const 1 + i32.shr_u + call $~lib/internal/string/allocateUnsafe + set_local $7 + get_local $7 + get_global $~lib/internal/string/HEADER_SIZE + i32.add + set_local $3 + get_local $3 + get_local $4 + get_local $5 + call $~lib/internal/memory/memmove + block $~lib/memory/memory.free|inlined.1 + block + get_local $4 + call $~lib/allocator/arena/__memory_free + br $~lib/memory/memory.free|inlined.1 + unreachable + end + unreachable + end + get_local $7 + ) + (func $assembly/index/Parser#parseString (; 52 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load + i32.load offset=8 + get_local $0 + i32.load + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + call $~lib/string/String.fromUTF8 + ) + (func $assembly/index/Parser#readVaruint (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.load + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + ) + (func $assembly/index/Parser#get:off (; 54 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load + i32.load offset=8 + ) + (func $assembly/index/Parser#set:off (; 55 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + i32.load + get_local $1 + i32.store offset=8 + ) + (func $assembly/buffer/index/Buffer#readUint (; 56 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + i32.load offset=8 + set_local $1 + get_local $1 + i32.load + set_local $2 + get_local $0 + get_local $1 + i32.const 4 + i32.add + i32.store offset=8 + get_local $2 + ) + (func $assembly/module/index/sectionName (; 57 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + block $break|0 + block $case12|0 + block $case11|0 + block $case10|0 + block $case9|0 + block $case8|0 + block $case7|0 + block $case6|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + block $case0|0 + get_local $0 + set_local $1 + get_local $1 + i32.const 0 + i32.eq + br_if $case0|0 + get_local $1 + i32.const 1 + i32.eq + br_if $case1|0 + get_local $1 + i32.const 2 + i32.eq + br_if $case2|0 + get_local $1 + i32.const 3 + i32.eq + br_if $case3|0 + get_local $1 + i32.const 4 + i32.eq + br_if $case4|0 + get_local $1 + i32.const 5 + i32.eq + br_if $case5|0 + get_local $1 + i32.const 6 + i32.eq + br_if $case6|0 + get_local $1 + i32.const 7 + i32.eq + br_if $case7|0 + get_local $1 + i32.const 8 + i32.eq + br_if $case8|0 + get_local $1 + i32.const 9 + i32.eq + br_if $case9|0 + get_local $1 + i32.const 10 + i32.eq + br_if $case10|0 + get_local $1 + i32.const 11 + i32.eq + br_if $case11|0 + br $case12|0 + end + i32.const 1040 + return + end + i32.const 1056 + return + end + i32.const 1072 + return + end + i32.const 1088 + return + end + i32.const 1112 + return + end + i32.const 1128 + return + end + i32.const 1144 + return + end + i32.const 1160 + return + end + i32.const 1176 + return + end + i32.const 1192 + return + end + i32.const 1216 + return + end + i32.const 1232 + return + end + unreachable + unreachable + end + unreachable + i32.const 840 + ) + (func $assembly/module/index/SectionHeader#constructor (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 20 + call $~lib/memory/memory.allocate + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + i32.const 0 + i32.store offset=8 + get_local $2 + i32.const 0 + i32.store offset=12 + get_local $2 + i32.const 840 + i32.store offset=16 + get_local $2 + end + tee_local $0 + end + tee_local $0 + get_local $1 + i32.load offset=8 + i32.store + get_local $0 + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVaruint + i32.store offset=4 + get_local $0 + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + i32.store offset=8 + get_local $0 + i32.load offset=4 + i32.const 0 + i32.eq + if + get_local $1 + i32.load offset=8 + set_local $2 + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $3 + get_local $1 + i32.load offset=8 + set_local $4 + get_local $0 + i32.const 1032 + get_local $4 + get_local $3 + call $~lib/string/String.fromUTF8 + call $~lib/string/String.__concat + i32.const 1032 + call $~lib/string/String.__concat + i32.store offset=16 + get_local $1 + get_local $1 + i32.load offset=8 + get_local $3 + i32.add + i32.store offset=8 + get_local $0 + get_local $0 + i32.load offset=8 + get_local $1 + i32.load offset=8 + get_local $2 + i32.sub + i32.sub + i32.store offset=8 + else + get_local $0 + i32.load offset=4 + get_global $src/common/SectionId.Data + i32.le_u + if + get_local $0 + get_local $0 + i32.load offset=4 + call $assembly/module/index/sectionName + i32.store offset=16 + else + unreachable + end + end + get_local $0 + get_local $1 + i32.load offset=8 + i32.store offset=12 + get_local $0 + ) + (func $assembly/module/index/Module#parseSection (; 59 ;) (type $iiv) (param $0 i32) (param $1 i32) + (local $2 i32) + get_local $0 + i32.load + get_local $1 + call $~lib/array/Array#push + drop + block $break|0 + block $case1|0 + block $case0|0 + get_local $1 + i32.load offset=4 + set_local $2 + get_local $2 + get_global $src/common/SectionId.Type + i32.eq + br_if $case0|0 + br $case1|0 + end + br $break|0 + end + end + ) + (func $assembly/module/index/SectionHeader#get:end (; 60 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load offset=12 + get_local $0 + i32.load offset=8 + i32.add + ) + (func $assembly/index/Parser#parse (; 61 ;) (type $iv) (param $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + get_local $0 + i32.load + call $assembly/buffer/index/Buffer#readUint + set_local $1 get_local $1 + i32.const 1836278016 + i32.ne + if + unreachable + end + get_local $0 + i32.load + call $assembly/buffer/index/Buffer#readUint + set_local $2 + get_local $2 + i32.const 1 i32.ne if unreachable end + i32.const 0 + set_local $3 + i32.const 0 + set_local $4 + i32.const 0 + set_local $5 + i32.const 0 + set_local $6 + block $break|0 + loop $continue|0 + get_local $0 + i32.load + i32.load offset=8 + get_local $0 + i32.load + i32.load offset=4 + i32.lt_u + if + block + i32.const 0 + get_local $0 + i32.load + call $assembly/module/index/SectionHeader#constructor + set_local $7 + get_local $0 + i32.load offset=4 + get_local $7 + call $assembly/module/index/Module#parseSection + get_local $0 + get_local $7 + call $assembly/module/index/SectionHeader#get:end + call $assembly/index/Parser#set:off + end + br $continue|0 + end + end + end + ) + (func $~lib/arraybuffer/ArrayBuffer#get:data (; 62 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + ) + (func $assembly/buffer/index/Buffer#constructor (; 63 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 12 + call $~lib/memory/memory.allocate + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + i32.const 0 + i32.store offset=8 + get_local $2 + end + tee_local $0 + end + tee_local $0 + get_local $1 + i32.store + get_local $0 + get_local $1 + i32.load + call $~lib/arraybuffer/ArrayBuffer#get:data + i32.store offset=8 + get_local $0 + get_local $1 + i32.load offset=8 + i32.store offset=4 + get_local $0 + ) + (func $assembly/index/newParser (; 64 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + i32.const 0 + get_local $0 + call $assembly/buffer/index/Buffer#constructor + set_local $1 + i32.const 0 + get_local $1 + call $assembly/index/Parser#constructor + ) + (func $assembly/index/parse (; 65 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $assembly/index/Parser#parse + get_local $0 + i32.load offset=4 ) - (func $null (; 24 ;) (type $v) + (func $start (; 66 ;) (type $v) + get_global $HEAP_BASE + get_global $~lib/internal/allocator/AL_MASK + i32.add + get_global $~lib/internal/allocator/AL_MASK + i32.const -1 + i32.xor + i32.and + set_global $~lib/allocator/arena/startOffset + get_global $~lib/allocator/arena/startOffset + set_global $~lib/allocator/arena/offset nop ) + (func $null (; 67 ;) (type $v) + ) + (func $Parser#get:buf (; 68 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load + ) + (func $Parser#set:buf (; 69 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + get_local $1 + i32.store + ) + (func $Parser#get:module (; 70 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load offset=4 + ) + (func $Parser#set:module (; 71 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + get_local $1 + i32.store offset=4 + ) ) diff --git a/lib/parse/index.js b/lib/parse/index.js index 9c6ea07603..9309c2ad20 100644 --- a/lib/parse/index.js +++ b/lib/parse/index.js @@ -1,2 +1,6 @@ +<<<<<<< loader-memory-accessors !function(A,B){"object"==typeof exports&&"object"==typeof module?module.exports=B():"function"==typeof define&&define.amd?define([],B):"object"==typeof exports?exports.asparse=B():A.asparse=B()}("undefined"!=typeof self?self:this,function(){return function(A){var B={};function n(e){if(B[e])return B[e].exports;var o=B[e]={i:e,l:!1,exports:{}};return A[e].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=A,n.c=B,n.d=function(A,B,e){n.o(A,B)||Object.defineProperty(A,B,{enumerable:!0,get:e})},n.r=function(A){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(A,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(A,"__esModule",{value:!0})},n.t=function(A,B){if(1&B&&(A=n(A)),8&B)return A;if(4&B&&"object"==typeof A&&A&&A.__esModule)return A;var e=Object.create(null);if(n.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:A}),2&B&&"string"!=typeof A)for(var o in A)n.d(e,o,function(B){return A[B]}.bind(null,o));return e},n.n=function(A){var B=A&&A.__esModule?function(){return A.default}:function(){return A};return n.d(B,"a",B),B},n.o=function(A,B){return Object.prototype.hasOwnProperty.call(A,B)},n.p="",n(n.s=0)}([function(A,B,n){A.exports=n(1)},function(A,B,n){"use strict";B.__esModule=!0;var e=n(2);B.Type=e.Type,B.SectionId=e.SectionId,B.ExternalKind=e.ExternalKind;var o=null;B.parse=function A(B,n){n||(n={}),o||(o=new WebAssembly.Module(function(A){var B=A.length;if(B){for(var n=0,e=B;--e%4>1&&61===A.charCodeAt(e);)++n;B=Math.ceil(3*B)/4-n}for(var o=new Uint8Array(B),E=0,t=0,C=0,I=0,r=A.length;I1)break;if(void 0===(i=Q[i]))throw Error();switch(E){case 0:C=i,E=1;break;case 1:o[t++]=C<<2|(48&i)>>4,C=i,E=2;break;case 2:o[t++]=(15&C)<<4|(60&i)>>2,C=i,E=3;break;case 3:o[t++]=(3&C)<<6|i,E=0}}if(1===E)throw Error();return o}("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")));var e=B.length,E=(e+65535&-65536)>>16,t=new WebAssembly.Memory({initial:E}),C=new Uint8Array(t.buffer);C.set(B),A.readString=function(A,B){return function(A,B,n){if(n-B<1)return"";for(var e=null,o=[],Q=0,E=0;B191&&E<224?o[Q++]=(31&E)<<6|63&A[B++]:E>239&&E<365?(E=((7&E)<<18|(63&A[B++])<<12|(63&A[B++])<<6|63&A[B++])-65536,o[Q++]=55296+(E>>10),o[Q++]=56320+(1023&E)):o[Q++]=(15&E)<<12|(63&A[B++])<<6|63&A[B++],Q>8191&&((e||(e=[])).push(String.fromCharCode.apply(String,o)),Q=0);return e?(Q&&e.push(String.fromCharCode.apply(String,o.slice(0,Q))),e.join("")):String.fromCharCode.apply(String,o.slice(0,Q))}(C,A,A+B)};var I={env:{memory:t},options:{}};["onSection","onType","onTypeParam","onTypeReturn","onImport","onFunctionImport","onTableImport","onMemoryImport","onGlobalImport","onMemory","onFunction","onTable","onGlobal","onExport","onStart","onSourceMappingURL","onModuleName","onFunctionName","onLocalName"].forEach(function(A){return I.options[A]=n[A]||function(){}}),new WebAssembly.Instance(o,I).exports.parse(0,e)};for(var Q=new Array(123),E=0;E<64;)Q[E<26?E+65:E<52?E+71:E<62?E-4:E-59|43]=E++},function(A,B,n){"use strict";B.__esModule=!0,function(A){A[A.i32=127]="i32",A[A.i64=126]="i64",A[A.f32=125]="f32",A[A.f64=124]="f64",A[A.anyfunc=112]="anyfunc",A[A.func=96]="func",A[A.none=64]="none"}(B.Type||(B.Type={})),function(A){A[A.Custom=0]="Custom",A[A.Type=1]="Type",A[A.Import=2]="Import",A[A.Function=3]="Function",A[A.Table=4]="Table",A[A.Memory=5]="Memory",A[A.Global=6]="Global",A[A.Export=7]="Export",A[A.Start=8]="Start",A[A.Element=9]="Element",A[A.Code=10]="Code",A[A.Data=11]="Data"}(B.SectionId||(B.SectionId={})),function(A){A[A.Function=0]="Function",A[A.Table=1]="Table",A[A.Memory=2]="Memory",A[A.Global=3]="Global"}(B.ExternalKind||(B.ExternalKind={})),function(A){A[A.Module=0]="Module",A[A.Function=1]="Function",A[A.Local=2]="Local"}(B.NameType||(B.NameType={})),B.MAX_PAGES=65535,B.MAX_ELEMS=4294967295,function(A){A[A.end=11]="end",A[A.get_global=35]="get_global",A[A.i32_const=65]="i32_const",A[A.i64_const=66]="i64_const",A[A.f32_const=67]="f32_const",A[A.f64_const=68]="f64_const"}(B.Opcode||(B.Opcode={}))}])}); +======= +!function(A,Q){"object"==typeof exports&&"object"==typeof module?module.exports=Q():"function"==typeof define&&define.amd?define([],Q):"object"==typeof exports?exports.asparse=Q():A.asparse=Q()}("undefined"!=typeof self?self:this,function(){return function(A){var Q={};function n(B){if(Q[B])return Q[B].exports;var e=Q[B]={i:B,l:!1,exports:{}};return A[B].call(e.exports,e,e.exports,n),e.l=!0,e.exports}return n.m=A,n.c=Q,n.d=function(A,Q,B){n.o(A,Q)||Object.defineProperty(A,Q,{enumerable:!0,get:B})},n.r=function(A){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(A,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(A,"__esModule",{value:!0})},n.t=function(A,Q){if(1&Q&&(A=n(A)),8&Q)return A;if(4&Q&&"object"==typeof A&&A&&A.__esModule)return A;var B=Object.create(null);if(n.r(B),Object.defineProperty(B,"default",{enumerable:!0,value:A}),2&Q&&"string"!=typeof A)for(var e in A)n.d(B,e,function(Q){return A[Q]}.bind(null,e));return B},n.n=function(A){var Q=A&&A.__esModule?function(){return A.default}:function(){return A};return n.d(Q,"a",Q),Q},n.o=function(A,Q){return Object.prototype.hasOwnProperty.call(A,Q)},n.p="",n(n.s=0)}([function(A,Q,n){A.exports=n(1)},function(A,Q,n){"use strict";Q.__esModule=!0;var B=n(2);Q.Type=B.Type,Q.SectionId=B.SectionId,Q.ExternalKind=B.ExternalKind;var e=null;Q.parse=function A(Q,n){n||(n={}),e||(e=new WebAssembly.Module(function(A){var Q=A.length;if(Q){for(var n=0,B=Q;--B%4>1&&61===A.charCodeAt(B);)++n;Q=Math.ceil(3*Q)/4-n}for(var e=new Uint8Array(Q),t=0,E=0,o=0,C=0,b=A.length;C1)break;if(void 0===(c=I[c]))throw Error();switch(t){case 0:o=c,t=1;break;case 1:e[E++]=o<<2|(48&c)>>4,o=c,t=2;break;case 2:e[E++]=(15&o)<<4|(60&c)>>2,o=c,t=3;break;case 3:e[E++]=(3&o)<<6|c,t=0}}if(1===t)throw Error();return e}("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BBlhc3NlbWJseS9vcHRpb25zL29uSW1wb3J0BSFhc3NlbWJseS9vcHRpb25zL29uRnVuY3Rpb25JbXBvcnQGHmFzc2VtYmx5L29wdGlvbnMvb25UYWJsZUltcG9ydAcfYXNzZW1ibHkvb3B0aW9ucy9vbk1lbW9yeUltcG9ydAgfYXNzZW1ibHkvb3B0aW9ucy9vbkdsb2JhbEltcG9ydAkbYXNzZW1ibHkvb3B0aW9ucy9vbkZ1bmN0aW9uChhhc3NlbWJseS9vcHRpb25zL29uVGFibGULGWFzc2VtYmx5L29wdGlvbnMvb25NZW1vcnkMGWFzc2VtYmx5L29wdGlvbnMvb25HbG9iYWwNGWFzc2VtYmx5L29wdGlvbnMvb25FeHBvcnQOGGFzc2VtYmx5L29wdGlvbnMvb25TdGFydA8dYXNzZW1ibHkvb3B0aW9ucy9vbk1vZHVsZU5hbWUQH2Fzc2VtYmx5L29wdGlvbnMvb25GdW5jdGlvbk5hbWURHGFzc2VtYmx5L29wdGlvbnMvb25Mb2NhbE5hbWUSI2Fzc2VtYmx5L29wdGlvbnMvb25Tb3VyY2VNYXBwaW5nVVJMExxhc3NlbWJseS9pbmRleC9yZWFkVWludDx1MzI+FBphc3NlbWJseS9pbmRleC9yZWFkVmFydWludBUZYXNzZW1ibHkvaW5kZXgvcmVhZFZhcmludBYbYXNzZW1ibHkvaW5kZXgvcmVhZFVpbnQ8dTg+Fxthc3NlbWJseS9pbmRleC9yZWFkVmFyaW50NjQYGWFzc2VtYmx5L2luZGV4L3JlYWRVaW50NjQZG2Fzc2VtYmx5L2luZGV4L3NraXBJbml0RXhwchoUYXNzZW1ibHkvaW5kZXgvcGFyc2UbBG51bGwAIBBzb3VyY2VNYXBwaW5nVVJMDmluZGV4Lndhc20ubWFw")));var B=Q.length,t=(B+65535&-65536)>>16,E=new WebAssembly.Memory({initial:t}),o=new Uint8Array(E.buffer);o.set(Q),A.readString=function(A,Q){return function(A,Q,n){if(n-Q<1)return"";for(var B=null,e=[],I=0,t=0;Q191&&t<224?e[I++]=(31&t)<<6|63&A[Q++]:t>239&&t<365?(t=((7&t)<<18|(63&A[Q++])<<12|(63&A[Q++])<<6|63&A[Q++])-65536,e[I++]=55296+(t>>10),e[I++]=56320+(1023&t)):e[I++]=(15&t)<<12|(63&A[Q++])<<6|63&A[Q++],I>8191&&((B||(B=[])).push(String.fromCharCode.apply(String,e)),I=0);return B?(I&&B.push(String.fromCharCode.apply(String,e.slice(0,I))),B.join("")):String.fromCharCode.apply(String,e.slice(0,I))}(o,A,A+Q)},A.readUint32=function(A){return o[A]};var C={env:{memory:E},options:{}};["onSection","onType","onTypeParam","onTypeReturn","onImport","onFunctionImport","onTableImport","onMemoryImport","onGlobalImport","onMemory","onFunction","onTable","onGlobal","onExport","onStart","onSourceMappingURL","onModuleName","onFunctionName","onLocalName"].forEach(function(A){return C.options[A]=n[A]||function(){}}),new WebAssembly.Instance(e,C).exports.parse(0,B)};for(var I=new Array(123),t=0;t<64;)I[t<26?t+65:t<52?t+71:t<62?t-4:t-59|43]=t++},function(A,Q,n){"use strict";Q.__esModule=!0,function(A){A[A.i32=127]="i32",A[A.i64=126]="i64",A[A.f32=125]="f32",A[A.f64=124]="f64",A[A.anyfunc=112]="anyfunc",A[A.func=96]="func",A[A.none=64]="none"}(Q.Type||(Q.Type={})),function(A){A[A.Custom=0]="Custom",A[A.Type=1]="Type",A[A.Import=2]="Import",A[A.Function=3]="Function",A[A.Table=4]="Table",A[A.Memory=5]="Memory",A[A.Global=6]="Global",A[A.Export=7]="Export",A[A.Start=8]="Start",A[A.Element=9]="Element",A[A.Code=10]="Code",A[A.Data=11]="Data"}(Q.SectionId||(Q.SectionId={})),function(A){A[A.Function=0]="Function",A[A.Table=1]="Table",A[A.Memory=2]="Memory",A[A.Global=3]="Global"}(Q.ExternalKind||(Q.ExternalKind={})),function(A){A[A.Module=0]="Module",A[A.Function=1]="Function",A[A.Local=2]="Local"}(Q.NameType||(Q.NameType={})),Q.MAX_PAGES=65535,Q.MAX_ELEMS=4294967295,function(A){A[A.end=11]="end",A[A.get_global=35]="get_global",A[A.i32_const=65]="i32_const",A[A.i64_const=66]="i64_const",A[A.f32_const=67]="f32_const",A[A.f64_const=68]="f64_const"}(Q.Opcode||(Q.Opcode={}))}])}); +>>>>>>> new Branch for parser //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/lib/parse/index.js.map b/lib/parse/index.js.map index 174cbb9804..96bb8de25b 100644 --- a/lib/parse/index.js.map +++ b/lib/parse/index.js.map @@ -1 +1,5 @@ -{"version":3,"sources":["webpack://asparse/webpack/universalModuleDefinition","webpack://asparse/webpack/bootstrap","webpack://asparse/./src/index.ts","webpack://asparse/./src/common.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","common_1","Type","SectionId","ExternalKind","compiled","parse","binary","options","WebAssembly","Module","string","length","charCodeAt","Math","ceil","buffer","Uint8Array","j","k","undefined","s64","Error","base64_decode","nBytes","nPages","memory","Memory","initial","set","readString","offset","start","end","parts","chunk","push","String","fromCharCode","apply","slice","join","utf8_read","imports","env","forEach","Instance","Array","NameType","MAX_PAGES","MAX_ELEMS","Opcode"],"mappings":"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","file":"index.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"asparse\"] = factory();\n\telse\n\t\troot[\"asparse\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","\"use strict\";\r\nexports.__esModule = true;\r\nvar common_1 = require(\"./common\");\r\nexports.Type = common_1.Type;\r\nexports.SectionId = common_1.SectionId;\r\nexports.ExternalKind = common_1.ExternalKind;\r\n/** Cached compiled parser. */\r\nvar compiled = null;\r\nif (typeof WASM_DATA !== \"string\")\r\n WASM_DATA = require(\"fs\").readFileSync(__dirname + \"/../build/index.wasm\", \"base64\");\r\n/** Parses the contents of a WebAssembly binary according to the specified options. */\r\nfunction parse(binary, options) {\r\n if (!options)\r\n options = {};\r\n // compile the parser if not yet compiled\r\n if (!compiled)\r\n compiled = new WebAssembly.Module(base64_decode(WASM_DATA));\r\n // use the binary as the parser's memory\r\n var nBytes = binary.length;\r\n var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16;\r\n var memory = new WebAssembly.Memory({ initial: nPages });\r\n var buffer = new Uint8Array(memory.buffer);\r\n buffer.set(binary);\r\n // provide a way to read strings from memory\r\n parse.readString = function (offset, length) { return utf8_read(buffer, offset, offset + length); };\r\n // instantiate the parser and return its exports\r\n var imports = {\r\n env: {\r\n memory: memory\r\n },\r\n options: {}\r\n };\r\n [\"onSection\",\r\n \"onType\",\r\n \"onTypeParam\",\r\n \"onTypeReturn\",\r\n \"onImport\",\r\n \"onFunctionImport\",\r\n \"onTableImport\",\r\n \"onMemoryImport\",\r\n \"onGlobalImport\",\r\n \"onMemory\",\r\n \"onFunction\",\r\n \"onTable\",\r\n \"onGlobal\",\r\n \"onExport\",\r\n \"onStart\",\r\n \"onSourceMappingURL\",\r\n \"onModuleName\",\r\n \"onFunctionName\",\r\n \"onLocalName\"\r\n ].forEach(function (name) { return imports.options[name] = options[name] || function () { }; });\r\n var instance = new WebAssembly.Instance(compiled, imports);\r\n instance.exports.parse(0, nBytes);\r\n}\r\nexports.parse = parse;\r\n// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/utf8\r\nfunction utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null, chunk = [], i = 0, // char offset\r\n t = 0; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128) {\r\n chunk[i++] = t;\r\n }\r\n else if (t > 191 && t < 224) {\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n }\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n }\r\n else {\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n }\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n}\r\n// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/base64\r\nfunction base64_decode(string) {\r\n var length = string.length;\r\n if (length) {\r\n var n = 0, p = length;\r\n while (--p % 4 > 1 && string.charCodeAt(p) === 61)\r\n ++n;\r\n length = Math.ceil(length * 3) / 4 - n;\r\n }\r\n var buffer = new Uint8Array(length);\r\n var j = 0, o = 0, t = 0;\r\n for (var i = 0, k = string.length; i < k;) {\r\n var c = string.charCodeAt(i++);\r\n if (c === 61 && j > 1)\r\n break;\r\n if ((c = s64[c]) === undefined)\r\n throw Error();\r\n switch (j) {\r\n case 0: {\r\n t = c;\r\n j = 1;\r\n break;\r\n }\r\n case 1: {\r\n buffer[o++] = t << 2 | (c & 48) >> 4;\r\n t = c;\r\n j = 2;\r\n break;\r\n }\r\n case 2: {\r\n buffer[o++] = (t & 15) << 4 | (c & 60) >> 2;\r\n t = c;\r\n j = 3;\r\n break;\r\n }\r\n case 3: {\r\n buffer[o++] = (t & 3) << 6 | c;\r\n j = 0;\r\n break;\r\n }\r\n }\r\n }\r\n if (j === 1)\r\n throw Error();\r\n return buffer;\r\n}\r\nvar s64 = new Array(123);\r\nfor (var i = 0; i < 64;)\r\n s64[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r\n","\"use strict\";\r\n/** Common constants shared between AssemblyScript and TypeScript. */\r\nexports.__esModule = true;\r\n/** WebAssembly types. */\r\nvar Type;\r\n(function (Type) {\r\n Type[Type[\"i32\"] = 127] = \"i32\";\r\n Type[Type[\"i64\"] = 126] = \"i64\";\r\n Type[Type[\"f32\"] = 125] = \"f32\";\r\n Type[Type[\"f64\"] = 124] = \"f64\";\r\n Type[Type[\"anyfunc\"] = 112] = \"anyfunc\";\r\n Type[Type[\"func\"] = 96] = \"func\";\r\n Type[Type[\"none\"] = 64] = \"none\";\r\n})(Type = exports.Type || (exports.Type = {}));\r\n/** WebAssembly section ids. */\r\nvar SectionId;\r\n(function (SectionId) {\r\n SectionId[SectionId[\"Custom\"] = 0] = \"Custom\";\r\n SectionId[SectionId[\"Type\"] = 1] = \"Type\";\r\n SectionId[SectionId[\"Import\"] = 2] = \"Import\";\r\n SectionId[SectionId[\"Function\"] = 3] = \"Function\";\r\n SectionId[SectionId[\"Table\"] = 4] = \"Table\";\r\n SectionId[SectionId[\"Memory\"] = 5] = \"Memory\";\r\n SectionId[SectionId[\"Global\"] = 6] = \"Global\";\r\n SectionId[SectionId[\"Export\"] = 7] = \"Export\";\r\n SectionId[SectionId[\"Start\"] = 8] = \"Start\";\r\n SectionId[SectionId[\"Element\"] = 9] = \"Element\";\r\n SectionId[SectionId[\"Code\"] = 10] = \"Code\";\r\n SectionId[SectionId[\"Data\"] = 11] = \"Data\";\r\n})(SectionId = exports.SectionId || (exports.SectionId = {}));\r\n/** WebAssembly external kinds. */\r\nvar ExternalKind;\r\n(function (ExternalKind) {\r\n ExternalKind[ExternalKind[\"Function\"] = 0] = \"Function\";\r\n ExternalKind[ExternalKind[\"Table\"] = 1] = \"Table\";\r\n ExternalKind[ExternalKind[\"Memory\"] = 2] = \"Memory\";\r\n ExternalKind[ExternalKind[\"Global\"] = 3] = \"Global\";\r\n})(ExternalKind = exports.ExternalKind || (exports.ExternalKind = {}));\r\n/** Name section types. */\r\nvar NameType;\r\n(function (NameType) {\r\n NameType[NameType[\"Module\"] = 0] = \"Module\";\r\n NameType[NameType[\"Function\"] = 1] = \"Function\";\r\n NameType[NameType[\"Local\"] = 2] = \"Local\";\r\n})(NameType = exports.NameType || (exports.NameType = {}));\r\n/** Maximum number of memory pages. */\r\nexports.MAX_PAGES = 0xffff;\r\n/** Maximum number of table elements. */\r\nexports.MAX_ELEMS = 0xffffffff;\r\n/** WebAssembly opcodes. */\r\nvar Opcode;\r\n(function (Opcode) {\r\n // unreachable = 0x00,\r\n // nop = 0x01,\r\n // block = 0x02,\r\n // loop = 0x03,\r\n // if_ = 0x04,\r\n // else_ = 0x05,\r\n Opcode[Opcode[\"end\"] = 11] = \"end\";\r\n // br = 0x0c,\r\n // br_if = 0x0d,\r\n // br_table = 0x0e,\r\n // return_ = 0x0f,\r\n // call = 0x10,\r\n // call_indirect = 0x11,\r\n // drop = 0x1a,\r\n // select = 0x1b,\r\n // get_local = 0x20,\r\n // set_local = 0x21,\r\n // tee_local = 0x22,\r\n Opcode[Opcode[\"get_global\"] = 35] = \"get_global\";\r\n // set_global = 0x24,\r\n // i32_load = 0x28,\r\n // i64_load = 0x29,\r\n // f32_load = 0x2a,\r\n // f64_load = 0x2b,\r\n // i32_load8_s = 0x2c,\r\n // i32_load8_u = 0x2d,\r\n // i32_load16_s = 0x2e,\r\n // i32_load16_u = 0x2f,\r\n // i64_load8_s = 0x30,\r\n // i64_load8_u = 0x31,\r\n // i64_load16_s = 0x32,\r\n // i64_load16_u = 0x33,\r\n // i64_load32_s = 0x34,\r\n // i64_load32_u = 0x35,\r\n // i32_store = 0x36,\r\n // i64_store = 0x37,\r\n // f32_store = 0x38,\r\n // f64_store = 0x39,\r\n // i32_store8 = 0x3a,\r\n // i32_store16 = 0x3b,\r\n // i64_store8 = 0x3c,\r\n // i64_store16 = 0x3d,\r\n // i64_store32 = 0x3e,\r\n // current_memory = 0x3f,\r\n // grow_memory = 0x40,\r\n Opcode[Opcode[\"i32_const\"] = 65] = \"i32_const\";\r\n Opcode[Opcode[\"i64_const\"] = 66] = \"i64_const\";\r\n Opcode[Opcode[\"f32_const\"] = 67] = \"f32_const\";\r\n Opcode[Opcode[\"f64_const\"] = 68] = \"f64_const\";\r\n // i32_eqz = 0x45,\r\n // i32_eq = 0x46,\r\n // i32_ne = 0x47,\r\n // i32_lt_s = 0x48,\r\n // i32_lt_u = 0x49,\r\n // i32_gt_s = 0x4a,\r\n // i32_gt_u = 0x4b,\r\n // i32_le_s = 0x4c,\r\n // i32_le_u = 0x4d,\r\n // i32_ge_s = 0x4e,\r\n // i32_ge_u = 0x4f,\r\n // i64_eqz = 0x50,\r\n // i64_eq = 0x51,\r\n // i64_ne = 0x52,\r\n // i64_lt_s = 0x53,\r\n // i64_lt_u = 0x54,\r\n // i64_gt_s = 0x55,\r\n // i64_gt_u = 0x56,\r\n // i64_le_s = 0x57,\r\n // i64_le_u = 0x58,\r\n // i64_ge_s = 0x59,\r\n // i64_ge_u = 0x5a,\r\n // f32_eq = 0x5b,\r\n // f32_ne = 0x5c,\r\n // f32_lt = 0x5d,\r\n // f32_gt = 0x5e,\r\n // f32_le = 0x5f,\r\n // f32_ge = 0x60,\r\n // f64_eq = 0x61,\r\n // f64_ne = 0x62,\r\n // f64_lt = 0x63,\r\n // f64_gt = 0x64,\r\n // f64_le = 0x65,\r\n // f64_ge = 0x66,\r\n // i32_clz = 0x67,\r\n // i32_ctz = 0x68,\r\n // i32_popcnt = 0x69,\r\n // i32_add = 0x6a,\r\n // i32_sub = 0x6b,\r\n // i32_mul = 0x6c,\r\n // i32_div_s = 0x6d,\r\n // i32_div_u = 0x6e,\r\n // i32_rem_s = 0x6f,\r\n // i32_rem_u = 0x70,\r\n // i32_and = 0x71,\r\n // i32_or = 0x72,\r\n // i32_xor = 0x73,\r\n // i32_shl = 0x74,\r\n // i32_shr_s = 0x75,\r\n // i32_shr_u = 0x76,\r\n // i32_rotl = 0x77,\r\n // i32_rotr = 0x78,\r\n // i64_clz = 0x79,\r\n // i64_ctz = 0x7a,\r\n // i64_popcnt = 0x7b,\r\n // i64_add = 0x7c,\r\n // i64_sub = 0x7d,\r\n // i64_mul = 0x7e,\r\n // i64_div_s = 0x7f,\r\n // i64_div_u = 0x80,\r\n // i64_rem_s = 0x81,\r\n // i64_rem_u = 0x82,\r\n // i64_and = 0x83,\r\n // i64_or = 0x84,\r\n // i64_xor = 0x85,\r\n // i64_shl = 0x86,\r\n // i64_shr_s = 0x87,\r\n // i64_shr_u = 0x88,\r\n // i64_rotl = 0x89,\r\n // i64_rotr = 0x8a,\r\n // f32_abs = 0x8b,\r\n // f32_neg = 0x8c,\r\n // f32_ceil = 0x8d,\r\n // f32_floor = 0x8e,\r\n // f32_trunc = 0x8f,\r\n // f32_nearest = 0x90,\r\n // f32_sqrt = 0x91,\r\n // f32_add = 0x92,\r\n // f32_sub = 0x93,\r\n // f32_mul = 0x94,\r\n // f32_div = 0x95,\r\n // f32_min = 0x96,\r\n // f32_max = 0x97,\r\n // f32_copysign = 0x98,\r\n // f64_abs = 0x99,\r\n // f64_neg = 0x9a,\r\n // f64_ceil = 0x9b,\r\n // f64_floor = 0x9c,\r\n // f64_trunc = 0x9d,\r\n // f64_nearest = 0x9e,\r\n // f64_sqrt = 0x9f,\r\n // f64_add = 0xa0,\r\n // f64_sub = 0xa1,\r\n // f64_mul = 0xa2,\r\n // f64_div = 0xa3,\r\n // f64_min = 0xa4,\r\n // f64_max = 0xa5,\r\n // f64_copysign = 0xa6,\r\n // i32_wrap_i64 = 0xa7,\r\n // i32_trunc_s_f32 = 0xa8,\r\n // i32_trunc_u_f32 = 0xa9,\r\n // i32_trunc_s_f64 = 0xaa,\r\n // i32_trunc_u_f64 = 0xab,\r\n // i64_extend_s_i32 = 0xac,\r\n // i64_extend_u_i32 = 0xad,\r\n // i64_trunc_s_f32 = 0xae,\r\n // i64_trunc_u_f32 = 0xaf,\r\n // i64_trunc_s_f64 = 0xb0,\r\n // i64_trunc_u_f64 = 0xb1,\r\n // f32_convert_s_i32 = 0xb2,\r\n // f32_convert_u_i32 = 0xb3,\r\n // f32_convert_s_i64 = 0xb4,\r\n // f32_convert_u_i64 = 0xb5,\r\n // f32_demote_f64 = 0xb6,\r\n // f64_convert_s_i32 = 0xb7,\r\n // f64_convert_u_i32 = 0xb8,\r\n // f64_convert_s_i64 = 0xb9,\r\n // f64_convert_u_i64 = 0xba,\r\n // f64_promote_f32 = 0xbb,\r\n // i32_reinterpret_f32 = 0xbc,\r\n // i64_reinterpret_f64 = 0xbd,\r\n // f32_reinterpret_i32 = 0xbe,\r\n // f64_reinterpret_i64 = 0xbf\r\n})(Opcode = exports.Opcode || (exports.Opcode = {}));\r\n"],"sourceRoot":""} \ No newline at end of file +<<<<<<< loader-memory-accessors +{"version":3,"sources":["webpack://asparse/webpack/universalModuleDefinition","webpack://asparse/webpack/bootstrap","webpack://asparse/./src/index.ts","webpack://asparse/./src/common.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","common_1","Type","SectionId","ExternalKind","compiled","parse","binary","options","WebAssembly","Module","string","length","charCodeAt","Math","ceil","buffer","Uint8Array","j","k","undefined","s64","Error","base64_decode","nBytes","nPages","memory","Memory","initial","set","readString","offset","start","end","parts","chunk","push","String","fromCharCode","apply","slice","join","utf8_read","imports","env","forEach","Instance","Array","NameType","MAX_PAGES","MAX_ELEMS","Opcode"],"mappings":"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","file":"index.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"asparse\"] = factory();\n\telse\n\t\troot[\"asparse\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","\"use strict\";\r\nexports.__esModule = true;\r\nvar common_1 = require(\"./common\");\r\nexports.Type = common_1.Type;\r\nexports.SectionId = common_1.SectionId;\r\nexports.ExternalKind = common_1.ExternalKind;\r\n/** Cached compiled parser. */\r\nvar compiled = null;\r\nif (typeof WASM_DATA !== \"string\")\r\n WASM_DATA = require(\"fs\").readFileSync(__dirname + \"/../build/index.wasm\", \"base64\");\r\n/** Parses the contents of a WebAssembly binary according to the specified options. */\r\nfunction parse(binary, options) {\r\n if (!options)\r\n options = {};\r\n // compile the parser if not yet compiled\r\n if (!compiled)\r\n compiled = new WebAssembly.Module(base64_decode(WASM_DATA));\r\n // use the binary as the parser's memory\r\n var nBytes = binary.length;\r\n var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16;\r\n var memory = new WebAssembly.Memory({ initial: nPages });\r\n var buffer = new Uint8Array(memory.buffer);\r\n buffer.set(binary);\r\n // provide a way to read strings from memory\r\n parse.readString = function (offset, length) { return utf8_read(buffer, offset, offset + length); };\r\n // instantiate the parser and return its exports\r\n var imports = {\r\n env: {\r\n memory: memory\r\n },\r\n options: {}\r\n };\r\n [\"onSection\",\r\n \"onType\",\r\n \"onTypeParam\",\r\n \"onTypeReturn\",\r\n \"onImport\",\r\n \"onFunctionImport\",\r\n \"onTableImport\",\r\n \"onMemoryImport\",\r\n \"onGlobalImport\",\r\n \"onMemory\",\r\n \"onFunction\",\r\n \"onTable\",\r\n \"onGlobal\",\r\n \"onExport\",\r\n \"onStart\",\r\n \"onSourceMappingURL\",\r\n \"onModuleName\",\r\n \"onFunctionName\",\r\n \"onLocalName\"\r\n ].forEach(function (name) { return imports.options[name] = options[name] || function () { }; });\r\n var instance = new WebAssembly.Instance(compiled, imports);\r\n instance.exports.parse(0, nBytes);\r\n}\r\nexports.parse = parse;\r\n// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/utf8\r\nfunction utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null, chunk = [], i = 0, // char offset\r\n t = 0; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128) {\r\n chunk[i++] = t;\r\n }\r\n else if (t > 191 && t < 224) {\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n }\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n }\r\n else {\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n }\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n}\r\n// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/base64\r\nfunction base64_decode(string) {\r\n var length = string.length;\r\n if (length) {\r\n var n = 0, p = length;\r\n while (--p % 4 > 1 && string.charCodeAt(p) === 61)\r\n ++n;\r\n length = Math.ceil(length * 3) / 4 - n;\r\n }\r\n var buffer = new Uint8Array(length);\r\n var j = 0, o = 0, t = 0;\r\n for (var i = 0, k = string.length; i < k;) {\r\n var c = string.charCodeAt(i++);\r\n if (c === 61 && j > 1)\r\n break;\r\n if ((c = s64[c]) === undefined)\r\n throw Error();\r\n switch (j) {\r\n case 0: {\r\n t = c;\r\n j = 1;\r\n break;\r\n }\r\n case 1: {\r\n buffer[o++] = t << 2 | (c & 48) >> 4;\r\n t = c;\r\n j = 2;\r\n break;\r\n }\r\n case 2: {\r\n buffer[o++] = (t & 15) << 4 | (c & 60) >> 2;\r\n t = c;\r\n j = 3;\r\n break;\r\n }\r\n case 3: {\r\n buffer[o++] = (t & 3) << 6 | c;\r\n j = 0;\r\n break;\r\n }\r\n }\r\n }\r\n if (j === 1)\r\n throw Error();\r\n return buffer;\r\n}\r\nvar s64 = new Array(123);\r\nfor (var i = 0; i < 64;)\r\n s64[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r\n","\"use strict\";\r\n/** Common constants shared between AssemblyScript and TypeScript. */\r\nexports.__esModule = true;\r\n/** WebAssembly types. */\r\nvar Type;\r\n(function (Type) {\r\n Type[Type[\"i32\"] = 127] = \"i32\";\r\n Type[Type[\"i64\"] = 126] = \"i64\";\r\n Type[Type[\"f32\"] = 125] = \"f32\";\r\n Type[Type[\"f64\"] = 124] = \"f64\";\r\n Type[Type[\"anyfunc\"] = 112] = \"anyfunc\";\r\n Type[Type[\"func\"] = 96] = \"func\";\r\n Type[Type[\"none\"] = 64] = \"none\";\r\n})(Type = exports.Type || (exports.Type = {}));\r\n/** WebAssembly section ids. */\r\nvar SectionId;\r\n(function (SectionId) {\r\n SectionId[SectionId[\"Custom\"] = 0] = \"Custom\";\r\n SectionId[SectionId[\"Type\"] = 1] = \"Type\";\r\n SectionId[SectionId[\"Import\"] = 2] = \"Import\";\r\n SectionId[SectionId[\"Function\"] = 3] = \"Function\";\r\n SectionId[SectionId[\"Table\"] = 4] = \"Table\";\r\n SectionId[SectionId[\"Memory\"] = 5] = \"Memory\";\r\n SectionId[SectionId[\"Global\"] = 6] = \"Global\";\r\n SectionId[SectionId[\"Export\"] = 7] = \"Export\";\r\n SectionId[SectionId[\"Start\"] = 8] = \"Start\";\r\n SectionId[SectionId[\"Element\"] = 9] = \"Element\";\r\n SectionId[SectionId[\"Code\"] = 10] = \"Code\";\r\n SectionId[SectionId[\"Data\"] = 11] = \"Data\";\r\n})(SectionId = exports.SectionId || (exports.SectionId = {}));\r\n/** WebAssembly external kinds. */\r\nvar ExternalKind;\r\n(function (ExternalKind) {\r\n ExternalKind[ExternalKind[\"Function\"] = 0] = \"Function\";\r\n ExternalKind[ExternalKind[\"Table\"] = 1] = \"Table\";\r\n ExternalKind[ExternalKind[\"Memory\"] = 2] = \"Memory\";\r\n ExternalKind[ExternalKind[\"Global\"] = 3] = \"Global\";\r\n})(ExternalKind = exports.ExternalKind || (exports.ExternalKind = {}));\r\n/** Name section types. */\r\nvar NameType;\r\n(function (NameType) {\r\n NameType[NameType[\"Module\"] = 0] = \"Module\";\r\n NameType[NameType[\"Function\"] = 1] = \"Function\";\r\n NameType[NameType[\"Local\"] = 2] = \"Local\";\r\n})(NameType = exports.NameType || (exports.NameType = {}));\r\n/** Maximum number of memory pages. */\r\nexports.MAX_PAGES = 0xffff;\r\n/** Maximum number of table elements. */\r\nexports.MAX_ELEMS = 0xffffffff;\r\n/** WebAssembly opcodes. */\r\nvar Opcode;\r\n(function (Opcode) {\r\n // unreachable = 0x00,\r\n // nop = 0x01,\r\n // block = 0x02,\r\n // loop = 0x03,\r\n // if_ = 0x04,\r\n // else_ = 0x05,\r\n Opcode[Opcode[\"end\"] = 11] = \"end\";\r\n // br = 0x0c,\r\n // br_if = 0x0d,\r\n // br_table = 0x0e,\r\n // return_ = 0x0f,\r\n // call = 0x10,\r\n // call_indirect = 0x11,\r\n // drop = 0x1a,\r\n // select = 0x1b,\r\n // get_local = 0x20,\r\n // set_local = 0x21,\r\n // tee_local = 0x22,\r\n Opcode[Opcode[\"get_global\"] = 35] = \"get_global\";\r\n // set_global = 0x24,\r\n // i32_load = 0x28,\r\n // i64_load = 0x29,\r\n // f32_load = 0x2a,\r\n // f64_load = 0x2b,\r\n // i32_load8_s = 0x2c,\r\n // i32_load8_u = 0x2d,\r\n // i32_load16_s = 0x2e,\r\n // i32_load16_u = 0x2f,\r\n // i64_load8_s = 0x30,\r\n // i64_load8_u = 0x31,\r\n // i64_load16_s = 0x32,\r\n // i64_load16_u = 0x33,\r\n // i64_load32_s = 0x34,\r\n // i64_load32_u = 0x35,\r\n // i32_store = 0x36,\r\n // i64_store = 0x37,\r\n // f32_store = 0x38,\r\n // f64_store = 0x39,\r\n // i32_store8 = 0x3a,\r\n // i32_store16 = 0x3b,\r\n // i64_store8 = 0x3c,\r\n // i64_store16 = 0x3d,\r\n // i64_store32 = 0x3e,\r\n // current_memory = 0x3f,\r\n // grow_memory = 0x40,\r\n Opcode[Opcode[\"i32_const\"] = 65] = \"i32_const\";\r\n Opcode[Opcode[\"i64_const\"] = 66] = \"i64_const\";\r\n Opcode[Opcode[\"f32_const\"] = 67] = \"f32_const\";\r\n Opcode[Opcode[\"f64_const\"] = 68] = \"f64_const\";\r\n // i32_eqz = 0x45,\r\n // i32_eq = 0x46,\r\n // i32_ne = 0x47,\r\n // i32_lt_s = 0x48,\r\n // i32_lt_u = 0x49,\r\n // i32_gt_s = 0x4a,\r\n // i32_gt_u = 0x4b,\r\n // i32_le_s = 0x4c,\r\n // i32_le_u = 0x4d,\r\n // i32_ge_s = 0x4e,\r\n // i32_ge_u = 0x4f,\r\n // i64_eqz = 0x50,\r\n // i64_eq = 0x51,\r\n // i64_ne = 0x52,\r\n // i64_lt_s = 0x53,\r\n // i64_lt_u = 0x54,\r\n // i64_gt_s = 0x55,\r\n // i64_gt_u = 0x56,\r\n // i64_le_s = 0x57,\r\n // i64_le_u = 0x58,\r\n // i64_ge_s = 0x59,\r\n // i64_ge_u = 0x5a,\r\n // f32_eq = 0x5b,\r\n // f32_ne = 0x5c,\r\n // f32_lt = 0x5d,\r\n // f32_gt = 0x5e,\r\n // f32_le = 0x5f,\r\n // f32_ge = 0x60,\r\n // f64_eq = 0x61,\r\n // f64_ne = 0x62,\r\n // f64_lt = 0x63,\r\n // f64_gt = 0x64,\r\n // f64_le = 0x65,\r\n // f64_ge = 0x66,\r\n // i32_clz = 0x67,\r\n // i32_ctz = 0x68,\r\n // i32_popcnt = 0x69,\r\n // i32_add = 0x6a,\r\n // i32_sub = 0x6b,\r\n // i32_mul = 0x6c,\r\n // i32_div_s = 0x6d,\r\n // i32_div_u = 0x6e,\r\n // i32_rem_s = 0x6f,\r\n // i32_rem_u = 0x70,\r\n // i32_and = 0x71,\r\n // i32_or = 0x72,\r\n // i32_xor = 0x73,\r\n // i32_shl = 0x74,\r\n // i32_shr_s = 0x75,\r\n // i32_shr_u = 0x76,\r\n // i32_rotl = 0x77,\r\n // i32_rotr = 0x78,\r\n // i64_clz = 0x79,\r\n // i64_ctz = 0x7a,\r\n // i64_popcnt = 0x7b,\r\n // i64_add = 0x7c,\r\n // i64_sub = 0x7d,\r\n // i64_mul = 0x7e,\r\n // i64_div_s = 0x7f,\r\n // i64_div_u = 0x80,\r\n // i64_rem_s = 0x81,\r\n // i64_rem_u = 0x82,\r\n // i64_and = 0x83,\r\n // i64_or = 0x84,\r\n // i64_xor = 0x85,\r\n // i64_shl = 0x86,\r\n // i64_shr_s = 0x87,\r\n // i64_shr_u = 0x88,\r\n // i64_rotl = 0x89,\r\n // i64_rotr = 0x8a,\r\n // f32_abs = 0x8b,\r\n // f32_neg = 0x8c,\r\n // f32_ceil = 0x8d,\r\n // f32_floor = 0x8e,\r\n // f32_trunc = 0x8f,\r\n // f32_nearest = 0x90,\r\n // f32_sqrt = 0x91,\r\n // f32_add = 0x92,\r\n // f32_sub = 0x93,\r\n // f32_mul = 0x94,\r\n // f32_div = 0x95,\r\n // f32_min = 0x96,\r\n // f32_max = 0x97,\r\n // f32_copysign = 0x98,\r\n // f64_abs = 0x99,\r\n // f64_neg = 0x9a,\r\n // f64_ceil = 0x9b,\r\n // f64_floor = 0x9c,\r\n // f64_trunc = 0x9d,\r\n // f64_nearest = 0x9e,\r\n // f64_sqrt = 0x9f,\r\n // f64_add = 0xa0,\r\n // f64_sub = 0xa1,\r\n // f64_mul = 0xa2,\r\n // f64_div = 0xa3,\r\n // f64_min = 0xa4,\r\n // f64_max = 0xa5,\r\n // f64_copysign = 0xa6,\r\n // i32_wrap_i64 = 0xa7,\r\n // i32_trunc_s_f32 = 0xa8,\r\n // i32_trunc_u_f32 = 0xa9,\r\n // i32_trunc_s_f64 = 0xaa,\r\n // i32_trunc_u_f64 = 0xab,\r\n // i64_extend_s_i32 = 0xac,\r\n // i64_extend_u_i32 = 0xad,\r\n // i64_trunc_s_f32 = 0xae,\r\n // i64_trunc_u_f32 = 0xaf,\r\n // i64_trunc_s_f64 = 0xb0,\r\n // i64_trunc_u_f64 = 0xb1,\r\n // f32_convert_s_i32 = 0xb2,\r\n // f32_convert_u_i32 = 0xb3,\r\n // f32_convert_s_i64 = 0xb4,\r\n // f32_convert_u_i64 = 0xb5,\r\n // f32_demote_f64 = 0xb6,\r\n // f64_convert_s_i32 = 0xb7,\r\n // f64_convert_u_i32 = 0xb8,\r\n // f64_convert_s_i64 = 0xb9,\r\n // f64_convert_u_i64 = 0xba,\r\n // f64_promote_f32 = 0xbb,\r\n // i32_reinterpret_f32 = 0xbc,\r\n // i64_reinterpret_f64 = 0xbd,\r\n // f32_reinterpret_i32 = 0xbe,\r\n // f64_reinterpret_i64 = 0xbf\r\n})(Opcode = exports.Opcode || (exports.Opcode = {}));\r\n"],"sourceRoot":""} +======= +{"version":3,"sources":["webpack://asparse/webpack/universalModuleDefinition","webpack://asparse/webpack/bootstrap","webpack://asparse/./src/index.ts","webpack://asparse/./src/common.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","common_1","Type","SectionId","ExternalKind","compiled","parse","binary","options","WebAssembly","Module","string","length","charCodeAt","Math","ceil","buffer","Uint8Array","j","k","undefined","s64","Error","base64_decode","nBytes","nPages","memory","Memory","initial","set","readString","offset","start","end","parts","chunk","push","String","fromCharCode","apply","slice","join","utf8_read","readUint32","index","imports","env","forEach","Instance","Array","NameType","MAX_PAGES","MAX_ELEMS","Opcode"],"mappings":"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","file":"index.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"asparse\"] = factory();\n\telse\n\t\troot[\"asparse\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","\"use strict\";\nexports.__esModule = true;\nvar common_1 = require(\"./common\");\nexports.Type = common_1.Type;\nexports.SectionId = common_1.SectionId;\nexports.ExternalKind = common_1.ExternalKind;\n/** Cached compiled parser. */\nvar compiled = null;\nif (typeof WASM_DATA !== \"string\")\n WASM_DATA = require(\"fs\").readFileSync(__dirname + \"/../build/index.wasm\", \"base64\");\n/** Parses the contents of a WebAssembly binary according to the specified options. */\nfunction parse(binary, options) {\n if (!options)\n options = {};\n // compile the parser if not yet compiled\n if (!compiled)\n compiled = new WebAssembly.Module(base64_decode(WASM_DATA));\n // use the binary as the parser's memory\n var nBytes = binary.length;\n var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16;\n var memory = new WebAssembly.Memory({ initial: nPages });\n var buffer = new Uint8Array(memory.buffer);\n buffer.set(binary);\n // provide a way to read strings from memory\n parse.readString = function (offset, length) { return utf8_read(buffer, offset, offset + length); };\n parse.readUint32 = function (index) {\n return buffer[index];\n };\n // instantiate the parser and return its exports\n var imports = {\n env: {\n memory: memory\n },\n options: {}\n };\n [\"onSection\",\n \"onType\",\n \"onTypeParam\",\n \"onTypeReturn\",\n \"onImport\",\n \"onFunctionImport\",\n \"onTableImport\",\n \"onMemoryImport\",\n \"onGlobalImport\",\n \"onMemory\",\n \"onFunction\",\n \"onTable\",\n \"onGlobal\",\n \"onExport\",\n \"onStart\",\n \"onSourceMappingURL\",\n \"onModuleName\",\n \"onFunctionName\",\n \"onLocalName\"\n ].forEach(function (name) { return imports.options[name] = options[name] || function () { }; });\n var instance = new WebAssembly.Instance(compiled, imports);\n instance.exports.parse(0, nBytes);\n}\nexports.parse = parse;\n// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/utf8\nfunction utf8_read(buffer, start, end) {\n var len = end - start;\n if (len < 1)\n return \"\";\n var parts = null, chunk = [], i = 0, // char offset\n t = 0; // temporary\n while (start < end) {\n t = buffer[start++];\n if (t < 128) {\n chunk[i++] = t;\n }\n else if (t > 191 && t < 224) {\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\n }\n else if (t > 239 && t < 365) {\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\n chunk[i++] = 0xD800 + (t >> 10);\n chunk[i++] = 0xDC00 + (t & 1023);\n }\n else {\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\n }\n if (i > 8191) {\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\n i = 0;\n }\n }\n if (parts) {\n if (i)\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\n return parts.join(\"\");\n }\n return String.fromCharCode.apply(String, chunk.slice(0, i));\n}\n// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/base64\nfunction base64_decode(string) {\n var length = string.length;\n if (length) {\n var n = 0, p = length;\n while (--p % 4 > 1 && string.charCodeAt(p) === 61)\n ++n;\n length = Math.ceil(length * 3) / 4 - n;\n }\n var buffer = new Uint8Array(length);\n var j = 0, o = 0, t = 0;\n for (var i = 0, k = string.length; i < k;) {\n var c = string.charCodeAt(i++);\n if (c === 61 && j > 1)\n break;\n if ((c = s64[c]) === undefined)\n throw Error();\n switch (j) {\n case 0: {\n t = c;\n j = 1;\n break;\n }\n case 1: {\n buffer[o++] = t << 2 | (c & 48) >> 4;\n t = c;\n j = 2;\n break;\n }\n case 2: {\n buffer[o++] = (t & 15) << 4 | (c & 60) >> 2;\n t = c;\n j = 3;\n break;\n }\n case 3: {\n buffer[o++] = (t & 3) << 6 | c;\n j = 0;\n break;\n }\n }\n }\n if (j === 1)\n throw Error();\n return buffer;\n}\nvar s64 = new Array(123);\nfor (var i = 0; i < 64;)\n s64[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\n","\"use strict\";\n/** Common constants shared between AssemblyScript and TypeScript. */\nexports.__esModule = true;\n/** WebAssembly types. */\nvar Type;\n(function (Type) {\n Type[Type[\"i32\"] = 127] = \"i32\";\n Type[Type[\"i64\"] = 126] = \"i64\";\n Type[Type[\"f32\"] = 125] = \"f32\";\n Type[Type[\"f64\"] = 124] = \"f64\";\n Type[Type[\"anyfunc\"] = 112] = \"anyfunc\";\n Type[Type[\"func\"] = 96] = \"func\";\n Type[Type[\"none\"] = 64] = \"none\";\n})(Type = exports.Type || (exports.Type = {}));\n/** WebAssembly section ids. */\nvar SectionId;\n(function (SectionId) {\n SectionId[SectionId[\"Custom\"] = 0] = \"Custom\";\n SectionId[SectionId[\"Type\"] = 1] = \"Type\";\n SectionId[SectionId[\"Import\"] = 2] = \"Import\";\n SectionId[SectionId[\"Function\"] = 3] = \"Function\";\n SectionId[SectionId[\"Table\"] = 4] = \"Table\";\n SectionId[SectionId[\"Memory\"] = 5] = \"Memory\";\n SectionId[SectionId[\"Global\"] = 6] = \"Global\";\n SectionId[SectionId[\"Export\"] = 7] = \"Export\";\n SectionId[SectionId[\"Start\"] = 8] = \"Start\";\n SectionId[SectionId[\"Element\"] = 9] = \"Element\";\n SectionId[SectionId[\"Code\"] = 10] = \"Code\";\n SectionId[SectionId[\"Data\"] = 11] = \"Data\";\n})(SectionId = exports.SectionId || (exports.SectionId = {}));\n/** WebAssembly external kinds. */\nvar ExternalKind;\n(function (ExternalKind) {\n ExternalKind[ExternalKind[\"Function\"] = 0] = \"Function\";\n ExternalKind[ExternalKind[\"Table\"] = 1] = \"Table\";\n ExternalKind[ExternalKind[\"Memory\"] = 2] = \"Memory\";\n ExternalKind[ExternalKind[\"Global\"] = 3] = \"Global\";\n})(ExternalKind = exports.ExternalKind || (exports.ExternalKind = {}));\n/** Name section types. */\nvar NameType;\n(function (NameType) {\n NameType[NameType[\"Module\"] = 0] = \"Module\";\n NameType[NameType[\"Function\"] = 1] = \"Function\";\n NameType[NameType[\"Local\"] = 2] = \"Local\";\n})(NameType = exports.NameType || (exports.NameType = {}));\n/** Maximum number of memory pages. */\nexports.MAX_PAGES = 0xffff;\n/** Maximum number of table elements. */\nexports.MAX_ELEMS = 0xffffffff;\n/** WebAssembly opcodes. */\nvar Opcode;\n(function (Opcode) {\n // unreachable = 0x00,\n // nop = 0x01,\n // block = 0x02,\n // loop = 0x03,\n // if_ = 0x04,\n // else_ = 0x05,\n Opcode[Opcode[\"end\"] = 11] = \"end\";\n // br = 0x0c,\n // br_if = 0x0d,\n // br_table = 0x0e,\n // return_ = 0x0f,\n // call = 0x10,\n // call_indirect = 0x11,\n // drop = 0x1a,\n // select = 0x1b,\n // get_local = 0x20,\n // set_local = 0x21,\n // tee_local = 0x22,\n Opcode[Opcode[\"get_global\"] = 35] = \"get_global\";\n // set_global = 0x24,\n // i32_load = 0x28,\n // i64_load = 0x29,\n // f32_load = 0x2a,\n // f64_load = 0x2b,\n // i32_load8_s = 0x2c,\n // i32_load8_u = 0x2d,\n // i32_load16_s = 0x2e,\n // i32_load16_u = 0x2f,\n // i64_load8_s = 0x30,\n // i64_load8_u = 0x31,\n // i64_load16_s = 0x32,\n // i64_load16_u = 0x33,\n // i64_load32_s = 0x34,\n // i64_load32_u = 0x35,\n // i32_store = 0x36,\n // i64_store = 0x37,\n // f32_store = 0x38,\n // f64_store = 0x39,\n // i32_store8 = 0x3a,\n // i32_store16 = 0x3b,\n // i64_store8 = 0x3c,\n // i64_store16 = 0x3d,\n // i64_store32 = 0x3e,\n // current_memory = 0x3f,\n // grow_memory = 0x40,\n Opcode[Opcode[\"i32_const\"] = 65] = \"i32_const\";\n Opcode[Opcode[\"i64_const\"] = 66] = \"i64_const\";\n Opcode[Opcode[\"f32_const\"] = 67] = \"f32_const\";\n Opcode[Opcode[\"f64_const\"] = 68] = \"f64_const\";\n // i32_eqz = 0x45,\n // i32_eq = 0x46,\n // i32_ne = 0x47,\n // i32_lt_s = 0x48,\n // i32_lt_u = 0x49,\n // i32_gt_s = 0x4a,\n // i32_gt_u = 0x4b,\n // i32_le_s = 0x4c,\n // i32_le_u = 0x4d,\n // i32_ge_s = 0x4e,\n // i32_ge_u = 0x4f,\n // i64_eqz = 0x50,\n // i64_eq = 0x51,\n // i64_ne = 0x52,\n // i64_lt_s = 0x53,\n // i64_lt_u = 0x54,\n // i64_gt_s = 0x55,\n // i64_gt_u = 0x56,\n // i64_le_s = 0x57,\n // i64_le_u = 0x58,\n // i64_ge_s = 0x59,\n // i64_ge_u = 0x5a,\n // f32_eq = 0x5b,\n // f32_ne = 0x5c,\n // f32_lt = 0x5d,\n // f32_gt = 0x5e,\n // f32_le = 0x5f,\n // f32_ge = 0x60,\n // f64_eq = 0x61,\n // f64_ne = 0x62,\n // f64_lt = 0x63,\n // f64_gt = 0x64,\n // f64_le = 0x65,\n // f64_ge = 0x66,\n // i32_clz = 0x67,\n // i32_ctz = 0x68,\n // i32_popcnt = 0x69,\n // i32_add = 0x6a,\n // i32_sub = 0x6b,\n // i32_mul = 0x6c,\n // i32_div_s = 0x6d,\n // i32_div_u = 0x6e,\n // i32_rem_s = 0x6f,\n // i32_rem_u = 0x70,\n // i32_and = 0x71,\n // i32_or = 0x72,\n // i32_xor = 0x73,\n // i32_shl = 0x74,\n // i32_shr_s = 0x75,\n // i32_shr_u = 0x76,\n // i32_rotl = 0x77,\n // i32_rotr = 0x78,\n // i64_clz = 0x79,\n // i64_ctz = 0x7a,\n // i64_popcnt = 0x7b,\n // i64_add = 0x7c,\n // i64_sub = 0x7d,\n // i64_mul = 0x7e,\n // i64_div_s = 0x7f,\n // i64_div_u = 0x80,\n // i64_rem_s = 0x81,\n // i64_rem_u = 0x82,\n // i64_and = 0x83,\n // i64_or = 0x84,\n // i64_xor = 0x85,\n // i64_shl = 0x86,\n // i64_shr_s = 0x87,\n // i64_shr_u = 0x88,\n // i64_rotl = 0x89,\n // i64_rotr = 0x8a,\n // f32_abs = 0x8b,\n // f32_neg = 0x8c,\n // f32_ceil = 0x8d,\n // f32_floor = 0x8e,\n // f32_trunc = 0x8f,\n // f32_nearest = 0x90,\n // f32_sqrt = 0x91,\n // f32_add = 0x92,\n // f32_sub = 0x93,\n // f32_mul = 0x94,\n // f32_div = 0x95,\n // f32_min = 0x96,\n // f32_max = 0x97,\n // f32_copysign = 0x98,\n // f64_abs = 0x99,\n // f64_neg = 0x9a,\n // f64_ceil = 0x9b,\n // f64_floor = 0x9c,\n // f64_trunc = 0x9d,\n // f64_nearest = 0x9e,\n // f64_sqrt = 0x9f,\n // f64_add = 0xa0,\n // f64_sub = 0xa1,\n // f64_mul = 0xa2,\n // f64_div = 0xa3,\n // f64_min = 0xa4,\n // f64_max = 0xa5,\n // f64_copysign = 0xa6,\n // i32_wrap_i64 = 0xa7,\n // i32_trunc_s_f32 = 0xa8,\n // i32_trunc_u_f32 = 0xa9,\n // i32_trunc_s_f64 = 0xaa,\n // i32_trunc_u_f64 = 0xab,\n // i64_extend_s_i32 = 0xac,\n // i64_extend_u_i32 = 0xad,\n // i64_trunc_s_f32 = 0xae,\n // i64_trunc_u_f32 = 0xaf,\n // i64_trunc_s_f64 = 0xb0,\n // i64_trunc_u_f64 = 0xb1,\n // f32_convert_s_i32 = 0xb2,\n // f32_convert_u_i32 = 0xb3,\n // f32_convert_s_i64 = 0xb4,\n // f32_convert_u_i64 = 0xb5,\n // f32_demote_f64 = 0xb6,\n // f64_convert_s_i32 = 0xb7,\n // f64_convert_u_i32 = 0xb8,\n // f64_convert_s_i64 = 0xb9,\n // f64_convert_u_i64 = 0xba,\n // f64_promote_f32 = 0xbb,\n // i32_reinterpret_f32 = 0xbc,\n // i64_reinterpret_f64 = 0xbd,\n // f32_reinterpret_i32 = 0xbe,\n // f64_reinterpret_i64 = 0xbf\n})(Opcode = exports.Opcode || (exports.Opcode = {}));\n"],"sourceRoot":""} +>>>>>>> new Branch for parser diff --git a/lib/parse/package-lock.json b/lib/parse/package-lock.json new file mode 100644 index 0000000000..17f6b73845 --- /dev/null +++ b/lib/parse/package-lock.json @@ -0,0 +1,4064 @@ +{ + "name": "@assemblyscript/parse", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", + "dev": true + }, + "@types/webassembly-js-api": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@types/webassembly-js-api/-/webassembly-js-api-0.0.1.tgz", + "integrity": "sha1-YtULIBB319TMEJuxytoi/f1FI/s=", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", + "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", + "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", + "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", + "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", + "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", + "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", + "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", + "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", + "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", + "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", + "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", + "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", + "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", + "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", + "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", + "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", + "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.11", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", + "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", + "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "dev": true + }, + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "5.7.3" + } + }, + "ajv": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", + "dev": true, + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "assemblyscript": { + "version": "github:AssemblyScript/assemblyscript#d5f72e32d7e99cec3f8c37e6bb2916864706f4f0", + "dev": true, + "requires": { + "@protobufjs/utf8": "1.1.0", + "binaryen": "55.0.0-nightly.20181130", + "glob": "7.1.3", + "long": "4.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", + "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", + "dev": true + }, + "binaryen": { + "version": "55.0.0-nightly.20181130", + "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-55.0.0-nightly.20181130.tgz", + "integrity": "sha512-RfMiI0vavw7Sy7KX8h1xOs4D3zp9nehmtE87DSfY6nXyd2EAdMwJ97tWdepuhOc6JWZsntOfzUA2fqu/sYTTLg==", + "dev": true + }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "1.2.0", + "browserify-des": "1.0.2", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.6" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.4.1", + "inherits": "2.0.3", + "parse-asn1": "5.1.1" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "1.0.7" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.3.0", + "ieee754": "1.1.12", + "isarray": "1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "3.5.3", + "chownr": "1.1.1", + "figgy-pudding": "3.5.1", + "glob": "7.1.3", + "graceful-fs": "4.1.15", + "lru-cache": "5.1.1", + "mississippi": "3.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "6.0.1", + "unique-filename": "1.1.1", + "y18n": "4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + } + }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.2.4", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1", + "upath": "1.1.0" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "1.9.3" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.1" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "md5.js": "1.3.5", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.3", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.6.0", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.3", + "pbkdf2": "3.0.17", + "public-encrypt": "4.0.3", + "randombytes": "2.0.6", + "randomfill": "1.0.4" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" + } + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.7", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "memory-fs": "0.4.1", + "tapable": "1.1.1" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "1.3.5", + "safe-buffer": "5.1.2" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "6.0.5", + "get-stream": "4.1.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "find-cache-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", + "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.3.0", + "pkg-dir": "3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "3.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.6" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.12.1", + "node-pre-gyp": "0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.0", + "nopt": "4.0.1", + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "global-modules-path": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", + "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.7", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "3.0.0", + "resolve-cwd": "2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "interpret": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.12.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "1.2.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "2.0.0" + } + }, + "loader-runner": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", + "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", + "dev": true + }, + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", + "dev": true, + "requires": { + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "3.0.0", + "path-exists": "3.0.0" + } + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "3.0.3" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "mem": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", + "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "dev": true, + "requires": { + "map-age-cleaner": "0.1.3", + "mimic-fn": "1.2.0", + "p-is-promise": "1.1.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.7", + "readable-stream": "2.3.6" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "duplexify": "3.6.1", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "3.0.0", + "pumpify": "1.5.1", + "stream-each": "1.2.3", + "through2": "2.0.5" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.1", + "stream-http": "2.8.3", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.4", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "1.0.0", + "lcid": "2.0.0", + "mem": "4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "dev": true + }, + "p-limit": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "dev": true, + "requires": { + "p-try": "2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "2.1.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + }, + "pako": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", + "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.17" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dev": true, + "requires": { + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "3.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "3.6.1", + "inherits": "2.0.3", + "pump": "2.0.1" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "4.1.15", + "micromatch": "3.1.10", + "readable-stream": "2.3.6" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "1.2.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "6.6.2", + "ajv-keywords": "3.2.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "serialize-javascript": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", + "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "2.1.2", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "1.1.1", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "tapable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "dev": true + }, + "terser": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.14.0.tgz", + "integrity": "sha512-KQC1QNKbC/K1ZUjLIWsezW7wkTJuB4v9ptQQUNOzAPVHuVf2LrwEcB0I9t2HTEYUwAFVGiiS6wc+P4ClLDc5FQ==", + "dev": true, + "requires": { + "commander": "2.17.1", + "source-map": "0.6.1", + "source-map-support": "0.5.9" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz", + "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==", + "dev": true, + "requires": { + "cacache": "11.3.2", + "find-cache-dir": "2.0.0", + "schema-utils": "1.0.0", + "serialize-javascript": "1.6.1", + "source-map": "0.6.1", + "terser": "3.14.0", + "webpack-sources": "1.3.0", + "worker-farm": "1.6.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "6.6.2", + "ajv-errors": "1.0.1", + "ajv-keywords": "3.2.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, + "ts-loader": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-5.3.2.tgz", + "integrity": "sha512-TPeXFkdPjOrVEawY4xUgRnzlHEmKQF1DclJghPGq67jKnroVvs6mEGHWYtbUczgeWTvTaqUjSSaMmp1k5do4vw==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "enhanced-resolve": "4.1.0", + "loader-utils": "1.2.3", + "micromatch": "3.1.10", + "semver": "5.6.0" + } + }, + "ts-node": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-6.2.0.tgz", + "integrity": "sha512-ZNT+OEGfUNVMGkpIaDJJ44Zq3Yr0bkU/ugN1PHbU+/01Z7UV1fsELRiTx1KuQNvQ1A3pGh3y25iYF6jXgxV21A==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "buffer-from": "1.1.1", + "diff": "3.5.0", + "make-error": "1.3.5", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map-support": "0.5.9", + "yn": "2.0.0" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "2.0.1" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "2.1.1" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", + "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "2.0.4", + "graceful-fs": "4.1.15", + "neo-async": "2.6.0" + } + }, + "webpack": { + "version": "4.28.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.3.tgz", + "integrity": "sha512-vLZN9k5I7Nr/XB1IDG9GbZB4yQd1sPuvufMFgJkx0b31fi2LD97KQIjwjxE7xytdruAYfu5S0FLBLjdxmwGJCg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "5.7.3", + "acorn-dynamic-import": "3.0.0", + "ajv": "6.6.2", + "ajv-keywords": "3.2.0", + "chrome-trace-event": "1.0.0", + "enhanced-resolve": "4.1.0", + "eslint-scope": "4.0.0", + "json-parse-better-errors": "1.0.2", + "loader-runner": "2.3.1", + "loader-utils": "1.2.3", + "memory-fs": "0.4.1", + "micromatch": "3.1.10", + "mkdirp": "0.5.1", + "neo-async": "2.6.0", + "node-libs-browser": "2.1.0", + "schema-utils": "0.4.7", + "tapable": "1.1.1", + "terser-webpack-plugin": "1.2.1", + "watchpack": "1.6.0", + "webpack-sources": "1.3.0" + } + }, + "webpack-cli": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz", + "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "global-modules-path": "2.3.1", + "import-local": "2.0.0", + "interpret": "1.2.0", + "loader-utils": "1.2.3", + "supports-color": "5.5.0", + "v8-compile-cache": "2.0.2", + "yargs": "12.0.5" + } + }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "2.0.1", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "3.0.0", + "get-caller-file": "1.0.3", + "os-locale": "3.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "4.0.0", + "yargs-parser": "11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "5.0.0", + "decamelize": "1.2.0" + } + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + } + } +} diff --git a/lib/parse/package.json b/lib/parse/package.json index 23d02b8e43..a08657e4d4 100644 --- a/lib/parse/package.json +++ b/lib/parse/package.json @@ -6,6 +6,7 @@ "types": "index.d.ts", "scripts": { "asbuild": "asc assembly/index.ts -O3 -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate", + "asbuild:untouched": "asc assembly/index.ts -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate", "build": "npm run asbuild && webpack --mode production --display-modules", "test": "ts-node tests/" }, diff --git a/lib/parse/src/common.ts b/lib/parse/src/common.ts index e45100db5f..92794f2580 100644 --- a/lib/parse/src/common.ts +++ b/lib/parse/src/common.ts @@ -50,176 +50,179 @@ export const MAX_ELEMS = 0xffffffff; /** WebAssembly opcodes. */ export enum Opcode { // just a few of these are actually used - // unreachable = 0x00, - // nop = 0x01, - // block = 0x02, - // loop = 0x03, - // if_ = 0x04, - // else_ = 0x05, + unreachable = 0x00, + nop = 0x01, + block = 0x02, + loop = 0x03, + if_ = 0x04, + else_ = 0x05, end = 0x0b, - // br = 0x0c, - // br_if = 0x0d, - // br_table = 0x0e, - // return_ = 0x0f, - // call = 0x10, - // call_indirect = 0x11, - // drop = 0x1a, - // select = 0x1b, - // get_local = 0x20, - // set_local = 0x21, - // tee_local = 0x22, + br = 0x0c, + br_if = 0x0d, + br_table = 0x0e, + return_ = 0x0f, + call = 0x10, + call_indirect = 0x11, + drop = 0x1a, + select = 0x1b, + get_local = 0x20, + set_local = 0x21, + tee_local = 0x22, get_global = 0x23, - // set_global = 0x24, - // i32_load = 0x28, - // i64_load = 0x29, - // f32_load = 0x2a, - // f64_load = 0x2b, - // i32_load8_s = 0x2c, - // i32_load8_u = 0x2d, - // i32_load16_s = 0x2e, - // i32_load16_u = 0x2f, - // i64_load8_s = 0x30, - // i64_load8_u = 0x31, - // i64_load16_s = 0x32, - // i64_load16_u = 0x33, - // i64_load32_s = 0x34, - // i64_load32_u = 0x35, - // i32_store = 0x36, - // i64_store = 0x37, - // f32_store = 0x38, - // f64_store = 0x39, - // i32_store8 = 0x3a, - // i32_store16 = 0x3b, - // i64_store8 = 0x3c, - // i64_store16 = 0x3d, - // i64_store32 = 0x3e, - // current_memory = 0x3f, - // grow_memory = 0x40, + set_global = 0x24, + i32_load = 0x28, + i64_load = 0x29, + f32_load = 0x2a, + f64_load = 0x2b, + i32_load8_s = 0x2c, + i32_load8_u = 0x2d, + i32_load16_s = 0x2e, + i32_load16_u = 0x2f, + i64_load8_s = 0x30, + i64_load8_u = 0x31, + i64_load16_s = 0x32, + i64_load16_u = 0x33, + i64_load32_s = 0x34, + i64_load32_u = 0x35, + i32_store = 0x36, + i64_store = 0x37, + f32_store = 0x38, + f64_store = 0x39, + i32_store8 = 0x3a, + i32_store16 = 0x3b, + i64_store8 = 0x3c, + i64_store16 = 0x3d, + i64_store32 = 0x3e, + current_memory = 0x3f, + grow_memory = 0x40, i32_const = 0x41, i64_const = 0x42, f32_const = 0x43, - f64_const = 0x44 - // i32_eqz = 0x45, - // i32_eq = 0x46, - // i32_ne = 0x47, - // i32_lt_s = 0x48, - // i32_lt_u = 0x49, - // i32_gt_s = 0x4a, - // i32_gt_u = 0x4b, - // i32_le_s = 0x4c, - // i32_le_u = 0x4d, - // i32_ge_s = 0x4e, - // i32_ge_u = 0x4f, - // i64_eqz = 0x50, - // i64_eq = 0x51, - // i64_ne = 0x52, - // i64_lt_s = 0x53, - // i64_lt_u = 0x54, - // i64_gt_s = 0x55, - // i64_gt_u = 0x56, - // i64_le_s = 0x57, - // i64_le_u = 0x58, - // i64_ge_s = 0x59, - // i64_ge_u = 0x5a, - // f32_eq = 0x5b, - // f32_ne = 0x5c, - // f32_lt = 0x5d, - // f32_gt = 0x5e, - // f32_le = 0x5f, - // f32_ge = 0x60, - // f64_eq = 0x61, - // f64_ne = 0x62, - // f64_lt = 0x63, - // f64_gt = 0x64, - // f64_le = 0x65, - // f64_ge = 0x66, - // i32_clz = 0x67, - // i32_ctz = 0x68, - // i32_popcnt = 0x69, - // i32_add = 0x6a, - // i32_sub = 0x6b, - // i32_mul = 0x6c, - // i32_div_s = 0x6d, - // i32_div_u = 0x6e, - // i32_rem_s = 0x6f, - // i32_rem_u = 0x70, - // i32_and = 0x71, - // i32_or = 0x72, - // i32_xor = 0x73, - // i32_shl = 0x74, - // i32_shr_s = 0x75, - // i32_shr_u = 0x76, - // i32_rotl = 0x77, - // i32_rotr = 0x78, - // i64_clz = 0x79, - // i64_ctz = 0x7a, - // i64_popcnt = 0x7b, - // i64_add = 0x7c, - // i64_sub = 0x7d, - // i64_mul = 0x7e, - // i64_div_s = 0x7f, - // i64_div_u = 0x80, - // i64_rem_s = 0x81, - // i64_rem_u = 0x82, - // i64_and = 0x83, - // i64_or = 0x84, - // i64_xor = 0x85, - // i64_shl = 0x86, - // i64_shr_s = 0x87, - // i64_shr_u = 0x88, - // i64_rotl = 0x89, - // i64_rotr = 0x8a, - // f32_abs = 0x8b, - // f32_neg = 0x8c, - // f32_ceil = 0x8d, - // f32_floor = 0x8e, - // f32_trunc = 0x8f, - // f32_nearest = 0x90, - // f32_sqrt = 0x91, - // f32_add = 0x92, - // f32_sub = 0x93, - // f32_mul = 0x94, - // f32_div = 0x95, - // f32_min = 0x96, - // f32_max = 0x97, - // f32_copysign = 0x98, - // f64_abs = 0x99, - // f64_neg = 0x9a, - // f64_ceil = 0x9b, - // f64_floor = 0x9c, - // f64_trunc = 0x9d, - // f64_nearest = 0x9e, - // f64_sqrt = 0x9f, - // f64_add = 0xa0, - // f64_sub = 0xa1, - // f64_mul = 0xa2, - // f64_div = 0xa3, - // f64_min = 0xa4, - // f64_max = 0xa5, - // f64_copysign = 0xa6, - // i32_wrap_i64 = 0xa7, - // i32_trunc_s_f32 = 0xa8, - // i32_trunc_u_f32 = 0xa9, - // i32_trunc_s_f64 = 0xaa, - // i32_trunc_u_f64 = 0xab, - // i64_extend_s_i32 = 0xac, - // i64_extend_u_i32 = 0xad, - // i64_trunc_s_f32 = 0xae, - // i64_trunc_u_f32 = 0xaf, - // i64_trunc_s_f64 = 0xb0, - // i64_trunc_u_f64 = 0xb1, - // f32_convert_s_i32 = 0xb2, - // f32_convert_u_i32 = 0xb3, - // f32_convert_s_i64 = 0xb4, - // f32_convert_u_i64 = 0xb5, - // f32_demote_f64 = 0xb6, - // f64_convert_s_i32 = 0xb7, - // f64_convert_u_i32 = 0xb8, - // f64_convert_s_i64 = 0xb9, - // f64_convert_u_i64 = 0xba, - // f64_promote_f32 = 0xbb, - // i32_reinterpret_f32 = 0xbc, - // i64_reinterpret_f64 = 0xbd, - // f32_reinterpret_i32 = 0xbe, - // f64_reinterpret_i64 = 0xbf + f64_const = 0x44, + i32_eqz = 0x45, + i32_eq = 0x46, + i32_ne = 0x47, + i32_lt_s = 0x48, + i32_lt_u = 0x49, + i32_gt_s = 0x4a, + i32_gt_u = 0x4b, + i32_le_s = 0x4c, + i32_le_u = 0x4d, + i32_ge_s = 0x4e, + i32_ge_u = 0x4f, + i64_eqz = 0x50, + i64_eq = 0x51, + i64_ne = 0x52, + i64_lt_s = 0x53, + i64_lt_u = 0x54, + i64_gt_s = 0x55, + i64_gt_u = 0x56, + i64_le_s = 0x57, + i64_le_u = 0x58, + i64_ge_s = 0x59, + i64_ge_u = 0x5a, + f32_eq = 0x5b, + f32_ne = 0x5c, + f32_lt = 0x5d, + f32_gt = 0x5e, + f32_le = 0x5f, + f32_ge = 0x60, + f64_eq = 0x61, + f64_ne = 0x62, + f64_lt = 0x63, + f64_gt = 0x64, + f64_le = 0x65, + f64_ge = 0x66, + i32_clz = 0x67, + i32_ctz = 0x68, + i32_popcnt = 0x69, + i32_add = 0x6a, + i32_sub = 0x6b, + i32_mul = 0x6c, + i32_div_s = 0x6d, + i32_div_u = 0x6e, + i32_rem_s = 0x6f, + i32_rem_u = 0x70, + i32_and = 0x71, + i32_or = 0x72, + i32_xor = 0x73, + i32_shl = 0x74, + i32_shr_s = 0x75, + i32_shr_u = 0x76, + i32_rotl = 0x77, + i32_rotr = 0x78, + i64_clz = 0x79, + i64_ctz = 0x7a, + i64_popcnt = 0x7b, + i64_add = 0x7c, + i64_sub = 0x7d, + i64_mul = 0x7e, + i64_div_s = 0x7f, + i64_div_u = 0x80, + i64_rem_s = 0x81, + i64_rem_u = 0x82, + i64_and = 0x83, + i64_or = 0x84, + i64_xor = 0x85, + i64_shl = 0x86, + i64_shr_s = 0x87, + i64_shr_u = 0x88, + i64_rotl = 0x89, + i64_rotr = 0x8a, + f32_abs = 0x8b, + f32_neg = 0x8c, + f32_ceil = 0x8d, + f32_floor = 0x8e, + f32_trunc = 0x8f, + f32_nearest = 0x90, + f32_sqrt = 0x91, + f32_add = 0x92, + f32_sub = 0x93, + f32_mul = 0x94, + f32_div = 0x95, + f32_min = 0x96, + f32_max = 0x97, + f32_copysign = 0x98, + f64_abs = 0x99, + f64_neg = 0x9a, + f64_ceil = 0x9b, + f64_floor = 0x9c, + f64_trunc = 0x9d, + f64_nearest = 0x9e, + f64_sqrt = 0x9f, + f64_add = 0xa0, + f64_sub = 0xa1, + f64_mul = 0xa2, + f64_div = 0xa3, + f64_min = 0xa4, + f64_max = 0xa5, + f64_copysign = 0xa6, + i32_wrap_i64 = 0xa7, + i32_trunc_s_f32 = 0xa8, + i32_trunc_u_f32 = 0xa9, + i32_trunc_s_f64 = 0xaa, + i32_trunc_u_f64 = 0xab, + i64_extend_s_i32 = 0xac, + i64_extend_u_i32 = 0xad, + i64_trunc_s_f32 = 0xae, + i64_trunc_u_f32 = 0xaf, + i64_trunc_s_f64 = 0xb0, + i64_trunc_u_f64 = 0xb1, + f32_convert_s_i32 = 0xb2, + f32_convert_u_i32 = 0xb3, + f32_convert_s_i64 = 0xb4, + f32_convert_u_i64 = 0xb5, + f32_demote_f64 = 0xb6, + f64_convert_s_i32 = 0xb7, + f64_convert_u_i32 = 0xb8, + f64_convert_s_i64 = 0xb9, + f64_convert_u_i64 = 0xba, + f64_promote_f32 = 0xbb, + i32_reinterpret_f32 = 0xbc, + i64_reinterpret_f64 = 0xbd, + f32_reinterpret_i32 = 0xbe, + f64_reinterpret_i64 = 0xbf } + +export declare function parse(p: any): number; +export declare function newParser(p: any):number[]; diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index 69d5a2c8a6..dc187db5fc 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -1,10 +1,16 @@ -import { Type, SectionId, ExternalKind } from "./common"; +import { Type, SectionId, ExternalKind, newParser } from "./common"; +import assert = require("assert"); export { Type, SectionId, ExternalKind }; +import * as loader from "../../loader"; + +type Instance = loader.ASUtil & T; + +type Parser = {parse: (any)=> any, newParser: (any)=>any}; /** Cached compiled parser. */ var compiled: WebAssembly.Module | null = null; -declare var WASM_DATA: string; // injected by webpack +var WASM_DATA: string; // injected by webpack if (typeof WASM_DATA !== "string") WASM_DATA = require("fs").readFileSync(__dirname + "/../build/index.wasm", "base64"); /** Options specified to the parser. The `onSection` callback determines the sections being evaluated in detail. */ @@ -48,6 +54,7 @@ export interface ParseOptions { /** Called with each local name if present and the 'name' section is evaluated. */ onLocalName?(funcIndex: number, index: number, offset: number, length: number): void; } +let memory: WebAssembly.Memory; /** Parses the contents of a WebAssembly binary according to the specified options. */ export function parse(binary: Uint8Array, options?: ParseOptions): void { @@ -59,19 +66,51 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { // use the binary as the parser's memory var nBytes = binary.length; var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16; - var memory = new WebAssembly.Memory({ initial: nPages }); - var buffer = new Uint8Array(memory.buffer); - buffer.set(binary); + memory = new WebAssembly.Memory({ initial: nPages }); + var buffer = new Uint32Array(memory.buffer); + // buffer.set(binary); // provide a way to read strings from memory parse.readString = (offset: number, length: number): string => utf8_read(buffer, offset, offset + length); + parse.readUint32 = (index: number): number => { + return buffer[index]; + } + var instance: Instance; + // instantiate the parser and return its exports var imports = { env: { + abort: console.error, memory }, - options: {} + index: { + debug: () => {debugger; }, + _log: (start, sizeof) => { + let begin = start >> 2; + let size = sizeof >> 2; + if (size == 1 ){ + console.log(start); + } else { + let str = [] + let len = 0; + for (let i = begin; i < begin+size; i++){ + let line = `| ${i} | ${instance.I32[i]>>2}`; + len = Math.max(len, line.length); + str.push(line); + } + let output = str.map((v,i,a)=> v + " ".repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = (dash as any).repeat(len+2); + console.log([line,output.join('\n'+line+'\n'),line].join("\n")); + } + }, + _log_str:(x) => console.log(instance.getString(x)), + _logi: console.log, + _logf: console.log + }, + options: {}, + }; [ "onSection", "onType", @@ -93,13 +132,33 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { "onFunctionName", "onLocalName" ].forEach((name: string): void => imports.options[name] = options[name] || function() {}); - var instance = new WebAssembly.Instance(compiled, imports); - instance.exports.parse(0, nBytes); + instance = loader.instantiate(compiled, imports); + let array = instance.newArray(new Uint8Array(binary)) + let parserPtr = instance.newParser(array); + debugger; + let Mod = instance.parse(parserPtr); + console.log(instance.getString((instance as any).getType(Mod))); + // let sections = buffer.slice(instance.I32[Mod], 2); + // console.log(sections[1]) + // let arrayBuf = sections[0]>>2; + // for (let i =0; i> 2; + // console.log("id: " + instance.I32[section + 1]); + // // console.log(instance.getString(instance.I32[section + 4])); + // } + // let typeSection = (instance as any).getType() >> 2; + // console.log(instance.getString(typeSection)); + // debugger; + // for (let i in Mod) { + // console.log(Mod[i]); + // } + // debugger; } export declare namespace parse { /** Utility function for reading an UTF8 encoded string from memory while parsing. */ function readString(offset: number, length: number): string; + function readUint32(index: number): number; } // see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/utf8 diff --git a/lib/parse/tests/index.ts b/lib/parse/tests/index.ts index 3ca12d4c62..28b1590bcc 100644 --- a/lib/parse/tests/index.ts +++ b/lib/parse/tests/index.ts @@ -4,7 +4,7 @@ import { SectionId, ExternalKind, parse -} from ".."; +} from "../src"; function onSection(id: SectionId, offset: number, length: number, nameOffset: number, nameLength: number): boolean { var name = id == 0 ? "'" + parse.readString(nameOffset, nameLength) + "'" : SectionId[id]; From bdda8ae35d79b815af313693df49be00bd814293 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Thu, 3 Jan 2019 12:06:10 +0100 Subject: [PATCH 06/46] Working on sections. --- lib/parse/assembly/index.ts | 17 +- lib/parse/assembly/module/imports.ts | 121 ++- lib/parse/assembly/module/index.ts | 188 ++--- lib/parse/build/index.wat | 1157 +++++++++++++++++++------- lib/parse/package.json | 2 +- lib/parse/src/index.ts | 1 + lib/parse/src/tsconfig.json | 3 +- 7 files changed, 1092 insertions(+), 397 deletions(-) diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index 7a156dfff5..9dcbff26b8 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -63,6 +63,21 @@ export function getType(m: Module): string { return type.toString(); } +export function getImports(m: Module): void { + let imports = m.getImports(); + // log(imports.length); + if (imports.length>0) + for (let i = 0; i< imports.length; i++){ + log(imports.length); + + // for (let j = 0; i< imports[i].imports.length; j++){ + // let _import = imports[i].imports[j]; + // log(_import.toString()) + // } + } + // return +} + export function toString(t:TypeSection): string { return t.toString(); } @@ -70,7 +85,7 @@ export function toString(t:TypeSection): string { export class Parser { buf: Buffer; module: Module; - constructor(buf: Buffer){ + constructor(buf: Buffer){ this.buf = buf; this.module = new Module(buf); } diff --git a/lib/parse/assembly/module/imports.ts b/lib/parse/assembly/module/imports.ts index dbbd223f85..c44f0a3864 100644 --- a/lib/parse/assembly/module/imports.ts +++ b/lib/parse/assembly/module/imports.ts @@ -1,10 +1,123 @@ +import { + Type, + SectionId, + ExternalKind, + NameType, + MAX_PAGES, + MAX_ELEMS, + Opcode +} from "../../src/common"; +import {Buffer} from "../buffer"; +import {Section} from "."; +import {log} from '../host'; -export class Import { +function getExternalKindName(kind: ExternalKind): string{ + switch(kind){ + case ExternalKind.Function: return "Function" + case ExternalKind.Table: return "Table" + case ExternalKind.Memory: return "Memory" + case ExternalKind.Global: return "Global" + default: + unreachable(); + return ""; + } - constructor(public index: u32, public kind: u32, public moduleOff: u32, public moduleLen: u32, public fieldOff: u32, public fieldLen: u32){} } -export function onImport(index: u32, kind: u32, moduleOff: u32, moduleLen: u32, fieldOff: u32, fieldLen: u32): Import { - return new Import(index, kind, moduleOff, moduleLen, fieldOff, fieldLen); +class Import { + constructor(public _module: string, public name: string, + public kind: ExternalKind){} + + toString(): string { + return this._module + "." + this.name +" - " + getExternalKindName(this.kind); + } +} + +class FunctionImport extends Import { + parse(buf: Buffer): FunctionImport{ + return this; + } +} + + +export class Imports extends Section { + imports: Import[]; + + + parse(buf:Buffer): Imports { + buf.off = this.header.payload_off; + let count = buf.readVaruint(32); + this.imports = new Array(count); + for (let index: u32 = 0; index < count; ++index) { + let module_len = buf.readVaruint(32); + let module_off = buf.off; + let moduleName = String.fromUTF8(module_off, module_len); + buf.off += module_len; + let field_len = buf.readVaruint(32); + let field_off = buf.off; + let fieldName = String.fromUTF8(field_off, field_len); + buf.off += field_len; + let kind = buf.readUint(); + this.imports[index] = new Import(moduleName, fieldName, kind); + + // opt.onImport( + // index, + // kind, + // module_off, + // module_len, + // field_off, + // field_len + // ); + switch (kind) { + case ExternalKind.Function: { + let type = buf.readVaruint(32); + // opt.onFunctionImport( + // fun_space_index++, + // type + // ); + break; + } + case ExternalKind.Table: { + let type = buf.readVarint(7) & 0x7f; + let flags = buf.readVaruint(1); + let initial = buf.readVaruint(32); + let maximum = flags & 1 ? buf.readVaruint(32) : MAX_ELEMS; + // opt.onTableImport( + // tbl_space_index++, + // type, + // initial, + // maximum, + // flags + // ); + break; + } + case ExternalKind.Memory: { + let flags = buf.readVaruint(1); + let initial = buf.readVaruint(32); + let maximum = flags & 1 ? buf.readVaruint(32) : MAX_PAGES; + // opt.onMemoryImport( + // mem_space_index++, + // initial, + // maximum, + // flags + // ); + break; + } + case ExternalKind.Global: { + let type = buf.readVarint(7) & 0x7f; + let mutability = buf.readVaruint(1); + // opt.onGlobalImport( + // glo_space_index++, + // type, + // mutability + // ); + break; + } + default: unreachable(); + } + } + return this; + } + } diff --git a/lib/parse/assembly/module/index.ts b/lib/parse/assembly/module/index.ts index 34db29b570..c24246863b 100644 --- a/lib/parse/assembly/module/index.ts +++ b/lib/parse/assembly/module/index.ts @@ -13,6 +13,7 @@ import {Buffer} from '../buffer'; import {log, log_str} from "../host"; import {itoa} from 'internal/number'; +import { Imports } from "./imports"; type byte = u8; @@ -56,6 +57,9 @@ export class Module { public getID(id: SectionId): SectionHeader[] { let res: SectionHeader[] = []; + while(res.length > 0){ + res.pop(); + } let x: i32 = this.Headers.length; for (let i=0; i < x; i++){ if (this.Headers[i].id == id){ @@ -71,6 +75,19 @@ export class Module { return section.parse(this.buf); } + getImports(): Imports[] { + let ImportHeaders = this.getID(SectionId.Import); + let imports: Imports[] = []; + log(imports.length); + for (let i = 0; i < ImportHeaders.length; i++){ + log(ImportHeaders[i].name) + let _import = new Imports(ImportHeaders[i]); + imports.push(_import.parse(this.buf)); + log(_import.imports.length); + } + return imports; + } + } function typeName(t: Type): string{ @@ -160,7 +177,7 @@ export class SectionHeader { } -class Section { +export class Section { constructor(public header: SectionHeader){} } // static create(buf: Buffer): Section { @@ -213,13 +230,11 @@ class FuncType { } } -export class TypeSection { - header: SectionHeader + + +export class TypeSection extends Section { + // header: SectionHeader funcs: FuncType[]; - constructor(header: SectionHeader){ - this.header = header; - this.funcs = []; - } // constructor(public header: SectionHeader){} parse(buf: Buffer): TypeSection { @@ -258,118 +273,71 @@ export class TypeSection { } -/* -case SectionId.Import: { - let count = buf.readVaruint(32); - for (let index: u32 = 0; index < count; ++index) { - let module_len = buf.readVaruint(32); - let module_off = off; - off += module_len; - let field_len = buf.readVaruint(32); - let field_off = off; - off += field_len; - let kind = readUint(); - opt.onImport( - index, - kind, - module_off, - module_len, - field_off, - field_len - ); - switch (kind) { - case ExternalKind.Function: { - let type = buf.readVaruint(32); - opt.onFunctionImport( - fun_space_index++, - type - ); - break; - } - case ExternalKind.Table: { - let type = buf.readVarint(7) & 0x7f; - let flags = buf.readVaruint(1); - let initial = buf.readVaruint(32); - let maximum = flags & 1 ? buf.readVaruint(32) : MAX_ELEMS; - opt.onTableImport( - tbl_space_index++, - type, - initial, - maximum, - flags - ); - break; - } - case ExternalKind.Memory: { - let flags = buf.readVaruint(1); - let initial = buf.readVaruint(32); - let maximum = flags & 1 ? buf.readVaruint(32) : MAX_PAGES; - opt.onMemoryImport( - mem_space_index++, - initial, - maximum, - flags - ); - break; - } - case ExternalKind.Global: { - let type = buf.readVarint(7) & 0x7f; - let mutability = buf.readVaruint(1); - opt.onGlobalImport( - glo_space_index++, - type, - mutability - ); - break; - } - default: unreachable(); +class FunctionSection extends Section { + typeIndexes: u32[]; + + parse(buf: Buffer): FunctionSection { + buf.off = this.header.payload_off; + let count = buf.readVaruint(32); + this.typeIndexes = new Array(count); + for (let i: u32 = 0; i < count; ++i) { + let typeIndex = buf.readVaruint(32); + this.typeIndexes[i] = typeIndex; } + return this; } - break; } -case SectionId.Function: { - let count = buf.readVaruint(32); - for (let i: u32 = 0; i < count; ++i) { - let typeIndex = buf.readVaruint(32); - opt.onFunction( - fun_space_index++, - typeIndex - ); + +class Table { + constructor(public type: u32, public flags: u8, public initial: u32, public maximum: u32){} +} + + +class TableSection extends Section { + tables: Table[]; + parse(buf: Buffer): TableSection { + let count = buf.readVaruint(32); + this.tables = new Array(count); + for (let index: u32 = 0; index < count; ++index) { + let type = buf.readVaruint(7) & 0x7f; + let flags = buf.readVaruint(1); + let initial = buf.readVaruint(32); + let maximum = flags & 1 ? buf.readVaruint(32) : MAX_ELEMS; + this.tables[index] = new Table(type, flags, initial, maximum); + } + return this; } - break; } -case SectionId.Table: { - let count = buf.readVaruint(32); - for (let index: u32 = 0; index < count; ++index) { - let type = buf.readVaruint(7) & 0x7f; - let flags = buf.readVaruint(1); - let initial = buf.readVaruint(32); - let maximum = flags & 1 ? buf.readVaruint(32) : MAX_ELEMS; - opt.onTable( - tbl_space_index++, - type, - initial, - maximum, - flags - ); + + + +class Memory{ + constructor(public flags: u8, public initial: u32, public maximum: u32){} + + get shared(): boolean { + return this.flags > 1; } - break; } -case SectionId.Memory: { - let count = buf.readVaruint(32); - for (let index: u32 = 0; index < count; ++index) { - let flags = buf.readVaruint(1); - let initial = buf.readVaruint(32); - let maximum = flags & 1 ? buf.readVaruint(32) : MAX_PAGES; - opt.onMemory( - mem_space_index++, - initial, - maximum, - flags - ); + +class MemorySection { + memory: Memory[]; + + parse(buf: Buffer): MemorySection { + let count = buf.readVaruint(32); + this.memory = new Array(count); + for (let index: u32 = 0; index < count; ++index) { + let flags = buf.readVaruint(1); + if (flags > 3) { + unreachable(); + } + let initial = buf.readVaruint(32); + let maximum = flags & 1 ? buf.readVaruint(32) : MAX_PAGES; + this.memory[index] = new Memory(flags, initial, maximum); + } + return this } - break; } +/* case SectionId.Global: { let count = buf.readVaruint(32); for (let i: u32 = 0; i < count; ++i) { diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index 6639fd36bb..c6a82deb43 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -7,37 +7,38 @@ (type $iii (func (param i32 i32) (result i32))) (type $iiiiv (func (param i32 i32 i32 i32))) (type $iiiiiv (func (param i32 i32 i32 i32 i32))) + (type $iiiii (func (param i32 i32 i32 i32) (result i32))) (type $iiv (func (param i32 i32))) (import "env" "memory" (memory $0 1)) (data (i32.const 8) "\00\00\00\00\00\00\00\00") (data (i32.const 16) "\08\00\00\00\00\00\00\00") (data (i32.const 24) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") (data (i32.const 56) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") - (data (i32.const 120) "\00\00\00\00\00\00\00\00") - (data (i32.const 128) "x\00\00\00\00\00\00\00") - (data (i32.const 136) "\01\00\00\000\00") - (data (i32.const 144) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 200) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\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 712) "\c8\00\00\00d\00\00\00") - (data (i32.const 720) "\03\00\00\00i\003\002\00") - (data (i32.const 736) "\03\00\00\00i\006\004\00") - (data (i32.const 752) "\03\00\00\00f\003\002\00") - (data (i32.const 768) "\03\00\00\00f\006\004\00") - (data (i32.const 784) "\07\00\00\00a\00n\00y\00f\00u\00n\00c\00") - (data (i32.const 808) "\04\00\00\00f\00u\00n\00c\00") - (data (i32.const 824) "\04\00\00\00n\00o\00n\00e\00") - (data (i32.const 840) "\00\00\00\00") - (data (i32.const 848) "\04\00\00\00n\00u\00l\00l\00") - (data (i32.const 864) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 896) "\02\00\00\00,\00 \00") - (data (i32.const 904) "\04\00\00\00v\00o\00i\00d\00") - (data (i32.const 920) "\07\00\00\00i\00n\00d\00e\00x\00:\00 \00") - (data (i32.const 944) "\06\00\00\00f\00o\00r\00m\00:\00 \00") - (data (i32.const 960) "\03\00\00\00,\00 \00(\00") - (data (i32.const 976) "\05\00\00\00)\00 \00=\00>\00 \00") - (data (i32.const 992) "\00\00\00\00\00\00\00\00") - (data (i32.const 1000) "\e0\03\00\00\00\00\00\00") - (data (i32.const 1008) "\01\00\00\00\n\00") + (data (i32.const 120) "\01\00\00\000\00") + (data (i32.const 128) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 184) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\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 696) "\b8\00\00\00d\00\00\00") + (data (i32.const 704) "\03\00\00\00i\003\002\00") + (data (i32.const 720) "\03\00\00\00i\006\004\00") + (data (i32.const 736) "\03\00\00\00f\003\002\00") + (data (i32.const 752) "\03\00\00\00f\006\004\00") + (data (i32.const 768) "\07\00\00\00a\00n\00y\00f\00u\00n\00c\00") + (data (i32.const 792) "\04\00\00\00f\00u\00n\00c\00") + (data (i32.const 808) "\04\00\00\00n\00o\00n\00e\00") + (data (i32.const 824) "\00\00\00\00") + (data (i32.const 832) "\04\00\00\00n\00u\00l\00l\00") + (data (i32.const 848) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 880) "\02\00\00\00,\00 \00") + (data (i32.const 888) "\04\00\00\00v\00o\00i\00d\00") + (data (i32.const 904) "\07\00\00\00i\00n\00d\00e\00x\00:\00 \00") + (data (i32.const 928) "\06\00\00\00f\00o\00r\00m\00:\00 \00") + (data (i32.const 944) "\03\00\00\00,\00 \00(\00") + (data (i32.const 960) "\05\00\00\00)\00 \00=\00>\00 \00") + (data (i32.const 976) "\00\00\00\00\00\00\00\00") + (data (i32.const 984) "\d0\03\00\00\00\00\00\00") + (data (i32.const 992) "\01\00\00\00\n\00") + (data (i32.const 1000) "\00\00\00\00\00\00\00\00") + (data (i32.const 1008) "\e8\03\00\00\00\00\00\00") (data (i32.const 1016) "\00\00\00\00\00\00\00\00") (data (i32.const 1024) "\f8\03\00\00\00\00\00\00") (data (i32.const 1032) "\01\00\00\00\'\00") @@ -55,6 +56,7 @@ (data (i32.const 1232) "\04\00\00\00D\00a\00t\00a\00") (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) + (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) (table $0 1 anyfunc) (elem (i32.const 0) $null) (global $src/common/MAX_PAGES i32 (i32.const 65535)) @@ -118,10 +120,15 @@ (global $~lib/internal/string/CharCode.o i32 (i32.const 111)) (global $~lib/internal/string/CharCode.x i32 (i32.const 120)) (global $~lib/internal/string/CharCode.z i32 (i32.const 122)) + (global $src/common/ExternalKind.Function (mut i32) (i32.const 0)) + (global $src/common/ExternalKind.Table (mut i32) (i32.const 1)) + (global $src/common/ExternalKind.Memory (mut i32) (i32.const 2)) + (global $src/common/ExternalKind.Global (mut i32) (i32.const 3)) (global $HEAP_BASE i32 (i32.const 1244)) (export "memory" (memory $0)) (export "table" (table $0)) (export "getType" (func $assembly/index/getType)) + (export "getImports" (func $assembly/index/getImports)) (export "toString" (func $assembly/index/toString)) (export "Parser#constructor" (func $assembly/index/Parser#constructor)) (export "Parser#get:buf" (func $Parser#get:buf)) @@ -142,7 +149,7 @@ (export "memory.free" (func $~lib/memory/memory.free)) (export "memory.reset" (func $~lib/memory/memory.reset)) (start $start) - (func $~lib/internal/memory/memset (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memset (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) <<<<<<< loader-memory-accessors get_global $assembly/index/off @@ -637,13 +644,13 @@ end end ) - (func $~lib/memory/memory.fill (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/memory.fill (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memset ) - (func $~lib/internal/memory/memcpy (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memcpy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -1844,7 +1851,7 @@ i32.store8 end ) - (func $~lib/internal/memory/memmove (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memmove (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) get_local $0 get_local $1 @@ -2071,13 +2078,13 @@ end end ) - (func $~lib/memory/memory.copy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/memory.copy (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memmove ) - (func $~lib/internal/memory/memcmp (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/memory/memcmp (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) get_local $0 get_local $1 @@ -2131,13 +2138,13 @@ i32.const 0 end ) - (func $~lib/memory/memory.compare (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/memory/memory.compare (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memcmp ) - (func $~lib/allocator/arena/__memory_allocate (; 9 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/allocator/arena/__memory_allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2216,28 +2223,74 @@ set_global $~lib/allocator/arena/offset get_local $1 ) - (func $~lib/memory/memory.allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/memory/memory.allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $~lib/allocator/arena/__memory_allocate return ) - (func $~lib/allocator/arena/__memory_free (; 11 ;) (type $iv) (param $0 i32) + (func $~lib/allocator/arena/__memory_free (; 12 ;) (type $iv) (param $0 i32) nop ) - (func $~lib/memory/memory.free (; 12 ;) (type $iv) (param $0 i32) + (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) get_local $0 call $~lib/allocator/arena/__memory_free return ) - (func $~lib/allocator/arena/__memory_reset (; 13 ;) (type $v) + (func $~lib/allocator/arena/__memory_reset (; 14 ;) (type $v) get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset ) - (func $~lib/memory/memory.reset (; 14 ;) (type $v) + (func $~lib/memory/memory.reset (; 15 ;) (type $v) call $~lib/allocator/arena/__memory_reset return ) - (func $~lib/array/Array#__get (; 15 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#pop (; 16 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.load offset=4 + set_local $1 + get_local $1 + i32.const 1 + i32.lt_s + if + i32.const 0 + i32.const 24 + i32.const 246 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) + get_local $0 + i32.load + set_local $2 + get_local $1 + i32.const 1 + i32.sub + tee_local $1 + set_local $3 + i32.const 0 + set_local $4 + get_local $2 + get_local $3 + i32.const 2 + i32.shl + i32.add + get_local $4 + i32.add + i32.load offset=8 + end + set_local $5 + get_local $0 + get_local $1 + i32.store offset=4 + get_local $5 + ) + (func $~lib/array/Array#__get (; 17 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) get_local $0 @@ -2264,7 +2317,7 @@ unreachable end ) - (func $~lib/internal/arraybuffer/computeSize (; 16 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/arraybuffer/computeSize (; 18 ;) (type $ii) (param $0 i32) (result i32) i32.const 1 i32.const 32 get_local $0 @@ -2276,7 +2329,7 @@ i32.sub i32.shl ) - (func $~lib/internal/arraybuffer/allocateUnsafe (; 17 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 19 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -2305,7 +2358,7 @@ i32.store get_local $1 ) - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2407,7 +2460,7 @@ end get_local $0 ) - (func $~lib/array/Array#push (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#push (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2469,13 +2522,29 @@ i32.store offset=8 get_local $5 ) - (func $assembly/module/index/Module#getID (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/Module#getID (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) i32.const 16 set_local $2 - block $~lib/array/Array#get:length|inlined.0 (result i32) + block $break|0 + loop $continue|0 + block $~lib/array/Array#get:length|inlined.1 (result i32) + get_local $2 + i32.load offset=4 + end + i32.const 0 + i32.gt_s + if + get_local $2 + call $~lib/array/Array#pop + drop + br $continue|0 + end + end + end + block $~lib/array/Array#get:length|inlined.2 (result i32) get_local $0 i32.load set_local $3 @@ -2483,15 +2552,15 @@ i32.load offset=4 end set_local $3 - block $break|0 + block $break|1 i32.const 0 set_local $4 - loop $repeat|0 + loop $repeat|1 get_local $4 get_local $3 i32.lt_s i32.eqz - br_if $break|0 + br_if $break|1 get_local $0 i32.load get_local $4 @@ -2512,42 +2581,33 @@ i32.const 1 i32.add set_local $4 - br $repeat|0 + br $repeat|1 unreachable end unreachable end get_local $2 ) - (func $assembly/module/index/TypeSection#constructor (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/Section#constructor (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) get_local $0 if (result i32) get_local $0 else block (result i32) - i32.const 8 + i32.const 4 call $~lib/memory/memory.allocate set_local $2 get_local $2 - i32.const 0 + get_local $1 i32.store get_local $2 - i32.const 0 - i32.store offset=4 - get_local $2 end tee_local $0 end tee_local $0 - get_local $1 - i32.store - get_local $0 - i32.const 128 - i32.store offset=4 - get_local $0 ) - (func $assembly/buffer/index/Buffer#readVaruint (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVaruint (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2602,7 +2662,7 @@ i32.store offset=8 get_local $2 ) - (func $~lib/array/Array#constructor (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2661,7 +2721,7 @@ call $~lib/internal/memory/memset get_local $0 ) - (func $assembly/buffer/index/Buffer#readVarint (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2732,12 +2792,12 @@ end select ) - (func $assembly/buffer/index/Buffer#readVarint8 (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint8 (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 get_local $1 call $assembly/buffer/index/Buffer#readVarint ) - (func $assembly/module/index/FuncType#constructor (; 26 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $assembly/module/index/FuncType#constructor (; 28 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) get_local $0 if (result i32) @@ -2765,7 +2825,7 @@ end tee_local $0 ) - (func $~lib/array/Array#__set (; 27 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 29 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -2821,7 +2881,7 @@ get_local $2 i32.store offset=8 ) - (func $~lib/array/Array#constructor (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2880,7 +2940,7 @@ call $~lib/internal/memory/memset get_local $0 ) - (func $~lib/array/Array#__get (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#__get (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) get_local $0 @@ -2907,7 +2967,7 @@ unreachable end ) - (func $~lib/array/Array#__set (; 30 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -2963,7 +3023,7 @@ get_local $2 i32.store offset=8 ) - (func $~lib/internal/number/decimalCount32 (; 31 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/decimalCount32 (; 33 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 i32.const 100000 @@ -3032,7 +3092,7 @@ unreachable unreachable ) - (func $~lib/internal/string/allocateUnsafe (; 32 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocateUnsafe (; 34 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -3049,7 +3109,7 @@ i32.eqz if i32.const 0 - i32.const 144 + i32.const 128 i32.const 14 i32.const 2 call $~lib/env/abort @@ -3072,7 +3132,7 @@ i32.store get_local $2 ) - (func $~lib/internal/number/utoa32_lut (; 33 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/number/utoa32_lut (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -3082,7 +3142,7 @@ (local $9 i64) (local $10 i64) block $~lib/internal/number/DIGITS|inlined.0 (result i32) - i32.const 712 + i32.const 696 end i32.load set_local $3 @@ -3242,13 +3302,13 @@ i32.store16 offset=4 end ) - (func $~lib/internal/number/utoa32 (; 34 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/utoa32 (; 36 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 i32.eqz if - i32.const 136 + i32.const 120 return end get_local $0 @@ -3263,12 +3323,12 @@ call $~lib/internal/number/utoa32_lut get_local $2 ) - (func $~lib/internal/number/itoa (; 35 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa (; 37 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $~lib/internal/number/utoa32 return ) - (func $assembly/module/index/typeName (; 36 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/typeName (; 38 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $break|0 block $case7|0 @@ -3311,34 +3371,34 @@ br_if $case6|0 br $case7|0 end - i32.const 720 + i32.const 704 return end - i32.const 736 + i32.const 720 return end - i32.const 752 + i32.const 736 return end - i32.const 768 + i32.const 752 return end - i32.const 784 + i32.const 768 return end - i32.const 808 + i32.const 792 return end - i32.const 824 + i32.const 808 return end unreachable unreachable end unreachable - i32.const 840 + i32.const 824 ) - (func $~lib/array/Array#__get (; 37 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#__get (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) get_local $0 @@ -3365,7 +3425,7 @@ unreachable end ) - (func $~lib/internal/string/copyUnsafe (; 38 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) + (func $~lib/internal/string/copyUnsafe (; 40 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) @@ -3394,7 +3454,7 @@ get_local $7 call $~lib/internal/memory/memmove ) - (func $~lib/string/String#concat (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 41 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3406,7 +3466,7 @@ i32.eqz if i32.const 0 - i32.const 864 + i32.const 848 i32.const 110 i32.const 4 call $~lib/env/abort @@ -3416,7 +3476,7 @@ i32.const 0 i32.eq if - i32.const 848 + i32.const 832 set_local $1 end get_local $0 @@ -3433,7 +3493,7 @@ i32.const 0 i32.eq if - i32.const 840 + i32.const 824 return end get_local $4 @@ -3453,18 +3513,18 @@ call $~lib/internal/string/copyUnsafe get_local $5 ) - (func $~lib/string/String.__concat (; 40 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if - i32.const 848 + i32.const 832 set_local $0 end get_local $0 get_local $1 call $~lib/string/String#concat ) - (func $assembly/module/index/FuncType#toString (; 41 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/FuncType#toString (; 43 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -3478,7 +3538,7 @@ i32.load8_s offset=12 call $assembly/module/index/typeName set_local $2 - i32.const 840 + i32.const 824 set_local $3 block $break|0 i32.const 0 @@ -3517,7 +3577,7 @@ i32.lt_s if (result i32) get_local $3 - i32.const 896 + i32.const 880 call $~lib/string/String.__concat tee_local $3 else @@ -3550,32 +3610,32 @@ call $~lib/array/Array#__get call $assembly/module/index/typeName else - i32.const 904 + i32.const 888 end set_local $4 - i32.const 920 + i32.const 904 get_local $1 call $~lib/string/String.__concat - i32.const 896 + i32.const 880 call $~lib/string/String.__concat - i32.const 944 + i32.const 928 call $~lib/string/String.__concat get_local $2 call $~lib/string/String.__concat - i32.const 960 + i32.const 944 call $~lib/string/String.__concat get_local $3 call $~lib/string/String.__concat - i32.const 976 + i32.const 960 call $~lib/string/String.__concat get_local $4 call $~lib/string/String.__concat ) - (func $assembly/host/index/log (; 42 ;) (type $iv) (param $0 i32) + (func $assembly/host/index/log (; 44 ;) (type $iv) (param $0 i32) get_local $0 call $assembly/host/index/_log_str ) - (func $assembly/module/index/TypeSection#parse (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/TypeSection#parse (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3726,7 +3786,7 @@ end get_local $0 ) - (func $~lib/array/Array#push (; 44 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#push (; 46 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3788,7 +3848,7 @@ i32.store offset=8 get_local $5 ) - (func $~lib/array/Array#join (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 47 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3809,10 +3869,10 @@ i32.const 0 i32.lt_s if - i32.const 840 + i32.const 824 return end - i32.const 840 + i32.const 824 set_local $3 get_local $0 i32.load @@ -4006,11 +4066,11 @@ get_local $8 return ) - (func $assembly/module/index/TypeSection#toString (; 46 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/TypeSection#toString (; 48 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) - i32.const 1000 + i32.const 984 set_local $1 block $break|0 i32.const 0 @@ -4512,10 +4572,10 @@ unreachable end get_local $1 - i32.const 1008 + i32.const 992 call $~lib/array/Array#join ) - (func $assembly/index/getType (; 47 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/getType (; 49 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -4526,7 +4586,7 @@ get_local $1 i32.const 0 call $~lib/array/Array#__get - call $assembly/module/index/TypeSection#constructor + call $assembly/module/index/Section#constructor set_local $2 get_local $2 get_local $0 @@ -4536,40 +4596,33 @@ get_global $assembly/index/type call $assembly/module/index/TypeSection#toString ) - (func $assembly/index/toString (; 48 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/host/index/log (; 50 ;) (type $iv) (param $0 i32) get_local $0 - call $assembly/module/index/TypeSection#toString + call $assembly/host/index/_logi ) - (func $assembly/module/index/Module#constructor (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 51 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) - get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 8 - call $~lib/memory/memory.allocate - set_local $2 - get_local $2 - i32.const 0 - i32.store - get_local $2 - i32.const 0 - i32.store offset=4 - get_local $2 - end - tee_local $0 + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $1 + i32.const 268435454 + i32.gt_u + if + i32.const 0 + i32.const 24 + i32.const 45 + i32.const 39 + call $~lib/env/abort + unreachable end - tee_local $0 get_local $1 - i32.store offset=4 - get_local $0 - i32.const 1024 - i32.store - get_local $0 - ) - (func $assembly/index/Parser#constructor (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + i32.const 2 + i32.shl + set_local $2 + get_local $2 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 get_local $0 if (result i32) get_local $0 @@ -4577,28 +4630,36 @@ block (result i32) i32.const 8 call $~lib/memory/memory.allocate - set_local $2 - get_local $2 + set_local $4 + get_local $4 i32.const 0 i32.store - get_local $2 + get_local $4 i32.const 0 i32.store offset=4 - get_local $2 + get_local $4 end tee_local $0 end tee_local $0 - get_local $1 + get_local $3 i32.store get_local $0 - i32.const 0 get_local $1 - call $assembly/module/index/Module#constructor i32.store offset=4 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $4 + i32.const 0 + set_local $5 + get_local $4 + get_local $5 + get_local $2 + call $~lib/internal/memory/memset get_local $0 ) - (func $~lib/string/String.fromUTF8 (; 51 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.fromUTF8 (; 52 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4609,7 +4670,7 @@ i32.const 1 i32.lt_u if - i32.const 840 + i32.const 824 return end i32.const 0 @@ -4679,7 +4740,7 @@ i32.eqz if i32.const 0 - i32.const 864 + i32.const 848 i32.const 510 i32.const 8 call $~lib/env/abort @@ -4860,7 +4921,7 @@ i32.eqz if i32.const 0 - i32.const 864 + i32.const 848 i32.const 514 i32.const 8 call $~lib/env/abort @@ -4987,7 +5048,7 @@ i32.eqz if i32.const 0 - i32.const 864 + i32.const 848 i32.const 526 i32.const 8 call $~lib/env/abort @@ -5059,7 +5120,7 @@ i32.eqz if i32.const 0 - i32.const 864 + i32.const 848 i32.const 535 i32.const 4 call $~lib/env/abort @@ -5089,126 +5150,662 @@ end get_local $7 ) - (func $assembly/index/Parser#parseString (; 52 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - i32.load - i32.load offset=8 - get_local $0 - i32.load - i32.const 32 - call $assembly/buffer/index/Buffer#readVaruint - call $~lib/string/String.fromUTF8 - ) - (func $assembly/index/Parser#readVaruint (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.load - get_local $1 - call $assembly/buffer/index/Buffer#readVaruint - ) - (func $assembly/index/Parser#get:off (; 54 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - i32.load - i32.load offset=8 - ) - (func $assembly/index/Parser#set:off (; 55 ;) (type $iiv) (param $0 i32) (param $1 i32) - get_local $0 - i32.load - get_local $1 - i32.store offset=8 - ) - (func $assembly/buffer/index/Buffer#readUint (; 56 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readUint (; 53 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 i32.load offset=8 set_local $1 get_local $1 - i32.load + i32.load8_u set_local $2 get_local $0 get_local $1 - i32.const 4 + i32.const 1 i32.add i32.store offset=8 get_local $2 ) - (func $assembly/module/index/sectionName (; 57 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - block $break|0 - block $case12|0 - block $case11|0 - block $case10|0 - block $case9|0 - block $case8|0 - block $case7|0 - block $case6|0 - block $case5|0 - block $case4|0 - block $case3|0 - block $case2|0 - block $case1|0 - block $case0|0 - get_local $0 - set_local $1 - get_local $1 - i32.const 0 - i32.eq - br_if $case0|0 - get_local $1 - i32.const 1 - i32.eq - br_if $case1|0 - get_local $1 - i32.const 2 - i32.eq - br_if $case2|0 - get_local $1 - i32.const 3 - i32.eq - br_if $case3|0 - get_local $1 - i32.const 4 - i32.eq - br_if $case4|0 - get_local $1 - i32.const 5 - i32.eq - br_if $case5|0 - get_local $1 - i32.const 6 - i32.eq - br_if $case6|0 - get_local $1 - i32.const 7 - i32.eq - br_if $case7|0 - get_local $1 - i32.const 8 - i32.eq - br_if $case8|0 - get_local $1 - i32.const 9 - i32.eq - br_if $case9|0 - get_local $1 - i32.const 10 - i32.eq - br_if $case10|0 - get_local $1 - i32.const 11 - i32.eq - br_if $case11|0 - br $case12|0 - end - i32.const 1040 - return - end - i32.const 1056 - return - end - i32.const 1072 - return - end + (func $assembly/module/imports/Import#constructor (; 54 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (local $4 i32) + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 12 + call $~lib/memory/memory.allocate + set_local $4 + get_local $4 + get_local $1 + i32.store + get_local $4 + get_local $2 + i32.store offset=4 + get_local $4 + get_local $3 + i32.store offset=8 + get_local $4 + end + tee_local $0 + end + tee_local $0 + ) + (func $~lib/array/Array#__set (; 55 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.load + set_local $3 + get_local $3 + i32.load + i32.const 2 + i32.shr_u + set_local $4 + get_local $1 + get_local $4 + i32.ge_u + if + get_local $1 + i32.const 268435454 + i32.ge_u + if + i32.const 0 + i32.const 24 + i32.const 109 + i32.const 41 + call $~lib/env/abort + unreachable + end + get_local $3 + get_local $1 + i32.const 1 + i32.add + i32.const 2 + i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + set_local $3 + get_local $0 + get_local $3 + i32.store + get_local $0 + get_local $1 + i32.const 1 + i32.add + i32.store offset=4 + end + i32.const 0 + set_local $5 + get_local $3 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $5 + i32.add + get_local $2 + i32.store offset=8 + ) + (func $assembly/module/imports/Imports#parse (; 56 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + (local $13 i32) + (local $14 i32) + get_local $1 + get_local $0 + i32.load + i32.load offset=12 + i32.store offset=8 + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $2 + get_local $0 + i32.const 0 + get_local $2 + call $~lib/array/Array#constructor + i32.store offset=4 + block $break|0 + i32.const 0 + set_local $3 + loop $repeat|0 + get_local $3 + get_local $2 + i32.lt_u + i32.eqz + br_if $break|0 + block + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $4 + get_local $1 + i32.load offset=8 + set_local $5 + get_local $5 + get_local $4 + call $~lib/string/String.fromUTF8 + set_local $6 + get_local $1 + get_local $1 + i32.load offset=8 + get_local $4 + i32.add + i32.store offset=8 + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $7 + get_local $1 + i32.load offset=8 + set_local $8 + get_local $8 + get_local $7 + call $~lib/string/String.fromUTF8 + set_local $9 + get_local $1 + get_local $1 + i32.load offset=8 + get_local $7 + i32.add + i32.store offset=8 + get_local $1 + call $assembly/buffer/index/Buffer#readUint + set_local $10 + get_local $0 + i32.load offset=4 + get_local $3 + i32.const 0 + get_local $6 + get_local $9 + get_local $10 + call $assembly/module/imports/Import#constructor + call $~lib/array/Array#__set + block $break|1 + block $case4|1 + block $case3|1 + block $case2|1 + block $case1|1 + block $case0|1 + get_local $10 + set_local $11 + get_local $11 + get_global $src/common/ExternalKind.Function + i32.eq + br_if $case0|1 + get_local $11 + get_global $src/common/ExternalKind.Table + i32.eq + br_if $case1|1 + get_local $11 + get_global $src/common/ExternalKind.Memory + i32.eq + br_if $case2|1 + get_local $11 + get_global $src/common/ExternalKind.Global + i32.eq + br_if $case3|1 + br $case4|1 + end + block + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $11 + br $break|1 + unreachable + end + unreachable + end + block + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint + i32.const 127 + i32.and + set_local $11 + get_local $1 + i32.const 1 + call $assembly/buffer/index/Buffer#readVaruint + set_local $12 + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $13 + get_local $12 + i32.const 1 + i32.and + if (result i32) + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + else + get_global $src/common/MAX_ELEMS + end + set_local $14 + br $break|1 + unreachable + end + unreachable + end + block + get_local $1 + i32.const 1 + call $assembly/buffer/index/Buffer#readVaruint + set_local $14 + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $13 + get_local $14 + i32.const 1 + i32.and + if (result i32) + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + else + get_global $src/common/MAX_PAGES + end + set_local $12 + br $break|1 + unreachable + end + unreachable + end + block + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint + i32.const 127 + i32.and + set_local $12 + get_local $1 + i32.const 1 + call $assembly/buffer/index/Buffer#readVaruint + set_local $13 + br $break|1 + unreachable + end + unreachable + end + unreachable + end + end + get_local $3 + i32.const 1 + i32.add + set_local $3 + br $repeat|0 + unreachable + end + unreachable + end + get_local $0 + ) + (func $~lib/array/Array#push (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + i32.load offset=4 + set_local $2 + get_local $0 + i32.load + set_local $3 + get_local $3 + i32.load + i32.const 2 + i32.shr_u + set_local $4 + get_local $2 + i32.const 1 + i32.add + set_local $5 + get_local $2 + get_local $4 + i32.ge_u + if + get_local $2 + i32.const 268435454 + i32.ge_u + if + i32.const 0 + i32.const 24 + i32.const 184 + i32.const 42 + call $~lib/env/abort + unreachable + end + get_local $3 + get_local $5 + i32.const 2 + i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + set_local $3 + get_local $0 + get_local $3 + i32.store + end + get_local $0 + get_local $5 + i32.store offset=4 + i32.const 0 + set_local $6 + get_local $3 + get_local $2 + i32.const 2 + i32.shl + i32.add + get_local $6 + i32.add + get_local $1 + i32.store offset=8 + get_local $5 + ) + (func $assembly/module/index/Module#getImports (; 58 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + get_global $src/common/SectionId.Import + call $assembly/module/index/Module#getID + set_local $1 + i32.const 1008 + set_local $2 + block $~lib/array/Array#get:length|inlined.0 (result i32) + get_local $2 + i32.load offset=4 + end + call $assembly/host/index/log + block $break|0 + i32.const 0 + set_local $3 + loop $repeat|0 + get_local $3 + block $~lib/array/Array#get:length|inlined.4 (result i32) + get_local $1 + i32.load offset=4 + end + i32.lt_s + i32.eqz + br_if $break|0 + block + get_local $1 + get_local $3 + call $~lib/array/Array#__get + i32.load offset=16 + call $assembly/host/index/log + i32.const 0 + get_local $1 + get_local $3 + call $~lib/array/Array#__get + call $assembly/module/index/Section#constructor + set_local $4 + get_local $2 + get_local $4 + get_local $0 + i32.load offset=4 + call $assembly/module/imports/Imports#parse + call $~lib/array/Array#push + drop + block $~lib/array/Array#get:length|inlined.0 (result i32) + get_local $4 + i32.load offset=4 + set_local $5 + get_local $5 + i32.load offset=4 + end + call $assembly/host/index/log + end + get_local $3 + i32.const 1 + i32.add + set_local $3 + br $repeat|0 + unreachable + end + unreachable + end + get_local $2 + ) + (func $assembly/index/getImports (; 59 ;) (type $iv) (param $0 i32) + (local $1 i32) + (local $2 i32) + get_local $0 + call $assembly/module/index/Module#getImports + set_local $1 + block $~lib/array/Array#get:length|inlined.2 (result i32) + get_local $1 + i32.load offset=4 + end + i32.const 0 + i32.gt_s + if + block $break|0 + i32.const 0 + set_local $2 + loop $repeat|0 + get_local $2 + block $~lib/array/Array#get:length|inlined.4 (result i32) + get_local $1 + i32.load offset=4 + end + i32.lt_s + i32.eqz + br_if $break|0 + block $~lib/array/Array#get:length|inlined.5 (result i32) + get_local $1 + i32.load offset=4 + end + call $assembly/host/index/log + get_local $2 + i32.const 1 + i32.add + set_local $2 + br $repeat|0 + unreachable + end + unreachable + end + end + ) + (func $assembly/index/toString (; 60 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $assembly/module/index/TypeSection#toString + ) + (func $assembly/module/index/Module#constructor (; 61 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 8 + call $~lib/memory/memory.allocate + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + end + tee_local $0 + end + tee_local $0 + get_local $1 + i32.store offset=4 + get_local $0 + i32.const 1024 + i32.store + get_local $0 + ) + (func $assembly/index/Parser#constructor (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 8 + call $~lib/memory/memory.allocate + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + end + tee_local $0 + end + tee_local $0 + get_local $1 + i32.store + get_local $0 + i32.const 0 + get_local $1 + call $assembly/module/index/Module#constructor + i32.store offset=4 + get_local $0 + ) + (func $assembly/index/Parser#parseString (; 63 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load + i32.load offset=8 + get_local $0 + i32.load + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + call $~lib/string/String.fromUTF8 + ) + (func $assembly/index/Parser#readVaruint (; 64 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.load + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + ) + (func $assembly/index/Parser#get:off (; 65 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load + i32.load offset=8 + ) + (func $assembly/index/Parser#set:off (; 66 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + i32.load + get_local $1 + i32.store offset=8 + ) + (func $assembly/buffer/index/Buffer#readUint (; 67 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + i32.load offset=8 + set_local $1 + get_local $1 + i32.load + set_local $2 + get_local $0 + get_local $1 + i32.const 4 + i32.add + i32.store offset=8 + get_local $2 + ) + (func $assembly/module/index/sectionName (; 68 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + block $break|0 + block $case12|0 + block $case11|0 + block $case10|0 + block $case9|0 + block $case8|0 + block $case7|0 + block $case6|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + block $case0|0 + get_local $0 + set_local $1 + get_local $1 + i32.const 0 + i32.eq + br_if $case0|0 + get_local $1 + i32.const 1 + i32.eq + br_if $case1|0 + get_local $1 + i32.const 2 + i32.eq + br_if $case2|0 + get_local $1 + i32.const 3 + i32.eq + br_if $case3|0 + get_local $1 + i32.const 4 + i32.eq + br_if $case4|0 + get_local $1 + i32.const 5 + i32.eq + br_if $case5|0 + get_local $1 + i32.const 6 + i32.eq + br_if $case6|0 + get_local $1 + i32.const 7 + i32.eq + br_if $case7|0 + get_local $1 + i32.const 8 + i32.eq + br_if $case8|0 + get_local $1 + i32.const 9 + i32.eq + br_if $case9|0 + get_local $1 + i32.const 10 + i32.eq + br_if $case10|0 + get_local $1 + i32.const 11 + i32.eq + br_if $case11|0 + br $case12|0 + end + i32.const 1040 + return + end + i32.const 1056 + return + end + i32.const 1072 + return + end i32.const 1088 return end @@ -5240,9 +5837,9 @@ unreachable end unreachable - i32.const 840 + i32.const 824 ) - (func $assembly/module/index/SectionHeader#constructor (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/SectionHeader#constructor (; 69 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -5267,7 +5864,7 @@ i32.const 0 i32.store offset=12 get_local $2 - i32.const 840 + i32.const 824 i32.store offset=16 get_local $2 end @@ -5347,7 +5944,7 @@ i32.store offset=12 get_local $0 ) - (func $assembly/module/index/Module#parseSection (; 59 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/module/index/Module#parseSection (; 70 ;) (type $iiv) (param $0 i32) (param $1 i32) (local $2 i32) get_local $0 i32.load @@ -5370,14 +5967,14 @@ end end ) - (func $assembly/module/index/SectionHeader#get:end (; 60 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/SectionHeader#get:end (; 71 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=12 get_local $0 i32.load offset=8 i32.add ) - (func $assembly/index/Parser#parse (; 61 ;) (type $iv) (param $0 i32) + (func $assembly/index/Parser#parse (; 72 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -5443,12 +6040,12 @@ end end ) - (func $~lib/arraybuffer/ArrayBuffer#get:data (; 62 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/arraybuffer/ArrayBuffer#get:data (; 73 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $~lib/internal/arraybuffer/HEADER_SIZE i32.add ) - (func $assembly/buffer/index/Buffer#constructor (; 63 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#constructor (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) get_local $0 if (result i32) @@ -5485,7 +6082,7 @@ i32.store offset=4 get_local $0 ) - (func $assembly/index/newParser (; 64 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/newParser (; 75 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) i32.const 0 get_local $0 @@ -5495,13 +6092,13 @@ get_local $1 call $assembly/index/Parser#constructor ) - (func $assembly/index/parse (; 65 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/parse (; 76 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/index/Parser#parse get_local $0 i32.load offset=4 ) - (func $start (; 66 ;) (type $v) + (func $start (; 77 ;) (type $v) get_global $HEAP_BASE get_global $~lib/internal/allocator/AL_MASK i32.add @@ -5514,22 +6111,22 @@ set_global $~lib/allocator/arena/offset nop ) - (func $null (; 67 ;) (type $v) + (func $null (; 78 ;) (type $v) ) - (func $Parser#get:buf (; 68 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:buf (; 79 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) - (func $Parser#set:buf (; 69 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:buf (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store ) - (func $Parser#get:module (; 70 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:module (; 81 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) - (func $Parser#set:module (; 71 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:module (; 82 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store offset=4 diff --git a/lib/parse/package.json b/lib/parse/package.json index a08657e4d4..fbc28177e8 100644 --- a/lib/parse/package.json +++ b/lib/parse/package.json @@ -6,7 +6,7 @@ "types": "index.d.ts", "scripts": { "asbuild": "asc assembly/index.ts -O3 -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate", - "asbuild:untouched": "asc assembly/index.ts -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate", + "asbuild:untouched": "asc assembly/index.ts -b build/index.wasm -t build/index.wat --debug --importMemory --sourceMap --validate", "build": "npm run asbuild && webpack --mode production --display-modules", "test": "ts-node tests/" }, diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index dc187db5fc..bcc7b1d474 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -138,6 +138,7 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { debugger; let Mod = instance.parse(parserPtr); console.log(instance.getString((instance as any).getType(Mod))); + (instance as any).getImports(Mod); // let sections = buffer.slice(instance.I32[Mod], 2); // console.log(sections[1]) // let arrayBuf = sections[0]>>2; diff --git a/lib/parse/src/tsconfig.json b/lib/parse/src/tsconfig.json index 6aaa787469..f591a7986b 100644 --- a/lib/parse/src/tsconfig.json +++ b/lib/parse/src/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { - "module": "commonjs" + "module": "commonjs", + "target": "es2015" }, "include": [ "./**/*.ts" From 338bbd2cf7b35fdcb28bfa98b827c287d96f1836 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Sat, 5 Jan 2019 11:20:30 +0100 Subject: [PATCH 07/46] Remove start correctly. Now need to abstract to remove any section. --- lib/parse/assembly/buffer/index.ts | 7 + lib/parse/assembly/host/index.ts | 5 + lib/parse/assembly/index.ts | 57 +- lib/parse/assembly/module/index.ts | 72 +- lib/parse/build/index.wat | 1316 +++++++++++++++++++--------- lib/parse/src/index.ts | 20 +- lib/parse/tests/index.ts | 2 +- 7 files changed, 1057 insertions(+), 422 deletions(-) diff --git a/lib/parse/assembly/buffer/index.ts b/lib/parse/assembly/buffer/index.ts index 647a901440..36950eb5c6 100644 --- a/lib/parse/assembly/buffer/index.ts +++ b/lib/parse/assembly/buffer/index.ts @@ -4,14 +4,21 @@ export class Buffer { buffer: Uint8Array; length: usize; off: usize; + start: usize; + end: usize; /** Current offset in memory. */ constructor(array: Uint8Array){ this.buffer = array this.off = array.buffer.data; this.length = array.byteLength; + this.start = this.off; + this.end = this.off + this.length; } + reset(): void { + this.off = this.start; + } /** Reads an unsigned integer from memory. */ readUint(): u32 { diff --git a/lib/parse/assembly/host/index.ts b/lib/parse/assembly/host/index.ts index a5ab069c08..f9aadcfe6b 100644 --- a/lib/parse/assembly/host/index.ts +++ b/lib/parse/assembly/host/index.ts @@ -24,3 +24,8 @@ export function log(item: T):void { export function log_str(item: string): void { log(item); } + +export function err(message: string): void{ + log("Error: " + message); + unreachable(); +} diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index 9dcbff26b8..162f7592aa 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -20,6 +20,7 @@ import {log} from './host'; declare function debug():void; +log("in the start function!"); // type FunctionName = string | symbol; // type Instance = [Function, Object]; // @@ -68,7 +69,7 @@ export function getImports(m: Module): void { // log(imports.length); if (imports.length>0) for (let i = 0; i< imports.length; i++){ - log(imports.length); + // log(imports.length); // for (let j = 0; i< imports[i].imports.length; j++){ // let _import = imports[i].imports[j]; @@ -78,6 +79,40 @@ export function getImports(m: Module): void { // return } +export function removeStartFunction (m: Module): Uint8Array { + if (m.hasStart) { + let start : SectionHeader = m.getID(SectionId.Start)[0]; + log(start.toString()); + let len = start.end - start.ref; + log(len); + let buf = new Uint8Array(m.buf.length - len); + log(start.offset) + + for (let i:u32 = 0; i < start.offset; i++) { + buf[i] = m.buf.buffer[i]; + } + log("checking end index"); + log(m.buf.end); + log(m.buf.buffer); + log(m.buf.buffer[m.buf.length - 1]); + log(start.offset + len) + for (let i:u32 = start.offset + len; i < m.buf.length; i++) { + if ( i> m.buf.length - 8000) log(i); + buf[i-len] = m.buf.buffer[i]; + } + // memory.copy(buf.buffer.byteLength, m.buf.buffer.byteOffset, start.ref); + // memory.copy(buf.buffer.byteLength+start.end, m.buf.buffer.byteLength + start.end, m.buf.buffer.byteLength - start.end); + return buf; + } else { + return m.buf.buffer; + } + +} + +// export function exportDataSection(m: Module): Uint8Array { +// +// } + export function toString(t:TypeSection): string { return t.toString(); } @@ -108,18 +143,33 @@ export class Parser { /** Starts parsing the module that has been placed in memory. */ parse(): void { + log(this.buf.off) + log(this.buf.buffer.buffer.data) + log(this.buf.length) + let start = this.off; + log("starting") var magic = this.buf.readUint(); + log(magic); if (magic != 0x6D736100) unreachable(); var version = this.buf.readUint(); + log(version); if (version != 1) unreachable(); + log("Magic is valid"); var fun_space_index: u32 = 0; var glo_space_index: u32 = 0; var mem_space_index: u32 = 0; var tbl_space_index: u32 = 0; - while (this.buf.off < this.buf.length) { + while (this.buf.off < this.buf.end) { // log("parsing next section", true); let header: SectionHeader = new SectionHeader(this.buf); + log(header.toString()); this.module.parseSection(header); + log("---------") + log(this.off); + log(header.ref - start); + log(header.offset); + log(header.end - start); + log("---------"); this.off = header.end; // log(this.off); } @@ -130,7 +180,10 @@ export class Parser { } export function newParser(buf: Uint8Array): Parser { + log(buf); let buffer = new Buffer(buf); + log(buffer); + log(buffer.off) return new Parser(buffer); } export function parse(p: Parser): Module { diff --git a/lib/parse/assembly/module/index.ts b/lib/parse/assembly/module/index.ts index c24246863b..ee80c722b2 100644 --- a/lib/parse/assembly/module/index.ts +++ b/lib/parse/assembly/module/index.ts @@ -10,7 +10,7 @@ import { import {Buffer} from '../buffer'; -import {log, log_str} from "../host"; +import {log, err} from "../host"; import {itoa} from 'internal/number'; import { Imports } from "./imports"; @@ -19,33 +19,30 @@ type byte = u8; export class Module { - Headers: SectionHeader[]; + headers: SectionHeader[]; buf: Buffer; // Custom: TypeSection[]; constructor(buf: Buffer){ this.buf = buf; - this.Headers = []; + this.headers = []; } get Type(): SectionHeader[]{ return this.getID(SectionId.Type); } - // Import: TypeSection[]; - // Function: TypeSection[]; - // Table: TypeSection[]; - // Memory: TypeSection[]; - // Global: TypeSection[]; - // Export: TypeSection[]; - // Start: TypeSection[]; - // Element: TypeSection[]; - // Code: TypeSection[]; - // Data: TypeSection[]; + get hasStart(): boolean { + return this.start.length > 0; + } + + get start(): SectionHeader[] { + return this.getID(SectionId.Start) + } parseSection(header: SectionHeader): void { - this.Headers.push(header); + this.headers.push(header); switch (header.id){ case SectionId.Type: // this._Type.push(header); @@ -56,14 +53,16 @@ export class Module { } public getID(id: SectionId): SectionHeader[] { - let res: SectionHeader[] = []; + let res: SectionHeader[] = new Array(); while(res.length > 0){ res.pop(); } - let x: i32 = this.Headers.length; + let x: i32 = this.headers.length; + // log("length of array should be zero"); + // log(res.length) for (let i=0; i < x; i++){ - if (this.Headers[i].id == id){ - res.push(this.Headers[i]); + if (this.headers[i].id == id){ + res.push(this.headers[i]); } } return res; @@ -78,12 +77,11 @@ export class Module { getImports(): Imports[] { let ImportHeaders = this.getID(SectionId.Import); let imports: Imports[] = []; - log(imports.length); for (let i = 0; i < ImportHeaders.length; i++){ - log(ImportHeaders[i].name) + // log(ImportHeaders[i].name) let _import = new Imports(ImportHeaders[i]); imports.push(_import.parse(this.buf)); - log(_import.imports.length); + // log(_import.imports.length); } return imports; } @@ -107,7 +105,7 @@ function typeName(t: Type): string{ case 0x40: return 'none'; default: - unreachable(); + err("Incorrect Type"); } return "" } @@ -150,10 +148,13 @@ export class SectionHeader { public id: u32; public payload_len: u32; public payload_off: u32; + public offset: u32; + public name: string = ""; constructor (buf: Buffer){ this.ref = buf.off; + this.offset = this.ref - buf.start; this.id = buf.readVaruint(7); this.payload_len = buf.readVaruint(32); if (this.id == 0){ @@ -166,7 +167,8 @@ export class SectionHeader { } else if (this.id <= SectionId.Data){ this.name = sectionName(this.id); } else { - unreachable(); + log(this.ref); + err("no such ID: " + itoa(this.id)); } this.payload_off = buf.off; } @@ -175,6 +177,22 @@ export class SectionHeader { return this.payload_off + this.payload_len; } + + toString(): string { + let ref = itoa(this.ref); + let id = itoa(this.id); + let payloadLen = itoa(this.payload_len); + let payloadOff = itoa(this.payload_off); + let name = this.name; + let end = itoa(this.end); + return "ref: "+ ref + "\n" + + "id: " + id + "\n" + + "payload off: " + payloadOff + "\n" + + "payload length: " + payloadLen + "\n" + + "end: " + end + "\n" + + "name: " + name; + } + } export class Section { @@ -319,9 +337,9 @@ class Memory{ } } -class MemorySection { +class MemorySection extends Section { memory: Memory[]; - + parse(buf: Buffer): MemorySection { let count = buf.readVaruint(32); this.memory = new Array(count); @@ -337,6 +355,10 @@ class MemorySection { return this } } + +class Data extends Section { + +} /* case SectionId.Global: { let count = buf.readVaruint(32); diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index c6a82deb43..15cf4edc26 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -10,53 +10,67 @@ (type $iiiii (func (param i32 i32 i32 i32) (result i32))) (type $iiv (func (param i32 i32))) (import "env" "memory" (memory $0 1)) - (data (i32.const 8) "\00\00\00\00\00\00\00\00") - (data (i32.const 16) "\08\00\00\00\00\00\00\00") - (data (i32.const 24) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") - (data (i32.const 56) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") - (data (i32.const 120) "\01\00\00\000\00") - (data (i32.const 128) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 184) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\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 696) "\b8\00\00\00d\00\00\00") - (data (i32.const 704) "\03\00\00\00i\003\002\00") - (data (i32.const 720) "\03\00\00\00i\006\004\00") - (data (i32.const 736) "\03\00\00\00f\003\002\00") - (data (i32.const 752) "\03\00\00\00f\006\004\00") - (data (i32.const 768) "\07\00\00\00a\00n\00y\00f\00u\00n\00c\00") - (data (i32.const 792) "\04\00\00\00f\00u\00n\00c\00") - (data (i32.const 808) "\04\00\00\00n\00o\00n\00e\00") - (data (i32.const 824) "\00\00\00\00") - (data (i32.const 832) "\04\00\00\00n\00u\00l\00l\00") - (data (i32.const 848) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 880) "\02\00\00\00,\00 \00") - (data (i32.const 888) "\04\00\00\00v\00o\00i\00d\00") - (data (i32.const 904) "\07\00\00\00i\00n\00d\00e\00x\00:\00 \00") - (data (i32.const 928) "\06\00\00\00f\00o\00r\00m\00:\00 \00") - (data (i32.const 944) "\03\00\00\00,\00 \00(\00") - (data (i32.const 960) "\05\00\00\00)\00 \00=\00>\00 \00") - (data (i32.const 976) "\00\00\00\00\00\00\00\00") - (data (i32.const 984) "\d0\03\00\00\00\00\00\00") - (data (i32.const 992) "\01\00\00\00\n\00") - (data (i32.const 1000) "\00\00\00\00\00\00\00\00") - (data (i32.const 1008) "\e8\03\00\00\00\00\00\00") - (data (i32.const 1016) "\00\00\00\00\00\00\00\00") - (data (i32.const 1024) "\f8\03\00\00\00\00\00\00") - (data (i32.const 1032) "\01\00\00\00\'\00") - (data (i32.const 1040) "\06\00\00\00C\00u\00s\00t\00o\00m\00") - (data (i32.const 1056) "\04\00\00\00T\00y\00p\00e\00") - (data (i32.const 1072) "\06\00\00\00I\00m\00p\00o\00r\00t\00") - (data (i32.const 1088) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n\00") - (data (i32.const 1112) "\05\00\00\00T\00a\00b\00l\00e\00") - (data (i32.const 1128) "\06\00\00\00M\00e\00m\00o\00r\00y\00") - (data (i32.const 1144) "\06\00\00\00G\00l\00o\00b\00a\00l\00") - (data (i32.const 1160) "\06\00\00\00E\00x\00p\00o\00r\00t\00") - (data (i32.const 1176) "\05\00\00\00S\00t\00a\00r\00t\00") - (data (i32.const 1192) "\07\00\00\00E\00l\00e\00m\00e\00n\00t\00") - (data (i32.const 1216) "\04\00\00\00C\00o\00d\00e\00") - (data (i32.const 1232) "\04\00\00\00D\00a\00t\00a\00") - (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) + (data (i32.const 8) "\16\00\00\00i\00n\00 \00t\00h\00e\00 \00s\00t\00a\00r\00t\00 \00f\00u\00n\00c\00t\00i\00o\00n\00!\00") + (data (i32.const 56) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") + (data (i32.const 88) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") + (data (i32.const 152) "\01\00\00\000\00") + (data (i32.const 160) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 216) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\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 728) "\d8\00\00\00d\00\00\00") + (data (i32.const 736) "\03\00\00\00i\003\002\00") + (data (i32.const 752) "\03\00\00\00i\006\004\00") + (data (i32.const 768) "\03\00\00\00f\003\002\00") + (data (i32.const 784) "\03\00\00\00f\006\004\00") + (data (i32.const 800) "\07\00\00\00a\00n\00y\00f\00u\00n\00c\00") + (data (i32.const 824) "\04\00\00\00f\00u\00n\00c\00") + (data (i32.const 840) "\04\00\00\00n\00o\00n\00e\00") + (data (i32.const 856) "\0e\00\00\00I\00n\00c\00o\00r\00r\00e\00c\00t\00 \00T\00y\00p\00e\00") + (data (i32.const 888) "\07\00\00\00E\00r\00r\00o\00r\00:\00 \00") + (data (i32.const 912) "\04\00\00\00n\00u\00l\00l\00") + (data (i32.const 928) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 960) "\00\00\00\00") + (data (i32.const 968) "\02\00\00\00,\00 \00") + (data (i32.const 976) "\04\00\00\00v\00o\00i\00d\00") + (data (i32.const 992) "\07\00\00\00i\00n\00d\00e\00x\00:\00 \00") + (data (i32.const 1016) "\06\00\00\00f\00o\00r\00m\00:\00 \00") + (data (i32.const 1032) "\03\00\00\00,\00 \00(\00") + (data (i32.const 1048) "\05\00\00\00)\00 \00=\00>\00 \00") + (data (i32.const 1064) "\00\00\00\00\00\00\00\00") + (data (i32.const 1072) "(\04\00\00\00\00\00\00") + (data (i32.const 1080) "\01\00\00\00\n\00") + (data (i32.const 1088) "\00\00\00\00\00\00\00\00") + (data (i32.const 1096) "@\04\00\00\00\00\00\00") + (data (i32.const 1104) "\05\00\00\00r\00e\00f\00:\00 \00") + (data (i32.const 1120) "\04\00\00\00i\00d\00:\00 \00") + (data (i32.const 1136) "\0d\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00o\00f\00f\00:\00 \00") + (data (i32.const 1168) "\10\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00l\00e\00n\00g\00t\00h\00:\00 \00") + (data (i32.const 1208) "\05\00\00\00e\00n\00d\00:\00 \00") + (data (i32.const 1224) "\06\00\00\00n\00a\00m\00e\00:\00 \00") + (data (i32.const 1240) "\1b\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00t\00y\00p\00e\00d\00a\00r\00r\00a\00y\00.\00t\00s\00") + (data (i32.const 1304) "\12\00\00\00c\00h\00e\00c\00k\00i\00n\00g\00 \00e\00n\00d\00 \00i\00n\00d\00e\00x\00") + (data (i32.const 1344) "\00\00\00\00\00\00\00\00") + (data (i32.const 1352) "@\05\00\00\00\00\00\00") + (data (i32.const 1360) "\08\00\00\00s\00t\00a\00r\00t\00i\00n\00g\00") + (data (i32.const 1384) "\0e\00\00\00M\00a\00g\00i\00c\00 \00i\00s\00 \00v\00a\00l\00i\00d\00") + (data (i32.const 1416) "\01\00\00\00\'\00") + (data (i32.const 1424) "\06\00\00\00C\00u\00s\00t\00o\00m\00") + (data (i32.const 1440) "\04\00\00\00T\00y\00p\00e\00") + (data (i32.const 1456) "\06\00\00\00I\00m\00p\00o\00r\00t\00") + (data (i32.const 1472) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n\00") + (data (i32.const 1496) "\05\00\00\00T\00a\00b\00l\00e\00") + (data (i32.const 1512) "\06\00\00\00M\00e\00m\00o\00r\00y\00") + (data (i32.const 1528) "\06\00\00\00G\00l\00o\00b\00a\00l\00") + (data (i32.const 1544) "\06\00\00\00E\00x\00p\00o\00r\00t\00") + (data (i32.const 1560) "\05\00\00\00S\00t\00a\00r\00t\00") + (data (i32.const 1576) "\07\00\00\00E\00l\00e\00m\00e\00n\00t\00") + (data (i32.const 1600) "\04\00\00\00C\00o\00d\00e\00") + (data (i32.const 1616) "\04\00\00\00D\00a\00t\00a\00") + (data (i32.const 1632) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 \00") + (data (i32.const 1664) "\t\00\00\00-\00-\00-\00-\00-\00-\00-\00-\00-\00") (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) + (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) + (import "index" "_log" (func $assembly/host/index/_log (param i32 i32))) (table $0 1 anyfunc) (elem (i32.const 0) $null) (global $src/common/MAX_PAGES i32 (i32.const 65535)) @@ -124,11 +138,12 @@ (global $src/common/ExternalKind.Table (mut i32) (i32.const 1)) (global $src/common/ExternalKind.Memory (mut i32) (i32.const 2)) (global $src/common/ExternalKind.Global (mut i32) (i32.const 3)) - (global $HEAP_BASE i32 (i32.const 1244)) + (global $HEAP_BASE i32 (i32.const 1688)) (export "memory" (memory $0)) (export "table" (table $0)) (export "getType" (func $assembly/index/getType)) (export "getImports" (func $assembly/index/getImports)) + (export "removeStartFunction" (func $assembly/index/removeStartFunction)) (export "toString" (func $assembly/index/toString)) (export "Parser#constructor" (func $assembly/index/Parser#constructor)) (export "Parser#get:buf" (func $Parser#get:buf)) @@ -149,7 +164,7 @@ (export "memory.free" (func $~lib/memory/memory.free)) (export "memory.reset" (func $~lib/memory/memory.reset)) (start $start) - (func $~lib/internal/memory/memset (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) <<<<<<< loader-memory-accessors get_global $assembly/index/off @@ -644,13 +659,13 @@ end end ) - (func $~lib/memory/memory.fill (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/memory.fill (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memset ) - (func $~lib/internal/memory/memcpy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memcpy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -1851,7 +1866,7 @@ i32.store8 end ) - (func $~lib/internal/memory/memmove (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memmove (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) get_local $0 get_local $1 @@ -2078,13 +2093,13 @@ end end ) - (func $~lib/memory/memory.copy (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/memory.copy (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memmove ) - (func $~lib/internal/memory/memcmp (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/memory/memcmp (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) get_local $0 get_local $1 @@ -2138,13 +2153,13 @@ i32.const 0 end ) - (func $~lib/memory/memory.compare (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/memory/memory.compare (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memcmp ) - (func $~lib/allocator/arena/__memory_allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/allocator/arena/__memory_allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2223,28 +2238,132 @@ set_global $~lib/allocator/arena/offset get_local $1 ) - (func $~lib/memory/memory.allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/memory/memory.allocate (; 12 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $~lib/allocator/arena/__memory_allocate return ) - (func $~lib/allocator/arena/__memory_free (; 12 ;) (type $iv) (param $0 i32) + (func $~lib/allocator/arena/__memory_free (; 13 ;) (type $iv) (param $0 i32) nop ) - (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) + (func $~lib/memory/memory.free (; 14 ;) (type $iv) (param $0 i32) get_local $0 call $~lib/allocator/arena/__memory_free return ) - (func $~lib/allocator/arena/__memory_reset (; 14 ;) (type $v) + (func $~lib/allocator/arena/__memory_reset (; 15 ;) (type $v) get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset ) - (func $~lib/memory/memory.reset (; 15 ;) (type $v) + (func $~lib/memory/memory.reset (; 16 ;) (type $v) call $~lib/allocator/arena/__memory_reset return ) - (func $~lib/array/Array#pop (; 16 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/host/index/log (; 17 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_log_str + ) + (func $~lib/internal/arraybuffer/computeSize (; 18 ;) (type $ii) (param $0 i32) (result i32) + i32.const 1 + i32.const 32 + get_local $0 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + i32.const 1 + i32.sub + i32.clz + i32.sub + i32.shl + ) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 19 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + get_global $~lib/internal/arraybuffer/MAX_BLENGTH + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 88 + i32.const 26 + i32.const 2 + call $~lib/env/abort + unreachable + end + block $~lib/memory/memory.allocate|inlined.0 (result i32) + get_local $0 + call $~lib/internal/arraybuffer/computeSize + set_local $2 + get_local $2 + call $~lib/allocator/arena/__memory_allocate + br $~lib/memory/memory.allocate|inlined.0 + end + set_local $1 + get_local $1 + get_local $0 + i32.store + get_local $1 + ) + (func $~lib/array/Array#constructor (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $1 + i32.const 268435454 + i32.gt_u + if + i32.const 0 + i32.const 56 + i32.const 45 + i32.const 39 + call $~lib/env/abort + unreachable + end + get_local $1 + i32.const 2 + i32.shl + set_local $2 + get_local $2 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 8 + call $~lib/memory/memory.allocate + set_local $4 + get_local $4 + i32.const 0 + i32.store + get_local $4 + i32.const 0 + i32.store offset=4 + get_local $4 + end + tee_local $0 + end + tee_local $0 + get_local $3 + i32.store + get_local $0 + get_local $1 + i32.store offset=4 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $4 + i32.const 0 + set_local $5 + get_local $4 + get_local $5 + get_local $2 + call $~lib/internal/memory/memset + get_local $0 + ) + (func $~lib/array/Array#pop (; 21 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2258,7 +2377,7 @@ i32.lt_s if i32.const 0 - i32.const 24 + i32.const 56 i32.const 246 i32.const 20 call $~lib/env/abort @@ -2290,7 +2409,7 @@ i32.store offset=4 get_local $5 ) - (func $~lib/array/Array#__get (; 17 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#__get (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) get_local $0 @@ -2317,48 +2436,7 @@ unreachable end ) - (func $~lib/internal/arraybuffer/computeSize (; 18 ;) (type $ii) (param $0 i32) (result i32) - i32.const 1 - i32.const 32 - get_local $0 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - i32.const 1 - i32.sub - i32.clz - i32.sub - i32.shl - ) - (func $~lib/internal/arraybuffer/allocateUnsafe (; 19 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - get_local $0 - get_global $~lib/internal/arraybuffer/MAX_BLENGTH - i32.le_u - i32.eqz - if - i32.const 0 - i32.const 56 - i32.const 26 - i32.const 2 - call $~lib/env/abort - unreachable - end - block $~lib/memory/memory.allocate|inlined.0 (result i32) - get_local $0 - call $~lib/internal/arraybuffer/computeSize - set_local $2 - get_local $2 - call $~lib/allocator/arena/__memory_allocate - br $~lib/memory/memory.allocate|inlined.0 - end - set_local $1 - get_local $1 - get_local $0 - i32.store - get_local $1 - ) - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2376,7 +2454,7 @@ i32.eqz if i32.const 0 - i32.const 56 + i32.const 88 i32.const 40 i32.const 4 call $~lib/env/abort @@ -2447,7 +2525,7 @@ i32.eqz if i32.const 0 - i32.const 56 + i32.const 88 i32.const 62 i32.const 4 call $~lib/env/abort @@ -2460,7 +2538,7 @@ end get_local $0 ) - (func $~lib/array/Array#push (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#push (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2490,7 +2568,7 @@ i32.ge_u if i32.const 0 - i32.const 24 + i32.const 56 i32.const 184 i32.const 42 call $~lib/env/abort @@ -2522,11 +2600,13 @@ i32.store offset=8 get_local $5 ) - (func $assembly/module/index/Module#getID (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/Module#getID (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) - i32.const 16 + i32.const 0 + i32.const 0 + call $~lib/array/Array#constructor set_local $2 block $break|0 loop $continue|0 @@ -2588,7 +2668,7 @@ end get_local $2 ) - (func $assembly/module/index/Section#constructor (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/Section#constructor (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) get_local $0 if (result i32) @@ -2607,7 +2687,7 @@ end tee_local $0 ) - (func $assembly/buffer/index/Buffer#readVaruint (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVaruint (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2662,7 +2742,7 @@ i32.store offset=8 get_local $2 ) - (func $~lib/array/Array#constructor (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2672,7 +2752,7 @@ i32.gt_u if i32.const 0 - i32.const 24 + i32.const 56 i32.const 45 i32.const 39 call $~lib/env/abort @@ -2721,7 +2801,7 @@ call $~lib/internal/memory/memset get_local $0 ) - (func $assembly/buffer/index/Buffer#readVarint (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2792,12 +2872,12 @@ end select ) - (func $assembly/buffer/index/Buffer#readVarint8 (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint8 (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 get_local $1 call $assembly/buffer/index/Buffer#readVarint ) - (func $assembly/module/index/FuncType#constructor (; 28 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $assembly/module/index/FuncType#constructor (; 31 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) get_local $0 if (result i32) @@ -2825,7 +2905,7 @@ end tee_local $0 ) - (func $~lib/array/Array#__set (; 29 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -2846,7 +2926,7 @@ i32.ge_u if i32.const 0 - i32.const 24 + i32.const 56 i32.const 109 i32.const 41 call $~lib/env/abort @@ -2881,7 +2961,7 @@ get_local $2 i32.store offset=8 ) - (func $~lib/array/Array#constructor (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 33 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2891,7 +2971,7 @@ i32.gt_u if i32.const 0 - i32.const 24 + i32.const 56 i32.const 45 i32.const 39 call $~lib/env/abort @@ -2940,7 +3020,7 @@ call $~lib/internal/memory/memset get_local $0 ) - (func $~lib/array/Array#__get (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#__get (; 34 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) get_local $0 @@ -2967,7 +3047,7 @@ unreachable end ) - (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -2988,7 +3068,7 @@ i32.ge_u if i32.const 0 - i32.const 24 + i32.const 56 i32.const 109 i32.const 41 call $~lib/env/abort @@ -3023,7 +3103,7 @@ get_local $2 i32.store offset=8 ) - (func $~lib/internal/number/decimalCount32 (; 33 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/decimalCount32 (; 36 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 i32.const 100000 @@ -3092,7 +3172,7 @@ unreachable unreachable ) - (func $~lib/internal/string/allocateUnsafe (; 34 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocateUnsafe (; 37 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -3109,7 +3189,7 @@ i32.eqz if i32.const 0 - i32.const 128 + i32.const 160 i32.const 14 i32.const 2 call $~lib/env/abort @@ -3132,7 +3212,7 @@ i32.store get_local $2 ) - (func $~lib/internal/number/utoa32_lut (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/number/utoa32_lut (; 38 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -3142,7 +3222,7 @@ (local $9 i64) (local $10 i64) block $~lib/internal/number/DIGITS|inlined.0 (result i32) - i32.const 696 + i32.const 728 end i32.load set_local $3 @@ -3302,13 +3382,13 @@ i32.store16 offset=4 end ) - (func $~lib/internal/number/utoa32 (; 36 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/utoa32 (; 39 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 i32.eqz if - i32.const 120 + i32.const 152 return end get_local $0 @@ -3323,109 +3403,12 @@ call $~lib/internal/number/utoa32_lut get_local $2 ) - (func $~lib/internal/number/itoa (; 37 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa (; 40 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $~lib/internal/number/utoa32 return ) - (func $assembly/module/index/typeName (; 38 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - block $break|0 - block $case7|0 - block $case6|0 - block $case5|0 - block $case4|0 - block $case3|0 - block $case2|0 - block $case1|0 - block $case0|0 - get_local $0 - set_local $1 - get_local $1 - i32.const 127 - i32.eq - br_if $case0|0 - get_local $1 - i32.const 126 - i32.eq - br_if $case1|0 - get_local $1 - i32.const 125 - i32.eq - br_if $case2|0 - get_local $1 - i32.const 124 - i32.eq - br_if $case3|0 - get_local $1 - i32.const 112 - i32.eq - br_if $case4|0 - get_local $1 - i32.const 96 - i32.eq - br_if $case5|0 - get_local $1 - i32.const 64 - i32.eq - br_if $case6|0 - br $case7|0 - end - i32.const 704 - return - end - i32.const 720 - return - end - i32.const 736 - return - end - i32.const 752 - return - end - i32.const 768 - return - end - i32.const 792 - return - end - i32.const 808 - return - end - unreachable - unreachable - end - unreachable - i32.const 824 - ) - (func $~lib/array/Array#__get (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - get_local $0 - i32.load - set_local $2 - get_local $1 - get_local $2 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - i32.const 0 - set_local $3 - get_local $2 - get_local $1 - i32.const 2 - i32.shl - i32.add - get_local $3 - i32.add - i32.load offset=8 - else - unreachable - end - ) - (func $~lib/internal/string/copyUnsafe (; 40 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) + (func $~lib/internal/string/copyUnsafe (; 41 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) @@ -3454,7 +3437,7 @@ get_local $7 call $~lib/internal/memory/memmove ) - (func $~lib/string/String#concat (; 41 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3466,7 +3449,7 @@ i32.eqz if i32.const 0 - i32.const 848 + i32.const 928 i32.const 110 i32.const 4 call $~lib/env/abort @@ -3476,7 +3459,7 @@ i32.const 0 i32.eq if - i32.const 832 + i32.const 912 set_local $1 end get_local $0 @@ -3493,7 +3476,7 @@ i32.const 0 i32.eq if - i32.const 824 + i32.const 960 return end get_local $4 @@ -3513,32 +3496,135 @@ call $~lib/internal/string/copyUnsafe get_local $5 ) - (func $~lib/string/String.__concat (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if - i32.const 832 + i32.const 912 set_local $0 end get_local $0 get_local $1 call $~lib/string/String#concat ) - (func $assembly/module/index/FuncType#toString (; 43 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $0 - i32.load offset=8 - call $~lib/internal/number/itoa - set_local $1 + (func $assembly/host/index/err (; 44 ;) (type $iv) (param $0 i32) + i32.const 888 get_local $0 - i32.load8_s offset=12 - call $assembly/module/index/typeName + call $~lib/string/String.__concat + call $assembly/host/index/log + unreachable + ) + (func $assembly/module/index/typeName (; 45 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + block $break|0 + block $case7|0 + block $case6|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + block $case0|0 + get_local $0 + set_local $1 + get_local $1 + i32.const 127 + i32.eq + br_if $case0|0 + get_local $1 + i32.const 126 + i32.eq + br_if $case1|0 + get_local $1 + i32.const 125 + i32.eq + br_if $case2|0 + get_local $1 + i32.const 124 + i32.eq + br_if $case3|0 + get_local $1 + i32.const 112 + i32.eq + br_if $case4|0 + get_local $1 + i32.const 96 + i32.eq + br_if $case5|0 + get_local $1 + i32.const 64 + i32.eq + br_if $case6|0 + br $case7|0 + end + i32.const 736 + return + end + i32.const 752 + return + end + i32.const 768 + return + end + i32.const 784 + return + end + i32.const 800 + return + end + i32.const 824 + return + end + i32.const 840 + return + end + i32.const 856 + call $assembly/host/index/err + end + i32.const 960 + ) + (func $~lib/array/Array#__get (; 46 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + get_local $0 + i32.load + set_local $2 + get_local $1 + get_local $2 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + i32.const 0 + set_local $3 + get_local $2 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + ) + (func $assembly/module/index/FuncType#toString (; 47 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.load offset=8 + call $~lib/internal/number/itoa + set_local $1 + get_local $0 + i32.load8_s offset=12 + call $assembly/module/index/typeName set_local $2 - i32.const 824 + i32.const 960 set_local $3 block $break|0 i32.const 0 @@ -3577,7 +3663,7 @@ i32.lt_s if (result i32) get_local $3 - i32.const 880 + i32.const 968 call $~lib/string/String.__concat tee_local $3 else @@ -3610,32 +3696,28 @@ call $~lib/array/Array#__get call $assembly/module/index/typeName else - i32.const 888 + i32.const 976 end set_local $4 - i32.const 904 + i32.const 992 get_local $1 call $~lib/string/String.__concat - i32.const 880 + i32.const 968 call $~lib/string/String.__concat - i32.const 928 + i32.const 1016 call $~lib/string/String.__concat get_local $2 call $~lib/string/String.__concat - i32.const 944 + i32.const 1032 call $~lib/string/String.__concat get_local $3 call $~lib/string/String.__concat - i32.const 960 + i32.const 1048 call $~lib/string/String.__concat get_local $4 call $~lib/string/String.__concat ) - (func $assembly/host/index/log (; 44 ;) (type $iv) (param $0 i32) - get_local $0 - call $assembly/host/index/_log_str - ) - (func $assembly/module/index/TypeSection#parse (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/TypeSection#parse (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3786,7 +3868,7 @@ end get_local $0 ) - (func $~lib/array/Array#push (; 46 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#push (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3816,7 +3898,7 @@ i32.ge_u if i32.const 0 - i32.const 24 + i32.const 56 i32.const 184 i32.const 42 call $~lib/env/abort @@ -3848,7 +3930,7 @@ i32.store offset=8 get_local $5 ) - (func $~lib/array/Array#join (; 47 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3869,10 +3951,10 @@ i32.const 0 i32.lt_s if - i32.const 824 + i32.const 960 return end - i32.const 824 + i32.const 960 set_local $3 get_local $0 i32.load @@ -4066,11 +4148,11 @@ get_local $8 return ) - (func $assembly/module/index/TypeSection#toString (; 48 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/TypeSection#toString (; 51 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) - i32.const 984 + i32.const 1072 set_local $1 block $break|0 i32.const 0 @@ -4572,10 +4654,10 @@ unreachable end get_local $1 - i32.const 992 + i32.const 1080 call $~lib/array/Array#join ) - (func $assembly/index/getType (; 49 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/getType (; 52 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -4596,11 +4678,7 @@ get_global $assembly/index/type call $assembly/module/index/TypeSection#toString ) - (func $assembly/host/index/log (; 50 ;) (type $iv) (param $0 i32) - get_local $0 - call $assembly/host/index/_logi - ) - (func $~lib/array/Array#constructor (; 51 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4610,7 +4688,7 @@ i32.gt_u if i32.const 0 - i32.const 24 + i32.const 56 i32.const 45 i32.const 39 call $~lib/env/abort @@ -4659,7 +4737,7 @@ call $~lib/internal/memory/memset get_local $0 ) - (func $~lib/string/String.fromUTF8 (; 52 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.fromUTF8 (; 54 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4670,7 +4748,7 @@ i32.const 1 i32.lt_u if - i32.const 824 + i32.const 960 return end i32.const 0 @@ -4740,7 +4818,7 @@ i32.eqz if i32.const 0 - i32.const 848 + i32.const 928 i32.const 510 i32.const 8 call $~lib/env/abort @@ -4921,7 +4999,7 @@ i32.eqz if i32.const 0 - i32.const 848 + i32.const 928 i32.const 514 i32.const 8 call $~lib/env/abort @@ -5048,7 +5126,7 @@ i32.eqz if i32.const 0 - i32.const 848 + i32.const 928 i32.const 526 i32.const 8 call $~lib/env/abort @@ -5120,7 +5198,7 @@ i32.eqz if i32.const 0 - i32.const 848 + i32.const 928 i32.const 535 i32.const 4 call $~lib/env/abort @@ -5150,7 +5228,7 @@ end get_local $7 ) - (func $assembly/buffer/index/Buffer#readUint (; 53 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readUint (; 55 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -5166,7 +5244,7 @@ i32.store offset=8 get_local $2 ) - (func $assembly/module/imports/Import#constructor (; 54 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (func $assembly/module/imports/Import#constructor (; 56 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) get_local $0 if (result i32) @@ -5191,7 +5269,7 @@ end tee_local $0 ) - (func $~lib/array/Array#__set (; 55 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 57 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -5212,7 +5290,7 @@ i32.ge_u if i32.const 0 - i32.const 24 + i32.const 56 i32.const 109 i32.const 41 call $~lib/env/abort @@ -5247,7 +5325,7 @@ get_local $2 i32.store offset=8 ) - (func $assembly/module/imports/Imports#parse (; 56 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/imports/Imports#parse (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -5453,7 +5531,7 @@ end get_local $0 ) - (func $~lib/array/Array#push (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#push (; 59 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -5483,7 +5561,7 @@ i32.ge_u if i32.const 0 - i32.const 24 + i32.const 56 i32.const 184 i32.const 42 call $~lib/env/abort @@ -5515,23 +5593,17 @@ i32.store offset=8 get_local $5 ) - (func $assembly/module/index/Module#getImports (; 58 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#getImports (; 60 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) - (local $5 i32) get_local $0 get_global $src/common/SectionId.Import call $assembly/module/index/Module#getID set_local $1 - i32.const 1008 + i32.const 1096 set_local $2 - block $~lib/array/Array#get:length|inlined.0 (result i32) - get_local $2 - i32.load offset=4 - end - call $assembly/host/index/log block $break|0 i32.const 0 set_local $3 @@ -5545,11 +5617,6 @@ i32.eqz br_if $break|0 block - get_local $1 - get_local $3 - call $~lib/array/Array#__get - i32.load offset=16 - call $assembly/host/index/log i32.const 0 get_local $1 get_local $3 @@ -5563,14 +5630,6 @@ call $assembly/module/imports/Imports#parse call $~lib/array/Array#push drop - block $~lib/array/Array#get:length|inlined.0 (result i32) - get_local $4 - i32.load offset=4 - set_local $5 - get_local $5 - i32.load offset=4 - end - call $assembly/host/index/log end get_local $3 i32.const 1 @@ -5583,13 +5642,13 @@ end get_local $2 ) - (func $assembly/index/getImports (; 59 ;) (type $iv) (param $0 i32) + (func $assembly/index/getImports (; 61 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) get_local $0 call $assembly/module/index/Module#getImports set_local $1 - block $~lib/array/Array#get:length|inlined.2 (result i32) + block $~lib/array/Array#get:length|inlined.1 (result i32) get_local $1 i32.load offset=4 end @@ -5601,18 +5660,14 @@ set_local $2 loop $repeat|0 get_local $2 - block $~lib/array/Array#get:length|inlined.4 (result i32) + block $~lib/array/Array#get:length|inlined.3 (result i32) get_local $1 i32.load offset=4 end i32.lt_s i32.eqz br_if $break|0 - block $~lib/array/Array#get:length|inlined.5 (result i32) - get_local $1 - i32.load offset=4 - end - call $assembly/host/index/log + nop get_local $2 i32.const 1 i32.add @@ -5624,39 +5679,427 @@ end end ) - (func $assembly/index/toString (; 60 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:start (; 62 ;) (type $ii) (param $0 i32) (result i32) get_local $0 - call $assembly/module/index/TypeSection#toString + get_global $src/common/SectionId.Start + call $assembly/module/index/Module#getID + ) + (func $assembly/module/index/Module#get:hasStart (; 63 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + block $~lib/array/Array#get:length|inlined.5 (result i32) + get_local $0 + call $assembly/module/index/Module#get:start + set_local $1 + get_local $1 + i32.load offset=4 + end + i32.const 0 + i32.gt_s + ) + (func $assembly/module/index/SectionHeader#get:end (; 64 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load offset=12 + get_local $0 + i32.load offset=8 + i32.add + ) + (func $assembly/module/index/SectionHeader#toString (; 65 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + i32.load + call $~lib/internal/number/itoa + set_local $1 + get_local $0 + i32.load offset=4 + call $~lib/internal/number/itoa + set_local $2 + get_local $0 + i32.load offset=8 + call $~lib/internal/number/itoa + set_local $3 + get_local $0 + i32.load offset=12 + call $~lib/internal/number/itoa + set_local $4 + get_local $0 + i32.load offset=20 + set_local $5 + get_local $0 + call $assembly/module/index/SectionHeader#get:end + call $~lib/internal/number/itoa + set_local $6 + i32.const 1104 + get_local $1 + call $~lib/string/String.__concat + i32.const 1080 + call $~lib/string/String.__concat + i32.const 1120 + call $~lib/string/String.__concat + get_local $2 + call $~lib/string/String.__concat + i32.const 1080 + call $~lib/string/String.__concat + i32.const 1136 + call $~lib/string/String.__concat + get_local $4 + call $~lib/string/String.__concat + i32.const 1080 + call $~lib/string/String.__concat + i32.const 1168 + call $~lib/string/String.__concat + get_local $3 + call $~lib/string/String.__concat + i32.const 1080 + call $~lib/string/String.__concat + i32.const 1208 + call $~lib/string/String.__concat + get_local $6 + call $~lib/string/String.__concat + i32.const 1080 + call $~lib/string/String.__concat + i32.const 1224 + call $~lib/string/String.__concat + get_local $5 + call $~lib/string/String.__concat + ) + (func $assembly/host/index/log (; 66 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_logi ) - (func $assembly/module/index/Module#constructor (; 61 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#constructor (; 67 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $1 + i32.const 1073741816 + i32.gt_u + if + i32.const 0 + i32.const 1240 + i32.const 23 + i32.const 34 + call $~lib/env/abort + unreachable + end + get_local $1 + i32.const 0 + i32.shl + set_local $2 + get_local $2 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $4 + i32.const 0 + set_local $5 + get_local $4 + get_local $5 + get_local $2 + call $~lib/internal/memory/memset get_local $0 if (result i32) get_local $0 else block (result i32) - i32.const 8 + i32.const 12 call $~lib/memory/memory.allocate - set_local $2 - get_local $2 + set_local $5 + get_local $5 i32.const 0 i32.store - get_local $2 + get_local $5 i32.const 0 i32.store offset=4 - get_local $2 + get_local $5 + i32.const 0 + i32.store offset=8 + get_local $5 end tee_local $0 end tee_local $0 - get_local $1 + get_local $3 + i32.store + get_local $0 + i32.const 0 i32.store offset=4 get_local $0 - i32.const 1024 - i32.store + get_local $2 + i32.store offset=8 get_local $0 ) - (func $assembly/index/Parser#constructor (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#__get (; 68 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + get_local $1 + get_local $0 + i32.load offset=8 + i32.const 0 + i32.shr_u + i32.ge_u + if + i32.const 0 + i32.const 1240 + i32.const 39 + i32.const 63 + call $~lib/env/abort + unreachable + end + block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) + get_local $0 + i32.load + set_local $2 + get_local $0 + i32.load offset=4 + set_local $3 + get_local $2 + get_local $1 + i32.const 0 + i32.shl + i32.add + get_local $3 + i32.add + i32.load8_u offset=8 + end + ) + (func $~lib/internal/typedarray/TypedArray#__set (; 69 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + get_local $1 + get_local $0 + i32.load offset=8 + i32.const 0 + i32.shr_u + i32.ge_u + if + i32.const 0 + i32.const 1240 + i32.const 50 + i32.const 63 + call $~lib/env/abort + unreachable + end + get_local $0 + i32.load + set_local $3 + get_local $0 + i32.load offset=4 + set_local $4 + get_local $3 + get_local $1 + i32.const 0 + i32.shl + i32.add + get_local $4 + i32.add + get_local $2 + i32.store8 offset=8 + ) + (func $assembly/host/index/log (; 70 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_logi + ) + (func $assembly/host/index/log (; 71 ;) (type $iv) (param $0 i32) + get_local $0 + i32.const 12 + call $assembly/host/index/_log + ) + (func $assembly/host/index/log (; 72 ;) (type $iv) (param $0 i32) + get_local $0 + i32.const 255 + i32.and + call $assembly/host/index/_logi + ) + (func $assembly/index/removeStartFunction (; 73 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + get_local $0 + call $assembly/module/index/Module#get:hasStart + if + get_local $0 + get_global $src/common/SectionId.Start + call $assembly/module/index/Module#getID + i32.const 0 + call $~lib/array/Array#__get + set_local $1 + get_local $1 + call $assembly/module/index/SectionHeader#toString + call $assembly/host/index/log + get_local $1 + call $assembly/module/index/SectionHeader#get:end + get_local $1 + i32.load + i32.sub + set_local $2 + get_local $2 + call $assembly/host/index/log + i32.const 0 + get_local $0 + i32.load offset=4 + i32.load offset=4 + get_local $2 + i32.sub + call $~lib/internal/typedarray/TypedArray#constructor + set_local $3 + get_local $1 + i32.load offset=16 + call $assembly/host/index/log + block $break|0 + i32.const 0 + set_local $4 + loop $repeat|0 + get_local $4 + get_local $1 + i32.load offset=16 + i32.lt_u + i32.eqz + br_if $break|0 + get_local $3 + get_local $4 + get_local $0 + i32.load offset=4 + i32.load + get_local $4 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + call $~lib/internal/typedarray/TypedArray#__set + get_local $4 + i32.const 1 + i32.add + set_local $4 + br $repeat|0 + unreachable + end + unreachable + end + i32.const 1304 + call $assembly/host/index/log + get_local $0 + i32.load offset=4 + i32.load offset=16 + call $assembly/host/index/log + get_local $0 + i32.load offset=4 + i32.load + call $assembly/host/index/log + get_local $0 + i32.load offset=4 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.const 1 + i32.sub + call $~lib/internal/typedarray/TypedArray#__get + call $assembly/host/index/log + get_local $1 + i32.load offset=16 + get_local $2 + i32.add + call $assembly/host/index/log + block $break|1 + get_local $1 + i32.load offset=16 + get_local $2 + i32.add + set_local $4 + loop $repeat|1 + get_local $4 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.lt_u + i32.eqz + br_if $break|1 + block + get_local $4 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.const 8000 + i32.sub + i32.gt_u + if + get_local $4 + call $assembly/host/index/log + end + get_local $3 + get_local $4 + get_local $2 + i32.sub + get_local $0 + i32.load offset=4 + i32.load + get_local $4 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + call $~lib/internal/typedarray/TypedArray#__set + end + get_local $4 + i32.const 1 + i32.add + set_local $4 + br $repeat|1 + unreachable + end + unreachable + end + get_local $3 + return + else + get_local $0 + i32.load offset=4 + i32.load + return + end + unreachable + unreachable + ) + (func $assembly/index/toString (; 74 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $assembly/module/index/TypeSection#toString + ) + (func $assembly/module/index/Module#constructor (; 75 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 8 + call $~lib/memory/memory.allocate + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + end + tee_local $0 + end + tee_local $0 + get_local $1 + i32.store offset=4 + get_local $0 + i32.const 1352 + i32.store + get_local $0 + ) + (func $assembly/index/Parser#constructor (; 76 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) get_local $0 if (result i32) @@ -5686,7 +6129,7 @@ i32.store offset=4 get_local $0 ) - (func $assembly/index/Parser#parseString (; 63 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#parseString (; 77 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 @@ -5696,24 +6139,29 @@ call $assembly/buffer/index/Buffer#readVaruint call $~lib/string/String.fromUTF8 ) - (func $assembly/index/Parser#readVaruint (; 64 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/Parser#readVaruint (; 78 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.load get_local $1 call $assembly/buffer/index/Buffer#readVaruint ) - (func $assembly/index/Parser#get:off (; 65 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#get:off (; 79 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 ) - (func $assembly/index/Parser#set:off (; 66 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/index/Parser#set:off (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 i32.load get_local $1 i32.store offset=8 ) - (func $assembly/buffer/index/Buffer#readUint (; 67 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/arraybuffer/ArrayBuffer#get:data (; 81 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + ) + (func $assembly/buffer/index/Buffer#readUint (; 82 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -5729,7 +6177,7 @@ i32.store offset=8 get_local $2 ) - (func $assembly/module/index/sectionName (; 68 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/sectionName (; 83 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $break|0 block $case12|0 @@ -5797,49 +6245,49 @@ br_if $case11|0 br $case12|0 end - i32.const 1040 + i32.const 1424 return end - i32.const 1056 + i32.const 1440 return end - i32.const 1072 + i32.const 1456 return end - i32.const 1088 + i32.const 1472 return end - i32.const 1112 + i32.const 1496 return end - i32.const 1128 + i32.const 1512 return end - i32.const 1144 + i32.const 1528 return end - i32.const 1160 + i32.const 1544 return end - i32.const 1176 + i32.const 1560 return end - i32.const 1192 + i32.const 1576 return end - i32.const 1216 + i32.const 1600 return end - i32.const 1232 + i32.const 1616 return end unreachable unreachable end unreachable - i32.const 824 + i32.const 960 ) - (func $assembly/module/index/SectionHeader#constructor (; 69 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/SectionHeader#constructor (; 84 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -5848,7 +6296,7 @@ get_local $0 else block (result i32) - i32.const 20 + i32.const 24 call $~lib/memory/memory.allocate set_local $2 get_local $2 @@ -5864,9 +6312,12 @@ i32.const 0 i32.store offset=12 get_local $2 - i32.const 824 + i32.const 0 i32.store offset=16 get_local $2 + i32.const 960 + i32.store offset=20 + get_local $2 end tee_local $0 end @@ -5875,6 +6326,13 @@ i32.load offset=8 i32.store get_local $0 + get_local $0 + i32.load + get_local $1 + i32.load offset=12 + i32.sub + i32.store offset=16 + get_local $0 get_local $1 i32.const 7 call $assembly/buffer/index/Buffer#readVaruint @@ -5900,14 +6358,14 @@ i32.load offset=8 set_local $4 get_local $0 - i32.const 1032 + i32.const 1416 get_local $4 get_local $3 call $~lib/string/String.fromUTF8 call $~lib/string/String.__concat - i32.const 1032 + i32.const 1416 call $~lib/string/String.__concat - i32.store offset=16 + i32.store offset=20 get_local $1 get_local $1 i32.load offset=8 @@ -5933,9 +6391,17 @@ get_local $0 i32.load offset=4 call $assembly/module/index/sectionName - i32.store offset=16 + i32.store offset=20 else - unreachable + get_local $0 + i32.load + call $assembly/host/index/log + i32.const 1632 + get_local $0 + i32.load offset=4 + call $~lib/internal/number/itoa + call $~lib/string/String.__concat + call $assembly/host/index/err end end get_local $0 @@ -5944,7 +6410,7 @@ i32.store offset=12 get_local $0 ) - (func $assembly/module/index/Module#parseSection (; 70 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/module/index/Module#parseSection (; 85 ;) (type $iiv) (param $0 i32) (param $1 i32) (local $2 i32) get_local $0 i32.load @@ -5967,14 +6433,7 @@ end end ) - (func $assembly/module/index/SectionHeader#get:end (; 71 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - i32.load offset=12 - get_local $0 - i32.load offset=8 - i32.add - ) - (func $assembly/index/Parser#parse (; 72 ;) (type $iv) (param $0 i32) + (func $assembly/index/Parser#parse (; 86 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -5982,11 +6441,33 @@ (local $5 i32) (local $6 i32) (local $7 i32) + (local $8 i32) get_local $0 i32.load - call $assembly/buffer/index/Buffer#readUint + i32.load offset=8 + call $assembly/host/index/log + get_local $0 + i32.load + i32.load + i32.load + call $~lib/arraybuffer/ArrayBuffer#get:data + call $assembly/host/index/log + get_local $0 + i32.load + i32.load offset=4 + call $assembly/host/index/log + get_local $0 + call $assembly/index/Parser#get:off set_local $1 - get_local $1 + i32.const 1360 + call $assembly/host/index/log + get_local $0 + i32.load + call $assembly/buffer/index/Buffer#readUint + set_local $2 + get_local $2 + call $assembly/host/index/log + get_local $2 i32.const 1836278016 i32.ne if @@ -5995,21 +6476,25 @@ get_local $0 i32.load call $assembly/buffer/index/Buffer#readUint - set_local $2 - get_local $2 + set_local $3 + get_local $3 + call $assembly/host/index/log + get_local $3 i32.const 1 i32.ne if unreachable end - i32.const 0 - set_local $3 + i32.const 1384 + call $assembly/host/index/log i32.const 0 set_local $4 i32.const 0 set_local $5 i32.const 0 set_local $6 + i32.const 0 + set_local $7 block $break|0 loop $continue|0 get_local $0 @@ -6017,7 +6502,7 @@ i32.load offset=8 get_local $0 i32.load - i32.load offset=4 + i32.load offset=16 i32.lt_u if block @@ -6025,13 +6510,36 @@ get_local $0 i32.load call $assembly/module/index/SectionHeader#constructor - set_local $7 + set_local $8 + get_local $8 + call $assembly/module/index/SectionHeader#toString + call $assembly/host/index/log get_local $0 i32.load offset=4 - get_local $7 + get_local $8 call $assembly/module/index/Module#parseSection + i32.const 1664 + call $assembly/host/index/log get_local $0 - get_local $7 + call $assembly/index/Parser#get:off + call $assembly/host/index/log + get_local $8 + i32.load + get_local $1 + i32.sub + call $assembly/host/index/log + get_local $8 + i32.load offset=16 + call $assembly/host/index/log + get_local $8 + call $assembly/module/index/SectionHeader#get:end + get_local $1 + i32.sub + call $assembly/host/index/log + i32.const 1664 + call $assembly/host/index/log + get_local $0 + get_local $8 call $assembly/module/index/SectionHeader#get:end call $assembly/index/Parser#set:off end @@ -6040,19 +6548,14 @@ end end ) - (func $~lib/arraybuffer/ArrayBuffer#get:data (; 73 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - ) - (func $assembly/buffer/index/Buffer#constructor (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#constructor (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) get_local $0 if (result i32) get_local $0 else block (result i32) - i32.const 12 + i32.const 20 call $~lib/memory/memory.allocate set_local $2 get_local $2 @@ -6065,6 +6568,12 @@ i32.const 0 i32.store offset=8 get_local $2 + i32.const 0 + i32.store offset=12 + get_local $2 + i32.const 0 + i32.store offset=16 + get_local $2 end tee_local $0 end @@ -6081,24 +6590,47 @@ i32.load offset=8 i32.store offset=4 get_local $0 + get_local $0 + i32.load offset=8 + i32.store offset=12 + get_local $0 + get_local $0 + i32.load offset=8 + get_local $0 + i32.load offset=4 + i32.add + i32.store offset=16 + get_local $0 ) - (func $assembly/index/newParser (; 75 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/host/index/log (; 88 ;) (type $iv) (param $0 i32) + get_local $0 + i32.const 20 + call $assembly/host/index/_log + ) + (func $assembly/index/newParser (; 89 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) + get_local $0 + call $assembly/host/index/log i32.const 0 get_local $0 call $assembly/buffer/index/Buffer#constructor set_local $1 + get_local $1 + call $assembly/host/index/log + get_local $1 + i32.load offset=8 + call $assembly/host/index/log i32.const 0 get_local $1 call $assembly/index/Parser#constructor ) - (func $assembly/index/parse (; 76 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/parse (; 90 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/index/Parser#parse get_local $0 i32.load offset=4 ) - (func $start (; 77 ;) (type $v) + (func $start (; 91 ;) (type $v) get_global $HEAP_BASE get_global $~lib/internal/allocator/AL_MASK i32.add @@ -6110,23 +6642,25 @@ get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset nop + i32.const 8 + call $assembly/host/index/log ) - (func $null (; 78 ;) (type $v) + (func $null (; 92 ;) (type $v) ) - (func $Parser#get:buf (; 79 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:buf (; 93 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) - (func $Parser#set:buf (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:buf (; 94 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store ) - (func $Parser#get:module (; 81 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:module (; 95 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) - (func $Parser#set:module (; 82 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:module (; 96 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store offset=4 diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index bcc7b1d474..c3b29d0c5b 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -68,10 +68,11 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16; memory = new WebAssembly.Memory({ initial: nPages }); var buffer = new Uint32Array(memory.buffer); + var buffer16 = new Uint16Array(memory.buffer); // buffer.set(binary); // provide a way to read strings from memory - parse.readString = (offset: number, length: number): string => utf8_read(buffer, offset, offset + length); + parse.readString = (offset: number, length: number): string => utf8_read(new Uint8Array(memory.buffer), offset, offset + length); parse.readUint32 = (index: number): number => { return buffer[index]; @@ -105,7 +106,7 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { console.log([line,output.join('\n'+line+'\n'),line].join("\n")); } }, - _log_str:(x) => console.log(instance.getString(x)), + _log_str:(x) => console.log(loader.getStringImpl(buffer, buffer16, x)), _logi: console.log, _logf: console.log }, @@ -135,10 +136,23 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { instance = loader.instantiate(compiled, imports); let array = instance.newArray(new Uint8Array(binary)) let parserPtr = instance.newParser(array); - debugger; + let Mod = instance.parse(parserPtr); console.log(instance.getString((instance as any).getType(Mod))); (instance as any).getImports(Mod); + // let arraybuf = instance.getArray(Uint8Array, array); + let newptr = (instance as any).removeStartFunction(Mod); + // debugger; + let buf = instance.getArray(Uint8Array, newptr); + // debugger; + // let array2 = instance.newArray(buf); + console.log(newptr); + let parserPtr2 = instance.newParser(newptr); + let Mod2 = instance.parse(parserPtr2); + debugger; + + let instance2 = loader.instantiateBuffer(buf, imports); + instance2.start(); // let sections = buffer.slice(instance.I32[Mod], 2); // console.log(sections[1]) // let arrayBuf = sections[0]>>2; diff --git a/lib/parse/tests/index.ts b/lib/parse/tests/index.ts index 28b1590bcc..5279889f1f 100644 --- a/lib/parse/tests/index.ts +++ b/lib/parse/tests/index.ts @@ -92,7 +92,7 @@ function onLocalName(funcIndex: number, index: number, offset: number, length: n } [ "../build/index.wasm", - "libm.wasm" + // "libm.wasm" ].forEach((filename: string): void => { const binary: Uint8Array = fs.readFileSync(__dirname + "/" + filename); console.log("Testing '" + filename + "' ..."); From 8c79684391e02c21529ebf4670b0368e44b6b840 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Wed, 2 Jan 2019 13:50:48 +0100 Subject: [PATCH 08/46] new Branch for parser --- lib/parse/index.js | 8 ++++++-- lib/parse/index.js.map | 8 ++++++-- lib/parse/package.json | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/parse/index.js b/lib/parse/index.js index 9309c2ad20..a70e5684c7 100644 --- a/lib/parse/index.js +++ b/lib/parse/index.js @@ -1,5 +1,9 @@ -<<<<<<< loader-memory-accessors -!function(A,B){"object"==typeof exports&&"object"==typeof module?module.exports=B():"function"==typeof define&&define.amd?define([],B):"object"==typeof exports?exports.asparse=B():A.asparse=B()}("undefined"!=typeof self?self:this,function(){return function(A){var B={};function n(e){if(B[e])return B[e].exports;var o=B[e]={i:e,l:!1,exports:{}};return A[e].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=A,n.c=B,n.d=function(A,B,e){n.o(A,B)||Object.defineProperty(A,B,{enumerable:!0,get:e})},n.r=function(A){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(A,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(A,"__esModule",{value:!0})},n.t=function(A,B){if(1&B&&(A=n(A)),8&B)return A;if(4&B&&"object"==typeof A&&A&&A.__esModule)return A;var e=Object.create(null);if(n.r(e),Object.defineProperty(e,"default",{enumerable:!0,value:A}),2&B&&"string"!=typeof A)for(var o in A)n.d(e,o,function(B){return A[B]}.bind(null,o));return e},n.n=function(A){var B=A&&A.__esModule?function(){return A.default}:function(){return A};return n.d(B,"a",B),B},n.o=function(A,B){return Object.prototype.hasOwnProperty.call(A,B)},n.p="",n(n.s=0)}([function(A,B,n){A.exports=n(1)},function(A,B,n){"use strict";B.__esModule=!0;var e=n(2);B.Type=e.Type,B.SectionId=e.SectionId,B.ExternalKind=e.ExternalKind;var o=null;B.parse=function A(B,n){n||(n={}),o||(o=new WebAssembly.Module(function(A){var B=A.length;if(B){for(var n=0,e=B;--e%4>1&&61===A.charCodeAt(e);)++n;B=Math.ceil(3*B)/4-n}for(var o=new Uint8Array(B),E=0,t=0,C=0,I=0,r=A.length;I1)break;if(void 0===(i=Q[i]))throw Error();switch(E){case 0:C=i,E=1;break;case 1:o[t++]=C<<2|(48&i)>>4,C=i,E=2;break;case 2:o[t++]=(15&C)<<4|(60&i)>>2,C=i,E=3;break;case 3:o[t++]=(3&C)<<6|i,E=0}}if(1===E)throw Error();return o}("AGFzbQEAAAABQQtgAn9/AGABfwF/YAV/f39/fwF/YAN/f38AYAZ/f39/f38AYAV/f39/fwBgBH9/f38AYAAAYAABfmABfwBgAAF/Aq4DFAdvcHRpb25zCW9uU2VjdGlvbgACB29wdGlvbnMGb25UeXBlAAAHb3B0aW9ucwtvblR5cGVQYXJhbQADB29wdGlvbnMMb25UeXBlUmV0dXJuAAMHb3B0aW9ucwhvbkltcG9ydAAEB29wdGlvbnMQb25GdW5jdGlvbkltcG9ydAAAB29wdGlvbnMNb25UYWJsZUltcG9ydAAFB29wdGlvbnMOb25NZW1vcnlJbXBvcnQABgdvcHRpb25zDm9uR2xvYmFsSW1wb3J0AAMHb3B0aW9ucwpvbkZ1bmN0aW9uAAAHb3B0aW9ucwdvblRhYmxlAAUHb3B0aW9ucwhvbk1lbW9yeQAGB29wdGlvbnMIb25HbG9iYWwAAwdvcHRpb25zCG9uRXhwb3J0AAUHb3B0aW9ucwdvblN0YXJ0AAkHb3B0aW9ucwxvbk1vZHVsZU5hbWUAAAdvcHRpb25zDm9uRnVuY3Rpb25OYW1lAAMHb3B0aW9ucwtvbkxvY2FsTmFtZQAGB29wdGlvbnMSb25Tb3VyY2VNYXBwaW5nVVJMAAADZW52Bm1lbW9yeQIAAAMHBgoBCAcABwQEAXAAAQaHARp/AUEAC38BQQALfwFBAQt/AUECC38BQQMLfwFBBAt/AUEFC38BQQYLfwFBBwt/AUEIC38BQQkLfwFBCgt/AUELC38BQQALfwFBAQt/AUECC38BQQMLfwFBCwt/AUEjC38BQcEAC38BQcIAC38BQcMAC38BQcQAC38BQQALfwFBAQt/AUECCwcaAwZtZW1vcnkCAAV0YWJsZQEABXBhcnNlABcJBwEAQQALARgK5w0GPwEEfyMAIQADQCAAIgFBAWohACABLQAAIgFB/wBxIAN0IAJyIQIgAUGAAXEEQCADQQdqIQMMAQsLIAAkACACC2ABBX8jACECA0AgAiIEQQFqIQIgBC0AACIFQf8AcSABdCADciEDIAFBB2ohASAFQYABcQ0ACyACJABBfyABdCADciECIAEgAEkiBARAIAVBwABxQQBHIQQLIAIgAyAEGwtmAgJ/BH4jACEBA0AgASIAQQFqIQEgADEAACIEQv8AgyAChiADhCEDIAJCB3whAiAEQoABg0IAUg0ACyABJABCfyAChiADhCEFIAJCwABUIgAEQCAEQsAAg0IAUiEACyAFIAMgABsLmQEBAn8jACIBLQAAIQAgAUEBaiQAAkACQAJAAkACQAJAIxMgAEcEQCMUIABGDQEjFSAARg0CIxYgAEYNAyMSIABGDQQMBQtBIBAUGgwFCxAVGgwECyMAIgAoAgAaIABBBGokAAwDCyMAIgApAwAaIABBCGokAAwCCxATGgwBCwALIwAiAS0AACEAIAFBAWokACMRIABHBEAACwu9CgENfyAAJAAjACIAKAIAIQYgAEEEaiQAIAZBgMLN6wZHBEAACyMAIgAoAgAhBiAAQQRqJAAgBkEBRwRAAAsDQCMAIAFJBEAQEyECEBMhCEEAIQRBACEAIAIEQCACIwxLBEAACwUjACEFEBMiACMAIgRqJAAgCCMAIAVrayEICyACIwAiBSAIIAQgABAABEACQAJAAkACQAJAAkACQAJAAkACQAJAIwIgAkcEQCMDIAJGDQEjBCACRg0CIwUgAkYNAyMGIAJGDQQjByACRg0FIwggAkYNBiMJIAJGDQcjASACRg0IIwogAkYNCSMLIAJGDQkjDCACRg0JDAoLEBMhAkEAIQMDQCADIAJJBEAgA0EHEBRB/wBxEAEQEyEFQQAhBwNAIAcgBUkEQCADIAdBBxAUQf8AcRACIAdBAWohBwwBCwsQEyEHQQAhBANAIAQgB0kEQCADIARBBxAUQf8AcRADIARBAWohBAwBCwsgA0EBaiEDDAELCwwKCxATIQJBACEDA0AgAyACSQRAEBMhByAHIwAiBWokABATIQkgCSMAIgRqJAAjACIGLQAAIQAgBkEBaiQAIAMgACAFIAcgBCAJEAQCQAJAAkACQAJAIAAiBiMNRwRAIw4gBkYNASMPIAZGDQIjECAGRg0DDAQLIAsiCkEBaiELIAoQExAFDAQLQQcQFEH/AHEhBhATIQogDCIAQQFqIQwgACAGEBMgCkEBcQR/EBMFQX8LIAoQBgwDCxATIQggDSIGQQFqIQ0gBhATIAhBAXEEfxATBUH//wMLIAgQBwwCCyAOIghBAWohDiAIQQcQFEH/AHEQExAIDAELAAsgA0EBaiEDDAELCwwJCxATIQJBACEDA0AgAyACSQRAIAsiBEEBaiELIAQQExAJIANBAWohAwwBCwsMCAsQEyECQQAhAwNAIAMgAkkEQBATQf8AcSEAEBMhBCAMIgdBAWohDCAHIAAQEyAEQQFxBH8QEwVBfwsgBBAKIANBAWohAwwBCwsMBwsQEyECQQAhAwNAIAMgAkkEQBATIQUgDSIAQQFqIQ0gABATIAVBAXEEfxATBUH//wMLIAUQCyADQQFqIQMMAQsLDAYLEBMhAkEAIQMDQCADIAJJBEBBBxAUQf8AcSEEEBMhCRAWIA4iBUEBaiEOIAUgBCAJEAwgA0EBaiEDDAELCwwFCxATIQJBACEDA0AgAyACSQRAEBMhCSAJIwAiBGokACMAIgAtAAAhBiAAQQFqJAAgAyAGEBMgBCAJEA0gA0EBaiEDDAELCwwECxATEA4MAwsgAEEERiICBH8gBCgCAEHuwrWrBkYFIAILBEAQEyECEBMhAyMAIQACQAJAAkACQCACIgUjF0cEQCMYIAVGDQEjGSAFRg0CDAMLEBMhBSMAIAUQDwwDCxATIQRBACEFA0AgBSAESQRAEBMhCRATIQcgByMAIgJqJAAgCSACIAcQECAFQQFqIQUMAQsLDAILEBMhBEEAIQUDQCAFIARJBEAQEyECEBMhB0EAIQkDQCAJIAdJBEAQEyEKEBMiCCMAIgZqJAAgAiAKIAYgCBARIAlBAWohCQwBCwsgBUEBaiEFDAELCwwBCwALIAAgA2okAAwDBQJ/IABBEEYiAARAIAQpAwBC897Vk7es2abhAFEhAAsgAAsEfyAEQQhqKQMAQvDgpfP2rJWpzABRBSAACwRAEBMiACMAIgNqJAAgAyAAEBILCyAFIAhqJAAMAgsjACAIaiQADAELAAsFIwAgCGokAAsMAQsLIwAgAUcEQAALCwMAAQsAIBBzb3VyY2VNYXBwaW5nVVJMDmluZGV4Lndhc20ubWFw")));var e=B.length,E=(e+65535&-65536)>>16,t=new WebAssembly.Memory({initial:E}),C=new Uint8Array(t.buffer);C.set(B),A.readString=function(A,B){return function(A,B,n){if(n-B<1)return"";for(var e=null,o=[],Q=0,E=0;B191&&E<224?o[Q++]=(31&E)<<6|63&A[B++]:E>239&&E<365?(E=((7&E)<<18|(63&A[B++])<<12|(63&A[B++])<<6|63&A[B++])-65536,o[Q++]=55296+(E>>10),o[Q++]=56320+(1023&E)):o[Q++]=(15&E)<<12|(63&A[B++])<<6|63&A[B++],Q>8191&&((e||(e=[])).push(String.fromCharCode.apply(String,o)),Q=0);return e?(Q&&e.push(String.fromCharCode.apply(String,o.slice(0,Q))),e.join("")):String.fromCharCode.apply(String,o.slice(0,Q))}(C,A,A+B)};var I={env:{memory:t},options:{}};["onSection","onType","onTypeParam","onTypeReturn","onImport","onFunctionImport","onTableImport","onMemoryImport","onGlobalImport","onMemory","onFunction","onTable","onGlobal","onExport","onStart","onSourceMappingURL","onModuleName","onFunctionName","onLocalName"].forEach(function(A){return I.options[A]=n[A]||function(){}}),new WebAssembly.Instance(o,I).exports.parse(0,e)};for(var Q=new Array(123),E=0;E<64;)Q[E<26?E+65:E<52?E+71:E<62?E-4:E-59|43]=E++},function(A,B,n){"use strict";B.__esModule=!0,function(A){A[A.i32=127]="i32",A[A.i64=126]="i64",A[A.f32=125]="f32",A[A.f64=124]="f64",A[A.anyfunc=112]="anyfunc",A[A.func=96]="func",A[A.none=64]="none"}(B.Type||(B.Type={})),function(A){A[A.Custom=0]="Custom",A[A.Type=1]="Type",A[A.Import=2]="Import",A[A.Function=3]="Function",A[A.Table=4]="Table",A[A.Memory=5]="Memory",A[A.Global=6]="Global",A[A.Export=7]="Export",A[A.Start=8]="Start",A[A.Element=9]="Element",A[A.Code=10]="Code",A[A.Data=11]="Data"}(B.SectionId||(B.SectionId={})),function(A){A[A.Function=0]="Function",A[A.Table=1]="Table",A[A.Memory=2]="Memory",A[A.Global=3]="Global"}(B.ExternalKind||(B.ExternalKind={})),function(A){A[A.Module=0]="Module",A[A.Function=1]="Function",A[A.Local=2]="Local"}(B.NameType||(B.NameType={})),B.MAX_PAGES=65535,B.MAX_ELEMS=4294967295,function(A){A[A.end=11]="end",A[A.get_global=35]="get_global",A[A.i32_const=65]="i32_const",A[A.i64_const=66]="i64_const",A[A.f32_const=67]="f32_const",A[A.f64_const=68]="f64_const"}(B.Opcode||(B.Opcode={}))}])}); +<<<<<<< master + +======= +!function(A,Q){"object"==typeof exports&&"object"==typeof module?module.exports=Q():"function"==typeof define&&define.amd?define([],Q):"object"==typeof exports?exports.asparse=Q():A.asparse=Q()}("undefined"!=typeof self?self:this,function(){return function(A){var Q={};function n(B){if(Q[B])return Q[B].exports;var e=Q[B]={i:B,l:!1,exports:{}};return A[B].call(e.exports,e,e.exports,n),e.l=!0,e.exports}return n.m=A,n.c=Q,n.d=function(A,Q,B){n.o(A,Q)||Object.defineProperty(A,Q,{enumerable:!0,get:B})},n.r=function(A){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(A,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(A,"__esModule",{value:!0})},n.t=function(A,Q){if(1&Q&&(A=n(A)),8&Q)return A;if(4&Q&&"object"==typeof A&&A&&A.__esModule)return A;var B=Object.create(null);if(n.r(B),Object.defineProperty(B,"default",{enumerable:!0,value:A}),2&Q&&"string"!=typeof A)for(var e in A)n.d(B,e,function(Q){return A[Q]}.bind(null,e));return B},n.n=function(A){var Q=A&&A.__esModule?function(){return A.default}:function(){return A};return n.d(Q,"a",Q),Q},n.o=function(A,Q){return Object.prototype.hasOwnProperty.call(A,Q)},n.p="",n(n.s=0)}([function(A,Q,n){A.exports=n(1)},function(A,Q,n){"use strict";Q.__esModule=!0;var B=n(2);Q.Type=B.Type,Q.SectionId=B.SectionId,Q.ExternalKind=B.ExternalKind;var e=null;Q.parse=function A(Q,n){n||(n={}),e||(e=new WebAssembly.Module(function(A){var Q=A.length;if(Q){for(var n=0,B=Q;--B%4>1&&61===A.charCodeAt(B);)++n;Q=Math.ceil(3*Q)/4-n}for(var e=new Uint8Array(Q),t=0,E=0,o=0,C=0,b=A.length;C1)break;if(void 0===(c=I[c]))throw Error();switch(t){case 0:o=c,t=1;break;case 1:e[E++]=o<<2|(48&c)>>4,o=c,t=2;break;case 2:e[E++]=(15&o)<<4|(60&c)>>2,o=c,t=3;break;case 3:e[E++]=(3&o)<<6|c,t=0}}if(1===t)throw Error();return e}("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BBlhc3NlbWJseS9vcHRpb25zL29uSW1wb3J0BSFhc3NlbWJseS9vcHRpb25zL29uRnVuY3Rpb25JbXBvcnQGHmFzc2VtYmx5L29wdGlvbnMvb25UYWJsZUltcG9ydAcfYXNzZW1ibHkvb3B0aW9ucy9vbk1lbW9yeUltcG9ydAgfYXNzZW1ibHkvb3B0aW9ucy9vbkdsb2JhbEltcG9ydAkbYXNzZW1ibHkvb3B0aW9ucy9vbkZ1bmN0aW9uChhhc3NlbWJseS9vcHRpb25zL29uVGFibGULGWFzc2VtYmx5L29wdGlvbnMvb25NZW1vcnkMGWFzc2VtYmx5L29wdGlvbnMvb25HbG9iYWwNGWFzc2VtYmx5L29wdGlvbnMvb25FeHBvcnQOGGFzc2VtYmx5L29wdGlvbnMvb25TdGFydA8dYXNzZW1ibHkvb3B0aW9ucy9vbk1vZHVsZU5hbWUQH2Fzc2VtYmx5L29wdGlvbnMvb25GdW5jdGlvbk5hbWURHGFzc2VtYmx5L29wdGlvbnMvb25Mb2NhbE5hbWUSI2Fzc2VtYmx5L29wdGlvbnMvb25Tb3VyY2VNYXBwaW5nVVJMExxhc3NlbWJseS9pbmRleC9yZWFkVWludDx1MzI+FBphc3NlbWJseS9pbmRleC9yZWFkVmFydWludBUZYXNzZW1ibHkvaW5kZXgvcmVhZFZhcmludBYbYXNzZW1ibHkvaW5kZXgvcmVhZFVpbnQ8dTg+Fxthc3NlbWJseS9pbmRleC9yZWFkVmFyaW50NjQYGWFzc2VtYmx5L2luZGV4L3JlYWRVaW50NjQZG2Fzc2VtYmx5L2luZGV4L3NraXBJbml0RXhwchoUYXNzZW1ibHkvaW5kZXgvcGFyc2UbBG51bGwAIBBzb3VyY2VNYXBwaW5nVVJMDmluZGV4Lndhc20ubWFw")));var B=Q.length,t=(B+65535&-65536)>>16,E=new WebAssembly.Memory({initial:t}),o=new Uint8Array(E.buffer);o.set(Q),A.readString=function(A,Q){return function(A,Q,n){if(n-Q<1)return"";for(var B=null,e=[],I=0,t=0;Q191&&t<224?e[I++]=(31&t)<<6|63&A[Q++]:t>239&&t<365?(t=((7&t)<<18|(63&A[Q++])<<12|(63&A[Q++])<<6|63&A[Q++])-65536,e[I++]=55296+(t>>10),e[I++]=56320+(1023&t)):e[I++]=(15&t)<<12|(63&A[Q++])<<6|63&A[Q++],I>8191&&((B||(B=[])).push(String.fromCharCode.apply(String,e)),I=0);return B?(I&&B.push(String.fromCharCode.apply(String,e.slice(0,I))),B.join("")):String.fromCharCode.apply(String,e.slice(0,I))}(o,A,A+Q)},A.readUint32=function(A){return o[A]};var C={env:{memory:E},options:{}};["onSection","onType","onTypeParam","onTypeReturn","onImport","onFunctionImport","onTableImport","onMemoryImport","onGlobalImport","onMemory","onFunction","onTable","onGlobal","onExport","onStart","onSourceMappingURL","onModuleName","onFunctionName","onLocalName"].forEach(function(A){return C.options[A]=n[A]||function(){}}),new WebAssembly.Instance(e,C).exports.parse(0,B)};for(var I=new Array(123),t=0;t<64;)I[t<26?t+65:t<52?t+71:t<62?t-4:t-59|43]=t++},function(A,Q,n){"use strict";Q.__esModule=!0,function(A){A[A.i32=127]="i32",A[A.i64=126]="i64",A[A.f32=125]="f32",A[A.f64=124]="f64",A[A.anyfunc=112]="anyfunc",A[A.func=96]="func",A[A.none=64]="none"}(Q.Type||(Q.Type={})),function(A){A[A.Custom=0]="Custom",A[A.Type=1]="Type",A[A.Import=2]="Import",A[A.Function=3]="Function",A[A.Table=4]="Table",A[A.Memory=5]="Memory",A[A.Global=6]="Global",A[A.Export=7]="Export",A[A.Start=8]="Start",A[A.Element=9]="Element",A[A.Code=10]="Code",A[A.Data=11]="Data"}(Q.SectionId||(Q.SectionId={})),function(A){A[A.Function=0]="Function",A[A.Table=1]="Table",A[A.Memory=2]="Memory",A[A.Global=3]="Global"}(Q.ExternalKind||(Q.ExternalKind={})),function(A){A[A.Module=0]="Module",A[A.Function=1]="Function",A[A.Local=2]="Local"}(Q.NameType||(Q.NameType={})),Q.MAX_PAGES=65535,Q.MAX_ELEMS=4294967295,function(A){A[A.end=11]="end",A[A.get_global=35]="get_global",A[A.i32_const=65]="i32_const",A[A.i64_const=66]="i64_const",A[A.f32_const=67]="f32_const",A[A.f64_const=68]="f64_const"}(Q.Opcode||(Q.Opcode={}))}])}); +>>>>>>> new Branch for parser +//# sourceMappingURL=index.js.map ======= !function(A,Q){"object"==typeof exports&&"object"==typeof module?module.exports=Q():"function"==typeof define&&define.amd?define([],Q):"object"==typeof exports?exports.asparse=Q():A.asparse=Q()}("undefined"!=typeof self?self:this,function(){return function(A){var Q={};function n(B){if(Q[B])return Q[B].exports;var e=Q[B]={i:B,l:!1,exports:{}};return A[B].call(e.exports,e,e.exports,n),e.l=!0,e.exports}return n.m=A,n.c=Q,n.d=function(A,Q,B){n.o(A,Q)||Object.defineProperty(A,Q,{enumerable:!0,get:B})},n.r=function(A){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(A,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(A,"__esModule",{value:!0})},n.t=function(A,Q){if(1&Q&&(A=n(A)),8&Q)return A;if(4&Q&&"object"==typeof A&&A&&A.__esModule)return A;var B=Object.create(null);if(n.r(B),Object.defineProperty(B,"default",{enumerable:!0,value:A}),2&Q&&"string"!=typeof A)for(var e in A)n.d(B,e,function(Q){return A[Q]}.bind(null,e));return B},n.n=function(A){var Q=A&&A.__esModule?function(){return A.default}:function(){return A};return n.d(Q,"a",Q),Q},n.o=function(A,Q){return Object.prototype.hasOwnProperty.call(A,Q)},n.p="",n(n.s=0)}([function(A,Q,n){A.exports=n(1)},function(A,Q,n){"use strict";Q.__esModule=!0;var B=n(2);Q.Type=B.Type,Q.SectionId=B.SectionId,Q.ExternalKind=B.ExternalKind;var e=null;Q.parse=function A(Q,n){n||(n={}),e||(e=new WebAssembly.Module(function(A){var Q=A.length;if(Q){for(var n=0,B=Q;--B%4>1&&61===A.charCodeAt(B);)++n;Q=Math.ceil(3*Q)/4-n}for(var e=new Uint8Array(Q),t=0,E=0,o=0,C=0,b=A.length;C1)break;if(void 0===(c=I[c]))throw Error();switch(t){case 0:o=c,t=1;break;case 1:e[E++]=o<<2|(48&c)>>4,o=c,t=2;break;case 2:e[E++]=(15&o)<<4|(60&c)>>2,o=c,t=3;break;case 3:e[E++]=(3&o)<<6|c,t=0}}if(1===t)throw Error();return e}("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BBlhc3NlbWJseS9vcHRpb25zL29uSW1wb3J0BSFhc3NlbWJseS9vcHRpb25zL29uRnVuY3Rpb25JbXBvcnQGHmFzc2VtYmx5L29wdGlvbnMvb25UYWJsZUltcG9ydAcfYXNzZW1ibHkvb3B0aW9ucy9vbk1lbW9yeUltcG9ydAgfYXNzZW1ibHkvb3B0aW9ucy9vbkdsb2JhbEltcG9ydAkbYXNzZW1ibHkvb3B0aW9ucy9vbkZ1bmN0aW9uChhhc3NlbWJseS9vcHRpb25zL29uVGFibGULGWFzc2VtYmx5L29wdGlvbnMvb25NZW1vcnkMGWFzc2VtYmx5L29wdGlvbnMvb25HbG9iYWwNGWFzc2VtYmx5L29wdGlvbnMvb25FeHBvcnQOGGFzc2VtYmx5L29wdGlvbnMvb25TdGFydA8dYXNzZW1ibHkvb3B0aW9ucy9vbk1vZHVsZU5hbWUQH2Fzc2VtYmx5L29wdGlvbnMvb25GdW5jdGlvbk5hbWURHGFzc2VtYmx5L29wdGlvbnMvb25Mb2NhbE5hbWUSI2Fzc2VtYmx5L29wdGlvbnMvb25Tb3VyY2VNYXBwaW5nVVJMExxhc3NlbWJseS9pbmRleC9yZWFkVWludDx1MzI+FBphc3NlbWJseS9pbmRleC9yZWFkVmFydWludBUZYXNzZW1ibHkvaW5kZXgvcmVhZFZhcmludBYbYXNzZW1ibHkvaW5kZXgvcmVhZFVpbnQ8dTg+Fxthc3NlbWJseS9pbmRleC9yZWFkVmFyaW50NjQYGWFzc2VtYmx5L2luZGV4L3JlYWRVaW50NjQZG2Fzc2VtYmx5L2luZGV4L3NraXBJbml0RXhwchoUYXNzZW1ibHkvaW5kZXgvcGFyc2UbBG51bGwAIBBzb3VyY2VNYXBwaW5nVVJMDmluZGV4Lndhc20ubWFw")));var B=Q.length,t=(B+65535&-65536)>>16,E=new WebAssembly.Memory({initial:t}),o=new Uint8Array(E.buffer);o.set(Q),A.readString=function(A,Q){return function(A,Q,n){if(n-Q<1)return"";for(var B=null,e=[],I=0,t=0;Q191&&t<224?e[I++]=(31&t)<<6|63&A[Q++]:t>239&&t<365?(t=((7&t)<<18|(63&A[Q++])<<12|(63&A[Q++])<<6|63&A[Q++])-65536,e[I++]=55296+(t>>10),e[I++]=56320+(1023&t)):e[I++]=(15&t)<<12|(63&A[Q++])<<6|63&A[Q++],I>8191&&((B||(B=[])).push(String.fromCharCode.apply(String,e)),I=0);return B?(I&&B.push(String.fromCharCode.apply(String,e.slice(0,I))),B.join("")):String.fromCharCode.apply(String,e.slice(0,I))}(o,A,A+Q)},A.readUint32=function(A){return o[A]};var C={env:{memory:E},options:{}};["onSection","onType","onTypeParam","onTypeReturn","onImport","onFunctionImport","onTableImport","onMemoryImport","onGlobalImport","onMemory","onFunction","onTable","onGlobal","onExport","onStart","onSourceMappingURL","onModuleName","onFunctionName","onLocalName"].forEach(function(A){return C.options[A]=n[A]||function(){}}),new WebAssembly.Instance(e,C).exports.parse(0,B)};for(var I=new Array(123),t=0;t<64;)I[t<26?t+65:t<52?t+71:t<62?t-4:t-59|43]=t++},function(A,Q,n){"use strict";Q.__esModule=!0,function(A){A[A.i32=127]="i32",A[A.i64=126]="i64",A[A.f32=125]="f32",A[A.f64=124]="f64",A[A.anyfunc=112]="anyfunc",A[A.func=96]="func",A[A.none=64]="none"}(Q.Type||(Q.Type={})),function(A){A[A.Custom=0]="Custom",A[A.Type=1]="Type",A[A.Import=2]="Import",A[A.Function=3]="Function",A[A.Table=4]="Table",A[A.Memory=5]="Memory",A[A.Global=6]="Global",A[A.Export=7]="Export",A[A.Start=8]="Start",A[A.Element=9]="Element",A[A.Code=10]="Code",A[A.Data=11]="Data"}(Q.SectionId||(Q.SectionId={})),function(A){A[A.Function=0]="Function",A[A.Table=1]="Table",A[A.Memory=2]="Memory",A[A.Global=3]="Global"}(Q.ExternalKind||(Q.ExternalKind={})),function(A){A[A.Module=0]="Module",A[A.Function=1]="Function",A[A.Local=2]="Local"}(Q.NameType||(Q.NameType={})),Q.MAX_PAGES=65535,Q.MAX_ELEMS=4294967295,function(A){A[A.end=11]="end",A[A.get_global=35]="get_global",A[A.i32_const=65]="i32_const",A[A.i64_const=66]="i64_const",A[A.f32_const=67]="f32_const",A[A.f64_const=68]="f64_const"}(Q.Opcode||(Q.Opcode={}))}])}); >>>>>>> new Branch for parser diff --git a/lib/parse/index.js.map b/lib/parse/index.js.map index 96bb8de25b..27edafa4a8 100644 --- a/lib/parse/index.js.map +++ b/lib/parse/index.js.map @@ -1,5 +1,9 @@ -<<<<<<< loader-memory-accessors -{"version":3,"sources":["webpack://asparse/webpack/universalModuleDefinition","webpack://asparse/webpack/bootstrap","webpack://asparse/./src/index.ts","webpack://asparse/./src/common.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","common_1","Type","SectionId","ExternalKind","compiled","parse","binary","options","WebAssembly","Module","string","length","charCodeAt","Math","ceil","buffer","Uint8Array","j","k","undefined","s64","Error","base64_decode","nBytes","nPages","memory","Memory","initial","set","readString","offset","start","end","parts","chunk","push","String","fromCharCode","apply","slice","join","utf8_read","imports","env","forEach","Instance","Array","NameType","MAX_PAGES","MAX_ELEMS","Opcode"],"mappings":"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","file":"index.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"asparse\"] = factory();\n\telse\n\t\troot[\"asparse\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","\"use strict\";\r\nexports.__esModule = true;\r\nvar common_1 = require(\"./common\");\r\nexports.Type = common_1.Type;\r\nexports.SectionId = common_1.SectionId;\r\nexports.ExternalKind = common_1.ExternalKind;\r\n/** Cached compiled parser. */\r\nvar compiled = null;\r\nif (typeof WASM_DATA !== \"string\")\r\n WASM_DATA = require(\"fs\").readFileSync(__dirname + \"/../build/index.wasm\", \"base64\");\r\n/** Parses the contents of a WebAssembly binary according to the specified options. */\r\nfunction parse(binary, options) {\r\n if (!options)\r\n options = {};\r\n // compile the parser if not yet compiled\r\n if (!compiled)\r\n compiled = new WebAssembly.Module(base64_decode(WASM_DATA));\r\n // use the binary as the parser's memory\r\n var nBytes = binary.length;\r\n var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16;\r\n var memory = new WebAssembly.Memory({ initial: nPages });\r\n var buffer = new Uint8Array(memory.buffer);\r\n buffer.set(binary);\r\n // provide a way to read strings from memory\r\n parse.readString = function (offset, length) { return utf8_read(buffer, offset, offset + length); };\r\n // instantiate the parser and return its exports\r\n var imports = {\r\n env: {\r\n memory: memory\r\n },\r\n options: {}\r\n };\r\n [\"onSection\",\r\n \"onType\",\r\n \"onTypeParam\",\r\n \"onTypeReturn\",\r\n \"onImport\",\r\n \"onFunctionImport\",\r\n \"onTableImport\",\r\n \"onMemoryImport\",\r\n \"onGlobalImport\",\r\n \"onMemory\",\r\n \"onFunction\",\r\n \"onTable\",\r\n \"onGlobal\",\r\n \"onExport\",\r\n \"onStart\",\r\n \"onSourceMappingURL\",\r\n \"onModuleName\",\r\n \"onFunctionName\",\r\n \"onLocalName\"\r\n ].forEach(function (name) { return imports.options[name] = options[name] || function () { }; });\r\n var instance = new WebAssembly.Instance(compiled, imports);\r\n instance.exports.parse(0, nBytes);\r\n}\r\nexports.parse = parse;\r\n// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/utf8\r\nfunction utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null, chunk = [], i = 0, // char offset\r\n t = 0; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128) {\r\n chunk[i++] = t;\r\n }\r\n else if (t > 191 && t < 224) {\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n }\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n }\r\n else {\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n }\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n}\r\n// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/base64\r\nfunction base64_decode(string) {\r\n var length = string.length;\r\n if (length) {\r\n var n = 0, p = length;\r\n while (--p % 4 > 1 && string.charCodeAt(p) === 61)\r\n ++n;\r\n length = Math.ceil(length * 3) / 4 - n;\r\n }\r\n var buffer = new Uint8Array(length);\r\n var j = 0, o = 0, t = 0;\r\n for (var i = 0, k = string.length; i < k;) {\r\n var c = string.charCodeAt(i++);\r\n if (c === 61 && j > 1)\r\n break;\r\n if ((c = s64[c]) === undefined)\r\n throw Error();\r\n switch (j) {\r\n case 0: {\r\n t = c;\r\n j = 1;\r\n break;\r\n }\r\n case 1: {\r\n buffer[o++] = t << 2 | (c & 48) >> 4;\r\n t = c;\r\n j = 2;\r\n break;\r\n }\r\n case 2: {\r\n buffer[o++] = (t & 15) << 4 | (c & 60) >> 2;\r\n t = c;\r\n j = 3;\r\n break;\r\n }\r\n case 3: {\r\n buffer[o++] = (t & 3) << 6 | c;\r\n j = 0;\r\n break;\r\n }\r\n }\r\n }\r\n if (j === 1)\r\n throw Error();\r\n return buffer;\r\n}\r\nvar s64 = new Array(123);\r\nfor (var i = 0; i < 64;)\r\n s64[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\r\n","\"use strict\";\r\n/** Common constants shared between AssemblyScript and TypeScript. */\r\nexports.__esModule = true;\r\n/** WebAssembly types. */\r\nvar Type;\r\n(function (Type) {\r\n Type[Type[\"i32\"] = 127] = \"i32\";\r\n Type[Type[\"i64\"] = 126] = \"i64\";\r\n Type[Type[\"f32\"] = 125] = \"f32\";\r\n Type[Type[\"f64\"] = 124] = \"f64\";\r\n Type[Type[\"anyfunc\"] = 112] = \"anyfunc\";\r\n Type[Type[\"func\"] = 96] = \"func\";\r\n Type[Type[\"none\"] = 64] = \"none\";\r\n})(Type = exports.Type || (exports.Type = {}));\r\n/** WebAssembly section ids. */\r\nvar SectionId;\r\n(function (SectionId) {\r\n SectionId[SectionId[\"Custom\"] = 0] = \"Custom\";\r\n SectionId[SectionId[\"Type\"] = 1] = \"Type\";\r\n SectionId[SectionId[\"Import\"] = 2] = \"Import\";\r\n SectionId[SectionId[\"Function\"] = 3] = \"Function\";\r\n SectionId[SectionId[\"Table\"] = 4] = \"Table\";\r\n SectionId[SectionId[\"Memory\"] = 5] = \"Memory\";\r\n SectionId[SectionId[\"Global\"] = 6] = \"Global\";\r\n SectionId[SectionId[\"Export\"] = 7] = \"Export\";\r\n SectionId[SectionId[\"Start\"] = 8] = \"Start\";\r\n SectionId[SectionId[\"Element\"] = 9] = \"Element\";\r\n SectionId[SectionId[\"Code\"] = 10] = \"Code\";\r\n SectionId[SectionId[\"Data\"] = 11] = \"Data\";\r\n})(SectionId = exports.SectionId || (exports.SectionId = {}));\r\n/** WebAssembly external kinds. */\r\nvar ExternalKind;\r\n(function (ExternalKind) {\r\n ExternalKind[ExternalKind[\"Function\"] = 0] = \"Function\";\r\n ExternalKind[ExternalKind[\"Table\"] = 1] = \"Table\";\r\n ExternalKind[ExternalKind[\"Memory\"] = 2] = \"Memory\";\r\n ExternalKind[ExternalKind[\"Global\"] = 3] = \"Global\";\r\n})(ExternalKind = exports.ExternalKind || (exports.ExternalKind = {}));\r\n/** Name section types. */\r\nvar NameType;\r\n(function (NameType) {\r\n NameType[NameType[\"Module\"] = 0] = \"Module\";\r\n NameType[NameType[\"Function\"] = 1] = \"Function\";\r\n NameType[NameType[\"Local\"] = 2] = \"Local\";\r\n})(NameType = exports.NameType || (exports.NameType = {}));\r\n/** Maximum number of memory pages. */\r\nexports.MAX_PAGES = 0xffff;\r\n/** Maximum number of table elements. */\r\nexports.MAX_ELEMS = 0xffffffff;\r\n/** WebAssembly opcodes. */\r\nvar Opcode;\r\n(function (Opcode) {\r\n // unreachable = 0x00,\r\n // nop = 0x01,\r\n // block = 0x02,\r\n // loop = 0x03,\r\n // if_ = 0x04,\r\n // else_ = 0x05,\r\n Opcode[Opcode[\"end\"] = 11] = \"end\";\r\n // br = 0x0c,\r\n // br_if = 0x0d,\r\n // br_table = 0x0e,\r\n // return_ = 0x0f,\r\n // call = 0x10,\r\n // call_indirect = 0x11,\r\n // drop = 0x1a,\r\n // select = 0x1b,\r\n // get_local = 0x20,\r\n // set_local = 0x21,\r\n // tee_local = 0x22,\r\n Opcode[Opcode[\"get_global\"] = 35] = \"get_global\";\r\n // set_global = 0x24,\r\n // i32_load = 0x28,\r\n // i64_load = 0x29,\r\n // f32_load = 0x2a,\r\n // f64_load = 0x2b,\r\n // i32_load8_s = 0x2c,\r\n // i32_load8_u = 0x2d,\r\n // i32_load16_s = 0x2e,\r\n // i32_load16_u = 0x2f,\r\n // i64_load8_s = 0x30,\r\n // i64_load8_u = 0x31,\r\n // i64_load16_s = 0x32,\r\n // i64_load16_u = 0x33,\r\n // i64_load32_s = 0x34,\r\n // i64_load32_u = 0x35,\r\n // i32_store = 0x36,\r\n // i64_store = 0x37,\r\n // f32_store = 0x38,\r\n // f64_store = 0x39,\r\n // i32_store8 = 0x3a,\r\n // i32_store16 = 0x3b,\r\n // i64_store8 = 0x3c,\r\n // i64_store16 = 0x3d,\r\n // i64_store32 = 0x3e,\r\n // current_memory = 0x3f,\r\n // grow_memory = 0x40,\r\n Opcode[Opcode[\"i32_const\"] = 65] = \"i32_const\";\r\n Opcode[Opcode[\"i64_const\"] = 66] = \"i64_const\";\r\n Opcode[Opcode[\"f32_const\"] = 67] = \"f32_const\";\r\n Opcode[Opcode[\"f64_const\"] = 68] = \"f64_const\";\r\n // i32_eqz = 0x45,\r\n // i32_eq = 0x46,\r\n // i32_ne = 0x47,\r\n // i32_lt_s = 0x48,\r\n // i32_lt_u = 0x49,\r\n // i32_gt_s = 0x4a,\r\n // i32_gt_u = 0x4b,\r\n // i32_le_s = 0x4c,\r\n // i32_le_u = 0x4d,\r\n // i32_ge_s = 0x4e,\r\n // i32_ge_u = 0x4f,\r\n // i64_eqz = 0x50,\r\n // i64_eq = 0x51,\r\n // i64_ne = 0x52,\r\n // i64_lt_s = 0x53,\r\n // i64_lt_u = 0x54,\r\n // i64_gt_s = 0x55,\r\n // i64_gt_u = 0x56,\r\n // i64_le_s = 0x57,\r\n // i64_le_u = 0x58,\r\n // i64_ge_s = 0x59,\r\n // i64_ge_u = 0x5a,\r\n // f32_eq = 0x5b,\r\n // f32_ne = 0x5c,\r\n // f32_lt = 0x5d,\r\n // f32_gt = 0x5e,\r\n // f32_le = 0x5f,\r\n // f32_ge = 0x60,\r\n // f64_eq = 0x61,\r\n // f64_ne = 0x62,\r\n // f64_lt = 0x63,\r\n // f64_gt = 0x64,\r\n // f64_le = 0x65,\r\n // f64_ge = 0x66,\r\n // i32_clz = 0x67,\r\n // i32_ctz = 0x68,\r\n // i32_popcnt = 0x69,\r\n // i32_add = 0x6a,\r\n // i32_sub = 0x6b,\r\n // i32_mul = 0x6c,\r\n // i32_div_s = 0x6d,\r\n // i32_div_u = 0x6e,\r\n // i32_rem_s = 0x6f,\r\n // i32_rem_u = 0x70,\r\n // i32_and = 0x71,\r\n // i32_or = 0x72,\r\n // i32_xor = 0x73,\r\n // i32_shl = 0x74,\r\n // i32_shr_s = 0x75,\r\n // i32_shr_u = 0x76,\r\n // i32_rotl = 0x77,\r\n // i32_rotr = 0x78,\r\n // i64_clz = 0x79,\r\n // i64_ctz = 0x7a,\r\n // i64_popcnt = 0x7b,\r\n // i64_add = 0x7c,\r\n // i64_sub = 0x7d,\r\n // i64_mul = 0x7e,\r\n // i64_div_s = 0x7f,\r\n // i64_div_u = 0x80,\r\n // i64_rem_s = 0x81,\r\n // i64_rem_u = 0x82,\r\n // i64_and = 0x83,\r\n // i64_or = 0x84,\r\n // i64_xor = 0x85,\r\n // i64_shl = 0x86,\r\n // i64_shr_s = 0x87,\r\n // i64_shr_u = 0x88,\r\n // i64_rotl = 0x89,\r\n // i64_rotr = 0x8a,\r\n // f32_abs = 0x8b,\r\n // f32_neg = 0x8c,\r\n // f32_ceil = 0x8d,\r\n // f32_floor = 0x8e,\r\n // f32_trunc = 0x8f,\r\n // f32_nearest = 0x90,\r\n // f32_sqrt = 0x91,\r\n // f32_add = 0x92,\r\n // f32_sub = 0x93,\r\n // f32_mul = 0x94,\r\n // f32_div = 0x95,\r\n // f32_min = 0x96,\r\n // f32_max = 0x97,\r\n // f32_copysign = 0x98,\r\n // f64_abs = 0x99,\r\n // f64_neg = 0x9a,\r\n // f64_ceil = 0x9b,\r\n // f64_floor = 0x9c,\r\n // f64_trunc = 0x9d,\r\n // f64_nearest = 0x9e,\r\n // f64_sqrt = 0x9f,\r\n // f64_add = 0xa0,\r\n // f64_sub = 0xa1,\r\n // f64_mul = 0xa2,\r\n // f64_div = 0xa3,\r\n // f64_min = 0xa4,\r\n // f64_max = 0xa5,\r\n // f64_copysign = 0xa6,\r\n // i32_wrap_i64 = 0xa7,\r\n // i32_trunc_s_f32 = 0xa8,\r\n // i32_trunc_u_f32 = 0xa9,\r\n // i32_trunc_s_f64 = 0xaa,\r\n // i32_trunc_u_f64 = 0xab,\r\n // i64_extend_s_i32 = 0xac,\r\n // i64_extend_u_i32 = 0xad,\r\n // i64_trunc_s_f32 = 0xae,\r\n // i64_trunc_u_f32 = 0xaf,\r\n // i64_trunc_s_f64 = 0xb0,\r\n // i64_trunc_u_f64 = 0xb1,\r\n // f32_convert_s_i32 = 0xb2,\r\n // f32_convert_u_i32 = 0xb3,\r\n // f32_convert_s_i64 = 0xb4,\r\n // f32_convert_u_i64 = 0xb5,\r\n // f32_demote_f64 = 0xb6,\r\n // f64_convert_s_i32 = 0xb7,\r\n // f64_convert_u_i32 = 0xb8,\r\n // f64_convert_s_i64 = 0xb9,\r\n // f64_convert_u_i64 = 0xba,\r\n // f64_promote_f32 = 0xbb,\r\n // i32_reinterpret_f32 = 0xbc,\r\n // i64_reinterpret_f64 = 0xbd,\r\n // f32_reinterpret_i32 = 0xbe,\r\n // f64_reinterpret_i64 = 0xbf\r\n})(Opcode = exports.Opcode || (exports.Opcode = {}));\r\n"],"sourceRoot":""} +<<<<<<< master + +======= +{"version":3,"sources":["webpack://asparse/webpack/universalModuleDefinition","webpack://asparse/webpack/bootstrap","webpack://asparse/./src/index.ts","webpack://asparse/./src/common.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","common_1","Type","SectionId","ExternalKind","compiled","parse","binary","options","WebAssembly","Module","string","length","charCodeAt","Math","ceil","buffer","Uint8Array","j","k","undefined","s64","Error","base64_decode","nBytes","nPages","memory","Memory","initial","set","readString","offset","start","end","parts","chunk","push","String","fromCharCode","apply","slice","join","utf8_read","readUint32","index","imports","env","forEach","Instance","Array","NameType","MAX_PAGES","MAX_ELEMS","Opcode"],"mappings":"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","file":"index.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"asparse\"] = factory();\n\telse\n\t\troot[\"asparse\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","\"use strict\";\nexports.__esModule = true;\nvar common_1 = require(\"./common\");\nexports.Type = common_1.Type;\nexports.SectionId = common_1.SectionId;\nexports.ExternalKind = common_1.ExternalKind;\n/** Cached compiled parser. */\nvar compiled = null;\nif (typeof WASM_DATA !== \"string\")\n WASM_DATA = require(\"fs\").readFileSync(__dirname + \"/../build/index.wasm\", \"base64\");\n/** Parses the contents of a WebAssembly binary according to the specified options. */\nfunction parse(binary, options) {\n if (!options)\n options = {};\n // compile the parser if not yet compiled\n if (!compiled)\n compiled = new WebAssembly.Module(base64_decode(WASM_DATA));\n // use the binary as the parser's memory\n var nBytes = binary.length;\n var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16;\n var memory = new WebAssembly.Memory({ initial: nPages });\n var buffer = new Uint8Array(memory.buffer);\n buffer.set(binary);\n // provide a way to read strings from memory\n parse.readString = function (offset, length) { return utf8_read(buffer, offset, offset + length); };\n parse.readUint32 = function (index) {\n return buffer[index];\n };\n // instantiate the parser and return its exports\n var imports = {\n env: {\n memory: memory\n },\n options: {}\n };\n [\"onSection\",\n \"onType\",\n \"onTypeParam\",\n \"onTypeReturn\",\n \"onImport\",\n \"onFunctionImport\",\n \"onTableImport\",\n \"onMemoryImport\",\n \"onGlobalImport\",\n \"onMemory\",\n \"onFunction\",\n \"onTable\",\n \"onGlobal\",\n \"onExport\",\n \"onStart\",\n \"onSourceMappingURL\",\n \"onModuleName\",\n \"onFunctionName\",\n \"onLocalName\"\n ].forEach(function (name) { return imports.options[name] = options[name] || function () { }; });\n var instance = new WebAssembly.Instance(compiled, imports);\n instance.exports.parse(0, nBytes);\n}\nexports.parse = parse;\n// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/utf8\nfunction utf8_read(buffer, start, end) {\n var len = end - start;\n if (len < 1)\n return \"\";\n var parts = null, chunk = [], i = 0, // char offset\n t = 0; // temporary\n while (start < end) {\n t = buffer[start++];\n if (t < 128) {\n chunk[i++] = t;\n }\n else if (t > 191 && t < 224) {\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\n }\n else if (t > 239 && t < 365) {\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\n chunk[i++] = 0xD800 + (t >> 10);\n chunk[i++] = 0xDC00 + (t & 1023);\n }\n else {\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\n }\n if (i > 8191) {\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\n i = 0;\n }\n }\n if (parts) {\n if (i)\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\n return parts.join(\"\");\n }\n return String.fromCharCode.apply(String, chunk.slice(0, i));\n}\n// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/base64\nfunction base64_decode(string) {\n var length = string.length;\n if (length) {\n var n = 0, p = length;\n while (--p % 4 > 1 && string.charCodeAt(p) === 61)\n ++n;\n length = Math.ceil(length * 3) / 4 - n;\n }\n var buffer = new Uint8Array(length);\n var j = 0, o = 0, t = 0;\n for (var i = 0, k = string.length; i < k;) {\n var c = string.charCodeAt(i++);\n if (c === 61 && j > 1)\n break;\n if ((c = s64[c]) === undefined)\n throw Error();\n switch (j) {\n case 0: {\n t = c;\n j = 1;\n break;\n }\n case 1: {\n buffer[o++] = t << 2 | (c & 48) >> 4;\n t = c;\n j = 2;\n break;\n }\n case 2: {\n buffer[o++] = (t & 15) << 4 | (c & 60) >> 2;\n t = c;\n j = 3;\n break;\n }\n case 3: {\n buffer[o++] = (t & 3) << 6 | c;\n j = 0;\n break;\n }\n }\n }\n if (j === 1)\n throw Error();\n return buffer;\n}\nvar s64 = new Array(123);\nfor (var i = 0; i < 64;)\n s64[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\n","\"use strict\";\n/** Common constants shared between AssemblyScript and TypeScript. */\nexports.__esModule = true;\n/** WebAssembly types. */\nvar Type;\n(function (Type) {\n Type[Type[\"i32\"] = 127] = \"i32\";\n Type[Type[\"i64\"] = 126] = \"i64\";\n Type[Type[\"f32\"] = 125] = \"f32\";\n Type[Type[\"f64\"] = 124] = \"f64\";\n Type[Type[\"anyfunc\"] = 112] = \"anyfunc\";\n Type[Type[\"func\"] = 96] = \"func\";\n Type[Type[\"none\"] = 64] = \"none\";\n})(Type = exports.Type || (exports.Type = {}));\n/** WebAssembly section ids. */\nvar SectionId;\n(function (SectionId) {\n SectionId[SectionId[\"Custom\"] = 0] = \"Custom\";\n SectionId[SectionId[\"Type\"] = 1] = \"Type\";\n SectionId[SectionId[\"Import\"] = 2] = \"Import\";\n SectionId[SectionId[\"Function\"] = 3] = \"Function\";\n SectionId[SectionId[\"Table\"] = 4] = \"Table\";\n SectionId[SectionId[\"Memory\"] = 5] = \"Memory\";\n SectionId[SectionId[\"Global\"] = 6] = \"Global\";\n SectionId[SectionId[\"Export\"] = 7] = \"Export\";\n SectionId[SectionId[\"Start\"] = 8] = \"Start\";\n SectionId[SectionId[\"Element\"] = 9] = \"Element\";\n SectionId[SectionId[\"Code\"] = 10] = \"Code\";\n SectionId[SectionId[\"Data\"] = 11] = \"Data\";\n})(SectionId = exports.SectionId || (exports.SectionId = {}));\n/** WebAssembly external kinds. */\nvar ExternalKind;\n(function (ExternalKind) {\n ExternalKind[ExternalKind[\"Function\"] = 0] = \"Function\";\n ExternalKind[ExternalKind[\"Table\"] = 1] = \"Table\";\n ExternalKind[ExternalKind[\"Memory\"] = 2] = \"Memory\";\n ExternalKind[ExternalKind[\"Global\"] = 3] = \"Global\";\n})(ExternalKind = exports.ExternalKind || (exports.ExternalKind = {}));\n/** Name section types. */\nvar NameType;\n(function (NameType) {\n NameType[NameType[\"Module\"] = 0] = \"Module\";\n NameType[NameType[\"Function\"] = 1] = \"Function\";\n NameType[NameType[\"Local\"] = 2] = \"Local\";\n})(NameType = exports.NameType || (exports.NameType = {}));\n/** Maximum number of memory pages. */\nexports.MAX_PAGES = 0xffff;\n/** Maximum number of table elements. */\nexports.MAX_ELEMS = 0xffffffff;\n/** WebAssembly opcodes. */\nvar Opcode;\n(function (Opcode) {\n // unreachable = 0x00,\n // nop = 0x01,\n // block = 0x02,\n // loop = 0x03,\n // if_ = 0x04,\n // else_ = 0x05,\n Opcode[Opcode[\"end\"] = 11] = \"end\";\n // br = 0x0c,\n // br_if = 0x0d,\n // br_table = 0x0e,\n // return_ = 0x0f,\n // call = 0x10,\n // call_indirect = 0x11,\n // drop = 0x1a,\n // select = 0x1b,\n // get_local = 0x20,\n // set_local = 0x21,\n // tee_local = 0x22,\n Opcode[Opcode[\"get_global\"] = 35] = \"get_global\";\n // set_global = 0x24,\n // i32_load = 0x28,\n // i64_load = 0x29,\n // f32_load = 0x2a,\n // f64_load = 0x2b,\n // i32_load8_s = 0x2c,\n // i32_load8_u = 0x2d,\n // i32_load16_s = 0x2e,\n // i32_load16_u = 0x2f,\n // i64_load8_s = 0x30,\n // i64_load8_u = 0x31,\n // i64_load16_s = 0x32,\n // i64_load16_u = 0x33,\n // i64_load32_s = 0x34,\n // i64_load32_u = 0x35,\n // i32_store = 0x36,\n // i64_store = 0x37,\n // f32_store = 0x38,\n // f64_store = 0x39,\n // i32_store8 = 0x3a,\n // i32_store16 = 0x3b,\n // i64_store8 = 0x3c,\n // i64_store16 = 0x3d,\n // i64_store32 = 0x3e,\n // current_memory = 0x3f,\n // grow_memory = 0x40,\n Opcode[Opcode[\"i32_const\"] = 65] = \"i32_const\";\n Opcode[Opcode[\"i64_const\"] = 66] = \"i64_const\";\n Opcode[Opcode[\"f32_const\"] = 67] = \"f32_const\";\n Opcode[Opcode[\"f64_const\"] = 68] = \"f64_const\";\n // i32_eqz = 0x45,\n // i32_eq = 0x46,\n // i32_ne = 0x47,\n // i32_lt_s = 0x48,\n // i32_lt_u = 0x49,\n // i32_gt_s = 0x4a,\n // i32_gt_u = 0x4b,\n // i32_le_s = 0x4c,\n // i32_le_u = 0x4d,\n // i32_ge_s = 0x4e,\n // i32_ge_u = 0x4f,\n // i64_eqz = 0x50,\n // i64_eq = 0x51,\n // i64_ne = 0x52,\n // i64_lt_s = 0x53,\n // i64_lt_u = 0x54,\n // i64_gt_s = 0x55,\n // i64_gt_u = 0x56,\n // i64_le_s = 0x57,\n // i64_le_u = 0x58,\n // i64_ge_s = 0x59,\n // i64_ge_u = 0x5a,\n // f32_eq = 0x5b,\n // f32_ne = 0x5c,\n // f32_lt = 0x5d,\n // f32_gt = 0x5e,\n // f32_le = 0x5f,\n // f32_ge = 0x60,\n // f64_eq = 0x61,\n // f64_ne = 0x62,\n // f64_lt = 0x63,\n // f64_gt = 0x64,\n // f64_le = 0x65,\n // f64_ge = 0x66,\n // i32_clz = 0x67,\n // i32_ctz = 0x68,\n // i32_popcnt = 0x69,\n // i32_add = 0x6a,\n // i32_sub = 0x6b,\n // i32_mul = 0x6c,\n // i32_div_s = 0x6d,\n // i32_div_u = 0x6e,\n // i32_rem_s = 0x6f,\n // i32_rem_u = 0x70,\n // i32_and = 0x71,\n // i32_or = 0x72,\n // i32_xor = 0x73,\n // i32_shl = 0x74,\n // i32_shr_s = 0x75,\n // i32_shr_u = 0x76,\n // i32_rotl = 0x77,\n // i32_rotr = 0x78,\n // i64_clz = 0x79,\n // i64_ctz = 0x7a,\n // i64_popcnt = 0x7b,\n // i64_add = 0x7c,\n // i64_sub = 0x7d,\n // i64_mul = 0x7e,\n // i64_div_s = 0x7f,\n // i64_div_u = 0x80,\n // i64_rem_s = 0x81,\n // i64_rem_u = 0x82,\n // i64_and = 0x83,\n // i64_or = 0x84,\n // i64_xor = 0x85,\n // i64_shl = 0x86,\n // i64_shr_s = 0x87,\n // i64_shr_u = 0x88,\n // i64_rotl = 0x89,\n // i64_rotr = 0x8a,\n // f32_abs = 0x8b,\n // f32_neg = 0x8c,\n // f32_ceil = 0x8d,\n // f32_floor = 0x8e,\n // f32_trunc = 0x8f,\n // f32_nearest = 0x90,\n // f32_sqrt = 0x91,\n // f32_add = 0x92,\n // f32_sub = 0x93,\n // f32_mul = 0x94,\n // f32_div = 0x95,\n // f32_min = 0x96,\n // f32_max = 0x97,\n // f32_copysign = 0x98,\n // f64_abs = 0x99,\n // f64_neg = 0x9a,\n // f64_ceil = 0x9b,\n // f64_floor = 0x9c,\n // f64_trunc = 0x9d,\n // f64_nearest = 0x9e,\n // f64_sqrt = 0x9f,\n // f64_add = 0xa0,\n // f64_sub = 0xa1,\n // f64_mul = 0xa2,\n // f64_div = 0xa3,\n // f64_min = 0xa4,\n // f64_max = 0xa5,\n // f64_copysign = 0xa6,\n // i32_wrap_i64 = 0xa7,\n // i32_trunc_s_f32 = 0xa8,\n // i32_trunc_u_f32 = 0xa9,\n // i32_trunc_s_f64 = 0xaa,\n // i32_trunc_u_f64 = 0xab,\n // i64_extend_s_i32 = 0xac,\n // i64_extend_u_i32 = 0xad,\n // i64_trunc_s_f32 = 0xae,\n // i64_trunc_u_f32 = 0xaf,\n // i64_trunc_s_f64 = 0xb0,\n // i64_trunc_u_f64 = 0xb1,\n // f32_convert_s_i32 = 0xb2,\n // f32_convert_u_i32 = 0xb3,\n // f32_convert_s_i64 = 0xb4,\n // f32_convert_u_i64 = 0xb5,\n // f32_demote_f64 = 0xb6,\n // f64_convert_s_i32 = 0xb7,\n // f64_convert_u_i32 = 0xb8,\n // f64_convert_s_i64 = 0xb9,\n // f64_convert_u_i64 = 0xba,\n // f64_promote_f32 = 0xbb,\n // i32_reinterpret_f32 = 0xbc,\n // i64_reinterpret_f64 = 0xbd,\n // f32_reinterpret_i32 = 0xbe,\n // f64_reinterpret_i64 = 0xbf\n})(Opcode = exports.Opcode || (exports.Opcode = {}));\n"],"sourceRoot":""} +>>>>>>> new Branch for parser + ======= {"version":3,"sources":["webpack://asparse/webpack/universalModuleDefinition","webpack://asparse/webpack/bootstrap","webpack://asparse/./src/index.ts","webpack://asparse/./src/common.ts"],"names":["root","factory","exports","module","define","amd","self","this","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","common_1","Type","SectionId","ExternalKind","compiled","parse","binary","options","WebAssembly","Module","string","length","charCodeAt","Math","ceil","buffer","Uint8Array","j","k","undefined","s64","Error","base64_decode","nBytes","nPages","memory","Memory","initial","set","readString","offset","start","end","parts","chunk","push","String","fromCharCode","apply","slice","join","utf8_read","readUint32","index","imports","env","forEach","Instance","Array","NameType","MAX_PAGES","MAX_ELEMS","Opcode"],"mappings":"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","file":"index.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"asparse\"] = factory();\n\telse\n\t\troot[\"asparse\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","\"use strict\";\nexports.__esModule = true;\nvar common_1 = require(\"./common\");\nexports.Type = common_1.Type;\nexports.SectionId = common_1.SectionId;\nexports.ExternalKind = common_1.ExternalKind;\n/** Cached compiled parser. */\nvar compiled = null;\nif (typeof WASM_DATA !== \"string\")\n WASM_DATA = require(\"fs\").readFileSync(__dirname + \"/../build/index.wasm\", \"base64\");\n/** Parses the contents of a WebAssembly binary according to the specified options. */\nfunction parse(binary, options) {\n if (!options)\n options = {};\n // compile the parser if not yet compiled\n if (!compiled)\n compiled = new WebAssembly.Module(base64_decode(WASM_DATA));\n // use the binary as the parser's memory\n var nBytes = binary.length;\n var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16;\n var memory = new WebAssembly.Memory({ initial: nPages });\n var buffer = new Uint8Array(memory.buffer);\n buffer.set(binary);\n // provide a way to read strings from memory\n parse.readString = function (offset, length) { return utf8_read(buffer, offset, offset + length); };\n parse.readUint32 = function (index) {\n return buffer[index];\n };\n // instantiate the parser and return its exports\n var imports = {\n env: {\n memory: memory\n },\n options: {}\n };\n [\"onSection\",\n \"onType\",\n \"onTypeParam\",\n \"onTypeReturn\",\n \"onImport\",\n \"onFunctionImport\",\n \"onTableImport\",\n \"onMemoryImport\",\n \"onGlobalImport\",\n \"onMemory\",\n \"onFunction\",\n \"onTable\",\n \"onGlobal\",\n \"onExport\",\n \"onStart\",\n \"onSourceMappingURL\",\n \"onModuleName\",\n \"onFunctionName\",\n \"onLocalName\"\n ].forEach(function (name) { return imports.options[name] = options[name] || function () { }; });\n var instance = new WebAssembly.Instance(compiled, imports);\n instance.exports.parse(0, nBytes);\n}\nexports.parse = parse;\n// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/utf8\nfunction utf8_read(buffer, start, end) {\n var len = end - start;\n if (len < 1)\n return \"\";\n var parts = null, chunk = [], i = 0, // char offset\n t = 0; // temporary\n while (start < end) {\n t = buffer[start++];\n if (t < 128) {\n chunk[i++] = t;\n }\n else if (t > 191 && t < 224) {\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\n }\n else if (t > 239 && t < 365) {\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\n chunk[i++] = 0xD800 + (t >> 10);\n chunk[i++] = 0xDC00 + (t & 1023);\n }\n else {\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\n }\n if (i > 8191) {\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\n i = 0;\n }\n }\n if (parts) {\n if (i)\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\n return parts.join(\"\");\n }\n return String.fromCharCode.apply(String, chunk.slice(0, i));\n}\n// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/base64\nfunction base64_decode(string) {\n var length = string.length;\n if (length) {\n var n = 0, p = length;\n while (--p % 4 > 1 && string.charCodeAt(p) === 61)\n ++n;\n length = Math.ceil(length * 3) / 4 - n;\n }\n var buffer = new Uint8Array(length);\n var j = 0, o = 0, t = 0;\n for (var i = 0, k = string.length; i < k;) {\n var c = string.charCodeAt(i++);\n if (c === 61 && j > 1)\n break;\n if ((c = s64[c]) === undefined)\n throw Error();\n switch (j) {\n case 0: {\n t = c;\n j = 1;\n break;\n }\n case 1: {\n buffer[o++] = t << 2 | (c & 48) >> 4;\n t = c;\n j = 2;\n break;\n }\n case 2: {\n buffer[o++] = (t & 15) << 4 | (c & 60) >> 2;\n t = c;\n j = 3;\n break;\n }\n case 3: {\n buffer[o++] = (t & 3) << 6 | c;\n j = 0;\n break;\n }\n }\n }\n if (j === 1)\n throw Error();\n return buffer;\n}\nvar s64 = new Array(123);\nfor (var i = 0; i < 64;)\n s64[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++;\n","\"use strict\";\n/** Common constants shared between AssemblyScript and TypeScript. */\nexports.__esModule = true;\n/** WebAssembly types. */\nvar Type;\n(function (Type) {\n Type[Type[\"i32\"] = 127] = \"i32\";\n Type[Type[\"i64\"] = 126] = \"i64\";\n Type[Type[\"f32\"] = 125] = \"f32\";\n Type[Type[\"f64\"] = 124] = \"f64\";\n Type[Type[\"anyfunc\"] = 112] = \"anyfunc\";\n Type[Type[\"func\"] = 96] = \"func\";\n Type[Type[\"none\"] = 64] = \"none\";\n})(Type = exports.Type || (exports.Type = {}));\n/** WebAssembly section ids. */\nvar SectionId;\n(function (SectionId) {\n SectionId[SectionId[\"Custom\"] = 0] = \"Custom\";\n SectionId[SectionId[\"Type\"] = 1] = \"Type\";\n SectionId[SectionId[\"Import\"] = 2] = \"Import\";\n SectionId[SectionId[\"Function\"] = 3] = \"Function\";\n SectionId[SectionId[\"Table\"] = 4] = \"Table\";\n SectionId[SectionId[\"Memory\"] = 5] = \"Memory\";\n SectionId[SectionId[\"Global\"] = 6] = \"Global\";\n SectionId[SectionId[\"Export\"] = 7] = \"Export\";\n SectionId[SectionId[\"Start\"] = 8] = \"Start\";\n SectionId[SectionId[\"Element\"] = 9] = \"Element\";\n SectionId[SectionId[\"Code\"] = 10] = \"Code\";\n SectionId[SectionId[\"Data\"] = 11] = \"Data\";\n})(SectionId = exports.SectionId || (exports.SectionId = {}));\n/** WebAssembly external kinds. */\nvar ExternalKind;\n(function (ExternalKind) {\n ExternalKind[ExternalKind[\"Function\"] = 0] = \"Function\";\n ExternalKind[ExternalKind[\"Table\"] = 1] = \"Table\";\n ExternalKind[ExternalKind[\"Memory\"] = 2] = \"Memory\";\n ExternalKind[ExternalKind[\"Global\"] = 3] = \"Global\";\n})(ExternalKind = exports.ExternalKind || (exports.ExternalKind = {}));\n/** Name section types. */\nvar NameType;\n(function (NameType) {\n NameType[NameType[\"Module\"] = 0] = \"Module\";\n NameType[NameType[\"Function\"] = 1] = \"Function\";\n NameType[NameType[\"Local\"] = 2] = \"Local\";\n})(NameType = exports.NameType || (exports.NameType = {}));\n/** Maximum number of memory pages. */\nexports.MAX_PAGES = 0xffff;\n/** Maximum number of table elements. */\nexports.MAX_ELEMS = 0xffffffff;\n/** WebAssembly opcodes. */\nvar Opcode;\n(function (Opcode) {\n // unreachable = 0x00,\n // nop = 0x01,\n // block = 0x02,\n // loop = 0x03,\n // if_ = 0x04,\n // else_ = 0x05,\n Opcode[Opcode[\"end\"] = 11] = \"end\";\n // br = 0x0c,\n // br_if = 0x0d,\n // br_table = 0x0e,\n // return_ = 0x0f,\n // call = 0x10,\n // call_indirect = 0x11,\n // drop = 0x1a,\n // select = 0x1b,\n // get_local = 0x20,\n // set_local = 0x21,\n // tee_local = 0x22,\n Opcode[Opcode[\"get_global\"] = 35] = \"get_global\";\n // set_global = 0x24,\n // i32_load = 0x28,\n // i64_load = 0x29,\n // f32_load = 0x2a,\n // f64_load = 0x2b,\n // i32_load8_s = 0x2c,\n // i32_load8_u = 0x2d,\n // i32_load16_s = 0x2e,\n // i32_load16_u = 0x2f,\n // i64_load8_s = 0x30,\n // i64_load8_u = 0x31,\n // i64_load16_s = 0x32,\n // i64_load16_u = 0x33,\n // i64_load32_s = 0x34,\n // i64_load32_u = 0x35,\n // i32_store = 0x36,\n // i64_store = 0x37,\n // f32_store = 0x38,\n // f64_store = 0x39,\n // i32_store8 = 0x3a,\n // i32_store16 = 0x3b,\n // i64_store8 = 0x3c,\n // i64_store16 = 0x3d,\n // i64_store32 = 0x3e,\n // current_memory = 0x3f,\n // grow_memory = 0x40,\n Opcode[Opcode[\"i32_const\"] = 65] = \"i32_const\";\n Opcode[Opcode[\"i64_const\"] = 66] = \"i64_const\";\n Opcode[Opcode[\"f32_const\"] = 67] = \"f32_const\";\n Opcode[Opcode[\"f64_const\"] = 68] = \"f64_const\";\n // i32_eqz = 0x45,\n // i32_eq = 0x46,\n // i32_ne = 0x47,\n // i32_lt_s = 0x48,\n // i32_lt_u = 0x49,\n // i32_gt_s = 0x4a,\n // i32_gt_u = 0x4b,\n // i32_le_s = 0x4c,\n // i32_le_u = 0x4d,\n // i32_ge_s = 0x4e,\n // i32_ge_u = 0x4f,\n // i64_eqz = 0x50,\n // i64_eq = 0x51,\n // i64_ne = 0x52,\n // i64_lt_s = 0x53,\n // i64_lt_u = 0x54,\n // i64_gt_s = 0x55,\n // i64_gt_u = 0x56,\n // i64_le_s = 0x57,\n // i64_le_u = 0x58,\n // i64_ge_s = 0x59,\n // i64_ge_u = 0x5a,\n // f32_eq = 0x5b,\n // f32_ne = 0x5c,\n // f32_lt = 0x5d,\n // f32_gt = 0x5e,\n // f32_le = 0x5f,\n // f32_ge = 0x60,\n // f64_eq = 0x61,\n // f64_ne = 0x62,\n // f64_lt = 0x63,\n // f64_gt = 0x64,\n // f64_le = 0x65,\n // f64_ge = 0x66,\n // i32_clz = 0x67,\n // i32_ctz = 0x68,\n // i32_popcnt = 0x69,\n // i32_add = 0x6a,\n // i32_sub = 0x6b,\n // i32_mul = 0x6c,\n // i32_div_s = 0x6d,\n // i32_div_u = 0x6e,\n // i32_rem_s = 0x6f,\n // i32_rem_u = 0x70,\n // i32_and = 0x71,\n // i32_or = 0x72,\n // i32_xor = 0x73,\n // i32_shl = 0x74,\n // i32_shr_s = 0x75,\n // i32_shr_u = 0x76,\n // i32_rotl = 0x77,\n // i32_rotr = 0x78,\n // i64_clz = 0x79,\n // i64_ctz = 0x7a,\n // i64_popcnt = 0x7b,\n // i64_add = 0x7c,\n // i64_sub = 0x7d,\n // i64_mul = 0x7e,\n // i64_div_s = 0x7f,\n // i64_div_u = 0x80,\n // i64_rem_s = 0x81,\n // i64_rem_u = 0x82,\n // i64_and = 0x83,\n // i64_or = 0x84,\n // i64_xor = 0x85,\n // i64_shl = 0x86,\n // i64_shr_s = 0x87,\n // i64_shr_u = 0x88,\n // i64_rotl = 0x89,\n // i64_rotr = 0x8a,\n // f32_abs = 0x8b,\n // f32_neg = 0x8c,\n // f32_ceil = 0x8d,\n // f32_floor = 0x8e,\n // f32_trunc = 0x8f,\n // f32_nearest = 0x90,\n // f32_sqrt = 0x91,\n // f32_add = 0x92,\n // f32_sub = 0x93,\n // f32_mul = 0x94,\n // f32_div = 0x95,\n // f32_min = 0x96,\n // f32_max = 0x97,\n // f32_copysign = 0x98,\n // f64_abs = 0x99,\n // f64_neg = 0x9a,\n // f64_ceil = 0x9b,\n // f64_floor = 0x9c,\n // f64_trunc = 0x9d,\n // f64_nearest = 0x9e,\n // f64_sqrt = 0x9f,\n // f64_add = 0xa0,\n // f64_sub = 0xa1,\n // f64_mul = 0xa2,\n // f64_div = 0xa3,\n // f64_min = 0xa4,\n // f64_max = 0xa5,\n // f64_copysign = 0xa6,\n // i32_wrap_i64 = 0xa7,\n // i32_trunc_s_f32 = 0xa8,\n // i32_trunc_u_f32 = 0xa9,\n // i32_trunc_s_f64 = 0xaa,\n // i32_trunc_u_f64 = 0xab,\n // i64_extend_s_i32 = 0xac,\n // i64_extend_u_i32 = 0xad,\n // i64_trunc_s_f32 = 0xae,\n // i64_trunc_u_f32 = 0xaf,\n // i64_trunc_s_f64 = 0xb0,\n // i64_trunc_u_f64 = 0xb1,\n // f32_convert_s_i32 = 0xb2,\n // f32_convert_u_i32 = 0xb3,\n // f32_convert_s_i64 = 0xb4,\n // f32_convert_u_i64 = 0xb5,\n // f32_demote_f64 = 0xb6,\n // f64_convert_s_i32 = 0xb7,\n // f64_convert_u_i32 = 0xb8,\n // f64_convert_s_i64 = 0xb9,\n // f64_convert_u_i64 = 0xba,\n // f64_promote_f32 = 0xbb,\n // i32_reinterpret_f32 = 0xbc,\n // i64_reinterpret_f64 = 0xbd,\n // f32_reinterpret_i32 = 0xbe,\n // f64_reinterpret_i64 = 0xbf\n})(Opcode = exports.Opcode || (exports.Opcode = {}));\n"],"sourceRoot":""} >>>>>>> new Branch for parser diff --git a/lib/parse/package.json b/lib/parse/package.json index fbc28177e8..a08657e4d4 100644 --- a/lib/parse/package.json +++ b/lib/parse/package.json @@ -6,7 +6,7 @@ "types": "index.d.ts", "scripts": { "asbuild": "asc assembly/index.ts -O3 -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate", - "asbuild:untouched": "asc assembly/index.ts -b build/index.wasm -t build/index.wat --debug --importMemory --sourceMap --validate", + "asbuild:untouched": "asc assembly/index.ts -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate", "build": "npm run asbuild && webpack --mode production --display-modules", "test": "ts-node tests/" }, From 1dd5ab95c8fdbc93db91d2fb6a7827ef7c538d5f Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Thu, 3 Jan 2019 12:06:10 +0100 Subject: [PATCH 09/46] Working on sections. --- lib/parse/assembly/index.ts | 7 + lib/parse/assembly/module/index.ts | 26 ++ lib/parse/build/index.wat | 677 +++++++++++++++++++++++++++++ lib/parse/package.json | 2 +- lib/parse/src/index.ts | 3 + 5 files changed, 714 insertions(+), 1 deletion(-) diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index 162f7592aa..8fd1381c6a 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -69,7 +69,11 @@ export function getImports(m: Module): void { // log(imports.length); if (imports.length>0) for (let i = 0; i< imports.length; i++){ +<<<<<<< loader-memory-accessors // log(imports.length); +======= + log(imports.length); +>>>>>>> Working on sections. // for (let j = 0; i< imports[i].imports.length; j++){ // let _import = imports[i].imports[j]; @@ -79,6 +83,7 @@ export function getImports(m: Module): void { // return } +<<<<<<< loader-memory-accessors export function removeStartFunction (m: Module): Uint8Array { if (m.hasStart) { let start : SectionHeader = m.getID(SectionId.Start)[0]; @@ -113,6 +118,8 @@ export function removeStartFunction (m: Module): Uint8Array { // // } +======= +>>>>>>> Working on sections. export function toString(t:TypeSection): string { return t.toString(); } diff --git a/lib/parse/assembly/module/index.ts b/lib/parse/assembly/module/index.ts index ee80c722b2..7d9e452f84 100644 --- a/lib/parse/assembly/module/index.ts +++ b/lib/parse/assembly/module/index.ts @@ -53,6 +53,7 @@ export class Module { } public getID(id: SectionId): SectionHeader[] { +<<<<<<< loader-memory-accessors let res: SectionHeader[] = new Array(); while(res.length > 0){ res.pop(); @@ -60,6 +61,13 @@ export class Module { let x: i32 = this.headers.length; // log("length of array should be zero"); // log(res.length) +======= + let res: SectionHeader[] = []; + while(res.length > 0){ + res.pop(); + } + let x: i32 = this.Headers.length; +>>>>>>> Working on sections. for (let i=0; i < x; i++){ if (this.headers[i].id == id){ res.push(this.headers[i]); @@ -77,11 +85,20 @@ export class Module { getImports(): Imports[] { let ImportHeaders = this.getID(SectionId.Import); let imports: Imports[] = []; +<<<<<<< loader-memory-accessors for (let i = 0; i < ImportHeaders.length; i++){ // log(ImportHeaders[i].name) let _import = new Imports(ImportHeaders[i]); imports.push(_import.parse(this.buf)); // log(_import.imports.length); +======= + log(imports.length); + for (let i = 0; i < ImportHeaders.length; i++){ + log(ImportHeaders[i].name) + let _import = new Imports(ImportHeaders[i]); + imports.push(_import.parse(this.buf)); + log(_import.imports.length); +>>>>>>> Working on sections. } return imports; } @@ -337,9 +354,15 @@ class Memory{ } } +<<<<<<< loader-memory-accessors class MemorySection extends Section { memory: Memory[]; +======= +class MemorySection { + memory: Memory[]; + +>>>>>>> Working on sections. parse(buf: Buffer): MemorySection { let count = buf.readVaruint(32); this.memory = new Array(count); @@ -355,10 +378,13 @@ class MemorySection extends Section { return this } } +<<<<<<< loader-memory-accessors class Data extends Section { } +======= +>>>>>>> Working on sections. /* case SectionId.Global: { let count = buf.readVaruint(32); diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index 15cf4edc26..8b8639d8d1 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -10,6 +10,7 @@ (type $iiiii (func (param i32 i32 i32 i32) (result i32))) (type $iiv (func (param i32 i32))) (import "env" "memory" (memory $0 1)) +<<<<<<< loader-memory-accessors (data (i32.const 8) "\16\00\00\00i\00n\00 \00t\00h\00e\00 \00s\00t\00a\00r\00t\00 \00f\00u\00n\00c\00t\00i\00o\00n\00!\00") (data (i32.const 56) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") (data (i32.const 88) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") @@ -71,6 +72,55 @@ (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) (import "index" "_log" (func $assembly/host/index/_log (param i32 i32))) +======= + (data (i32.const 8) "\00\00\00\00\00\00\00\00") + (data (i32.const 16) "\08\00\00\00\00\00\00\00") + (data (i32.const 24) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") + (data (i32.const 56) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") + (data (i32.const 120) "\01\00\00\000\00") + (data (i32.const 128) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 184) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\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 696) "\b8\00\00\00d\00\00\00") + (data (i32.const 704) "\03\00\00\00i\003\002\00") + (data (i32.const 720) "\03\00\00\00i\006\004\00") + (data (i32.const 736) "\03\00\00\00f\003\002\00") + (data (i32.const 752) "\03\00\00\00f\006\004\00") + (data (i32.const 768) "\07\00\00\00a\00n\00y\00f\00u\00n\00c\00") + (data (i32.const 792) "\04\00\00\00f\00u\00n\00c\00") + (data (i32.const 808) "\04\00\00\00n\00o\00n\00e\00") + (data (i32.const 824) "\00\00\00\00") + (data (i32.const 832) "\04\00\00\00n\00u\00l\00l\00") + (data (i32.const 848) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 880) "\02\00\00\00,\00 \00") + (data (i32.const 888) "\04\00\00\00v\00o\00i\00d\00") + (data (i32.const 904) "\07\00\00\00i\00n\00d\00e\00x\00:\00 \00") + (data (i32.const 928) "\06\00\00\00f\00o\00r\00m\00:\00 \00") + (data (i32.const 944) "\03\00\00\00,\00 \00(\00") + (data (i32.const 960) "\05\00\00\00)\00 \00=\00>\00 \00") + (data (i32.const 976) "\00\00\00\00\00\00\00\00") + (data (i32.const 984) "\d0\03\00\00\00\00\00\00") + (data (i32.const 992) "\01\00\00\00\n\00") + (data (i32.const 1000) "\00\00\00\00\00\00\00\00") + (data (i32.const 1008) "\e8\03\00\00\00\00\00\00") + (data (i32.const 1016) "\00\00\00\00\00\00\00\00") + (data (i32.const 1024) "\f8\03\00\00\00\00\00\00") + (data (i32.const 1032) "\01\00\00\00\'\00") + (data (i32.const 1040) "\06\00\00\00C\00u\00s\00t\00o\00m\00") + (data (i32.const 1056) "\04\00\00\00T\00y\00p\00e\00") + (data (i32.const 1072) "\06\00\00\00I\00m\00p\00o\00r\00t\00") + (data (i32.const 1088) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n\00") + (data (i32.const 1112) "\05\00\00\00T\00a\00b\00l\00e\00") + (data (i32.const 1128) "\06\00\00\00M\00e\00m\00o\00r\00y\00") + (data (i32.const 1144) "\06\00\00\00G\00l\00o\00b\00a\00l\00") + (data (i32.const 1160) "\06\00\00\00E\00x\00p\00o\00r\00t\00") + (data (i32.const 1176) "\05\00\00\00S\00t\00a\00r\00t\00") + (data (i32.const 1192) "\07\00\00\00E\00l\00e\00m\00e\00n\00t\00") + (data (i32.const 1216) "\04\00\00\00C\00o\00d\00e\00") + (data (i32.const 1232) "\04\00\00\00D\00a\00t\00a\00") + (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) + (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) + (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) +>>>>>>> Working on sections. (table $0 1 anyfunc) (elem (i32.const 0) $null) (global $src/common/MAX_PAGES i32 (i32.const 65535)) @@ -138,12 +188,19 @@ (global $src/common/ExternalKind.Table (mut i32) (i32.const 1)) (global $src/common/ExternalKind.Memory (mut i32) (i32.const 2)) (global $src/common/ExternalKind.Global (mut i32) (i32.const 3)) +<<<<<<< loader-memory-accessors (global $HEAP_BASE i32 (i32.const 1688)) +======= + (global $HEAP_BASE i32 (i32.const 1244)) +>>>>>>> Working on sections. (export "memory" (memory $0)) (export "table" (table $0)) (export "getType" (func $assembly/index/getType)) (export "getImports" (func $assembly/index/getImports)) +<<<<<<< loader-memory-accessors (export "removeStartFunction" (func $assembly/index/removeStartFunction)) +======= +>>>>>>> Working on sections. (export "toString" (func $assembly/index/toString)) (export "Parser#constructor" (func $assembly/index/Parser#constructor)) (export "Parser#get:buf" (func $Parser#get:buf)) @@ -164,7 +221,11 @@ (export "memory.free" (func $~lib/memory/memory.free)) (export "memory.reset" (func $~lib/memory/memory.reset)) (start $start) +<<<<<<< loader-memory-accessors (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +======= + (func $~lib/internal/memory/memset (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Working on sections. (local $3 i32) <<<<<<< loader-memory-accessors get_global $assembly/index/off @@ -659,13 +720,21 @@ end end ) +<<<<<<< loader-memory-accessors (func $~lib/memory/memory.fill (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +======= + (func $~lib/memory/memory.fill (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Working on sections. get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memset ) +<<<<<<< loader-memory-accessors (func $~lib/internal/memory/memcpy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +======= + (func $~lib/internal/memory/memcpy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Working on sections. (local $3 i32) (local $4 i32) (local $5 i32) @@ -1866,7 +1935,11 @@ i32.store8 end ) +<<<<<<< loader-memory-accessors (func $~lib/internal/memory/memmove (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +======= + (func $~lib/internal/memory/memmove (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Working on sections. (local $3 i32) get_local $0 get_local $1 @@ -2093,13 +2166,21 @@ end end ) +<<<<<<< loader-memory-accessors (func $~lib/memory/memory.copy (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +======= + (func $~lib/memory/memory.copy (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Working on sections. get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memmove ) +<<<<<<< loader-memory-accessors (func $~lib/internal/memory/memcmp (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) +======= + (func $~lib/internal/memory/memcmp (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) +>>>>>>> Working on sections. (local $3 i32) get_local $0 get_local $1 @@ -2153,13 +2234,21 @@ i32.const 0 end ) +<<<<<<< loader-memory-accessors (func $~lib/memory/memory.compare (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) +======= + (func $~lib/memory/memory.compare (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) +>>>>>>> Working on sections. get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memcmp ) +<<<<<<< loader-memory-accessors (func $~lib/allocator/arena/__memory_allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $~lib/allocator/arena/__memory_allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. (local $1 i32) (local $2 i32) (local $3 i32) @@ -2238,19 +2327,31 @@ set_global $~lib/allocator/arena/offset get_local $1 ) +<<<<<<< loader-memory-accessors (func $~lib/memory/memory.allocate (; 12 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $~lib/memory/memory.allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. get_local $0 call $~lib/allocator/arena/__memory_allocate return ) +<<<<<<< loader-memory-accessors (func $~lib/allocator/arena/__memory_free (; 13 ;) (type $iv) (param $0 i32) nop ) (func $~lib/memory/memory.free (; 14 ;) (type $iv) (param $0 i32) +======= + (func $~lib/allocator/arena/__memory_free (; 12 ;) (type $iv) (param $0 i32) + nop + ) + (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) +>>>>>>> Working on sections. get_local $0 call $~lib/allocator/arena/__memory_free return ) +<<<<<<< loader-memory-accessors (func $~lib/allocator/arena/__memory_reset (; 15 ;) (type $v) get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset @@ -2260,6 +2361,65 @@ return ) (func $assembly/host/index/log (; 17 ;) (type $iv) (param $0 i32) +======= + (func $~lib/allocator/arena/__memory_reset (; 14 ;) (type $v) + get_global $~lib/allocator/arena/startOffset + set_global $~lib/allocator/arena/offset + ) + (func $~lib/memory/memory.reset (; 15 ;) (type $v) + call $~lib/allocator/arena/__memory_reset + return + ) + (func $~lib/array/Array#pop (; 16 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.load offset=4 + set_local $1 + get_local $1 + i32.const 1 + i32.lt_s + if + i32.const 0 + i32.const 24 + i32.const 246 + i32.const 20 + call $~lib/env/abort + unreachable + end + block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) + get_local $0 + i32.load + set_local $2 + get_local $1 + i32.const 1 + i32.sub + tee_local $1 + set_local $3 + i32.const 0 + set_local $4 + get_local $2 + get_local $3 + i32.const 2 + i32.shl + i32.add + get_local $4 + i32.add + i32.load offset=8 + end + set_local $5 + get_local $0 + get_local $1 + i32.store offset=4 + get_local $5 + ) + (func $~lib/array/Array#__get (; 17 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) +>>>>>>> Working on sections. get_local $0 call $assembly/host/index/_log_str ) @@ -2304,6 +2464,7 @@ i32.store get_local $1 ) +<<<<<<< loader-memory-accessors (func $~lib/array/Array#constructor (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) @@ -2437,6 +2598,9 @@ end ) (func $~lib/internal/arraybuffer/reallocateUnsafe (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2538,7 +2702,11 @@ end get_local $0 ) +<<<<<<< loader-memory-accessors (func $~lib/array/Array#push (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $~lib/array/Array#push (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2600,7 +2768,11 @@ i32.store offset=8 get_local $5 ) +<<<<<<< loader-memory-accessors (func $assembly/module/index/Module#getID (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $assembly/module/index/Module#getID (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2668,7 +2840,11 @@ end get_local $2 ) +<<<<<<< loader-memory-accessors (func $assembly/module/index/Section#constructor (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $assembly/module/index/Section#constructor (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) get_local $0 if (result i32) @@ -2687,7 +2863,11 @@ end tee_local $0 ) +<<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#readVaruint (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $assembly/buffer/index/Buffer#readVaruint (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2742,7 +2922,11 @@ i32.store offset=8 get_local $2 ) +<<<<<<< loader-memory-accessors (func $~lib/array/Array#constructor (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $~lib/array/Array#constructor (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2801,7 +2985,11 @@ call $~lib/internal/memory/memset get_local $0 ) +<<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#readVarint (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $assembly/buffer/index/Buffer#readVarint (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2872,12 +3060,20 @@ end select ) +<<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#readVarint8 (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $assembly/buffer/index/Buffer#readVarint8 (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. get_local $0 get_local $1 call $assembly/buffer/index/Buffer#readVarint ) +<<<<<<< loader-memory-accessors (func $assembly/module/index/FuncType#constructor (; 31 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) +======= + (func $assembly/module/index/FuncType#constructor (; 28 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) +>>>>>>> Working on sections. (local $3 i32) get_local $0 if (result i32) @@ -2905,7 +3101,11 @@ end tee_local $0 ) +<<<<<<< loader-memory-accessors (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +======= + (func $~lib/array/Array#__set (; 29 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Working on sections. (local $3 i32) (local $4 i32) (local $5 i32) @@ -2961,7 +3161,11 @@ get_local $2 i32.store offset=8 ) +<<<<<<< loader-memory-accessors (func $~lib/array/Array#constructor (; 33 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $~lib/array/Array#constructor (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3020,7 +3224,11 @@ call $~lib/internal/memory/memset get_local $0 ) +<<<<<<< loader-memory-accessors (func $~lib/array/Array#__get (; 34 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $~lib/array/Array#__get (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) get_local $0 @@ -3047,7 +3255,11 @@ unreachable end ) +<<<<<<< loader-memory-accessors (func $~lib/array/Array#__set (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +======= + (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Working on sections. (local $3 i32) (local $4 i32) (local $5 i32) @@ -3103,7 +3315,11 @@ get_local $2 i32.store offset=8 ) +<<<<<<< loader-memory-accessors (func $~lib/internal/number/decimalCount32 (; 36 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $~lib/internal/number/decimalCount32 (; 33 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. (local $1 i32) get_local $0 i32.const 100000 @@ -3172,7 +3388,11 @@ unreachable unreachable ) +<<<<<<< loader-memory-accessors (func $~lib/internal/string/allocateUnsafe (; 37 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $~lib/internal/string/allocateUnsafe (; 34 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. (local $1 i32) (local $2 i32) get_local $0 @@ -3189,7 +3409,11 @@ i32.eqz if i32.const 0 +<<<<<<< loader-memory-accessors i32.const 160 +======= + i32.const 128 +>>>>>>> Working on sections. i32.const 14 i32.const 2 call $~lib/env/abort @@ -3212,7 +3436,11 @@ i32.store get_local $2 ) +<<<<<<< loader-memory-accessors (func $~lib/internal/number/utoa32_lut (; 38 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +======= + (func $~lib/internal/number/utoa32_lut (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Working on sections. (local $3 i32) (local $4 i32) (local $5 i32) @@ -3222,7 +3450,11 @@ (local $9 i64) (local $10 i64) block $~lib/internal/number/DIGITS|inlined.0 (result i32) +<<<<<<< loader-memory-accessors i32.const 728 +======= + i32.const 696 +>>>>>>> Working on sections. end i32.load set_local $3 @@ -3382,13 +3614,21 @@ i32.store16 offset=4 end ) +<<<<<<< loader-memory-accessors (func $~lib/internal/number/utoa32 (; 39 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $~lib/internal/number/utoa32 (; 36 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. (local $1 i32) (local $2 i32) get_local $0 i32.eqz if +<<<<<<< loader-memory-accessors i32.const 152 +======= + i32.const 120 +>>>>>>> Working on sections. return end get_local $0 @@ -3403,12 +3643,117 @@ call $~lib/internal/number/utoa32_lut get_local $2 ) +<<<<<<< loader-memory-accessors (func $~lib/internal/number/itoa (; 40 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $~lib/internal/number/itoa (; 37 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. get_local $0 call $~lib/internal/number/utoa32 return ) +<<<<<<< loader-memory-accessors (func $~lib/internal/string/copyUnsafe (; 41 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) +======= + (func $assembly/module/index/typeName (; 38 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + block $break|0 + block $case7|0 + block $case6|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + block $case0|0 + get_local $0 + set_local $1 + get_local $1 + i32.const 127 + i32.eq + br_if $case0|0 + get_local $1 + i32.const 126 + i32.eq + br_if $case1|0 + get_local $1 + i32.const 125 + i32.eq + br_if $case2|0 + get_local $1 + i32.const 124 + i32.eq + br_if $case3|0 + get_local $1 + i32.const 112 + i32.eq + br_if $case4|0 + get_local $1 + i32.const 96 + i32.eq + br_if $case5|0 + get_local $1 + i32.const 64 + i32.eq + br_if $case6|0 + br $case7|0 + end + i32.const 704 + return + end + i32.const 720 + return + end + i32.const 736 + return + end + i32.const 752 + return + end + i32.const 768 + return + end + i32.const 792 + return + end + i32.const 808 + return + end + unreachable + unreachable + end + unreachable + i32.const 824 + ) + (func $~lib/array/Array#__get (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + get_local $0 + i32.load + set_local $2 + get_local $1 + get_local $2 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + i32.const 0 + set_local $3 + get_local $2 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + ) + (func $~lib/internal/string/copyUnsafe (; 40 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) +>>>>>>> Working on sections. (local $5 i32) (local $6 i32) (local $7 i32) @@ -3437,7 +3782,11 @@ get_local $7 call $~lib/internal/memory/memmove ) +<<<<<<< loader-memory-accessors (func $~lib/string/String#concat (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $~lib/string/String#concat (; 41 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3449,7 +3798,11 @@ i32.eqz if i32.const 0 +<<<<<<< loader-memory-accessors i32.const 928 +======= + i32.const 848 +>>>>>>> Working on sections. i32.const 110 i32.const 4 call $~lib/env/abort @@ -3459,7 +3812,11 @@ i32.const 0 i32.eq if +<<<<<<< loader-memory-accessors i32.const 912 +======= + i32.const 832 +>>>>>>> Working on sections. set_local $1 end get_local $0 @@ -3476,7 +3833,11 @@ i32.const 0 i32.eq if +<<<<<<< loader-memory-accessors i32.const 960 +======= + i32.const 824 +>>>>>>> Working on sections. return end get_local $4 @@ -3496,17 +3857,26 @@ call $~lib/internal/string/copyUnsafe get_local $5 ) +<<<<<<< loader-memory-accessors (func $~lib/string/String.__concat (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if i32.const 912 +======= + (func $~lib/string/String.__concat (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 832 +>>>>>>> Working on sections. set_local $0 end get_local $0 get_local $1 call $~lib/string/String#concat ) +<<<<<<< loader-memory-accessors (func $assembly/host/index/err (; 44 ;) (type $iv) (param $0 i32) i32.const 888 get_local $0 @@ -3611,6 +3981,9 @@ end ) (func $assembly/module/index/FuncType#toString (; 47 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $assembly/module/index/FuncType#toString (; 43 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. (local $1 i32) (local $2 i32) (local $3 i32) @@ -3624,7 +3997,11 @@ i32.load8_s offset=12 call $assembly/module/index/typeName set_local $2 +<<<<<<< loader-memory-accessors i32.const 960 +======= + i32.const 824 +>>>>>>> Working on sections. set_local $3 block $break|0 i32.const 0 @@ -3663,7 +4040,11 @@ i32.lt_s if (result i32) get_local $3 +<<<<<<< loader-memory-accessors i32.const 968 +======= + i32.const 880 +>>>>>>> Working on sections. call $~lib/string/String.__concat tee_local $3 else @@ -3696,6 +4077,7 @@ call $~lib/array/Array#__get call $assembly/module/index/typeName else +<<<<<<< loader-memory-accessors i32.const 976 end set_local $4 @@ -3713,11 +4095,38 @@ get_local $3 call $~lib/string/String.__concat i32.const 1048 +======= + i32.const 888 + end + set_local $4 + i32.const 904 + get_local $1 + call $~lib/string/String.__concat + i32.const 880 + call $~lib/string/String.__concat + i32.const 928 + call $~lib/string/String.__concat + get_local $2 + call $~lib/string/String.__concat + i32.const 944 + call $~lib/string/String.__concat + get_local $3 + call $~lib/string/String.__concat + i32.const 960 +>>>>>>> Working on sections. call $~lib/string/String.__concat get_local $4 call $~lib/string/String.__concat ) +<<<<<<< loader-memory-accessors (func $assembly/module/index/TypeSection#parse (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $assembly/host/index/log (; 44 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_log_str + ) + (func $assembly/module/index/TypeSection#parse (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3868,7 +4277,11 @@ end get_local $0 ) +<<<<<<< loader-memory-accessors (func $~lib/array/Array#push (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $~lib/array/Array#push (; 46 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3930,7 +4343,11 @@ i32.store offset=8 get_local $5 ) +<<<<<<< loader-memory-accessors (func $~lib/array/Array#join (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $~lib/array/Array#join (; 47 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3951,10 +4368,17 @@ i32.const 0 i32.lt_s if +<<<<<<< loader-memory-accessors i32.const 960 return end i32.const 960 +======= + i32.const 824 + return + end + i32.const 824 +>>>>>>> Working on sections. set_local $3 get_local $0 i32.load @@ -4148,11 +4572,19 @@ get_local $8 return ) +<<<<<<< loader-memory-accessors (func $assembly/module/index/TypeSection#toString (; 51 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) i32.const 1072 +======= + (func $assembly/module/index/TypeSection#toString (; 48 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + i32.const 984 +>>>>>>> Working on sections. set_local $1 block $break|0 i32.const 0 @@ -4654,10 +5086,17 @@ unreachable end get_local $1 +<<<<<<< loader-memory-accessors i32.const 1080 call $~lib/array/Array#join ) (func $assembly/index/getType (; 52 ;) (type $ii) (param $0 i32) (result i32) +======= + i32.const 992 + call $~lib/array/Array#join + ) + (func $assembly/index/getType (; 49 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. (local $1 i32) (local $2 i32) get_local $0 @@ -4678,7 +5117,15 @@ get_global $assembly/index/type call $assembly/module/index/TypeSection#toString ) +<<<<<<< loader-memory-accessors (func $~lib/array/Array#constructor (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $assembly/host/index/log (; 50 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_logi + ) + (func $~lib/array/Array#constructor (; 51 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -4688,7 +5135,11 @@ i32.gt_u if i32.const 0 +<<<<<<< loader-memory-accessors i32.const 56 +======= + i32.const 24 +>>>>>>> Working on sections. i32.const 45 i32.const 39 call $~lib/env/abort @@ -4737,7 +5188,11 @@ call $~lib/internal/memory/memset get_local $0 ) +<<<<<<< loader-memory-accessors (func $~lib/string/String.fromUTF8 (; 54 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $~lib/string/String.fromUTF8 (; 52 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -4748,7 +5203,11 @@ i32.const 1 i32.lt_u if +<<<<<<< loader-memory-accessors i32.const 960 +======= + i32.const 824 +>>>>>>> Working on sections. return end i32.const 0 @@ -4818,7 +5277,11 @@ i32.eqz if i32.const 0 +<<<<<<< loader-memory-accessors i32.const 928 +======= + i32.const 848 +>>>>>>> Working on sections. i32.const 510 i32.const 8 call $~lib/env/abort @@ -4999,7 +5462,11 @@ i32.eqz if i32.const 0 +<<<<<<< loader-memory-accessors i32.const 928 +======= + i32.const 848 +>>>>>>> Working on sections. i32.const 514 i32.const 8 call $~lib/env/abort @@ -5126,7 +5593,11 @@ i32.eqz if i32.const 0 +<<<<<<< loader-memory-accessors i32.const 928 +======= + i32.const 848 +>>>>>>> Working on sections. i32.const 526 i32.const 8 call $~lib/env/abort @@ -5198,7 +5669,11 @@ i32.eqz if i32.const 0 +<<<<<<< loader-memory-accessors i32.const 928 +======= + i32.const 848 +>>>>>>> Working on sections. i32.const 535 i32.const 4 call $~lib/env/abort @@ -5228,7 +5703,11 @@ end get_local $7 ) +<<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#readUint (; 55 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $assembly/buffer/index/Buffer#readUint (; 53 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. (local $1 i32) (local $2 i32) get_local $0 @@ -5244,7 +5723,11 @@ i32.store offset=8 get_local $2 ) +<<<<<<< loader-memory-accessors (func $assembly/module/imports/Import#constructor (; 56 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) +======= + (func $assembly/module/imports/Import#constructor (; 54 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) +>>>>>>> Working on sections. (local $4 i32) get_local $0 if (result i32) @@ -5269,7 +5752,11 @@ end tee_local $0 ) +<<<<<<< loader-memory-accessors (func $~lib/array/Array#__set (; 57 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +======= + (func $~lib/array/Array#__set (; 55 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Working on sections. (local $3 i32) (local $4 i32) (local $5 i32) @@ -5290,7 +5777,11 @@ i32.ge_u if i32.const 0 +<<<<<<< loader-memory-accessors i32.const 56 +======= + i32.const 24 +>>>>>>> Working on sections. i32.const 109 i32.const 41 call $~lib/env/abort @@ -5325,7 +5816,11 @@ get_local $2 i32.store offset=8 ) +<<<<<<< loader-memory-accessors (func $assembly/module/imports/Imports#parse (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $assembly/module/imports/Imports#parse (; 56 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -5531,7 +6026,11 @@ end get_local $0 ) +<<<<<<< loader-memory-accessors (func $~lib/array/Array#push (; 59 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $~lib/array/Array#push (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -5561,7 +6060,11 @@ i32.ge_u if i32.const 0 +<<<<<<< loader-memory-accessors i32.const 56 +======= + i32.const 24 +>>>>>>> Working on sections. i32.const 184 i32.const 42 call $~lib/env/abort @@ -5593,17 +6096,35 @@ i32.store offset=8 get_local $5 ) +<<<<<<< loader-memory-accessors (func $assembly/module/index/Module#getImports (; 60 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $assembly/module/index/Module#getImports (; 58 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) +<<<<<<< loader-memory-accessors +======= + (local $5 i32) +>>>>>>> Working on sections. get_local $0 get_global $src/common/SectionId.Import call $assembly/module/index/Module#getID set_local $1 +<<<<<<< loader-memory-accessors i32.const 1096 set_local $2 +======= + i32.const 1008 + set_local $2 + block $~lib/array/Array#get:length|inlined.0 (result i32) + get_local $2 + i32.load offset=4 + end + call $assembly/host/index/log +>>>>>>> Working on sections. block $break|0 i32.const 0 set_local $3 @@ -5617,6 +6138,14 @@ i32.eqz br_if $break|0 block +<<<<<<< loader-memory-accessors +======= + get_local $1 + get_local $3 + call $~lib/array/Array#__get + i32.load offset=16 + call $assembly/host/index/log +>>>>>>> Working on sections. i32.const 0 get_local $1 get_local $3 @@ -5630,6 +6159,17 @@ call $assembly/module/imports/Imports#parse call $~lib/array/Array#push drop +<<<<<<< loader-memory-accessors +======= + block $~lib/array/Array#get:length|inlined.0 (result i32) + get_local $4 + i32.load offset=4 + set_local $5 + get_local $5 + i32.load offset=4 + end + call $assembly/host/index/log +>>>>>>> Working on sections. end get_local $3 i32.const 1 @@ -5642,13 +6182,21 @@ end get_local $2 ) +<<<<<<< loader-memory-accessors (func $assembly/index/getImports (; 61 ;) (type $iv) (param $0 i32) +======= + (func $assembly/index/getImports (; 59 ;) (type $iv) (param $0 i32) +>>>>>>> Working on sections. (local $1 i32) (local $2 i32) get_local $0 call $assembly/module/index/Module#getImports set_local $1 +<<<<<<< loader-memory-accessors block $~lib/array/Array#get:length|inlined.1 (result i32) +======= + block $~lib/array/Array#get:length|inlined.2 (result i32) +>>>>>>> Working on sections. get_local $1 i32.load offset=4 end @@ -5660,14 +6208,26 @@ set_local $2 loop $repeat|0 get_local $2 +<<<<<<< loader-memory-accessors block $~lib/array/Array#get:length|inlined.3 (result i32) +======= + block $~lib/array/Array#get:length|inlined.4 (result i32) +>>>>>>> Working on sections. get_local $1 i32.load offset=4 end i32.lt_s i32.eqz br_if $break|0 +<<<<<<< loader-memory-accessors nop +======= + block $~lib/array/Array#get:length|inlined.5 (result i32) + get_local $1 + i32.load offset=4 + end + call $assembly/host/index/log +>>>>>>> Working on sections. get_local $2 i32.const 1 i32.add @@ -5679,6 +6239,7 @@ end end ) +<<<<<<< loader-memory-accessors (func $assembly/module/index/Module#get:start (; 62 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Start @@ -6072,6 +6633,13 @@ call $assembly/module/index/TypeSection#toString ) (func $assembly/module/index/Module#constructor (; 75 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $assembly/index/toString (; 60 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $assembly/module/index/TypeSection#toString + ) + (func $assembly/module/index/Module#constructor (; 61 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) get_local $0 if (result i32) @@ -6095,11 +6663,19 @@ get_local $1 i32.store offset=4 get_local $0 +<<<<<<< loader-memory-accessors i32.const 1352 i32.store get_local $0 ) (func $assembly/index/Parser#constructor (; 76 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + i32.const 1024 + i32.store + get_local $0 + ) + (func $assembly/index/Parser#constructor (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) get_local $0 if (result i32) @@ -6129,7 +6705,11 @@ i32.store offset=4 get_local $0 ) +<<<<<<< loader-memory-accessors (func $assembly/index/Parser#parseString (; 77 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $assembly/index/Parser#parseString (; 63 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. get_local $0 i32.load i32.load offset=8 @@ -6139,29 +6719,45 @@ call $assembly/buffer/index/Buffer#readVaruint call $~lib/string/String.fromUTF8 ) +<<<<<<< loader-memory-accessors (func $assembly/index/Parser#readVaruint (; 78 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $assembly/index/Parser#readVaruint (; 64 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. get_local $0 i32.load get_local $1 call $assembly/buffer/index/Buffer#readVaruint ) +<<<<<<< loader-memory-accessors (func $assembly/index/Parser#get:off (; 79 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $assembly/index/Parser#get:off (; 65 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. get_local $0 i32.load i32.load offset=8 ) +<<<<<<< loader-memory-accessors (func $assembly/index/Parser#set:off (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) +======= + (func $assembly/index/Parser#set:off (; 66 ;) (type $iiv) (param $0 i32) (param $1 i32) +>>>>>>> Working on sections. get_local $0 i32.load get_local $1 i32.store offset=8 ) +<<<<<<< loader-memory-accessors (func $~lib/arraybuffer/ArrayBuffer#get:data (; 81 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $~lib/internal/arraybuffer/HEADER_SIZE i32.add ) (func $assembly/buffer/index/Buffer#readUint (; 82 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $assembly/buffer/index/Buffer#readUint (; 67 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. (local $1 i32) (local $2 i32) get_local $0 @@ -6177,7 +6773,11 @@ i32.store offset=8 get_local $2 ) +<<<<<<< loader-memory-accessors (func $assembly/module/index/sectionName (; 83 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $assembly/module/index/sectionName (; 68 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. (local $1 i32) block $break|0 block $case12|0 @@ -6245,6 +6845,7 @@ br_if $case11|0 br $case12|0 end +<<<<<<< loader-memory-accessors i32.const 1424 return end @@ -6255,6 +6856,18 @@ return end i32.const 1472 +======= + i32.const 1040 + return + end + i32.const 1056 + return + end + i32.const 1072 + return + end + i32.const 1088 +>>>>>>> Working on sections. return end i32.const 1496 @@ -6285,9 +6898,15 @@ unreachable end unreachable +<<<<<<< loader-memory-accessors i32.const 960 ) (func $assembly/module/index/SectionHeader#constructor (; 84 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + i32.const 824 + ) + (func $assembly/module/index/SectionHeader#constructor (; 69 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) (local $3 i32) (local $4 i32) @@ -6312,7 +6931,11 @@ i32.const 0 i32.store offset=12 get_local $2 +<<<<<<< loader-memory-accessors i32.const 0 +======= + i32.const 824 +>>>>>>> Working on sections. i32.store offset=16 get_local $2 i32.const 960 @@ -6410,7 +7033,11 @@ i32.store offset=12 get_local $0 ) +<<<<<<< loader-memory-accessors (func $assembly/module/index/Module#parseSection (; 85 ;) (type $iiv) (param $0 i32) (param $1 i32) +======= + (func $assembly/module/index/Module#parseSection (; 70 ;) (type $iiv) (param $0 i32) (param $1 i32) +>>>>>>> Working on sections. (local $2 i32) get_local $0 i32.load @@ -6433,7 +7060,18 @@ end end ) +<<<<<<< loader-memory-accessors (func $assembly/index/Parser#parse (; 86 ;) (type $iv) (param $0 i32) +======= + (func $assembly/module/index/SectionHeader#get:end (; 71 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load offset=12 + get_local $0 + i32.load offset=8 + i32.add + ) + (func $assembly/index/Parser#parse (; 72 ;) (type $iv) (param $0 i32) +>>>>>>> Working on sections. (local $1 i32) (local $2 i32) (local $3 i32) @@ -6548,7 +7186,16 @@ end end ) +<<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#constructor (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $~lib/arraybuffer/ArrayBuffer#get:data (; 73 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + ) + (func $assembly/buffer/index/Buffer#constructor (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Working on sections. (local $2 i32) get_local $0 if (result i32) @@ -6602,12 +7249,16 @@ i32.store offset=16 get_local $0 ) +<<<<<<< loader-memory-accessors (func $assembly/host/index/log (; 88 ;) (type $iv) (param $0 i32) get_local $0 i32.const 20 call $assembly/host/index/_log ) (func $assembly/index/newParser (; 89 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $assembly/index/newParser (; 75 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. (local $1 i32) get_local $0 call $assembly/host/index/log @@ -6624,13 +7275,21 @@ get_local $1 call $assembly/index/Parser#constructor ) +<<<<<<< loader-memory-accessors (func $assembly/index/parse (; 90 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $assembly/index/parse (; 76 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. get_local $0 call $assembly/index/Parser#parse get_local $0 i32.load offset=4 ) +<<<<<<< loader-memory-accessors (func $start (; 91 ;) (type $v) +======= + (func $start (; 77 ;) (type $v) +>>>>>>> Working on sections. get_global $HEAP_BASE get_global $~lib/internal/allocator/AL_MASK i32.add @@ -6645,6 +7304,7 @@ i32.const 8 call $assembly/host/index/log ) +<<<<<<< loader-memory-accessors (func $null (; 92 ;) (type $v) ) (func $Parser#get:buf (; 93 ;) (type $ii) (param $0 i32) (result i32) @@ -6652,15 +7312,32 @@ i32.load ) (func $Parser#set:buf (; 94 ;) (type $iiv) (param $0 i32) (param $1 i32) +======= + (func $null (; 78 ;) (type $v) + ) + (func $Parser#get:buf (; 79 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load + ) + (func $Parser#set:buf (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) +>>>>>>> Working on sections. get_local $0 get_local $1 i32.store ) +<<<<<<< loader-memory-accessors (func $Parser#get:module (; 95 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) (func $Parser#set:module (; 96 ;) (type $iiv) (param $0 i32) (param $1 i32) +======= + (func $Parser#get:module (; 81 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load offset=4 + ) + (func $Parser#set:module (; 82 ;) (type $iiv) (param $0 i32) (param $1 i32) +>>>>>>> Working on sections. get_local $0 get_local $1 i32.store offset=4 diff --git a/lib/parse/package.json b/lib/parse/package.json index a08657e4d4..fbc28177e8 100644 --- a/lib/parse/package.json +++ b/lib/parse/package.json @@ -6,7 +6,7 @@ "types": "index.d.ts", "scripts": { "asbuild": "asc assembly/index.ts -O3 -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate", - "asbuild:untouched": "asc assembly/index.ts -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate", + "asbuild:untouched": "asc assembly/index.ts -b build/index.wasm -t build/index.wat --debug --importMemory --sourceMap --validate", "build": "npm run asbuild && webpack --mode production --display-modules", "test": "ts-node tests/" }, diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index c3b29d0c5b..f0a284429f 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -140,6 +140,7 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { let Mod = instance.parse(parserPtr); console.log(instance.getString((instance as any).getType(Mod))); (instance as any).getImports(Mod); +<<<<<<< loader-memory-accessors // let arraybuf = instance.getArray(Uint8Array, array); let newptr = (instance as any).removeStartFunction(Mod); // debugger; @@ -153,6 +154,8 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { let instance2 = loader.instantiateBuffer(buf, imports); instance2.start(); +======= +>>>>>>> Working on sections. // let sections = buffer.slice(instance.I32[Mod], 2); // console.log(sections[1]) // let arrayBuf = sections[0]>>2; From b14e952b3e808c2c03678714bb51a9baabbb454d Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Sat, 5 Jan 2019 11:20:30 +0100 Subject: [PATCH 10/46] Remove start correctly. Now need to abstract to remove any section. --- lib/parse/assembly/index.ts | 10 + lib/parse/assembly/module/index.ts | 2 +- lib/parse/build/index.wat | 1116 +++++++++++++++++++++++++++- lib/parse/src/index.ts | 6 + 4 files changed, 1113 insertions(+), 21 deletions(-) diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index 8fd1381c6a..56d273cd32 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -69,11 +69,15 @@ export function getImports(m: Module): void { // log(imports.length); if (imports.length>0) for (let i = 0; i< imports.length; i++){ +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors // log(imports.length); ======= log(imports.length); >>>>>>> Working on sections. +======= + // log(imports.length); +>>>>>>> Remove start correctly. Now need to abstract to remove any section. // for (let j = 0; i< imports[i].imports.length; j++){ // let _import = imports[i].imports[j]; @@ -84,6 +88,9 @@ export function getImports(m: Module): void { } <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. export function removeStartFunction (m: Module): Uint8Array { if (m.hasStart) { let start : SectionHeader = m.getID(SectionId.Start)[0]; @@ -118,8 +125,11 @@ export function removeStartFunction (m: Module): Uint8Array { // // } +<<<<<<< loader-memory-accessors ======= >>>>>>> Working on sections. +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. export function toString(t:TypeSection): string { return t.toString(); } diff --git a/lib/parse/assembly/module/index.ts b/lib/parse/assembly/module/index.ts index 7d9e452f84..f2c96b7d71 100644 --- a/lib/parse/assembly/module/index.ts +++ b/lib/parse/assembly/module/index.ts @@ -94,7 +94,7 @@ export class Module { ======= log(imports.length); for (let i = 0; i < ImportHeaders.length; i++){ - log(ImportHeaders[i].name) + // log(ImportHeaders[i].name) let _import = new Imports(ImportHeaders[i]); imports.push(_import.parse(this.buf)); log(_import.imports.length); diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index 8b8639d8d1..1fae754230 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -11,6 +11,9 @@ (type $iiv (func (param i32 i32))) (import "env" "memory" (memory $0 1)) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (data (i32.const 8) "\16\00\00\00i\00n\00 \00t\00h\00e\00 \00s\00t\00a\00r\00t\00 \00f\00u\00n\00c\00t\00i\00o\00n\00!\00") (data (i32.const 56) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") (data (i32.const 88) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") @@ -68,6 +71,7 @@ (data (i32.const 1616) "\04\00\00\00D\00a\00t\00a\00") (data (i32.const 1632) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 \00") (data (i32.const 1664) "\t\00\00\00-\00-\00-\00-\00-\00-\00-\00-\00-\00") +<<<<<<< loader-memory-accessors (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) @@ -118,9 +122,16 @@ (data (i32.const 1216) "\04\00\00\00C\00o\00d\00e\00") (data (i32.const 1232) "\04\00\00\00D\00a\00t\00a\00") (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) + (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) +<<<<<<< loader-memory-accessors >>>>>>> Working on sections. +======= + (import "index" "_log" (func $assembly/host/index/_log (param i32 i32))) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (table $0 1 anyfunc) (elem (i32.const 0) $null) (global $src/common/MAX_PAGES i32 (i32.const 65535)) @@ -188,19 +199,27 @@ (global $src/common/ExternalKind.Table (mut i32) (i32.const 1)) (global $src/common/ExternalKind.Memory (mut i32) (i32.const 2)) (global $src/common/ExternalKind.Global (mut i32) (i32.const 3)) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (global $HEAP_BASE i32 (i32.const 1688)) ======= (global $HEAP_BASE i32 (i32.const 1244)) >>>>>>> Working on sections. +======= + (global $HEAP_BASE i32 (i32.const 1688)) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (export "memory" (memory $0)) (export "table" (table $0)) (export "getType" (func $assembly/index/getType)) (export "getImports" (func $assembly/index/getImports)) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (export "removeStartFunction" (func $assembly/index/removeStartFunction)) ======= >>>>>>> Working on sections. +======= + (export "removeStartFunction" (func $assembly/index/removeStartFunction)) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (export "toString" (func $assembly/index/toString)) (export "Parser#constructor" (func $assembly/index/Parser#constructor)) (export "Parser#get:buf" (func $Parser#get:buf)) @@ -221,11 +240,15 @@ (export "memory.free" (func $~lib/memory/memory.free)) (export "memory.reset" (func $~lib/memory/memory.reset)) (start $start) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= (func $~lib/internal/memory/memset (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Working on sections. +======= + (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $3 i32) <<<<<<< loader-memory-accessors get_global $assembly/index/off @@ -720,21 +743,29 @@ end end ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/memory/memory.fill (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= (func $~lib/memory/memory.fill (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Working on sections. +======= + (func $~lib/memory/memory.fill (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memset ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/memory/memcpy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= (func $~lib/internal/memory/memcpy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Working on sections. +======= + (func $~lib/internal/memory/memcpy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $3 i32) (local $4 i32) (local $5 i32) @@ -1935,11 +1966,15 @@ i32.store8 end ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/memory/memmove (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= (func $~lib/internal/memory/memmove (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Working on sections. +======= + (func $~lib/internal/memory/memmove (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $3 i32) get_local $0 get_local $1 @@ -2166,21 +2201,29 @@ end end ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/memory/memory.copy (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= (func $~lib/memory/memory.copy (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Working on sections. +======= + (func $~lib/memory/memory.copy (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memmove ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/memory/memcmp (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ======= (func $~lib/internal/memory/memcmp (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/internal/memory/memcmp (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $3 i32) get_local $0 get_local $1 @@ -2234,21 +2277,29 @@ i32.const 0 end ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/memory/memory.compare (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ======= (func $~lib/memory/memory.compare (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/memory/memory.compare (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memcmp ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/allocator/arena/__memory_allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) ======= (func $~lib/allocator/arena/__memory_allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/allocator/arena/__memory_allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $1 i32) (local $2 i32) (local $3 i32) @@ -2327,15 +2378,20 @@ set_global $~lib/allocator/arena/offset get_local $1 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/memory/memory.allocate (; 12 ;) (type $ii) (param $0 i32) (result i32) ======= (func $~lib/memory/memory.allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/memory/memory.allocate (; 12 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 call $~lib/allocator/arena/__memory_allocate return ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/allocator/arena/__memory_free (; 13 ;) (type $iv) (param $0 i32) nop @@ -2347,10 +2403,17 @@ ) (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) >>>>>>> Working on sections. +======= + (func $~lib/allocator/arena/__memory_free (; 13 ;) (type $iv) (param $0 i32) + nop + ) + (func $~lib/memory/memory.free (; 14 ;) (type $iv) (param $0 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 call $~lib/allocator/arena/__memory_free return ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/allocator/arena/__memory_reset (; 15 ;) (type $v) get_global $~lib/allocator/arena/startOffset @@ -2363,14 +2426,121 @@ (func $assembly/host/index/log (; 17 ;) (type $iv) (param $0 i32) ======= (func $~lib/allocator/arena/__memory_reset (; 14 ;) (type $v) +======= + (func $~lib/allocator/arena/__memory_reset (; 15 ;) (type $v) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset ) - (func $~lib/memory/memory.reset (; 15 ;) (type $v) + (func $~lib/memory/memory.reset (; 16 ;) (type $v) call $~lib/allocator/arena/__memory_reset return ) - (func $~lib/array/Array#pop (; 16 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/host/index/log (; 17 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_log_str + ) + (func $~lib/internal/arraybuffer/computeSize (; 18 ;) (type $ii) (param $0 i32) (result i32) + i32.const 1 + i32.const 32 + get_local $0 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + i32.const 1 + i32.sub + i32.clz + i32.sub + i32.shl + ) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 19 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + get_global $~lib/internal/arraybuffer/MAX_BLENGTH + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 88 + i32.const 26 + i32.const 2 + call $~lib/env/abort + unreachable + end + block $~lib/memory/memory.allocate|inlined.0 (result i32) + get_local $0 + call $~lib/internal/arraybuffer/computeSize + set_local $2 + get_local $2 + call $~lib/allocator/arena/__memory_allocate + br $~lib/memory/memory.allocate|inlined.0 + end + set_local $1 + get_local $1 + get_local $0 + i32.store + get_local $1 + ) + (func $~lib/array/Array#constructor (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $1 + i32.const 268435454 + i32.gt_u + if + i32.const 0 + i32.const 56 + i32.const 45 + i32.const 39 + call $~lib/env/abort + unreachable + end + get_local $1 + i32.const 2 + i32.shl + set_local $2 + get_local $2 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 8 + call $~lib/memory/memory.allocate + set_local $4 + get_local $4 + i32.const 0 + i32.store + get_local $4 + i32.const 0 + i32.store offset=4 + get_local $4 + end + tee_local $0 + end + tee_local $0 + get_local $3 + i32.store + get_local $0 + get_local $1 + i32.store offset=4 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $4 + i32.const 0 + set_local $5 + get_local $4 + get_local $5 + get_local $2 + call $~lib/internal/memory/memset + get_local $0 + ) + (func $~lib/array/Array#pop (; 21 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2384,7 +2554,7 @@ i32.lt_s if i32.const 0 - i32.const 24 + i32.const 56 i32.const 246 i32.const 20 call $~lib/env/abort @@ -2416,13 +2586,14 @@ i32.store offset=4 get_local $5 ) - (func $~lib/array/Array#__get (; 17 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#__get (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) >>>>>>> Working on sections. get_local $0 call $assembly/host/index/_log_str ) +<<<<<<< loader-memory-accessors (func $~lib/internal/arraybuffer/computeSize (; 18 ;) (type $ii) (param $0 i32) (result i32) i32.const 1 i32.const 32 @@ -2601,6 +2772,9 @@ ======= (func $~lib/internal/arraybuffer/reallocateUnsafe (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2702,11 +2876,15 @@ end get_local $0 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#push (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $~lib/array/Array#push (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/array/Array#push (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2768,11 +2946,15 @@ i32.store offset=8 get_local $5 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/Module#getID (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $assembly/module/index/Module#getID (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/module/index/Module#getID (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2840,11 +3022,15 @@ end get_local $2 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/Section#constructor (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $assembly/module/index/Section#constructor (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/module/index/Section#constructor (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) get_local $0 if (result i32) @@ -2863,11 +3049,15 @@ end tee_local $0 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#readVaruint (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $assembly/buffer/index/Buffer#readVaruint (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/buffer/index/Buffer#readVaruint (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2922,11 +3112,15 @@ i32.store offset=8 get_local $2 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#constructor (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $~lib/array/Array#constructor (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/array/Array#constructor (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2985,11 +3179,15 @@ call $~lib/internal/memory/memset get_local $0 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#readVarint (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $assembly/buffer/index/Buffer#readVarint (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/buffer/index/Buffer#readVarint (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3060,20 +3258,28 @@ end select ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#readVarint8 (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $assembly/buffer/index/Buffer#readVarint8 (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/buffer/index/Buffer#readVarint8 (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 get_local $1 call $assembly/buffer/index/Buffer#readVarint ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/FuncType#constructor (; 31 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ======= (func $assembly/module/index/FuncType#constructor (; 28 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/module/index/FuncType#constructor (; 31 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $3 i32) get_local $0 if (result i32) @@ -3101,11 +3307,15 @@ end tee_local $0 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= (func $~lib/array/Array#__set (; 29 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Working on sections. +======= + (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $3 i32) (local $4 i32) (local $5 i32) @@ -3161,11 +3371,15 @@ get_local $2 i32.store offset=8 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#constructor (; 33 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $~lib/array/Array#constructor (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/array/Array#constructor (; 33 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3224,11 +3438,15 @@ call $~lib/internal/memory/memset get_local $0 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#__get (; 34 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $~lib/array/Array#__get (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/array/Array#__get (; 34 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) get_local $0 @@ -3255,11 +3473,15 @@ unreachable end ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#__set (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Working on sections. +======= + (func $~lib/array/Array#__set (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $3 i32) (local $4 i32) (local $5 i32) @@ -3315,11 +3537,15 @@ get_local $2 i32.store offset=8 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/number/decimalCount32 (; 36 ;) (type $ii) (param $0 i32) (result i32) ======= (func $~lib/internal/number/decimalCount32 (; 33 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/internal/number/decimalCount32 (; 36 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $1 i32) get_local $0 i32.const 100000 @@ -3388,11 +3614,15 @@ unreachable unreachable ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/string/allocateUnsafe (; 37 ;) (type $ii) (param $0 i32) (result i32) ======= (func $~lib/internal/string/allocateUnsafe (; 34 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/internal/string/allocateUnsafe (; 37 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $1 i32) (local $2 i32) get_local $0 @@ -3409,11 +3639,15 @@ i32.eqz if i32.const 0 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 160 ======= i32.const 128 >>>>>>> Working on sections. +======= + i32.const 160 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. i32.const 14 i32.const 2 call $~lib/env/abort @@ -3436,11 +3670,15 @@ i32.store get_local $2 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/number/utoa32_lut (; 38 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= (func $~lib/internal/number/utoa32_lut (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Working on sections. +======= + (func $~lib/internal/number/utoa32_lut (; 38 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $3 i32) (local $4 i32) (local $5 i32) @@ -3450,11 +3688,15 @@ (local $9 i64) (local $10 i64) block $~lib/internal/number/DIGITS|inlined.0 (result i32) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 728 ======= i32.const 696 >>>>>>> Working on sections. +======= + i32.const 728 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. end i32.load set_local $3 @@ -3614,21 +3856,29 @@ i32.store16 offset=4 end ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/number/utoa32 (; 39 ;) (type $ii) (param $0 i32) (result i32) ======= (func $~lib/internal/number/utoa32 (; 36 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/internal/number/utoa32 (; 39 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $1 i32) (local $2 i32) get_local $0 i32.eqz if +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 152 ======= i32.const 120 >>>>>>> Working on sections. +======= + i32.const 152 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. return end get_local $0 @@ -3643,15 +3893,20 @@ call $~lib/internal/number/utoa32_lut get_local $2 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/number/itoa (; 40 ;) (type $ii) (param $0 i32) (result i32) ======= (func $~lib/internal/number/itoa (; 37 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/internal/number/itoa (; 40 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 call $~lib/internal/number/utoa32 return ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/string/copyUnsafe (; 41 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) ======= @@ -3754,6 +4009,9 @@ ) (func $~lib/internal/string/copyUnsafe (; 40 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) >>>>>>> Working on sections. +======= + (func $~lib/internal/string/copyUnsafe (; 41 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $5 i32) (local $6 i32) (local $7 i32) @@ -3782,11 +4040,15 @@ get_local $7 call $~lib/internal/memory/memmove ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/string/String#concat (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $~lib/string/String#concat (; 41 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/string/String#concat (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3798,11 +4060,15 @@ i32.eqz if i32.const 0 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 928 ======= i32.const 848 >>>>>>> Working on sections. +======= + i32.const 928 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. i32.const 110 i32.const 4 call $~lib/env/abort @@ -3812,11 +4078,15 @@ i32.const 0 i32.eq if +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 912 ======= i32.const 832 >>>>>>> Working on sections. +======= + i32.const 912 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. set_local $1 end get_local $0 @@ -3833,11 +4103,15 @@ i32.const 0 i32.eq if +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 960 ======= i32.const 824 >>>>>>> Working on sections. +======= + i32.const 960 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. return end get_local $4 @@ -3857,6 +4131,7 @@ call $~lib/internal/string/copyUnsafe get_local $5 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/string/String.__concat (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 @@ -3870,6 +4145,13 @@ if i32.const 832 >>>>>>> Working on sections. +======= + (func $~lib/string/String.__concat (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 912 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. set_local $0 end get_local $0 @@ -3877,6 +4159,9 @@ call $~lib/string/String#concat ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (func $assembly/host/index/err (; 44 ;) (type $iv) (param $0 i32) i32.const 888 get_local $0 @@ -3886,6 +4171,8 @@ ) (func $assembly/module/index/typeName (; 45 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) +<<<<<<< loader-memory-accessors +======= block $break|0 block $case7|0 block $case6|0 @@ -3981,9 +4268,6 @@ end ) (func $assembly/module/index/FuncType#toString (; 47 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $assembly/module/index/FuncType#toString (; 43 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. (local $1 i32) (local $2 i32) (local $3 i32) @@ -3997,14 +4281,128 @@ i32.load8_s offset=12 call $assembly/module/index/typeName set_local $2 -<<<<<<< loader-memory-accessors i32.const 960 -======= - i32.const 824 ->>>>>>> Working on sections. set_local $3 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. block $break|0 - i32.const 0 + block $case7|0 + block $case6|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + block $case0|0 + get_local $0 + set_local $1 + get_local $1 + i32.const 127 + i32.eq + br_if $case0|0 + get_local $1 + i32.const 126 + i32.eq + br_if $case1|0 + get_local $1 + i32.const 125 + i32.eq + br_if $case2|0 + get_local $1 + i32.const 124 + i32.eq + br_if $case3|0 + get_local $1 + i32.const 112 + i32.eq + br_if $case4|0 + get_local $1 + i32.const 96 + i32.eq + br_if $case5|0 + get_local $1 + i32.const 64 + i32.eq + br_if $case6|0 + br $case7|0 + end + i32.const 736 + return + end + i32.const 752 + return + end + i32.const 768 + return + end + i32.const 784 + return + end + i32.const 800 + return + end + i32.const 824 + return + end + i32.const 840 + return + end + i32.const 856 + call $assembly/host/index/err + end + i32.const 960 + ) + (func $~lib/array/Array#__get (; 46 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + get_local $0 + i32.load + set_local $2 + get_local $1 + get_local $2 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + i32.const 0 + set_local $3 + get_local $2 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + ) + (func $assembly/module/index/FuncType#toString (; 47 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $assembly/module/index/FuncType#toString (; 43 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Working on sections. + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.load offset=8 + call $~lib/internal/number/itoa + set_local $1 + get_local $0 + i32.load8_s offset=12 + call $assembly/module/index/typeName + set_local $2 +<<<<<<< loader-memory-accessors + i32.const 960 +======= + i32.const 824 +>>>>>>> Working on sections. + set_local $3 + block $break|0 + i32.const 0 set_local $4 loop $repeat|0 get_local $4 @@ -4040,11 +4438,15 @@ i32.lt_s if (result i32) get_local $3 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 968 ======= i32.const 880 >>>>>>> Working on sections. +======= + i32.const 968 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. call $~lib/string/String.__concat tee_local $3 else @@ -4077,6 +4479,7 @@ call $~lib/array/Array#__get call $assembly/module/index/typeName else +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 976 end @@ -4097,27 +4500,35 @@ i32.const 1048 ======= i32.const 888 +======= + i32.const 976 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. end set_local $4 - i32.const 904 + i32.const 992 get_local $1 call $~lib/string/String.__concat - i32.const 880 + i32.const 968 call $~lib/string/String.__concat - i32.const 928 + i32.const 1016 call $~lib/string/String.__concat get_local $2 call $~lib/string/String.__concat - i32.const 944 + i32.const 1032 call $~lib/string/String.__concat get_local $3 call $~lib/string/String.__concat +<<<<<<< loader-memory-accessors i32.const 960 >>>>>>> Working on sections. +======= + i32.const 1048 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. call $~lib/string/String.__concat get_local $4 call $~lib/string/String.__concat ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/TypeSection#parse (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -4127,6 +4538,9 @@ ) (func $assembly/module/index/TypeSection#parse (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/module/index/TypeSection#parse (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -4277,11 +4691,15 @@ end get_local $0 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#push (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $~lib/array/Array#push (; 46 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/array/Array#push (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -4343,11 +4761,15 @@ i32.store offset=8 get_local $5 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#join (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $~lib/array/Array#join (; 47 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/array/Array#join (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -4368,6 +4790,7 @@ i32.const 0 i32.lt_s if +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 960 return @@ -4379,6 +4802,12 @@ end i32.const 824 >>>>>>> Working on sections. +======= + i32.const 960 + return + end + i32.const 960 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. set_local $3 get_local $0 i32.load @@ -4572,6 +5001,7 @@ get_local $8 return ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/TypeSection#toString (; 51 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) @@ -4585,6 +5015,13 @@ (local $3 i32) i32.const 984 >>>>>>> Working on sections. +======= + (func $assembly/module/index/TypeSection#toString (; 51 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + i32.const 1072 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. set_local $1 block $break|0 i32.const 0 @@ -5086,6 +5523,7 @@ unreachable end get_local $1 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 1080 call $~lib/array/Array#join @@ -5097,6 +5535,12 @@ ) (func $assembly/index/getType (; 49 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + i32.const 1080 + call $~lib/array/Array#join + ) + (func $assembly/index/getType (; 52 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $1 i32) (local $2 i32) get_local $0 @@ -5117,6 +5561,7 @@ get_global $assembly/index/type call $assembly/module/index/TypeSection#toString ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#constructor (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -5126,6 +5571,9 @@ ) (func $~lib/array/Array#constructor (; 51 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/array/Array#constructor (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -5135,11 +5583,15 @@ i32.gt_u if i32.const 0 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 56 ======= i32.const 24 >>>>>>> Working on sections. +======= + i32.const 56 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. i32.const 45 i32.const 39 call $~lib/env/abort @@ -5188,11 +5640,15 @@ call $~lib/internal/memory/memset get_local $0 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/string/String.fromUTF8 (; 54 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $~lib/string/String.fromUTF8 (; 52 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/string/String.fromUTF8 (; 54 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -5203,11 +5659,15 @@ i32.const 1 i32.lt_u if +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 960 ======= i32.const 824 >>>>>>> Working on sections. +======= + i32.const 960 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. return end i32.const 0 @@ -5277,11 +5737,15 @@ i32.eqz if i32.const 0 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 928 ======= i32.const 848 >>>>>>> Working on sections. +======= + i32.const 928 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. i32.const 510 i32.const 8 call $~lib/env/abort @@ -5462,11 +5926,15 @@ i32.eqz if i32.const 0 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 928 ======= i32.const 848 >>>>>>> Working on sections. +======= + i32.const 928 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. i32.const 514 i32.const 8 call $~lib/env/abort @@ -5593,11 +6061,15 @@ i32.eqz if i32.const 0 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 928 ======= i32.const 848 >>>>>>> Working on sections. +======= + i32.const 928 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. i32.const 526 i32.const 8 call $~lib/env/abort @@ -5669,11 +6141,15 @@ i32.eqz if i32.const 0 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 928 ======= i32.const 848 >>>>>>> Working on sections. +======= + i32.const 928 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. i32.const 535 i32.const 4 call $~lib/env/abort @@ -5703,11 +6179,15 @@ end get_local $7 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#readUint (; 55 ;) (type $ii) (param $0 i32) (result i32) ======= (func $assembly/buffer/index/Buffer#readUint (; 53 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/buffer/index/Buffer#readUint (; 55 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $1 i32) (local $2 i32) get_local $0 @@ -5723,11 +6203,15 @@ i32.store offset=8 get_local $2 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/imports/Import#constructor (; 56 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) ======= (func $assembly/module/imports/Import#constructor (; 54 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/module/imports/Import#constructor (; 56 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $4 i32) get_local $0 if (result i32) @@ -5752,11 +6236,15 @@ end tee_local $0 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#__set (; 57 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= (func $~lib/array/Array#__set (; 55 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Working on sections. +======= + (func $~lib/array/Array#__set (; 57 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $3 i32) (local $4 i32) (local $5 i32) @@ -5777,11 +6265,15 @@ i32.ge_u if i32.const 0 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 56 ======= i32.const 24 >>>>>>> Working on sections. +======= + i32.const 56 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. i32.const 109 i32.const 41 call $~lib/env/abort @@ -5816,11 +6308,15 @@ get_local $2 i32.store offset=8 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/imports/Imports#parse (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $assembly/module/imports/Imports#parse (; 56 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/module/imports/Imports#parse (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -6026,11 +6522,15 @@ end get_local $0 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#push (; 59 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $~lib/array/Array#push (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $~lib/array/Array#push (; 59 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -6060,11 +6560,15 @@ i32.ge_u if i32.const 0 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 56 ======= i32.const 24 >>>>>>> Working on sections. +======= + i32.const 56 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. i32.const 184 i32.const 42 call $~lib/env/abort @@ -6096,23 +6600,31 @@ i32.store offset=8 get_local $5 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/Module#getImports (; 60 ;) (type $ii) (param $0 i32) (result i32) ======= (func $assembly/module/index/Module#getImports (; 58 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/module/index/Module#getImports (; 60 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors ======= (local $5 i32) >>>>>>> Working on sections. +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 get_global $src/common/SectionId.Import call $assembly/module/index/Module#getID set_local $1 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 1096 set_local $2 @@ -6125,6 +6637,10 @@ end call $assembly/host/index/log >>>>>>> Working on sections. +======= + i32.const 1096 + set_local $2 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. block $break|0 i32.const 0 set_local $3 @@ -6139,6 +6655,7 @@ br_if $break|0 block <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors ======= get_local $1 get_local $3 @@ -6146,6 +6663,8 @@ i32.load offset=16 call $assembly/host/index/log >>>>>>> Working on sections. +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. i32.const 0 get_local $1 get_local $3 @@ -6160,6 +6679,7 @@ call $~lib/array/Array#push drop <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors ======= block $~lib/array/Array#get:length|inlined.0 (result i32) get_local $4 @@ -6170,6 +6690,8 @@ end call $assembly/host/index/log >>>>>>> Working on sections. +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. end get_local $3 i32.const 1 @@ -6182,21 +6704,29 @@ end get_local $2 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/getImports (; 61 ;) (type $iv) (param $0 i32) ======= (func $assembly/index/getImports (; 59 ;) (type $iv) (param $0 i32) >>>>>>> Working on sections. +======= + (func $assembly/index/getImports (; 61 ;) (type $iv) (param $0 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $1 i32) (local $2 i32) get_local $0 call $assembly/module/index/Module#getImports set_local $1 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors block $~lib/array/Array#get:length|inlined.1 (result i32) ======= block $~lib/array/Array#get:length|inlined.2 (result i32) >>>>>>> Working on sections. +======= + block $~lib/array/Array#get:length|inlined.1 (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $1 i32.load offset=4 end @@ -6208,17 +6738,22 @@ set_local $2 loop $repeat|0 get_local $2 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors block $~lib/array/Array#get:length|inlined.3 (result i32) ======= block $~lib/array/Array#get:length|inlined.4 (result i32) >>>>>>> Working on sections. +======= + block $~lib/array/Array#get:length|inlined.3 (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $1 i32.load offset=4 end i32.lt_s i32.eqz br_if $break|0 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors nop ======= @@ -6228,6 +6763,9 @@ end call $assembly/host/index/log >>>>>>> Working on sections. +======= + nop +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $2 i32.const 1 i32.add @@ -6240,10 +6778,31 @@ end ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (func $assembly/module/index/Module#get:start (; 62 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Start call $assembly/module/index/Module#getID +<<<<<<< loader-memory-accessors + ) + (func $assembly/module/index/Module#get:hasStart (; 63 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + block $~lib/array/Array#get:length|inlined.5 (result i32) + get_local $0 + call $assembly/module/index/Module#get:start + set_local $1 + get_local $1 + i32.load offset=4 + end + i32.const 0 + i32.gt_s + ) + (func $assembly/module/index/SectionHeader#get:end (; 64 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load offset=12 +======= ) (func $assembly/module/index/Module#get:hasStart (; 63 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) @@ -6395,8 +6954,15 @@ get_local $0 get_local $2 i32.store offset=8 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 + i32.load offset=8 + i32.add ) +<<<<<<< loader-memory-accessors + (func $assembly/module/index/SectionHeader#toString (; 65 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) +======= (func $~lib/internal/typedarray/TypedArray#__get (; 68 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) @@ -6633,7 +7199,408 @@ call $assembly/module/index/TypeSection#toString ) (func $assembly/module/index/Module#constructor (; 75 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= + (local $2 i32) + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 8 + call $~lib/memory/memory.allocate + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + end + tee_local $0 + end + tee_local $0 + get_local $1 + i32.store offset=4 + get_local $0 + i32.const 1352 + i32.store + get_local $0 + ) + (func $assembly/index/Parser#constructor (; 76 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + i32.load + call $~lib/internal/number/itoa + set_local $1 + get_local $0 +<<<<<<< loader-memory-accessors + i32.load offset=4 + call $~lib/internal/number/itoa + set_local $2 +======= + ) + (func $assembly/index/Parser#parseString (; 77 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. + get_local $0 + i32.load offset=8 + call $~lib/internal/number/itoa + set_local $3 + get_local $0 + i32.load offset=12 + call $~lib/internal/number/itoa + set_local $4 + get_local $0 + i32.load offset=20 + set_local $5 + get_local $0 + call $assembly/module/index/SectionHeader#get:end + call $~lib/internal/number/itoa + set_local $6 + i32.const 1104 + get_local $1 + call $~lib/string/String.__concat + i32.const 1080 + call $~lib/string/String.__concat + i32.const 1120 + call $~lib/string/String.__concat + get_local $2 + call $~lib/string/String.__concat + i32.const 1080 + call $~lib/string/String.__concat + i32.const 1136 + call $~lib/string/String.__concat + get_local $4 + call $~lib/string/String.__concat + i32.const 1080 + call $~lib/string/String.__concat + i32.const 1168 + call $~lib/string/String.__concat + get_local $3 + call $~lib/string/String.__concat + i32.const 1080 + call $~lib/string/String.__concat + i32.const 1208 + call $~lib/string/String.__concat + get_local $6 + call $~lib/string/String.__concat + i32.const 1080 + call $~lib/string/String.__concat + i32.const 1224 + call $~lib/string/String.__concat + get_local $5 + call $~lib/string/String.__concat + ) + (func $assembly/host/index/log (; 66 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_logi + ) + (func $~lib/internal/typedarray/TypedArray#constructor (; 67 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $1 + i32.const 1073741816 + i32.gt_u + if + i32.const 0 + i32.const 1240 + i32.const 23 + i32.const 34 + call $~lib/env/abort + unreachable + end + get_local $1 + i32.const 0 + i32.shl + set_local $2 + get_local $2 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $4 + i32.const 0 + set_local $5 + get_local $4 + get_local $5 + get_local $2 + call $~lib/internal/memory/memset + get_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 12 + call $~lib/memory/memory.allocate + set_local $5 + get_local $5 + i32.const 0 + i32.store + get_local $5 + i32.const 0 + i32.store offset=4 + get_local $5 + i32.const 0 + i32.store offset=8 + get_local $5 + end + tee_local $0 + end + tee_local $0 + get_local $3 + i32.store + get_local $0 + i32.const 0 + i32.store offset=4 + get_local $0 + get_local $2 + i32.store offset=8 + get_local $0 + ) + (func $~lib/internal/typedarray/TypedArray#__get (; 68 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + get_local $1 + get_local $0 + i32.load offset=8 + i32.const 0 + i32.shr_u + i32.ge_u + if + i32.const 0 + i32.const 1240 + i32.const 39 + i32.const 63 + call $~lib/env/abort + unreachable + end + block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) + get_local $0 + i32.load + set_local $2 + get_local $0 + i32.load offset=4 + set_local $3 + get_local $2 + get_local $1 + i32.const 0 + i32.shl + i32.add + get_local $3 + i32.add + i32.load8_u offset=8 + end + ) + (func $~lib/internal/typedarray/TypedArray#__set (; 69 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + get_local $1 + get_local $0 + i32.load offset=8 + i32.const 0 + i32.shr_u + i32.ge_u + if + i32.const 0 + i32.const 1240 + i32.const 50 + i32.const 63 + call $~lib/env/abort + unreachable + end + get_local $0 + i32.load + set_local $3 + get_local $0 + i32.load offset=4 + set_local $4 + get_local $3 + get_local $1 + i32.const 0 + i32.shl + i32.add + get_local $4 + i32.add + get_local $2 + i32.store8 offset=8 + ) + (func $assembly/host/index/log (; 70 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_logi + ) + (func $assembly/host/index/log (; 71 ;) (type $iv) (param $0 i32) + get_local $0 + i32.const 12 + call $assembly/host/index/_log + ) + (func $assembly/host/index/log (; 72 ;) (type $iv) (param $0 i32) + get_local $0 + i32.const 255 + i32.and + call $assembly/host/index/_logi + ) + (func $assembly/index/removeStartFunction (; 73 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + get_local $0 + call $assembly/module/index/Module#get:hasStart + if + get_local $0 + get_global $src/common/SectionId.Start + call $assembly/module/index/Module#getID + i32.const 0 + call $~lib/array/Array#__get + set_local $1 + get_local $1 + call $assembly/module/index/SectionHeader#toString + call $assembly/host/index/log + get_local $1 + call $assembly/module/index/SectionHeader#get:end + get_local $1 + i32.load + i32.sub + set_local $2 + get_local $2 + call $assembly/host/index/log + i32.const 0 + get_local $0 + i32.load offset=4 + i32.load offset=4 + get_local $2 + i32.sub + call $~lib/internal/typedarray/TypedArray#constructor + set_local $3 + get_local $1 + i32.load offset=16 + call $assembly/host/index/log + block $break|0 + i32.const 0 + set_local $4 + loop $repeat|0 + get_local $4 + get_local $1 + i32.load offset=16 + i32.lt_u + i32.eqz + br_if $break|0 + get_local $3 + get_local $4 + get_local $0 + i32.load offset=4 + i32.load + get_local $4 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + call $~lib/internal/typedarray/TypedArray#__set + get_local $4 + i32.const 1 + i32.add + set_local $4 + br $repeat|0 + unreachable + end + unreachable + end + i32.const 1304 + call $assembly/host/index/log + get_local $0 + i32.load offset=4 + i32.load offset=16 + call $assembly/host/index/log + get_local $0 + i32.load offset=4 + i32.load + call $assembly/host/index/log + get_local $0 + i32.load offset=4 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.const 1 + i32.sub + call $~lib/internal/typedarray/TypedArray#__get + call $assembly/host/index/log + get_local $1 + i32.load offset=16 + get_local $2 + i32.add + call $assembly/host/index/log + block $break|1 + get_local $1 + i32.load offset=16 + get_local $2 + i32.add + set_local $4 + loop $repeat|1 + get_local $4 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.lt_u + i32.eqz + br_if $break|1 + block + get_local $4 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.const 8000 + i32.sub + i32.gt_u + if + get_local $4 + call $assembly/host/index/log + end + get_local $3 + get_local $4 + get_local $2 + i32.sub + get_local $0 + i32.load offset=4 + i32.load + get_local $4 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + call $~lib/internal/typedarray/TypedArray#__set + end + get_local $4 + i32.const 1 + i32.add + set_local $4 + br $repeat|1 + unreachable + end + unreachable + end + get_local $3 + return + else + get_local $0 + i32.load offset=4 + i32.load + return + end + unreachable + unreachable + ) + (func $assembly/index/toString (; 74 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $assembly/module/index/TypeSection#toString + ) + (func $assembly/module/index/Module#constructor (; 75 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= (func $assembly/index/toString (; 60 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/TypeSection#toString @@ -6719,45 +7686,63 @@ call $assembly/buffer/index/Buffer#readVaruint call $~lib/string/String.fromUTF8 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/Parser#readVaruint (; 78 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $assembly/index/Parser#readVaruint (; 64 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/index/Parser#readVaruint (; 78 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 i32.load get_local $1 call $assembly/buffer/index/Buffer#readVaruint ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/Parser#get:off (; 79 ;) (type $ii) (param $0 i32) (result i32) ======= (func $assembly/index/Parser#get:off (; 65 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/index/Parser#get:off (; 79 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 i32.load i32.load offset=8 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/Parser#set:off (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) ======= (func $assembly/index/Parser#set:off (; 66 ;) (type $iiv) (param $0 i32) (param $1 i32) >>>>>>> Working on sections. +======= + (func $assembly/index/Parser#set:off (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 i32.load get_local $1 i32.store offset=8 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (func $~lib/arraybuffer/ArrayBuffer#get:data (; 81 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $~lib/internal/arraybuffer/HEADER_SIZE i32.add ) (func $assembly/buffer/index/Buffer#readUint (; 82 ;) (type $ii) (param $0 i32) (result i32) +<<<<<<< loader-memory-accessors ======= (func $assembly/buffer/index/Buffer#readUint (; 67 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $1 i32) (local $2 i32) get_local $0 @@ -6773,11 +7758,15 @@ i32.store offset=8 get_local $2 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/sectionName (; 83 ;) (type $ii) (param $0 i32) (result i32) ======= (func $assembly/module/index/sectionName (; 68 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/module/index/sectionName (; 83 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $1 i32) block $break|0 block $case12|0 @@ -6845,6 +7834,7 @@ br_if $case11|0 br $case12|0 end +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 1424 return @@ -6858,16 +7848,23 @@ i32.const 1472 ======= i32.const 1040 +======= + i32.const 1424 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. return end - i32.const 1056 + i32.const 1440 return end - i32.const 1072 + i32.const 1456 return end +<<<<<<< loader-memory-accessors i32.const 1088 >>>>>>> Working on sections. +======= + i32.const 1472 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. return end i32.const 1496 @@ -6898,6 +7895,7 @@ unreachable end unreachable +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 960 ) @@ -6907,6 +7905,11 @@ ) (func $assembly/module/index/SectionHeader#constructor (; 69 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + i32.const 960 + ) + (func $assembly/module/index/SectionHeader#constructor (; 84 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) (local $3 i32) (local $4 i32) @@ -6931,11 +7934,15 @@ i32.const 0 i32.store offset=12 get_local $2 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 0 ======= i32.const 824 >>>>>>> Working on sections. +======= + i32.const 0 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. i32.store offset=16 get_local $2 i32.const 960 @@ -7033,11 +8040,15 @@ i32.store offset=12 get_local $0 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/Module#parseSection (; 85 ;) (type $iiv) (param $0 i32) (param $1 i32) ======= (func $assembly/module/index/Module#parseSection (; 70 ;) (type $iiv) (param $0 i32) (param $1 i32) >>>>>>> Working on sections. +======= + (func $assembly/module/index/Module#parseSection (; 85 ;) (type $iiv) (param $0 i32) (param $1 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) get_local $0 i32.load @@ -7060,6 +8071,7 @@ end end ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/Parser#parse (; 86 ;) (type $iv) (param $0 i32) ======= @@ -7072,6 +8084,9 @@ ) (func $assembly/index/Parser#parse (; 72 ;) (type $iv) (param $0 i32) >>>>>>> Working on sections. +======= + (func $assembly/index/Parser#parse (; 86 ;) (type $iv) (param $0 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $1 i32) (local $2 i32) (local $3 i32) @@ -7158,6 +8173,7 @@ call $assembly/module/index/Module#parseSection i32.const 1664 call $assembly/host/index/log +<<<<<<< loader-memory-accessors get_local $0 call $assembly/index/Parser#get:off call $assembly/host/index/log @@ -7177,6 +8193,27 @@ i32.const 1664 call $assembly/host/index/log get_local $0 +======= + get_local $0 + call $assembly/index/Parser#get:off + call $assembly/host/index/log + get_local $8 + i32.load + get_local $1 + i32.sub + call $assembly/host/index/log + get_local $8 + i32.load offset=16 + call $assembly/host/index/log + get_local $8 + call $assembly/module/index/SectionHeader#get:end + get_local $1 + i32.sub + call $assembly/host/index/log + i32.const 1664 + call $assembly/host/index/log + get_local $0 +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $8 call $assembly/module/index/SectionHeader#get:end call $assembly/index/Parser#set:off @@ -7186,6 +8223,7 @@ end end ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#constructor (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -7196,6 +8234,9 @@ ) (func $assembly/buffer/index/Buffer#constructor (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/buffer/index/Buffer#constructor (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) get_local $0 if (result i32) @@ -7248,6 +8289,7 @@ i32.add i32.store offset=16 get_local $0 +<<<<<<< loader-memory-accessors ) <<<<<<< loader-memory-accessors (func $assembly/host/index/log (; 88 ;) (type $iv) (param $0 i32) @@ -7259,6 +8301,15 @@ ======= (func $assembly/index/newParser (; 75 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + ) + (func $assembly/host/index/log (; 88 ;) (type $iv) (param $0 i32) + get_local $0 + i32.const 20 + call $assembly/host/index/_log + ) + (func $assembly/index/newParser (; 89 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $1 i32) get_local $0 call $assembly/host/index/log @@ -7275,21 +8326,29 @@ get_local $1 call $assembly/index/Parser#constructor ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/parse (; 90 ;) (type $ii) (param $0 i32) (result i32) ======= (func $assembly/index/parse (; 76 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/index/parse (; 90 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 call $assembly/index/Parser#parse get_local $0 i32.load offset=4 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $start (; 91 ;) (type $v) ======= (func $start (; 77 ;) (type $v) >>>>>>> Working on sections. +======= + (func $start (; 91 ;) (type $v) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_global $HEAP_BASE get_global $~lib/internal/allocator/AL_MASK i32.add @@ -7303,6 +8362,7 @@ nop i32.const 8 call $assembly/host/index/log +<<<<<<< loader-memory-accessors ) <<<<<<< loader-memory-accessors (func $null (; 92 ;) (type $v) @@ -7314,17 +8374,26 @@ (func $Parser#set:buf (; 94 ;) (type $iiv) (param $0 i32) (param $1 i32) ======= (func $null (; 78 ;) (type $v) +======= + ) + (func $null (; 92 ;) (type $v) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. ) - (func $Parser#get:buf (; 79 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:buf (; 93 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) +<<<<<<< loader-memory-accessors (func $Parser#set:buf (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) >>>>>>> Working on sections. +======= + (func $Parser#set:buf (; 94 ;) (type $iiv) (param $0 i32) (param $1 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 get_local $1 i32.store ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $Parser#get:module (; 95 ;) (type $ii) (param $0 i32) (result i32) get_local $0 @@ -7338,6 +8407,13 @@ ) (func $Parser#set:module (; 82 ;) (type $iiv) (param $0 i32) (param $1 i32) >>>>>>> Working on sections. +======= + (func $Parser#get:module (; 95 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load offset=4 + ) + (func $Parser#set:module (; 96 ;) (type $iiv) (param $0 i32) (param $1 i32) +>>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 get_local $1 i32.store offset=4 diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index f0a284429f..03655b6e01 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -141,6 +141,9 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { console.log(instance.getString((instance as any).getType(Mod))); (instance as any).getImports(Mod); <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. // let arraybuf = instance.getArray(Uint8Array, array); let newptr = (instance as any).removeStartFunction(Mod); // debugger; @@ -154,8 +157,11 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { let instance2 = loader.instantiateBuffer(buf, imports); instance2.start(); +<<<<<<< loader-memory-accessors ======= >>>>>>> Working on sections. +======= +>>>>>>> Remove start correctly. Now need to abstract to remove any section. // let sections = buffer.slice(instance.I32[Mod], 2); // console.log(sections[1]) // let arrayBuf = sections[0]>>2; From 24985f42192abaca9ed6cb21b53d475a4332be0f Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Tue, 8 Jan 2019 16:38:26 +0100 Subject: [PATCH 11/46] Added a test assembly file to parse instead of parser self parsing. --- lib/parse/assembly/index.ts | 199 +-- lib/parse/build/index.wat | 887 ++++++++--- lib/parse/build/test.wat | 1934 ++++++++++++++++++++++++ lib/parse/package.json | 1 + lib/parse/src/index.ts | 17 +- lib/parse/tests/assembly/index.ts | 22 + lib/parse/tests/assembly/tsconfig.json | 6 + lib/parse/tests/index.ts | 3 +- 8 files changed, 2642 insertions(+), 427 deletions(-) create mode 100644 lib/parse/build/test.wat create mode 100644 lib/parse/tests/assembly/index.ts create mode 100644 lib/parse/tests/assembly/tsconfig.json diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index 56d273cd32..f2b3307bfd 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -1,206 +1,19 @@ -/** A WebAssembly module that parses WebAssembly modules. */ -// Common constants shared between AssemblyScript and TypeScript -import { - Type, - SectionId, - ExternalKind, - NameType, - MAX_PAGES, - MAX_ELEMS, - Opcode -} from "../src/common"; - -export {memory} -import {Buffer} from './buffer'; -import {SectionHeader, - TypeSection, - Module} from './module'; -import {log} from './host'; - -declare function debug():void; - -log("in the start function!"); -// type FunctionName = string | symbol; -// type Instance = [Function, Object]; -// -// let instance: Object; -// let methods: Map = new Map(); - -// function registerClass(name:string): any { -// type Ctor = new (...args: any[]) => T; -// return (target: T): Ctor => { -// // Save a reference to the original constructor -// const Original = target; -// let self:T = this; -// debugger; -// // the new constructor behaviour -// let decoratedConstructor: any = function(...args: any[]): void { -// // log("Before construction:"); -// // -// Original.apply(this, args); -// instance = this; -// // console.log("After construction: ", self.instance !== undefined); -// }; -// -// // Copy prototype so intanceof operator still works -// decoratedConstructor.prototype = Original.prototype; -// // Copy static members too -// Object.keys(Original).forEach((name: string) => -// { decoratedConstructor[name] = (Original)[name]; }); -// -// // Return new constructor (will override original) -// return decoratedConstructor; -// }; -// -// } - -let type: TypeSection; - -export function getType(m: Module): string { - let headers:SectionHeader[] = m.getID(SectionId.Type); - let section = new TypeSection(headers[0]); - type = section.parse(m.buf); - return type.toString(); +export function newParser(buf: Uint8Array): Parser { + let buffer = new Buffer(buf); + return new Parser(buffer); } - -export function getImports(m: Module): void { - let imports = m.getImports(); - // log(imports.length); - if (imports.length>0) - for (let i = 0; i< imports.length; i++){ -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - // log(imports.length); -======= - log(imports.length); ->>>>>>> Working on sections. -======= - // log(imports.length); ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - - // for (let j = 0; i< imports[i].imports.length; j++){ - // let _import = imports[i].imports[j]; - // log(_import.toString()) - // } - } - // return +export function parse(p: Parser): Module { + p.parse(); + return p.module; } <<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors ======= >>>>>>> Remove start correctly. Now need to abstract to remove any section. -export function removeStartFunction (m: Module): Uint8Array { - if (m.hasStart) { - let start : SectionHeader = m.getID(SectionId.Start)[0]; - log(start.toString()); - let len = start.end - start.ref; - log(len); - let buf = new Uint8Array(m.buf.length - len); - log(start.offset) - - for (let i:u32 = 0; i < start.offset; i++) { - buf[i] = m.buf.buffer[i]; - } - log("checking end index"); - log(m.buf.end); - log(m.buf.buffer); - log(m.buf.buffer[m.buf.length - 1]); - log(start.offset + len) - for (let i:u32 = start.offset + len; i < m.buf.length; i++) { - if ( i> m.buf.length - 8000) log(i); - buf[i-len] = m.buf.buffer[i]; - } - // memory.copy(buf.buffer.byteLength, m.buf.buffer.byteOffset, start.ref); - // memory.copy(buf.buffer.byteLength+start.end, m.buf.buffer.byteLength + start.end, m.buf.buffer.byteLength - start.end); - return buf; - } else { - return m.buf.buffer; - } - -} - -// export function exportDataSection(m: Module): Uint8Array { -// -// } - -<<<<<<< loader-memory-accessors -======= ->>>>>>> Working on sections. -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -export function toString(t:TypeSection): string { - return t.toString(); -} - -export class Parser { - buf: Buffer; - module: Module; - constructor(buf: Buffer){ - this.buf = buf; - this.module = new Module(buf); - } - - parseString(): String { - return String.fromUTF8(this.buf.off,this.buf.readVaruint(32)); - } - - readVaruint(len: usize): u32 { - return this.buf.readVaruint(len); - } - - get off(): usize { - return this.buf.off; - } - - set off(u: usize) { - this.buf.off = u; - } - -/** Starts parsing the module that has been placed in memory. */ - parse(): void { - log(this.buf.off) - log(this.buf.buffer.buffer.data) - log(this.buf.length) - let start = this.off; - log("starting") - var magic = this.buf.readUint(); - log(magic); - if (magic != 0x6D736100) unreachable(); - var version = this.buf.readUint(); - log(version); - if (version != 1) unreachable(); - log("Magic is valid"); - var fun_space_index: u32 = 0; - var glo_space_index: u32 = 0; - var mem_space_index: u32 = 0; - var tbl_space_index: u32 = 0; - while (this.buf.off < this.buf.end) { - // log("parsing next section", true); - let header: SectionHeader = new SectionHeader(this.buf); - log(header.toString()); - this.module.parseSection(header); - log("---------") - log(this.off); - log(header.ref - start); - log(header.offset); - log(header.end - start); - log("---------"); - this.off = header.end; - // log(this.off); - } - // log(this.buf.length); - // if (this.off != this.buf.length) unreachable(); - } - -} - export function newParser(buf: Uint8Array): Parser { - log(buf); let buffer = new Buffer(buf); - log(buffer); - log(buffer.off) return new Parser(buffer); } export function parse(p: Parser): Module { diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index 1fae754230..f4a3f1dcbe 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -12,6 +12,7 @@ (import "env" "memory" (memory $0 1)) <<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors ======= >>>>>>> Remove start correctly. Now need to abstract to remove any section. (data (i32.const 8) "\16\00\00\00i\00n\00 \00t\00h\00e\00 \00s\00t\00a\00r\00t\00 \00f\00u\00n\00c\00t\00i\00o\00n\00!\00") @@ -125,13 +126,65 @@ ======= >>>>>>> Remove start correctly. Now need to abstract to remove any section. (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) +======= + (data (i32.const 8) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") + (data (i32.const 40) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") + (data (i32.const 104) "\01\00\00\000\00") + (data (i32.const 112) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 168) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\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 680) "\a8\00\00\00d\00\00\00") + (data (i32.const 688) "\03\00\00\00i\003\002\00") + (data (i32.const 704) "\03\00\00\00i\006\004\00") + (data (i32.const 720) "\03\00\00\00f\003\002\00") + (data (i32.const 736) "\03\00\00\00f\006\004\00") + (data (i32.const 752) "\07\00\00\00a\00n\00y\00f\00u\00n\00c\00") + (data (i32.const 776) "\04\00\00\00f\00u\00n\00c\00") + (data (i32.const 792) "\04\00\00\00n\00o\00n\00e\00") + (data (i32.const 808) "\0e\00\00\00I\00n\00c\00o\00r\00r\00e\00c\00t\00 \00T\00y\00p\00e\00") + (data (i32.const 840) "\07\00\00\00E\00r\00r\00o\00r\00:\00 \00") + (data (i32.const 864) "\04\00\00\00n\00u\00l\00l\00") + (data (i32.const 880) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 912) "\00\00\00\00") + (data (i32.const 920) "\02\00\00\00,\00 \00") + (data (i32.const 928) "\04\00\00\00v\00o\00i\00d\00") + (data (i32.const 944) "\07\00\00\00i\00n\00d\00e\00x\00:\00 \00") + (data (i32.const 968) "\06\00\00\00f\00o\00r\00m\00:\00 \00") + (data (i32.const 984) "\03\00\00\00,\00 \00(\00") + (data (i32.const 1000) "\05\00\00\00)\00 \00=\00>\00 \00") + (data (i32.const 1016) "\00\00\00\00\00\00\00\00") + (data (i32.const 1024) "\f8\03\00\00\00\00\00\00") + (data (i32.const 1032) "\01\00\00\00\n\00") + (data (i32.const 1040) "\00\00\00\00\00\00\00\00") + (data (i32.const 1048) "\10\04\00\00\00\00\00\00") + (data (i32.const 1056) "\1b\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00t\00y\00p\00e\00d\00a\00r\00r\00a\00y\00.\00t\00s\00") + (data (i32.const 1120) "\00\00\00\00\00\00\00\00") + (data (i32.const 1128) "`\04\00\00\00\00\00\00") + (data (i32.const 1136) "\01\00\00\00\'\00") + (data (i32.const 1144) "\06\00\00\00C\00u\00s\00t\00o\00m\00") + (data (i32.const 1160) "\04\00\00\00T\00y\00p\00e\00") + (data (i32.const 1176) "\06\00\00\00I\00m\00p\00o\00r\00t\00") + (data (i32.const 1192) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n\00") + (data (i32.const 1216) "\05\00\00\00T\00a\00b\00l\00e\00") + (data (i32.const 1232) "\06\00\00\00M\00e\00m\00o\00r\00y\00") + (data (i32.const 1248) "\06\00\00\00G\00l\00o\00b\00a\00l\00") + (data (i32.const 1264) "\06\00\00\00E\00x\00p\00o\00r\00t\00") + (data (i32.const 1280) "\05\00\00\00S\00t\00a\00r\00t\00") + (data (i32.const 1296) "\07\00\00\00E\00l\00e\00m\00e\00n\00t\00") + (data (i32.const 1320) "\04\00\00\00C\00o\00d\00e\00") + (data (i32.const 1336) "\04\00\00\00D\00a\00t\00a\00") + (data (i32.const 1352) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 \00") +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) + (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors >>>>>>> Working on sections. ======= (import "index" "_log" (func $assembly/host/index/_log (param i32 i32))) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (table $0 1 anyfunc) (elem (i32.const 0) $null) (global $src/common/MAX_PAGES i32 (i32.const 65535)) @@ -200,6 +253,7 @@ (global $src/common/ExternalKind.Memory (mut i32) (i32.const 2)) (global $src/common/ExternalKind.Global (mut i32) (i32.const 3)) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (global $HEAP_BASE i32 (i32.const 1688)) ======= @@ -208,12 +262,19 @@ ======= (global $HEAP_BASE i32 (i32.const 1688)) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (global $HEAP_BASE i32 (i32.const 1380)) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (export "memory" (memory $0)) (export "table" (table $0)) (export "getType" (func $assembly/index/getType)) (export "getImports" (func $assembly/index/getImports)) <<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors +======= + (export "removeDataSection" (func $assembly/index/removeDataSection)) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (export "removeStartFunction" (func $assembly/index/removeStartFunction)) ======= >>>>>>> Working on sections. @@ -241,6 +302,7 @@ (export "memory.reset" (func $~lib/memory/memory.reset)) (start $start) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= @@ -249,6 +311,9 @@ ======= (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/internal/memory/memset (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $3 i32) <<<<<<< loader-memory-accessors get_global $assembly/index/off @@ -744,6 +809,7 @@ end ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/memory/memory.fill (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= @@ -752,12 +818,16 @@ ======= (func $~lib/memory/memory.fill (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/memory/memory.fill (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memset ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/memory/memcpy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= @@ -766,6 +836,9 @@ ======= (func $~lib/internal/memory/memcpy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/internal/memory/memcpy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $3 i32) (local $4 i32) (local $5 i32) @@ -1967,6 +2040,7 @@ end ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/memory/memmove (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= @@ -1975,6 +2049,9 @@ ======= (func $~lib/internal/memory/memmove (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/internal/memory/memmove (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $3 i32) get_local $0 get_local $1 @@ -2202,6 +2279,7 @@ end ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/memory/memory.copy (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= @@ -2210,12 +2288,16 @@ ======= (func $~lib/memory/memory.copy (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/memory/memory.copy (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memmove ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/memory/memcmp (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ======= @@ -2224,6 +2306,9 @@ ======= (func $~lib/internal/memory/memcmp (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/internal/memory/memcmp (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $3 i32) get_local $0 get_local $1 @@ -2278,6 +2363,7 @@ end ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/memory/memory.compare (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ======= @@ -2286,12 +2372,16 @@ ======= (func $~lib/memory/memory.compare (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/memory/memory.compare (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memcmp ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/allocator/arena/__memory_allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) ======= @@ -2300,6 +2390,9 @@ ======= (func $~lib/allocator/arena/__memory_allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/allocator/arena/__memory_allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) (local $2 i32) (local $3 i32) @@ -2379,6 +2472,7 @@ get_local $1 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/memory/memory.allocate (; 12 ;) (type $ii) (param $0 i32) (result i32) ======= @@ -2387,11 +2481,15 @@ ======= (func $~lib/memory/memory.allocate (; 12 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/memory/memory.allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 call $~lib/allocator/arena/__memory_allocate return ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/allocator/arena/__memory_free (; 13 ;) (type $iv) (param $0 i32) nop @@ -2409,11 +2507,18 @@ ) (func $~lib/memory/memory.free (; 14 ;) (type $iv) (param $0 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/allocator/arena/__memory_free (; 12 ;) (type $iv) (param $0 i32) + nop + ) + (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 call $~lib/allocator/arena/__memory_free return ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/allocator/arena/__memory_reset (; 15 ;) (type $v) get_global $~lib/allocator/arena/startOffset @@ -2429,18 +2534,17 @@ ======= (func $~lib/allocator/arena/__memory_reset (; 15 ;) (type $v) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/allocator/arena/__memory_reset (; 14 ;) (type $v) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset ) - (func $~lib/memory/memory.reset (; 16 ;) (type $v) + (func $~lib/memory/memory.reset (; 15 ;) (type $v) call $~lib/allocator/arena/__memory_reset return ) - (func $assembly/host/index/log (; 17 ;) (type $iv) (param $0 i32) - get_local $0 - call $assembly/host/index/_log_str - ) - (func $~lib/internal/arraybuffer/computeSize (; 18 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/arraybuffer/computeSize (; 16 ;) (type $ii) (param $0 i32) (result i32) i32.const 1 i32.const 32 get_local $0 @@ -2452,7 +2556,7 @@ i32.sub i32.shl ) - (func $~lib/internal/arraybuffer/allocateUnsafe (; 19 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 17 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -2461,7 +2565,7 @@ i32.eqz if i32.const 0 - i32.const 88 + i32.const 40 i32.const 26 i32.const 2 call $~lib/env/abort @@ -2481,7 +2585,7 @@ i32.store get_local $1 ) - (func $~lib/array/Array#constructor (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2491,7 +2595,7 @@ i32.gt_u if i32.const 0 - i32.const 56 + i32.const 8 i32.const 45 i32.const 39 call $~lib/env/abort @@ -2540,7 +2644,7 @@ call $~lib/internal/memory/memset get_local $0 ) - (func $~lib/array/Array#pop (; 21 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/array/Array#pop (; 19 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2554,7 +2658,7 @@ i32.lt_s if i32.const 0 - i32.const 56 + i32.const 8 i32.const 246 i32.const 20 call $~lib/env/abort @@ -2586,7 +2690,7 @@ i32.store offset=4 get_local $5 ) - (func $~lib/array/Array#__get (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#__get (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) >>>>>>> Working on sections. @@ -2768,6 +2872,7 @@ unreachable end ) +<<<<<<< loader-memory-accessors (func $~lib/internal/arraybuffer/reallocateUnsafe (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $~lib/internal/arraybuffer/reallocateUnsafe (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) @@ -2775,6 +2880,9 @@ ======= (func $~lib/internal/arraybuffer/reallocateUnsafe (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2792,7 +2900,7 @@ i32.eqz if i32.const 0 - i32.const 88 + i32.const 40 i32.const 40 i32.const 4 call $~lib/env/abort @@ -2863,7 +2971,7 @@ i32.eqz if i32.const 0 - i32.const 88 + i32.const 40 i32.const 62 i32.const 4 call $~lib/env/abort @@ -2877,6 +2985,7 @@ get_local $0 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#push (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -2885,6 +2994,9 @@ ======= (func $~lib/array/Array#push (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/array/Array#push (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -2914,7 +3026,7 @@ i32.ge_u if i32.const 0 - i32.const 56 + i32.const 8 i32.const 184 i32.const 42 call $~lib/env/abort @@ -2947,6 +3059,7 @@ get_local $5 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/Module#getID (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -2955,6 +3068,9 @@ ======= (func $assembly/module/index/Module#getID (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/module/index/Module#getID (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3023,6 +3139,7 @@ get_local $2 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/Section#constructor (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -3031,6 +3148,9 @@ ======= (func $assembly/module/index/Section#constructor (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/module/index/Section#constructor (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) get_local $0 if (result i32) @@ -3050,6 +3170,7 @@ tee_local $0 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#readVaruint (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -3058,6 +3179,9 @@ ======= (func $assembly/buffer/index/Buffer#readVaruint (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/buffer/index/Buffer#readVaruint (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3113,6 +3237,7 @@ get_local $2 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#constructor (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -3121,6 +3246,9 @@ ======= (func $~lib/array/Array#constructor (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/array/Array#constructor (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3130,7 +3258,7 @@ i32.gt_u if i32.const 0 - i32.const 56 + i32.const 8 i32.const 45 i32.const 39 call $~lib/env/abort @@ -3180,6 +3308,7 @@ get_local $0 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#readVarint (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -3188,6 +3317,9 @@ ======= (func $assembly/buffer/index/Buffer#readVarint (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/buffer/index/Buffer#readVarint (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3259,6 +3391,7 @@ select ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#readVarint8 (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -3267,11 +3400,15 @@ ======= (func $assembly/buffer/index/Buffer#readVarint8 (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/buffer/index/Buffer#readVarint8 (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 get_local $1 call $assembly/buffer/index/Buffer#readVarint ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/FuncType#constructor (; 31 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ======= @@ -3280,6 +3417,9 @@ ======= (func $assembly/module/index/FuncType#constructor (; 31 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/module/index/FuncType#constructor (; 29 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $3 i32) get_local $0 if (result i32) @@ -3308,6 +3448,7 @@ tee_local $0 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= @@ -3316,6 +3457,9 @@ ======= (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/array/Array#__set (; 30 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $3 i32) (local $4 i32) (local $5 i32) @@ -3336,7 +3480,7 @@ i32.ge_u if i32.const 0 - i32.const 56 + i32.const 8 i32.const 109 i32.const 41 call $~lib/env/abort @@ -3372,6 +3516,7 @@ i32.store offset=8 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#constructor (; 33 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -3380,6 +3525,9 @@ ======= (func $~lib/array/Array#constructor (; 33 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/array/Array#constructor (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -3389,7 +3537,7 @@ i32.gt_u if i32.const 0 - i32.const 56 + i32.const 8 i32.const 45 i32.const 39 call $~lib/env/abort @@ -3439,6 +3587,7 @@ get_local $0 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#__get (; 34 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -3447,6 +3596,9 @@ ======= (func $~lib/array/Array#__get (; 34 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/array/Array#__get (; 32 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) get_local $0 @@ -3474,6 +3626,7 @@ end ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#__set (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= @@ -3482,6 +3635,9 @@ ======= (func $~lib/array/Array#__set (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/array/Array#__set (; 33 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $3 i32) (local $4 i32) (local $5 i32) @@ -3502,7 +3658,7 @@ i32.ge_u if i32.const 0 - i32.const 56 + i32.const 8 i32.const 109 i32.const 41 call $~lib/env/abort @@ -3538,6 +3694,7 @@ i32.store offset=8 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/number/decimalCount32 (; 36 ;) (type $ii) (param $0 i32) (result i32) ======= @@ -3546,6 +3703,9 @@ ======= (func $~lib/internal/number/decimalCount32 (; 36 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/internal/number/decimalCount32 (; 34 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) get_local $0 i32.const 100000 @@ -3615,6 +3775,7 @@ unreachable ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/string/allocateUnsafe (; 37 ;) (type $ii) (param $0 i32) (result i32) ======= @@ -3623,6 +3784,9 @@ ======= (func $~lib/internal/string/allocateUnsafe (; 37 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/internal/string/allocateUnsafe (; 35 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) (local $2 i32) get_local $0 @@ -3640,6 +3804,7 @@ if i32.const 0 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 160 ======= @@ -3648,6 +3813,9 @@ ======= i32.const 160 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 112 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. i32.const 14 i32.const 2 call $~lib/env/abort @@ -3671,6 +3839,7 @@ get_local $2 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/number/utoa32_lut (; 38 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= @@ -3679,6 +3848,9 @@ ======= (func $~lib/internal/number/utoa32_lut (; 38 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/internal/number/utoa32_lut (; 36 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $3 i32) (local $4 i32) (local $5 i32) @@ -3689,6 +3861,7 @@ (local $10 i64) block $~lib/internal/number/DIGITS|inlined.0 (result i32) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 728 ======= @@ -3697,6 +3870,9 @@ ======= i32.const 728 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 680 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. end i32.load set_local $3 @@ -3857,6 +4033,7 @@ end ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/number/utoa32 (; 39 ;) (type $ii) (param $0 i32) (result i32) ======= @@ -3865,12 +4042,16 @@ ======= (func $~lib/internal/number/utoa32 (; 39 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/internal/number/utoa32 (; 37 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) (local $2 i32) get_local $0 i32.eqz if <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 152 ======= @@ -3879,6 +4060,9 @@ ======= i32.const 152 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 104 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. return end get_local $0 @@ -3894,6 +4078,7 @@ get_local $2 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/number/itoa (; 40 ;) (type $ii) (param $0 i32) (result i32) ======= @@ -3902,11 +4087,15 @@ ======= (func $~lib/internal/number/itoa (; 40 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/internal/number/itoa (; 38 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 call $~lib/internal/number/utoa32 return ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/internal/string/copyUnsafe (; 41 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) ======= @@ -4012,6 +4201,9 @@ ======= (func $~lib/internal/string/copyUnsafe (; 41 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/internal/string/copyUnsafe (; 39 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $5 i32) (local $6 i32) (local $7 i32) @@ -4041,6 +4233,7 @@ call $~lib/internal/memory/memmove ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/string/String#concat (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -4049,6 +4242,9 @@ ======= (func $~lib/string/String#concat (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/string/String#concat (; 40 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -4061,6 +4257,7 @@ if i32.const 0 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 928 ======= @@ -4069,6 +4266,9 @@ ======= i32.const 928 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 880 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. i32.const 110 i32.const 4 call $~lib/env/abort @@ -4079,6 +4279,7 @@ i32.eq if <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 912 ======= @@ -4087,6 +4288,9 @@ ======= i32.const 912 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 864 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. set_local $1 end get_local $0 @@ -4104,6 +4308,7 @@ i32.eq if <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 960 ======= @@ -4112,6 +4317,9 @@ ======= i32.const 960 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 912 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. return end get_local $4 @@ -4132,6 +4340,7 @@ get_local $5 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/string/String.__concat (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 @@ -4152,6 +4361,13 @@ if i32.const 912 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/string/String.__concat (; 41 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 864 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. set_local $0 end get_local $0 @@ -4160,16 +4376,25 @@ ) <<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors ======= >>>>>>> Remove start correctly. Now need to abstract to remove any section. (func $assembly/host/index/err (; 44 ;) (type $iv) (param $0 i32) i32.const 888 +======= + (func $assembly/host/index/log (; 42 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_log_str + ) + (func $assembly/host/index/err (; 43 ;) (type $iv) (param $0 i32) + i32.const 840 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 call $~lib/string/String.__concat call $assembly/host/index/log unreachable ) - (func $assembly/module/index/typeName (; 45 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/typeName (; 44 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) <<<<<<< loader-memory-accessors ======= @@ -4325,33 +4550,33 @@ br_if $case6|0 br $case7|0 end - i32.const 736 + i32.const 688 return end - i32.const 752 + i32.const 704 return end - i32.const 768 + i32.const 720 return end - i32.const 784 + i32.const 736 return end - i32.const 800 + i32.const 752 return end - i32.const 824 + i32.const 776 return end - i32.const 840 + i32.const 792 return end - i32.const 856 + i32.const 808 call $assembly/host/index/err end - i32.const 960 + i32.const 912 ) - (func $~lib/array/Array#__get (; 46 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#__get (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) get_local $0 @@ -4378,10 +4603,14 @@ unreachable end ) +<<<<<<< loader-memory-accessors (func $assembly/module/index/FuncType#toString (; 47 ;) (type $ii) (param $0 i32) (result i32) ======= (func $assembly/module/index/FuncType#toString (; 43 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/module/index/FuncType#toString (; 46 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) (local $2 i32) (local $3 i32) @@ -4395,11 +4624,15 @@ i32.load8_s offset=12 call $assembly/module/index/typeName set_local $2 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 960 ======= i32.const 824 >>>>>>> Working on sections. +======= + i32.const 912 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. set_local $3 block $break|0 i32.const 0 @@ -4439,6 +4672,7 @@ if (result i32) get_local $3 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 968 ======= @@ -4447,6 +4681,9 @@ ======= i32.const 968 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 920 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. call $~lib/string/String.__concat tee_local $3 else @@ -4480,23 +4717,28 @@ call $assembly/module/index/typeName else <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 976 +======= + i32.const 928 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. end set_local $4 - i32.const 992 + i32.const 944 get_local $1 call $~lib/string/String.__concat - i32.const 968 + i32.const 920 call $~lib/string/String.__concat - i32.const 1016 + i32.const 968 call $~lib/string/String.__concat get_local $2 call $~lib/string/String.__concat - i32.const 1032 + i32.const 984 call $~lib/string/String.__concat get_local $3 call $~lib/string/String.__concat +<<<<<<< loader-memory-accessors i32.const 1048 ======= i32.const 888 @@ -4524,11 +4766,15 @@ ======= i32.const 1048 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 1000 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. call $~lib/string/String.__concat get_local $4 call $~lib/string/String.__concat ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/TypeSection#parse (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -4541,6 +4787,9 @@ ======= (func $assembly/module/index/TypeSection#parse (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/module/index/TypeSection#parse (; 47 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -4692,6 +4941,7 @@ get_local $0 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#push (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -4700,6 +4950,9 @@ ======= (func $~lib/array/Array#push (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/array/Array#push (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -4729,7 +4982,7 @@ i32.ge_u if i32.const 0 - i32.const 56 + i32.const 8 i32.const 184 i32.const 42 call $~lib/env/abort @@ -4762,6 +5015,7 @@ get_local $5 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#join (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -4770,6 +5024,9 @@ ======= (func $~lib/array/Array#join (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/array/Array#join (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -4791,6 +5048,7 @@ i32.lt_s if <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 960 return @@ -4808,6 +5066,12 @@ end i32.const 960 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 912 + return + end + i32.const 912 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. set_local $3 get_local $0 i32.load @@ -5002,6 +5266,7 @@ return ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/TypeSection#toString (; 51 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) @@ -5022,6 +5287,13 @@ (local $3 i32) i32.const 1072 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/module/index/TypeSection#toString (; 50 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + i32.const 1024 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. set_local $1 block $break|0 i32.const 0 @@ -5524,6 +5796,7 @@ end get_local $1 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 1080 call $~lib/array/Array#join @@ -5541,6 +5814,12 @@ ) (func $assembly/index/getType (; 52 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 1032 + call $~lib/array/Array#join + ) + (func $assembly/index/getType (; 51 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) (local $2 i32) get_local $0 @@ -5562,6 +5841,7 @@ call $assembly/module/index/TypeSection#toString ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#constructor (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -5574,6 +5854,9 @@ ======= (func $~lib/array/Array#constructor (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/array/Array#constructor (; 52 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -5584,6 +5867,7 @@ if i32.const 0 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 56 ======= @@ -5592,6 +5876,9 @@ ======= i32.const 56 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 8 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. i32.const 45 i32.const 39 call $~lib/env/abort @@ -5641,6 +5928,7 @@ get_local $0 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/string/String.fromUTF8 (; 54 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -5649,6 +5937,9 @@ ======= (func $~lib/string/String.fromUTF8 (; 54 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/string/String.fromUTF8 (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -5660,6 +5951,7 @@ i32.lt_u if <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 960 ======= @@ -5668,6 +5960,9 @@ ======= i32.const 960 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 912 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. return end i32.const 0 @@ -5738,6 +6033,7 @@ if i32.const 0 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 928 ======= @@ -5746,6 +6042,9 @@ ======= i32.const 928 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 880 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. i32.const 510 i32.const 8 call $~lib/env/abort @@ -5927,6 +6226,7 @@ if i32.const 0 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 928 ======= @@ -5935,6 +6235,9 @@ ======= i32.const 928 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 880 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. i32.const 514 i32.const 8 call $~lib/env/abort @@ -6062,6 +6365,7 @@ if i32.const 0 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 928 ======= @@ -6070,6 +6374,9 @@ ======= i32.const 928 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 880 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. i32.const 526 i32.const 8 call $~lib/env/abort @@ -6142,6 +6449,7 @@ if i32.const 0 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 928 ======= @@ -6150,6 +6458,9 @@ ======= i32.const 928 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 880 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. i32.const 535 i32.const 4 call $~lib/env/abort @@ -6180,6 +6491,7 @@ get_local $7 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#readUint (; 55 ;) (type $ii) (param $0 i32) (result i32) ======= @@ -6188,6 +6500,9 @@ ======= (func $assembly/buffer/index/Buffer#readUint (; 55 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/buffer/index/Buffer#readUint (; 54 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) (local $2 i32) get_local $0 @@ -6204,6 +6519,7 @@ get_local $2 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/imports/Import#constructor (; 56 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) ======= @@ -6212,6 +6528,9 @@ ======= (func $assembly/module/imports/Import#constructor (; 56 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/module/imports/Import#constructor (; 55 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $4 i32) get_local $0 if (result i32) @@ -6237,6 +6556,7 @@ tee_local $0 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#__set (; 57 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ======= @@ -6245,6 +6565,9 @@ ======= (func $~lib/array/Array#__set (; 57 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/array/Array#__set (; 56 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $3 i32) (local $4 i32) (local $5 i32) @@ -6266,6 +6589,7 @@ if i32.const 0 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 56 ======= @@ -6274,6 +6598,9 @@ ======= i32.const 56 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 8 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. i32.const 109 i32.const 41 call $~lib/env/abort @@ -6309,6 +6636,7 @@ i32.store offset=8 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/imports/Imports#parse (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -6317,6 +6645,9 @@ ======= (func $assembly/module/imports/Imports#parse (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/module/imports/Imports#parse (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -6523,6 +6854,7 @@ get_local $0 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $~lib/array/Array#push (; 59 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -6531,6 +6863,9 @@ ======= (func $~lib/array/Array#push (; 59 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $~lib/array/Array#push (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -6561,6 +6896,7 @@ if i32.const 0 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 56 ======= @@ -6569,6 +6905,9 @@ ======= i32.const 56 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 8 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. i32.const 184 i32.const 42 call $~lib/env/abort @@ -6601,6 +6940,7 @@ get_local $5 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/Module#getImports (; 60 ;) (type $ii) (param $0 i32) (result i32) ======= @@ -6609,6 +6949,9 @@ ======= (func $assembly/module/index/Module#getImports (; 60 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/module/index/Module#getImports (; 59 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) (local $2 i32) (local $3 i32) @@ -6625,6 +6968,7 @@ call $assembly/module/index/Module#getID set_local $1 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 1096 set_local $2 @@ -6639,6 +6983,9 @@ >>>>>>> Working on sections. ======= i32.const 1096 +======= + i32.const 1048 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. set_local $2 >>>>>>> Remove start correctly. Now need to abstract to remove any section. block $break|0 @@ -6680,6 +7027,7 @@ drop <<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors ======= block $~lib/array/Array#get:length|inlined.0 (result i32) get_local $4 @@ -6692,6 +7040,8 @@ >>>>>>> Working on sections. ======= >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= +>>>>>>> Added a test assembly file to parse instead of parser self parsing. end get_local $3 i32.const 1 @@ -6705,6 +7055,7 @@ get_local $2 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/getImports (; 61 ;) (type $iv) (param $0 i32) ======= @@ -6713,12 +7064,16 @@ ======= (func $assembly/index/getImports (; 61 ;) (type $iv) (param $0 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/index/getImports (; 60 ;) (type $iv) (param $0 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) (local $2 i32) get_local $0 call $assembly/module/index/Module#getImports set_local $1 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors block $~lib/array/Array#get:length|inlined.1 (result i32) ======= @@ -6727,6 +7082,9 @@ ======= block $~lib/array/Array#get:length|inlined.1 (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + block $~lib/array/Array#get:length|inlined.1 (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $1 i32.load offset=4 end @@ -6739,6 +7097,7 @@ loop $repeat|0 get_local $2 <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors block $~lib/array/Array#get:length|inlined.3 (result i32) ======= @@ -7152,6 +7511,10 @@ block get_local $4 get_local $0 +======= + block $~lib/array/Array#get:length|inlined.3 (result i32) + get_local $1 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. i32.load offset=4 i32.load offset=4 i32.const 8000 @@ -7194,6 +7557,7 @@ unreachable unreachable ) +<<<<<<< loader-memory-accessors (func $assembly/index/toString (; 74 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/TypeSection#toString @@ -7221,11 +7585,15 @@ tee_local $0 get_local $1 i32.store offset=4 +======= + (func $assembly/module/index/SectionHeader#get:end (; 61 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 i32.const 1352 i32.store get_local $0 ) +<<<<<<< loader-memory-accessors (func $assembly/index/Parser#constructor (; 76 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. (local $2 i32) @@ -7300,6 +7668,9 @@ call $assembly/host/index/_logi ) (func $~lib/internal/typedarray/TypedArray#constructor (; 67 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +======= + (func $~lib/internal/typedarray/TypedArray#constructor (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -7309,7 +7680,7 @@ i32.gt_u if i32.const 0 - i32.const 1240 + i32.const 1056 i32.const 23 i32.const 34 call $~lib/env/abort @@ -7364,7 +7735,7 @@ i32.store offset=8 get_local $0 ) - (func $~lib/internal/typedarray/TypedArray#__get (; 68 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#__get (; 63 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) get_local $1 @@ -7375,7 +7746,7 @@ i32.ge_u if i32.const 0 - i32.const 1240 + i32.const 1056 i32.const 39 i32.const 63 call $~lib/env/abort @@ -7398,7 +7769,7 @@ i32.load8_u offset=8 end ) - (func $~lib/internal/typedarray/TypedArray#__set (; 69 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/typedarray/TypedArray#__set (; 64 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) get_local $1 @@ -7409,7 +7780,7 @@ i32.ge_u if i32.const 0 - i32.const 1240 + i32.const 1056 i32.const 50 i32.const 63 call $~lib/env/abort @@ -7431,160 +7802,144 @@ get_local $2 i32.store8 offset=8 ) - (func $assembly/host/index/log (; 70 ;) (type $iv) (param $0 i32) + (func $assembly/index/removeSection (; 65 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) get_local $0 - call $assembly/host/index/_logi - ) - (func $assembly/host/index/log (; 71 ;) (type $iv) (param $0 i32) - get_local $0 - i32.const 12 - call $assembly/host/index/_log - ) - (func $assembly/host/index/log (; 72 ;) (type $iv) (param $0 i32) - get_local $0 - i32.const 255 - i32.and - call $assembly/host/index/_logi - ) - (func $assembly/index/removeStartFunction (; 73 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - get_local $0 - call $assembly/module/index/Module#get:hasStart + get_local $1 + call $assembly/module/index/Module#getID + set_local $2 + block $~lib/array/Array#get:length|inlined.6 (result i32) + get_local $2 + i32.load offset=4 + end + i32.const 0 + i32.eq if get_local $0 - get_global $src/common/SectionId.Start - call $assembly/module/index/Module#getID - i32.const 0 - call $~lib/array/Array#__get - set_local $1 - get_local $1 - call $assembly/module/index/SectionHeader#toString - call $assembly/host/index/log - get_local $1 - call $assembly/module/index/SectionHeader#get:end - get_local $1 + i32.load offset=4 i32.load - i32.sub - set_local $2 - get_local $2 - call $assembly/host/index/log + return + end + get_local $2 + i32.const 0 + call $~lib/array/Array#__get + set_local $3 + get_local $3 + call $assembly/module/index/SectionHeader#get:end + get_local $3 + i32.load + i32.sub + set_local $4 + get_local $0 + i32.load offset=4 + i32.load offset=4 + get_local $4 + i32.sub + set_local $5 + i32.const 0 + get_local $5 + call $~lib/internal/typedarray/TypedArray#constructor + set_local $6 + block $break|0 i32.const 0 - get_local $0 - i32.load offset=4 - i32.load offset=4 - get_local $2 - i32.sub - call $~lib/internal/typedarray/TypedArray#constructor - set_local $3 - get_local $1 - i32.load offset=16 - call $assembly/host/index/log - block $break|0 - i32.const 0 - set_local $4 - loop $repeat|0 - get_local $4 - get_local $1 - i32.load offset=16 - i32.lt_u - i32.eqz - br_if $break|0 - get_local $3 - get_local $4 - get_local $0 - i32.load offset=4 - i32.load - get_local $4 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $4 - i32.const 1 - i32.add - set_local $4 - br $repeat|0 - unreachable - end + set_local $7 + loop $repeat|0 + get_local $7 + get_local $3 + i32.load offset=16 + i32.lt_u + i32.eqz + br_if $break|0 + get_local $6 + get_local $7 + get_local $0 + i32.load offset=4 + i32.load + get_local $7 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + call $~lib/internal/typedarray/TypedArray#__set + get_local $7 + i32.const 1 + i32.add + set_local $7 + br $repeat|0 unreachable end - i32.const 1304 - call $assembly/host/index/log - get_local $0 - i32.load offset=4 - i32.load offset=16 - call $assembly/host/index/log - get_local $0 - i32.load offset=4 - i32.load - call $assembly/host/index/log - get_local $0 - i32.load offset=4 - i32.load - get_local $0 - i32.load offset=4 - i32.load offset=4 - i32.const 1 - i32.sub - call $~lib/internal/typedarray/TypedArray#__get - call $assembly/host/index/log - get_local $1 + unreachable + end + block $break|1 + get_local $3 i32.load offset=16 - get_local $2 + get_local $4 i32.add - call $assembly/host/index/log - block $break|1 - get_local $1 - i32.load offset=16 - get_local $2 + set_local $7 + loop $repeat|1 + get_local $7 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.lt_u + i32.eqz + br_if $break|1 + get_local $6 + get_local $7 + get_local $4 + i32.sub + get_local $0 + i32.load offset=4 + i32.load + get_local $7 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + call $~lib/internal/typedarray/TypedArray#__set + get_local $7 + i32.const 1 i32.add - set_local $4 - loop $repeat|1 - get_local $4 - get_local $0 - i32.load offset=4 - i32.load offset=4 - i32.lt_u - i32.eqz - br_if $break|1 - block - get_local $4 - get_local $0 - i32.load offset=4 - i32.load offset=4 - i32.const 8000 - i32.sub - i32.gt_u - if - get_local $4 - call $assembly/host/index/log - end - get_local $3 - get_local $4 - get_local $2 - i32.sub - get_local $0 - i32.load offset=4 - i32.load - get_local $4 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - call $~lib/internal/typedarray/TypedArray#__set - end - get_local $4 - i32.const 1 - i32.add - set_local $4 - br $repeat|1 - unreachable - end + set_local $7 + br $repeat|1 unreachable end - get_local $3 + unreachable + end + get_local $6 + ) + (func $assembly/index/removeDataSection (; 66 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + get_global $src/common/SectionId.Data + call $assembly/index/removeSection + ) + (func $assembly/module/index/Module#get:start (; 67 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + get_global $src/common/SectionId.Start + call $assembly/module/index/Module#getID + ) + (func $assembly/module/index/Module#get:hasStart (; 68 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + block $~lib/array/Array#get:length|inlined.7 (result i32) + get_local $0 + call $assembly/module/index/Module#get:start + set_local $1 + get_local $1 + i32.load offset=4 + end + i32.const 0 + i32.gt_s + ) + (func $assembly/index/removeStartFunction (; 69 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $assembly/module/index/Module#get:hasStart + if + get_local $0 + get_global $src/common/SectionId.Start + call $assembly/index/removeSection return else get_local $0 @@ -7595,10 +7950,11 @@ unreachable unreachable ) - (func $assembly/index/toString (; 74 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/toString (; 70 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/TypeSection#toString ) +<<<<<<< loader-memory-accessors (func $assembly/module/index/Module#constructor (; 75 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $assembly/index/toString (; 60 ;) (type $ii) (param $0 i32) (result i32) @@ -7607,6 +7963,9 @@ ) (func $assembly/module/index/Module#constructor (; 61 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/module/index/Module#constructor (; 71 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) get_local $0 if (result i32) @@ -7630,6 +7989,7 @@ get_local $1 i32.store offset=4 get_local $0 +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 1352 i32.store @@ -7643,6 +8003,13 @@ ) (func $assembly/index/Parser#constructor (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. +======= + i32.const 1128 + i32.store + get_local $0 + ) + (func $assembly/index/Parser#constructor (; 72 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) get_local $0 if (result i32) @@ -7672,11 +8039,15 @@ i32.store offset=4 get_local $0 ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/Parser#parseString (; 77 ;) (type $ii) (param $0 i32) (result i32) ======= (func $assembly/index/Parser#parseString (; 63 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Working on sections. +======= + (func $assembly/index/Parser#parseString (; 73 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 i32.load i32.load offset=8 @@ -7687,6 +8058,7 @@ call $~lib/string/String.fromUTF8 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/Parser#readVaruint (; 78 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= @@ -7695,12 +8067,16 @@ ======= (func $assembly/index/Parser#readVaruint (; 78 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/index/Parser#readVaruint (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 i32.load get_local $1 call $assembly/buffer/index/Buffer#readVaruint ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/Parser#get:off (; 79 ;) (type $ii) (param $0 i32) (result i32) ======= @@ -7709,11 +8085,15 @@ ======= (func $assembly/index/Parser#get:off (; 79 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/index/Parser#get:off (; 75 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 i32.load i32.load offset=8 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/Parser#set:off (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) ======= @@ -7722,6 +8102,9 @@ ======= (func $assembly/index/Parser#set:off (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/index/Parser#set:off (; 76 ;) (type $iiv) (param $0 i32) (param $1 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 i32.load get_local $1 @@ -7729,6 +8112,7 @@ ) <<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors ======= >>>>>>> Remove start correctly. Now need to abstract to remove any section. (func $~lib/arraybuffer/ArrayBuffer#get:data (; 81 ;) (type $ii) (param $0 i32) (result i32) @@ -7743,6 +8127,9 @@ >>>>>>> Working on sections. ======= >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/buffer/index/Buffer#readUint (; 77 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) (local $2 i32) get_local $0 @@ -7759,6 +8146,7 @@ get_local $2 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/sectionName (; 83 ;) (type $ii) (param $0 i32) (result i32) ======= @@ -7767,6 +8155,9 @@ ======= (func $assembly/module/index/sectionName (; 83 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/module/index/sectionName (; 78 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) block $break|0 block $case12|0 @@ -7835,6 +8226,7 @@ br $case12|0 end <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 1424 return @@ -7851,44 +8243,51 @@ ======= i32.const 1424 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 1144 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. return end - i32.const 1440 + i32.const 1160 return end - i32.const 1456 + i32.const 1176 return end +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 1088 >>>>>>> Working on sections. ======= i32.const 1472 >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 1192 +>>>>>>> Added a test assembly file to parse instead of parser self parsing. return end - i32.const 1496 + i32.const 1216 return end - i32.const 1512 + i32.const 1232 return end - i32.const 1528 + i32.const 1248 return end - i32.const 1544 + i32.const 1264 return end - i32.const 1560 + i32.const 1280 return end - i32.const 1576 + i32.const 1296 return end - i32.const 1600 + i32.const 1320 return end - i32.const 1616 + i32.const 1336 return end unreachable @@ -7896,6 +8295,7 @@ end unreachable <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors i32.const 960 ) @@ -7910,6 +8310,15 @@ ) (func $assembly/module/index/SectionHeader#constructor (; 84 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + i32.const 912 + ) + (func $assembly/host/index/log (; 79 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_logi + ) + (func $assembly/module/index/SectionHeader#constructor (; 80 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) (local $3 i32) (local $4 i32) @@ -7945,7 +8354,7 @@ >>>>>>> Remove start correctly. Now need to abstract to remove any section. i32.store offset=16 get_local $2 - i32.const 960 + i32.const 912 i32.store offset=20 get_local $2 end @@ -7988,12 +8397,12 @@ i32.load offset=8 set_local $4 get_local $0 - i32.const 1416 + i32.const 1136 get_local $4 get_local $3 call $~lib/string/String.fromUTF8 call $~lib/string/String.__concat - i32.const 1416 + i32.const 1136 call $~lib/string/String.__concat i32.store offset=20 get_local $1 @@ -8026,7 +8435,7 @@ get_local $0 i32.load call $assembly/host/index/log - i32.const 1632 + i32.const 1352 get_local $0 i32.load offset=4 call $~lib/internal/number/itoa @@ -8041,6 +8450,7 @@ get_local $0 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/module/index/Module#parseSection (; 85 ;) (type $iiv) (param $0 i32) (param $1 i32) ======= @@ -8049,6 +8459,9 @@ ======= (func $assembly/module/index/Module#parseSection (; 85 ;) (type $iiv) (param $0 i32) (param $1 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/module/index/Module#parseSection (; 81 ;) (type $iiv) (param $0 i32) (param $1 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) get_local $0 i32.load @@ -8072,6 +8485,7 @@ end ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/Parser#parse (; 86 ;) (type $iv) (param $0 i32) ======= @@ -8087,6 +8501,9 @@ ======= (func $assembly/index/Parser#parse (; 86 ;) (type $iv) (param $0 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/index/Parser#parse (; 82 ;) (type $iv) (param $0 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) (local $2 i32) (local $3 i32) @@ -8096,31 +8513,13 @@ (local $7 i32) (local $8 i32) get_local $0 - i32.load - i32.load offset=8 - call $assembly/host/index/log - get_local $0 - i32.load - i32.load - i32.load - call $~lib/arraybuffer/ArrayBuffer#get:data - call $assembly/host/index/log - get_local $0 - i32.load - i32.load offset=4 - call $assembly/host/index/log - get_local $0 call $assembly/index/Parser#get:off set_local $1 - i32.const 1360 - call $assembly/host/index/log get_local $0 i32.load call $assembly/buffer/index/Buffer#readUint set_local $2 get_local $2 - call $assembly/host/index/log - get_local $2 i32.const 1836278016 i32.ne if @@ -8131,15 +8530,11 @@ call $assembly/buffer/index/Buffer#readUint set_local $3 get_local $3 - call $assembly/host/index/log - get_local $3 i32.const 1 i32.ne if unreachable end - i32.const 1384 - call $assembly/host/index/log i32.const 0 set_local $4 i32.const 0 @@ -8164,13 +8559,11 @@ i32.load call $assembly/module/index/SectionHeader#constructor set_local $8 - get_local $8 - call $assembly/module/index/SectionHeader#toString - call $assembly/host/index/log get_local $0 i32.load offset=4 get_local $8 call $assembly/module/index/Module#parseSection +<<<<<<< loader-memory-accessors i32.const 1664 call $assembly/host/index/log <<<<<<< loader-memory-accessors @@ -8212,6 +8605,8 @@ call $assembly/host/index/log i32.const 1664 call $assembly/host/index/log +======= +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 >>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $8 @@ -8224,19 +8619,27 @@ end ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#constructor (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ======= (func $~lib/arraybuffer/ArrayBuffer#get:data (; 73 ;) (type $ii) (param $0 i32) (result i32) +======= + (func $~lib/arraybuffer/ArrayBuffer#get:data (; 83 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 get_global $~lib/internal/arraybuffer/HEADER_SIZE i32.add ) +<<<<<<< loader-memory-accessors (func $assembly/buffer/index/Buffer#constructor (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Working on sections. ======= (func $assembly/buffer/index/Buffer#constructor (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/buffer/index/Buffer#constructor (; 84 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $2 i32) get_local $0 if (result i32) @@ -8303,6 +8706,7 @@ >>>>>>> Working on sections. ======= ) +<<<<<<< loader-memory-accessors (func $assembly/host/index/log (; 88 ;) (type $iv) (param $0 i32) get_local $0 i32.const 20 @@ -8310,23 +8714,20 @@ ) (func $assembly/index/newParser (; 89 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/index/newParser (; 85 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. (local $1 i32) - get_local $0 - call $assembly/host/index/log i32.const 0 get_local $0 call $assembly/buffer/index/Buffer#constructor set_local $1 - get_local $1 - call $assembly/host/index/log - get_local $1 - i32.load offset=8 - call $assembly/host/index/log i32.const 0 get_local $1 call $assembly/index/Parser#constructor ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $assembly/index/parse (; 90 ;) (type $ii) (param $0 i32) (result i32) ======= @@ -8335,12 +8736,16 @@ ======= (func $assembly/index/parse (; 90 ;) (type $ii) (param $0 i32) (result i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $assembly/index/parse (; 86 ;) (type $ii) (param $0 i32) (result i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 call $assembly/index/Parser#parse get_local $0 i32.load offset=4 ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $start (; 91 ;) (type $v) ======= @@ -8349,6 +8754,9 @@ ======= (func $start (; 91 ;) (type $v) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $start (; 87 ;) (type $v) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_global $HEAP_BASE get_global $~lib/internal/allocator/AL_MASK i32.add @@ -8360,6 +8768,7 @@ get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset nop +<<<<<<< loader-memory-accessors i32.const 8 call $assembly/host/index/log <<<<<<< loader-memory-accessors @@ -8378,22 +8787,31 @@ ) (func $null (; 92 ;) (type $v) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= ) - (func $Parser#get:buf (; 93 ;) (type $ii) (param $0 i32) (result i32) + (func $null (; 88 ;) (type $v) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. + ) + (func $Parser#get:buf (; 89 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $Parser#set:buf (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) >>>>>>> Working on sections. ======= (func $Parser#set:buf (; 94 ;) (type $iiv) (param $0 i32) (param $1 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $Parser#set:buf (; 90 ;) (type $iiv) (param $0 i32) (param $1 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 get_local $1 i32.store ) <<<<<<< loader-memory-accessors +<<<<<<< loader-memory-accessors <<<<<<< loader-memory-accessors (func $Parser#get:module (; 95 ;) (type $ii) (param $0 i32) (result i32) get_local $0 @@ -8414,6 +8832,13 @@ ) (func $Parser#set:module (; 96 ;) (type $iiv) (param $0 i32) (param $1 i32) >>>>>>> Remove start correctly. Now need to abstract to remove any section. +======= + (func $Parser#get:module (; 91 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load offset=4 + ) + (func $Parser#set:module (; 92 ;) (type $iiv) (param $0 i32) (param $1 i32) +>>>>>>> Added a test assembly file to parse instead of parser self parsing. get_local $0 get_local $1 i32.store offset=4 diff --git a/lib/parse/build/test.wat b/lib/parse/build/test.wat new file mode 100644 index 0000000000..97e8ffdcb1 --- /dev/null +++ b/lib/parse/build/test.wat @@ -0,0 +1,1934 @@ +(module + (type $iiiv (func (param i32 i32 i32))) + (type $iiii (func (param i32 i32 i32) (result i32))) + (type $ii (func (param i32) (result i32))) + (type $iv (func (param i32))) + (type $v (func)) + (type $i (func (result i32))) + (import "env" "memory" (memory $0 1)) + (data (i32.const 8) "\10\00\00\00T\00h\00i\00s\00 \00i\00s\00 \00a\00 \00s\00t\00r\00i\00n\00g\00") + (data (i32.const 48) "\1b\00\00\00N\00o\00w\00 \00t\00h\00e\00 \00s\00t\00r\00i\00n\00g\00 \00h\00a\00s\00 \00c\00h\00a\00n\00g\00e\00d\00.\00") + (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) + (table $0 1 anyfunc) + (elem (i32.const 0) $null) + (global $~lib/internal/allocator/AL_BITS i32 (i32.const 3)) + (global $~lib/internal/allocator/AL_SIZE i32 (i32.const 8)) + (global $~lib/internal/allocator/AL_MASK i32 (i32.const 7)) + (global $~lib/internal/allocator/MAX_SIZE_32 i32 (i32.const 1073741824)) + (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) + (global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) + (global $tests/assembly/index/str (mut i32) (i32.const 8)) + (global $HEAP_BASE i32 (i32.const 108)) + (export "memory" (memory $0)) + (export "table" (table $0)) + (export "startUp" (func $tests/assembly/index/startUp)) + (export "overwrite" (func $tests/assembly/index/overwrite)) + (export "getStr" (func $tests/assembly/index/getStr)) + (export "memory.fill" (func $~lib/memory/memory.fill)) + (export "memory.copy" (func $~lib/memory/memory.copy)) + (export "memory.compare" (func $~lib/memory/memory.compare)) + (export "memory.allocate" (func $~lib/memory/memory.allocate)) + (export "memory.free" (func $~lib/memory/memory.free)) + (export "memory.reset" (func $~lib/memory/memory.reset)) + (start $start) + (func $~lib/internal/memory/memset (; 1 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i64) + get_local $2 + i32.eqz + if + return + end + get_local $0 + get_local $1 + i32.store8 + get_local $0 + get_local $2 + i32.add + i32.const 1 + i32.sub + get_local $1 + i32.store8 + get_local $2 + i32.const 2 + i32.le_u + if + return + end + get_local $0 + i32.const 1 + i32.add + get_local $1 + i32.store8 + get_local $0 + i32.const 2 + i32.add + get_local $1 + i32.store8 + get_local $0 + get_local $2 + i32.add + i32.const 2 + i32.sub + get_local $1 + i32.store8 + get_local $0 + get_local $2 + i32.add + i32.const 3 + i32.sub + get_local $1 + i32.store8 + get_local $2 + i32.const 6 + i32.le_u + if + return + end + get_local $0 + i32.const 3 + i32.add + get_local $1 + i32.store8 + get_local $0 + get_local $2 + i32.add + i32.const 4 + i32.sub + get_local $1 + i32.store8 + get_local $2 + i32.const 8 + i32.le_u + if + return + end + i32.const 0 + get_local $0 + i32.sub + i32.const 3 + i32.and + set_local $3 + get_local $0 + get_local $3 + i32.add + set_local $0 + get_local $2 + get_local $3 + i32.sub + set_local $2 + get_local $2 + i32.const -4 + i32.and + set_local $2 + i32.const -1 + i32.const 255 + i32.div_u + get_local $1 + i32.const 255 + i32.and + i32.mul + set_local $4 + get_local $0 + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 4 + i32.sub + get_local $4 + i32.store + get_local $2 + i32.const 8 + i32.le_u + if + return + end + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.store + get_local $0 + i32.const 8 + i32.add + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 12 + i32.sub + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 8 + i32.sub + get_local $4 + i32.store + get_local $2 + i32.const 24 + i32.le_u + if + return + end + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.store + get_local $0 + i32.const 16 + i32.add + get_local $4 + i32.store + get_local $0 + i32.const 20 + i32.add + get_local $4 + i32.store + get_local $0 + i32.const 24 + i32.add + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 28 + i32.sub + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 24 + i32.sub + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 20 + i32.sub + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 16 + i32.sub + get_local $4 + i32.store + i32.const 24 + get_local $0 + i32.const 4 + i32.and + i32.add + set_local $3 + get_local $0 + get_local $3 + i32.add + set_local $0 + get_local $2 + get_local $3 + i32.sub + set_local $2 + get_local $4 + i64.extend_u/i32 + get_local $4 + i64.extend_u/i32 + i64.const 32 + i64.shl + i64.or + set_local $5 + block $break|0 + loop $continue|0 + get_local $2 + i32.const 32 + i32.ge_u + if + block + get_local $0 + get_local $5 + i64.store + get_local $0 + i32.const 8 + i32.add + get_local $5 + i64.store + get_local $0 + i32.const 16 + i32.add + get_local $5 + i64.store + get_local $0 + i32.const 24 + i32.add + get_local $5 + i64.store + get_local $2 + i32.const 32 + i32.sub + set_local $2 + get_local $0 + i32.const 32 + i32.add + set_local $0 + end + br $continue|0 + end + end + end + ) + (func $~lib/memory/memory.fill (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memset + ) + (func $~lib/internal/memory/memcpy (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + block $break|0 + loop $continue|0 + get_local $2 + if (result i32) + get_local $1 + i32.const 3 + i32.and + else + get_local $2 + end + if + block + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + end + br $continue|0 + end + end + end + get_local $0 + i32.const 3 + i32.and + i32.const 0 + i32.eq + if + block $break|1 + loop $continue|1 + get_local $2 + i32.const 16 + i32.ge_u + if + block + get_local $0 + get_local $1 + i32.load + i32.store + get_local $0 + i32.const 4 + i32.add + get_local $1 + i32.const 4 + i32.add + i32.load + i32.store + get_local $0 + i32.const 8 + i32.add + get_local $1 + i32.const 8 + i32.add + i32.load + i32.store + get_local $0 + i32.const 12 + i32.add + get_local $1 + i32.const 12 + i32.add + i32.load + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|1 + end + end + end + get_local $2 + i32.const 8 + i32.and + if + get_local $0 + get_local $1 + i32.load + i32.store + get_local $0 + i32.const 4 + i32.add + get_local $1 + i32.const 4 + i32.add + i32.load + i32.store + get_local $0 + i32.const 8 + i32.add + set_local $0 + get_local $1 + i32.const 8 + i32.add + set_local $1 + end + get_local $2 + i32.const 4 + i32.and + if + get_local $0 + get_local $1 + i32.load + i32.store + get_local $0 + i32.const 4 + i32.add + set_local $0 + get_local $1 + i32.const 4 + i32.add + set_local $1 + end + get_local $2 + i32.const 2 + i32.and + if + get_local $0 + get_local $1 + i32.load16_u + i32.store16 + get_local $0 + i32.const 2 + i32.add + set_local $0 + get_local $1 + i32.const 2 + i32.add + set_local $1 + end + get_local $2 + i32.const 1 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + return + end + get_local $2 + i32.const 32 + i32.ge_u + if + block $break|2 + block $case2|2 + block $case1|2 + block $case0|2 + get_local $0 + i32.const 3 + i32.and + set_local $5 + get_local $5 + i32.const 1 + i32.eq + br_if $case0|2 + get_local $5 + i32.const 2 + i32.eq + br_if $case1|2 + get_local $5 + i32.const 3 + i32.eq + br_if $case2|2 + br $break|2 + end + block + get_local $1 + i32.load + set_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 3 + i32.sub + set_local $2 + block $break|3 + loop $continue|3 + get_local $2 + i32.const 17 + i32.ge_u + if + block + get_local $1 + i32.const 1 + i32.add + i32.load + set_local $4 + get_local $0 + get_local $3 + i32.const 24 + i32.shr_u + get_local $4 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 5 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.const 24 + i32.shr_u + get_local $3 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 9 + i32.add + i32.load + set_local $4 + get_local $0 + i32.const 8 + i32.add + get_local $3 + i32.const 24 + i32.shr_u + get_local $4 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 13 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.const 24 + i32.shr_u + get_local $3 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|3 + end + end + end + br $break|2 + unreachable + end + unreachable + end + block + get_local $1 + i32.load + set_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 2 + i32.sub + set_local $2 + block $break|4 + loop $continue|4 + get_local $2 + i32.const 18 + i32.ge_u + if + block + get_local $1 + i32.const 2 + i32.add + i32.load + set_local $4 + get_local $0 + get_local $3 + i32.const 16 + i32.shr_u + get_local $4 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 6 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.const 16 + i32.shr_u + get_local $3 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 10 + i32.add + i32.load + set_local $4 + get_local $0 + i32.const 8 + i32.add + get_local $3 + i32.const 16 + i32.shr_u + get_local $4 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 14 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.const 16 + i32.shr_u + get_local $3 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|4 + end + end + end + br $break|2 + unreachable + end + unreachable + end + block + get_local $1 + i32.load + set_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + block $break|5 + loop $continue|5 + get_local $2 + i32.const 19 + i32.ge_u + if + block + get_local $1 + i32.const 3 + i32.add + i32.load + set_local $4 + get_local $0 + get_local $3 + i32.const 8 + i32.shr_u + get_local $4 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 7 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.const 8 + i32.shr_u + get_local $3 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 11 + i32.add + i32.load + set_local $4 + get_local $0 + i32.const 8 + i32.add + get_local $3 + i32.const 8 + i32.shr_u + get_local $4 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 15 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.const 8 + i32.shr_u + get_local $3 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|5 + end + end + end + br $break|2 + unreachable + end + unreachable + end + end + get_local $2 + i32.const 16 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 8 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 4 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 2 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 1 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + ) + (func $~lib/internal/memory/memmove (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + get_local $0 + get_local $1 + i32.eq + if + return + end + get_local $1 + get_local $2 + i32.add + get_local $0 + i32.le_u + tee_local $3 + if (result i32) + get_local $3 + else + get_local $0 + get_local $2 + i32.add + get_local $1 + i32.le_u + end + if + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memcpy + return + end + get_local $0 + get_local $1 + i32.lt_u + if + get_local $1 + i32.const 7 + i32.and + get_local $0 + i32.const 7 + i32.and + i32.eq + if + block $break|0 + loop $continue|0 + get_local $0 + i32.const 7 + i32.and + if + block + get_local $2 + i32.eqz + if + return + end + get_local $2 + i32.const 1 + i32.sub + set_local $2 + block (result i32) + get_local $0 + tee_local $3 + i32.const 1 + i32.add + set_local $0 + get_local $3 + end + block (result i32) + get_local $1 + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $3 + end + i32.load8_u + i32.store8 + end + br $continue|0 + end + end + end + block $break|1 + loop $continue|1 + get_local $2 + i32.const 8 + i32.ge_u + if + block + get_local $0 + get_local $1 + i64.load + i64.store + get_local $2 + i32.const 8 + i32.sub + set_local $2 + get_local $0 + i32.const 8 + i32.add + set_local $0 + get_local $1 + i32.const 8 + i32.add + set_local $1 + end + br $continue|1 + end + end + end + end + block $break|2 + loop $continue|2 + get_local $2 + if + block + block (result i32) + get_local $0 + tee_local $3 + i32.const 1 + i32.add + set_local $0 + get_local $3 + end + block (result i32) + get_local $1 + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $3 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + end + br $continue|2 + end + end + end + else + get_local $1 + i32.const 7 + i32.and + get_local $0 + i32.const 7 + i32.and + i32.eq + if + block $break|3 + loop $continue|3 + get_local $0 + get_local $2 + i32.add + i32.const 7 + i32.and + if + block + get_local $2 + i32.eqz + if + return + end + get_local $0 + get_local $2 + i32.const 1 + i32.sub + tee_local $2 + i32.add + get_local $1 + get_local $2 + i32.add + i32.load8_u + i32.store8 + end + br $continue|3 + end + end + end + block $break|4 + loop $continue|4 + get_local $2 + i32.const 8 + i32.ge_u + if + block + get_local $2 + i32.const 8 + i32.sub + set_local $2 + get_local $0 + get_local $2 + i32.add + get_local $1 + get_local $2 + i32.add + i64.load + i64.store + end + br $continue|4 + end + end + end + end + block $break|5 + loop $continue|5 + get_local $2 + if + get_local $0 + get_local $2 + i32.const 1 + i32.sub + tee_local $2 + i32.add + get_local $1 + get_local $2 + i32.add + i32.load8_u + i32.store8 + br $continue|5 + end + end + end + end + ) + (func $~lib/memory/memory.copy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memmove + ) + (func $~lib/internal/memory/memcmp (; 6 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + get_local $0 + get_local $1 + i32.eq + if + i32.const 0 + return + end + block $break|0 + loop $continue|0 + get_local $2 + i32.const 0 + i32.ne + tee_local $3 + if (result i32) + get_local $0 + i32.load8_u + get_local $1 + i32.load8_u + i32.eq + else + get_local $3 + end + if + block + get_local $2 + i32.const 1 + i32.sub + set_local $2 + get_local $0 + i32.const 1 + i32.add + set_local $0 + get_local $1 + i32.const 1 + i32.add + set_local $1 + end + br $continue|0 + end + end + end + get_local $2 + if (result i32) + get_local $0 + i32.load8_u + get_local $1 + i32.load8_u + i32.sub + else + i32.const 0 + end + ) + (func $~lib/memory/memory.compare (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memcmp + ) + (func $~lib/allocator/arena/__memory_allocate (; 8 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + get_global $~lib/internal/allocator/MAX_SIZE_32 + i32.gt_u + if + unreachable + end + get_global $~lib/allocator/arena/offset + set_local $1 + get_local $1 + get_local $0 + tee_local $2 + i32.const 1 + tee_local $3 + get_local $2 + get_local $3 + i32.gt_u + select + i32.add + get_global $~lib/internal/allocator/AL_MASK + i32.add + get_global $~lib/internal/allocator/AL_MASK + i32.const -1 + i32.xor + i32.and + set_local $4 + current_memory + set_local $5 + get_local $4 + get_local $5 + i32.const 16 + i32.shl + i32.gt_u + if + get_local $4 + get_local $1 + i32.sub + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + set_local $2 + get_local $5 + tee_local $3 + get_local $2 + tee_local $6 + get_local $3 + get_local $6 + i32.gt_s + select + set_local $3 + get_local $3 + grow_memory + i32.const 0 + i32.lt_s + if + get_local $2 + grow_memory + i32.const 0 + i32.lt_s + if + unreachable + end + end + end + get_local $4 + set_global $~lib/allocator/arena/offset + get_local $1 + ) + (func $~lib/memory/memory.allocate (; 9 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $~lib/allocator/arena/__memory_allocate + return + ) + (func $~lib/allocator/arena/__memory_free (; 10 ;) (type $iv) (param $0 i32) + nop + ) + (func $~lib/memory/memory.free (; 11 ;) (type $iv) (param $0 i32) + get_local $0 + call $~lib/allocator/arena/__memory_free + return + ) + (func $~lib/allocator/arena/__memory_reset (; 12 ;) (type $v) + get_global $~lib/allocator/arena/startOffset + set_global $~lib/allocator/arena/offset + ) + (func $~lib/memory/memory.reset (; 13 ;) (type $v) + call $~lib/allocator/arena/__memory_reset + return + ) + (func $assembly/host/index/log (; 14 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_log_str + ) + (func $tests/assembly/index/startUp (; 15 ;) (type $v) + i32.const 48 + set_global $tests/assembly/index/str + get_global $tests/assembly/index/str + call $assembly/host/index/log + ) + (func $tests/assembly/index/overwrite (; 16 ;) (type $v) + get_global $tests/assembly/index/str + i32.const 2 + i32.add + i32.const 0 + i32.store + get_global $tests/assembly/index/str + i32.const 3 + i32.add + i32.const 0 + i32.store + get_global $tests/assembly/index/str + i32.const 4 + i32.add + i32.const 0 + i32.store + get_global $tests/assembly/index/str + call $assembly/host/index/log + ) + (func $tests/assembly/index/getStr (; 17 ;) (type $i) (result i32) + get_global $tests/assembly/index/str + ) + (func $start (; 18 ;) (type $v) + get_global $HEAP_BASE + get_global $~lib/internal/allocator/AL_MASK + i32.add + get_global $~lib/internal/allocator/AL_MASK + i32.const -1 + i32.xor + i32.and + set_global $~lib/allocator/arena/startOffset + get_global $~lib/allocator/arena/startOffset + set_global $~lib/allocator/arena/offset + ) + (func $null (; 19 ;) (type $v) + ) +) diff --git a/lib/parse/package.json b/lib/parse/package.json index fbc28177e8..384da4e80b 100644 --- a/lib/parse/package.json +++ b/lib/parse/package.json @@ -8,6 +8,7 @@ "asbuild": "asc assembly/index.ts -O3 -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate", "asbuild:untouched": "asc assembly/index.ts -b build/index.wasm -t build/index.wat --debug --importMemory --sourceMap --validate", "build": "npm run asbuild && webpack --mode production --display-modules", + "asbuild:test": "asc tests/assembly/index.ts -b build/test.wasm -t build/test.wat --debug --importMemory --sourceMap --validate", "test": "ts-node tests/" }, "files": [ diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index 03655b6e01..220a57baaf 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -100,7 +100,8 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { len = Math.max(len, line.length); str.push(line); } - let output = str.map((v,i,a)=> v + " ".repeat(len - v.length + 1) + "|"); + let space = " "; + let output = str.map((v,i,a)=> v + (space as any).repeat(len - v.length + 1) + "|"); let dash = "-"; let line = (dash as any).repeat(len+2); console.log([line,output.join('\n'+line+'\n'),line].join("\n")); @@ -145,7 +146,7 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { ======= >>>>>>> Remove start correctly. Now need to abstract to remove any section. // let arraybuf = instance.getArray(Uint8Array, array); - let newptr = (instance as any).removeStartFunction(Mod); + let newptr = (instance as any).removeDataSection(Mod); // debugger; let buf = instance.getArray(Uint8Array, newptr); // debugger; @@ -153,7 +154,19 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { console.log(newptr); let parserPtr2 = instance.newParser(newptr); let Mod2 = instance.parse(parserPtr2); + // let dataFreePtr = (instance as any).removeDataSection(Mod2); + // let buf2 = instance.getArray(Uint8Array, dataFreePtr); + debugger; + let instance1 = loader.instantiateBuffer(binary, imports); + (instance1 as any).overwrite(); + // console.log(instance1.getString((instance1 as any).getString())); + let instance2 = loader.instantiateBuffer(buf, imports); + // instance2.table.grow() + // instance2.table.add(1, (instance2 as any).callStart) + console.log(instance2.getString((instance2 as any).getStr())); + let instance3 = loader.instantiateBuffer(binary, imports); + console.log(instance3.getString((instance3 as any).getStr())); let instance2 = loader.instantiateBuffer(buf, imports); instance2.start(); diff --git a/lib/parse/tests/assembly/index.ts b/lib/parse/tests/assembly/index.ts new file mode 100644 index 0000000000..c9d1e22b1a --- /dev/null +++ b/lib/parse/tests/assembly/index.ts @@ -0,0 +1,22 @@ +import {log} from "../../assembly/host"; +import "allocator/arena"; +export {memory} + + +let str = "This is a string"; +export function startUp(): void{ + str = "Now the string has changed." + log(str); +} + + +export function overwrite(): void{ + i32.store(changetype(str) + 2, 0) + i32.store(changetype(str) + 3, 0) + i32.store(changetype(str) + 4, 0) + log(str); +} + +export function getStr(): string { + return str; +} diff --git a/lib/parse/tests/assembly/tsconfig.json b/lib/parse/tests/assembly/tsconfig.json new file mode 100644 index 0000000000..9263ff67b2 --- /dev/null +++ b/lib/parse/tests/assembly/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../../../std/assembly.json", + "include": [ + "./**/*.ts" + ] +} diff --git a/lib/parse/tests/index.ts b/lib/parse/tests/index.ts index 5279889f1f..f57b3845eb 100644 --- a/lib/parse/tests/index.ts +++ b/lib/parse/tests/index.ts @@ -91,7 +91,8 @@ function onLocalName(funcIndex: number, index: number, offset: number, length: n console.log(" - Function[" + funcIndex + "].local[" + index + "] name: " + name); } -[ "../build/index.wasm", +[ "../build/test.wasm", + // "../build/index.wasm", // "libm.wasm" ].forEach((filename: string): void => { const binary: Uint8Array = fs.readFileSync(__dirname + "/" + filename); From 987abc0fb4587544e9ade7e31577d58a9856a4eb Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Fri, 18 Jan 2019 16:43:27 -0500 Subject: [PATCH 12/46] Fix parse error --- lib/loader/tsconfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/loader/tsconfig.json b/lib/loader/tsconfig.json index 5f94b88338..d94961912a 100644 --- a/lib/loader/tsconfig.json +++ b/lib/loader/tsconfig.json @@ -6,9 +6,9 @@ "moduleResolution": "node", "outDir": "lib", "target": "es6", - "strict": true, + "strict": true }, "include": [ "src/**/*.ts" ] -} \ No newline at end of file +} From 7fe1c2e5e0fa81f12e62c4f083672a1d582d2ef2 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Fri, 18 Jan 2019 16:47:35 -0500 Subject: [PATCH 13/46] Add built files --- lib/loader/lib/index.d.ts | 74 +++++++ lib/loader/lib/index.js | 437 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 511 insertions(+) create mode 100644 lib/loader/lib/index.d.ts create mode 100644 lib/loader/lib/index.js diff --git a/lib/loader/lib/index.d.ts b/lib/loader/lib/index.d.ts new file mode 100644 index 0000000000..f4622fffb7 --- /dev/null +++ b/lib/loader/lib/index.d.ts @@ -0,0 +1,74 @@ +/** AssemblyScript module loader. */ +/// +export declare type TypedArray = Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array; +export declare type TypedArrayConstructor = Int8ArrayConstructor | Uint8ArrayConstructor | Int16ArrayConstructor | Uint16ArrayConstructor | Int32ArrayConstructor | Uint32ArrayConstructor | Float32ArrayConstructor | Float32ArrayConstructor; +export interface ASExport { + [key: string]: any; +} +export interface ASInstance extends WebAssembly.Instance { + readonly memory: ASMemory; + readonly table: ASTable; +} +export interface ASTable extends WebAssembly.Table { + /** Gets a function by its pointer. */ + getFunction(ptr: number): (...args: any[]) => R; + /** + * Creates a new function in the module's table and returns its pointer. Note that only actual + * WebAssembly functions, i.e. as exported by the module, are supported. + */ + newFunction(fn: (...args: any[]) => any): number; +} +export interface ASMemory extends WebAssembly.Memory { + /** An 8-bit signed integer view on the memory. */ + readonly I8: Int8Array; + /** An 8-bit unsigned integer view on the memory. */ + readonly U8: Uint8Array; + /** A 16-bit signed integer view on the memory. */ + readonly I16: Int16Array; + /** A 16-bit unsigned integer view on the memory. */ + readonly U16: Uint16Array; + /** A 32-bit signed integer view on the memory. */ + readonly I32: Int32Array; + /** A 32-bit unsigned integer view on the memory. */ + readonly U32: Uint32Array; + /** A 64-bit signed integer view on the memory. */ + readonly I64?: BigInt64Array; + /** A 64-bit unsigned integer vieww on the memory. */ + readonly U64?: BigUint64Array; + /** A 32-bit float view on the memory. */ + readonly F32: Float32Array; + /** A 64-bit float view on the memory. */ + readonly F64: Float64Array; + /** Allocates a new string in the module's memory and returns its pointer. */ + newString(str: string): number; + /** Gets a string from the module's memory by its pointer. Alias for memory.getString. */ + getString(ptr: number): string; + /** Copies a typed array into the module's memory and returns its pointer. */ + newArray(view: TypedArray, length?: number): number; + /** Creates a typed array in the module's memory and returns its pointer. */ + newArray(ctor: TypedArrayConstructor, length: number, unsafe?: boolean): number; + /** Gets a view on a typed array in the module's memory by its pointer. Alias for memory.getArray. */ + getArray(ctor: TypedArrayConstructor, ptr: number): T; + /** Frees a typed array in the module's memory. Must not be accessed anymore afterwards. */ + freeArray(ptr: number): void; + allocate(size: number): number; + compare(vl: number, vr: number, n: number): number; + copy(dest: number, src: number, n: number): void; + fill(ptr: number, value: number, size: number): void; + free(ptr: number): void; + reset(): void; +} +export declare namespace utils { + const hasBigInt64: boolean; + function readString(U32: Uint32Array, U16: Uint16Array, ptr: number): string; + function computeBufferSize(byteLength: number): number; + function hasOwnProperty(obj: any, key: any): boolean; +} +/** Instantiates an AssemblyScript module using the specified imports. */ +export declare function instantiate(module: WebAssembly.Module, imports?: any): ASInstance & T; +/** Instantiates an AssemblyScript module from a buffer using the specified imports. */ +export declare function instantiateBuffer(buffer: any, imports?: any): ASInstance & T; +/** Creates a wrapped memory instance. */ +export declare function createMemory(descriptor: WebAssembly.MemoryDescriptor): ASMemory; +/** Demangles an AssemblyScript module's exports to a friendly object structure. */ +export declare function demangle(instance: WebAssembly.Instance): ASInstance & ASExport; diff --git a/lib/loader/lib/index.js b/lib/loader/lib/index.js new file mode 100644 index 0000000000..6e0e4c1d04 --- /dev/null +++ b/lib/loader/lib/index.js @@ -0,0 +1,437 @@ +"use strict"; +/** AssemblyScript module loader. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const ORIG_REF = Symbol('original'); +const SELF_REF = Symbol('self'); +var utils; +(function (utils) { + utils.hasBigInt64 = typeof BigUint64Array !== 'undefined'; + function readString(U32, U16, ptr) { + const chunkSize = 1024; + const dataLength = U32[ptr >>> 2]; + let dataOffset = (ptr + 4) >>> 1; + let dataRemain = dataLength; + const parts = []; + while (dataRemain > chunkSize) { + const last = U16[dataOffset + chunkSize - 1]; + const size = last >= 0xD800 && last < 0xDC00 ? chunkSize - 1 : chunkSize; + const part = U16.subarray(dataOffset, dataOffset += size); + parts.push(String.fromCharCode.apply(String, part)); + dataRemain -= size; + } + const lastPart = U16.subarray(dataOffset, dataOffset + dataRemain); + parts.push(String.fromCharCode.apply(String, lastPart)); + return parts.join(''); + } + utils.readString = readString; + function computeBufferSize(byteLength) { + const HEADER_SIZE = 8; + return 1 << (32 - Math.clz32(byteLength + HEADER_SIZE - 1)); + } + utils.computeBufferSize = computeBufferSize; + function hasOwnProperty(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); + } + utils.hasOwnProperty = hasOwnProperty; +})(utils = exports.utils || (exports.utils = {})); +class MemoryWrapper { + static resolve(value) { + if (value instanceof MemoryWrapper) { + return value; + } + else { + return new MemoryWrapper(value); + } + } + constructor(memory) { + this.raw = memory; + } + // ASMemory conformance + newString(str) { + const dataLength = str.length; + const ptr = this.allocate(4 + (dataLength << 1)); + const dataOffset = (4 + ptr) >>> 1; + const U32 = this.U32, U16 = this.U16; + U32[ptr >>> 2] = dataLength; + for (let i = 0; i < dataLength; ++i) { + U16[dataOffset + i] = str.charCodeAt(i); + } + return ptr; + } + getString(ptr) { + return utils.readString(this.U32, this.U16, ptr); + } + newArray(viewOrCtor, length, unsafe) { + let ctor; + let view; + if (viewOrCtor.constructor === Function) { // TypedArray constructor created in memory + ctor = viewOrCtor; + view = null; + } + else { // TypedArray instance copied into memory + ctor = viewOrCtor.constructor; + view = viewOrCtor; + if (length === undefined) { + length = viewOrCtor.length; + } + } + if (length === undefined) { + throw new Error('Length missing'); + } + const elementSize = ctor.BYTES_PER_ELEMENT; + if (!elementSize) { + throw Error('Not a typed array'); + } + const byteLength = elementSize * length; + const ptr = this.allocate(12); // TypedArray header + const buf = this.allocate(utils.computeBufferSize(byteLength)); // ArrayBuffer + const U32 = this.U32; + U32[ptr >>> 2] = buf; // .buffer + U32[(ptr + 4) >>> 2] = 0; // .byteOffset + U32[(ptr + 8) >>> 2] = byteLength; // .byteLength + U32[buf >>> 2] = byteLength; // .byteLength + U32[(buf + 4) >>> 2] = 0; // 0 + if (view) { + new ctor(this.buffer, buf + 8, length).set(view); + if (view.length < length && !unsafe) { + const setLength = elementSize * view.length; + this.fill(buf + 8 + setLength, 0, byteLength - setLength); + } + } + else if (!unsafe) { + this.fill(buf + 8, 0, byteLength); + } + return ptr; + } + getArray(ctor, ptr) { + const elementSize = ctor.BYTES_PER_ELEMENT; + if (!elementSize) { + throw Error('Not a typed array'); + } + const U32 = this.U32; + const buf = U32[ptr >>> 2]; + const byteOffset = U32[(ptr + 4) >>> 2]; + const byteLength = U32[(ptr + 8) >>> 2]; + return new ctor(this.buffer, buf + 8 + byteOffset, (byteLength - byteOffset) / elementSize); + } + freeArray(ptr) { + const buf = this.U32[ptr >>> 2]; + this.free(buf); + this.free(ptr); + } + get U8() { + if (!this._U8 || this._U8.buffer !== this.raw.buffer) { + this._U8 = new Uint8Array(this.raw.buffer); + } + return this._U8; + } + get U16() { + if (!this._U16 || this._U16.buffer !== this.raw.buffer) { + this._U16 = new Uint16Array(this.raw.buffer); + } + return this._U16; + } + get U32() { + if (!this._U32 || this._U32.buffer !== this.raw.buffer) { + this._U32 = new Uint32Array(this.raw.buffer); + } + return this._U32; + } + get U64() { + if (!utils.hasBigInt64) { + return; + } + if (!this._U64 || this._U64.buffer !== this.raw.buffer) { + this._U64 = new BigUint64Array(this.raw.buffer); + } + return this._U64; + } + get I8() { + if (!this._I8 || this._I8.buffer !== this.raw.buffer) { + this._I8 = new Int8Array(this.raw.buffer); + } + return this._I8; + } + get I16() { + if (!this._I16 || this._I16.buffer !== this.raw.buffer) { + this._I16 = new Int16Array(this.raw.buffer); + } + return this._I16; + } + get I32() { + if (!this._I32 || this._I32.buffer !== this.raw.buffer) { + this._I32 = new Int32Array(this.raw.buffer); + } + return this._I32; + } + get I64() { + if (!utils.hasBigInt64) { + return; + } + if (!this._I64 || this._I64.buffer !== this.raw.buffer) { + this._I64 = new BigInt64Array(this.raw.buffer); + } + return this._I64; + } + get F32() { + if (!this._F32 || this._F32.buffer !== this.raw.buffer) { + this._F32 = new Float32Array(this.raw.buffer); + } + return this._F32; + } + get F64() { + if (!this._F64 || this._F64.buffer !== this.raw.buffer) { + this._F64 = new Float64Array(this.raw.buffer); + } + return this._F64; + } + allocate(size) { + throw new Error('Memory not initialized'); + } + compare(vl, vr, n) { + throw new Error('Memory not initialized'); + } + copy(dest, src, n) { + throw new Error('Memory not initialized'); + } + fill(ptr, value, size) { + throw new Error('Memory not initialized'); + } + free(ptr) { + throw new Error('Memory not initialized'); + } + reset() { + throw new Error('Memory not initialized'); + } + // WebAssembly.Memory conformance + grow(numPages) { + return this.raw.grow(numPages); + } + get buffer() { + return this.raw.buffer; + } + // Internal methods + setExports(rawExports) { + const methods = ['allocate', 'compare', 'copy', 'fill', 'free', 'reset']; + for (const method of methods) { + const exportedMethod = `memory.${method}`; + if (rawExports[exportedMethod]) { + this[method] = rawExports[exportedMethod]; + } + else { + this[method] = () => { throw new Error('Method not exported'); }; + } + } + } +} +class TableWrapper { + constructor(table) { + this.raw = table; + } + // ASTable conformance + getFunction(ptr) { + return this.wrapFunction(this.get(ptr)); + } + newFunction(fn) { + if (typeof fn[ORIG_REF] === 'function') { + fn = fn[ORIG_REF]; + } + const index = this.length; + this.grow(1); + this.set(index, fn); + return index; + } + // WebAssembly.Table conformance + grow(numElements) { + return this.raw.grow(numElements); + } + set(index, value) { + return this.raw.set(index, value); + } + get(index) { + return this.raw.get(index); + } + get length() { + return this.raw.length; + } + // Internal methods + setargc(n) { } + /** Wraps a WebAssembly function while also taking care of variable arguments. */ + wrapFunction(fn) { + const wrap = (...args) => { + this.setargc(args.length); + return fn(...args); + }; + // adding a function to the table with `newFunction` is limited to actual WebAssembly functions, + // hence we can't use the wrapper and instead need to provide a reference to the original + wrap[ORIG_REF] = fn; + return wrap; + } + setExports(rawExports) { + if (rawExports._setargc) { + this.setargc = rawExports._setargc; + } + } +} +function createContext(imports = {}) { + const ctx = { + imports, + memory: imports.memory ? MemoryWrapper.resolve(imports.memory) : null, + }; + const env = (imports.env = imports.env || {}); + const getString = (ptr) => ctx.memory ? ctx.memory.getString(ptr) : ''; + if (!env.abort) { + env.abort = function abort(mesg, file, line, colm) { + throw Error(`Abort: ${getString(mesg)} at ${getString(file)}: ${line}:${colm}`); + }; + } + if (!env.trace) { + env.trace = function trace(mesg, n, ...args) { + let msg = `trace: ${getString(mesg)}`; + if (n) { + msg += ` ${args.slice(0, n).join(', ')}`; + } + console.log(msg); + }; + } + if (env.memory instanceof MemoryWrapper) { + env.memory = env.memory.raw; + } + return ctx; +} +function resolveContext(instance, ctx) { + const table = new TableWrapper(instance.exports.table); + table.setExports(instance.exports); + ctx.memory = MemoryWrapper.resolve(instance.exports.memory); + ctx.memory.setExports(instance.exports); + const resolved = {}; + for (const internalName in instance.exports) { + if (!utils.hasOwnProperty(instance.exports, internalName)) { + continue; + } + // resolve nested objects + const parts = internalName.split('.'); + let name = parts[0]; + // ignore internals + if (name === 'memory' || name === 'table' || name === '_setargc') { + continue; + } + let curr = resolved; + while (parts.length > 1) { + const part = parts.shift(); + if (!utils.hasOwnProperty(curr, part)) { + curr[part] = {}; + } + curr = curr[part]; + } + const elem = instance.exports[internalName]; + const hash = name.indexOf('#'); + if (hash >= 0) { + // resolve classes + const className = name.substring(0, hash); + const classElem = curr[className]; + if (typeof classElem === 'undefined' || !classElem.prototype) { + const ctor = function (...args) { + return ctor.wrap(ctor.prototype.constructor(0, ...args)); + }; + ctor.prototype = {}; + ctor.wrap = function (thisValue) { + return Object.create(ctor.prototype, { + [SELF_REF]: { value: thisValue, writable: false }, + }); + }; + if (classElem) { + Object.getOwnPropertyNames(classElem).forEach((propName) => { + Object.defineProperty(ctor, propName, Object.getOwnPropertyDescriptor(classElem, propName)); + }); + } + curr[className] = ctor; + } + name = name.substring(hash + 1); + curr = curr[className].prototype; + if (/^(get|set):/.test(name)) { + name = name.substring(4); + if (!utils.hasOwnProperty(curr, name)) { + const getter = instance.exports[internalName.replace('set:', 'get:')]; + const setter = instance.exports[internalName.replace('get:', 'set:')]; + Object.defineProperty(curr, name, { + get() { return getter(this[SELF_REF]); }, + set(value) { setter(this[SELF_REF], value); }, + enumerable: true, + }); + } + } + else { + if (name === 'constructor') { + curr[name] = table.wrapFunction(elem); + } + else { // for methods + Object.defineProperty(curr, name, { + value(...args) { + table.setargc(args.length); + return elem(this[SELF_REF], ...args); + }, + }); + } + } + } + else { + // resolve props + if (/^(get|set):/.test(name)) { + name = name.substring(4); + if (!utils.hasOwnProperty(curr, name)) { + Object.defineProperty(curr, name, { + get: instance.exports[internalName.replace('set:', 'get:')], + set: instance.exports[internalName.replace('get:', 'set:')], + enumerable: true, + }); + } + } + else if (typeof elem === 'function') { + curr[name] = table.wrapFunction(elem); + } + else { + curr[name] = elem; + } + } + } + return Object.assign({ memory: ctx.memory, table }, resolved); +} +/** Instantiates an AssemblyScript module using the specified imports. */ +function instantiate(module, imports = {}) { + const ctx = createContext(imports); + const instance = new WebAssembly.Instance(module, ctx.imports); + return resolveContext(instance, ctx); +} +exports.instantiate = instantiate; +/** Instantiates an AssemblyScript module from a buffer using the specified imports. */ +function instantiateBuffer(buffer, imports = {}) { + return instantiate(new WebAssembly.Module(buffer), imports); +} +exports.instantiateBuffer = instantiateBuffer; +/** Instantiates an AssemblyScript module from a response using the specified imports. */ +function instantiateStreaming(response, imports = {}) { + return __awaiter(this, void 0, void 0, function* () { + const ctx = createContext(imports); + const { instance } = yield WebAssembly.instantiateStreaming(response, ctx.imports); + return resolveContext(instance, ctx); + }); +} +/** Creates a wrapped memory instance. */ +function createMemory(descriptor) { + return new MemoryWrapper(new WebAssembly.Memory(descriptor)); +} +exports.createMemory = createMemory; +/** Demangles an AssemblyScript module's exports to a friendly object structure. */ +function demangle(instance) { + return resolveContext(instance, createContext()); +} +exports.demangle = demangle; From 1fca93088b645ac47eb360b563259a6f949fea95 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Fri, 18 Jan 2019 16:52:32 -0500 Subject: [PATCH 14/46] Initial Commit --- lib/host/README.md | 3 +++ lib/host/assembly/host/common.ts | 6 +++++ lib/host/assembly/host/index.ts | 28 +++++++++++++++++++++++ lib/host/assembly/index.ts | 3 +++ lib/host/assembly/tsconfig.json | 6 +++++ lib/host/build/.gitignore | 3 +++ lib/host/index.js | 0 lib/host/package.json | 9 ++++++++ lib/host/src/index.ts | 34 ++++++++++++++++++++++++++++ lib/host/test/.gitignore | 3 +++ lib/host/test/assembly/index.ts | 15 ++++++++++++ lib/host/test/assembly/tsconfig.json | 6 +++++ lib/host/test/index.ts | 0 lib/host/tsconfig.json | 14 ++++++++++++ 14 files changed, 130 insertions(+) create mode 100644 lib/host/README.md create mode 100644 lib/host/assembly/host/common.ts create mode 100644 lib/host/assembly/host/index.ts create mode 100644 lib/host/assembly/index.ts create mode 100644 lib/host/assembly/tsconfig.json create mode 100644 lib/host/build/.gitignore create mode 100644 lib/host/index.js create mode 100644 lib/host/package.json create mode 100644 lib/host/src/index.ts create mode 100644 lib/host/test/.gitignore create mode 100644 lib/host/test/assembly/index.ts create mode 100644 lib/host/test/assembly/tsconfig.json create mode 100644 lib/host/test/index.ts create mode 100644 lib/host/tsconfig.json diff --git a/lib/host/README.md b/lib/host/README.md new file mode 100644 index 0000000000..6b5c6b36f5 --- /dev/null +++ b/lib/host/README.md @@ -0,0 +1,3 @@ +# Host Bindings Library + +Each Webassembly module with any declared inputs requires an imports object. Currently this must be handled by the each project, however, there should be a core set of host functions that a WebAssembly module can expect to be present. diff --git a/lib/host/assembly/host/common.ts b/lib/host/assembly/host/common.ts new file mode 100644 index 0000000000..f64e40a67f --- /dev/null +++ b/lib/host/assembly/host/common.ts @@ -0,0 +1,6 @@ +export declare namespace host { + export function _log(x: T, size: usize): void; + export function _log_str(x: string): void; + export function _logi(x: i32): void; + export function _logf(x: f32): void; +} diff --git a/lib/host/assembly/host/index.ts b/lib/host/assembly/host/index.ts new file mode 100644 index 0000000000..938ae7fccc --- /dev/null +++ b/lib/host/assembly/host/index.ts @@ -0,0 +1,28 @@ +// Imported callbacks + +import {host} from "./common"; + +export function log(item: T):void { + if (isReference()) { + if (isString()) { + host._log_str(changetype(item)); + } else { + host._log(changetype(item), offsetof()); + } + } else { + if (isInteger()) { + host._logi(item); + } else { + host. _logf(item); + } + } +} + +export function log_str(item: string): void { + log(item); +} + +export function err(message: string): void{ + log("Error: " + message); + unreachable(); +} diff --git a/lib/host/assembly/index.ts b/lib/host/assembly/index.ts new file mode 100644 index 0000000000..c9a179b649 --- /dev/null +++ b/lib/host/assembly/index.ts @@ -0,0 +1,3 @@ +// The entry file of your WebAssembly module. + +export * from "./host"; diff --git a/lib/host/assembly/tsconfig.json b/lib/host/assembly/tsconfig.json new file mode 100644 index 0000000000..6e52b21c48 --- /dev/null +++ b/lib/host/assembly/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../../std/assembly.json", + "include": [ + "./**/*.ts" + ] +} diff --git a/lib/host/build/.gitignore b/lib/host/build/.gitignore new file mode 100644 index 0000000000..22b2ed20a7 --- /dev/null +++ b/lib/host/build/.gitignore @@ -0,0 +1,3 @@ +*.wasm +*.wasm.map +*.asm.js diff --git a/lib/host/index.js b/lib/host/index.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/host/package.json b/lib/host/package.json new file mode 100644 index 0000000000..f5f8151c4c --- /dev/null +++ b/lib/host/package.json @@ -0,0 +1,9 @@ +{ + "scripts": { + "asbuild:untouched": "asc assembly/index.ts -b build/untouched.wasm -t build/untouched.wat --sourceMap --validate --debug", + "asbuild:optimized": "asc assembly/index.ts -b build/optimized.wasm -t build/optimized.wat --sourceMap --validate --optimize", + "asbuild": "npm run asbuild:untouched && npm run asbuild:optimized", + "test:build": "asc test/assembly/index.ts -b test/build/untouched.wasm -t bulid/untouched.wat --sourceMap --validate --debug", + "test":"npm run test:build && ts-node test + } +} diff --git a/lib/host/src/index.ts b/lib/host/src/index.ts new file mode 100644 index 0000000000..2ca2af6d6c --- /dev/null +++ b/lib/host/src/index.ts @@ -0,0 +1,34 @@ + +import * as loader from "../../loader"; +import {host as imports} from "../assembly/host/common"; + +let instance: loader.ASInstance +export namespace host { + function debug(){ + debugger; + } + + function _log(start: number, sizeof: number){ + let begin = start >> 2; + let size = sizeof >> 2; + if (size == 1 ){ + console.log(start); + } else { + let str = [] + let len = 0; + for (let i = begin; i < begin+size; i++){ + let line = `| ${i} | ${instance.I32[i]>>2}`; + len = Math.max(len, line.length); + str.push(line); + } + let space = " "; + let output = str.map((v,i,a)=> v + (space as any).repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = (dash as any).repeat(len+2); + console.log([line,output.join('\n'+line+'\n'),line].join("\n")); + } + }, + _log_str:(x) => console.log(loader.getStringImpl(buffer, buffer16, x)), + _logi: console.log, + _logf: console.log +} diff --git a/lib/host/test/.gitignore b/lib/host/test/.gitignore new file mode 100644 index 0000000000..d4b5fc5a3d --- /dev/null +++ b/lib/host/test/.gitignore @@ -0,0 +1,3 @@ +build/*.wasm +build/*.wasm.map +build/*.asm.js diff --git a/lib/host/test/assembly/index.ts b/lib/host/test/assembly/index.ts new file mode 100644 index 0000000000..a3467b9400 --- /dev/null +++ b/lib/host/test/assembly/index.ts @@ -0,0 +1,15 @@ +import {host, log} from "../../assembly"; +//import the host + + +let message = "Does the string printing work?"; + +class Car { + weight: i32 = 10121; + length: i64 = 200002; +} + +log(message); +log(42); + +log(new Car()); diff --git a/lib/host/test/assembly/tsconfig.json b/lib/host/test/assembly/tsconfig.json new file mode 100644 index 0000000000..9263ff67b2 --- /dev/null +++ b/lib/host/test/assembly/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../../../std/assembly.json", + "include": [ + "./**/*.ts" + ] +} diff --git a/lib/host/test/index.ts b/lib/host/test/index.ts new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/host/tsconfig.json b/lib/host/tsconfig.json new file mode 100644 index 0000000000..d94961912a --- /dev/null +++ b/lib/host/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "declaration": true, + "lib": ["dom", "es2015", "esnext.bigint", "es2017.typedarrays"], + "module": "commonjs", + "moduleResolution": "node", + "outDir": "lib", + "target": "es6", + "strict": true + }, + "include": [ + "src/**/*.ts" + ] +} From 03e1b38c687eef3514131c8c0d08348f856bb869 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Thu, 24 Jan 2019 17:29:33 -0500 Subject: [PATCH 15/46] Added Test --- lib/host/assembly/host.ts | 6 + lib/host/assembly/host/common.ts | 6 - lib/host/assembly/host/index.ts | 28 - lib/host/assembly/index.ts | 29 +- lib/host/build/.gitignore | 3 - lib/host/lib/index.d.ts | 15 + lib/host/lib/index.js | 39 + lib/host/package.json | 21 +- lib/host/src/index.ts | 31 +- lib/host/test/assembly/index.ts | 15 - lib/host/test/index.ts | 0 lib/host/{test => tests}/.gitignore | 0 lib/host/tests/assembly/index.ts | 15 + .../{test => tests}/assembly/tsconfig.json | 0 lib/host/tests/build/index.d.ts | 21 + lib/host/tests/build/untouched.wat | 1933 +++++++++++++++++ lib/host/tests/index.ts | 11 + lib/host/tsconfig.json | 2 +- 18 files changed, 2105 insertions(+), 70 deletions(-) create mode 100644 lib/host/assembly/host.ts delete mode 100644 lib/host/assembly/host/common.ts delete mode 100644 lib/host/assembly/host/index.ts delete mode 100644 lib/host/build/.gitignore create mode 100644 lib/host/lib/index.d.ts create mode 100644 lib/host/lib/index.js delete mode 100644 lib/host/test/assembly/index.ts delete mode 100644 lib/host/test/index.ts rename lib/host/{test => tests}/.gitignore (100%) create mode 100644 lib/host/tests/assembly/index.ts rename lib/host/{test => tests}/assembly/tsconfig.json (100%) create mode 100644 lib/host/tests/build/index.d.ts create mode 100644 lib/host/tests/build/untouched.wat create mode 100644 lib/host/tests/index.ts diff --git a/lib/host/assembly/host.ts b/lib/host/assembly/host.ts new file mode 100644 index 0000000000..4f4052dd07 --- /dev/null +++ b/lib/host/assembly/host.ts @@ -0,0 +1,6 @@ + + +export declare function _log(x: T, size: usize): void; +export declare function _log_str(x: string): void; +export declare function _logi(x: i32): void; +export declare function _logf(x: f32): void; diff --git a/lib/host/assembly/host/common.ts b/lib/host/assembly/host/common.ts deleted file mode 100644 index f64e40a67f..0000000000 --- a/lib/host/assembly/host/common.ts +++ /dev/null @@ -1,6 +0,0 @@ -export declare namespace host { - export function _log(x: T, size: usize): void; - export function _log_str(x: string): void; - export function _logi(x: i32): void; - export function _logf(x: f32): void; -} diff --git a/lib/host/assembly/host/index.ts b/lib/host/assembly/host/index.ts deleted file mode 100644 index 938ae7fccc..0000000000 --- a/lib/host/assembly/host/index.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Imported callbacks - -import {host} from "./common"; - -export function log(item: T):void { - if (isReference()) { - if (isString()) { - host._log_str(changetype(item)); - } else { - host._log(changetype(item), offsetof()); - } - } else { - if (isInteger()) { - host._logi(item); - } else { - host. _logf(item); - } - } -} - -export function log_str(item: string): void { - log(item); -} - -export function err(message: string): void{ - log("Error: " + message); - unreachable(); -} diff --git a/lib/host/assembly/index.ts b/lib/host/assembly/index.ts index c9a179b649..fb50dbfefb 100644 --- a/lib/host/assembly/index.ts +++ b/lib/host/assembly/index.ts @@ -1,3 +1,30 @@ // The entry file of your WebAssembly module. -export * from "./host"; +// Imported callbacks + +import * as host from "./host" + +export function log(item: T):void { + if (isReference()) { + if (isString()) { + host._log_str(changetype(item)); + } else { + host._log(changetype(item), offsetof()); + } + } else { + if (isInteger()) { + host._logi(item); + } else { + host._logf(item); + } + } +} + +export function log_str(item: string): void { + log(item); +} + +export function err(message: string): void { + log("Error: " + message); + unreachable(); +} diff --git a/lib/host/build/.gitignore b/lib/host/build/.gitignore deleted file mode 100644 index 22b2ed20a7..0000000000 --- a/lib/host/build/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.wasm -*.wasm.map -*.asm.js diff --git a/lib/host/lib/index.d.ts b/lib/host/lib/index.d.ts new file mode 100644 index 0000000000..f0236cbc1e --- /dev/null +++ b/lib/host/lib/index.d.ts @@ -0,0 +1,15 @@ +import * as loader from "../../loader"; +export declare let host: { + debug: () => void; + _log: (start: number, sizeof: number) => void; + _log_str: (x: number) => void; + _logi: { + (message?: any, ...optionalParams: any[]): void; + (message?: any, ...optionalParams: any[]): void; + }; + _logf: { + (message?: any, ...optionalParams: any[]): void; + (message?: any, ...optionalParams: any[]): void; + }; + bootstrap: (_instance: loader.ASInstance) => void; +}; diff --git a/lib/host/lib/index.js b/lib/host/lib/index.js new file mode 100644 index 0000000000..265ebea3cf --- /dev/null +++ b/lib/host/lib/index.js @@ -0,0 +1,39 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//tslint:disable +let instance; +exports.host = { + debug: () => { + // tslint:disable-next-line + debugger; + }, + _log: (start, sizeof) => { + let begin = start >> 2; + let size = sizeof >> 2; + if (size == 1) { + console.log(start); + } + else { + let str = []; + let len = 0; + for (let i = begin; i < begin + size; i++) { + let line = `| ${i} | ${instance.memory.I32[i] >> 2}`; + len = Math.max(len, line.length); + str.push(line); + } + let space = " "; + let output = str.map((v, i, a) => v + space.repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = dash.repeat(len + 2); + console.log([line, output.join('\n' + line + '\n'), line].join("\n")); + } + }, + _log_str: (x) => { + return console.log(instance.memory.getString(x)); + }, + _logi: console.log, + _logf: console.log, + bootstrap: (_instance) => { + instance = _instance; + } +}; diff --git a/lib/host/package.json b/lib/host/package.json index f5f8151c4c..f3f3b53a61 100644 --- a/lib/host/package.json +++ b/lib/host/package.json @@ -1,9 +1,20 @@ { + "name": "@assemblyscript/host", + "version": "2.0.0", + "license": "Apache-2.0", + "main": "./lib/index", + "typings": "./lib/index", "scripts": { - "asbuild:untouched": "asc assembly/index.ts -b build/untouched.wasm -t build/untouched.wat --sourceMap --validate --debug", - "asbuild:optimized": "asc assembly/index.ts -b build/optimized.wasm -t build/optimized.wat --sourceMap --validate --optimize", - "asbuild": "npm run asbuild:untouched && npm run asbuild:optimized", - "test:build": "asc test/assembly/index.ts -b test/build/untouched.wasm -t bulid/untouched.wat --sourceMap --validate --debug", - "test":"npm run test:build && ts-node test + "build": "tsc", + "prepublishOnly": "tsc", + "test:build": "../../bin/asc tests/assembly/index.ts -b tests/build/untouched.wasm -t tests/build/untouched.wat -d tests/build/index.d.ts --debug", + "test": "ts-node tests" + }, + "files": [ + "lib/*" + ], + "devDependencies": { + "@types/webassembly-js-api": "0.0.1", + "typescript": "^3.2.2" } } diff --git a/lib/host/src/index.ts b/lib/host/src/index.ts index 2ca2af6d6c..ec190c99e5 100644 --- a/lib/host/src/index.ts +++ b/lib/host/src/index.ts @@ -1,14 +1,15 @@ import * as loader from "../../loader"; -import {host as imports} from "../assembly/host/common"; - +//tslint:disable let instance: loader.ASInstance -export namespace host { - function debug(){ + +export let host = { + debug : (): void=>{ + // tslint:disable-next-line debugger; - } + }, - function _log(start: number, sizeof: number){ + _log : (start: number, sizeof: number): void=>{ let begin = start >> 2; let size = sizeof >> 2; if (size == 1 ){ @@ -17,18 +18,26 @@ export namespace host { let str = [] let len = 0; for (let i = begin; i < begin+size; i++){ - let line = `| ${i} | ${instance.I32[i]>>2}`; + let line = `| ${i} | ${instance.memory.I32[i]>>2}`; len = Math.max(len, line.length); str.push(line); } let space = " "; - let output = str.map((v,i,a)=> v + (space as any).repeat(len - v.length + 1) + "|"); + let output = str.map((v: any,i:number,a: any[]):string => v + (space as any).repeat(len - v.length + 1) + "|"); let dash = "-"; let line = (dash as any).repeat(len+2); console.log([line,output.join('\n'+line+'\n'),line].join("\n")); } }, - _log_str:(x) => console.log(loader.getStringImpl(buffer, buffer16, x)), - _logi: console.log, - _logf: console.log + + _log_str : (x: number): void =>{ + return console.log(instance.memory.getString(x)) + }, + + _logi:console.log, + _logf:console.log, + + bootstrap: (_instance: loader.ASInstance):void => { + instance = _instance; + } } diff --git a/lib/host/test/assembly/index.ts b/lib/host/test/assembly/index.ts deleted file mode 100644 index a3467b9400..0000000000 --- a/lib/host/test/assembly/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import {host, log} from "../../assembly"; -//import the host - - -let message = "Does the string printing work?"; - -class Car { - weight: i32 = 10121; - length: i64 = 200002; -} - -log(message); -log(42); - -log(new Car()); diff --git a/lib/host/test/index.ts b/lib/host/test/index.ts deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/lib/host/test/.gitignore b/lib/host/tests/.gitignore similarity index 100% rename from lib/host/test/.gitignore rename to lib/host/tests/.gitignore diff --git a/lib/host/tests/assembly/index.ts b/lib/host/tests/assembly/index.ts new file mode 100644 index 0000000000..6f305e3613 --- /dev/null +++ b/lib/host/tests/assembly/index.ts @@ -0,0 +1,15 @@ +import {log} from "../../assembly/index"; +//import the host +import "allocator/arena"; +export { memory }; + +class Car { + weight: i32 = 10121; + length: i64 = 200002; +} + +export function runTest(): void{ + log("Does the string printing work?"); + log(42); + log(new Car()); +} diff --git a/lib/host/test/assembly/tsconfig.json b/lib/host/tests/assembly/tsconfig.json similarity index 100% rename from lib/host/test/assembly/tsconfig.json rename to lib/host/tests/assembly/tsconfig.json diff --git a/lib/host/tests/build/index.d.ts b/lib/host/tests/build/index.d.ts new file mode 100644 index 0000000000..631084ccc9 --- /dev/null +++ b/lib/host/tests/build/index.d.ts @@ -0,0 +1,21 @@ +declare module ASModule { + type i8 = number; + type i16 = number; + type i32 = number; + type u8 = number; + type u16 = number; + type u32 = number; + type f32 = number; + type f64 = number; + type bool = any; + function runTest(): void; + namespace memory { + function fill(dest: u32, c: u8, n: u32): void; + function copy(dest: u32, src: u32, n: u32): void; + function compare(vl: u32, vr: u32, n: u32): i32; + function allocate(size: u32): u32; + function free(ptr: u32): void; + function reset(): void; + } +} +export default ASModule; diff --git a/lib/host/tests/build/untouched.wat b/lib/host/tests/build/untouched.wat new file mode 100644 index 0000000000..975b38096b --- /dev/null +++ b/lib/host/tests/build/untouched.wat @@ -0,0 +1,1933 @@ +(module + (type $iiiv (func (param i32 i32 i32))) + (type $iiii (func (param i32 i32 i32) (result i32))) + (type $ii (func (param i32) (result i32))) + (type $iv (func (param i32))) + (type $v (func)) + (type $iiv (func (param i32 i32))) + (import "host" "_log_str" (func $assembly/host/_log_str (param i32))) + (import "host" "_logi" (func $assembly/host/_logi (param i32))) + (import "host" "_log" (func $assembly/host/_log (param i32 i32))) + (memory $0 1) + (data (i32.const 8) "\1e\00\00\00D\00o\00e\00s\00 \00t\00h\00e\00 \00s\00t\00r\00i\00n\00g\00 \00p\00r\00i\00n\00t\00i\00n\00g\00 \00w\00o\00r\00k\00?\00") + (table $0 1 anyfunc) + (elem (i32.const 0) $null) + (global $~lib/internal/allocator/AL_BITS i32 (i32.const 3)) + (global $~lib/internal/allocator/AL_SIZE i32 (i32.const 8)) + (global $~lib/internal/allocator/AL_MASK i32 (i32.const 7)) + (global $~lib/internal/allocator/MAX_SIZE_32 i32 (i32.const 1073741824)) + (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) + (global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) + (global $HEAP_BASE i32 (i32.const 72)) + (export "memory" (memory $0)) + (export "table" (table $0)) + (export "runTest" (func $tests/assembly/index/runTest)) + (export "memory.fill" (func $~lib/memory/memory.fill)) + (export "memory.copy" (func $~lib/memory/memory.copy)) + (export "memory.compare" (func $~lib/memory/memory.compare)) + (export "memory.allocate" (func $~lib/memory/memory.allocate)) + (export "memory.free" (func $~lib/memory/memory.free)) + (export "memory.reset" (func $~lib/memory/memory.reset)) + (start $start) + (func $~lib/internal/memory/memset (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i64) + get_local $2 + i32.eqz + if + return + end + get_local $0 + get_local $1 + i32.store8 + get_local $0 + get_local $2 + i32.add + i32.const 1 + i32.sub + get_local $1 + i32.store8 + get_local $2 + i32.const 2 + i32.le_u + if + return + end + get_local $0 + i32.const 1 + i32.add + get_local $1 + i32.store8 + get_local $0 + i32.const 2 + i32.add + get_local $1 + i32.store8 + get_local $0 + get_local $2 + i32.add + i32.const 2 + i32.sub + get_local $1 + i32.store8 + get_local $0 + get_local $2 + i32.add + i32.const 3 + i32.sub + get_local $1 + i32.store8 + get_local $2 + i32.const 6 + i32.le_u + if + return + end + get_local $0 + i32.const 3 + i32.add + get_local $1 + i32.store8 + get_local $0 + get_local $2 + i32.add + i32.const 4 + i32.sub + get_local $1 + i32.store8 + get_local $2 + i32.const 8 + i32.le_u + if + return + end + i32.const 0 + get_local $0 + i32.sub + i32.const 3 + i32.and + set_local $3 + get_local $0 + get_local $3 + i32.add + set_local $0 + get_local $2 + get_local $3 + i32.sub + set_local $2 + get_local $2 + i32.const -4 + i32.and + set_local $2 + i32.const -1 + i32.const 255 + i32.div_u + get_local $1 + i32.const 255 + i32.and + i32.mul + set_local $4 + get_local $0 + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 4 + i32.sub + get_local $4 + i32.store + get_local $2 + i32.const 8 + i32.le_u + if + return + end + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.store + get_local $0 + i32.const 8 + i32.add + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 12 + i32.sub + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 8 + i32.sub + get_local $4 + i32.store + get_local $2 + i32.const 24 + i32.le_u + if + return + end + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.store + get_local $0 + i32.const 16 + i32.add + get_local $4 + i32.store + get_local $0 + i32.const 20 + i32.add + get_local $4 + i32.store + get_local $0 + i32.const 24 + i32.add + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 28 + i32.sub + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 24 + i32.sub + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 20 + i32.sub + get_local $4 + i32.store + get_local $0 + get_local $2 + i32.add + i32.const 16 + i32.sub + get_local $4 + i32.store + i32.const 24 + get_local $0 + i32.const 4 + i32.and + i32.add + set_local $3 + get_local $0 + get_local $3 + i32.add + set_local $0 + get_local $2 + get_local $3 + i32.sub + set_local $2 + get_local $4 + i64.extend_u/i32 + get_local $4 + i64.extend_u/i32 + i64.const 32 + i64.shl + i64.or + set_local $5 + block $break|0 + loop $continue|0 + get_local $2 + i32.const 32 + i32.ge_u + if + block + get_local $0 + get_local $5 + i64.store + get_local $0 + i32.const 8 + i32.add + get_local $5 + i64.store + get_local $0 + i32.const 16 + i32.add + get_local $5 + i64.store + get_local $0 + i32.const 24 + i32.add + get_local $5 + i64.store + get_local $2 + i32.const 32 + i32.sub + set_local $2 + get_local $0 + i32.const 32 + i32.add + set_local $0 + end + br $continue|0 + end + end + end + ) + (func $~lib/memory/memory.fill (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memset + ) + (func $~lib/internal/memory/memcpy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + block $break|0 + loop $continue|0 + get_local $2 + if (result i32) + get_local $1 + i32.const 3 + i32.and + else + get_local $2 + end + if + block + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + end + br $continue|0 + end + end + end + get_local $0 + i32.const 3 + i32.and + i32.const 0 + i32.eq + if + block $break|1 + loop $continue|1 + get_local $2 + i32.const 16 + i32.ge_u + if + block + get_local $0 + get_local $1 + i32.load + i32.store + get_local $0 + i32.const 4 + i32.add + get_local $1 + i32.const 4 + i32.add + i32.load + i32.store + get_local $0 + i32.const 8 + i32.add + get_local $1 + i32.const 8 + i32.add + i32.load + i32.store + get_local $0 + i32.const 12 + i32.add + get_local $1 + i32.const 12 + i32.add + i32.load + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|1 + end + end + end + get_local $2 + i32.const 8 + i32.and + if + get_local $0 + get_local $1 + i32.load + i32.store + get_local $0 + i32.const 4 + i32.add + get_local $1 + i32.const 4 + i32.add + i32.load + i32.store + get_local $0 + i32.const 8 + i32.add + set_local $0 + get_local $1 + i32.const 8 + i32.add + set_local $1 + end + get_local $2 + i32.const 4 + i32.and + if + get_local $0 + get_local $1 + i32.load + i32.store + get_local $0 + i32.const 4 + i32.add + set_local $0 + get_local $1 + i32.const 4 + i32.add + set_local $1 + end + get_local $2 + i32.const 2 + i32.and + if + get_local $0 + get_local $1 + i32.load16_u + i32.store16 + get_local $0 + i32.const 2 + i32.add + set_local $0 + get_local $1 + i32.const 2 + i32.add + set_local $1 + end + get_local $2 + i32.const 1 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + return + end + get_local $2 + i32.const 32 + i32.ge_u + if + block $break|2 + block $case2|2 + block $case1|2 + block $case0|2 + get_local $0 + i32.const 3 + i32.and + set_local $5 + get_local $5 + i32.const 1 + i32.eq + br_if $case0|2 + get_local $5 + i32.const 2 + i32.eq + br_if $case1|2 + get_local $5 + i32.const 3 + i32.eq + br_if $case2|2 + br $break|2 + end + block + get_local $1 + i32.load + set_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 3 + i32.sub + set_local $2 + block $break|3 + loop $continue|3 + get_local $2 + i32.const 17 + i32.ge_u + if + block + get_local $1 + i32.const 1 + i32.add + i32.load + set_local $4 + get_local $0 + get_local $3 + i32.const 24 + i32.shr_u + get_local $4 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 5 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.const 24 + i32.shr_u + get_local $3 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 9 + i32.add + i32.load + set_local $4 + get_local $0 + i32.const 8 + i32.add + get_local $3 + i32.const 24 + i32.shr_u + get_local $4 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 13 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.const 24 + i32.shr_u + get_local $3 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|3 + end + end + end + br $break|2 + unreachable + end + unreachable + end + block + get_local $1 + i32.load + set_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 2 + i32.sub + set_local $2 + block $break|4 + loop $continue|4 + get_local $2 + i32.const 18 + i32.ge_u + if + block + get_local $1 + i32.const 2 + i32.add + i32.load + set_local $4 + get_local $0 + get_local $3 + i32.const 16 + i32.shr_u + get_local $4 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 6 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.const 16 + i32.shr_u + get_local $3 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 10 + i32.add + i32.load + set_local $4 + get_local $0 + i32.const 8 + i32.add + get_local $3 + i32.const 16 + i32.shr_u + get_local $4 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 14 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.const 16 + i32.shr_u + get_local $3 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|4 + end + end + end + br $break|2 + unreachable + end + unreachable + end + block + get_local $1 + i32.load + set_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + block $break|5 + loop $continue|5 + get_local $2 + i32.const 19 + i32.ge_u + if + block + get_local $1 + i32.const 3 + i32.add + i32.load + set_local $4 + get_local $0 + get_local $3 + i32.const 8 + i32.shr_u + get_local $4 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 7 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.const 8 + i32.shr_u + get_local $3 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 11 + i32.add + i32.load + set_local $4 + get_local $0 + i32.const 8 + i32.add + get_local $3 + i32.const 8 + i32.shr_u + get_local $4 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 15 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.const 8 + i32.shr_u + get_local $3 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|5 + end + end + end + br $break|2 + unreachable + end + unreachable + end + end + get_local $2 + i32.const 16 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 8 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 4 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 2 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 1 + i32.and + if + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + end + ) + (func $~lib/internal/memory/memmove (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + get_local $0 + get_local $1 + i32.eq + if + return + end + get_local $1 + get_local $2 + i32.add + get_local $0 + i32.le_u + tee_local $3 + if (result i32) + get_local $3 + else + get_local $0 + get_local $2 + i32.add + get_local $1 + i32.le_u + end + if + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memcpy + return + end + get_local $0 + get_local $1 + i32.lt_u + if + get_local $1 + i32.const 7 + i32.and + get_local $0 + i32.const 7 + i32.and + i32.eq + if + block $break|0 + loop $continue|0 + get_local $0 + i32.const 7 + i32.and + if + block + get_local $2 + i32.eqz + if + return + end + get_local $2 + i32.const 1 + i32.sub + set_local $2 + block (result i32) + get_local $0 + tee_local $3 + i32.const 1 + i32.add + set_local $0 + get_local $3 + end + block (result i32) + get_local $1 + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $3 + end + i32.load8_u + i32.store8 + end + br $continue|0 + end + end + end + block $break|1 + loop $continue|1 + get_local $2 + i32.const 8 + i32.ge_u + if + block + get_local $0 + get_local $1 + i64.load + i64.store + get_local $2 + i32.const 8 + i32.sub + set_local $2 + get_local $0 + i32.const 8 + i32.add + set_local $0 + get_local $1 + i32.const 8 + i32.add + set_local $1 + end + br $continue|1 + end + end + end + end + block $break|2 + loop $continue|2 + get_local $2 + if + block + block (result i32) + get_local $0 + tee_local $3 + i32.const 1 + i32.add + set_local $0 + get_local $3 + end + block (result i32) + get_local $1 + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $3 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + end + br $continue|2 + end + end + end + else + get_local $1 + i32.const 7 + i32.and + get_local $0 + i32.const 7 + i32.and + i32.eq + if + block $break|3 + loop $continue|3 + get_local $0 + get_local $2 + i32.add + i32.const 7 + i32.and + if + block + get_local $2 + i32.eqz + if + return + end + get_local $0 + get_local $2 + i32.const 1 + i32.sub + tee_local $2 + i32.add + get_local $1 + get_local $2 + i32.add + i32.load8_u + i32.store8 + end + br $continue|3 + end + end + end + block $break|4 + loop $continue|4 + get_local $2 + i32.const 8 + i32.ge_u + if + block + get_local $2 + i32.const 8 + i32.sub + set_local $2 + get_local $0 + get_local $2 + i32.add + get_local $1 + get_local $2 + i32.add + i64.load + i64.store + end + br $continue|4 + end + end + end + end + block $break|5 + loop $continue|5 + get_local $2 + if + get_local $0 + get_local $2 + i32.const 1 + i32.sub + tee_local $2 + i32.add + get_local $1 + get_local $2 + i32.add + i32.load8_u + i32.store8 + br $continue|5 + end + end + end + end + ) + (func $~lib/memory/memory.copy (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memmove + ) + (func $~lib/internal/memory/memcmp (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + get_local $0 + get_local $1 + i32.eq + if + i32.const 0 + return + end + block $break|0 + loop $continue|0 + get_local $2 + i32.const 0 + i32.ne + tee_local $3 + if (result i32) + get_local $0 + i32.load8_u + get_local $1 + i32.load8_u + i32.eq + else + get_local $3 + end + if + block + get_local $2 + i32.const 1 + i32.sub + set_local $2 + get_local $0 + i32.const 1 + i32.add + set_local $0 + get_local $1 + i32.const 1 + i32.add + set_local $1 + end + br $continue|0 + end + end + end + get_local $2 + if (result i32) + get_local $0 + i32.load8_u + get_local $1 + i32.load8_u + i32.sub + else + i32.const 0 + end + ) + (func $~lib/memory/memory.compare (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memcmp + ) + (func $~lib/allocator/arena/__memory_allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + get_global $~lib/internal/allocator/MAX_SIZE_32 + i32.gt_u + if + unreachable + end + get_global $~lib/allocator/arena/offset + set_local $1 + get_local $1 + get_local $0 + tee_local $2 + i32.const 1 + tee_local $3 + get_local $2 + get_local $3 + i32.gt_u + select + i32.add + get_global $~lib/internal/allocator/AL_MASK + i32.add + get_global $~lib/internal/allocator/AL_MASK + i32.const -1 + i32.xor + i32.and + set_local $4 + current_memory + set_local $5 + get_local $4 + get_local $5 + i32.const 16 + i32.shl + i32.gt_u + if + get_local $4 + get_local $1 + i32.sub + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + set_local $2 + get_local $5 + tee_local $3 + get_local $2 + tee_local $6 + get_local $3 + get_local $6 + i32.gt_s + select + set_local $3 + get_local $3 + grow_memory + i32.const 0 + i32.lt_s + if + get_local $2 + grow_memory + i32.const 0 + i32.lt_s + if + unreachable + end + end + end + get_local $4 + set_global $~lib/allocator/arena/offset + get_local $1 + ) + (func $~lib/memory/memory.allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $~lib/allocator/arena/__memory_allocate + return + ) + (func $~lib/allocator/arena/__memory_free (; 12 ;) (type $iv) (param $0 i32) + nop + ) + (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) + get_local $0 + call $~lib/allocator/arena/__memory_free + return + ) + (func $~lib/allocator/arena/__memory_reset (; 14 ;) (type $v) + get_global $~lib/allocator/arena/startOffset + set_global $~lib/allocator/arena/offset + ) + (func $~lib/memory/memory.reset (; 15 ;) (type $v) + call $~lib/allocator/arena/__memory_reset + return + ) + (func $assembly/index/log (; 16 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/_log_str + ) + (func $assembly/index/log (; 17 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/_logi + ) + (func $assembly/index/log (; 18 ;) (type $iv) (param $0 i32) + get_local $0 + i32.const 16 + call $assembly/host/_log + ) + (func $tests/assembly/index/runTest (; 19 ;) (type $v) + (local $0 i32) + i32.const 8 + call $assembly/index/log + i32.const 42 + call $assembly/index/log + block (result i32) + i32.const 16 + call $~lib/memory/memory.allocate + set_local $0 + get_local $0 + i32.const 10121 + i32.store + get_local $0 + i64.const 200002 + i64.store offset=8 + get_local $0 + end + call $assembly/index/log + ) + (func $start (; 20 ;) (type $v) + get_global $HEAP_BASE + get_global $~lib/internal/allocator/AL_MASK + i32.add + get_global $~lib/internal/allocator/AL_MASK + i32.const -1 + i32.xor + i32.and + set_global $~lib/allocator/arena/startOffset + get_global $~lib/allocator/arena/startOffset + set_global $~lib/allocator/arena/offset + ) + (func $null (; 21 ;) (type $v) + ) +) diff --git a/lib/host/tests/index.ts b/lib/host/tests/index.ts new file mode 100644 index 0000000000..b8d9612840 --- /dev/null +++ b/lib/host/tests/index.ts @@ -0,0 +1,11 @@ +import {host} from "../src"; +import * as loader from "../../loader"; +import * as fs from "fs"; +import ASModule from "./build"; +import * as asc from "../../../cli/asc" +type testMod = typeof ASModule; + +var wasm = fs.readFileSync(`${__dirname}/build/untouched.wasm`); +var instance = loader.instantiateBuffer(wasm.buffer, {host}); +host.bootstrap(instance) +instance.runTest(); diff --git a/lib/host/tsconfig.json b/lib/host/tsconfig.json index d94961912a..aed0539363 100644 --- a/lib/host/tsconfig.json +++ b/lib/host/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "declaration": true, - "lib": ["dom", "es2015", "esnext.bigint", "es2017.typedarrays"], + "lib": ["dom", "es2015", "es2017.typedarrays"], "module": "commonjs", "moduleResolution": "node", "outDir": "lib", From 0eb73d08863f12d966e414ac3bffdfdcd7e0e5d4 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Thu, 24 Jan 2019 17:39:18 -0500 Subject: [PATCH 16/46] Changed to class. --- lib/host/src/index.ts | 20 ++++++++++---------- lib/host/tests/index.ts | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lib/host/src/index.ts b/lib/host/src/index.ts index ec190c99e5..67f60c4474 100644 --- a/lib/host/src/index.ts +++ b/lib/host/src/index.ts @@ -3,13 +3,13 @@ import * as loader from "../../loader"; //tslint:disable let instance: loader.ASInstance -export let host = { - debug : (): void=>{ +export class Host{ + debug (): void { // tslint:disable-next-line debugger; - }, + } - _log : (start: number, sizeof: number): void=>{ + _log(start: number, sizeof: number): void { let begin = start >> 2; let size = sizeof >> 2; if (size == 1 ){ @@ -28,16 +28,16 @@ export let host = { let line = (dash as any).repeat(len+2); console.log([line,output.join('\n'+line+'\n'),line].join("\n")); } - }, + } - _log_str : (x: number): void =>{ + _log_str(x: number): void { return console.log(instance.memory.getString(x)) - }, + } - _logi:console.log, - _logf:console.log, + _logi = console.log + _logf = console.log - bootstrap: (_instance: loader.ASInstance):void => { + bootstrap(_instance: loader.ASInstance):void { instance = _instance; } } diff --git a/lib/host/tests/index.ts b/lib/host/tests/index.ts index b8d9612840..724a45a8be 100644 --- a/lib/host/tests/index.ts +++ b/lib/host/tests/index.ts @@ -1,10 +1,10 @@ -import {host} from "../src"; +import {Host} from "../src"; import * as loader from "../../loader"; import * as fs from "fs"; import ASModule from "./build"; import * as asc from "../../../cli/asc" type testMod = typeof ASModule; - +let host = new Host(); var wasm = fs.readFileSync(`${__dirname}/build/untouched.wasm`); var instance = loader.instantiateBuffer(wasm.buffer, {host}); host.bootstrap(instance) From a6c348187996f3cbc2085d5fed49e5e737c7108b Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Fri, 25 Jan 2019 12:10:08 -0500 Subject: [PATCH 17/46] Added pre and post hook for loader import objects now can have hocks for setting up the host --- lib/host/assembly/host.ts | 1 - lib/host/lib/index.d.ts | 27 ++++++------ lib/host/lib/index.js | 85 ++++++++++++++++++++++---------------- lib/host/package-lock.json | 20 +++++++++ lib/host/src/index.ts | 80 ++++++++++++++++++++--------------- lib/host/tests/index.ts | 9 ++-- lib/host/tsconfig.json | 2 +- lib/loader/src/index.ts | 28 +++++++++++-- 8 files changed, 160 insertions(+), 92 deletions(-) create mode 100644 lib/host/package-lock.json diff --git a/lib/host/assembly/host.ts b/lib/host/assembly/host.ts index 4f4052dd07..a43b8f32dd 100644 --- a/lib/host/assembly/host.ts +++ b/lib/host/assembly/host.ts @@ -1,5 +1,4 @@ - export declare function _log(x: T, size: usize): void; export declare function _log_str(x: string): void; export declare function _logi(x: i32): void; diff --git a/lib/host/lib/index.d.ts b/lib/host/lib/index.d.ts index f0236cbc1e..a2e65f9a43 100644 --- a/lib/host/lib/index.d.ts +++ b/lib/host/lib/index.d.ts @@ -1,15 +1,16 @@ import * as loader from "../../loader"; -export declare let host: { - debug: () => void; - _log: (start: number, sizeof: number) => void; - _log_str: (x: number) => void; - _logi: { - (message?: any, ...optionalParams: any[]): void; - (message?: any, ...optionalParams: any[]): void; +export declare class Host { + instance: loader.ASInstance; + getImports(): { + host: { + debug(): void; + _log(start: number, sizeof: number): void; + _log_str(x: number): void; + _logi(x: number): void; + _logf(x: number): void; + }; + post: postFunc[]; }; - _logf: { - (message?: any, ...optionalParams: any[]): void; - (message?: any, ...optionalParams: any[]): void; - }; - bootstrap: (_instance: loader.ASInstance) => void; -}; +} +declare type postFunc = (instance: loader.ASInstance & T) => loader.ASInstance & T; +export {}; diff --git a/lib/host/lib/index.js b/lib/host/lib/index.js index 265ebea3cf..1f372b77a2 100644 --- a/lib/host/lib/index.js +++ b/lib/host/lib/index.js @@ -1,39 +1,54 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); //tslint:disable -let instance; -exports.host = { - debug: () => { - // tslint:disable-next-line - debugger; - }, - _log: (start, sizeof) => { - let begin = start >> 2; - let size = sizeof >> 2; - if (size == 1) { - console.log(start); - } - else { - let str = []; - let len = 0; - for (let i = begin; i < begin + size; i++) { - let line = `| ${i} | ${instance.memory.I32[i] >> 2}`; - len = Math.max(len, line.length); - str.push(line); - } - let space = " "; - let output = str.map((v, i, a) => v + space.repeat(len - v.length + 1) + "|"); - let dash = "-"; - let line = dash.repeat(len + 2); - console.log([line, output.join('\n' + line + '\n'), line].join("\n")); - } - }, - _log_str: (x) => { - return console.log(instance.memory.getString(x)); - }, - _logi: console.log, - _logf: console.log, - bootstrap: (_instance) => { - instance = _instance; +var instance; +class Host { + constructor() { + this.instance = instance; } -}; + getImports() { + var _this = this; + return { + host: { + debug() { + // tslint:disable-next-line + debugger; + }, + _log(start, sizeof) { + let begin = start >> 2; + let size = sizeof >> 2; + if (size == 1) { + console.log(start); + } + else { + let str = []; + let len = 0; + for (let i = begin; i < begin + size; i++) { + let line = `| ${i} | ${_this.instance.memory.I32[i] >> 2}`; + len = Math.max(len, line.length); + str.push(line); + } + let space = " "; + let output = str.map((v, i, a) => v + space.repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = dash.repeat(len + 2); + console.log([line, output.join('\n' + line + '\n'), line].join("\n")); + } + }, + _log_str(x) { + return console.log(_this.instance.memory.getString(x)); + }, + _logi(x) { console.log(x); }, + _logf(x) { console.log(x); }, + }, + post: [bootstrap(_this)] + }; + } +} +exports.Host = Host; +function bootstrap(h) { + return (_instance) => { + h.instance = _instance; + return _instance; + }; +} diff --git a/lib/host/package-lock.json b/lib/host/package-lock.json new file mode 100644 index 0000000000..647716f2fb --- /dev/null +++ b/lib/host/package-lock.json @@ -0,0 +1,20 @@ +{ + "name": "@assemblyscript/host", + "version": "2.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/webassembly-js-api": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@types/webassembly-js-api/-/webassembly-js-api-0.0.1.tgz", + "integrity": "sha1-YtULIBB319TMEJuxytoi/f1FI/s=", + "dev": true + }, + "typescript": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", + "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", + "dev": true + } + } +} diff --git a/lib/host/src/index.ts b/lib/host/src/index.ts index 67f60c4474..ce5d9f800f 100644 --- a/lib/host/src/index.ts +++ b/lib/host/src/index.ts @@ -1,43 +1,55 @@ import * as loader from "../../loader"; //tslint:disable -let instance: loader.ASInstance +var instance: loader.ASInstance; +export class Host { + instance: loader.ASInstance = instance; -export class Host{ - debug (): void { - // tslint:disable-next-line - debugger; - } + getImports(){ + var _this = this; + return { + host: { + debug (): void { + // tslint:disable-next-line + debugger; + }, + _log(start: number, sizeof: number): void { + let begin = start >> 2; + let size = sizeof >> 2; + if (size == 1 ){ + console.log(start); + } else { + let str = [] + let len = 0; + for (let i = begin; i < begin+size; i++){ + let line = `| ${i} | ${_this.instance.memory.I32[i]>>2}`; + len = Math.max(len, line.length); + str.push(line); + } + let space = " "; + let output = str.map((v: any,i:number,a: any[]):string => v + (space as any).repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = (dash as any).repeat(len+2); + console.log([line,output.join('\n'+line+'\n'),line].join("\n")); + } + }, - _log(start: number, sizeof: number): void { - let begin = start >> 2; - let size = sizeof >> 2; - if (size == 1 ){ - console.log(start); - } else { - let str = [] - let len = 0; - for (let i = begin; i < begin+size; i++){ - let line = `| ${i} | ${instance.memory.I32[i]>>2}`; - len = Math.max(len, line.length); - str.push(line); - } - let space = " "; - let output = str.map((v: any,i:number,a: any[]):string => v + (space as any).repeat(len - v.length + 1) + "|"); - let dash = "-"; - let line = (dash as any).repeat(len+2); - console.log([line,output.join('\n'+line+'\n'),line].join("\n")); - } + _log_str(x: number): void { + return console.log(_this.instance.memory.getString(x)) + }, + _logi(x: number): void {console.log(x)}, + _logf(x:number):void { console.log(x)}, + }, + post:[bootstrap(_this)] } +} +} - _log_str(x: number): void { - return console.log(instance.memory.getString(x)) - } - - _logi = console.log - _logf = console.log +type postFunc = (instance:loader.ASInstance & T) => loader.ASInstance & T; - bootstrap(_instance: loader.ASInstance):void { - instance = _instance; - } +function bootstrap(h: Host): postFunc { + return (_instance: loader.ASInstance & T)=> { + h.instance = _instance + return _instance + } } diff --git a/lib/host/tests/index.ts b/lib/host/tests/index.ts index 724a45a8be..1533f58149 100644 --- a/lib/host/tests/index.ts +++ b/lib/host/tests/index.ts @@ -1,11 +1,12 @@ import {Host} from "../src"; -import * as loader from "../../loader"; +import * as loader from "../../loader/src"; import * as fs from "fs"; import ASModule from "./build"; import * as asc from "../../../cli/asc" type testMod = typeof ASModule; -let host = new Host(); + + var wasm = fs.readFileSync(`${__dirname}/build/untouched.wasm`); -var instance = loader.instantiateBuffer(wasm.buffer, {host}); -host.bootstrap(instance) +let imports = (new Host()).getImports(); +var instance = loader.instantiateBuffer(wasm.buffer, imports); instance.runTest(); diff --git a/lib/host/tsconfig.json b/lib/host/tsconfig.json index aed0539363..d94961912a 100644 --- a/lib/host/tsconfig.json +++ b/lib/host/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "declaration": true, - "lib": ["dom", "es2015", "es2017.typedarrays"], + "lib": ["dom", "es2015", "esnext.bigint", "es2017.typedarrays"], "module": "commonjs", "moduleResolution": "node", "outDir": "lib", diff --git a/lib/loader/src/index.ts b/lib/loader/src/index.ts index 49ed0c3698..e8368f8dcd 100644 --- a/lib/loader/src/index.ts +++ b/lib/loader/src/index.ts @@ -526,16 +526,36 @@ function resolveContext(instance: WebAssembly.Instance, ctx: Insta }; } +type idFunc = (t: T) => T + +type postResolve = idFunc; +type preResolve = idFunc; +type postArr = Array>; + + + /** Instantiates an AssemblyScript module using the specified imports. */ -export function instantiate(module: WebAssembly.Module, imports: any = {}): ASInstance & T { +export function instantiate(module: WebAssembly.Module, imports: {post?: postArr} = {}): ASInstance & T { const ctx = createContext(imports); const instance = new WebAssembly.Instance(module, ctx.imports); - return resolveContext(instance, ctx); + var res = resolveContext(instance, ctx); + if (imports.post){ + imports.post.map((fn)=>{ + res = fn(res); + }) + } + return res; } /** Instantiates an AssemblyScript module from a buffer using the specified imports. */ -export function instantiateBuffer(buffer: any, imports: any = {}): ASInstance & T { - return instantiate(new WebAssembly.Module(buffer), imports); +export function instantiateBuffer(buffer: any, imports: {pre?:Array, post?:postArr} = {}): ASInstance & T { + var _buffer = buffer; + if (imports.pre){ + imports.pre.map((fn)=>{ + _buffer = fn(_buffer); + }) + } + return instantiate(new WebAssembly.Module(_buffer), imports); } /** Instantiates an AssemblyScript module from a response using the specified imports. */ From 2c7b600a07e8b0d40a9e9d271c2dd1852b5fa680 Mon Sep 17 00:00:00 2001 From: Johan Nordberg Date: Sun, 27 Jan 2019 10:28:58 +0900 Subject: [PATCH 18/46] Add myself to NOTICE --- NOTICE | 1 + 1 file changed, 1 insertion(+) diff --git a/NOTICE b/NOTICE index cf9d101463..c411513551 100644 --- a/NOTICE +++ b/NOTICE @@ -11,6 +11,7 @@ under the licensing terms detailed in LICENSE: * Palmer * Linus Unnebäck * Joshua Tenner +* Johan Nordberg Portions of this software are derived from third-party works licensed under the following terms: From 233d05d399b7d754af14498b4386ddf7178491cd Mon Sep 17 00:00:00 2001 From: Johan Nordberg Date: Sat, 2 Feb 2019 12:36:04 +0100 Subject: [PATCH 19/46] Add built loader to dist/ --- dist/loader.d.ts | 74 +++++++ dist/loader.js | 437 ++++++++++++++++++++++++++++++++++++++++ lib/loader/package.json | 1 + 3 files changed, 512 insertions(+) create mode 100644 dist/loader.d.ts create mode 100644 dist/loader.js diff --git a/dist/loader.d.ts b/dist/loader.d.ts new file mode 100644 index 0000000000..f4622fffb7 --- /dev/null +++ b/dist/loader.d.ts @@ -0,0 +1,74 @@ +/** AssemblyScript module loader. */ +/// +export declare type TypedArray = Int8Array | Uint8Array | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array; +export declare type TypedArrayConstructor = Int8ArrayConstructor | Uint8ArrayConstructor | Int16ArrayConstructor | Uint16ArrayConstructor | Int32ArrayConstructor | Uint32ArrayConstructor | Float32ArrayConstructor | Float32ArrayConstructor; +export interface ASExport { + [key: string]: any; +} +export interface ASInstance extends WebAssembly.Instance { + readonly memory: ASMemory; + readonly table: ASTable; +} +export interface ASTable extends WebAssembly.Table { + /** Gets a function by its pointer. */ + getFunction(ptr: number): (...args: any[]) => R; + /** + * Creates a new function in the module's table and returns its pointer. Note that only actual + * WebAssembly functions, i.e. as exported by the module, are supported. + */ + newFunction(fn: (...args: any[]) => any): number; +} +export interface ASMemory extends WebAssembly.Memory { + /** An 8-bit signed integer view on the memory. */ + readonly I8: Int8Array; + /** An 8-bit unsigned integer view on the memory. */ + readonly U8: Uint8Array; + /** A 16-bit signed integer view on the memory. */ + readonly I16: Int16Array; + /** A 16-bit unsigned integer view on the memory. */ + readonly U16: Uint16Array; + /** A 32-bit signed integer view on the memory. */ + readonly I32: Int32Array; + /** A 32-bit unsigned integer view on the memory. */ + readonly U32: Uint32Array; + /** A 64-bit signed integer view on the memory. */ + readonly I64?: BigInt64Array; + /** A 64-bit unsigned integer vieww on the memory. */ + readonly U64?: BigUint64Array; + /** A 32-bit float view on the memory. */ + readonly F32: Float32Array; + /** A 64-bit float view on the memory. */ + readonly F64: Float64Array; + /** Allocates a new string in the module's memory and returns its pointer. */ + newString(str: string): number; + /** Gets a string from the module's memory by its pointer. Alias for memory.getString. */ + getString(ptr: number): string; + /** Copies a typed array into the module's memory and returns its pointer. */ + newArray(view: TypedArray, length?: number): number; + /** Creates a typed array in the module's memory and returns its pointer. */ + newArray(ctor: TypedArrayConstructor, length: number, unsafe?: boolean): number; + /** Gets a view on a typed array in the module's memory by its pointer. Alias for memory.getArray. */ + getArray(ctor: TypedArrayConstructor, ptr: number): T; + /** Frees a typed array in the module's memory. Must not be accessed anymore afterwards. */ + freeArray(ptr: number): void; + allocate(size: number): number; + compare(vl: number, vr: number, n: number): number; + copy(dest: number, src: number, n: number): void; + fill(ptr: number, value: number, size: number): void; + free(ptr: number): void; + reset(): void; +} +export declare namespace utils { + const hasBigInt64: boolean; + function readString(U32: Uint32Array, U16: Uint16Array, ptr: number): string; + function computeBufferSize(byteLength: number): number; + function hasOwnProperty(obj: any, key: any): boolean; +} +/** Instantiates an AssemblyScript module using the specified imports. */ +export declare function instantiate(module: WebAssembly.Module, imports?: any): ASInstance & T; +/** Instantiates an AssemblyScript module from a buffer using the specified imports. */ +export declare function instantiateBuffer(buffer: any, imports?: any): ASInstance & T; +/** Creates a wrapped memory instance. */ +export declare function createMemory(descriptor: WebAssembly.MemoryDescriptor): ASMemory; +/** Demangles an AssemblyScript module's exports to a friendly object structure. */ +export declare function demangle(instance: WebAssembly.Instance): ASInstance & ASExport; diff --git a/dist/loader.js b/dist/loader.js new file mode 100644 index 0000000000..6e0e4c1d04 --- /dev/null +++ b/dist/loader.js @@ -0,0 +1,437 @@ +"use strict"; +/** AssemblyScript module loader. */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const ORIG_REF = Symbol('original'); +const SELF_REF = Symbol('self'); +var utils; +(function (utils) { + utils.hasBigInt64 = typeof BigUint64Array !== 'undefined'; + function readString(U32, U16, ptr) { + const chunkSize = 1024; + const dataLength = U32[ptr >>> 2]; + let dataOffset = (ptr + 4) >>> 1; + let dataRemain = dataLength; + const parts = []; + while (dataRemain > chunkSize) { + const last = U16[dataOffset + chunkSize - 1]; + const size = last >= 0xD800 && last < 0xDC00 ? chunkSize - 1 : chunkSize; + const part = U16.subarray(dataOffset, dataOffset += size); + parts.push(String.fromCharCode.apply(String, part)); + dataRemain -= size; + } + const lastPart = U16.subarray(dataOffset, dataOffset + dataRemain); + parts.push(String.fromCharCode.apply(String, lastPart)); + return parts.join(''); + } + utils.readString = readString; + function computeBufferSize(byteLength) { + const HEADER_SIZE = 8; + return 1 << (32 - Math.clz32(byteLength + HEADER_SIZE - 1)); + } + utils.computeBufferSize = computeBufferSize; + function hasOwnProperty(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); + } + utils.hasOwnProperty = hasOwnProperty; +})(utils = exports.utils || (exports.utils = {})); +class MemoryWrapper { + static resolve(value) { + if (value instanceof MemoryWrapper) { + return value; + } + else { + return new MemoryWrapper(value); + } + } + constructor(memory) { + this.raw = memory; + } + // ASMemory conformance + newString(str) { + const dataLength = str.length; + const ptr = this.allocate(4 + (dataLength << 1)); + const dataOffset = (4 + ptr) >>> 1; + const U32 = this.U32, U16 = this.U16; + U32[ptr >>> 2] = dataLength; + for (let i = 0; i < dataLength; ++i) { + U16[dataOffset + i] = str.charCodeAt(i); + } + return ptr; + } + getString(ptr) { + return utils.readString(this.U32, this.U16, ptr); + } + newArray(viewOrCtor, length, unsafe) { + let ctor; + let view; + if (viewOrCtor.constructor === Function) { // TypedArray constructor created in memory + ctor = viewOrCtor; + view = null; + } + else { // TypedArray instance copied into memory + ctor = viewOrCtor.constructor; + view = viewOrCtor; + if (length === undefined) { + length = viewOrCtor.length; + } + } + if (length === undefined) { + throw new Error('Length missing'); + } + const elementSize = ctor.BYTES_PER_ELEMENT; + if (!elementSize) { + throw Error('Not a typed array'); + } + const byteLength = elementSize * length; + const ptr = this.allocate(12); // TypedArray header + const buf = this.allocate(utils.computeBufferSize(byteLength)); // ArrayBuffer + const U32 = this.U32; + U32[ptr >>> 2] = buf; // .buffer + U32[(ptr + 4) >>> 2] = 0; // .byteOffset + U32[(ptr + 8) >>> 2] = byteLength; // .byteLength + U32[buf >>> 2] = byteLength; // .byteLength + U32[(buf + 4) >>> 2] = 0; // 0 + if (view) { + new ctor(this.buffer, buf + 8, length).set(view); + if (view.length < length && !unsafe) { + const setLength = elementSize * view.length; + this.fill(buf + 8 + setLength, 0, byteLength - setLength); + } + } + else if (!unsafe) { + this.fill(buf + 8, 0, byteLength); + } + return ptr; + } + getArray(ctor, ptr) { + const elementSize = ctor.BYTES_PER_ELEMENT; + if (!elementSize) { + throw Error('Not a typed array'); + } + const U32 = this.U32; + const buf = U32[ptr >>> 2]; + const byteOffset = U32[(ptr + 4) >>> 2]; + const byteLength = U32[(ptr + 8) >>> 2]; + return new ctor(this.buffer, buf + 8 + byteOffset, (byteLength - byteOffset) / elementSize); + } + freeArray(ptr) { + const buf = this.U32[ptr >>> 2]; + this.free(buf); + this.free(ptr); + } + get U8() { + if (!this._U8 || this._U8.buffer !== this.raw.buffer) { + this._U8 = new Uint8Array(this.raw.buffer); + } + return this._U8; + } + get U16() { + if (!this._U16 || this._U16.buffer !== this.raw.buffer) { + this._U16 = new Uint16Array(this.raw.buffer); + } + return this._U16; + } + get U32() { + if (!this._U32 || this._U32.buffer !== this.raw.buffer) { + this._U32 = new Uint32Array(this.raw.buffer); + } + return this._U32; + } + get U64() { + if (!utils.hasBigInt64) { + return; + } + if (!this._U64 || this._U64.buffer !== this.raw.buffer) { + this._U64 = new BigUint64Array(this.raw.buffer); + } + return this._U64; + } + get I8() { + if (!this._I8 || this._I8.buffer !== this.raw.buffer) { + this._I8 = new Int8Array(this.raw.buffer); + } + return this._I8; + } + get I16() { + if (!this._I16 || this._I16.buffer !== this.raw.buffer) { + this._I16 = new Int16Array(this.raw.buffer); + } + return this._I16; + } + get I32() { + if (!this._I32 || this._I32.buffer !== this.raw.buffer) { + this._I32 = new Int32Array(this.raw.buffer); + } + return this._I32; + } + get I64() { + if (!utils.hasBigInt64) { + return; + } + if (!this._I64 || this._I64.buffer !== this.raw.buffer) { + this._I64 = new BigInt64Array(this.raw.buffer); + } + return this._I64; + } + get F32() { + if (!this._F32 || this._F32.buffer !== this.raw.buffer) { + this._F32 = new Float32Array(this.raw.buffer); + } + return this._F32; + } + get F64() { + if (!this._F64 || this._F64.buffer !== this.raw.buffer) { + this._F64 = new Float64Array(this.raw.buffer); + } + return this._F64; + } + allocate(size) { + throw new Error('Memory not initialized'); + } + compare(vl, vr, n) { + throw new Error('Memory not initialized'); + } + copy(dest, src, n) { + throw new Error('Memory not initialized'); + } + fill(ptr, value, size) { + throw new Error('Memory not initialized'); + } + free(ptr) { + throw new Error('Memory not initialized'); + } + reset() { + throw new Error('Memory not initialized'); + } + // WebAssembly.Memory conformance + grow(numPages) { + return this.raw.grow(numPages); + } + get buffer() { + return this.raw.buffer; + } + // Internal methods + setExports(rawExports) { + const methods = ['allocate', 'compare', 'copy', 'fill', 'free', 'reset']; + for (const method of methods) { + const exportedMethod = `memory.${method}`; + if (rawExports[exportedMethod]) { + this[method] = rawExports[exportedMethod]; + } + else { + this[method] = () => { throw new Error('Method not exported'); }; + } + } + } +} +class TableWrapper { + constructor(table) { + this.raw = table; + } + // ASTable conformance + getFunction(ptr) { + return this.wrapFunction(this.get(ptr)); + } + newFunction(fn) { + if (typeof fn[ORIG_REF] === 'function') { + fn = fn[ORIG_REF]; + } + const index = this.length; + this.grow(1); + this.set(index, fn); + return index; + } + // WebAssembly.Table conformance + grow(numElements) { + return this.raw.grow(numElements); + } + set(index, value) { + return this.raw.set(index, value); + } + get(index) { + return this.raw.get(index); + } + get length() { + return this.raw.length; + } + // Internal methods + setargc(n) { } + /** Wraps a WebAssembly function while also taking care of variable arguments. */ + wrapFunction(fn) { + const wrap = (...args) => { + this.setargc(args.length); + return fn(...args); + }; + // adding a function to the table with `newFunction` is limited to actual WebAssembly functions, + // hence we can't use the wrapper and instead need to provide a reference to the original + wrap[ORIG_REF] = fn; + return wrap; + } + setExports(rawExports) { + if (rawExports._setargc) { + this.setargc = rawExports._setargc; + } + } +} +function createContext(imports = {}) { + const ctx = { + imports, + memory: imports.memory ? MemoryWrapper.resolve(imports.memory) : null, + }; + const env = (imports.env = imports.env || {}); + const getString = (ptr) => ctx.memory ? ctx.memory.getString(ptr) : ''; + if (!env.abort) { + env.abort = function abort(mesg, file, line, colm) { + throw Error(`Abort: ${getString(mesg)} at ${getString(file)}: ${line}:${colm}`); + }; + } + if (!env.trace) { + env.trace = function trace(mesg, n, ...args) { + let msg = `trace: ${getString(mesg)}`; + if (n) { + msg += ` ${args.slice(0, n).join(', ')}`; + } + console.log(msg); + }; + } + if (env.memory instanceof MemoryWrapper) { + env.memory = env.memory.raw; + } + return ctx; +} +function resolveContext(instance, ctx) { + const table = new TableWrapper(instance.exports.table); + table.setExports(instance.exports); + ctx.memory = MemoryWrapper.resolve(instance.exports.memory); + ctx.memory.setExports(instance.exports); + const resolved = {}; + for (const internalName in instance.exports) { + if (!utils.hasOwnProperty(instance.exports, internalName)) { + continue; + } + // resolve nested objects + const parts = internalName.split('.'); + let name = parts[0]; + // ignore internals + if (name === 'memory' || name === 'table' || name === '_setargc') { + continue; + } + let curr = resolved; + while (parts.length > 1) { + const part = parts.shift(); + if (!utils.hasOwnProperty(curr, part)) { + curr[part] = {}; + } + curr = curr[part]; + } + const elem = instance.exports[internalName]; + const hash = name.indexOf('#'); + if (hash >= 0) { + // resolve classes + const className = name.substring(0, hash); + const classElem = curr[className]; + if (typeof classElem === 'undefined' || !classElem.prototype) { + const ctor = function (...args) { + return ctor.wrap(ctor.prototype.constructor(0, ...args)); + }; + ctor.prototype = {}; + ctor.wrap = function (thisValue) { + return Object.create(ctor.prototype, { + [SELF_REF]: { value: thisValue, writable: false }, + }); + }; + if (classElem) { + Object.getOwnPropertyNames(classElem).forEach((propName) => { + Object.defineProperty(ctor, propName, Object.getOwnPropertyDescriptor(classElem, propName)); + }); + } + curr[className] = ctor; + } + name = name.substring(hash + 1); + curr = curr[className].prototype; + if (/^(get|set):/.test(name)) { + name = name.substring(4); + if (!utils.hasOwnProperty(curr, name)) { + const getter = instance.exports[internalName.replace('set:', 'get:')]; + const setter = instance.exports[internalName.replace('get:', 'set:')]; + Object.defineProperty(curr, name, { + get() { return getter(this[SELF_REF]); }, + set(value) { setter(this[SELF_REF], value); }, + enumerable: true, + }); + } + } + else { + if (name === 'constructor') { + curr[name] = table.wrapFunction(elem); + } + else { // for methods + Object.defineProperty(curr, name, { + value(...args) { + table.setargc(args.length); + return elem(this[SELF_REF], ...args); + }, + }); + } + } + } + else { + // resolve props + if (/^(get|set):/.test(name)) { + name = name.substring(4); + if (!utils.hasOwnProperty(curr, name)) { + Object.defineProperty(curr, name, { + get: instance.exports[internalName.replace('set:', 'get:')], + set: instance.exports[internalName.replace('get:', 'set:')], + enumerable: true, + }); + } + } + else if (typeof elem === 'function') { + curr[name] = table.wrapFunction(elem); + } + else { + curr[name] = elem; + } + } + } + return Object.assign({ memory: ctx.memory, table }, resolved); +} +/** Instantiates an AssemblyScript module using the specified imports. */ +function instantiate(module, imports = {}) { + const ctx = createContext(imports); + const instance = new WebAssembly.Instance(module, ctx.imports); + return resolveContext(instance, ctx); +} +exports.instantiate = instantiate; +/** Instantiates an AssemblyScript module from a buffer using the specified imports. */ +function instantiateBuffer(buffer, imports = {}) { + return instantiate(new WebAssembly.Module(buffer), imports); +} +exports.instantiateBuffer = instantiateBuffer; +/** Instantiates an AssemblyScript module from a response using the specified imports. */ +function instantiateStreaming(response, imports = {}) { + return __awaiter(this, void 0, void 0, function* () { + const ctx = createContext(imports); + const { instance } = yield WebAssembly.instantiateStreaming(response, ctx.imports); + return resolveContext(instance, ctx); + }); +} +/** Creates a wrapped memory instance. */ +function createMemory(descriptor) { + return new MemoryWrapper(new WebAssembly.Memory(descriptor)); +} +exports.createMemory = createMemory; +/** Demangles an AssemblyScript module's exports to a friendly object structure. */ +function demangle(instance) { + return resolveContext(instance, createContext()); +} +exports.demangle = demangle; diff --git a/lib/loader/package.json b/lib/loader/package.json index a012749de1..af6ee58286 100644 --- a/lib/loader/package.json +++ b/lib/loader/package.json @@ -7,6 +7,7 @@ "scripts": { "build": "tsc", "prepublishOnly": "tsc", + "dist": "tsc && cp lib/index.js ../../dist/loader.js && cp lib/index.d.ts ../../dist/loader.d.ts", "test:build": "asc tests/assembly/index.ts -b tests/build/untouched.wasm", "test": "node tests" }, From 5e2196d263648a92221cb93004a13522a6370fc5 Mon Sep 17 00:00:00 2001 From: Johan Nordberg Date: Sat, 2 Feb 2019 12:39:52 +0100 Subject: [PATCH 20/46] Rename loader to assemblyscript-loader in dist --- dist/{loader.d.ts => assemblyscript-loader.d.ts} | 0 dist/{loader.js => assemblyscript-loader.js} | 0 lib/loader/package.json | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) rename dist/{loader.d.ts => assemblyscript-loader.d.ts} (100%) rename dist/{loader.js => assemblyscript-loader.js} (100%) diff --git a/dist/loader.d.ts b/dist/assemblyscript-loader.d.ts similarity index 100% rename from dist/loader.d.ts rename to dist/assemblyscript-loader.d.ts diff --git a/dist/loader.js b/dist/assemblyscript-loader.js similarity index 100% rename from dist/loader.js rename to dist/assemblyscript-loader.js diff --git a/lib/loader/package.json b/lib/loader/package.json index af6ee58286..9dbdf87eaa 100644 --- a/lib/loader/package.json +++ b/lib/loader/package.json @@ -7,7 +7,7 @@ "scripts": { "build": "tsc", "prepublishOnly": "tsc", - "dist": "tsc && cp lib/index.js ../../dist/loader.js && cp lib/index.d.ts ../../dist/loader.d.ts", + "dist": "tsc && cp lib/index.js ../../dist/assemblyscript-loader.js && cp lib/index.d.ts ../../dist/assemblyscript-loader.d.ts", "test:build": "asc tests/assembly/index.ts -b tests/build/untouched.wasm", "test": "node tests" }, From 5e6fc610b738d3e36bf56f3e2abb94ccac77c7b3 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Sun, 3 Feb 2019 10:21:27 -0500 Subject: [PATCH 21/46] Cleaning up Parser --- lib/parse/assembly/index.ts | 193 +- lib/parse/assembly/module/index.ts | 32 +- lib/parse/build/index.d.ts | 33 + lib/parse/build/index.wat | 10578 +++++++-------------------- lib/parse/package.json | 2 +- lib/parse/src/index.ts | 175 +- lib/parse/tests/index.ts | 107 +- 7 files changed, 2908 insertions(+), 8212 deletions(-) create mode 100644 lib/parse/build/index.d.ts diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index f2b3307bfd..d56bf4679d 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -1,19 +1,192 @@ +/** A WebAssembly module that parses WebAssembly modules. */ -export function newParser(buf: Uint8Array): Parser { - let buffer = new Buffer(buf); - return new Parser(buffer); +// Common constants shared between AssemblyScript and TypeScript +import { + Type, + SectionId, + ExternalKind, + NameType, + MAX_PAGES, + MAX_ELEMS, + Opcode +} from "../src/common"; + +export {memory} +import {Buffer} from './buffer'; +import {SectionHeader, + TypeSection, + Module} from './module'; +import {log} from './host'; + +declare function debug():void; + +log("in the start function!"); +// type FunctionName = string | symbol; +// type Instance = [Function, Object]; +// +// let instance: Object; +// let methods: Map = new Map(); + +// function registerClass(name:string): any { +// type Ctor = new (...args: any[]) => T; +// return (target: T): Ctor => { +// // Save a reference to the original constructor +// const Original = target; +// let self:T = this; +// debugger; +// // the new constructor behaviour +// let decoratedConstructor: any = function(...args: any[]): void { +// // log("Before construction:"); +// // +// Original.apply(this, args); +// instance = this; +// // console.log("After construction: ", self.instance !== undefined); +// }; +// +// // Copy prototype so intanceof operator still works +// decoratedConstructor.prototype = Original.prototype; +// // Copy static members too +// Object.keys(Original).forEach((name: string) => +// { decoratedConstructor[name] = (Original)[name]; }); +// +// // Return new constructor (will override original) +// return decoratedConstructor; +// }; +// +// } + +let type: TypeSection; + +export function getType(m: Module): string { + let headers:SectionHeader[] = m.getID(SectionId.Type); + let section = new TypeSection(headers[0]); + type = section.parse(m.buf); + return type.toString(); } -export function parse(p: Parser): Module { - p.parse(); - return p.module; + +export function getImports(m: Module): void { + let imports = m.getImports(); + // log(imports.length); + if (imports.length>0) + for (let i = 0; i< imports.length; i++){ + + // log(imports.length); + log(imports.length); + + // log(imports.length); + // for (let j = 0; i< imports[i].imports.length; j++){ + // let _import = imports[i].imports[j]; + // log(_import.toString()) + // } + } + // return +} + +export function removeStartFunction (m: Module): Uint8Array { + if (m.hasStart) { + let start : SectionHeader = m.getID(SectionId.Start)[0]; + log(start.toString()); + let len = start.end - start.ref; + log(len); + let buf = new Uint8Array(m.buf.length - len); + log(start.offset) + + for (let i:u32 = 0; i < start.offset; i++) { + buf[i] = m.buf.buffer[i]; + } + log("checking end index"); + log(m.buf.end); + log(m.buf.buffer); + log(m.buf.buffer[m.buf.length - 1]); + log(start.offset + len) + for (let i:u32 = start.offset + len; i < m.buf.length; i++) { + if ( i> m.buf.length - 8000) log(i); + buf[i-len] = m.buf.buffer[i]; + } + // memory.copy(buf.buffer.byteLength, m.buf.buffer.byteOffset, start.ref); + // memory.copy(buf.buffer.byteLength+start.end, m.buf.buffer.byteLength + start.end, m.buf.buffer.byteLength - start.end); + return buf; + } else { + return m.buf.buffer; + } + +} + +// export function exportDataSection(m: Module): Uint8Array { +// +// } + +export function toString(t:TypeSection): string { + return t.toString(); +} + +export class Parser { + buf: Buffer; + module: Module; + constructor(buf: Buffer){ + this.buf = buf; + this.module = new Module(buf); + } + + parseString(): String { + return String.fromUTF8(this.buf.off,this.buf.readVaruint(32)); + } + + readVaruint(len: usize): u32 { + return this.buf.readVaruint(len); + } + + get off(): usize { + return this.buf.off; + } + + set off(u: usize) { + this.buf.off = u; + } + +/** Starts parsing the module that has been placed in memory. */ + parse(): void { + log(this.buf.off) + log(this.buf.buffer.buffer.data) + log(this.buf.length) + let start = this.off; + log("starting") + var magic = this.buf.readUint(); + log(magic); + if (magic != 0x6D736100) unreachable(); + var version = this.buf.readUint(); + log(version); + if (version != 1) unreachable(); + log("Magic is valid"); + var fun_space_index: u32 = 0; + var glo_space_index: u32 = 0; + var mem_space_index: u32 = 0; + var tbl_space_index: u32 = 0; + while (this.buf.off < this.buf.end) { + // log("parsing next section", true); + let header: SectionHeader = new SectionHeader(this.buf); + log(header.toString()); + this.module.parseSection(header); + log("---------") + log(this.off); + log(header.ref - start); + log(header.offset); + log(header.end - start); + log("---------"); + this.off = header.end; + // log(this.off); + } + // log(this.buf.length); + // if (this.off != this.buf.length) unreachable(); + } + } -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. export function newParser(buf: Uint8Array): Parser { + log(buf); let buffer = new Buffer(buf); + log(buffer); + log(buffer.off) return new Parser(buffer); } export function parse(p: Parser): Module { diff --git a/lib/parse/assembly/module/index.ts b/lib/parse/assembly/module/index.ts index f2c96b7d71..d2477fc597 100644 --- a/lib/parse/assembly/module/index.ts +++ b/lib/parse/assembly/module/index.ts @@ -28,7 +28,6 @@ export class Module { this.headers = []; } - get Type(): SectionHeader[]{ return this.getID(SectionId.Type); } @@ -53,21 +52,11 @@ export class Module { } public getID(id: SectionId): SectionHeader[] { -<<<<<<< loader-memory-accessors let res: SectionHeader[] = new Array(); - while(res.length > 0){ - res.pop(); - } + assert(res.length == 0); let x: i32 = this.headers.length; // log("length of array should be zero"); // log(res.length) -======= - let res: SectionHeader[] = []; - while(res.length > 0){ - res.pop(); - } - let x: i32 = this.Headers.length; ->>>>>>> Working on sections. for (let i=0; i < x; i++){ if (this.headers[i].id == id){ res.push(this.headers[i]); @@ -85,20 +74,12 @@ export class Module { getImports(): Imports[] { let ImportHeaders = this.getID(SectionId.Import); let imports: Imports[] = []; -<<<<<<< loader-memory-accessors - for (let i = 0; i < ImportHeaders.length; i++){ - // log(ImportHeaders[i].name) - let _import = new Imports(ImportHeaders[i]); - imports.push(_import.parse(this.buf)); - // log(_import.imports.length); -======= log(imports.length); for (let i = 0; i < ImportHeaders.length; i++){ // log(ImportHeaders[i].name) let _import = new Imports(ImportHeaders[i]); imports.push(_import.parse(this.buf)); log(_import.imports.length); ->>>>>>> Working on sections. } return imports; } @@ -354,15 +335,10 @@ class Memory{ } } -<<<<<<< loader-memory-accessors + class MemorySection extends Section { memory: Memory[]; -======= -class MemorySection { - memory: Memory[]; - ->>>>>>> Working on sections. parse(buf: Buffer): MemorySection { let count = buf.readVaruint(32); this.memory = new Array(count); @@ -378,13 +354,11 @@ class MemorySection { return this } } -<<<<<<< loader-memory-accessors class Data extends Section { } -======= ->>>>>>> Working on sections. + /* case SectionId.Global: { let count = buf.readVaruint(32); diff --git a/lib/parse/build/index.d.ts b/lib/parse/build/index.d.ts new file mode 100644 index 0000000000..92514c6430 --- /dev/null +++ b/lib/parse/build/index.d.ts @@ -0,0 +1,33 @@ +declare module ASModule { + type i8 = number; + type i16 = number; + type i32 = number; + type u8 = number; + type u16 = number; + type u32 = number; + type f32 = number; + type f64 = number; + type bool = any; + function getType(m: u32): u32; + function toString(t: u32): u32; + class Parser { + constructor(buf: u32); + buf: u32; + module: u32; + parseString(): u32; + readVaruint(len: u32): u32; + off: u32; + parse(): void; + } + function newParser(buf: u32): u32; + function parse(p: u32): u32; + namespace memory { + function fill(dest: u32, c: u8, n: u32): void; + function copy(dest: u32, src: u32, n: u32): void; + function compare(vl: u32, vr: u32, n: u32): i32; + function allocate(size: u32): u32; + function free(ptr: u32): void; + function reset(): void; + } +} +export default ASModule; diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index f4a3f1dcbe..14040e60f8 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -6,281 +6,63 @@ (type $v (func)) (type $iii (func (param i32 i32) (result i32))) (type $iiiiv (func (param i32 i32 i32 i32))) - (type $iiiiiv (func (param i32 i32 i32 i32 i32))) - (type $iiiii (func (param i32 i32 i32 i32) (result i32))) (type $iiv (func (param i32 i32))) + (type $FUNCSIG$ii (func (param i32) (result i32))) + (type $FUNCSIG$iii (func (param i32 i32) (result i32))) + (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) + (type $FUNCSIG$i (func (result i32))) (import "env" "memory" (memory $0 1)) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - (data (i32.const 8) "\16\00\00\00i\00n\00 \00t\00h\00e\00 \00s\00t\00a\00r\00t\00 \00f\00u\00n\00c\00t\00i\00o\00n\00!\00") - (data (i32.const 56) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") - (data (i32.const 88) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") - (data (i32.const 152) "\01\00\00\000\00") - (data (i32.const 160) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 216) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\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 728) "\d8\00\00\00d\00\00\00") - (data (i32.const 736) "\03\00\00\00i\003\002\00") - (data (i32.const 752) "\03\00\00\00i\006\004\00") - (data (i32.const 768) "\03\00\00\00f\003\002\00") - (data (i32.const 784) "\03\00\00\00f\006\004\00") - (data (i32.const 800) "\07\00\00\00a\00n\00y\00f\00u\00n\00c\00") - (data (i32.const 824) "\04\00\00\00f\00u\00n\00c\00") - (data (i32.const 840) "\04\00\00\00n\00o\00n\00e\00") - (data (i32.const 856) "\0e\00\00\00I\00n\00c\00o\00r\00r\00e\00c\00t\00 \00T\00y\00p\00e\00") - (data (i32.const 888) "\07\00\00\00E\00r\00r\00o\00r\00:\00 \00") - (data (i32.const 912) "\04\00\00\00n\00u\00l\00l\00") - (data (i32.const 928) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 960) "\00\00\00\00") - (data (i32.const 968) "\02\00\00\00,\00 \00") - (data (i32.const 976) "\04\00\00\00v\00o\00i\00d\00") - (data (i32.const 992) "\07\00\00\00i\00n\00d\00e\00x\00:\00 \00") - (data (i32.const 1016) "\06\00\00\00f\00o\00r\00m\00:\00 \00") - (data (i32.const 1032) "\03\00\00\00,\00 \00(\00") - (data (i32.const 1048) "\05\00\00\00)\00 \00=\00>\00 \00") - (data (i32.const 1064) "\00\00\00\00\00\00\00\00") - (data (i32.const 1072) "(\04\00\00\00\00\00\00") - (data (i32.const 1080) "\01\00\00\00\n\00") - (data (i32.const 1088) "\00\00\00\00\00\00\00\00") - (data (i32.const 1096) "@\04\00\00\00\00\00\00") - (data (i32.const 1104) "\05\00\00\00r\00e\00f\00:\00 \00") - (data (i32.const 1120) "\04\00\00\00i\00d\00:\00 \00") - (data (i32.const 1136) "\0d\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00o\00f\00f\00:\00 \00") - (data (i32.const 1168) "\10\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00l\00e\00n\00g\00t\00h\00:\00 \00") - (data (i32.const 1208) "\05\00\00\00e\00n\00d\00:\00 \00") - (data (i32.const 1224) "\06\00\00\00n\00a\00m\00e\00:\00 \00") - (data (i32.const 1240) "\1b\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00t\00y\00p\00e\00d\00a\00r\00r\00a\00y\00.\00t\00s\00") - (data (i32.const 1304) "\12\00\00\00c\00h\00e\00c\00k\00i\00n\00g\00 \00e\00n\00d\00 \00i\00n\00d\00e\00x\00") - (data (i32.const 1344) "\00\00\00\00\00\00\00\00") - (data (i32.const 1352) "@\05\00\00\00\00\00\00") - (data (i32.const 1360) "\08\00\00\00s\00t\00a\00r\00t\00i\00n\00g\00") - (data (i32.const 1384) "\0e\00\00\00M\00a\00g\00i\00c\00 \00i\00s\00 \00v\00a\00l\00i\00d\00") - (data (i32.const 1416) "\01\00\00\00\'\00") - (data (i32.const 1424) "\06\00\00\00C\00u\00s\00t\00o\00m\00") - (data (i32.const 1440) "\04\00\00\00T\00y\00p\00e\00") - (data (i32.const 1456) "\06\00\00\00I\00m\00p\00o\00r\00t\00") - (data (i32.const 1472) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n\00") - (data (i32.const 1496) "\05\00\00\00T\00a\00b\00l\00e\00") - (data (i32.const 1512) "\06\00\00\00M\00e\00m\00o\00r\00y\00") - (data (i32.const 1528) "\06\00\00\00G\00l\00o\00b\00a\00l\00") - (data (i32.const 1544) "\06\00\00\00E\00x\00p\00o\00r\00t\00") - (data (i32.const 1560) "\05\00\00\00S\00t\00a\00r\00t\00") - (data (i32.const 1576) "\07\00\00\00E\00l\00e\00m\00e\00n\00t\00") - (data (i32.const 1600) "\04\00\00\00C\00o\00d\00e\00") - (data (i32.const 1616) "\04\00\00\00D\00a\00t\00a\00") - (data (i32.const 1632) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 \00") - (data (i32.const 1664) "\t\00\00\00-\00-\00-\00-\00-\00-\00-\00-\00-\00") -<<<<<<< loader-memory-accessors - (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) - (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) - (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) - (import "index" "_log" (func $assembly/host/index/_log (param i32 i32))) -======= - (data (i32.const 8) "\00\00\00\00\00\00\00\00") - (data (i32.const 16) "\08\00\00\00\00\00\00\00") - (data (i32.const 24) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") - (data (i32.const 56) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") - (data (i32.const 120) "\01\00\00\000\00") - (data (i32.const 128) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 184) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\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 696) "\b8\00\00\00d\00\00\00") - (data (i32.const 704) "\03\00\00\00i\003\002\00") - (data (i32.const 720) "\03\00\00\00i\006\004\00") - (data (i32.const 736) "\03\00\00\00f\003\002\00") - (data (i32.const 752) "\03\00\00\00f\006\004\00") - (data (i32.const 768) "\07\00\00\00a\00n\00y\00f\00u\00n\00c\00") - (data (i32.const 792) "\04\00\00\00f\00u\00n\00c\00") - (data (i32.const 808) "\04\00\00\00n\00o\00n\00e\00") - (data (i32.const 824) "\00\00\00\00") - (data (i32.const 832) "\04\00\00\00n\00u\00l\00l\00") - (data (i32.const 848) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 880) "\02\00\00\00,\00 \00") - (data (i32.const 888) "\04\00\00\00v\00o\00i\00d\00") - (data (i32.const 904) "\07\00\00\00i\00n\00d\00e\00x\00:\00 \00") - (data (i32.const 928) "\06\00\00\00f\00o\00r\00m\00:\00 \00") - (data (i32.const 944) "\03\00\00\00,\00 \00(\00") - (data (i32.const 960) "\05\00\00\00)\00 \00=\00>\00 \00") - (data (i32.const 976) "\00\00\00\00\00\00\00\00") - (data (i32.const 984) "\d0\03\00\00\00\00\00\00") - (data (i32.const 992) "\01\00\00\00\n\00") - (data (i32.const 1000) "\00\00\00\00\00\00\00\00") - (data (i32.const 1008) "\e8\03\00\00\00\00\00\00") - (data (i32.const 1016) "\00\00\00\00\00\00\00\00") - (data (i32.const 1024) "\f8\03\00\00\00\00\00\00") - (data (i32.const 1032) "\01\00\00\00\'\00") - (data (i32.const 1040) "\06\00\00\00C\00u\00s\00t\00o\00m\00") - (data (i32.const 1056) "\04\00\00\00T\00y\00p\00e\00") - (data (i32.const 1072) "\06\00\00\00I\00m\00p\00o\00r\00t\00") - (data (i32.const 1088) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n\00") - (data (i32.const 1112) "\05\00\00\00T\00a\00b\00l\00e\00") - (data (i32.const 1128) "\06\00\00\00M\00e\00m\00o\00r\00y\00") - (data (i32.const 1144) "\06\00\00\00G\00l\00o\00b\00a\00l\00") - (data (i32.const 1160) "\06\00\00\00E\00x\00p\00o\00r\00t\00") - (data (i32.const 1176) "\05\00\00\00S\00t\00a\00r\00t\00") - (data (i32.const 1192) "\07\00\00\00E\00l\00e\00m\00e\00n\00t\00") - (data (i32.const 1216) "\04\00\00\00C\00o\00d\00e\00") - (data (i32.const 1232) "\04\00\00\00D\00a\00t\00a\00") - (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) -======= - (data (i32.const 8) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") - (data (i32.const 40) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") - (data (i32.const 104) "\01\00\00\000\00") - (data (i32.const 112) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 168) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\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 680) "\a8\00\00\00d\00\00\00") - (data (i32.const 688) "\03\00\00\00i\003\002\00") - (data (i32.const 704) "\03\00\00\00i\006\004\00") - (data (i32.const 720) "\03\00\00\00f\003\002\00") - (data (i32.const 736) "\03\00\00\00f\006\004\00") - (data (i32.const 752) "\07\00\00\00a\00n\00y\00f\00u\00n\00c\00") - (data (i32.const 776) "\04\00\00\00f\00u\00n\00c\00") - (data (i32.const 792) "\04\00\00\00n\00o\00n\00e\00") - (data (i32.const 808) "\0e\00\00\00I\00n\00c\00o\00r\00r\00e\00c\00t\00 \00T\00y\00p\00e\00") - (data (i32.const 840) "\07\00\00\00E\00r\00r\00o\00r\00:\00 \00") - (data (i32.const 864) "\04\00\00\00n\00u\00l\00l\00") - (data (i32.const 880) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") - (data (i32.const 912) "\00\00\00\00") - (data (i32.const 920) "\02\00\00\00,\00 \00") - (data (i32.const 928) "\04\00\00\00v\00o\00i\00d\00") - (data (i32.const 944) "\07\00\00\00i\00n\00d\00e\00x\00:\00 \00") - (data (i32.const 968) "\06\00\00\00f\00o\00r\00m\00:\00 \00") - (data (i32.const 984) "\03\00\00\00,\00 \00(\00") - (data (i32.const 1000) "\05\00\00\00)\00 \00=\00>\00 \00") - (data (i32.const 1016) "\00\00\00\00\00\00\00\00") - (data (i32.const 1024) "\f8\03\00\00\00\00\00\00") - (data (i32.const 1032) "\01\00\00\00\n\00") - (data (i32.const 1040) "\00\00\00\00\00\00\00\00") - (data (i32.const 1048) "\10\04\00\00\00\00\00\00") - (data (i32.const 1056) "\1b\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00t\00y\00p\00e\00d\00a\00r\00r\00a\00y\00.\00t\00s\00") - (data (i32.const 1120) "\00\00\00\00\00\00\00\00") - (data (i32.const 1128) "`\04\00\00\00\00\00\00") - (data (i32.const 1136) "\01\00\00\00\'\00") - (data (i32.const 1144) "\06\00\00\00C\00u\00s\00t\00o\00m\00") - (data (i32.const 1160) "\04\00\00\00T\00y\00p\00e\00") - (data (i32.const 1176) "\06\00\00\00I\00m\00p\00o\00r\00t\00") - (data (i32.const 1192) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n\00") - (data (i32.const 1216) "\05\00\00\00T\00a\00b\00l\00e\00") - (data (i32.const 1232) "\06\00\00\00M\00e\00m\00o\00r\00y\00") - (data (i32.const 1248) "\06\00\00\00G\00l\00o\00b\00a\00l\00") - (data (i32.const 1264) "\06\00\00\00E\00x\00p\00o\00r\00t\00") - (data (i32.const 1280) "\05\00\00\00S\00t\00a\00r\00t\00") - (data (i32.const 1296) "\07\00\00\00E\00l\00e\00m\00e\00n\00t\00") - (data (i32.const 1320) "\04\00\00\00C\00o\00d\00e\00") - (data (i32.const 1336) "\04\00\00\00D\00a\00t\00a\00") - (data (i32.const 1352) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 \00") ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (data (i32.const 16) "\08") + (data (i32.const 24) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") + (data (i32.const 56) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s") + (data (i32.const 128) "x") + (data (i32.const 136) "\01\00\00\000") + (data (i32.const 144) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") + (data (i32.const 200) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009") + (data (i32.const 712) "\c8\00\00\00d") + (data (i32.const 720) "\03\00\00\00i\003\002") + (data (i32.const 736) "\03\00\00\00i\006\004") + (data (i32.const 752) "\03\00\00\00f\003\002") + (data (i32.const 768) "\03\00\00\00f\006\004") + (data (i32.const 784) "\07\00\00\00a\00n\00y\00f\00u\00n\00c") + (data (i32.const 808) "\04\00\00\00f\00u\00n\00c") + (data (i32.const 824) "\04\00\00\00n\00o\00n\00e") + (data (i32.const 848) "\04\00\00\00n\00u\00l\00l") + (data (i32.const 864) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") + (data (i32.const 896) "\02\00\00\00,\00 ") + (data (i32.const 904) "\04\00\00\00v\00o\00i\00d") + (data (i32.const 920) "\07\00\00\00i\00n\00d\00e\00x\00:\00 ") + (data (i32.const 944) "\06\00\00\00f\00o\00r\00m\00:\00 ") + (data (i32.const 960) "\03\00\00\00,\00 \00(") + (data (i32.const 976) "\05\00\00\00)\00 \00=\00>\00 ") + (data (i32.const 1000) "\e0\03") + (data (i32.const 1008) "\01\00\00\00\n") + (data (i32.const 1024) "\f8\03") + (data (i32.const 1032) "\01\00\00\00\'") + (data (i32.const 1040) "\06\00\00\00C\00u\00s\00t\00o\00m") + (data (i32.const 1056) "\04\00\00\00T\00y\00p\00e") + (data (i32.const 1072) "\06\00\00\00I\00m\00p\00o\00r\00t") + (data (i32.const 1088) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n") + (data (i32.const 1112) "\05\00\00\00T\00a\00b\00l\00e") + (data (i32.const 1128) "\06\00\00\00M\00e\00m\00o\00r\00y") + (data (i32.const 1144) "\06\00\00\00G\00l\00o\00b\00a\00l") + (data (i32.const 1160) "\06\00\00\00E\00x\00p\00o\00r\00t") + (data (i32.const 1176) "\05\00\00\00S\00t\00a\00r\00t") + (data (i32.const 1192) "\07\00\00\00E\00l\00e\00m\00e\00n\00t") + (data (i32.const 1216) "\04\00\00\00C\00o\00d\00e") + (data (i32.const 1232) "\04\00\00\00D\00a\00t\00a") (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) - (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors ->>>>>>> Working on sections. -======= - (import "index" "_log" (func $assembly/host/index/_log (param i32 i32))) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= ->>>>>>> Added a test assembly file to parse instead of parser self parsing. (table $0 1 anyfunc) (elem (i32.const 0) $null) - (global $src/common/MAX_PAGES i32 (i32.const 65535)) - (global $src/common/MAX_ELEMS i32 (i32.const -1)) - (global $~lib/internal/allocator/MAX_SIZE_32 i32 (i32.const 1073741824)) - (global $~lib/internal/allocator/AL_BITS i32 (i32.const 3)) - (global $~lib/internal/allocator/AL_SIZE i32 (i32.const 8)) - (global $~lib/internal/allocator/AL_MASK i32 (i32.const 7)) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) - (global $~lib/internal/arraybuffer/HEADER_SIZE i32 (i32.const 8)) - (global $~lib/internal/arraybuffer/MAX_BLENGTH i32 (i32.const 1073741816)) - (global $~lib/internal/string/HEADER_SIZE i32 (i32.const 4)) - (global $~lib/internal/string/MAX_LENGTH i32 (i32.const 536870910)) - (global $~lib/internal/number/MAX_DOUBLE_LENGTH i32 (i32.const 28)) - (global $~lib/internal/number/_K (mut i32) (i32.const 0)) - (global $~lib/internal/number/_frc (mut i64) (i64.const 0)) - (global $~lib/internal/number/_exp (mut i32) (i32.const 0)) - (global $~lib/internal/number/_frc_minus (mut i64) (i64.const 0)) - (global $~lib/internal/number/_frc_plus (mut i64) (i64.const 0)) - (global $~lib/internal/number/_frc_pow (mut i64) (i64.const 0)) - (global $~lib/internal/number/_exp_pow (mut i32) (i32.const 0)) (global $assembly/index/type (mut i32) (i32.const 0)) - (global $src/common/SectionId.Custom (mut i32) (i32.const 0)) (global $src/common/SectionId.Type (mut i32) (i32.const 1)) - (global $src/common/SectionId.Import (mut i32) (i32.const 2)) - (global $src/common/SectionId.Function (mut i32) (i32.const 3)) - (global $src/common/SectionId.Table (mut i32) (i32.const 4)) - (global $src/common/SectionId.Memory (mut i32) (i32.const 5)) - (global $src/common/SectionId.Global (mut i32) (i32.const 6)) - (global $src/common/SectionId.Export (mut i32) (i32.const 7)) - (global $src/common/SectionId.Start (mut i32) (i32.const 8)) - (global $src/common/SectionId.Element (mut i32) (i32.const 9)) - (global $src/common/SectionId.Code (mut i32) (i32.const 10)) (global $src/common/SectionId.Data (mut i32) (i32.const 11)) - (global $ASC_SHRINK_LEVEL i32 (i32.const 0)) - (global $~lib/internal/string/CharCode.PLUS i32 (i32.const 43)) - (global $~lib/internal/string/CharCode.MINUS i32 (i32.const 45)) - (global $~lib/internal/string/CharCode.DOT i32 (i32.const 46)) - (global $~lib/internal/string/CharCode._0 i32 (i32.const 48)) - (global $~lib/internal/string/CharCode._1 i32 (i32.const 49)) - (global $~lib/internal/string/CharCode._2 i32 (i32.const 50)) - (global $~lib/internal/string/CharCode._3 i32 (i32.const 51)) - (global $~lib/internal/string/CharCode._4 i32 (i32.const 52)) - (global $~lib/internal/string/CharCode._5 i32 (i32.const 53)) - (global $~lib/internal/string/CharCode._6 i32 (i32.const 54)) - (global $~lib/internal/string/CharCode._7 i32 (i32.const 55)) - (global $~lib/internal/string/CharCode._8 i32 (i32.const 56)) - (global $~lib/internal/string/CharCode._9 i32 (i32.const 57)) - (global $~lib/internal/string/CharCode.A i32 (i32.const 65)) - (global $~lib/internal/string/CharCode.B i32 (i32.const 66)) - (global $~lib/internal/string/CharCode.E i32 (i32.const 69)) - (global $~lib/internal/string/CharCode.N i32 (i32.const 78)) - (global $~lib/internal/string/CharCode.O i32 (i32.const 79)) - (global $~lib/internal/string/CharCode.X i32 (i32.const 88)) - (global $~lib/internal/string/CharCode.Z i32 (i32.const 90)) - (global $~lib/internal/string/CharCode.a i32 (i32.const 97)) - (global $~lib/internal/string/CharCode.b i32 (i32.const 98)) - (global $~lib/internal/string/CharCode.e i32 (i32.const 101)) - (global $~lib/internal/string/CharCode.n i32 (i32.const 110)) - (global $~lib/internal/string/CharCode.o i32 (i32.const 111)) - (global $~lib/internal/string/CharCode.x i32 (i32.const 120)) - (global $~lib/internal/string/CharCode.z i32 (i32.const 122)) - (global $src/common/ExternalKind.Function (mut i32) (i32.const 0)) - (global $src/common/ExternalKind.Table (mut i32) (i32.const 1)) - (global $src/common/ExternalKind.Memory (mut i32) (i32.const 2)) - (global $src/common/ExternalKind.Global (mut i32) (i32.const 3)) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (global $HEAP_BASE i32 (i32.const 1688)) -======= - (global $HEAP_BASE i32 (i32.const 1244)) ->>>>>>> Working on sections. -======= - (global $HEAP_BASE i32 (i32.const 1688)) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (global $HEAP_BASE i32 (i32.const 1380)) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. (export "memory" (memory $0)) (export "table" (table $0)) (export "getType" (func $assembly/index/getType)) - (export "getImports" (func $assembly/index/getImports)) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -======= - (export "removeDataSection" (func $assembly/index/removeDataSection)) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (export "removeStartFunction" (func $assembly/index/removeStartFunction)) -======= ->>>>>>> Working on sections. -======= - (export "removeStartFunction" (func $assembly/index/removeStartFunction)) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. (export "toString" (func $assembly/index/toString)) (export "Parser#constructor" (func $assembly/index/Parser#constructor)) (export "Parser#get:buf" (func $Parser#get:buf)) @@ -301,107 +83,19 @@ (export "memory.free" (func $~lib/memory/memory.free)) (export "memory.reset" (func $~lib/memory/memory.reset)) (start $start) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) -======= - (func $~lib/internal/memory/memset (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Working on sections. -======= - (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/internal/memory/memset (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $~lib/internal/memory/memset (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) -<<<<<<< loader-memory-accessors - get_global $assembly/index/off - set_local $0 - loop $continue|0 - get_local $0 - tee_local $1 - i32.const 1 - i32.add - set_local $0 - get_local $1 - i32.load8_u - tee_local $1 - i32.const 127 - i32.and - get_local $3 - i32.shl - get_local $2 - i32.or - set_local $2 - get_local $1 - i32.const 128 - i32.and - if - get_local $3 - i32.const 7 - i32.add - set_local $3 - br $continue|0 - end -======= - (local $4 i32) - (local $5 i64) + (local $4 i64) get_local $2 i32.eqz if return ->>>>>>> new Branch for parser end get_local $0 get_local $1 i32.store8 get_local $0 get_local $2 -<<<<<<< loader-memory-accessors - ) - (func $assembly/index/readVarint (; 20 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_global $assembly/index/off - set_local $2 - loop $continue|0 - get_local $2 - tee_local $4 - i32.const 1 - i32.add - set_local $2 - get_local $4 - i32.load8_u - tee_local $5 - i32.const 127 - i32.and - get_local $1 - i32.shl - get_local $3 - i32.or - set_local $3 - get_local $1 - i32.const 7 - i32.add - set_local $1 - get_local $5 - i32.const 128 - i32.and - br_if $continue|0 - end - get_local $2 - set_global $assembly/index/off - i32.const -1 - get_local $1 - i32.shl - get_local $3 - i32.or - set_local $2 -======= i32.add i32.const 1 i32.sub @@ -421,70 +115,17 @@ get_local $0 i32.const 2 i32.add ->>>>>>> new Branch for parser get_local $1 i32.store8 get_local $0 get_local $2 -<<<<<<< loader-memory-accessors - get_local $3 - get_local $4 - select - ) - (func $assembly/index/readVarint64 (; 21 ;) (type $I) (result i64) - (local $0 i64) - (local $1 i64) - (local $2 i32) - (local $3 i32) - (local $4 i64) - (local $5 i64) - get_global $assembly/index/off - set_local $3 - loop $continue|0 - get_local $3 - tee_local $2 - i32.const 1 - i32.add - set_local $3 - get_local $2 - i64.load8_u - tee_local $4 - i64.const 127 - i64.and - get_local $0 - i64.shl - get_local $1 - i64.or - set_local $1 - get_local $0 - i64.const 7 - i64.add - set_local $0 - get_local $4 - i64.const 128 - i64.and - i64.const 0 - i64.ne - br_if $continue|0 - end - get_local $3 - set_global $assembly/index/off - i64.const -1 - get_local $0 - i64.shl - get_local $1 - i64.or - set_local $5 -======= i32.add + tee_local $3 i32.const 2 i32.sub get_local $1 i32.store8 ->>>>>>> new Branch for parser - get_local $0 - get_local $2 - i32.add + get_local $3 i32.const 3 i32.sub get_local $1 @@ -502,83 +143,6 @@ i32.store8 get_local $0 get_local $2 -<<<<<<< loader-memory-accessors - select - ) - (func $assembly/index/skipInitExpr (; 22 ;) (type $v) - (local $0 i32) - (local $1 i32) - get_global $assembly/index/off - tee_local $1 - i32.load8_u - set_local $0 - get_local $1 - i32.const 1 - i32.add - set_global $assembly/index/off - block $break|0 - block $case5|0 - block $case4|0 - block $case3|0 - block $case2|0 - block $case1|0 - get_global $src/common/Opcode.i32_const - get_local $0 - i32.ne - if - get_global $src/common/Opcode.i64_const - get_local $0 - i32.eq - br_if $case1|0 - get_global $src/common/Opcode.f32_const - get_local $0 - i32.eq - br_if $case2|0 - get_global $src/common/Opcode.f64_const - get_local $0 - i32.eq - br_if $case3|0 - get_global $src/common/Opcode.get_global - get_local $0 - i32.eq - br_if $case4|0 - br $case5|0 - end - i32.const 32 - call $assembly/index/readVarint - drop - br $break|0 - end - call $assembly/index/readVarint64 - drop - br $break|0 - end - get_global $assembly/index/off - tee_local $0 - i32.load - drop - get_local $0 - i32.const 4 - i32.add - set_global $assembly/index/off - br $break|0 - end - get_global $assembly/index/off - tee_local $0 - i64.load - drop - get_local $0 - i32.const 8 - i32.add - set_global $assembly/index/off - br $break|0 - end - call $assembly/index/readVaruint - drop - br $break|0 - end - unreachable -======= i32.add i32.const 4 i32.sub @@ -589,354 +153,264 @@ i32.le_u if return ->>>>>>> new Branch for parser end + get_local $2 i32.const 0 get_local $0 i32.sub i32.const 3 i32.and - set_local $3 + tee_local $3 + i32.sub + set_local $2 get_local $0 get_local $3 i32.add - set_local $0 - get_local $2 - get_local $3 - i32.sub - set_local $2 - get_local $2 - i32.const -4 - i32.and - set_local $2 - i32.const -1 - i32.const 255 - i32.div_u + tee_local $0 get_local $1 -<<<<<<< loader-memory-accessors - i32.const 1 - i32.add - set_global $assembly/index/off - get_global $src/common/Opcode.end - get_local $0 - i32.ne -======= i32.const 255 i32.and + i32.const 16843009 i32.mul - set_local $4 - get_local $0 - get_local $4 + tee_local $1 i32.store - get_local $0 get_local $2 + i32.const -4 + i32.and + tee_local $2 + get_local $0 i32.add i32.const 4 i32.sub - get_local $4 + get_local $1 i32.store get_local $2 i32.const 8 i32.le_u ->>>>>>> new Branch for parser if return end get_local $0 -<<<<<<< loader-memory-accessors - set_global $assembly/index/off - get_global $assembly/index/off - tee_local $0 - i32.load - set_local $6 - get_local $0 - i32.const 4 - i32.add - set_global $assembly/index/off - get_local $6 - i32.const 1836278016 - i32.ne -======= i32.const 4 i32.add - get_local $4 + get_local $1 i32.store get_local $0 i32.const 8 i32.add - get_local $4 + get_local $1 i32.store get_local $0 get_local $2 i32.add + tee_local $3 i32.const 12 i32.sub - get_local $4 + get_local $1 i32.store - get_local $0 - get_local $2 - i32.add + get_local $3 i32.const 8 i32.sub - get_local $4 + get_local $1 i32.store get_local $2 i32.const 24 i32.le_u ->>>>>>> new Branch for parser if return end -<<<<<<< loader-memory-accessors - get_global $assembly/index/off - tee_local $0 - i32.load - set_local $6 -======= get_local $0 i32.const 12 i32.add - get_local $4 + get_local $1 i32.store get_local $0 i32.const 16 i32.add - get_local $4 + get_local $1 i32.store get_local $0 i32.const 20 i32.add - get_local $4 + get_local $1 i32.store get_local $0 i32.const 24 i32.add - get_local $4 + get_local $1 i32.store get_local $0 get_local $2 i32.add + tee_local $3 i32.const 28 i32.sub - get_local $4 + get_local $1 i32.store - get_local $0 - get_local $2 - i32.add + get_local $3 i32.const 24 i32.sub - get_local $4 + get_local $1 i32.store - get_local $0 - get_local $2 - i32.add + get_local $3 i32.const 20 i32.sub - get_local $4 + get_local $1 i32.store - get_local $0 - get_local $2 - i32.add + get_local $3 i32.const 16 i32.sub - get_local $4 + get_local $1 i32.store - i32.const 24 ->>>>>>> new Branch for parser get_local $0 i32.const 4 i32.and + i32.const 24 i32.add -<<<<<<< loader-memory-accessors - set_global $assembly/index/off - get_local $6 - i32.const 1 -======= - set_local $3 + tee_local $3 get_local $0 - get_local $3 i32.add set_local $0 get_local $2 get_local $3 i32.sub set_local $2 - get_local $4 + get_local $1 i64.extend_u/i32 + tee_local $4 get_local $4 - i64.extend_u/i32 i64.const 32 i64.shl i64.or - set_local $5 - block $break|0 - loop $continue|0 + set_local $4 + loop $continue|0 + get_local $2 + i32.const 32 + i32.ge_u + if + get_local $0 + get_local $4 + i64.store + get_local $0 + i32.const 8 + i32.add + get_local $4 + i64.store + get_local $0 + i32.const 16 + i32.add + get_local $4 + i64.store + get_local $0 + i32.const 24 + i32.add + get_local $4 + i64.store get_local $2 i32.const 32 - i32.ge_u - if - block - get_local $0 - get_local $5 - i64.store - get_local $0 - i32.const 8 - i32.add - get_local $5 - i64.store - get_local $0 - i32.const 16 - i32.add - get_local $5 - i64.store - get_local $0 - i32.const 24 - i32.add - get_local $5 - i64.store - get_local $2 - i32.const 32 - i32.sub - set_local $2 - get_local $0 - i32.const 32 - i32.add - set_local $0 - end - br $continue|0 - end + i32.sub + set_local $2 + get_local $0 + i32.const 32 + i32.add + set_local $0 + br $continue|0 end end ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/memory/memory.fill (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) -======= - (func $~lib/memory/memory.fill (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Working on sections. -======= - (func $~lib/memory/memory.fill (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/memory/memory.fill (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $~lib/memory/memory.fill (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memset ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/internal/memory/memcpy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) -======= - (func $~lib/internal/memory/memcpy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Working on sections. -======= - (func $~lib/internal/memory/memcpy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/internal/memory/memcpy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $~lib/internal/memory/memcpy (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) - block $break|0 - loop $continue|0 + loop $continue|0 + get_local $2 + if (result i32) + get_local $1 + i32.const 3 + i32.and + else get_local $2 - if (result i32) - get_local $1 - i32.const 3 - i32.and - else - get_local $2 - end - if - block - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - get_local $2 - i32.const 1 - i32.sub - set_local $2 - end - br $continue|0 - end + end + tee_local $3 + if + get_local $0 + tee_local $4 + i32.const 1 + i32.add + set_local $0 + get_local $1 + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $4 + get_local $3 + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + br $continue|0 end end get_local $0 i32.const 3 i32.and - i32.const 0 - i32.eq + i32.eqz if - block $break|1 - loop $continue|1 + loop $continue|1 + get_local $2 + i32.const 16 + i32.ge_u + if + get_local $0 + get_local $1 + i32.load + i32.store + get_local $0 + i32.const 4 + i32.add + get_local $1 + i32.const 4 + i32.add + i32.load + i32.store + get_local $0 + i32.const 8 + i32.add + get_local $1 + i32.const 8 + i32.add + i32.load + i32.store + get_local $0 + i32.const 12 + i32.add + get_local $1 + i32.const 12 + i32.add + i32.load + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 get_local $2 i32.const 16 - i32.ge_u - if - block - get_local $0 - get_local $1 - i32.load - i32.store - get_local $0 - i32.const 4 - i32.add - get_local $1 - i32.const 4 - i32.add - i32.load - i32.store - get_local $0 - i32.const 8 - i32.add - get_local $1 - i32.const 8 - i32.add - i32.load - i32.store - get_local $0 - i32.const 12 - i32.add - get_local $1 - i32.const 12 - i32.add - i32.load - i32.store - get_local $1 - i32.const 16 - i32.add - set_local $1 - get_local $0 - i32.const 16 - i32.add - set_local $0 - get_local $2 - i32.const 16 - i32.sub - set_local $2 - end - br $continue|1 - end + i32.sub + set_local $2 + br $continue|1 end end get_local $2 @@ -1002,22 +476,10 @@ i32.const 1 i32.and if - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $1 + set_local $3 + get_local $0 + get_local $1 i32.load8_u i32.store8 end @@ -1030,721 +492,548 @@ block $break|2 block $case2|2 block $case1|2 - block $case0|2 - get_local $0 - i32.const 3 - i32.and - set_local $5 - get_local $5 - i32.const 1 - i32.eq - br_if $case0|2 - get_local $5 + get_local $0 + i32.const 3 + i32.and + tee_local $3 + i32.const 1 + i32.ne + if + get_local $3 i32.const 2 i32.eq br_if $case1|2 - get_local $5 + get_local $3 i32.const 3 i32.eq br_if $case2|2 br $break|2 end - block - get_local $1 - i32.load - set_local $3 - block (result i32) + get_local $1 + i32.load + set_local $5 + get_local $0 + get_local $1 + tee_local $3 + i32.load8_u + i32.store8 + get_local $0 + i32.const 1 + i32.add + tee_local $1 + set_local $0 + get_local $1 + get_local $3 + i32.const 1 + i32.add + tee_local $1 + i32.load8_u + i32.store8 + get_local $0 + i32.const 1 + i32.add + tee_local $4 + i32.const 1 + i32.add + set_local $0 + get_local $1 + i32.const 1 + i32.add + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $4 + get_local $3 + i32.load8_u + i32.store8 + get_local $2 + i32.const 3 + i32.sub + set_local $2 + loop $continue|3 + get_local $2 + i32.const 17 + i32.ge_u + if get_local $0 - tee_local $5 + get_local $1 i32.const 1 i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 + i32.load + tee_local $3 + i32.const 8 + i32.shl get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) + i32.const 24 + i32.shr_u + i32.or + i32.store get_local $0 - tee_local $5 - i32.const 1 + i32.const 4 i32.add - set_local $0 - get_local $5 - end - block (result i32) get_local $1 + i32.const 5 + i32.add + i32.load tee_local $5 - i32.const 1 + i32.const 8 + i32.shl + get_local $3 + i32.const 24 + i32.shr_u + i32.or + i32.store + get_local $0 + i32.const 8 i32.add - set_local $1 + get_local $1 + i32.const 9 + i32.add + i32.load + tee_local $3 + i32.const 8 + i32.shl get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) + i32.const 24 + i32.shr_u + i32.or + i32.store get_local $0 - tee_local $5 - i32.const 1 + i32.const 12 i32.add - set_local $0 - get_local $5 - end - block (result i32) get_local $1 + i32.const 13 + i32.add + i32.load tee_local $5 - i32.const 1 + i32.const 8 + i32.shl + get_local $3 + i32.const 24 + i32.shr_u + i32.or + i32.store + get_local $1 + i32.const 16 i32.add set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - get_local $2 - i32.const 3 - i32.sub - set_local $2 - block $break|3 - loop $continue|3 - get_local $2 - i32.const 17 - i32.ge_u - if - block - get_local $1 - i32.const 1 - i32.add - i32.load - set_local $4 - get_local $0 - get_local $3 - i32.const 24 - i32.shr_u - get_local $4 - i32.const 8 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 5 - i32.add - i32.load - set_local $3 - get_local $0 - i32.const 4 - i32.add - get_local $4 - i32.const 24 - i32.shr_u - get_local $3 - i32.const 8 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 9 - i32.add - i32.load - set_local $4 - get_local $0 - i32.const 8 - i32.add - get_local $3 - i32.const 24 - i32.shr_u - get_local $4 - i32.const 8 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 13 - i32.add - i32.load - set_local $3 - get_local $0 - i32.const 12 - i32.add - get_local $4 - i32.const 24 - i32.shr_u - get_local $3 - i32.const 8 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 16 - i32.add - set_local $1 - get_local $0 - i32.const 16 - i32.add - set_local $0 - get_local $2 - i32.const 16 - i32.sub - set_local $2 - end - br $continue|3 - end - end + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + br $continue|3 end - br $break|2 - unreachable end - unreachable + br $break|2 end - block - get_local $1 - i32.load - set_local $3 - block (result i32) + get_local $1 + i32.load + set_local $5 + get_local $0 + get_local $1 + i32.load8_u + i32.store8 + get_local $0 + i32.const 1 + i32.add + tee_local $4 + i32.const 1 + i32.add + set_local $0 + get_local $1 + i32.const 1 + i32.add + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $4 + get_local $3 + i32.load8_u + i32.store8 + get_local $2 + i32.const 2 + i32.sub + set_local $2 + loop $continue|4 + get_local $2 + i32.const 18 + i32.ge_u + if get_local $0 - tee_local $5 - i32.const 1 + get_local $1 + i32.const 2 i32.add - set_local $0 + i32.load + tee_local $3 + i32.const 16 + i32.shl get_local $5 - end - block (result i32) + i32.const 16 + i32.shr_u + i32.or + i32.store + get_local $0 + i32.const 4 + i32.add get_local $1 + i32.const 6 + i32.add + i32.load tee_local $5 - i32.const 1 + i32.const 16 + i32.shl + get_local $3 + i32.const 16 + i32.shr_u + i32.or + i32.store + get_local $0 + i32.const 8 i32.add - set_local $1 + get_local $1 + i32.const 10 + i32.add + i32.load + tee_local $3 + i32.const 16 + i32.shl get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) + i32.const 16 + i32.shr_u + i32.or + i32.store get_local $0 - tee_local $5 - i32.const 1 + i32.const 12 i32.add - set_local $0 - get_local $5 - end - block (result i32) get_local $1 + i32.const 14 + i32.add + i32.load tee_local $5 - i32.const 1 + i32.const 16 + i32.shl + get_local $3 + i32.const 16 + i32.shr_u + i32.or + i32.store + get_local $1 + i32.const 16 i32.add set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - get_local $2 - i32.const 2 - i32.sub - set_local $2 - block $break|4 - loop $continue|4 - get_local $2 - i32.const 18 - i32.ge_u - if - block - get_local $1 - i32.const 2 - i32.add - i32.load - set_local $4 - get_local $0 - get_local $3 - i32.const 16 - i32.shr_u - get_local $4 - i32.const 16 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 6 - i32.add - i32.load - set_local $3 - get_local $0 - i32.const 4 - i32.add - get_local $4 - i32.const 16 - i32.shr_u - get_local $3 - i32.const 16 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 10 - i32.add - i32.load - set_local $4 - get_local $0 - i32.const 8 - i32.add - get_local $3 - i32.const 16 - i32.shr_u - get_local $4 - i32.const 16 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 14 - i32.add - i32.load - set_local $3 - get_local $0 - i32.const 12 - i32.add - get_local $4 - i32.const 16 - i32.shr_u - get_local $3 - i32.const 16 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 16 - i32.add - set_local $1 - get_local $0 - i32.const 16 - i32.add - set_local $0 - get_local $2 - i32.const 16 - i32.sub - set_local $2 - end - br $continue|4 - end - end - end - br $break|2 - unreachable - end - unreachable - end - block - get_local $1 - i32.load - set_local $3 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - get_local $2 - i32.const 1 - i32.sub - set_local $2 - block $break|5 - loop $continue|5 + get_local $0 + i32.const 16 + i32.add + set_local $0 get_local $2 - i32.const 19 - i32.ge_u - if - block - get_local $1 - i32.const 3 - i32.add - i32.load - set_local $4 - get_local $0 - get_local $3 - i32.const 8 - i32.shr_u - get_local $4 - i32.const 24 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 7 - i32.add - i32.load - set_local $3 - get_local $0 - i32.const 4 - i32.add - get_local $4 - i32.const 8 - i32.shr_u - get_local $3 - i32.const 24 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 11 - i32.add - i32.load - set_local $4 - get_local $0 - i32.const 8 - i32.add - get_local $3 - i32.const 8 - i32.shr_u - get_local $4 - i32.const 24 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 15 - i32.add - i32.load - set_local $3 - get_local $0 - i32.const 12 - i32.add - get_local $4 - i32.const 8 - i32.shr_u - get_local $3 - i32.const 24 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 16 - i32.add - set_local $1 - get_local $0 - i32.const 16 - i32.add - set_local $0 - get_local $2 - i32.const 16 - i32.sub - set_local $2 - end - br $continue|5 - end + i32.const 16 + i32.sub + set_local $2 + br $continue|4 end end br $break|2 - unreachable end - unreachable - end - end - get_local $2 - i32.const 16 - i32.and - if - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) + i32.load + set_local $5 get_local $0 - tee_local $5 + tee_local $4 i32.const 1 i32.add set_local $0 - get_local $5 - end - block (result i32) get_local $1 - tee_local $5 + tee_local $3 i32.const 1 i32.add set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 + get_local $4 + get_local $3 + i32.load8_u + i32.store8 + get_local $2 i32.const 1 - i32.add - set_local $1 - get_local $5 + i32.sub + set_local $2 + loop $continue|5 + get_local $2 + i32.const 19 + i32.ge_u + if + get_local $0 + get_local $1 + i32.const 3 + i32.add + i32.load + tee_local $3 + i32.const 24 + i32.shl + get_local $5 + i32.const 8 + i32.shr_u + i32.or + i32.store + get_local $0 + i32.const 4 + i32.add + get_local $1 + i32.const 7 + i32.add + i32.load + tee_local $5 + i32.const 24 + i32.shl + get_local $3 + i32.const 8 + i32.shr_u + i32.or + i32.store + get_local $0 + i32.const 8 + i32.add + get_local $1 + i32.const 11 + i32.add + i32.load + tee_local $3 + i32.const 24 + i32.shl + get_local $5 + i32.const 8 + i32.shr_u + i32.or + i32.store + get_local $0 + i32.const 12 + i32.add + get_local $1 + i32.const 15 + i32.add + i32.load + tee_local $5 + i32.const 24 + i32.shl + get_local $3 + i32.const 8 + i32.shr_u + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + br $continue|5 + end + end end + end + get_local $2 + i32.const 16 + i32.and + if + get_local $0 + get_local $1 + tee_local $3 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $1 + set_local $0 + get_local $1 + get_local $3 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 + i32.load8_u + i32.store8 + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 + i32.load8_u + i32.store8 + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 + i32.load8_u + i32.store8 + get_local $0 + i32.const 1 + i32.add + tee_local $4 + i32.const 1 + i32.add + set_local $0 + get_local $1 + i32.const 1 + i32.add + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $4 + get_local $3 i32.load8_u i32.store8 end @@ -1752,5142 +1041,656 @@ i32.const 8 i32.and if - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + get_local $1 + tee_local $3 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $1 + set_local $0 + get_local $1 + get_local $3 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - end - get_local $2 - i32.const 4 - i32.and - if - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - end - get_local $2 - i32.const 2 - i32.and - if - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - end - get_local $2 - i32.const 1 - i32.and - if - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - end - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/internal/memory/memmove (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) -======= - (func $~lib/internal/memory/memmove (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Working on sections. -======= - (func $~lib/internal/memory/memmove (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/internal/memory/memmove (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $3 i32) - get_local $0 - get_local $1 - i32.eq - if - return - end - get_local $1 - get_local $2 - i32.add - get_local $0 - i32.le_u - tee_local $3 - if (result i32) - get_local $3 - else - get_local $0 - get_local $2 - i32.add - get_local $1 - i32.le_u - end - if - get_local $0 - get_local $1 - get_local $2 - call $~lib/internal/memory/memcpy - return - end - get_local $0 - get_local $1 - i32.lt_u - if - get_local $1 - i32.const 7 - i32.and - get_local $0 - i32.const 7 - i32.and - i32.eq - if - block $break|0 - loop $continue|0 - get_local $0 - i32.const 7 - i32.and - if - block - get_local $2 - i32.eqz - if - return - end - get_local $2 - i32.const 1 - i32.sub - set_local $2 - block (result i32) - get_local $0 - tee_local $3 - i32.const 1 - i32.add - set_local $0 - get_local $3 - end - block (result i32) - get_local $1 - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $3 - end - i32.load8_u - i32.store8 - end - br $continue|0 - end - end - end - block $break|1 - loop $continue|1 - get_local $2 - i32.const 8 - i32.ge_u - if - block - get_local $0 - get_local $1 - i64.load - i64.store - get_local $2 - i32.const 8 - i32.sub - set_local $2 - get_local $0 - i32.const 8 - i32.add - set_local $0 - get_local $1 - i32.const 8 - i32.add - set_local $1 - end - br $continue|1 - end - end - end - end - block $break|2 - loop $continue|2 - get_local $2 - if - block - block (result i32) - get_local $0 - tee_local $3 - i32.const 1 - i32.add - set_local $0 - get_local $3 - end - block (result i32) - get_local $1 - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $3 - end - i32.load8_u - i32.store8 - get_local $2 - i32.const 1 - i32.sub - set_local $2 - end - br $continue|2 - end - end - end - else - get_local $1 - i32.const 7 - i32.and - get_local $0 - i32.const 7 - i32.and - i32.eq - if - block $break|3 - loop $continue|3 - get_local $0 - get_local $2 - i32.add - i32.const 7 - i32.and - if - block - get_local $2 - i32.eqz - if - return - end - get_local $0 - get_local $2 - i32.const 1 - i32.sub - tee_local $2 - i32.add - get_local $1 - get_local $2 - i32.add - i32.load8_u - i32.store8 - end - br $continue|3 - end - end - end - block $break|4 - loop $continue|4 - get_local $2 - i32.const 8 - i32.ge_u - if - block - get_local $2 - i32.const 8 - i32.sub - set_local $2 - get_local $0 - get_local $2 - i32.add - get_local $1 - get_local $2 - i32.add - i64.load - i64.store - end - br $continue|4 - end - end - end - end - block $break|5 - loop $continue|5 - get_local $2 - if - get_local $0 - get_local $2 - i32.const 1 - i32.sub - tee_local $2 - i32.add - get_local $1 - get_local $2 - i32.add - i32.load8_u - i32.store8 - br $continue|5 - end - end - end - end - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/memory/memory.copy (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) -======= - (func $~lib/memory/memory.copy (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Working on sections. -======= - (func $~lib/memory/memory.copy (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/memory/memory.copy (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_local $0 - get_local $1 - get_local $2 - call $~lib/internal/memory/memmove - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/internal/memory/memcmp (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) -======= - (func $~lib/internal/memory/memcmp (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/internal/memory/memcmp (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/internal/memory/memcmp (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $3 i32) - get_local $0 - get_local $1 - i32.eq - if - i32.const 0 - return - end - block $break|0 - loop $continue|0 - get_local $2 - i32.const 0 - i32.ne - tee_local $3 - if (result i32) - get_local $0 - i32.load8_u - get_local $1 - i32.load8_u - i32.eq - else - get_local $3 - end - if - block - get_local $2 - i32.const 1 - i32.sub - set_local $2 - get_local $0 - i32.const 1 - i32.add - set_local $0 - get_local $1 - i32.const 1 - i32.add - set_local $1 - end - br $continue|0 - end - end - end - get_local $2 - if (result i32) - get_local $0 - i32.load8_u - get_local $1 - i32.load8_u - i32.sub - else - i32.const 0 - end - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/memory/memory.compare (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) -======= - (func $~lib/memory/memory.compare (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/memory/memory.compare (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/memory/memory.compare (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_local $0 - get_local $1 - get_local $2 - call $~lib/internal/memory/memcmp - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/allocator/arena/__memory_allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $~lib/allocator/arena/__memory_allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/allocator/arena/__memory_allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/allocator/arena/__memory_allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - get_local $0 - get_global $~lib/internal/allocator/MAX_SIZE_32 - i32.gt_u - if - unreachable - end - get_global $~lib/allocator/arena/offset - set_local $1 - get_local $1 - get_local $0 - tee_local $2 - i32.const 1 - tee_local $3 - get_local $2 - get_local $3 - i32.gt_u - select - i32.add - get_global $~lib/internal/allocator/AL_MASK - i32.add - get_global $~lib/internal/allocator/AL_MASK - i32.const -1 - i32.xor - i32.and - set_local $4 - current_memory - set_local $5 - get_local $4 - get_local $5 - i32.const 16 - i32.shl - i32.gt_u - if - get_local $4 - get_local $1 - i32.sub - i32.const 65535 - i32.add - i32.const 65535 - i32.const -1 - i32.xor - i32.and - i32.const 16 - i32.shr_u - set_local $2 - get_local $5 - tee_local $3 - get_local $2 - tee_local $6 - get_local $3 - get_local $6 - i32.gt_s - select - set_local $3 - get_local $3 - grow_memory - i32.const 0 - i32.lt_s - if - get_local $2 - grow_memory - i32.const 0 - i32.lt_s - if - unreachable - end - end - end - get_local $4 - set_global $~lib/allocator/arena/offset - get_local $1 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/memory/memory.allocate (; 12 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $~lib/memory/memory.allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/memory/memory.allocate (; 12 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/memory/memory.allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_local $0 - call $~lib/allocator/arena/__memory_allocate - return - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/allocator/arena/__memory_free (; 13 ;) (type $iv) (param $0 i32) - nop - ) - (func $~lib/memory/memory.free (; 14 ;) (type $iv) (param $0 i32) -======= - (func $~lib/allocator/arena/__memory_free (; 12 ;) (type $iv) (param $0 i32) - nop - ) - (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) ->>>>>>> Working on sections. -======= - (func $~lib/allocator/arena/__memory_free (; 13 ;) (type $iv) (param $0 i32) - nop - ) - (func $~lib/memory/memory.free (; 14 ;) (type $iv) (param $0 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/allocator/arena/__memory_free (; 12 ;) (type $iv) (param $0 i32) - nop - ) - (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_local $0 - call $~lib/allocator/arena/__memory_free - return - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/allocator/arena/__memory_reset (; 15 ;) (type $v) - get_global $~lib/allocator/arena/startOffset - set_global $~lib/allocator/arena/offset - ) - (func $~lib/memory/memory.reset (; 16 ;) (type $v) - call $~lib/allocator/arena/__memory_reset - return - ) - (func $assembly/host/index/log (; 17 ;) (type $iv) (param $0 i32) -======= - (func $~lib/allocator/arena/__memory_reset (; 14 ;) (type $v) -======= - (func $~lib/allocator/arena/__memory_reset (; 15 ;) (type $v) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/allocator/arena/__memory_reset (; 14 ;) (type $v) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_global $~lib/allocator/arena/startOffset - set_global $~lib/allocator/arena/offset - ) - (func $~lib/memory/memory.reset (; 15 ;) (type $v) - call $~lib/allocator/arena/__memory_reset - return - ) - (func $~lib/internal/arraybuffer/computeSize (; 16 ;) (type $ii) (param $0 i32) (result i32) - i32.const 1 - i32.const 32 - get_local $0 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - i32.const 1 - i32.sub - i32.clz - i32.sub - i32.shl - ) - (func $~lib/internal/arraybuffer/allocateUnsafe (; 17 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - get_local $0 - get_global $~lib/internal/arraybuffer/MAX_BLENGTH - i32.le_u - i32.eqz - if - i32.const 0 - i32.const 40 - i32.const 26 - i32.const 2 - call $~lib/env/abort - unreachable - end - block $~lib/memory/memory.allocate|inlined.0 (result i32) - get_local $0 - call $~lib/internal/arraybuffer/computeSize - set_local $2 - get_local $2 - call $~lib/allocator/arena/__memory_allocate - br $~lib/memory/memory.allocate|inlined.0 - end - set_local $1 - get_local $1 - get_local $0 - i32.store - get_local $1 - ) - (func $~lib/array/Array#constructor (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $1 - i32.const 268435454 - i32.gt_u - if - i32.const 0 - i32.const 8 - i32.const 45 - i32.const 39 - call $~lib/env/abort - unreachable - end - get_local $1 - i32.const 2 - i32.shl - set_local $2 - get_local $2 - call $~lib/internal/arraybuffer/allocateUnsafe - set_local $3 - get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 8 - call $~lib/memory/memory.allocate - set_local $4 - get_local $4 - i32.const 0 - i32.store - get_local $4 - i32.const 0 - i32.store offset=4 - get_local $4 - end - tee_local $0 - end - tee_local $0 - get_local $3 - i32.store - get_local $0 - get_local $1 - i32.store offset=4 - get_local $3 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - set_local $4 - i32.const 0 - set_local $5 - get_local $4 - get_local $5 - get_local $2 - call $~lib/internal/memory/memset - get_local $0 - ) - (func $~lib/array/Array#pop (; 19 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $0 - i32.load offset=4 - set_local $1 - get_local $1 - i32.const 1 - i32.lt_s - if - i32.const 0 - i32.const 8 - i32.const 246 - i32.const 20 - call $~lib/env/abort - unreachable - end - block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) - get_local $0 - i32.load - set_local $2 - get_local $1 - i32.const 1 - i32.sub - tee_local $1 - set_local $3 - i32.const 0 - set_local $4 - get_local $2 - get_local $3 - i32.const 2 - i32.shl - i32.add - get_local $4 - i32.add - i32.load offset=8 - end - set_local $5 - get_local $0 - get_local $1 - i32.store offset=4 - get_local $5 - ) - (func $~lib/array/Array#__get (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) ->>>>>>> Working on sections. - get_local $0 - call $assembly/host/index/_log_str - ) -<<<<<<< loader-memory-accessors - (func $~lib/internal/arraybuffer/computeSize (; 18 ;) (type $ii) (param $0 i32) (result i32) - i32.const 1 - i32.const 32 - get_local $0 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - i32.const 1 - i32.sub - i32.clz - i32.sub - i32.shl - ) - (func $~lib/internal/arraybuffer/allocateUnsafe (; 19 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - get_local $0 - get_global $~lib/internal/arraybuffer/MAX_BLENGTH - i32.le_u - i32.eqz - if - i32.const 0 - i32.const 88 - i32.const 26 - i32.const 2 - call $~lib/env/abort - unreachable - end - block $~lib/memory/memory.allocate|inlined.0 (result i32) - get_local $0 - call $~lib/internal/arraybuffer/computeSize - set_local $2 - get_local $2 - call $~lib/allocator/arena/__memory_allocate - br $~lib/memory/memory.allocate|inlined.0 - end - set_local $1 - get_local $1 - get_local $0 - i32.store - get_local $1 - ) -<<<<<<< loader-memory-accessors - (func $~lib/array/Array#constructor (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $1 - i32.const 268435454 - i32.gt_u - if - i32.const 0 - i32.const 56 - i32.const 45 - i32.const 39 - call $~lib/env/abort - unreachable - end - get_local $1 - i32.const 2 - i32.shl - set_local $2 - get_local $2 - call $~lib/internal/arraybuffer/allocateUnsafe - set_local $3 - get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 8 - call $~lib/memory/memory.allocate - set_local $4 - get_local $4 - i32.const 0 - i32.store - get_local $4 - i32.const 0 - i32.store offset=4 - get_local $4 - end - tee_local $0 - end - tee_local $0 - get_local $3 - i32.store - get_local $0 - get_local $1 - i32.store offset=4 - get_local $3 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - set_local $4 - i32.const 0 - set_local $5 - get_local $4 - get_local $5 - get_local $2 - call $~lib/internal/memory/memset - get_local $0 - ) - (func $~lib/array/Array#pop (; 21 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $0 - i32.load offset=4 - set_local $1 - get_local $1 - i32.const 1 - i32.lt_s - if - i32.const 0 - i32.const 56 - i32.const 246 - i32.const 20 - call $~lib/env/abort - unreachable - end - block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) - get_local $0 - i32.load - set_local $2 - get_local $1 - i32.const 1 - i32.sub - tee_local $1 - set_local $3 - i32.const 0 - set_local $4 - get_local $2 - get_local $3 - i32.const 2 - i32.shl - i32.add - get_local $4 - i32.add - i32.load offset=8 - end - set_local $5 - get_local $0 - get_local $1 - i32.store offset=4 - get_local $5 - ) - (func $~lib/array/Array#__get (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - get_local $0 - i32.load - set_local $2 - get_local $1 - get_local $2 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - i32.const 0 - set_local $3 - get_local $2 - get_local $1 - i32.const 2 - i32.shl - i32.add - get_local $3 - i32.add - i32.load offset=8 - else - unreachable - end - ) -<<<<<<< loader-memory-accessors - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $0 - i32.load - set_local $2 - get_local $1 - get_local $2 - i32.gt_s - if - get_local $1 - get_global $~lib/internal/arraybuffer/MAX_BLENGTH - i32.le_s - i32.eqz - if - i32.const 0 - i32.const 40 - i32.const 40 - i32.const 4 - call $~lib/env/abort - unreachable - end - get_local $1 - get_local $2 - call $~lib/internal/arraybuffer/computeSize - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.sub - i32.le_s - if - get_local $0 - get_local $1 - i32.store - else - get_local $1 - call $~lib/internal/arraybuffer/allocateUnsafe - set_local $3 - get_local $3 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - set_local $4 - get_local $0 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - set_local $5 - get_local $4 - get_local $5 - get_local $2 - call $~lib/internal/memory/memmove - block $~lib/memory/memory.free|inlined.0 - block - get_local $0 - call $~lib/allocator/arena/__memory_free - br $~lib/memory/memory.free|inlined.0 - unreachable - end - unreachable - end - get_local $3 - set_local $0 - end - get_local $0 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - get_local $2 - i32.add - set_local $3 - i32.const 0 - set_local $5 - get_local $1 - get_local $2 - i32.sub - set_local $4 - get_local $3 - get_local $5 - get_local $4 - call $~lib/internal/memory/memset - else - get_local $1 - get_local $2 - i32.lt_s - if - get_local $1 - i32.const 0 - i32.ge_s - i32.eqz - if - i32.const 0 - i32.const 40 - i32.const 62 - i32.const 4 - call $~lib/env/abort - unreachable - end - get_local $0 - get_local $1 - i32.store - end - end - get_local $0 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/array/Array#push (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $~lib/array/Array#push (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/array/Array#push (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/array/Array#push (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - get_local $0 - i32.load offset=4 - set_local $2 - get_local $0 - i32.load - set_local $3 - get_local $3 - i32.load - i32.const 2 - i32.shr_u - set_local $4 - get_local $2 - i32.const 1 - i32.add - set_local $5 - get_local $2 - get_local $4 - i32.ge_u - if - get_local $2 - i32.const 268435454 - i32.ge_u - if - i32.const 0 - i32.const 8 - i32.const 184 - i32.const 42 - call $~lib/env/abort - unreachable - end - get_local $3 - get_local $5 - i32.const 2 - i32.shl - call $~lib/internal/arraybuffer/reallocateUnsafe - set_local $3 - get_local $0 - get_local $3 - i32.store - end - get_local $0 - get_local $5 - i32.store offset=4 - i32.const 0 - set_local $6 - get_local $3 - get_local $2 - i32.const 2 - i32.shl - i32.add - get_local $6 - i32.add - get_local $1 - i32.store offset=8 - get_local $5 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/module/index/Module#getID (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $assembly/module/index/Module#getID (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/module/index/Module#getID (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/module/index/Module#getID (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - (local $3 i32) - (local $4 i32) - i32.const 0 - i32.const 0 - call $~lib/array/Array#constructor - set_local $2 - block $break|0 - loop $continue|0 - block $~lib/array/Array#get:length|inlined.1 (result i32) - get_local $2 - i32.load offset=4 - end - i32.const 0 - i32.gt_s - if - get_local $2 - call $~lib/array/Array#pop - drop - br $continue|0 - end - end - end - block $~lib/array/Array#get:length|inlined.2 (result i32) - get_local $0 - i32.load - set_local $3 - get_local $3 - i32.load offset=4 - end - set_local $3 - block $break|1 - i32.const 0 - set_local $4 - loop $repeat|1 - get_local $4 - get_local $3 - i32.lt_s - i32.eqz - br_if $break|1 - get_local $0 - i32.load - get_local $4 - call $~lib/array/Array#__get - i32.load offset=4 - get_local $1 - i32.eq - if - get_local $2 - get_local $0 - i32.load - get_local $4 - call $~lib/array/Array#__get - call $~lib/array/Array#push - drop - end - get_local $4 - i32.const 1 - i32.add - set_local $4 - br $repeat|1 - unreachable - end - unreachable - end - get_local $2 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/module/index/Section#constructor (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $assembly/module/index/Section#constructor (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/module/index/Section#constructor (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/module/index/Section#constructor (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 4 - call $~lib/memory/memory.allocate - set_local $2 - get_local $2 - get_local $1 - i32.store - get_local $2 - end - tee_local $0 - end - tee_local $0 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/buffer/index/Buffer#readVaruint (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $assembly/buffer/index/Buffer#readVaruint (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/buffer/index/Buffer#readVaruint (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/buffer/index/Buffer#readVaruint (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - i32.const 0 - set_local $2 - i32.const 0 - set_local $3 - get_local $0 - i32.load offset=8 - set_local $5 - block $break|0 - loop $continue|0 - block - block (result i32) - get_local $5 - tee_local $6 - i32.const 1 - i32.add - set_local $5 - get_local $6 - end - i32.load8_u - set_local $4 - get_local $2 - get_local $4 - i32.const 127 - i32.and - get_local $3 - i32.shl - i32.or - set_local $2 - get_local $4 - i32.const 128 - i32.and - i32.eqz - if - br $break|0 - end - get_local $3 - i32.const 7 - i32.add - set_local $3 - end - i32.const 1 - br_if $continue|0 - end - end - get_local $0 - get_local $5 - i32.store offset=8 - get_local $2 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/array/Array#constructor (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $~lib/array/Array#constructor (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/array/Array#constructor (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/array/Array#constructor (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $1 - i32.const 268435454 - i32.gt_u - if - i32.const 0 - i32.const 8 - i32.const 45 - i32.const 39 - call $~lib/env/abort - unreachable - end - get_local $1 - i32.const 2 - i32.shl - set_local $2 - get_local $2 - call $~lib/internal/arraybuffer/allocateUnsafe - set_local $3 - get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 8 - call $~lib/memory/memory.allocate - set_local $4 - get_local $4 - i32.const 0 - i32.store - get_local $4 - i32.const 0 - i32.store offset=4 - get_local $4 - end - tee_local $0 - end - tee_local $0 - get_local $3 - i32.store - get_local $0 - get_local $1 - i32.store offset=4 - get_local $3 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - set_local $4 - i32.const 0 - set_local $5 - get_local $4 - get_local $5 - get_local $2 - call $~lib/internal/memory/memset - get_local $0 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/buffer/index/Buffer#readVarint (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $assembly/buffer/index/Buffer#readVarint (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/buffer/index/Buffer#readVarint (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/buffer/index/Buffer#readVarint (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - i32.const 0 - set_local $2 - i32.const 0 - set_local $3 - get_local $0 - i32.load offset=8 - set_local $5 - block $break|0 - loop $continue|0 - block - block (result i32) - get_local $5 - tee_local $6 - i32.const 1 - i32.add - set_local $5 - get_local $6 - end - i32.load8_u - set_local $4 - get_local $2 - get_local $4 - i32.const 127 - i32.and - get_local $3 - i32.shl - i32.or - set_local $2 - get_local $3 - i32.const 7 - i32.add - set_local $3 - end - get_local $4 - i32.const 128 - i32.and - br_if $continue|0 - end - end - get_local $0 - get_local $5 - i32.store offset=8 - get_local $2 - i32.const 0 - i32.const -1 - i32.xor - get_local $3 - i32.shl - i32.or - get_local $2 - get_local $3 - get_local $1 - i32.lt_u - tee_local $6 - if (result i32) - get_local $4 - i32.const 64 - i32.and - i32.const 0 - i32.ne - else - get_local $6 - end - select - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/buffer/index/Buffer#readVarint8 (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $assembly/buffer/index/Buffer#readVarint8 (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/buffer/index/Buffer#readVarint8 (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/buffer/index/Buffer#readVarint8 (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_local $0 - get_local $1 - call $assembly/buffer/index/Buffer#readVarint - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/module/index/FuncType#constructor (; 31 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) -======= - (func $assembly/module/index/FuncType#constructor (; 28 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/module/index/FuncType#constructor (; 31 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/module/index/FuncType#constructor (; 29 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $3 i32) - get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 13 - call $~lib/memory/memory.allocate - set_local $3 - get_local $3 - i32.const 0 - i32.store - get_local $3 - i32.const 0 - i32.store offset=4 - get_local $3 - get_local $1 - i32.store offset=8 - get_local $3 - get_local $2 - i32.store8 offset=12 - get_local $3 - end - tee_local $0 - end - tee_local $0 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) -======= - (func $~lib/array/Array#__set (; 29 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Working on sections. -======= - (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/array/Array#__set (; 30 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $0 - i32.load - set_local $3 - get_local $3 - i32.load - i32.const 2 - i32.shr_u - set_local $4 - get_local $1 - get_local $4 - i32.ge_u - if - get_local $1 - i32.const 268435454 - i32.ge_u - if - i32.const 0 - i32.const 8 - i32.const 109 - i32.const 41 - call $~lib/env/abort - unreachable - end - get_local $3 - get_local $1 - i32.const 1 - i32.add - i32.const 2 - i32.shl - call $~lib/internal/arraybuffer/reallocateUnsafe - set_local $3 - get_local $0 - get_local $3 - i32.store - get_local $0 - get_local $1 - i32.const 1 - i32.add - i32.store offset=4 - end - i32.const 0 - set_local $5 - get_local $3 - get_local $1 - i32.const 2 - i32.shl - i32.add - get_local $5 - i32.add - get_local $2 - i32.store offset=8 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/array/Array#constructor (; 33 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $~lib/array/Array#constructor (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/array/Array#constructor (; 33 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/array/Array#constructor (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $1 - i32.const 268435454 - i32.gt_u - if - i32.const 0 - i32.const 8 - i32.const 45 - i32.const 39 - call $~lib/env/abort - unreachable - end - get_local $1 - i32.const 2 - i32.shl - set_local $2 - get_local $2 - call $~lib/internal/arraybuffer/allocateUnsafe - set_local $3 - get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 8 - call $~lib/memory/memory.allocate - set_local $4 - get_local $4 - i32.const 0 - i32.store - get_local $4 - i32.const 0 - i32.store offset=4 - get_local $4 - end - tee_local $0 - end - tee_local $0 - get_local $3 - i32.store - get_local $0 - get_local $1 - i32.store offset=4 - get_local $3 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - set_local $4 - i32.const 0 - set_local $5 - get_local $4 - get_local $5 - get_local $2 - call $~lib/internal/memory/memset - get_local $0 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/array/Array#__get (; 34 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $~lib/array/Array#__get (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/array/Array#__get (; 34 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/array/Array#__get (; 32 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - (local $3 i32) - get_local $0 - i32.load - set_local $2 - get_local $1 - get_local $2 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - i32.const 0 - set_local $3 - get_local $2 - get_local $1 - i32.const 2 - i32.shl - i32.add - get_local $3 - i32.add - i32.load offset=8 - else - unreachable - end - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/array/Array#__set (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) -======= - (func $~lib/array/Array#__set (; 32 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Working on sections. -======= - (func $~lib/array/Array#__set (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/array/Array#__set (; 33 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $0 - i32.load - set_local $3 - get_local $3 - i32.load - i32.const 2 - i32.shr_u - set_local $4 - get_local $1 - get_local $4 - i32.ge_u - if - get_local $1 - i32.const 268435454 - i32.ge_u - if - i32.const 0 - i32.const 8 - i32.const 109 - i32.const 41 - call $~lib/env/abort - unreachable - end - get_local $3 - get_local $1 - i32.const 1 - i32.add - i32.const 2 - i32.shl - call $~lib/internal/arraybuffer/reallocateUnsafe - set_local $3 - get_local $0 - get_local $3 - i32.store - get_local $0 - get_local $1 - i32.const 1 - i32.add - i32.store offset=4 - end - i32.const 0 - set_local $5 - get_local $3 - get_local $1 - i32.const 2 - i32.shl - i32.add - get_local $5 - i32.add - get_local $2 - i32.store offset=8 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/internal/number/decimalCount32 (; 36 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $~lib/internal/number/decimalCount32 (; 33 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/internal/number/decimalCount32 (; 36 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/internal/number/decimalCount32 (; 34 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $1 i32) - get_local $0 - i32.const 100000 - i32.lt_u - if - get_local $0 - i32.const 100 - i32.lt_u - if - i32.const 1 - i32.const 2 - get_local $0 - i32.const 10 - i32.lt_u - select - return - else - i32.const 4 - i32.const 5 - get_local $0 - i32.const 10000 - i32.lt_u - select - set_local $1 - i32.const 3 - get_local $1 - get_local $0 - i32.const 1000 - i32.lt_u - select - return - end - unreachable - unreachable - else - get_local $0 - i32.const 10000000 - i32.lt_u - if - i32.const 6 - i32.const 7 - get_local $0 - i32.const 1000000 - i32.lt_u - select - return - else - i32.const 9 - i32.const 10 - get_local $0 - i32.const 1000000000 - i32.lt_u - select - set_local $1 - i32.const 8 - get_local $1 - get_local $0 - i32.const 100000000 - i32.lt_u - select - return - end - unreachable - unreachable - end - unreachable - unreachable - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/internal/string/allocateUnsafe (; 37 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $~lib/internal/string/allocateUnsafe (; 34 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/internal/string/allocateUnsafe (; 37 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/internal/string/allocateUnsafe (; 35 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $1 i32) - (local $2 i32) - get_local $0 - i32.const 0 - i32.gt_s - tee_local $1 - if (result i32) - get_local $0 - get_global $~lib/internal/string/MAX_LENGTH - i32.le_s - else - get_local $1 - end - i32.eqz - if - i32.const 0 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 160 -======= - i32.const 128 ->>>>>>> Working on sections. -======= - i32.const 160 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 112 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - i32.const 14 - i32.const 2 - call $~lib/env/abort - unreachable - end - block $~lib/memory/memory.allocate|inlined.1 (result i32) - get_global $~lib/internal/string/HEADER_SIZE - get_local $0 - i32.const 1 - i32.shl - i32.add - set_local $1 - get_local $1 - call $~lib/allocator/arena/__memory_allocate - br $~lib/memory/memory.allocate|inlined.1 - end - set_local $2 - get_local $2 - get_local $0 - i32.store - get_local $2 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/internal/number/utoa32_lut (; 38 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) -======= - (func $~lib/internal/number/utoa32_lut (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Working on sections. -======= - (func $~lib/internal/number/utoa32_lut (; 38 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/internal/number/utoa32_lut (; 36 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i64) - (local $10 i64) - block $~lib/internal/number/DIGITS|inlined.0 (result i32) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 728 -======= - i32.const 696 ->>>>>>> Working on sections. -======= - i32.const 728 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 680 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - end - i32.load - set_local $3 - block $break|0 - loop $continue|0 - get_local $1 - i32.const 10000 - i32.ge_u - if - block - get_local $1 - i32.const 10000 - i32.div_u - set_local $4 - get_local $1 - i32.const 10000 - i32.rem_u - set_local $5 - get_local $4 - set_local $1 - get_local $5 - i32.const 100 - i32.div_u - set_local $6 - get_local $5 - i32.const 100 - i32.rem_u - set_local $7 - block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i64) - i32.const 0 - set_local $8 - get_local $3 - get_local $6 - i32.const 2 - i32.shl - i32.add - get_local $8 - i32.add - i64.load32_u offset=8 - end - set_local $9 - block $~lib/internal/arraybuffer/LOAD|inlined.1 (result i64) - i32.const 0 - set_local $8 - get_local $3 - get_local $7 - i32.const 2 - i32.shl - i32.add - get_local $8 - i32.add - i64.load32_u offset=8 - end - set_local $10 - get_local $2 - i32.const 4 - i32.sub - set_local $2 - get_local $0 - get_local $2 - i32.const 1 - i32.shl - i32.add - get_local $9 - get_local $10 - i64.const 32 - i64.shl - i64.or - i64.store offset=4 - end - br $continue|0 - end - end - end - get_local $1 - i32.const 100 - i32.ge_u - if - get_local $1 - i32.const 100 - i32.div_u - set_local $7 - get_local $1 - i32.const 100 - i32.rem_u - set_local $6 - get_local $7 - set_local $1 - get_local $2 - i32.const 2 - i32.sub - set_local $2 - block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) - i32.const 0 - set_local $5 - get_local $3 - get_local $6 - i32.const 2 - i32.shl - i32.add - get_local $5 - i32.add - i32.load offset=8 - end - set_local $5 - get_local $0 - get_local $2 - i32.const 1 - i32.shl - i32.add - get_local $5 - i32.store offset=4 - end - get_local $1 - i32.const 10 - i32.ge_u - if - get_local $2 - i32.const 2 - i32.sub - set_local $2 - block $~lib/internal/arraybuffer/LOAD|inlined.1 (result i32) - i32.const 0 - set_local $5 - get_local $3 - get_local $1 - i32.const 2 - i32.shl - i32.add - get_local $5 - i32.add - i32.load offset=8 - end - set_local $5 - get_local $0 - get_local $2 - i32.const 1 - i32.shl - i32.add - get_local $5 - i32.store offset=4 - else - get_local $2 - i32.const 1 - i32.sub - set_local $2 - get_global $~lib/internal/string/CharCode._0 - get_local $1 - i32.add - set_local $5 - get_local $0 - get_local $2 - i32.const 1 - i32.shl - i32.add - get_local $5 - i32.store16 offset=4 - end - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/internal/number/utoa32 (; 39 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $~lib/internal/number/utoa32 (; 36 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/internal/number/utoa32 (; 39 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/internal/number/utoa32 (; 37 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $1 i32) - (local $2 i32) - get_local $0 - i32.eqz - if -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 152 -======= - i32.const 120 ->>>>>>> Working on sections. -======= - i32.const 152 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 104 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - return - end - get_local $0 - call $~lib/internal/number/decimalCount32 - set_local $1 - get_local $1 - call $~lib/internal/string/allocateUnsafe - set_local $2 - get_local $2 - get_local $0 - get_local $1 - call $~lib/internal/number/utoa32_lut - get_local $2 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/internal/number/itoa (; 40 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $~lib/internal/number/itoa (; 37 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/internal/number/itoa (; 40 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/internal/number/itoa (; 38 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_local $0 - call $~lib/internal/number/utoa32 - return - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/internal/string/copyUnsafe (; 41 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) -======= - (func $assembly/module/index/typeName (; 38 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - block $break|0 - block $case7|0 - block $case6|0 - block $case5|0 - block $case4|0 - block $case3|0 - block $case2|0 - block $case1|0 - block $case0|0 - get_local $0 - set_local $1 - get_local $1 - i32.const 127 - i32.eq - br_if $case0|0 - get_local $1 - i32.const 126 - i32.eq - br_if $case1|0 - get_local $1 - i32.const 125 - i32.eq - br_if $case2|0 - get_local $1 - i32.const 124 - i32.eq - br_if $case3|0 - get_local $1 - i32.const 112 - i32.eq - br_if $case4|0 - get_local $1 - i32.const 96 - i32.eq - br_if $case5|0 - get_local $1 - i32.const 64 - i32.eq - br_if $case6|0 - br $case7|0 - end - i32.const 704 - return - end - i32.const 720 - return - end - i32.const 736 - return - end - i32.const 752 - return - end - i32.const 768 - return - end - i32.const 792 - return - end - i32.const 808 - return - end - unreachable - unreachable - end - unreachable - i32.const 824 - ) - (func $~lib/array/Array#__get (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - get_local $0 - i32.load - set_local $2 - get_local $1 - get_local $2 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - i32.const 0 - set_local $3 - get_local $2 - get_local $1 - i32.const 2 - i32.shl - i32.add - get_local $3 - i32.add - i32.load offset=8 - else - unreachable - end - ) - (func $~lib/internal/string/copyUnsafe (; 40 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) ->>>>>>> Working on sections. -======= - (func $~lib/internal/string/copyUnsafe (; 41 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/internal/string/copyUnsafe (; 39 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $5 i32) - (local $6 i32) - (local $7 i32) - get_local $0 - get_local $1 - i32.const 1 - i32.shl - i32.add - get_global $~lib/internal/string/HEADER_SIZE - i32.add - set_local $5 - get_local $2 - get_local $3 - i32.const 1 - i32.shl - i32.add - get_global $~lib/internal/string/HEADER_SIZE - i32.add - set_local $6 - get_local $4 - i32.const 1 - i32.shl - set_local $7 - get_local $5 - get_local $6 - get_local $7 - call $~lib/internal/memory/memmove - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/string/String#concat (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $~lib/string/String#concat (; 41 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/string/String#concat (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/string/String#concat (; 40 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $0 - i32.const 0 ->>>>>>> new Branch for parser - i32.ne - i32.eqz - if - i32.const 0 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 928 -======= - i32.const 848 ->>>>>>> Working on sections. -======= - i32.const 928 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 880 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - i32.const 110 - i32.const 4 - call $~lib/env/abort - unreachable - end - get_local $1 - i32.const 0 - i32.eq - if -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 912 -======= - i32.const 832 ->>>>>>> Working on sections. -======= - i32.const 912 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 864 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - set_local $1 - end - get_local $0 - i32.load - set_local $2 - get_local $1 - i32.load - set_local $3 - get_local $2 - get_local $3 - i32.add - set_local $4 - get_local $4 - i32.const 0 - i32.eq - if -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 960 -======= - i32.const 824 ->>>>>>> Working on sections. -======= - i32.const 960 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 912 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - return - end - get_local $4 - call $~lib/internal/string/allocateUnsafe - set_local $5 - get_local $5 - i32.const 0 - get_local $0 - i32.const 0 - get_local $2 - call $~lib/internal/string/copyUnsafe - get_local $5 - get_local $2 - get_local $1 - i32.const 0 - get_local $3 - call $~lib/internal/string/copyUnsafe - get_local $5 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/string/String.__concat (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.eqz - if - i32.const 912 -======= - (func $~lib/string/String.__concat (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.eqz - if - i32.const 832 ->>>>>>> Working on sections. -======= - (func $~lib/string/String.__concat (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.eqz - if - i32.const 912 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/string/String.__concat (; 41 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.eqz - if - i32.const 864 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - set_local $0 - end - get_local $0 - get_local $1 - call $~lib/string/String#concat - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - (func $assembly/host/index/err (; 44 ;) (type $iv) (param $0 i32) - i32.const 888 -======= - (func $assembly/host/index/log (; 42 ;) (type $iv) (param $0 i32) - get_local $0 - call $assembly/host/index/_log_str - ) - (func $assembly/host/index/err (; 43 ;) (type $iv) (param $0 i32) - i32.const 840 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_local $0 - call $~lib/string/String.__concat - call $assembly/host/index/log - unreachable - ) - (func $assembly/module/index/typeName (; 44 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) -<<<<<<< loader-memory-accessors -======= - block $break|0 - block $case7|0 - block $case6|0 - block $case5|0 - block $case4|0 - block $case3|0 - block $case2|0 - block $case1|0 - block $case0|0 - get_local $0 - set_local $1 - get_local $1 - i32.const 127 - i32.eq - br_if $case0|0 - get_local $1 - i32.const 126 - i32.eq - br_if $case1|0 - get_local $1 - i32.const 125 - i32.eq - br_if $case2|0 - get_local $1 - i32.const 124 - i32.eq - br_if $case3|0 - get_local $1 - i32.const 112 - i32.eq - br_if $case4|0 - get_local $1 - i32.const 96 - i32.eq - br_if $case5|0 - get_local $1 - i32.const 64 - i32.eq - br_if $case6|0 - br $case7|0 - end - i32.const 736 - return - end - i32.const 752 - return - end - i32.const 768 - return - end - i32.const 784 - return - end - i32.const 800 - return - end - i32.const 824 - return - end - i32.const 840 - return - end - i32.const 856 - call $assembly/host/index/err - end - i32.const 960 - ) - (func $~lib/array/Array#__get (; 46 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - get_local $0 - i32.load - set_local $2 - get_local $1 - get_local $2 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - i32.const 0 - set_local $3 - get_local $2 - get_local $1 - i32.const 2 - i32.shl - i32.add - get_local $3 - i32.add - i32.load offset=8 - else - unreachable - end - ) - (func $assembly/module/index/FuncType#toString (; 47 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $0 - i32.load offset=8 - call $~lib/internal/number/itoa - set_local $1 - get_local $0 - i32.load8_s offset=12 - call $assembly/module/index/typeName - set_local $2 - i32.const 960 - set_local $3 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - block $break|0 - block $case7|0 - block $case6|0 - block $case5|0 - block $case4|0 - block $case3|0 - block $case2|0 - block $case1|0 - block $case0|0 - get_local $0 - set_local $1 - get_local $1 - i32.const 127 - i32.eq - br_if $case0|0 - get_local $1 - i32.const 126 - i32.eq - br_if $case1|0 - get_local $1 - i32.const 125 - i32.eq - br_if $case2|0 - get_local $1 - i32.const 124 - i32.eq - br_if $case3|0 - get_local $1 - i32.const 112 - i32.eq - br_if $case4|0 - get_local $1 - i32.const 96 - i32.eq - br_if $case5|0 - get_local $1 - i32.const 64 - i32.eq - br_if $case6|0 - br $case7|0 - end - i32.const 688 - return - end - i32.const 704 - return - end - i32.const 720 - return - end - i32.const 736 - return - end - i32.const 752 - return - end - i32.const 776 - return - end - i32.const 792 - return - end - i32.const 808 - call $assembly/host/index/err - end - i32.const 912 - ) - (func $~lib/array/Array#__get (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - get_local $0 - i32.load - set_local $2 - get_local $1 - get_local $2 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - i32.const 0 - set_local $3 - get_local $2 - get_local $1 - i32.const 2 - i32.shl - i32.add - get_local $3 - i32.add - i32.load offset=8 - else - unreachable - end - ) -<<<<<<< loader-memory-accessors - (func $assembly/module/index/FuncType#toString (; 47 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $assembly/module/index/FuncType#toString (; 43 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/module/index/FuncType#toString (; 46 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $0 - i32.load offset=8 - call $~lib/internal/number/itoa - set_local $1 - get_local $0 - i32.load8_s offset=12 - call $assembly/module/index/typeName - set_local $2 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 960 -======= - i32.const 824 ->>>>>>> Working on sections. -======= - i32.const 912 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - set_local $3 - block $break|0 - i32.const 0 - set_local $4 - loop $repeat|0 - get_local $4 - block $~lib/array/Array#get:length|inlined.1 (result i32) - get_local $0 - i32.load - set_local $5 - get_local $5 - i32.load offset=4 - end - i32.lt_s - i32.eqz - br_if $break|0 - block - get_local $3 - get_local $0 - i32.load - get_local $4 - call $~lib/array/Array#__get - call $assembly/module/index/typeName - call $~lib/string/String.__concat - set_local $3 - get_local $4 - block $~lib/array/Array#get:length|inlined.3 (result i32) - get_local $0 - i32.load - set_local $5 - get_local $5 - i32.load offset=4 - end - i32.const 1 - i32.sub - i32.lt_s - if (result i32) - get_local $3 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 968 -======= - i32.const 880 ->>>>>>> Working on sections. -======= - i32.const 968 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 920 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - call $~lib/string/String.__concat - tee_local $3 - else - get_local $3 - end - set_local $3 - end - get_local $4 - i32.const 1 - i32.add - set_local $4 - br $repeat|0 - unreachable - end - unreachable - end - block $~lib/array/Array#get:length|inlined.5 (result i32) - get_local $0 - i32.load offset=4 - set_local $4 - get_local $4 - i32.load offset=4 - end - i32.const 1 - i32.eq - if (result i32) - get_local $0 - i32.load offset=4 - i32.const 0 - call $~lib/array/Array#__get - call $assembly/module/index/typeName - else -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 976 -======= - i32.const 928 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - end - set_local $4 - i32.const 944 - get_local $1 - call $~lib/string/String.__concat - i32.const 920 - call $~lib/string/String.__concat - i32.const 968 - call $~lib/string/String.__concat - get_local $2 - call $~lib/string/String.__concat - i32.const 984 - call $~lib/string/String.__concat - get_local $3 - call $~lib/string/String.__concat -<<<<<<< loader-memory-accessors - i32.const 1048 -======= - i32.const 888 -======= - i32.const 976 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - end - set_local $4 - i32.const 992 - get_local $1 - call $~lib/string/String.__concat - i32.const 968 - call $~lib/string/String.__concat - i32.const 1016 - call $~lib/string/String.__concat - get_local $2 - call $~lib/string/String.__concat - i32.const 1032 - call $~lib/string/String.__concat - get_local $3 - call $~lib/string/String.__concat -<<<<<<< loader-memory-accessors - i32.const 960 ->>>>>>> Working on sections. -======= - i32.const 1048 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 1000 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - call $~lib/string/String.__concat - get_local $4 - call $~lib/string/String.__concat - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/module/index/TypeSection#parse (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $assembly/host/index/log (; 44 ;) (type $iv) (param $0 i32) - get_local $0 - call $assembly/host/index/_log_str - ) - (func $assembly/module/index/TypeSection#parse (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/module/index/TypeSection#parse (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/module/index/TypeSection#parse (; 47 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (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) - get_local $1 - get_local $0 - i32.load - i32.load offset=12 - i32.store offset=8 - get_local $1 - i32.const 32 - call $assembly/buffer/index/Buffer#readVaruint - set_local $2 - i32.const 0 - get_local $2 - call $~lib/array/Array#constructor - set_local $3 - block $break|0 - i32.const 0 - set_local $4 - loop $repeat|0 - get_local $4 - get_local $2 - i32.lt_u - i32.eqz - br_if $break|0 - block - get_local $1 - i32.const 7 - call $assembly/buffer/index/Buffer#readVarint8 - i32.const 127 - i32.and - set_local $5 - i32.const 0 - get_local $4 - get_local $5 - call $assembly/module/index/FuncType#constructor - set_local $6 - get_local $3 - get_local $4 - get_local $6 - call $~lib/array/Array#__set - get_local $1 - i32.const 32 - call $assembly/buffer/index/Buffer#readVaruint - set_local $7 - get_local $6 - i32.const 0 - get_local $7 - call $~lib/array/Array#constructor - i32.store - block $break|1 - i32.const 0 - set_local $8 - loop $repeat|1 - get_local $8 - get_local $7 - i32.lt_u - i32.eqz - br_if $break|1 - block - get_local $1 - i32.const 7 - call $assembly/buffer/index/Buffer#readVarint8 - i32.const 127 - i32.and - set_local $9 - get_local $3 - get_local $4 - call $~lib/array/Array#__get - i32.load - get_local $8 - get_local $9 - call $~lib/array/Array#__set - end - get_local $8 - i32.const 1 - i32.add - set_local $8 - br $repeat|1 - unreachable - end - unreachable - end - get_local $1 - i32.const 1 - call $assembly/buffer/index/Buffer#readVaruint - set_local $8 - get_local $3 - get_local $4 - call $~lib/array/Array#__get - i32.const 0 - get_local $8 - call $~lib/array/Array#constructor - i32.store offset=4 - block $break|2 - i32.const 0 - set_local $9 - loop $repeat|2 - get_local $9 - get_local $8 - i32.lt_u - i32.eqz - br_if $break|2 - block - get_local $1 - i32.const 7 - call $assembly/buffer/index/Buffer#readVarint8 - i32.const 127 - i32.and - set_local $10 - get_local $3 - get_local $4 - call $~lib/array/Array#__get - i32.load offset=4 - get_local $9 - get_local $10 - call $~lib/array/Array#__set - end - get_local $9 - i32.const 1 - i32.add - set_local $9 - br $repeat|2 - unreachable - end - unreachable - end - get_local $3 - get_local $4 - call $~lib/array/Array#__get - call $assembly/module/index/FuncType#toString - call $assembly/host/index/log - end - get_local $4 - i32.const 1 - i32.add - set_local $4 - br $repeat|0 - unreachable - end - unreachable + i32.store8 + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 + i32.load8_u + i32.store8 + get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $1 + i32.load8_u + i32.store8 + get_local $0 + i32.const 1 + i32.add + tee_local $4 + i32.const 1 + i32.add + set_local $0 + get_local $1 + i32.const 1 + i32.add + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $4 + get_local $3 + i32.load8_u + i32.store8 end - get_local $0 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/array/Array#push (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $~lib/array/Array#push (; 46 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/array/Array#push (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/array/Array#push (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - get_local $0 - i32.load offset=4 - set_local $2 - get_local $0 - i32.load - set_local $3 - get_local $3 - i32.load - i32.const 2 - i32.shr_u - set_local $4 - get_local $2 - i32.const 1 - i32.add - set_local $5 get_local $2 - get_local $4 - i32.ge_u + i32.const 4 + i32.and if - get_local $2 - i32.const 268435454 - i32.ge_u - if - i32.const 0 - i32.const 8 - i32.const 184 - i32.const 42 - call $~lib/env/abort - unreachable - end + get_local $0 + get_local $1 + tee_local $3 + i32.load8_u + i32.store8 + get_local $0 + i32.const 1 + i32.add + tee_local $1 + set_local $0 + get_local $1 get_local $3 - get_local $5 - i32.const 2 - i32.shl - call $~lib/internal/arraybuffer/reallocateUnsafe - set_local $3 + i32.const 1 + i32.add + tee_local $1 + i32.load8_u + i32.store8 get_local $0 + i32.const 1 + i32.add + tee_local $3 + set_local $0 get_local $3 - i32.store + get_local $1 + i32.const 1 + i32.add + tee_local $1 + i32.load8_u + i32.store8 + get_local $0 + i32.const 1 + i32.add + tee_local $4 + i32.const 1 + i32.add + set_local $0 + get_local $1 + i32.const 1 + i32.add + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $4 + get_local $3 + i32.load8_u + i32.store8 end - get_local $0 - get_local $5 - i32.store offset=4 - i32.const 0 - set_local $6 - get_local $3 get_local $2 i32.const 2 - i32.shl - i32.add - get_local $6 - i32.add - get_local $1 - i32.store offset=8 - get_local $5 + i32.and + if + get_local $0 + get_local $1 + i32.load8_u + i32.store8 + get_local $0 + i32.const 1 + i32.add + tee_local $4 + i32.const 1 + i32.add + set_local $0 + get_local $1 + i32.const 1 + i32.add + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $4 + get_local $3 + i32.load8_u + i32.store8 + end + get_local $2 + i32.const 1 + i32.and + if + get_local $1 + set_local $3 + get_local $0 + get_local $1 + i32.load8_u + i32.store8 + end ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/array/Array#join (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $~lib/array/Array#join (; 47 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/array/Array#join (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/array/Array#join (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) + (func $~lib/internal/memory/memmove (; 5 ;) (type $iiiv) (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 $11 i32) - (local $12 i32) get_local $0 - i32.load offset=4 - i32.const 1 - i32.sub - set_local $2 - get_local $2 - i32.const 0 - i32.lt_s + get_local $1 + i32.eq if -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 960 - return - end - i32.const 960 -======= - i32.const 824 - return - end - i32.const 824 ->>>>>>> Working on sections. -======= - i32.const 960 - return - end - i32.const 960 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 912 return end - i32.const 912 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - set_local $3 - get_local $0 - i32.load - set_local $5 get_local $1 - i32.load - set_local $6 - get_local $6 - i32.const 0 - i32.ne - set_local $7 get_local $2 + i32.add + get_local $0 + i32.le_u + tee_local $3 i32.eqz if - block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) - i32.const 0 - set_local $8 - i32.const 0 -<<<<<<< loader-memory-accessors - set_local $4 -======= - set_local $9 - get_local $5 - get_local $8 - i32.const 2 - i32.shl - i32.add - get_local $9 - i32.add - i32.load offset=8 - end - return + get_local $0 + get_local $2 + i32.add + get_local $1 + i32.le_u + set_local $3 end - i32.const 0 - set_local $9 - block $break|0 - block ->>>>>>> new Branch for parser - i32.const 0 - set_local $8 - get_local $2 - i32.const 1 - i32.add - set_local $10 - end - loop $repeat|0 - get_local $8 - get_local $10 - i32.lt_s - i32.eqz - br_if $break|0 - get_local $9 - block $~lib/internal/arraybuffer/LOAD|inlined.1 (result i32) - i32.const 0 - set_local $11 - get_local $5 - get_local $8 - i32.const 2 - i32.shl - i32.add - get_local $11 - i32.add - i32.load offset=8 - end - i32.load - i32.add - set_local $9 - get_local $8 - i32.const 1 - i32.add - set_local $8 - br $repeat|0 - unreachable - end - unreachable + get_local $3 + if + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memcpy + return end - i32.const 0 - set_local $10 - get_local $9 - get_local $6 - get_local $2 - i32.mul - i32.add - call $~lib/internal/string/allocateUnsafe - set_local $8 - block $break|1 - i32.const 0 - set_local $11 - loop $repeat|1 - get_local $11 - get_local $2 - i32.lt_s - i32.eqz - br_if $break|1 - block - block $~lib/internal/arraybuffer/LOAD|inlined.2 (result i32) - i32.const 0 - set_local $12 - get_local $5 - get_local $11 - i32.const 2 - i32.shl + get_local $0 + get_local $1 + i32.lt_u + if + get_local $1 + i32.const 7 + i32.and + get_local $0 + i32.const 7 + i32.and + i32.eq + if + loop $continue|0 + get_local $0 + i32.const 7 + i32.and + if + get_local $2 + i32.eqz + if + return + end + get_local $2 + i32.const 1 + i32.sub + set_local $2 + get_local $0 + tee_local $4 + tee_local $3 + i32.const 1 i32.add - get_local $12 + set_local $0 + get_local $1 + tee_local $3 + i32.const 1 i32.add - i32.load offset=8 + set_local $1 + get_local $4 + get_local $3 + i32.load8_u + i32.store8 + br $continue|0 end -<<<<<<< loader-memory-accessors - else - get_global $assembly/index/off - set_local $5 - call $assembly/index/readVaruint - tee_local $0 - get_global $assembly/index/off + end + loop $continue|1 + get_local $2 + i32.const 8 + i32.ge_u + if + get_local $0 + get_local $1 + i64.load + i64.store + get_local $2 + i32.const 8 + i32.sub + set_local $2 + get_local $0 + i32.const 8 + i32.add + set_local $0 + get_local $1 + i32.const 8 + i32.add + set_local $1 + br $continue|1 + end + end + end + loop $continue|2 + get_local $2 + if + get_local $0 tee_local $4 + tee_local $3 + i32.const 1 i32.add - set_global $assembly/index/off - get_local $8 - get_global $assembly/index/off - get_local $5 - i32.sub - i32.sub - set_local $8 -======= - set_local $4 + set_local $0 + get_local $1 + tee_local $3 + i32.const 1 + i32.add + set_local $1 get_local $4 + get_local $3 + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + br $continue|2 + end + end + else + get_local $1 + i32.const 7 + i32.and + get_local $0 + i32.const 7 + i32.and + i32.eq + if + loop $continue|3 + get_local $0 + get_local $2 + i32.add + i32.const 7 + i32.and if - get_local $4 - i32.load - set_local $12 - get_local $8 - get_local $10 - get_local $4 - i32.const 0 - get_local $12 - call $~lib/internal/string/copyUnsafe - get_local $10 - get_local $12 + get_local $2 + i32.eqz + if + return + end + get_local $2 + i32.const 1 + i32.sub + tee_local $2 + get_local $0 + i32.add + get_local $1 + get_local $2 i32.add - set_local $10 + i32.load8_u + i32.store8 + br $continue|3 end - get_local $7 + end + loop $continue|4 + get_local $2 + i32.const 8 + i32.ge_u if - get_local $8 - get_local $10 + get_local $2 + i32.const 8 + i32.sub + tee_local $2 + get_local $0 + i32.add get_local $1 - i32.const 0 - get_local $6 - call $~lib/internal/string/copyUnsafe - get_local $10 - get_local $6 + get_local $2 i32.add - set_local $10 + i64.load + i64.store + br $continue|4 end ->>>>>>> new Branch for parser end - get_local $11 - i32.const 1 - i32.add - set_local $11 - br $repeat|1 - unreachable end - unreachable - end - block $~lib/internal/arraybuffer/LOAD|inlined.3 (result i32) - i32.const 0 - set_local $11 - get_local $5 - get_local $2 - i32.const 2 - i32.shl - i32.add - get_local $11 - i32.add - i32.load offset=8 - end - set_local $4 - get_local $4 - if - get_local $4 - i32.load - set_local $11 - get_local $8 - get_local $10 - get_local $4 - i32.const 0 - get_local $11 - call $~lib/internal/string/copyUnsafe - end - get_local $8 - return - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/module/index/TypeSection#toString (; 51 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - i32.const 1072 -======= - (func $assembly/module/index/TypeSection#toString (; 48 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - i32.const 984 ->>>>>>> Working on sections. -======= - (func $assembly/module/index/TypeSection#toString (; 51 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - i32.const 1072 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/module/index/TypeSection#toString (; 50 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - i32.const 1024 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - set_local $1 - block $break|0 - i32.const 0 - set_local $2 - loop $repeat|0 + loop $continue|5 get_local $2 -<<<<<<< loader-memory-accessors - get_global $assembly/index/off - tee_local $5 - get_local $8 - get_local $4 - get_local $0 - call $assembly/options/onSection if - block $break|1 - block $case12|1 - block $case11|1 - block $case8|1 - block $case7|1 - block $case6|1 - block $case5|1 - block $case4|1 - block $case3|1 - block $case2|1 - block $case1|1 - get_global $src/common/SectionId.Type - get_local $2 - i32.ne - if - get_global $src/common/SectionId.Import - get_local $2 - i32.eq - br_if $case1|1 - get_global $src/common/SectionId.Function - get_local $2 - i32.eq - br_if $case2|1 - get_global $src/common/SectionId.Table - get_local $2 - i32.eq - br_if $case3|1 - get_global $src/common/SectionId.Memory - get_local $2 - i32.eq - br_if $case4|1 - get_global $src/common/SectionId.Global - get_local $2 - i32.eq - br_if $case5|1 - get_global $src/common/SectionId.Export - get_local $2 - i32.eq - br_if $case6|1 - get_global $src/common/SectionId.Start - get_local $2 - i32.eq - br_if $case7|1 - get_global $src/common/SectionId.Custom - get_local $2 - i32.eq - br_if $case8|1 - get_global $src/common/SectionId.Element - get_local $2 - i32.eq - br_if $case11|1 - get_global $src/common/SectionId.Code - get_local $2 - i32.eq - br_if $case11|1 - get_global $src/common/SectionId.Data - get_local $2 - i32.eq - br_if $case11|1 - br $case12|1 - end - call $assembly/index/readVaruint - set_local $2 - i32.const 0 - set_local $3 - loop $repeat|2 - get_local $3 - get_local $2 - i32.lt_u - if - get_local $3 - i32.const 7 - call $assembly/index/readVarint - i32.const 127 - i32.and - call $assembly/options/onType - call $assembly/index/readVaruint - set_local $5 - i32.const 0 - set_local $7 - loop $repeat|3 - get_local $7 - get_local $5 - i32.lt_u - if - get_local $3 - get_local $7 - i32.const 7 - call $assembly/index/readVarint - i32.const 127 - i32.and - call $assembly/options/onTypeParam - get_local $7 - i32.const 1 - i32.add - set_local $7 - br $repeat|3 - end - end - call $assembly/index/readVaruint - set_local $7 - i32.const 0 - set_local $4 - loop $repeat|4 - get_local $4 - get_local $7 - i32.lt_u - if - get_local $3 - get_local $4 - i32.const 7 - call $assembly/index/readVarint - i32.const 127 - i32.and - call $assembly/options/onTypeReturn - get_local $4 - i32.const 1 - i32.add - set_local $4 - br $repeat|4 - end - end - get_local $3 - i32.const 1 - i32.add - set_local $3 - br $repeat|2 - end - end - br $break|1 - end - call $assembly/index/readVaruint - set_local $2 - i32.const 0 - set_local $3 - loop $repeat|5 - get_local $3 - get_local $2 - i32.lt_u - if - call $assembly/index/readVaruint - set_local $7 - get_local $7 - get_global $assembly/index/off - tee_local $5 - i32.add - set_global $assembly/index/off - call $assembly/index/readVaruint - set_local $9 - get_local $9 - get_global $assembly/index/off - tee_local $4 - i32.add - set_global $assembly/index/off - get_global $assembly/index/off - tee_local $6 - i32.load8_u - set_local $0 - get_local $6 - i32.const 1 - i32.add - set_global $assembly/index/off - get_local $3 - get_local $0 - get_local $5 - get_local $7 - get_local $4 - get_local $9 - call $assembly/options/onImport - block $break|6 - block $case4|6 - block $case3|6 - block $case2|6 - block $case1|6 - get_local $0 - tee_local $6 - get_global $src/common/ExternalKind.Function - i32.ne - if - get_global $src/common/ExternalKind.Table - get_local $6 - i32.eq - br_if $case1|6 - get_global $src/common/ExternalKind.Memory - get_local $6 - i32.eq - br_if $case2|6 - get_global $src/common/ExternalKind.Global - get_local $6 - i32.eq - br_if $case3|6 - br $case4|6 - end - get_local $11 - tee_local $10 - i32.const 1 - i32.add - set_local $11 - get_local $10 - call $assembly/index/readVaruint - call $assembly/options/onFunctionImport - br $break|6 - end - i32.const 7 - call $assembly/index/readVarint - i32.const 127 - i32.and - set_local $6 - call $assembly/index/readVaruint - set_local $10 - get_local $12 - tee_local $0 - i32.const 1 - i32.add - set_local $12 - get_local $0 - get_local $6 - call $assembly/index/readVaruint - get_local $10 - i32.const 1 - i32.and - if (result i32) - call $assembly/index/readVaruint - else - i32.const -1 - end - get_local $10 - call $assembly/options/onTableImport - br $break|6 - end - call $assembly/index/readVaruint - set_local $8 - get_local $13 - tee_local $6 - i32.const 1 - i32.add - set_local $13 - get_local $6 - call $assembly/index/readVaruint - get_local $8 - i32.const 1 - i32.and - if (result i32) - call $assembly/index/readVaruint - else - i32.const 65535 - end - get_local $8 - call $assembly/options/onMemoryImport - br $break|6 - end - get_local $14 - tee_local $8 - i32.const 1 - i32.add - set_local $14 - get_local $8 - i32.const 7 - call $assembly/index/readVarint - i32.const 127 - i32.and - call $assembly/index/readVaruint - call $assembly/options/onGlobalImport - br $break|6 - end - unreachable - end - get_local $3 - i32.const 1 - i32.add - set_local $3 - br $repeat|5 - end - end - br $break|1 - end - call $assembly/index/readVaruint - set_local $2 - i32.const 0 - set_local $3 - loop $repeat|7 - get_local $3 - get_local $2 - i32.lt_u - if - get_local $11 - tee_local $4 - i32.const 1 - i32.add - set_local $11 - get_local $4 - call $assembly/index/readVaruint - call $assembly/options/onFunction - get_local $3 - i32.const 1 - i32.add - set_local $3 - br $repeat|7 - end - end - br $break|1 - end - call $assembly/index/readVaruint - set_local $2 - i32.const 0 - set_local $3 - loop $repeat|8 - get_local $3 - get_local $2 - i32.lt_u - if - call $assembly/index/readVaruint - i32.const 127 - i32.and - set_local $0 - call $assembly/index/readVaruint - set_local $4 - get_local $12 - tee_local $7 - i32.const 1 - i32.add - set_local $12 - get_local $7 - get_local $0 - call $assembly/index/readVaruint - get_local $4 - i32.const 1 - i32.and - if (result i32) - call $assembly/index/readVaruint - else - i32.const -1 - end - get_local $4 - call $assembly/options/onTable - get_local $3 - i32.const 1 - i32.add - set_local $3 - br $repeat|8 - end - end - br $break|1 - end - call $assembly/index/readVaruint - set_local $2 - i32.const 0 - set_local $3 - loop $repeat|9 - get_local $3 - get_local $2 - i32.lt_u - if - call $assembly/index/readVaruint - set_local $5 - get_local $13 - tee_local $0 - i32.const 1 - i32.add - set_local $13 - get_local $0 - call $assembly/index/readVaruint - get_local $5 - i32.const 1 - i32.and - if (result i32) - call $assembly/index/readVaruint - else - i32.const 65535 - end - get_local $5 - call $assembly/options/onMemory - get_local $3 - i32.const 1 - i32.add - set_local $3 - br $repeat|9 - end - end - br $break|1 - end - call $assembly/index/readVaruint - set_local $2 - i32.const 0 - set_local $3 - loop $repeat|10 - get_local $3 - get_local $2 - i32.lt_u - if - i32.const 7 - call $assembly/index/readVarint - i32.const 127 - i32.and - set_local $4 - call $assembly/index/readVaruint - set_local $9 - call $assembly/index/skipInitExpr - get_local $14 - tee_local $5 - i32.const 1 - i32.add - set_local $14 - get_local $5 - get_local $4 - get_local $9 - call $assembly/options/onGlobal - get_local $3 - i32.const 1 - i32.add - set_local $3 - br $repeat|10 - end - end - br $break|1 - end - call $assembly/index/readVaruint - set_local $2 - i32.const 0 - set_local $3 - loop $repeat|11 - get_local $3 - get_local $2 - i32.lt_u - if - call $assembly/index/readVaruint - set_local $9 - get_local $9 - get_global $assembly/index/off - tee_local $4 - i32.add - set_global $assembly/index/off - get_global $assembly/index/off - tee_local $0 - i32.load8_u - set_local $6 - get_local $0 - i32.const 1 - i32.add - set_global $assembly/index/off - get_local $3 - get_local $6 - call $assembly/index/readVaruint - get_local $4 - get_local $9 - call $assembly/options/onExport - get_local $3 - i32.const 1 - i32.add - set_local $3 - br $repeat|11 - end - end - br $break|1 - end - call $assembly/index/readVaruint - call $assembly/options/onStart - br $break|1 -======= - block $~lib/array/Array#get:length|inlined.1 (result i32) + get_local $2 + i32.const 1 + i32.sub + tee_local $2 get_local $0 - i32.load offset=4 - set_local $3 - get_local $3 - i32.load offset=4 - end - i32.lt_s - i32.eqz - br_if $break|0 - get_local $1 - get_local $0 - i32.load offset=4 - get_local $2 - call $~lib/array/Array#__get - call $assembly/module/index/FuncType#toString - call $~lib/array/Array#push - drop - get_local $2 - i32.const 1 - i32.add - set_local $2 - br $repeat|0 - unreachable - end - unreachable - end - get_local $1 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 1080 - call $~lib/array/Array#join - ) - (func $assembly/index/getType (; 52 ;) (type $ii) (param $0 i32) (result i32) -======= - i32.const 992 - call $~lib/array/Array#join - ) - (func $assembly/index/getType (; 49 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - i32.const 1080 - call $~lib/array/Array#join - ) - (func $assembly/index/getType (; 52 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 1032 - call $~lib/array/Array#join + i32.add + get_local $1 + get_local $2 + i32.add + i32.load8_u + i32.store8 + br $continue|5 + end + end + end ) - (func $assembly/index/getType (; 51 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $1 i32) - (local $2 i32) + (func $~lib/memory/memory.copy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 - get_global $src/common/SectionId.Type - call $assembly/module/index/Module#getID - set_local $1 - i32.const 0 get_local $1 - i32.const 0 - call $~lib/array/Array#__get - call $assembly/module/index/Section#constructor - set_local $2 get_local $2 - get_local $0 - i32.load offset=4 - call $assembly/module/index/TypeSection#parse - set_global $assembly/index/type - get_global $assembly/index/type - call $assembly/module/index/TypeSection#toString - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/array/Array#constructor (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $assembly/host/index/log (; 50 ;) (type $iv) (param $0 i32) - get_local $0 - call $assembly/host/index/_logi + call $~lib/internal/memory/memmove ) - (func $~lib/array/Array#constructor (; 51 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/array/Array#constructor (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/array/Array#constructor (; 52 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) + (func $~lib/internal/memory/memcmp (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - (local $4 i32) - (local $5 i32) + get_local $0 get_local $1 - i32.const 268435454 - i32.gt_u + i32.eq if i32.const 0 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 56 -======= - i32.const 24 ->>>>>>> Working on sections. -======= - i32.const 56 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 8 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - i32.const 45 - i32.const 39 - call $~lib/env/abort - unreachable + return + end + loop $continue|0 + get_local $2 + i32.const 0 + i32.ne + tee_local $3 + if + get_local $0 + i32.load8_u + get_local $1 + i32.load8_u + i32.eq + set_local $3 + end + get_local $3 + if + get_local $2 + i32.const 1 + i32.sub + set_local $2 + get_local $0 + i32.const 1 + i32.add + set_local $0 + get_local $1 + i32.const 1 + i32.add + set_local $1 + br $continue|0 + end end - get_local $1 - i32.const 2 - i32.shl - set_local $2 get_local $2 - call $~lib/internal/arraybuffer/allocateUnsafe - set_local $3 - get_local $0 if (result i32) get_local $0 + i32.load8_u + get_local $1 + i32.load8_u + i32.sub else - block (result i32) - i32.const 8 - call $~lib/memory/memory.allocate - set_local $4 - get_local $4 - i32.const 0 - i32.store - get_local $4 - i32.const 0 - i32.store offset=4 - get_local $4 - end - tee_local $0 + i32.const 0 end tee_local $0 - get_local $3 - i32.store + ) + (func $~lib/memory/memory.compare (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) get_local $0 get_local $1 - i32.store offset=4 - get_local $3 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - set_local $4 - i32.const 0 - set_local $5 - get_local $4 - get_local $5 get_local $2 - call $~lib/internal/memory/memset - get_local $0 + call $~lib/internal/memory/memcmp ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/string/String.fromUTF8 (; 54 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $~lib/string/String.fromUTF8 (; 52 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/string/String.fromUTF8 (; 54 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/string/String.fromUTF8 (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $~lib/allocator/arena/__memory_allocate (; 9 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) (local $2 i32) (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - get_local $1 - i32.const 1 - i32.lt_u + get_local $0 + i32.const 1073741824 + i32.gt_u if -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 960 -======= - i32.const 824 ->>>>>>> Working on sections. -======= - i32.const 960 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 912 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - return + unreachable end - i32.const 0 - set_local $2 - block $~lib/memory/memory.allocate|inlined.2 (result i32) + get_global $~lib/allocator/arena/offset + tee_local $1 + get_local $0 + i32.const 1 + get_local $0 + i32.const 1 + i32.gt_u + select + i32.add + i32.const 7 + i32.add + i32.const -8 + i32.and + tee_local $2 + current_memory + tee_local $3 + i32.const 16 + i32.shl + i32.gt_u + if + get_local $3 + get_local $2 get_local $1 - i32.const 1 - i32.shl - set_local $3 + i32.sub + i32.const 65535 + i32.add + i32.const -65536 + i32.and + i32.const 16 + i32.shr_u + tee_local $0 get_local $3 - call $~lib/allocator/arena/__memory_allocate - br $~lib/memory/memory.allocate|inlined.2 - end - set_local $4 - i32.const 0 - set_local $5 - block $break|0 - loop $continue|0 - get_local $2 - get_local $1 - i32.lt_u - if - block - get_local $0 - block (result i32) - get_local $2 - tee_local $3 - i32.const 1 - i32.add - set_local $2 - get_local $3 - end - i32.add - i32.load8_u - set_local $3 - get_local $3 - i32.const 128 - i32.lt_u - if - get_local $4 - get_local $5 - i32.add - get_local $3 - i32.store16 - get_local $5 - i32.const 2 - i32.add - set_local $5 - else - get_local $3 - i32.const 191 - i32.gt_u - tee_local $6 - if (result i32) - get_local $3 - i32.const 224 - i32.lt_u - else - get_local $6 - end - if - get_local $2 - i32.const 1 - i32.add - get_local $1 - i32.le_u - i32.eqz - if - i32.const 0 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 928 -======= - i32.const 848 ->>>>>>> Working on sections. -======= - i32.const 928 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 880 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - i32.const 510 - i32.const 8 - call $~lib/env/abort - unreachable ->>>>>>> new Branch for parser - end - get_local $4 - get_local $5 - i32.add - get_local $3 - i32.const 31 - i32.and - i32.const 6 - i32.shl - get_local $0 -<<<<<<< loader-memory-accessors - i32.const 4 - i32.eq - tee_local $2 - if (result i32) - get_local $4 - i32.load - i32.const 1701667182 - i32.eq - else - get_local $2 - end - if - call $assembly/index/readVaruint - set_local $2 - call $assembly/index/readVaruint - set_local $3 - get_global $assembly/index/off - set_local $0 - block $break|12 - block $case3|12 - block $case2|12 - block $case1|12 - get_local $2 - tee_local $5 - get_global $src/common/NameType.Module - i32.ne - if - get_global $src/common/NameType.Function - get_local $5 - i32.eq - br_if $case1|12 - get_global $src/common/NameType.Local - get_local $5 - i32.eq - br_if $case2|12 - br $case3|12 - end - call $assembly/index/readVaruint - set_local $5 - get_global $assembly/index/off - get_local $5 - call $assembly/options/onModuleName - br $break|12 - end - call $assembly/index/readVaruint - set_local $4 - i32.const 0 - set_local $5 - loop $repeat|13 - get_local $5 - get_local $4 - i32.lt_u - if - call $assembly/index/readVaruint - set_local $9 - call $assembly/index/readVaruint - set_local $7 - get_local $7 - get_global $assembly/index/off - tee_local $2 - i32.add - set_global $assembly/index/off - get_local $9 - get_local $2 - get_local $7 - call $assembly/options/onFunctionName - get_local $5 - i32.const 1 - i32.add - set_local $5 - br $repeat|13 - end - end - br $break|12 - end - call $assembly/index/readVaruint - set_local $4 - i32.const 0 - set_local $5 - loop $repeat|14 - get_local $5 - get_local $4 - i32.lt_u - if - call $assembly/index/readVaruint - set_local $2 - call $assembly/index/readVaruint - set_local $7 - i32.const 0 - set_local $9 - loop $repeat|15 - get_local $9 - get_local $7 - i32.lt_u - if - call $assembly/index/readVaruint - set_local $10 - call $assembly/index/readVaruint - tee_local $8 - get_global $assembly/index/off - tee_local $6 - i32.add - set_global $assembly/index/off - get_local $2 - get_local $10 - get_local $6 - get_local $8 - call $assembly/options/onLocalName - get_local $9 - i32.const 1 - i32.add - set_local $9 - br $repeat|15 - end - end - get_local $5 - i32.const 1 - i32.add - set_local $5 - br $repeat|14 - end - end - br $break|12 - end -======= - block (result i32) - get_local $2 - tee_local $6 - i32.const 1 - i32.add - set_local $2 - get_local $6 - end - i32.add - i32.load8_u - i32.const 63 - i32.and - i32.or - i32.store16 - get_local $5 - i32.const 2 - i32.add - set_local $5 - else - get_local $3 - i32.const 239 - i32.gt_u - tee_local $6 - if (result i32) - get_local $3 - i32.const 365 - i32.lt_u - else - get_local $6 - end - if - get_local $2 - i32.const 3 - i32.add - get_local $1 - i32.le_u - i32.eqz - if - i32.const 0 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 928 -======= - i32.const 848 ->>>>>>> Working on sections. -======= - i32.const 928 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 880 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - i32.const 514 - i32.const 8 - call $~lib/env/abort ->>>>>>> new Branch for parser - unreachable - end - get_local $3 - i32.const 7 - i32.and - i32.const 18 - i32.shl - get_local $0 - block (result i32) - get_local $2 - tee_local $6 - i32.const 1 - i32.add - set_local $2 - get_local $6 - end - i32.add - i32.load8_u - i32.const 63 - i32.and - i32.const 12 - i32.shl - i32.or - get_local $0 - block (result i32) - get_local $2 - tee_local $6 - i32.const 1 - i32.add - set_local $2 - get_local $6 - end - i32.add - i32.load8_u - i32.const 63 - i32.and - i32.const 6 - i32.shl - i32.or - get_local $0 - block (result i32) - get_local $2 - tee_local $6 - i32.const 1 - i32.add - set_local $2 - get_local $6 - end - i32.add - i32.load8_u - i32.const 63 - i32.and - i32.or - i32.const 65536 - i32.sub - set_local $3 - get_local $4 - get_local $5 - i32.add - i32.const 55296 - get_local $3 - i32.const 10 - i32.shr_u - i32.add - i32.store16 - get_local $5 - i32.const 2 - i32.add - set_local $5 - get_local $4 - get_local $5 - i32.add - i32.const 56320 - get_local $3 - i32.const 1023 - i32.and - i32.add - i32.store16 - get_local $5 - i32.const 2 - i32.add - set_local $5 - else -<<<<<<< loader-memory-accessors - block (result i32) - get_local $0 - i32.const 16 - i32.eq - tee_local $0 - if - get_local $4 - i64.load - i64.const 7011371672682196851 - i64.eq - set_local $0 - end - get_local $0 - end - if (result i32) - get_local $4 - i32.const 8 - i32.add - i64.load - i64.const 5499551997695193200 - i64.eq - else - get_local $0 - end - if - call $assembly/index/readVaruint - tee_local $0 - get_global $assembly/index/off - tee_local $3 -======= - get_local $2 - i32.const 2 - i32.add - get_local $1 - i32.le_u - i32.eqz - if - i32.const 0 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 928 -======= - i32.const 848 ->>>>>>> Working on sections. -======= - i32.const 928 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 880 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - i32.const 526 - i32.const 8 - call $~lib/env/abort - unreachable - end - get_local $4 - get_local $5 - i32.add - get_local $3 - i32.const 15 - i32.and - i32.const 12 - i32.shl - get_local $0 - block (result i32) - get_local $2 - tee_local $6 - i32.const 1 - i32.add - set_local $2 - get_local $6 - end - i32.add - i32.load8_u - i32.const 63 - i32.and - i32.const 6 - i32.shl - i32.or - get_local $0 - block (result i32) - get_local $2 - tee_local $6 - i32.const 1 ->>>>>>> new Branch for parser - i32.add - set_local $2 - get_local $6 - end - i32.add - i32.load8_u - i32.const 63 - i32.and - i32.or - i32.store16 - get_local $5 - i32.const 2 - i32.add - set_local $5 - end -<<<<<<< loader-memory-accessors - get_local $5 - get_local $8 - i32.add - set_global $assembly/index/off - br $break|1 -======= ->>>>>>> new Branch for parser - end - end - end - br $continue|0 + get_local $0 + i32.gt_s + select + grow_memory + i32.const 0 + i32.lt_s + if + get_local $0 + grow_memory + i32.const 0 + i32.lt_s + if + unreachable end end end get_local $2 + set_global $~lib/allocator/arena/offset get_local $1 - i32.eq - i32.eqz + ) + (func $~lib/memory/memory.allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $~lib/allocator/arena/__memory_allocate + ) + (func $~lib/memory/memory.free (; 11 ;) (type $iv) (param $0 i32) + nop + ) + (func $~lib/memory/memory.reset (; 12 ;) (type $v) + get_global $~lib/allocator/arena/startOffset + set_global $~lib/allocator/arena/offset + ) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 13 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + get_local $0 + i32.const 1073741816 + i32.gt_u if i32.const 0 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 928 -======= - i32.const 848 ->>>>>>> Working on sections. -======= - i32.const 928 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 880 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - i32.const 535 - i32.const 4 + i32.const 56 + i32.const 26 + i32.const 2 call $~lib/env/abort unreachable end - get_local $5 i32.const 1 - i32.shr_u - call $~lib/internal/string/allocateUnsafe - set_local $7 - get_local $7 - get_global $~lib/internal/string/HEADER_SIZE - i32.add - set_local $3 - get_local $3 - get_local $4 - get_local $5 - call $~lib/internal/memory/memmove - block $~lib/memory/memory.free|inlined.1 - block - get_local $4 - call $~lib/allocator/arena/__memory_free - br $~lib/memory/memory.free|inlined.1 - unreachable - end - unreachable - end - get_local $7 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/buffer/index/Buffer#readUint (; 55 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $assembly/buffer/index/Buffer#readUint (; 53 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/buffer/index/Buffer#readUint (; 55 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/buffer/index/Buffer#readUint (; 54 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $1 i32) - (local $2 i32) - get_local $0 - i32.load offset=8 - set_local $1 - get_local $1 - i32.load8_u - set_local $2 + i32.const 32 get_local $0 - get_local $1 - i32.const 1 + i32.const 7 i32.add - i32.store offset=8 - get_local $2 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/module/imports/Import#constructor (; 56 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) -======= - (func $assembly/module/imports/Import#constructor (; 54 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/module/imports/Import#constructor (; 56 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/module/imports/Import#constructor (; 55 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $4 i32) + i32.clz + i32.sub + i32.shl + call $~lib/allocator/arena/__memory_allocate + tee_local $1 get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 12 - call $~lib/memory/memory.allocate - set_local $4 - get_local $4 - get_local $1 - i32.store - get_local $4 - get_local $2 - i32.store offset=4 - get_local $4 - get_local $3 - i32.store offset=8 - get_local $4 - end - tee_local $0 - end - tee_local $0 + i32.store + get_local $1 ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/array/Array#__set (; 57 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) -======= - (func $~lib/array/Array#__set (; 55 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Working on sections. -======= - (func $~lib/array/Array#__set (; 57 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/array/Array#__set (; 56 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 14 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) (local $3 i32) - (local $4 i32) - (local $5 i32) + get_local $1 get_local $0 i32.load - set_local $3 - get_local $3 - i32.load - i32.const 2 - i32.shr_u - set_local $4 - get_local $1 - get_local $4 - i32.ge_u + tee_local $2 + i32.gt_s if get_local $1 - i32.const 268435454 - i32.ge_u + i32.const 1073741816 + i32.gt_s if i32.const 0 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 56 -======= - i32.const 24 ->>>>>>> Working on sections. -======= i32.const 56 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 8 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - i32.const 109 - i32.const 41 + i32.const 40 + i32.const 4 call $~lib/env/abort unreachable end - get_local $3 get_local $1 i32.const 1 + i32.const 32 + get_local $2 + i32.const 7 i32.add - i32.const 2 + i32.clz + i32.sub i32.shl - call $~lib/internal/arraybuffer/reallocateUnsafe - set_local $3 - get_local $0 - get_local $3 - i32.store + i32.const 8 + i32.sub + i32.le_s + if + get_local $0 + get_local $1 + i32.store + else + get_local $1 + call $~lib/internal/arraybuffer/allocateUnsafe + tee_local $3 + i32.const 8 + i32.add + get_local $0 + i32.const 8 + i32.add + get_local $2 + call $~lib/internal/memory/memmove + get_local $3 + set_local $0 + end get_local $0 - get_local $1 - i32.const 1 + i32.const 8 + i32.add + get_local $2 i32.add - i32.store offset=4 - end - i32.const 0 - set_local $5 - get_local $3 - get_local $1 - i32.const 2 - i32.shl - i32.add - get_local $5 - i32.add - get_local $2 - i32.store offset=8 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/module/imports/Imports#parse (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $assembly/module/imports/Imports#parse (; 56 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/module/imports/Imports#parse (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/module/imports/Imports#parse (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - (local $7 i32) - (local $8 i32) - (local $9 i32) - (local $10 i32) - (local $11 i32) - (local $12 i32) - (local $13 i32) - (local $14 i32) - get_local $1 - get_local $0 - i32.load - i32.load offset=12 - i32.store offset=8 - get_local $1 - i32.const 32 - call $assembly/buffer/index/Buffer#readVaruint - set_local $2 - get_local $0 - i32.const 0 - get_local $2 - call $~lib/array/Array#constructor - i32.store offset=4 - block $break|0 i32.const 0 - set_local $3 - loop $repeat|0 - get_local $3 - get_local $2 - i32.lt_u - i32.eqz - br_if $break|0 - block - get_local $1 - i32.const 32 - call $assembly/buffer/index/Buffer#readVaruint - set_local $4 - get_local $1 - i32.load offset=8 - set_local $5 - get_local $5 - get_local $4 - call $~lib/string/String.fromUTF8 - set_local $6 - get_local $1 - get_local $1 - i32.load offset=8 - get_local $4 - i32.add - i32.store offset=8 - get_local $1 - i32.const 32 - call $assembly/buffer/index/Buffer#readVaruint - set_local $7 - get_local $1 - i32.load offset=8 - set_local $8 - get_local $8 - get_local $7 - call $~lib/string/String.fromUTF8 - set_local $9 - get_local $1 - get_local $1 - i32.load offset=8 - get_local $7 - i32.add - i32.store offset=8 - get_local $1 - call $assembly/buffer/index/Buffer#readUint - set_local $10 - get_local $0 - i32.load offset=4 - get_local $3 + get_local $1 + get_local $2 + i32.sub + call $~lib/internal/memory/memset + else + get_local $1 + get_local $2 + i32.lt_s + if + get_local $1 + i32.const 0 + i32.lt_s + if i32.const 0 - get_local $6 - get_local $9 - get_local $10 - call $assembly/module/imports/Import#constructor - call $~lib/array/Array#__set - block $break|1 - block $case4|1 - block $case3|1 - block $case2|1 - block $case1|1 - block $case0|1 - get_local $10 - set_local $11 - get_local $11 - get_global $src/common/ExternalKind.Function - i32.eq - br_if $case0|1 - get_local $11 - get_global $src/common/ExternalKind.Table - i32.eq - br_if $case1|1 - get_local $11 - get_global $src/common/ExternalKind.Memory - i32.eq - br_if $case2|1 - get_local $11 - get_global $src/common/ExternalKind.Global - i32.eq - br_if $case3|1 - br $case4|1 - end - block - get_local $1 - i32.const 32 - call $assembly/buffer/index/Buffer#readVaruint - set_local $11 - br $break|1 - unreachable - end - unreachable - end - block - get_local $1 - i32.const 7 - call $assembly/buffer/index/Buffer#readVarint - i32.const 127 - i32.and - set_local $11 - get_local $1 - i32.const 1 - call $assembly/buffer/index/Buffer#readVaruint - set_local $12 - get_local $1 - i32.const 32 - call $assembly/buffer/index/Buffer#readVaruint - set_local $13 - get_local $12 - i32.const 1 - i32.and - if (result i32) - get_local $1 - i32.const 32 - call $assembly/buffer/index/Buffer#readVaruint - else - get_global $src/common/MAX_ELEMS - end - set_local $14 - br $break|1 - unreachable - end - unreachable - end - block - get_local $1 - i32.const 1 - call $assembly/buffer/index/Buffer#readVaruint - set_local $14 - get_local $1 - i32.const 32 - call $assembly/buffer/index/Buffer#readVaruint - set_local $13 - get_local $14 - i32.const 1 - i32.and - if (result i32) - get_local $1 - i32.const 32 - call $assembly/buffer/index/Buffer#readVaruint - else - get_global $src/common/MAX_PAGES - end - set_local $12 - br $break|1 - unreachable - end - unreachable - end - block - get_local $1 - i32.const 7 - call $assembly/buffer/index/Buffer#readVarint - i32.const 127 - i32.and - set_local $12 - get_local $1 - i32.const 1 - call $assembly/buffer/index/Buffer#readVaruint - set_local $13 - br $break|1 - unreachable - end - unreachable - end - unreachable - end + i32.const 56 + i32.const 62 + i32.const 4 + call $~lib/env/abort + unreachable end - get_local $3 - i32.const 1 - i32.add - set_local $3 - br $repeat|0 - unreachable + get_local $0 + get_local $1 + i32.store end - unreachable end get_local $0 ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $~lib/array/Array#push (; 59 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $~lib/array/Array#push (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $~lib/array/Array#push (; 59 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $~lib/array/Array#push (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $~lib/array/Array#push (; 15 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) - (local $5 i32) - (local $6 i32) get_local $0 i32.load offset=4 - set_local $2 + tee_local $2 + i32.const 1 + i32.add + set_local $3 + get_local $2 get_local $0 i32.load - set_local $3 - get_local $3 + tee_local $4 i32.load i32.const 2 i32.shr_u - set_local $4 - get_local $2 - i32.const 1 - i32.add - set_local $5 - get_local $2 - get_local $4 i32.ge_u if get_local $2 @@ -6895,1631 +1698,1686 @@ i32.ge_u if i32.const 0 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 56 -======= i32.const 24 ->>>>>>> Working on sections. -======= - i32.const 56 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 8 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. i32.const 184 i32.const 42 call $~lib/env/abort unreachable end + get_local $0 + get_local $4 get_local $3 - get_local $5 i32.const 2 i32.shl call $~lib/internal/arraybuffer/reallocateUnsafe - set_local $3 - get_local $0 - get_local $3 + tee_local $4 i32.store end get_local $0 - get_local $5 - i32.store offset=4 - i32.const 0 - set_local $6 get_local $3 + i32.store offset=4 + get_local $4 get_local $2 i32.const 2 i32.shl i32.add - get_local $6 - i32.add get_local $1 i32.store offset=8 - get_local $5 + get_local $3 ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/module/index/Module#getImports (; 60 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $assembly/module/index/Module#getImports (; 58 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/module/index/Module#getImports (; 60 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/module/index/Module#getImports (; 59 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $1 i32) + (func $assembly/module/index/Module#getID (; 16 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -======= - (local $5 i32) ->>>>>>> Working on sections. -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 - get_global $src/common/SectionId.Import - call $assembly/module/index/Module#getID - set_local $1 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 1096 - set_local $2 -======= - i32.const 1008 - set_local $2 - block $~lib/array/Array#get:length|inlined.0 (result i32) + i32.load + i32.load offset=4 + set_local $4 + loop $repeat|0 get_local $2 - i32.load offset=4 - end - call $assembly/host/index/log ->>>>>>> Working on sections. -======= - i32.const 1096 -======= - i32.const 1048 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - set_local $2 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - block $break|0 - i32.const 0 - set_local $3 - loop $repeat|0 - get_local $3 - block $~lib/array/Array#get:length|inlined.4 (result i32) - get_local $1 - i32.load offset=4 - end - i32.lt_s - i32.eqz - br_if $break|0 - block -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -======= - get_local $1 - get_local $3 - call $~lib/array/Array#__get - i32.load offset=16 - call $assembly/host/index/log ->>>>>>> Working on sections. -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - i32.const 0 - get_local $1 + get_local $4 + i32.lt_s + if + get_local $2 + get_local $0 + i32.load + i32.load + tee_local $3 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $2 + i32.const 2 + i32.shl get_local $3 - call $~lib/array/Array#__get - call $assembly/module/index/Section#constructor - set_local $4 + i32.add + i32.load offset=8 + else + unreachable + end + tee_local $3 + i32.load offset=4 + get_local $1 + i32.eq + if + i32.const 16 get_local $2 - get_local $4 get_local $0 - i32.load offset=4 - call $assembly/module/imports/Imports#parse - call $~lib/array/Array#push - drop -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -======= - block $~lib/array/Array#get:length|inlined.0 (result i32) - get_local $4 - i32.load offset=4 - set_local $5 - get_local $5 - i32.load offset=4 + i32.load + i32.load + tee_local $3 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $2 + i32.const 2 + i32.shl + get_local $3 + i32.add + i32.load offset=8 + else + unreachable end - call $assembly/host/index/log ->>>>>>> Working on sections. -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + tee_local $3 + call $~lib/array/Array#push + drop end - get_local $3 + get_local $2 i32.const 1 i32.add - set_local $3 - br $repeat|0 - unreachable - end - unreachable - end - get_local $2 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/index/getImports (; 61 ;) (type $iv) (param $0 i32) -======= - (func $assembly/index/getImports (; 59 ;) (type $iv) (param $0 i32) ->>>>>>> Working on sections. -======= - (func $assembly/index/getImports (; 61 ;) (type $iv) (param $0 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/index/getImports (; 60 ;) (type $iv) (param $0 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $1 i32) - (local $2 i32) - get_local $0 - call $assembly/module/index/Module#getImports - set_local $1 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - block $~lib/array/Array#get:length|inlined.1 (result i32) -======= - block $~lib/array/Array#get:length|inlined.2 (result i32) ->>>>>>> Working on sections. -======= - block $~lib/array/Array#get:length|inlined.1 (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - block $~lib/array/Array#get:length|inlined.1 (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_local $1 - i32.load offset=4 - end - i32.const 0 - i32.gt_s - if - block $break|0 - i32.const 0 set_local $2 - loop $repeat|0 - get_local $2 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - block $~lib/array/Array#get:length|inlined.3 (result i32) -======= - block $~lib/array/Array#get:length|inlined.4 (result i32) ->>>>>>> Working on sections. -======= - block $~lib/array/Array#get:length|inlined.3 (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - get_local $1 - i32.load offset=4 - end - i32.lt_s - i32.eqz - br_if $break|0 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - nop -======= - block $~lib/array/Array#get:length|inlined.5 (result i32) - get_local $1 - i32.load offset=4 - end - call $assembly/host/index/log ->>>>>>> Working on sections. -======= - nop ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - get_local $2 - i32.const 1 - i32.add - set_local $2 - br $repeat|0 - unreachable - end - unreachable + br $repeat|0 end end + i32.const 16 ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - (func $assembly/module/index/Module#get:start (; 62 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - get_global $src/common/SectionId.Start - call $assembly/module/index/Module#getID -<<<<<<< loader-memory-accessors - ) - (func $assembly/module/index/Module#get:hasStart (; 63 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/TypeSection#constructor (; 17 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) - block $~lib/array/Array#get:length|inlined.5 (result i32) - get_local $0 - call $assembly/module/index/Module#get:start - set_local $1 - get_local $1 - i32.load offset=4 - end + i32.const 8 + call $~lib/allocator/arena/__memory_allocate + tee_local $1 i32.const 0 - i32.gt_s - ) - (func $assembly/module/index/SectionHeader#get:end (; 64 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - i32.load offset=12 -======= - ) - (func $assembly/module/index/Module#get:hasStart (; 63 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - block $~lib/array/Array#get:length|inlined.5 (result i32) - get_local $0 - call $assembly/module/index/Module#get:start - set_local $1 - get_local $1 - i32.load offset=4 - end + i32.store + get_local $1 i32.const 0 - i32.gt_s - ) - (func $assembly/module/index/SectionHeader#get:end (; 64 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - i32.load offset=12 + i32.store offset=4 + get_local $1 get_local $0 - i32.load offset=8 - i32.add + i32.store + get_local $1 + i32.const 128 + i32.store offset=4 + get_local $1 ) - (func $assembly/module/index/SectionHeader#toString (; 65 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVaruint (; 18 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) - (local $5 i32) - (local $6 i32) - get_local $0 - i32.load - call $~lib/internal/number/itoa - set_local $1 - get_local $0 - i32.load offset=4 - call $~lib/internal/number/itoa - set_local $2 get_local $0 i32.load offset=8 - call $~lib/internal/number/itoa - set_local $3 - get_local $0 - i32.load offset=12 - call $~lib/internal/number/itoa - set_local $4 - get_local $0 - i32.load offset=20 - set_local $5 - get_local $0 - call $assembly/module/index/SectionHeader#get:end - call $~lib/internal/number/itoa - set_local $6 - i32.const 1104 - get_local $1 - call $~lib/string/String.__concat - i32.const 1080 - call $~lib/string/String.__concat - i32.const 1120 - call $~lib/string/String.__concat - get_local $2 - call $~lib/string/String.__concat - i32.const 1080 - call $~lib/string/String.__concat - i32.const 1136 - call $~lib/string/String.__concat - get_local $4 - call $~lib/string/String.__concat - i32.const 1080 - call $~lib/string/String.__concat - i32.const 1168 - call $~lib/string/String.__concat - get_local $3 - call $~lib/string/String.__concat - i32.const 1080 - call $~lib/string/String.__concat - i32.const 1208 - call $~lib/string/String.__concat - get_local $6 - call $~lib/string/String.__concat - i32.const 1080 - call $~lib/string/String.__concat - i32.const 1224 - call $~lib/string/String.__concat - get_local $5 - call $~lib/string/String.__concat - ) - (func $assembly/host/index/log (; 66 ;) (type $iv) (param $0 i32) + set_local $1 + loop $continue|0 + get_local $1 + tee_local $2 + i32.const 1 + i32.add + set_local $1 + get_local $2 + i32.load8_u + tee_local $2 + i32.const 127 + i32.and + get_local $4 + i32.shl + get_local $3 + i32.or + set_local $3 + get_local $2 + i32.const 128 + i32.and + if + get_local $4 + i32.const 7 + i32.add + set_local $4 + br $continue|0 + end + end get_local $0 - call $assembly/host/index/_logi + get_local $1 + i32.store offset=8 + get_local $3 ) - (func $~lib/internal/typedarray/TypedArray#constructor (; 67 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 19 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) (local $2 i32) (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $1 - i32.const 1073741816 + get_local $0 + i32.const 268435454 i32.gt_u if i32.const 0 - i32.const 1240 - i32.const 23 - i32.const 34 + i32.const 24 + i32.const 45 + i32.const 39 call $~lib/env/abort unreachable end - get_local $1 - i32.const 0 + get_local $0 + i32.const 2 i32.shl + tee_local $3 + call $~lib/internal/arraybuffer/allocateUnsafe set_local $2 + i32.const 8 + call $~lib/allocator/arena/__memory_allocate + tee_local $1 + i32.const 0 + i32.store + get_local $1 + i32.const 0 + i32.store offset=4 + get_local $1 get_local $2 - call $~lib/internal/arraybuffer/allocateUnsafe - set_local $3 - get_local $3 - get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.store + get_local $1 + get_local $0 + i32.store offset=4 + get_local $2 + i32.const 8 i32.add - set_local $4 i32.const 0 + get_local $3 + call $~lib/internal/memory/memset + get_local $1 + ) + (func $assembly/buffer/index/Buffer#readVarint (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + i32.load offset=8 set_local $5 - get_local $4 + loop $continue|0 + get_local $5 + tee_local $4 + i32.const 1 + i32.add + set_local $5 + get_local $4 + i32.load8_u + tee_local $6 + i32.const 127 + i32.and + get_local $2 + i32.shl + get_local $3 + i32.or + set_local $3 + get_local $2 + i32.const 7 + i32.add + set_local $2 + get_local $6 + i32.const 128 + i32.and + br_if $continue|0 + end + get_local $0 get_local $5 + i32.store offset=8 + i32.const -1 get_local $2 - call $~lib/internal/memory/memset - get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 12 - call $~lib/memory/memory.allocate - set_local $5 - get_local $5 - i32.const 0 - i32.store - get_local $5 - i32.const 0 - i32.store offset=4 - get_local $5 - i32.const 0 - i32.store offset=8 - get_local $5 - end - tee_local $0 + i32.shl + get_local $3 + i32.or + set_local $0 + get_local $2 + get_local $1 + i32.lt_u + tee_local $4 + if + get_local $6 + i32.const 64 + i32.and + i32.const 0 + i32.ne + set_local $4 end - tee_local $0 + get_local $0 get_local $3 - i32.store + get_local $4 + select + ) + (func $assembly/buffer/index/Buffer#readVarint8 (; 21 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) get_local $0 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint + ) + (func $assembly/module/index/FuncType#constructor (; 22 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + i32.const 13 + call $~lib/allocator/arena/__memory_allocate + tee_local $2 + i32.const 0 + i32.store + get_local $2 i32.const 0 i32.store offset=4 - get_local $0 get_local $2 - i32.store offset=8 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. get_local $0 - i32.load offset=8 - i32.add + i32.store offset=8 + get_local $2 + get_local $1 + i32.store8 offset=12 + get_local $2 ) -<<<<<<< loader-memory-accessors - (func $assembly/module/index/SectionHeader#toString (; 65 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) -======= - (func $~lib/internal/typedarray/TypedArray#__get (; 68 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + (func $~lib/array/Array#__set (; 23 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) + (local $4 i32) get_local $1 get_local $0 - i32.load offset=8 - i32.const 0 + i32.load + tee_local $3 + i32.load + i32.const 2 i32.shr_u i32.ge_u if - i32.const 0 - i32.const 1240 - i32.const 39 - i32.const 63 - call $~lib/env/abort - unreachable - end - block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) - get_local $0 - i32.load - set_local $2 - get_local $0 - i32.load offset=4 - set_local $3 - get_local $2 get_local $1 - i32.const 0 - i32.shl - i32.add + i32.const 268435454 + i32.ge_u + if + i32.const 0 + i32.const 24 + i32.const 109 + i32.const 41 + call $~lib/env/abort + unreachable + end + get_local $0 get_local $3 + get_local $1 + i32.const 1 i32.add - i32.load8_u offset=8 + tee_local $4 + i32.const 2 + i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + tee_local $3 + i32.store + get_local $0 + get_local $4 + i32.store offset=4 end - ) - (func $~lib/internal/typedarray/TypedArray#__set (; 69 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local $4 i32) + get_local $3 get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $2 + i32.store offset=8 + ) + (func $~lib/internal/number/decimalCount32 (; 24 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.const 100000 + i32.lt_u + if (result i32) + get_local $0 + i32.const 100 + i32.lt_u + if (result i32) + i32.const 1 + i32.const 2 + get_local $0 + i32.const 10 + i32.lt_u + select + else + i32.const 3 + i32.const 4 + i32.const 5 + get_local $0 + i32.const 10000 + i32.lt_u + select + get_local $0 + i32.const 1000 + i32.lt_u + select + end + else + get_local $0 + i32.const 10000000 + i32.lt_u + if (result i32) + i32.const 6 + i32.const 7 + get_local $0 + i32.const 1000000 + i32.lt_u + select + else + i32.const 8 + i32.const 9 + i32.const 10 + get_local $0 + i32.const 1000000000 + i32.lt_u + select + get_local $0 + i32.const 100000000 + i32.lt_u + select + end + end + ) + (func $~lib/internal/string/allocateUnsafe (; 25 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) get_local $0 - i32.load offset=8 i32.const 0 - i32.shr_u - i32.ge_u + i32.gt_s + tee_local $1 + if + get_local $0 + i32.const 536870910 + i32.le_s + set_local $1 + end + get_local $1 + i32.eqz if i32.const 0 - i32.const 1240 - i32.const 50 - i32.const 63 + i32.const 144 + i32.const 14 + i32.const 2 call $~lib/env/abort unreachable end get_local $0 - i32.load - set_local $3 - get_local $0 - i32.load offset=4 - set_local $4 - get_local $3 - get_local $1 - i32.const 0 + i32.const 1 i32.shl + i32.const 4 i32.add - get_local $4 - i32.add - get_local $2 - i32.store8 offset=8 - ) - (func $assembly/host/index/log (; 70 ;) (type $iv) (param $0 i32) - get_local $0 - call $assembly/host/index/_logi - ) - (func $assembly/host/index/log (; 71 ;) (type $iv) (param $0 i32) - get_local $0 - i32.const 12 - call $assembly/host/index/_log - ) - (func $assembly/host/index/log (; 72 ;) (type $iv) (param $0 i32) + call $~lib/allocator/arena/__memory_allocate + tee_local $1 get_local $0 - i32.const 255 - i32.and - call $assembly/host/index/_logi + i32.store + get_local $1 ) - (func $assembly/index/removeStartFunction (; 73 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) + (func $~lib/internal/number/utoa32_lut (; 26 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) - get_local $0 - call $assembly/module/index/Module#get:hasStart - if - get_local $0 - get_global $src/common/SectionId.Start - call $assembly/module/index/Module#getID - i32.const 0 - call $~lib/array/Array#__get - set_local $1 + i32.const 712 + i32.load + set_local $3 + loop $continue|0 get_local $1 - call $assembly/module/index/SectionHeader#toString - call $assembly/host/index/log + i32.const 10000 + i32.ge_u + if + get_local $1 + i32.const 10000 + i32.rem_u + set_local $4 + get_local $1 + i32.const 10000 + i32.div_u + set_local $1 + get_local $2 + i32.const 4 + i32.sub + tee_local $2 + i32.const 1 + i32.shl + get_local $0 + i32.add + get_local $3 + get_local $4 + i32.const 100 + i32.div_u + i32.const 2 + i32.shl + i32.add + i64.load32_u offset=8 + get_local $3 + get_local $4 + i32.const 100 + i32.rem_u + i32.const 2 + i32.shl + i32.add + i64.load32_u offset=8 + i64.const 32 + i64.shl + i64.or + i64.store offset=4 + br $continue|0 + end + end + get_local $1 + i32.const 100 + i32.ge_u + if get_local $1 - call $assembly/module/index/SectionHeader#get:end + i32.const 100 + i32.rem_u + set_local $4 get_local $1 - i32.load - i32.sub - set_local $2 + i32.const 100 + i32.div_u + set_local $1 get_local $2 - call $assembly/host/index/log - i32.const 0 + i32.const 2 + i32.sub + tee_local $2 + i32.const 1 + i32.shl get_local $0 - i32.load offset=4 - i32.load offset=4 + i32.add + get_local $3 + get_local $4 + i32.const 2 + i32.shl + i32.add + i32.load offset=8 + i32.store offset=4 + end + get_local $1 + i32.const 10 + i32.ge_u + if get_local $2 + i32.const 2 i32.sub - call $~lib/internal/typedarray/TypedArray#constructor - set_local $3 - get_local $1 - i32.load offset=16 - call $assembly/host/index/log - block $break|0 - i32.const 0 - set_local $4 - loop $repeat|0 - get_local $4 - get_local $1 - i32.load offset=16 - i32.lt_u - i32.eqz - br_if $break|0 - get_local $3 - get_local $4 - get_local $0 - i32.load offset=4 - i32.load - get_local $4 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $4 - i32.const 1 - i32.add - set_local $4 - br $repeat|0 - unreachable - end - unreachable - end - i32.const 1304 - call $assembly/host/index/log - get_local $0 - i32.load offset=4 - i32.load offset=16 - call $assembly/host/index/log - get_local $0 - i32.load offset=4 - i32.load - call $assembly/host/index/log - get_local $0 - i32.load offset=4 - i32.load - get_local $0 - i32.load offset=4 - i32.load offset=4 i32.const 1 - i32.sub - call $~lib/internal/typedarray/TypedArray#__get - call $assembly/host/index/log - get_local $1 - i32.load offset=16 - get_local $2 + i32.shl + get_local $0 i32.add - call $assembly/host/index/log - block $break|1 - get_local $1 - i32.load offset=16 - get_local $2 - i32.add - set_local $4 - loop $repeat|1 - get_local $4 - get_local $0 - i32.load offset=4 - i32.load offset=4 - i32.lt_u - i32.eqz - br_if $break|1 - block - get_local $4 - get_local $0 -======= - block $~lib/array/Array#get:length|inlined.3 (result i32) - get_local $1 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - i32.load offset=4 - i32.load offset=4 - i32.const 8000 - i32.sub - i32.gt_u - if - get_local $4 - call $assembly/host/index/log - end - get_local $3 - get_local $4 - get_local $2 - i32.sub - get_local $0 - i32.load offset=4 - i32.load - get_local $4 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - call $~lib/internal/typedarray/TypedArray#__set - end - get_local $4 - i32.const 1 - i32.add - set_local $4 - br $repeat|1 - unreachable - end - unreachable - end get_local $3 - return + get_local $1 + i32.const 2 + i32.shl + i32.add + i32.load offset=8 + i32.store offset=4 else + get_local $2 + i32.const 1 + i32.sub + i32.const 1 + i32.shl get_local $0 - i32.load offset=4 - i32.load - return + i32.add + get_local $1 + i32.const 48 + i32.add + i32.store16 offset=4 end - unreachable - unreachable - ) -<<<<<<< loader-memory-accessors - (func $assembly/index/toString (; 74 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - call $assembly/module/index/TypeSection#toString ) - (func $assembly/module/index/Module#constructor (; 75 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/number/itoa (; 27 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) (local $2 i32) - get_local $0 - if (result i32) + block $__inlined_func$~lib/internal/number/utoa32 get_local $0 - else - block (result i32) - i32.const 8 - call $~lib/memory/memory.allocate - set_local $2 - get_local $2 - i32.const 0 - i32.store - get_local $2 - i32.const 0 - i32.store offset=4 - get_local $2 + tee_local $1 + i32.eqz + if + i32.const 136 + set_local $0 + br $__inlined_func$~lib/internal/number/utoa32 end + get_local $1 + call $~lib/internal/number/decimalCount32 + tee_local $2 + call $~lib/internal/string/allocateUnsafe tee_local $0 + get_local $1 + get_local $2 + call $~lib/internal/number/utoa32_lut end - tee_local $0 - get_local $1 - i32.store offset=4 -======= - (func $assembly/module/index/SectionHeader#get:end (; 61 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_local $0 - i32.const 1352 - i32.store get_local $0 ) -<<<<<<< loader-memory-accessors - (func $assembly/index/Parser#constructor (; 76 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - get_local $0 - i32.load - call $~lib/internal/number/itoa - set_local $1 - get_local $0 -<<<<<<< loader-memory-accessors - i32.load offset=4 - call $~lib/internal/number/itoa - set_local $2 -======= + (func $assembly/module/index/typeName (; 28 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + block $case7|0 + block $case6|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + get_local $0 + i32.const 127 + i32.ne + if + get_local $0 + tee_local $1 + i32.const 126 + i32.eq + br_if $case1|0 + get_local $1 + i32.const 125 + i32.eq + br_if $case2|0 + get_local $1 + i32.const 124 + i32.eq + br_if $case3|0 + get_local $1 + i32.const 112 + i32.eq + br_if $case4|0 + get_local $1 + i32.const 96 + i32.eq + br_if $case5|0 + get_local $1 + i32.const 64 + i32.eq + br_if $case6|0 + br $case7|0 + end + i32.const 720 + return + end + i32.const 736 + return + end + i32.const 752 + return + end + i32.const 768 + return + end + i32.const 784 + return + end + i32.const 808 + return + end + i32.const 824 + return + end + unreachable ) - (func $assembly/index/Parser#parseString (; 77 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - get_local $0 - i32.load offset=8 - call $~lib/internal/number/itoa - set_local $3 - get_local $0 - i32.load offset=12 - call $~lib/internal/number/itoa - set_local $4 - get_local $0 - i32.load offset=20 - set_local $5 - get_local $0 - call $assembly/module/index/SectionHeader#get:end - call $~lib/internal/number/itoa - set_local $6 - i32.const 1104 + (func $~lib/internal/string/copyUnsafe (; 29 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) get_local $1 - call $~lib/string/String.__concat - i32.const 1080 - call $~lib/string/String.__concat - i32.const 1120 - call $~lib/string/String.__concat + i32.const 1 + i32.shl + get_local $0 + i32.add + i32.const 4 + i32.add get_local $2 - call $~lib/string/String.__concat - i32.const 1080 - call $~lib/string/String.__concat - i32.const 1136 - call $~lib/string/String.__concat - get_local $4 - call $~lib/string/String.__concat - i32.const 1080 - call $~lib/string/String.__concat - i32.const 1168 - call $~lib/string/String.__concat + i32.const 4 + i32.add get_local $3 - call $~lib/string/String.__concat - i32.const 1080 - call $~lib/string/String.__concat - i32.const 1208 - call $~lib/string/String.__concat - get_local $6 - call $~lib/string/String.__concat - i32.const 1080 - call $~lib/string/String.__concat - i32.const 1224 - call $~lib/string/String.__concat - get_local $5 - call $~lib/string/String.__concat - ) - (func $assembly/host/index/log (; 66 ;) (type $iv) (param $0 i32) - get_local $0 - call $assembly/host/index/_logi + i32.const 1 + i32.shl + call $~lib/internal/memory/memmove ) - (func $~lib/internal/typedarray/TypedArray#constructor (; 67 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $~lib/internal/typedarray/TypedArray#constructor (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $~lib/string/String#concat (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) - (local $5 i32) - get_local $1 - i32.const 1073741816 - i32.gt_u + get_local $0 + i32.eqz if i32.const 0 - i32.const 1056 - i32.const 23 - i32.const 34 + i32.const 864 + i32.const 110 + i32.const 4 call $~lib/env/abort unreachable end get_local $1 + i32.eqz + if + i32.const 848 + set_local $1 + end + get_local $0 + i32.load + tee_local $3 + get_local $1 + i32.load + tee_local $4 + i32.add + tee_local $2 + i32.eqz + if + i32.const 840 + return + end + get_local $2 + call $~lib/internal/string/allocateUnsafe + tee_local $2 i32.const 0 - i32.shl - set_local $2 + get_local $0 + get_local $3 + call $~lib/internal/string/copyUnsafe get_local $2 - call $~lib/internal/arraybuffer/allocateUnsafe - set_local $3 get_local $3 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - set_local $4 - i32.const 0 - set_local $5 + get_local $1 get_local $4 - get_local $5 + call $~lib/internal/string/copyUnsafe get_local $2 - call $~lib/internal/memory/memset + ) + (func $~lib/string/String.__concat (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 12 - call $~lib/memory/memory.allocate - set_local $5 - get_local $5 - i32.const 0 - i32.store - get_local $5 - i32.const 0 - i32.store offset=4 - get_local $5 - i32.const 0 - i32.store offset=8 - get_local $5 - end - tee_local $0 + i32.eqz + if + i32.const 848 + set_local $0 end - tee_local $0 - get_local $3 - i32.store - get_local $0 - i32.const 0 - i32.store offset=4 - get_local $0 - get_local $2 - i32.store offset=8 get_local $0 + get_local $1 + call $~lib/string/String#concat ) - (func $~lib/internal/typedarray/TypedArray#__get (; 63 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/FuncType#toString (; 32 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) (local $2 i32) (local $3 i32) - get_local $1 + (local $4 i32) + (local $5 i32) get_local $0 i32.load offset=8 - i32.const 0 - i32.shr_u - i32.ge_u - if - i32.const 0 - i32.const 1056 - i32.const 39 - i32.const 63 - call $~lib/env/abort - unreachable - end - block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) + call $~lib/internal/number/itoa + set_local $4 + get_local $0 + i32.load8_s offset=12 + call $assembly/module/index/typeName + set_local $5 + i32.const 840 + set_local $1 + loop $repeat|0 + get_local $2 get_local $0 i32.load - set_local $2 - get_local $0 i32.load offset=4 - set_local $3 - get_local $2 - get_local $1 - i32.const 0 - i32.shl - i32.add - get_local $3 - i32.add - i32.load8_u offset=8 + i32.lt_s + if + get_local $1 + get_local $2 + get_local $0 + i32.load + i32.load + tee_local $3 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $2 + i32.const 2 + i32.shl + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + tee_local $3 + call $assembly/module/index/typeName + call $~lib/string/String.__concat + set_local $1 + get_local $2 + get_local $0 + i32.load + i32.load offset=4 + i32.const 1 + i32.sub + i32.lt_s + if + get_local $1 + i32.const 896 + call $~lib/string/String.__concat + set_local $1 + end + get_local $2 + i32.const 1 + i32.add + set_local $2 + br $repeat|0 + end end - ) - (func $~lib/internal/typedarray/TypedArray#__set (; 64 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local $4 i32) - get_local $1 get_local $0 - i32.load offset=8 - i32.const 0 - i32.shr_u - i32.ge_u - if + i32.load offset=4 + i32.load offset=4 + i32.const 1 + i32.eq + if (result i32) i32.const 0 - i32.const 1056 - i32.const 50 - i32.const 63 - call $~lib/env/abort - unreachable + get_local $0 + i32.load offset=4 + i32.load + tee_local $0 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $0 + i32.load offset=8 + else + unreachable + end + tee_local $0 + call $assembly/module/index/typeName + else + i32.const 904 end - get_local $0 - i32.load - set_local $3 - get_local $0 - i32.load offset=4 - set_local $4 - get_local $3 - get_local $1 - i32.const 0 - i32.shl - i32.add + set_local $0 + i32.const 920 get_local $4 - i32.add - get_local $2 - i32.store8 offset=8 + call $~lib/string/String.__concat + i32.const 896 + call $~lib/string/String.__concat + i32.const 944 + call $~lib/string/String.__concat + get_local $5 + call $~lib/string/String.__concat + i32.const 960 + call $~lib/string/String.__concat + get_local $1 + call $~lib/string/String.__concat + i32.const 976 + call $~lib/string/String.__concat + get_local $0 + call $~lib/string/String.__concat ) - (func $assembly/index/removeSection (; 65 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/TypeSection#parse (; 33 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) + (local $8 i32) + get_local $1 get_local $0 + i32.load + i32.load offset=12 + i32.store offset=8 get_local $1 - call $assembly/module/index/Module#getID - set_local $2 - block $~lib/array/Array#get:length|inlined.6 (result i32) + call $assembly/buffer/index/Buffer#readVaruint + tee_local $8 + call $~lib/array/Array#constructor + set_local $6 + loop $repeat|0 get_local $2 - i32.load offset=4 + get_local $8 + i32.lt_u + if + get_local $6 + get_local $2 + get_local $2 + get_local $1 + call $assembly/buffer/index/Buffer#readVarint8 + i32.const 127 + i32.and + call $assembly/module/index/FuncType#constructor + tee_local $4 + call $~lib/array/Array#__set + get_local $4 + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + tee_local $7 + call $~lib/array/Array#constructor + i32.store + i32.const 0 + set_local $4 + loop $repeat|1 + get_local $4 + get_local $7 + i32.lt_u + if + get_local $1 + call $assembly/buffer/index/Buffer#readVarint8 + i32.const 127 + i32.and + set_local $5 + get_local $2 + get_local $6 + i32.load + tee_local $3 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $2 + i32.const 2 + i32.shl + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + tee_local $3 + i32.load + get_local $4 + get_local $5 + call $~lib/array/Array#__set + get_local $4 + i32.const 1 + i32.add + set_local $4 + br $repeat|1 + end + end + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + set_local $4 + get_local $2 + get_local $6 + i32.load + tee_local $3 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $2 + i32.const 2 + i32.shl + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + tee_local $3 + get_local $4 + call $~lib/array/Array#constructor + i32.store offset=4 + i32.const 0 + set_local $5 + loop $repeat|2 + get_local $5 + get_local $4 + i32.lt_u + if + get_local $1 + call $assembly/buffer/index/Buffer#readVarint8 + i32.const 127 + i32.and + set_local $7 + get_local $2 + get_local $6 + i32.load + tee_local $3 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $2 + i32.const 2 + i32.shl + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + tee_local $3 + i32.load offset=4 + get_local $5 + get_local $7 + call $~lib/array/Array#__set + get_local $5 + i32.const 1 + i32.add + set_local $5 + br $repeat|2 + end + end + get_local $2 + tee_local $3 + get_local $6 + i32.load + tee_local $2 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $3 + i32.const 2 + i32.shl + get_local $2 + i32.add + i32.load offset=8 + else + unreachable + end + tee_local $2 + call $assembly/module/index/FuncType#toString + call $assembly/host/index/_log_str + get_local $3 + i32.const 1 + i32.add + set_local $2 + br $repeat|0 + end end + get_local $0 + ) + (func $~lib/array/Array#join (; 34 ;) (type $FUNCSIG$i) (result i32) + (local $0 i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + i32.const 1004 + i32.load + i32.const 1 + i32.sub + tee_local $4 i32.const 0 - i32.eq + i32.lt_s if - get_local $0 - i32.load offset=4 - i32.load + i32.const 840 return end - get_local $2 - i32.const 0 - call $~lib/array/Array#__get - set_local $3 - get_local $3 - call $assembly/module/index/SectionHeader#get:end - get_local $3 + i32.const 1000 i32.load - i32.sub - set_local $4 - get_local $0 - i32.load offset=4 - i32.load offset=4 - get_local $4 - i32.sub set_local $5 + i32.const 1008 + i32.load + tee_local $6 i32.const 0 - get_local $5 - call $~lib/internal/typedarray/TypedArray#constructor - set_local $6 - block $break|0 - i32.const 0 - set_local $7 - loop $repeat|0 - get_local $7 - get_local $3 - i32.load offset=16 - i32.lt_u - i32.eqz - br_if $break|0 - get_local $6 - get_local $7 + i32.ne + set_local $7 + get_local $4 + i32.eqz + if + get_local $5 + i32.load offset=8 + return + end + get_local $4 + i32.const 1 + i32.add + set_local $1 + loop $repeat|0 + get_local $0 + get_local $1 + i32.lt_s + if get_local $0 - i32.load offset=4 + i32.const 2 + i32.shl + get_local $5 + i32.add + i32.load offset=8 i32.load + get_local $2 + i32.add + set_local $2 + get_local $0 + i32.const 1 + i32.add + set_local $0 + br $repeat|0 + end + end + i32.const 0 + set_local $1 + get_local $4 + get_local $6 + i32.mul + get_local $2 + i32.add + call $~lib/internal/string/allocateUnsafe + set_local $0 + i32.const 0 + set_local $2 + loop $repeat|1 + get_local $2 + get_local $4 + i32.lt_s + if + get_local $2 + i32.const 2 + i32.shl + get_local $5 + i32.add + i32.load offset=8 + tee_local $3 + if + get_local $0 + get_local $1 + get_local $3 + get_local $3 + i32.load + tee_local $3 + call $~lib/internal/string/copyUnsafe + get_local $1 + get_local $3 + i32.add + set_local $1 + end get_local $7 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $7 + if + get_local $0 + get_local $1 + i32.const 1008 + get_local $6 + call $~lib/internal/string/copyUnsafe + get_local $1 + get_local $6 + i32.add + set_local $1 + end + get_local $2 i32.const 1 i32.add - set_local $7 - br $repeat|0 - unreachable + set_local $2 + br $repeat|1 end - unreachable end - block $break|1 + get_local $4 + i32.const 2 + i32.shl + get_local $5 + i32.add + i32.load offset=8 + tee_local $3 + if + get_local $0 + get_local $1 get_local $3 - i32.load offset=16 - get_local $4 - i32.add - set_local $7 - loop $repeat|1 - get_local $7 - get_local $0 - i32.load offset=4 - i32.load offset=4 - i32.lt_u - i32.eqz - br_if $break|1 - get_local $6 - get_local $7 - get_local $4 - i32.sub + get_local $3 + i32.load + call $~lib/internal/string/copyUnsafe + end + get_local $0 + ) + (func $assembly/module/index/TypeSection#toString (; 35 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + loop $repeat|0 + get_local $1 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.lt_s + if + i32.const 1000 + get_local $1 get_local $0 i32.load offset=4 i32.load - get_local $7 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $7 + tee_local $2 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $1 + i32.const 2 + i32.shl + get_local $2 + i32.add + i32.load offset=8 + else + unreachable + end + tee_local $2 + call $assembly/module/index/FuncType#toString + call $~lib/array/Array#push + drop + get_local $1 i32.const 1 i32.add - set_local $7 - br $repeat|1 - unreachable + set_local $1 + br $repeat|0 end - unreachable end - get_local $6 + call $~lib/array/Array#join ) - (func $assembly/index/removeDataSection (; 66 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/getType (; 36 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + i32.const 0 + get_local $0 + get_global $src/common/SectionId.Type + call $assembly/module/index/Module#getID + i32.load + tee_local $1 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $1 + i32.load offset=8 + else + unreachable + end + tee_local $1 + call $assembly/module/index/TypeSection#constructor get_local $0 - get_global $src/common/SectionId.Data - call $assembly/index/removeSection + i32.load offset=4 + call $assembly/module/index/TypeSection#parse + set_global $assembly/index/type + get_global $assembly/index/type + call $assembly/module/index/TypeSection#toString ) - (func $assembly/module/index/Module#get:start (; 67 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/toString (; 37 ;) (type $ii) (param $0 i32) (result i32) get_local $0 - get_global $src/common/SectionId.Start - call $assembly/module/index/Module#getID + call $assembly/module/index/TypeSection#toString ) - (func $assembly/module/index/Module#get:hasStart (; 68 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#constructor (; 38 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) - block $~lib/array/Array#get:length|inlined.7 (result i32) - get_local $0 - call $assembly/module/index/Module#get:start - set_local $1 - get_local $1 - i32.load offset=4 - end + i32.const 8 + call $~lib/allocator/arena/__memory_allocate + tee_local $1 i32.const 0 - i32.gt_s + i32.store + get_local $1 + i32.const 0 + i32.store offset=4 + get_local $1 + get_local $0 + i32.store offset=4 + get_local $1 + i32.const 1024 + i32.store + get_local $1 ) - (func $assembly/index/removeStartFunction (; 69 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#constructor (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 - call $assembly/module/index/Module#get:hasStart + i32.eqz if + i32.const 8 + call $~lib/allocator/arena/__memory_allocate + tee_local $0 + i32.const 0 + i32.store get_local $0 - get_global $src/common/SectionId.Start - call $assembly/index/removeSection - return - else - get_local $0 - i32.load offset=4 - i32.load - return + i32.const 0 + i32.store offset=4 end - unreachable - unreachable - ) - (func $assembly/index/toString (; 70 ;) (type $ii) (param $0 i32) (result i32) get_local $0 - call $assembly/module/index/TypeSection#toString - ) -<<<<<<< loader-memory-accessors - (func $assembly/module/index/Module#constructor (; 75 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $assembly/index/toString (; 60 ;) (type $ii) (param $0 i32) (result i32) + get_local $1 + i32.store + get_local $0 + get_local $1 + call $assembly/module/index/Module#constructor + i32.store offset=4 get_local $0 - call $assembly/module/index/TypeSection#toString ) - (func $assembly/module/index/Module#constructor (; 61 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/module/index/Module#constructor (; 71 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $~lib/string/String.fromUTF8 (; 40 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) - get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 8 - call $~lib/memory/memory.allocate - set_local $2 - get_local $2 - i32.const 0 - i32.store - get_local $2 - i32.const 0 - i32.store offset=4 + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $1 + i32.const 1 + i32.lt_u + if + i32.const 840 + return + end + get_local $1 + i32.const 1 + i32.shl + call $~lib/allocator/arena/__memory_allocate + set_local $6 + loop $continue|0 + get_local $2 + get_local $1 + i32.lt_u + if get_local $2 + tee_local $3 + i32.const 1 + i32.add + set_local $2 + get_local $0 + get_local $3 + i32.add + i32.load8_u + tee_local $3 + i32.const 128 + i32.lt_u + if (result i32) + get_local $4 + get_local $6 + i32.add + get_local $3 + i32.store16 + get_local $4 + i32.const 2 + i32.add + else + get_local $3 + i32.const 191 + i32.gt_u + tee_local $5 + if + get_local $3 + i32.const 224 + i32.lt_u + set_local $5 + end + get_local $5 + if + get_local $2 + i32.const 1 + i32.add + get_local $1 + i32.gt_u + if + i32.const 0 + i32.const 864 + i32.const 510 + i32.const 8 + call $~lib/env/abort + unreachable + end + get_local $2 + tee_local $5 + i32.const 1 + i32.add + set_local $2 + get_local $4 + get_local $6 + i32.add + get_local $0 + get_local $5 + i32.add + i32.load8_u + i32.const 63 + i32.and + get_local $3 + i32.const 31 + i32.and + i32.const 6 + i32.shl + i32.or + i32.store16 + else + get_local $3 + i32.const 239 + i32.gt_u + tee_local $5 + if + get_local $3 + i32.const 365 + i32.lt_u + set_local $5 + end + get_local $5 + if + get_local $2 + i32.const 3 + i32.add + get_local $1 + i32.gt_u + if + i32.const 0 + i32.const 864 + i32.const 514 + i32.const 8 + call $~lib/env/abort + unreachable + end + get_local $4 + get_local $6 + i32.add + get_local $3 + i32.const 7 + i32.and + i32.const 18 + i32.shl + get_local $2 + tee_local $5 + get_local $0 + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.const 12 + i32.shl + i32.or + get_local $2 + i32.const 1 + i32.add + tee_local $2 + get_local $0 + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.const 6 + i32.shl + i32.or + tee_local $3 + get_local $2 + i32.const 1 + i32.add + tee_local $2 + get_local $0 + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.or + i32.const 65536 + i32.sub + tee_local $3 + i32.const 10 + i32.shr_u + i32.const 55296 + i32.add + i32.store16 + get_local $6 + get_local $4 + i32.const 2 + i32.add + tee_local $4 + i32.add + get_local $3 + i32.const 1023 + i32.and + i32.const 56320 + i32.add + i32.store16 + else + get_local $2 + i32.const 2 + i32.add + get_local $1 + i32.gt_u + if + i32.const 0 + i32.const 864 + i32.const 526 + i32.const 8 + call $~lib/env/abort + unreachable + end + get_local $4 + get_local $6 + i32.add + get_local $3 + i32.const 15 + i32.and + i32.const 12 + i32.shl + get_local $2 + tee_local $5 + get_local $0 + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.const 6 + i32.shl + i32.or + tee_local $3 + get_local $2 + i32.const 1 + i32.add + tee_local $2 + get_local $0 + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.or + i32.store16 + end + get_local $2 + i32.const 1 + i32.add + set_local $2 + end + get_local $4 + i32.const 2 + i32.add + end + set_local $4 + br $continue|0 end - tee_local $0 end - tee_local $0 get_local $1 - i32.store offset=4 - get_local $0 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 1352 - i32.store - get_local $0 - ) - (func $assembly/index/Parser#constructor (; 76 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - i32.const 1024 - i32.store - get_local $0 - ) - (func $assembly/index/Parser#constructor (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - i32.const 1128 - i32.store - get_local $0 - ) - (func $assembly/index/Parser#constructor (; 72 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 8 - call $~lib/memory/memory.allocate - set_local $2 - get_local $2 - i32.const 0 - i32.store - get_local $2 - i32.const 0 - i32.store offset=4 - get_local $2 - end - tee_local $0 + get_local $2 + i32.ne + if + i32.const 0 + i32.const 864 + i32.const 535 + i32.const 4 + call $~lib/env/abort + unreachable end + get_local $4 + i32.const 1 + i32.shr_u + call $~lib/internal/string/allocateUnsafe tee_local $0 - get_local $1 - i32.store - get_local $0 - i32.const 0 - get_local $1 - call $assembly/module/index/Module#constructor - i32.store offset=4 + i32.const 4 + i32.add + get_local $6 + get_local $4 + call $~lib/internal/memory/memmove get_local $0 ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/index/Parser#parseString (; 77 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $assembly/index/Parser#parseString (; 63 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/index/Parser#parseString (; 73 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $assembly/index/Parser#parseString (; 41 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 get_local $0 i32.load - i32.const 32 call $assembly/buffer/index/Buffer#readVaruint call $~lib/string/String.fromUTF8 ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/index/Parser#readVaruint (; 78 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $assembly/index/Parser#readVaruint (; 64 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/index/Parser#readVaruint (; 78 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/index/Parser#readVaruint (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $assembly/index/Parser#readVaruint (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.load - get_local $1 call $assembly/buffer/index/Buffer#readVaruint ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/index/Parser#get:off (; 79 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $assembly/index/Parser#get:off (; 65 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/index/Parser#get:off (; 79 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/index/Parser#get:off (; 75 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $assembly/index/Parser#get:off (; 43 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/index/Parser#set:off (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) -======= - (func $assembly/index/Parser#set:off (; 66 ;) (type $iiv) (param $0 i32) (param $1 i32) ->>>>>>> Working on sections. -======= - (func $assembly/index/Parser#set:off (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/index/Parser#set:off (; 76 ;) (type $iiv) (param $0 i32) (param $1 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_local $0 - i32.load - get_local $1 - i32.store offset=8 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - (func $~lib/arraybuffer/ArrayBuffer#get:data (; 81 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - ) - (func $assembly/buffer/index/Buffer#readUint (; 82 ;) (type $ii) (param $0 i32) (result i32) -<<<<<<< loader-memory-accessors -======= - (func $assembly/buffer/index/Buffer#readUint (; 67 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/buffer/index/Buffer#readUint (; 77 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $1 i32) - (local $2 i32) + (func $assembly/index/Parser#set:off (; 44 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 - i32.load offset=8 - set_local $1 - get_local $1 i32.load - set_local $2 - get_local $0 get_local $1 - i32.const 4 - i32.add i32.store offset=8 - get_local $2 ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/module/index/sectionName (; 83 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $assembly/module/index/sectionName (; 68 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/module/index/sectionName (; 83 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/module/index/sectionName (; 78 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $assembly/module/index/sectionName (; 45 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) - block $break|0 - block $case12|0 - block $case11|0 - block $case10|0 - block $case9|0 - block $case8|0 - block $case7|0 - block $case6|0 - block $case5|0 - block $case4|0 - block $case3|0 - block $case2|0 - block $case1|0 - block $case0|0 - get_local $0 - set_local $1 - get_local $1 - i32.const 0 - i32.eq - br_if $case0|0 - get_local $1 - i32.const 1 - i32.eq - br_if $case1|0 + block $case12|0 + block $case11|0 + block $case10|0 + block $case9|0 + block $case8|0 + block $case7|0 + block $case6|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + get_local $0 + if + get_local $0 + tee_local $1 + i32.const 1 + i32.eq + br_if $case1|0 + block $tablify|0 get_local $1 i32.const 2 - i32.eq - br_if $case2|0 - get_local $1 - i32.const 3 - i32.eq - br_if $case3|0 - get_local $1 - i32.const 4 - i32.eq - br_if $case4|0 - get_local $1 - i32.const 5 - i32.eq - br_if $case5|0 - get_local $1 - i32.const 6 - i32.eq - br_if $case6|0 - get_local $1 - i32.const 7 - i32.eq - br_if $case7|0 - get_local $1 - i32.const 8 - i32.eq - br_if $case8|0 - get_local $1 - i32.const 9 - i32.eq - br_if $case9|0 - get_local $1 - i32.const 10 - i32.eq - br_if $case10|0 - get_local $1 - i32.const 11 - i32.eq - br_if $case11|0 - br $case12|0 + i32.sub + br_table $case2|0 $case3|0 $case4|0 $case5|0 $case6|0 $case7|0 $case8|0 $case9|0 $case10|0 $case11|0 $tablify|0 end -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 1424 - return - end - i32.const 1440 - return - end - i32.const 1456 - return - end - i32.const 1472 -======= - i32.const 1040 -======= - i32.const 1424 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 1144 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - return + br $case12|0 end - i32.const 1160 + i32.const 1040 return end - i32.const 1176 + i32.const 1056 return end -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 1088 ->>>>>>> Working on sections. -======= - i32.const 1472 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 1192 ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + i32.const 1072 return end - i32.const 1216 + i32.const 1088 return end - i32.const 1232 + i32.const 1112 return end - i32.const 1248 + i32.const 1128 return end - i32.const 1264 + i32.const 1144 return end - i32.const 1280 + i32.const 1160 return end - i32.const 1296 + i32.const 1176 return end - i32.const 1320 + i32.const 1192 return end - i32.const 1336 + i32.const 1216 return end - unreachable - unreachable + i32.const 1232 + return end unreachable -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 960 ) - (func $assembly/module/index/SectionHeader#constructor (; 84 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - i32.const 824 - ) - (func $assembly/module/index/SectionHeader#constructor (; 69 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - i32.const 960 - ) - (func $assembly/module/index/SectionHeader#constructor (; 84 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - i32.const 912 - ) - (func $assembly/host/index/log (; 79 ;) (type $iv) (param $0 i32) - get_local $0 - call $assembly/host/index/_logi - ) - (func $assembly/module/index/SectionHeader#constructor (; 80 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $assembly/module/index/SectionHeader#constructor (; 46 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) (local $2 i32) (local $3 i32) - (local $4 i32) + i32.const 20 + call $~lib/allocator/arena/__memory_allocate + tee_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + i32.const 0 + i32.store offset=8 + get_local $2 + i32.const 0 + i32.store offset=12 + get_local $2 + i32.const 840 + i32.store offset=16 + get_local $2 + tee_local $1 get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 24 - call $~lib/memory/memory.allocate - set_local $2 - get_local $2 - i32.const 0 - i32.store - get_local $2 - i32.const 0 - i32.store offset=4 - get_local $2 - i32.const 0 - i32.store offset=8 - get_local $2 - i32.const 0 - i32.store offset=12 - get_local $2 -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - i32.const 0 -======= - i32.const 824 ->>>>>>> Working on sections. -======= - i32.const 0 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - i32.store offset=16 - get_local $2 - i32.const 912 - i32.store offset=20 - get_local $2 - end - tee_local $0 - end - tee_local $0 - get_local $1 i32.load offset=8 i32.store - get_local $0 - get_local $0 - i32.load get_local $1 - i32.load offset=12 - i32.sub - i32.store offset=16 get_local $0 - get_local $1 - i32.const 7 call $assembly/buffer/index/Buffer#readVaruint i32.store offset=4 - get_local $0 get_local $1 - i32.const 32 + get_local $0 call $assembly/buffer/index/Buffer#readVaruint i32.store offset=8 - get_local $0 + get_local $1 i32.load offset=4 - i32.const 0 - i32.eq if get_local $1 + i32.load offset=4 + get_global $src/common/SectionId.Data + i32.le_u + if + get_local $1 + get_local $1 + i32.load offset=4 + call $assembly/module/index/sectionName + i32.store offset=16 + else + unreachable + end + else + get_local $0 i32.load offset=8 set_local $2 - get_local $1 - i32.const 32 + get_local $0 call $assembly/buffer/index/Buffer#readVaruint set_local $3 get_local $1 - i32.load offset=8 - set_local $4 + i32.const 1032 get_local $0 - i32.const 1136 - get_local $4 + i32.load offset=8 get_local $3 call $~lib/string/String.fromUTF8 call $~lib/string/String.__concat - i32.const 1136 + i32.const 1032 call $~lib/string/String.__concat - i32.store offset=20 - get_local $1 - get_local $1 + i32.store offset=16 + get_local $0 + get_local $0 i32.load offset=8 get_local $3 i32.add i32.store offset=8 - get_local $0 - get_local $0 - i32.load offset=8 get_local $1 + get_local $1 + i32.load offset=8 + get_local $0 i32.load offset=8 get_local $2 i32.sub i32.sub i32.store offset=8 - else - get_local $0 - i32.load offset=4 - get_global $src/common/SectionId.Data - i32.le_u - if - get_local $0 - get_local $0 - i32.load offset=4 - call $assembly/module/index/sectionName - i32.store offset=20 - else - get_local $0 - i32.load - call $assembly/host/index/log - i32.const 1352 - get_local $0 - i32.load offset=4 - call $~lib/internal/number/itoa - call $~lib/string/String.__concat - call $assembly/host/index/err - end end - get_local $0 get_local $1 + get_local $0 i32.load offset=8 i32.store offset=12 - get_local $0 - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/module/index/Module#parseSection (; 85 ;) (type $iiv) (param $0 i32) (param $1 i32) -======= - (func $assembly/module/index/Module#parseSection (; 70 ;) (type $iiv) (param $0 i32) (param $1 i32) ->>>>>>> Working on sections. -======= - (func $assembly/module/index/Module#parseSection (; 85 ;) (type $iiv) (param $0 i32) (param $1 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/module/index/Module#parseSection (; 81 ;) (type $iiv) (param $0 i32) (param $1 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - get_local $0 - i32.load get_local $1 - call $~lib/array/Array#push - drop - block $break|0 - block $case1|0 - block $case0|0 - get_local $1 - i32.load offset=4 - set_local $2 - get_local $2 - get_global $src/common/SectionId.Type - i32.eq - br_if $case0|0 - br $case1|0 - end - br $break|0 - end - end - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/index/Parser#parse (; 86 ;) (type $iv) (param $0 i32) -======= - (func $assembly/module/index/SectionHeader#get:end (; 71 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - i32.load offset=12 - get_local $0 - i32.load offset=8 - i32.add ) - (func $assembly/index/Parser#parse (; 72 ;) (type $iv) (param $0 i32) ->>>>>>> Working on sections. -======= - (func $assembly/index/Parser#parse (; 86 ;) (type $iv) (param $0 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/index/Parser#parse (; 82 ;) (type $iv) (param $0 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $assembly/index/Parser#parse (; 47 ;) (type $iv) (param $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) - get_local $0 - call $assembly/index/Parser#get:off - set_local $1 get_local $0 i32.load - call $assembly/buffer/index/Buffer#readUint - set_local $2 + tee_local $1 + i32.load offset=8 + tee_local $2 + i32.load + set_local $3 + get_local $1 get_local $2 + i32.const 4 + i32.add + i32.store offset=8 + get_local $3 i32.const 1836278016 i32.ne if @@ -8527,318 +3385,140 @@ end get_local $0 i32.load - call $assembly/buffer/index/Buffer#readUint + tee_local $1 + i32.load offset=8 + tee_local $2 + i32.load set_local $3 + get_local $1 + get_local $2 + i32.const 4 + i32.add + i32.store offset=8 get_local $3 i32.const 1 i32.ne if unreachable end - i32.const 0 - set_local $4 - i32.const 0 - set_local $5 - i32.const 0 - set_local $6 - i32.const 0 - set_local $7 - block $break|0 - loop $continue|0 + loop $continue|0 + get_local $0 + i32.load + i32.load offset=8 + get_local $0 + i32.load + i32.load offset=4 + i32.lt_u + if get_local $0 i32.load - i32.load offset=8 + call $assembly/module/index/SectionHeader#constructor + set_local $1 get_local $0 + i32.load offset=4 i32.load - i32.load offset=16 - i32.lt_u - if - block - i32.const 0 - get_local $0 - i32.load - call $assembly/module/index/SectionHeader#constructor - set_local $8 - get_local $0 - i32.load offset=4 - get_local $8 - call $assembly/module/index/Module#parseSection -<<<<<<< loader-memory-accessors - i32.const 1664 - call $assembly/host/index/log -<<<<<<< loader-memory-accessors - get_local $0 - call $assembly/index/Parser#get:off - call $assembly/host/index/log - get_local $8 - i32.load - get_local $1 - i32.sub - call $assembly/host/index/log - get_local $8 - i32.load offset=16 - call $assembly/host/index/log - get_local $8 - call $assembly/module/index/SectionHeader#get:end - get_local $1 - i32.sub - call $assembly/host/index/log - i32.const 1664 - call $assembly/host/index/log - get_local $0 -======= - get_local $0 - call $assembly/index/Parser#get:off - call $assembly/host/index/log - get_local $8 - i32.load - get_local $1 - i32.sub - call $assembly/host/index/log - get_local $8 - i32.load offset=16 - call $assembly/host/index/log - get_local $8 - call $assembly/module/index/SectionHeader#get:end - get_local $1 - i32.sub - call $assembly/host/index/log - i32.const 1664 - call $assembly/host/index/log -======= ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_local $0 ->>>>>>> Remove start correctly. Now need to abstract to remove any section. - get_local $8 - call $assembly/module/index/SectionHeader#get:end - call $assembly/index/Parser#set:off - end - br $continue|0 + get_local $1 + call $~lib/array/Array#push + drop + block $break|0 + get_global $src/common/SectionId.Type + get_local $1 + i32.load offset=4 + i32.eq + br_if $break|0 end - end - end - ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/buffer/index/Buffer#constructor (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) -======= - (func $~lib/arraybuffer/ArrayBuffer#get:data (; 73 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $~lib/arraybuffer/ArrayBuffer#get:data (; 83 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_local $0 - get_global $~lib/internal/arraybuffer/HEADER_SIZE - i32.add - ) -<<<<<<< loader-memory-accessors - (func $assembly/buffer/index/Buffer#constructor (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/buffer/index/Buffer#constructor (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/buffer/index/Buffer#constructor (; 84 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $2 i32) - get_local $0 - if (result i32) - get_local $0 - else - block (result i32) - i32.const 20 - call $~lib/memory/memory.allocate - set_local $2 - get_local $2 - i32.const 0 - i32.store - get_local $2 - i32.const 0 - i32.store offset=4 - get_local $2 - i32.const 0 + get_local $0 + i32.load + get_local $1 + i32.load offset=12 + get_local $1 + i32.load offset=8 + i32.add i32.store offset=8 - get_local $2 - i32.const 0 - i32.store offset=12 - get_local $2 - i32.const 0 - i32.store offset=16 - get_local $2 + br $continue|0 end - tee_local $0 end - tee_local $0 - get_local $1 + ) + (func $assembly/buffer/index/Buffer#constructor (; 48 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + i32.const 20 + call $~lib/allocator/arena/__memory_allocate + tee_local $1 + i32.const 0 i32.store + get_local $1 + i32.const 0 + i32.store offset=4 + get_local $1 + i32.const 0 + i32.store offset=8 + get_local $1 + i32.const 0 + i32.store offset=12 + get_local $1 + i32.const 0 + i32.store offset=16 + get_local $1 get_local $0 + i32.store get_local $1 + get_local $0 i32.load - call $~lib/arraybuffer/ArrayBuffer#get:data + i32.const 8 + i32.add i32.store offset=8 - get_local $0 get_local $1 + get_local $0 i32.load offset=8 i32.store offset=4 - get_local $0 - get_local $0 + get_local $1 + get_local $1 i32.load offset=8 i32.store offset=12 - get_local $0 - get_local $0 + get_local $1 + get_local $1 i32.load offset=8 - get_local $0 + get_local $1 i32.load offset=4 i32.add i32.store offset=16 - get_local $0 -<<<<<<< loader-memory-accessors - ) -<<<<<<< loader-memory-accessors - (func $assembly/host/index/log (; 88 ;) (type $iv) (param $0 i32) - get_local $0 - i32.const 20 - call $assembly/host/index/_log - ) - (func $assembly/index/newParser (; 89 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $assembly/index/newParser (; 75 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - ) -<<<<<<< loader-memory-accessors - (func $assembly/host/index/log (; 88 ;) (type $iv) (param $0 i32) - get_local $0 - i32.const 20 - call $assembly/host/index/_log + get_local $1 ) - (func $assembly/index/newParser (; 89 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/index/newParser (; 85 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - (local $1 i32) + (func $assembly/index/newParser (; 49 ;) (type $ii) (param $0 i32) (result i32) i32.const 0 get_local $0 call $assembly/buffer/index/Buffer#constructor - set_local $1 - i32.const 0 - get_local $1 call $assembly/index/Parser#constructor ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $assembly/index/parse (; 90 ;) (type $ii) (param $0 i32) (result i32) -======= - (func $assembly/index/parse (; 76 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Working on sections. -======= - (func $assembly/index/parse (; 90 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $assembly/index/parse (; 86 ;) (type $ii) (param $0 i32) (result i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $assembly/index/parse (; 50 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/index/Parser#parse get_local $0 i32.load offset=4 ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $start (; 91 ;) (type $v) -======= - (func $start (; 77 ;) (type $v) ->>>>>>> Working on sections. -======= - (func $start (; 91 ;) (type $v) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $start (; 87 ;) (type $v) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. - get_global $HEAP_BASE - get_global $~lib/internal/allocator/AL_MASK - i32.add - get_global $~lib/internal/allocator/AL_MASK - i32.const -1 - i32.xor - i32.and + (func $start (; 51 ;) (type $v) + i32.const 1248 set_global $~lib/allocator/arena/startOffset get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset - nop -<<<<<<< loader-memory-accessors - i32.const 8 - call $assembly/host/index/log -<<<<<<< loader-memory-accessors ) -<<<<<<< loader-memory-accessors - (func $null (; 92 ;) (type $v) - ) - (func $Parser#get:buf (; 93 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - i32.load - ) - (func $Parser#set:buf (; 94 ;) (type $iiv) (param $0 i32) (param $1 i32) -======= - (func $null (; 78 ;) (type $v) -======= - ) - (func $null (; 92 ;) (type $v) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - ) - (func $null (; 88 ;) (type $v) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $null (; 52 ;) (type $v) + nop ) - (func $Parser#get:buf (; 89 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:buf (; 53 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $Parser#set:buf (; 80 ;) (type $iiv) (param $0 i32) (param $1 i32) ->>>>>>> Working on sections. -======= - (func $Parser#set:buf (; 94 ;) (type $iiv) (param $0 i32) (param $1 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $Parser#set:buf (; 90 ;) (type $iiv) (param $0 i32) (param $1 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $Parser#set:buf (; 54 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store ) -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors - (func $Parser#get:module (; 95 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - i32.load offset=4 - ) - (func $Parser#set:module (; 96 ;) (type $iiv) (param $0 i32) (param $1 i32) -======= - (func $Parser#get:module (; 81 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - i32.load offset=4 - ) - (func $Parser#set:module (; 82 ;) (type $iiv) (param $0 i32) (param $1 i32) ->>>>>>> Working on sections. -======= - (func $Parser#get:module (; 95 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - i32.load offset=4 - ) - (func $Parser#set:module (; 96 ;) (type $iiv) (param $0 i32) (param $1 i32) ->>>>>>> Remove start correctly. Now need to abstract to remove any section. -======= - (func $Parser#get:module (; 91 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:module (; 55 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) - (func $Parser#set:module (; 92 ;) (type $iiv) (param $0 i32) (param $1 i32) ->>>>>>> Added a test assembly file to parse instead of parser self parsing. + (func $Parser#set:module (; 56 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store offset=4 diff --git a/lib/parse/package.json b/lib/parse/package.json index 384da4e80b..704a774815 100644 --- a/lib/parse/package.json +++ b/lib/parse/package.json @@ -5,7 +5,7 @@ "main": "index.js", "types": "index.d.ts", "scripts": { - "asbuild": "asc assembly/index.ts -O3 -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate", + "asbuild": "asc assembly/index.ts -O3 -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate -d build/index.d.ts", "asbuild:untouched": "asc assembly/index.ts -b build/index.wasm -t build/index.wat --debug --importMemory --sourceMap --validate", "build": "npm run asbuild && webpack --mode production --display-modules", "asbuild:test": "asc tests/assembly/index.ts -b build/test.wasm -t build/test.wat --debug --importMemory --sourceMap --validate", diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index 220a57baaf..1fba88c629 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -1,74 +1,76 @@ import { Type, SectionId, ExternalKind, newParser } from "./common"; import assert = require("assert"); export { Type, SectionId, ExternalKind }; -import * as loader from "../../loader"; +import * as loader from "../../loader/src"; +import ASModule from "../build"; type Instance = loader.ASUtil & T; -type Parser = {parse: (any)=> any, newParser: (any)=>any}; +// type Parser = {parse: (any)=> any, newParser: (any)=>any}; /** Cached compiled parser. */ var compiled: WebAssembly.Module | null = null; var WASM_DATA: string; // injected by webpack if (typeof WASM_DATA !== "string") WASM_DATA = require("fs").readFileSync(__dirname + "/../build/index.wasm", "base64"); -/** Options specified to the parser. The `onSection` callback determines the sections being evaluated in detail. */ -export interface ParseOptions { - /** Called with each section in the binary. Returning `true` evaluates the section. */ - onSection?(id: SectionId, payloadOff: number, payloadLen: number, nameOff: number, nameLen: number): boolean; - /** Called with each function type if the type section is evaluated. */ - onType?(index: number, form: number): void; - /** Called with each function parameter if the type section is evaluated. */ - onTypeParam?(index: number, paramIndex: number, paramType: Type): void; - /** Called with each function return type if the type section is evaluated. */ - onTypeReturn?(index: number, returnIndex: number, returnType: Type): void; - /** Called with each import if the import section is evaluated. */ - onImport?(index: number, kind: ExternalKind, moduleOff: number, moduleLen: number, fieldOff: number, fieldLen: number): void; - /** Called with each function import if the import section is evaluated. */ - onFunctionImport?(index: number, type: number): void; - /** Called with each table import if the import section is evaluated. */ - onTableImport?(index: number, type: Type, initial: number, maximum: number, flags: number): void; - /** Called with each memory import if the import section is evaluated. */ - onMemoryImport?(index: number, initial: number, maximum: number, flags: number): void; - /** Called with each global import if the import section is evaluated. */ - onGlobalImport?(index: number, type: Type, mutability: number): void; - /** Called with each memory if the memory section is evaluated.*/ - onMemory?(index: number, initial: number, maximum: number, flags: number): void; - /** Called with each function if the function section is evaluated. */ - onFunction?(index: number, typeIndex: number): void; - /** Called with each table if the table section is evaluated.*/ - onTable?(index: number, type: Type, initial: number, maximum: number, flags: number): void; - /** Called with each global if the global section is evaluated. */ - onGlobal?(index: number, type: Type, mutability: number): void; - /** Called with the start function index if the start section is evaluated. */ - onStart?(index: number): void; - /** Called with each export if the export section is evaluated. */ - onExport?(index: number, kind: ExternalKind, kindIndex: number, nameOff: number, nameLen: number): void; - /** Called with the source map URL if the 'sourceMappingURL' section is evaluated. */ - onSourceMappingURL?(offset: number, length: number): void; - /** Called with the module name if present and the 'name' section is evaluated. */ - onModuleName?(offset: number, length: number): void; - /** Called with each function name if present and the 'name' section is evaluated. */ - onFunctionName?(index: number, offset: number, length: number): void; - /** Called with each local name if present and the 'name' section is evaluated. */ - onLocalName?(funcIndex: number, index: number, offset: number, length: number): void; +class WasmParser { + public memory: loader.ASMemory; + public instance: Instance; + constructor(public binary: Uint8Array){ + // compile the parser if not yet compiled + if (!compiled) compiled = new WebAssembly.Module(base64_decode(WASM_DATA)); + + // use the binary as the parser's memory + var nBytes = binary.length; + var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16; + let memory = loader.createMemory({ initial: nPages }); + this.memory = memory; + var imports = { + env: { + abort: console.error, + memory + }, + index: { + debug: () => {debugger; }, + _log: (start, sizeof) => { + let begin = start >> 2; + let size = sizeof >> 2; + if (size == 1 ){ + console.log(start); + } else { + let str = [] + let len = 0; + for (let i = begin; i < begin+size; i++){ + let line = `| ${i} | ${memory.I32[i]>>2}`; + len = Math.max(len, line.length); + str.push(line); + } + let space = " "; + let output = str.map((v,i,a)=> v + (space as any).repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = (dash as any).repeat(len+2); + console.log([line,output.join('\n'+line+'\n'),line].join("\n")); + } + }, + _log_str:(x) => console.log(loader.utils.readString(memory.U32, memory.U16, x)), + _logi: console.log, + _logf: console.log + }, + options: {}, + } + this.instance = loader.instantiate(compiled, imports); + let array = this.instance.newArray(new Uint8Array(binary)) + let parserPtr = this.instance.newParser(array); + } } -let memory: WebAssembly.Memory; + + /** Parses the contents of a WebAssembly binary according to the specified options. */ -export function parse(binary: Uint8Array, options?: ParseOptions): void { - if (!options) options = {}; +export function parse(binary: Uint8Array): void { - // compile the parser if not yet compiled - if (!compiled) compiled = new WebAssembly.Module(base64_decode(WASM_DATA)); - // use the binary as the parser's memory - var nBytes = binary.length; - var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16; - memory = new WebAssembly.Memory({ initial: nPages }); - var buffer = new Uint32Array(memory.buffer); - var buffer16 = new Uint16Array(memory.buffer); // buffer.set(binary); // provide a way to read strings from memory @@ -77,74 +79,18 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { parse.readUint32 = (index: number): number => { return buffer[index]; } - var instance: Instance; + // instantiate the parser and return its exports - var imports = { - env: { - abort: console.error, - memory - }, - index: { - debug: () => {debugger; }, - _log: (start, sizeof) => { - let begin = start >> 2; - let size = sizeof >> 2; - if (size == 1 ){ - console.log(start); - } else { - let str = [] - let len = 0; - for (let i = begin; i < begin+size; i++){ - let line = `| ${i} | ${instance.I32[i]>>2}`; - len = Math.max(len, line.length); - str.push(line); - } - let space = " "; - let output = str.map((v,i,a)=> v + (space as any).repeat(len - v.length + 1) + "|"); - let dash = "-"; - let line = (dash as any).repeat(len+2); - console.log([line,output.join('\n'+line+'\n'),line].join("\n")); - } - }, - _log_str:(x) => console.log(loader.getStringImpl(buffer, buffer16, x)), - _logi: console.log, - _logf: console.log - }, - options: {}, - }; - [ "onSection", - "onType", - "onTypeParam", - "onTypeReturn", - "onImport", - "onFunctionImport", - "onTableImport", - "onMemoryImport", - "onGlobalImport", - "onMemory", - "onFunction", - "onTable", - "onGlobal", - "onExport", - "onStart", - "onSourceMappingURL", - "onModuleName", - "onFunctionName", - "onLocalName" - ].forEach((name: string): void => imports.options[name] = options[name] || function() {}); - instance = loader.instantiate(compiled, imports); + + let array = instance.newArray(new Uint8Array(binary)) let parserPtr = instance.newParser(array); let Mod = instance.parse(parserPtr); console.log(instance.getString((instance as any).getType(Mod))); (instance as any).getImports(Mod); -<<<<<<< loader-memory-accessors -<<<<<<< loader-memory-accessors -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. // let arraybuf = instance.getArray(Uint8Array, array); let newptr = (instance as any).removeDataSection(Mod); // debugger; @@ -170,11 +116,6 @@ export function parse(binary: Uint8Array, options?: ParseOptions): void { let instance2 = loader.instantiateBuffer(buf, imports); instance2.start(); -<<<<<<< loader-memory-accessors -======= ->>>>>>> Working on sections. -======= ->>>>>>> Remove start correctly. Now need to abstract to remove any section. // let sections = buffer.slice(instance.I32[Mod], 2); // console.log(sections[1]) // let arrayBuf = sections[0]>>2; diff --git a/lib/parse/tests/index.ts b/lib/parse/tests/index.ts index f57b3845eb..b9202eea09 100644 --- a/lib/parse/tests/index.ts +++ b/lib/parse/tests/index.ts @@ -6,117 +6,12 @@ import { parse } from "../src"; -function onSection(id: SectionId, offset: number, length: number, nameOffset: number, nameLength: number): boolean { - var name = id == 0 ? "'" + parse.readString(nameOffset, nameLength) + "'" : SectionId[id]; - console.log(name + " section at " + offset + ".." + (offset + length)); - return true; -} - -function onType(index: number, form: Type): void { - console.log("- FunctionType[" + index + "]: " + Type[form]); -} - -function onTypeParam(index: number, paramIndex: number, paramType: Type): void { - console.log(" > param[" + paramIndex + "] -> " + Type[paramType]); -} - -function onTypeReturn(index: number, returnIndex: number, returnType: Type): void { - console.log(" > return[" + returnIndex + "] -> " + Type[returnType]); -} - -function onImport(index: number, kind: ExternalKind, moduleOff: number, moduleLen: number, fieldOff: number, fieldLen: number): void { - var moduleName = parse.readString(moduleOff, moduleLen); - var fieldName = parse.readString(fieldOff, fieldLen); - console.log("- Import[" + index + "]: '" + moduleName + "." + fieldName + "'"); -} - -function onFunctionImport(funIndex: number, type: number): void { - console.log(" - Function[" + funIndex + "] -> FunctionType[" + type + "]"); -} - -function onTableImport(tblIndex: number, type: Type, initial: number, maximum: number, flags: number): void { - console.log(" - Table[" + tblIndex + "] -> " + Type[type] + ": initial=" + initial + ", maximum=" + maximum); -} - -function onMemoryImport(memIndex: number, initial: number, maximum: number, flags: number): void { - console.log(" - Memory[" + memIndex + "]: initial=" + initial + ", maximum=" + maximum); -} - -function onGlobalImport(gloIndex: number, type: Type, mutability: number): void { - console.log(" - Global[" + gloIndex + "]: " + (mutability & 1 ? "mutable " : "const ") + Type[type]); -} - -function onMemory(memIndex: number, initial: number, maximum: number, flags: number): void { - console.log("- Memory[" + memIndex + "]: initial=" + initial + ", maximum=" + maximum); -} - -function onFunction(funIndex: number, typeIndex: number): void { - console.log("- Function[" + funIndex + "] -> FunctionType[" + typeIndex + "]"); -} - -function onTable(tblIndex: number, type: number, initial: number, maximum: number, flags: number): void { - console.log("- Table[" + tblIndex + "] -> " + Type[type] + ": initial=" + initial + ", maximum=" + (maximum >>> 0)); -} - -function onGlobal(gloIndex: number, type: Type, mutability: number): void { - console.log("- Global[" + gloIndex + "]: " + (mutability & 1 ? "mutable " : "const ") + Type[type]); -} - -function onStart(index: number): void { - console.log("- Start: Function[" + index + "]"); -} - -function onExport(index: number, kind: ExternalKind, kindIndex: number, fieldOffset: number, fieldLength: number): void { - var field = parse.readString(fieldOffset, fieldLength); - console.log("- Export[" + index + "], '" + field + "' -> " + ExternalKind[kind] + "[" + kindIndex + "]"); -} - -function onSourceMappingURL(offset: number, length: number): void { - var url = parse.readString(offset, length); - console.log("- sourceMap: " + url); -} - -function onModuleName(offset: number, length: number): void { - var name = parse.readString(offset, length); - console.log("- moduleName: " + name); -} - -function onFunctionName(index: number, offset: number, length: number): void { - var name = parse.readString(offset, length); - console.log(" - Function[" + index + "] name: " + name); -} - -function onLocalName(funcIndex: number, index: number, offset: number, length: number): void { - var name = parse.readString(offset, length); - console.log(" - Function[" + funcIndex + "].local[" + index + "] name: " + name); -} - [ "../build/test.wasm", // "../build/index.wasm", // "libm.wasm" ].forEach((filename: string): void => { const binary: Uint8Array = fs.readFileSync(__dirname + "/" + filename); console.log("Testing '" + filename + "' ..."); - parse(binary, { - onSection, - onType, - onTypeParam, - onTypeReturn, - onImport, - onFunctionImport, - onTableImport, - onMemoryImport, - onGlobalImport, - onMemory, - onFunction, - onTable, - onGlobal, - onStart, - onExport, - onSourceMappingURL, - onModuleName, - onFunctionName, - onLocalName - }); + console.log(); }); From fce07737c534786364b2e6e90fbbdd3f148d0d8d Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Sun, 3 Feb 2019 10:47:43 -0500 Subject: [PATCH 22/46] Runs again --- lib/parse/assembly/index.ts | 4 +- lib/parse/build/index.d.ts | 20 + lib/parse/build/index.wat | 1462 ++++++++++++++++++++++++++--------- lib/parse/src/index.ts | 128 +-- lib/parse/tests/index.ts | 7 +- 5 files changed, 1152 insertions(+), 469 deletions(-) diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index d56bf4679d..d11b1c9f6a 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -20,7 +20,7 @@ import {log} from './host'; declare function debug():void; -log("in the start function!"); +// log("in the start function!"); // type FunctionName = string | symbol; // type Instance = [Function, Object]; // @@ -193,3 +193,5 @@ export function parse(p: Parser): Module { p.parse(); return p.module; } + +export {TypeSection, Module} diff --git a/lib/parse/build/index.d.ts b/lib/parse/build/index.d.ts index 92514c6430..0aa4f8c604 100644 --- a/lib/parse/build/index.d.ts +++ b/lib/parse/build/index.d.ts @@ -9,6 +9,8 @@ declare module ASModule { type f64 = number; type bool = any; function getType(m: u32): u32; + function getImports(m: u32): void; + function removeStartFunction(m: u32): u32; function toString(t: u32): u32; class Parser { constructor(buf: u32); @@ -29,5 +31,23 @@ declare module ASModule { function free(ptr: u32): void; function reset(): void; } + class TypeSection { + header: u32; + funcs: u32; + parse(buf: u32): u32; + toString(): u32; + } + class Module { + constructor(buf: u32); + headers: u32; + buf: u32; + Type: u32; + hasStart: bool; + start: u32; + parseSection(header: u32): void; + getID(id: i32): u32; + getType(): u32; + getImports(): u32; + } } export default ASModule; diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index 14040e60f8..84aa0f2df7 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -12,57 +12,82 @@ (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) (type $FUNCSIG$i (func (result i32))) (import "env" "memory" (memory $0 1)) - (data (i32.const 16) "\08") - (data (i32.const 24) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") - (data (i32.const 56) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s") - (data (i32.const 128) "x") - (data (i32.const 136) "\01\00\00\000") - (data (i32.const 144) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") - (data (i32.const 200) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009") - (data (i32.const 712) "\c8\00\00\00d") - (data (i32.const 720) "\03\00\00\00i\003\002") - (data (i32.const 736) "\03\00\00\00i\006\004") - (data (i32.const 752) "\03\00\00\00f\003\002") - (data (i32.const 768) "\03\00\00\00f\006\004") - (data (i32.const 784) "\07\00\00\00a\00n\00y\00f\00u\00n\00c") - (data (i32.const 808) "\04\00\00\00f\00u\00n\00c") - (data (i32.const 824) "\04\00\00\00n\00o\00n\00e") - (data (i32.const 848) "\04\00\00\00n\00u\00l\00l") - (data (i32.const 864) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") - (data (i32.const 896) "\02\00\00\00,\00 ") - (data (i32.const 904) "\04\00\00\00v\00o\00i\00d") - (data (i32.const 920) "\07\00\00\00i\00n\00d\00e\00x\00:\00 ") - (data (i32.const 944) "\06\00\00\00f\00o\00r\00m\00:\00 ") - (data (i32.const 960) "\03\00\00\00,\00 \00(") - (data (i32.const 976) "\05\00\00\00)\00 \00=\00>\00 ") - (data (i32.const 1000) "\e0\03") - (data (i32.const 1008) "\01\00\00\00\n") - (data (i32.const 1024) "\f8\03") - (data (i32.const 1032) "\01\00\00\00\'") - (data (i32.const 1040) "\06\00\00\00C\00u\00s\00t\00o\00m") - (data (i32.const 1056) "\04\00\00\00T\00y\00p\00e") - (data (i32.const 1072) "\06\00\00\00I\00m\00p\00o\00r\00t") - (data (i32.const 1088) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n") - (data (i32.const 1112) "\05\00\00\00T\00a\00b\00l\00e") - (data (i32.const 1128) "\06\00\00\00M\00e\00m\00o\00r\00y") - (data (i32.const 1144) "\06\00\00\00G\00l\00o\00b\00a\00l") - (data (i32.const 1160) "\06\00\00\00E\00x\00p\00o\00r\00t") - (data (i32.const 1176) "\05\00\00\00S\00t\00a\00r\00t") - (data (i32.const 1192) "\07\00\00\00E\00l\00e\00m\00e\00n\00t") - (data (i32.const 1216) "\04\00\00\00C\00o\00d\00e") - (data (i32.const 1232) "\04\00\00\00D\00a\00t\00a") - (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) + (data (i32.const 8) "\16\00\00\00i\00n\00 \00t\00h\00e\00 \00s\00t\00a\00r\00t\00 \00f\00u\00n\00c\00t\00i\00o\00n\00!") + (data (i32.const 56) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") + (data (i32.const 88) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s") + (data (i32.const 152) "\18\00\00\00a\00s\00s\00e\00m\00b\00l\00y\00/\00m\00o\00d\00u\00l\00e\00/\00i\00n\00d\00e\00x\00.\00t\00s") + (data (i32.const 208) "\01\00\00\000") + (data (i32.const 216) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") + (data (i32.const 272) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009") + (data (i32.const 784) "\10\01\00\00d") + (data (i32.const 792) "\03\00\00\00i\003\002") + (data (i32.const 808) "\03\00\00\00i\006\004") + (data (i32.const 824) "\03\00\00\00f\003\002") + (data (i32.const 840) "\03\00\00\00f\006\004") + (data (i32.const 856) "\07\00\00\00a\00n\00y\00f\00u\00n\00c") + (data (i32.const 880) "\04\00\00\00f\00u\00n\00c") + (data (i32.const 896) "\04\00\00\00n\00o\00n\00e") + (data (i32.const 912) "\0e\00\00\00I\00n\00c\00o\00r\00r\00e\00c\00t\00 \00T\00y\00p\00e") + (data (i32.const 944) "\07\00\00\00E\00r\00r\00o\00r\00:\00 ") + (data (i32.const 968) "\04\00\00\00n\00u\00l\00l") + (data (i32.const 984) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") + (data (i32.const 1024) "\02\00\00\00,\00 ") + (data (i32.const 1032) "\04\00\00\00v\00o\00i\00d") + (data (i32.const 1048) "\07\00\00\00i\00n\00d\00e\00x\00:\00 ") + (data (i32.const 1072) "\06\00\00\00f\00o\00r\00m\00:\00 ") + (data (i32.const 1088) "\03\00\00\00,\00 \00(") + (data (i32.const 1104) "\05\00\00\00)\00 \00=\00>\00 ") + (data (i32.const 1128) "`\04") + (data (i32.const 1136) "\01\00\00\00\n") + (data (i32.const 1152) "x\04") + (data (i32.const 1160) "\05\00\00\00r\00e\00f\00:\00 ") + (data (i32.const 1176) "\04\00\00\00i\00d\00:\00 ") + (data (i32.const 1192) "\0d\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00o\00f\00f\00:\00 ") + (data (i32.const 1224) "\10\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00l\00e\00n\00g\00t\00h\00:\00 ") + (data (i32.const 1264) "\05\00\00\00e\00n\00d\00:\00 ") + (data (i32.const 1280) "\06\00\00\00n\00a\00m\00e\00:\00 ") + (data (i32.const 1296) "\1b\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00t\00y\00p\00e\00d\00a\00r\00r\00a\00y\00.\00t\00s") + (data (i32.const 1360) "\12\00\00\00c\00h\00e\00c\00k\00i\00n\00g\00 \00e\00n\00d\00 \00i\00n\00d\00e\00x") + (data (i32.const 1408) "x\05") + (data (i32.const 1416) "\08\00\00\00s\00t\00a\00r\00t\00i\00n\00g") + (data (i32.const 1440) "\0e\00\00\00M\00a\00g\00i\00c\00 \00i\00s\00 \00v\00a\00l\00i\00d") + (data (i32.const 1472) "\01\00\00\00\'") + (data (i32.const 1480) "\06\00\00\00C\00u\00s\00t\00o\00m") + (data (i32.const 1496) "\04\00\00\00T\00y\00p\00e") + (data (i32.const 1512) "\06\00\00\00I\00m\00p\00o\00r\00t") + (data (i32.const 1528) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n") + (data (i32.const 1552) "\05\00\00\00T\00a\00b\00l\00e") + (data (i32.const 1568) "\06\00\00\00M\00e\00m\00o\00r\00y") + (data (i32.const 1584) "\06\00\00\00G\00l\00o\00b\00a\00l") + (data (i32.const 1600) "\06\00\00\00E\00x\00p\00o\00r\00t") + (data (i32.const 1616) "\05\00\00\00S\00t\00a\00r\00t") + (data (i32.const 1632) "\07\00\00\00E\00l\00e\00m\00e\00n\00t") + (data (i32.const 1656) "\04\00\00\00C\00o\00d\00e") + (data (i32.const 1672) "\04\00\00\00D\00a\00t\00a") + (data (i32.const 1688) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 ") + (data (i32.const 1720) "\t\00\00\00-\00-\00-\00-\00-\00-\00-\00-\00-") (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) + (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) + (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) + (import "index" "_log" (func $assembly/host/index/_log (param i32 i32))) (table $0 1 anyfunc) (elem (i32.const 0) $null) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) (global $assembly/index/type (mut i32) (i32.const 0)) (global $src/common/SectionId.Type (mut i32) (i32.const 1)) + (global $src/common/SectionId.Import (mut i32) (i32.const 2)) + (global $src/common/SectionId.Start (mut i32) (i32.const 8)) (global $src/common/SectionId.Data (mut i32) (i32.const 11)) + (global $src/common/ExternalKind.Function (mut i32) (i32.const 0)) + (global $src/common/ExternalKind.Table (mut i32) (i32.const 1)) + (global $src/common/ExternalKind.Memory (mut i32) (i32.const 2)) + (global $src/common/ExternalKind.Global (mut i32) (i32.const 3)) (export "memory" (memory $0)) (export "table" (table $0)) (export "getType" (func $assembly/index/getType)) + (export "getImports" (func $assembly/index/getImports)) + (export "removeStartFunction" (func $assembly/index/removeStartFunction)) (export "toString" (func $assembly/index/toString)) (export "Parser#constructor" (func $assembly/index/Parser#constructor)) (export "Parser#get:buf" (func $Parser#get:buf)) @@ -82,8 +107,26 @@ (export "memory.allocate" (func $~lib/memory/memory.allocate)) (export "memory.free" (func $~lib/memory/memory.free)) (export "memory.reset" (func $~lib/memory/memory.reset)) + (export "TypeSection#get:header" (func $Parser#get:buf)) + (export "TypeSection#set:header" (func $Parser#set:buf)) + (export "TypeSection#get:funcs" (func $Parser#get:module)) + (export "TypeSection#set:funcs" (func $Parser#set:module)) + (export "TypeSection#parse" (func $assembly/module/index/TypeSection#parse)) + (export "TypeSection#toString" (func $assembly/module/index/TypeSection#toString)) + (export "Module#constructor" (func $assembly/module/index/Module#constructor)) + (export "Module#get:headers" (func $Parser#get:buf)) + (export "Module#set:headers" (func $Parser#set:buf)) + (export "Module#get:buf" (func $Parser#get:module)) + (export "Module#set:buf" (func $Parser#set:module)) + (export "Module#get:Type" (func $assembly/module/index/Module#get:Type)) + (export "Module#get:hasStart" (func $assembly/module/index/Module#get:hasStart)) + (export "Module#get:start" (func $assembly/module/index/Module#get:start)) + (export "Module#parseSection" (func $assembly/module/index/Module#parseSection)) + (export "Module#getID" (func $assembly/module/index/Module#getID)) + (export "Module#getType" (func $assembly/module/index/Module#getType)) + (export "Module#getImports" (func $assembly/module/index/Module#getImports)) (start $start) - (func $~lib/internal/memory/memset (; 2 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i64) get_local $2 @@ -318,13 +361,13 @@ end end ) - (func $~lib/memory/memory.fill (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/memory.fill (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memset ) - (func $~lib/internal/memory/memcpy (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memcpy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -1228,7 +1271,7 @@ i32.store8 end ) - (func $~lib/internal/memory/memmove (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memmove (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) get_local $0 @@ -1428,13 +1471,13 @@ end end ) - (func $~lib/memory/memory.copy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/memory.copy (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memmove ) - (func $~lib/internal/memory/memcmp (; 7 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/memory/memcmp (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) get_local $0 get_local $1 @@ -1485,13 +1528,13 @@ end tee_local $0 ) - (func $~lib/memory/memory.compare (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/memory/memory.compare (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memcmp ) - (func $~lib/allocator/arena/__memory_allocate (; 9 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/allocator/arena/__memory_allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1553,25 +1596,25 @@ set_global $~lib/allocator/arena/offset get_local $1 ) - (func $~lib/memory/memory.allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/memory/memory.allocate (; 12 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $~lib/allocator/arena/__memory_allocate ) - (func $~lib/memory/memory.free (; 11 ;) (type $iv) (param $0 i32) + (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) nop ) - (func $~lib/memory/memory.reset (; 12 ;) (type $v) + (func $~lib/memory/memory.reset (; 14 ;) (type $v) get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset ) - (func $~lib/internal/arraybuffer/allocateUnsafe (; 13 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 15 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 i32.const 1073741816 i32.gt_u if i32.const 0 - i32.const 56 + i32.const 88 i32.const 26 i32.const 2 call $~lib/env/abort @@ -1591,7 +1634,50 @@ i32.store get_local $1 ) - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 14 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 16 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + get_local $0 + i32.const 268435454 + i32.gt_u + if + i32.const 0 + i32.const 56 + i32.const 45 + i32.const 39 + call $~lib/env/abort + unreachable + end + get_local $0 + i32.const 2 + i32.shl + tee_local $3 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $2 + i32.const 8 + call $~lib/allocator/arena/__memory_allocate + tee_local $1 + i32.const 0 + i32.store + get_local $1 + i32.const 0 + i32.store offset=4 + get_local $1 + get_local $2 + i32.store + get_local $1 + get_local $0 + i32.store offset=4 + get_local $2 + i32.const 8 + i32.add + i32.const 0 + get_local $3 + call $~lib/internal/memory/memset + get_local $1 + ) + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 17 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) get_local $1 @@ -1605,7 +1691,7 @@ i32.gt_s if i32.const 0 - i32.const 56 + i32.const 88 i32.const 40 i32.const 4 call $~lib/env/abort @@ -1661,7 +1747,7 @@ i32.lt_s if i32.const 0 - i32.const 56 + i32.const 88 i32.const 62 i32.const 4 call $~lib/env/abort @@ -1674,7 +1760,7 @@ end get_local $0 ) - (func $~lib/array/Array#push (; 15 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#push (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -1698,7 +1784,7 @@ i32.ge_u if i32.const 0 - i32.const 24 + i32.const 56 i32.const 184 i32.const 42 call $~lib/env/abort @@ -1725,17 +1811,30 @@ i32.store offset=8 get_local $3 ) - (func $assembly/module/index/Module#getID (; 16 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/Module#getID (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + i32.const 0 + call $~lib/array/Array#constructor + tee_local $4 + i32.load offset=4 + if + i32.const 0 + i32.const 152 + i32.const 56 + i32.const 4 + call $~lib/env/abort + unreachable + end get_local $0 i32.load i32.load offset=4 - set_local $4 + set_local $5 loop $repeat|0 get_local $2 - get_local $4 + get_local $5 i32.lt_s if get_local $2 @@ -1762,7 +1861,7 @@ get_local $1 i32.eq if - i32.const 16 + get_local $4 get_local $2 get_local $0 i32.load @@ -1793,27 +1892,18 @@ br $repeat|0 end end - i32.const 16 + get_local $4 ) - (func $assembly/module/index/TypeSection#constructor (; 17 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/module/index/Section#constructor (; 20 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) - i32.const 8 + i32.const 4 call $~lib/allocator/arena/__memory_allocate tee_local $1 - i32.const 0 - i32.store - get_local $1 - i32.const 0 - i32.store offset=4 - get_local $1 get_local $0 i32.store get_local $1 - i32.const 128 - i32.store offset=4 - get_local $1 ) - (func $assembly/buffer/index/Buffer#readVaruint (; 18 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVaruint (; 21 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1853,50 +1943,7 @@ i32.store offset=8 get_local $3 ) - (func $~lib/array/Array#constructor (; 19 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - get_local $0 - i32.const 268435454 - i32.gt_u - if - i32.const 0 - i32.const 24 - i32.const 45 - i32.const 39 - call $~lib/env/abort - unreachable - end - get_local $0 - i32.const 2 - i32.shl - tee_local $3 - call $~lib/internal/arraybuffer/allocateUnsafe - set_local $2 - i32.const 8 - call $~lib/allocator/arena/__memory_allocate - tee_local $1 - i32.const 0 - i32.store - get_local $1 - i32.const 0 - i32.store offset=4 - get_local $1 - get_local $2 - i32.store - get_local $1 - get_local $0 - i32.store offset=4 - get_local $2 - i32.const 8 - i32.add - i32.const 0 - get_local $3 - call $~lib/internal/memory/memset - get_local $1 - ) - (func $assembly/buffer/index/Buffer#readVarint (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -1956,12 +2003,12 @@ get_local $4 select ) - (func $assembly/buffer/index/Buffer#readVarint8 (; 21 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint8 (; 23 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) get_local $0 i32.const 7 call $assembly/buffer/index/Buffer#readVarint ) - (func $assembly/module/index/FuncType#constructor (; 22 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/FuncType#constructor (; 24 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) i32.const 13 call $~lib/allocator/arena/__memory_allocate @@ -1979,7 +2026,7 @@ i32.store8 offset=12 get_local $2 ) - (func $~lib/array/Array#__set (; 23 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 25 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) get_local $1 @@ -1996,7 +2043,7 @@ i32.ge_u if i32.const 0 - i32.const 24 + i32.const 56 i32.const 109 i32.const 41 call $~lib/env/abort @@ -2025,7 +2072,7 @@ get_local $2 i32.store offset=8 ) - (func $~lib/internal/number/decimalCount32 (; 24 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/decimalCount32 (; 26 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.const 100000 i32.lt_u @@ -2079,7 +2126,7 @@ end end ) - (func $~lib/internal/string/allocateUnsafe (; 25 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocateUnsafe (; 27 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 i32.const 0 @@ -2095,7 +2142,7 @@ i32.eqz if i32.const 0 - i32.const 144 + i32.const 216 i32.const 14 i32.const 2 call $~lib/env/abort @@ -2112,10 +2159,10 @@ i32.store get_local $1 ) - (func $~lib/internal/number/utoa32_lut (; 26 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/number/utoa32_lut (; 28 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) - i32.const 712 + i32.const 784 i32.load set_local $3 loop $continue|0 @@ -2222,7 +2269,7 @@ i32.store16 offset=4 end ) - (func $~lib/internal/number/itoa (; 27 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa (; 29 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) block $__inlined_func$~lib/internal/number/utoa32 @@ -2230,7 +2277,7 @@ tee_local $1 i32.eqz if - i32.const 136 + i32.const 208 set_local $0 br $__inlined_func$~lib/internal/number/utoa32 end @@ -2245,70 +2292,7 @@ end get_local $0 ) - (func $assembly/module/index/typeName (; 28 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - block $case7|0 - block $case6|0 - block $case5|0 - block $case4|0 - block $case3|0 - block $case2|0 - block $case1|0 - get_local $0 - i32.const 127 - i32.ne - if - get_local $0 - tee_local $1 - i32.const 126 - i32.eq - br_if $case1|0 - get_local $1 - i32.const 125 - i32.eq - br_if $case2|0 - get_local $1 - i32.const 124 - i32.eq - br_if $case3|0 - get_local $1 - i32.const 112 - i32.eq - br_if $case4|0 - get_local $1 - i32.const 96 - i32.eq - br_if $case5|0 - get_local $1 - i32.const 64 - i32.eq - br_if $case6|0 - br $case7|0 - end - i32.const 720 - return - end - i32.const 736 - return - end - i32.const 752 - return - end - i32.const 768 - return - end - i32.const 784 - return - end - i32.const 808 - return - end - i32.const 824 - return - end - unreachable - ) - (func $~lib/internal/string/copyUnsafe (; 29 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) + (func $~lib/internal/string/copyUnsafe (; 30 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) get_local $1 i32.const 1 i32.shl @@ -2324,7 +2308,7 @@ i32.shl call $~lib/internal/memory/memmove ) - (func $~lib/string/String#concat (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2332,7 +2316,7 @@ i32.eqz if i32.const 0 - i32.const 864 + i32.const 984 i32.const 110 i32.const 4 call $~lib/env/abort @@ -2341,7 +2325,7 @@ get_local $1 i32.eqz if - i32.const 848 + i32.const 968 set_local $1 end get_local $0 @@ -2354,7 +2338,7 @@ tee_local $2 i32.eqz if - i32.const 840 + i32.const 1016 return end get_local $2 @@ -2371,18 +2355,90 @@ call $~lib/internal/string/copyUnsafe get_local $2 ) - (func $~lib/string/String.__concat (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 32 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if - i32.const 848 + i32.const 968 set_local $0 end get_local $0 get_local $1 call $~lib/string/String#concat ) - (func $assembly/module/index/FuncType#toString (; 32 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/host/index/err (; 33 ;) (type $iv) (param $0 i32) + i32.const 944 + get_local $0 + call $~lib/string/String.__concat + call $assembly/host/index/_log_str + unreachable + ) + (func $assembly/module/index/typeName (; 34 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + block $case7|0 + block $case6|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + get_local $0 + i32.const 127 + i32.ne + if + get_local $0 + tee_local $1 + i32.const 126 + i32.eq + br_if $case1|0 + get_local $1 + i32.const 125 + i32.eq + br_if $case2|0 + get_local $1 + i32.const 124 + i32.eq + br_if $case3|0 + get_local $1 + i32.const 112 + i32.eq + br_if $case4|0 + get_local $1 + i32.const 96 + i32.eq + br_if $case5|0 + get_local $1 + i32.const 64 + i32.eq + br_if $case6|0 + br $case7|0 + end + i32.const 792 + return + end + i32.const 808 + return + end + i32.const 824 + return + end + i32.const 840 + return + end + i32.const 856 + return + end + i32.const 880 + return + end + i32.const 896 + return + end + i32.const 912 + call $assembly/host/index/err + i32.const 1016 + ) + (func $assembly/module/index/FuncType#toString (; 35 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2396,7 +2452,7 @@ i32.load8_s offset=12 call $assembly/module/index/typeName set_local $5 - i32.const 840 + i32.const 1016 set_local $1 loop $repeat|0 get_local $2 @@ -2438,7 +2494,7 @@ i32.lt_s if get_local $1 - i32.const 896 + i32.const 1024 call $~lib/string/String.__concat set_local $1 end @@ -2473,28 +2529,28 @@ tee_local $0 call $assembly/module/index/typeName else - i32.const 904 + i32.const 1032 end set_local $0 - i32.const 920 + i32.const 1048 get_local $4 call $~lib/string/String.__concat - i32.const 896 + i32.const 1024 call $~lib/string/String.__concat - i32.const 944 + i32.const 1072 call $~lib/string/String.__concat get_local $5 call $~lib/string/String.__concat - i32.const 960 + i32.const 1088 call $~lib/string/String.__concat get_local $1 call $~lib/string/String.__concat - i32.const 976 + i32.const 1104 call $~lib/string/String.__concat get_local $0 call $~lib/string/String.__concat ) - (func $assembly/module/index/TypeSection#parse (; 33 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/TypeSection#parse (; 36 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2510,7 +2566,7 @@ get_local $1 call $assembly/buffer/index/Buffer#readVaruint tee_local $8 - call $~lib/array/Array#constructor + call $~lib/array/Array#constructor set_local $6 loop $repeat|0 get_local $2 @@ -2531,7 +2587,7 @@ get_local $1 call $assembly/buffer/index/Buffer#readVaruint tee_local $7 - call $~lib/array/Array#constructor + call $~lib/array/Array#constructor i32.store i32.const 0 set_local $4 @@ -2598,7 +2654,7 @@ end tee_local $3 get_local $4 - call $~lib/array/Array#constructor + call $~lib/array/Array#constructor i32.store offset=4 i32.const 0 set_local $5 @@ -2673,7 +2729,7 @@ end get_local $0 ) - (func $~lib/array/Array#join (; 34 ;) (type $FUNCSIG$i) (result i32) + (func $~lib/array/Array#join (; 37 ;) (type $FUNCSIG$i) (result i32) (local $0 i32) (local $1 i32) (local $2 i32) @@ -2682,7 +2738,7 @@ (local $5 i32) (local $6 i32) (local $7 i32) - i32.const 1004 + i32.const 1132 i32.load i32.const 1 i32.sub @@ -2690,13 +2746,13 @@ i32.const 0 i32.lt_s if - i32.const 840 + i32.const 1016 return end - i32.const 1000 + i32.const 1128 i32.load set_local $5 - i32.const 1008 + i32.const 1136 i32.load tee_local $6 i32.const 0 @@ -2775,7 +2831,7 @@ if get_local $0 get_local $1 - i32.const 1008 + i32.const 1136 get_local $6 call $~lib/internal/string/copyUnsafe get_local $1 @@ -2807,7 +2863,7 @@ end get_local $0 ) - (func $assembly/module/index/TypeSection#toString (; 35 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/TypeSection#toString (; 38 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) loop $repeat|0 @@ -2817,7 +2873,7 @@ i32.load offset=4 i32.lt_s if - i32.const 1000 + i32.const 1128 get_local $1 get_local $0 i32.load offset=4 @@ -2850,7 +2906,7 @@ end call $~lib/array/Array#join ) - (func $assembly/index/getType (; 36 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/getType (; 39 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) i32.const 0 get_local $0 @@ -2869,7 +2925,7 @@ unreachable end tee_local $1 - call $assembly/module/index/TypeSection#constructor + call $assembly/module/index/Section#constructor get_local $0 i32.load offset=4 call $assembly/module/index/TypeSection#parse @@ -2877,61 +2933,17 @@ get_global $assembly/index/type call $assembly/module/index/TypeSection#toString ) - (func $assembly/index/toString (; 37 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 - call $assembly/module/index/TypeSection#toString - ) - (func $assembly/module/index/Module#constructor (; 38 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - (local $1 i32) - i32.const 8 - call $~lib/allocator/arena/__memory_allocate - tee_local $1 - i32.const 0 - i32.store - get_local $1 - i32.const 0 - i32.store offset=4 - get_local $1 - get_local $0 - i32.store offset=4 - get_local $1 - i32.const 1024 - i32.store - get_local $1 - ) - (func $assembly/index/Parser#constructor (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.eqz - if - i32.const 8 - call $~lib/allocator/arena/__memory_allocate - tee_local $0 - i32.const 0 - i32.store - get_local $0 - i32.const 0 - i32.store offset=4 - end - get_local $0 - get_local $1 - i32.store - get_local $0 - get_local $1 - call $assembly/module/index/Module#constructor - i32.store offset=4 - get_local $0 - ) - (func $~lib/string/String.fromUTF8 (; 40 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) + (func $~lib/string/String.fromUTF8 (; 40 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) get_local $1 i32.const 1 i32.lt_u if - i32.const 840 + i32.const 1016 return end get_local $1 @@ -2985,7 +2997,7 @@ i32.gt_u if i32.const 0 - i32.const 864 + i32.const 984 i32.const 510 i32.const 8 call $~lib/env/abort @@ -3032,7 +3044,7 @@ i32.gt_u if i32.const 0 - i32.const 864 + i32.const 984 i32.const 514 i32.const 8 call $~lib/env/abort @@ -3107,7 +3119,7 @@ i32.gt_u if i32.const 0 - i32.const 864 + i32.const 984 i32.const 526 i32.const 8 call $~lib/env/abort @@ -3150,37 +3162,662 @@ set_local $2 end get_local $4 - i32.const 2 + i32.const 2 + i32.add + end + set_local $4 + br $continue|0 + end + end + get_local $1 + get_local $2 + i32.ne + if + i32.const 0 + i32.const 984 + i32.const 535 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $4 + i32.const 1 + i32.shr_u + call $~lib/internal/string/allocateUnsafe + tee_local $0 + i32.const 4 + i32.add + get_local $6 + get_local $4 + call $~lib/internal/memory/memmove + get_local $0 + ) + (func $assembly/module/imports/Imports#parse (; 41 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) + (local $8 i32) + get_local $1 + get_local $0 + i32.load + i32.load offset=12 + i32.store offset=8 + get_local $0 + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + tee_local $5 + call $~lib/array/Array#constructor + i32.store offset=4 + loop $repeat|0 + get_local $4 + get_local $5 + i32.lt_u + if + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + set_local $2 + get_local $1 + i32.load offset=8 + get_local $2 + call $~lib/string/String.fromUTF8 + set_local $6 + get_local $1 + get_local $1 + i32.load offset=8 + get_local $2 + i32.add + i32.store offset=8 + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + set_local $2 + get_local $1 + i32.load offset=8 + get_local $2 + call $~lib/string/String.fromUTF8 + set_local $7 + get_local $1 + get_local $1 + i32.load offset=8 + get_local $2 + i32.add + i32.store offset=8 + get_local $1 + i32.load offset=8 + tee_local $3 + i32.load8_u + set_local $2 + get_local $1 + get_local $3 + i32.const 1 + i32.add + i32.store offset=8 + get_local $0 + i32.load offset=4 + set_local $8 + i32.const 12 + call $~lib/allocator/arena/__memory_allocate + tee_local $3 + get_local $6 + i32.store + get_local $3 + get_local $7 + i32.store offset=4 + get_local $3 + get_local $2 + i32.store offset=8 + get_local $8 + get_local $4 + get_local $3 + call $~lib/array/Array#__set + block $break|1 + block $case4|1 + block $case3|1 + block $case2|1 + block $case1|1 + get_global $src/common/ExternalKind.Function + get_local $2 + i32.ne + if + get_global $src/common/ExternalKind.Table + get_local $2 + i32.eq + br_if $case1|1 + get_global $src/common/ExternalKind.Memory + get_local $2 + i32.eq + br_if $case2|1 + get_global $src/common/ExternalKind.Global + get_local $2 + i32.eq + br_if $case3|1 + br $case4|1 + end + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + drop + br $break|1 + end + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint + drop + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + set_local $2 + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + drop + get_local $2 + i32.const 1 + i32.and + if (result i32) + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + else + i32.const -1 + end + set_local $2 + br $break|1 + end + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + set_local $2 + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + drop + get_local $2 + i32.const 1 + i32.and + if (result i32) + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + else + i32.const 65535 + end + set_local $2 + br $break|1 + end + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint + drop + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + drop + br $break|1 + end + unreachable + end + get_local $4 + i32.const 1 + i32.add + set_local $4 + br $repeat|0 + end + end + get_local $0 + ) + (func $assembly/module/index/Module#getImports (; 42 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + get_local $0 + get_global $src/common/SectionId.Import + call $assembly/module/index/Module#getID + set_local $3 + i32.const 1156 + i32.load + call $assembly/host/index/_logi + loop $repeat|0 + get_local $1 + get_local $3 + i32.load offset=4 + i32.lt_s + if + i32.const 1152 + get_local $1 + get_local $3 + i32.load + tee_local $2 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $1 + i32.const 2 + i32.shl + get_local $2 + i32.add + i32.load offset=8 + else + unreachable + end + tee_local $2 + call $assembly/module/index/Section#constructor + tee_local $2 + get_local $0 + i32.load offset=4 + call $assembly/module/imports/Imports#parse + call $~lib/array/Array#push + drop + get_local $2 + i32.load offset=4 + i32.load offset=4 + call $assembly/host/index/_logi + get_local $1 + i32.const 1 + i32.add + set_local $1 + br $repeat|0 + end + end + i32.const 1152 + ) + (func $assembly/index/getImports (; 43 ;) (type $iv) (param $0 i32) + (local $1 i32) + get_local $0 + call $assembly/module/index/Module#getImports + tee_local $1 + i32.load offset=4 + i32.const 0 + i32.gt_s + if + block $break|0 + i32.const 0 + set_local $0 + loop $repeat|0 + get_local $0 + get_local $1 + i32.load offset=4 + i32.ge_s + br_if $break|0 + get_local $1 + i32.load offset=4 + call $assembly/host/index/_logi + get_local $0 + i32.const 1 + i32.add + set_local $0 + br $repeat|0 + unreachable + end + unreachable + end + end + ) + (func $assembly/module/index/Module#get:start (; 44 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + get_global $src/common/SectionId.Start + call $assembly/module/index/Module#getID + ) + (func $assembly/module/index/Module#get:hasStart (; 45 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $assembly/module/index/Module#get:start + i32.load offset=4 + i32.const 0 + i32.gt_s + ) + (func $assembly/module/index/SectionHeader#toString (; 46 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.load + call $~lib/internal/number/itoa + set_local $1 + get_local $0 + i32.load offset=4 + call $~lib/internal/number/itoa + set_local $2 + get_local $0 + i32.load offset=8 + call $~lib/internal/number/itoa + set_local $3 + get_local $0 + i32.load offset=12 + call $~lib/internal/number/itoa + set_local $4 + get_local $0 + i32.load offset=20 + set_local $5 + get_local $0 + i32.load offset=12 + get_local $0 + i32.load offset=8 + i32.add + call $~lib/internal/number/itoa + set_local $0 + i32.const 1160 + get_local $1 + call $~lib/string/String.__concat + i32.const 1136 + call $~lib/string/String.__concat + i32.const 1176 + call $~lib/string/String.__concat + get_local $2 + call $~lib/string/String.__concat + i32.const 1136 + call $~lib/string/String.__concat + i32.const 1192 + call $~lib/string/String.__concat + get_local $4 + call $~lib/string/String.__concat + i32.const 1136 + call $~lib/string/String.__concat + i32.const 1224 + call $~lib/string/String.__concat + get_local $3 + call $~lib/string/String.__concat + i32.const 1136 + call $~lib/string/String.__concat + i32.const 1264 + call $~lib/string/String.__concat + get_local $0 + call $~lib/string/String.__concat + i32.const 1136 + call $~lib/string/String.__concat + i32.const 1280 + call $~lib/string/String.__concat + get_local $5 + call $~lib/string/String.__concat + ) + (func $~lib/internal/typedarray/TypedArray#constructor (; 47 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + i32.const 1073741816 + i32.gt_u + if + i32.const 0 + i32.const 1296 + i32.const 23 + i32.const 34 + call $~lib/env/abort + unreachable + end + get_local $0 + call $~lib/internal/arraybuffer/allocateUnsafe + tee_local $2 + i32.const 8 + i32.add + i32.const 0 + get_local $0 + call $~lib/internal/memory/memset + i32.const 12 + call $~lib/allocator/arena/__memory_allocate + tee_local $1 + i32.const 0 + i32.store + get_local $1 + i32.const 0 + i32.store offset=4 + get_local $1 + i32.const 0 + i32.store offset=8 + get_local $1 + get_local $2 + i32.store + get_local $1 + i32.const 0 + i32.store offset=4 + get_local $1 + get_local $0 + i32.store offset=8 + get_local $1 + ) + (func $~lib/internal/typedarray/TypedArray#__get (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $1 + get_local $0 + i32.load offset=8 + i32.ge_u + if + i32.const 0 + i32.const 1296 + i32.const 39 + i32.const 63 + call $~lib/env/abort + unreachable + end + get_local $0 + i32.load offset=4 + get_local $1 + get_local $0 + i32.load + i32.add + i32.add + i32.load8_u offset=8 + ) + (func $~lib/internal/typedarray/TypedArray#__set (; 49 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $1 + get_local $0 + i32.load offset=8 + i32.ge_u + if + i32.const 0 + i32.const 1296 + i32.const 50 + i32.const 63 + call $~lib/env/abort + unreachable + end + get_local $0 + i32.load offset=4 + get_local $1 + get_local $0 + i32.load + i32.add + i32.add + get_local $2 + i32.store8 offset=8 + ) + (func $assembly/host/index/log (; 50 ;) (type $iv) (param $0 i32) + get_local $0 + i32.const 12 + call $assembly/host/index/_log + ) + (func $assembly/index/removeStartFunction (; 51 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + get_local $0 + call $assembly/module/index/Module#get:hasStart + if + i32.const 0 + get_local $0 + get_global $src/common/SectionId.Start + call $assembly/module/index/Module#getID + i32.load + tee_local $2 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $2 + i32.load offset=8 + else + unreachable + end + tee_local $2 + tee_local $3 + call $assembly/module/index/SectionHeader#toString + call $assembly/host/index/_log_str + get_local $3 + i32.load offset=12 + get_local $3 + i32.load offset=8 + i32.add + get_local $3 + i32.load + i32.sub + tee_local $4 + call $assembly/host/index/_logi + get_local $0 + i32.load offset=4 + i32.load offset=4 + get_local $4 + i32.sub + call $~lib/internal/typedarray/TypedArray#constructor + set_local $2 + get_local $3 + i32.load offset=16 + call $assembly/host/index/_logi + loop $repeat|0 + get_local $1 + get_local $3 + i32.load offset=16 + i32.lt_u + if + get_local $2 + get_local $1 + get_local $0 + i32.load offset=4 + i32.load + get_local $1 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + call $~lib/internal/typedarray/TypedArray#__set + get_local $1 + i32.const 1 + i32.add + set_local $1 + br $repeat|0 + end + end + i32.const 1360 + call $assembly/host/index/_log_str + get_local $0 + i32.load offset=4 + i32.load offset=16 + call $assembly/host/index/_logi + get_local $0 + i32.load offset=4 + i32.load + call $assembly/host/index/log + get_local $0 + i32.load offset=4 + i32.load + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.const 1 + i32.sub + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + call $assembly/host/index/_logi + get_local $3 + i32.load offset=16 + get_local $4 + i32.add + call $assembly/host/index/_logi + get_local $3 + i32.load offset=16 + get_local $4 + i32.add + set_local $1 + loop $repeat|1 + get_local $1 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.lt_u + if + get_local $1 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.const 8000 + i32.sub + i32.gt_u + if + get_local $1 + call $assembly/host/index/_logi + end + get_local $2 + get_local $1 + get_local $4 + i32.sub + get_local $0 + i32.load offset=4 + i32.load + get_local $1 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + call $~lib/internal/typedarray/TypedArray#__set + get_local $1 + i32.const 1 i32.add + set_local $1 + br $repeat|1 end - set_local $4 - br $continue|0 end + else + get_local $0 + i32.load offset=4 + i32.load + set_local $2 end - get_local $1 get_local $2 - i32.ne + ) + (func $assembly/index/toString (; 52 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $assembly/module/index/TypeSection#toString + ) + (func $assembly/module/index/Module#constructor (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz if + i32.const 8 + call $~lib/allocator/arena/__memory_allocate + tee_local $0 i32.const 0 - i32.const 864 - i32.const 535 - i32.const 4 - call $~lib/env/abort - unreachable + i32.store + get_local $0 + i32.const 0 + i32.store offset=4 end - get_local $4 - i32.const 1 - i32.shr_u - call $~lib/internal/string/allocateUnsafe - tee_local $0 - i32.const 4 - i32.add - get_local $6 - get_local $4 - call $~lib/internal/memory/memmove + get_local $0 + get_local $1 + i32.store offset=4 + get_local $0 + i32.const 1408 + i32.store + get_local $0 + ) + (func $assembly/index/Parser#constructor (; 54 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 8 + call $~lib/allocator/arena/__memory_allocate + tee_local $0 + i32.const 0 + i32.store + get_local $0 + i32.const 0 + i32.store offset=4 + end + get_local $0 + get_local $1 + i32.store + get_local $0 + i32.const 0 + get_local $1 + call $assembly/module/index/Module#constructor + i32.store offset=4 get_local $0 ) - (func $assembly/index/Parser#parseString (; 41 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#parseString (; 55 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 @@ -3189,23 +3826,23 @@ call $assembly/buffer/index/Buffer#readVaruint call $~lib/string/String.fromUTF8 ) - (func $assembly/index/Parser#readVaruint (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/Parser#readVaruint (; 56 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.load call $assembly/buffer/index/Buffer#readVaruint ) - (func $assembly/index/Parser#get:off (; 43 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#get:off (; 57 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 ) - (func $assembly/index/Parser#set:off (; 44 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/index/Parser#set:off (; 58 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 i32.load get_local $1 i32.store offset=8 ) - (func $assembly/module/index/sectionName (; 45 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/sectionName (; 59 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $case12|0 block $case11|0 @@ -3234,49 +3871,49 @@ end br $case12|0 end - i32.const 1040 + i32.const 1480 return end - i32.const 1056 + i32.const 1496 return end - i32.const 1072 + i32.const 1512 return end - i32.const 1088 + i32.const 1528 return end - i32.const 1112 + i32.const 1552 return end - i32.const 1128 + i32.const 1568 return end - i32.const 1144 + i32.const 1584 return end - i32.const 1160 + i32.const 1600 return end - i32.const 1176 + i32.const 1616 return end - i32.const 1192 + i32.const 1632 return end - i32.const 1216 + i32.const 1656 return end - i32.const 1232 + i32.const 1672 return end unreachable ) - (func $assembly/module/index/SectionHeader#constructor (; 46 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/module/index/SectionHeader#constructor (; 60 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) - i32.const 20 + i32.const 24 call $~lib/allocator/arena/__memory_allocate tee_local $2 i32.const 0 @@ -3291,14 +3928,24 @@ i32.const 0 i32.store offset=12 get_local $2 - i32.const 840 + i32.const 0 i32.store offset=16 get_local $2 + i32.const 1016 + i32.store offset=20 + get_local $2 tee_local $1 get_local $0 i32.load offset=8 i32.store get_local $1 + get_local $1 + i32.load + get_local $0 + i32.load offset=12 + i32.sub + i32.store offset=16 + get_local $1 get_local $0 call $assembly/buffer/index/Buffer#readVaruint i32.store offset=4 @@ -3318,9 +3965,17 @@ get_local $1 i32.load offset=4 call $assembly/module/index/sectionName - i32.store offset=16 + i32.store offset=20 else - unreachable + get_local $1 + i32.load + call $assembly/host/index/_logi + i32.const 1688 + get_local $1 + i32.load offset=4 + call $~lib/internal/number/itoa + call $~lib/string/String.__concat + call $assembly/host/index/err end else get_local $0 @@ -3330,15 +3985,15 @@ call $assembly/buffer/index/Buffer#readVaruint set_local $3 get_local $1 - i32.const 1032 + i32.const 1472 get_local $0 i32.load offset=8 get_local $3 call $~lib/string/String.fromUTF8 call $~lib/string/String.__concat - i32.const 1032 + i32.const 1472 call $~lib/string/String.__concat - i32.store offset=16 + i32.store offset=20 get_local $0 get_local $0 i32.load offset=8 @@ -3361,23 +4016,61 @@ i32.store offset=12 get_local $1 ) - (func $assembly/index/Parser#parse (; 47 ;) (type $iv) (param $0 i32) + (func $assembly/module/index/Module#parseSection (; 61 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + i32.load + get_local $1 + call $~lib/array/Array#push + drop + block $break|0 + get_global $src/common/SectionId.Type + get_local $1 + i32.load offset=4 + i32.eq + br_if $break|0 + end + ) + (func $assembly/index/Parser#parse (; 62 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) (local $3 i32) + (local $4 i32) + get_local $0 + i32.load + i32.load offset=8 + call $assembly/host/index/_logi + get_local $0 + i32.load + i32.load + i32.load + i32.const 8 + i32.add + call $assembly/host/index/_logi + get_local $0 + i32.load + i32.load offset=4 + call $assembly/host/index/_logi get_local $0 i32.load - tee_local $1 i32.load offset=8 + set_local $4 + i32.const 1416 + call $assembly/host/index/_log_str + get_local $0 + i32.load tee_local $2 + i32.load offset=8 + tee_local $3 i32.load - set_local $3 - get_local $1 + set_local $1 get_local $2 + get_local $3 i32.const 4 i32.add i32.store offset=8 - get_local $3 + get_local $1 + call $assembly/host/index/_logi + get_local $1 i32.const 1836278016 i32.ne if @@ -3385,48 +4078,69 @@ end get_local $0 i32.load - tee_local $1 - i32.load offset=8 tee_local $2 + i32.load offset=8 + tee_local $3 i32.load - set_local $3 - get_local $1 + set_local $1 get_local $2 + get_local $3 i32.const 4 i32.add i32.store offset=8 - get_local $3 + get_local $1 + call $assembly/host/index/_logi + get_local $1 i32.const 1 i32.ne if unreachable end + i32.const 1440 + call $assembly/host/index/_log_str loop $continue|0 get_local $0 i32.load i32.load offset=8 get_local $0 i32.load - i32.load offset=4 + i32.load offset=16 i32.lt_u if get_local $0 i32.load call $assembly/module/index/SectionHeader#constructor - set_local $1 + tee_local $1 + call $assembly/module/index/SectionHeader#toString + call $assembly/host/index/_log_str get_local $0 i32.load offset=4 + get_local $1 + call $assembly/module/index/Module#parseSection + i32.const 1720 + call $assembly/host/index/_log_str + get_local $0 i32.load + i32.load offset=8 + call $assembly/host/index/_logi get_local $1 - call $~lib/array/Array#push - drop - block $break|0 - get_global $src/common/SectionId.Type - get_local $1 - i32.load offset=4 - i32.eq - br_if $break|0 - end + i32.load + get_local $4 + i32.sub + call $assembly/host/index/_logi + get_local $1 + i32.load offset=16 + call $assembly/host/index/_logi + get_local $1 + i32.load offset=12 + get_local $1 + i32.load offset=8 + i32.add + get_local $4 + i32.sub + call $assembly/host/index/_logi + i32.const 1720 + call $assembly/host/index/_log_str get_local $0 i32.load get_local $1 @@ -3439,7 +4153,7 @@ end end ) - (func $assembly/buffer/index/Buffer#constructor (; 48 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#constructor (; 63 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) i32.const 20 call $~lib/allocator/arena/__memory_allocate @@ -3484,41 +4198,81 @@ i32.store offset=16 get_local $1 ) - (func $assembly/index/newParser (; 49 ;) (type $ii) (param $0 i32) (result i32) - i32.const 0 + (func $assembly/index/newParser (; 64 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + get_local $0 + call $assembly/host/index/log get_local $0 call $assembly/buffer/index/Buffer#constructor + tee_local $1 + i32.const 20 + call $assembly/host/index/_log + get_local $1 + i32.load offset=8 + call $assembly/host/index/_logi + i32.const 0 + get_local $1 call $assembly/index/Parser#constructor ) - (func $assembly/index/parse (; 50 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/parse (; 65 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/index/Parser#parse get_local $0 i32.load offset=4 ) - (func $start (; 51 ;) (type $v) - i32.const 1248 + (func $assembly/module/index/Module#get:Type (; 66 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + get_global $src/common/SectionId.Type + call $assembly/module/index/Module#getID + ) + (func $assembly/module/index/Module#getType (; 67 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + i32.const 0 + get_local $0 + call $assembly/module/index/Module#get:Type + i32.load + tee_local $1 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $1 + i32.load offset=8 + else + unreachable + end + tee_local $1 + call $assembly/module/index/Section#constructor + get_local $0 + i32.load offset=4 + call $assembly/module/index/TypeSection#parse + ) + (func $start (; 68 ;) (type $v) + i32.const 1744 set_global $~lib/allocator/arena/startOffset get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset + i32.const 8 + call $assembly/host/index/_log_str ) - (func $null (; 52 ;) (type $v) + (func $null (; 69 ;) (type $v) nop ) - (func $Parser#get:buf (; 53 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:buf (; 70 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) - (func $Parser#set:buf (; 54 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:buf (; 71 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store ) - (func $Parser#get:module (; 55 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:module (; 72 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) - (func $Parser#set:module (; 56 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:module (; 73 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store offset=4 diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index 1fba88c629..505c1ddc7c 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -1,11 +1,11 @@ import { Type, SectionId, ExternalKind, newParser } from "./common"; import assert = require("assert"); export { Type, SectionId, ExternalKind }; -import * as loader from "../../loader/src"; +import * as loader from "../../../dist/assemblyscript-loader"; import ASModule from "../build"; -type Instance = loader.ASUtil & T; +type Instance = typeof ASModule; // type Parser = {parse: (any)=> any, newParser: (any)=>any}; /** Cached compiled parser. */ @@ -14,9 +14,15 @@ var compiled: WebAssembly.Module | null = null; var WASM_DATA: string; // injected by webpack if (typeof WASM_DATA !== "string") WASM_DATA = require("fs").readFileSync(__dirname + "/../build/index.wasm", "base64"); -class WasmParser { - public memory: loader.ASMemory; - public instance: Instance; +export class WasmParser { + // public memory: loader.ASMemory; + public instance: Instance & loader.ASInstance; + public mod: number; + + get memory(): loader.ASMemory{ + return this.instance.memory; + } + constructor(public binary: Uint8Array){ // compile the parser if not yet compiled if (!compiled) compiled = new WebAssembly.Module(base64_decode(WASM_DATA)); @@ -25,7 +31,6 @@ class WasmParser { var nBytes = binary.length; var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16; let memory = loader.createMemory({ initial: nPages }); - this.memory = memory; var imports = { env: { abort: console.error, @@ -59,118 +64,19 @@ class WasmParser { }, options: {}, } - this.instance = loader.instantiate(compiled, imports); - let array = this.instance.newArray(new Uint8Array(binary)) - let parserPtr = this.instance.newParser(array); + this.instance = loader.instantiate(compiled, imports); + let array = this.memory.newArray(new Uint8Array(binary)) + let parserPtr = this.instance.newParser(array); + this.mod = this.instance.parse(parserPtr); } -} - - -/** Parses the contents of a WebAssembly binary according to the specified options. */ -export function parse(binary: Uint8Array): void { + get Type(): string { + return this.memory.getString(this.instance.getType(this.mod)) - - // buffer.set(binary); - - // provide a way to read strings from memory - parse.readString = (offset: number, length: number): string => utf8_read(new Uint8Array(memory.buffer), offset, offset + length); - - parse.readUint32 = (index: number): number => { - return buffer[index]; } - - - // instantiate the parser and return its exports - - - - let array = instance.newArray(new Uint8Array(binary)) - let parserPtr = instance.newParser(array); - - let Mod = instance.parse(parserPtr); - console.log(instance.getString((instance as any).getType(Mod))); - (instance as any).getImports(Mod); - // let arraybuf = instance.getArray(Uint8Array, array); - let newptr = (instance as any).removeDataSection(Mod); - // debugger; - let buf = instance.getArray(Uint8Array, newptr); - // debugger; - // let array2 = instance.newArray(buf); - console.log(newptr); - let parserPtr2 = instance.newParser(newptr); - let Mod2 = instance.parse(parserPtr2); - // let dataFreePtr = (instance as any).removeDataSection(Mod2); - // let buf2 = instance.getArray(Uint8Array, dataFreePtr); - - debugger; - let instance1 = loader.instantiateBuffer(binary, imports); - (instance1 as any).overwrite(); - // console.log(instance1.getString((instance1 as any).getString())); - let instance2 = loader.instantiateBuffer(buf, imports); - // instance2.table.grow() - // instance2.table.add(1, (instance2 as any).callStart) - console.log(instance2.getString((instance2 as any).getStr())); - let instance3 = loader.instantiateBuffer(binary, imports); - console.log(instance3.getString((instance3 as any).getStr())); - - let instance2 = loader.instantiateBuffer(buf, imports); - instance2.start(); - // let sections = buffer.slice(instance.I32[Mod], 2); - // console.log(sections[1]) - // let arrayBuf = sections[0]>>2; - // for (let i =0; i> 2; - // console.log("id: " + instance.I32[section + 1]); - // // console.log(instance.getString(instance.I32[section + 4])); - // } - // let typeSection = (instance as any).getType() >> 2; - // console.log(instance.getString(typeSection)); - // debugger; - // for (let i in Mod) { - // console.log(Mod[i]); - // } - // debugger; } -export declare namespace parse { - /** Utility function for reading an UTF8 encoded string from memory while parsing. */ - function readString(offset: number, length: number): string; - function readUint32(index: number): number; -} -// see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/utf8 -function utf8_read(buffer: Uint8Array, start: number, end: number): string { - var len = end - start; - if (len < 1) return ""; - var parts: string[] | null = null, - chunk: number[] = [], - i = 0, // char offset - t = 0; // temporary - while (start < end) { - t = buffer[start++]; - if (t < 128) { - chunk[i++] = t; - } else if (t > 191 && t < 224) { - chunk[i++] = (t & 31) << 6 | buffer[start++] & 63; - } else if (t > 239 && t < 365) { - t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000; - chunk[i++] = 0xD800 + (t >> 10); - chunk[i++] = 0xDC00 + (t & 1023); - } else { - chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63; - } - if (i > 8191) { - (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); - i = 0; - } - } - if (parts) { - if (i) parts.push(String.fromCharCode.apply(String, chunk.slice(0, i))); - return parts.join(""); - } - return String.fromCharCode.apply(String, chunk.slice(0, i)); -} // see: https://github.com/dcodeIO/protobuf.js/tree/master/lib/base64 function base64_decode(string: string): Uint8Array { diff --git a/lib/parse/tests/index.ts b/lib/parse/tests/index.ts index b9202eea09..a93f6a8e97 100644 --- a/lib/parse/tests/index.ts +++ b/lib/parse/tests/index.ts @@ -3,7 +3,7 @@ import { Type, SectionId, ExternalKind, - parse + WasmParser } from "../src"; [ "../build/test.wasm", @@ -12,6 +12,7 @@ import { ].forEach((filename: string): void => { const binary: Uint8Array = fs.readFileSync(__dirname + "/" + filename); console.log("Testing '" + filename + "' ..."); - - console.log(); + debugger; + let parser = new WasmParser(binary); + console.log(parser.Type); }); From 87c182d8a91b595b2133ab423c9d3ab4460d6a8a Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Sun, 3 Feb 2019 11:01:28 -0500 Subject: [PATCH 23/46] Clean up printing --- lib/parse/assembly/index.ts | 31 +- lib/parse/assembly/module/index.ts | 15 +- lib/parse/build/index.d.ts | 2 + lib/parse/build/index.wat | 1690 ++++++++++++++-------------- lib/parse/src/index.ts | 4 + lib/parse/tests/index.ts | 1 + 6 files changed, 867 insertions(+), 876 deletions(-) diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index d11b1c9f6a..f7f831ca3f 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -57,6 +57,10 @@ declare function debug():void; let type: TypeSection; +export function printModule(m: Module): void { + m.print(); +} + export function getType(m: Module): string { let headers:SectionHeader[] = m.getID(SectionId.Type); let section = new TypeSection(headers[0]); @@ -146,18 +150,11 @@ export class Parser { /** Starts parsing the module that has been placed in memory. */ parse(): void { - log(this.buf.off) - log(this.buf.buffer.buffer.data) - log(this.buf.length) let start = this.off; - log("starting") var magic = this.buf.readUint(); - log(magic); if (magic != 0x6D736100) unreachable(); var version = this.buf.readUint(); - log(version); if (version != 1) unreachable(); - log("Magic is valid"); var fun_space_index: u32 = 0; var glo_space_index: u32 = 0; var mem_space_index: u32 = 0; @@ -165,14 +162,14 @@ export class Parser { while (this.buf.off < this.buf.end) { // log("parsing next section", true); let header: SectionHeader = new SectionHeader(this.buf); - log(header.toString()); + // log(header.toString()); this.module.parseSection(header); - log("---------") - log(this.off); - log(header.ref - start); - log(header.offset); - log(header.end - start); - log("---------"); + // log("---------") + // log(this.off); + // log(header.ref - start); + // log(header.offset); + // log(header.end - start); + // log("---------"); this.off = header.end; // log(this.off); } @@ -183,10 +180,10 @@ export class Parser { } export function newParser(buf: Uint8Array): Parser { - log(buf); + // log(buf); let buffer = new Buffer(buf); - log(buffer); - log(buffer.off) + // log(buffer); + // log(buffer.off) return new Parser(buffer); } export function parse(p: Parser): Module { diff --git a/lib/parse/assembly/module/index.ts b/lib/parse/assembly/module/index.ts index d2477fc597..0273638ddf 100644 --- a/lib/parse/assembly/module/index.ts +++ b/lib/parse/assembly/module/index.ts @@ -84,6 +84,14 @@ export class Module { return imports; } + print(): void { + for (let i = 0; i< this.headers.length; i++){ + log(this.headers[i].toString()); + log(""); + } + + } + } function typeName(t: Type): string{ @@ -183,12 +191,13 @@ export class SectionHeader { let payloadOff = itoa(this.payload_off); let name = this.name; let end = itoa(this.end); - return "ref: "+ ref + "\n" + + return "name: " + name + "\n" + + "ref: "+ ref + "\n" + "id: " + id + "\n" + "payload off: " + payloadOff + "\n" + "payload length: " + payloadLen + "\n" + - "end: " + end + "\n" + - "name: " + name; + "end: " + end; + } } diff --git a/lib/parse/build/index.d.ts b/lib/parse/build/index.d.ts index 0aa4f8c604..6bb19cd7d2 100644 --- a/lib/parse/build/index.d.ts +++ b/lib/parse/build/index.d.ts @@ -8,6 +8,7 @@ declare module ASModule { type f32 = number; type f64 = number; type bool = any; + function printModule(m: u32): void; function getType(m: u32): u32; function getImports(m: u32): void; function removeStartFunction(m: u32): u32; @@ -48,6 +49,7 @@ declare module ASModule { getID(id: i32): u32; getType(): u32; getImports(): u32; + print(): void; } } export default ASModule; diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index 84aa0f2df7..f026b0b323 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -7,67 +7,63 @@ (type $iii (func (param i32 i32) (result i32))) (type $iiiiv (func (param i32 i32 i32 i32))) (type $iiv (func (param i32 i32))) + (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) (type $FUNCSIG$ii (func (param i32) (result i32))) (type $FUNCSIG$iii (func (param i32 i32) (result i32))) - (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) (type $FUNCSIG$i (func (result i32))) (import "env" "memory" (memory $0 1)) - (data (i32.const 8) "\16\00\00\00i\00n\00 \00t\00h\00e\00 \00s\00t\00a\00r\00t\00 \00f\00u\00n\00c\00t\00i\00o\00n\00!") - (data (i32.const 56) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") - (data (i32.const 88) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s") - (data (i32.const 152) "\18\00\00\00a\00s\00s\00e\00m\00b\00l\00y\00/\00m\00o\00d\00u\00l\00e\00/\00i\00n\00d\00e\00x\00.\00t\00s") - (data (i32.const 208) "\01\00\00\000") - (data (i32.const 216) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") - (data (i32.const 272) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009") - (data (i32.const 784) "\10\01\00\00d") - (data (i32.const 792) "\03\00\00\00i\003\002") - (data (i32.const 808) "\03\00\00\00i\006\004") - (data (i32.const 824) "\03\00\00\00f\003\002") - (data (i32.const 840) "\03\00\00\00f\006\004") - (data (i32.const 856) "\07\00\00\00a\00n\00y\00f\00u\00n\00c") - (data (i32.const 880) "\04\00\00\00f\00u\00n\00c") - (data (i32.const 896) "\04\00\00\00n\00o\00n\00e") - (data (i32.const 912) "\0e\00\00\00I\00n\00c\00o\00r\00r\00e\00c\00t\00 \00T\00y\00p\00e") - (data (i32.const 944) "\07\00\00\00E\00r\00r\00o\00r\00:\00 ") - (data (i32.const 968) "\04\00\00\00n\00u\00l\00l") - (data (i32.const 984) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") - (data (i32.const 1024) "\02\00\00\00,\00 ") - (data (i32.const 1032) "\04\00\00\00v\00o\00i\00d") - (data (i32.const 1048) "\07\00\00\00i\00n\00d\00e\00x\00:\00 ") - (data (i32.const 1072) "\06\00\00\00f\00o\00r\00m\00:\00 ") - (data (i32.const 1088) "\03\00\00\00,\00 \00(") - (data (i32.const 1104) "\05\00\00\00)\00 \00=\00>\00 ") - (data (i32.const 1128) "`\04") - (data (i32.const 1136) "\01\00\00\00\n") - (data (i32.const 1152) "x\04") - (data (i32.const 1160) "\05\00\00\00r\00e\00f\00:\00 ") - (data (i32.const 1176) "\04\00\00\00i\00d\00:\00 ") - (data (i32.const 1192) "\0d\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00o\00f\00f\00:\00 ") - (data (i32.const 1224) "\10\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00l\00e\00n\00g\00t\00h\00:\00 ") - (data (i32.const 1264) "\05\00\00\00e\00n\00d\00:\00 ") - (data (i32.const 1280) "\06\00\00\00n\00a\00m\00e\00:\00 ") - (data (i32.const 1296) "\1b\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00t\00y\00p\00e\00d\00a\00r\00r\00a\00y\00.\00t\00s") - (data (i32.const 1360) "\12\00\00\00c\00h\00e\00c\00k\00i\00n\00g\00 \00e\00n\00d\00 \00i\00n\00d\00e\00x") - (data (i32.const 1408) "x\05") - (data (i32.const 1416) "\08\00\00\00s\00t\00a\00r\00t\00i\00n\00g") - (data (i32.const 1440) "\0e\00\00\00M\00a\00g\00i\00c\00 \00i\00s\00 \00v\00a\00l\00i\00d") - (data (i32.const 1472) "\01\00\00\00\'") - (data (i32.const 1480) "\06\00\00\00C\00u\00s\00t\00o\00m") - (data (i32.const 1496) "\04\00\00\00T\00y\00p\00e") - (data (i32.const 1512) "\06\00\00\00I\00m\00p\00o\00r\00t") - (data (i32.const 1528) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n") - (data (i32.const 1552) "\05\00\00\00T\00a\00b\00l\00e") - (data (i32.const 1568) "\06\00\00\00M\00e\00m\00o\00r\00y") - (data (i32.const 1584) "\06\00\00\00G\00l\00o\00b\00a\00l") - (data (i32.const 1600) "\06\00\00\00E\00x\00p\00o\00r\00t") - (data (i32.const 1616) "\05\00\00\00S\00t\00a\00r\00t") - (data (i32.const 1632) "\07\00\00\00E\00l\00e\00m\00e\00n\00t") - (data (i32.const 1656) "\04\00\00\00C\00o\00d\00e") - (data (i32.const 1672) "\04\00\00\00D\00a\00t\00a") - (data (i32.const 1688) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 ") - (data (i32.const 1720) "\t\00\00\00-\00-\00-\00-\00-\00-\00-\00-\00-") - (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) + (data (i32.const 8) "\01\00\00\000") + (data (i32.const 16) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") + (data (i32.const 72) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009") + (data (i32.const 584) "H\00\00\00d") + (data (i32.const 592) "\06\00\00\00n\00a\00m\00e\00:\00 ") + (data (i32.const 608) "\04\00\00\00n\00u\00l\00l") + (data (i32.const 624) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") + (data (i32.const 664) "\01\00\00\00\n") + (data (i32.const 672) "\05\00\00\00r\00e\00f\00:\00 ") + (data (i32.const 688) "\04\00\00\00i\00d\00:\00 ") + (data (i32.const 704) "\0d\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00o\00f\00f\00:\00 ") + (data (i32.const 736) "\10\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00l\00e\00n\00g\00t\00h\00:\00 ") + (data (i32.const 776) "\05\00\00\00e\00n\00d\00:\00 ") + (data (i32.const 792) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") + (data (i32.const 824) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s") + (data (i32.const 888) "\18\00\00\00a\00s\00s\00e\00m\00b\00l\00y\00/\00m\00o\00d\00u\00l\00e\00/\00i\00n\00d\00e\00x\00.\00t\00s") + (data (i32.const 944) "\03\00\00\00i\003\002") + (data (i32.const 960) "\03\00\00\00i\006\004") + (data (i32.const 976) "\03\00\00\00f\003\002") + (data (i32.const 992) "\03\00\00\00f\006\004") + (data (i32.const 1008) "\07\00\00\00a\00n\00y\00f\00u\00n\00c") + (data (i32.const 1032) "\04\00\00\00f\00u\00n\00c") + (data (i32.const 1048) "\04\00\00\00n\00o\00n\00e") + (data (i32.const 1064) "\0e\00\00\00I\00n\00c\00o\00r\00r\00e\00c\00t\00 \00T\00y\00p\00e") + (data (i32.const 1096) "\07\00\00\00E\00r\00r\00o\00r\00:\00 ") + (data (i32.const 1120) "\02\00\00\00,\00 ") + (data (i32.const 1128) "\04\00\00\00v\00o\00i\00d") + (data (i32.const 1144) "\07\00\00\00i\00n\00d\00e\00x\00:\00 ") + (data (i32.const 1168) "\06\00\00\00f\00o\00r\00m\00:\00 ") + (data (i32.const 1184) "\03\00\00\00,\00 \00(") + (data (i32.const 1200) "\05\00\00\00)\00 \00=\00>\00 ") + (data (i32.const 1224) "\c0\04") + (data (i32.const 1240) "\d0\04") + (data (i32.const 1248) "\1b\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00t\00y\00p\00e\00d\00a\00r\00r\00a\00y\00.\00t\00s") + (data (i32.const 1312) "\12\00\00\00c\00h\00e\00c\00k\00i\00n\00g\00 \00e\00n\00d\00 \00i\00n\00d\00e\00x") + (data (i32.const 1360) "H\05") + (data (i32.const 1368) "\01\00\00\00\'") + (data (i32.const 1376) "\06\00\00\00C\00u\00s\00t\00o\00m") + (data (i32.const 1392) "\04\00\00\00T\00y\00p\00e") + (data (i32.const 1408) "\06\00\00\00I\00m\00p\00o\00r\00t") + (data (i32.const 1424) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n") + (data (i32.const 1448) "\05\00\00\00T\00a\00b\00l\00e") + (data (i32.const 1464) "\06\00\00\00M\00e\00m\00o\00r\00y") + (data (i32.const 1480) "\06\00\00\00G\00l\00o\00b\00a\00l") + (data (i32.const 1496) "\06\00\00\00E\00x\00p\00o\00r\00t") + (data (i32.const 1512) "\05\00\00\00S\00t\00a\00r\00t") + (data (i32.const 1528) "\07\00\00\00E\00l\00e\00m\00e\00n\00t") + (data (i32.const 1552) "\04\00\00\00C\00o\00d\00e") + (data (i32.const 1568) "\04\00\00\00D\00a\00t\00a") + (data (i32.const 1584) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 ") (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) + (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) (import "index" "_log" (func $assembly/host/index/_log (param i32 i32))) (table $0 1 anyfunc) @@ -85,6 +81,7 @@ (global $src/common/ExternalKind.Global (mut i32) (i32.const 3)) (export "memory" (memory $0)) (export "table" (table $0)) + (export "printModule" (func $assembly/index/printModule)) (export "getType" (func $assembly/index/getType)) (export "getImports" (func $assembly/index/getImports)) (export "removeStartFunction" (func $assembly/index/removeStartFunction)) @@ -125,6 +122,7 @@ (export "Module#getID" (func $assembly/module/index/Module#getID)) (export "Module#getType" (func $assembly/module/index/Module#getType)) (export "Module#getImports" (func $assembly/module/index/Module#getImports)) + (export "Module#print" (func $assembly/module/index/Module#print)) (start $start) (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) @@ -1607,773 +1605,885 @@ get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset ) - (func $~lib/internal/arraybuffer/allocateUnsafe (; 15 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) + (func $~lib/internal/number/decimalCount32 (; 15 ;) (type $ii) (param $0 i32) (result i32) get_local $0 - i32.const 1073741816 - i32.gt_u - if - i32.const 0 - i32.const 88 - i32.const 26 - i32.const 2 - call $~lib/env/abort - unreachable + i32.const 100000 + i32.lt_u + if (result i32) + get_local $0 + i32.const 100 + i32.lt_u + if (result i32) + i32.const 1 + i32.const 2 + get_local $0 + i32.const 10 + i32.lt_u + select + else + i32.const 3 + i32.const 4 + i32.const 5 + get_local $0 + i32.const 10000 + i32.lt_u + select + get_local $0 + i32.const 1000 + i32.lt_u + select + end + else + get_local $0 + i32.const 10000000 + i32.lt_u + if (result i32) + i32.const 6 + i32.const 7 + get_local $0 + i32.const 1000000 + i32.lt_u + select + else + i32.const 8 + i32.const 9 + i32.const 10 + get_local $0 + i32.const 1000000000 + i32.lt_u + select + get_local $0 + i32.const 100000000 + i32.lt_u + select + end end - i32.const 1 - i32.const 32 - get_local $0 - i32.const 7 - i32.add - i32.clz - i32.sub - i32.shl - call $~lib/allocator/arena/__memory_allocate - tee_local $1 - get_local $0 - i32.store - get_local $1 ) - (func $~lib/array/Array#constructor (; 16 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocateUnsafe (; 16 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) - (local $2 i32) - (local $3 i32) get_local $0 - i32.const 268435454 - i32.gt_u + i32.const 0 + i32.gt_s + tee_local $1 + if + get_local $0 + i32.const 536870910 + i32.le_s + set_local $1 + end + get_local $1 + i32.eqz if i32.const 0 - i32.const 56 - i32.const 45 - i32.const 39 + i32.const 16 + i32.const 14 + i32.const 2 call $~lib/env/abort unreachable end get_local $0 - i32.const 2 + i32.const 1 i32.shl - tee_local $3 - call $~lib/internal/arraybuffer/allocateUnsafe - set_local $2 - i32.const 8 + i32.const 4 + i32.add call $~lib/allocator/arena/__memory_allocate tee_local $1 - i32.const 0 - i32.store - get_local $1 - i32.const 0 - i32.store offset=4 - get_local $1 - get_local $2 - i32.store - get_local $1 get_local $0 - i32.store offset=4 - get_local $2 - i32.const 8 - i32.add - i32.const 0 - get_local $3 - call $~lib/internal/memory/memset + i32.store get_local $1 ) - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 17 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + (func $~lib/internal/number/utoa32_lut (; 17 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) - get_local $1 - get_local $0 + (local $4 i32) + i32.const 584 i32.load - tee_local $2 - i32.gt_s - if - get_local $1 - i32.const 1073741816 - i32.gt_s - if - i32.const 0 - i32.const 88 - i32.const 40 - i32.const 4 - call $~lib/env/abort - unreachable - end + set_local $3 + loop $continue|0 get_local $1 - i32.const 1 - i32.const 32 - get_local $2 - i32.const 7 - i32.add - i32.clz - i32.sub - i32.shl - i32.const 8 - i32.sub - i32.le_s + i32.const 10000 + i32.ge_u if - get_local $0 get_local $1 - i32.store - else + i32.const 10000 + i32.rem_u + set_local $4 get_local $1 - call $~lib/internal/arraybuffer/allocateUnsafe - tee_local $3 - i32.const 8 - i32.add + i32.const 10000 + i32.div_u + set_local $1 + get_local $2 + i32.const 4 + i32.sub + tee_local $2 + i32.const 1 + i32.shl get_local $0 - i32.const 8 i32.add - get_local $2 - call $~lib/internal/memory/memmove get_local $3 - set_local $0 + get_local $4 + i32.const 100 + i32.div_u + i32.const 2 + i32.shl + i32.add + i64.load32_u offset=8 + get_local $3 + get_local $4 + i32.const 100 + i32.rem_u + i32.const 2 + i32.shl + i32.add + i64.load32_u offset=8 + i64.const 32 + i64.shl + i64.or + i64.store offset=4 + br $continue|0 end + end + get_local $1 + i32.const 100 + i32.ge_u + if + get_local $1 + i32.const 100 + i32.rem_u + set_local $4 + get_local $1 + i32.const 100 + i32.div_u + set_local $1 + get_local $2 + i32.const 2 + i32.sub + tee_local $2 + i32.const 1 + i32.shl get_local $0 - i32.const 8 i32.add + get_local $3 + get_local $4 + i32.const 2 + i32.shl + i32.add + i32.load offset=8 + i32.store offset=4 + end + get_local $1 + i32.const 10 + i32.ge_u + if get_local $2 + i32.const 2 + i32.sub + i32.const 1 + i32.shl + get_local $0 i32.add - i32.const 0 + get_local $3 get_local $1 + i32.const 2 + i32.shl + i32.add + i32.load offset=8 + i32.store offset=4 + else get_local $2 + i32.const 1 i32.sub - call $~lib/internal/memory/memset - else + i32.const 1 + i32.shl + get_local $0 + i32.add get_local $1 - get_local $2 - i32.lt_s - if - get_local $1 - i32.const 0 - i32.lt_s - if - i32.const 0 - i32.const 88 - i32.const 62 - i32.const 4 - call $~lib/env/abort - unreachable - end - get_local $0 - get_local $1 - i32.store + i32.const 48 + i32.add + i32.store16 offset=4 + end + ) + (func $~lib/internal/number/itoa (; 18 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + block $__inlined_func$~lib/internal/number/utoa32 + get_local $0 + tee_local $1 + i32.eqz + if + i32.const 8 + set_local $0 + br $__inlined_func$~lib/internal/number/utoa32 end + get_local $1 + call $~lib/internal/number/decimalCount32 + tee_local $2 + call $~lib/internal/string/allocateUnsafe + tee_local $0 + get_local $1 + get_local $2 + call $~lib/internal/number/utoa32_lut end get_local $0 ) - (func $~lib/array/Array#push (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/string/copyUnsafe (; 19 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) + get_local $1 + i32.const 1 + i32.shl + get_local $0 + i32.add + i32.const 4 + i32.add + get_local $2 + i32.const 4 + i32.add + get_local $3 + i32.const 1 + i32.shl + call $~lib/internal/memory/memmove + ) + (func $~lib/string/String#concat (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) get_local $0 - i32.load offset=4 - tee_local $2 - i32.const 1 - i32.add - set_local $3 - get_local $2 + i32.eqz + if + i32.const 0 + i32.const 624 + i32.const 110 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $1 + i32.eqz + if + i32.const 608 + set_local $1 + end get_local $0 i32.load - tee_local $4 + tee_local $3 + get_local $1 i32.load - i32.const 2 - i32.shr_u - i32.ge_u + tee_local $4 + i32.add + tee_local $2 + i32.eqz if - get_local $2 - i32.const 268435454 - i32.ge_u - if - i32.const 0 - i32.const 56 - i32.const 184 - i32.const 42 - call $~lib/env/abort - unreachable - end - get_local $0 - get_local $4 - get_local $3 - i32.const 2 - i32.shl - call $~lib/internal/arraybuffer/reallocateUnsafe - tee_local $4 - i32.store + i32.const 656 + return end + get_local $2 + call $~lib/internal/string/allocateUnsafe + tee_local $2 + i32.const 0 get_local $0 get_local $3 - i32.store offset=4 + call $~lib/internal/string/copyUnsafe + get_local $2 + get_local $3 + get_local $1 get_local $4 + call $~lib/internal/string/copyUnsafe get_local $2 - i32.const 2 - i32.shl - i32.add + ) + (func $~lib/string/String.__concat (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 608 + set_local $0 + end + get_local $0 get_local $1 - i32.store offset=8 - get_local $3 + call $~lib/string/String#concat ) - (func $assembly/module/index/Module#getID (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/SectionHeader#toString (; 22 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) - i32.const 0 - call $~lib/array/Array#constructor - tee_local $4 - i32.load offset=4 - if - i32.const 0 - i32.const 152 - i32.const 56 - i32.const 4 - call $~lib/env/abort - unreachable - end get_local $0 i32.load + call $~lib/internal/number/itoa + set_local $1 + get_local $0 i32.load offset=4 + call $~lib/internal/number/itoa + set_local $2 + get_local $0 + i32.load offset=8 + call $~lib/internal/number/itoa + set_local $3 + get_local $0 + i32.load offset=12 + call $~lib/internal/number/itoa + set_local $4 + get_local $0 + i32.load offset=20 set_local $5 + get_local $0 + i32.load offset=12 + get_local $0 + i32.load offset=8 + i32.add + call $~lib/internal/number/itoa + set_local $0 + i32.const 592 + get_local $5 + call $~lib/string/String.__concat + i32.const 664 + call $~lib/string/String.__concat + i32.const 672 + call $~lib/string/String.__concat + get_local $1 + call $~lib/string/String.__concat + i32.const 664 + call $~lib/string/String.__concat + i32.const 688 + call $~lib/string/String.__concat + get_local $2 + call $~lib/string/String.__concat + i32.const 664 + call $~lib/string/String.__concat + i32.const 704 + call $~lib/string/String.__concat + get_local $4 + call $~lib/string/String.__concat + i32.const 664 + call $~lib/string/String.__concat + i32.const 736 + call $~lib/string/String.__concat + get_local $3 + call $~lib/string/String.__concat + i32.const 664 + call $~lib/string/String.__concat + i32.const 776 + call $~lib/string/String.__concat + get_local $0 + call $~lib/string/String.__concat + ) + (func $assembly/module/index/Module#print (; 23 ;) (type $iv) (param $0 i32) + (local $1 i32) + (local $2 i32) loop $repeat|0 - get_local $2 - get_local $5 + get_local $1 + get_local $0 + i32.load + i32.load offset=4 i32.lt_s if - get_local $2 + get_local $1 get_local $0 i32.load i32.load - tee_local $3 + tee_local $2 i32.load i32.const 2 i32.shr_u i32.lt_u if (result i32) - get_local $2 + get_local $1 i32.const 2 i32.shl - get_local $3 + get_local $2 i32.add i32.load offset=8 else unreachable end - tee_local $3 - i32.load offset=4 + tee_local $2 + call $assembly/module/index/SectionHeader#toString + call $assembly/host/index/_log_str + i32.const 656 + call $assembly/host/index/_log_str get_local $1 - i32.eq - if - get_local $4 - get_local $2 - get_local $0 - i32.load - i32.load - tee_local $3 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $2 - i32.const 2 - i32.shl - get_local $3 - i32.add - i32.load offset=8 - else - unreachable - end - tee_local $3 - call $~lib/array/Array#push - drop - end - get_local $2 i32.const 1 i32.add - set_local $2 + set_local $1 br $repeat|0 end end - get_local $4 ) - (func $assembly/module/index/Section#constructor (; 20 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/index/printModule (; 24 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/module/index/Module#print + ) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 25 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) - i32.const 4 + get_local $0 + i32.const 1073741816 + i32.gt_u + if + i32.const 0 + i32.const 824 + i32.const 26 + i32.const 2 + call $~lib/env/abort + unreachable + end + i32.const 1 + i32.const 32 + get_local $0 + i32.const 7 + i32.add + i32.clz + i32.sub + i32.shl call $~lib/allocator/arena/__memory_allocate tee_local $1 get_local $0 i32.store get_local $1 ) - (func $assembly/buffer/index/Buffer#readVaruint (; 21 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/array/Array#constructor (; 26 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) - (local $4 i32) get_local $0 - i32.load offset=8 - set_local $1 - loop $continue|0 - get_local $1 - tee_local $2 - i32.const 1 - i32.add - set_local $1 - get_local $2 - i32.load8_u - tee_local $2 - i32.const 127 - i32.and - get_local $4 - i32.shl - get_local $3 - i32.or - set_local $3 - get_local $2 - i32.const 128 - i32.and - if - get_local $4 - i32.const 7 - i32.add - set_local $4 - br $continue|0 - end + i32.const 268435454 + i32.gt_u + if + i32.const 0 + i32.const 792 + i32.const 45 + i32.const 39 + call $~lib/env/abort + unreachable end get_local $0 + i32.const 2 + i32.shl + tee_local $3 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $2 + i32.const 8 + call $~lib/allocator/arena/__memory_allocate + tee_local $1 + i32.const 0 + i32.store get_local $1 - i32.store offset=8 + i32.const 0 + i32.store offset=4 + get_local $1 + get_local $2 + i32.store + get_local $1 + get_local $0 + i32.store offset=4 + get_local $2 + i32.const 8 + i32.add + i32.const 0 get_local $3 + call $~lib/internal/memory/memset + get_local $1 ) - (func $assembly/buffer/index/Buffer#readVarint (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) + get_local $1 get_local $0 - i32.load offset=8 - set_local $5 - loop $continue|0 - get_local $5 - tee_local $4 + i32.load + tee_local $2 + i32.gt_s + if + get_local $1 + i32.const 1073741816 + i32.gt_s + if + i32.const 0 + i32.const 824 + i32.const 40 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $1 i32.const 1 - i32.add - set_local $5 - get_local $4 - i32.load8_u - tee_local $6 - i32.const 127 - i32.and + i32.const 32 get_local $2 + i32.const 7 + i32.add + i32.clz + i32.sub i32.shl - get_local $3 - i32.or - set_local $3 + i32.const 8 + i32.sub + i32.le_s + if + get_local $0 + get_local $1 + i32.store + else + get_local $1 + call $~lib/internal/arraybuffer/allocateUnsafe + tee_local $3 + i32.const 8 + i32.add + get_local $0 + i32.const 8 + i32.add + get_local $2 + call $~lib/internal/memory/memmove + get_local $3 + set_local $0 + end + get_local $0 + i32.const 8 + i32.add get_local $2 - i32.const 7 i32.add - set_local $2 - get_local $6 - i32.const 128 - i32.and - br_if $continue|0 - end - get_local $0 - get_local $5 - i32.store offset=8 - i32.const -1 - get_local $2 - i32.shl - get_local $3 - i32.or - set_local $0 - get_local $2 - get_local $1 - i32.lt_u - tee_local $4 - if - get_local $6 - i32.const 64 - i32.and i32.const 0 - i32.ne - set_local $4 + get_local $1 + get_local $2 + i32.sub + call $~lib/internal/memory/memset + else + get_local $1 + get_local $2 + i32.lt_s + if + get_local $1 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 824 + i32.const 62 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $0 + get_local $1 + i32.store + end end get_local $0 - get_local $3 - get_local $4 - select - ) - (func $assembly/buffer/index/Buffer#readVarint8 (; 23 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - get_local $0 - i32.const 7 - call $assembly/buffer/index/Buffer#readVarint ) - (func $assembly/module/index/FuncType#constructor (; 24 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#push (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) - i32.const 13 - call $~lib/allocator/arena/__memory_allocate - tee_local $2 - i32.const 0 - i32.store - get_local $2 - i32.const 0 - i32.store offset=4 - get_local $2 - get_local $0 - i32.store offset=8 - get_local $2 - get_local $1 - i32.store8 offset=12 - get_local $2 - ) - (func $~lib/array/Array#__set (; 25 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) - get_local $1 + get_local $0 + i32.load offset=4 + tee_local $2 + i32.const 1 + i32.add + set_local $3 + get_local $2 get_local $0 i32.load - tee_local $3 + tee_local $4 i32.load i32.const 2 i32.shr_u i32.ge_u if - get_local $1 + get_local $2 i32.const 268435454 i32.ge_u if i32.const 0 - i32.const 56 - i32.const 109 - i32.const 41 + i32.const 792 + i32.const 184 + i32.const 42 call $~lib/env/abort unreachable end get_local $0 + get_local $4 get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $4 i32.const 2 i32.shl call $~lib/internal/arraybuffer/reallocateUnsafe - tee_local $3 + tee_local $4 i32.store - get_local $0 - get_local $4 - i32.store offset=4 end + get_local $0 get_local $3 - get_local $1 + i32.store offset=4 + get_local $4 + get_local $2 i32.const 2 i32.shl i32.add - get_local $2 + get_local $1 i32.store offset=8 + get_local $3 ) - (func $~lib/internal/number/decimalCount32 (; 26 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#getID (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + i32.const 0 + call $~lib/array/Array#constructor + tee_local $4 + i32.load offset=4 + if + i32.const 0 + i32.const 888 + i32.const 56 + i32.const 4 + call $~lib/env/abort + unreachable + end get_local $0 - i32.const 100000 - i32.lt_u - if (result i32) - get_local $0 - i32.const 100 - i32.lt_u - if (result i32) - i32.const 1 - i32.const 2 + i32.load + i32.load offset=4 + set_local $5 + loop $repeat|0 + get_local $2 + get_local $5 + i32.lt_s + if + get_local $2 get_local $0 - i32.const 10 - i32.lt_u - select - else - i32.const 3 - i32.const 4 - i32.const 5 - get_local $0 - i32.const 10000 - i32.lt_u - select - get_local $0 - i32.const 1000 - i32.lt_u - select - end - else - get_local $0 - i32.const 10000000 - i32.lt_u - if (result i32) - i32.const 6 - i32.const 7 - get_local $0 - i32.const 1000000 - i32.lt_u - select - else - i32.const 8 - i32.const 9 - i32.const 10 - get_local $0 - i32.const 1000000000 - i32.lt_u - select - get_local $0 - i32.const 100000000 + i32.load + i32.load + tee_local $3 + i32.load + i32.const 2 + i32.shr_u i32.lt_u - select + if (result i32) + get_local $2 + i32.const 2 + i32.shl + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + tee_local $3 + i32.load offset=4 + get_local $1 + i32.eq + if + get_local $4 + get_local $2 + get_local $0 + i32.load + i32.load + tee_local $3 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $2 + i32.const 2 + i32.shl + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + tee_local $3 + call $~lib/array/Array#push + drop + end + get_local $2 + i32.const 1 + i32.add + set_local $2 + br $repeat|0 end end + get_local $4 ) - (func $~lib/internal/string/allocateUnsafe (; 27 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Section#constructor (; 30 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) - get_local $0 - i32.const 0 - i32.gt_s - tee_local $1 - if - get_local $0 - i32.const 536870910 - i32.le_s - set_local $1 - end - get_local $1 - i32.eqz - if - i32.const 0 - i32.const 216 - i32.const 14 - i32.const 2 - call $~lib/env/abort - unreachable - end - get_local $0 - i32.const 1 - i32.shl i32.const 4 - i32.add call $~lib/allocator/arena/__memory_allocate tee_local $1 get_local $0 i32.store get_local $1 ) - (func $~lib/internal/number/utoa32_lut (; 28 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $assembly/buffer/index/Buffer#readVaruint (; 31 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) (local $3 i32) (local $4 i32) - i32.const 784 - i32.load - set_local $3 + get_local $0 + i32.load offset=8 + set_local $1 loop $continue|0 get_local $1 - i32.const 10000 - i32.ge_u + tee_local $2 + i32.const 1 + i32.add + set_local $1 + get_local $2 + i32.load8_u + tee_local $2 + i32.const 127 + i32.and + get_local $4 + i32.shl + get_local $3 + i32.or + set_local $3 + get_local $2 + i32.const 128 + i32.and if - get_local $1 - i32.const 10000 - i32.rem_u - set_local $4 - get_local $1 - i32.const 10000 - i32.div_u - set_local $1 - get_local $2 - i32.const 4 - i32.sub - tee_local $2 - i32.const 1 - i32.shl - get_local $0 - i32.add - get_local $3 get_local $4 - i32.const 100 - i32.div_u - i32.const 2 - i32.shl - i32.add - i64.load32_u offset=8 - get_local $3 - get_local $4 - i32.const 100 - i32.rem_u - i32.const 2 - i32.shl + i32.const 7 i32.add - i64.load32_u offset=8 - i64.const 32 - i64.shl - i64.or - i64.store offset=4 + set_local $4 br $continue|0 end end + get_local $0 get_local $1 - i32.const 100 - i32.ge_u - if - get_local $1 - i32.const 100 - i32.rem_u - set_local $4 - get_local $1 - i32.const 100 - i32.div_u - set_local $1 - get_local $2 - i32.const 2 - i32.sub - tee_local $2 + i32.store offset=8 + get_local $3 + ) + (func $assembly/buffer/index/Buffer#readVarint (; 32 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + i32.load offset=8 + set_local $5 + loop $continue|0 + get_local $5 + tee_local $4 i32.const 1 - i32.shl - get_local $0 i32.add - get_local $3 + set_local $5 get_local $4 - i32.const 2 - i32.shl - i32.add - i32.load offset=8 - i32.store offset=4 - end - get_local $1 - i32.const 10 - i32.ge_u - if + i32.load8_u + tee_local $6 + i32.const 127 + i32.and get_local $2 - i32.const 2 - i32.sub - i32.const 1 i32.shl - get_local $0 - i32.add get_local $3 - get_local $1 - i32.const 2 - i32.shl - i32.add - i32.load offset=8 - i32.store offset=4 - else + i32.or + set_local $3 get_local $2 - i32.const 1 - i32.sub - i32.const 1 - i32.shl - get_local $0 - i32.add - get_local $1 - i32.const 48 + i32.const 7 i32.add - i32.store16 offset=4 - end - ) - (func $~lib/internal/number/itoa (; 29 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - block $__inlined_func$~lib/internal/number/utoa32 - get_local $0 - tee_local $1 - i32.eqz - if - i32.const 208 - set_local $0 - br $__inlined_func$~lib/internal/number/utoa32 - end - get_local $1 - call $~lib/internal/number/decimalCount32 - tee_local $2 - call $~lib/internal/string/allocateUnsafe - tee_local $0 - get_local $1 - get_local $2 - call $~lib/internal/number/utoa32_lut - end - get_local $0 - ) - (func $~lib/internal/string/copyUnsafe (; 30 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) - get_local $1 - i32.const 1 - i32.shl + set_local $2 + get_local $6 + i32.const 128 + i32.and + br_if $continue|0 + end get_local $0 - i32.add - i32.const 4 - i32.add + get_local $5 + i32.store offset=8 + i32.const -1 get_local $2 - i32.const 4 - i32.add - get_local $3 - i32.const 1 i32.shl - call $~lib/internal/memory/memmove - ) - (func $~lib/string/String#concat (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - get_local $0 - i32.eqz - if - i32.const 0 - i32.const 984 - i32.const 110 - i32.const 4 - call $~lib/env/abort - unreachable - end + get_local $3 + i32.or + set_local $0 + get_local $2 get_local $1 - i32.eqz + i32.lt_u + tee_local $4 if - i32.const 968 - set_local $1 + get_local $6 + i32.const 64 + i32.and + i32.const 0 + i32.ne + set_local $4 end get_local $0 - i32.load - tee_local $3 - get_local $1 - i32.load - tee_local $4 - i32.add + get_local $3 + get_local $4 + select + ) + (func $assembly/buffer/index/Buffer#readVarint8 (; 33 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + get_local $0 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint + ) + (func $assembly/module/index/FuncType#constructor (; 34 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + i32.const 13 + call $~lib/allocator/arena/__memory_allocate tee_local $2 - i32.eqz - if - i32.const 1016 - return - end + i32.const 0 + i32.store get_local $2 - call $~lib/internal/string/allocateUnsafe - tee_local $2 i32.const 0 + i32.store offset=4 + get_local $2 get_local $0 - get_local $3 - call $~lib/internal/string/copyUnsafe + i32.store offset=8 get_local $2 - get_local $3 get_local $1 - get_local $4 - call $~lib/internal/string/copyUnsafe + i32.store8 offset=12 get_local $2 ) - (func $~lib/string/String.__concat (; 32 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#__set (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + get_local $1 get_local $0 - i32.eqz + i32.load + tee_local $3 + i32.load + i32.const 2 + i32.shr_u + i32.ge_u if - i32.const 968 - set_local $0 + get_local $1 + i32.const 268435454 + i32.ge_u + if + i32.const 0 + i32.const 792 + i32.const 109 + i32.const 41 + call $~lib/env/abort + unreachable + end + get_local $0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + tee_local $4 + i32.const 2 + i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + tee_local $3 + i32.store + get_local $0 + get_local $4 + i32.store offset=4 end - get_local $0 + get_local $3 get_local $1 - call $~lib/string/String#concat + i32.const 2 + i32.shl + i32.add + get_local $2 + i32.store offset=8 ) - (func $assembly/host/index/err (; 33 ;) (type $iv) (param $0 i32) - i32.const 944 + (func $assembly/host/index/err (; 36 ;) (type $iv) (param $0 i32) + i32.const 1096 get_local $0 call $~lib/string/String.__concat call $assembly/host/index/_log_str unreachable ) - (func $assembly/module/index/typeName (; 34 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/typeName (; 37 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $case7|0 block $case6|0 @@ -2413,32 +2523,32 @@ br_if $case6|0 br $case7|0 end - i32.const 792 + i32.const 944 return end - i32.const 808 + i32.const 960 return end - i32.const 824 + i32.const 976 return end - i32.const 840 + i32.const 992 return end - i32.const 856 + i32.const 1008 return end - i32.const 880 + i32.const 1032 return end - i32.const 896 + i32.const 1048 return end - i32.const 912 + i32.const 1064 call $assembly/host/index/err - i32.const 1016 + i32.const 656 ) - (func $assembly/module/index/FuncType#toString (; 35 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/FuncType#toString (; 38 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2452,7 +2562,7 @@ i32.load8_s offset=12 call $assembly/module/index/typeName set_local $5 - i32.const 1016 + i32.const 656 set_local $1 loop $repeat|0 get_local $2 @@ -2494,7 +2604,7 @@ i32.lt_s if get_local $1 - i32.const 1024 + i32.const 1120 call $~lib/string/String.__concat set_local $1 end @@ -2529,28 +2639,28 @@ tee_local $0 call $assembly/module/index/typeName else - i32.const 1032 + i32.const 1128 end set_local $0 - i32.const 1048 + i32.const 1144 get_local $4 call $~lib/string/String.__concat - i32.const 1024 + i32.const 1120 call $~lib/string/String.__concat - i32.const 1072 + i32.const 1168 call $~lib/string/String.__concat get_local $5 call $~lib/string/String.__concat - i32.const 1088 + i32.const 1184 call $~lib/string/String.__concat get_local $1 call $~lib/string/String.__concat - i32.const 1104 + i32.const 1200 call $~lib/string/String.__concat get_local $0 call $~lib/string/String.__concat ) - (func $assembly/module/index/TypeSection#parse (; 36 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/TypeSection#parse (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2729,7 +2839,7 @@ end get_local $0 ) - (func $~lib/array/Array#join (; 37 ;) (type $FUNCSIG$i) (result i32) + (func $~lib/array/Array#join (; 40 ;) (type $FUNCSIG$i) (result i32) (local $0 i32) (local $1 i32) (local $2 i32) @@ -2738,7 +2848,7 @@ (local $5 i32) (local $6 i32) (local $7 i32) - i32.const 1132 + i32.const 1228 i32.load i32.const 1 i32.sub @@ -2746,13 +2856,13 @@ i32.const 0 i32.lt_s if - i32.const 1016 + i32.const 656 return end - i32.const 1128 + i32.const 1224 i32.load set_local $5 - i32.const 1136 + i32.const 664 i32.load tee_local $6 i32.const 0 @@ -2831,7 +2941,7 @@ if get_local $0 get_local $1 - i32.const 1136 + i32.const 664 get_local $6 call $~lib/internal/string/copyUnsafe get_local $1 @@ -2863,7 +2973,7 @@ end get_local $0 ) - (func $assembly/module/index/TypeSection#toString (; 38 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/TypeSection#toString (; 41 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) loop $repeat|0 @@ -2873,7 +2983,7 @@ i32.load offset=4 i32.lt_s if - i32.const 1128 + i32.const 1224 get_local $1 get_local $0 i32.load offset=4 @@ -2906,7 +3016,7 @@ end call $~lib/array/Array#join ) - (func $assembly/index/getType (; 39 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/getType (; 42 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) i32.const 0 get_local $0 @@ -2933,7 +3043,7 @@ get_global $assembly/index/type call $assembly/module/index/TypeSection#toString ) - (func $~lib/string/String.fromUTF8 (; 40 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.fromUTF8 (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2943,7 +3053,7 @@ i32.const 1 i32.lt_u if - i32.const 1016 + i32.const 656 return end get_local $1 @@ -2997,7 +3107,7 @@ i32.gt_u if i32.const 0 - i32.const 984 + i32.const 624 i32.const 510 i32.const 8 call $~lib/env/abort @@ -3044,7 +3154,7 @@ i32.gt_u if i32.const 0 - i32.const 984 + i32.const 624 i32.const 514 i32.const 8 call $~lib/env/abort @@ -3119,7 +3229,7 @@ i32.gt_u if i32.const 0 - i32.const 984 + i32.const 624 i32.const 526 i32.const 8 call $~lib/env/abort @@ -3174,7 +3284,7 @@ i32.ne if i32.const 0 - i32.const 984 + i32.const 624 i32.const 535 i32.const 4 call $~lib/env/abort @@ -3192,7 +3302,7 @@ call $~lib/internal/memory/memmove get_local $0 ) - (func $assembly/module/imports/Imports#parse (; 41 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/imports/Imports#parse (; 44 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3360,7 +3470,7 @@ end get_local $0 ) - (func $assembly/module/index/Module#getImports (; 42 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#getImports (; 45 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -3368,7 +3478,7 @@ get_global $src/common/SectionId.Import call $assembly/module/index/Module#getID set_local $3 - i32.const 1156 + i32.const 1244 i32.load call $assembly/host/index/_logi loop $repeat|0 @@ -3377,7 +3487,7 @@ i32.load offset=4 i32.lt_s if - i32.const 1152 + i32.const 1240 get_local $1 get_local $3 i32.load @@ -3415,9 +3525,9 @@ br $repeat|0 end end - i32.const 1152 + i32.const 1240 ) - (func $assembly/index/getImports (; 43 ;) (type $iv) (param $0 i32) + (func $assembly/index/getImports (; 46 ;) (type $iv) (param $0 i32) (local $1 i32) get_local $0 call $assembly/module/index/Module#getImports @@ -3449,85 +3559,19 @@ end end ) - (func $assembly/module/index/Module#get:start (; 44 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:start (; 47 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Start call $assembly/module/index/Module#getID ) - (func $assembly/module/index/Module#get:hasStart (; 45 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:hasStart (; 48 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/Module#get:start i32.load offset=4 i32.const 0 i32.gt_s ) - (func $assembly/module/index/SectionHeader#toString (; 46 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - get_local $0 - i32.load - call $~lib/internal/number/itoa - set_local $1 - get_local $0 - i32.load offset=4 - call $~lib/internal/number/itoa - set_local $2 - get_local $0 - i32.load offset=8 - call $~lib/internal/number/itoa - set_local $3 - get_local $0 - i32.load offset=12 - call $~lib/internal/number/itoa - set_local $4 - get_local $0 - i32.load offset=20 - set_local $5 - get_local $0 - i32.load offset=12 - get_local $0 - i32.load offset=8 - i32.add - call $~lib/internal/number/itoa - set_local $0 - i32.const 1160 - get_local $1 - call $~lib/string/String.__concat - i32.const 1136 - call $~lib/string/String.__concat - i32.const 1176 - call $~lib/string/String.__concat - get_local $2 - call $~lib/string/String.__concat - i32.const 1136 - call $~lib/string/String.__concat - i32.const 1192 - call $~lib/string/String.__concat - get_local $4 - call $~lib/string/String.__concat - i32.const 1136 - call $~lib/string/String.__concat - i32.const 1224 - call $~lib/string/String.__concat - get_local $3 - call $~lib/string/String.__concat - i32.const 1136 - call $~lib/string/String.__concat - i32.const 1264 - call $~lib/string/String.__concat - get_local $0 - call $~lib/string/String.__concat - i32.const 1136 - call $~lib/string/String.__concat - i32.const 1280 - call $~lib/string/String.__concat - get_local $5 - call $~lib/string/String.__concat - ) - (func $~lib/internal/typedarray/TypedArray#constructor (; 47 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#constructor (; 49 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -3535,7 +3579,7 @@ i32.gt_u if i32.const 0 - i32.const 1296 + i32.const 1248 i32.const 23 i32.const 34 call $~lib/env/abort @@ -3571,14 +3615,14 @@ i32.store offset=8 get_local $1 ) - (func $~lib/internal/typedarray/TypedArray#__get (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#__get (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $1 get_local $0 i32.load offset=8 i32.ge_u if i32.const 0 - i32.const 1296 + i32.const 1248 i32.const 39 i32.const 63 call $~lib/env/abort @@ -3593,14 +3637,14 @@ i32.add i32.load8_u offset=8 ) - (func $~lib/internal/typedarray/TypedArray#__set (; 49 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/typedarray/TypedArray#__set (; 51 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $1 get_local $0 i32.load offset=8 i32.ge_u if i32.const 0 - i32.const 1296 + i32.const 1248 i32.const 50 i32.const 63 call $~lib/env/abort @@ -3616,12 +3660,7 @@ get_local $2 i32.store8 offset=8 ) - (func $assembly/host/index/log (; 50 ;) (type $iv) (param $0 i32) - get_local $0 - i32.const 12 - call $assembly/host/index/_log - ) - (func $assembly/index/removeStartFunction (; 51 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/removeStartFunction (; 52 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -3692,7 +3731,7 @@ br $repeat|0 end end - i32.const 1360 + i32.const 1312 call $assembly/host/index/_log_str get_local $0 i32.load offset=4 @@ -3701,7 +3740,8 @@ get_local $0 i32.load offset=4 i32.load - call $assembly/host/index/log + i32.const 12 + call $assembly/host/index/_log get_local $0 i32.load offset=4 i32.load @@ -3769,11 +3809,11 @@ end get_local $2 ) - (func $assembly/index/toString (; 52 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/toString (; 53 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/TypeSection#toString ) - (func $assembly/module/index/Module#constructor (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/Module#constructor (; 54 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if @@ -3790,11 +3830,11 @@ get_local $1 i32.store offset=4 get_local $0 - i32.const 1408 + i32.const 1360 i32.store get_local $0 ) - (func $assembly/index/Parser#constructor (; 54 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/Parser#constructor (; 55 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if @@ -3817,7 +3857,7 @@ i32.store offset=4 get_local $0 ) - (func $assembly/index/Parser#parseString (; 55 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#parseString (; 56 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 @@ -3826,23 +3866,23 @@ call $assembly/buffer/index/Buffer#readVaruint call $~lib/string/String.fromUTF8 ) - (func $assembly/index/Parser#readVaruint (; 56 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/Parser#readVaruint (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.load call $assembly/buffer/index/Buffer#readVaruint ) - (func $assembly/index/Parser#get:off (; 57 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#get:off (; 58 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 ) - (func $assembly/index/Parser#set:off (; 58 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/index/Parser#set:off (; 59 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 i32.load get_local $1 i32.store offset=8 ) - (func $assembly/module/index/sectionName (; 59 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/sectionName (; 60 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $case12|0 block $case11|0 @@ -3871,45 +3911,45 @@ end br $case12|0 end - i32.const 1480 + i32.const 1376 return end - i32.const 1496 + i32.const 1392 return end - i32.const 1512 + i32.const 1408 return end - i32.const 1528 + i32.const 1424 return end - i32.const 1552 + i32.const 1448 return end - i32.const 1568 + i32.const 1464 return end - i32.const 1584 + i32.const 1480 return end - i32.const 1600 + i32.const 1496 return end - i32.const 1616 + i32.const 1512 return end - i32.const 1632 + i32.const 1528 return end - i32.const 1656 + i32.const 1552 return end - i32.const 1672 + i32.const 1568 return end unreachable ) - (func $assembly/module/index/SectionHeader#constructor (; 60 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/module/index/SectionHeader#constructor (; 61 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -3931,7 +3971,7 @@ i32.const 0 i32.store offset=16 get_local $2 - i32.const 1016 + i32.const 656 i32.store offset=20 get_local $2 tee_local $1 @@ -3970,7 +4010,7 @@ get_local $1 i32.load call $assembly/host/index/_logi - i32.const 1688 + i32.const 1584 get_local $1 i32.load offset=4 call $~lib/internal/number/itoa @@ -3985,13 +4025,13 @@ call $assembly/buffer/index/Buffer#readVaruint set_local $3 get_local $1 - i32.const 1472 + i32.const 1368 get_local $0 i32.load offset=8 get_local $3 call $~lib/string/String.fromUTF8 call $~lib/string/String.__concat - i32.const 1472 + i32.const 1368 call $~lib/string/String.__concat i32.store offset=20 get_local $0 @@ -4016,7 +4056,7 @@ i32.store offset=12 get_local $1 ) - (func $assembly/module/index/Module#parseSection (; 61 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/module/index/Module#parseSection (; 62 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 i32.load get_local $1 @@ -4030,47 +4070,27 @@ br_if $break|0 end ) - (func $assembly/index/Parser#parse (; 62 ;) (type $iv) (param $0 i32) + (func $assembly/index/Parser#parse (; 63 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) (local $3 i32) - (local $4 i32) get_local $0 i32.load i32.load offset=8 - call $assembly/host/index/_logi - get_local $0 - i32.load - i32.load - i32.load - i32.const 8 - i32.add - call $assembly/host/index/_logi - get_local $0 - i32.load - i32.load offset=4 - call $assembly/host/index/_logi + drop get_local $0 i32.load + tee_local $1 i32.load offset=8 - set_local $4 - i32.const 1416 - call $assembly/host/index/_log_str - get_local $0 - i32.load tee_local $2 - i32.load offset=8 - tee_local $3 i32.load - set_local $1 + set_local $3 + get_local $1 get_local $2 - get_local $3 i32.const 4 i32.add i32.store offset=8 - get_local $1 - call $assembly/host/index/_logi - get_local $1 + get_local $3 i32.const 1836278016 i32.ne if @@ -4078,26 +4098,22 @@ end get_local $0 i32.load - tee_local $2 + tee_local $1 i32.load offset=8 - tee_local $3 + tee_local $2 i32.load - set_local $1 + set_local $3 + get_local $1 get_local $2 - get_local $3 i32.const 4 i32.add i32.store offset=8 - get_local $1 - call $assembly/host/index/_logi - get_local $1 + get_local $3 i32.const 1 i32.ne if unreachable end - i32.const 1440 - call $assembly/host/index/_log_str loop $continue|0 get_local $0 i32.load @@ -4110,37 +4126,11 @@ get_local $0 i32.load call $assembly/module/index/SectionHeader#constructor - tee_local $1 - call $assembly/module/index/SectionHeader#toString - call $assembly/host/index/_log_str + set_local $1 get_local $0 i32.load offset=4 get_local $1 call $assembly/module/index/Module#parseSection - i32.const 1720 - call $assembly/host/index/_log_str - get_local $0 - i32.load - i32.load offset=8 - call $assembly/host/index/_logi - get_local $1 - i32.load - get_local $4 - i32.sub - call $assembly/host/index/_logi - get_local $1 - i32.load offset=16 - call $assembly/host/index/_logi - get_local $1 - i32.load offset=12 - get_local $1 - i32.load offset=8 - i32.add - get_local $4 - i32.sub - call $assembly/host/index/_logi - i32.const 1720 - call $assembly/host/index/_log_str get_local $0 i32.load get_local $1 @@ -4153,7 +4143,7 @@ end end ) - (func $assembly/buffer/index/Buffer#constructor (; 63 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#constructor (; 64 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) i32.const 20 call $~lib/allocator/arena/__memory_allocate @@ -4198,34 +4188,24 @@ i32.store offset=16 get_local $1 ) - (func $assembly/index/newParser (; 64 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - get_local $0 - call $assembly/host/index/log + (func $assembly/index/newParser (; 65 ;) (type $ii) (param $0 i32) (result i32) + i32.const 0 get_local $0 call $assembly/buffer/index/Buffer#constructor - tee_local $1 - i32.const 20 - call $assembly/host/index/_log - get_local $1 - i32.load offset=8 - call $assembly/host/index/_logi - i32.const 0 - get_local $1 call $assembly/index/Parser#constructor ) - (func $assembly/index/parse (; 65 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/parse (; 66 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/index/Parser#parse get_local $0 i32.load offset=4 ) - (func $assembly/module/index/Module#get:Type (; 66 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:Type (; 67 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Type call $assembly/module/index/Module#getID ) - (func $assembly/module/index/Module#getType (; 67 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#getType (; 68 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) i32.const 0 get_local $0 @@ -4248,31 +4228,29 @@ i32.load offset=4 call $assembly/module/index/TypeSection#parse ) - (func $start (; 68 ;) (type $v) - i32.const 1744 + (func $start (; 69 ;) (type $v) + i32.const 1616 set_global $~lib/allocator/arena/startOffset get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset - i32.const 8 - call $assembly/host/index/_log_str ) - (func $null (; 69 ;) (type $v) + (func $null (; 70 ;) (type $v) nop ) - (func $Parser#get:buf (; 70 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:buf (; 71 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) - (func $Parser#set:buf (; 71 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:buf (; 72 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store ) - (func $Parser#get:module (; 72 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:module (; 73 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) - (func $Parser#set:module (; 73 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:module (; 74 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store offset=4 diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index 505c1ddc7c..f874dd3890 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -74,6 +74,10 @@ export class WasmParser { return this.memory.getString(this.instance.getType(this.mod)) } + + printModule(): void { + this.instance.printModule(this.mod); + } } diff --git a/lib/parse/tests/index.ts b/lib/parse/tests/index.ts index a93f6a8e97..5916df9855 100644 --- a/lib/parse/tests/index.ts +++ b/lib/parse/tests/index.ts @@ -15,4 +15,5 @@ import { debugger; let parser = new WasmParser(binary); console.log(parser.Type); + parser.printModule(); }); From 1667b4d5afa34f15852f7d2c15b5d03ad9c417f7 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Sun, 3 Feb 2019 11:09:16 -0500 Subject: [PATCH 24/46] Can remove start section again --- lib/parse/assembly/index.ts | 26 +++++++++++++------------- lib/parse/src/index.ts | 7 ++++++- lib/parse/tests/index.ts | 3 +++ 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index f7f831ca3f..77a7501fcd 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -86,32 +86,32 @@ export function getImports(m: Module): void { // return } -export function removeStartFunction (m: Module): Uint8Array { - if (m.hasStart) { - let start : SectionHeader = m.getID(SectionId.Start)[0]; +export function removeStartFunction (mod: Module): Uint8Array { + if (mod.hasStart) { + let start : SectionHeader = mod.getID(SectionId.Start)[0]; log(start.toString()); let len = start.end - start.ref; log(len); - let buf = new Uint8Array(m.buf.length - len); + let buf = new Uint8Array(mod.buf.length - len); log(start.offset) for (let i:u32 = 0; i < start.offset; i++) { - buf[i] = m.buf.buffer[i]; + buf[i] = mod.buf.buffer[i]; } log("checking end index"); - log(m.buf.end); - log(m.buf.buffer); - log(m.buf.buffer[m.buf.length - 1]); + log(mod.buf.end); + log(mod.buf.buffer); + log(mod.buf.buffer[mod.buf.length - 1]); log(start.offset + len) - for (let i:u32 = start.offset + len; i < m.buf.length; i++) { - if ( i> m.buf.length - 8000) log(i); - buf[i-len] = m.buf.buffer[i]; + for (let i:u32 = start.offset + len; i < mod.buf.length; i++) { + if ( i> mod.buf.length - 8000) log(i); + buf[i-len] = mod.buf.buffer[i]; } - // memory.copy(buf.buffer.byteLength, m.buf.buffer.byteOffset, start.ref); + // modemory.copy(buf.buffer.byteLength, m.buf.buffer.byteOffset, start.ref); // memory.copy(buf.buffer.byteLength+start.end, m.buf.buffer.byteLength + start.end, m.buf.buffer.byteLength - start.end); return buf; } else { - return m.buf.buffer; + return mod.buf.buffer; } } diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index f874dd3890..91582c874e 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -65,7 +65,7 @@ export class WasmParser { options: {}, } this.instance = loader.instantiate(compiled, imports); - let array = this.memory.newArray(new Uint8Array(binary)) + let array = this.memory.newArray(binary); let parserPtr = this.instance.newParser(array); this.mod = this.instance.parse(parserPtr); } @@ -78,6 +78,11 @@ export class WasmParser { printModule(): void { this.instance.printModule(this.mod); } + + removeStartFunction(): Uint8Array { + let binary = this.memory.getArray(Uint8Array, this.instance.removeStartFunction(this.mod)); + return binary; + } } diff --git a/lib/parse/tests/index.ts b/lib/parse/tests/index.ts index 5916df9855..49c3832611 100644 --- a/lib/parse/tests/index.ts +++ b/lib/parse/tests/index.ts @@ -16,4 +16,7 @@ import { let parser = new WasmParser(binary); console.log(parser.Type); parser.printModule(); + let strippedBinary = parser.removeStartFunction(); + let parser2 = new WasmParser(strippedBinary); + parser2.printModule(); }); From 3dc6438ed1b3b116c5db11f47def90f4bb402b2f Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Sun, 3 Feb 2019 16:15:08 -0500 Subject: [PATCH 25/46] Cleaned up and tests are passing --- lib/parse/assembly/host/index.ts | 2 +- lib/parse/assembly/index.ts | 92 ++- lib/parse/assembly/module/index.ts | 10 +- lib/parse/build/index.d.ts | 5 +- lib/parse/build/index.wat | 884 +++++++++++++++-------------- lib/parse/src/index.ts | 45 +- lib/parse/tests/index.ts | 15 +- 7 files changed, 537 insertions(+), 516 deletions(-) diff --git a/lib/parse/assembly/host/index.ts b/lib/parse/assembly/host/index.ts index f9aadcfe6b..1fa69c307d 100644 --- a/lib/parse/assembly/host/index.ts +++ b/lib/parse/assembly/host/index.ts @@ -3,7 +3,7 @@ export declare function _log(x: T, size: usize): void; export declare function _log_str(x: string): void; export declare function _logi(x: i32): void; export declare function _logf(x: f32): void; - +export declare function debug(): void; export function log(item: T):void { if (isReference()) { diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index 77a7501fcd..29881e0885 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -11,14 +11,14 @@ import { Opcode } from "../src/common"; -export {memory} -import {Buffer} from './buffer'; -import {SectionHeader, - TypeSection, - Module} from './module'; -import {log} from './host'; - -declare function debug():void; +export { memory } +import { Buffer } from "./buffer"; +import { + SectionHeader, + TypeSection, + Module +} from "./module"; +import { log } from "./host"; // log("in the start function!"); // type FunctionName = string | symbol; @@ -55,60 +55,57 @@ declare function debug():void; // // } -let type: TypeSection; +var type: TypeSection; export function printModule(m: Module): void { m.print(); } export function getType(m: Module): string { - let headers:SectionHeader[] = m.getID(SectionId.Type); - let section = new TypeSection(headers[0]); + var headers: SectionHeader[] = m.getID(SectionId.Type); + var section = new TypeSection(headers[0]); type = section.parse(m.buf); return type.toString(); } export function getImports(m: Module): void { - let imports = m.getImports(); + var imports = m.getImports(); // log(imports.length); - if (imports.length>0) - for (let i = 0; i< imports.length; i++){ - - // log(imports.length); - log(imports.length); - - // log(imports.length); - // for (let j = 0; i< imports[i].imports.length; j++){ - // let _import = imports[i].imports[j]; - // log(_import.toString()) - // } + if (imports.length > 0) { + for (let i = 0; i < imports.length; i++) { + log(imports.length); + + // log(imports.length); + // for (let j = 0; i< imports[i].imports.length; j++){ + // let _import = imports[i].imports[j]; + // log(_import.toString()) + // } + } } // return } export function removeStartFunction (mod: Module): Uint8Array { if (mod.hasStart) { - let start : SectionHeader = mod.getID(SectionId.Start)[0]; - log(start.toString()); + let sections : SectionHeader[] = mod.getID(SectionId.Start); + let start = sections[0]; + // log(start.toString()); let len = start.end - start.ref; - log(len); + // log(len); let buf = new Uint8Array(mod.buf.length - len); - log(start.offset) + // log(start.offset) - for (let i:u32 = 0; i < start.offset; i++) { + for (let i: u32 = 0; i < start.offset; i++) { buf[i] = mod.buf.buffer[i]; } - log("checking end index"); - log(mod.buf.end); - log(mod.buf.buffer); - log(mod.buf.buffer[mod.buf.length - 1]); - log(start.offset + len) - for (let i:u32 = start.offset + len; i < mod.buf.length; i++) { - if ( i> mod.buf.length - 8000) log(i); - buf[i-len] = mod.buf.buffer[i]; + // log("checking end index"); + // log(mod.buf.end); + // log(mod.buf.buffer); + // log(mod.buf.buffer[mod.buf.length - 1]); + // log(start.offset + len) + for (let i: u32 = start.offset + len; i < mod.buf.length; i++) { + buf[i - len] = mod.buf.buffer[i]; } - // modemory.copy(buf.buffer.byteLength, m.buf.buffer.byteOffset, start.ref); - // memory.copy(buf.buffer.byteLength+start.end, m.buf.buffer.byteLength + start.end, m.buf.buffer.byteLength - start.end); return buf; } else { return mod.buf.buffer; @@ -123,17 +120,20 @@ export function removeStartFunction (mod: Module): Uint8Array { export function toString(t:TypeSection): string { return t.toString(); } +export function hasStart(mod: Module): boolean { + return mod.hasStart; +} export class Parser { buf: Buffer; module: Module; - constructor(buf: Buffer){ - this.buf = buf; - this.module = new Module(buf); + constructor(binary: Uint8Array){ + this.buf = new Buffer(binary); + this.module = new Module(this.buf); } parseString(): String { - return String.fromUTF8(this.buf.off,this.buf.readVaruint(32)); + return String.fromUTF8(this.buf.off, this.buf.readVaruint(32)); } readVaruint(len: usize): u32 { @@ -150,7 +150,7 @@ export class Parser { /** Starts parsing the module that has been placed in memory. */ parse(): void { - let start = this.off; + var start = this.off; var magic = this.buf.readUint(); if (magic != 0x6D736100) unreachable(); var version = this.buf.readUint(); @@ -180,11 +180,7 @@ export class Parser { } export function newParser(buf: Uint8Array): Parser { - // log(buf); - let buffer = new Buffer(buf); - // log(buffer); - // log(buffer.off) - return new Parser(buffer); + return new Parser(buf); } export function parse(p: Parser): Module { p.parse(); diff --git a/lib/parse/assembly/module/index.ts b/lib/parse/assembly/module/index.ts index 0273638ddf..a9b0437ff5 100644 --- a/lib/parse/assembly/module/index.ts +++ b/lib/parse/assembly/module/index.ts @@ -51,14 +51,14 @@ export class Module { // log_str(header.name); } - public getID(id: SectionId): SectionHeader[] { - let res: SectionHeader[] = new Array(); + getID(id: SectionId): SectionHeader[] { + var res: SectionHeader[] = new Array(); assert(res.length == 0); - let x: i32 = this.headers.length; + var x: i32 = this.headers.length; // log("length of array should be zero"); // log(res.length) - for (let i=0; i < x; i++){ - if (this.headers[i].id == id){ + for (let i = 0; i < x; i++) { + if (this.headers[i].id == id) { res.push(this.headers[i]); } } diff --git a/lib/parse/build/index.d.ts b/lib/parse/build/index.d.ts index 6bb19cd7d2..3457792c2f 100644 --- a/lib/parse/build/index.d.ts +++ b/lib/parse/build/index.d.ts @@ -11,10 +11,11 @@ declare module ASModule { function printModule(m: u32): void; function getType(m: u32): u32; function getImports(m: u32): void; - function removeStartFunction(m: u32): u32; + function removeStartFunction(mod: u32): u32; function toString(t: u32): u32; + function hasStart(mod: u32): bool; class Parser { - constructor(buf: u32); + constructor(binary: u32); buf: u32; module: u32; parseString(): u32; diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index f026b0b323..ae4bcbba4a 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -46,26 +46,24 @@ (data (i32.const 1224) "\c0\04") (data (i32.const 1240) "\d0\04") (data (i32.const 1248) "\1b\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00t\00y\00p\00e\00d\00a\00r\00r\00a\00y\00.\00t\00s") - (data (i32.const 1312) "\12\00\00\00c\00h\00e\00c\00k\00i\00n\00g\00 \00e\00n\00d\00 \00i\00n\00d\00e\00x") - (data (i32.const 1360) "H\05") - (data (i32.const 1368) "\01\00\00\00\'") - (data (i32.const 1376) "\06\00\00\00C\00u\00s\00t\00o\00m") - (data (i32.const 1392) "\04\00\00\00T\00y\00p\00e") - (data (i32.const 1408) "\06\00\00\00I\00m\00p\00o\00r\00t") - (data (i32.const 1424) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n") - (data (i32.const 1448) "\05\00\00\00T\00a\00b\00l\00e") - (data (i32.const 1464) "\06\00\00\00M\00e\00m\00o\00r\00y") - (data (i32.const 1480) "\06\00\00\00G\00l\00o\00b\00a\00l") - (data (i32.const 1496) "\06\00\00\00E\00x\00p\00o\00r\00t") - (data (i32.const 1512) "\05\00\00\00S\00t\00a\00r\00t") - (data (i32.const 1528) "\07\00\00\00E\00l\00e\00m\00e\00n\00t") - (data (i32.const 1552) "\04\00\00\00C\00o\00d\00e") - (data (i32.const 1568) "\04\00\00\00D\00a\00t\00a") - (data (i32.const 1584) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 ") + (data (i32.const 1320) " \05") + (data (i32.const 1328) "\01\00\00\00\'") + (data (i32.const 1336) "\06\00\00\00C\00u\00s\00t\00o\00m") + (data (i32.const 1352) "\04\00\00\00T\00y\00p\00e") + (data (i32.const 1368) "\06\00\00\00I\00m\00p\00o\00r\00t") + (data (i32.const 1384) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n") + (data (i32.const 1408) "\05\00\00\00T\00a\00b\00l\00e") + (data (i32.const 1424) "\06\00\00\00M\00e\00m\00o\00r\00y") + (data (i32.const 1440) "\06\00\00\00G\00l\00o\00b\00a\00l") + (data (i32.const 1456) "\06\00\00\00E\00x\00p\00o\00r\00t") + (data (i32.const 1472) "\05\00\00\00S\00t\00a\00r\00t") + (data (i32.const 1488) "\07\00\00\00E\00l\00e\00m\00e\00n\00t") + (data (i32.const 1512) "\04\00\00\00C\00o\00d\00e") + (data (i32.const 1528) "\04\00\00\00D\00a\00t\00a") + (data (i32.const 1544) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 ") (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) - (import "index" "_log" (func $assembly/host/index/_log (param i32 i32))) (table $0 1 anyfunc) (elem (i32.const 0) $null) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) @@ -86,6 +84,7 @@ (export "getImports" (func $assembly/index/getImports)) (export "removeStartFunction" (func $assembly/index/removeStartFunction)) (export "toString" (func $assembly/index/toString)) + (export "hasStart" (func $assembly/index/hasStart)) (export "Parser#constructor" (func $assembly/index/Parser#constructor)) (export "Parser#get:buf" (func $Parser#get:buf)) (export "Parser#set:buf" (func $Parser#set:buf)) @@ -124,7 +123,7 @@ (export "Module#getImports" (func $assembly/module/index/Module#getImports)) (export "Module#print" (func $assembly/module/index/Module#print)) (start $start) - (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memset (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i64) get_local $2 @@ -215,11 +214,11 @@ i32.mul tee_local $1 i32.store + get_local $0 get_local $2 i32.const -4 i32.and tee_local $2 - get_local $0 i32.add i32.const 4 i32.sub @@ -304,12 +303,12 @@ get_local $1 i32.store get_local $0 + get_local $0 i32.const 4 i32.and i32.const 24 i32.add tee_local $3 - get_local $0 i32.add set_local $0 get_local $2 @@ -359,13 +358,13 @@ end end ) - (func $~lib/memory/memory.fill (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/memory.fill (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memset ) - (func $~lib/internal/memory/memcpy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memcpy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -598,6 +597,9 @@ i32.ge_u if get_local $0 + get_local $5 + i32.const 24 + i32.shr_u get_local $1 i32.const 1 i32.add @@ -605,14 +607,14 @@ tee_local $3 i32.const 8 i32.shl - get_local $5 - i32.const 24 - i32.shr_u i32.or i32.store get_local $0 i32.const 4 i32.add + get_local $3 + i32.const 24 + i32.shr_u get_local $1 i32.const 5 i32.add @@ -620,14 +622,14 @@ tee_local $5 i32.const 8 i32.shl - get_local $3 - i32.const 24 - i32.shr_u i32.or i32.store get_local $0 i32.const 8 i32.add + get_local $5 + i32.const 24 + i32.shr_u get_local $1 i32.const 9 i32.add @@ -635,14 +637,14 @@ tee_local $3 i32.const 8 i32.shl - get_local $5 - i32.const 24 - i32.shr_u i32.or i32.store get_local $0 i32.const 12 i32.add + get_local $3 + i32.const 24 + i32.shr_u get_local $1 i32.const 13 i32.add @@ -650,9 +652,6 @@ tee_local $5 i32.const 8 i32.shl - get_local $3 - i32.const 24 - i32.shr_u i32.or i32.store get_local $1 @@ -707,6 +706,9 @@ i32.ge_u if get_local $0 + get_local $5 + i32.const 16 + i32.shr_u get_local $1 i32.const 2 i32.add @@ -714,14 +716,14 @@ tee_local $3 i32.const 16 i32.shl - get_local $5 - i32.const 16 - i32.shr_u i32.or i32.store get_local $0 i32.const 4 i32.add + get_local $3 + i32.const 16 + i32.shr_u get_local $1 i32.const 6 i32.add @@ -729,14 +731,14 @@ tee_local $5 i32.const 16 i32.shl - get_local $3 - i32.const 16 - i32.shr_u i32.or i32.store get_local $0 i32.const 8 i32.add + get_local $5 + i32.const 16 + i32.shr_u get_local $1 i32.const 10 i32.add @@ -744,14 +746,14 @@ tee_local $3 i32.const 16 i32.shl - get_local $5 - i32.const 16 - i32.shr_u i32.or i32.store get_local $0 i32.const 12 i32.add + get_local $3 + i32.const 16 + i32.shr_u get_local $1 i32.const 14 i32.add @@ -759,9 +761,6 @@ tee_local $5 i32.const 16 i32.shl - get_local $3 - i32.const 16 - i32.shr_u i32.or i32.store get_local $1 @@ -808,6 +807,9 @@ i32.ge_u if get_local $0 + get_local $5 + i32.const 8 + i32.shr_u get_local $1 i32.const 3 i32.add @@ -815,14 +817,14 @@ tee_local $3 i32.const 24 i32.shl - get_local $5 - i32.const 8 - i32.shr_u i32.or i32.store get_local $0 i32.const 4 i32.add + get_local $3 + i32.const 8 + i32.shr_u get_local $1 i32.const 7 i32.add @@ -830,14 +832,14 @@ tee_local $5 i32.const 24 i32.shl - get_local $3 - i32.const 8 - i32.shr_u i32.or i32.store get_local $0 i32.const 8 i32.add + get_local $5 + i32.const 8 + i32.shr_u get_local $1 i32.const 11 i32.add @@ -845,14 +847,14 @@ tee_local $3 i32.const 24 i32.shl - get_local $5 - i32.const 8 - i32.shr_u i32.or i32.store get_local $0 i32.const 12 i32.add + get_local $3 + i32.const 8 + i32.shr_u get_local $1 i32.const 15 i32.add @@ -860,9 +862,6 @@ tee_local $5 i32.const 24 i32.shl - get_local $3 - i32.const 8 - i32.shr_u i32.or i32.store get_local $1 @@ -1269,7 +1268,7 @@ i32.store8 end ) - (func $~lib/internal/memory/memmove (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memmove (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) get_local $0 @@ -1416,11 +1415,11 @@ if return end + get_local $0 get_local $2 i32.const 1 i32.sub tee_local $2 - get_local $0 i32.add get_local $1 get_local $2 @@ -1435,11 +1434,11 @@ i32.const 8 i32.ge_u if + get_local $0 get_local $2 i32.const 8 i32.sub tee_local $2 - get_local $0 i32.add get_local $1 get_local $2 @@ -1453,11 +1452,11 @@ loop $continue|5 get_local $2 if + get_local $0 get_local $2 i32.const 1 i32.sub tee_local $2 - get_local $0 i32.add get_local $1 get_local $2 @@ -1469,13 +1468,13 @@ end end ) - (func $~lib/memory/memory.copy (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/memory.copy (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memmove ) - (func $~lib/internal/memory/memcmp (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/memory/memcmp (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) get_local $0 get_local $1 @@ -1526,13 +1525,13 @@ end tee_local $0 ) - (func $~lib/memory/memory.compare (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/memory/memory.compare (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memcmp ) - (func $~lib/allocator/arena/__memory_allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/allocator/arena/__memory_allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1594,18 +1593,18 @@ set_global $~lib/allocator/arena/offset get_local $1 ) - (func $~lib/memory/memory.allocate (; 12 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/memory/memory.allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $~lib/allocator/arena/__memory_allocate ) - (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) + (func $~lib/memory/memory.free (; 12 ;) (type $iv) (param $0 i32) nop ) - (func $~lib/memory/memory.reset (; 14 ;) (type $v) + (func $~lib/memory/memory.reset (; 13 ;) (type $v) get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset ) - (func $~lib/internal/number/decimalCount32 (; 15 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/decimalCount32 (; 14 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.const 100000 i32.lt_u @@ -1659,7 +1658,7 @@ end end ) - (func $~lib/internal/string/allocateUnsafe (; 16 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocateUnsafe (; 15 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 i32.const 0 @@ -1692,7 +1691,7 @@ i32.store get_local $1 ) - (func $~lib/internal/number/utoa32_lut (; 17 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/number/utoa32_lut (; 16 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) i32.const 584 @@ -1711,13 +1710,13 @@ i32.const 10000 i32.div_u set_local $1 + get_local $0 get_local $2 i32.const 4 i32.sub tee_local $2 i32.const 1 i32.shl - get_local $0 i32.add get_local $3 get_local $4 @@ -1754,13 +1753,13 @@ i32.const 100 i32.div_u set_local $1 + get_local $0 get_local $2 i32.const 2 i32.sub tee_local $2 i32.const 1 i32.shl - get_local $0 i32.add get_local $3 get_local $4 @@ -1774,12 +1773,12 @@ i32.const 10 i32.ge_u if + get_local $0 get_local $2 i32.const 2 i32.sub i32.const 1 i32.shl - get_local $0 i32.add get_local $3 get_local $1 @@ -1789,12 +1788,12 @@ i32.load offset=8 i32.store offset=4 else + get_local $0 get_local $2 i32.const 1 i32.sub i32.const 1 i32.shl - get_local $0 i32.add get_local $1 i32.const 48 @@ -1802,7 +1801,7 @@ i32.store16 offset=4 end ) - (func $~lib/internal/number/itoa (; 18 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa (; 17 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) block $__inlined_func$~lib/internal/number/utoa32 @@ -1825,11 +1824,11 @@ end get_local $0 ) - (func $~lib/internal/string/copyUnsafe (; 19 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) + (func $~lib/internal/string/copyUnsafe (; 18 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) + get_local $0 get_local $1 i32.const 1 i32.shl - get_local $0 i32.add i32.const 4 i32.add @@ -1841,7 +1840,7 @@ i32.shl call $~lib/internal/memory/memmove ) - (func $~lib/string/String#concat (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -1888,7 +1887,7 @@ call $~lib/internal/string/copyUnsafe get_local $2 ) - (func $~lib/string/String.__concat (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if @@ -1899,7 +1898,7 @@ get_local $1 call $~lib/string/String#concat ) - (func $assembly/module/index/SectionHeader#toString (; 22 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/SectionHeader#toString (; 21 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1965,16 +1964,17 @@ get_local $0 call $~lib/string/String.__concat ) - (func $assembly/module/index/Module#print (; 23 ;) (type $iv) (param $0 i32) + (func $assembly/module/index/Module#print (; 22 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) - loop $repeat|0 - get_local $1 - get_local $0 - i32.load - i32.load offset=4 - i32.lt_s - if + block $break|0 + loop $repeat|0 + get_local $1 + get_local $0 + i32.load + i32.load offset=4 + i32.ge_s + br_if $break|0 get_local $1 get_local $0 i32.load @@ -1985,10 +1985,10 @@ i32.shr_u i32.lt_u if (result i32) + get_local $2 get_local $1 i32.const 2 i32.shl - get_local $2 i32.add i32.load offset=8 else @@ -2004,14 +2004,16 @@ i32.add set_local $1 br $repeat|0 + unreachable end + unreachable end ) - (func $assembly/index/printModule (; 24 ;) (type $iv) (param $0 i32) + (func $assembly/index/printModule (; 23 ;) (type $iv) (param $0 i32) get_local $0 call $assembly/module/index/Module#print ) - (func $~lib/internal/arraybuffer/allocateUnsafe (; 25 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 24 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 i32.const 1073741816 @@ -2019,7 +2021,7 @@ if i32.const 0 i32.const 824 - i32.const 26 + i32.const 23 i32.const 2 call $~lib/env/abort unreachable @@ -2038,7 +2040,7 @@ i32.store get_local $1 ) - (func $~lib/array/Array#constructor (; 26 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/array/Array#constructor (; 25 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2048,7 +2050,7 @@ if i32.const 0 i32.const 792 - i32.const 45 + i32.const 37 i32.const 39 call $~lib/env/abort unreachable @@ -2081,9 +2083,10 @@ call $~lib/internal/memory/memset get_local $1 ) - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) + (local $4 i32) get_local $1 get_local $0 i32.load @@ -2096,7 +2099,7 @@ if i32.const 0 i32.const 824 - i32.const 40 + i32.const 37 i32.const 4 call $~lib/env/abort unreachable @@ -2117,30 +2120,39 @@ get_local $0 get_local $1 i32.store + get_local $0 + i32.const 8 + i32.add + get_local $2 + i32.add + i32.const 0 + get_local $1 + get_local $2 + i32.sub + call $~lib/internal/memory/memset else get_local $1 call $~lib/internal/arraybuffer/allocateUnsafe tee_local $3 i32.const 8 i32.add + tee_local $4 get_local $0 i32.const 8 i32.add get_local $2 call $~lib/internal/memory/memmove + get_local $4 + get_local $2 + i32.add + i32.const 0 + get_local $1 + get_local $2 + i32.sub + call $~lib/internal/memory/memset get_local $3 - set_local $0 + return end - get_local $0 - i32.const 8 - i32.add - get_local $2 - i32.add - i32.const 0 - get_local $1 - get_local $2 - i32.sub - call $~lib/internal/memory/memset else get_local $1 get_local $2 @@ -2152,7 +2164,7 @@ if i32.const 0 i32.const 824 - i32.const 62 + i32.const 61 i32.const 4 call $~lib/env/abort unreachable @@ -2164,7 +2176,7 @@ end get_local $0 ) - (func $~lib/array/Array#push (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#push (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2189,7 +2201,7 @@ if i32.const 0 i32.const 792 - i32.const 184 + i32.const 174 i32.const 42 call $~lib/env/abort unreachable @@ -2215,7 +2227,7 @@ i32.store offset=8 get_local $3 ) - (func $assembly/module/index/Module#getID (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/Module#getID (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2236,11 +2248,12 @@ i32.load i32.load offset=4 set_local $5 - loop $repeat|0 - get_local $2 - get_local $5 - i32.lt_s - if + block $break|0 + loop $repeat|0 + get_local $2 + get_local $5 + i32.ge_s + br_if $break|0 get_local $2 get_local $0 i32.load @@ -2251,10 +2264,10 @@ i32.shr_u i32.lt_u if (result i32) + get_local $3 get_local $2 i32.const 2 i32.shl - get_local $3 i32.add i32.load offset=8 else @@ -2265,7 +2278,6 @@ get_local $1 i32.eq if - get_local $4 get_local $2 get_local $0 i32.load @@ -2276,16 +2288,18 @@ i32.shr_u i32.lt_u if (result i32) + get_local $3 get_local $2 i32.const 2 i32.shl - get_local $3 i32.add i32.load offset=8 else unreachable end - tee_local $3 + set_local $3 + get_local $4 + get_local $3 call $~lib/array/Array#push drop end @@ -2294,11 +2308,13 @@ i32.add set_local $2 br $repeat|0 + unreachable end + unreachable end get_local $4 ) - (func $assembly/module/index/Section#constructor (; 30 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/module/index/Section#constructor (; 29 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) i32.const 4 call $~lib/allocator/arena/__memory_allocate @@ -2307,7 +2323,7 @@ i32.store get_local $1 ) - (func $assembly/buffer/index/Buffer#readVaruint (; 31 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVaruint (; 30 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2315,39 +2331,43 @@ get_local $0 i32.load offset=8 set_local $1 - loop $continue|0 - get_local $1 - tee_local $2 - i32.const 1 - i32.add - set_local $1 - get_local $2 - i32.load8_u - tee_local $2 - i32.const 127 - i32.and - get_local $4 - i32.shl - get_local $3 - i32.or - set_local $3 - get_local $2 - i32.const 128 - i32.and - if + block $break|0 + loop $continue|0 + get_local $1 + tee_local $2 + i32.const 1 + i32.add + set_local $1 + get_local $3 + get_local $2 + i32.load8_u + tee_local $2 + i32.const 127 + i32.and + get_local $4 + i32.shl + i32.or + set_local $3 + get_local $2 + i32.const 128 + i32.and + i32.eqz + br_if $break|0 get_local $4 i32.const 7 i32.add set_local $4 br $continue|0 + unreachable end + unreachable end get_local $0 get_local $1 i32.store offset=8 get_local $3 ) - (func $assembly/buffer/index/Buffer#readVarint (; 32 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2362,6 +2382,7 @@ i32.const 1 i32.add set_local $5 + get_local $3 get_local $4 i32.load8_u tee_local $6 @@ -2369,7 +2390,6 @@ i32.and get_local $2 i32.shl - get_local $3 i32.or set_local $3 get_local $2 @@ -2384,10 +2404,10 @@ get_local $0 get_local $5 i32.store offset=8 + get_local $3 i32.const -1 get_local $2 i32.shl - get_local $3 i32.or set_local $0 get_local $2 @@ -2407,12 +2427,12 @@ get_local $4 select ) - (func $assembly/buffer/index/Buffer#readVarint8 (; 33 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint8 (; 32 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) get_local $0 i32.const 7 call $assembly/buffer/index/Buffer#readVarint ) - (func $assembly/module/index/FuncType#constructor (; 34 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/FuncType#constructor (; 33 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) i32.const 13 call $~lib/allocator/arena/__memory_allocate @@ -2430,7 +2450,7 @@ i32.store8 offset=12 get_local $2 ) - (func $~lib/array/Array#__set (; 35 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 34 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) get_local $1 @@ -2448,7 +2468,7 @@ if i32.const 0 i32.const 792 - i32.const 109 + i32.const 101 i32.const 41 call $~lib/env/abort unreachable @@ -2476,14 +2496,14 @@ get_local $2 i32.store offset=8 ) - (func $assembly/host/index/err (; 36 ;) (type $iv) (param $0 i32) + (func $assembly/host/index/err (; 35 ;) (type $iv) (param $0 i32) i32.const 1096 get_local $0 call $~lib/string/String.__concat call $assembly/host/index/_log_str unreachable ) - (func $assembly/module/index/typeName (; 37 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/typeName (; 36 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $case7|0 block $case6|0 @@ -2548,7 +2568,7 @@ call $assembly/host/index/err i32.const 656 ) - (func $assembly/module/index/FuncType#toString (; 38 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/FuncType#toString (; 37 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2564,14 +2584,14 @@ set_local $5 i32.const 656 set_local $1 - loop $repeat|0 - get_local $2 - get_local $0 - i32.load - i32.load offset=4 - i32.lt_s - if - get_local $1 + block $break|0 + loop $repeat|0 + get_local $2 + get_local $0 + i32.load + i32.load offset=4 + i32.ge_s + br_if $break|0 get_local $2 get_local $0 i32.load @@ -2582,16 +2602,18 @@ i32.shr_u i32.lt_u if (result i32) + get_local $3 get_local $2 i32.const 2 i32.shl - get_local $3 i32.add i32.load offset=8 else unreachable end - tee_local $3 + set_local $3 + get_local $1 + get_local $3 call $assembly/module/index/typeName call $~lib/string/String.__concat set_local $1 @@ -2613,7 +2635,9 @@ i32.add set_local $2 br $repeat|0 + unreachable end + unreachable end get_local $0 i32.load offset=4 @@ -2660,7 +2684,7 @@ get_local $0 call $~lib/string/String.__concat ) - (func $assembly/module/index/TypeSection#parse (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/TypeSection#parse (; 38 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2678,11 +2702,12 @@ tee_local $8 call $~lib/array/Array#constructor set_local $6 - loop $repeat|0 - get_local $2 - get_local $8 - i32.lt_u - if + block $break|0 + loop $repeat|0 + get_local $2 + get_local $8 + i32.ge_u + br_if $break|0 get_local $6 get_local $2 get_local $2 @@ -2699,13 +2724,14 @@ tee_local $7 call $~lib/array/Array#constructor i32.store - i32.const 0 - set_local $4 - loop $repeat|1 - get_local $4 - get_local $7 - i32.lt_u - if + block $break|1 + i32.const 0 + set_local $4 + loop $repeat|1 + get_local $4 + get_local $7 + i32.ge_u + br_if $break|1 get_local $1 call $assembly/buffer/index/Buffer#readVarint8 i32.const 127 @@ -2720,10 +2746,10 @@ i32.shr_u i32.lt_u if (result i32) + get_local $3 get_local $2 i32.const 2 i32.shl - get_local $3 i32.add i32.load offset=8 else @@ -2739,7 +2765,9 @@ i32.add set_local $4 br $repeat|1 + unreachable end + unreachable end get_local $1 call $assembly/buffer/index/Buffer#readVaruint @@ -2753,10 +2781,10 @@ i32.shr_u i32.lt_u if (result i32) + get_local $3 get_local $2 i32.const 2 i32.shl - get_local $3 i32.add i32.load offset=8 else @@ -2766,17 +2794,18 @@ get_local $4 call $~lib/array/Array#constructor i32.store offset=4 - i32.const 0 - set_local $5 - loop $repeat|2 - get_local $5 - get_local $4 - i32.lt_u - if - get_local $1 - call $assembly/buffer/index/Buffer#readVarint8 - i32.const 127 - i32.and + block $break|2 + i32.const 0 + set_local $5 + loop $repeat|2 + get_local $5 + get_local $4 + i32.ge_u + br_if $break|2 + get_local $1 + call $assembly/buffer/index/Buffer#readVarint8 + i32.const 127 + i32.and set_local $7 get_local $2 get_local $6 @@ -2787,10 +2816,10 @@ i32.shr_u i32.lt_u if (result i32) + get_local $3 get_local $2 i32.const 2 i32.shl - get_local $3 i32.add i32.load offset=8 else @@ -2806,7 +2835,9 @@ i32.add set_local $5 br $repeat|2 + unreachable end + unreachable end get_local $2 tee_local $3 @@ -2818,10 +2849,10 @@ i32.shr_u i32.lt_u if (result i32) + get_local $2 get_local $3 i32.const 2 i32.shl - get_local $2 i32.add i32.load offset=8 else @@ -2835,11 +2866,13 @@ i32.add set_local $2 br $repeat|0 + unreachable end + unreachable end get_local $0 ) - (func $~lib/array/Array#join (; 40 ;) (type $FUNCSIG$i) (result i32) + (func $~lib/array/Array#join (; 39 ;) (type $FUNCSIG$i) (result i32) (local $0 i32) (local $1 i32) (local $2 i32) @@ -2875,23 +2908,24 @@ i32.load offset=8 return end - get_local $4 - i32.const 1 - i32.add - set_local $1 - loop $repeat|0 - get_local $0 - get_local $1 - i32.lt_s - if + block $break|0 + get_local $4 + i32.const 1 + i32.add + set_local $1 + loop $repeat|0 + get_local $0 + get_local $1 + i32.ge_s + br_if $break|0 + get_local $2 + get_local $5 get_local $0 i32.const 2 i32.shl - get_local $5 i32.add i32.load offset=8 i32.load - get_local $2 i32.add set_local $2 get_local $0 @@ -2899,28 +2933,31 @@ i32.add set_local $0 br $repeat|0 + unreachable end + unreachable end i32.const 0 set_local $1 - get_local $4 + get_local $2 get_local $6 + get_local $4 i32.mul - get_local $2 i32.add call $~lib/internal/string/allocateUnsafe set_local $0 - i32.const 0 - set_local $2 - loop $repeat|1 - get_local $2 - get_local $4 - i32.lt_s - if + block $break|1 + i32.const 0 + set_local $2 + loop $repeat|1 + get_local $2 + get_local $4 + i32.ge_s + br_if $break|1 + get_local $5 get_local $2 i32.const 2 i32.shl - get_local $5 i32.add i32.load offset=8 tee_local $3 @@ -2954,12 +2991,14 @@ i32.add set_local $2 br $repeat|1 + unreachable end + unreachable end + get_local $5 get_local $4 i32.const 2 i32.shl - get_local $5 i32.add i32.load offset=8 tee_local $3 @@ -2973,16 +3012,17 @@ end get_local $0 ) - (func $assembly/module/index/TypeSection#toString (; 41 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/TypeSection#toString (; 40 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) - loop $repeat|0 - get_local $1 - get_local $0 - i32.load offset=4 - i32.load offset=4 - i32.lt_s - if + block $break|0 + loop $repeat|0 + get_local $1 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.ge_s + br_if $break|0 i32.const 1224 get_local $1 get_local $0 @@ -2994,10 +3034,10 @@ i32.shr_u i32.lt_u if (result i32) + get_local $2 get_local $1 i32.const 2 i32.shl - get_local $2 i32.add i32.load offset=8 else @@ -3012,11 +3052,13 @@ i32.add set_local $1 br $repeat|0 + unreachable end + unreachable end call $~lib/array/Array#join ) - (func $assembly/index/getType (; 42 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/getType (; 41 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) i32.const 0 get_local $0 @@ -3043,7 +3085,7 @@ get_global $assembly/index/type call $assembly/module/index/TypeSection#toString ) - (func $~lib/string/String.fromUTF8 (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.fromUTF8 (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3079,8 +3121,8 @@ i32.const 128 i32.lt_u if (result i32) - get_local $4 get_local $6 + get_local $4 i32.add get_local $3 i32.store16 @@ -3118,20 +3160,20 @@ i32.const 1 i32.add set_local $2 - get_local $4 get_local $6 + get_local $4 i32.add + get_local $3 + i32.const 31 + i32.and + i32.const 6 + i32.shl get_local $0 get_local $5 i32.add i32.load8_u i32.const 63 i32.and - get_local $3 - i32.const 31 - i32.and - i32.const 6 - i32.shl i32.or i32.store16 else @@ -3160,17 +3202,17 @@ call $~lib/env/abort unreachable end - get_local $4 get_local $6 + get_local $4 i32.add get_local $3 i32.const 7 i32.and i32.const 18 i32.shl + get_local $0 get_local $2 tee_local $5 - get_local $0 i32.add i32.load8_u i32.const 63 @@ -3178,11 +3220,11 @@ i32.const 12 i32.shl i32.or + get_local $0 get_local $2 i32.const 1 i32.add tee_local $2 - get_local $0 i32.add i32.load8_u i32.const 63 @@ -3191,11 +3233,11 @@ i32.shl i32.or tee_local $3 + get_local $0 get_local $2 i32.const 1 i32.add tee_local $2 - get_local $0 i32.add i32.load8_u i32.const 63 @@ -3235,17 +3277,17 @@ call $~lib/env/abort unreachable end - get_local $4 get_local $6 + get_local $4 i32.add get_local $3 i32.const 15 i32.and i32.const 12 i32.shl + get_local $0 get_local $2 tee_local $5 - get_local $0 i32.add i32.load8_u i32.const 63 @@ -3254,11 +3296,11 @@ i32.shl i32.or tee_local $3 + get_local $0 get_local $2 i32.const 1 i32.add tee_local $2 - get_local $0 i32.add i32.load8_u i32.const 63 @@ -3279,8 +3321,8 @@ br $continue|0 end end - get_local $1 get_local $2 + get_local $1 i32.ne if i32.const 0 @@ -3302,7 +3344,7 @@ call $~lib/internal/memory/memmove get_local $0 ) - (func $assembly/module/imports/Imports#parse (; 44 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/imports/Imports#parse (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3321,11 +3363,12 @@ tee_local $5 call $~lib/array/Array#constructor i32.store offset=4 - loop $repeat|0 - get_local $4 - get_local $5 - i32.lt_u - if + block $break|0 + loop $repeat|0 + get_local $4 + get_local $5 + i32.ge_u + br_if $break|0 get_local $1 call $assembly/buffer/index/Buffer#readVaruint set_local $2 @@ -3387,20 +3430,20 @@ block $case3|1 block $case2|1 block $case1|1 - get_global $src/common/ExternalKind.Function get_local $2 + get_global $src/common/ExternalKind.Function i32.ne if - get_global $src/common/ExternalKind.Table get_local $2 + get_global $src/common/ExternalKind.Table i32.eq br_if $case1|1 - get_global $src/common/ExternalKind.Memory get_local $2 + get_global $src/common/ExternalKind.Memory i32.eq br_if $case2|1 - get_global $src/common/ExternalKind.Global get_local $2 + get_global $src/common/ExternalKind.Global i32.eq br_if $case3|1 br $case4|1 @@ -3466,11 +3509,13 @@ i32.add set_local $4 br $repeat|0 + unreachable end + unreachable end get_local $0 ) - (func $assembly/module/index/Module#getImports (; 45 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#getImports (; 44 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -3481,12 +3526,13 @@ i32.const 1244 i32.load call $assembly/host/index/_logi - loop $repeat|0 - get_local $1 - get_local $3 - i32.load offset=4 - i32.lt_s - if + block $break|0 + loop $repeat|0 + get_local $1 + get_local $3 + i32.load offset=4 + i32.ge_s + br_if $break|0 i32.const 1240 get_local $1 get_local $3 @@ -3497,10 +3543,10 @@ i32.shr_u i32.lt_u if (result i32) + get_local $2 get_local $1 i32.const 2 i32.shl - get_local $2 i32.add i32.load offset=8 else @@ -3523,11 +3569,13 @@ i32.add set_local $1 br $repeat|0 + unreachable end + unreachable end i32.const 1240 ) - (func $assembly/index/getImports (; 46 ;) (type $iv) (param $0 i32) + (func $assembly/index/getImports (; 45 ;) (type $iv) (param $0 i32) (local $1 i32) get_local $0 call $assembly/module/index/Module#getImports @@ -3559,19 +3607,19 @@ end end ) - (func $assembly/module/index/Module#get:start (; 47 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:start (; 46 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Start call $assembly/module/index/Module#getID ) - (func $assembly/module/index/Module#get:hasStart (; 48 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:hasStart (; 47 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/Module#get:start i32.load offset=4 i32.const 0 i32.gt_s ) - (func $~lib/internal/typedarray/TypedArray#constructor (; 49 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#constructor (; 48 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -3580,7 +3628,7 @@ if i32.const 0 i32.const 1248 - i32.const 23 + i32.const 24 i32.const 34 call $~lib/env/abort unreachable @@ -3615,7 +3663,7 @@ i32.store offset=8 get_local $1 ) - (func $~lib/internal/typedarray/TypedArray#__get (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#__get (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $1 get_local $0 i32.load offset=8 @@ -3623,21 +3671,21 @@ if i32.const 0 i32.const 1248 - i32.const 39 + i32.const 40 i32.const 63 call $~lib/env/abort unreachable end get_local $0 - i32.load offset=4 - get_local $1 - get_local $0 i32.load + get_local $0 + i32.load offset=4 i32.add + get_local $1 i32.add i32.load8_u offset=8 ) - (func $~lib/internal/typedarray/TypedArray#__set (; 51 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/typedarray/TypedArray#__set (; 50 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $1 get_local $0 i32.load offset=8 @@ -3645,22 +3693,22 @@ if i32.const 0 i32.const 1248 - i32.const 50 + i32.const 51 i32.const 63 call $~lib/env/abort unreachable end get_local $0 - i32.load offset=4 - get_local $1 - get_local $0 i32.load + get_local $0 + i32.load offset=4 i32.add + get_local $1 i32.add get_local $2 i32.store8 offset=8 ) - (func $assembly/index/removeStartFunction (; 52 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/removeStartFunction (; 51 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -3673,147 +3721,157 @@ get_global $src/common/SectionId.Start call $assembly/module/index/Module#getID i32.load - tee_local $2 + tee_local $1 i32.load i32.const 2 i32.shr_u i32.lt_u if (result i32) - get_local $2 + get_local $1 i32.load offset=8 else unreachable end - tee_local $2 + set_local $1 + get_local $0 + i32.load offset=4 + i32.load offset=4 + get_local $1 tee_local $3 - call $assembly/module/index/SectionHeader#toString - call $assembly/host/index/_log_str - get_local $3 i32.load offset=12 - get_local $3 + get_local $1 i32.load offset=8 i32.add + tee_local $1 get_local $3 i32.load i32.sub tee_local $4 - call $assembly/host/index/_logi - get_local $0 - i32.load offset=4 - i32.load offset=4 - get_local $4 i32.sub - call $~lib/internal/typedarray/TypedArray#constructor - set_local $2 - get_local $3 - i32.load offset=16 - call $assembly/host/index/_logi - loop $repeat|0 - get_local $1 - get_local $3 - i32.load offset=16 - i32.lt_u - if + call $~lib/internal/typedarray/TypedArray#constructor + set_local $1 + block $break|0 + loop $repeat|0 get_local $2 + get_local $3 + i32.load offset=16 + i32.ge_u + br_if $break|0 get_local $1 + get_local $2 get_local $0 i32.load offset=4 i32.load - get_local $1 - call $~lib/internal/typedarray/TypedArray#__get + get_local $2 + call $~lib/internal/typedarray/TypedArray#__get i32.const 255 i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $1 + call $~lib/internal/typedarray/TypedArray#__set + get_local $2 i32.const 1 i32.add - set_local $1 + set_local $2 br $repeat|0 + unreachable end + unreachable end - i32.const 1312 - call $assembly/host/index/_log_str - get_local $0 - i32.load offset=4 - i32.load offset=16 - call $assembly/host/index/_logi - get_local $0 - i32.load offset=4 - i32.load - i32.const 12 - call $assembly/host/index/_log - get_local $0 - i32.load offset=4 - i32.load - get_local $0 - i32.load offset=4 - i32.load offset=4 - i32.const 1 - i32.sub - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - call $assembly/host/index/_logi - get_local $3 - i32.load offset=16 - get_local $4 - i32.add - call $assembly/host/index/_logi - get_local $3 - i32.load offset=16 - get_local $4 - i32.add - set_local $1 - loop $repeat|1 - get_local $1 - get_local $0 - i32.load offset=4 - i32.load offset=4 - i32.lt_u - if - get_local $1 + block $break|1 + get_local $3 + i32.load offset=16 + get_local $4 + i32.add + set_local $2 + loop $repeat|1 + get_local $2 get_local $0 i32.load offset=4 i32.load offset=4 - i32.const 8000 - i32.sub - i32.gt_u - if - get_local $1 - call $assembly/host/index/_logi - end - get_local $2 + i32.ge_u + br_if $break|1 get_local $1 + get_local $2 get_local $4 i32.sub get_local $0 i32.load offset=4 i32.load - get_local $1 - call $~lib/internal/typedarray/TypedArray#__get + get_local $2 + call $~lib/internal/typedarray/TypedArray#__get i32.const 255 i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $1 + call $~lib/internal/typedarray/TypedArray#__set + get_local $2 i32.const 1 i32.add - set_local $1 + set_local $2 br $repeat|1 + unreachable end + unreachable end else get_local $0 i32.load offset=4 i32.load - set_local $2 + set_local $1 end - get_local $2 + get_local $1 ) - (func $assembly/index/toString (; 53 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/toString (; 52 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/TypeSection#toString ) - (func $assembly/module/index/Module#constructor (; 54 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/hasStart (; 53 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $assembly/module/index/Module#get:hasStart + ) + (func $assembly/buffer/index/Buffer#constructor (; 54 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + i32.const 20 + call $~lib/allocator/arena/__memory_allocate + tee_local $1 + i32.const 0 + i32.store + get_local $1 + i32.const 0 + i32.store offset=4 + get_local $1 + i32.const 0 + i32.store offset=8 + get_local $1 + i32.const 0 + i32.store offset=12 + get_local $1 + i32.const 0 + i32.store offset=16 + get_local $1 + get_local $0 + i32.store + get_local $1 + get_local $0 + i32.load + i32.const 8 + i32.add + i32.store offset=8 + get_local $1 + get_local $0 + i32.load offset=8 + i32.store offset=4 + get_local $1 + get_local $1 + i32.load offset=8 + i32.store offset=12 + get_local $1 + get_local $1 + i32.load offset=8 + get_local $1 + i32.load offset=4 + i32.add + i32.store offset=16 + get_local $1 + ) + (func $assembly/module/index/Module#constructor (; 55 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if @@ -3830,11 +3888,11 @@ get_local $1 i32.store offset=4 get_local $0 - i32.const 1360 + i32.const 1320 i32.store get_local $0 ) - (func $assembly/index/Parser#constructor (; 55 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/Parser#constructor (; 56 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if @@ -3849,15 +3907,17 @@ end get_local $0 get_local $1 + call $assembly/buffer/index/Buffer#constructor i32.store get_local $0 i32.const 0 - get_local $1 + get_local $0 + i32.load call $assembly/module/index/Module#constructor i32.store offset=4 get_local $0 ) - (func $assembly/index/Parser#parseString (; 56 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#parseString (; 57 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 @@ -3866,23 +3926,23 @@ call $assembly/buffer/index/Buffer#readVaruint call $~lib/string/String.fromUTF8 ) - (func $assembly/index/Parser#readVaruint (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/Parser#readVaruint (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.load call $assembly/buffer/index/Buffer#readVaruint ) - (func $assembly/index/Parser#get:off (; 58 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#get:off (; 59 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 ) - (func $assembly/index/Parser#set:off (; 59 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/index/Parser#set:off (; 60 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 i32.load get_local $1 i32.store offset=8 ) - (func $assembly/module/index/sectionName (; 60 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/sectionName (; 61 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $case12|0 block $case11|0 @@ -3911,45 +3971,45 @@ end br $case12|0 end - i32.const 1376 + i32.const 1336 return end - i32.const 1392 + i32.const 1352 return end - i32.const 1408 + i32.const 1368 return end - i32.const 1424 + i32.const 1384 return end - i32.const 1448 + i32.const 1408 return end - i32.const 1464 + i32.const 1424 return end - i32.const 1480 + i32.const 1440 return end - i32.const 1496 + i32.const 1456 return end - i32.const 1512 + i32.const 1472 return end - i32.const 1528 + i32.const 1488 return end - i32.const 1552 + i32.const 1512 return end - i32.const 1568 + i32.const 1528 return end unreachable ) - (func $assembly/module/index/SectionHeader#constructor (; 61 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/module/index/SectionHeader#constructor (; 62 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -4010,7 +4070,7 @@ get_local $1 i32.load call $assembly/host/index/_logi - i32.const 1584 + i32.const 1544 get_local $1 i32.load offset=4 call $~lib/internal/number/itoa @@ -4025,13 +4085,13 @@ call $assembly/buffer/index/Buffer#readVaruint set_local $3 get_local $1 - i32.const 1368 + i32.const 1328 get_local $0 i32.load offset=8 get_local $3 call $~lib/string/String.fromUTF8 call $~lib/string/String.__concat - i32.const 1368 + i32.const 1328 call $~lib/string/String.__concat i32.store offset=20 get_local $0 @@ -4056,21 +4116,21 @@ i32.store offset=12 get_local $1 ) - (func $assembly/module/index/Module#parseSection (; 62 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/module/index/Module#parseSection (; 63 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 i32.load get_local $1 call $~lib/array/Array#push drop block $break|0 - get_global $src/common/SectionId.Type get_local $1 i32.load offset=4 + get_global $src/common/SectionId.Type i32.eq br_if $break|0 end ) - (func $assembly/index/Parser#parse (; 63 ;) (type $iv) (param $0 i32) + (func $assembly/index/Parser#parse (; 64 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -4143,55 +4203,9 @@ end end ) - (func $assembly/buffer/index/Buffer#constructor (; 64 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - (local $1 i32) - i32.const 20 - call $~lib/allocator/arena/__memory_allocate - tee_local $1 - i32.const 0 - i32.store - get_local $1 - i32.const 0 - i32.store offset=4 - get_local $1 - i32.const 0 - i32.store offset=8 - get_local $1 - i32.const 0 - i32.store offset=12 - get_local $1 - i32.const 0 - i32.store offset=16 - get_local $1 - get_local $0 - i32.store - get_local $1 - get_local $0 - i32.load - i32.const 8 - i32.add - i32.store offset=8 - get_local $1 - get_local $0 - i32.load offset=8 - i32.store offset=4 - get_local $1 - get_local $1 - i32.load offset=8 - i32.store offset=12 - get_local $1 - get_local $1 - i32.load offset=8 - get_local $1 - i32.load offset=4 - i32.add - i32.store offset=16 - get_local $1 - ) (func $assembly/index/newParser (; 65 ;) (type $ii) (param $0 i32) (result i32) i32.const 0 get_local $0 - call $assembly/buffer/index/Buffer#constructor call $assembly/index/Parser#constructor ) (func $assembly/index/parse (; 66 ;) (type $ii) (param $0 i32) (result i32) @@ -4229,7 +4243,7 @@ call $assembly/module/index/TypeSection#parse ) (func $start (; 69 ;) (type $v) - i32.const 1616 + i32.const 1576 set_global $~lib/allocator/arena/startOffset get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index 91582c874e..a8bf8eafeb 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -15,59 +15,60 @@ var WASM_DATA: string; // injected by webpack if (typeof WASM_DATA !== "string") WASM_DATA = require("fs").readFileSync(__dirname + "/../build/index.wasm", "base64"); export class WasmParser { - // public memory: loader.ASMemory; - public instance: Instance & loader.ASInstance; - public mod: number; + instance: Instance & loader.ASInstance & loader.ASExport; + mod: number; get memory(): loader.ASMemory{ return this.instance.memory; } - constructor(public binary: Uint8Array){ + constructor(public binary: Uint8Array) { // compile the parser if not yet compiled if (!compiled) compiled = new WebAssembly.Module(base64_decode(WASM_DATA)); // use the binary as the parser's memory var nBytes = binary.length; var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16; - let memory = loader.createMemory({ initial: nPages }); + var memory = loader.createMemory({ initial: nPages }); var imports = { env: { abort: console.error, memory }, index: { - debug: () => {debugger; }, - _log: (start, sizeof) => { - let begin = start >> 2; - let size = sizeof >> 2; - if (size == 1 ){ + //tslint:disable-next-line + debug: ():void => {debugger; }, + _log: (start: number, sizeof: number):void => { + var begin = start >> 2; + var size = sizeof >> 2; + if (size == 1 ) { console.log(start); } else { let str = [] let len = 0; - for (let i = begin; i < begin+size; i++){ - let line = `| ${i} | ${memory.I32[i]>>2}`; + for (let i = begin; i < begin + size; i++){ + let line = `| ${i} | ${memory.I32[i] >> 2}`; len = Math.max(len, line.length); str.push(line); } let space = " "; - let output = str.map((v,i,a)=> v + (space as any).repeat(len - v.length + 1) + "|"); + let output = str.map((v: string): string => v + (space as any).repeat(len - v.length + 1) + "|"); let dash = "-"; - let line = (dash as any).repeat(len+2); - console.log([line,output.join('\n'+line+'\n'),line].join("\n")); + let line = (dash as any).repeat(len + 2); + console.log([line,output.join("\n" + line + "\n"),line].join("\n")); } }, - _log_str:(x) => console.log(loader.utils.readString(memory.U32, memory.U16, x)), + _log_str: (x: number): void => console.log(loader.utils.readString(memory.U32, memory.U16, x)), _logi: console.log, _logf: console.log }, options: {}, } this.instance = loader.instantiate(compiled, imports); - let array = this.memory.newArray(binary); - let parserPtr = this.instance.newParser(array); - this.mod = this.instance.parse(parserPtr); + var array = this.memory.newArray(binary); + var parser = new this.instance.Parser(array) + parser.parse() + this.mod = parser.module; } get Type(): string { @@ -80,9 +81,13 @@ export class WasmParser { } removeStartFunction(): Uint8Array { - let binary = this.memory.getArray(Uint8Array, this.instance.removeStartFunction(this.mod)); + var binary = this.memory.getArray(Uint8Array, this.instance.removeStartFunction(this.mod)); return binary; } + + hasStart(): boolean { + return this.instance.hasStart(this.mod) != 0; + } } diff --git a/lib/parse/tests/index.ts b/lib/parse/tests/index.ts index 49c3832611..ed9bb74154 100644 --- a/lib/parse/tests/index.ts +++ b/lib/parse/tests/index.ts @@ -1,4 +1,5 @@ import * as fs from "fs"; +import * as assert from "assert"; import { Type, SectionId, @@ -13,10 +14,14 @@ import { const binary: Uint8Array = fs.readFileSync(__dirname + "/" + filename); console.log("Testing '" + filename + "' ..."); debugger; - let parser = new WasmParser(binary); + var parser = new WasmParser(binary); + assert(parser.hasStart()); + console.log("\nType Section\n------------------------------"); console.log(parser.Type); - parser.printModule(); - let strippedBinary = parser.removeStartFunction(); - let parser2 = new WasmParser(strippedBinary); - parser2.printModule(); + // parser.printModule(); + var strippedBinary = parser.removeStartFunction(); + var parser2 = new WasmParser(strippedBinary); + assert(!parser2.hasStart()); + // parser2.printModule(); }); +console.log("Tests Pass!") From 48efbf03c3efacbfc533717f7377bfef94afd37d Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Sun, 3 Feb 2019 18:21:25 -0500 Subject: [PATCH 26/46] getID now returns single SectionHeader --- lib/parse/assembly/index.ts | 48 +- lib/parse/assembly/module/index.ts | 56 +- lib/parse/build/index.d.ts | 1 + lib/parse/build/index.wat | 1513 +++++++++++++--------------- 4 files changed, 736 insertions(+), 882 deletions(-) diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index 29881e0885..abc8fe20a4 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -55,40 +55,39 @@ import { log } from "./host"; // // } -var type: TypeSection; export function printModule(m: Module): void { m.print(); } export function getType(m: Module): string { - var headers: SectionHeader[] = m.getID(SectionId.Type); - var section = new TypeSection(headers[0]); - type = section.parse(m.buf); + var type = m.getType(); + if (type == null){ + return "No Type Section" + } return type.toString(); } export function getImports(m: Module): void { - var imports = m.getImports(); + var _import = m.getImports(); + // log(imports.length); - if (imports.length > 0) { - for (let i = 0; i < imports.length; i++) { - log(imports.length); - - // log(imports.length); - // for (let j = 0; i< imports[i].imports.length; j++){ - // let _import = imports[i].imports[j]; - // log(_import.toString()) - // } - } + if (_import != null) { + // for (let i = 0; i < imports.length; i++) { + // + // // log(imports.length); + // // for (let j = 0; i< imports[i].imports.length; j++){ + // // let _import = imports[i].imports[j]; + // // log(_import.toString()) + // // } + // } } // return } export function removeStartFunction (mod: Module): Uint8Array { - if (mod.hasStart) { - let sections : SectionHeader[] = mod.getID(SectionId.Start); - let start = sections[0]; + var start = mod.getID(SectionId.Start); + if (start != null) { // log(start.toString()); let len = start.end - start.ref; // log(len); @@ -110,12 +109,17 @@ export function removeStartFunction (mod: Module): Uint8Array { } else { return mod.buf.buffer; } - } -// export function exportDataSection(m: Module): Uint8Array { -// -// } +export function exportDataSection(m: Module): Uint8Array | null { + var header = m.getID(SectionId.Data); + if (header == null){ + return null; + } + var len = header.end - header.ref; + var res = new Uint8Array(len); + return m.buf.buffer; +} export function toString(t:TypeSection): string { return t.toString(); diff --git a/lib/parse/assembly/module/index.ts b/lib/parse/assembly/module/index.ts index a9b0437ff5..30d1819c6c 100644 --- a/lib/parse/assembly/module/index.ts +++ b/lib/parse/assembly/module/index.ts @@ -28,15 +28,15 @@ export class Module { this.headers = []; } - get Type(): SectionHeader[]{ + get Type(): SectionHeader | null { return this.getID(SectionId.Type); } get hasStart(): boolean { - return this.start.length > 0; + return this.start != null; } - get start(): SectionHeader[] { + get start(): SectionHeader | null { return this.getID(SectionId.Start) } @@ -51,37 +51,33 @@ export class Module { // log_str(header.name); } - getID(id: SectionId): SectionHeader[] { - var res: SectionHeader[] = new Array(); - assert(res.length == 0); + getID(id: SectionId): SectionHeader | null { var x: i32 = this.headers.length; - // log("length of array should be zero"); - // log(res.length) for (let i = 0; i < x; i++) { if (this.headers[i].id == id) { - res.push(this.headers[i]); + return this.headers[i]; } } - return res; + return null; } - getType(): TypeSection { - let Types = this.Type; - let section = new TypeSection(Types[0]); - return section.parse(this.buf); + getType(): TypeSection | null { + let header = this.getID(SectionId.Type); + if (header == null){ + return null; + }else { + let section = new TypeSection(header); + return section.parse(this.buf); + } } - getImports(): Imports[] { - let ImportHeaders = this.getID(SectionId.Import); - let imports: Imports[] = []; - log(imports.length); - for (let i = 0; i < ImportHeaders.length; i++){ - // log(ImportHeaders[i].name) - let _import = new Imports(ImportHeaders[i]); - imports.push(_import.parse(this.buf)); - log(_import.imports.length); + getImports(): Imports | null { + var header = this.getID(SectionId.Import); + if (!header){ + return null; } - return imports; + var _import = new Imports( header); + return _import.parse(this.buf); } print(): void { @@ -145,7 +141,6 @@ function sectionName(s: SectionId): string { default: unreachable(); } - return ""; } @@ -155,15 +150,14 @@ export class SectionHeader { public payload_len: u32; public payload_off: u32; public offset: u32; - public name: string = ""; - constructor (buf: Buffer){ + constructor(buf: Buffer) { this.ref = buf.off; this.offset = this.ref - buf.start; this.id = buf.readVaruint(7); this.payload_len = buf.readVaruint(32); - if (this.id == 0){ + if (this.id == SectionId.Custom){ let before = buf.off; let name_len = buf.readVaruint(32); let name_off = buf.off; @@ -336,8 +330,10 @@ class TableSection extends Section { -class Memory{ - constructor(public flags: u8, public initial: u32, public maximum: u32){} +class Memory { + constructor(public flags: u8, + public initial: u32, + public maximum: u32){} get shared(): boolean { return this.flags > 1; diff --git a/lib/parse/build/index.d.ts b/lib/parse/build/index.d.ts index 3457792c2f..bc0b765b09 100644 --- a/lib/parse/build/index.d.ts +++ b/lib/parse/build/index.d.ts @@ -12,6 +12,7 @@ declare module ASModule { function getType(m: u32): u32; function getImports(m: u32): void; function removeStartFunction(mod: u32): u32; + function exportDataSection(m: u32): u32; function toString(t: u32): u32; function hasStart(mod: u32): bool; class Parser { diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index ae4bcbba4a..82b0885cd8 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -27,40 +27,39 @@ (data (i32.const 776) "\05\00\00\00e\00n\00d\00:\00 ") (data (i32.const 792) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") (data (i32.const 824) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s") - (data (i32.const 888) "\18\00\00\00a\00s\00s\00e\00m\00b\00l\00y\00/\00m\00o\00d\00u\00l\00e\00/\00i\00n\00d\00e\00x\00.\00t\00s") - (data (i32.const 944) "\03\00\00\00i\003\002") - (data (i32.const 960) "\03\00\00\00i\006\004") - (data (i32.const 976) "\03\00\00\00f\003\002") - (data (i32.const 992) "\03\00\00\00f\006\004") - (data (i32.const 1008) "\07\00\00\00a\00n\00y\00f\00u\00n\00c") - (data (i32.const 1032) "\04\00\00\00f\00u\00n\00c") - (data (i32.const 1048) "\04\00\00\00n\00o\00n\00e") - (data (i32.const 1064) "\0e\00\00\00I\00n\00c\00o\00r\00r\00e\00c\00t\00 \00T\00y\00p\00e") - (data (i32.const 1096) "\07\00\00\00E\00r\00r\00o\00r\00:\00 ") - (data (i32.const 1120) "\02\00\00\00,\00 ") - (data (i32.const 1128) "\04\00\00\00v\00o\00i\00d") - (data (i32.const 1144) "\07\00\00\00i\00n\00d\00e\00x\00:\00 ") - (data (i32.const 1168) "\06\00\00\00f\00o\00r\00m\00:\00 ") - (data (i32.const 1184) "\03\00\00\00,\00 \00(") - (data (i32.const 1200) "\05\00\00\00)\00 \00=\00>\00 ") - (data (i32.const 1224) "\c0\04") - (data (i32.const 1240) "\d0\04") - (data (i32.const 1248) "\1b\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00t\00y\00p\00e\00d\00a\00r\00r\00a\00y\00.\00t\00s") - (data (i32.const 1320) " \05") - (data (i32.const 1328) "\01\00\00\00\'") - (data (i32.const 1336) "\06\00\00\00C\00u\00s\00t\00o\00m") - (data (i32.const 1352) "\04\00\00\00T\00y\00p\00e") - (data (i32.const 1368) "\06\00\00\00I\00m\00p\00o\00r\00t") - (data (i32.const 1384) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n") - (data (i32.const 1408) "\05\00\00\00T\00a\00b\00l\00e") - (data (i32.const 1424) "\06\00\00\00M\00e\00m\00o\00r\00y") - (data (i32.const 1440) "\06\00\00\00G\00l\00o\00b\00a\00l") - (data (i32.const 1456) "\06\00\00\00E\00x\00p\00o\00r\00t") - (data (i32.const 1472) "\05\00\00\00S\00t\00a\00r\00t") - (data (i32.const 1488) "\07\00\00\00E\00l\00e\00m\00e\00n\00t") - (data (i32.const 1512) "\04\00\00\00C\00o\00d\00e") - (data (i32.const 1528) "\04\00\00\00D\00a\00t\00a") - (data (i32.const 1544) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 ") + (data (i32.const 888) "\03\00\00\00i\003\002") + (data (i32.const 904) "\03\00\00\00i\006\004") + (data (i32.const 920) "\03\00\00\00f\003\002") + (data (i32.const 936) "\03\00\00\00f\006\004") + (data (i32.const 952) "\07\00\00\00a\00n\00y\00f\00u\00n\00c") + (data (i32.const 976) "\04\00\00\00f\00u\00n\00c") + (data (i32.const 992) "\04\00\00\00n\00o\00n\00e") + (data (i32.const 1008) "\0e\00\00\00I\00n\00c\00o\00r\00r\00e\00c\00t\00 \00T\00y\00p\00e") + (data (i32.const 1040) "\07\00\00\00E\00r\00r\00o\00r\00:\00 ") + (data (i32.const 1064) "\02\00\00\00,\00 ") + (data (i32.const 1072) "\04\00\00\00v\00o\00i\00d") + (data (i32.const 1088) "\07\00\00\00i\00n\00d\00e\00x\00:\00 ") + (data (i32.const 1112) "\06\00\00\00f\00o\00r\00m\00:\00 ") + (data (i32.const 1128) "\03\00\00\00,\00 \00(") + (data (i32.const 1144) "\05\00\00\00)\00 \00=\00>\00 ") + (data (i32.const 1160) "\0f\00\00\00N\00o\00 \00T\00y\00p\00e\00 \00S\00e\00c\00t\00i\00o\00n") + (data (i32.const 1208) "\b0\04") + (data (i32.const 1216) "\1b\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00t\00y\00p\00e\00d\00a\00r\00r\00a\00y\00.\00t\00s") + (data (i32.const 1289) "\05") + (data (i32.const 1296) "\01\00\00\00\'") + (data (i32.const 1304) "\06\00\00\00C\00u\00s\00t\00o\00m") + (data (i32.const 1320) "\04\00\00\00T\00y\00p\00e") + (data (i32.const 1336) "\06\00\00\00I\00m\00p\00o\00r\00t") + (data (i32.const 1352) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n") + (data (i32.const 1376) "\05\00\00\00T\00a\00b\00l\00e") + (data (i32.const 1392) "\06\00\00\00M\00e\00m\00o\00r\00y") + (data (i32.const 1408) "\06\00\00\00G\00l\00o\00b\00a\00l") + (data (i32.const 1424) "\06\00\00\00E\00x\00p\00o\00r\00t") + (data (i32.const 1440) "\05\00\00\00S\00t\00a\00r\00t") + (data (i32.const 1456) "\07\00\00\00E\00l\00e\00m\00e\00n\00t") + (data (i32.const 1480) "\04\00\00\00C\00o\00d\00e") + (data (i32.const 1496) "\04\00\00\00D\00a\00t\00a") + (data (i32.const 1512) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 ") (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) @@ -68,7 +67,7 @@ (elem (i32.const 0) $null) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) - (global $assembly/index/type (mut i32) (i32.const 0)) + (global $src/common/SectionId.Custom (mut i32) (i32.const 0)) (global $src/common/SectionId.Type (mut i32) (i32.const 1)) (global $src/common/SectionId.Import (mut i32) (i32.const 2)) (global $src/common/SectionId.Start (mut i32) (i32.const 8)) @@ -83,6 +82,7 @@ (export "getType" (func $assembly/index/getType)) (export "getImports" (func $assembly/index/getImports)) (export "removeStartFunction" (func $assembly/index/removeStartFunction)) + (export "exportDataSection" (func $assembly/index/exportDataSection)) (export "toString" (func $assembly/index/toString)) (export "hasStart" (func $assembly/index/hasStart)) (export "Parser#constructor" (func $assembly/index/Parser#constructor)) @@ -214,11 +214,11 @@ i32.mul tee_local $1 i32.store - get_local $0 get_local $2 i32.const -4 i32.and tee_local $2 + get_local $0 i32.add i32.const 4 i32.sub @@ -303,12 +303,12 @@ get_local $1 i32.store get_local $0 - get_local $0 i32.const 4 i32.and i32.const 24 i32.add tee_local $3 + get_local $0 i32.add set_local $0 get_local $2 @@ -597,9 +597,6 @@ i32.ge_u if get_local $0 - get_local $5 - i32.const 24 - i32.shr_u get_local $1 i32.const 1 i32.add @@ -607,14 +604,14 @@ tee_local $3 i32.const 8 i32.shl + get_local $5 + i32.const 24 + i32.shr_u i32.or i32.store get_local $0 i32.const 4 i32.add - get_local $3 - i32.const 24 - i32.shr_u get_local $1 i32.const 5 i32.add @@ -622,14 +619,14 @@ tee_local $5 i32.const 8 i32.shl + get_local $3 + i32.const 24 + i32.shr_u i32.or i32.store get_local $0 i32.const 8 i32.add - get_local $5 - i32.const 24 - i32.shr_u get_local $1 i32.const 9 i32.add @@ -637,14 +634,14 @@ tee_local $3 i32.const 8 i32.shl + get_local $5 + i32.const 24 + i32.shr_u i32.or i32.store get_local $0 i32.const 12 i32.add - get_local $3 - i32.const 24 - i32.shr_u get_local $1 i32.const 13 i32.add @@ -652,6 +649,9 @@ tee_local $5 i32.const 8 i32.shl + get_local $3 + i32.const 24 + i32.shr_u i32.or i32.store get_local $1 @@ -706,9 +706,6 @@ i32.ge_u if get_local $0 - get_local $5 - i32.const 16 - i32.shr_u get_local $1 i32.const 2 i32.add @@ -716,14 +713,14 @@ tee_local $3 i32.const 16 i32.shl + get_local $5 + i32.const 16 + i32.shr_u i32.or i32.store get_local $0 i32.const 4 i32.add - get_local $3 - i32.const 16 - i32.shr_u get_local $1 i32.const 6 i32.add @@ -731,14 +728,14 @@ tee_local $5 i32.const 16 i32.shl + get_local $3 + i32.const 16 + i32.shr_u i32.or i32.store get_local $0 i32.const 8 i32.add - get_local $5 - i32.const 16 - i32.shr_u get_local $1 i32.const 10 i32.add @@ -746,14 +743,14 @@ tee_local $3 i32.const 16 i32.shl + get_local $5 + i32.const 16 + i32.shr_u i32.or i32.store get_local $0 i32.const 12 i32.add - get_local $3 - i32.const 16 - i32.shr_u get_local $1 i32.const 14 i32.add @@ -761,6 +758,9 @@ tee_local $5 i32.const 16 i32.shl + get_local $3 + i32.const 16 + i32.shr_u i32.or i32.store get_local $1 @@ -807,9 +807,6 @@ i32.ge_u if get_local $0 - get_local $5 - i32.const 8 - i32.shr_u get_local $1 i32.const 3 i32.add @@ -817,14 +814,14 @@ tee_local $3 i32.const 24 i32.shl + get_local $5 + i32.const 8 + i32.shr_u i32.or i32.store get_local $0 i32.const 4 i32.add - get_local $3 - i32.const 8 - i32.shr_u get_local $1 i32.const 7 i32.add @@ -832,14 +829,14 @@ tee_local $5 i32.const 24 i32.shl + get_local $3 + i32.const 8 + i32.shr_u i32.or i32.store get_local $0 i32.const 8 i32.add - get_local $5 - i32.const 8 - i32.shr_u get_local $1 i32.const 11 i32.add @@ -847,14 +844,14 @@ tee_local $3 i32.const 24 i32.shl + get_local $5 + i32.const 8 + i32.shr_u i32.or i32.store get_local $0 i32.const 12 i32.add - get_local $3 - i32.const 8 - i32.shr_u get_local $1 i32.const 15 i32.add @@ -862,6 +859,9 @@ tee_local $5 i32.const 24 i32.shl + get_local $3 + i32.const 8 + i32.shr_u i32.or i32.store get_local $1 @@ -1415,11 +1415,11 @@ if return end - get_local $0 get_local $2 i32.const 1 i32.sub tee_local $2 + get_local $0 i32.add get_local $1 get_local $2 @@ -1434,11 +1434,11 @@ i32.const 8 i32.ge_u if - get_local $0 get_local $2 i32.const 8 i32.sub tee_local $2 + get_local $0 i32.add get_local $1 get_local $2 @@ -1452,11 +1452,11 @@ loop $continue|5 get_local $2 if - get_local $0 get_local $2 i32.const 1 i32.sub tee_local $2 + get_local $0 i32.add get_local $1 get_local $2 @@ -1710,13 +1710,13 @@ i32.const 10000 i32.div_u set_local $1 - get_local $0 get_local $2 i32.const 4 i32.sub tee_local $2 i32.const 1 i32.shl + get_local $0 i32.add get_local $3 get_local $4 @@ -1753,13 +1753,13 @@ i32.const 100 i32.div_u set_local $1 - get_local $0 get_local $2 i32.const 2 i32.sub tee_local $2 i32.const 1 i32.shl + get_local $0 i32.add get_local $3 get_local $4 @@ -1773,12 +1773,12 @@ i32.const 10 i32.ge_u if - get_local $0 get_local $2 i32.const 2 i32.sub i32.const 1 i32.shl + get_local $0 i32.add get_local $3 get_local $1 @@ -1788,12 +1788,12 @@ i32.load offset=8 i32.store offset=4 else - get_local $0 get_local $2 i32.const 1 i32.sub i32.const 1 i32.shl + get_local $0 i32.add get_local $1 i32.const 48 @@ -1825,10 +1825,10 @@ get_local $0 ) (func $~lib/internal/string/copyUnsafe (; 18 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) - get_local $0 get_local $1 i32.const 1 i32.shl + get_local $0 i32.add i32.const 4 i32.add @@ -1967,14 +1967,13 @@ (func $assembly/module/index/Module#print (; 22 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) - block $break|0 - loop $repeat|0 - get_local $1 - get_local $0 - i32.load - i32.load offset=4 - i32.ge_s - br_if $break|0 + loop $repeat|0 + get_local $1 + get_local $0 + i32.load + i32.load offset=4 + i32.lt_s + if get_local $1 get_local $0 i32.load @@ -1985,10 +1984,10 @@ i32.shr_u i32.lt_u if (result i32) - get_local $2 get_local $1 i32.const 2 i32.shl + get_local $2 i32.add i32.load offset=8 else @@ -2004,16 +2003,133 @@ i32.add set_local $1 br $repeat|0 - unreachable end - unreachable end ) (func $assembly/index/printModule (; 23 ;) (type $iv) (param $0 i32) get_local $0 call $assembly/module/index/Module#print ) - (func $~lib/internal/arraybuffer/allocateUnsafe (; 24 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#getID (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + get_local $0 + i32.load + i32.load offset=4 + set_local $4 + loop $repeat|0 + get_local $2 + get_local $4 + i32.lt_s + if + get_local $2 + get_local $0 + i32.load + i32.load + tee_local $3 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $2 + i32.const 2 + i32.shl + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + tee_local $3 + i32.load offset=4 + get_local $1 + i32.eq + if + get_local $2 + get_local $0 + i32.load + i32.load + tee_local $0 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + get_local $2 + i32.const 2 + i32.shl + get_local $0 + i32.add + i32.load offset=8 + else + unreachable + end + tee_local $0 + return + else + get_local $2 + i32.const 1 + i32.add + set_local $2 + br $repeat|0 + end + unreachable + end + end + i32.const 0 + ) + (func $assembly/module/index/Section#constructor (; 25 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + i32.const 4 + call $~lib/allocator/arena/__memory_allocate + tee_local $1 + get_local $0 + i32.store + get_local $1 + ) + (func $assembly/buffer/index/Buffer#readVaruint (; 26 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + get_local $0 + i32.load offset=8 + set_local $1 + loop $continue|0 + get_local $1 + tee_local $2 + i32.const 1 + i32.add + set_local $1 + get_local $2 + i32.load8_u + tee_local $2 + i32.const 127 + i32.and + get_local $4 + i32.shl + get_local $3 + i32.or + set_local $3 + get_local $2 + i32.const 128 + i32.and + if + get_local $4 + i32.const 7 + i32.add + set_local $4 + br $continue|0 + end + end + get_local $0 + get_local $1 + i32.store offset=8 + get_local $3 + ) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 27 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 i32.const 1073741816 @@ -2021,7 +2137,7 @@ if i32.const 0 i32.const 824 - i32.const 23 + i32.const 26 i32.const 2 call $~lib/env/abort unreachable @@ -2040,7 +2156,7 @@ i32.store get_local $1 ) - (func $~lib/array/Array#constructor (; 25 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/array/Array#constructor (; 28 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2050,7 +2166,7 @@ if i32.const 0 i32.const 792 - i32.const 37 + i32.const 45 i32.const 39 call $~lib/env/abort unreachable @@ -2083,306 +2199,21 @@ call $~lib/internal/memory/memset get_local $1 ) - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) - get_local $1 + (local $5 i32) + (local $6 i32) get_local $0 - i32.load - tee_local $2 - i32.gt_s - if - get_local $1 - i32.const 1073741816 - i32.gt_s - if - i32.const 0 - i32.const 824 - i32.const 37 - i32.const 4 - call $~lib/env/abort - unreachable - end - get_local $1 - i32.const 1 - i32.const 32 - get_local $2 - i32.const 7 - i32.add - i32.clz - i32.sub - i32.shl - i32.const 8 - i32.sub - i32.le_s - if - get_local $0 - get_local $1 - i32.store - get_local $0 - i32.const 8 - i32.add - get_local $2 - i32.add - i32.const 0 - get_local $1 - get_local $2 - i32.sub - call $~lib/internal/memory/memset - else - get_local $1 - call $~lib/internal/arraybuffer/allocateUnsafe - tee_local $3 - i32.const 8 - i32.add - tee_local $4 - get_local $0 - i32.const 8 - i32.add - get_local $2 - call $~lib/internal/memory/memmove - get_local $4 - get_local $2 - i32.add - i32.const 0 - get_local $1 - get_local $2 - i32.sub - call $~lib/internal/memory/memset - get_local $3 - return - end - else - get_local $1 - get_local $2 - i32.lt_s - if - get_local $1 - i32.const 0 - i32.lt_s - if - i32.const 0 - i32.const 824 - i32.const 61 - i32.const 4 - call $~lib/env/abort - unreachable - end - get_local $0 - get_local $1 - i32.store - end - end - get_local $0 - ) - (func $~lib/array/Array#push (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - get_local $0 - i32.load offset=4 - tee_local $2 - i32.const 1 - i32.add - set_local $3 - get_local $2 - get_local $0 - i32.load - tee_local $4 - i32.load - i32.const 2 - i32.shr_u - i32.ge_u - if - get_local $2 - i32.const 268435454 - i32.ge_u - if - i32.const 0 - i32.const 792 - i32.const 174 - i32.const 42 - call $~lib/env/abort - unreachable - end - get_local $0 - get_local $4 - get_local $3 - i32.const 2 - i32.shl - call $~lib/internal/arraybuffer/reallocateUnsafe - tee_local $4 - i32.store - end - get_local $0 - get_local $3 - i32.store offset=4 - get_local $4 - get_local $2 - i32.const 2 - i32.shl - i32.add - get_local $1 - i32.store offset=8 - get_local $3 - ) - (func $assembly/module/index/Module#getID (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - i32.const 0 - call $~lib/array/Array#constructor - tee_local $4 - i32.load offset=4 - if - i32.const 0 - i32.const 888 - i32.const 56 - i32.const 4 - call $~lib/env/abort - unreachable - end - get_local $0 - i32.load - i32.load offset=4 - set_local $5 - block $break|0 - loop $repeat|0 - get_local $2 - get_local $5 - i32.ge_s - br_if $break|0 - get_local $2 - get_local $0 - i32.load - i32.load - tee_local $3 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $3 - get_local $2 - i32.const 2 - i32.shl - i32.add - i32.load offset=8 - else - unreachable - end - tee_local $3 - i32.load offset=4 - get_local $1 - i32.eq - if - get_local $2 - get_local $0 - i32.load - i32.load - tee_local $3 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $3 - get_local $2 - i32.const 2 - i32.shl - i32.add - i32.load offset=8 - else - unreachable - end - set_local $3 - get_local $4 - get_local $3 - call $~lib/array/Array#push - drop - end - get_local $2 - i32.const 1 - i32.add - set_local $2 - br $repeat|0 - unreachable - end - unreachable - end - get_local $4 - ) - (func $assembly/module/index/Section#constructor (; 29 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - (local $1 i32) - i32.const 4 - call $~lib/allocator/arena/__memory_allocate - tee_local $1 - get_local $0 - i32.store - get_local $1 - ) - (func $assembly/buffer/index/Buffer#readVaruint (; 30 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - get_local $0 - i32.load offset=8 - set_local $1 - block $break|0 - loop $continue|0 - get_local $1 - tee_local $2 - i32.const 1 - i32.add - set_local $1 - get_local $3 - get_local $2 - i32.load8_u - tee_local $2 - i32.const 127 - i32.and - get_local $4 - i32.shl - i32.or - set_local $3 - get_local $2 - i32.const 128 - i32.and - i32.eqz - br_if $break|0 - get_local $4 - i32.const 7 - i32.add - set_local $4 - br $continue|0 - unreachable - end - unreachable - end - get_local $0 - get_local $1 - i32.store offset=8 - get_local $3 - ) - (func $assembly/buffer/index/Buffer#readVarint (; 31 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - (local $6 i32) - get_local $0 - i32.load offset=8 - set_local $5 - loop $continue|0 - get_local $5 - tee_local $4 + i32.load offset=8 + set_local $5 + loop $continue|0 + get_local $5 + tee_local $4 i32.const 1 i32.add set_local $5 - get_local $3 get_local $4 i32.load8_u tee_local $6 @@ -2390,6 +2221,7 @@ i32.and get_local $2 i32.shl + get_local $3 i32.or set_local $3 get_local $2 @@ -2404,10 +2236,10 @@ get_local $0 get_local $5 i32.store offset=8 - get_local $3 i32.const -1 get_local $2 i32.shl + get_local $3 i32.or set_local $0 get_local $2 @@ -2427,12 +2259,12 @@ get_local $4 select ) - (func $assembly/buffer/index/Buffer#readVarint8 (; 32 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint8 (; 30 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) get_local $0 i32.const 7 call $assembly/buffer/index/Buffer#readVarint ) - (func $assembly/module/index/FuncType#constructor (; 33 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/FuncType#constructor (; 31 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) i32.const 13 call $~lib/allocator/arena/__memory_allocate @@ -2450,7 +2282,90 @@ i32.store8 offset=12 get_local $2 ) - (func $~lib/array/Array#__set (; 34 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 32 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + get_local $1 + get_local $0 + i32.load + tee_local $2 + i32.gt_s + if + get_local $1 + i32.const 1073741816 + i32.gt_s + if + i32.const 0 + i32.const 824 + i32.const 40 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $1 + i32.const 1 + i32.const 32 + get_local $2 + i32.const 7 + i32.add + i32.clz + i32.sub + i32.shl + i32.const 8 + i32.sub + i32.le_s + if + get_local $0 + get_local $1 + i32.store + else + get_local $1 + call $~lib/internal/arraybuffer/allocateUnsafe + tee_local $3 + i32.const 8 + i32.add + get_local $0 + i32.const 8 + i32.add + get_local $2 + call $~lib/internal/memory/memmove + get_local $3 + set_local $0 + end + get_local $0 + i32.const 8 + i32.add + get_local $2 + i32.add + i32.const 0 + get_local $1 + get_local $2 + i32.sub + call $~lib/internal/memory/memset + else + get_local $1 + get_local $2 + i32.lt_s + if + get_local $1 + i32.const 0 + i32.lt_s + if + i32.const 0 + i32.const 824 + i32.const 62 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $0 + get_local $1 + i32.store + end + end + get_local $0 + ) + (func $~lib/array/Array#__set (; 33 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) get_local $1 @@ -2468,7 +2383,7 @@ if i32.const 0 i32.const 792 - i32.const 101 + i32.const 109 i32.const 41 call $~lib/env/abort unreachable @@ -2496,14 +2411,14 @@ get_local $2 i32.store offset=8 ) - (func $assembly/host/index/err (; 35 ;) (type $iv) (param $0 i32) - i32.const 1096 + (func $assembly/host/index/err (; 34 ;) (type $iv) (param $0 i32) + i32.const 1040 get_local $0 call $~lib/string/String.__concat call $assembly/host/index/_log_str unreachable ) - (func $assembly/module/index/typeName (; 36 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/typeName (; 35 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $case7|0 block $case6|0 @@ -2543,32 +2458,32 @@ br_if $case6|0 br $case7|0 end - i32.const 944 + i32.const 888 return end - i32.const 960 + i32.const 904 return end - i32.const 976 + i32.const 920 return end - i32.const 992 + i32.const 936 return end - i32.const 1008 + i32.const 952 return end - i32.const 1032 + i32.const 976 return end - i32.const 1048 + i32.const 992 return end - i32.const 1064 + i32.const 1008 call $assembly/host/index/err i32.const 656 ) - (func $assembly/module/index/FuncType#toString (; 37 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/FuncType#toString (; 36 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2584,14 +2499,14 @@ set_local $5 i32.const 656 set_local $1 - block $break|0 - loop $repeat|0 - get_local $2 - get_local $0 - i32.load - i32.load offset=4 - i32.ge_s - br_if $break|0 + loop $repeat|0 + get_local $2 + get_local $0 + i32.load + i32.load offset=4 + i32.lt_s + if + get_local $1 get_local $2 get_local $0 i32.load @@ -2602,18 +2517,16 @@ i32.shr_u i32.lt_u if (result i32) - get_local $3 get_local $2 i32.const 2 i32.shl + get_local $3 i32.add i32.load offset=8 else unreachable end - set_local $3 - get_local $1 - get_local $3 + tee_local $3 call $assembly/module/index/typeName call $~lib/string/String.__concat set_local $1 @@ -2626,7 +2539,7 @@ i32.lt_s if get_local $1 - i32.const 1120 + i32.const 1064 call $~lib/string/String.__concat set_local $1 end @@ -2635,9 +2548,7 @@ i32.add set_local $2 br $repeat|0 - unreachable end - unreachable end get_local $0 i32.load offset=4 @@ -2663,28 +2574,28 @@ tee_local $0 call $assembly/module/index/typeName else - i32.const 1128 + i32.const 1072 end set_local $0 - i32.const 1144 + i32.const 1088 get_local $4 call $~lib/string/String.__concat - i32.const 1120 + i32.const 1064 call $~lib/string/String.__concat - i32.const 1168 + i32.const 1112 call $~lib/string/String.__concat get_local $5 call $~lib/string/String.__concat - i32.const 1184 + i32.const 1128 call $~lib/string/String.__concat get_local $1 call $~lib/string/String.__concat - i32.const 1200 + i32.const 1144 call $~lib/string/String.__concat get_local $0 call $~lib/string/String.__concat ) - (func $assembly/module/index/TypeSection#parse (; 38 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/TypeSection#parse (; 37 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2700,14 +2611,13 @@ get_local $1 call $assembly/buffer/index/Buffer#readVaruint tee_local $8 - call $~lib/array/Array#constructor + call $~lib/array/Array#constructor set_local $6 - block $break|0 - loop $repeat|0 - get_local $2 - get_local $8 - i32.ge_u - br_if $break|0 + loop $repeat|0 + get_local $2 + get_local $8 + i32.lt_u + if get_local $6 get_local $2 get_local $2 @@ -2722,16 +2632,15 @@ get_local $1 call $assembly/buffer/index/Buffer#readVaruint tee_local $7 - call $~lib/array/Array#constructor + call $~lib/array/Array#constructor i32.store - block $break|1 - i32.const 0 - set_local $4 - loop $repeat|1 - get_local $4 - get_local $7 - i32.ge_u - br_if $break|1 + i32.const 0 + set_local $4 + loop $repeat|1 + get_local $4 + get_local $7 + i32.lt_u + if get_local $1 call $assembly/buffer/index/Buffer#readVarint8 i32.const 127 @@ -2746,10 +2655,10 @@ i32.shr_u i32.lt_u if (result i32) - get_local $3 get_local $2 i32.const 2 i32.shl + get_local $3 i32.add i32.load offset=8 else @@ -2765,9 +2674,7 @@ i32.add set_local $4 br $repeat|1 - unreachable end - unreachable end get_local $1 call $assembly/buffer/index/Buffer#readVaruint @@ -2781,27 +2688,26 @@ i32.shr_u i32.lt_u if (result i32) - get_local $3 get_local $2 i32.const 2 i32.shl + get_local $3 i32.add i32.load offset=8 else unreachable end - tee_local $3 - get_local $4 - call $~lib/array/Array#constructor - i32.store offset=4 - block $break|2 - i32.const 0 - set_local $5 - loop $repeat|2 - get_local $5 - get_local $4 - i32.ge_u - br_if $break|2 + tee_local $3 + get_local $4 + call $~lib/array/Array#constructor + i32.store offset=4 + i32.const 0 + set_local $5 + loop $repeat|2 + get_local $5 + get_local $4 + i32.lt_u + if get_local $1 call $assembly/buffer/index/Buffer#readVarint8 i32.const 127 @@ -2816,10 +2722,10 @@ i32.shr_u i32.lt_u if (result i32) - get_local $3 get_local $2 i32.const 2 i32.shl + get_local $3 i32.add i32.load offset=8 else @@ -2835,9 +2741,7 @@ i32.add set_local $5 br $repeat|2 - unreachable end - unreachable end get_local $2 tee_local $3 @@ -2849,10 +2753,10 @@ i32.shr_u i32.lt_u if (result i32) - get_local $2 get_local $3 i32.const 2 i32.shl + get_local $2 i32.add i32.load offset=8 else @@ -2866,13 +2770,78 @@ i32.add set_local $2 br $repeat|0 + end + end + get_local $0 + ) + (func $assembly/module/index/Module#getType (; 38 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + get_local $0 + get_global $src/common/SectionId.Type + call $assembly/module/index/Module#getID + tee_local $1 + if (result i32) + get_local $1 + call $assembly/module/index/Section#constructor + get_local $0 + i32.load offset=4 + call $assembly/module/index/TypeSection#parse + else + i32.const 0 + end + ) + (func $~lib/array/Array#push (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + get_local $0 + i32.load offset=4 + tee_local $2 + i32.const 1 + i32.add + set_local $3 + get_local $2 + get_local $0 + i32.load + tee_local $4 + i32.load + i32.const 2 + i32.shr_u + i32.ge_u + if + get_local $2 + i32.const 268435454 + i32.ge_u + if + i32.const 0 + i32.const 792 + i32.const 184 + i32.const 42 + call $~lib/env/abort unreachable end - unreachable + get_local $0 + get_local $4 + get_local $3 + i32.const 2 + i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + tee_local $4 + i32.store end get_local $0 + get_local $3 + i32.store offset=4 + get_local $4 + get_local $2 + i32.const 2 + i32.shl + i32.add + get_local $1 + i32.store offset=8 + get_local $3 ) - (func $~lib/array/Array#join (; 39 ;) (type $FUNCSIG$i) (result i32) + (func $~lib/array/Array#join (; 40 ;) (type $FUNCSIG$i) (result i32) (local $0 i32) (local $1 i32) (local $2 i32) @@ -2881,7 +2850,7 @@ (local $5 i32) (local $6 i32) (local $7 i32) - i32.const 1228 + i32.const 1212 i32.load i32.const 1 i32.sub @@ -2892,7 +2861,7 @@ i32.const 656 return end - i32.const 1224 + i32.const 1208 i32.load set_local $5 i32.const 664 @@ -2908,24 +2877,23 @@ i32.load offset=8 return end - block $break|0 - get_local $4 - i32.const 1 - i32.add - set_local $1 - loop $repeat|0 - get_local $0 - get_local $1 - i32.ge_s - br_if $break|0 - get_local $2 - get_local $5 + get_local $4 + i32.const 1 + i32.add + set_local $1 + loop $repeat|0 + get_local $0 + get_local $1 + i32.lt_s + if get_local $0 i32.const 2 i32.shl + get_local $5 i32.add i32.load offset=8 i32.load + get_local $2 i32.add set_local $2 get_local $0 @@ -2933,31 +2901,28 @@ i32.add set_local $0 br $repeat|0 - unreachable end - unreachable end i32.const 0 set_local $1 - get_local $2 - get_local $6 get_local $4 + get_local $6 i32.mul + get_local $2 i32.add call $~lib/internal/string/allocateUnsafe set_local $0 - block $break|1 - i32.const 0 - set_local $2 - loop $repeat|1 - get_local $2 - get_local $4 - i32.ge_s - br_if $break|1 - get_local $5 + i32.const 0 + set_local $2 + loop $repeat|1 + get_local $2 + get_local $4 + i32.lt_s + if get_local $2 i32.const 2 i32.shl + get_local $5 i32.add i32.load offset=8 tee_local $3 @@ -2991,14 +2956,12 @@ i32.add set_local $2 br $repeat|1 - unreachable end - unreachable end - get_local $5 get_local $4 i32.const 2 i32.shl + get_local $5 i32.add i32.load offset=8 tee_local $3 @@ -3012,18 +2975,17 @@ end get_local $0 ) - (func $assembly/module/index/TypeSection#toString (; 40 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/TypeSection#toString (; 41 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) - block $break|0 - loop $repeat|0 - get_local $1 - get_local $0 - i32.load offset=4 - i32.load offset=4 - i32.ge_s - br_if $break|0 - i32.const 1224 + loop $repeat|0 + get_local $1 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.lt_s + if + i32.const 1208 get_local $1 get_local $0 i32.load offset=4 @@ -3034,10 +2996,10 @@ i32.shr_u i32.lt_u if (result i32) - get_local $2 get_local $1 i32.const 2 i32.shl + get_local $2 i32.add i32.load offset=8 else @@ -3045,47 +3007,31 @@ end tee_local $2 call $assembly/module/index/FuncType#toString - call $~lib/array/Array#push + call $~lib/array/Array#push drop get_local $1 i32.const 1 i32.add set_local $1 br $repeat|0 - unreachable end - unreachable end call $~lib/array/Array#join ) - (func $assembly/index/getType (; 41 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/getType (; 42 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) - i32.const 0 get_local $0 - get_global $src/common/SectionId.Type - call $assembly/module/index/Module#getID - i32.load + call $assembly/module/index/Module#getType tee_local $1 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $1 - i32.load offset=8 - else - unreachable + i32.eqz + if + i32.const 1160 + return end - tee_local $1 - call $assembly/module/index/Section#constructor - get_local $0 - i32.load offset=4 - call $assembly/module/index/TypeSection#parse - set_global $assembly/index/type - get_global $assembly/index/type + get_local $1 call $assembly/module/index/TypeSection#toString ) - (func $~lib/string/String.fromUTF8 (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.fromUTF8 (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3121,8 +3067,8 @@ i32.const 128 i32.lt_u if (result i32) - get_local $6 get_local $4 + get_local $6 i32.add get_local $3 i32.store16 @@ -3160,20 +3106,20 @@ i32.const 1 i32.add set_local $2 - get_local $6 get_local $4 + get_local $6 i32.add - get_local $3 - i32.const 31 - i32.and - i32.const 6 - i32.shl get_local $0 get_local $5 i32.add i32.load8_u i32.const 63 i32.and + get_local $3 + i32.const 31 + i32.and + i32.const 6 + i32.shl i32.or i32.store16 else @@ -3202,17 +3148,17 @@ call $~lib/env/abort unreachable end - get_local $6 get_local $4 + get_local $6 i32.add get_local $3 i32.const 7 i32.and i32.const 18 i32.shl - get_local $0 get_local $2 tee_local $5 + get_local $0 i32.add i32.load8_u i32.const 63 @@ -3220,11 +3166,11 @@ i32.const 12 i32.shl i32.or - get_local $0 get_local $2 i32.const 1 i32.add tee_local $2 + get_local $0 i32.add i32.load8_u i32.const 63 @@ -3233,11 +3179,11 @@ i32.shl i32.or tee_local $3 - get_local $0 get_local $2 i32.const 1 i32.add tee_local $2 + get_local $0 i32.add i32.load8_u i32.const 63 @@ -3277,17 +3223,17 @@ call $~lib/env/abort unreachable end - get_local $6 get_local $4 + get_local $6 i32.add get_local $3 i32.const 15 i32.and i32.const 12 i32.shl - get_local $0 get_local $2 tee_local $5 + get_local $0 i32.add i32.load8_u i32.const 63 @@ -3296,11 +3242,11 @@ i32.shl i32.or tee_local $3 - get_local $0 get_local $2 i32.const 1 i32.add tee_local $2 + get_local $0 i32.add i32.load8_u i32.const 63 @@ -3321,8 +3267,8 @@ br $continue|0 end end - get_local $2 get_local $1 + get_local $2 i32.ne if i32.const 0 @@ -3344,7 +3290,7 @@ call $~lib/internal/memory/memmove get_local $0 ) - (func $assembly/module/imports/Imports#parse (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/imports/Imports#parse (; 44 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3361,14 +3307,13 @@ get_local $1 call $assembly/buffer/index/Buffer#readVaruint tee_local $5 - call $~lib/array/Array#constructor + call $~lib/array/Array#constructor i32.store offset=4 - block $break|0 - loop $repeat|0 - get_local $4 - get_local $5 - i32.ge_u - br_if $break|0 + loop $repeat|0 + get_local $4 + get_local $5 + i32.lt_u + if get_local $1 call $assembly/buffer/index/Buffer#readVaruint set_local $2 @@ -3430,20 +3375,20 @@ block $case3|1 block $case2|1 block $case1|1 - get_local $2 get_global $src/common/ExternalKind.Function + get_local $2 i32.ne if - get_local $2 get_global $src/common/ExternalKind.Table + get_local $2 i32.eq br_if $case1|1 - get_local $2 get_global $src/common/ExternalKind.Memory + get_local $2 i32.eq br_if $case2|1 - get_local $2 get_global $src/common/ExternalKind.Global + get_local $2 i32.eq br_if $case3|1 br $case4|1 @@ -3492,134 +3437,50 @@ end set_local $2 br $break|1 - end - get_local $1 - i32.const 7 - call $assembly/buffer/index/Buffer#readVarint - drop - get_local $1 - call $assembly/buffer/index/Buffer#readVaruint - drop - br $break|1 - end - unreachable - end - get_local $4 - i32.const 1 - i32.add - set_local $4 - br $repeat|0 - unreachable - end - unreachable - end - get_local $0 - ) - (func $assembly/module/index/Module#getImports (; 44 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - get_local $0 - get_global $src/common/SectionId.Import - call $assembly/module/index/Module#getID - set_local $3 - i32.const 1244 - i32.load - call $assembly/host/index/_logi - block $break|0 - loop $repeat|0 - get_local $1 - get_local $3 - i32.load offset=4 - i32.ge_s - br_if $break|0 - i32.const 1240 - get_local $1 - get_local $3 - i32.load - tee_local $2 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $2 - get_local $1 - i32.const 2 - i32.shl - i32.add - i32.load offset=8 - else + end + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint + drop + get_local $1 + call $assembly/buffer/index/Buffer#readVaruint + drop + br $break|1 + end unreachable end - tee_local $2 - call $assembly/module/index/Section#constructor - tee_local $2 - get_local $0 - i32.load offset=4 - call $assembly/module/imports/Imports#parse - call $~lib/array/Array#push - drop - get_local $2 - i32.load offset=4 - i32.load offset=4 - call $assembly/host/index/_logi - get_local $1 + get_local $4 i32.const 1 i32.add - set_local $1 + set_local $4 br $repeat|0 - unreachable end - unreachable end - i32.const 1240 + get_local $0 ) - (func $assembly/index/getImports (; 45 ;) (type $iv) (param $0 i32) + (func $assembly/module/index/Module#getImports (; 45 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 - call $assembly/module/index/Module#getImports + get_global $src/common/SectionId.Import + call $assembly/module/index/Module#getID tee_local $1 - i32.load offset=4 - i32.const 0 - i32.gt_s + i32.eqz if - block $break|0 - i32.const 0 - set_local $0 - loop $repeat|0 - get_local $0 - get_local $1 - i32.load offset=4 - i32.ge_s - br_if $break|0 - get_local $1 - i32.load offset=4 - call $assembly/host/index/_logi - get_local $0 - i32.const 1 - i32.add - set_local $0 - br $repeat|0 - unreachable - end - unreachable - end + i32.const 0 + return end - ) - (func $assembly/module/index/Module#get:start (; 46 ;) (type $ii) (param $0 i32) (result i32) + get_local $1 + call $assembly/module/index/Section#constructor get_local $0 - get_global $src/common/SectionId.Start - call $assembly/module/index/Module#getID + i32.load offset=4 + call $assembly/module/imports/Imports#parse ) - (func $assembly/module/index/Module#get:hasStart (; 47 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/getImports (; 46 ;) (type $iv) (param $0 i32) get_local $0 - call $assembly/module/index/Module#get:start - i32.load offset=4 - i32.const 0 - i32.gt_s + call $assembly/module/index/Module#getImports + drop ) - (func $~lib/internal/typedarray/TypedArray#constructor (; 48 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#constructor (; 47 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -3627,8 +3488,8 @@ i32.gt_u if i32.const 0 - i32.const 1248 - i32.const 24 + i32.const 1216 + i32.const 23 i32.const 34 call $~lib/env/abort unreachable @@ -3663,170 +3524,183 @@ i32.store offset=8 get_local $1 ) - (func $~lib/internal/typedarray/TypedArray#__get (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#__get (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $1 get_local $0 i32.load offset=8 i32.ge_u if i32.const 0 - i32.const 1248 - i32.const 40 + i32.const 1216 + i32.const 39 i32.const 63 call $~lib/env/abort unreachable end get_local $0 - i32.load - get_local $0 i32.load offset=4 - i32.add get_local $1 + get_local $0 + i32.load + i32.add i32.add i32.load8_u offset=8 ) - (func $~lib/internal/typedarray/TypedArray#__set (; 50 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/typedarray/TypedArray#__set (; 49 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $1 get_local $0 i32.load offset=8 i32.ge_u if i32.const 0 - i32.const 1248 - i32.const 51 + i32.const 1216 + i32.const 50 i32.const 63 call $~lib/env/abort unreachable end get_local $0 - i32.load - get_local $0 i32.load offset=4 - i32.add get_local $1 + get_local $0 + i32.load + i32.add i32.add get_local $2 i32.store8 offset=8 ) - (func $assembly/index/removeStartFunction (; 51 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/removeStartFunction (; 50 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) get_local $0 - call $assembly/module/index/Module#get:hasStart + get_global $src/common/SectionId.Start + call $assembly/module/index/Module#getID + tee_local $2 if - i32.const 0 - get_local $0 - get_global $src/common/SectionId.Start - call $assembly/module/index/Module#getID - i32.load - tee_local $1 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $1 - i32.load offset=8 - else - unreachable - end - set_local $1 get_local $0 i32.load offset=4 i32.load offset=4 - get_local $1 - tee_local $3 + get_local $2 i32.load offset=12 - get_local $1 + get_local $2 i32.load offset=8 i32.add - tee_local $1 - get_local $3 + get_local $2 i32.load i32.sub tee_local $4 i32.sub - call $~lib/internal/typedarray/TypedArray#constructor - set_local $1 - block $break|0 - loop $repeat|0 - get_local $2 + call $~lib/internal/typedarray/TypedArray#constructor + set_local $3 + loop $repeat|0 + get_local $1 + get_local $2 + i32.load offset=16 + i32.lt_u + if get_local $3 - i32.load offset=16 - i32.ge_u - br_if $break|0 get_local $1 - get_local $2 get_local $0 i32.load offset=4 i32.load - get_local $2 - call $~lib/internal/typedarray/TypedArray#__get + get_local $1 + call $~lib/internal/typedarray/TypedArray#__get i32.const 255 i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $2 + call $~lib/internal/typedarray/TypedArray#__set + get_local $1 i32.const 1 i32.add - set_local $2 + set_local $1 br $repeat|0 - unreachable end - unreachable end - block $break|1 - get_local $3 - i32.load offset=16 - get_local $4 - i32.add - set_local $2 - loop $repeat|1 - get_local $2 - get_local $0 - i32.load offset=4 - i32.load offset=4 - i32.ge_u - br_if $break|1 + get_local $2 + i32.load offset=16 + get_local $4 + i32.add + set_local $1 + loop $repeat|1 + get_local $1 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.lt_u + if + get_local $3 get_local $1 - get_local $2 get_local $4 i32.sub get_local $0 i32.load offset=4 i32.load - get_local $2 - call $~lib/internal/typedarray/TypedArray#__get + get_local $1 + call $~lib/internal/typedarray/TypedArray#__get i32.const 255 i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $2 + call $~lib/internal/typedarray/TypedArray#__set + get_local $1 i32.const 1 i32.add - set_local $2 + set_local $1 br $repeat|1 - unreachable end - unreachable end else get_local $0 i32.load offset=4 i32.load - set_local $1 + set_local $3 + end + get_local $3 + ) + (func $assembly/index/exportDataSection (; 51 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + get_local $0 + get_global $src/common/SectionId.Data + call $assembly/module/index/Module#getID + tee_local $1 + i32.eqz + if + i32.const 0 + return end get_local $1 + i32.load offset=12 + get_local $1 + i32.load offset=8 + i32.add + get_local $1 + i32.load + i32.sub + call $~lib/internal/typedarray/TypedArray#constructor + drop + get_local $0 + i32.load offset=4 + i32.load ) (func $assembly/index/toString (; 52 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/TypeSection#toString ) - (func $assembly/index/hasStart (; 53 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:start (; 53 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + get_global $src/common/SectionId.Start + call $assembly/module/index/Module#getID + ) + (func $assembly/module/index/Module#get:hasStart (; 54 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $assembly/module/index/Module#get:start + i32.const 0 + i32.ne + ) + (func $assembly/index/hasStart (; 55 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/Module#get:hasStart ) - (func $assembly/buffer/index/Buffer#constructor (; 54 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#constructor (; 56 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) i32.const 20 call $~lib/allocator/arena/__memory_allocate @@ -3871,7 +3745,7 @@ i32.store offset=16 get_local $1 ) - (func $assembly/module/index/Module#constructor (; 55 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/Module#constructor (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if @@ -3888,11 +3762,11 @@ get_local $1 i32.store offset=4 get_local $0 - i32.const 1320 + i32.const 1288 i32.store get_local $0 ) - (func $assembly/index/Parser#constructor (; 56 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/Parser#constructor (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if @@ -3917,7 +3791,7 @@ i32.store offset=4 get_local $0 ) - (func $assembly/index/Parser#parseString (; 57 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#parseString (; 59 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 @@ -3926,23 +3800,23 @@ call $assembly/buffer/index/Buffer#readVaruint call $~lib/string/String.fromUTF8 ) - (func $assembly/index/Parser#readVaruint (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/Parser#readVaruint (; 60 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.load call $assembly/buffer/index/Buffer#readVaruint ) - (func $assembly/index/Parser#get:off (; 59 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#get:off (; 61 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 ) - (func $assembly/index/Parser#set:off (; 60 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/index/Parser#set:off (; 62 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 i32.load get_local $1 i32.store offset=8 ) - (func $assembly/module/index/sectionName (; 61 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/sectionName (; 63 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $case12|0 block $case11|0 @@ -3971,45 +3845,45 @@ end br $case12|0 end - i32.const 1336 + i32.const 1304 return end - i32.const 1352 + i32.const 1320 return end - i32.const 1368 + i32.const 1336 return end - i32.const 1384 + i32.const 1352 return end - i32.const 1408 + i32.const 1376 return end - i32.const 1424 + i32.const 1392 return end - i32.const 1440 + i32.const 1408 return end - i32.const 1456 + i32.const 1424 return end - i32.const 1472 + i32.const 1440 return end - i32.const 1488 + i32.const 1456 return end - i32.const 1512 + i32.const 1480 return end - i32.const 1528 + i32.const 1496 return end unreachable ) - (func $assembly/module/index/SectionHeader#constructor (; 62 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/module/index/SectionHeader#constructor (; 64 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -4053,31 +3927,11 @@ get_local $0 call $assembly/buffer/index/Buffer#readVaruint i32.store offset=8 + get_global $src/common/SectionId.Custom get_local $1 i32.load offset=4 + i32.eq if - get_local $1 - i32.load offset=4 - get_global $src/common/SectionId.Data - i32.le_u - if - get_local $1 - get_local $1 - i32.load offset=4 - call $assembly/module/index/sectionName - i32.store offset=20 - else - get_local $1 - i32.load - call $assembly/host/index/_logi - i32.const 1544 - get_local $1 - i32.load offset=4 - call $~lib/internal/number/itoa - call $~lib/string/String.__concat - call $assembly/host/index/err - end - else get_local $0 i32.load offset=8 set_local $2 @@ -4085,13 +3939,13 @@ call $assembly/buffer/index/Buffer#readVaruint set_local $3 get_local $1 - i32.const 1328 + i32.const 1296 get_local $0 i32.load offset=8 get_local $3 call $~lib/string/String.fromUTF8 call $~lib/string/String.__concat - i32.const 1328 + i32.const 1296 call $~lib/string/String.__concat i32.store offset=20 get_local $0 @@ -4109,6 +3963,28 @@ i32.sub i32.sub i32.store offset=8 + else + get_local $1 + i32.load offset=4 + get_global $src/common/SectionId.Data + i32.le_u + if + get_local $1 + get_local $1 + i32.load offset=4 + call $assembly/module/index/sectionName + i32.store offset=20 + else + get_local $1 + i32.load + call $assembly/host/index/_logi + i32.const 1512 + get_local $1 + i32.load offset=4 + call $~lib/internal/number/itoa + call $~lib/string/String.__concat + call $assembly/host/index/err + end end get_local $1 get_local $0 @@ -4116,21 +3992,21 @@ i32.store offset=12 get_local $1 ) - (func $assembly/module/index/Module#parseSection (; 63 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/module/index/Module#parseSection (; 65 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 i32.load get_local $1 - call $~lib/array/Array#push + call $~lib/array/Array#push drop block $break|0 + get_global $src/common/SectionId.Type get_local $1 i32.load offset=4 - get_global $src/common/SectionId.Type i32.eq br_if $break|0 end ) - (func $assembly/index/Parser#parse (; 64 ;) (type $iv) (param $0 i32) + (func $assembly/index/Parser#parse (; 66 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -4203,68 +4079,45 @@ end end ) - (func $assembly/index/newParser (; 65 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/newParser (; 67 ;) (type $ii) (param $0 i32) (result i32) i32.const 0 get_local $0 call $assembly/index/Parser#constructor ) - (func $assembly/index/parse (; 66 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/parse (; 68 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/index/Parser#parse get_local $0 i32.load offset=4 ) - (func $assembly/module/index/Module#get:Type (; 67 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:Type (; 69 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Type call $assembly/module/index/Module#getID ) - (func $assembly/module/index/Module#getType (; 68 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - i32.const 0 - get_local $0 - call $assembly/module/index/Module#get:Type - i32.load - tee_local $1 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $1 - i32.load offset=8 - else - unreachable - end - tee_local $1 - call $assembly/module/index/Section#constructor - get_local $0 - i32.load offset=4 - call $assembly/module/index/TypeSection#parse - ) - (func $start (; 69 ;) (type $v) - i32.const 1576 + (func $start (; 70 ;) (type $v) + i32.const 1544 set_global $~lib/allocator/arena/startOffset get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset ) - (func $null (; 70 ;) (type $v) + (func $null (; 71 ;) (type $v) nop ) - (func $Parser#get:buf (; 71 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:buf (; 72 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) - (func $Parser#set:buf (; 72 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:buf (; 73 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store ) - (func $Parser#get:module (; 73 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:module (; 74 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) - (func $Parser#set:module (; 74 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:module (; 75 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store offset=4 From ada90473132bf8e9ec379c3ebad585a4d9347dc1 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Mon, 4 Feb 2019 12:49:06 -0500 Subject: [PATCH 27/46] Pass tests for data section exporting Requires that memory not be imported. Need to fix that next. --- lib/parse/assembly/index.ts | 57 ++++- lib/parse/assembly/module/index.ts | 6 +- lib/parse/build/index.d.ts | 4 +- lib/parse/build/index.wat | 389 +++++++++++++++++++++++------ lib/parse/build/test.wat | 4 +- lib/parse/package.json | 2 +- lib/parse/src/index.ts | 17 ++ lib/parse/tests/index.ts | 26 +- 8 files changed, 411 insertions(+), 94 deletions(-) diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index abc8fe20a4..5026e079d2 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -85,16 +85,16 @@ export function getImports(m: Module): void { // return } -export function removeStartFunction (mod: Module): Uint8Array { - var start = mod.getID(SectionId.Start); - if (start != null) { +export function removeSection(mod: Module, id: SectionId): Uint8Array { + var section = mod.getID(id); + if (section != null) { // log(start.toString()); - let len = start.end - start.ref; + let len = section.end - section.ref; // log(len); let buf = new Uint8Array(mod.buf.length - len); // log(start.offset) - for (let i: u32 = 0; i < start.offset; i++) { + for (let i: u32 = 0; i < section.offset; i++) { buf[i] = mod.buf.buffer[i]; } // log("checking end index"); @@ -102,7 +102,7 @@ export function removeStartFunction (mod: Module): Uint8Array { // log(mod.buf.buffer); // log(mod.buf.buffer[mod.buf.length - 1]); // log(start.offset + len) - for (let i: u32 = start.offset + len; i < mod.buf.length; i++) { + for (let i: u32 = section.offset + len; i < mod.buf.length; i++) { buf[i - len] = mod.buf.buffer[i]; } return buf; @@ -111,14 +111,45 @@ export function removeStartFunction (mod: Module): Uint8Array { } } -export function exportDataSection(m: Module): Uint8Array | null { - var header = m.getID(SectionId.Data); +export function removeStartFunction (mod: Module): Uint8Array { + return removeSection(mod, SectionId.Start); +} + +//Most Also include Memory Section +export function exportDataSection(mod: Module): Uint8Array | null { + var header = mod.getID(SectionId.Data); + var mem = mod.getID(SectionId.Memory); + log((header).offset); + log((mem).offset); + log(header == null); + log(mem ==null) if (header == null){ return null; } - var len = header.end - header.ref; - var res = new Uint8Array(len); - return m.buf.buffer; + if (mem == null){ + return null; + } + var len = header.len + mem.len; + var res = new Uint8Array(len + 8); //Make room for preamble + res.fill(0,0,8); + //Magic Number + res[0] = 0; + res[1] = 0x61; + res[2] = 0x73; + res[3] = 0x6D; + //Version number + res[4] = 0x01; + log(res) + for (let i = mem.offset; i < mem.offset + mem.len - 1; i++){ + res[i - mem.offset + 8] = mod.buf.buffer[i]; + } + log(res[8]) + log(mod.buf.buffer[mem.offset]); + for (let i = header.offset; i < header.offset + header.len - 1; i++){ + let offset = i - header.offset + 8 + mem.len; + res[offset] = mod.buf.buffer[i]; + } + return res; } export function toString(t:TypeSection): string { @@ -191,4 +222,8 @@ export function parse(p: Parser): Module { return p.module; } +export function hasSection(mod: Module, id: SectionId): boolean { + return mod.getID(id) != null; +} + export {TypeSection, Module} diff --git a/lib/parse/assembly/module/index.ts b/lib/parse/assembly/module/index.ts index 30d1819c6c..65d1dfc186 100644 --- a/lib/parse/assembly/module/index.ts +++ b/lib/parse/assembly/module/index.ts @@ -173,10 +173,14 @@ export class SectionHeader { this.payload_off = buf.off; } - get end(): u32{ + get end(): u32 { return this.payload_off + this.payload_len; } + //Length of section header and payload + get len(): u32 { + return this.end - this.ref; + } toString(): string { let ref = itoa(this.ref); diff --git a/lib/parse/build/index.d.ts b/lib/parse/build/index.d.ts index bc0b765b09..03a5063a11 100644 --- a/lib/parse/build/index.d.ts +++ b/lib/parse/build/index.d.ts @@ -11,8 +11,9 @@ declare module ASModule { function printModule(m: u32): void; function getType(m: u32): u32; function getImports(m: u32): void; + function removeSection(mod: u32, id: i32): u32; function removeStartFunction(mod: u32): u32; - function exportDataSection(m: u32): u32; + function exportDataSection(mod: u32): u32; function toString(t: u32): u32; function hasStart(mod: u32): bool; class Parser { @@ -26,6 +27,7 @@ declare module ASModule { } function newParser(buf: u32): u32; function parse(p: u32): u32; + function hasSection(mod: u32, id: i32): bool; namespace memory { function fill(dest: u32, c: u8, n: u32): void; function copy(dest: u32, src: u32, n: u32): void; diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index 82b0885cd8..58a90f0958 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -63,6 +63,7 @@ (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) + (import "index" "_log" (func $assembly/host/index/_log (param i32 i32))) (table $0 1 anyfunc) (elem (i32.const 0) $null) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) @@ -70,6 +71,7 @@ (global $src/common/SectionId.Custom (mut i32) (i32.const 0)) (global $src/common/SectionId.Type (mut i32) (i32.const 1)) (global $src/common/SectionId.Import (mut i32) (i32.const 2)) + (global $src/common/SectionId.Memory (mut i32) (i32.const 5)) (global $src/common/SectionId.Start (mut i32) (i32.const 8)) (global $src/common/SectionId.Data (mut i32) (i32.const 11)) (global $src/common/ExternalKind.Function (mut i32) (i32.const 0)) @@ -81,6 +83,7 @@ (export "printModule" (func $assembly/index/printModule)) (export "getType" (func $assembly/index/getType)) (export "getImports" (func $assembly/index/getImports)) + (export "removeSection" (func $assembly/index/removeSection)) (export "removeStartFunction" (func $assembly/index/removeStartFunction)) (export "exportDataSection" (func $assembly/index/exportDataSection)) (export "toString" (func $assembly/index/toString)) @@ -97,6 +100,7 @@ (export "Parser#parse" (func $assembly/index/Parser#parse)) (export "newParser" (func $assembly/index/newParser)) (export "parse" (func $assembly/index/parse)) + (export "hasSection" (func $assembly/index/hasSection)) (export "memory.fill" (func $~lib/memory/memory.fill)) (export "memory.copy" (func $~lib/memory/memory.copy)) (export "memory.compare" (func $~lib/memory/memory.compare)) @@ -123,7 +127,7 @@ (export "Module#getImports" (func $assembly/module/index/Module#getImports)) (export "Module#print" (func $assembly/module/index/Module#print)) (start $start) - (func $~lib/internal/memory/memset (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i64) get_local $2 @@ -358,13 +362,13 @@ end end ) - (func $~lib/memory/memory.fill (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/memory.fill (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memset ) - (func $~lib/internal/memory/memcpy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memcpy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -1268,7 +1272,7 @@ i32.store8 end ) - (func $~lib/internal/memory/memmove (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memmove (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) get_local $0 @@ -1468,13 +1472,13 @@ end end ) - (func $~lib/memory/memory.copy (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/memory.copy (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memmove ) - (func $~lib/internal/memory/memcmp (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/internal/memory/memcmp (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) get_local $0 get_local $1 @@ -1525,13 +1529,13 @@ end tee_local $0 ) - (func $~lib/memory/memory.compare (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $~lib/memory/memory.compare (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memcmp ) - (func $~lib/allocator/arena/__memory_allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/allocator/arena/__memory_allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1593,18 +1597,18 @@ set_global $~lib/allocator/arena/offset get_local $1 ) - (func $~lib/memory/memory.allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/memory/memory.allocate (; 12 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $~lib/allocator/arena/__memory_allocate ) - (func $~lib/memory/memory.free (; 12 ;) (type $iv) (param $0 i32) + (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) nop ) - (func $~lib/memory/memory.reset (; 13 ;) (type $v) + (func $~lib/memory/memory.reset (; 14 ;) (type $v) get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset ) - (func $~lib/internal/number/decimalCount32 (; 14 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/decimalCount32 (; 15 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.const 100000 i32.lt_u @@ -1658,7 +1662,7 @@ end end ) - (func $~lib/internal/string/allocateUnsafe (; 15 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocateUnsafe (; 16 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 i32.const 0 @@ -1691,7 +1695,7 @@ i32.store get_local $1 ) - (func $~lib/internal/number/utoa32_lut (; 16 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/number/utoa32_lut (; 17 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) i32.const 584 @@ -1801,7 +1805,7 @@ i32.store16 offset=4 end ) - (func $~lib/internal/number/itoa (; 17 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa (; 18 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) block $__inlined_func$~lib/internal/number/utoa32 @@ -1824,7 +1828,7 @@ end get_local $0 ) - (func $~lib/internal/string/copyUnsafe (; 18 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) + (func $~lib/internal/string/copyUnsafe (; 19 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) get_local $1 i32.const 1 i32.shl @@ -1840,7 +1844,7 @@ i32.shl call $~lib/internal/memory/memmove ) - (func $~lib/string/String#concat (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -1887,7 +1891,7 @@ call $~lib/internal/string/copyUnsafe get_local $2 ) - (func $~lib/string/String.__concat (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if @@ -1898,7 +1902,7 @@ get_local $1 call $~lib/string/String#concat ) - (func $assembly/module/index/SectionHeader#toString (; 21 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/SectionHeader#toString (; 22 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -1964,7 +1968,7 @@ get_local $0 call $~lib/string/String.__concat ) - (func $assembly/module/index/Module#print (; 22 ;) (type $iv) (param $0 i32) + (func $assembly/module/index/Module#print (; 23 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) loop $repeat|0 @@ -2006,11 +2010,11 @@ end end ) - (func $assembly/index/printModule (; 23 ;) (type $iv) (param $0 i32) + (func $assembly/index/printModule (; 24 ;) (type $iv) (param $0 i32) get_local $0 call $assembly/module/index/Module#print ) - (func $assembly/module/index/Module#getID (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/Module#getID (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2080,7 +2084,7 @@ end i32.const 0 ) - (func $assembly/module/index/Section#constructor (; 25 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/module/index/Section#constructor (; 26 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) i32.const 4 call $~lib/allocator/arena/__memory_allocate @@ -2089,7 +2093,7 @@ i32.store get_local $1 ) - (func $assembly/buffer/index/Buffer#readVaruint (; 26 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVaruint (; 27 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2129,7 +2133,7 @@ i32.store offset=8 get_local $3 ) - (func $~lib/internal/arraybuffer/allocateUnsafe (; 27 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 28 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 i32.const 1073741816 @@ -2156,7 +2160,7 @@ i32.store get_local $1 ) - (func $~lib/array/Array#constructor (; 28 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/array/Array#constructor (; 29 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2199,7 +2203,7 @@ call $~lib/internal/memory/memset get_local $1 ) - (func $assembly/buffer/index/Buffer#readVarint (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2259,12 +2263,12 @@ get_local $4 select ) - (func $assembly/buffer/index/Buffer#readVarint8 (; 30 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint8 (; 31 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) get_local $0 i32.const 7 call $assembly/buffer/index/Buffer#readVarint ) - (func $assembly/module/index/FuncType#constructor (; 31 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/FuncType#constructor (; 32 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) i32.const 13 call $~lib/allocator/arena/__memory_allocate @@ -2282,7 +2286,7 @@ i32.store8 offset=12 get_local $2 ) - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 32 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 33 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) get_local $1 @@ -2365,7 +2369,7 @@ end get_local $0 ) - (func $~lib/array/Array#__set (; 33 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 34 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) get_local $1 @@ -2411,14 +2415,14 @@ get_local $2 i32.store offset=8 ) - (func $assembly/host/index/err (; 34 ;) (type $iv) (param $0 i32) + (func $assembly/host/index/err (; 35 ;) (type $iv) (param $0 i32) i32.const 1040 get_local $0 call $~lib/string/String.__concat call $assembly/host/index/_log_str unreachable ) - (func $assembly/module/index/typeName (; 35 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/typeName (; 36 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $case7|0 block $case6|0 @@ -2483,7 +2487,7 @@ call $assembly/host/index/err i32.const 656 ) - (func $assembly/module/index/FuncType#toString (; 36 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/FuncType#toString (; 37 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2595,7 +2599,7 @@ get_local $0 call $~lib/string/String.__concat ) - (func $assembly/module/index/TypeSection#parse (; 37 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/TypeSection#parse (; 38 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2774,7 +2778,7 @@ end get_local $0 ) - (func $assembly/module/index/Module#getType (; 38 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#getType (; 39 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 get_global $src/common/SectionId.Type @@ -2790,7 +2794,7 @@ i32.const 0 end ) - (func $~lib/array/Array#push (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#push (; 40 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2841,7 +2845,7 @@ i32.store offset=8 get_local $3 ) - (func $~lib/array/Array#join (; 40 ;) (type $FUNCSIG$i) (result i32) + (func $~lib/array/Array#join (; 41 ;) (type $FUNCSIG$i) (result i32) (local $0 i32) (local $1 i32) (local $2 i32) @@ -2975,7 +2979,7 @@ end get_local $0 ) - (func $assembly/module/index/TypeSection#toString (; 41 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/TypeSection#toString (; 42 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) loop $repeat|0 @@ -3018,7 +3022,7 @@ end call $~lib/array/Array#join ) - (func $assembly/index/getType (; 42 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/getType (; 43 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 call $assembly/module/index/Module#getType @@ -3031,7 +3035,7 @@ get_local $1 call $assembly/module/index/TypeSection#toString ) - (func $~lib/string/String.fromUTF8 (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.fromUTF8 (; 44 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3290,7 +3294,7 @@ call $~lib/internal/memory/memmove get_local $0 ) - (func $assembly/module/imports/Imports#parse (; 44 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/imports/Imports#parse (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3458,7 +3462,7 @@ end get_local $0 ) - (func $assembly/module/index/Module#getImports (; 45 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#getImports (; 46 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 get_global $src/common/SectionId.Import @@ -3475,12 +3479,12 @@ i32.load offset=4 call $assembly/module/imports/Imports#parse ) - (func $assembly/index/getImports (; 46 ;) (type $iv) (param $0 i32) + (func $assembly/index/getImports (; 47 ;) (type $iv) (param $0 i32) get_local $0 call $assembly/module/index/Module#getImports drop ) - (func $~lib/internal/typedarray/TypedArray#constructor (; 47 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#constructor (; 48 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -3524,7 +3528,7 @@ i32.store offset=8 get_local $1 ) - (func $~lib/internal/typedarray/TypedArray#__get (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#__get (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $1 get_local $0 i32.load offset=8 @@ -3546,7 +3550,7 @@ i32.add i32.load8_u offset=8 ) - (func $~lib/internal/typedarray/TypedArray#__set (; 49 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/typedarray/TypedArray#__set (; 50 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $1 get_local $0 i32.load offset=8 @@ -3569,13 +3573,12 @@ get_local $2 i32.store8 offset=8 ) - (func $assembly/index/removeStartFunction (; 50 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) + (func $assembly/index/removeSection (; 51 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) get_local $0 - get_global $src/common/SectionId.Start + get_local $1 call $assembly/module/index/Module#getID tee_local $2 if @@ -3594,6 +3597,8 @@ i32.sub call $~lib/internal/typedarray/TypedArray#constructor set_local $3 + i32.const 0 + set_local $1 loop $repeat|0 get_local $1 get_local $2 @@ -3656,17 +3661,112 @@ end get_local $3 ) - (func $assembly/index/exportDataSection (; 51 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/removeStartFunction (; 52 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + get_global $src/common/SectionId.Start + call $assembly/index/removeSection + ) + (func $assembly/host/index/log (; 53 ;) (type $iv) (param $0 i32) + get_local $0 + i32.const 0 + i32.ne + call $assembly/host/index/_logi + ) + (func $~lib/typedarray/Uint8Array#fill (; 54 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + get_local $0 + i32.load + set_local $3 + get_local $0 + i32.load offset=4 + set_local $4 + i32.const 0 + get_local $0 + i32.load offset=8 + tee_local $1 + i32.const 0 + get_local $1 + i32.lt_s + select + tee_local $2 + i32.const 8 + get_local $1 + i32.const 8 + get_local $1 + i32.lt_s + select + tee_local $1 + i32.lt_s + if + get_local $2 + get_local $3 + i32.add + get_local $4 + i32.add + i32.const 8 + i32.add + i32.const 0 + get_local $1 + get_local $2 + i32.sub + call $~lib/internal/memory/memset + end + get_local $0 + ) + (func $assembly/host/index/log (; 55 ;) (type $iv) (param $0 i32) + get_local $0 + i32.const 255 + i32.and + call $assembly/host/index/_logi + ) + (func $assembly/index/exportDataSection (; 56 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) get_local $0 get_global $src/common/SectionId.Data call $assembly/module/index/Module#getID - tee_local $1 + set_local $3 + get_local $0 + get_global $src/common/SectionId.Memory + call $assembly/module/index/Module#getID + set_local $1 + get_local $3 + i32.load offset=16 + call $assembly/host/index/_logi + get_local $1 + i32.load offset=16 + call $assembly/host/index/_logi + get_local $3 + i32.eqz + tee_local $2 + call $assembly/host/index/log + get_local $1 + i32.eqz + call $assembly/host/index/log + get_local $2 + if + i32.const 0 + return + end + get_local $1 i32.eqz if i32.const 0 return end + get_local $3 + i32.load offset=12 + get_local $3 + i32.load offset=8 + i32.add + get_local $3 + i32.load + i32.sub get_local $1 i32.load offset=12 get_local $1 @@ -3675,32 +3775,162 @@ get_local $1 i32.load i32.sub + i32.add + i32.const 8 + i32.add call $~lib/internal/typedarray/TypedArray#constructor + tee_local $4 + call $~lib/typedarray/Uint8Array#fill drop + get_local $4 + i32.const 0 + i32.const 0 + call $~lib/internal/typedarray/TypedArray#__set + get_local $4 + i32.const 1 + i32.const 97 + call $~lib/internal/typedarray/TypedArray#__set + get_local $4 + i32.const 2 + i32.const 115 + call $~lib/internal/typedarray/TypedArray#__set + get_local $4 + i32.const 3 + i32.const 109 + call $~lib/internal/typedarray/TypedArray#__set + get_local $4 + i32.const 4 + i32.const 1 + call $~lib/internal/typedarray/TypedArray#__set + get_local $4 + i32.const 12 + call $assembly/host/index/_log + get_local $1 + i32.load offset=16 + set_local $2 + loop $repeat|0 + get_local $2 + get_local $1 + i32.load offset=16 + get_local $1 + i32.load offset=12 + get_local $1 + i32.load offset=8 + i32.add + get_local $1 + i32.load + i32.sub + i32.add + i32.const 1 + i32.sub + i32.lt_u + if + get_local $4 + get_local $2 + get_local $1 + i32.load offset=16 + i32.sub + i32.const 8 + i32.add + get_local $0 + i32.load offset=4 + i32.load + get_local $2 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + call $~lib/internal/typedarray/TypedArray#__set + get_local $2 + i32.const 1 + i32.add + set_local $2 + br $repeat|0 + end + end + get_local $4 + i32.const 8 + call $~lib/internal/typedarray/TypedArray#__get + call $assembly/host/index/log get_local $0 i32.load offset=4 i32.load + get_local $1 + i32.load offset=16 + call $~lib/internal/typedarray/TypedArray#__get + call $assembly/host/index/log + get_local $3 + i32.load offset=16 + set_local $2 + loop $repeat|1 + get_local $2 + get_local $3 + i32.load offset=16 + get_local $3 + i32.load offset=12 + get_local $3 + i32.load offset=8 + i32.add + get_local $3 + i32.load + i32.sub + i32.add + i32.const 1 + i32.sub + i32.lt_u + if + get_local $4 + get_local $2 + get_local $3 + i32.load offset=16 + i32.sub + i32.const 8 + i32.add + get_local $1 + i32.load offset=12 + get_local $1 + i32.load offset=8 + i32.add + get_local $1 + i32.load + i32.sub + i32.add + get_local $0 + i32.load offset=4 + i32.load + get_local $2 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + call $~lib/internal/typedarray/TypedArray#__set + get_local $2 + i32.const 1 + i32.add + set_local $2 + br $repeat|1 + end + end + get_local $4 ) - (func $assembly/index/toString (; 52 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/toString (; 57 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/TypeSection#toString ) - (func $assembly/module/index/Module#get:start (; 53 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:start (; 58 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Start call $assembly/module/index/Module#getID ) - (func $assembly/module/index/Module#get:hasStart (; 54 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:hasStart (; 59 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/Module#get:start i32.const 0 i32.ne ) - (func $assembly/index/hasStart (; 55 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/hasStart (; 60 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/Module#get:hasStart ) - (func $assembly/buffer/index/Buffer#constructor (; 56 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#constructor (; 61 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) i32.const 20 call $~lib/allocator/arena/__memory_allocate @@ -3745,7 +3975,7 @@ i32.store offset=16 get_local $1 ) - (func $assembly/module/index/Module#constructor (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/Module#constructor (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if @@ -3766,7 +3996,7 @@ i32.store get_local $0 ) - (func $assembly/index/Parser#constructor (; 58 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/Parser#constructor (; 63 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if @@ -3791,7 +4021,7 @@ i32.store offset=4 get_local $0 ) - (func $assembly/index/Parser#parseString (; 59 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#parseString (; 64 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 @@ -3800,23 +4030,23 @@ call $assembly/buffer/index/Buffer#readVaruint call $~lib/string/String.fromUTF8 ) - (func $assembly/index/Parser#readVaruint (; 60 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/Parser#readVaruint (; 65 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.load call $assembly/buffer/index/Buffer#readVaruint ) - (func $assembly/index/Parser#get:off (; 61 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#get:off (; 66 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 ) - (func $assembly/index/Parser#set:off (; 62 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/index/Parser#set:off (; 67 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 i32.load get_local $1 i32.store offset=8 ) - (func $assembly/module/index/sectionName (; 63 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/sectionName (; 68 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $case12|0 block $case11|0 @@ -3883,7 +4113,7 @@ end unreachable ) - (func $assembly/module/index/SectionHeader#constructor (; 64 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $assembly/module/index/SectionHeader#constructor (; 69 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -3992,7 +4222,7 @@ i32.store offset=12 get_local $1 ) - (func $assembly/module/index/Module#parseSection (; 65 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/module/index/Module#parseSection (; 70 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 i32.load get_local $1 @@ -4006,7 +4236,7 @@ br_if $break|0 end ) - (func $assembly/index/Parser#parse (; 66 ;) (type $iv) (param $0 i32) + (func $assembly/index/Parser#parse (; 71 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -4079,45 +4309,52 @@ end end ) - (func $assembly/index/newParser (; 67 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/newParser (; 72 ;) (type $ii) (param $0 i32) (result i32) i32.const 0 get_local $0 call $assembly/index/Parser#constructor ) - (func $assembly/index/parse (; 68 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/parse (; 73 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/index/Parser#parse get_local $0 i32.load offset=4 ) - (func $assembly/module/index/Module#get:Type (; 69 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/hasSection (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + get_local $1 + call $assembly/module/index/Module#getID + i32.const 0 + i32.ne + ) + (func $assembly/module/index/Module#get:Type (; 75 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Type call $assembly/module/index/Module#getID ) - (func $start (; 70 ;) (type $v) + (func $start (; 76 ;) (type $v) i32.const 1544 set_global $~lib/allocator/arena/startOffset get_global $~lib/allocator/arena/startOffset set_global $~lib/allocator/arena/offset ) - (func $null (; 71 ;) (type $v) + (func $null (; 77 ;) (type $v) nop ) - (func $Parser#get:buf (; 72 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:buf (; 78 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) - (func $Parser#set:buf (; 73 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:buf (; 79 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store ) - (func $Parser#get:module (; 74 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:module (; 80 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) - (func $Parser#set:module (; 75 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:module (; 81 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store offset=4 diff --git a/lib/parse/build/test.wat b/lib/parse/build/test.wat index 97e8ffdcb1..b23d6d8429 100644 --- a/lib/parse/build/test.wat +++ b/lib/parse/build/test.wat @@ -5,10 +5,10 @@ (type $iv (func (param i32))) (type $v (func)) (type $i (func (result i32))) - (import "env" "memory" (memory $0 1)) + (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) + (memory $0 1) (data (i32.const 8) "\10\00\00\00T\00h\00i\00s\00 \00i\00s\00 \00a\00 \00s\00t\00r\00i\00n\00g\00") (data (i32.const 48) "\1b\00\00\00N\00o\00w\00 \00t\00h\00e\00 \00s\00t\00r\00i\00n\00g\00 \00h\00a\00s\00 \00c\00h\00a\00n\00g\00e\00d\00.\00") - (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) (table $0 1 anyfunc) (elem (i32.const 0) $null) (global $~lib/internal/allocator/AL_BITS i32 (i32.const 3)) diff --git a/lib/parse/package.json b/lib/parse/package.json index 704a774815..b11701cc54 100644 --- a/lib/parse/package.json +++ b/lib/parse/package.json @@ -8,7 +8,7 @@ "asbuild": "asc assembly/index.ts -O3 -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate -d build/index.d.ts", "asbuild:untouched": "asc assembly/index.ts -b build/index.wasm -t build/index.wat --debug --importMemory --sourceMap --validate", "build": "npm run asbuild && webpack --mode production --display-modules", - "asbuild:test": "asc tests/assembly/index.ts -b build/test.wasm -t build/test.wat --debug --importMemory --sourceMap --validate", + "asbuild:test": "asc tests/assembly/index.ts -b build/test.wasm -t build/test.wat --debug --sourceMap --validate", "test": "ts-node tests/" }, "files": [ diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index a8bf8eafeb..dcc3da9793 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -22,6 +22,10 @@ export class WasmParser { return this.instance.memory; } + getByteArray(addr: number): Uint8Array { + return this.memory.getArray(Uint8Array, addr); + } + constructor(public binary: Uint8Array) { // compile the parser if not yet compiled if (!compiled) compiled = new WebAssembly.Module(base64_decode(WASM_DATA)); @@ -85,6 +89,19 @@ export class WasmParser { return binary; } + hasSection(id: SectionId): boolean { + return this.instance.hasSection(this.mod, id) != 0; + } + + + removeDataSection(): Uint8Array { + return this.getByteArray(this.instance.removeSection(this.mod, SectionId.Data)); + } + + exportDataSection(): Uint8Array { + return this.memory.getArray(Uint8Array, this.instance.exportDataSection(this.mod)); + } + hasStart(): boolean { return this.instance.hasStart(this.mod) != 0; } diff --git a/lib/parse/tests/index.ts b/lib/parse/tests/index.ts index ed9bb74154..21c3296bde 100644 --- a/lib/parse/tests/index.ts +++ b/lib/parse/tests/index.ts @@ -7,6 +7,10 @@ import { WasmParser } from "../src"; +type CompileError = WebAssembly.CompileError; + + + [ "../build/test.wasm", // "../build/index.wasm", // "libm.wasm" @@ -16,12 +20,30 @@ import { debugger; var parser = new WasmParser(binary); assert(parser.hasStart()); - console.log("\nType Section\n------------------------------"); - console.log(parser.Type); + console.log("Test binary has start section"); + assert(parser.hasSection(SectionId.Data)) + console.log("Test binary has data section"); + assert(parser.hasSection(SectionId.Memory)) + + // console.log("\nType Section\n------------------------------"); + // console.log(parser.Type); // parser.printModule(); + + //Remove Start Section var strippedBinary = parser.removeStartFunction(); + assert(WebAssembly.validate(strippedBinary)); var parser2 = new WasmParser(strippedBinary); + var dataSectionOnly = parser.exportDataSection(); assert(!parser2.hasStart()); + console.log("Start section removed succesfully"); + + //Export Data Section + // new WebAssembly.Module(dataSectionOnly); + var parser3 = new WasmParser(dataSectionOnly); + assert(parser3.hasSection(SectionId.Data)); + assert(parser3.hasSection(SectionId.Memory)) + new WebAssembly.Module(dataSectionOnly); + console.log("Data section exported to module successfully"); // parser2.printModule(); }); console.log("Tests Pass!") From a53fbd3f7fa2743705d7e3f321e44c2eedb72145 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Thu, 7 Feb 2019 09:40:15 -0500 Subject: [PATCH 28/46] fix comma --- lib/loader/tsconfig.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/loader/tsconfig.json b/lib/loader/tsconfig.json index 5f94b88338..d94961912a 100644 --- a/lib/loader/tsconfig.json +++ b/lib/loader/tsconfig.json @@ -6,9 +6,9 @@ "moduleResolution": "node", "outDir": "lib", "target": "es6", - "strict": true, + "strict": true }, "include": [ "src/**/*.ts" ] -} \ No newline at end of file +} From 4db7db2294560d526df8472183762b2ca348ac93 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Thu, 7 Feb 2019 11:23:12 -0500 Subject: [PATCH 29/46] Cleaned up & added wrapped module Now the pointer of the module returns is wrapped like Parser. Also need to include dist because current master causes compile error. --- dist/asc.js | 2 +- dist/asc.js.map | 2 +- dist/assemblyscript.js | 4 +- dist/assemblyscript.js.map | 2 +- lib/parse/README.md | 66 +- lib/parse/assembly/index.ts | 74 +- lib/parse/assembly/module/index.ts | 4 + lib/parse/build/index.d.ts | 6 +- lib/parse/build/index.wat | 7223 +++++++++++++++++----------- lib/parse/package-lock.json | 4607 +++++++++++++++--- lib/parse/package.json | 8 +- lib/parse/src/index.ts | 27 +- lib/parse/src/tsconfig.json | 3 +- lib/parse/tests/index.ts | 1 - lib/parse/tests/tsconfig.json | 10 + 15 files changed, 8255 insertions(+), 3784 deletions(-) create mode 100644 lib/parse/tests/tsconfig.json diff --git a/dist/asc.js b/dist/asc.js index 5eb7060a8a..4909d5b4d9 100644 --- a/dist/asc.js +++ b/dist/asc.js @@ -1,2 +1,2 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n(function(){try{return require("assemblyscript")}catch(e){}}()):"function"==typeof define&&define.amd?define(["assemblyscript"],n):"object"==typeof exports?exports.asc=n(function(){try{return require("assemblyscript")}catch(e){}}()):e.asc=n(e.assemblyscript)}("undefined"!=typeof self?self:this,function(__WEBPACK_EXTERNAL_MODULE__10__){return function(e){var n={};function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var i in e)t.d(r,i,function(n){return e[n]}.bind(null,i));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=4)}([function(e,n,t){var r,i;n.nextTick=function(e){setTimeout(e,0)},n.platform=n.arch=n.execPath=n.title="browser",n.pid=1,n.browser=!0,n.env={},n.argv=[],n.binding=function(e){throw new Error("No such module. (Possibly not yet loaded)")},i="/",n.cwd=function(){return i},n.chdir=function(e){r||(r=t(1)),i=r.resolve(e,i)},n.exit=n.kill=n.umask=n.dlopen=n.uptime=n.memoryUsage=n.uvCounters=function(){},n.features={}},function(e,n,t){(function(e){function t(e,n){for(var t=0,r=e.length-1;r>=0;r--){var i=e[r];"."===i?e.splice(r,1):".."===i?(e.splice(r,1),t++):t&&(e.splice(r,1),t--)}if(n)for(;t--;t)e.unshift("..");return e}var r=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,i=function(e){return r.exec(e).slice(1)};function a(e,n){if(e.filter)return e.filter(n);for(var t=[],r=0;r=-1&&!r;i--){var s=i>=0?arguments[i]:e.cwd();if("string"!=typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(n=s+"/"+n,r="/"===s.charAt(0))}return(r?"/":"")+(n=t(a(n.split("/"),function(e){return!!e}),!r).join("/"))||"."},n.normalize=function(e){var r=n.isAbsolute(e),i="/"===s(e,-1);return(e=t(a(e.split("/"),function(e){return!!e}),!r).join("/"))||r||(e="."),e&&i&&(e+="/"),(r?"/":"")+e},n.isAbsolute=function(e){return"/"===e.charAt(0)},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(a(e,function(e,n){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},n.relative=function(e,t){function r(e){for(var n=0;n=0&&""===e[t];t--);return n>t?[]:e.slice(n,t-n+1)}e=n.resolve(e).substr(1),t=n.resolve(t).substr(1);for(var i=r(e.split("/")),a=r(t.split("/")),s=Math.min(i.length,a.length),o=s,l=0;l{try{assemblyscript=__webpack_require__(10)}catch(e){try{__webpack_require__(!function(){var e=new Error("Cannot find module 'ts-node'");throw e.code="MODULE_NOT_FOUND",e}()).register({project:path.join(".","..","src","tsconfig.json")}),__webpack_require__(!function(){var e=new Error("Cannot find module '../src/glue/js'");throw e.code="MODULE_NOT_FOUND",e}()),assemblyscript=__webpack_require__(!function(){var e=new Error("Cannot find module '../src'");throw e.code="MODULE_NOT_FOUND",e}()),isDev=!0}catch(e_ts){try{assemblyscript=eval("require('./assemblyscript')")}catch(e){throw e.stack=e_ts.stack+"\n---\n"+e.stack,e}}}})(),exports.isBundle=!0,exports.isDev=isDev,exports.version=exports.isBundle?"0.5.0":__webpack_require__(!function(){var e=new Error("Cannot find module '../package.json'");throw e.code="MODULE_NOT_FOUND",e}()).version,exports.options=__webpack_require__(11),exports.sourceMapRoot="assemblyscript:///",exports.libraryPrefix=assemblyscript.LIBRARY_PREFIX,exports.defaultOptimizeLevel=2,exports.defaultShrinkLevel=1,exports.libraryFiles=exports.isBundle?Object({"allocator/arena":'/**\n * Arena Memory Allocator\n *\n * Provides a `memory.reset` function to reset the heap to its initial state. A user has to make\n * sure that there are no more references to cleared memory afterwards. Always aligns to 8 bytes.\n *\n * @module std/assembly/allocator/arena\n *//***/\n\nimport { AL_MASK, MAX_SIZE_32 } from "../internal/allocator";\n\nvar startOffset: usize = (HEAP_BASE + AL_MASK) & ~AL_MASK;\nvar offset: usize = startOffset;\n\n// Memory allocator interface\n\n@global export function __memory_allocate(size: usize): usize {\n if (size > MAX_SIZE_32) unreachable();\n var ptr = offset;\n var newPtr = (ptr + max(size, 1) + AL_MASK) & ~AL_MASK;\n var pagesBefore = memory.size();\n if (newPtr > pagesBefore << 16) {\n let pagesNeeded = ((newPtr - ptr + 0xffff) & ~0xffff) >>> 16;\n let pagesWanted = max(pagesBefore, pagesNeeded); // double memory\n if (memory.grow(pagesWanted) < 0) {\n if (memory.grow(pagesNeeded) < 0) {\n unreachable(); // out of memory\n }\n }\n }\n offset = newPtr;\n return ptr;\n}\n\n@global export function __memory_free(ptr: usize): void { /* nop */ }\n\n@global export function __memory_reset(): void {\n offset = startOffset;\n}\n',"allocator/buddy":'/**\n * Buddy Memory Allocator.\n * @module std/assembly/allocator/buddy\n *//***/\n\n/*\n Copyright 2018 Evan Wallace\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the "Software"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n*/// see: https://github.com/evanw/buddy-malloc\n\n/*\n * This file implements a buddy memory allocator, which is an allocator that\n * allocates memory within a fixed linear address range. It spans the address\n * range with a binary tree that tracks free space. Both "malloc" and "free"\n * are O(log N) time where N is the maximum possible number of allocations.\n *\n * The "buddy" term comes from how the tree is used. When memory is allocated,\n * nodes in the tree are split recursively until a node of the appropriate size\n * is reached. Every split results in two child nodes, each of which is the\n * buddy of the other. When a node is freed, the node and its buddy can be\n * merged again if the buddy is also free. This makes the memory available\n * for larger allocations again.\n */\n\n/*\n * Every allocation needs an 8-byte header to store the allocation size while\n * staying 8-byte aligned. The address returned by "malloc" is the address\n * right after this header (i.e. the size occupies the 8 bytes before the\n * returned address).\n */\nconst HEADER_SIZE: usize = 8;\n\n/*\n * The minimum allocation size is 16 bytes because we have an 8-byte header and\n * we need to stay 8-byte aligned.\n */\nconst MIN_ALLOC_LOG2: usize = 4;\nconst MIN_ALLOC: usize = 1 << MIN_ALLOC_LOG2;\n\n/*\n * The maximum allocation size is currently set to 2gb. This is the total size\n * of the heap. It\'s technically also the maximum allocation size because the\n * heap could consist of a single allocation of this size. But of course real\n * heaps will have multiple allocations, so the real maximum allocation limit\n * is at most 1gb.\n */\nconst MAX_ALLOC_LOG2: usize = 30; // 31;\nconst MAX_ALLOC: usize = 1 << MAX_ALLOC_LOG2;\n\n/*\n * Allocations are done in powers of two starting from MIN_ALLOC and ending at\n * MAX_ALLOC inclusive. Each allocation size has a bucket that stores the free\n * list for that allocation size.\n *\n * Given a bucket index, the size of the allocations in that bucket can be\n * found with "(size_t)1 << (MAX_ALLOC_LOG2 - bucket)".\n */\nconst BUCKET_COUNT: usize = MAX_ALLOC_LOG2 - MIN_ALLOC_LOG2 + 1;\n\n/*\n * Free lists are stored as circular doubly-linked lists. Every possible\n * allocation size has an associated free list that is threaded through all\n * currently free blocks of that size. That means MIN_ALLOC must be at least\n * "sizeof(list_t)". MIN_ALLOC is currently 16 bytes, so this will be true for\n * both 32-bit and 64-bit.\n */\n@unmanaged\nclass List {\n prev: List;\n next: List;\n static readonly SIZE: usize = 2 * sizeof();\n}\n\n/*\n * Each bucket corresponds to a certain allocation size and stores a free list\n * for that size. The bucket at index 0 corresponds to an allocation size of\n * MAX_ALLOC (i.e. the whole address space).\n */\nvar BUCKETS_START: usize = HEAP_BASE;\nvar BUCKETS_END: usize = BUCKETS_START + BUCKET_COUNT * List.SIZE;\n\nfunction buckets$get(index: usize): List {\n assert(index < BUCKET_COUNT);\n return changetype(BUCKETS_START + index * List.SIZE);\n}\n\n/*\n * We could initialize the allocator by giving it one free block the size of\n * the entire address space. However, this would cause us to instantly reserve\n * half of the entire address space on the first allocation, since the first\n * split would store a free list entry at the start of the right child of the\n * root. Instead, we have the tree start out small and grow the size of the\n * tree as we use more memory. The size of the tree is tracked by this value.\n */\nvar bucket_limit: usize;\n\n/*\n * This array represents a linearized binary tree of bits. Every possible\n * allocation larger than MIN_ALLOC has a node in this tree (and therefore a\n * bit in this array).\n *\n * Given the index for a node, lineraized binary trees allow you to traverse to\n * the parent node or the child nodes just by doing simple arithmetic on the\n * index:\n *\n * - Move to parent: index = (index - 1) / 2;\n * - Move to left child: index = index * 2 + 1;\n * - Move to right child: index = index * 2 + 2;\n * - Move to sibling: index = ((index - 1) ^ 1) + 1;\n *\n * Each node in this tree can be in one of several states:\n *\n * - UNUSED (both children are UNUSED)\n * - SPLIT (one child is UNUSED and the other child isn\'t)\n * - USED (neither children are UNUSED)\n *\n * These states take two bits to store. However, it turns out we have enough\n * information to distinguish between UNUSED and USED from context, so we only\n * need to store SPLIT or not, which only takes a single bit.\n *\n * Note that we don\'t need to store any nodes for allocations of size MIN_ALLOC\n * since we only ever care about parent nodes.\n */\nconst SPLIT_COUNT: usize = (1 << (BUCKET_COUNT - 1)) / 8;\nvar NODE_IS_SPLIT_START: usize = BUCKETS_END;\nvar NODE_IS_SPLIT_END: usize = NODE_IS_SPLIT_START + SPLIT_COUNT * sizeof();\n\nfunction node_is_split$get(index: usize): i32 {\n assert(index < SPLIT_COUNT);\n return load(NODE_IS_SPLIT_START + index);\n}\n\nfunction node_is_split$set(index: usize, state: i32): void {\n assert(index < SPLIT_COUNT);\n store(NODE_IS_SPLIT_START + index, state);\n}\n\n/*\n * This is the starting address of the address range for this allocator. Every\n * returned allocation will be an offset of this pointer from 0 to MAX_ALLOC.\n */\nvar base_ptr: usize;\n\n/*\n * This is the maximum address that has ever been used by the allocator. It\'s\n * used to know when to call "brk" to request more memory from the kernel.\n */\nvar max_ptr: usize;\n\n/*\n * Make sure all addresses before "new_value" are valid and can be used. Memory\n * is allocated in a 2gb address range but that memory is not reserved up\n * front. It\'s only reserved when it\'s needed by calling this function. This\n * will return false if the memory could not be reserved.\n */\nfunction update_max_ptr(new_value: usize): i32 {\n if (new_value > max_ptr) {\n // if (brk(new_value)) {\n // return 0;\n // }\n let oldPages = memory.size();\n let newPages = (((new_value + 0xffff) & ~0xffff) >>> 16);\n assert(newPages > oldPages);\n if (memory.grow(newPages - oldPages) < 0) {\n return 0;\n }\n // max_ptr = new_value;\n max_ptr = newPages << 16;\n }\n return 1;\n}\n\n/*\n * Initialize a list to empty. Because these are circular lists, an "empty"\n * list is an entry where both links point to itself. This makes insertion\n * and removal simpler because they don\'t need any branches.\n */\nfunction list_init(list: List): void {\n list.prev = list;\n list.next = list;\n}\n\n/*\n * Append the provided entry to the end of the list. This assumes the entry\n * isn\'t in a list already because it overwrites the linked list pointers.\n */\nfunction list_push(list: List, entry: List): void {\n var prev = list.prev;\n entry.prev = prev;\n entry.next = list;\n prev.next = entry;\n list.prev = entry;\n}\n\n/*\n * Remove the provided entry from whichever list it\'s currently in. This\n * assumes that the entry is in a list. You don\'t need to provide the list\n * because the lists are circular, so the list\'s pointers will automatically\n * be updated if the first or last entries are removed.\n */\nfunction list_remove(entry: List): void {\n var prev = entry.prev;\n var next = entry.next;\n prev.next = next;\n next.prev = prev;\n}\n\n/*\n * Remove and return the first entry in the list or NULL if the list is empty.\n */\nfunction list_pop(list: List): List | null {\n var back = list.prev;\n if (back == list) return null;\n list_remove(back);\n return back;\n}\n\n/*\n * This maps from the index of a node to the address of memory that node\n * represents. The bucket can be derived from the index using a loop but is\n * required to be provided here since having them means we can avoid the loop\n * and have this function return in constant time.\n */\nfunction ptr_for_node(index: usize, bucket: usize): usize {\n return base_ptr + ((index - (1 << bucket) + 1) << (MAX_ALLOC_LOG2 - bucket));\n}\n\n/*\n * This maps from an address of memory to the node that represents that\n * address. There are often many nodes that all map to the same address, so\n * the bucket is needed to uniquely identify a node.\n */\nfunction node_for_ptr(ptr: usize, bucket: usize): usize {\n return ((ptr - base_ptr) >> (MAX_ALLOC_LOG2 - bucket)) + (1 << bucket) - 1;\n}\n\n/*\n * Given the index of a node, this returns the "is split" flag of the parent.\n */\nfunction parent_is_split(index: usize): bool {\n index = (index - 1) / 2;\n return ((node_is_split$get(index / 8) >>> (index % 8)) & 1) == 1;\n}\n\n/*\n * Given the index of a node, this flips the "is split" flag of the parent.\n */\nfunction flip_parent_is_split(index: usize): void {\n index = (index - 1) / 2;\n var indexDiv8 = index / 8;\n node_is_split$set(indexDiv8,\n node_is_split$get(indexDiv8) ^ (1 << (index % 8))\n );\n}\n\n/*\n * Given the requested size passed to "malloc", this function returns the index\n * of the smallest bucket that can fit that size.\n */\nfunction bucket_for_request(request: usize): usize {\n var bucket = BUCKET_COUNT - 1;\n var size = MIN_ALLOC;\n\n while (size < request) {\n bucket--;\n size *= 2;\n }\n\n return bucket;\n}\n\n/*\n * The tree is always rooted at the current bucket limit. This call grows the\n * tree by repeatedly doubling it in size until the root lies at the provided\n * bucket index. Each doubling lowers the bucket limit by 1.\n */\nfunction lower_bucket_limit(bucket: usize): u32 {\n while (bucket < bucket_limit) {\n let root = node_for_ptr(base_ptr, bucket_limit);\n let right_child: usize;\n\n /*\n * If the parent isn\'t SPLIT, that means the node at the current bucket\n * limit is UNUSED and our address space is entirely free. In that case,\n * clear the root free list, increase the bucket limit, and add a single\n * block with the newly-expanded address space to the new root free list.\n */\n if (!parent_is_split(root)) {\n list_remove(changetype(base_ptr));\n list_init(buckets$get(--bucket_limit));\n list_push(buckets$get(bucket_limit), changetype(base_ptr));\n continue;\n }\n\n /*\n * Otherwise, the tree is currently in use. Create a parent node for the\n * current root node in the SPLIT state with a right child on the free\n * list. Make sure to reserve the memory for the free list entry before\n * writing to it. Note that we do not need to flip the "is split" flag for\n * our current parent because it\'s already on (we know because we just\n * checked it above).\n */\n right_child = ptr_for_node(root + 1, bucket_limit);\n if (!update_max_ptr(right_child + List.SIZE)) {\n return 0;\n }\n list_push(buckets$get(bucket_limit), changetype(right_child));\n list_init(buckets$get(--bucket_limit));\n\n /*\n * Set the grandparent\'s SPLIT flag so if we need to lower the bucket limit\n * again, we\'ll know that the new root node we just added is in use.\n */\n root = (root - 1) / 2;\n if (root != 0) {\n flip_parent_is_split(root);\n }\n }\n\n return 1;\n}\n\n// Memory allocator interface\n\n@global export function __memory_allocate(request: usize): usize {\n var original_bucket: usize, bucket: usize;\n\n /*\n * Make sure it\'s possible for an allocation of this size to succeed. There\'s\n * a hard-coded limit on the maximum allocation size because of the way this\n * allocator works.\n */\n if (request > MAX_ALLOC - HEADER_SIZE) unreachable();\n\n /*\n * Initialize our global state if this is the first call to "malloc". At the\n * beginning, the tree has a single node that represents the smallest\n * possible allocation size. More memory will be reserved later as needed.\n */\n if (base_ptr == 0) {\n // base_ptr = max_ptr = (uint8_t *)sbrk(0);\n base_ptr = (NODE_IS_SPLIT_END + 7) & ~7; // must be aligned\n max_ptr = memory.size() << 16; // must grow first\n bucket_limit = BUCKET_COUNT - 1;\n if (!update_max_ptr(base_ptr + List.SIZE)) {\n return 0;\n }\n list_init(buckets$get(BUCKET_COUNT - 1));\n list_push(buckets$get(BUCKET_COUNT - 1), changetype(base_ptr));\n }\n\n /*\n * Find the smallest bucket that will fit this request. This doesn\'t check\n * that there\'s space for the request yet.\n */\n bucket = bucket_for_request(request + HEADER_SIZE);\n original_bucket = bucket;\n\n /*\n * Search for a bucket with a non-empty free list that\'s as large or larger\n * than what we need. If there isn\'t an exact match, we\'ll need to split a\n * larger one to get a match.\n */\n while (bucket + 1 != 0) {\n let size: usize, bytes_needed: usize, i: usize;\n let ptr: usize;\n\n /*\n * We may need to grow the tree to be able to fit an allocation of this\n * size. Try to grow the tree and stop here if we can\'t.\n */\n if (!lower_bucket_limit(bucket)) {\n return 0;\n }\n\n /*\n * Try to pop a block off the free list for this bucket. If the free list\n * is empty, we\'re going to have to split a larger block instead.\n */\n ptr = changetype(list_pop(buckets$get(bucket)));\n if (!ptr) {\n /*\n * If we\'re not at the root of the tree or it\'s impossible to grow the\n * tree any more, continue on to the next bucket.\n */\n if (bucket != bucket_limit || bucket == 0) {\n bucket--;\n continue;\n }\n\n /*\n * Otherwise, grow the tree one more level and then pop a block off the\n * free list again. Since we know the root of the tree is used (because\n * the free list was empty), this will add a parent above this node in\n * the SPLIT state and then add the new right child node to the free list\n * for this bucket. Popping the free list will give us this right child.\n */\n if (!lower_bucket_limit(bucket - 1)) {\n return 0;\n }\n ptr = changetype(list_pop(buckets$get(bucket)));\n }\n\n /*\n * Try to expand the address space first before going any further. If we\n * have run out of space, put this block back on the free list and fail.\n */\n size = 1 << (MAX_ALLOC_LOG2 - bucket);\n bytes_needed = bucket < original_bucket ? size / 2 + List.SIZE : size;\n if (!update_max_ptr(ptr + bytes_needed)) {\n list_push(buckets$get(bucket), changetype(ptr));\n return 0;\n }\n\n /*\n * If we got a node off the free list, change the node from UNUSED to USED.\n * This involves flipping our parent\'s "is split" bit because that bit is\n * the exclusive-or of the UNUSED flags of both children, and our UNUSED\n * flag (which isn\'t ever stored explicitly) has just changed.\n *\n * Note that we shouldn\'t ever need to flip the "is split" bit of our\n * grandparent because we know our buddy is USED so it\'s impossible for our\n * grandparent to be UNUSED (if our buddy chunk was UNUSED, our parent\n * wouldn\'t ever have been split in the first place).\n */\n i = node_for_ptr(ptr, bucket);\n if (i != 0) {\n flip_parent_is_split(i);\n }\n\n /*\n * If the node we got is larger than we need, split it down to the correct\n * size and put the new unused child nodes on the free list in the\n * corresponding bucket. This is done by repeatedly moving to the left\n * child, splitting the parent, and then adding the right child to the free\n * list.\n */\n while (bucket < original_bucket) {\n i = i * 2 + 1;\n bucket++;\n flip_parent_is_split(i);\n list_push(\n buckets$get(bucket),\n changetype(ptr_for_node(i + 1, bucket))\n );\n }\n\n /*\n * Now that we have a memory address, write the block header (just the size\n * of the allocation) and return the address immediately after the header.\n */\n store(ptr, request);\n return ptr + HEADER_SIZE;\n }\n\n return 0;\n}\n\n@global export function __memory_free(ptr: usize): void {\n var bucket: usize, i: usize;\n\n /*\n * Ignore any attempts to free a NULL pointer.\n */\n if (!ptr) {\n return;\n }\n\n /*\n * We were given the address returned by "malloc" so get back to the actual\n * address of the node by subtracting off the size of the block header. Then\n * look up the index of the node corresponding to this address.\n */\n ptr = ptr - HEADER_SIZE;\n bucket = bucket_for_request(load(ptr) + HEADER_SIZE);\n i = node_for_ptr(ptr, bucket);\n\n /*\n * Traverse up to the root node, flipping USED blocks to UNUSED and merging\n * UNUSED buddies together into a single UNUSED parent.\n */\n while (i != 0) {\n /*\n * Change this node from UNUSED to USED. This involves flipping our\n * parent\'s "is split" bit because that bit is the exclusive-or of the\n * UNUSED flags of both children, and our UNUSED flag (which isn\'t ever\n * stored explicitly) has just changed.\n */\n flip_parent_is_split(i);\n\n /*\n * If the parent is now SPLIT, that means our buddy is USED, so don\'t merge\n * with it. Instead, stop the iteration here and add ourselves to the free\n * list for our bucket.\n *\n * Also stop here if we\'re at the current root node, even if that root node\n * is now UNUSED. Root nodes don\'t have a buddy so we can\'t merge with one.\n */\n if (parent_is_split(i) || bucket == bucket_limit) {\n break;\n }\n\n /*\n * If we get here, we know our buddy is UNUSED. In this case we should\n * merge with that buddy and continue traversing up to the root node. We\n * need to remove the buddy from its free list here but we don\'t need to\n * add the merged parent to its free list yet. That will be done once after\n * this loop is finished.\n */\n list_remove(changetype(ptr_for_node(((i - 1) ^ 1) + 1, bucket)));\n i = (i - 1) / 2;\n bucket--;\n }\n\n /*\n * Add ourselves to the free list for our bucket. We add to the back of the\n * list because "malloc" takes from the back of the list and we want a "free"\n * followed by a "malloc" of the same size to ideally use the same address\n * for better memory locality.\n */\n list_push(buckets$get(bucket), changetype(ptr_for_node(i, bucket)));\n}\n',"allocator/emscripten":"/**\n * Emscripten Memory Allocator.\n *\n * Uses Emscripten's exported _malloc and _free implementations, i.e., when linking with\n * Emscripten-compiled programs that already provide these. Differs from 'system' in that their\n * names are prefixed with an underscore.\n *\n * @module std/assembly/allocator/emscripten\n *//***/\n\ndeclare function _malloc(size: usize): usize;\ndeclare function _free(ptr: usize): void;\n\n// Memory allocator interface\n\n@global export function __memory_allocate(size: usize): usize {\n return _malloc(size);\n}\n\n@global export function __memory_free(ptr: usize): void {\n _free(ptr);\n}\n","allocator/system":"/**\n * System Memory Allocator.\n *\n * Uses the environment's malloc and free implementations, i.e., when linking with other C-like\n * programs that already provide these.\n *\n * @module std/assembly/allocator/system\n *//***/\n\ndeclare function malloc(size: usize): usize;\ndeclare function free(ptr: usize): void;\n\n// Memory allocator interface\n\n@global export function __memory_allocate(size: usize): usize {\n return malloc(size);\n}\n\n@global export function __memory_free(ptr: usize): void {\n free(ptr);\n}\n","allocator/tlsf":"/**\n * Two-Level Segregate Fit Memory Allocator.\n *\n * A general purpose dynamic memory allocator specifically designed to meet real-time requirements.\n * Always aligns to 8 bytes.\n *\n * @module std/assembly/allocator/tlsf\n *//***/\n\n// ╒══════════════ Block size interpretation (32-bit) ═════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┼─┴─┴─┴─┴─╫─┴─┴─┤\n// │ | FL │ SB = SL + AL │ ◄─ usize\n// └───────────────────────────────────────────────┴─────────╨─────┘\n// FL: first level, SL: second level, AL: alignment, SB: small block\n\nimport {\n AL_BITS,\n AL_SIZE,\n AL_MASK\n} from \"../internal/allocator\";\n\nconst SL_BITS: u32 = 5;\nconst SL_SIZE: usize = 1 << SL_BITS;\n\nconst SB_BITS: usize = (SL_BITS + AL_BITS);\nconst SB_SIZE: usize = 1 << SB_BITS;\n\nconst FL_BITS: u32 = (sizeof() == sizeof()\n ? 30 // ^= up to 1GB per block\n : 32 // ^= up to 4GB per block\n) - SB_BITS;\n\n// ╒════════════════ Block structure layout (32-bit) ══════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┼─┼─┤\n// │ size │L│F│ ◄─┐ info\n// ╞═══════════════════════════════════════════════════════════╧═╧═╡ │ ┐\n// │ if free: ◄ prev │ ◄─┤ usize\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ if free: next ► │ ◄─┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ ... unused free space >= 0 ... │ │ = 0\n// ├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤ │\n// │ if free: jump ▲ │ ◄─┘\n// └───────────────────────────────────────────────────────────────┘ MIN SIZE ┘\n// F: FREE, L: LEFT_FREE\n\n/** Tag indicating that this block is free. */\nconst FREE: usize = 1 << 0;\n/** Tag indicating that this block's left block is free. */\nconst LEFT_FREE: usize = 1 << 1;\n/** Mask to obtain all tags. */\nconst TAGS: usize = FREE | LEFT_FREE;\n\n/** Block structure. */\n@unmanaged\nclass Block {\n\n /** Info field holding this block's size and tags. */\n info: usize;\n\n /** End offset of the {@link Block#info} field. User data starts here. */\n static readonly INFO: usize = (sizeof() + AL_MASK) & ~AL_MASK;\n\n /** Previous free block, if any. Only valid if free. */\n prev: Block | null;\n /** Next free block, if any. Only valid if free. */\n next: Block | null;\n\n /** Minimum size of a block, excluding {@link Block#info}. */\n static readonly MIN_SIZE: usize = (3 * sizeof() + AL_MASK) & ~AL_MASK;// prev + next + jump\n\n /** Maximum size of a used block, excluding {@link Block#info}. */\n static readonly MAX_SIZE: usize = 1 << (FL_BITS + SB_BITS);\n\n /** Gets this block's left (free) block in memory. */\n get left(): Block {\n assert(this.info & LEFT_FREE); // must be free to contain a jump\n return assert(\n load(changetype(this) - sizeof())\n ); // can't be null\n }\n\n /** Gets this block's right block in memory. */\n get right(): Block {\n assert(this.info & ~TAGS); // can't skip beyond the tail block\n return assert(\n changetype(\n changetype(this) + Block.INFO + (this.info & ~TAGS)\n )\n ); // can't be null\n }\n}\n\n// ╒════════════════ Root structure layout (32-bit) ═══════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┤ ┐\n// │ 0 | flMap S│ ◄────┐\n// ╞═══════════════════════════════════════════════════════════════╡ │\n// │ slMap[0] S │ ◄─┐ │\n// ├───────────────────────────────────────────────────────────────┤ │ │\n// │ slMap[1] │ ◄─┤ │\n// ├───────────────────────────────────────────────────────────────┤ u32 │\n// │ ... │ ◄─┤ │\n// ├───────────────────────────────────────────────────────────────┤ │ │\n// │ slMap[22] P │ ◄─┘ │\n// ╞═══════════════════════════════════════════════════════════════╡ usize\n// │ head[0] │ ◄────┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ ... │ ◄────┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ head[736] │ ◄────┤\n// ╞═══════════════════════════════════════════════════════════════╡ │\n// │ tailRef │ ◄────┘\n// └───────────────────────────────────────────────────────────────┘ SIZE ┘\n// S: Small blocks map, P: Possibly padded if 64-bit\n\nassert((1 << SL_BITS) <= 32); // second level must fit into 32 bits\n\n/** Root structure. */\n@unmanaged\nclass Root {\n\n /** First level bitmap. */\n flMap: usize = 0;\n\n /** Start offset of second level maps. */\n private static readonly SL_START: usize = sizeof();\n\n // Using *one* SL map per *FL bit*\n\n /** Gets the second level map for the specified first level. */\n getSLMap(fl: usize): u32 {\n assert(fl < FL_BITS); // fl out of range\n return load(changetype(this) + fl * 4, Root.SL_START);\n }\n\n /** Sets the second level map for the specified first level. */\n setSLMap(fl: usize, value: u32): void {\n assert(fl < FL_BITS); // fl out of range\n store(changetype(this) + fl * 4, value, Root.SL_START);\n }\n\n /** End offset of second level maps. */\n private static readonly SL_END: usize = Root.SL_START + FL_BITS * 4;\n\n // Using *number bits per SL* heads per *FL bit*\n\n /** Start offset of FL/SL heads. */\n private static readonly HL_START: usize = (Root.SL_END + AL_MASK) & ~AL_MASK;\n\n /** Gets the head of the specified first and second level index. */\n getHead(fl: usize, sl: u32): Block | null {\n assert(fl < FL_BITS); // fl out of range\n assert(sl < SL_SIZE); // sl out of range\n return changetype(load(\n changetype(this) + (fl * SL_SIZE + sl) * sizeof()\n , Root.HL_START));\n }\n\n /** Sets the head of the specified first and second level index. */\n setHead(fl: usize, sl: u32, value: Block | null): void {\n assert(fl < FL_BITS); // fl out of range\n assert(sl < SL_SIZE); // sl out of range\n store(\n changetype(this) + (fl * SL_SIZE + sl) * sizeof()\n , changetype(value)\n , Root.HL_START);\n }\n\n /** End offset of FL/SL heads. */\n private static readonly HL_END: usize = (\n Root.HL_START + FL_BITS * SL_SIZE * sizeof()\n );\n\n get tailRef(): usize { return load(0, Root.HL_END); }\n set tailRef(value: usize) { store(0, value, Root.HL_END); }\n\n /** Total size of the {@link Root} structure. */\n static readonly SIZE: usize = Root.HL_END + sizeof();\n\n /** Inserts a previously used block back into the free list. */\n insert(block: Block): void {\n // check as much as possible here to prevent invalid free blocks\n assert(block); // cannot be null\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free\n var size: usize;\n assert(\n (size = block.info & ~TAGS) >= Block.MIN_SIZE && size < Block.MAX_SIZE\n ); // must be valid, not necessary to compute yet if noAssert=true\n\n var right: Block = assert(block.right); // can't be null\n var rightInfo = right.info;\n\n // merge with right block if also free\n if (rightInfo & FREE) {\n this.remove(right);\n block.info = (blockInfo += Block.INFO + (rightInfo & ~TAGS));\n right = block.right;\n rightInfo = right.info;\n // jump is set below\n }\n\n // merge with left block if also free\n if (blockInfo & LEFT_FREE) {\n let left: Block = assert(block.left); // can't be null\n let leftInfo = left.info;\n assert(leftInfo & FREE); // must be free according to tags\n this.remove(left);\n left.info = (leftInfo += Block.INFO + (blockInfo & ~TAGS));\n block = left;\n blockInfo = leftInfo;\n // jump is set below\n }\n\n right.info = rightInfo | LEFT_FREE;\n this.setJump(block, right);\n // right is no longer used now, hence rightInfo is not synced\n\n size = blockInfo & ~TAGS;\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n\n // mapping_insert\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n\n // perform insertion\n var head = this.getHead(fl, sl);\n block.prev = null;\n block.next = head;\n if (head) head.prev = block;\n this.setHead(fl, sl, block);\n\n // update first and second level maps\n this.flMap |= (1 << fl);\n this.setSLMap(fl, this.getSLMap(fl) | (1 << sl));\n }\n\n /**\n * Removes a free block from FL/SL maps. Does not alter left/jump because it\n * is likely that splitting is performed afterwards, invalidating any changes\n * again.\n */\n private remove(block: Block): void {\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free\n var size = blockInfo & ~TAGS;\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n\n // mapping_insert\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n\n // link previous and next free block\n var prev = block.prev;\n var next = block.next;\n if (prev) prev.next = next;\n if (next) next.prev = prev;\n\n // update head if we are removing it\n if (block == this.getHead(fl, sl)) {\n this.setHead(fl, sl, next);\n\n // clear second level map if head is empty now\n if (!next) {\n let slMap = this.getSLMap(fl);\n this.setSLMap(fl, slMap &= ~(1 << sl));\n\n // clear first level map if second level is empty now\n if (!slMap) this.flMap &= ~(1 << fl);\n }\n }\n }\n\n /** Searches for a free block of at least the specified size. */\n search(size: usize): Block | null {\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE);\n\n // mapping_search\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n // (*) size += (1 << (fls(size) - SL_BITS)) - 1;\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n // (*) instead of rounding up, use next second level list for better fit\n if (sl < SL_SIZE - 1) ++sl;\n else ++fl, sl = 0;\n }\n\n // search second level\n var slMap = this.getSLMap(fl) & (~0 << sl);\n var head: Block | null;\n if (!slMap) {\n // search next larger first level\n let flMap = this.flMap & (~0 << (fl + 1));\n if (!flMap) {\n head = null;\n } else {\n fl = ffs(flMap);\n slMap = assert(this.getSLMap(fl)); // can't be zero if fl points here\n head = this.getHead(fl, ffs(slMap));\n }\n } else {\n head = this.getHead(fl, ffs(slMap));\n }\n return head;\n }\n\n /** Links a free left with its right block in memory. */\n private setJump(left: Block, right: Block): void {\n assert(left.info & FREE); // must be free\n assert(left.right == right); // right block must match\n assert(right.info & LEFT_FREE); // right block must be tagged as LEFT_FREE\n store(\n changetype(right) - sizeof()\n , left); // last word in left block's (free) data region\n }\n\n /**\n * Uses the specified free block, removing it from internal maps and\n * splitting it if possible, and returns its data pointer.\n */\n use(block: Block, size: usize): usize {\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free so we can use it\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n assert(!(size & AL_MASK)); // size must be aligned so the new block is\n\n this.remove(block);\n\n // split if the block can hold another MIN_SIZE block\n var remaining = (blockInfo & ~TAGS) - size;\n if (remaining >= Block.INFO + Block.MIN_SIZE) {\n block.info = size | (blockInfo & LEFT_FREE); // also discards FREE\n\n let spare = changetype(\n changetype(block) + Block.INFO + size\n );\n spare.info = (remaining - Block.INFO) | FREE; // not LEFT_FREE\n this.insert(spare); // also sets jump\n\n // otherwise tag block as no longer FREE and right as no longer LEFT_FREE\n } else {\n block.info = blockInfo & ~FREE;\n let right: Block = assert(block.right); // can't be null (tail)\n right.info &= ~LEFT_FREE;\n }\n\n return changetype(block) + Block.INFO;\n }\n\n /** Adds more memory to the pool. */\n addMemory(start: usize, end: usize): bool {\n assert(start <= end);\n assert(!(start & AL_MASK)); // must be aligned\n assert(!(end & AL_MASK)); // must be aligned\n\n var tailRef = this.tailRef;\n var tailInfo: usize = 0;\n if (tailRef) {\n assert(start >= tailRef + sizeof()); // starts after tail\n\n // merge with current tail if adjacent\n if (start - Block.INFO == tailRef) {\n start -= Block.INFO;\n tailInfo = changetype(tailRef).info;\n }\n\n } else {\n assert(start >= changetype(this) + Root.SIZE); // starts after root\n }\n\n // check if size is large enough for a free block and the tail block\n var size = end - start;\n if (size < Block.INFO + Block.MIN_SIZE + Block.INFO) {\n return false;\n }\n\n // left size is total minus its own and the zero-length tail's header\n var leftSize = size - 2 * Block.INFO;\n var left = changetype(start);\n left.info = leftSize | FREE | (tailInfo & LEFT_FREE);\n left.prev = null;\n left.next = null;\n\n // tail is a zero-length used block\n var tail = changetype(start + size - Block.INFO);\n tail.info = 0 | LEFT_FREE;\n this.tailRef = changetype(tail);\n\n this.insert(left); // also merges with free left before tail / sets jump\n\n return true;\n }\n}\n\n/** Determines the first (LSB to MSB) set bit's index of a word. */\nfunction ffs(word: T): T {\n assert(word != 0); // word cannot be 0\n return ctz(word); // differs from ffs only for 0\n}\n\n/** Determines the last (LSB to MSB) set bit's index of a word. */\nfunction fls(word: T): T {\n assert(word != 0); // word cannot be 0\n const inv: T = (sizeof() << 3) - 1;\n return inv - clz(word);\n}\n\n/** Reference to the initialized {@link Root} structure, once initialized. */\nvar ROOT: Root = changetype(0);\n\n// Memory allocator interface\n\n/** Allocates a chunk of memory. */\n@global export function __memory_allocate(size: usize): usize {\n\n // initialize if necessary\n var root = ROOT;\n if (!root) {\n let rootOffset = (HEAP_BASE + AL_MASK) & ~AL_MASK;\n let pagesBefore = memory.size();\n let pagesNeeded = ((((rootOffset + Root.SIZE) + 0xffff) & ~0xffff) >>> 16);\n if (pagesNeeded > pagesBefore && memory.grow(pagesNeeded - pagesBefore) < 0) unreachable();\n ROOT = root = changetype(rootOffset);\n root.tailRef = 0;\n root.flMap = 0;\n for (let fl: usize = 0; fl < FL_BITS; ++fl) {\n root.setSLMap(fl, 0);\n for (let sl: u32 = 0; sl < SL_SIZE; ++sl) {\n root.setHead(fl, sl, null);\n }\n }\n root.addMemory((rootOffset + Root.SIZE + AL_MASK) & ~AL_MASK, memory.size() << 16);\n }\n\n // search for a suitable block\n if (size > Block.MAX_SIZE) unreachable();\n\n // 32-bit MAX_SIZE is 1 << 30 and itself aligned, hence the following can't overflow MAX_SIZE\n size = max((size + AL_MASK) & ~AL_MASK, Block.MIN_SIZE);\n\n var block = root.search(size);\n if (!block) {\n\n // request more memory\n let pagesBefore = memory.size();\n let pagesNeeded = (((size + 0xffff) & ~0xffff) >>> 16);\n let pagesWanted = max(pagesBefore, pagesNeeded); // double memory\n if (memory.grow(pagesWanted) < 0) {\n if (memory.grow(pagesNeeded) < 0) {\n unreachable(); // out of memory\n }\n }\n let pagesAfter = memory.size();\n root.addMemory(pagesBefore << 16, pagesAfter << 16);\n block = assert(root.search(size)); // must be found now\n }\n\n assert((block.info & ~TAGS) >= size);\n return root.use(block, size);\n}\n\n/** Frees the chunk of memory at the specified address. */\n@global export function __memory_free(data: usize): void {\n if (data) {\n let root = ROOT;\n if (root) {\n let block = changetype(data - Block.INFO);\n let blockInfo = block.info;\n assert(!(blockInfo & FREE)); // must be used\n block.info = blockInfo | FREE;\n root.insert(changetype(data - Block.INFO));\n }\n }\n}\n\n@global export function __memory_reset(): void {\n unreachable();\n}\n",array:'import {\n MAX_BLENGTH,\n HEADER_SIZE,\n allocateUnsafe,\n reallocateUnsafe,\n LOAD,\n STORE\n} from "./internal/arraybuffer";\n\nimport {\n allocateUnsafe as allocateUnsafeString,\n freeUnsafe as freeUnsafeString,\n copyUnsafe as copyUnsafeString\n} from "./internal/string";\n\nimport {\n COMPARATOR,\n SORT\n} from "./internal/sort";\n\nimport {\n itoa,\n dtoa,\n itoa_stream,\n dtoa_stream,\n MAX_DOUBLE_LENGTH\n} from "./internal/number";\n\nimport {\n isArray as builtin_isArray\n} from "./builtins";\n\nexport class Array {\n [key: number]: T; // compatibility only\n\n /* @internal */ buffer_: ArrayBuffer;\n /* @internal */ length_: i32;\n\n @inline static isArray(value: U): bool {\n return builtin_isArray(value) && value !== null;\n }\n\n constructor(length: i32 = 0) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length > MAX_LENGTH) throw new RangeError("Invalid array length");\n var byteLength = length << alignof();\n var buffer = allocateUnsafe(byteLength);\n this.buffer_ = buffer;\n this.length_ = length;\n memory.fill(\n changetype(buffer) + HEADER_SIZE,\n 0,\n byteLength\n );\n }\n\n @inline\n get length(): i32 {\n return this.length_;\n }\n\n set length(length: i32) {\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n if (length > capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length > MAX_LENGTH) throw new RangeError("Invalid array length");\n buffer = reallocateUnsafe(buffer, length << alignof());\n this.buffer_ = buffer;\n }\n this.length_ = length;\n }\n\n every(callbackfn: (element: T, index: i32, array: Array) => bool): bool {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n if (!callbackfn(LOAD(this.buffer_, index), index, this)) return false;\n }\n return true;\n }\n\n findIndex(predicate: (element: T, index: i32, array: Array) => bool): i32 {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n if (predicate(LOAD(this.buffer_, index), index, this)) return index;\n }\n return -1;\n }\n\n @operator("[]")\n private __get(index: i32): T {\n var buffer = this.buffer_;\n return index < (buffer.byteLength >>> alignof())\n ? LOAD(buffer, index)\n : unreachable();\n }\n\n @operator("{}")\n private __unchecked_get(index: i32): T {\n return LOAD(this.buffer_, index);\n }\n\n @operator("[]=")\n private __set(index: i32, value: T): void {\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n if (index >= capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (index >= MAX_LENGTH) throw new Error("Invalid array length");\n buffer = reallocateUnsafe(buffer, (index + 1) << alignof());\n this.buffer_ = buffer;\n this.length_ = index + 1;\n }\n STORE(buffer, index, value);\n if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line\n }\n\n @operator("{}=")\n private __unchecked_set(index: i32, value: T): void {\n STORE(this.buffer_, index, value);\n if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line\n }\n\n fill(value: T, start: i32 = 0, end: i32 = i32.MAX_VALUE): this {\n var buffer = this.buffer_;\n var len = this.length_;\n\n start = start < 0 ? max(len + start, 0) : min(start, len);\n end = end < 0 ? max(len + end, 0) : min(end, len);\n\n if (sizeof() == 1) {\n if (start < end) {\n memory.fill(\n changetype(buffer) + start + HEADER_SIZE,\n value,\n (end - start)\n );\n }\n } else {\n for (; start < end; ++start) {\n STORE(buffer, start, value);\n }\n }\n return this;\n }\n\n @inline\n includes(searchElement: T, fromIndex: i32 = 0): bool {\n return this.indexOf(searchElement, fromIndex) >= 0;\n }\n\n indexOf(searchElement: T, fromIndex: i32 = 0): i32 {\n var length = this.length_;\n if (length == 0 || fromIndex >= length) return -1;\n if (fromIndex < 0) fromIndex = max(length + fromIndex, 0);\n var buffer = this.buffer_;\n while (fromIndex < length) {\n if (LOAD(buffer, fromIndex) == searchElement) return fromIndex;\n ++fromIndex;\n }\n return -1;\n }\n\n lastIndexOf(searchElement: T, fromIndex: i32 = this.length_): i32 {\n var length = this.length_;\n if (length == 0) return -1;\n if (fromIndex < 0) fromIndex = length + fromIndex; // no need to clamp\n else if (fromIndex >= length) fromIndex = length - 1;\n var buffer = this.buffer_;\n while (fromIndex >= 0) { // ^\n if (LOAD(buffer, fromIndex) == searchElement) return fromIndex;\n --fromIndex;\n }\n return -1;\n }\n\n push(element: T): i32 {\n var length = this.length_;\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n var newLength = length + 1; // safe only if length is checked\n if (length >= capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length >= MAX_LENGTH) throw new Error("Invalid array length");\n buffer = reallocateUnsafe(buffer, newLength << alignof());\n this.buffer_ = buffer;\n }\n this.length_ = newLength;\n STORE(buffer, length, element);\n if (isManaged()) __gc_link(changetype(this), changetype(element)); // tslint:disable-line\n return newLength;\n }\n\n concat(items: Array): Array {\n var thisLen = this.length_;\n var otherLen = select(0, items.length_, items === null);\n var outLen = thisLen + otherLen;\n var out = new Array(outLen);\n\n if (thisLen) {\n memory.copy(\n changetype(out.buffer_) + HEADER_SIZE,\n changetype(this.buffer_) + HEADER_SIZE,\n thisLen << alignof()\n );\n }\n if (otherLen) {\n memory.copy(\n changetype(out.buffer_) + HEADER_SIZE + (thisLen << alignof()),\n changetype(items.buffer_) + HEADER_SIZE,\n otherLen << alignof()\n );\n }\n return out;\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): this {\n var buffer = this.buffer_;\n var len = this.length_;\n\n end = min(end, len);\n var to = target < 0 ? max(len + target, 0) : min(target, len);\n var from = start < 0 ? max(len + start, 0) : min(start, len);\n var last = end < 0 ? max(len + end, 0) : min(end, len);\n var count = min(last - from, len - to);\n\n if (from < to && to < (from + count)) {\n from += count - 1;\n to += count - 1;\n while (count) {\n STORE(buffer, to, LOAD(buffer, from));\n --from, --to, --count;\n }\n } else {\n memory.copy(\n changetype(buffer) + HEADER_SIZE + (to << alignof()),\n changetype(buffer) + HEADER_SIZE + (from << alignof()),\n count << alignof()\n );\n }\n return this;\n }\n\n pop(): T {\n var length = this.length_;\n if (length < 1) throw new RangeError("Array is empty");\n var element = LOAD(this.buffer_, --length);\n this.length_ = length;\n return element;\n }\n\n forEach(callbackfn: (value: T, index: i32, array: Array) => void): void {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n callbackfn(LOAD(this.buffer_, index), index, this);\n }\n }\n\n map(callbackfn: (value: T, index: i32, array: Array) => U): Array {\n var length = this.length_;\n var result = new Array(length);\n var buffer = result.buffer_;\n for (let index = 0; index < min(length, this.length_); ++index) {\n STORE(buffer, index, callbackfn(LOAD(this.buffer_, index), index, this));\n }\n return result;\n }\n\n filter(callbackfn: (value: T, index: i32, array: Array) => bool): Array {\n var result = new Array();\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n let value = LOAD(this.buffer_, index);\n if (callbackfn(value, index, this)) result.push(value);\n }\n return result;\n }\n\n reduce(\n callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U,\n initialValue: U\n ): U {\n var accum = initialValue;\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n accum = callbackfn(accum, LOAD(this.buffer_, index), index, this);\n }\n return accum;\n }\n\n reduceRight(\n callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U,\n initialValue: U\n ): U {\n var accum = initialValue;\n for (let index = this.length_ - 1; index >= 0; --index) {\n accum = callbackfn(accum, LOAD(this.buffer_, index), index, this);\n }\n return accum;\n }\n\n shift(): T {\n var length = this.length_;\n if (length < 1) throw new RangeError("Array is empty");\n var buffer = this.buffer_;\n var element = LOAD(buffer, 0);\n var lastIndex = length - 1;\n memory.copy(\n changetype(buffer) + HEADER_SIZE,\n changetype(buffer) + HEADER_SIZE + sizeof(),\n lastIndex << alignof()\n );\n STORE(buffer, lastIndex, null);\n this.length_ = lastIndex;\n return element;\n }\n\n some(callbackfn: (element: T, index: i32, array: Array) => bool): bool {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n if (callbackfn(LOAD(this.buffer_, index), index, this)) return true;\n }\n return false;\n }\n\n unshift(element: T): i32 {\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n var length = this.length_;\n var newLength = length + 1; // safe only if length is checked\n if (length >= capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length >= MAX_LENGTH) throw new Error("Invalid array length");\n buffer = reallocateUnsafe(buffer, newLength << alignof());\n capacity = buffer.byteLength >>> alignof();\n this.buffer_ = buffer;\n }\n memory.copy(\n changetype(buffer) + HEADER_SIZE + sizeof(),\n changetype(buffer) + HEADER_SIZE,\n (capacity - 1) << alignof()\n );\n STORE(buffer, 0, element);\n this.length_ = newLength;\n if (isManaged()) __gc_link(changetype(this), changetype(element)); // tslint:disable-line\n return newLength;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Array {\n var len = this.length_;\n begin = begin < 0 ? max(begin + len, 0) : min(begin, len);\n end = end < 0 ? max(end + len, 0) : min(end, len);\n len = end - begin;\n var sliced = new Array(len);\n if (len) {\n memory.copy(\n changetype(sliced.buffer_) + HEADER_SIZE,\n changetype(this.buffer_) + HEADER_SIZE + (begin << alignof()),\n len << alignof()\n );\n }\n return sliced;\n }\n\n splice(start: i32, deleteCount: i32 = i32.MAX_VALUE): Array {\n var length = this.length_;\n start = start < 0 ? max(length + start, 0) : min(start, length);\n deleteCount = max(min(deleteCount, length - start), 0);\n var buffer = this.buffer_;\n var spliced = new Array(deleteCount);\n var source = changetype(buffer) + HEADER_SIZE + (start << alignof());\n memory.copy(\n changetype(spliced.buffer_) + HEADER_SIZE,\n source,\n deleteCount << alignof()\n );\n var offset = start + deleteCount;\n if (length != offset) {\n memory.copy(\n source,\n changetype(buffer) + HEADER_SIZE + (offset << alignof()),\n (length - offset) << alignof()\n );\n }\n this.length_ = length - deleteCount;\n return spliced;\n }\n\n reverse(): Array {\n var buffer = this.buffer_;\n for (let front = 0, back = this.length_ - 1; front < back; ++front, --back) {\n let temp = LOAD(buffer, front);\n STORE(buffer, front, LOAD(buffer, back));\n STORE(buffer, back, temp);\n }\n return this;\n }\n\n sort(comparator: (a: T, b: T) => i32 = COMPARATOR()): this {\n // TODO remove this when flow will allow trackcing null\n assert(comparator); // The comparison function must be a function\n\n var length = this.length_;\n if (length <= 1) return this;\n var buffer = this.buffer_;\n if (length == 2) {\n let a = LOAD(buffer, 1); // a = arr[1]\n let b = LOAD(buffer, 0); // b = arr[0]\n if (comparator(a, b) < 0) {\n STORE(buffer, 1, b); // arr[1] = b;\n STORE(buffer, 0, a); // arr[0] = a;\n }\n return this;\n }\n SORT(buffer, 0, length, comparator);\n return this;\n }\n\n join(separator: string = ","): string {\n var lastIndex = this.length_ - 1;\n if (lastIndex < 0) return "";\n var result = "";\n var value: T;\n var buffer = this.buffer_;\n var sepLen = separator.length;\n var hasSeparator = sepLen != 0;\n if (value instanceof bool) {\n if (!lastIndex) return select("true", "false", LOAD(buffer, 0));\n\n let valueLen = 5; // max possible length of element len("false")\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n valueLen = 4 + (!value);\n copyUnsafeString(result, offset, select("true", "false", value), 0, valueLen);\n offset += valueLen;\n if (hasSeparator) {\n copyUnsafeString(result, offset, changetype(separator), 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n valueLen = 4 + (!value);\n copyUnsafeString(result, offset, select("true", "false", value), 0, valueLen);\n offset += valueLen;\n\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else if (isInteger()) {\n if (!lastIndex) return changetype(itoa(LOAD(buffer, 0)));\n\n const valueLen = (sizeof() <= 4 ? 10 : 20) + isSigned();\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n offset += itoa_stream(changetype(result), offset, value);\n if (hasSeparator) {\n copyUnsafeString(result, offset, separator, 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n offset += itoa_stream(changetype(result), offset, value);\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else if (isFloat()) {\n if (!lastIndex) return changetype(dtoa(LOAD(buffer, 0)));\n\n const valueLen = MAX_DOUBLE_LENGTH;\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n offset += dtoa_stream(changetype(result), offset, value);\n if (hasSeparator) {\n copyUnsafeString(result, offset, separator, 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n offset += dtoa_stream(changetype(result), offset, value);\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else if (isString()) {\n if (!lastIndex) return LOAD(buffer, 0);\n\n let estLen = 0;\n for (let i = 0, len = lastIndex + 1; i < len; ++i) {\n estLen += LOAD(buffer, i).length;\n }\n let offset = 0;\n let result = allocateUnsafeString(estLen + sepLen * lastIndex);\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n if (value) {\n let valueLen = value.length; // tslint:disable-line:no-unsafe-any\n copyUnsafeString(result, offset, value, 0, valueLen); // tslint:disable-line:no-unsafe-any\n offset += valueLen; // tslint:disable-line:no-unsafe-any\n }\n if (hasSeparator) {\n copyUnsafeString(result, offset, separator, 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n if (value) {\n let valueLen = value.length; // tslint:disable-line:no-unsafe-any\n copyUnsafeString(result, offset, value, 0, valueLen); // tslint:disable-line:no-unsafe-any\n }\n return result;\n } else if (isArray()) {\n if (!lastIndex) {\n value = LOAD(buffer, 0);\n return value ? value.join(separator) : ""; // tslint:disable-line:no-unsafe-any\n }\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n if (value) result += value.join(separator); // tslint:disable-line:no-unsafe-any\n if (hasSeparator) result += separator;\n }\n value = LOAD(buffer, lastIndex);\n if (value) result += value.join(separator); // tslint:disable-line:no-unsafe-any\n return result;\n } else if (isReference()) { // References\n if (!lastIndex) return "[object Object]";\n const valueLen = 15; // max possible length of element len("[object Object]")\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n if (value) {\n copyUnsafeString(result, offset, changetype("[object Object]"), 0, valueLen);\n offset += valueLen;\n }\n if (hasSeparator) {\n copyUnsafeString(result, offset, changetype(separator), 0, sepLen);\n offset += sepLen;\n }\n }\n if (LOAD(buffer, lastIndex)) {\n copyUnsafeString(result, offset, changetype("[object Object]"), 0, valueLen);\n offset += valueLen;\n }\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else {\n assert(false); // Unsupported generic typename\n }\n }\n\n @inline\n toString(): string {\n return this.join();\n }\n\n private __gc(): void {\n var buffer = this.buffer_;\n __gc_mark(changetype(buffer)); // tslint:disable-line\n if (isManaged()) {\n let offset: usize = 0;\n let end = this.length_ << alignof();\n while (offset < end) {\n __gc_mark(load(changetype(buffer) + offset, HEADER_SIZE)); // tslint:disable-line\n offset += sizeof();\n }\n }\n }\n}\n',arraybuffer:'import {\n HEADER_SIZE,\n MAX_BLENGTH,\n allocateUnsafe\n} from "./internal/arraybuffer";\n\n@sealed\nexport class ArrayBuffer {\n\n readonly byteLength: i32; // capped to [0, MAX_LENGTH]\n\n // @unsafe\n get data(): usize { return changetype(this) + HEADER_SIZE; }\n\n constructor(length: i32, unsafe: bool = false) {\n if (length > MAX_BLENGTH) throw new RangeError("Invalid array buffer length");\n var buffer = allocateUnsafe(length);\n if (!unsafe) memory.fill(changetype(buffer) + HEADER_SIZE, 0, length);\n return buffer;\n }\n\n slice(begin: i32 = 0, end: i32 = MAX_BLENGTH): ArrayBuffer {\n var len = this.byteLength;\n if (begin < 0) begin = max(len + begin, 0);\n else begin = min(begin, len);\n if (end < 0) end = max(len + end, 0);\n else end = min(end, len);\n var newLen = max(end - begin, 0);\n var buffer = allocateUnsafe(newLen);\n memory.copy(changetype(buffer) + HEADER_SIZE, changetype(this) + HEADER_SIZE + begin, newLen);\n return buffer;\n }\n\n toString(): string {\n return "[object ArrayBuffer]";\n }\n}\n',"bindings/Date":"export declare function UTC(\n // NOTE: Using i32 below saves us a f64.convert_s instruction and moves the responsibility for\n // converting the value to the WASM/JS boundary.\n year: i32,\n month: i32,\n day: i32,\n hour: i32,\n minute: i32,\n second: i32,\n millisecond: f64\n): f64;\nexport declare function now(): f64;\n","bindings/Math":"export declare const E: f64;\nexport declare const LN2: f64;\nexport declare const LN10: f64;\nexport declare const LOG2E: f64;\nexport declare const LOG10E: f64;\nexport declare const PI: f64;\nexport declare const SQRT1_2: f64;\nexport declare const SQRT2: f64;\n\nexport declare function abs(x: f64): f64;\nexport declare function acos(x: f64): f64;\nexport declare function acosh(x: f64): f64;\nexport declare function asin(x: f64): f64;\nexport declare function asinh(x: f64): f64;\nexport declare function atan(x: f64): f64;\nexport declare function atan2(y: f64, x: f64): f64;\nexport declare function atanh(x: f64): f64;\nexport declare function cbrt(x: f64): f64;\nexport declare function ceil(x: f64): f64;\nexport declare function clz32(x: f64): f64;\nexport declare function cos(x: f64): f64;\nexport declare function cosh(x: f64): f64;\nexport declare function exp(x: f64): f64;\nexport declare function expm1(x: f64): f64;\nexport declare function floor(x: f64): f64;\nexport declare function fround(x: f64): f32;\nexport declare function hypot(value1: f64, value2: f64): f64; // TODO: rest\nexport declare function imul(a: f64, b: f64): f64;\nexport declare function log(x: f64): f64;\nexport declare function log10(x: f64): f64;\nexport declare function log1p(x: f64): f64;\nexport declare function log2(x: f64): f64;\nexport declare function max(value1: f64, value2: f64): f64; // TODO: rest\nexport declare function min(value1: f64, value2: f64): f64; // TODO: rest\nexport declare function pow(base: f64, exponent: f64): f64;\nexport declare function random(): f64;\nexport declare function round(x: f64): f64;\nexport declare function sign(x: f64): f64;\nexport declare function sin(x: f64): f64;\nexport declare function sinh(x: f64): f64;\nexport declare function sqrt(x: f64): f64;\nexport declare function tan(x: f64): f64;\nexport declare function tanh(x: f64): f64;\nexport declare function trunc(x: f64): f64;\n",builtins:"/* tslint:disable */\n\n@builtin @inline export const NaN: f64 = 0 / 0;\n@builtin @inline export const Infinity: f64 = 1 / 0;\n\n@builtin export declare function isInteger(value?: T): bool;\n@builtin export declare function isFloat(value?: T): bool;\n@builtin export declare function isSigned(value?: T): bool;\n@builtin export declare function isReference(value?: T): bool;\n@builtin export declare function isString(value?: T): bool;\n@builtin export declare function isArray(value?: T): bool;\n@builtin export declare function isDefined(expression: void): bool;\n@builtin export declare function isConstant(expression: void): bool;\n@builtin export declare function isManaged(value?: T): bool;\n@inline export function isNaN(value: T): bool { return value != value; }\n@inline export function isFinite(value: T): bool { return value - value == 0; }\n\n@builtin export declare function clz(value: T): T;\n@builtin export declare function ctz(value: T): T;\n@builtin export declare function popcnt(value: T): T;\n@builtin export declare function rotl(value: T, shift: T): T;\n@builtin export declare function rotr(value: T, shift: T): T;\n@builtin export declare function abs(value: T): T;\n@builtin export declare function max(left: T, right: T): T;\n@builtin export declare function min(left: T, right: T): T;\n@builtin export declare function ceil(value: T): T;\n@builtin export declare function floor(value: T): T;\n@builtin export declare function copysign(left: T, right: T): T;\n@builtin export declare function nearest(value: T): T;\n@builtin export declare function reinterpret(value: void): T;\n@builtin export declare function sqrt(value: T): T;\n@builtin export declare function trunc(value: T): T;\n@builtin export declare function load(offset: usize, constantOffset?: usize): T;\n@builtin export declare function store(offset: usize, value: void, constantOffset?: usize): void;\n@builtin export declare function sizeof(): usize; // | u32 / u64\n@builtin export declare function alignof(): usize; // | u32 / u64\n@builtin export declare function offsetof(fieldName?: string): usize; // | u32 / u64\n@builtin export declare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n@builtin export declare function unreachable(): void;\n@builtin export declare function changetype(value: void): T;\n@builtin export declare function assert(isTrueish: T, message?: string): T;\n@builtin export declare function unchecked(expr: T): T;\n@builtin export declare function call_indirect(target: void, ...args: void[]): T;\n@builtin export declare function instantiate(...args: void[]): T;\n\n@builtin export declare function i8(value: void): i8;\nexport namespace i8 {\n export const MIN_VALUE: i8 = -128;\n export const MAX_VALUE: i8 = 127;\n}\n\n@builtin export declare function i16(value: void): i16;\nexport namespace i16 {\n export const MIN_VALUE: i16 = -32768;\n export const MAX_VALUE: i16 = 32767;\n}\n\n@builtin export declare function i32(value: void): i32;\nexport namespace i32 {\n export const MIN_VALUE: i32 = -2147483648;\n export const MAX_VALUE: i32 = 2147483647;\n @builtin export declare function clz(value: i32): i32;\n @builtin export declare function ctz(value: i32): i32;\n @builtin export declare function popcnt(value: i32): i32;\n @builtin export declare function rotl(value: i32, shift: i32): i32;\n @builtin export declare function rotr(value: i32, shift: i32): i32;\n @builtin export declare function reinterpret_f32(value: f32): i32;\n @builtin export declare function load8_s(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load8_u(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load16_s(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load16_u(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function store8(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function store16(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function store(offset: usize, value: i32, constantOffset?: usize): void;\n}\n\n@builtin export declare function i64(value: void): i64;\nexport namespace i64 {\n export const MIN_VALUE: i64 = -9223372036854775808;\n export const MAX_VALUE: i64 = 9223372036854775807;\n @builtin export declare function clz(value: i64): i64;\n @builtin export declare function ctz(value: i64): i64;\n @builtin export declare function load8_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load8_u(offset: usize, constantOffset?: usize): u64;\n @builtin export declare function load16_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load16_u(offset: usize, constantOffset?: usize): u64;\n @builtin export declare function load32_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load32_u(offset: usize, constantOffset?: usize): u64;\n @builtin export declare function load(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function popcnt(value: i64): i64;\n @builtin export declare function rotl(value: i64, shift: i64): i64;\n @builtin export declare function rotr(value: i64, shift: i64): i64;\n @builtin export declare function reinterpret_f64(value: f64): i64;\n @builtin export declare function store8(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store16(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store32(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store(offset: usize, value: i64, constantOffset?: usize): void;\n}\n\n@builtin export declare function isize(value: void): isize;\nexport namespace isize {\n export const MIN_VALUE: isize = sizeof() == sizeof()\n ? -2147483648\n : -9223372036854775808;\n export const MAX_VALUE: isize = sizeof() == sizeof()\n ? 2147483647\n : 9223372036854775807;\n}\n\n@builtin export declare function u8(value: void): u8;\nexport namespace u8 {\n export const MIN_VALUE: u8 = 0;\n export const MAX_VALUE: u8 = 255;\n}\n\n@builtin export declare function u16(value: void): u16;\nexport namespace u16 {\n export const MIN_VALUE: u16 = 0;\n export const MAX_VALUE: u16 = 65535;\n}\n\n@builtin export declare function u32(value: void): u32;\nexport namespace u32 {\n export const MIN_VALUE: u32 = 0;\n export const MAX_VALUE: u32 = 4294967295;\n}\n\n@builtin export declare function u64(value: void): u64;\nexport namespace u64 {\n export const MIN_VALUE: u64 = 0;\n export const MAX_VALUE: u64 = 18446744073709551615;\n}\n\n@builtin export declare function usize(value: void): usize;\nexport namespace usize {\n export const MIN_VALUE: usize = 0;\n export const MAX_VALUE: usize = sizeof() == sizeof()\n ? 4294967295\n : 18446744073709551615;\n}\n\n@builtin export declare function bool(value: void): bool;\nexport namespace bool {\n export const MIN_VALUE: bool = false;\n export const MAX_VALUE: bool = true;\n}\n\n@builtin export declare function f32(value: void): f32;\nexport namespace f32 {\n export const EPSILON = reinterpret(0x34000000); // 0x1p-23f\n export const MIN_VALUE = reinterpret(0x00000001); // 0x0.000001p+0f\n export const MAX_VALUE = reinterpret(0x7F7FFFFF); // 0x1.fffffep+127f\n export const MIN_NORMAL_VALUE = reinterpret(0x00800000); // 0x1p-126f\n export const MIN_SAFE_INTEGER: f32 = -16777215;\n export const MAX_SAFE_INTEGER: f32 = 16777215;\n @builtin export declare function abs(value: f32): f32;\n @builtin export declare function ceil(value: f32): f32;\n @builtin export declare function copysign(x: f32, y: f32): f32;\n @builtin export declare function floor(value: f32): f32;\n @builtin export declare function load(offset: usize, constantOffset?: usize): f32;\n @builtin export declare function max(left: f32, right: f32): f32;\n @builtin export declare function min(left: f32, right: f32): f32;\n @builtin export declare function nearest(value: f32): f32;\n @builtin export declare function reinterpret_i32(value: i32): f32;\n @builtin export declare function sqrt(value: f32): f32;\n @builtin export declare function store(offset: usize, value: f32, constantOffset?: usize): void;\n @builtin export declare function trunc(value: f32): f32;\n}\n\n@builtin export declare function f64(value: void): f64;\nexport namespace f64 {\n export const EPSILON = reinterpret(0x3CB0000000000000); // 0x1p-52\n export const MIN_VALUE = reinterpret(0x0000000000000001); // 0x0.0000000000001p+0\n export const MAX_VALUE = reinterpret(0x7FEFFFFFFFFFFFFF); // 0x1.fffffffffffffp+1023\n export const MIN_NORMAL_VALUE = reinterpret(0x0010000000000000); // 0x1p-1022\n export const MIN_SAFE_INTEGER: f64 = -9007199254740991;\n export const MAX_SAFE_INTEGER: f64 = 9007199254740991;\n @builtin export declare function abs(value: f64): f64;\n @builtin export declare function ceil(value: f64): f64;\n @builtin export declare function copysign(x: f64, y: f64): f64;\n @builtin export declare function floor(value: f64): f64;\n @builtin export declare function load(offset: usize, constantOffset?: usize): f64;\n @builtin export declare function max(left: f64, right: f64): f64;\n @builtin export declare function min(left: f64, right: f64): f64;\n @builtin export declare function nearest(value: f64): f64;\n @builtin export declare function reinterpret_i64(value: i64): f64;\n @builtin export declare function sqrt(value: f64): f64;\n @builtin export declare function store(offset: usize, value: f64, constantOffset?: usize): void;\n @builtin export declare function trunc(value: f64): f64;\n}\n\n@builtin export declare function start(): void;\n","collector/itcm":'/**\n * Incremental Tri-Color-Marking Garbage Collector.\n *\n * @module std/assembly/collector/itcm\n *//***/\n\n// Largely based on Bach Le\'s μgc, see: https://github.com/bullno1/ugc\n\nconst TRACE = false;\n\n/** Size of a managed object header. */\nexport const HEADER_SIZE: usize = (offsetof() + AL_MASK) & ~AL_MASK;\n\nimport { AL_MASK, MAX_SIZE_32 } from "../internal/allocator";\nimport { iterateRoots } from "../gc";\n\n/** Collector states. */\nconst enum State {\n /** Not yet initialized. */\n INIT = 0,\n /** Currently transitioning from SWEEP to MARK state. */\n IDLE = 1,\n /** Currently marking reachable objects. */\n MARK = 2,\n /** Currently sweeping unreachable objects. */\n SWEEP = 3\n}\n\n/** Current collector state. */\nvar state = State.INIT;\n/** Current white color value. */\nvar white = 0;\n\n// From and to spaces\nvar fromSpace: ManagedObjectList;\nvar toSpace: ManagedObjectList;\nvar iter: ManagedObject;\n\n// ╒═══════════════ Managed object layout (32-bit) ════════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┼─┼─┴─┤ ┐\n// │ next │0│ C │ ◄─┐ = nextWithColor\n// ├─────────────────────────────────────────────────────────┴─┴───┤ │ usize\n// │ prev │ ◄─┘\n// ├───────────────────────────────────────────────────────────────┤\n// │ hookFn │\n// ╞═══════════════════════════════════════════════════════════════╡ SIZE ┘ ◄─ user-space reference\n// │ ... data ... │\n// └───────────────────────────────────────────────────────────────┘\n// C: color\n\n/** Represents a managed object in memory, consisting of a header followed by the object\'s data. */\n@unmanaged class ManagedObject {\n\n /** Pointer to the next object with color flags stored in the alignment bits. */\n nextWithColor: usize;\n\n /** Pointer to the previous object. */\n prev: ManagedObject;\n\n /** Class-specific hook function called with the user-space reference. */\n hookFn: (ref: usize) => void;\n\n /** Gets the pointer to the next object. */\n get next(): ManagedObject {\n return changetype(this.nextWithColor & ~3);\n }\n\n /** Sets the pointer to the next object. */\n set next(obj: ManagedObject) {\n this.nextWithColor = changetype(obj) | (this.nextWithColor & 3);\n }\n\n /** Gets this object\'s color. */\n get color(): i32 {\n return this.nextWithColor & 3;\n }\n\n /** Sets this object\'s color. */\n set color(color: i32) {\n this.nextWithColor = (this.nextWithColor & ~3) | color;\n }\n\n /** Unlinks this object from its list. */\n unlink(): void {\n var next = this.next;\n var prev = this.prev;\n if (TRACE) trace(" unlink", 3, objToRef(prev), objToRef(this), objToRef(next));\n next.prev = prev;\n prev.next = next;\n }\n\n /** Marks this object as gray, that is reachable with unscanned children. */\n makeGray(): void {\n if (TRACE) trace(" makeGray", 1, objToRef(this));\n const gray = 2;\n if (this == iter) iter = this.prev;\n this.unlink();\n toSpace.push(this);\n this.nextWithColor = (this.nextWithColor & ~3) | gray;\n }\n}\n\n/** A list of managed objects. Used for the from and to spaces. */\n@unmanaged class ManagedObjectList extends ManagedObject {\n\n /** Inserts an object. */\n push(obj: ManagedObject): void {\n var prev = this.prev;\n if (TRACE) trace(" push", 3, objToRef(prev), objToRef(obj), objToRef(this));\n obj.next = this;\n obj.prev = prev;\n prev.next = obj;\n this.prev = obj;\n }\n\n /** Clears this list. */\n clear(): void {\n if (TRACE) trace(" clear", 1, objToRef(this));\n this.nextWithColor = changetype(this);\n this.prev = this;\n }\n}\n\n/** Performs a single step according to the current state. */\nfunction step(): void {\n var obj: ManagedObject;\n switch (state) {\n case State.INIT: {\n if (TRACE) trace("gc~step/INIT");\n fromSpace = changetype(memory.allocate(HEADER_SIZE));\n fromSpace.hookFn = changetype<(ref: usize) => void>(-1); // would error\n fromSpace.clear();\n toSpace = changetype(memory.allocate(HEADER_SIZE));\n toSpace.hookFn = changetype<(ref: usize) => void>(-1); // would error\n toSpace.clear();\n iter = toSpace;\n state = State.IDLE;\n if (TRACE) trace("gc~state = IDLE");\n // fall-through\n }\n case State.IDLE: {\n if (TRACE) trace("gc~step/IDLE");\n iterateRoots(__gc_mark);\n state = State.MARK;\n if (TRACE) trace("gc~state = MARK");\n break;\n }\n case State.MARK: {\n obj = iter.next;\n if (obj !== toSpace) {\n if (TRACE) trace("gc~step/MARK iterate", 1, objToRef(obj));\n iter = obj;\n obj.color = !white;\n // if (TRACE) {\n // trace(" next/prev/hook", 3,\n // changetype(obj.next),\n // changetype(obj.prev),\n // changetype(obj.hookFn)\n // );\n // }\n obj.hookFn(objToRef(obj));\n } else {\n if (TRACE) trace("gc~step/MARK finish");\n iterateRoots(__gc_mark);\n obj = iter.next;\n if (obj === toSpace) {\n let from = fromSpace;\n fromSpace = toSpace;\n toSpace = from;\n white = !white;\n iter = from.next;\n state = State.SWEEP;\n if (TRACE) trace("gc~state = SWEEP");\n }\n }\n break;\n }\n case State.SWEEP: {\n obj = iter;\n if (obj !== toSpace) {\n if (TRACE) trace("gc~step/SWEEP free", 1, objToRef(obj));\n iter = obj.next;\n if (changetype(obj) >= HEAP_BASE) memory.free(changetype(obj));\n } else {\n if (TRACE) trace("gc~step/SWEEP finish");\n toSpace.clear();\n state = State.IDLE;\n if (TRACE) trace("gc~state = IDLE");\n }\n break;\n }\n }\n}\n\n@inline function refToObj(ref: usize): ManagedObject {\n return changetype(ref - HEADER_SIZE);\n}\n\n@inline function objToRef(obj: ManagedObject): usize {\n return changetype(obj) + HEADER_SIZE;\n}\n\n// Garbage collector interface\n\n@global export function __gc_allocate(\n size: usize,\n markFn: (ref: usize) => void\n): usize {\n if (TRACE) trace("gc.allocate", 1, size);\n if (size > MAX_SIZE_32 - HEADER_SIZE) unreachable();\n step(); // also makes sure it\'s initialized\n var obj = changetype(memory.allocate(HEADER_SIZE + size));\n obj.hookFn = markFn;\n obj.color = white;\n fromSpace.push(obj);\n return objToRef(obj);\n}\n\n@global export function __gc_link(parentRef: usize, childRef: usize): void {\n if (TRACE) trace("gc.link", 2, parentRef, childRef);\n var parent = refToObj(parentRef);\n if (parent.color == !white && refToObj(childRef).color == white) parent.makeGray();\n}\n\n@global export function __gc_mark(ref: usize): void {\n if (TRACE) trace("gc.mark", 1, ref);\n if (ref) {\n let obj = refToObj(ref);\n if (obj.color == white) obj.makeGray();\n }\n}\n\n@global export function __gc_collect(): void {\n if (TRACE) trace("gc.collect");\n // begin collecting if not yet collecting\n switch (state) {\n case State.INIT:\n case State.IDLE: step();\n }\n // finish the cycle\n while (state != State.IDLE) step();\n}\n',dataview:'import {\n HEADER_SIZE,\n MAX_BLENGTH\n} from "./internal/arraybuffer";\n\nexport class DataView {\n\n constructor(\n readonly buffer: ArrayBuffer,\n readonly byteOffset: i32 = 0,\n readonly byteLength: i32 = i32.MIN_VALUE // FIXME\n ) {\n if (byteLength === i32.MIN_VALUE) byteLength = buffer.byteLength - byteOffset; // FIXME\n if (byteOffset > MAX_BLENGTH) throw new RangeError("Invalid byteOffset");\n if (byteLength > MAX_BLENGTH) throw new RangeError("Invalid byteLength");\n if (byteOffset + byteLength > buffer.byteLength) throw new RangeError("Invalid length");\n }\n\n getFloat32(byteOffset: i32, littleEndian: boolean = false): f32 {\n checkOffset(byteOffset, 4, this.byteLength);\n return littleEndian\n ? load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n : reinterpret(\n bswap(\n load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n )\n );\n }\n\n getFloat64(byteOffset: i32, littleEndian: boolean = false): f64 {\n checkOffset(byteOffset, 8, this.byteLength);\n return littleEndian\n ? load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n : reinterpret(\n bswap(\n load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n )\n );\n }\n\n getInt8(byteOffset: i32): i8 {\n checkOffset(byteOffset, 1, this.byteLength);\n return load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n }\n\n getInt16(byteOffset: i32, littleEndian: boolean = false): i16 {\n checkOffset(byteOffset, 2, this.byteLength);\n var result: i16 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getInt32(byteOffset: i32, littleEndian: boolean = false): i32 {\n checkOffset(byteOffset, 4, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getUint8(byteOffset: i32): u8 {\n checkOffset(byteOffset, 1, this.byteLength);\n return load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n }\n\n getUint16(byteOffset: i32, littleEndian: boolean = false): u16 {\n checkOffset(byteOffset, 2, this.byteLength);\n var result: u16 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getUint32(byteOffset: i32, littleEndian: boolean = false): u32 {\n checkOffset(byteOffset, 4, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n setFloat32(byteOffset: i32, value: f32, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 4, this.byteLength);\n if (littleEndian) {\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n } else {\n store(changetype(this.buffer) + this.byteOffset + byteOffset,\n bswap(\n reinterpret(value)\n ),\n HEADER_SIZE\n );\n }\n }\n\n setFloat64(byteOffset: i32, value: f64, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 8, this.byteLength);\n if (littleEndian) {\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n } else {\n store(changetype(this.buffer) + this.byteOffset + byteOffset,\n bswap(\n reinterpret(value)\n ),\n HEADER_SIZE\n );\n }\n }\n\n setInt8(byteOffset: i32, value: i8): void {\n checkOffset(byteOffset, 1, this.byteLength);\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n }\n\n setInt16(byteOffset: i32, value: i16, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 2, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setInt32(byteOffset: i32, value: i32, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 4, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setUint8(byteOffset: i32, value: u8): void {\n checkOffset(byteOffset, 1, this.byteLength);\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n }\n\n setUint16(byteOffset: i32, value: u16, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 2, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setUint32(byteOffset: i32, value: u32, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 4, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n // Non-standard additions that make sense in WebAssembly, but won\'t work in JS:\n\n getInt64(byteOffset: i32, littleEndian: boolean = false): i64 {\n checkOffset(byteOffset, 8, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getUint64(byteOffset: i32, littleEndian: boolean = false): u64 {\n checkOffset(byteOffset, 8, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n setInt64(byteOffset: i32, value: i64, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 8, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setUint64(byteOffset: i32, value: u64, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 8, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n toString(): string {\n return "[object DataView]";\n }\n}\n\n@inline function checkOffset(byteOffset: i32, n: i32, byteLength: i32): void {\n // n and byteLength must be known to be in bounds\n if (byteOffset > MAX_BLENGTH || byteOffset + n > byteLength) throw new Error("Offset out of bounds");\n}\n',date:'import {\n UTC as Date_UTC,\n now as Date_now\n} from "./bindings/Date";\n\nexport class Date {\n\n @inline static UTC(\n year: i32,\n month: i32 = 0,\n day: i32 = 1,\n hour: i32 = 0,\n minute: i32 = 0,\n second: i32 = 0,\n millisecond: i64 = 0\n ): i64 {\n return Date_UTC(year, month, day, hour, minute, second, millisecond);\n }\n\n @inline static now(): i64 {\n return Date_now();\n }\n\n private value: i64;\n\n constructor(value: i64) {\n this.value = value;\n }\n\n getTime(): i64 {\n return this.value;\n }\n\n setTime(value: i64): i64 {\n this.value = value;\n return value;\n }\n}\n',diagnostics:"/* tslint:disable */\n\n@builtin export declare function ERROR(message?: void): void;\n@builtin export declare function WARNING(message?: void): void;\n@builtin export declare function INFO(message?: void): void;\n",env:"declare function abort(\n message?: string | null,\n fileName?: string | null,\n lineNumber?: u32,\n columnNumber?: u32\n): void;\n\ndeclare function trace(\n message: string,\n n?: i32,\n a0?: f64,\n a1?: f64,\n a2?: f64,\n a3?: f64,\n a4?: f64\n): void;\n",error:'export class Error {\n\n name: string = "Error";\n stack: string = ""; // TODO\n\n constructor(\n public message: string = ""\n ) {}\n\n toString(): string {\n var message = this.message;\n return message.length\n ? this.name + ": " + message\n : this.name;\n }\n}\n\nexport class RangeError extends Error {\n constructor(message: string = "") {\n super(message);\n this.name = "RangeError";\n }\n}\n\nexport class TypeError extends Error {\n constructor(message: string = "") {\n super(message);\n this.name = "TypeError";\n }\n}\n\nexport class SyntaxError extends Error {\n constructor(message: string = "") {\n super(message);\n this.name = "SyntaxError";\n }\n}\n',gc:"/* tslint:disable */\n\n@builtin export declare function iterateRoots(fn: (ref: usize) => void): void;\n\nexport namespace gc {\n\n export function collect(): void {\n if (isDefined(__gc_collect)) { __gc_collect(); return; }\n WARNING(\"Calling 'gc.collect' requires a garbage collector to be present.\");\n unreachable();\n }\n}\n","internal/allocator":"/** Number of alignment bits. */\nexport const AL_BITS: u32 = 3;\n/** Number of possible alignment values. */\nexport const AL_SIZE: usize = 1 << AL_BITS;\n/** Mask to obtain just the alignment bits. */\nexport const AL_MASK: usize = AL_SIZE - 1;\n/** Maximum 32-bit allocation size. */\nexport const MAX_SIZE_32: usize = 1 << 30; // 1GB\n","internal/arraybuffer":'import {\n AL_MASK,\n MAX_SIZE_32\n } from "./allocator";\n\n/** Size of an ArrayBuffer header. */\nexport const HEADER_SIZE: usize = (offsetof() + AL_MASK) & ~AL_MASK;\n/** Maximum byte length of an ArrayBuffer. */\nexport const MAX_BLENGTH: i32 = MAX_SIZE_32 - HEADER_SIZE;\n\nfunction computeSize(byteLength: i32): usize {\n // round up to power of 2, with HEADER_SIZE=8:\n // 0 -> 2^3 = 8\n // 1..8 -> 2^4 = 16\n // 9..24 -> 2^5 = 32\n // ...\n // MAX_LENGTH -> 2^30 = 0x40000000 (MAX_SIZE_32)\n return 1 << (32 - clz(byteLength + HEADER_SIZE - 1));\n}\n\n// Low-level utility\n\nfunction __gc(ref: usize): void {}\n\nexport function allocateUnsafe(byteLength: i32): ArrayBuffer {\n assert(byteLength <= MAX_BLENGTH);\n var buffer: usize;\n if (isManaged()) {\n buffer = __gc_allocate(computeSize(byteLength), __gc); // tslint:disable-line\n } else {\n buffer = memory.allocate(computeSize(byteLength));\n }\n store(buffer, byteLength, offsetof("byteLength"));\n return changetype(buffer);\n}\n\nexport function reallocateUnsafe(buffer: ArrayBuffer, newByteLength: i32): ArrayBuffer {\n var oldByteLength = buffer.byteLength;\n if (newByteLength > oldByteLength) {\n assert(newByteLength <= MAX_BLENGTH);\n if (newByteLength <= (computeSize(oldByteLength) - HEADER_SIZE)) { // fast path: zero out additional space\n store(changetype(buffer), newByteLength, offsetof("byteLength"));\n } else { // slow path: copy to new buffer\n let newBuffer = allocateUnsafe(newByteLength);\n memory.copy(\n changetype(newBuffer) + HEADER_SIZE,\n changetype(buffer) + HEADER_SIZE,\n oldByteLength\n );\n if (!isManaged()) {\n memory.free(changetype(buffer));\n }\n buffer = newBuffer;\n }\n memory.fill(\n changetype(buffer) + HEADER_SIZE + oldByteLength,\n 0,\n (newByteLength - oldByteLength)\n );\n } else if (newByteLength < oldByteLength) { // fast path: override size\n // TBD: worth to copy and release if size is significantly less than before?\n assert(newByteLength >= 0);\n store(changetype(buffer), newByteLength, offsetof("byteLength"));\n }\n return buffer;\n}\n\n// The helpers below use two different types in order to emit loads and stores that load respectively\n// store one type to/from memory while returning/taking the desired output/input type. This allows to\n// emit instructions like\n//\n// * `i32.load8` ^= `load(...)` that reads an i8 but returns an i32, or\n// * `i64.load32_s` ^= `load(...)`) that reads a 32-bit as a 64-bit integer\n//\n// without having to emit an additional instruction for conversion purposes. The second parameter\n// can be omitted for references and other loads and stores that simply return the exact type.\n\n@inline export function LOAD(buffer: ArrayBuffer, index: i32, byteOffset: i32 = 0): TOut {\n return load(changetype(buffer) + (index << alignof()) + byteOffset, HEADER_SIZE);\n}\n\n@inline export function STORE(buffer: ArrayBuffer, index: i32, value: TIn, byteOffset: i32 = 0): void {\n store(changetype(buffer) + (index << alignof()) + byteOffset, value, HEADER_SIZE);\n}\n',"internal/hash":'import {\n HEADER_SIZE\n} from "./string";\n\n/** Computes the 32-bit hash of a value of any type. */\n@inline\nexport function HASH(key: T): u32 {\n // branch-level tree-shaking makes this a `(return (call ...))`\n if (isString(key)) {\n return hashStr(key);\n } else if (isReference()) {\n if (sizeof() == 4) return hash32(changetype(key));\n if (sizeof() == 8) return hash64(changetype(key));\n } else if (isFloat()) {\n if (sizeof() == 4) return hash32(reinterpret(key));\n if (sizeof() == 8) return hash64(reinterpret(key));\n } else {\n if (sizeof() == 1) return hash8 (key);\n if (sizeof() == 2) return hash16(key);\n if (sizeof() == 4) return hash32(key);\n if (sizeof() == 8) return hash64(key);\n }\n unreachable();\n}\n\n// FNV-1a 32-bit as a starting point, see: http://isthe.com/chongo/tech/comp/fnv/\n\nconst FNV_OFFSET: u32 = 2166136261;\nconst FNV_PRIME: u32 = 16777619;\n\nfunction hash8(key: u32): u32 {\n return (FNV_OFFSET ^ key) * FNV_PRIME;\n}\n\nfunction hash16(key: u32): u32 {\n var v = FNV_OFFSET;\n v = (v ^ ( key & 0xff)) * FNV_PRIME;\n v = (v ^ ( key >> 8 )) * FNV_PRIME;\n return v;\n}\n\nfunction hash32(key: u32): u32 {\n var v = FNV_OFFSET;\n v = (v ^ ( key & 0xff)) * FNV_PRIME;\n v = (v ^ ((key >> 8) & 0xff)) * FNV_PRIME;\n v = (v ^ ((key >> 16) & 0xff)) * FNV_PRIME;\n v = (v ^ ( key >> 24 )) * FNV_PRIME;\n return v;\n}\n\nfunction hash64(key: u64): u32 {\n var l = key;\n var h = (key >>> 32);\n var v = FNV_OFFSET;\n v = (v ^ ( l & 0xff)) * FNV_PRIME;\n v = (v ^ ((l >> 8) & 0xff)) * FNV_PRIME;\n v = (v ^ ((l >> 16) & 0xff)) * FNV_PRIME;\n v = (v ^ ( l >> 24 )) * FNV_PRIME;\n v = (v ^ ( h & 0xff)) * FNV_PRIME;\n v = (v ^ ((h >> 8) & 0xff)) * FNV_PRIME;\n v = (v ^ ((h >> 16) & 0xff)) * FNV_PRIME;\n v = (v ^ ( h >> 24 )) * FNV_PRIME;\n return v;\n}\n\nfunction hashStr(key: string): u32 {\n var v = FNV_OFFSET;\n for (let i: usize = 0, k: usize = key.length << 1; i < k; ++i) {\n v = (v ^ load(changetype(key) + i, HEADER_SIZE)) * FNV_PRIME;\n }\n return v;\n}\n',"internal/memory":"// this function will go away once `memory.copy` becomes an intrinsic\nexport function memcpy(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memcpy.c\n var w: u32, x: u32;\n\n // copy 1 byte each until src is aligned to 4 bytes\n while (n && (src & 3)) {\n store(dest++, load(src++));\n n--;\n }\n\n // if dst is aligned to 4 bytes as well, copy 4 bytes each\n if ((dest & 3) == 0) {\n while (n >= 16) {\n store(dest , load(src ));\n store(dest + 4, load(src + 4));\n store(dest + 8, load(src + 8));\n store(dest + 12, load(src + 12));\n src += 16; dest += 16; n -= 16;\n }\n if (n & 8) {\n store(dest , load(src ));\n store(dest + 4, load(src + 4));\n dest += 8; src += 8;\n }\n if (n & 4) {\n store(dest, load(src));\n dest += 4; src += 4;\n }\n if (n & 2) { // drop to 2 bytes each\n store(dest, load(src));\n dest += 2; src += 2;\n }\n if (n & 1) { // drop to 1 byte\n store(dest++, load(src++));\n }\n return;\n }\n\n // if dst is not aligned to 4 bytes, use alternating shifts to copy 4 bytes each\n // doing shifts if faster when copying enough bytes (here: 32 or more)\n if (n >= 32) {\n switch (dest & 3) {\n // known to be != 0\n case 1: {\n w = load(src);\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n n -= 3;\n while (n >= 17) {\n x = load(src + 1);\n store(dest, w >> 24 | x << 8);\n w = load(src + 5);\n store(dest + 4, x >> 24 | w << 8);\n x = load(src + 9);\n store(dest + 8, w >> 24 | x << 8);\n w = load(src + 13);\n store(dest + 12, x >> 24 | w << 8);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n case 2: {\n w = load(src);\n store(dest++, load(src++));\n store(dest++, load(src++));\n n -= 2;\n while (n >= 18) {\n x = load(src + 2);\n store(dest, w >> 16 | x << 16);\n w = load(src + 6);\n store(dest + 4, x >> 16 | w << 16);\n x = load(src + 10);\n store(dest + 8, w >> 16 | x << 16);\n w = load(src + 14);\n store(dest + 12, x >> 16 | w << 16);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n case 3: {\n w = load(src);\n store(dest++, load(src++));\n n -= 1;\n while (n >= 19) {\n x = load(src + 3);\n store(dest, w >> 8 | x << 24);\n w = load(src + 7);\n store(dest + 4, x >> 8 | w << 24);\n x = load(src + 11);\n store(dest + 8, w >> 8 | x << 24);\n w = load(src + 15);\n store(dest + 12, x >> 8 | w << 24);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n }\n }\n\n // copy remaining bytes one by one\n if (n & 16) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 8) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 4) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 2) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 1) {\n store(dest++, load(src++));\n }\n}\n\n// this function will go away once `memory.copy` becomes an intrinsic\nexport function memmove(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memmove.c\n if (dest === src) return;\n if (src + n <= dest || dest + n <= src) {\n memcpy(dest, src, n);\n return;\n }\n if (dest < src) {\n if ((src & 7) == (dest & 7)) {\n while (dest & 7) {\n if (!n) return;\n --n;\n store(dest++, load(src++));\n }\n while (n >= 8) {\n store(dest, load(src));\n n -= 8;\n dest += 8;\n src += 8;\n }\n }\n while (n) {\n store(dest++, load(src++));\n --n;\n }\n } else {\n if ((src & 7) == (dest & 7)) {\n while ((dest + n) & 7) {\n if (!n) return;\n store(dest + --n, load(src + n));\n }\n while (n >= 8) {\n n -= 8;\n store(dest + n, load(src + n));\n }\n }\n while (n) {\n store(dest + --n, load(src + n));\n }\n }\n}\n\n// this function will go away once `memory.fill` becomes an intrinsic\nexport function memset(dest: usize, c: u8, n: usize): void { // see: musl/src/string/memset\n\n // fill head and tail with minimal branching\n if (!n) return;\n store(dest, c);\n store(dest + n - 1, c);\n if (n <= 2) return;\n\n store(dest + 1, c);\n store(dest + 2, c);\n store(dest + n - 2, c);\n store(dest + n - 3, c);\n if (n <= 6) return;\n store(dest + 3, c);\n store(dest + n - 4, c);\n if (n <= 8) return;\n\n // advance pointer to align it at 4-byte boundary\n var k: usize = -dest & 3;\n dest += k;\n n -= k;\n n &= -4;\n\n var c32: u32 = -1 / 255 * c;\n\n // fill head/tail up to 28 bytes each in preparation\n store(dest, c32);\n store(dest + n - 4, c32);\n if (n <= 8) return;\n store(dest + 4, c32);\n store(dest + 8, c32);\n store(dest + n - 12, c32);\n store(dest + n - 8, c32);\n if (n <= 24) return;\n store(dest + 12, c32);\n store(dest + 16, c32);\n store(dest + 20, c32);\n store(dest + 24, c32);\n store(dest + n - 28, c32);\n store(dest + n - 24, c32);\n store(dest + n - 20, c32);\n store(dest + n - 16, c32);\n\n // align to a multiple of 8\n k = 24 + (dest & 4);\n dest += k;\n n -= k;\n\n // copy 32 bytes each\n var c64: u64 = c32 | (c32 << 32);\n while (n >= 32) {\n store(dest, c64);\n store(dest + 8, c64);\n store(dest + 16, c64);\n store(dest + 24, c64);\n n -= 32;\n dest += 32;\n }\n}\n\nexport function memcmp(vl: usize, vr: usize, n: usize): i32 { // see: musl/src/string/memcmp.c\n if (vl == vr) return 0;\n while (n != 0 && load(vl) == load(vr)) {\n n--; vl++; vr++;\n }\n return n ? load(vl) - load(vr) : 0;\n}\n","internal/number":'\nimport {\n CharCode,\n allocateUnsafe as allocateUnsafeString,\n freeUnsafe as freeUnsafeString,\n HEADER_SIZE as STRING_HEADER_SIZE\n} from "./string";\n\nimport {\n LOAD\n} from "./arraybuffer";\n\nexport const MAX_DOUBLE_LENGTH = 28;\n\n@inline\nexport function POWERS10(): u32[] {\n const table: u32[] = [\n 1,\n 10,\n 100,\n 1000,\n 10000,\n 100000,\n 1000000,\n 10000000,\n 100000000,\n 1000000000\n ];\n return table; // inlines to a constant memory offset\n}\n\n/*\n Lookup table for pairwise char codes in range [0-99]\n\n "00", "01", "02", "03", "04", "05", "06", "07", "08", "09",\n "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",\n "20", "21", "22", "23", "24", "25", "26", "27", "28", "29",\n "30", "31", "32", "33", "34", "35", "36", "37", "38", "39",\n "40", "41", "42", "43", "44", "45", "46", "47", "48", "49",\n "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",\n "60", "61", "62", "63", "64", "65", "66", "67", "68", "69",\n "70", "71", "72", "73", "74", "75", "76", "77", "78", "79",\n "80", "81", "82", "83", "84", "85", "86", "87", "88", "89",\n "90", "91", "92", "93", "94", "95", "96", "97", "98", "99"\n*/\n@inline\nexport function DIGITS(): u32[] {\n const table: u32[] = [\n 0x00300030, 0x00310030, 0x00320030, 0x00330030, 0x00340030,\n 0x00350030, 0x00360030, 0x00370030, 0x00380030, 0x00390030,\n 0x00300031, 0x00310031, 0x00320031, 0x00330031, 0x00340031,\n 0x00350031, 0x00360031, 0x00370031, 0x00380031, 0x00390031,\n 0x00300032, 0x00310032, 0x00320032, 0x00330032, 0x00340032,\n 0x00350032, 0x00360032, 0x00370032, 0x00380032, 0x00390032,\n 0x00300033, 0x00310033, 0x00320033, 0x00330033, 0x00340033,\n 0x00350033, 0x00360033, 0x00370033, 0x00380033, 0x00390033,\n 0x00300034, 0x00310034, 0x00320034, 0x00330034, 0x00340034,\n 0x00350034, 0x00360034, 0x00370034, 0x00380034, 0x00390034,\n 0x00300035, 0x00310035, 0x00320035, 0x00330035, 0x00340035,\n 0x00350035, 0x00360035, 0x00370035, 0x00380035, 0x00390035,\n 0x00300036, 0x00310036, 0x00320036, 0x00330036, 0x00340036,\n 0x00350036, 0x00360036, 0x00370036, 0x00380036, 0x00390036,\n 0x00300037, 0x00310037, 0x00320037, 0x00330037, 0x00340037,\n 0x00350037, 0x00360037, 0x00370037, 0x00380037, 0x00390037,\n 0x00300038, 0x00310038, 0x00320038, 0x00330038, 0x00340038,\n 0x00350038, 0x00360038, 0x00370038, 0x00380038, 0x00390038,\n 0x00300039, 0x00310039, 0x00320039, 0x00330039, 0x00340039,\n 0x00350039, 0x00360039, 0x00370039, 0x00380039, 0x00390039\n ];\n return table; // inlines to a constant memory offset\n}\n\n@inline\nfunction EXP_POWERS(): i16[] {\n const table: i16[] = [\n -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980,\n -954, -927, -901, -874, -847, -821, -794, -768, -741, -715,\n -688, -661, -635, -608, -582, -555, -529, -502, -475, -449,\n -422, -396, -369, -343, -316, -289, -263, -236, -210, -183,\n -157, -130, -103, -77, -50, -24, 3, 30, 56, 83,\n 109, 136, 162, 189, 216, 242, 269, 295, 322, 348,\n 375, 402, 428, 455, 481, 508, 534, 561, 588, 614,\n 641, 667, 694, 720, 747, 774, 800, 827, 853, 880,\n 907, 933, 960, 986, 1013, 1039, 1066\n ];\n return table;\n}\n\n// 1e-348, 1e-340, ..., 1e340\n@inline\nfunction FRC_POWERS(): u64[] {\n const table: u64[] = [\n 0xFA8FD5A0081C0288, 0xBAAEE17FA23EBF76, 0x8B16FB203055AC76, 0xCF42894A5DCE35EA,\n 0x9A6BB0AA55653B2D, 0xE61ACF033D1A45DF, 0xAB70FE17C79AC6CA, 0xFF77B1FCBEBCDC4F,\n 0xBE5691EF416BD60C, 0x8DD01FAD907FFC3C, 0xD3515C2831559A83, 0x9D71AC8FADA6C9B5,\n 0xEA9C227723EE8BCB, 0xAECC49914078536D, 0x823C12795DB6CE57, 0xC21094364DFB5637,\n 0x9096EA6F3848984F, 0xD77485CB25823AC7, 0xA086CFCD97BF97F4, 0xEF340A98172AACE5,\n 0xB23867FB2A35B28E, 0x84C8D4DFD2C63F3B, 0xC5DD44271AD3CDBA, 0x936B9FCEBB25C996,\n 0xDBAC6C247D62A584, 0xA3AB66580D5FDAF6, 0xF3E2F893DEC3F126, 0xB5B5ADA8AAFF80B8,\n 0x87625F056C7C4A8B, 0xC9BCFF6034C13053, 0x964E858C91BA2655, 0xDFF9772470297EBD,\n 0xA6DFBD9FB8E5B88F, 0xF8A95FCF88747D94, 0xB94470938FA89BCF, 0x8A08F0F8BF0F156B,\n 0xCDB02555653131B6, 0x993FE2C6D07B7FAC, 0xE45C10C42A2B3B06, 0xAA242499697392D3,\n 0xFD87B5F28300CA0E, 0xBCE5086492111AEB, 0x8CBCCC096F5088CC, 0xD1B71758E219652C,\n 0x9C40000000000000, 0xE8D4A51000000000, 0xAD78EBC5AC620000, 0x813F3978F8940984,\n 0xC097CE7BC90715B3, 0x8F7E32CE7BEA5C70, 0xD5D238A4ABE98068, 0x9F4F2726179A2245,\n 0xED63A231D4C4FB27, 0xB0DE65388CC8ADA8, 0x83C7088E1AAB65DB, 0xC45D1DF942711D9A,\n 0x924D692CA61BE758, 0xDA01EE641A708DEA, 0xA26DA3999AEF774A, 0xF209787BB47D6B85,\n 0xB454E4A179DD1877, 0x865B86925B9BC5C2, 0xC83553C5C8965D3D, 0x952AB45CFA97A0B3,\n 0xDE469FBD99A05FE3, 0xA59BC234DB398C25, 0xF6C69A72A3989F5C, 0xB7DCBF5354E9BECE,\n 0x88FCF317F22241E2, 0xCC20CE9BD35C78A5, 0x98165AF37B2153DF, 0xE2A0B5DC971F303A,\n 0xA8D9D1535CE3B396, 0xFB9B7CD9A4A7443C, 0xBB764C4CA7A44410, 0x8BAB8EEFB6409C1A,\n 0xD01FEF10A657842C, 0x9B10A4E5E9913129, 0xE7109BFBA19C0C9D, 0xAC2820D9623BF429,\n 0x80444B5E7AA7CF85, 0xBF21E44003ACDD2D, 0x8E679C2F5E44FF8F, 0xD433179D9C8CB841,\n 0x9E19DB92B4E31BA9, 0xEB96BF6EBADF77D9, 0xAF87023B9BF0EE6B\n ];\n return table;\n}\n\n// Count number of decimals for u32 values\n// In our case input value always non-zero so we can simplify some parts\nexport function decimalCount32(value: u32): u32 {\n if (ASC_SHRINK_LEVEL >= 1) {\n let l: u32 = 32 - clz(value); // log2\n let t = l * 1233 >>> 12; // log10\n\n let lutbuf = POWERS10().buffer_;\n let power = LOAD(lutbuf, t);\n t -= (value < power);\n return t + 1;\n } else {\n if (value < 100000) {\n if (value < 100) {\n return select(1, 2, value < 10);\n } else {\n let m = select(4, 5, value < 10000);\n return select(3, m, value < 1000);\n }\n } else {\n if (value < 10000000) {\n return select(6, 7, value < 1000000);\n } else {\n let m = select(9, 10, value < 1000000000);\n return select(8, m, value < 100000000);\n }\n }\n }\n}\n\n// Count number of decimals for u64 values\n// In our case input value always greater than 2^32-1 so we can skip some parts\nexport function decimalCount64(value: u64): u32 {\n if (ASC_SHRINK_LEVEL >= 1) {\n let l: u32 = 64 - clz(value); // log2\n let t = l * 1233 >>> 12; // log10\n\n let lutbuf = POWERS10().buffer_;\n let power = LOAD(lutbuf, t - 10);\n t -= (value < 10000000000 * power);\n return t + 1;\n } else {\n if (value < 1000000000000000) {\n if (value < 1000000000000) {\n return select(11, 12, value < 100000000000);\n } else {\n let m = select(14, 15, value < 100000000000000);\n return select(13, m, value < 10000000000000);\n }\n } else {\n if (value < 100000000000000000) {\n return select(16, 17, value < 10000000000000000);\n } else {\n let m = select(19, 20, value < 10000000000000000000);\n return select(18, m, value < 1000000000000000000);\n }\n }\n }\n}\n\nfunction utoa32_lut(buffer: usize, num: u32, offset: usize): void {\n var lutbuf = DIGITS().buffer_;\n\n while (num >= 10000) {\n // in most VMs i32/u32 div and modulo by constant can be shared and simplificate\n let t = num / 10000;\n let r = num % 10000;\n num = t;\n\n let d1 = r / 100;\n let d2 = r % 100;\n\n let digits1 = LOAD(lutbuf, d1);\n let digits2 = LOAD(lutbuf, d2);\n\n offset -= 4;\n store(buffer + (offset << 1), digits1 | (digits2 << 32), STRING_HEADER_SIZE);\n }\n\n if (num >= 100) {\n let t = num / 100;\n let d1 = num % 100;\n num = t;\n offset -= 2;\n let digits = LOAD(lutbuf, d1);\n store(buffer + (offset << 1), digits, STRING_HEADER_SIZE);\n }\n\n if (num >= 10) {\n offset -= 2;\n let digits = LOAD(lutbuf, num);\n store(buffer + (offset << 1), digits, STRING_HEADER_SIZE);\n } else {\n offset -= 1;\n let digit = CharCode._0 + num;\n store(buffer + (offset << 1), digit, STRING_HEADER_SIZE);\n }\n}\n\nfunction utoa64_lut(buffer: usize, num: u64, offset: usize): void {\n var lutbuf = DIGITS().buffer_;\n\n while (num >= 100000000) {\n let t = num / 100000000;\n let r = (num - t * 100000000);\n num = t;\n\n let b = r / 10000;\n let c = r % 10000;\n\n let b1 = b / 100;\n let b2 = b % 100;\n let c1 = c / 100;\n let c2 = c % 100;\n\n let digits1 = LOAD(lutbuf, c1);\n let digits2 = LOAD(lutbuf, c2);\n\n offset -= 4;\n store(buffer + (offset << 1), digits1 | (digits2 << 32), STRING_HEADER_SIZE);\n\n digits1 = LOAD(lutbuf, b1);\n digits2 = LOAD(lutbuf, b2);\n\n offset -= 4;\n store(buffer + (offset << 1), digits1 | (digits2 << 32), STRING_HEADER_SIZE);\n }\n\n utoa32_lut(buffer, num, offset);\n}\n\nfunction utoa_simple(buffer: usize, num: T, offset: usize): void {\n do {\n let t = num / 10;\n let r = (num % 10);\n num = t;\n offset -= 1;\n store(buffer + (offset << 1), CharCode._0 + r, STRING_HEADER_SIZE);\n } while (num);\n}\n\n@inline\nexport function utoa32_core(buffer: usize, num: u32, offset: u32): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n utoa_simple(buffer, num, offset);\n } else {\n utoa32_lut(buffer, num, offset);\n }\n}\n\n@inline\nexport function utoa64_core(buffer: usize, num: u64, offset: u32): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n utoa_simple(buffer, num, offset);\n } else {\n utoa64_lut(buffer, num, offset);\n }\n}\n\nexport function utoa32(value: u32): String {\n if (!value) return "0";\n\n var decimals = decimalCount32(value);\n var buffer = allocateUnsafeString(decimals);\n\n utoa32_core(changetype(buffer), value, decimals);\n return buffer;\n}\n\nexport function itoa32(value: i32): String {\n if (!value) return "0";\n\n var sign = value < 0;\n if (sign) value = -value;\n\n var decimals = decimalCount32(value) + sign;\n var buffer = allocateUnsafeString(decimals);\n\n utoa32_core(changetype(buffer), value, decimals);\n if (sign) store(changetype(buffer), CharCode.MINUS, STRING_HEADER_SIZE);\n\n return buffer;\n}\n\nexport function utoa64(value: u64): String {\n if (!value) return "0";\n\n var buffer: String;\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n let decimals = decimalCount32(val32);\n buffer = allocateUnsafeString(decimals);\n utoa32_core(changetype(buffer), val32, decimals);\n } else {\n let decimals = decimalCount64(value);\n buffer = allocateUnsafeString(decimals);\n utoa64_core(changetype(buffer), value, decimals);\n }\n return buffer;\n}\n\nexport function itoa64(value: i64): String {\n if (!value) return "0";\n\n var sign = value < 0;\n if (sign) value = -value;\n\n var buffer: String;\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n let decimals = decimalCount32(val32) + sign;\n buffer = allocateUnsafeString(decimals);\n utoa32_core(changetype(buffer), val32, decimals);\n } else {\n let decimals = decimalCount64(value) + sign;\n buffer = allocateUnsafeString(decimals);\n utoa64_core(changetype(buffer), value, decimals);\n }\n if (sign) store(changetype(buffer), CharCode.MINUS, STRING_HEADER_SIZE);\n\n return buffer;\n}\n\nexport function itoa(value: T): String {\n if (!isInteger()) {\n assert(false); // unexpecteble non-integer generic type\n } else {\n if (isSigned()) {\n if (sizeof() <= 4) {\n return itoa32(value);\n } else {\n return itoa64(value);\n }\n } else {\n if (sizeof() <= 4) {\n return utoa32(value);\n } else {\n return utoa64(value);\n }\n }\n }\n}\n\nvar _K: i32 = 0;\n\nvar _frc: u64 = 0;\nvar _exp: i32 = 0;\n\nvar _frc_minus: u64 = 0;\nvar _frc_plus: u64 = 0;\n\nvar _frc_pow: u64 = 0;\nvar _exp_pow: i32 = 0;\n\n@inline\nfunction umul64f(u: u64, v: u64): u64 {\n var u0 = u & 0xFFFFFFFF;\n var v0 = v & 0xFFFFFFFF;\n\n var u1 = u >> 32;\n var v1 = v >> 32;\n\n var l = u0 * v0;\n var t = u1 * v0 + (l >> 32);\n var w = u0 * v1 + (t & 0xFFFFFFFF);\n\n w += 0x7FFFFFFF; // rounding\n\n t >>= 32;\n w >>= 32;\n\n return u1 * v1 + t + w;\n}\n\n@inline\nfunction umul64e(e1: i32, e2: i32): i32 {\n return e1 + e2 + 64; // where 64 is significand size\n}\n\n@inline\nfunction normalizedBoundaries(f: u64, e: i32): void {\n var frc = (f << 1) + 1;\n var exp = e - 1;\n var off = clz(frc);\n frc <<= off;\n exp -= off;\n\n var m = 1 + (f == 0x0010000000000000);\n\n _frc_plus = frc;\n _frc_minus = ((f << m) - 1) << e - m - exp;\n _exp = exp;\n}\n\n@inline\nfunction grisuRound(buffer: usize, len: i32, delta: u64, rest: u64, ten_kappa: u64, wp_w: u64): void {\n var lastp = buffer + ((len - 1) << 1);\n var digit = load(lastp, STRING_HEADER_SIZE);\n while (\n rest < wp_w &&\n delta - rest >= ten_kappa && (\n rest + ten_kappa < wp_w ||\n wp_w - rest > rest + ten_kappa - wp_w\n )\n ) {\n --digit;\n rest += ten_kappa;\n }\n store(lastp, digit, STRING_HEADER_SIZE);\n}\n\n@inline\nfunction getCachedPower(minExp: i32): void {\n const c = reinterpret(0x3FD34413509F79FE); // 1 / lg(10) = 0.30102999566398114\n var dk = (-61 - minExp) * c + 347;\t // dk must be positive, so can do ceiling in positive\n var k = dk;\n k += (k != dk); // conversion with ceil\n\n var index = (k >> 3) + 1;\n _K = 348 - (index << 3);\t// decimal exponent no need lookup table\n var frcPowers = FRC_POWERS().buffer_;\n var expPowers = EXP_POWERS().buffer_;\n _frc_pow = LOAD(frcPowers, index);\n _exp_pow = LOAD(expPowers, index);\n}\n\n@inline\nfunction grisu2(value: f64, buffer: usize, sign: i32): i32 {\n\n // frexp routine\n var uv = reinterpret(value);\n var exp = ((uv & 0x7FF0000000000000) >>> 52);\n var sid = uv & 0x000FFFFFFFFFFFFF;\n var frc = ((exp != 0) << 52) + sid;\n exp = select(exp, 1, exp != 0) - (0x3FF + 52);\n\n normalizedBoundaries(frc, exp);\n getCachedPower(_exp);\n\n // normalize\n var off = clz(frc);\n frc <<= off;\n exp -= off;\n\n var frc_pow = _frc_pow;\n var exp_pow = _exp_pow;\n\n var w_frc = umul64f(frc, frc_pow);\n var w_exp = umul64e(exp, exp_pow);\n\n var wp_frc = umul64f(_frc_plus, frc_pow) - 1;\n var wp_exp = umul64e(_exp, exp_pow);\n\n var wm_frc = umul64f(_frc_minus, frc_pow) + 1;\n var delta = wp_frc - wm_frc;\n\n return genDigits(buffer, w_frc, w_exp, wp_frc, wp_exp, delta, sign);\n}\n\nfunction genDigits(buffer: usize, w_frc: u64, w_exp: i32, mp_frc: u64, mp_exp: i32, delta: u64, sign: i32): i32 {\n var one_exp = -mp_exp;\n var one_frc = (1) << one_exp;\n var mask = one_frc - 1;\n\n var wp_w_frc = mp_frc - w_frc;\n var wp_w_exp = mp_exp;\n\n var p1 = (mp_frc >> one_exp);\n var p2 = mp_frc & mask;\n\n var kappa = decimalCount32(p1);\n var len = sign;\n\n var powers10 = POWERS10().buffer_;\n\n while (kappa > 0) {\n let d: u32;\n switch (kappa) {\n case 10: { d = p1 / 1000000000; p1 %= 1000000000; break; }\n case 9: { d = p1 / 100000000; p1 %= 100000000; break; }\n case 8: { d = p1 / 10000000; p1 %= 10000000; break; }\n case 7: { d = p1 / 1000000; p1 %= 1000000; break; }\n case 6: { d = p1 / 100000; p1 %= 100000; break; }\n case 5: { d = p1 / 10000; p1 %= 10000; break; }\n case 4: { d = p1 / 1000; p1 %= 1000; break; }\n case 3: { d = p1 / 100; p1 %= 100; break; }\n case 2: { d = p1 / 10; p1 %= 10; break; }\n case 1: { d = p1; p1 = 0; break; }\n default: { d = 0; break; }\n }\n\n if (d | len) store(buffer + (len++ << 1), CharCode._0 + d, STRING_HEADER_SIZE);\n\n --kappa;\n let tmp = ((p1) << one_exp) + p2;\n if (tmp <= delta) {\n _K += kappa;\n grisuRound(buffer, len, delta, tmp, LOAD(powers10, kappa) << one_exp, wp_w_frc);\n return len;\n }\n }\n\n while (1) {\n p2 *= 10;\n delta *= 10;\n\n let d = p2 >> one_exp;\n if (d | len) store(buffer + (len++ << 1), CharCode._0 + d, STRING_HEADER_SIZE);\n\n p2 &= mask;\n --kappa;\n if (p2 < delta) {\n _K += kappa;\n wp_w_frc *= LOAD(powers10, -kappa);\n grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc);\n return len;\n }\n }\n\n return len;\n}\n\n@inline\nfunction genExponent(buffer: usize, k: i32): i32 {\n var sign = k < 0;\n if (sign) k = -k;\n var decimals = decimalCount32(k) + 1;\n utoa32_core(buffer, k, decimals);\n store(buffer, select(CharCode.MINUS, CharCode.PLUS, sign), STRING_HEADER_SIZE);\n return decimals;\n}\n\nfunction prettify(buffer: usize, length: i32, k: i32): i32 {\n if (!k) {\n store(buffer + (length << 1), CharCode.DOT | (CharCode._0 << 16), STRING_HEADER_SIZE);\n return length + 2;\n }\n\n var kk = length + k;\n if (length <= kk && kk <= 21) {\n // 1234e7 -> 12340000000\n for (let i = length; i < kk; ++i) {\n store(buffer + (i << 1), CharCode._0, STRING_HEADER_SIZE);\n }\n store(buffer + (kk << 1), CharCode.DOT | (CharCode._0 << 16), STRING_HEADER_SIZE);\n return kk + 2;\n } else if (kk > 0 && kk <= 21) {\n // 1234e-2 -> 12.34\n let ptr = buffer + (kk << 1);\n memory.copy(\n ptr + STRING_HEADER_SIZE + 2,\n ptr + STRING_HEADER_SIZE,\n -k << 1\n );\n store(buffer + (kk << 1), CharCode.DOT, STRING_HEADER_SIZE);\n return length + 1;\n } else if (-6 < kk && kk <= 0) {\n // 1234e-6 -> 0.001234\n let offset = 2 - kk;\n memory.copy(\n buffer + STRING_HEADER_SIZE + (offset << 1),\n buffer + STRING_HEADER_SIZE,\n length << 1\n );\n store(buffer, CharCode._0 | (CharCode.DOT << 16), STRING_HEADER_SIZE);\n for (let i = 2; i < offset; ++i) {\n store(buffer + (i << 1), CharCode._0, STRING_HEADER_SIZE);\n }\n return length + offset;\n } else if (length == 1) {\n // 1e30\n store(buffer, CharCode.e, STRING_HEADER_SIZE + 2);\n length = genExponent(buffer + 4, kk - 1);\n return length + 2;\n } else {\n let len = length << 1;\n memory.copy(\n buffer + STRING_HEADER_SIZE + 4,\n buffer + STRING_HEADER_SIZE + 2,\n len - 2\n );\n store(buffer, CharCode.DOT, STRING_HEADER_SIZE + 2);\n store(buffer + len, CharCode.e, STRING_HEADER_SIZE + 2);\n length += genExponent(buffer + len + 4, kk - 1);\n return length + 2;\n }\n}\n\nexport function dtoa_core(buffer: usize, value: f64): i32 {\n var sign = (value < 0);\n if (sign) {\n value = -value;\n store(buffer, CharCode.MINUS, STRING_HEADER_SIZE);\n }\n // assert(value > 0 && value <= 1.7976931348623157e308);\n var len = grisu2(value, buffer, sign);\n len = prettify(buffer + (sign << 1), len - sign, _K);\n return len + sign;\n}\n\nexport function dtoa(value: f64): String {\n if (value == 0) return "0.0";\n if (!isFinite(value)) {\n if (isNaN(value)) return "NaN";\n return select("-Infinity", "Infinity", value < 0);\n }\n var buffer = allocateUnsafeString(MAX_DOUBLE_LENGTH);\n var length = dtoa_core(changetype(buffer), value);\n var result = buffer.substring(0, length);\n freeUnsafeString(buffer);\n return result;\n}\n\nexport function itoa_stream(buffer: usize, offset: usize, value: T): u32 {\n buffer += (offset << 1);\n if (!value) {\n store(buffer, CharCode._0, STRING_HEADER_SIZE);\n return 1;\n }\n var decimals: u32 = 0;\n if (isSigned()) {\n let sign = value < 0;\n if (sign) value = -value;\n if (sizeof() <= 4) {\n decimals = decimalCount32(value) + sign;\n utoa32_core(buffer, value, decimals);\n } else {\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n decimals = decimalCount32(val32) + sign;\n utoa32_core(buffer, val32, decimals);\n } else {\n decimals = decimalCount64(value) + sign;\n utoa64_core(buffer, value, decimals);\n }\n }\n if (sign) store(buffer, CharCode.MINUS, STRING_HEADER_SIZE);\n } else {\n if (sizeof() <= 4) {\n decimals = decimalCount32(value);\n utoa32_core(buffer, value, decimals);\n } else {\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n decimals = decimalCount32(val32);\n utoa32_core(buffer, val32, decimals);\n } else {\n decimals = decimalCount64(value);\n utoa64_core(buffer, value, decimals);\n }\n }\n }\n return decimals;\n}\n\nexport function dtoa_stream(buffer: usize, offset: usize, value: f64): u32 {\n buffer += (offset << 1);\n if (value == 0.0) {\n store(buffer, CharCode._0, STRING_HEADER_SIZE + 0);\n store(buffer, CharCode.DOT, STRING_HEADER_SIZE + 2);\n store(buffer, CharCode._0, STRING_HEADER_SIZE + 4);\n return 3;\n }\n if (!isFinite(value)) {\n if (isNaN(value)) {\n store(buffer, CharCode.N, STRING_HEADER_SIZE + 0);\n store(buffer, CharCode.a, STRING_HEADER_SIZE + 2);\n store(buffer, CharCode.N, STRING_HEADER_SIZE + 4);\n return 3;\n } else {\n let sign = (value < 0);\n let len = 8 + sign;\n let source = changetype(select("-Infinity", "Infinity", sign));\n memory.copy(buffer + STRING_HEADER_SIZE, source + STRING_HEADER_SIZE, len << 1);\n return len;\n }\n }\n return dtoa_core(buffer, value);\n}\n',"internal/sort":"import {\n LOAD,\n STORE\n} from \"./arraybuffer\";\n\nimport {\n compareUnsafe\n} from \"./string\";\n\n/** Obtains the default comparator for the specified value type. */\n@inline\nexport function COMPARATOR(): (a: T, b: T) => i32 {\n if (isInteger()) {\n if (isSigned() && sizeof() <= 4) {\n return (a: T, b: T): i32 => ((a - b));\n } else {\n return (a: T, b: T): i32 => ((a > b) - (a < b));\n }\n } else if (isFloat()) {\n if (sizeof() == 4) {\n return (a: T, b: T): i32 => {\n var ia = reinterpret(a);\n var ib = reinterpret(b);\n ia ^= (ia >> 31) >>> 1;\n ib ^= (ib >> 31) >>> 1;\n return (ia > ib) - (ia < ib);\n };\n } else {\n return (a: T, b: T): i32 => {\n var ia = reinterpret(a);\n var ib = reinterpret(b);\n ia ^= (ia >> 63) >>> 1;\n ib ^= (ib >> 63) >>> 1;\n return (ia > ib) - (ia < ib);\n };\n }\n } else if (isString()) {\n return (a: T, b: T): i32 => {\n var sa = a, sb = b;\n return compareUnsafe(sa, 0, sb, 0, min(sa.length, sb.length));\n };\n } else {\n return (a: T, b: T): i32 => ((a > b) - (a < b));\n }\n}\n\n@inline\nexport function SORT(\n buffer: ArrayBuffer,\n byteOffset: i32,\n length: i32,\n comparator: (a: T, b: T) => i32\n): void {\n if (isReference()) {\n // TODO replace this to faster stable sort (TimSort) when it implemented\n insertionSort(buffer, byteOffset, length, comparator);\n } else {\n if (length < 256) {\n insertionSort(buffer, byteOffset, length, comparator);\n } else {\n weakHeapSort(buffer, byteOffset, length, comparator);\n }\n }\n}\n\n/** Sorts an Array with the 'Insertion Sort' algorithm. */\nfunction insertionSort(\n buffer: ArrayBuffer,\n byteOffset: i32,\n length: i32,\n comparator: (a: T, b: T) => i32\n): void {\n for (let i = 0; i < length; i++) {\n let a = LOAD(buffer, i, byteOffset); // a = arr[i]\n let j = i - 1;\n while (j >= 0) {\n let b = LOAD(buffer, j, byteOffset); // b = arr[j]\n if (comparator(a, b) < 0) {\n STORE(buffer, j-- + 1, b, byteOffset); // arr[j + 1] = b\n } else break;\n }\n STORE(buffer, j + 1, a, byteOffset); // arr[j + 1] = a\n }\n}\n\n/** Sorts an Array with the 'Weak Heap Sort' algorithm. */\nfunction weakHeapSort(\n buffer: ArrayBuffer,\n byteOffset: i32,\n length: i32,\n comparator: (a: T, b: T) => i32\n): void {\n const shift32 = alignof();\n\n var bitsetSize = (length + 31) >> 5 << shift32;\n var bitset = memory.allocate(bitsetSize); // indexed in 32-bit chunks below\n memory.fill(bitset, 0, bitsetSize);\n\n // see: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.21.1863&rep=rep1&type=pdf\n\n for (let i = length - 1; i > 0; i--) {\n let j = i;\n while ((j & 1) == (load(bitset + (j >> 6 << shift32)) >> (j >> 1 & 31) & 1)) j >>= 1;\n\n let p = j >> 1;\n let a = LOAD(buffer, p, byteOffset); // a = arr[p]\n let b = LOAD(buffer, i, byteOffset); // b = arr[i]\n if (comparator(a, b) < 0) {\n store(\n bitset + (i >> 5 << shift32),\n load(bitset + (i >> 5 << shift32)) ^ (1 << (i & 31))\n );\n STORE(buffer, i, a, byteOffset); // arr[i] = a\n STORE(buffer, p, b, byteOffset); // arr[p] = b\n }\n }\n\n for (let i = length - 1; i >= 2; i--) {\n let a = LOAD(buffer, 0, byteOffset);\n STORE(buffer, 0, LOAD(buffer, i, byteOffset), byteOffset);\n STORE(buffer, i, a, byteOffset);\n\n let x = 1, y: i32;\n while ((y = (x << 1) + ((load(bitset + (x >> 5 << shift32)) >> (x & 31)) & 1)) < i) x = y;\n\n while (x > 0) {\n a = LOAD(buffer, 0, byteOffset); // a = arr[0]\n let b = LOAD(buffer, x, byteOffset); // b = arr[x]\n\n if (comparator(a, b) < 0) {\n store(\n bitset + (x >> 5 << shift32),\n load(bitset + (x >> 5 << shift32)) ^ (1 << (x & 31))\n );\n STORE(buffer, x, a, byteOffset); // arr[x] = a\n STORE(buffer, 0, b, byteOffset); // arr[0] = b\n }\n x >>= 1;\n }\n }\n\n memory.free(bitset);\n\n var t = LOAD(buffer, 1, byteOffset); // t = arr[1]\n STORE(buffer, 1, LOAD(buffer, 0, byteOffset), byteOffset);\n STORE(buffer, 0, t, byteOffset); // arr[0] = t\n}\n","internal/string":'import { MAX_SIZE_32 } from "./allocator";\nimport { String } from "../string";\n\n/** Size of a String header. */\nexport const HEADER_SIZE = (offsetof() + 1) & ~1; // 2 byte aligned\n/** Maximum length of a String. */\nexport const MAX_LENGTH = (MAX_SIZE_32 - HEADER_SIZE) >>> 1;\n\n// Low-level utility\n\nfunction __gc(ref: usize): void {}\n\nexport function allocateUnsafe(length: i32): String {\n assert(length > 0 && length <= MAX_LENGTH);\n var buffer: usize;\n if (isManaged()) {\n buffer = __gc_allocate(HEADER_SIZE + (length << 1), __gc); // tslint:disable-line\n } else {\n buffer = memory.allocate(HEADER_SIZE + (length << 1));\n }\n store(buffer, length);\n return changetype(buffer);\n}\n\n@inline\nexport function freeUnsafe(buffer: String): void {\n if (!isManaged()) {\n assert(buffer);\n memory.free(changetype(buffer));\n }\n}\n\nexport function copyUnsafe(dest: String, destOffset: usize, src: String, srcOffset: usize, len: usize): void {\n memory.copy(\n changetype(dest) + (destOffset << 1) + HEADER_SIZE,\n changetype(src) + (srcOffset << 1) + HEADER_SIZE,\n len << 1\n );\n}\n\nexport function compareUnsafe(str1: String, offset1: usize, str2: String, offset2: usize, len: usize): i32 {\n var cmp: i32 = 0;\n var ptr1 = changetype(str1) + (offset1 << 1);\n var ptr2 = changetype(str2) + (offset2 << 1);\n while (len && !(cmp = load(ptr1, HEADER_SIZE) - load(ptr2, HEADER_SIZE))) {\n --len, ptr1 += 2, ptr2 += 2;\n }\n return cmp;\n}\n\nexport function repeatUnsafe(dest: String, destOffset: usize, src: String, count: i32): void {\n var length = src.length;\n if (ASC_SHRINK_LEVEL > 1) {\n let strLen = length << 1;\n let to = changetype(dest) + HEADER_SIZE + (destOffset << 1);\n let from = changetype(src) + HEADER_SIZE;\n for (let i = 0, len = strLen * count; i < len; i += strLen) {\n memory.copy(to + i, from, strLen);\n }\n } else {\n switch (length) {\n case 0: break;\n case 1: {\n let cc = load(changetype(src), HEADER_SIZE);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 1), cc, HEADER_SIZE);\n }\n break;\n }\n case 2: {\n let cc = load(changetype(src), HEADER_SIZE);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 2), cc, HEADER_SIZE);\n }\n break;\n }\n case 3: {\n let cc1 = load(changetype(src), HEADER_SIZE + 0);\n let cc2 = load(changetype(src), HEADER_SIZE + 4);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 2), cc1, HEADER_SIZE + 0);\n store(out + (i << 1), cc2, HEADER_SIZE + 4);\n }\n break;\n }\n case 4: {\n let cc = load(changetype(src), HEADER_SIZE);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 3), cc, HEADER_SIZE);\n }\n break;\n }\n default: {\n let strLen = length << 1;\n let to = changetype(dest) + HEADER_SIZE + (destOffset << 1);\n let from = changetype(src) + HEADER_SIZE;\n for (let i = 0, len = strLen * count; i < len; i += strLen) {\n memory.copy(to + i, from, strLen);\n }\n break;\n }\n }\n }\n}\n\n// Helpers\n\nexport const enum CharCode {\n PLUS = 0x2B,\n MINUS = 0x2D,\n DOT = 0x2E,\n _0 = 0x30,\n _1 = 0x31,\n _2 = 0x32,\n _3 = 0x33,\n _4 = 0x34,\n _5 = 0x35,\n _6 = 0x36,\n _7 = 0x37,\n _8 = 0x38,\n _9 = 0x39,\n A = 0x41,\n B = 0x42,\n E = 0x45,\n N = 0x4E,\n O = 0x4F,\n X = 0x58,\n Z = 0x5a,\n a = 0x61,\n b = 0x62,\n e = 0x65,\n n = 0x6E,\n o = 0x6F,\n x = 0x78,\n z = 0x7A\n}\n\nexport function isWhiteSpaceOrLineTerminator(c: u16): bool {\n switch (c) {\n case 9: // \n case 10: // \n case 13: // \n case 11: // \n case 12: // \n case 32: // \n case 160: // \n case 8232: // \n case 8233: // \n case 65279: return true; // \n default: return false;\n }\n}\n\n/** Parses a string to an integer (usually), using the specified radix. */\nexport function parse(str: String, radix: i32 = 0): T {\n var len: i32 = str.length;\n if (!len) return NaN;\n\n var ptr = changetype(str) /* + HEAD -> offset */;\n var code = load(ptr, HEADER_SIZE);\n\n // determine sign\n var sign: T;\n if (code == CharCode.MINUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = 1;\n } else {\n sign = 1;\n }\n\n // determine radix\n if (!radix) {\n if (code == CharCode._0 && len > 2) {\n switch (load(ptr + 2, HEADER_SIZE)) {\n case CharCode.B:\n case CharCode.b: {\n ptr += 4; len -= 2;\n radix = 2;\n break;\n }\n case CharCode.O:\n case CharCode.o: {\n ptr += 4; len -= 2;\n radix = 8;\n break;\n }\n case CharCode.X:\n case CharCode.x: {\n ptr += 4; len -= 2;\n radix = 16;\n break;\n }\n default: radix = 10;\n }\n } else radix = 10;\n } else if (radix < 2 || radix > 36) {\n return NaN;\n }\n\n // calculate value\n var num: T = 0;\n while (len--) {\n code = load(ptr, HEADER_SIZE);\n if (code >= CharCode._0 && code <= CharCode._9) {\n code -= CharCode._0;\n } else if (code >= CharCode.A && code <= CharCode.Z) {\n code -= CharCode.A - 10;\n } else if (code >= CharCode.a && code <= CharCode.z) {\n code -= CharCode.a - 10;\n } else break;\n if (code >= radix) break;\n num = (num * radix) + code;\n ptr += 2;\n }\n return sign * num;\n}\n',"internal/typedarray":'import {\n HEADER_SIZE as AB_HEADER_SIZE,\n MAX_BLENGTH as AB_MAX_BLENGTH,\n allocateUnsafe,\n LOAD,\n STORE\n} from "./arraybuffer";\n\nimport {\n SORT as SORT_IMPL\n} from "./sort";\n\n/** Typed array base class. Not a global object. */\nexport abstract class TypedArray {\n [key: number]: T; // compatibility only\n\n readonly buffer: ArrayBuffer;\n readonly byteOffset: i32;\n readonly byteLength: i32;\n\n constructor(length: i32) {\n const MAX_LENGTH = AB_MAX_BLENGTH / sizeof();\n if (length > MAX_LENGTH) throw new RangeError("Invalid typed array length");\n var byteLength = length << alignof();\n var buffer = allocateUnsafe(byteLength);\n memory.fill(changetype(buffer) + AB_HEADER_SIZE, 0, byteLength);\n this.buffer = buffer;\n this.byteOffset = 0;\n this.byteLength = byteLength;\n }\n\n @inline\n get length(): i32 {\n return this.byteLength >>> alignof();\n }\n\n @operator("[]")\n protected __get(index: i32): T {\n if (index >= (this.byteLength >>> alignof())) throw new Error("Index out of bounds");\n return LOAD(this.buffer, index, this.byteOffset);\n }\n\n @inline @operator("{}")\n protected __unchecked_get(index: i32): T {\n return LOAD(this.buffer, index, this.byteOffset);\n }\n\n @operator("[]=")\n protected __set(index: i32, value: NATIVE): void {\n if (index >= (this.byteLength >>> alignof())) throw new Error("Index out of bounds");\n STORE>(this.buffer, index, value, this.byteOffset);\n }\n\n @inline @operator("{}=")\n protected __unchecked_set(index: i32, value: NATIVE): void {\n STORE>(this.buffer, index, value, this.byteOffset);\n }\n\n // copyWithin(target: i32, start: i32, end: i32 = this.length): this\n}\n\n@inline\nexport function FILL, T extends number>(\n array: TArray,\n value: NATIVE,\n start: i32,\n end: i32\n): TArray {\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n var len = array.length;\n start = start < 0 ? max(len + start, 0) : min(start, len);\n end = end < 0 ? max(len + end, 0) : min(end, len);\n if (sizeof() == 1) {\n if (start < end) {\n memory.fill(\n changetype(buffer) + start + byteOffset + AB_HEADER_SIZE,\n value,\n (end - start)\n );\n }\n } else {\n for (; start < end; ++start) {\n STORE>(buffer, start, value, byteOffset);\n }\n }\n return array;\n}\n\n@inline\nexport function SORT, T>(\n array: TArray,\n comparator: (a: T, b: T) => i32\n): TArray {\n var byteOffset = array.byteOffset;\n var length = array.length;\n if (length <= 1) return array;\n var buffer = array.buffer;\n if (length == 2) {\n let a = LOAD(buffer, 1, byteOffset);\n let b = LOAD(buffer, 0, byteOffset);\n if (comparator(a, b) < 0) {\n STORE(buffer, 1, b, byteOffset);\n STORE(buffer, 0, a, byteOffset);\n }\n return array;\n }\n SORT_IMPL(buffer, byteOffset, length, comparator);\n return array;\n}\n\n@inline\nexport function SUBARRAY, T>(\n array: TArray,\n begin: i32,\n end: i32\n): TArray {\n var length = array.length;\n if (begin < 0) begin = max(length + begin, 0);\n else begin = min(begin, length);\n if (end < 0) end = max(length + end, begin);\n else end = max(min(end, length), begin);\n var slice = memory.allocate(offsetof());\n store(slice, array.buffer, offsetof("buffer"));\n store(slice, array.byteOffset + (begin << alignof()), offsetof("byteOffset"));\n store(slice, (end - begin) << alignof(), offsetof("byteLength"));\n return changetype(slice);\n}\n\n@inline\nexport function REDUCE, T, TRet>(\n array: TArray,\n callbackfn: (accumulator: TRet, value: T, index: i32, array: TArray) => TRet,\n initialValue: TRet\n): TRet {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n initialValue = callbackfn(\n initialValue,\n LOAD(buffer, i, byteOffset),\n i,\n array,\n );\n }\n return initialValue;\n}\n\n@inline\nexport function REDUCE_RIGHT, T, TRet>(\n array: TArray,\n callbackfn: (accumulator: TRet, value: T, index: i32, array: TArray) => TRet,\n initialValue: TRet\n): TRet {\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = array.length - 1; i >= 0; i--) {\n initialValue = callbackfn(\n initialValue,\n LOAD(buffer, i, byteOffset),\n i,\n array,\n );\n }\n return initialValue;\n}\n\n@inline\nexport function MAP, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, self: TArray) => T,\n): TArray {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n var result = instantiate(length);\n var resultBuffer = result.buffer;\n for (let i = 0; i < length; i++) {\n STORE>(resultBuffer, i, >callbackfn(LOAD(buffer, i, byteOffset), i, array));\n }\n\n return result;\n}\n\n@inline\nexport function FIND_INDEX, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, array: TArray) => bool,\n): i32 {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n if (callbackfn(LOAD(buffer, i, byteOffset), i, array)) {\n return i;\n }\n }\n return -1;\n}\n\n@inline\nexport function SOME, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, array: TArray) => bool,\n): bool {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n if (callbackfn(LOAD(buffer, i, byteOffset), i, array)) {\n return true;\n }\n }\n return false;\n}\n\n@inline\nexport function EVERY, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, array: TArray) => bool,\n): bool {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n if (callbackfn(LOAD(buffer, i, byteOffset), i, array)) {\n continue;\n }\n return false;\n }\n return true;\n}\n',iterator:"export abstract class Iterable {\n // ?\n}\n\n@sealed\nexport abstract class Iterator {\n\n // private constructor(iterable: Iterable) {\n // }\n\n // TODO: these need to evaluate the classId at the respective reference in order to obtain the\n // next value, i.e. arrays work differently than maps. we'd then have:\n //\n // ╒═══════════════════ Iterator layout (32-bit) ══════════════════╕\n // 3 2 1\n // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n // ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┤\n // │ index │\n // ├─────────────────────────────────────────────────────────┬───┬─┤\n // │ reference │ 0 │D│\n // └─────────────────────────────────────────────────────────┴───┴─┘\n // D: Done flag\n\n // get value(this: u64): T {\n // ?\n // }\n\n // next(this: u64): Iterator {\n // ?\n // }\n\n done(this: u64): bool {\n return (this & 1);\n }\n}\n",map:'import {\n HEADER_SIZE as HEADER_SIZE_AB\n} from "./internal/arraybuffer";\n\nimport {\n HASH\n} from "./internal/hash";\n\n// A deterministic hash map based on CloseTable from https://github.com/jorendorff/dht\n\nconst INITIAL_CAPACITY = 4;\nconst FILL_FACTOR: f64 = 8 / 3;\nconst FREE_FACTOR: f64 = 3 / 4;\n\n/** Structure of a map entry. */\n@unmanaged class MapEntry {\n key: K;\n value: V;\n taggedNext: usize; // LSB=1 indicates EMPTY\n}\n\n/** Empty bit. */\nconst EMPTY: usize = 1 << 0;\n\n/** Size of a bucket. */\nconst BUCKET_SIZE = sizeof();\n\n/** Computes the alignment of an entry. */\n@inline function ENTRY_ALIGN(): usize {\n // can align to 4 instead of 8 if 32-bit and K/V is <= 32-bits\n const maxkv = sizeof() > sizeof() ? sizeof() : sizeof();\n const align = (maxkv > sizeof() ? maxkv : sizeof()) - 1;\n return align;\n}\n\n/** Computes the aligned size of an entry. */\n@inline function ENTRY_SIZE(): usize {\n const align = ENTRY_ALIGN();\n const size = (offsetof>() + align) & ~align;\n return size;\n}\n\nexport class Map {\n\n // buckets holding references to the respective first entry within\n private buckets: ArrayBuffer; // usize[bucketsMask + 1]\n private bucketsMask: u32;\n\n // entries in insertion order\n private entries: ArrayBuffer; // MapEntry[entriesCapacity]\n private entriesCapacity: i32;\n private entriesOffset: i32;\n private entriesCount: i32;\n\n get size(): i32 { return this.entriesCount; }\n\n constructor() { this.clear(); }\n\n clear(): void {\n const bucketsSize = INITIAL_CAPACITY * BUCKET_SIZE;\n this.buckets = new ArrayBuffer(bucketsSize);\n this.bucketsMask = INITIAL_CAPACITY - 1;\n const entriesSize = INITIAL_CAPACITY * ENTRY_SIZE();\n this.entries = new ArrayBuffer(entriesSize, true);\n this.entriesCapacity = INITIAL_CAPACITY;\n this.entriesOffset = 0;\n this.entriesCount = 0;\n }\n\n private find(key: K, hashCode: u32): MapEntry | null {\n var entry = load>(\n changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE,\n HEADER_SIZE_AB\n );\n while (entry) {\n if (!(entry.taggedNext & EMPTY) && entry.key == key) return entry;\n entry = changetype>(entry.taggedNext & ~EMPTY);\n }\n return null;\n }\n\n has(key: K): bool {\n return this.find(key, HASH(key)) !== null;\n }\n\n get(key: K): V {\n var entry = this.find(key, HASH(key));\n return entry ? entry.value : unreachable();\n }\n\n set(key: K, value: V): void {\n var hashCode = HASH(key);\n var entry = this.find(key, hashCode);\n if (entry) {\n entry.value = value;\n } else {\n // check if rehashing is necessary\n if (this.entriesOffset == this.entriesCapacity) {\n this.rehash(\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ? this.bucketsMask // just rehash if 1/4+ entries are empty\n : (this.bucketsMask << 1) | 1 // grow capacity to next 2^N\n );\n }\n // append new entry\n let entries = this.entries;\n entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + this.entriesOffset++ * ENTRY_SIZE()\n );\n entry.key = key;\n entry.value = value;\n ++this.entriesCount;\n // link with previous entry in bucket\n let bucketPtrBase = changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE;\n entry.taggedNext = load(bucketPtrBase, HEADER_SIZE_AB);\n store(bucketPtrBase, changetype(entry), HEADER_SIZE_AB);\n if (isManaged()) __gc_link(changetype(this), changetype(key)); // tslint:disable-line\n if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line\n }\n }\n\n delete(key: K): bool {\n var entry = this.find(key, HASH(key));\n if (!entry) return false;\n entry.taggedNext |= EMPTY;\n --this.entriesCount;\n // check if rehashing is appropriate\n var halfBucketsMask = this.bucketsMask >> 1;\n if (\n halfBucketsMask + 1 >= max(INITIAL_CAPACITY, this.entriesCount) &&\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ) this.rehash(halfBucketsMask);\n return true;\n }\n\n private rehash(newBucketsMask: u32): void {\n var newBucketsCapacity = (newBucketsMask + 1);\n var newBuckets = new ArrayBuffer(newBucketsCapacity * BUCKET_SIZE);\n var newEntriesCapacity = (newBucketsCapacity * FILL_FACTOR);\n var newEntries = new ArrayBuffer(newEntriesCapacity * ENTRY_SIZE(), true);\n\n // copy old entries to new entries\n var oldPtr = changetype(this.entries) + HEADER_SIZE_AB;\n var oldEnd = oldPtr + this.entriesOffset * ENTRY_SIZE();\n var newPtr = changetype(newEntries) + HEADER_SIZE_AB;\n while (oldPtr != oldEnd) {\n let oldEntry = changetype>(oldPtr);\n if (!(oldEntry.taggedNext & EMPTY)) {\n let newEntry = changetype>(newPtr);\n newEntry.key = oldEntry.key;\n newEntry.value = oldEntry.value;\n let newBucketIndex = HASH(oldEntry.key) & newBucketsMask;\n let newBucketPtrBase = changetype(newBuckets) + newBucketIndex * BUCKET_SIZE;\n newEntry.taggedNext = load(newBucketPtrBase, HEADER_SIZE_AB);\n store(newBucketPtrBase, newPtr, HEADER_SIZE_AB);\n newPtr += ENTRY_SIZE();\n }\n oldPtr += ENTRY_SIZE();\n }\n\n this.buckets = newBuckets;\n this.bucketsMask = newBucketsMask;\n this.entries = newEntries;\n this.entriesCapacity = newEntriesCapacity;\n this.entriesOffset = this.entriesCount;\n }\n\n toString(): string {\n return "[object Map]";\n }\n\n private __gc(): void {\n __gc_mark(changetype(this.buckets)); // tslint:disable-line\n var entries = this.entries;\n __gc_mark(changetype(entries)); // tslint:disable-line\n if (isManaged() || isManaged()) {\n let offset: usize = 0;\n let end: usize = this.entriesOffset * ENTRY_SIZE();\n while (offset < end) {\n let entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + offset * ENTRY_SIZE()\n );\n if (!(entry.taggedNext & EMPTY)) {\n if (isManaged()) __gc_mark(changetype(entry.key)); // tslint:disable-line\n if (isManaged()) __gc_mark(changetype(entry.value)); // tslint:disable-line\n }\n offset += ENTRY_SIZE();\n }\n }\n }\n}\n',math:'import * as JSMath from "./bindings/Math";\nexport { JSMath };\n\nimport {\n abs as builtin_abs,\n ceil as builtin_ceil,\n clz as builtin_clz,\n copysign as builtin_copysign,\n floor as builtin_floor,\n max as builtin_max,\n min as builtin_min,\n sqrt as builtin_sqrt,\n trunc as builtin_trunc\n} from "./builtins";\n\n// SUN COPYRIGHT NOTICE\n//\n// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n// Developed at SunPro, a Sun Microsystems, Inc. business.\n// Permission to use, copy, modify, and distribute this software\n// is freely granted, provided that this notice is preserved.\n//\n// Applies to all functions marked with a comment referring here.\n\n// TODO: sin, cos, tan\n\n/** @internal */\nfunction R(z: f64): f64 { // Rational approximation of (asin(x)-x)/x^3\n const // see: musl/src/math/asin.c and SUN COPYRIGHT NOTICE above\n pS0 = reinterpret(0x3FC5555555555555), // 1.66666666666666657415e-01\n pS1 = reinterpret(0xBFD4D61203EB6F7D), // -3.25565818622400915405e-01\n pS2 = reinterpret(0x3FC9C1550E884455), // 2.01212532134862925881e-01\n pS3 = reinterpret(0xBFA48228B5688F3B), // -4.00555345006794114027e-02\n pS4 = reinterpret(0x3F49EFE07501B288), // 7.91534994289814532176e-04\n pS5 = reinterpret(0x3F023DE10DFDF709), // 3.47933107596021167570e-05\n qS1 = reinterpret(0xC0033A271C8A2D4B), // -2.40339491173441421878e+00\n qS2 = reinterpret(0x40002AE59C598AC8), // 2.02094576023350569471e+00\n qS3 = reinterpret(0xBFE6066C1B8D0159), // -6.88283971605453293030e-01\n qS4 = reinterpret(0x3FB3B8C5B12E9282); // 7.70381505559019352791e-02\n var p = z * (pS0 + z * (pS1 + z * (pS2 + z * (pS3 + z * (pS4 + z * pS5)))));\n var q = 1.0 + z * (qS1 + z * (qS2 + z * (qS3 + z * qS4)));\n return p / q;\n}\n\n@inline /** @internal */\nfunction expo2(x: f64): f64 { // exp(x)/2 for x >= log(DBL_MAX)\n const // see: musl/src/math/__expo2.c\n k = 2043,\n kln2 = reinterpret(0x40962066151ADD8B); // 0x1.62066151add8bp+10\n var scale = reinterpret(((0x3FF + k / 2) << 20) << 32);\n return NativeMath.exp(x - kln2) * scale * scale;\n}\n\nvar random_seeded = false;\nvar random_state0_64: u64;\nvar random_state1_64: u64;\nvar random_state0_32: u32;\nvar random_state1_32: u32;\n\n/** @internal */\nfunction murmurHash3(h: u64): u64 { // Force all bits of a hash block to avalanche\n h ^= h >> 33; // see: https://github.com/aappleby/smhasher\n h *= 0xFF51AFD7ED558CCD;\n h ^= h >> 33;\n h *= 0xC4CEB9FE1A85EC53;\n h ^= h >> 33;\n return h;\n}\n\n/** @internal */\nfunction splitMix32(h: u32): u32 {\n h += 0x6D2B79F5;\n h = (h ^ (h >> 15)) * (h | 1);\n h ^= h + (h ^ (h >> 7)) * (h | 61);\n return h ^ (h >> 14);\n}\n\nexport namespace NativeMath {\n\n export const E = reinterpret(0x4005BF0A8B145769); // 2.7182818284590452354\n export const LN2 = reinterpret(0x3FE62E42FEFA39EF); // 0.69314718055994530942\n export const LN10 = reinterpret(0x40026BB1BBB55516); // 2.30258509299404568402\n export const LOG2E = reinterpret(0x3FF71547652B82FE); // 1.4426950408889634074\n export const LOG10E = reinterpret(0x3FDBCB7B1526E50E); // 0.43429448190325182765\n export const PI = reinterpret(0x400921FB54442D18); // 3.14159265358979323846\n export const SQRT1_2 = reinterpret(0x3FE6A09E667F3BCD); // 0.70710678118654752440\n export const SQRT2 = reinterpret(0x3FF6A09E667F3BCD); // 1.41421356237309504880\n\n @inline\n export function abs(x: f64): f64 {\n return builtin_abs(x);\n }\n\n export function acos(x: f64): f64 { // see: musl/src/math/acos.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n pio2_lo = reinterpret(0x3C91A62633145C07), // 6.12323399573676603587e-17\n Ox1p_120f = reinterpret(0x03800000);\n var hx = (reinterpret(x) >> 32);\n var ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3FF00000) {\n let lx = reinterpret(x);\n if ((ix - 0x3FF00000 | lx) == 0) {\n if (hx >> 31) return 2 * pio2_hi + Ox1p_120f;\n return 0;\n }\n return 0 / (x - x);\n }\n if (ix < 0x3FE00000) {\n if (ix <= 0x3C600000) return pio2_hi + Ox1p_120f;\n return pio2_hi - (x - (pio2_lo - x * R(x * x)));\n }\n var s: f64, w: f64, z: f64;\n if (hx >> 31) {\n // z = (1.0 + x) * 0.5;\n z = 0.5 + x * 0.5;\n s = builtin_sqrt(z);\n w = R(z) * s - pio2_lo;\n return 2 * (pio2_hi - (s + w));\n }\n // z = (1.0 - x) * 0.5;\n z = 0.5 - x * 0.5;\n s = builtin_sqrt(z);\n var df = reinterpret(reinterpret(s) & 0xFFFFFFFF00000000);\n var c = (z - df * df) / (s + df);\n w = R(z) * s + c;\n return 2 * (df + w);\n }\n\n export function acosh(x: f64): f64 { // see: musl/src/math/acosh.c\n const s = reinterpret(0x3FE62E42FEFA39EF);\n var e = reinterpret(x) >> 52 & 0x7FF;\n if (e < 0x3FF + 1) return log1p(x - 1 + builtin_sqrt((x - 1) * (x - 1) + 2 * (x - 1)));\n if (e < 0x3FF + 26) return log(2 * x - 1 / (x + builtin_sqrt(x * x - 1)));\n return log(x) + s;\n }\n\n export function asin(x: f64): f64 { // see: musl/src/math/asin.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n pio2_lo = reinterpret(0x3C91A62633145C07), // 6.12323399573676603587e-17\n Ox1p_120f = reinterpret(0x03800000);\n var hx = (reinterpret(x) >> 32);\n var ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3FF00000) {\n let lx = reinterpret(x);\n if ((ix - 0x3FF00000 | lx) == 0) return x * pio2_hi + Ox1p_120f;\n return 0 / (x - x);\n }\n if (ix < 0x3FE00000) {\n if (ix < 0x3E500000 && ix >= 0x00100000) return x;\n return x + x * R(x * x);\n }\n // var z = (1.0 - builtin_abs(x)) * 0.5;\n var z = 0.5 - builtin_abs(x) * 0.5;\n var s = builtin_sqrt(z);\n var r = R(z);\n if (ix >= 0x3FEF3333) x = pio2_hi - (2 * (s + s * r) - pio2_lo);\n else {\n let f = reinterpret(reinterpret(s) & 0xFFFFFFFF00000000);\n let c = (z - f * f) / (s + f);\n x = 0.5 * pio2_hi - (2 * s * r - (pio2_lo - 2 * c) - (0.5 * pio2_hi - 2 * f));\n }\n if (hx >> 31) return -x;\n return x;\n }\n\n export function asinh(x: f64): f64 { // see: musl/src/math/asinh.c\n const c = reinterpret(0x3FE62E42FEFA39EF); // 0.693147180559945309417232121458176568\n var u = reinterpret(x);\n var e = u >> 52 & 0x7FF;\n var y = reinterpret(u & 0x7FFFFFFFFFFFFFFF);\n if (e >= 0x3FF + 26) y = log(y) + c;\n else if (e >= 0x3FF + 1) y = log(2 * y + 1 / (builtin_sqrt(y * y + 1) + y));\n else if (e >= 0x3FF - 26) y = log1p(y + y * y / (builtin_sqrt(y * y + 1) + 1));\n return builtin_copysign(y, x);\n }\n\n export function atan(x: f64): f64 { // see musl/src/math/atan.c and SUN COPYRIGHT NOTICE above\n const\n atanhi0 = reinterpret(0x3FDDAC670561BB4F), // 4.63647609000806093515e-01\n atanhi1 = reinterpret(0x3FE921FB54442D18), // 7.85398163397448278999e-01\n atanhi2 = reinterpret(0x3FEF730BD281F69B), // 9.82793723247329054082e-01\n atanhi3 = reinterpret(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n atanlo0 = reinterpret(0x3C7A2B7F222F65E2), // 2.26987774529616870924e-17\n atanlo1 = reinterpret(0x3C81A62633145C07), // 3.06161699786838301793e-17\n atanlo2 = reinterpret(0x3C7007887AF0CBBD), // 1.39033110312309984516e-17\n atanlo3 = reinterpret(0x3C91A62633145C07), // 6.12323399573676603587e-17\n aT0 = reinterpret(0x3FD555555555550D), // 3.33333333333329318027e-01\n aT1 = reinterpret(0xBFC999999998EBC4), // -1.99999999998764832476e-01\n aT2 = reinterpret(0x3FC24924920083FF), // 1.42857142725034663711e-01\n aT3 = reinterpret(0xBFBC71C6FE231671), // -1.11111104054623557880e-01,\n aT4 = reinterpret(0x3FB745CDC54C206E), // 9.09088713343650656196e-02\n aT5 = reinterpret(0xBFB3B0F2AF749A6D), // -7.69187620504482999495e-02\n aT6 = reinterpret(0x3FB10D66A0D03D51), // 6.66107313738753120669e-02\n aT7 = reinterpret(0xBFADDE2D52DEFD9A), // -5.83357013379057348645e-02\n aT8 = reinterpret(0x3FA97B4B24760DEB), // 4.97687799461593236017e-02\n aT9 = reinterpret(0xBFA2B4442C6A6C2F), // -3.65315727442169155270e-02\n aT10 = reinterpret(0x3F90AD3AE322DA11), // 1.62858201153657823623e-02\n Ox1p_120f = reinterpret(0x03800000);\n var ix = (reinterpret(x) >> 32);\n var sx = x;\n ix &= 0x7FFFFFFF;\n var z: f64;\n if (ix >= 0x44100000) {\n if (isNaN(x)) return x;\n z = atanhi3 + Ox1p_120f;\n return builtin_copysign(z, sx);\n }\n var id: i32;\n if (ix < 0x3FDC0000) {\n if (ix < 0x3E400000) return x;\n id = -1;\n } else {\n x = builtin_abs(x);\n if (ix < 0x3FF30000) {\n if (ix < 0x3FE60000) {\n id = 0;\n x = (2.0 * x - 1.0) / (2.0 + x);\n } else {\n id = 1;\n x = (x - 1.0) / (x + 1.0);\n }\n } else {\n if (ix < 0x40038000) {\n id = 2;\n x = (x - 1.5) / (1.0 + 1.5 * x);\n } else {\n id = 3;\n x = -1.0 / x;\n }\n }\n }\n z = x * x;\n var w = z * z;\n var s1 = z * (aT0 + w * (aT2 + w * (aT4 + w * (aT6 + w * (aT8 + w * aT10)))));\n var s2 = w * (aT1 + w * (aT3 + w * (aT5 + w * (aT7 + w * aT9))));\n var s3 = x * (s1 + s2);\n if (id < 0) return x - s3;\n switch (id) {\n case 0: { z = atanhi0 - ((s3 - atanlo0) - x); break; }\n case 1: { z = atanhi1 - ((s3 - atanlo1) - x); break; }\n case 2: { z = atanhi2 - ((s3 - atanlo2) - x); break; }\n case 3: { z = atanhi3 - ((s3 - atanlo3) - x); break; }\n default: unreachable();\n }\n return builtin_copysign(z, sx);\n }\n\n export function atanh(x: f64): f64 { // see: musl/src/math/atanh.c\n var u = reinterpret(x);\n var e = u >> 52 & 0x7FF;\n var s = u >> 63;\n u &= 0x7FFFFFFFFFFFFFFF;\n var y = reinterpret(u);\n if (e < 0x3FF - 1) {\n if (e >= 0x3FF - 32) y = 0.5 * log1p(2 * y + 2 * y * y / (1 - y));\n } else {\n y = 0.5 * log1p(2 * (y / (1 - y)));\n }\n return builtin_copysign(y, x);\n }\n\n export function atan2(y: f64, x: f64): f64 { // see: musl/src/math/atan2.c and SUN COPYRIGHT NOTICE above\n const pi_lo = reinterpret(0x3CA1A62633145C07); // 1.2246467991473531772E-16\n if (isNaN(x) || isNaN(y)) return x + y;\n var u = reinterpret(x);\n var ix = (u >> 32);\n var lx = u;\n u = reinterpret(y);\n var iy = (u >> 32);\n var ly = u;\n if ((ix - 0x3FF00000 | lx) == 0) return atan(y);\n var m = ((iy >> 31) & 1) | ((ix >> 30) & 2);\n ix = ix & 0x7FFFFFFF;\n iy = iy & 0x7FFFFFFF;\n if ((iy | ly) == 0) {\n switch (m) {\n case 0:\n case 1: return y;\n case 2: return PI;\n case 3: return -PI;\n }\n }\n if ((ix | lx) == 0) return m & 1 ? -PI / 2 : PI / 2;\n if (ix == 0x7FF00000) {\n if (iy == 0x7FF00000) {\n switch (m) {\n case 0: return PI / 4;\n case 1: return -PI / 4;\n case 2: return 3 * PI / 4;\n case 3: return -3 * PI / 4;\n }\n } else {\n switch (m) {\n case 0: return 0.0;\n case 1: return -0.0;\n case 2: return PI;\n case 3: return -PI;\n }\n }\n }\n var z: f64;\n if (ix + (64 << 20) < iy || iy == 0x7FF00000) return m & 1 ? -PI / 2 : PI / 2;\n if ((m & 2) && iy + (64 << 20) < ix) z = 0;\n else z = atan(builtin_abs(y / x));\n switch (m) {\n case 0: return z;\n case 1: return -z;\n case 2: return PI - (z - pi_lo);\n case 3: return (z - pi_lo) - PI;\n }\n unreachable();\n return 0;\n }\n\n export function cbrt(x: f64): f64 { // see: musl/src/math/cbrt.c and SUN COPYRIGHT NOTICE above\n const\n B1 = 715094163,\n B2 = 696219795,\n P0 = reinterpret(0x3FFE03E60F61E692), // 1.87595182427177009643\n P1 = reinterpret(0xBFFE28E092F02420), // -1.88497979543377169875\n P2 = reinterpret(0x3FF9F1604A49D6C2), // 1.621429720105354466140\n P3 = reinterpret(0xBFE844CBBEE751D9), // -0.758397934778766047437\n P4 = reinterpret(0x3FC2B000D4E4EDD7), // 0.145996192886612446982\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32) & 0x7FFFFFFF;\n if (hx >= 0x7FF00000) return x + x;\n if (hx < 0x00100000) {\n u = reinterpret(x * Ox1p54);\n hx = (u >> 32) & 0x7FFFFFFF;\n if (hx == 0) return x;\n hx = hx / 3 + B2;\n } else {\n hx = hx / 3 + B1;\n }\n u &= 1 << 63;\n u |= hx << 32;\n var t = reinterpret(u);\n var r = (t * t) * (t / x);\n t = t * ((P0 + r * (P1 + r * P2)) + ((r * r) * r) * (P3 + r * P4));\n t = reinterpret((reinterpret(t) + 0x80000000) & 0xFFFFFFFFC0000000);\n var s = t * t;\n r = x / s;\n var w = t + t;\n r = (r - t) / (w + r);\n t = t + t * r;\n return t;\n }\n\n @inline\n export function ceil(x: f64): f64 {\n return builtin_ceil(x);\n }\n\n @inline\n export function clz32(x: f64): f64 {\n return builtin_clz(x);\n }\n\n export function cos(x: f64): f64 { // TODO\n unreachable();\n return 0;\n }\n\n export function cosh(x: f64): f64 { // see: musl/src/math/cosh.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFFFFFFFFFF;\n x = reinterpret(u);\n var w = (u >> 32);\n var t: f64;\n if (w < 0x3FE62E42) {\n if (w < 0x3FF00000 - (26 << 20)) return 1;\n t = expm1(x);\n // return 1 + t * t / (2 * (1 + t));\n return 1 + t * t / (2 + 2 * t);\n }\n if (w < 0x40862E42) {\n t = exp(x);\n return 0.5 * (t + 1 / t);\n }\n t = expo2(x);\n return t;\n }\n\n export function exp(x: f64): f64 { // see: musl/src/math/exp.c and SUN COPYRIGHT NOTICE above\n const\n ln2hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n invln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n P1 = reinterpret(0x3FC555555555553E), // 1.66666666666666019037e-01\n P2 = reinterpret(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03\n P3 = reinterpret(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05\n P4 = reinterpret(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06\n P5 = reinterpret(0x3E66376972BEA4D0), // 4.13813679705723846039e-08\n overflow = reinterpret(0x40862E42FEFA39EF), // 709.782712893383973096\n underflow = reinterpret(0xC0874910D52D3051), // -745.13321910194110842\n Ox1p1023 = reinterpret(0x7FE0000000000000);\n var hx = (reinterpret(x) >> 32);\n var sign_ = (hx >> 31);\n hx &= 0x7FFFFFFF;\n if (hx >= 0x4086232B) {\n if (isNaN(x)) return x;\n if (x > overflow) {\n x *= Ox1p1023;\n return x;\n }\n if (x < underflow) return 0;\n }\n var hi: f64, lo: f64 = 0;\n var k = 0;\n if (hx > 0x3FD62E42) {\n if (hx >= 0x3FF0A2B2) {\n k = (invln2 * x + builtin_copysign(0.5, x));\n } else {\n k = 1 - (sign_ << 1);\n }\n hi = x - k * ln2hi;\n lo = k * ln2lo;\n x = hi - lo;\n } else if (hx > 0x3E300000) {\n hi = x;\n } else return 1.0 + x;\n var xs = x * x;\n // var c = x - xp2 * (P1 + xp2 * (P2 + xp2 * (P3 + xp2 * (P4 + xp2 * P5))));\n var xq = xs * xs;\n var c = x - (xs * P1 + xq * ((P2 + xs * P3) + xq * (P4 + xs * P5)));\n var y = 1.0 + (x * c / (2 - c) - lo + hi);\n if (k == 0) return y;\n return scalbn(y, k);\n }\n\n export function expm1(x: f64): f64 { // see: musl/src/math/expm1.c and SUN COPYRIGHT NOTICE above\n const\n o_threshold = reinterpret(0x40862E42FEFA39EF), // 7.09782712893383973096e+02\n ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n invln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n Q1 = reinterpret(0xBFA11111111110F4), // -3.33333333333331316428e-02\n Q2 = reinterpret(0x3F5A01A019FE5585), // 1.58730158725481460165e-03\n Q3 = reinterpret(0xBF14CE199EAADBB7), // -7.93650757867487942473e-05\n Q4 = reinterpret(0x3ED0CFCA86E65239), // 4.00821782732936239552e-06\n Q5 = reinterpret(0xBE8AFDB76E09C32D), // -2.01099218183624371326e-07\n Ox1p1023 = reinterpret(0x7FE0000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32 & 0x7FFFFFFF);\n var k = 0, sign_ = (u >> 63);\n if (hx >= 0x4043687A) {\n if (isNaN(x)) return x;\n if (sign_) return -1;\n if (x > o_threshold) return x * Ox1p1023;\n }\n var c = 0.0, t: f64;\n if (hx > 0x3FD62E42) {\n k = select(\n 1 - (sign_ << 1),\n (invln2 * x + builtin_copysign(0.5, x)),\n hx < 0x3FF0A2B2\n );\n t = k;\n let hi = x - t * ln2_hi;\n let lo = t * ln2_lo;\n x = hi - lo;\n c = (hi - x) - lo;\n } else if (hx < 0x3C900000) return x;\n var hfx = 0.5 * x;\n var hxs = x * hfx;\n // var r1 = 1.0 + hxs * (Q1 + hxs * (Q2 + hxs * (Q3 + hxs * (Q4 + hxs * Q5))));\n var hxq = hxs * hxs;\n var r1 = (1.0 + hxs * Q1) + hxq * ((Q2 + hxs * Q3) + hxq * (Q4 + hxs * Q5));\n t = 3.0 - r1 * hfx;\n var e = hxs * ((r1 - t) / (6.0 - x * t));\n if (k == 0) return x - (x * e - hxs);\n e = x * (e - c) - c;\n e -= hxs;\n if (k == -1) return 0.5 * (x - e) - 0.5;\n if (k == 1) {\n if (x < -0.25) return -2.0 * (e - (x + 0.5));\n return 1.0 + 2.0 * (x - e);\n }\n u = (0x3FF + k) << 52;\n var twopk = reinterpret(u);\n var y: f64;\n if (k < 0 || k > 56) {\n y = x - e + 1.0;\n if (k == 1024) y = y * 2.0 * Ox1p1023;\n else y = y * twopk;\n return y - 1.0;\n }\n u = (0x3FF - k) << 52;\n y = reinterpret(u);\n if (k < 20) y = (1 - y) - e;\n else y = 1 - (e + y);\n return (x + y) * twopk;\n }\n\n @inline\n export function floor(x: f64): f64 {\n return builtin_floor(x);\n }\n\n @inline\n export function fround(x: f64): f32 {\n return x;\n }\n\n export function hypot(x: f64, y: f64): f64 { // see: musl/src/math/hypot.c\n const\n SPLIT = reinterpret(0x41A0000000000000) + 1, // 0x1p27 + 1\n Ox1p700 = reinterpret(0x6BB0000000000000),\n Ox1p_700 = reinterpret(0x1430000000000000);\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n ux &= 0x7FFFFFFFFFFFFFFF;\n uy &= 0x7FFFFFFFFFFFFFFF;\n if (ux < uy) {\n let ut = ux;\n ux = uy;\n uy = ut;\n }\n var ex = (ux >> 52);\n var ey = (uy >> 52);\n y = reinterpret(uy);\n if (ey == 0x7FF) return y;\n x = reinterpret(ux);\n if (ex == 0x7FF || uy == 0) return x;\n if (ex - ey > 64) return x + y;\n var z = 1.0;\n if (ex > 0x3FF + 510) {\n z = Ox1p700;\n x *= Ox1p_700;\n y *= Ox1p_700;\n } else if (ey < 0x3FF - 450) {\n z = Ox1p_700;\n x *= Ox1p700;\n y *= Ox1p700;\n }\n var c = x * SPLIT;\n var h = x - c + c;\n var l = x - h;\n var hx = x * x;\n var lx = h * h - hx + (2 * h + l) * l;\n c = y * SPLIT;\n h = y - c + c;\n l = y - h;\n var hy = y * y;\n var ly = h * h - hy + (2 * h + l) * l;\n return z * builtin_sqrt(ly + lx + hy + hx);\n }\n\n export function imul(x: f64, y: f64): f64 {\n /*\n * Wasm (MVP) and JS have different approachas for double->int conversions.\n *\n * For emulate JS conversion behavior and avoid trapping from wasm we should modulate by MAX_INT\n * our float-point arguments before actual convertion to integers.\n */\n if (!isFinite(x + y)) return 0;\n const inv32 = 1.0 / 4294967296;\n return (\n (x - 4294967296 * builtin_floor(x * inv32)) *\n (y - 4294967296 * builtin_floor(y * inv32))\n );\n }\n\n export function log(x: f64): f64 { // see: musl/src/math/log.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 0;\n if (hx < 0x00100000 || (hx >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (hx >> 31) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret(x);\n hx = (u >> 32);\n } else if (hx >= 0x7FF00000) return x;\n else if (hx == 0x3FF00000 && u << 32 == 0) return 0;\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret(u);\n var f = x - 1.0;\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var dk = k;\n return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi;\n }\n\n export function log10(x: f64): f64 { // see: musl/src/math/log10.c and SUN COPYRIGHT NOTICE above\n const\n ivln10hi = reinterpret(0x3FDBCB7B15200000), // 4.34294481878168880939e-01\n ivln10lo = reinterpret(0x3DBB9438CA9AADD5), // 2.50829467116452752298e-11\n log10_2hi = reinterpret(0x3FD34413509F6000), // 3.01029995663611771306e-01\n log10_2lo = reinterpret(0x3D59FEF311F12B36), // 3.69423907715893078616e-13\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 0;\n if (hx < 0x00100000 || (hx >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (hx >> 31) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret(x);\n hx = (u >> 32);\n } else if (hx >= 0x7FF00000) return x;\n else if (hx == 0x3FF00000 && u << 32 == 0) return 0;\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret(u);\n var f = x - 1.0;\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var hi = f - hfsq;\n u = reinterpret(hi);\n u &= 0xFFFFFFFF00000000;\n hi = reinterpret(u);\n var lo = f - hi - hfsq + s * (hfsq + r);\n var val_hi = hi * ivln10hi;\n var dk = k;\n var y = dk * log10_2hi;\n var val_lo = dk * log10_2lo + (lo + hi) * ivln10lo + lo * ivln10hi;\n w = y + val_hi;\n val_lo += (y - w) + val_hi;\n return val_lo + w;\n }\n\n export function log1p(x: f64): f64 { // see: musl/src/math/log1p.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244); // 1.479819860511658591e-01\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 1;\n var c = 0.0, f = 0.0;\n if (hx < 0x3FDA827A || (hx >> 31)) {\n if (hx >= 0xBFF00000) {\n if (x == -1) return x / 0.0;\n return (x - x) / 0.0;\n }\n if (hx << 1 < 0x3CA00000 << 1) return x;\n if (hx <= 0xBFD2BEC4) {\n k = 0;\n c = 0;\n f = x;\n }\n } else if (hx >= 0x7FF00000) return x;\n if (k) {\n u = reinterpret(1 + x);\n let hu = (u >> 32);\n hu += 0x3FF00000 - 0x3FE6A09E;\n k = (hu >> 20) - 0x3FF;\n if (k < 54) {\n let uf = reinterpret(u);\n c = k >= 2 ? 1 - (uf - x) : x - (uf - 1);\n c /= uf;\n } else c = 0;\n hu = (hu & 0x000FFFFF) + 0x3FE6A09E;\n u = hu << 32 | (u & 0xFFFFFFFF);\n f = reinterpret(u) - 1;\n }\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var dk = k;\n return s * (hfsq + r) + (dk * ln2_lo + c) - hfsq + f + dk * ln2_hi;\n }\n\n export function log2(x: f64): f64 { // see: musl/src/math/log2.c and SUN COPYRIGHT NOTICE above\n const\n ivln2hi = reinterpret(0x3FF7154765200000), // 1.44269504072144627571e+00\n ivln2lo = reinterpret(0x3DE705FC2EEFA200), // 1.67517131648865118353e-10\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 0;\n if (hx < 0x00100000 || (hx >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (hx >> 31) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret(x);\n hx = (u >> 32);\n } else if (hx >= 0x7FF00000) return x;\n else if (hx == 0x3FF00000 && u << 32 == 0) return 0;\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret(u);\n var f = x - 1.0;\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var hi = f - hfsq;\n u = reinterpret(hi);\n u &= 0xFFFFFFFF00000000;\n hi = reinterpret(u);\n var lo = f - hi - hfsq + s * (hfsq + r);\n var val_hi = hi * ivln2hi;\n var val_lo = (lo + hi) * ivln2lo + lo * ivln2hi;\n var y = k;\n w = y + val_hi;\n val_lo += (y - w) + val_hi;\n val_hi = w;\n return val_lo + val_hi;\n }\n\n @inline\n export function max(value1: f64, value2: f64): f64 {\n return builtin_max(value1, value2);\n }\n\n @inline\n export function min(value1: f64, value2: f64): f64 {\n return builtin_min(value1, value2);\n }\n\n export function pow(x: f64, y: f64): f64 { // see: musl/src/math/pow.c and SUN COPYRIGHT NOTICE above\n const\n dp_h1 = reinterpret(0x3FE2B80340000000), // 5.84962487220764160156e-01\n dp_l1 = reinterpret(0x3E4CFDEB43CFD006), // 1.35003920212974897128e-08\n two53 = reinterpret(0x4340000000000000), // 9007199254740992.0\n huge = reinterpret(0x7E37E43C8800759C), // 1e+300\n tiny = reinterpret(0x01A56E1FC2F8F359), // 1e-300\n L1 = reinterpret(0x3FE3333333333303), // 5.99999999999994648725e-01\n L2 = reinterpret(0x3FDB6DB6DB6FABFF), // 4.28571428578550184252e-01\n L3 = reinterpret(0x3FD55555518F264D), // 3.33333329818377432918e-01\n L4 = reinterpret(0x3FD17460A91D4101), // 2.72728123808534006489e-01\n L5 = reinterpret(0x3FCD864A93C9DB65), // 2.30660745775561754067e-01\n L6 = reinterpret(0x3FCA7E284A454EEF), // 2.06975017800338417784e-01\n P1 = reinterpret(0x3FC555555555553E), // 1.66666666666666019037e-01\n P2 = reinterpret(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03\n P3 = reinterpret(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05\n P4 = reinterpret(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06\n P5 = reinterpret(0x3E66376972BEA4D0), // 4.13813679705723846039e-08\n lg2 = reinterpret(0x3FE62E42FEFA39EF), // 6.93147180559945286227e-01\n lg2_h = reinterpret(0x3FE62E4300000000), // 6.93147182464599609375e-01\n lg2_l = reinterpret(0xBE205C610CA86C39), // -1.90465429995776804525e-09\n ovt = reinterpret(0x3C971547652B82FE), // 8.0085662595372944372e-017\n cp = reinterpret(0x3FEEC709DC3A03FD), // 9.61796693925975554329e-01\n cp_h = reinterpret(0x3FEEC709E0000000), // 9.61796700954437255859e-01\n cp_l = reinterpret(0xBE3E2FE0145B01F5), // -7.02846165095275826516e-09\n ivln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n ivln2_h = reinterpret(0x3FF7154760000000), // 1.44269502162933349609e+00\n ivln2_l = reinterpret(0x3E54AE0BF85DDF44), // 1.92596299112661746887e-08\n inv3 = reinterpret(0x3FD5555555555555); // 0.3333333333333333333333\n var u_ = reinterpret(x);\n var hx = (u_ >> 32);\n var lx = u_;\n u_ = reinterpret(y);\n var hy = (u_ >> 32);\n var ly = u_;\n var ix = hx & 0x7FFFFFFF;\n var iy = hy & 0x7FFFFFFF;\n if ((iy | ly) == 0) return 1.0; // x**0 = 1, even if x is NaN\n // if (hx == 0x3FF00000 && lx == 0) return 1.0; // C: 1**y = 1, even if y is NaN, JS: NaN\n if ( // NaN if either arg is NaN\n ix > 0x7FF00000 || (ix == 0x7FF00000 && lx != 0) ||\n iy > 0x7FF00000 || (iy == 0x7FF00000 && ly != 0)\n ) return x + y;\n var yisint = 0, k: i32;\n if (hx < 0) {\n if (iy >= 0x43400000) yisint = 2;\n else if (iy >= 0x3FF00000) {\n k = (iy >> 20) - 0x3FF;\n let offset = select(52, 20, k > 20) - k;\n let Ly = select(ly, iy, k > 20);\n let jj = Ly >> offset;\n if ((jj << offset) == Ly) yisint = 2 - (jj & 1);\n }\n }\n if (ly == 0) {\n if (iy == 0x7FF00000) { // y is +-inf\n if (((ix - 0x3FF00000) | lx) == 0) return NaN; // C: (-1)**+-inf is 1, JS: NaN\n else if (ix >= 0x3FF00000) return hy >= 0 ? y : 0.0; // (|x|>1)**+-inf = inf,0\n else return hy >= 0 ? 0.0 : -y; // (|x|<1)**+-inf = 0,inf\n }\n if (iy == 0x3FF00000) {\n if (hy >= 0) return x;\n return 1 / x;\n }\n if (hy == 0x40000000) return x * x;\n if (hy == 0x3FE00000) {\n if (hx >= 0) return builtin_sqrt(x);\n }\n }\n var ax = builtin_abs(x), z: f64;\n if (lx == 0) {\n if (ix == 0x7FF00000 || ix == 0 || ix == 0x3FF00000) {\n z = ax;\n if (hy < 0) z = 1.0 / z;\n if (hx < 0) {\n if (((ix - 0x3FF00000) | yisint) == 0) z = (z - z) / (z - z);\n else if (yisint == 1) z = -z;\n }\n return z;\n }\n }\n var s = 1.0;\n if (hx < 0) {\n if (yisint == 0) return (x - x) / (x - x);\n if (yisint == 1) s = -1.0;\n }\n var t1: f64, t2: f64, p_h: f64, p_l: f64, r: f64, t: f64, u: f64, v: f64, w: f64;\n var j: i32, n: i32;\n if (iy > 0x41E00000) {\n if (iy > 0x43F00000) {\n if (ix <= 0x3FEFFFFF) return hy < 0 ? huge * huge : tiny * tiny;\n if (ix >= 0x3FF00000) return hy > 0 ? huge * huge : tiny * tiny;\n }\n if (ix < 0x3FEFFFFF) return hy < 0 ? s * huge * huge : s * tiny * tiny;\n if (ix > 0x3FF00000) return hy > 0 ? s * huge * huge : s * tiny * tiny;\n t = ax - 1.0;\n w = (t * t) * (0.5 - t * (inv3 - t * 0.25));\n u = ivln2_h * t;\n v = t * ivln2_l - w * ivln2;\n t1 = u + v;\n t1 = reinterpret(reinterpret(t1) & 0xFFFFFFFF00000000);\n t2 = v - (t1 - u);\n } else {\n let ss: f64, s2: f64, s_h: f64, s_l: f64, t_h: f64, t_l: f64;\n n = 0;\n if (ix < 0x00100000) {\n ax *= two53;\n n -= 53;\n ix = (reinterpret(ax) >> 32);\n }\n n += (ix >> 20) - 0x3FF;\n j = ix & 0x000FFFFF;\n ix = j | 0x3FF00000;\n if (j <= 0x3988E) k = 0;\n else if (j < 0xBB67A) k = 1;\n else {\n k = 0;\n n += 1;\n ix -= 0x00100000;\n }\n ax = reinterpret(reinterpret(ax) & 0xFFFFFFFF | (ix << 32));\n let bp = select(1.5, 1.0, k); // k ? 1.5 : 1.0\n u = ax - bp;\n v = 1.0 / (ax + bp);\n ss = u * v;\n s_h = ss;\n s_h = reinterpret(reinterpret(s_h) & 0xFFFFFFFF00000000);\n t_h = reinterpret((((ix >> 1) | 0x20000000) + 0x00080000 + (k << 18)) << 32);\n t_l = ax - (t_h - bp);\n s_l = v * ((u - s_h * t_h) - s_h * t_l);\n s2 = ss * ss;\n r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6)))));\n r += s_l * (s_h + ss);\n s2 = s_h * s_h;\n t_h = 3.0 + s2 + r;\n t_h = reinterpret(reinterpret(t_h) & 0xFFFFFFFF00000000);\n t_l = r - ((t_h - 3.0) - s2);\n u = s_h * t_h;\n v = s_l * t_h + t_l * ss;\n p_h = u + v;\n p_h = reinterpret(reinterpret(p_h) & 0xFFFFFFFF00000000);\n p_l = v - (p_h - u);\n let z_h = cp_h * p_h;\n let dp_l = select(dp_l1, 0.0, k);\n let z_l = cp_l * p_h + p_l * cp + dp_l;\n t = n;\n let dp_h = select(dp_h1, 0.0, k);\n t1 = ((z_h + z_l) + dp_h) + t;\n t1 = reinterpret(reinterpret(t1) & 0xFFFFFFFF00000000);\n t2 = z_l - (((t1 - t) - dp_h) - z_h);\n }\n var y1 = y;\n y1 = reinterpret(reinterpret(y1) & 0xFFFFFFFF00000000);\n p_l = (y - y1) * t1 + y * t2;\n p_h = y1 * t1;\n z = p_l + p_h;\n u_ = reinterpret(z);\n j = (u_ >> 32);\n var i = u_;\n if (j >= 0x40900000) {\n if (((j - 0x40900000) | i) != 0) return s * huge * huge;\n if (p_l + ovt > z - p_h) return s * huge * huge;\n } else if ((j & 0x7FFFFFFF) >= 0x4090CC00) {\n if (((j - 0xC090CC00) | i) != 0) return s * tiny * tiny;\n if (p_l <= z - p_h) return s * tiny * tiny;\n }\n i = j & 0x7FFFFFFF;\n k = (i >> 20) - 0x3FF;\n n = 0;\n if (i > 0x3FE00000) {\n n = j + (0x00100000 >> (k + 1));\n k = ((n & 0x7FFFFFFF) >> 20) - 0x3FF;\n t = 0.0;\n t = reinterpret((n & ~(0x000FFFFF >> k)) << 32);\n n = ((n & 0x000FFFFF) | 0x00100000) >> (20 - k);\n if (j < 0) n = -n;\n p_h -= t;\n }\n t = p_l + p_h;\n t = reinterpret(reinterpret(t) & 0xFFFFFFFF00000000);\n u = t * lg2_h;\n v = (p_l - (t - p_h)) * lg2 + t * lg2_l;\n z = u + v;\n w = v - (z - u);\n t = z * z;\n t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));\n r = (z * t1) / (t1 - 2.0) - (w + z * w);\n z = 1.0 - (r - z);\n j = (reinterpret(z) >> 32);\n j += n << 20;\n if ((j >> 20) <= 0) z = scalbn(z, n);\n else z = reinterpret(reinterpret(z) & 0xFFFFFFFF | (j << 32));\n return s * z;\n }\n\n export function seedRandom(value: i64): void {\n assert(value);\n random_seeded = true;\n random_state0_64 = murmurHash3(value);\n random_state1_64 = murmurHash3(~random_state0_64);\n random_state0_32 = splitMix32(value);\n random_state1_32 = splitMix32(random_state0_32);\n }\n\n export function random(): f64 { // see: v8/src/base/random-number-generator.cc\n if (!random_seeded) throw new Error("PRNG must be seeded.");\n var s1 = random_state0_64;\n var s0 = random_state1_64;\n random_state0_64 = s0;\n s1 ^= s1 << 23;\n s1 ^= s1 >> 17;\n s1 ^= s0;\n s1 ^= s0 >> 26;\n random_state1_64 = s1;\n var r = ((s0 + s1) & 0x000FFFFFFFFFFFFF) | 0x3FF0000000000000;\n return reinterpret(r) - 1;\n }\n\n @inline\n export function round(x: f64): f64 {\n return builtin_copysign(builtin_floor(x + 0.5), x);\n }\n\n @inline\n export function sign(x: f64): f64 {\n if (ASC_SHRINK_LEVEL > 0) {\n return builtin_abs(x) > 0 ? builtin_copysign(1, x) : x;\n } else {\n return x > 0 ? 1 : x < 0 ? -1 : x;\n }\n }\n\n @inline\n export function signbit(x: f64): bool {\n // In ECMAScript all NaN values are indistinguishable from each other\n // so we need handle NaN and negative NaN in similar way\n return ((reinterpret(x) >>> 63) & (x == x));\n }\n\n export function sin(x: f64): f64 { // TODO\n unreachable();\n return 0;\n }\n\n export function sinh(x: f64): f64 { // see: musl/src/math/sinh.c\n var u = reinterpret(x) & 0x7FFFFFFFFFFFFFFF;\n var absx = reinterpret(u);\n var w = (u >> 32);\n var t: f64;\n var h = builtin_copysign(0.5, x);\n if (w < 0x40862E42) {\n t = expm1(absx);\n if (w < 0x3FF00000) {\n if (w < 0x3FF00000 - (26 << 20)) return x;\n return h * (2 * t - t * t / (t + 1));\n }\n return h * (t + t / (t + 1));\n }\n t = 2 * h * expo2(absx);\n return t;\n }\n\n @inline\n export function sqrt(x: f64): f64 {\n return builtin_sqrt(x);\n }\n\n export function tan(x: f64): f64 { // TODO\n unreachable();\n return 0;\n }\n\n export function tanh(x: f64): f64 { // see: musl/src/math/tanh.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFFFFFFFFFF;\n var y = reinterpret(u);\n var w = (u >> 32);\n var t: f64;\n if (w > 0x3FE193EA) {\n if (w > 0x40340000) {\n t = 1 - 0 / y;\n } else {\n t = expm1(2 * y);\n t = 1 - 2 / (t + 2);\n }\n } else if (w > 0x3FD058AE) {\n t = expm1(2 * y);\n t = t / (t + 2);\n } else if (w >= 0x00100000) {\n t = expm1(-2 * y);\n t = -t / (t + 2);\n } else t = y;\n return builtin_copysign(t, x);\n }\n\n @inline\n export function trunc(x: f64): f64 {\n return builtin_trunc(x);\n }\n\n /** @internal */\n export function scalbn(x: f64, n: i32): f64 { // see: https://git.musl-libc.org/cgit/musl/tree/src/math/scalbn.c\n const\n Ox1p53 = reinterpret(0x4340000000000000),\n Ox1p1023 = reinterpret(0x7FE0000000000000),\n Ox1p_1022 = reinterpret(0x0010000000000000);\n var y = x;\n if (n > 1023) {\n y *= Ox1p1023;\n n -= 1023;\n if (n > 1023) {\n y *= Ox1p1023;\n n = builtin_min(n - 1023, 1023);\n }\n } else if (n < -1022) {\n /* make sure final n < -53 to avoid double\n\t\t rounding in the subnormal range */\n y *= Ox1p_1022 * Ox1p53;\n n += 1022 - 53;\n if (n < -1022) {\n y *= Ox1p_1022 * Ox1p53;\n n = builtin_max(n + 1022 - 53, -1022);\n }\n }\n return y * reinterpret((0x3FF + n) << 52);\n }\n\n export function mod(x: f64, y: f64): f64 { // see: musl/src/math/fmod.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 52 & 0x7FF);\n var ey = (uy >> 52 & 0x7FF);\n var sx = ux >> 63;\n var uy1 = uy << 1;\n if (uy1 == 0 || ex == 0x7FF || isNaN(y)) return (x * y) / (x * y);\n var ux1 = ux << 1;\n if (ux1 <= uy1) {\n if (ux1 == uy1) return 0 * x;\n return x;\n }\n if (!ex) {\n ex -= builtin_clz(ux << 12);\n ux <<= -ex + 1;\n } else {\n ux &= -1 >> 12;\n ux |= 1 << 52;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 12);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 12;\n uy |= 1 << 52;\n }\n while (ex > ey) {\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n ux <<= 1;\n --ex;\n }\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n // for (; !(ux >> 52); ux <<= 1) --ex;\n var shift = builtin_clz(ux << 11);\n ex -= shift;\n ux <<= shift;\n if (ex > 0) {\n ux -= 1 << 52;\n ux |= ex << 52;\n } else {\n ux >>= -ex + 1;\n }\n ux |= sx << 63;\n return reinterpret(ux);\n }\n\n export function rem(x: f64, y: f64): f64 { // see: musl/src/math/remquo.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 52 & 0x7FF);\n var ey = (uy >> 52 & 0x7FF);\n var sx = (ux >> 63);\n if (uy << 1 == 0 || ex == 0x7FF || isNaN(y)) return (x * y) / (x * y);\n if (ux << 1 == 0) return x;\n var uxi = ux;\n if (!ex) {\n ex -= builtin_clz(uxi << 12);\n uxi <<= -ex + 1;\n } else {\n uxi &= -1 >> 12;\n uxi |= 1 << 52;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 12);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 12;\n uy |= 1 << 52;\n }\n var q: u32 = 0;\n do {\n if (ex < ey) {\n if (ex + 1 == ey) break; // goto end\n return x;\n }\n while (ex > ey) {\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n uxi <<= 1;\n q <<= 1;\n --ex;\n }\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n if (uxi == 0) ex = -60;\n else {\n let shift = builtin_clz(uxi << 11);\n ex -= shift;\n uxi <<= shift;\n }\n break;\n } while (false);\n // end:\n if (ex > 0) {\n uxi -= 1 << 52;\n uxi |= ex << 52;\n } else {\n uxi >>= -ex + 1;\n }\n x = reinterpret(uxi);\n y = builtin_abs(y);\n var x2 = x + x;\n if (ex == ey || (ex + 1 == ey && (x2 > y || (x2 == y && (q & 1))))) {\n x -= y;\n // ++q;\n }\n return sx ? -x : x;\n }\n}\n\n/** @internal */\nfunction Rf(z: f32): f32 { // Rational approximation of (asin(x)-x)/x^3\n const // see: musl/src/math/asinf.c and SUN COPYRIGHT NOTICE above\n pS0 = reinterpret(0x3E2AAA75), // 1.6666586697e-01f\n pS1 = reinterpret(0xBD2F13BA), // -4.2743422091e-02f\n pS2 = reinterpret(0xBC0DD36B), // -8.6563630030e-03f\n qS1 = reinterpret(0xBF34E5AE); // -7.0662963390e-01f\n var p = z * (pS0 + z * (pS1 + z * pS2));\n var q: f32 = 1 + z * qS1;\n return p / q;\n}\n\n@inline /** @internal */\nfunction expo2f(x: f32): f32 { // exp(x)/2 for x >= log(DBL_MAX)\n const // see: musl/src/math/__expo2f.c\n k = 235,\n kln2 = reinterpret(0x4322E3BC); // 0x1.45c778p+7f\n var scale = reinterpret((0x7F + k / 2) << 23);\n return NativeMathf.exp(x - kln2) * scale * scale;\n}\n\nexport namespace NativeMathf {\n\n export const E = NativeMath.E;\n export const LN2 = NativeMath.LN2;\n export const LN10 = NativeMath.LN10;\n export const LOG2E = NativeMath.LOG2E;\n export const LOG10E = NativeMath.LOG10E;\n export const PI = NativeMath.PI;\n export const SQRT1_2 = NativeMath.SQRT1_2;\n export const SQRT2 = NativeMath.SQRT2;\n\n @inline\n export function abs(x: f32): f32 {\n return builtin_abs(x);\n }\n\n export function acos(x: f32): f32 { // see: musl/src/math/acosf.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret(0x3FC90FDA), // 1.5707962513e+00f\n pio2_lo = reinterpret(0x33A22168), // 7.5497894159e-08f\n Ox1p_120f = reinterpret(0x03800000);\n var hx = reinterpret(x);\n var ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3F800000) {\n if (ix == 0x3F800000) {\n if (hx >> 31) return 2 * pio2_hi + Ox1p_120f;\n return 0;\n }\n return 0 / (x - x);\n }\n if (ix < 0x3F000000) {\n if (ix <= 0x32800000) return pio2_hi + Ox1p_120f;\n return pio2_hi - (x - (pio2_lo - x * Rf(x * x)));\n }\n var z: f32, w: f32, s: f32;\n if (hx >> 31) {\n // z = (1 + x) * 0.5;\n z = 0.5 + x * 0.5;\n s = builtin_sqrt(z);\n w = Rf(z) * s - pio2_lo;\n return 2 * (pio2_hi - (s + w));\n }\n // z = (1 - x) * 0.5;\n z = 0.5 - x * 0.5;\n s = builtin_sqrt(z);\n hx = reinterpret(s);\n var df = reinterpret(hx & 0xFFFFF000);\n var c = (z - df * df) / (s + df);\n w = Rf(z) * s + c;\n return 2 * (df + w);\n }\n\n export function acosh(x: f32): f32 { // see: musl/src/math/acoshf.c\n const s = reinterpret(0x3F317218); // 0.693147180559945309417232121458176568f\n var u = reinterpret(x);\n var a = u & 0x7FFFFFFF;\n if (a < 0x3F800000 + (1 << 23)) {\n let xm1 = x - 1;\n return log1p(xm1 + builtin_sqrt(xm1 * (xm1 + 2)));\n }\n if (a < 0x3F800000 + (12 << 23)) return log(2 * x - 1 / (x + builtin_sqrt(x * x - 1)));\n return log(x) + s;\n }\n\n export function asin(x: f32): f32 { // see: musl/src/math/asinf.c and SUN COPYRIGHT NOTICE above\n const\n pio2 = reinterpret(0x3FC90FDB), // 1.570796326794896558e+00f\n Ox1p_120f = reinterpret(0x03800000);\n var sx = x;\n var hx = reinterpret(x) & 0x7FFFFFFF;\n if (hx >= 0x3F800000) {\n if (hx == 0x3F800000) return x * pio2 + Ox1p_120f;\n return 0 / (x - x);\n }\n if (hx < 0x3F000000) {\n if (hx < 0x39800000 && hx >= 0x00800000) return x;\n return x + x * Rf(x * x);\n }\n // var z: f32 = (1 - builtin_abs(x)) * 0.5;\n var z: f32 = 0.5 - builtin_abs(x) * 0.5;\n var s = builtin_sqrt(z); // sic\n x = (pio2 - 2 * (s + s * Rf(z)));\n return builtin_copysign(x, sx);\n }\n\n export function asinh(x: f32): f32 { // see: musl/src/math/asinhf.c\n const c = reinterpret(0x3F317218); // 0.693147180559945309417232121458176568f\n var u = reinterpret(x) & 0x7FFFFFFF;\n var y = reinterpret(u);\n if (u >= 0x3F800000 + (12 << 23)) y = log(y) + c;\n else if (u >= 0x3F800000 + (1 << 23)) y = log(2 * y + 1 / (builtin_sqrt(y * y + 1) + y));\n else if (u >= 0x3F800000 - (12 << 23)) y = log1p(y + y * y / (builtin_sqrt(y * y + 1) + 1));\n return builtin_copysign(y, x);\n }\n\n export function atan(x: f32): f32 { // see: musl/src/math/atanf.c and SUN COPYRIGHT NOTICE above\n const\n atanhi0 = reinterpret(0x3EED6338), // 4.6364760399e-01f\n atanhi1 = reinterpret(0x3F490FDA), // 7.8539812565e-01f\n atanhi2 = reinterpret(0x3F7B985E), // 9.8279368877e-01f\n atanhi3 = reinterpret(0x3FC90FDA), // 1.5707962513e+00f\n atanlo0 = reinterpret(0x31AC3769), // 5.0121582440e-09f\n atanlo1 = reinterpret(0x33222168), // 3.7748947079e-08f\n atanlo2 = reinterpret(0x33140FB4), // 3.4473217170e-08f\n atanlo3 = reinterpret(0x33A22168), // 7.5497894159e-08f\n aT0 = reinterpret(0x3EAAAAA9), // 3.3333328366e-01f\n aT1 = reinterpret(0xBE4CCA98), // -1.9999158382e-01f\n aT2 = reinterpret(0x3E11F50D), // 1.4253635705e-01f\n aT3 = reinterpret(0xBDDA1247), // -1.0648017377e-01f\n aT4 = reinterpret(0x3D7CAC25), // 6.1687607318e-02f\n Ox1p_120f = reinterpret(0x03800000);\n var ix = reinterpret(x);\n var sx = x;\n ix &= 0x7FFFFFFF;\n var z: f32;\n if (ix >= 0x4C800000) {\n if (isNaN(x)) return x;\n z = atanhi3 + Ox1p_120f;\n return builtin_copysign(z, sx);\n }\n var id: i32;\n if (ix < 0x3EE00000) {\n if (ix < 0x39800000) return x;\n id = -1;\n } else {\n x = builtin_abs(x);\n if (ix < 0x3F980000) {\n if (ix < 0x3F300000) {\n id = 0;\n x = (2.0 * x - 1.0) / (2.0 + x);\n } else {\n id = 1;\n x = (x - 1.0) / (x + 1.0);\n }\n } else {\n if (ix < 0x401C0000) {\n id = 2;\n x = (x - 1.5) / (1.0 + 1.5 * x);\n } else {\n id = 3;\n x = -1.0 / x;\n }\n }\n }\n z = x * x;\n var w = z * z;\n var s1 = z * (aT0 + w * (aT2 + w * aT4));\n var s2 = w * (aT1 + w * aT3);\n var s3 = x * (s1 + s2);\n if (id < 0) return x - s3;\n switch (id) {\n case 0: { z = atanhi0 - ((s3 - atanlo0) - x); break; }\n case 1: { z = atanhi1 - ((s3 - atanlo1) - x); break; }\n case 2: { z = atanhi2 - ((s3 - atanlo2) - x); break; }\n case 3: { z = atanhi3 - ((s3 - atanlo3) - x); break; }\n default: unreachable();\n }\n return builtin_copysign(z, sx);\n }\n\n export function atanh(x: f32): f32 { // see: musl/src/math/atanhf.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFF;\n var y = reinterpret(u);\n if (u < 0x3F800000 - (1 << 23)) {\n if (u >= 0x3F800000 - (32 << 23)) y = 0.5 * log1p(2 * y * (1.0 + y / (1 - y)));\n } else y = 0.5 * log1p(2 * (y / (1 - y)));\n return builtin_copysign(y, x);\n }\n\n export function atan2(y: f32, x: f32): f32 { // see: musl/src/math/atan2f.c and SUN COPYRIGHT NOTICE above\n const\n pi = reinterpret(0x40490FDB), // 3.1415927410e+00f\n pi_lo = reinterpret(0xB3BBBD2E); // -8.7422776573e-08f\n if (isNaN(x) || isNaN(y)) return x + y;\n var ix = reinterpret(x);\n var iy = reinterpret(y);\n if (ix == 0x3F800000) return atan(y);\n var m = (((iy >> 31) & 1) | ((ix >> 30) & 2));\n ix &= 0x7FFFFFFF;\n iy &= 0x7FFFFFFF;\n if (iy == 0) {\n switch (m) {\n case 0:\n case 1: return y;\n case 2: return pi;\n case 3: return -pi;\n }\n }\n if (ix == 0) return m & 1 ? -pi / 2 : pi / 2;\n if (ix == 0x7F800000) {\n if (iy == 0x7F800000) {\n switch (m) {\n case 0: return pi / 4;\n case 1: return -pi / 4;\n case 2: return 3 * pi / 4;\n case 3: return -3 * pi / 4;\n }\n } else {\n switch (m) {\n case 0: return 0;\n case 1: return -0;\n case 2: return pi;\n case 3: return -pi;\n }\n }\n }\n if (ix + (26 << 23) < iy || iy == 0x7F800000) return m & 1 ? -pi / 2 : pi / 2;\n var z: f32;\n if ((m & 2) && iy + (26 << 23) < ix) z = 0.0;\n else z = atan(builtin_abs(y / x));\n switch (m) {\n case 0: return z;\n case 1: return -z;\n case 2: return pi - (z - pi_lo);\n case 3: return (z - pi_lo) - pi;\n }\n unreachable();\n return 0;\n }\n\n export function cbrt(x: f32): f32 { // see: musl/src/math/cbrtf.c and SUN COPYRIGHT NOTICE above\n const\n B1 = 709958130,\n B2 = 642849266,\n Ox1p24f = reinterpret(0x4B800000);\n var u = reinterpret(x);\n var hx = u & 0x7FFFFFFF;\n if (hx >= 0x7F800000) return x + x;\n if (hx < 0x00800000) {\n if (hx == 0) return x;\n u = reinterpret(x * Ox1p24f);\n hx = u & 0x7FFFFFFF;\n hx = hx / 3 + B2;\n } else {\n hx = hx / 3 + B1;\n }\n u &= 0x80000000;\n u |= hx;\n var t = reinterpret(u);\n var r = t * t * t;\n t = t * (x + x + r) / (x + r + r);\n r = t * t * t;\n t = t * (x + x + r) / (x + r + r);\n return t;\n }\n\n @inline\n export function ceil(x: f32): f32 {\n return builtin_ceil(x);\n }\n\n @inline\n export function clz32(x: f32): f32 {\n return builtin_clz(x);\n }\n\n export function cos(x: f32): f32 { // TODO\n unreachable();\n return 0;\n }\n\n export function cosh(x: f32): f32 { // see: musl/src/math/coshf.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFF;\n x = reinterpret(u);\n if (u < 0x3F317217) {\n if (u < 0x3F800000 - (12 << 23)) return 1;\n let t = expm1(x);\n // return 1 + t * t / (2 * (1 + t));\n return 1 + t * t / (2 + 2 * t);\n }\n if (u < 0x42B17217) {\n let t = exp(x);\n // return 0.5 * (t + 1 / t);\n return 0.5 * t + 0.5 / t;\n }\n return expo2f(x);\n }\n\n @inline\n export function floor(x: f32): f32 {\n return builtin_floor(x);\n }\n\n export function exp(x: f32): f32 { // see: musl/src/math/expf.c and SUN COPYRIGHT NOTICE above\n const\n ln2hi = reinterpret(0x3F317200), // 6.9314575195e-1f\n ln2lo = reinterpret(0x35BFBE8E), // 1.4286067653e-6f\n invln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+0f\n P1 = reinterpret(0x3E2AAA8F), // 1.6666625440e-1f\n P2 = reinterpret(0xBB355215), // -2.7667332906e-3f\n Ox1p127f = reinterpret(0x7F000000);\n var hx = reinterpret(x);\n var sign_ = (hx >> 31);\n hx &= 0x7FFFFFFF;\n if (hx >= 0x42AEAC50) {\n if (hx >= 0x42B17218) {\n if (!sign_) {\n x *= Ox1p127f;\n return x;\n } else {\n if (hx >= 0x42CFF1B5) return 0;\n }\n }\n }\n var hi: f32, lo: f32;\n var k: i32;\n if (hx > 0x3EB17218) {\n if (hx > 0x3F851592) {\n k = (invln2 * x + builtin_copysign(0.5, x));\n } else {\n k = 1 - (sign_ << 1);\n }\n hi = x - k * ln2hi;\n lo = k * ln2lo;\n x = hi - lo;\n } else if (hx > 0x39000000) {\n k = 0;\n hi = x;\n lo = 0;\n } else {\n return 1 + x;\n }\n var xx = x * x;\n var c = x - xx * (P1 + xx * P2);\n var y: f32 = 1 + (x * c / (2 - c) - lo + hi);\n if (k == 0) return y;\n return scalbn(y, k);\n }\n\n export function expm1(x: f32): f32 { // see: musl/src/math/expm1f.c and SUN COPYRIGHT NOTICE above\n const\n o_threshold = reinterpret(0x42B17180), // 8.8721679688e+01f\n ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01f\n ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06f\n invln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+00f\n Q1 = reinterpret(0xBD088868), // -3.3333212137e-02f\n Q2 = reinterpret(0x3ACF3010), // 1.5807170421e-03f\n Ox1p127f = reinterpret(0x7F000000);\n var u = reinterpret(x);\n var hx = u & 0x7FFFFFFF;\n var sign_ = (u >> 31);\n if (hx >= 0x4195B844) {\n if (hx > 0x7F800000) return x;\n if (sign_) return -1;\n if (x > o_threshold) {\n x *= Ox1p127f;\n return x;\n }\n }\n var c: f32 = 0.0, t: f32, k: i32;\n if (hx > 0x3EB17218) {\n k = select(\n 1 - (sign_ << 1),\n (invln2 * x + builtin_copysign(0.5, x)),\n hx < 0x3F851592\n );\n t = k;\n let hi = x - t * ln2_hi;\n let lo = t * ln2_lo;\n x = hi - lo;\n c = (hi - x) - lo;\n } else if (hx < 0x33000000) {\n return x;\n } else k = 0;\n var hfx: f32 = 0.5 * x;\n var hxs: f32 = x * hfx;\n var r1: f32 = 1.0 + hxs * (Q1 + hxs * Q2);\n t = 3.0 - r1 * hfx;\n var e = hxs * ((r1 - t) / (6.0 - x * t));\n if (k == 0) return x - (x * e - hxs);\n e = x * (e - c) - c;\n e -= hxs;\n if (k == -1) return 0.5 * (x - e) - 0.5;\n if (k == 1) {\n if (x < -0.25) return -2.0 * (e - (x + 0.5));\n return 1.0 + 2.0 * (x - e);\n }\n u = (0x7F + k) << 23;\n var twopk = reinterpret(u);\n var y: f32;\n if (k < 0 || k > 56) {\n y = x - e + 1.0;\n if (k == 128) y = y * 2.0 * Ox1p127f;\n else y = y * twopk;\n return y - 1.0;\n }\n u = (0x7F - k) << 23;\n y = reinterpret(u);\n if (k < 20) y = (1 - y) - e;\n else y = 1 - (e + y);\n return (x + y) * twopk;\n }\n\n @inline\n export function fround(x: f32): f32 {\n return x;\n }\n\n export function hypot(x: f32, y: f32): f32 { // see: musl/src/math/hypotf.c\n const\n Ox1p90f = reinterpret(0x6C800000),\n Ox1p_90f = reinterpret(0x12800000);\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n ux &= 0x7FFFFFFF;\n uy &= 0x7FFFFFFF;\n if (ux < uy) {\n let ut = ux;\n ux = uy;\n uy = ut;\n }\n x = reinterpret(ux);\n y = reinterpret(uy);\n if (uy == 0xFF << 23) return y;\n if (ux >= 0xFF << 23 || uy == 0 || ux - uy >= 25 << 23) return x + y;\n var z: f32 = 1;\n if (ux >= (0x7F + 60) << 23) {\n z = Ox1p90f;\n x *= Ox1p_90f;\n y *= Ox1p_90f;\n } else if (uy < (0x7F - 60) << 23) {\n z = Ox1p_90f;\n x *= Ox1p90f;\n y *= Ox1p90f;\n }\n return z * builtin_sqrt((x * x + y * y));\n }\n\n @inline\n export function imul(x: f32, y: f32): f32 {\n return (x * y);\n }\n\n export function log(x: f32): f32 { // see: musl/src/math/logf.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01f\n ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06f\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f\n Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f\n Ox1p25f = reinterpret(0x4C000000);\n var u = reinterpret(x);\n var k = 0;\n if (u < 0x00800000 || (u >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (u >> 31) return (x - x) / 0;\n k -= 25;\n x *= Ox1p25f;\n u = reinterpret(x);\n } else if (u >= 0x7F800000) return x;\n else if (u == 0x3F800000) return 0;\n u += 0x3F800000 - 0x3F3504F3;\n k += (u >> 23) - 0x7F;\n u = (u & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret(u);\n var f = x - 1.0;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq = 0.5 * f * f;\n var dk = k;\n return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi;\n }\n\n export function log10(x: f32): f32 { // see: musl/src/math/log10f.c and SUN COPYRIGHT NOTICE above\n const\n ivln10hi = reinterpret(0x3EDE6000), // 4.3432617188e-01f\n ivln10lo = reinterpret(0xB804EAD9), // -3.1689971365e-05f\n log10_2hi = reinterpret(0x3E9A2080), // 3.0102920532e-01f\n log10_2lo = reinterpret(0x355427DB), // 7.9034151668e-07f\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f, 0.24279078841f\n Ox1p25f = reinterpret(0x4C000000);\n var ix = reinterpret(x);\n var k = 0;\n if (ix < 0x00800000 || (ix >> 31)) {\n if (ix << 1 == 0) return -1 / (x * x);\n if (ix >> 31) return (x - x) / 0.0;\n k -= 25;\n x *= Ox1p25f;\n ix = reinterpret(x);\n } else if (ix >= 0x7F800000) return x;\n else if (ix == 0x3F800000) return 0;\n ix += 0x3F800000 - 0x3F3504F3;\n k += (ix >> 23) - 0x7F;\n ix = (ix & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret(ix);\n var f = x - 1.0;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq: f32 = 0.5 * f * f;\n var hi = f - hfsq;\n ix = reinterpret(hi);\n ix &= 0xFFFFF000;\n hi = reinterpret(ix);\n var lo = f - hi - hfsq + s * (hfsq + r);\n var dk = k;\n return dk * log10_2lo + (lo + hi) * ivln10lo + lo * ivln10hi + hi * ivln10hi + dk * log10_2hi;\n }\n\n export function log1p(x: f32): f32 { // see: musl/src/math/log1pf.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01\n ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret(0x3E789E26); // 0xf89e26.0p-26f, 0.24279078841f\n var ix = reinterpret(x);\n var c: f32 = 0, f: f32 = 0;\n var k: i32 = 1;\n if (ix < 0x3ED413D0 || (ix >> 31)) {\n if (ix >= 0xBF800000) {\n if (x == -1) return x / 0.0;\n return (x - x) / 0.0;\n }\n if (ix << 1 < 0x33800000 << 1) return x;\n if (ix <= 0xBE95F619) {\n k = 0;\n c = 0;\n f = x;\n }\n } else if (ix >= 0x7F800000) return x;\n if (k) {\n let uf: f32 = 1 + x;\n let iu = reinterpret(uf);\n iu += 0x3F800000 - 0x3F3504F3;\n k = (iu >> 23) - 0x7F;\n if (k < 25) {\n c = k >= 2 ? 1 - (uf - x) : x - (uf - 1);\n c /= uf;\n } else c = 0;\n iu = (iu & 0x007FFFFF) + 0x3F3504F3;\n f = reinterpret(iu) - 1;\n }\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq: f32 = 0.5 * f * f;\n var dk = k;\n return s * (hfsq + r) + (dk * ln2_lo + c) - hfsq + f + dk * ln2_hi;\n }\n\n export function log2(x: f32): f32 { // see: musl/src/math/log2f.c and SUN COPYRIGHT NOTICE above\n const\n ivln2hi = reinterpret(0x3FB8B000), // 1.4428710938e+00f\n ivln2lo = reinterpret(0xB9389AD4), // -1.7605285393e-04\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f, 0.24279078841f\n Ox1p25f = reinterpret(0x4C000000);\n var ix = reinterpret(x);\n var k: i32 = 0;\n if (ix < 0x00800000 || (ix >> 31)) {\n if (ix << 1 == 0) return -1 / (x * x);\n if (ix >> 31) return (x - x) / 0.0;\n k -= 25;\n x *= Ox1p25f;\n ix = reinterpret(x);\n } else if (ix >= 0x7F800000) return x;\n else if (ix == 0x3F800000) return 0;\n ix += 0x3F800000 - 0x3F3504F3;\n k += (ix >> 23) - 0x7F;\n ix = (ix & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret(ix);\n var f = x - 1.0;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq: f32 = 0.5 * f * f;\n var hi = f - hfsq;\n var u = reinterpret(hi);\n u &= 0xFFFFF000;\n hi = reinterpret(u);\n var lo: f32 = f - hi - hfsq + s * (hfsq + r);\n var dk = k;\n return (lo + hi) * ivln2lo + lo * ivln2hi + hi * ivln2hi + dk;\n }\n\n @inline\n export function max(value1: f32, value2: f32): f32 {\n return builtin_max(value1, value2);\n }\n\n @inline\n export function min(value1: f32, value2: f32): f32 {\n return builtin_min(value1, value2);\n }\n\n export function pow(x: f32, y: f32): f32 { // see: musl/src/math/powf.c and SUN COPYRIGHT NOTICE above\n const\n dp_h1 = reinterpret(0x3F15C000), // 5.84960938e-01f\n dp_l1 = reinterpret(0x35D1CFDC), // 1.56322085e-06f\n two24 = reinterpret(0x4B800000), // 16777216f\n huge = reinterpret(0x7149F2CA), // 1.0e+30f\n tiny = reinterpret(0x0DA24260), // 1.0e-30f\n L1 = reinterpret(0x3F19999A), // 6.0000002384e-01f\n L2 = reinterpret(0x3EDB6DB7), // 4.2857143283e-01f\n L3 = reinterpret(0x3EAAAAAB), // 3.3333334327e-01f\n L4 = reinterpret(0x3E8BA305), // 2.7272811532e-01f\n L5 = reinterpret(0x3E6C3255), // 2.3066075146e-01f\n L6 = reinterpret(0x3E53F142), // 2.0697501302e-01f\n P1 = reinterpret(0x3E2AAAAB), // 1.6666667163e-01f\n P2 = reinterpret(0xBB360B61), // -2.7777778450e-03f\n P3 = reinterpret(0x388AB355), // 6.6137559770e-05f\n P4 = reinterpret(0xB5DDEA0E), // -1.6533901999e-06f\n P5 = reinterpret(0x3331BB4C), // 4.1381369442e-08f\n lg2 = reinterpret(0x3F317218), // 6.9314718246e-01f\n lg2_h = reinterpret(0x3F317200), // 6.93145752e-01f\n lg2_l = reinterpret(0x35BFBE8C), // 1.42860654e-06f\n ovt = reinterpret(0x3338AA3C), // 4.2995665694e-08f\n cp = reinterpret(0x3F76384F), // 9.6179670095e-01\n cp_h = reinterpret(0x3F764000), // 9.6191406250e-01\n cp_l = reinterpret(0xB8F623C6), // -1.1736857402e-04\n ivln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+00\n ivln2_h = reinterpret(0x3FB8AA00), // 1.4426879883e+00\n ivln2_l = reinterpret(0x36ECA570), // 7.0526075433e-06\n inv3 = reinterpret(0x3EAAAAAB); // 0.333333333333\n var hx = reinterpret(x);\n var hy = reinterpret(y);\n var ix = hx & 0x7FFFFFFF;\n var iy = hy & 0x7FFFFFFF;\n if (iy == 0) return 1.0; // x**0 = 1, even if x is NaN\n // if (hx == 0x3F800000) return 1.0; // C: 1**y = 1, even if y is NaN, JS: NaN\n if (ix > 0x7F800000 || iy > 0x7F800000) return x + y; // NaN if either arg is NaN\n var yisint = 0, j: i32, k: i32;\n if (hx < 0) {\n if (iy >= 0x4B800000) yisint = 2;\n else if (iy >= 0x3F800000) {\n k = (iy >> 23) - 0x7F;\n j = iy >> (23 - k);\n if ((j << (23 - k)) == iy) yisint = 2 - (j & 1);\n }\n }\n if (iy == 0x7F800000) { // y is +-inf\n if (ix == 0x3F800000) return NaN; // C: (-1)**+-inf is 1, JS: NaN\n else if (ix > 0x3F800000) return hy >= 0 ? y : 0.0; // (|x|>1)**+-inf = inf,0\n else return hy >= 0 ? 0.0 : -y; // (|x|<1)**+-inf = 0,inf\n }\n if (iy == 0x3F800000) return hy >= 0 ? x : 1.0 / x;\n if (hy == 0x40000000) return x * x;\n if (hy == 0x3F000000) {\n if (hx >= 0) return builtin_sqrt(x);\n }\n var ax = builtin_abs(x);\n var z: f32;\n if (ix == 0x7F800000 || ix == 0 || ix == 0x3F800000) {\n z = ax;\n if (hy < 0) z = 1.0 / z;\n if (hx < 0) {\n if (((ix - 0x3F800000) | yisint) == 0) z = (z - z) / (z - z);\n else if (yisint == 1) z = -z;\n }\n return z;\n }\n var sn = 1.0;\n if (hx < 0) {\n if (yisint == 0) return (x - x) / (x - x);\n if (yisint == 1) sn = -1.0;\n }\n var t1: f32, t2: f32, r: f32, s: f32, t: f32, u: f32, v: f32, w: f32, p_h: f32, p_l: f32;\n var n: i32, is: i32;\n if (iy > 0x4D000000) {\n if (ix < 0x3F7FFFF8) return hy < 0 ? sn * huge * huge : sn * tiny * tiny;\n if (ix > 0x3F800007) return hy > 0 ? sn * huge * huge : sn * tiny * tiny;\n t = ax - 1;\n w = (t * t) * (0.5 - t * (inv3 - t * 0.25));\n u = ivln2_h * t;\n v = t * ivln2_l - w * ivln2;\n t1 = u + v;\n is = reinterpret(t1);\n t1 = reinterpret(is & 0xFFFFF000);\n t2 = v - (t1 - u);\n } else {\n let s2: f32, s_h: f32, s_l: f32, t_h: f32, t_l: f32;\n n = 0;\n if (ix < 0x00800000) {\n ax *= two24;\n n -= 24;\n ix = reinterpret(ax);\n }\n n += (ix >> 23) - 0x7F;\n j = ix & 0x007FFFFF;\n ix = j | 0x3F800000;\n if (j <= 0x1CC471) k = 0;\n else if (j < 0x5DB3D7) k = 1;\n else {\n k = 0;\n n += 1;\n ix -= 0x00800000;\n }\n ax = reinterpret(ix);\n let bp = select(1.5, 1.0, k); // k ? 1.5 : 1.0\n u = ax - bp;\n v = 1.0 / (ax + bp);\n s = u * v;\n s_h = s;\n is = reinterpret(s_h);\n s_h = reinterpret(is & 0xFFFFF000);\n is = ((ix >> 1) & 0xFFFFF000) | 0x20000000;\n t_h = reinterpret(is + 0x00400000 + (k << 21));\n t_l = ax - (t_h - bp);\n s_l = v * ((u - s_h * t_h) - s_h * t_l);\n s2 = s * s;\n r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6)))));\n r += s_l * (s_h + s);\n s2 = s_h * s_h;\n t_h = 3.0 + s2 + r;\n is = reinterpret(t_h);\n t_h = reinterpret(is & 0xFFFFF000);\n t_l = r - ((t_h - 3.0) - s2);\n u = s_h * t_h;\n v = s_l * t_h + t_l * s;\n p_h = u + v;\n is = reinterpret(p_h);\n p_h = reinterpret(is & 0xFFFFF000);\n p_l = v - (p_h - u);\n let z_h = cp_h * p_h;\n let dp_l = select(dp_l1, 0.0, k);\n let z_l = cp_l * p_h + p_l * cp + dp_l;\n t = n;\n let dp_h = select(dp_h1, 0.0, k);\n t1 = (((z_h + z_l) + dp_h) + t);\n is = reinterpret(t1);\n t1 = reinterpret(is & 0xFFFFF000);\n t2 = z_l - (((t1 - t) - dp_h) - z_h);\n }\n is = reinterpret(y);\n var y1 = reinterpret(is & 0xFFFFF000);\n p_l = (y - y1) * t1 + y * t2;\n p_h = y1 * t1;\n z = p_l + p_h;\n j = reinterpret(z);\n if (j > 0x43000000) {\n return sn * huge * huge;\n } else if (j == 0x43000000) {\n if (p_l + ovt > z - p_h) return sn * huge * huge;\n } else if ((j & 0x7FFFFFFF) > 0x43160000) {\n return sn * tiny * tiny;\n } else if (j == 0xC3160000) {\n if (p_l <= z - p_h) return sn * tiny * tiny;\n }\n var i = j & 0x7FFFFFFF;\n k = (i >> 23) - 0x7F;\n n = 0;\n if (i > 0x3F000000) {\n n = j + (0x00800000 >> (k + 1));\n k = ((n & 0x7FFFFFFF) >> 23) - 0x7F;\n t = reinterpret(n & ~(0x007FFFFF >> k));\n n = ((n & 0x007FFFFF) | 0x00800000) >> (23 - k);\n if (j < 0) n = -n;\n p_h -= t;\n }\n t = p_l + p_h;\n is = reinterpret(t);\n t = reinterpret(is & 0xFFFF8000);\n u = t * lg2_h;\n v = (p_l - (t - p_h)) * lg2 + t * lg2_l;\n z = u + v;\n w = v - (z - u);\n t = z * z;\n t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));\n r = (z * t1) / (t1 - 2.0) - (w + z * w);\n z = 1.0 - (r - z);\n j = reinterpret(z);\n j += n << 23;\n if ((j >> 23) <= 0) z = scalbn(z, n);\n else z = reinterpret(j);\n return sn * z;\n }\n\n @inline\n export function seedRandom(value: i64): void {\n NativeMath.seedRandom(value);\n }\n\n // Using xoroshiro64starstar from http://xoshiro.di.unimi.it/xoroshiro64starstar.c\n export function random(): f32 {\n if (!random_seeded) throw new Error("PRNG must be seeded.");\n\n var s0 = random_state0_32;\n var s1 = random_state1_32;\n var r = rotl(s0 * 0x9E3779BB, 5) * 5;\n\n s1 ^= s0;\n random_state0_32 = rotl(s0, 26) ^ s1 ^ (s1 << 9);\n random_state1_32 = rotl(s1, 13);\n\n return reinterpret((r >> 9) | (127 << 23)) - 1.0;\n }\n\n @inline\n export function round(x: f32): f32 {\n return builtin_copysign(builtin_floor(x + 0.5), x);\n }\n\n @inline\n export function sign(x: f32): f32 {\n if (ASC_SHRINK_LEVEL > 0) {\n return builtin_abs(x) > 0 ? builtin_copysign(1, x) : x;\n } else {\n return x > 0 ? 1 : x < 0 ? -1 : x;\n }\n }\n\n @inline\n export function signbit(x: f32): bool {\n return ((reinterpret(x) >>> 31) & (x == x));\n }\n\n export function sin(x: f32): f32 { // TODO\n unreachable();\n return 0;\n }\n\n export function sinh(x: f32): f32 { // see: musl/src/math/sinhf.c\n var u = reinterpret(x) & 0x7FFFFFFF;\n var absx = reinterpret(u);\n var t: f32;\n var h = builtin_copysign(0.5, x);\n if (u < 0x42B17217) {\n t = expm1(absx);\n if (u < 0x3F800000) {\n if (u < 0x3F800000 - (12 << 23)) return x;\n return h * (2 * t - t * t / (t + 1));\n }\n return h * (t + t / (t + 1));\n }\n t = 2 * h * expo2f(absx);\n return t;\n }\n\n @inline\n export function sqrt(x: f32): f32 {\n return builtin_sqrt(x);\n }\n\n export function tan(x: f32): f32 { // TODO\n unreachable();\n return 0;\n }\n\n export function tanh(x: f32): f32 { // see: musl/src/math/tanhf.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFF;\n var y = reinterpret(u);\n var t: f32;\n if (u > 0x3F0C9F54) {\n if (u > 0x41200000) t = 1 + 0 / y;\n else {\n t = expm1(2 * y);\n t = 1 - 2 / (t + 2);\n }\n } else if (u > 0x3E82C578) {\n t = expm1(2 * y);\n t = t / (t + 2);\n } else if (u >= 0x00800000) {\n t = expm1(-2 * y);\n t = -t / (t + 2);\n } else t = y;\n return builtin_copysign(t, x);\n }\n\n @inline\n export function trunc(x: f32): f32 {\n return builtin_trunc(x);\n }\n\n /** @internal */\n export function scalbn(x: f32, n: i32): f32 { // see: https://git.musl-libc.org/cgit/musl/tree/src/math/scalbnf.c\n const\n Ox1p24f = reinterpret(0x4B800000),\n Ox1p127f = reinterpret(0x7F000000),\n Ox1p_126f = reinterpret(0x00800000);\n var y = x;\n if (n > 127) {\n y *= Ox1p127f;\n n -= 127;\n if (n > 127) {\n y *= Ox1p127f;\n n = builtin_min(n - 127, 127);\n }\n } else if (n < -126) {\n y *= Ox1p_126f * Ox1p24f;\n n += 126 - 24;\n if (n < -126) {\n y *= Ox1p_126f * Ox1p24f;\n n = builtin_max(n + 126 - 24, -126);\n }\n }\n return y * reinterpret((0x7F + n) << 23);\n }\n\n export function mod(x: f32, y: f32): f32 { // see: musl/src/math/fmodf.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 23 & 0xFF);\n var ey = (uy >> 23 & 0xFF);\n var sx = ux & 0x80000000;\n var uy1 = uy << 1;\n if (uy1 == 0 || ex == 0xFF || isNaN(y)) return (x * y) / (x * y);\n var ux1 = ux << 1;\n if (ux1 <= uy1) {\n if (ux1 == uy1) return 0 * x;\n return x;\n }\n if (!ex) {\n ex -= builtin_clz(ux << 9);\n ux <<= -ex + 1;\n } else {\n ux &= -1 >> 9;\n ux |= 1 << 23;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 9);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 9;\n uy |= 1 << 23;\n }\n while (ex > ey) {\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n ux <<= 1;\n --ex;\n }\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n // for (; !(ux >> 23); ux <<= 1) --ex;\n var shift = builtin_clz(ux << 8);\n ex -= shift;\n ux <<= shift;\n if (ex > 0) {\n ux -= 1 << 23;\n ux |= ex << 23;\n } else {\n ux >>= -ex + 1;\n }\n ux |= sx;\n return reinterpret(ux);\n }\n\n export function rem(x: f32, y: f32): f32 { // see: musl/src/math/remquof.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 23 & 0xFF);\n var ey = (uy >> 23 & 0xFF);\n var sx = (ux >> 31);\n var uxi = ux;\n if (uy << 1 == 0 || ex == 0xFF || isNaN(y)) return (x * y) / (x * y);\n if (ux << 1 == 0) return x;\n if (!ex) {\n ex -= builtin_clz(uxi << 9);\n uxi <<= -ex + 1;\n } else {\n uxi &= -1 >> 9;\n uxi |= 1 << 23;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 9);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 9;\n uy |= 1 << 23;\n }\n var q = 0;\n do {\n if (ex < ey) {\n if (ex + 1 == ey) break; // goto end\n return x;\n }\n while (ex > ey) {\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n uxi <<= 1;\n q <<= 1;\n --ex;\n }\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n if (uxi == 0) ex = -30;\n else {\n let shift = builtin_clz(uxi << 8);\n ex -= shift;\n uxi <<= shift;\n }\n break;\n } while (false);\n // end\n if (ex > 0) {\n uxi -= 1 << 23;\n uxi |= ex << 23;\n } else {\n uxi >>= -ex + 1;\n }\n x = reinterpret(uxi);\n y = builtin_abs(y);\n var x2 = x + x;\n if (ex == ey || (ex + 1 == ey && (x2 > y || (x2 == y && (q & 1))))) {\n x -= y;\n // q++;\n }\n return sx ? -x : x;\n }\n}\n\nexport function ipow32(x: i32, e: i32): i32 {\n var out = 1;\n if (ASC_SHRINK_LEVEL < 1) {\n if (e < 0) return 0;\n\n switch (e) {\n case 0: return 1;\n case 1: return x;\n case 2: return x * x;\n }\n\n let log = 32 - clz(e);\n if (log <= 5) {\n // 32 = 2 ^ 5, so need only five cases.\n // But some extra cases needs for properly overflowing\n switch (log) {\n case 5: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 4: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 3: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 2: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 1: {\n if (e & 1) out *= x;\n }\n }\n return out;\n }\n }\n\n while (e > 0) {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n return out;\n}\n\nexport function ipow64(x: i64, e: i32): i64 {\n var out: i64 = 1;\n if (ASC_SHRINK_LEVEL < 1) {\n if (e < 0) return 0;\n switch (e) {\n case 0: return 1;\n case 1: return x;\n case 2: return x * x;\n }\n\n let log = 32 - clz(e);\n if (log <= 6) {\n // 64 = 2 ^ 6, so need only six cases.\n // But some extra cases needs for properly overflowing\n switch (log) {\n case 6: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 5: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 4: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 3: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 2: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 1: {\n if (e & 1) out *= x;\n }\n }\n return out;\n }\n }\n\n while (e > 0) {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n return out;\n}\n',memory:'import { memcmp, memmove, memset } from "./internal/memory";\n\n@builtin export declare const HEAP_BASE: usize; // tslint:disable-line\n\n/* tslint:disable */\n\nexport namespace memory {\n\n @builtin export declare function size(): i32;\n\n @builtin export declare function grow(pages: i32): i32;\n\n @inline export function fill(dest: usize, c: u8, n: usize): void { // see: musl/src/string/memset\n if (isDefined(__memory_fill)) { __memory_fill(dest, c, n); return; }\n memset(dest, c, n);\n }\n\n @inline export function copy(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memmove.c\n if (isDefined(__memory_copy)) { __memory_copy(dest, src, n); return; }\n memmove(dest, src, n);\n }\n\n @inline export function compare(vl: usize, vr: usize, n: usize): i32 { // see: musl/src/string/memcmp.c\n if (isDefined(__memory_compare)) return __memory_compare(vl, vr, n);\n return memcmp(vl, vr, n);\n }\n\n // Passive segments\n\n // export function init(segmentIndex: u32, srcOffset: usize, dstOffset: usize, n: usize): void {\n // __memory_init(segmentIndex, srcOffset, dstOffset);\n // }\n\n // export function drop(segmentIndex: u32): void {\n // __memory_drop(segmentIndex);\n // }\n\n // Allocator\n\n @inline export function allocate(size: usize): usize {\n if (isDefined(__memory_allocate)) return __memory_allocate(size);\n WARNING("Calling \'memory.allocate\' requires a memory manager to be present.");\n return unreachable();\n }\n\n @inline export function free(ptr: usize): void {\n if (isDefined(__memory_free)) { __memory_free(ptr); return; }\n WARNING("Calling \'memory.free\' requires a memory manager to be present.");\n unreachable();\n }\n\n @inline export function reset(): void {\n if (isDefined(__memory_reset)) { __memory_reset(); return; }\n unreachable();\n }\n}\n',number:'import {\n itoa,\n dtoa\n} from "./internal/number";\n\nimport {\n isNaN as builtin_isNaN,\n isFinite as builtin_isFinite\n} from "./builtins";\n\n@sealed\nexport abstract class I8 {\n\n static readonly MIN_VALUE: i8 = i8.MIN_VALUE;\n static readonly MAX_VALUE: i8 = i8.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i8 {\n return parseI32(value, radix);\n }\n\n toString(this: i8): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class I16 {\n\n static readonly MIN_VALUE: i16 = i16.MIN_VALUE;\n static readonly MAX_VALUE: i16 = i16.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i16 {\n return parseI32(value, radix);\n }\n\n toString(this: i16): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class I32 {\n\n static readonly MIN_VALUE: i32 = i32.MIN_VALUE;\n static readonly MAX_VALUE: i32 = i32.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i32 {\n return parseI32(value, radix);\n }\n\n toString(this: i32): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class I64 {\n\n static readonly MIN_VALUE: i64 = i64.MIN_VALUE;\n static readonly MAX_VALUE: i64 = i64.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i64 {\n return parseI64(value, radix);\n }\n\n toString(this: i64): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class Isize {\n\n static readonly MIN_VALUE: isize = isize.MIN_VALUE;\n static readonly MAX_VALUE: isize = isize.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): isize {\n return parseI64(value, radix);\n }\n\n toString(this: isize): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U8 {\n\n static readonly MIN_VALUE: u8 = u8.MIN_VALUE;\n static readonly MAX_VALUE: u8 = u8.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u8 {\n return parseI32(value, radix);\n }\n\n toString(this: u8): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U16 {\n\n static readonly MIN_VALUE: u16 = u16.MIN_VALUE;\n static readonly MAX_VALUE: u16 = u16.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u16 {\n return parseI32(value, radix);\n }\n\n toString(this: u16): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U32 {\n\n static readonly MIN_VALUE: u32 = u32.MIN_VALUE;\n static readonly MAX_VALUE: u32 = u32.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u32 {\n return parseI32(value, radix);\n }\n\n toString(this: u32): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U64 {\n\n static readonly MIN_VALUE: u64 = u64.MIN_VALUE;\n static readonly MAX_VALUE: u64 = u64.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u64 {\n return parseI64(value, radix);\n }\n\n toString(this: u64): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class Usize {\n\n static readonly MIN_VALUE: usize = usize.MIN_VALUE;\n static readonly MAX_VALUE: usize = usize.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): usize {\n return parseI64(value, radix);\n }\n\n toString(this: usize): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class Bool {\n\n static readonly MIN_VALUE: bool = bool.MIN_VALUE;\n static readonly MAX_VALUE: bool = bool.MAX_VALUE;\n\n toString(this: bool): String {\n // TODO: radix?\n return this ? "true" : "false";\n }\n}\n\n@sealed\nexport abstract class Boolean extends Bool {}\n\n@sealed\nexport abstract class F32 {\n\n static readonly EPSILON: f32 = f32.EPSILON;\n static readonly MIN_VALUE: f32 = f32.MIN_VALUE;\n static readonly MAX_VALUE: f32 = f32.MAX_VALUE;\n static readonly MIN_SAFE_INTEGER: f32 = f32.MIN_SAFE_INTEGER;\n static readonly MAX_SAFE_INTEGER: f32 = f32.MAX_SAFE_INTEGER;\n static readonly POSITIVE_INFINITY: f32 = Infinity;\n static readonly NEGATIVE_INFINITY: f32 = -Infinity;\n static readonly NaN: f32 = NaN;\n\n static isNaN(value: f32): bool {\n return isNaN(value);\n }\n\n static isFinite(value: f32): bool {\n return isFinite(value);\n }\n\n static isSafeInteger(value: f32): bool {\n return abs(value) <= f32.MAX_SAFE_INTEGER && trunc(value) == value;\n }\n\n static isInteger(value: f32): bool {\n return isFinite(value) && trunc(value) == value;\n }\n\n static parseInt(value: string, radix: i32 = 0): f32 {\n return parseI64(value, radix);\n }\n\n static parseFloat(value: string): f32 {\n return parseFloat(value);\n }\n\n toString(this: f32): String {\n // TODO: radix\n return dtoa(this);\n }\n}\n\n@sealed\nexport abstract class F64 {\n\n static readonly EPSILON: f64 = f64.EPSILON;\n static readonly MIN_VALUE: f64 = f64.MIN_VALUE;\n static readonly MAX_VALUE: f64 = f64.MAX_VALUE;\n static readonly MIN_SAFE_INTEGER: f64 = f64.MIN_SAFE_INTEGER;\n static readonly MAX_SAFE_INTEGER: f64 = f64.MAX_SAFE_INTEGER;\n static readonly POSITIVE_INFINITY: f64 = Infinity;\n static readonly NEGATIVE_INFINITY: f64 = -Infinity;\n static readonly NaN: f64 = NaN;\n\n static isNaN(value: f64): bool {\n return builtin_isNaN(value);\n }\n\n static isFinite(value: f64): bool {\n return builtin_isFinite(value);\n }\n\n static isSafeInteger(value: f64): bool {\n return abs(value) <= f64.MAX_SAFE_INTEGER && trunc(value) == value;\n }\n\n static isInteger(value: f64): bool {\n return builtin_isFinite(value) && trunc(value) == value;\n }\n\n static parseInt(value: string, radix: i32 = 0): f64 {\n return parseI64(value, radix);\n }\n\n static parseFloat(value: string): f64 {\n return parseFloat(value);\n }\n\n toString(this: f64): String {\n // TODO: radix\n return dtoa(this);\n }\n}\n\n@sealed\nexport abstract class Number extends F64 {}\n',polyfills:"export function bswap(value: T): T {\n if (isInteger()) {\n if (sizeof() == 2) {\n return ((value << 8) | ((value >> 8) & 0x00FF));\n }\n if (sizeof() == 4) {\n return (\n rotl(value & 0xFF00FF00, 8) |\n rotr(value & 0x00FF00FF, 8)\n );\n }\n if (sizeof() == 8) {\n let a = (value >> 8) & 0x00FF00FF00FF00FF;\n let b = (value & 0x00FF00FF00FF00FF) << 8;\n let v = a | b;\n\n a = (v >> 16) & 0x0000FFFF0000FFFF;\n b = (v & 0x0000FFFF0000FFFF) << 16;\n\n return rotr(a | b, 32);\n }\n return value;\n }\n assert(false);\n return value;\n}\n\n@inline\nexport function bswap16(value: T): T {\n if (isInteger() && sizeof() <= 4) {\n if (sizeof() == 2) {\n return ((value << 8) | ((value >> 8) & 0x00FF));\n } else if (sizeof() == 4) {\n return (((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000));\n }\n return value;\n }\n assert(false);\n return value;\n}\n",regexp:'export class RegExp {\n\n // @binding(CALL_NEW, [ STRING, STRING], OBJECT_HANDLE)\n constructor(pattern: string, flags: string = "") { throw new Error("unreachable"); }\n\n // @binding(CALL_THIS, [ STRING ], PASS_THRU)\n test(search: string): bool { throw new Error("unreachable"); }\n\n // @binding(CALL_THIS, [], STRING)\n toString(): string { throw new Error("unreachable"); }\n\n}\n',set:'import {\n HEADER_SIZE as HEADER_SIZE_AB\n} from "./internal/arraybuffer";\n\nimport {\n HASH\n} from "./internal/hash";\n\n// A deterministic hash set based on CloseTable from https://github.com/jorendorff/dht\n\nconst INITIAL_CAPACITY = 4;\nconst FILL_FACTOR: f64 = 8 / 3;\nconst FREE_FACTOR: f64 = 3 / 4;\n\n/** Structure of a set entry. */\n@unmanaged class SetEntry {\n key: K;\n taggedNext: usize; // LSB=1 indicates EMPTY\n}\n\n/** Empty bit. */\nconst EMPTY: usize = 1 << 0;\n\n/** Size of a bucket. */\nconst BUCKET_SIZE = sizeof();\n\n/** Computes the alignment of an entry. */\n@inline function ENTRY_ALIGN(): usize {\n // can align to 4 instead of 8 if 32-bit and K is <= 32-bits\n const align = (sizeof() > sizeof() ? sizeof() : sizeof()) - 1;\n return align;\n}\n\n/** Computes the aligned size of an entry. */\n@inline function ENTRY_SIZE(): usize {\n const align = ENTRY_ALIGN();\n const size = (offsetof>() + align) & ~align;\n return size;\n}\n\nexport class Set {\n\n // buckets holding references to the respective first entry within\n private buckets: ArrayBuffer; // usize[bucketsMask + 1]\n private bucketsMask: u32;\n\n // entries in insertion order\n private entries: ArrayBuffer; // SetEntry[entriesCapacity]\n private entriesCapacity: i32;\n private entriesOffset: i32;\n private entriesCount: i32;\n\n get size(): i32 { return this.entriesCount; }\n\n constructor() { this.clear(); }\n\n clear(): void {\n const bucketsSize = INITIAL_CAPACITY * BUCKET_SIZE;\n this.buckets = new ArrayBuffer(bucketsSize);\n this.bucketsMask = INITIAL_CAPACITY - 1;\n const entriesSize = INITIAL_CAPACITY * ENTRY_SIZE();\n this.entries = new ArrayBuffer(entriesSize, true);\n this.entriesCapacity = INITIAL_CAPACITY;\n this.entriesOffset = 0;\n this.entriesCount = 0;\n }\n\n private find(key: K, hashCode: u32): SetEntry | null {\n var entry = load>(\n changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE,\n HEADER_SIZE_AB\n );\n while (entry) {\n if (!(entry.taggedNext & EMPTY) && entry.key == key) return entry;\n entry = changetype>(entry.taggedNext & ~EMPTY);\n }\n return null;\n }\n\n has(key: K): bool {\n return this.find(key, HASH(key)) !== null;\n }\n\n add(key: K): void {\n var hashCode = HASH(key);\n var entry = this.find(key, hashCode);\n if (!entry) {\n // check if rehashing is necessary\n if (this.entriesOffset == this.entriesCapacity) {\n this.rehash(\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ? this.bucketsMask // just rehash if 1/4+ entries are empty\n : (this.bucketsMask << 1) | 1 // grow capacity to next 2^N\n );\n }\n // append new entry\n let entries = this.entries;\n entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + this.entriesOffset++ * ENTRY_SIZE()\n );\n entry.key = key;\n ++this.entriesCount;\n // link with previous entry in bucket\n let bucketPtrBase = changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE;\n entry.taggedNext = load(bucketPtrBase, HEADER_SIZE_AB);\n store(bucketPtrBase, changetype(entry), HEADER_SIZE_AB);\n if (isManaged()) __gc_link(changetype(this), changetype(key)); // tslint:disable-line\n }\n }\n\n delete(key: K): bool {\n var entry = this.find(key, HASH(key));\n if (!entry) return false;\n entry.taggedNext |= EMPTY;\n --this.entriesCount;\n // check if rehashing is appropriate\n var halfBucketsMask = this.bucketsMask >> 1;\n if (\n halfBucketsMask + 1 >= max(INITIAL_CAPACITY, this.entriesCount) &&\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ) this.rehash(halfBucketsMask);\n return true;\n }\n\n private rehash(newBucketsMask: u32): void {\n var newBucketsCapacity = (newBucketsMask + 1);\n var newBuckets = new ArrayBuffer(newBucketsCapacity * BUCKET_SIZE);\n var newEntriesCapacity = (newBucketsCapacity * FILL_FACTOR);\n var newEntries = new ArrayBuffer(newEntriesCapacity * ENTRY_SIZE(), true);\n\n // copy old entries to new entries\n var oldPtr = changetype(this.entries) + HEADER_SIZE_AB;\n var oldEnd = oldPtr + this.entriesOffset * ENTRY_SIZE();\n var newPtr = changetype(newEntries) + HEADER_SIZE_AB;\n while (oldPtr != oldEnd) {\n let oldEntry = changetype>(oldPtr);\n if (!(oldEntry.taggedNext & EMPTY)) {\n let newEntry = changetype>(newPtr);\n newEntry.key = oldEntry.key;\n let newBucketIndex = HASH(oldEntry.key) & newBucketsMask;\n let newBucketPtrBase = changetype(newBuckets) + newBucketIndex * BUCKET_SIZE;\n newEntry.taggedNext = load(newBucketPtrBase, HEADER_SIZE_AB);\n store(newBucketPtrBase, newPtr, HEADER_SIZE_AB);\n newPtr += ENTRY_SIZE();\n }\n oldPtr += ENTRY_SIZE();\n }\n\n this.buckets = newBuckets;\n this.bucketsMask = newBucketsMask;\n this.entries = newEntries;\n this.entriesCapacity = newEntriesCapacity;\n this.entriesOffset = this.entriesCount;\n }\n\n toString(): string {\n return "[object Set]";\n }\n\n private __gc(): void {\n __gc_mark(changetype(this.buckets)); // tslint:disable-line\n var entries = this.entries;\n __gc_mark(changetype(entries)); // tslint:disable-line\n if (isManaged()) {\n let offset: usize = 0;\n let end: usize = this.entriesOffset * ENTRY_SIZE();\n while (offset < end) {\n let entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + offset * ENTRY_SIZE()\n );\n if (!(entry.taggedNext & EMPTY)) __gc_mark(changetype(entry.key)); // tslint:disable-line\n offset += ENTRY_SIZE();\n }\n }\n }\n}\n',string:'import {\n HEADER_SIZE,\n MAX_LENGTH,\n allocateUnsafe,\n compareUnsafe,\n repeatUnsafe,\n copyUnsafe,\n isWhiteSpaceOrLineTerminator,\n CharCode,\n parse\n} from "./internal/string";\n\nimport {\n STORE\n} from "./internal/arraybuffer";\n\n@sealed\nexport class String {\n\n readonly length: i32; // capped to [0, MAX_LENGTH]\n\n // TODO Add and handle second argument\n static fromCharCode(code: i32): String {\n var out = allocateUnsafe(1);\n store(\n changetype(out),\n code,\n HEADER_SIZE\n );\n return out;\n }\n\n static fromCodePoint(code: i32): String {\n assert(code <= 0x10FFFF);\n var sur = code > 0xFFFF;\n var out = allocateUnsafe(sur + 1);\n if (!sur) {\n store(\n changetype(out),\n code,\n HEADER_SIZE\n );\n } else {\n code -= 0x10000;\n let hi: u32 = (code >>> 10) + 0xD800;\n let lo: u32 = (code & 0x3FF) + 0xDC00;\n store(\n changetype(out),\n (hi << 16) | lo,\n HEADER_SIZE\n );\n }\n return out;\n }\n\n @operator("[]")\n charAt(pos: i32): String {\n assert(this !== null);\n\n if (pos >= this.length) return changetype("");\n\n var out = allocateUnsafe(1);\n store(\n changetype(out),\n load(\n changetype(this) + (pos << 1),\n HEADER_SIZE\n ),\n HEADER_SIZE\n );\n return out;\n }\n\n charCodeAt(pos: i32): i32 {\n assert(this !== null);\n if (pos >= this.length) return -1; // (NaN)\n\n return load(\n changetype(this) + (pos << 1),\n HEADER_SIZE\n );\n }\n\n codePointAt(pos: i32): i32 {\n assert(this !== null);\n if (pos >= this.length) return -1; // (undefined)\n\n var first = load(\n changetype(this) + (pos << 1),\n HEADER_SIZE\n );\n if (first < 0xD800 || first > 0xDBFF || pos + 1 == this.length) {\n return first;\n }\n var second = load(\n changetype(this) + ((pos + 1) << 1),\n HEADER_SIZE\n );\n if (second < 0xDC00 || second > 0xDFFF) return first;\n return ((first - 0xD800) << 10) + (second - 0xDC00) + 0x10000;\n }\n\n @operator("+")\n private static __concat(left: String, right: String): String {\n if (!changetype(left)) left = changetype("null");\n return left.concat(right);\n }\n\n concat(other: String): String {\n assert(this !== null);\n if (other === null) other = changetype("null");\n\n var thisLen: isize = this.length;\n var otherLen: isize = other.length;\n var outLen: usize = thisLen + otherLen;\n if (outLen == 0) return changetype("");\n var out = allocateUnsafe(outLen);\n copyUnsafe(out, 0, this, 0, thisLen);\n copyUnsafe(out, thisLen, other, 0, otherLen);\n return out;\n }\n\n endsWith(searchString: String, endPosition: i32 = MAX_LENGTH): bool {\n assert(this !== null);\n if (searchString === null) return false;\n var end = min(max(endPosition, 0), this.length);\n var searchLength: isize = searchString.length;\n var start: isize = end - searchLength;\n if (start < 0) return false;\n return !compareUnsafe(this, start, searchString, 0, searchLength);\n }\n\n @operator("==")\n private static __eq(left: String, right: String): bool {\n if (left === right) return true;\n if (left === null || right === null) return false;\n\n var leftLength = left.length;\n if (leftLength != right.length) return false;\n\n return !compareUnsafe(left, 0, right, 0, leftLength);\n }\n\n @operator("!=")\n private static __ne(left: String, right: String): bool {\n return !this.__eq(left, right);\n }\n\n @operator(">")\n private static __gt(left: String, right: String): bool {\n if (left === right || left === null || right === null) return false;\n\n var leftLength = left.length;\n var rightLength = right.length;\n\n if (!leftLength) return false;\n if (!rightLength) return true;\n\n var length = min(leftLength, rightLength);\n return compareUnsafe(left, 0, right, 0, length) > 0;\n }\n\n @operator(">=")\n private static __gte(left: String, right: String): bool {\n if (left === right) return true;\n if (left === null || right === null) return false;\n\n var leftLength = left.length;\n var rightLength = right.length;\n\n if (!leftLength) return !rightLength;\n if (!rightLength) return true;\n\n var length = min(leftLength, rightLength);\n return compareUnsafe(left, 0, right, 0, length) >= 0;\n }\n\n @operator("<")\n private static __lt(left: String, right: String): bool {\n if (left === right || left === null || right === null) return false;\n\n var leftLength = left.length;\n var rightLength = right.length;\n\n if (!rightLength) return false;\n if (!leftLength) return true;\n\n var length = min(leftLength, rightLength);\n return compareUnsafe(left, 0, right, 0, length) < 0;\n }\n\n @operator("<=")\n private static __lte(left: String, right: String): bool {\n if (left === right) return true;\n if (left === null || right === null) return false;\n\n var leftLength = left.length;\n var rightLength = right.length;\n\n if (!rightLength) return !leftLength;\n if (!leftLength) return true;\n\n var length = min(leftLength, rightLength);\n return compareUnsafe(left, 0, right, 0, length) <= 0;\n }\n\n @inline\n includes(searchString: String, position: i32 = 0): bool {\n return this.indexOf(searchString, position) != -1;\n }\n\n indexOf(searchString: String, fromIndex: i32 = 0): i32 {\n assert(this !== null);\n if (searchString === null) searchString = changetype("null");\n\n var searchLen: isize = searchString.length;\n if (!searchLen) return 0;\n var len: isize = this.length;\n if (!len) return -1;\n var start = min(max(fromIndex, 0), len);\n len -= searchLen;\n for (let k: isize = start; k <= len; ++k) {\n if (!compareUnsafe(this, k, searchString, 0, searchLen)) return k;\n }\n return -1;\n }\n\n lastIndexOf(searchString: String, fromIndex: i32 = i32.MAX_VALUE): i32 {\n assert(this !== null);\n if (searchString === null) searchString = changetype("null");\n\n var len: isize = this.length;\n var searchLen: isize = searchString.length;\n if (!searchLen) return len;\n if (!len) return -1;\n var start = min(max(fromIndex, 0), len - searchLen);\n for (let k = start; k >= 0; --k) {\n if (!compareUnsafe(this, k, searchString, 0, searchLen)) return k;\n }\n return -1;\n }\n\n startsWith(searchString: String, position: i32 = 0): bool {\n assert(this !== null);\n if (searchString === null) searchString = changetype("null");\n\n var pos: isize = position;\n var len: isize = this.length;\n var start = min(max(pos, 0), len);\n var searchLength: isize = searchString.length;\n if (searchLength + start > len) return false;\n return !compareUnsafe(this, start, searchString, 0, searchLength);\n }\n\n substr(start: i32, length: i32 = i32.MAX_VALUE): String {\n assert(this !== null);\n var intStart: isize = start;\n var end: isize = length;\n var size: isize = this.length;\n if (intStart < 0) intStart = max(size + intStart, 0);\n var resultLength = min(max(end, 0), size - intStart);\n if (resultLength <= 0) return changetype("");\n var out = allocateUnsafe(resultLength);\n copyUnsafe(out, 0, this, intStart, resultLength);\n return out;\n }\n\n substring(start: i32, end: i32 = i32.MAX_VALUE): String {\n assert(this !== null);\n var len = this.length;\n var finalStart = min(max(start, 0), len);\n var finalEnd = min(max(end, 0), len);\n var from = min(finalStart, finalEnd);\n var to = max(finalStart, finalEnd);\n len = to - from;\n if (!len) return changetype("");\n if (!from && to == this.length) return this;\n var out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, from, len);\n return out;\n }\n\n trim(): String {\n assert(this !== null);\n var length: usize = this.length;\n\n while (\n length &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (length << 1), HEADER_SIZE)\n )\n ) {\n --length;\n }\n var start: usize = 0;\n while (\n start < length &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (start << 1), HEADER_SIZE)\n )\n ) {\n ++start, --length;\n }\n if (!length) return changetype("");\n if (!start && length == this.length) return this;\n var out = allocateUnsafe(length);\n copyUnsafe(out, 0, this, start, length);\n return out;\n }\n\n @inline\n trimLeft(): String {\n return this.trimStart();\n }\n\n @inline\n trimRight(): String {\n return this.trimEnd();\n }\n\n trimStart(): String {\n assert(this !== null);\n var start: isize = 0;\n var len: isize = this.length;\n while (\n start < len &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (start << 1), HEADER_SIZE)\n )\n ) {\n ++start;\n }\n if (!start) return this;\n var outLen = len - start;\n if (!outLen) return changetype("");\n var out = allocateUnsafe(outLen);\n copyUnsafe(out, 0, this, start, outLen);\n return out;\n }\n\n trimEnd(): String {\n assert(this !== null);\n var len: isize = this.length;\n while (\n len > 0 &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (len << 1), HEADER_SIZE)\n )\n ) {\n --len;\n }\n if (len <= 0) return changetype("");\n if (len == this.length) return this;\n var out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, 0, len);\n return out;\n }\n\n padStart(targetLength: i32, padString: String = changetype(" ")): String {\n assert(this !== null);\n var length = this.length;\n var padLen = padString.length;\n if (targetLength < length || !padLen) return this;\n var len = targetLength - length;\n var out = allocateUnsafe(targetLength);\n if (len > padLen) {\n let count = (len - 1) / padLen;\n let base = count * padLen;\n let rest = len - base;\n repeatUnsafe(out, 0, padString, count);\n if (rest) copyUnsafe(out, base, padString, 0, rest);\n } else {\n copyUnsafe(out, 0, padString, 0, len);\n }\n if (length) copyUnsafe(out, len, this, 0, length);\n return out;\n }\n\n padEnd(targetLength: i32, padString: String = changetype(" ")): String {\n assert(this !== null);\n var length = this.length;\n var padLen = padString.length;\n if (targetLength < length || !padLen) return this;\n var len = targetLength - length;\n var out = allocateUnsafe(targetLength);\n if (length) copyUnsafe(out, 0, this, 0, length);\n if (len > padLen) {\n let count = (len - 1) / padLen;\n let base = count * padLen;\n let rest = len - base;\n repeatUnsafe(out, length, padString, count);\n if (rest) copyUnsafe(out, base + length, padString, 0, rest);\n } else {\n copyUnsafe(out, length, padString, 0, len);\n }\n return out;\n }\n\n repeat(count: i32 = 0): String {\n assert(this !== null);\n var length = this.length;\n\n // Most browsers can\'t handle strings 1 << 28 chars or longer\n if (count < 0 || length * count > (1 << 28)) {\n throw new RangeError("Invalid count value");\n }\n\n if (count == 0 || !length) return changetype("");\n if (count == 1) return this;\n\n var result = allocateUnsafe(length * count);\n repeatUnsafe(result, 0, this, count);\n return result;\n }\n\n slice(beginIndex: i32, endIndex: i32 = i32.MAX_VALUE): String {\n var length = this.length;\n var begin = (beginIndex < 0) ? max(beginIndex + length, 0) : min(beginIndex, length);\n var end = (endIndex < 0) ? max(endIndex + length, 0) : min(endIndex, length);\n var len = end - begin;\n if (len <= 0) return changetype("");\n var out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, begin, len);\n return out;\n }\n\n split(separator: String = null, limit: i32 = i32.MAX_VALUE): String[] {\n assert(this !== null);\n if (!limit) return new Array();\n if (separator === null) return [this];\n var length: isize = this.length;\n var sepLen: isize = separator.length;\n if (limit < 0) limit = i32.MAX_VALUE;\n if (!sepLen) {\n if (!length) return new Array();\n // split by chars\n length = min(length, limit);\n let result = new Array(length);\n let buffer = result.buffer_;\n for (let i: isize = 0; i < length; ++i) {\n let char = allocateUnsafe(1);\n store(\n changetype(char),\n load(\n changetype(this) + (i << 1),\n HEADER_SIZE\n ),\n HEADER_SIZE\n );\n STORE(buffer, i, char);\n }\n return result;\n } else if (!length) {\n let result = new Array(1);\n unchecked(result[0] = changetype(""));\n return result;\n }\n var result = new Array();\n var end = 0, start = 0, i = 0;\n while ((end = this.indexOf(separator, start)) != -1) {\n let len = end - start;\n if (len > 0) {\n let out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, start, len);\n result.push(out);\n } else {\n result.push(changetype(""));\n }\n if (++i == limit) return result;\n start = end + sepLen;\n }\n if (!start) {\n let result = new Array(1);\n unchecked(result[0] = this);\n return result;\n }\n var len = length - start;\n if (len > 0) {\n let out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, start, len);\n result.push(out);\n } else {\n result.push(changetype(""));\n }\n return result;\n }\n\n toString(): String {\n return this;\n }\n\n get lengthUTF8(): i32 {\n var len = 1; // null terminated\n var pos: usize = 0;\n var end = this.length;\n while (pos < end) {\n let c = load(changetype(this) + (pos << 1), HEADER_SIZE);\n if (c < 128) {\n len += 1; ++pos;\n } else if (c < 2048) {\n len += 2; ++pos;\n } else {\n if (\n (c & 0xFC00) == 0xD800 && pos + 1 < end &&\n (load(changetype(this) + ((pos + 1) << 1), HEADER_SIZE) & 0xFC00) == 0xDC00\n ) {\n len += 4; pos += 2;\n } else {\n len += 3; ++pos;\n }\n }\n }\n return len;\n }\n\n static fromUTF8(ptr: usize, len: usize): String {\n if (len < 1) return changetype("");\n var ptrPos = 0;\n var buf = memory.allocate(len << 1);\n var bufPos = 0;\n while (ptrPos < len) {\n let cp = load(ptr + ptrPos++);\n if (cp < 128) {\n store(buf + bufPos, cp);\n bufPos += 2;\n } else if (cp > 191 && cp < 224) {\n assert(ptrPos + 1 <= len);\n store(buf + bufPos, (cp & 31) << 6 | load(ptr + ptrPos++) & 63);\n bufPos += 2;\n } else if (cp > 239 && cp < 365) {\n assert(ptrPos + 3 <= len);\n cp = (\n (cp & 7) << 18 |\n (load(ptr + ptrPos++) & 63) << 12 |\n (load(ptr + ptrPos++) & 63) << 6 |\n load(ptr + ptrPos++) & 63\n ) - 0x10000;\n store(buf + bufPos, 0xD800 + (cp >> 10));\n bufPos += 2;\n store(buf + bufPos, 0xDC00 + (cp & 1023));\n bufPos += 2;\n } else {\n assert(ptrPos + 2 <= len);\n store(buf + bufPos,\n (cp & 15) << 12 |\n (load(ptr + ptrPos++) & 63) << 6 |\n load(ptr + ptrPos++) & 63\n );\n bufPos += 2;\n }\n }\n assert(ptrPos == len);\n var str = allocateUnsafe((bufPos >> 1));\n memory.copy(changetype(str) + HEADER_SIZE, buf, bufPos);\n memory.free(buf);\n return str;\n }\n\n toUTF8(): usize {\n var buf = memory.allocate(this.lengthUTF8);\n var pos: usize = 0;\n var end = this.length;\n var off: usize = 0;\n while (pos < end) {\n let c1 = load(changetype(this) + (pos << 1), HEADER_SIZE);\n if (c1 < 128) {\n store(buf + off, c1);\n ++off; ++pos;\n } else if (c1 < 2048) {\n let ptr = buf + off;\n store(ptr, c1 >> 6 | 192);\n store(ptr, c1 & 63 | 128, 1);\n off += 2; ++pos;\n } else {\n let ptr = buf + off;\n if ((c1 & 0xFC00) == 0xD800 && pos + 1 < end) {\n let c2 = load(changetype(this) + ((pos + 1) << 1), HEADER_SIZE);\n if ((c2 & 0xFC00) == 0xDC00) {\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\n store(ptr, c1 >> 18 | 240);\n store(ptr, c1 >> 12 & 63 | 128, 1);\n store(ptr, c1 >> 6 & 63 | 128, 2);\n store(ptr, c1 & 63 | 128, 3);\n off += 4; pos += 2;\n continue;\n }\n }\n store(ptr, c1 >> 12 | 224);\n store(ptr, c1 >> 6 & 63 | 128, 1);\n store(ptr, c1 & 63 | 128, 2);\n off += 3; ++pos;\n }\n }\n store(buf + off, 0);\n return buf;\n }\n}\n\nexport function parseInt(str: String, radix: i32 = 0): f64 {\n return parse(str, radix);\n}\n\nexport function parseI32(str: String, radix: i32 = 0): i32 {\n return parse(str, radix);\n}\n\nexport function parseI64(str: String, radix: i32 = 0): i64 {\n return parse(str, radix);\n}\n\n// FIXME: naive implementation\nexport function parseFloat(str: String): f64 {\n var len: i32 = str.length;\n if (!len) return NaN;\n\n var ptr = changetype(str) /* + HEAD -> offset */;\n var code = load(ptr, HEADER_SIZE);\n\n // determine sign\n var sign: f64;\n if (code == CharCode.MINUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = 1;\n } else {\n sign = 1;\n }\n\n // calculate value\n var num: f64 = 0;\n while (len--) {\n code = load(ptr, HEADER_SIZE);\n if (code == CharCode.DOT) {\n ptr += 2;\n let fac: f64 = 0.1; // precision :(\n while (len--) {\n code = load(ptr, HEADER_SIZE);\n if (code == CharCode.E || code == CharCode.e) {\n assert(false); // TODO\n }\n code -= CharCode._0;\n if (code > 9) break;\n num += code * fac;\n fac *= 0.1;\n ptr += 2;\n }\n break;\n }\n code -= CharCode._0;\n if (code >= 10) break;\n num = (num * 10) + code;\n ptr += 2;\n }\n return sign * num;\n}\n',symbol:'import { Map } from "./map";\n\nvar stringToId: Map;\nvar idToString: Map;\nvar nextId: usize = 12; // Symbol.unscopables + 1\n\n@unmanaged export class symbol {\n toString(): string {\n var id = changetype(this);\n var str = "";\n switch (id) {\n case 1: { str = "hasInstance"; break; }\n case 2: { str = "isConcatSpreadable"; break; }\n case 3: { str = "isRegExp"; break; }\n case 4: { str = "match"; break; }\n case 5: { str = "replace"; break; }\n case 6: { str = "search"; break; }\n case 7: { str = "species"; break; }\n case 8: { str = "split"; break; }\n case 9: { str = "toPrimitive"; break; }\n case 10: { str = "toStringTag"; break; }\n case 11: { str = "unscopables"; break; }\n default: {\n if (idToString !== null && idToString.has(id)) str = idToString.get(id);\n break;\n }\n }\n return "Symbol(" + str + ")";\n }\n}\n\ntype Symbol = symbol;\n\nexport function Symbol(description: string | null = null): symbol {\n var id = nextId++;\n if (!id) unreachable(); // out of ids\n return changetype(id);\n}\n\nexport namespace Symbol {\n\n // well-known symbols\n export const hasInstance = changetype(1);\n export const isConcatSpreadable = changetype(2);\n export const isRegExp = changetype(3);\n export const iterator = changetype(3);\n export const match = changetype(4);\n export const replace = changetype(5);\n export const search = changetype(6);\n export const species = changetype(7);\n export const split = changetype(8);\n export const toPrimitive = changetype(9);\n export const toStringTag = changetype(10);\n export const unscopables = changetype(11);\n\n /* tslint:disable */// not valid TS\n export function for(key: string): symbol {\n if (!stringToId) { stringToId = new Map(); idToString = new Map(); }\n else if (stringToId.has(key)) return changetype(stringToId.get(key));\n var id = nextId++;\n if (!id) unreachable(); // out of ids\n stringToId.set(key, id);\n idToString.set(id, key);\n return changetype(id);\n }\n /* tslint:enable */\n\n export function keyFor(sym: symbol): string | null {\n return idToString !== null && idToString.has(changetype(sym))\n ? idToString.get(changetype(sym))\n : null;\n }\n}\n',table:"export namespace table {\n\n // export function copy(dst: u32, src: u32, n: u32): void {\n // __table_copy(dst, src, n);\n // }\n\n // Passive elements\n\n // export function init(elementIndex: u32, srcOffset: u32, dstOffset: u32, n: u32): void {\n // __table_init(elementIndex, srcOffset, dstOffset, n);\n // }\n\n // export function drop(elementIndex: u32): void {\n // __table_drop(elementIndex);\n // }\n}\n",typedarray:"import {\n TypedArray,\n FILL,\n SORT,\n SUBARRAY,\n REDUCE,\n REDUCE_RIGHT,\n MAP,\n FIND_INDEX,\n SOME,\n EVERY,\n} from \"./internal/typedarray\";\n\nimport {\n COMPARATOR\n} from \"./internal/sort\";\n\nexport class Int8Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int8Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i8, b: i8) => i32 = COMPARATOR()): Int8Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int8Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i8, index: i32, array: Int8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i8, index: i32, array: Int8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i8, index: i32, self: Int8Array) => i8): Int8Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i8, index: i32, self: Int8Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i8, index: i32, self: Int8Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i8, index: i32, self: Int8Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint8Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u8, b: u8) => i32 = COMPARATOR()): Uint8Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint8Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u8, index: i32, array: Uint8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u8, index: i32, array: Uint8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u8, index: i32, self: Uint8Array) => u8): Uint8Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u8, index: i32, self: Uint8Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u8, index: i32, self: Uint8Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u8, index: i32, self: Uint8Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint8ClampedArray extends Uint8Array {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n @inline @operator(\"[]=\")\n protected __set(index: i32, value: i32): void {\n super.__set(index, max(min(value, 255), 0));\n }\n\n @inline @operator(\"{}=\")\n protected __unchecked_set(index: i32, value: i32): void {\n super.__unchecked_set(index, max(min(value, 255), 0));\n }\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8ClampedArray {\n return changetype(super.fill(value, start, end)); // safe because '.fill' reuses 'this'\n }\n\n sort(comparator: (a: u8, b: u8) => i32 = COMPARATOR()): Uint8ClampedArray {\n return changetype(super.sort(comparator)); // safe because '.sort' reuses 'this'\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint8ClampedArray {\n return SUBARRAY(this, begin, end);\n }\n\n map(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => u8): Uint8ClampedArray {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Int16Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int16Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i16, b: i16) => i32 = COMPARATOR()): Int16Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int16Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i16, index: i32, array: Int16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i16, index: i32, array: Int16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i16, index: i32, self: Int16Array) => i16): Int16Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i16, index: i32, self: Int16Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i16, index: i32, self: Int16Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i16, index: i32, self: Int16Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint16Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint16Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u16, b: u16) => i32 = COMPARATOR()): Uint16Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint16Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u16, index: i32, array: Uint16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u16, index: i32, array: Uint16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u16, index: i32, self: Uint16Array) => u16): Uint16Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u16, index: i32, self: Uint16Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u16, index: i32, self: Uint16Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u16, index: i32, self: Uint16Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Int32Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int32Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i32, b: i32) => i32 = COMPARATOR()): Int32Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int32Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i32, index: i32, array: Int32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i32, index: i32, array: Int32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i32, index: i32, self: Int32Array) => i32): Int32Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i32, index: i32, self: Int32Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i32, index: i32, self: Int32Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i32, index: i32, self: Int32Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint32Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint32Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u32, b: u32) => i32 = COMPARATOR()): Uint32Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint32Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u32, index: i32, array: Uint32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u32, index: i32, array: Uint32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u32, index: i32, self: Uint32Array) => u32): Uint32Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u32, index: i32, self: Uint32Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u32, index: i32, self: Uint32Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u32, index: i32, self: Uint32Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Int64Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int64Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i64, b: i64) => i32 = COMPARATOR()): Int64Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int64Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i64, index: i32, array: Int64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i64, index: i32, array: Int64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i64, index: i32, self: Int64Array) => i64): Int64Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i64, index: i32, self: Int64Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i64, index: i32, self: Int64Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i64, index: i32, self: Int64Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint64Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint64Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u64, b: u64) => i32 = COMPARATOR()): Uint64Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint64Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u64, index: i32, array: Uint64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u64, index: i32, array: Uint64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u64, index: i32, self: Uint64Array) => u64): Uint64Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u64, index: i32, self: Uint64Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u64, index: i32, self: Uint64Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u64, index: i32, self: Uint64Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Float32Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: f32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Float32Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: f32, b: f32) => i32 = COMPARATOR()): Float32Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Float32Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: f32, index: i32, array: Float32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: f32, index: i32, array: Float32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: f32, index: i32, self: Float32Array) => f32): Float32Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: f32, index: i32, self: Float32Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: f32, index: i32, self: Float32Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: f32, index: i32, self: Float32Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Float64Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: f64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Float64Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: f64, b: f64) => i32 = COMPARATOR()): Float64Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Float64Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: f64, index: i32, array: Float64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: f64, index: i32, array: Float64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: f64, index: i32, self: Float64Array) => f64): Float64Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: f64, index: i32, self: Float64Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: f64, index: i32, self: Float64Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: f64, index: i32, self: Float64Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n"}):(()=>{const e=path.join(".","..","std","assembly"),n=__webpack_require__(!function(){var e=new Error("Cannot find module 'glob'");throw e.code="MODULE_NOT_FOUND",e}()).sync("**/!(*.d).ts",{cwd:e}),t={};return n.forEach(n=>t[n.replace(/\.ts$/,"")]=fs.readFileSync(path.join(e,n),"utf8")),t})(),exports.definitionFiles=exports.isBundle?Object({assembly:"/**\n * Environment definitions for compiling AssemblyScript to WebAssembly using asc.\n * @module std/assembly\n *//***/\n\n/// \n\n// Types\n\n/** An 8-bit signed integer. */\ndeclare type i8 = number;\n/** A 16-bit signed integer. */\ndeclare type i16 = number;\n/** A 32-bit signed integer. */\ndeclare type i32 = number;\n/** A 64-bit signed integer. */\ndeclare type i64 = number;\n/** A 32-bit signed integer when targeting 32-bit WebAssembly or a 64-bit signed integer when targeting 64-bit WebAssembly. */\ndeclare type isize = number;\n/** An 8-bit unsigned integer. */\ndeclare type u8 = number;\n/** A 16-bit unsigned integer. */\ndeclare type u16 = number;\n/** A 32-bit unsigned integer. */\ndeclare type u32 = number;\n/** A 64-bit unsigned integer. */\ndeclare type u64 = number;\n/** A 32-bit unsigned integer when targeting 32-bit WebAssembly or a 64-bit unsigned integer when targeting 64-bit WebAssembly. */\ndeclare type usize = number;\n/** A 1-bit unsigned integer. */\ndeclare type bool = boolean | number;\n/** A 32-bit float. */\ndeclare type f32 = number;\n/** A 64-bit float. */\ndeclare type f64 = number;\n\n// Compiler hints\n\n/** Compiler target. 0 = JS, 1 = WASM32, 2 = WASM64. */\ndeclare const ASC_TARGET: i32;\n/** Provided noTreeshaking option. */\ndeclare const ASC_NO_TREESHAKING: bool;\n/** Provided noAssert option. */\ndeclare const ASC_NO_ASSERT: bool;\n/** Provided memoryBase option. */\ndeclare const ASC_MEMORY_BASE: i32;\n/** Provided optimizeLevel option. */\ndeclare const ASC_OPTIMIZE_LEVEL: i32;\n/** Provided shrinkLevel option. */\ndeclare const ASC_SHRINK_LEVEL: i32;\n/** Whether the mutable global feature is enabled. */\ndeclare const ASC_FEATURE_MUTABLE_GLOBAL: bool;\n/** Whether the sign extension feature is enabled. */\ndeclare const ASC_FEATURE_SIGN_EXTENSION: bool;\n\n// Builtins\n\n/** Performs the sign-agnostic count leading zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered leading if the value is zero. */\ndeclare function clz(value: T): T;\n/** Performs the sign-agnostic count tailing zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered trailing if the value is zero. */\ndeclare function ctz(value: T): T;\n/** Performs the sign-agnostic count number of one bits operation on a 32-bit or 64-bit integer. */\ndeclare function popcnt(value: T): T;\n/** Performs the sign-agnostic rotate left operation on a 32-bit or 64-bit integer. */\ndeclare function rotl(value: T, shift: T): T;\n/** Performs the sign-agnostic rotate right operation on a 32-bit or 64-bit integer. */\ndeclare function rotr(value: T, shift: T): T;\n/** Computes the absolute value of an integer or float. */\ndeclare function abs(value: T): T;\n/** Determines the maximum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function max(left: T, right: T): T;\n/** Determines the minimum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function min(left: T, right: T): T;\n/** Performs the ceiling operation on a 32-bit or 64-bit float. */\ndeclare function ceil(value: T): T;\n/** Composes a 32-bit or 64-bit float from the magnitude of `x` and the sign of `y`. */\ndeclare function copysign(x: T, y: T): T;\n/** Performs the floor operation on a 32-bit or 64-bit float. */\ndeclare function floor(value: T): T;\n/** Rounds to the nearest integer tied to even of a 32-bit or 64-bit float. */\ndeclare function nearest(value: T): T;\n/** Reinterprets the bits of the specified value as type `T`. Valid reinterpretations are u32/i32 to/from f32 and u64/i64 to/from f64. */\ndeclare function reinterpret(value: number): T;\n/** Selects one of two pre-evaluated values depending on the condition. */\ndeclare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n/** Calculates the square root of a 32-bit or 64-bit float. */\ndeclare function sqrt(value: T): T;\n/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */\ndeclare function trunc(value: T): T;\n/** Loads a value of the specified type from memory. Equivalent to dereferncing a pointer in other languages. */\ndeclare function load(ptr: usize, constantOffset?: usize): T;\n/** Stores a value of the specified type to memory. Equivalent to dereferencing a pointer in other languages when assigning a value. */\ndeclare function store(ptr: usize, value: any, constantOffset?: usize): void;\n/** Emits an unreachable operation that results in a runtime error when executed. Both a statement and an expression of any type. */\ndeclare function unreachable(): any; // sic\n\n/** NaN (not a number) as a 32-bit or 64-bit float depending on context. */\ndeclare const NaN: f32 | f64;\n/** Positive infinity as a 32-bit or 64-bit float depending on context. */\ndeclare const Infinity: f32 | f64;\n/** Heap base offset. */\ndeclare const HEAP_BASE: usize;\n/** Determines the byte size of the specified underlying core type. Compiles to a constant. */\ndeclare function sizeof(): usize;\n/** Determines the alignment (log2) of the specified underlying core type. Compiles to a constant. */\ndeclare function alignof(): usize;\n/** Determines the offset of the specified field within the given class type. Returns the class type's end offset if field name has been omitted. Compiles to a constant. */\ndeclare function offsetof(fieldName?: string): usize;\n/** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/\ndeclare function changetype(value: any): T;\n/** Explicitly requests no bounds checks on the provided expression. Useful for array accesses. */\ndeclare function unchecked(value: T): T;\n/** Emits a `call_indirect` instruction, calling the specified function in the function table by index with the specified arguments. Does result in a runtime error if the arguments do not match the called function. */\ndeclare function call_indirect(target: Function | u32, ...args: any[]): T;\n/** Instantiates a new instance of `T` using the specified constructor arguments. */\ndeclare function instantiate(...args: any[]): T;\n/** Tests if a 32-bit or 64-bit float is `NaN`. */\ndeclare function isNaN(value: T): bool;\n/** Tests if a 32-bit or 64-bit float is finite, that is not `NaN` or +/-`Infinity`. */\ndeclare function isFinite(value: T): bool;\n/** Tests if the specified type *or* expression is of an integer type and not a reference. Compiles to a constant. */\ndeclare function isInteger(value?: any): value is number;\n/** Tests if the specified type *or* expression is of a float type. Compiles to a constant. */\ndeclare function isFloat(value?: any): value is number;\n/** Tests if the specified type *or* expression can represent negative numbers. Compiles to a constant. */\ndeclare function isSigned(value?: any): value is number;\n/** Tests if the specified type *or* expression is of a reference type. Compiles to a constant. */\ndeclare function isReference(value?: any): value is object | string;\n/** Tests if the specified type *or* expression can be used as a string. Compiles to a constant. */\ndeclare function isString(value?: any): value is string | String;\n/** Tests if the specified type *or* expression can be used as an array. Compiles to a constant. */\ndeclare function isArray(value?: any): value is Array;\n/** Tests if the specified expression resolves to a defined element. Compiles to a constant. */\ndeclare function isDefined(expression: any): bool;\n/** Tests if the specified expression evaluates to a constant value. Compiles to a constant. */\ndeclare function isConstant(expression: any): bool;\n/** Tests if the specified type *or* expression is of a managed type. Compiles to a constant. */\ndeclare function isManaged(value?: any): bool;\n/** Traps if the specified value is not true-ish, otherwise returns the (non-nullable) value. */\ndeclare function assert(isTrueish: T, message?: string): T & object; // any better way to model `: T != null`?\n/** Parses an integer string to a 64-bit float. */\ndeclare function parseInt(str: string, radix?: i32): f64;\n/** Parses an integer string to a 32-bit integer. */\ndeclare function parseI32(str: string, radix?: i32): i32;\n/** Parses an integer string to a 64-bit integer. */\ndeclare function parseI64(str: string, radix?: i32): i64;\n/** Parses a string to a 64-bit float. */\ndeclare function parseFloat(str: string): f64;\n/** Returns the 64-bit floating-point remainder of `x/y`. */\ndeclare function fmod(x: f64, y: f64): f64;\n/** Returns the 32-bit floating-point remainder of `x/y`. */\ndeclare function fmodf(x: f32, y: f32): f32;\n\n/** Converts any other numeric value to an 8-bit signed integer. */\ndeclare function i8(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace i8 {\n /** Smallest representable value. */\n export const MIN_VALUE: i8;\n /** Largest representable value. */\n export const MAX_VALUE: i8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i8;\n}\n/** Converts any other numeric value to a 16-bit signed integer. */\ndeclare function i16(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace i16 {\n /** Smallest representable value. */\n export const MIN_VALUE: i16;\n /** Largest representable value. */\n export const MAX_VALUE: i16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i16;\n}\n/** Converts any other numeric value to a 32-bit signed integer. */\ndeclare function i32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i32;\ndeclare namespace i32 {\n /** Smallest representable value. */\n export const MIN_VALUE: i32;\n /** Largest representable value. */\n export const MAX_VALUE: i32;\n /** Loads an 8-bit signed integer from memory and returns it as a 32-bit integer. */\n export function load8_s(offset: usize, constantOffset?: usize): i32;\n /** Loads an 8-bit unsigned integer from memory and returns it as a 32-bit integer. */\n export function load8_u(offset: usize, constantOffset?: usize): i32;\n /** Loads a 16-bit signed integer from memory and returns it as a 32-bit integer. */\n export function load16_s(offset: usize, constantOffset?: usize): i32;\n /** Loads a 16-bit unsigned integer from memory and returns it as a 32-bit integer. */\n export function load16_u(offset: usize, constantOffset?: usize): i32;\n /** Loads a 32-bit integer from memory. */\n export function load(offset: usize, constantOffset?: usize): i32;\n /** Stores a 32-bit integer to memory as an 8-bit integer. */\n export function store8(offset: usize, value: i32, constantOffset?: usize): void;\n /** Stores a 32-bit integer to memory as a 16-bit integer. */\n export function store16(offset: usize, value: i32, constantOffset?: usize): void;\n /** Stores a 32-bit integer to memory. */\n export function store(offset: usize, value: i32, constantOffset?: usize): void;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i32;\n}\n/** Converts any other numeric value to a 64-bit signed integer. */\ndeclare function i64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i64;\ndeclare namespace i64 {\n /** Smallest representable value. */\n export const MIN_VALUE: i64;\n /** Largest representable value. */\n export const MAX_VALUE: i64;\n /** Loads an 8-bit signed integer from memory and returns it as a 64-bit signed integer. */\n export function load8_s(offset: usize, constantOffset?: usize): i64;\n /** Loads an 8-bit unsigned integer from memory and returns it as a 64-bit unsigned integer. */\n export function load8_u(offset: usize, constantOffset?: usize): u64;\n /** Loads a 16-bit signed integer from memory and returns it as a 64-bit signed integer. */\n export function load16_s(offset: usize, constantOffset?: usize): i64;\n /** Loads a 16-bit unsigned integer from memory and returns it as a 64-bit unsigned integer. */\n export function load16_u(offset: usize, constantOffset?: usize): u64;\n /** Loads a 32-bit signed integer from memory and returns it as a 64-bit signed integer. */\n export function load32_s(offset: usize, constantOffset?: usize): i64;\n /** Loads a 32-bit unsigned integer from memory and returns it as a 64-bit unsigned integer. */\n export function load32_u(offset: usize, constantOffset?: usize): u64;\n /** Loads a 64-bit unsigned integer from memory. */\n export function load(offset: usize, constantOffset?: usize): i64;\n /** Stores a 64-bit integer to memory as an 8-bit integer. */\n export function store8(offset: usize, value: i64, constantOffset?: usize): void;\n /** Stores a 64-bit integer to memory as a 16-bit integer. */\n export function store16(offset: usize, value: i64, constantOffset?: usize): void;\n /** Stores a 64-bit integer to memory as a 32-bit integer. */\n export function store32(offset: usize, value: i64, constantOffset?: usize): void;\n /** Stores a 64-bit integer to memory. */\n export function store(offset: usize, value: i64, constantOffset?: usize): void;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i64;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) signed integer. */\ndeclare var isize: typeof i32 | typeof i64;\n/** Converts any other numeric value to an 8-bit unsigned integer. */\ndeclare function u8(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace u8 {\n /** Smallest representable value. */\n export const MIN_VALUE: u8;\n /** Largest representable value. */\n export const MAX_VALUE: u8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u8;\n}\n/** Converts any other numeric value to a 16-bit unsigned integer. */\ndeclare function u16(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace u16 {\n /** Smallest representable value. */\n export const MIN_VALUE: u16;\n /** Largest representable value. */\n export const MAX_VALUE: u16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u16;\n}\n/** Converts any other numeric value to a 32-bit unsigned integer. */\ndeclare function u32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i32;\ndeclare namespace u32 {\n /** Smallest representable value. */\n export const MIN_VALUE: u32;\n /** Largest representable value. */\n export const MAX_VALUE: u32;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u64;\n}\n/** Converts any other numeric value to a 64-bit unsigned integer. */\ndeclare function u64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i64;\ndeclare namespace u64 {\n /** Smallest representable value. */\n export const MIN_VALUE: u64;\n /** Largest representable value. */\n export const MAX_VALUE: u64;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): u64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u64;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) unsigned integer. */\ndeclare var usize: typeof u32 | typeof u64;\n/** Converts any other numeric value to a 1-bit unsigned integer. */\ndeclare function bool(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): bool;\ndeclare namespace bool {\n /** Smallest representable value. */\n export const MIN_VALUE: bool;\n /** Largest representable value. */\n export const MAX_VALUE: bool;\n}\n/** Converts any other numeric value to a 32-bit float. */\ndeclare function f32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): f32;\ndeclare namespace f32 {\n /** Smallest representable value. */\n export const MIN_VALUE: f32;\n /** Largest representable value. */\n export const MAX_VALUE: f32;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f32;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f32;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f32;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f32;\n /** Returns the floating-point remainder of `x / y` (rounded towards zero). */\n export function mod(x: f32, y: f32): f32;\n /** Returns the floating-point remainder of `x / y` (rounded to nearest). */\n export function rem(x: f32, y: f32): f32;\n /** Loads a 32-bit float from memory. */\n export function load(offset: usize, constantOffset?: usize): f32;\n /** Stores a 32-bit float to memory. */\n export function store(offset: usize, value: f32, constantOffset?: usize): void;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n export function isNaN(value: f32): bool;\n /** Returns true if passed value is finite. */\n export function isFinite(value: f32): bool;\n /** Returns true if the value passed is a safe integer. */\n export function isSafeInteger(value: f32): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n export function isInteger(value: f32): bool;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): f32;\n /** Converts a string to an integer. */\n export function parseInt(string: string, radix?: i32): f32;\n}\n/** Converts any other numeric value to a 64-bit float. */\ndeclare function f64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): f64;\ndeclare namespace f64 {\n /** Smallest representable value. */\n export const MIN_VALUE: f64;\n /** Largest representable value. */\n export const MAX_VALUE: f64;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f64;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f64;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f64;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f64;\n /** Loads a 64-bit float from memory. */\n export function load(offset: usize, constantOffset?: usize): f64;\n /** Stores a 64-bit float to memory. */\n export function store(offset: usize, value: f64, constantOffset?: usize): void;\n}\n/** Macro type evaluating to the underlying native WebAssembly type. */\ndeclare type NATIVE = T;\n\n/** Pseudo-class representing the backing class of integer types. */\ndeclare class _Integer {\n /** Smallest representable value. */\n static readonly MIN_VALUE: number;\n /** Largest representable value. */\n static readonly MAX_VALUE: number;\n /** Converts a string to an integer of this type. */\n static parseInt(value: string, radix?: number): number;\n /** Converts this integer to a string. */\n toString(): string;\n}\n\n/** Pseudo-class representing the backing class of floating-point types. */\ndeclare class _Float {\n /** Difference between 1 and the smallest representable value greater than 1. */\n static readonly EPSILON: f32 | f64;\n /** Smallest representable value. */\n static readonly MIN_VALUE: f32 | f64;\n /** Largest representable value. */\n static readonly MAX_VALUE: f32 | f64;\n /** Smallest safely representable integer value. */\n static readonly MIN_SAFE_INTEGER: f32 | f64;\n /** Largest safely representable integer value. */\n static readonly MAX_SAFE_INTEGER: f32 | f64;\n /** Value representing positive infinity. */\n static readonly POSITIVE_INFINITY: f32 | f64;\n /** Value representing negative infinity. */\n static readonly NEGATIVE_INFINITY: f32 | f64;\n /** Value representing 'not a number'. */\n static readonly NaN: f32 | f64;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n static isNaN(value: f32 | f64): bool;\n /** Returns true if passed value is finite. */\n static isFinite(value: f32 | f64): bool;\n /** Returns true if the value passed is a safe integer. */\n static isSafeInteger(value: f32 | f64): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n static isInteger(value: f32 | f64): bool;\n /** Converts A string to an integer. */\n static parseInt(value: string, radix?: i32): f32 | f64;\n /** Converts a string to a floating-point number. */\n static parseFloat(value: string): f32 | f64;\n /** Converts this floating-point number to a string. */\n toString(this: f64): string;\n}\n\n/** Backing class of signed 8-bit integers. */\ndeclare const I8: typeof _Integer;\n/** Backing class of signed 16-bit integers. */\ndeclare const I16: typeof _Integer;\n/** Backing class of signed 32-bit integers. */\ndeclare const I32: typeof _Integer;\n/** Backing class of signed 64-bit integers. */\ndeclare const I64: typeof _Integer;\n/** Backing class of signed size integers. */\ndeclare const Isize: typeof _Integer;\n/** Backing class of unsigned 8-bit integers. */\ndeclare const U8: typeof _Integer;\n/** Backing class of unsigned 16-bit integers. */\ndeclare const U16: typeof _Integer;\n/** Backing class of unsigned 32-bit integers. */\ndeclare const U32: typeof _Integer;\n/** Backing class of unsigned 64-bit integers. */\ndeclare const U64: typeof _Integer;\n/** Backing class of unsigned size integers. */\ndeclare const Usize: typeof _Integer;\n/** Backing class of 32-bit floating-point values. */\ndeclare const F32: typeof _Float;\n/** Backing class of 64-bit floating-point values. */\ndeclare const F64: typeof _Float;\n\n// User-defined diagnostic macros\n\n/** Emits a user-defined diagnostic error when encountered. */\ndeclare function ERROR(message?: any): void;\n/** Emits a user-defined diagnostic warning when encountered. */\ndeclare function WARNING(message?: any): void;\n/** Emits a user-defined diagnostic info when encountered. */\ndeclare function INFO(message?: any): void;\n\n// Polyfills\n\n/** Performs the sign-agnostic reverse bytes **/\ndeclare function bswap(value: T): T;\n/** Performs the sign-agnostic reverse bytes only for last 16-bit **/\ndeclare function bswap16(value: T): T;\n\n// Standard library\n\n/** Memory operations. */\ndeclare namespace memory {\n /** Returns the current memory size in units of pages. One page is 64kb. */\n export function size(): i32;\n /** Grows linear memory by a given unsigned delta of pages. One page is 64kb. Returns the previous memory size in units of pages or `-1` on failure. */\n export function grow(value: i32): i32;\n /** Sets n bytes beginning at the specified destination in memory to the specified byte value. */\n export function fill(dst: usize, value: u8, count: usize): void;\n /** Copies n bytes from the specified source to the specified destination in memory. These regions may overlap. */\n export function copy(dst: usize, src: usize, n: usize): void;\n /** Copies elements from a passive element segment to a table. */\n // export function init(segmentIndex: u32, srcOffset: usize, dstOffset: usize, n: usize): void;\n /** Prevents further use of a passive element segment. */\n // export function drop(segmentIndex: u32): void;\n /** Copies elements from one region of a table to another region. */\n export function allocate(size: usize): usize;\n /** Disposes a chunk of memory by its pointer. */\n export function free(ptr: usize): void;\n /** Compares two chunks of memory. Returns `0` if equal, otherwise the difference of the first differing bytes. */\n export function compare(vl: usize, vr: usize, n: usize): i32;\n /** Resets the allocator to its initial state, if supported. */\n export function reset(): void;\n}\n\n/** Garbage collector operations. */\ndeclare namespace gc {\n /** Allocates a managed object identified by its visitor function. */\n export function allocate(size: usize, visitFn: (ref: usize) => void): usize;\n /** Performs a full garbage collection cycle. */\n export function collect(): void;\n}\n\n/** Table operations. */\ndeclare namespace table {\n /** Copies elements from a passive element segment to a table. */\n // export function init(elementIndex: u32, srcOffset: u32, dstOffset: u32, n: u32): void;\n /** Prevents further use of a passive element segment. */\n // export function drop(elementIndex: u32): void;\n /** Copies elements from one region of a table to another region. */\n // export function copy(dest: u32, src: u32, n: u32): void;\n}\n\n/** Class representing a generic, fixed-length raw binary data buffer. */\ndeclare class ArrayBuffer {\n /** The size, in bytes, of the array. */\n readonly byteLength: i32;\n /** Unsafe pointer to the start of the data in memory. */\n readonly data: usize;\n /** Constructs a new array buffer of the given length in bytes. */\n constructor(length: i32, unsafe?: bool);\n /** Returns a copy of this array buffer's bytes from begin, inclusive, up to end, exclusive. */\n slice(begin?: i32, end?: i32): ArrayBuffer;\n}\n\n/** The `DataView` view provides a low-level interface for reading and writing multiple number types in a binary `ArrayBuffer`, without having to care about the platform's endianness. */\ndeclare class DataView {\n /** The `buffer` accessor property represents the `ArrayBuffer` or `SharedArrayBuffer` referenced by the `DataView` at construction time. */\n readonly buffer: ArrayBuffer;\n /** The `byteLength` accessor property represents the length (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteLength: i32;\n /** The `byteOffset` accessor property represents the offset (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteOffset: i32;\n /** Constructs a new `DataView` with the given properties */\n constructor(buffer: ArrayBuffer, byteOffset?: i32, byteLength?: i32);\n /** The `getFloat32()` method gets a signed 32-bit float (float) at the specified byte offset from the start of the `DataView`. */\n getFloat32(byteOffset: i32, littleEndian?: boolean): f32;\n /** The `getFloat64()` method gets a signed 64-bit float (double) at the specified byte offset from the start of the `DataView`. */\n getFloat64(byteOffset: i32, littleEndian?: boolean): f64;\n /** The `getInt8()` method gets a signed 8-bit integer (byte) at the specified byte offset from the start of the `DataView`. */\n getInt8(byteOffset: i32): i8;\n /** The `getInt16()` method gets a signed 16-bit integer (short) at the specified byte offset from the start of the `DataView`. */\n getInt16(byteOffset: i32, littleEndian?: boolean): i16;\n /** The `getInt32()` method gets a signed 32-bit integer (long) at the specified byte offset from the start of the `DataView`. */\n getInt32(byteOffset: i32, littleEndian?: boolean): i32;\n /** The `getInt64()` method gets a signed 64-bit integer (long long) at the specified byte offset from the start of the `DataView`. */\n getInt64(byteOffset: i32, littleEndian?: boolean): i64;\n /** The `getUint8()` method gets an unsigned 8-bit integer (unsigned byte) at the specified byte offset from the start of the `DataView`. */\n getUint8(byteOffset: i32): u8;\n /** The `getUint16()` method gets an unsigned 16-bit integer (unsigned short) at the specified byte offset from the start of the `DataView`. */\n getUint16(byteOffset: i32, littleEndian?: boolean): u16;\n /** The `getUint32()` method gets an unsigned 32-bit integer (unsigned long) at the specified byte offset from the start of the `DataView`. */\n getUint32(byteOffset: i32, littleEndian?: boolean): u32;\n /** The `getUint64()` method gets an unsigned 64-bit integer (unsigned long long) at the specified byte offset from the start of the `DataView`. */\n getUint64(byteOffset: i32, littleEndian?: boolean): u64;\n /** The `setFloat32()` method stores a signed 32-bit float (float) value at the specified byte offset from the start of the `DataView`. */\n setFloat32(byteOffset: i32, value: f32, littleEndian?: boolean): void;\n /** The `setFloat64()` method stores a signed 64-bit float (double) value at the specified byte offset from the start of the `DataView`. */\n setFloat64(byteOffset: i32, value: f64, littleEndian?: boolean): void;\n /** The `setInt8()` method stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setInt8(byteOffset: i32, value: i8): void;\n /** The `setInt16()` method stores a signed 16-bit integer (short) value at the specified byte offset from the start of the `DataView`. */\n setInt16(byteOffset: i32, value: i16, littleEndian?: boolean): void;\n /** The `setInt32()` method stores a signed 32-bit integer (long) value at the specified byte offset from the start of the `DataView`. */\n setInt32(byteOffset: i32, value: i32, littleEndian?: boolean): void;\n /** The `setInt64()` method stores a signed 64-bit integer (long long) value at the specified byte offset from the start of the `DataView`. */\n setInt64(byteOffset: i32, value: i64, littleEndian?: boolean): void;\n /** The `setUint8()` method stores an unsigned 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setUint8(byteOffset: i32, value: u8): void;\n /** The `setUint16()` method stores an unsigned 16-bit integer (unsigned short) value at the specified byte offset from the start of the `DataView`. */\n setUint16(byteOffset: i32, value: u16, littleEndian?: boolean): void;\n /** The `setUint32()` method stores an unsigned 32-bit integer (unsigned long) value at the specified byte offset from the start of the `DataView`. */\n setUint32(byteOffset: i32, value: u32, littleEndian?: boolean): void;\n /** The `setUint64()` method stores an unsigned 64-bit integer (unsigned long long) value at the specified byte offset from the start of the `DataView`. */\n setUint64(byteOffset: i32, value: u64, littleEndian?: boolean): void;\n /** Returns a string representation of DataView. */\n toString(): string;\n}\n\n/** Interface for a typed view on an array buffer. */\ninterface ArrayBufferView {\n [key: number]: T;\n /** The {@link ArrayBuffer} referenced by this view. */\n readonly buffer: ArrayBuffer;\n /** The offset in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteOffset: i32;\n /** The length in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteLength: i32;\n}\n\n/* @internal */\ndeclare abstract class TypedArray implements ArrayBufferView {\n [key: number]: T;\n /** Number of bytes per element. */\n static readonly BYTES_PER_ELEMENT: usize;\n /** Constructs a new typed array. */\n constructor(length: i32);\n /** The {@link ArrayBuffer} referenced by this view. */\n readonly buffer: ArrayBuffer;\n /** The offset in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteOffset: i32;\n /** The length in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteLength: i32;\n /** The length (in elements). */\n readonly length: i32;\n /** Returns a new TypedArray of this type on the same ArrayBuffer from begin inclusive to end exclusive. */\n subarray(begin?: i32, end?: i32): this;\n /** The reduce() method applies a function against an accumulator and each value of the typed array (from left-to-right) has to reduce it to a single value. This method has the same algorithm as Array.prototype.reduce(). */\n reduce(\n callbackfn: (accumulator: W, value: T, index: i32, self: this) => W,\n initialValue: W,\n ): W;\n /** The reduceRight() method applies a function against an accumulator and each value of the typed array (from left-to-right) has to reduce it to a single value, starting from the end of the array. This method has the same algorithm as Array.prototype.reduceRight(). */\n reduceRight(\n callbackfn: (accumulator: W, value: T, index: i32, self: this) => W,\n initialValue: W,\n ): W;\n /** The some() method tests whether some element in the typed array passes the test implemented by the provided function. This method has the same algorithm as Array.prototype.some().*/\n some(callbackfn: (value: T, index: i32, self: this) => bool): bool;\n /** The map() method creates a new typed array with the results of calling a provided function on every element in this typed array. This method has the same algorithm as Array.prototype.map().*/\n map(callbackfn: (value: T, index: i32, self: this) => T): this;\n /** The sort() method sorts the elements of a typed array numerically in place and returns the typed array. This method has the same algorithm as Array.prototype.sort(), except that sorts the values numerically instead of as strings. TypedArray is one of the typed array types here. */\n sort(callback?: (a: T, b: T) => i32): this;\n /** The fill() method fills all the elements of a typed array from a start index to an end index with a static value. This method has the same algorithm as Array.prototype.fill(). */\n fill(value: T, start?: i32, end?: i32): this;\n /** The findIndex() method returns an index in the typed array, if an element in the typed array satisfies the provided testing function. Otherwise -1 is returned. See also the find() [not implemented] method, which returns the value of a found element in the typed array instead of its index. */\n findIndex(callbackfn: (value: T, index: i32, self: this) => bool): i32;\n /** The every() method tests whether all elements in the typed array pass the test implemented by the provided function. This method has the same algorithm as Array.prototype.every(). */\n every(callbackfn: (value: T, index: i32, self: this) => bool): i32;\n}\n\n/** An array of twos-complement 8-bit signed integers. */\ndeclare class Int8Array extends TypedArray {}\n/** An array of 8-bit unsigned integers. */\ndeclare class Uint8Array extends TypedArray {}\n/** A clamped array of 8-bit unsigned integers. */\ndeclare class Uint8ClampedArray extends TypedArray {}\n/** An array of twos-complement 16-bit signed integers. */\ndeclare class Int16Array extends TypedArray {}\n/** An array of 16-bit unsigned integers. */\ndeclare class Uint16Array extends TypedArray {}\n/** An array of twos-complement 32-bit signed integers. */\ndeclare class Int32Array extends TypedArray {}\n/** An array of 32-bit unsigned integers. */\ndeclare class Uint32Array extends TypedArray {}\n/** An array of twos-complement 64-bit signed integers. */\ndeclare class Int64Array extends TypedArray {}\n/** An array of 64-bit unsigned integers. */\ndeclare class Uint64Array extends TypedArray {}\n/** An array of 32-bit floating point numbers. */\ndeclare class Float32Array extends TypedArray {}\n/** An array of 64-bit floating point numbers. */\ndeclare class Float64Array extends TypedArray {}\n\n/** Class representing a sequence of values of type `T`. */\ndeclare class Array {\n\n static isArray(value: any): value is Array;\n\n [key: number]: T;\n /** Current length of the array. */\n length: i32;\n /** Constructs a new array. */\n constructor(capacity?: i32);\n\n fill(value: T, start?: i32, end?: i32): this;\n every(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n findIndex(predicate: (element: T, index: i32, array?: Array) => bool): i32;\n includes(searchElement: T, fromIndex?: i32): bool;\n indexOf(searchElement: T, fromIndex?: i32): i32;\n lastIndexOf(searchElement: T, fromIndex?: i32): i32;\n push(element: T): i32;\n concat(items: T[]): T[];\n copyWithin(target: i32, start: i32, end?: i32): this;\n pop(): T;\n forEach(callbackfn: (value: T, index: i32, array: Array) => void): void;\n map(callbackfn: (value: T, index: i32, array: Array) => U): Array;\n filter(callbackfn: (value: T, index: i32, array: Array) => bool): Array;\n reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n reduceRight(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n shift(): T;\n some(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n unshift(element: T): i32;\n slice(from: i32, to?: i32): Array;\n splice(start: i32, deleteCount?: i32): Array;\n sort(comparator?: (a: T, b: T) => i32): this;\n join(separator?: string): string;\n reverse(): T[];\n toString(): string;\n}\n\n/** Class representing a sequence of characters. */\ndeclare class String {\n\n static fromCharCode(ls: i32, hs?: i32): string;\n static fromCharCodes(arr: u16[]): string;\n static fromCodePoint(code: i32): string;\n static fromCodePoints(arr: i32[]): string;\n\n readonly length: i32;\n readonly lengthUTF8: i32;\n\n charAt(index: u32): string;\n charCodeAt(index: u32): u16;\n concat(other: string): string;\n endsWith(other: string): bool;\n indexOf(other: string, fromIndex?: i32): u32;\n lastIndexOf(other: string, fromIndex?: i32): i32;\n includes(other: string): bool;\n startsWith(other: string): bool;\n substr(start: u32, length?: u32): string;\n substring(start: u32, end?: u32): string;\n trim(): string;\n trimLeft(): string;\n trimRight(): string;\n trimStart(): string;\n trimEnd(): string;\n padStart(targetLength: i32, padString?: string): string;\n padEnd(targetLength: i32, padString?: string): string;\n repeat(count?: i32): string;\n slice(beginIndex: i32, endIndex?: i32): string;\n split(separator?: string, limit?: i32): string[];\n toString(): string;\n static fromUTF8(ptr: usize, len: usize): string;\n toUTF8(): usize;\n}\n\n/** Class for representing a runtime error. Base class of all errors. */\ndeclare class Error {\n\n /** Error name. */\n name: string;\n\n /** Message provided on construction. */\n message: string;\n\n /** Stack trace. */\n stack?: string;\n\n /** Constructs a new error, optionally with a message. */\n constructor(message?: string);\n\n /** Method returns a string representing the specified Error class. */\n toString(): string;\n}\n\n/** Class for indicating an error when a value is not in the set or range of allowed values. */\ndeclare class RangeError extends Error { }\n\n/** Class for indicating an error when a value is not of the expected type. */\ndeclare class TypeError extends Error { }\n\n/** Class for indicating an error when trying to interpret syntactically invalid code. */\ndeclare class SyntaxError extends Error { }\n\ninterface Boolean {}\ninterface Function {}\ninterface IArguments {}\ninterface Number {}\ninterface Object {}\ninterface RegExp {}\n\ndeclare class Map {\n readonly size: i32;\n has(key: K): bool;\n set(key: K, value: V): void;\n get(key: K): V;\n delete(key: K): bool;\n clear(): void;\n toString(): string;\n}\n\ndeclare class Set {\n readonly size: i32;\n has(value: T): bool;\n add(value: T): void;\n delete(value: T): bool;\n clear(): void;\n toString(): string;\n}\n\ninterface SymbolConstructor {\n readonly hasInstance: symbol;\n readonly isConcatSpreadable: symbol;\n readonly isRegExp: symbol;\n readonly iterator: symbol;\n readonly match: symbol;\n readonly replace: symbol;\n readonly search: symbol;\n readonly species: symbol;\n readonly split: symbol;\n readonly toPrimitive: symbol;\n readonly toStringTag: symbol;\n readonly unscopables: symbol;\n (description?: string | null): symbol;\n for(key: string): symbol;\n keyFor(sym: symbol): string | null;\n}\n\ndeclare const Symbol: SymbolConstructor;\n\ninterface IMath {\n /** The base of natural logarithms, e, approximately 2.718. */\n readonly E: T;\n /** The natural logarithm of 2, approximately 0.693. */\n readonly LN2: T;\n /** The natural logarithm of 10, approximately 2.302. */\n readonly LN10: T;\n /** The base 2 logarithm of e, approximately 1.442. */\n readonly LOG2E: T;\n /** The base 10 logarithm of e, approximately 0.434. */\n readonly LOG10E: T;\n /** The ratio of the circumference of a circle to its diameter, approximately 3.14159. */\n readonly PI: T;\n /** The square root of 1/2, approximately 0.707. */\n readonly SQRT1_2: T;\n /** The square root of 2, approximately 1.414. */\n readonly SQRT2: T;\n /** Returns the absolute value of `x`. */\n abs(x: T): T;\n /** Returns the arccosine (in radians) of `x`. */\n acos(x: T): T;\n /** Returns the hyperbolic arc-cosine of `x`. */\n acosh(x: T): T;\n /** Returns the arcsine (in radians) of `x` */\n asin(x: T): T;\n /** Returns the hyperbolic arcsine of `x`. */\n asinh(x: T): T;\n /** Returns the arctangent (in radians) of `x`. */\n atan(x: T): T;\n /** Returns the arctangent of the quotient of its arguments. */\n atan2(y: T, x: T): T;\n /** Returns the hyperbolic arctangent of `x`. */\n atanh(x: T): T;\n /** Returns the cube root of `x`. */\n cbrt(x: T): T;\n /** Returns the smallest integer greater than or equal to `x`. */\n ceil(x: T): T;\n /** Returns the number of leading zero bits in the 32-bit binary representation of `x`. */\n clz32(x: T): T;\n /** Returns the cosine (in radians) of `x`. */\n cos(x: T): T;\n /** Returns the hyperbolic cosine of `x`. */\n cosh(x: T): T;\n /** Returns e to the power of `x`. */\n exp(x: T): T;\n /** Returns e to the power of `x`, minus 1. */\n expm1(x: T): T;\n /** Returns the largest integer less than or equal to `x`. */\n floor(x: T): T;\n /** Returns the nearest 32-bit single precision float representation of `x`. */\n fround(x: T): f32;\n /** Returns the square root of the sum of squares of its arguments. */\n hypot(value1: T, value2: T): T; // TODO: rest\n /** Returns the result of the C-like 32-bit multiplication of `a` and `b`. */\n imul(a: T, b: T): T;\n /** Returns the natural logarithm (base e) of `x`. */\n log(x: T): T;\n /** Returns the base 10 logarithm of `x`. */\n log10(x: T): T;\n /** Returns the natural logarithm (base e) of 1 + `x`. */\n log1p(x: T): T;\n /** Returns the base 2 logarithm of `x`. */\n log2(x: T): T;\n /** Returns the largest-valued number of its arguments. */\n max(value1: T, value2: T): T; // TODO: rest\n /** Returns the lowest-valued number of its arguments. */\n min(value1: T, value2: T): T; // TODO: rest\n /** Returns `base` to the power of `exponent`. */\n pow(base: T, exponent: T): T;\n /** Returns a pseudo-random number in the range from 0.0 inclusive up to but not including 1.0. */\n random(): T;\n /** Returns the value of `x` rounded to the nearest integer. */\n round(x: T): T;\n /** Returns the sign of `x`, indicating whether the number is positive, negative or zero. */\n sign(x: T): T;\n /** Returns whether the sign bit of `x` is set */\n signbit(x: T): bool;\n /** Returns the sine of `x`. */\n sin(x: T): T;\n /** Returns the hyperbolic sine of `x`. */\n sinh(x: T): T;\n /** Returns the square root of `x`. */\n sqrt(x: T): T;\n /** Returns the tangent of `x`. */\n tan(x: T): T;\n /** Returns the hyperbolic tangent of `x`. */\n tanh(x: T): T;\n /** Returns the integer part of `x` by removing any fractional digits. */\n trunc(x: T): T;\n}\n\ninterface INativeMath extends IMath {\n /** Seeds the random number generator. */\n seedRandom(value: i64): void;\n /** Returns the floating-point remainder of `x / y` (rounded towards zero). */\n mod(x: T, y: T): T;\n /** Returns the floating-point remainder of `x / y` (rounded to nearest). */\n rem(x: T, y: T): T;\n}\n\n/** Double precision math imported from JavaScript. */\ndeclare const JSMath: IMath;\n/** Double precision math implemented natively. */\ndeclare const NativeMath: INativeMath;\n/** Single precision math implemented natively. */\ndeclare const NativeMathf: INativeMath;\n/** Alias of {@link NativeMath} or {@link JSMath} respectively. Defaults to `NativeMath`. */\ndeclare const Math: IMath;\n/** Alias of {@link NativeMathf} or {@link JSMath} respectively. Defaults to `NativeMathf`. */\ndeclare const Mathf: IMath;\n\ndeclare class Date {\n /** Returns the UTC timestamp in milliseconds of the specified date. */\n static UTC(\n year: i32,\n month: i32,\n day: i32,\n hour: i32,\n minute: i32,\n second: i32,\n millisecond: i32\n ): i64;\n /** Returns the current UTC timestamp in milliseconds. */\n static now(): i64;\n /** Constructs a new date object from an UTC timestamp in milliseconds. */\n constructor(value: i64);\n /** Returns the UTC timestamp of this date in milliseconds. */\n getTime(): i64;\n /** Sets the UTC timestamp of this date in milliseconds. */\n setTime(value: i64): i64;\n}\n\n/** Environmental tracing function for debugging purposes. */\ndeclare function trace(msg: string, n?: i32, a0?: f64, a1?: f64, a2?: f64, a3?: f64, a4?: f64): void;\n\n// Decorators\n\ninterface TypedPropertyDescriptor {\n configurable?: boolean;\n enumerable?: boolean;\n writable?: boolean;\n value?: T;\n get?(): T;\n set?(value: T): void;\n}\n\n/** Annotates an element as a program global. */\ndeclare function global(\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n): TypedPropertyDescriptor | void;\n\n/** Annotates a method as a binary operator overload for the specified `token`. */\ndeclare function operator(token: string): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n) => TypedPropertyDescriptor | void;\n\ndeclare namespace operator {\n /** Annotates a method as a binary operator overload for the specified `token`. */\n export function binary(token: string): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n ) => TypedPropertyDescriptor | void;\n /** Annotates a method as an unary prefix operator overload for the specified `token`. */\n export function prefix(token: string): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n ) => TypedPropertyDescriptor | void;\n /** Annotates a method as an unary postfix operator overload for the specified `token`. */\n export function postfix(token: string): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n ) => TypedPropertyDescriptor | void;\n}\n\n/** Annotates a class as being unmanaged with limited capabilities. */\ndeclare function unmanaged(constructor: Function): void;\n\n/** Annotates a class as being sealed / non-derivable. */\ndeclare function sealed(constructor: Function): void;\n\n/** Annotates a method or function as always inlined. */\ndeclare function inline(\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n): TypedPropertyDescriptor | void;\n\n/** Annotates an explicit external name of a function or global. */\ndeclare function external(namespace: string, name: string): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n) => TypedPropertyDescriptor | void;\n",portable:"/**\n * Environment definitions for compiling AssemblyScript to JavaScript using tsc.\n *\n * Note that semantic differences require additional explicit conversions for full compatibility.\n * For example, when casting an i32 to an u8, doing `(someI32 & 0xff)` will yield the same\n * result when compiling to WebAssembly or JS while `someI32` alone does nothing in JS.\n *\n * Note that i64's are not portable (JS numbers are IEEE754 doubles with a maximum safe integer\n * value of 2^53-1) and instead require a compatibility layer to work in JS as well, as for example\n * {@link glue/js/i64} respectively {@link glue/wasm/i64}.\n *\n * @module std/portable\n *//***/\n\n/// \n\n// Types\n\ndeclare type i8 = number;\ndeclare type i16 = number;\ndeclare type i32 = number;\ndeclare type isize = number;\ndeclare type u8 = number;\ndeclare type u16 = number;\ndeclare type u32 = number;\ndeclare type bool = boolean;\ndeclare type usize = number;\ndeclare type f32 = number;\ndeclare type f64 = number;\n\n// Compiler hints\n\n/** Compiler target. 0 = JS, 1 = WASM32, 2 = WASM64. */\ndeclare const ASC_TARGET: i32;\n\n// Builtins\n\n/** Performs the sign-agnostic count leading zero bits operation on a 32-bit integer. All zero bits are considered leading if the value is zero. */\ndeclare function clz(value: T): T;\n/** Performs the sign-agnostic count tailing zero bits operation on a 32-bit integer. All zero bits are considered trailing if the value is zero. */\ndeclare function ctz(value: T): T;\n/** Performs the sign-agnostic count number of one bits operation on a 32-bit integer. */\ndeclare function popcnt(value: T): T;\n/** Performs the sign-agnostic rotate left operation on a 32-bit integer. */\ndeclare function rotl(value: T, shift: T): T;\n/** Performs the sign-agnostic rotate right operation on a 32-bit integer. */\ndeclare function rotr(value: T, shift: T): T;\n/** Computes the absolute value of an integer or float. */\ndeclare function abs(value: T): T;\n/** Determines the maximum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function max(left: T, right: T): T;\n/** Determines the minimum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function min(left: T, right: T): T;\n/** Composes a 32-bit or 64-bit float from the magnitude of `x` and the sign of `y`. */\ndeclare function copysign(x: T, y: T): T;\n/** Performs the ceiling operation on a 32-bit or 64-bit float. */\ndeclare function ceil(value: T): T;\n/** Performs the floor operation on a 32-bit or 64-bit float. */\ndeclare function floor(value: T): T;\n/** Rounds to the nearest integer tied to even of a 32-bit or 64-bit float. */\ndeclare function nearest(value: T): T;\n/** Selects one of two pre-evaluated values depending on the condition. */\ndeclare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n/** Calculates the square root of a 32-bit or 64-bit float. */\ndeclare function sqrt(value: T): T;\n/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */\ndeclare function trunc(value: T): T;\n/** Loads a value of the specified type from memory. Type must be `u8`. */\ndeclare function load(ptr: usize, constantOffset?: usize): T;\n/** Stores a value of the specified type to memory. Type must be `u8`. */\ndeclare function store(ptr: usize, value: T, constantOffset?: usize): void;\n/** Emits an unreachable operation that results in a runtime error when executed. */\ndeclare function unreachable(): any; // sic\n\n/** NaN (not a number) as a 32-bit or 64-bit float depending on context. */\ndeclare const NaN: f32 | f64;\n/** Positive infinity as a 32-bit or 64-bit float depending on context. */\ndeclare const Infinity: f32 | f64;\n/** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/\ndeclare function changetype(value: any): T;\n/** Explicitly requests no bounds checks on the provided expression. Useful for array accesses. */\ndeclare function unchecked(value: T): T;\n/** Tests if a 32-bit or 64-bit float is `NaN`. */\ndeclare function isNaN(value: T): bool;\n/** Tests if a 32-bit or 64-bit float is finite, that is not `NaN` or +/-`Infinity`. */\ndeclare function isFinite(value: T): bool;\n/** Tests if the specified value is a valid integer. Can't distinguish an integer from an integral float. */\ndeclare function isInteger(value: any): value is number;\n/** Tests if the specified value is a valid float. Can't distinguish a float from an integer. */\ndeclare function isFloat(value: any): value is number;\n/** Tests if the specified value is of a reference type. */\ndeclare function isReference(value: any): value is object | string;\n/** Tests if the specified value can be used as a string. */\ndeclare function isString(value: any): value is string | String;\n/** Tests if the specified value can be used as an array. */\ndeclare function isArray(value: any): value is Array;\n/** Tests if the specified expression resolves to a defined element. */\ndeclare function isDefined(expression: any): bool;\n/** Tests if the specified expression evaluates to a constant value. */\ndeclare function isConstant(expression: any): bool;\n/** Traps if the specified value is not true-ish, otherwise returns the value. */\ndeclare function assert(isTrueish: T | null, message?: string): T;\n/** Parses an integer string to a 64-bit float. */\ndeclare function parseInt(str: string, radix?: i32): f64;\n/** Parses an integer string to a 32-bit integer. */\ndeclare function parseI32(str: string, radix?: i32): i32;\n/** Parses a floating point string to a 64-bit float. */\ndeclare function parseFloat(str: string): f64;\n/** Returns the 64-bit floating-point remainder of `x/y`. */\ndeclare function fmod(x: f64, y: f64): f64;\n/** Returns the 32-bit floating-point remainder of `x/y`. */\ndeclare function fmodf(x: f32, y: f32): f32;\n\n/** Converts any other numeric value to an 8-bit signed integer. */\ndeclare function i8(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace i8 {\n /** Smallest representable value. */\n export const MIN_VALUE: i8;\n /** Largest representable value. */\n export const MAX_VALUE: i8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i8;\n}\n/** Converts any other numeric value to a 16-bit signed integer. */\ndeclare function i16(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace i16 {\n /** Smallest representable value. */\n export const MIN_VALUE: i16;\n /** Largest representable value. */\n export const MAX_VALUE: i16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i16;\n}\n/** Converts any other numeric value to a 32-bit signed integer. */\ndeclare function i32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i32;\ndeclare namespace i32 {\n /** Smallest representable value. */\n export const MIN_VALUE: i32;\n /** Largest representable value. */\n export const MAX_VALUE: i32;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i32;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) signed integer. */\ndeclare function isize(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): isize;\ndeclare namespace isize {\n /** Smallest representable value. */\n export const MIN_VALUE: isize;\n /** Largest representable value. */\n export const MAX_VALUE: isize;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): isize;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): isize;\n}\n/** Converts any other numeric value to an 8-bit unsigned integer. */\ndeclare function u8(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace u8 {\n /** Smallest representable value. */\n export const MIN_VALUE: u8;\n /** Largest representable value. */\n export const MAX_VALUE: u8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u8;\n}\n/** Converts any other numeric value to a 16-bit unsigned integer. */\ndeclare function u16(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace u16 {\n /** Smallest representable value. */\n export const MIN_VALUE: u16;\n /** Largest representable value. */\n export const MAX_VALUE: u16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u16;\n}\n/** Converts any other numeric value to a 32-bit unsigned integer. */\ndeclare function u32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i32;\ndeclare namespace u32 {\n /** Smallest representable value. */\n export const MIN_VALUE: u32;\n /** Largest representable value. */\n export const MAX_VALUE: u32;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u32;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) unsigned integer. */\ndeclare function usize(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): isize;\ndeclare namespace usize {\n /** Smallest representable value. */\n export const MIN_VALUE: usize;\n /** Largest representable value. */\n export const MAX_VALUE: usize;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): usize;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): usize;\n}\n/** Converts any other numeric value to a 1-bit unsigned integer. */\ndeclare function bool(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): bool;\ndeclare namespace bool {\n /** Smallest representable value. */\n export const MIN_VALUE: bool;\n /** Largest representable value. */\n export const MAX_VALUE: bool;\n}\n/** Converts any other numeric value to a 32-bit float. */\ndeclare function f32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): f32;\ndeclare namespace f32 {\n /** Smallest representable value. */\n export const MIN_VALUE: f32;\n /** Largest representable value. */\n export const MAX_VALUE: f32;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f32;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f32;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f32;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f32;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n export function isNaN(value: f32): bool;\n /** Returns true if passed value is finite. */\n export function isFinite(value: f32): bool;\n /** Returns true if the value passed is a safe integer. */\n export function isSafeInteger(value: f32): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n export function isInteger(value: f32): bool;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): f32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): f32;\n}\n/** Converts any other numeric value to a 64-bit float. */\ndeclare function f64(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): f64;\ndeclare namespace f64 {\n /** Smallest representable value. */\n export const MIN_VALUE: f64;\n /** Largest representable value. */\n export const MAX_VALUE: f64;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f64;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f64;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f64;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f64;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n export function isNaN(value: f32): bool;\n /** Returns true if passed value is finite. */\n export function isFinite(value: f32): bool;\n /** Returns true if the value passed is a safe integer. */\n export function isSafeInteger(value: f64): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n export function isInteger(value: f64): bool;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): f64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): f64;\n}\n\n// Polyfills\n\n/** [Polyfill] Performs the sign-agnostic reverse bytes **/\ndeclare function bswap(value: T): T;\n/** [Polyfill] Performs the sign-agnostic reverse bytes only for last 16-bit **/\ndeclare function bswap16(value: T): T;\n\n// Standard library\n\n/** Memory operations. */\ndeclare namespace memory {\n /** Allocates a chunk of memory of the specified size and returns a pointer to it. */\n function allocate(size: usize): usize;\n /** Disposes a chunk of memory by its pointer. */\n function free(ptr: usize): void;\n /** Copies n bytes from the specified source to the specified destination in memory. These regions may overlap. */\n function copy(dst: usize, src: usize, n: usize): void;\n /** Fills size bytes from from the specified destination by same value in memory. */\n function fill(dst: usize, value: u8, size: usize): void;\n /** Resets the allocator to its initial state, if supported. */\n function reset(): void;\n}\n\n/** Class representing a generic, fixed-length raw binary data buffer. */\ndeclare class ArrayBuffer {\n /** The size, in bytes, of the array. */\n readonly byteLength: i32;\n /** Constructs a new array buffer of the given length in bytes. */\n constructor(length: i32);\n /** Returns a copy of this array buffer's bytes from begin, inclusive, up to end, exclusive. */\n slice(begin?: i32, end?: i32): ArrayBuffer;\n /** Returns a string representation of ArrayBuffer. */\n toString(): string;\n}\n\n/** The `DataView` view provides a low-level interface for reading and writing multiple number types in a binary `ArrayBuffer`, without having to care about the platform's endianness. */\ndeclare class DataView {\n /** The `buffer` accessor property represents the `ArrayBuffer` or `SharedArrayBuffer` referenced by the `DataView` at construction time. */\n readonly buffer: ArrayBuffer;\n /** The `byteLength` accessor property represents the length (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteLength: i32;\n /** The `byteOffset` accessor property represents the offset (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteOffset: i32;\n /** Constructs a new `DataView` with the given properties */\n constructor(buffer: ArrayBuffer, byteOffset?: i32, byteLength?: i32);\n /** The `getFloat32()` method gets a signed 32-bit float (float) at the specified byte offset from the start of the `DataView`. */\n getFloat32(byteOffset: i32, littleEndian?: boolean): f32;\n /** The `getFloat64()` method gets a signed 64-bit float (double) at the specified byte offset from the start of the `DataView`. */\n getFloat64(byteOffset: i32, littleEndian?: boolean): f64;\n /** The `getInt8()` method gets a signed 8-bit integer (byte) at the specified byte offset from the start of the `DataView`. */\n getInt8(byteOffset: i32): i8;\n /** The `getInt16()` method gets a signed 16-bit integer (short) at the specified byte offset from the start of the `DataView`. */\n getInt16(byteOffset: i32, littleEndian?: boolean): i16;\n /** The `getInt32()` method gets a signed 32-bit integer (long) at the specified byte offset from the start of the `DataView`. */\n getInt32(byteOffset: i32, littleEndian?: boolean): i32;\n /** The `getUint8()` method gets an unsigned 8-bit integer (unsigned byte) at the specified byte offset from the start of the `DataView`. */\n getUint8(byteOffset: i32): u8;\n /** The `getUint16()` method gets an unsigned 16-bit integer (unsigned short) at the specified byte offset from the start of the `DataView`. */\n getUint16(byteOffset: i32, littleEndian?: boolean): u16;\n /** The `getUint32()` method gets an unsigned 32-bit integer (unsigned long) at the specified byte offset from the start of the `DataView`. */\n getUint32(byteOffset: i32, littleEndian?: boolean): u32;\n /** The `setFloat32()` method stores a signed 32-bit float (float) value at the specified byte offset from the start of the `DataView`. */\n setFloat32(byteOffset: i32, value: f32, littleEndian?: boolean): void;\n /** The `setFloat64()` method stores a signed 64-bit float (double) value at the specified byte offset from the start of the `DataView`. */\n setFloat64(byteOffset: i32, value: f64, littleEndian?: boolean): void;\n /** The `setInt8()` method stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setInt8(byteOffset: i32, value: i8): void;\n /** The `setInt16()` method stores a signed 16-bit integer (short) value at the specified byte offset from the start of the `DataView`. */\n setInt16(byteOffset: i32, value: i16, littleEndian?: boolean): void;\n /** The `setInt32()` method stores a signed 32-bit integer (long) value at the specified byte offset from the start of the `DataView`. */\n setInt32(byteOffset: i32, value: i32, littleEndian?: boolean): void;\n /** The `setUint8()` method stores an unsigned 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setUint8(byteOffset: i32, value: u8): void;\n /** The `setUint16()` method stores an unsigned 16-bit integer (unsigned short) value at the specified byte offset from the start of the `DataView`. */\n setUint16(byteOffset: i32, value: u16, littleEndian?: boolean): void;\n /** The `setUint32()` method stores an unsigned 32-bit integer (unsigned long) value at the specified byte offset from the start of the `DataView`. */\n setUint32(byteOffset: i32, value: u32, littleEndian?: boolean): void;\n /** Returns a string representation of DataView. */\n toString(): string;\n}\n\ndeclare class Array {\n\n static isArray(value: any): value is Array;\n\n [key: number]: T;\n length: i32;\n constructor(capacity?: i32);\n\n fill(value: T, start?: i32, end?: i32): this;\n every(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n findIndex(predicate: (element: T, index: i32, array?: Array) => bool): i32;\n includes(searchElement: T, fromIndex?: i32): bool;\n indexOf(searchElement: T, fromIndex?: i32): i32;\n lastIndexOf(searchElement: T, fromIndex?: i32): i32;\n push(element: T): i32;\n concat(items: T[]): T[];\n copyWithin(target: i32, start: i32, end?: i32): this;\n pop(): T;\n forEach(callbackfn: (value: T, index: i32, array: Array) => void): void;\n map(callbackfn: (value: T, index: i32, array: Array) => U): Array;\n filter(callbackfn: (value: T, index: i32, array: Array) => bool): Array;\n reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n reduceRight(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n shift(): T;\n some(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n unshift(element: T): i32;\n slice(from?: i32, to?: i32): Array;\n splice(start: i32, deleteCount?: i32): Array;\n sort(comparator?: (a: T, b: T) => i32): this;\n join(separator?: string): string;\n reverse(): T[];\n toString(): string;\n}\n\ndeclare class Uint8Array extends Array {}\ndeclare class Uint8ClampedArray extends Array {}\ndeclare class Uint16Array extends Array {}\ndeclare class Uint32Array extends Array {}\ndeclare class Int8Array extends Array {}\ndeclare class Int16Array extends Array {}\ndeclare class Int32Array extends Array {}\ndeclare class Float32Array extends Array {}\ndeclare class Float64Array extends Array {}\n\ndeclare class String {\n\n static fromCharCode(ls: i32, hs?: i32): string;\n static fromCharCodes(arr: u16[]): string;\n static fromCodePoint(code: i32): string;\n static fromCodePoints(arr: i32[]): string;\n\n readonly length: i32;\n\n private constructor();\n\n charAt(index: i32): string;\n charCodeAt(index: i32): i32;\n concat(other: string): string;\n indexOf(other: string, fromIndex?: i32): i32;\n lastIndexOf(other: string, fromIndex?: i32): i32;\n includes(other: string): bool;\n startsWith(other: string): bool;\n endsWith(other: string): bool;\n substr(start: u32, length?: u32): string;\n substring(from: i32, to?: i32): string;\n trim(): string;\n trimLeft(): string;\n trimRight(): string;\n trimStart(): string;\n trimEnd(): string;\n padStart(targetLength: i32, padString?: string): string;\n padEnd(targetLength: i32, padString?: string): string;\n replace(search: string, replacement: string): string;\n repeat(count?: i32): string;\n slice(beginIndex: i32, endIndex?: i32): string;\n split(separator?: string, limit?: i32): string[];\n toString(): string;\n}\n\ninterface Boolean {}\n\ndeclare class Number {\n private constructor();\n toString(radix?: i32): string;\n}\n\ninterface Object {}\n\ninterface Function {}\n\ninterface RegExp {}\n\ninterface IArguments {}\n\n/** Class for representing a runtime error. Base class of all errors. */\ndeclare class Error {\n\n /** Error name. */\n name: string;\n\n /** Message provided on construction. */\n message: string;\n\n /** Stack trace. */\n stack?: string;\n\n /** Constructs a new error, optionally with a message. */\n constructor(message?: string);\n\n /** Method returns a string representing the specified Error class. */\n toString(): string;\n}\n\n/** Class for indicating an error when a value is not in the set or range of allowed values. */\ndeclare class RangeError extends Error { }\n\n/** Class for indicating an error when a value is not of the expected type. */\ndeclare class TypeError extends Error { }\n\n/** Class for indicating an error when trying to interpret syntactically invalid code. */\ndeclare class SyntaxError extends Error { }\n\ndeclare class Set {\n constructor(entries?: T[]);\n readonly size: i32;\n has(value: T): bool;\n add(value: T): void;\n delete(value: T): bool;\n clear(): void;\n toString(): string;\n [Symbol.iterator](): Iterator;\n}\n\ndeclare class Map {\n constructor(entries?: [K, V][]);\n readonly size: i32;\n set(key: K, value: V): void;\n has(key: K): bool;\n get(key: K): V | null;\n clear(): void;\n entries(): Iterable<[K, V]>;\n keys(): Iterable;\n values(): Iterable;\n delete(key: K): bool;\n toString(): string;\n [Symbol.iterator](): Iterator<[K,V]>;\n}\n\ninterface SymbolConstructor {\n readonly hasInstance: symbol;\n readonly isConcatSpreadable: symbol;\n readonly isRegExp: symbol;\n readonly iterator: symbol;\n readonly match: symbol;\n readonly replace: symbol;\n readonly search: symbol;\n readonly species: symbol;\n readonly split: symbol;\n readonly toPrimitive: symbol;\n readonly toStringTag: symbol;\n readonly unscopables: symbol;\n (description?: string | null): symbol;\n for(key: string): symbol;\n keyFor(sym: symbol): string | null;\n}\ndeclare const Symbol: SymbolConstructor;\n\ninterface Iterable {\n [Symbol.iterator](): Iterator;\n}\n\ninterface Iterator {}\n\ninterface IMath {\n readonly E: f64;\n readonly LN2: f64;\n readonly LN10: f64;\n readonly LOG2E: f64;\n readonly LOG10E: f64;\n readonly PI: f64;\n readonly SQRT1_2: f64;\n readonly SQRT2: f64;\n abs(x: f64): f64;\n acos(x: f64): f64;\n acosh(x: f64): f64;\n asin(x: f64): f64;\n asinh(x: f64): f64;\n atan(x: f64): f64;\n atan2(y: f64, x: f64): f64;\n atanh(x: f64): f64;\n cbrt(x: f64): f64;\n ceil(x: f64): f64;\n clz32(x: f64): i32;\n cos(x: f64): f64;\n cosh(x: f64): f64;\n exp(x: f64): f64;\n expm1(x: f64): f64;\n floor(x: f64): f64;\n fround(x: f64): f32;\n hypot(value1: f64, value2: f64): f64; // TODO: see std/math\n imul(a: f64, b: f64): i32;\n log(x: f64): f64;\n log10(x: f64): f64;\n log1p(x: f64): f64;\n log2(x: f64): f64;\n max(value1: f64, value2: f64): f64; // TODO: see std/math\n min(value1: f64, value2: f64): f64; // TODO: see std/math\n pow(base: f64, exponent: f64): f64;\n random(): f64;\n round(x: f64): f64;\n sign(x: f64): f64;\n signbit(x: f64): bool;\n sin(x: f64): f64;\n sinh(x: f64): f64;\n sqrt(x: f64): f64;\n tan(x: f64): f64;\n tanh(x: f64): f64;\n trunc(x: f64): f64;\n}\n\ndeclare const Math: IMath;\ndeclare const Mathf: IMath;\ndeclare const JSMath: IMath;\n\ndeclare class Date {\n /** Returns the UTC timestamp in milliseconds of the specified date. */\n static UTC(\n year: i32,\n month: i32,\n day: i32,\n hour: i32,\n minute: i32,\n second: i32,\n millisecond: i32\n ): number;\n /** Returns the current UTC timestamp in milliseconds. */\n static now(): number;\n /** Constructs a new date object from an UTC timestamp in milliseconds. */\n constructor(value: number);\n /** Returns the UTC timestamp of this date in milliseconds. */\n getTime(): number;\n /** Sets the UTC timestamp of this date in milliseconds. */\n setTime(value: number): number;\n}\n\ndeclare namespace console {\n /** @deprecated */\n function log(message: string): void;\n}\n"}):(()=>{const e=path.join(".","..","std");return{assembly:fs.readFileSync(path.join(e,"assembly","index.d.ts"),"utf8"),portable:fs.readFileSync(path.join(e,"portable","index.d.ts"),"utf8")}})(),exports.compileString=((e,n)=>{"string"==typeof e&&(e={"input.ts":e});const t=Object.create({stdout:createMemoryStream(),stderr:createMemoryStream()});var r=["--binaryFile","binary","--textFile","text"];return Object.keys(n||{}).forEach(e=>{var t=n[e];Array.isArray(t)?t.forEach(n=>r.push("--"+e,String(n))):r.push("--"+e,String(t))}),exports.main(r.concat(Object.keys(e)),{stdout:t.stdout,stderr:t.stderr,readFile:n=>e.hasOwnProperty(n)?e[n]:null,writeFile:(e,n)=>t[e]=n,listFiles:()=>[]}),t}),exports.main=function(e,n,t){"function"==typeof n?(t=n,n={}):n||(n={});const r=n.stdout||process.stdout,i=n.stderr||process.stderr,a=n.readFile||F,s=n.writeFile||S,o=n.listFiles||I,l=n.stats||createStats();if(!r)throw Error("'options.stdout' must be specified");if(!i)throw Error("'options.stderr' must be specified");const f=optionsUtil.parse(e,exports.options),u=f.options;if(e=f.arguments,u.noColors?colorsUtil.stdout.supported=colorsUtil.stderr.supported=!1:(colorsUtil.stdout=colorsUtil.from(r),colorsUtil.stderr=colorsUtil.from(i)),f.unknown.length&&f.unknown.forEach(e=>{i.write(colorsUtil.stderr.yellow("WARN: ")+"Unknown option '"+e+"'"+EOL)}),f.trailing.length&&i.write(colorsUtil.stderr.yellow("WARN: ")+"Unsupported trailing arguments: "+f.trailing.join(" ")+EOL),t||(t=function(e){var n=0;return e&&(i.write(colorsUtil.stderr.red("ERROR: ")+e.stack.replace(/^ERROR: /i,"")+EOL),n=1),n}),u.version)return r.write("Version "+exports.version+(isDev?"-dev":"")+EOL),t(null);if(u.help||!e.length){var c=u.help?r:i,p=u.help?colorsUtil.stdout:colorsUtil.stderr;return c.write([p.white("SYNTAX")," "+p.cyan("asc")+" [entryFile ...] [options]","",p.white("EXAMPLES")," "+p.cyan("asc")+" hello.ts"," "+p.cyan("asc")+" hello.ts -b hello.wasm -t hello.wat"," "+p.cyan("asc")+" hello1.ts hello2.ts -b -O > hello.wasm","",p.white("OPTIONS")].concat(optionsUtil.help(exports.options,24,EOL)).join(EOL)+EOL),t(null)}if(!fs.readFileSync){if(a===F)throw Error("'options.readFile' must be specified");if(s===S)throw Error("'options.writeFile' must be specified");if(o===I)throw Error("'options.listFiles' must be specified")}const d=u.baseDir?path.resolve(u.baseDir):".",h=[];u.transform&&u.transform.forEach(e=>h.push(__webpack_require__(12)(path.isAbsolute(e=e.trim())?e:path.join(process.cwd(),e))));var x=null;u.noLib?(l.parseCount++,l.parseTime+=measure(()=>{x=assemblyscript.parseFile(exports.libraryFiles.builtins,exports.libraryPrefix+"builtins.ts",!1,x)})):Object.keys(exports.libraryFiles).forEach(e=>{e.indexOf("/")>=0||(l.parseCount++,l.parseTime+=measure(()=>{x=assemblyscript.parseFile(exports.libraryFiles[e],exports.libraryPrefix+e+".ts",!1,x)}))});const b=[];if(u.lib){let e=u.lib;"string"==typeof e&&(e=e.split(",")),Array.prototype.push.apply(b,e.map(e=>e.trim()));for(let e=0,n=b.length;e{x=assemblyscript.parseFile(s,exports.libraryPrefix+i,!1,x)})}}}function g(){for(var e,n;null!=(e=x.nextFile());){if(e.startsWith(exports.libraryPrefix)){const t=e.substring(exports.libraryPrefix.length),r=e.substring(exports.libraryPrefix.length)+"/index";if(exports.libraryFiles.hasOwnProperty(t))n=exports.libraryFiles[t],e=exports.libraryPrefix+t+".ts";else if(exports.libraryFiles.hasOwnProperty(r))n=exports.libraryFiles[r],e=exports.libraryPrefix+r+".ts";else for(let i=0,s=b.length;i{assemblyscript.parseFile(n,e,!1,x)})}if(checkDiagnostics(x,i))return t(Error("Parse error"))}for(let n=0,r=e.length;n{x=assemblyscript.parseFile(s,i,!0,x)});let o=g();if(o)return o}!function(e,...n){h.forEach(t=>{"function"==typeof t[e]&&t[e](...n)})}("afterParse",x);{let e=g();if(e)return e}const y=assemblyscript.finishParsing(x);var m=0,v=0;u.optimize&&(m=exports.defaultOptimizeLevel,v=exports.defaultShrinkLevel),"number"==typeof u.optimizeLevel&&(m=u.optimizeLevel),"number"==typeof u.shrinkLevel&&(v=u.shrinkLevel),m=Math.min(Math.max(m,0),3),v=Math.min(Math.max(v,0),2);const E=assemblyscript.createOptions();if(assemblyscript.setTarget(E,0),assemblyscript.setNoTreeShaking(E,u.noTreeShaking),assemblyscript.setNoAssert(E,u.noAssert),assemblyscript.setImportMemory(E,u.importMemory),assemblyscript.setImportTable(E,u.importTable),assemblyscript.setMemoryBase(E,u.memoryBase>>>0),assemblyscript.setSourceMap(E,null!=u.sourceMap),assemblyscript.setOptimizeLevelHints(E,m,v),u.noLib||(assemblyscript.setGlobalAlias(E,"Math","NativeMath"),assemblyscript.setGlobalAlias(E,"Mathf","NativeMathf"),assemblyscript.setGlobalAlias(E,"abort","~lib/env/abort"),assemblyscript.setGlobalAlias(E,"trace","~lib/env/trace")),u.use){let e=u.use;for(let n=0,r=e.length;n{try{l.compileTime+=measure(()=>{_=assemblyscript.compileProgram(y,E)})}catch(e){return t(e)}})(),checkDiagnostics(x,i))return _&&_.dispose(),t(Error("Compile error"));if(u.validate&&(l.validateCount++,l.validateTime+=measure(()=>{if(!_.validate())return _.dispose(),t(Error("Validate error"))})),"clamp"===u.trapMode)l.optimizeCount++,l.optimizeTime+=measure(()=>{_.runPasses(["trap-mode-clamp"])});else if("js"===u.trapMode)l.optimizeCount++,l.optimizeTime+=measure(()=>{_.runPasses(["trap-mode-js"])});else if("allow"!==u.trapMode)return _.dispose(),t(Error("Unsupported trap mode"));(m>=3||v>=2)&&(m=4),_.setOptimizeLevel(m),_.setShrinkLevel(v),_.setDebugInfo(u.debug);var A=[];if(u.runPasses&&("string"==typeof u.runPasses&&(u.runPasses=u.runPasses.split(",")),u.runPasses.length&&u.runPasses.forEach(e=>{A.indexOf(e)<0&&A.push(e)})),(m>0||v>0)&&(l.optimizeCount++,l.optimizeTime+=measure(()=>{_.optimize()})),A.length&&(l.optimizeCount++,l.optimizeTime+=measure(()=>{_.runPasses(A.map(e=>e.trim()))})),!u.noEmit){let e=!1,n=!1;if(null!=u.outFile&&(/\.was?t$/.test(u.outFile)&&null==u.textFile?u.textFile=u.outFile:/\.js$/.test(u.outFile)&&null==u.asmjsFile?u.asmjsFile=u.outFile:null==u.binaryFile&&(u.binaryFile=u.outFile)),null!=u.binaryFile){let r,o=null!=u.sourceMap?u.sourceMap.length?u.sourceMap:path.basename(u.binaryFile)+".map":null;if(l.emitCount++,l.emitTime+=measure(()=>{r=_.toBinary(o)}),u.binaryFile.length?s(u.binaryFile,r.output,d):(z(r.output),e=!0),n=!0,null!=r.sourceMap)if(u.binaryFile.length){let e=JSON.parse(r.sourceMap);e.sourceRoot=exports.sourceMapRoot,e.sources.forEach((n,r)=>{let i=null;if(n.startsWith(exports.libraryPrefix)){let e=n.substring(exports.libraryPrefix.length).replace(/\.ts$/,"");if(exports.libraryFiles.hasOwnProperty(e))i=exports.libraryFiles[e];else for(let e=0,t=b.length;e{t=_.toAsmjs()}),s(u.asmjsFile,t,d)):e||(l.emitCount++,l.emitTime+=measure(()=>{t=_.toAsmjs()}),z(t),e=!0),n=!0}if(null!=u.idlFile){let t;u.idlFile.length?(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildIDL(y)}),s(u.idlFile,t,d)):e||(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildIDL(y)}),z(t),e=!0),n=!0}if(null!=u.tsdFile){let t;u.tsdFile.length?(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildTSD(y)}),s(u.tsdFile,t,d)):e||(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildTSD(y)}),z(t),e=!0),n=!0}if(null!=u.textFile||!n){let n;u.textFile&&u.textFile.length?(l.emitCount++,l.emitTime+=measure(()=>{n=_.toText()}),s(u.textFile,n,d)):e||(l.emitCount++,l.emitTime+=measure(()=>{n=_.toText()}),z(n))}}return _.dispose(),u.measure&&printStats(l,i),t(null);function F(e,n){try{let t;return l.readCount++,l.readTime+=measure(()=>{t=fs.readFileSync(path.join(n,e),{encoding:"utf8"})}),t}catch(e){return null}}function S(e,n,t){try{return l.writeCount++,l.writeTime+=measure(()=>{mkdirp(path.join(t,path.dirname(e))),"string"==typeof n?fs.writeFileSync(path.join(t,e),n,{encoding:"utf8"}):fs.writeFileSync(path.join(t,e),n)}),!0}catch(e){return!1}}function I(e,n){var t;try{return l.readTime+=measure(()=>{t=fs.readdirSync(path.join(n,e)).filter(e=>/^(?!.*\.d\.ts$).*\.ts$/.test(e))}),t}catch(e){return[]}}function z(e){z.used||(l.writeCount++,z.used=!0),l.writeTime+=measure(()=>{"string"==typeof e?r.write(e,{encoding:"utf8"}):r.write(e)})}};var argumentSubstitutions={"-O":["--optimize"],"-Os":["--optimize","--shrinkLevel","1"],"-Oz":["--optimize","--shrinkLevel","2"],"-O0":["--optimizeLevel","0","--shrinkLevel","0"],"-O0s":["--optimizeLevel","0","--shrinkLevel","1"],"-O0z":["--optimizeLevel","0","--shrinkLevel","2"],"-O1":["--optimizeLevel","1","--shrinkLevel","0"],"-O1s":["--optimizeLevel","1","--shrinkLevel","1"],"-O1z":["--optimizeLevel","1","--shrinkLevel","2"],"-O2":["--optimizeLevel","2","--shrinkLevel","0"],"-O2s":["--optimizeLevel","2","--shrinkLevel","1"],"-O2z":["--optimizeLevel","2","--shrinkLevel","2"],"-O3":["--optimizeLevel","3","--shrinkLevel","0"],"-O3s":["--optimizeLevel","3","--shrinkLevel","1"],"-O3z":["--optimizeLevel","3","--shrinkLevel","2"]};function checkDiagnostics(e,n){for(var t,r=!1;null!=(t=assemblyscript.nextDiagnostic(e));)n&&n.write(assemblyscript.formatDiagnostic(t,n.isTTY,!0)+EOL+EOL),assemblyscript.isError(t)&&(r=!0);return r}function createStats(){return{readTime:0,readCount:0,writeTime:0,writeCount:0,parseTime:0,parseCount:0,compileTime:0,compileCount:0,emitTime:0,emitCount:0,validateTime:0,validateCount:0,optimizeTime:0,optimizeCount:0}}function measure(e){const n=process.hrtime();e();const t=process.hrtime(n);return 1e9*t[0]+t[1]}function formatTime(e){return e?(e/1e6).toFixed(3)+" ms":"N/A"}function printStats(e,n){function t(e,n){return formatTime(e)}(n||process.stdout).write(["I/O Read : "+t(e.readTime,e.readCount),"I/O Write : "+t(e.writeTime,e.writeCount),"Parse : "+t(e.parseTime,e.parseCount),"Compile : "+t(e.compileTime,e.compileCount),"Emit : "+t(e.emitTime,e.emitCount),"Validate : "+t(e.validateTime,e.validateCount),"Optimize : "+t(e.optimizeTime,e.optimizeCount)].join(EOL)+EOL)}exports.checkDiagnostics=checkDiagnostics,exports.createStats=createStats,process.hrtime||(process.hrtime=__webpack_require__(13)),exports.measure=measure,exports.formatTime=formatTime,exports.printStats=printStats;var allocBuffer=void 0!==global&&global.Buffer?global.Buffer.allocUnsafe||function(e){return new global.Buffer(e)}:function(e){return new Uint8Array(e)};function createMemoryStream(e){var n=[];return n.write=function(n){if(e&&e(n),"string"==typeof n){let e=allocBuffer(utf8.length(n));utf8.write(n,e,0),n=e}this.push(n)},n.reset=function(){n.length=0},n.toBuffer=function(){for(var e=0,n=0,t=this.length;n191&&r<224?a[s++]=(31&r)<<6|63&e[n++]:r>239&&r<365?(r=((7&r)<<18|(63&e[n++])<<12|(63&e[n++])<<6|63&e[n++])-65536,a[s++]=55296+(r>>10),a[s++]=56320+(1023&r)):a[s++]=(15&r)<<12|(63&e[n++])<<6|63&e[n++],s>8191&&((i||(i=[])).push(String.fromCharCode.apply(String,a)),s=0);return i?(s&&i.push(String.fromCharCode.apply(String,a.slice(0,s))),i.join("")):String.fromCharCode.apply(String,a.slice(0,s))},r.write=function(e,n,t){for(var r,i,a=t,s=0;s>6|192,n[t++]=63&r|128):55296==(64512&r)&&56320==(64512&(i=e.charCodeAt(s+1)))?(r=65536+((1023&r)<<10)+(1023&i),++s,n[t++]=r>>18|240,n[t++]=r>>12&63|128,n[t++]=r>>6&63|128,n[t++]=63&r|128):(n[t++]=r>>12|224,n[t++]=r>>6&63|128,n[t++]=63&r|128);return t-a}},function(e,n,t){(function(e){var t=void 0!==e&&e||{},r=t.env&&"CI"in t.env;function i(e,t){var i=t||{};return i.supported=e&&!!e.isTTY||r,i.gray=(e=>i.supported?n.GRAY+e+n.RESET:e),i.red=(e=>i.supported?n.RED+e+n.RESET:e),i.green=(e=>i.supported?n.GREEN+e+n.RESET:e),i.yellow=(e=>i.supported?n.YELLOW+e+n.RESET:e),i.blue=(e=>i.supported?n.BLUE+e+n.RESET:e),i.magenta=(e=>i.supported?n.MAGENTA+e+n.RESET:e),i.cyan=(e=>i.supported?n.CYAN+e+n.RESET:e),i.white=(e=>i.supported?n.WHITE+e+n.RESET:e),i}n.stdout=i(t.stdout,n),n.stderr=i(t.stderr),n.from=i,n.GRAY="",n.RED="",n.GREEN="",n.YELLOW="",n.BLUE="",n.MAGENTA="",n.CYAN="",n.WHITE="",n.RESET=""}).call(this,t(0))},function(e,n){n.parse=function(e,n){var t={},r=[],arguments=[],i=[],a={};Object.keys(n).forEach(e=>{var r=n[e];null!=r.alias&&("string"==typeof r.alias?a[r.alias]=e:Array.isArray(r.alias)&&r.alias.forEach(n=>a[n]=e)),null!=r.default&&(t[e]=r.default)});for(var s=0,o=(e=e.slice()).length;st[e]=o.value[e])}else r.push(i)}for(;s{var s=e[n];if(null!=s.description){for(var o="";o.length{for(let n=0;n=0;r--){var i=e[r];"."===i?e.splice(r,1):".."===i?(e.splice(r,1),t++):t&&(e.splice(r,1),t--)}if(n)for(;t--;t)e.unshift("..");return e}var r=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,i=function(e){return r.exec(e).slice(1)};function a(e,n){if(e.filter)return e.filter(n);for(var t=[],r=0;r=-1&&!r;i--){var s=i>=0?arguments[i]:e.cwd();if("string"!=typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(n=s+"/"+n,r="/"===s.charAt(0))}return(r?"/":"")+(n=t(a(n.split("/"),function(e){return!!e}),!r).join("/"))||"."},n.normalize=function(e){var r=n.isAbsolute(e),i="/"===s(e,-1);return(e=t(a(e.split("/"),function(e){return!!e}),!r).join("/"))||r||(e="."),e&&i&&(e+="/"),(r?"/":"")+e},n.isAbsolute=function(e){return"/"===e.charAt(0)},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(a(e,function(e,n){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},n.relative=function(e,t){function r(e){for(var n=0;n=0&&""===e[t];t--);return n>t?[]:e.slice(n,t-n+1)}e=n.resolve(e).substr(1),t=n.resolve(t).substr(1);for(var i=r(e.split("/")),a=r(t.split("/")),s=Math.min(i.length,a.length),o=s,l=0;l{try{assemblyscript=__webpack_require__(10)}catch(e){try{__webpack_require__(!function(){var e=new Error("Cannot find module 'ts-node'");throw e.code="MODULE_NOT_FOUND",e}()).register({project:path.join(".","..","src","tsconfig.json")}),__webpack_require__(!function(){var e=new Error("Cannot find module '../src/glue/js'");throw e.code="MODULE_NOT_FOUND",e}()),assemblyscript=__webpack_require__(!function(){var e=new Error("Cannot find module '../src'");throw e.code="MODULE_NOT_FOUND",e}()),isDev=!0}catch(e_ts){try{assemblyscript=eval("require('./assemblyscript')")}catch(e){throw e.stack=e_ts.stack+"\n---\n"+e.stack,e}}}})(),exports.isBundle=!0,exports.isDev=isDev,exports.version=exports.isBundle?"0.5.0":__webpack_require__(!function(){var e=new Error("Cannot find module '../package.json'");throw e.code="MODULE_NOT_FOUND",e}()).version,exports.options=__webpack_require__(11),exports.sourceMapRoot="assemblyscript:///",exports.libraryPrefix=assemblyscript.LIBRARY_PREFIX,exports.defaultOptimizeLevel=2,exports.defaultShrinkLevel=1,exports.libraryFiles=exports.isBundle?Object({"allocator/arena":'/**\n * Arena Memory Allocator\n *\n * Provides a `memory.reset` function to reset the heap to its initial state. A user has to make\n * sure that there are no more references to cleared memory afterwards. Always aligns to 8 bytes.\n *\n * @module std/assembly/allocator/arena\n *//***/\n\nimport { AL_MASK, MAX_SIZE_32 } from "../internal/allocator";\n\nvar startOffset: usize = (HEAP_BASE + AL_MASK) & ~AL_MASK;\nvar offset: usize = startOffset;\n\n// Memory allocator interface\n\n@global export function __memory_allocate(size: usize): usize {\n if (size > MAX_SIZE_32) unreachable();\n var ptr = offset;\n var newPtr = (ptr + max(size, 1) + AL_MASK) & ~AL_MASK;\n var pagesBefore = memory.size();\n if (newPtr > pagesBefore << 16) {\n let pagesNeeded = ((newPtr - ptr + 0xffff) & ~0xffff) >>> 16;\n let pagesWanted = max(pagesBefore, pagesNeeded); // double memory\n if (memory.grow(pagesWanted) < 0) {\n if (memory.grow(pagesNeeded) < 0) {\n unreachable(); // out of memory\n }\n }\n }\n offset = newPtr;\n return ptr;\n}\n\n@global export function __memory_free(ptr: usize): void { /* nop */ }\n\n@global export function __memory_reset(): void {\n offset = startOffset;\n}\n',"allocator/buddy":'/**\n * Buddy Memory Allocator.\n * @module std/assembly/allocator/buddy\n *//***/\n\n/*\n Copyright 2018 Evan Wallace\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the "Software"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n*/// see: https://github.com/evanw/buddy-malloc\n\n/*\n * This file implements a buddy memory allocator, which is an allocator that\n * allocates memory within a fixed linear address range. It spans the address\n * range with a binary tree that tracks free space. Both "malloc" and "free"\n * are O(log N) time where N is the maximum possible number of allocations.\n *\n * The "buddy" term comes from how the tree is used. When memory is allocated,\n * nodes in the tree are split recursively until a node of the appropriate size\n * is reached. Every split results in two child nodes, each of which is the\n * buddy of the other. When a node is freed, the node and its buddy can be\n * merged again if the buddy is also free. This makes the memory available\n * for larger allocations again.\n */\n\n/*\n * Every allocation needs an 8-byte header to store the allocation size while\n * staying 8-byte aligned. The address returned by "malloc" is the address\n * right after this header (i.e. the size occupies the 8 bytes before the\n * returned address).\n */\nconst HEADER_SIZE: usize = 8;\n\n/*\n * The minimum allocation size is 16 bytes because we have an 8-byte header and\n * we need to stay 8-byte aligned.\n */\nconst MIN_ALLOC_LOG2: usize = 4;\nconst MIN_ALLOC: usize = 1 << MIN_ALLOC_LOG2;\n\n/*\n * The maximum allocation size is currently set to 2gb. This is the total size\n * of the heap. It\'s technically also the maximum allocation size because the\n * heap could consist of a single allocation of this size. But of course real\n * heaps will have multiple allocations, so the real maximum allocation limit\n * is at most 1gb.\n */\nconst MAX_ALLOC_LOG2: usize = 30; // 31;\nconst MAX_ALLOC: usize = 1 << MAX_ALLOC_LOG2;\n\n/*\n * Allocations are done in powers of two starting from MIN_ALLOC and ending at\n * MAX_ALLOC inclusive. Each allocation size has a bucket that stores the free\n * list for that allocation size.\n *\n * Given a bucket index, the size of the allocations in that bucket can be\n * found with "(size_t)1 << (MAX_ALLOC_LOG2 - bucket)".\n */\nconst BUCKET_COUNT: usize = MAX_ALLOC_LOG2 - MIN_ALLOC_LOG2 + 1;\n\n/*\n * Free lists are stored as circular doubly-linked lists. Every possible\n * allocation size has an associated free list that is threaded through all\n * currently free blocks of that size. That means MIN_ALLOC must be at least\n * "sizeof(list_t)". MIN_ALLOC is currently 16 bytes, so this will be true for\n * both 32-bit and 64-bit.\n */\n@unmanaged\nclass List {\n prev: List;\n next: List;\n static readonly SIZE: usize = 2 * sizeof();\n}\n\n/*\n * Each bucket corresponds to a certain allocation size and stores a free list\n * for that size. The bucket at index 0 corresponds to an allocation size of\n * MAX_ALLOC (i.e. the whole address space).\n */\nvar BUCKETS_START: usize = HEAP_BASE;\nvar BUCKETS_END: usize = BUCKETS_START + BUCKET_COUNT * List.SIZE;\n\nfunction buckets$get(index: usize): List {\n assert(index < BUCKET_COUNT);\n return changetype(BUCKETS_START + index * List.SIZE);\n}\n\n/*\n * We could initialize the allocator by giving it one free block the size of\n * the entire address space. However, this would cause us to instantly reserve\n * half of the entire address space on the first allocation, since the first\n * split would store a free list entry at the start of the right child of the\n * root. Instead, we have the tree start out small and grow the size of the\n * tree as we use more memory. The size of the tree is tracked by this value.\n */\nvar bucket_limit: usize;\n\n/*\n * This array represents a linearized binary tree of bits. Every possible\n * allocation larger than MIN_ALLOC has a node in this tree (and therefore a\n * bit in this array).\n *\n * Given the index for a node, lineraized binary trees allow you to traverse to\n * the parent node or the child nodes just by doing simple arithmetic on the\n * index:\n *\n * - Move to parent: index = (index - 1) / 2;\n * - Move to left child: index = index * 2 + 1;\n * - Move to right child: index = index * 2 + 2;\n * - Move to sibling: index = ((index - 1) ^ 1) + 1;\n *\n * Each node in this tree can be in one of several states:\n *\n * - UNUSED (both children are UNUSED)\n * - SPLIT (one child is UNUSED and the other child isn\'t)\n * - USED (neither children are UNUSED)\n *\n * These states take two bits to store. However, it turns out we have enough\n * information to distinguish between UNUSED and USED from context, so we only\n * need to store SPLIT or not, which only takes a single bit.\n *\n * Note that we don\'t need to store any nodes for allocations of size MIN_ALLOC\n * since we only ever care about parent nodes.\n */\nconst SPLIT_COUNT: usize = (1 << (BUCKET_COUNT - 1)) / 8;\nvar NODE_IS_SPLIT_START: usize = BUCKETS_END;\nvar NODE_IS_SPLIT_END: usize = NODE_IS_SPLIT_START + SPLIT_COUNT * sizeof();\n\nfunction node_is_split$get(index: usize): i32 {\n assert(index < SPLIT_COUNT);\n return load(NODE_IS_SPLIT_START + index);\n}\n\nfunction node_is_split$set(index: usize, state: i32): void {\n assert(index < SPLIT_COUNT);\n store(NODE_IS_SPLIT_START + index, state);\n}\n\n/*\n * This is the starting address of the address range for this allocator. Every\n * returned allocation will be an offset of this pointer from 0 to MAX_ALLOC.\n */\nvar base_ptr: usize;\n\n/*\n * This is the maximum address that has ever been used by the allocator. It\'s\n * used to know when to call "brk" to request more memory from the kernel.\n */\nvar max_ptr: usize;\n\n/*\n * Make sure all addresses before "new_value" are valid and can be used. Memory\n * is allocated in a 2gb address range but that memory is not reserved up\n * front. It\'s only reserved when it\'s needed by calling this function. This\n * will return false if the memory could not be reserved.\n */\nfunction update_max_ptr(new_value: usize): i32 {\n if (new_value > max_ptr) {\n // if (brk(new_value)) {\n // return 0;\n // }\n let oldPages = memory.size();\n let newPages = (((new_value + 0xffff) & ~0xffff) >>> 16);\n assert(newPages > oldPages);\n if (memory.grow(newPages - oldPages) < 0) {\n return 0;\n }\n // max_ptr = new_value;\n max_ptr = newPages << 16;\n }\n return 1;\n}\n\n/*\n * Initialize a list to empty. Because these are circular lists, an "empty"\n * list is an entry where both links point to itself. This makes insertion\n * and removal simpler because they don\'t need any branches.\n */\nfunction list_init(list: List): void {\n list.prev = list;\n list.next = list;\n}\n\n/*\n * Append the provided entry to the end of the list. This assumes the entry\n * isn\'t in a list already because it overwrites the linked list pointers.\n */\nfunction list_push(list: List, entry: List): void {\n var prev = list.prev;\n entry.prev = prev;\n entry.next = list;\n prev.next = entry;\n list.prev = entry;\n}\n\n/*\n * Remove the provided entry from whichever list it\'s currently in. This\n * assumes that the entry is in a list. You don\'t need to provide the list\n * because the lists are circular, so the list\'s pointers will automatically\n * be updated if the first or last entries are removed.\n */\nfunction list_remove(entry: List): void {\n var prev = entry.prev;\n var next = entry.next;\n prev.next = next;\n next.prev = prev;\n}\n\n/*\n * Remove and return the first entry in the list or NULL if the list is empty.\n */\nfunction list_pop(list: List): List | null {\n var back = list.prev;\n if (back == list) return null;\n list_remove(back);\n return back;\n}\n\n/*\n * This maps from the index of a node to the address of memory that node\n * represents. The bucket can be derived from the index using a loop but is\n * required to be provided here since having them means we can avoid the loop\n * and have this function return in constant time.\n */\nfunction ptr_for_node(index: usize, bucket: usize): usize {\n return base_ptr + ((index - (1 << bucket) + 1) << (MAX_ALLOC_LOG2 - bucket));\n}\n\n/*\n * This maps from an address of memory to the node that represents that\n * address. There are often many nodes that all map to the same address, so\n * the bucket is needed to uniquely identify a node.\n */\nfunction node_for_ptr(ptr: usize, bucket: usize): usize {\n return ((ptr - base_ptr) >> (MAX_ALLOC_LOG2 - bucket)) + (1 << bucket) - 1;\n}\n\n/*\n * Given the index of a node, this returns the "is split" flag of the parent.\n */\nfunction parent_is_split(index: usize): bool {\n index = (index - 1) / 2;\n return ((node_is_split$get(index / 8) >>> (index % 8)) & 1) == 1;\n}\n\n/*\n * Given the index of a node, this flips the "is split" flag of the parent.\n */\nfunction flip_parent_is_split(index: usize): void {\n index = (index - 1) / 2;\n var indexDiv8 = index / 8;\n node_is_split$set(indexDiv8,\n node_is_split$get(indexDiv8) ^ (1 << (index % 8))\n );\n}\n\n/*\n * Given the requested size passed to "malloc", this function returns the index\n * of the smallest bucket that can fit that size.\n */\nfunction bucket_for_request(request: usize): usize {\n var bucket = BUCKET_COUNT - 1;\n var size = MIN_ALLOC;\n\n while (size < request) {\n bucket--;\n size *= 2;\n }\n\n return bucket;\n}\n\n/*\n * The tree is always rooted at the current bucket limit. This call grows the\n * tree by repeatedly doubling it in size until the root lies at the provided\n * bucket index. Each doubling lowers the bucket limit by 1.\n */\nfunction lower_bucket_limit(bucket: usize): u32 {\n while (bucket < bucket_limit) {\n let root = node_for_ptr(base_ptr, bucket_limit);\n let right_child: usize;\n\n /*\n * If the parent isn\'t SPLIT, that means the node at the current bucket\n * limit is UNUSED and our address space is entirely free. In that case,\n * clear the root free list, increase the bucket limit, and add a single\n * block with the newly-expanded address space to the new root free list.\n */\n if (!parent_is_split(root)) {\n list_remove(changetype(base_ptr));\n list_init(buckets$get(--bucket_limit));\n list_push(buckets$get(bucket_limit), changetype(base_ptr));\n continue;\n }\n\n /*\n * Otherwise, the tree is currently in use. Create a parent node for the\n * current root node in the SPLIT state with a right child on the free\n * list. Make sure to reserve the memory for the free list entry before\n * writing to it. Note that we do not need to flip the "is split" flag for\n * our current parent because it\'s already on (we know because we just\n * checked it above).\n */\n right_child = ptr_for_node(root + 1, bucket_limit);\n if (!update_max_ptr(right_child + List.SIZE)) {\n return 0;\n }\n list_push(buckets$get(bucket_limit), changetype(right_child));\n list_init(buckets$get(--bucket_limit));\n\n /*\n * Set the grandparent\'s SPLIT flag so if we need to lower the bucket limit\n * again, we\'ll know that the new root node we just added is in use.\n */\n root = (root - 1) / 2;\n if (root != 0) {\n flip_parent_is_split(root);\n }\n }\n\n return 1;\n}\n\n// Memory allocator interface\n\n@global export function __memory_allocate(request: usize): usize {\n var original_bucket: usize, bucket: usize;\n\n /*\n * Make sure it\'s possible for an allocation of this size to succeed. There\'s\n * a hard-coded limit on the maximum allocation size because of the way this\n * allocator works.\n */\n if (request > MAX_ALLOC - HEADER_SIZE) unreachable();\n\n /*\n * Initialize our global state if this is the first call to "malloc". At the\n * beginning, the tree has a single node that represents the smallest\n * possible allocation size. More memory will be reserved later as needed.\n */\n if (base_ptr == 0) {\n // base_ptr = max_ptr = (uint8_t *)sbrk(0);\n base_ptr = (NODE_IS_SPLIT_END + 7) & ~7; // must be aligned\n max_ptr = memory.size() << 16; // must grow first\n bucket_limit = BUCKET_COUNT - 1;\n if (!update_max_ptr(base_ptr + List.SIZE)) {\n return 0;\n }\n list_init(buckets$get(BUCKET_COUNT - 1));\n list_push(buckets$get(BUCKET_COUNT - 1), changetype(base_ptr));\n }\n\n /*\n * Find the smallest bucket that will fit this request. This doesn\'t check\n * that there\'s space for the request yet.\n */\n bucket = bucket_for_request(request + HEADER_SIZE);\n original_bucket = bucket;\n\n /*\n * Search for a bucket with a non-empty free list that\'s as large or larger\n * than what we need. If there isn\'t an exact match, we\'ll need to split a\n * larger one to get a match.\n */\n while (bucket + 1 != 0) {\n let size: usize, bytes_needed: usize, i: usize;\n let ptr: usize;\n\n /*\n * We may need to grow the tree to be able to fit an allocation of this\n * size. Try to grow the tree and stop here if we can\'t.\n */\n if (!lower_bucket_limit(bucket)) {\n return 0;\n }\n\n /*\n * Try to pop a block off the free list for this bucket. If the free list\n * is empty, we\'re going to have to split a larger block instead.\n */\n ptr = changetype(list_pop(buckets$get(bucket)));\n if (!ptr) {\n /*\n * If we\'re not at the root of the tree or it\'s impossible to grow the\n * tree any more, continue on to the next bucket.\n */\n if (bucket != bucket_limit || bucket == 0) {\n bucket--;\n continue;\n }\n\n /*\n * Otherwise, grow the tree one more level and then pop a block off the\n * free list again. Since we know the root of the tree is used (because\n * the free list was empty), this will add a parent above this node in\n * the SPLIT state and then add the new right child node to the free list\n * for this bucket. Popping the free list will give us this right child.\n */\n if (!lower_bucket_limit(bucket - 1)) {\n return 0;\n }\n ptr = changetype(list_pop(buckets$get(bucket)));\n }\n\n /*\n * Try to expand the address space first before going any further. If we\n * have run out of space, put this block back on the free list and fail.\n */\n size = 1 << (MAX_ALLOC_LOG2 - bucket);\n bytes_needed = bucket < original_bucket ? size / 2 + List.SIZE : size;\n if (!update_max_ptr(ptr + bytes_needed)) {\n list_push(buckets$get(bucket), changetype(ptr));\n return 0;\n }\n\n /*\n * If we got a node off the free list, change the node from UNUSED to USED.\n * This involves flipping our parent\'s "is split" bit because that bit is\n * the exclusive-or of the UNUSED flags of both children, and our UNUSED\n * flag (which isn\'t ever stored explicitly) has just changed.\n *\n * Note that we shouldn\'t ever need to flip the "is split" bit of our\n * grandparent because we know our buddy is USED so it\'s impossible for our\n * grandparent to be UNUSED (if our buddy chunk was UNUSED, our parent\n * wouldn\'t ever have been split in the first place).\n */\n i = node_for_ptr(ptr, bucket);\n if (i != 0) {\n flip_parent_is_split(i);\n }\n\n /*\n * If the node we got is larger than we need, split it down to the correct\n * size and put the new unused child nodes on the free list in the\n * corresponding bucket. This is done by repeatedly moving to the left\n * child, splitting the parent, and then adding the right child to the free\n * list.\n */\n while (bucket < original_bucket) {\n i = i * 2 + 1;\n bucket++;\n flip_parent_is_split(i);\n list_push(\n buckets$get(bucket),\n changetype(ptr_for_node(i + 1, bucket))\n );\n }\n\n /*\n * Now that we have a memory address, write the block header (just the size\n * of the allocation) and return the address immediately after the header.\n */\n store(ptr, request);\n return ptr + HEADER_SIZE;\n }\n\n return 0;\n}\n\n@global export function __memory_free(ptr: usize): void {\n var bucket: usize, i: usize;\n\n /*\n * Ignore any attempts to free a NULL pointer.\n */\n if (!ptr) {\n return;\n }\n\n /*\n * We were given the address returned by "malloc" so get back to the actual\n * address of the node by subtracting off the size of the block header. Then\n * look up the index of the node corresponding to this address.\n */\n ptr = ptr - HEADER_SIZE;\n bucket = bucket_for_request(load(ptr) + HEADER_SIZE);\n i = node_for_ptr(ptr, bucket);\n\n /*\n * Traverse up to the root node, flipping USED blocks to UNUSED and merging\n * UNUSED buddies together into a single UNUSED parent.\n */\n while (i != 0) {\n /*\n * Change this node from UNUSED to USED. This involves flipping our\n * parent\'s "is split" bit because that bit is the exclusive-or of the\n * UNUSED flags of both children, and our UNUSED flag (which isn\'t ever\n * stored explicitly) has just changed.\n */\n flip_parent_is_split(i);\n\n /*\n * If the parent is now SPLIT, that means our buddy is USED, so don\'t merge\n * with it. Instead, stop the iteration here and add ourselves to the free\n * list for our bucket.\n *\n * Also stop here if we\'re at the current root node, even if that root node\n * is now UNUSED. Root nodes don\'t have a buddy so we can\'t merge with one.\n */\n if (parent_is_split(i) || bucket == bucket_limit) {\n break;\n }\n\n /*\n * If we get here, we know our buddy is UNUSED. In this case we should\n * merge with that buddy and continue traversing up to the root node. We\n * need to remove the buddy from its free list here but we don\'t need to\n * add the merged parent to its free list yet. That will be done once after\n * this loop is finished.\n */\n list_remove(changetype(ptr_for_node(((i - 1) ^ 1) + 1, bucket)));\n i = (i - 1) / 2;\n bucket--;\n }\n\n /*\n * Add ourselves to the free list for our bucket. We add to the back of the\n * list because "malloc" takes from the back of the list and we want a "free"\n * followed by a "malloc" of the same size to ideally use the same address\n * for better memory locality.\n */\n list_push(buckets$get(bucket), changetype(ptr_for_node(i, bucket)));\n}\n',"allocator/emscripten":"/**\n * Emscripten Memory Allocator.\n *\n * Uses Emscripten's exported _malloc and _free implementations, i.e., when linking with\n * Emscripten-compiled programs that already provide these. Differs from 'system' in that their\n * names are prefixed with an underscore.\n *\n * @module std/assembly/allocator/emscripten\n *//***/\n\ndeclare function _malloc(size: usize): usize;\ndeclare function _free(ptr: usize): void;\n\n// Memory allocator interface\n\n@global export function __memory_allocate(size: usize): usize {\n return _malloc(size);\n}\n\n@global export function __memory_free(ptr: usize): void {\n _free(ptr);\n}\n","allocator/system":"/**\n * System Memory Allocator.\n *\n * Uses the environment's malloc and free implementations, i.e., when linking with other C-like\n * programs that already provide these.\n *\n * @module std/assembly/allocator/system\n *//***/\n\ndeclare function malloc(size: usize): usize;\ndeclare function free(ptr: usize): void;\n\n// Memory allocator interface\n\n@global export function __memory_allocate(size: usize): usize {\n return malloc(size);\n}\n\n@global export function __memory_free(ptr: usize): void {\n free(ptr);\n}\n","allocator/tlsf":"/**\n * Two-Level Segregate Fit Memory Allocator.\n *\n * A general purpose dynamic memory allocator specifically designed to meet real-time requirements.\n * Always aligns to 8 bytes.\n *\n * @module std/assembly/allocator/tlsf\n *//***/\n\n// ╒══════════════ Block size interpretation (32-bit) ═════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┼─┴─┴─┴─┴─╫─┴─┴─┤\n// │ | FL │ SB = SL + AL │ ◄─ usize\n// └───────────────────────────────────────────────┴─────────╨─────┘\n// FL: first level, SL: second level, AL: alignment, SB: small block\n\nimport {\n AL_BITS,\n AL_SIZE,\n AL_MASK\n} from \"../internal/allocator\";\n\nconst SL_BITS: u32 = 5;\nconst SL_SIZE: usize = 1 << SL_BITS;\n\nconst SB_BITS: usize = (SL_BITS + AL_BITS);\nconst SB_SIZE: usize = 1 << SB_BITS;\n\nconst FL_BITS: u32 = (sizeof() == sizeof()\n ? 30 // ^= up to 1GB per block\n : 32 // ^= up to 4GB per block\n) - SB_BITS;\n\n// ╒════════════════ Block structure layout (32-bit) ══════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┼─┼─┤\n// │ size │L│F│ ◄─┐ info\n// ╞═══════════════════════════════════════════════════════════╧═╧═╡ │ ┐\n// │ if free: ◄ prev │ ◄─┤ usize\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ if free: next ► │ ◄─┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ ... unused free space >= 0 ... │ │ = 0\n// ├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤ │\n// │ if free: jump ▲ │ ◄─┘\n// └───────────────────────────────────────────────────────────────┘ MIN SIZE ┘\n// F: FREE, L: LEFT_FREE\n\n/** Tag indicating that this block is free. */\nconst FREE: usize = 1 << 0;\n/** Tag indicating that this block's left block is free. */\nconst LEFT_FREE: usize = 1 << 1;\n/** Mask to obtain all tags. */\nconst TAGS: usize = FREE | LEFT_FREE;\n\n/** Block structure. */\n@unmanaged\nclass Block {\n\n /** Info field holding this block's size and tags. */\n info: usize;\n\n /** End offset of the {@link Block#info} field. User data starts here. */\n static readonly INFO: usize = (sizeof() + AL_MASK) & ~AL_MASK;\n\n /** Previous free block, if any. Only valid if free. */\n prev: Block | null;\n /** Next free block, if any. Only valid if free. */\n next: Block | null;\n\n /** Minimum size of a block, excluding {@link Block#info}. */\n static readonly MIN_SIZE: usize = (3 * sizeof() + AL_MASK) & ~AL_MASK;// prev + next + jump\n\n /** Maximum size of a used block, excluding {@link Block#info}. */\n static readonly MAX_SIZE: usize = 1 << (FL_BITS + SB_BITS);\n\n /** Gets this block's left (free) block in memory. */\n get left(): Block {\n assert(this.info & LEFT_FREE); // must be free to contain a jump\n return assert(\n load(changetype(this) - sizeof())\n ); // can't be null\n }\n\n /** Gets this block's right block in memory. */\n get right(): Block {\n assert(this.info & ~TAGS); // can't skip beyond the tail block\n return assert(\n changetype(\n changetype(this) + Block.INFO + (this.info & ~TAGS)\n )\n ); // can't be null\n }\n}\n\n// ╒════════════════ Root structure layout (32-bit) ═══════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┤ ┐\n// │ 0 | flMap S│ ◄────┐\n// ╞═══════════════════════════════════════════════════════════════╡ │\n// │ slMap[0] S │ ◄─┐ │\n// ├───────────────────────────────────────────────────────────────┤ │ │\n// │ slMap[1] │ ◄─┤ │\n// ├───────────────────────────────────────────────────────────────┤ u32 │\n// │ ... │ ◄─┤ │\n// ├───────────────────────────────────────────────────────────────┤ │ │\n// │ slMap[22] P │ ◄─┘ │\n// ╞═══════════════════════════════════════════════════════════════╡ usize\n// │ head[0] │ ◄────┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ ... │ ◄────┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ head[736] │ ◄────┤\n// ╞═══════════════════════════════════════════════════════════════╡ │\n// │ tailRef │ ◄────┘\n// └───────────────────────────────────────────────────────────────┘ SIZE ┘\n// S: Small blocks map, P: Possibly padded if 64-bit\n\nassert((1 << SL_BITS) <= 32); // second level must fit into 32 bits\n\n/** Root structure. */\n@unmanaged\nclass Root {\n\n /** First level bitmap. */\n flMap: usize = 0;\n\n /** Start offset of second level maps. */\n private static readonly SL_START: usize = sizeof();\n\n // Using *one* SL map per *FL bit*\n\n /** Gets the second level map for the specified first level. */\n getSLMap(fl: usize): u32 {\n assert(fl < FL_BITS); // fl out of range\n return load(changetype(this) + fl * 4, Root.SL_START);\n }\n\n /** Sets the second level map for the specified first level. */\n setSLMap(fl: usize, value: u32): void {\n assert(fl < FL_BITS); // fl out of range\n store(changetype(this) + fl * 4, value, Root.SL_START);\n }\n\n /** End offset of second level maps. */\n private static readonly SL_END: usize = Root.SL_START + FL_BITS * 4;\n\n // Using *number bits per SL* heads per *FL bit*\n\n /** Start offset of FL/SL heads. */\n private static readonly HL_START: usize = (Root.SL_END + AL_MASK) & ~AL_MASK;\n\n /** Gets the head of the specified first and second level index. */\n getHead(fl: usize, sl: u32): Block | null {\n assert(fl < FL_BITS); // fl out of range\n assert(sl < SL_SIZE); // sl out of range\n return changetype(load(\n changetype(this) + (fl * SL_SIZE + sl) * sizeof()\n , Root.HL_START));\n }\n\n /** Sets the head of the specified first and second level index. */\n setHead(fl: usize, sl: u32, value: Block | null): void {\n assert(fl < FL_BITS); // fl out of range\n assert(sl < SL_SIZE); // sl out of range\n store(\n changetype(this) + (fl * SL_SIZE + sl) * sizeof()\n , changetype(value)\n , Root.HL_START);\n }\n\n /** End offset of FL/SL heads. */\n private static readonly HL_END: usize = (\n Root.HL_START + FL_BITS * SL_SIZE * sizeof()\n );\n\n get tailRef(): usize { return load(0, Root.HL_END); }\n set tailRef(value: usize) { store(0, value, Root.HL_END); }\n\n /** Total size of the {@link Root} structure. */\n static readonly SIZE: usize = Root.HL_END + sizeof();\n\n /** Inserts a previously used block back into the free list. */\n insert(block: Block): void {\n // check as much as possible here to prevent invalid free blocks\n assert(block); // cannot be null\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free\n var size: usize;\n assert(\n (size = block.info & ~TAGS) >= Block.MIN_SIZE && size < Block.MAX_SIZE\n ); // must be valid, not necessary to compute yet if noAssert=true\n\n var right: Block = assert(block.right); // can't be null\n var rightInfo = right.info;\n\n // merge with right block if also free\n if (rightInfo & FREE) {\n this.remove(right);\n block.info = (blockInfo += Block.INFO + (rightInfo & ~TAGS));\n right = block.right;\n rightInfo = right.info;\n // jump is set below\n }\n\n // merge with left block if also free\n if (blockInfo & LEFT_FREE) {\n let left: Block = assert(block.left); // can't be null\n let leftInfo = left.info;\n assert(leftInfo & FREE); // must be free according to tags\n this.remove(left);\n left.info = (leftInfo += Block.INFO + (blockInfo & ~TAGS));\n block = left;\n blockInfo = leftInfo;\n // jump is set below\n }\n\n right.info = rightInfo | LEFT_FREE;\n this.setJump(block, right);\n // right is no longer used now, hence rightInfo is not synced\n\n size = blockInfo & ~TAGS;\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n\n // mapping_insert\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n\n // perform insertion\n var head = this.getHead(fl, sl);\n block.prev = null;\n block.next = head;\n if (head) head.prev = block;\n this.setHead(fl, sl, block);\n\n // update first and second level maps\n this.flMap |= (1 << fl);\n this.setSLMap(fl, this.getSLMap(fl) | (1 << sl));\n }\n\n /**\n * Removes a free block from FL/SL maps. Does not alter left/jump because it\n * is likely that splitting is performed afterwards, invalidating any changes\n * again.\n */\n private remove(block: Block): void {\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free\n var size = blockInfo & ~TAGS;\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n\n // mapping_insert\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n\n // link previous and next free block\n var prev = block.prev;\n var next = block.next;\n if (prev) prev.next = next;\n if (next) next.prev = prev;\n\n // update head if we are removing it\n if (block == this.getHead(fl, sl)) {\n this.setHead(fl, sl, next);\n\n // clear second level map if head is empty now\n if (!next) {\n let slMap = this.getSLMap(fl);\n this.setSLMap(fl, slMap &= ~(1 << sl));\n\n // clear first level map if second level is empty now\n if (!slMap) this.flMap &= ~(1 << fl);\n }\n }\n }\n\n /** Searches for a free block of at least the specified size. */\n search(size: usize): Block | null {\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE);\n\n // mapping_search\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n // (*) size += (1 << (fls(size) - SL_BITS)) - 1;\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n // (*) instead of rounding up, use next second level list for better fit\n if (sl < SL_SIZE - 1) ++sl;\n else ++fl, sl = 0;\n }\n\n // search second level\n var slMap = this.getSLMap(fl) & (~0 << sl);\n var head: Block | null;\n if (!slMap) {\n // search next larger first level\n let flMap = this.flMap & (~0 << (fl + 1));\n if (!flMap) {\n head = null;\n } else {\n fl = ffs(flMap);\n slMap = assert(this.getSLMap(fl)); // can't be zero if fl points here\n head = this.getHead(fl, ffs(slMap));\n }\n } else {\n head = this.getHead(fl, ffs(slMap));\n }\n return head;\n }\n\n /** Links a free left with its right block in memory. */\n private setJump(left: Block, right: Block): void {\n assert(left.info & FREE); // must be free\n assert(left.right == right); // right block must match\n assert(right.info & LEFT_FREE); // right block must be tagged as LEFT_FREE\n store(\n changetype(right) - sizeof()\n , left); // last word in left block's (free) data region\n }\n\n /**\n * Uses the specified free block, removing it from internal maps and\n * splitting it if possible, and returns its data pointer.\n */\n use(block: Block, size: usize): usize {\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free so we can use it\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n assert(!(size & AL_MASK)); // size must be aligned so the new block is\n\n this.remove(block);\n\n // split if the block can hold another MIN_SIZE block\n var remaining = (blockInfo & ~TAGS) - size;\n if (remaining >= Block.INFO + Block.MIN_SIZE) {\n block.info = size | (blockInfo & LEFT_FREE); // also discards FREE\n\n let spare = changetype(\n changetype(block) + Block.INFO + size\n );\n spare.info = (remaining - Block.INFO) | FREE; // not LEFT_FREE\n this.insert(spare); // also sets jump\n\n // otherwise tag block as no longer FREE and right as no longer LEFT_FREE\n } else {\n block.info = blockInfo & ~FREE;\n let right: Block = assert(block.right); // can't be null (tail)\n right.info &= ~LEFT_FREE;\n }\n\n return changetype(block) + Block.INFO;\n }\n\n /** Adds more memory to the pool. */\n addMemory(start: usize, end: usize): bool {\n assert(start <= end);\n assert(!(start & AL_MASK)); // must be aligned\n assert(!(end & AL_MASK)); // must be aligned\n\n var tailRef = this.tailRef;\n var tailInfo: usize = 0;\n if (tailRef) {\n assert(start >= tailRef + sizeof()); // starts after tail\n\n // merge with current tail if adjacent\n if (start - Block.INFO == tailRef) {\n start -= Block.INFO;\n tailInfo = changetype(tailRef).info;\n }\n\n } else {\n assert(start >= changetype(this) + Root.SIZE); // starts after root\n }\n\n // check if size is large enough for a free block and the tail block\n var size = end - start;\n if (size < Block.INFO + Block.MIN_SIZE + Block.INFO) {\n return false;\n }\n\n // left size is total minus its own and the zero-length tail's header\n var leftSize = size - 2 * Block.INFO;\n var left = changetype(start);\n left.info = leftSize | FREE | (tailInfo & LEFT_FREE);\n left.prev = null;\n left.next = null;\n\n // tail is a zero-length used block\n var tail = changetype(start + size - Block.INFO);\n tail.info = 0 | LEFT_FREE;\n this.tailRef = changetype(tail);\n\n this.insert(left); // also merges with free left before tail / sets jump\n\n return true;\n }\n}\n\n/** Determines the first (LSB to MSB) set bit's index of a word. */\nfunction ffs(word: T): T {\n assert(word != 0); // word cannot be 0\n return ctz(word); // differs from ffs only for 0\n}\n\n/** Determines the last (LSB to MSB) set bit's index of a word. */\nfunction fls(word: T): T {\n assert(word != 0); // word cannot be 0\n const inv: T = (sizeof() << 3) - 1;\n return inv - clz(word);\n}\n\n/** Reference to the initialized {@link Root} structure, once initialized. */\nvar ROOT: Root = changetype(0);\n\n// Memory allocator interface\n\n/** Allocates a chunk of memory. */\n@global export function __memory_allocate(size: usize): usize {\n\n // initialize if necessary\n var root = ROOT;\n if (!root) {\n let rootOffset = (HEAP_BASE + AL_MASK) & ~AL_MASK;\n let pagesBefore = memory.size();\n let pagesNeeded = ((((rootOffset + Root.SIZE) + 0xffff) & ~0xffff) >>> 16);\n if (pagesNeeded > pagesBefore && memory.grow(pagesNeeded - pagesBefore) < 0) unreachable();\n ROOT = root = changetype(rootOffset);\n root.tailRef = 0;\n root.flMap = 0;\n for (let fl: usize = 0; fl < FL_BITS; ++fl) {\n root.setSLMap(fl, 0);\n for (let sl: u32 = 0; sl < SL_SIZE; ++sl) {\n root.setHead(fl, sl, null);\n }\n }\n root.addMemory((rootOffset + Root.SIZE + AL_MASK) & ~AL_MASK, memory.size() << 16);\n }\n\n // search for a suitable block\n if (size > Block.MAX_SIZE) unreachable();\n\n // 32-bit MAX_SIZE is 1 << 30 and itself aligned, hence the following can't overflow MAX_SIZE\n size = max((size + AL_MASK) & ~AL_MASK, Block.MIN_SIZE);\n\n var block = root.search(size);\n if (!block) {\n\n // request more memory\n let pagesBefore = memory.size();\n let pagesNeeded = (((size + 0xffff) & ~0xffff) >>> 16);\n let pagesWanted = max(pagesBefore, pagesNeeded); // double memory\n if (memory.grow(pagesWanted) < 0) {\n if (memory.grow(pagesNeeded) < 0) {\n unreachable(); // out of memory\n }\n }\n let pagesAfter = memory.size();\n root.addMemory(pagesBefore << 16, pagesAfter << 16);\n block = assert(root.search(size)); // must be found now\n }\n\n assert((block.info & ~TAGS) >= size);\n return root.use(block, size);\n}\n\n/** Frees the chunk of memory at the specified address. */\n@global export function __memory_free(data: usize): void {\n if (data) {\n let root = ROOT;\n if (root) {\n let block = changetype(data - Block.INFO);\n let blockInfo = block.info;\n assert(!(blockInfo & FREE)); // must be used\n block.info = blockInfo | FREE;\n root.insert(changetype(data - Block.INFO));\n }\n }\n}\n\n@global export function __memory_reset(): void {\n unreachable();\n}\n",array:'import {\n MAX_BLENGTH,\n HEADER_SIZE,\n allocateUnsafe,\n reallocateUnsafe,\n LOAD,\n STORE\n} from "./internal/arraybuffer";\n\nimport {\n allocateUnsafe as allocateUnsafeString,\n freeUnsafe as freeUnsafeString,\n copyUnsafe as copyUnsafeString\n} from "./internal/string";\n\nimport {\n COMPARATOR,\n SORT\n} from "./internal/sort";\n\nimport {\n itoa,\n dtoa,\n itoa_stream,\n dtoa_stream,\n MAX_DOUBLE_LENGTH\n} from "./internal/number";\n\nimport {\n isArray as builtin_isArray\n} from "./builtins";\n\nexport class Array {\n [key: number]: T; // compatibility only\n\n /* @internal */ buffer_: ArrayBuffer;\n /* @internal */ length_: i32;\n\n @inline static isArray(value: U): bool {\n return builtin_isArray(value) && value !== null;\n }\n\n constructor(length: i32 = 0) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length > MAX_LENGTH) throw new RangeError("Invalid array length");\n var byteLength = length << alignof();\n var buffer = allocateUnsafe(byteLength);\n this.buffer_ = buffer;\n this.length_ = length;\n memory.fill(\n changetype(buffer) + HEADER_SIZE,\n 0,\n byteLength\n );\n }\n\n @inline\n get length(): i32 {\n return this.length_;\n }\n\n set length(length: i32) {\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n if (length > capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length > MAX_LENGTH) throw new RangeError("Invalid array length");\n buffer = reallocateUnsafe(buffer, length << alignof());\n this.buffer_ = buffer;\n }\n this.length_ = length;\n }\n\n every(callbackfn: (element: T, index: i32, array: Array) => bool): bool {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n if (!callbackfn(LOAD(this.buffer_, index), index, this)) return false;\n }\n return true;\n }\n\n findIndex(predicate: (element: T, index: i32, array: Array) => bool): i32 {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n if (predicate(LOAD(this.buffer_, index), index, this)) return index;\n }\n return -1;\n }\n\n @operator("[]")\n private __get(index: i32): T {\n var buffer = this.buffer_;\n return index < (buffer.byteLength >>> alignof())\n ? LOAD(buffer, index)\n : unreachable();\n }\n\n @operator("{}")\n private __unchecked_get(index: i32): T {\n return LOAD(this.buffer_, index);\n }\n\n @operator("[]=")\n private __set(index: i32, value: T): void {\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n if (index >= capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (index >= MAX_LENGTH) throw new Error("Invalid array length");\n buffer = reallocateUnsafe(buffer, (index + 1) << alignof());\n this.buffer_ = buffer;\n this.length_ = index + 1;\n }\n STORE(buffer, index, value);\n if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line\n }\n\n @operator("{}=")\n private __unchecked_set(index: i32, value: T): void {\n STORE(this.buffer_, index, value);\n if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line\n }\n\n fill(value: T, start: i32 = 0, end: i32 = i32.MAX_VALUE): this {\n var buffer = this.buffer_;\n var len = this.length_;\n\n start = start < 0 ? max(len + start, 0) : min(start, len);\n end = end < 0 ? max(len + end, 0) : min(end, len);\n\n if (sizeof() == 1) {\n if (start < end) {\n memory.fill(\n changetype(buffer) + start + HEADER_SIZE,\n value,\n (end - start)\n );\n }\n } else {\n for (; start < end; ++start) {\n STORE(buffer, start, value);\n }\n }\n return this;\n }\n\n @inline\n includes(searchElement: T, fromIndex: i32 = 0): bool {\n return this.indexOf(searchElement, fromIndex) >= 0;\n }\n\n indexOf(searchElement: T, fromIndex: i32 = 0): i32 {\n var length = this.length_;\n if (length == 0 || fromIndex >= length) return -1;\n if (fromIndex < 0) fromIndex = max(length + fromIndex, 0);\n var buffer = this.buffer_;\n while (fromIndex < length) {\n if (LOAD(buffer, fromIndex) == searchElement) return fromIndex;\n ++fromIndex;\n }\n return -1;\n }\n\n lastIndexOf(searchElement: T, fromIndex: i32 = this.length_): i32 {\n var length = this.length_;\n if (length == 0) return -1;\n if (fromIndex < 0) fromIndex = length + fromIndex; // no need to clamp\n else if (fromIndex >= length) fromIndex = length - 1;\n var buffer = this.buffer_;\n while (fromIndex >= 0) { // ^\n if (LOAD(buffer, fromIndex) == searchElement) return fromIndex;\n --fromIndex;\n }\n return -1;\n }\n\n push(element: T): i32 {\n var length = this.length_;\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n var newLength = length + 1; // safe only if length is checked\n if (length >= capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length >= MAX_LENGTH) throw new Error("Invalid array length");\n buffer = reallocateUnsafe(buffer, newLength << alignof());\n this.buffer_ = buffer;\n }\n this.length_ = newLength;\n STORE(buffer, length, element);\n if (isManaged()) __gc_link(changetype(this), changetype(element)); // tslint:disable-line\n return newLength;\n }\n\n concat(items: Array): Array {\n var thisLen = this.length_;\n var otherLen = select(0, items.length_, items === null);\n var outLen = thisLen + otherLen;\n var out = new Array(outLen);\n\n if (thisLen) {\n memory.copy(\n changetype(out.buffer_) + HEADER_SIZE,\n changetype(this.buffer_) + HEADER_SIZE,\n thisLen << alignof()\n );\n }\n if (otherLen) {\n memory.copy(\n changetype(out.buffer_) + HEADER_SIZE + (thisLen << alignof()),\n changetype(items.buffer_) + HEADER_SIZE,\n otherLen << alignof()\n );\n }\n return out;\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): this {\n var buffer = this.buffer_;\n var len = this.length_;\n\n end = min(end, len);\n var to = target < 0 ? max(len + target, 0) : min(target, len);\n var from = start < 0 ? max(len + start, 0) : min(start, len);\n var last = end < 0 ? max(len + end, 0) : min(end, len);\n var count = min(last - from, len - to);\n\n if (from < to && to < (from + count)) {\n from += count - 1;\n to += count - 1;\n while (count) {\n STORE(buffer, to, LOAD(buffer, from));\n --from, --to, --count;\n }\n } else {\n memory.copy(\n changetype(buffer) + HEADER_SIZE + (to << alignof()),\n changetype(buffer) + HEADER_SIZE + (from << alignof()),\n count << alignof()\n );\n }\n return this;\n }\n\n pop(): T {\n var length = this.length_;\n if (length < 1) throw new RangeError("Array is empty");\n var element = LOAD(this.buffer_, --length);\n this.length_ = length;\n return element;\n }\n\n forEach(callbackfn: (value: T, index: i32, array: Array) => void): void {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n callbackfn(LOAD(this.buffer_, index), index, this);\n }\n }\n\n map(callbackfn: (value: T, index: i32, array: Array) => U): Array {\n var length = this.length_;\n var result = new Array(length);\n var buffer = result.buffer_;\n for (let index = 0; index < min(length, this.length_); ++index) {\n STORE(buffer, index, callbackfn(LOAD(this.buffer_, index), index, this));\n }\n return result;\n }\n\n filter(callbackfn: (value: T, index: i32, array: Array) => bool): Array {\n var result = new Array();\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n let value = LOAD(this.buffer_, index);\n if (callbackfn(value, index, this)) result.push(value);\n }\n return result;\n }\n\n reduce(\n callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U,\n initialValue: U\n ): U {\n var accum = initialValue;\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n accum = callbackfn(accum, LOAD(this.buffer_, index), index, this);\n }\n return accum;\n }\n\n reduceRight(\n callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U,\n initialValue: U\n ): U {\n var accum = initialValue;\n for (let index = this.length_ - 1; index >= 0; --index) {\n accum = callbackfn(accum, LOAD(this.buffer_, index), index, this);\n }\n return accum;\n }\n\n shift(): T {\n var length = this.length_;\n if (length < 1) throw new RangeError("Array is empty");\n var buffer = this.buffer_;\n var element = LOAD(buffer, 0);\n var lastIndex = length - 1;\n memory.copy(\n changetype(buffer) + HEADER_SIZE,\n changetype(buffer) + HEADER_SIZE + sizeof(),\n lastIndex << alignof()\n );\n STORE(buffer, lastIndex, null);\n this.length_ = lastIndex;\n return element;\n }\n\n some(callbackfn: (element: T, index: i32, array: Array) => bool): bool {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n if (callbackfn(LOAD(this.buffer_, index), index, this)) return true;\n }\n return false;\n }\n\n unshift(element: T): i32 {\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n var length = this.length_;\n var newLength = length + 1; // safe only if length is checked\n if (length >= capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length >= MAX_LENGTH) throw new Error("Invalid array length");\n buffer = reallocateUnsafe(buffer, newLength << alignof());\n capacity = buffer.byteLength >>> alignof();\n this.buffer_ = buffer;\n }\n memory.copy(\n changetype(buffer) + HEADER_SIZE + sizeof(),\n changetype(buffer) + HEADER_SIZE,\n (capacity - 1) << alignof()\n );\n STORE(buffer, 0, element);\n this.length_ = newLength;\n if (isManaged()) __gc_link(changetype(this), changetype(element)); // tslint:disable-line\n return newLength;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Array {\n var len = this.length_;\n begin = begin < 0 ? max(begin + len, 0) : min(begin, len);\n end = end < 0 ? max(end + len, 0) : min(end, len);\n len = end - begin;\n var sliced = new Array(len);\n if (len) {\n memory.copy(\n changetype(sliced.buffer_) + HEADER_SIZE,\n changetype(this.buffer_) + HEADER_SIZE + (begin << alignof()),\n len << alignof()\n );\n }\n return sliced;\n }\n\n splice(start: i32, deleteCount: i32 = i32.MAX_VALUE): Array {\n var length = this.length_;\n start = start < 0 ? max(length + start, 0) : min(start, length);\n deleteCount = max(min(deleteCount, length - start), 0);\n var buffer = this.buffer_;\n var spliced = new Array(deleteCount);\n var source = changetype(buffer) + HEADER_SIZE + (start << alignof());\n memory.copy(\n changetype(spliced.buffer_) + HEADER_SIZE,\n source,\n deleteCount << alignof()\n );\n var offset = start + deleteCount;\n if (length != offset) {\n memory.copy(\n source,\n changetype(buffer) + HEADER_SIZE + (offset << alignof()),\n (length - offset) << alignof()\n );\n }\n this.length_ = length - deleteCount;\n return spliced;\n }\n\n reverse(): Array {\n var buffer = this.buffer_;\n for (let front = 0, back = this.length_ - 1; front < back; ++front, --back) {\n let temp = LOAD(buffer, front);\n STORE(buffer, front, LOAD(buffer, back));\n STORE(buffer, back, temp);\n }\n return this;\n }\n\n sort(comparator: (a: T, b: T) => i32 = COMPARATOR()): this {\n // TODO remove this when flow will allow trackcing null\n assert(comparator); // The comparison function must be a function\n\n var length = this.length_;\n if (length <= 1) return this;\n var buffer = this.buffer_;\n if (length == 2) {\n let a = LOAD(buffer, 1); // a = arr[1]\n let b = LOAD(buffer, 0); // b = arr[0]\n if (comparator(a, b) < 0) {\n STORE(buffer, 1, b); // arr[1] = b;\n STORE(buffer, 0, a); // arr[0] = a;\n }\n return this;\n }\n SORT(buffer, 0, length, comparator);\n return this;\n }\n\n join(separator: string = ","): string {\n var lastIndex = this.length_ - 1;\n if (lastIndex < 0) return "";\n var result = "";\n var value: T;\n var buffer = this.buffer_;\n var sepLen = separator.length;\n var hasSeparator = sepLen != 0;\n if (value instanceof bool) {\n if (!lastIndex) return select("true", "false", LOAD(buffer, 0));\n\n let valueLen = 5; // max possible length of element len("false")\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n valueLen = 4 + (!value);\n copyUnsafeString(result, offset, select("true", "false", value), 0, valueLen);\n offset += valueLen;\n if (hasSeparator) {\n copyUnsafeString(result, offset, changetype(separator), 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n valueLen = 4 + (!value);\n copyUnsafeString(result, offset, select("true", "false", value), 0, valueLen);\n offset += valueLen;\n\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else if (isInteger()) {\n if (!lastIndex) return changetype(itoa(LOAD(buffer, 0)));\n\n const valueLen = (sizeof() <= 4 ? 10 : 20) + isSigned();\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n offset += itoa_stream(changetype(result), offset, value);\n if (hasSeparator) {\n copyUnsafeString(result, offset, separator, 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n offset += itoa_stream(changetype(result), offset, value);\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else if (isFloat()) {\n if (!lastIndex) return changetype(dtoa(LOAD(buffer, 0)));\n\n const valueLen = MAX_DOUBLE_LENGTH;\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n offset += dtoa_stream(changetype(result), offset, value);\n if (hasSeparator) {\n copyUnsafeString(result, offset, separator, 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n offset += dtoa_stream(changetype(result), offset, value);\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else if (isString()) {\n if (!lastIndex) return LOAD(buffer, 0);\n\n let estLen = 0;\n for (let i = 0, len = lastIndex + 1; i < len; ++i) {\n estLen += LOAD(buffer, i).length;\n }\n let offset = 0;\n let result = allocateUnsafeString(estLen + sepLen * lastIndex);\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n if (value) {\n let valueLen = value.length; // tslint:disable-line:no-unsafe-any\n copyUnsafeString(result, offset, value, 0, valueLen); // tslint:disable-line:no-unsafe-any\n offset += valueLen; // tslint:disable-line:no-unsafe-any\n }\n if (hasSeparator) {\n copyUnsafeString(result, offset, separator, 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n if (value) {\n let valueLen = value.length; // tslint:disable-line:no-unsafe-any\n copyUnsafeString(result, offset, value, 0, valueLen); // tslint:disable-line:no-unsafe-any\n }\n return result;\n } else if (isArray()) {\n if (!lastIndex) {\n value = LOAD(buffer, 0);\n return value ? value.join(separator) : ""; // tslint:disable-line:no-unsafe-any\n }\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n if (value) result += value.join(separator); // tslint:disable-line:no-unsafe-any\n if (hasSeparator) result += separator;\n }\n value = LOAD(buffer, lastIndex);\n if (value) result += value.join(separator); // tslint:disable-line:no-unsafe-any\n return result;\n } else if (isReference()) { // References\n if (!lastIndex) return "[object Object]";\n const valueLen = 15; // max possible length of element len("[object Object]")\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n if (value) {\n copyUnsafeString(result, offset, changetype("[object Object]"), 0, valueLen);\n offset += valueLen;\n }\n if (hasSeparator) {\n copyUnsafeString(result, offset, changetype(separator), 0, sepLen);\n offset += sepLen;\n }\n }\n if (LOAD(buffer, lastIndex)) {\n copyUnsafeString(result, offset, changetype("[object Object]"), 0, valueLen);\n offset += valueLen;\n }\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else {\n assert(false); // Unsupported generic typename\n }\n }\n\n @inline\n toString(): string {\n return this.join();\n }\n\n private __gc(): void {\n var buffer = this.buffer_;\n __gc_mark(changetype(buffer)); // tslint:disable-line\n if (isManaged()) {\n let offset: usize = 0;\n let end = this.length_ << alignof();\n while (offset < end) {\n __gc_mark(load(changetype(buffer) + offset, HEADER_SIZE)); // tslint:disable-line\n offset += sizeof();\n }\n }\n }\n}\n',arraybuffer:'import {\n HEADER_SIZE,\n MAX_BLENGTH,\n allocateUnsafe\n} from "./internal/arraybuffer";\n\n@sealed\nexport class ArrayBuffer {\n\n readonly byteLength: i32; // capped to [0, MAX_LENGTH]\n\n // @unsafe\n get data(): usize { return changetype(this) + HEADER_SIZE; }\n\n constructor(length: i32, unsafe: bool = false) {\n if (length > MAX_BLENGTH) throw new RangeError("Invalid array buffer length");\n var buffer = allocateUnsafe(length);\n if (!unsafe) memory.fill(changetype(buffer) + HEADER_SIZE, 0, length);\n return buffer;\n }\n\n slice(begin: i32 = 0, end: i32 = MAX_BLENGTH): ArrayBuffer {\n var len = this.byteLength;\n if (begin < 0) begin = max(len + begin, 0);\n else begin = min(begin, len);\n if (end < 0) end = max(len + end, 0);\n else end = min(end, len);\n var newLen = max(end - begin, 0);\n var buffer = allocateUnsafe(newLen);\n memory.copy(changetype(buffer) + HEADER_SIZE, changetype(this) + HEADER_SIZE + begin, newLen);\n return buffer;\n }\n\n toString(): string {\n return "[object ArrayBuffer]";\n }\n}\n',"bindings/Date":"export declare function UTC(\n // NOTE: Using i32 below saves us a f64.convert_s instruction and moves the responsibility for\n // converting the value to the WASM/JS boundary.\n year: i32,\n month: i32,\n day: i32,\n hour: i32,\n minute: i32,\n second: i32,\n millisecond: f64\n): f64;\nexport declare function now(): f64;\n","bindings/Math":"export declare const E: f64;\nexport declare const LN2: f64;\nexport declare const LN10: f64;\nexport declare const LOG2E: f64;\nexport declare const LOG10E: f64;\nexport declare const PI: f64;\nexport declare const SQRT1_2: f64;\nexport declare const SQRT2: f64;\n\nexport declare function abs(x: f64): f64;\nexport declare function acos(x: f64): f64;\nexport declare function acosh(x: f64): f64;\nexport declare function asin(x: f64): f64;\nexport declare function asinh(x: f64): f64;\nexport declare function atan(x: f64): f64;\nexport declare function atan2(y: f64, x: f64): f64;\nexport declare function atanh(x: f64): f64;\nexport declare function cbrt(x: f64): f64;\nexport declare function ceil(x: f64): f64;\nexport declare function clz32(x: f64): f64;\nexport declare function cos(x: f64): f64;\nexport declare function cosh(x: f64): f64;\nexport declare function exp(x: f64): f64;\nexport declare function expm1(x: f64): f64;\nexport declare function floor(x: f64): f64;\nexport declare function fround(x: f64): f32;\nexport declare function hypot(value1: f64, value2: f64): f64; // TODO: rest\nexport declare function imul(a: f64, b: f64): f64;\nexport declare function log(x: f64): f64;\nexport declare function log10(x: f64): f64;\nexport declare function log1p(x: f64): f64;\nexport declare function log2(x: f64): f64;\nexport declare function max(value1: f64, value2: f64): f64; // TODO: rest\nexport declare function min(value1: f64, value2: f64): f64; // TODO: rest\nexport declare function pow(base: f64, exponent: f64): f64;\nexport declare function random(): f64;\nexport declare function round(x: f64): f64;\nexport declare function sign(x: f64): f64;\nexport declare function sin(x: f64): f64;\nexport declare function sinh(x: f64): f64;\nexport declare function sqrt(x: f64): f64;\nexport declare function tan(x: f64): f64;\nexport declare function tanh(x: f64): f64;\nexport declare function trunc(x: f64): f64;\n",builtins:"/* tslint:disable */\n\n@builtin @inline export const NaN: f64 = 0 / 0;\n@builtin @inline export const Infinity: f64 = 1 / 0;\n\n@builtin export declare function isInteger(value?: T): bool;\n@builtin export declare function isFloat(value?: T): bool;\n@builtin export declare function isSigned(value?: T): bool;\n@builtin export declare function isReference(value?: T): bool;\n@builtin export declare function isString(value?: T): bool;\n@builtin export declare function isArray(value?: T): bool;\n@builtin export declare function isDefined(expression: void): bool;\n@builtin export declare function isConstant(expression: void): bool;\n@builtin export declare function isManaged(value?: T): bool;\n@inline export function isNaN(value: T): bool { return value != value; }\n@inline export function isFinite(value: T): bool { return value - value == 0; }\n\n@builtin export declare function clz(value: T): T;\n@builtin export declare function ctz(value: T): T;\n@builtin export declare function popcnt(value: T): T;\n@builtin export declare function rotl(value: T, shift: T): T;\n@builtin export declare function rotr(value: T, shift: T): T;\n@builtin export declare function abs(value: T): T;\n@builtin export declare function max(left: T, right: T): T;\n@builtin export declare function min(left: T, right: T): T;\n@builtin export declare function ceil(value: T): T;\n@builtin export declare function floor(value: T): T;\n@builtin export declare function copysign(left: T, right: T): T;\n@builtin export declare function nearest(value: T): T;\n@builtin export declare function reinterpret(value: void): T;\n@builtin export declare function sqrt(value: T): T;\n@builtin export declare function trunc(value: T): T;\n@builtin export declare function load(offset: usize, constantOffset?: usize): T;\n@builtin export declare function store(offset: usize, value: void, constantOffset?: usize): void;\n@builtin export declare function sizeof(): usize; // | u32 / u64\n@builtin export declare function alignof(): usize; // | u32 / u64\n@builtin export declare function offsetof(fieldName?: string): usize; // | u32 / u64\n@builtin export declare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n@builtin export declare function unreachable(): void;\n@builtin export declare function changetype(value: void): T;\n@builtin export declare function assert(isTrueish: T, message?: string): T;\n@builtin export declare function unchecked(expr: T): T;\n@builtin export declare function call_indirect(target: void, ...args: void[]): T;\n@builtin export declare function instantiate(...args: void[]): T;\n\n@builtin export declare function i8(value: void): i8;\nexport namespace i8 {\n export const MIN_VALUE: i8 = -128;\n export const MAX_VALUE: i8 = 127;\n}\n\n@builtin export declare function i16(value: void): i16;\nexport namespace i16 {\n export const MIN_VALUE: i16 = -32768;\n export const MAX_VALUE: i16 = 32767;\n}\n\n@builtin export declare function i32(value: void): i32;\nexport namespace i32 {\n export const MIN_VALUE: i32 = -2147483648;\n export const MAX_VALUE: i32 = 2147483647;\n @builtin export declare function clz(value: i32): i32;\n @builtin export declare function ctz(value: i32): i32;\n @builtin export declare function popcnt(value: i32): i32;\n @builtin export declare function rotl(value: i32, shift: i32): i32;\n @builtin export declare function rotr(value: i32, shift: i32): i32;\n @builtin export declare function reinterpret_f32(value: f32): i32;\n @builtin export declare function load8_s(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load8_u(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load16_s(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load16_u(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function store8(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function store16(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function store(offset: usize, value: i32, constantOffset?: usize): void;\n}\n\n@builtin export declare function i64(value: void): i64;\nexport namespace i64 {\n export const MIN_VALUE: i64 = -9223372036854775808;\n export const MAX_VALUE: i64 = 9223372036854775807;\n @builtin export declare function clz(value: i64): i64;\n @builtin export declare function ctz(value: i64): i64;\n @builtin export declare function load8_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load8_u(offset: usize, constantOffset?: usize): u64;\n @builtin export declare function load16_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load16_u(offset: usize, constantOffset?: usize): u64;\n @builtin export declare function load32_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load32_u(offset: usize, constantOffset?: usize): u64;\n @builtin export declare function load(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function popcnt(value: i64): i64;\n @builtin export declare function rotl(value: i64, shift: i64): i64;\n @builtin export declare function rotr(value: i64, shift: i64): i64;\n @builtin export declare function reinterpret_f64(value: f64): i64;\n @builtin export declare function store8(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store16(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store32(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store(offset: usize, value: i64, constantOffset?: usize): void;\n}\n\n@builtin export declare function isize(value: void): isize;\nexport namespace isize {\n export const MIN_VALUE: isize = sizeof() == sizeof()\n ? -2147483648\n : -9223372036854775808;\n export const MAX_VALUE: isize = sizeof() == sizeof()\n ? 2147483647\n : 9223372036854775807;\n}\n\n@builtin export declare function u8(value: void): u8;\nexport namespace u8 {\n export const MIN_VALUE: u8 = 0;\n export const MAX_VALUE: u8 = 255;\n}\n\n@builtin export declare function u16(value: void): u16;\nexport namespace u16 {\n export const MIN_VALUE: u16 = 0;\n export const MAX_VALUE: u16 = 65535;\n}\n\n@builtin export declare function u32(value: void): u32;\nexport namespace u32 {\n export const MIN_VALUE: u32 = 0;\n export const MAX_VALUE: u32 = 4294967295;\n}\n\n@builtin export declare function u64(value: void): u64;\nexport namespace u64 {\n export const MIN_VALUE: u64 = 0;\n export const MAX_VALUE: u64 = 18446744073709551615;\n}\n\n@builtin export declare function usize(value: void): usize;\nexport namespace usize {\n export const MIN_VALUE: usize = 0;\n export const MAX_VALUE: usize = sizeof() == sizeof()\n ? 4294967295\n : 18446744073709551615;\n}\n\n@builtin export declare function bool(value: void): bool;\nexport namespace bool {\n export const MIN_VALUE: bool = false;\n export const MAX_VALUE: bool = true;\n}\n\n@builtin export declare function f32(value: void): f32;\nexport namespace f32 {\n export const EPSILON = reinterpret(0x34000000); // 0x1p-23f\n export const MIN_VALUE = reinterpret(0x00000001); // 0x0.000001p+0f\n export const MAX_VALUE = reinterpret(0x7F7FFFFF); // 0x1.fffffep+127f\n export const MIN_NORMAL_VALUE = reinterpret(0x00800000); // 0x1p-126f\n export const MIN_SAFE_INTEGER: f32 = -16777215;\n export const MAX_SAFE_INTEGER: f32 = 16777215;\n @builtin export declare function abs(value: f32): f32;\n @builtin export declare function ceil(value: f32): f32;\n @builtin export declare function copysign(x: f32, y: f32): f32;\n @builtin export declare function floor(value: f32): f32;\n @builtin export declare function load(offset: usize, constantOffset?: usize): f32;\n @builtin export declare function max(left: f32, right: f32): f32;\n @builtin export declare function min(left: f32, right: f32): f32;\n @builtin export declare function nearest(value: f32): f32;\n @builtin export declare function reinterpret_i32(value: i32): f32;\n @builtin export declare function sqrt(value: f32): f32;\n @builtin export declare function store(offset: usize, value: f32, constantOffset?: usize): void;\n @builtin export declare function trunc(value: f32): f32;\n}\n\n@builtin export declare function f64(value: void): f64;\nexport namespace f64 {\n export const EPSILON = reinterpret(0x3CB0000000000000); // 0x1p-52\n export const MIN_VALUE = reinterpret(0x0000000000000001); // 0x0.0000000000001p+0\n export const MAX_VALUE = reinterpret(0x7FEFFFFFFFFFFFFF); // 0x1.fffffffffffffp+1023\n export const MIN_NORMAL_VALUE = reinterpret(0x0010000000000000); // 0x1p-1022\n export const MIN_SAFE_INTEGER: f64 = -9007199254740991;\n export const MAX_SAFE_INTEGER: f64 = 9007199254740991;\n @builtin export declare function abs(value: f64): f64;\n @builtin export declare function ceil(value: f64): f64;\n @builtin export declare function copysign(x: f64, y: f64): f64;\n @builtin export declare function floor(value: f64): f64;\n @builtin export declare function load(offset: usize, constantOffset?: usize): f64;\n @builtin export declare function max(left: f64, right: f64): f64;\n @builtin export declare function min(left: f64, right: f64): f64;\n @builtin export declare function nearest(value: f64): f64;\n @builtin export declare function reinterpret_i64(value: i64): f64;\n @builtin export declare function sqrt(value: f64): f64;\n @builtin export declare function store(offset: usize, value: f64, constantOffset?: usize): void;\n @builtin export declare function trunc(value: f64): f64;\n}\n\n@builtin export declare function start(): void;\n\n@builtin export function NATIVE_CODE(): void { unreachable(); }\n","collector/itcm":'/**\n * Incremental Tri-Color-Marking Garbage Collector.\n *\n * @module std/assembly/collector/itcm\n *//***/\n\n// Largely based on Bach Le\'s μgc, see: https://github.com/bullno1/ugc\n\nconst TRACE = false;\n\n/** Size of a managed object header. */\nexport const HEADER_SIZE: usize = (offsetof() + AL_MASK) & ~AL_MASK;\n\nimport { AL_MASK, MAX_SIZE_32 } from "../internal/allocator";\nimport { iterateRoots } from "../gc";\n\n/** Collector states. */\nconst enum State {\n /** Not yet initialized. */\n INIT = 0,\n /** Currently transitioning from SWEEP to MARK state. */\n IDLE = 1,\n /** Currently marking reachable objects. */\n MARK = 2,\n /** Currently sweeping unreachable objects. */\n SWEEP = 3\n}\n\n/** Current collector state. */\nvar state = State.INIT;\n/** Current white color value. */\nvar white = 0;\n\n// From and to spaces\nvar fromSpace: ManagedObjectList;\nvar toSpace: ManagedObjectList;\nvar iter: ManagedObject;\n\n// ╒═══════════════ Managed object layout (32-bit) ════════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┼─┼─┴─┤ ┐\n// │ next │0│ C │ ◄─┐ = nextWithColor\n// ├─────────────────────────────────────────────────────────┴─┴───┤ │ usize\n// │ prev │ ◄─┘\n// ├───────────────────────────────────────────────────────────────┤\n// │ hookFn │\n// ╞═══════════════════════════════════════════════════════════════╡ SIZE ┘ ◄─ user-space reference\n// │ ... data ... │\n// └───────────────────────────────────────────────────────────────┘\n// C: color\n\n/** Represents a managed object in memory, consisting of a header followed by the object\'s data. */\n@unmanaged class ManagedObject {\n\n /** Pointer to the next object with color flags stored in the alignment bits. */\n nextWithColor: usize;\n\n /** Pointer to the previous object. */\n prev: ManagedObject;\n\n /** Class-specific hook function called with the user-space reference. */\n hookFn: (ref: usize) => void;\n\n /** Gets the pointer to the next object. */\n get next(): ManagedObject {\n return changetype(this.nextWithColor & ~3);\n }\n\n /** Sets the pointer to the next object. */\n set next(obj: ManagedObject) {\n this.nextWithColor = changetype(obj) | (this.nextWithColor & 3);\n }\n\n /** Gets this object\'s color. */\n get color(): i32 {\n return this.nextWithColor & 3;\n }\n\n /** Sets this object\'s color. */\n set color(color: i32) {\n this.nextWithColor = (this.nextWithColor & ~3) | color;\n }\n\n /** Unlinks this object from its list. */\n unlink(): void {\n var next = this.next;\n var prev = this.prev;\n if (TRACE) trace(" unlink", 3, objToRef(prev), objToRef(this), objToRef(next));\n next.prev = prev;\n prev.next = next;\n }\n\n /** Marks this object as gray, that is reachable with unscanned children. */\n makeGray(): void {\n if (TRACE) trace(" makeGray", 1, objToRef(this));\n const gray = 2;\n if (this == iter) iter = this.prev;\n this.unlink();\n toSpace.push(this);\n this.nextWithColor = (this.nextWithColor & ~3) | gray;\n }\n}\n\n/** A list of managed objects. Used for the from and to spaces. */\n@unmanaged class ManagedObjectList extends ManagedObject {\n\n /** Inserts an object. */\n push(obj: ManagedObject): void {\n var prev = this.prev;\n if (TRACE) trace(" push", 3, objToRef(prev), objToRef(obj), objToRef(this));\n obj.next = this;\n obj.prev = prev;\n prev.next = obj;\n this.prev = obj;\n }\n\n /** Clears this list. */\n clear(): void {\n if (TRACE) trace(" clear", 1, objToRef(this));\n this.nextWithColor = changetype(this);\n this.prev = this;\n }\n}\n\n/** Performs a single step according to the current state. */\nfunction step(): void {\n var obj: ManagedObject;\n switch (state) {\n case State.INIT: {\n if (TRACE) trace("gc~step/INIT");\n fromSpace = changetype(memory.allocate(HEADER_SIZE));\n fromSpace.hookFn = changetype<(ref: usize) => void>(-1); // would error\n fromSpace.clear();\n toSpace = changetype(memory.allocate(HEADER_SIZE));\n toSpace.hookFn = changetype<(ref: usize) => void>(-1); // would error\n toSpace.clear();\n iter = toSpace;\n state = State.IDLE;\n if (TRACE) trace("gc~state = IDLE");\n // fall-through\n }\n case State.IDLE: {\n if (TRACE) trace("gc~step/IDLE");\n iterateRoots(__gc_mark);\n state = State.MARK;\n if (TRACE) trace("gc~state = MARK");\n break;\n }\n case State.MARK: {\n obj = iter.next;\n if (obj !== toSpace) {\n if (TRACE) trace("gc~step/MARK iterate", 1, objToRef(obj));\n iter = obj;\n obj.color = !white;\n // if (TRACE) {\n // trace(" next/prev/hook", 3,\n // changetype(obj.next),\n // changetype(obj.prev),\n // changetype(obj.hookFn)\n // );\n // }\n obj.hookFn(objToRef(obj));\n } else {\n if (TRACE) trace("gc~step/MARK finish");\n iterateRoots(__gc_mark);\n obj = iter.next;\n if (obj === toSpace) {\n let from = fromSpace;\n fromSpace = toSpace;\n toSpace = from;\n white = !white;\n iter = from.next;\n state = State.SWEEP;\n if (TRACE) trace("gc~state = SWEEP");\n }\n }\n break;\n }\n case State.SWEEP: {\n obj = iter;\n if (obj !== toSpace) {\n if (TRACE) trace("gc~step/SWEEP free", 1, objToRef(obj));\n iter = obj.next;\n if (changetype(obj) >= HEAP_BASE) memory.free(changetype(obj));\n } else {\n if (TRACE) trace("gc~step/SWEEP finish");\n toSpace.clear();\n state = State.IDLE;\n if (TRACE) trace("gc~state = IDLE");\n }\n break;\n }\n }\n}\n\n@inline function refToObj(ref: usize): ManagedObject {\n return changetype(ref - HEADER_SIZE);\n}\n\n@inline function objToRef(obj: ManagedObject): usize {\n return changetype(obj) + HEADER_SIZE;\n}\n\n// Garbage collector interface\n\n@global export function __gc_allocate(\n size: usize,\n markFn: (ref: usize) => void\n): usize {\n if (TRACE) trace("gc.allocate", 1, size);\n if (size > MAX_SIZE_32 - HEADER_SIZE) unreachable();\n step(); // also makes sure it\'s initialized\n var obj = changetype(memory.allocate(HEADER_SIZE + size));\n obj.hookFn = markFn;\n obj.color = white;\n fromSpace.push(obj);\n return objToRef(obj);\n}\n\n@global export function __gc_link(parentRef: usize, childRef: usize): void {\n if (TRACE) trace("gc.link", 2, parentRef, childRef);\n var parent = refToObj(parentRef);\n if (parent.color == !white && refToObj(childRef).color == white) parent.makeGray();\n}\n\n@global export function __gc_mark(ref: usize): void {\n if (TRACE) trace("gc.mark", 1, ref);\n if (ref) {\n let obj = refToObj(ref);\n if (obj.color == white) obj.makeGray();\n }\n}\n\n@global export function __gc_collect(): void {\n if (TRACE) trace("gc.collect");\n // begin collecting if not yet collecting\n switch (state) {\n case State.INIT:\n case State.IDLE: step();\n }\n // finish the cycle\n while (state != State.IDLE) step();\n}\n',dataview:'import {\n HEADER_SIZE,\n MAX_BLENGTH\n} from "./internal/arraybuffer";\n\nexport class DataView {\n\n constructor(\n readonly buffer: ArrayBuffer,\n readonly byteOffset: i32 = 0,\n readonly byteLength: i32 = i32.MIN_VALUE // FIXME\n ) {\n if (byteLength === i32.MIN_VALUE) byteLength = buffer.byteLength - byteOffset; // FIXME\n if (byteOffset > MAX_BLENGTH) throw new RangeError("Invalid byteOffset");\n if (byteLength > MAX_BLENGTH) throw new RangeError("Invalid byteLength");\n if (byteOffset + byteLength > buffer.byteLength) throw new RangeError("Invalid length");\n }\n\n getFloat32(byteOffset: i32, littleEndian: boolean = false): f32 {\n checkOffset(byteOffset, 4, this.byteLength);\n return littleEndian\n ? load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n : reinterpret(\n bswap(\n load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n )\n );\n }\n\n getFloat64(byteOffset: i32, littleEndian: boolean = false): f64 {\n checkOffset(byteOffset, 8, this.byteLength);\n return littleEndian\n ? load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n : reinterpret(\n bswap(\n load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n )\n );\n }\n\n getInt8(byteOffset: i32): i8 {\n checkOffset(byteOffset, 1, this.byteLength);\n return load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n }\n\n getInt16(byteOffset: i32, littleEndian: boolean = false): i16 {\n checkOffset(byteOffset, 2, this.byteLength);\n var result: i16 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getInt32(byteOffset: i32, littleEndian: boolean = false): i32 {\n checkOffset(byteOffset, 4, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getUint8(byteOffset: i32): u8 {\n checkOffset(byteOffset, 1, this.byteLength);\n return load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n }\n\n getUint16(byteOffset: i32, littleEndian: boolean = false): u16 {\n checkOffset(byteOffset, 2, this.byteLength);\n var result: u16 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getUint32(byteOffset: i32, littleEndian: boolean = false): u32 {\n checkOffset(byteOffset, 4, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n setFloat32(byteOffset: i32, value: f32, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 4, this.byteLength);\n if (littleEndian) {\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n } else {\n store(changetype(this.buffer) + this.byteOffset + byteOffset,\n bswap(\n reinterpret(value)\n ),\n HEADER_SIZE\n );\n }\n }\n\n setFloat64(byteOffset: i32, value: f64, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 8, this.byteLength);\n if (littleEndian) {\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n } else {\n store(changetype(this.buffer) + this.byteOffset + byteOffset,\n bswap(\n reinterpret(value)\n ),\n HEADER_SIZE\n );\n }\n }\n\n setInt8(byteOffset: i32, value: i8): void {\n checkOffset(byteOffset, 1, this.byteLength);\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n }\n\n setInt16(byteOffset: i32, value: i16, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 2, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setInt32(byteOffset: i32, value: i32, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 4, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setUint8(byteOffset: i32, value: u8): void {\n checkOffset(byteOffset, 1, this.byteLength);\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n }\n\n setUint16(byteOffset: i32, value: u16, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 2, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setUint32(byteOffset: i32, value: u32, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 4, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n // Non-standard additions that make sense in WebAssembly, but won\'t work in JS:\n\n getInt64(byteOffset: i32, littleEndian: boolean = false): i64 {\n checkOffset(byteOffset, 8, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getUint64(byteOffset: i32, littleEndian: boolean = false): u64 {\n checkOffset(byteOffset, 8, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n setInt64(byteOffset: i32, value: i64, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 8, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setUint64(byteOffset: i32, value: u64, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 8, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n toString(): string {\n return "[object DataView]";\n }\n}\n\n@inline function checkOffset(byteOffset: i32, n: i32, byteLength: i32): void {\n // n and byteLength must be known to be in bounds\n if (byteOffset > MAX_BLENGTH || byteOffset + n > byteLength) throw new Error("Offset out of bounds");\n}\n',date:'import {\n UTC as Date_UTC,\n now as Date_now\n} from "./bindings/Date";\n\nexport class Date {\n\n @inline static UTC(\n year: i32,\n month: i32 = 0,\n day: i32 = 1,\n hour: i32 = 0,\n minute: i32 = 0,\n second: i32 = 0,\n millisecond: i64 = 0\n ): i64 {\n return Date_UTC(year, month, day, hour, minute, second, millisecond);\n }\n\n @inline static now(): i64 {\n return Date_now();\n }\n\n private value: i64;\n\n constructor(value: i64) {\n this.value = value;\n }\n\n getTime(): i64 {\n return this.value;\n }\n\n setTime(value: i64): i64 {\n this.value = value;\n return value;\n }\n}\n',diagnostics:"/* tslint:disable */\n\n@builtin export declare function ERROR(message?: void): void;\n@builtin export declare function WARNING(message?: void): void;\n@builtin export declare function INFO(message?: void): void;\n",env:"declare function abort(\n message?: string | null,\n fileName?: string | null,\n lineNumber?: u32,\n columnNumber?: u32\n): void;\n\ndeclare function trace(\n message: string,\n n?: i32,\n a0?: f64,\n a1?: f64,\n a2?: f64,\n a3?: f64,\n a4?: f64\n): void;\n",error:'export class Error {\n\n name: string = "Error";\n stack: string = ""; // TODO\n\n constructor(\n public message: string = ""\n ) {}\n\n toString(): string {\n var message = this.message;\n return message.length\n ? this.name + ": " + message\n : this.name;\n }\n}\n\nexport class RangeError extends Error {\n constructor(message: string = "") {\n super(message);\n this.name = "RangeError";\n }\n}\n\nexport class TypeError extends Error {\n constructor(message: string = "") {\n super(message);\n this.name = "TypeError";\n }\n}\n\nexport class SyntaxError extends Error {\n constructor(message: string = "") {\n super(message);\n this.name = "SyntaxError";\n }\n}\n',gc:"/* tslint:disable */\n\n@builtin export declare function iterateRoots(fn: (ref: usize) => void): void;\n\nexport namespace gc {\n\n export function collect(): void {\n if (isDefined(__gc_collect)) { __gc_collect(); return; }\n WARNING(\"Calling 'gc.collect' requires a garbage collector to be present.\");\n unreachable();\n }\n}\n","internal/allocator":"/** Number of alignment bits. */\nexport const AL_BITS: u32 = 3;\n/** Number of possible alignment values. */\nexport const AL_SIZE: usize = 1 << AL_BITS;\n/** Mask to obtain just the alignment bits. */\nexport const AL_MASK: usize = AL_SIZE - 1;\n/** Maximum 32-bit allocation size. */\nexport const MAX_SIZE_32: usize = 1 << 30; // 1GB\n","internal/arraybuffer":'import {\n AL_MASK,\n MAX_SIZE_32\n } from "./allocator";\n\n/** Size of an ArrayBuffer header. */\nexport const HEADER_SIZE: usize = (offsetof() + AL_MASK) & ~AL_MASK;\n/** Maximum byte length of an ArrayBuffer. */\nexport const MAX_BLENGTH: i32 = MAX_SIZE_32 - HEADER_SIZE;\n\nfunction computeSize(byteLength: i32): usize {\n // round up to power of 2, with HEADER_SIZE=8:\n // 0 -> 2^3 = 8\n // 1..8 -> 2^4 = 16\n // 9..24 -> 2^5 = 32\n // ...\n // MAX_LENGTH -> 2^30 = 0x40000000 (MAX_SIZE_32)\n return 1 << (32 - clz(byteLength + HEADER_SIZE - 1));\n}\n\n// Low-level utility\n\nfunction __gc(ref: usize): void {}\n\nexport function allocateUnsafe(byteLength: i32): ArrayBuffer {\n assert(byteLength <= MAX_BLENGTH);\n var buffer: usize;\n if (isManaged()) {\n buffer = __gc_allocate(computeSize(byteLength), __gc); // tslint:disable-line\n } else {\n buffer = memory.allocate(computeSize(byteLength));\n }\n store(buffer, byteLength, offsetof("byteLength"));\n return changetype(buffer);\n}\n\nexport function reallocateUnsafe(buffer: ArrayBuffer, newByteLength: i32): ArrayBuffer {\n var oldByteLength = buffer.byteLength;\n if (newByteLength > oldByteLength) {\n assert(newByteLength <= MAX_BLENGTH);\n if (newByteLength <= (computeSize(oldByteLength) - HEADER_SIZE)) { // fast path: zero out additional space\n store(changetype(buffer), newByteLength, offsetof("byteLength"));\n } else { // slow path: copy to new buffer\n let newBuffer = allocateUnsafe(newByteLength);\n memory.copy(\n changetype(newBuffer) + HEADER_SIZE,\n changetype(buffer) + HEADER_SIZE,\n oldByteLength\n );\n if (!isManaged()) {\n memory.free(changetype(buffer));\n }\n buffer = newBuffer;\n }\n memory.fill(\n changetype(buffer) + HEADER_SIZE + oldByteLength,\n 0,\n (newByteLength - oldByteLength)\n );\n } else if (newByteLength < oldByteLength) { // fast path: override size\n // TBD: worth to copy and release if size is significantly less than before?\n assert(newByteLength >= 0);\n store(changetype(buffer), newByteLength, offsetof("byteLength"));\n }\n return buffer;\n}\n\n// The helpers below use two different types in order to emit loads and stores that load respectively\n// store one type to/from memory while returning/taking the desired output/input type. This allows to\n// emit instructions like\n//\n// * `i32.load8` ^= `load(...)` that reads an i8 but returns an i32, or\n// * `i64.load32_s` ^= `load(...)`) that reads a 32-bit as a 64-bit integer\n//\n// without having to emit an additional instruction for conversion purposes. The second parameter\n// can be omitted for references and other loads and stores that simply return the exact type.\n\n@inline export function LOAD(buffer: ArrayBuffer, index: i32, byteOffset: i32 = 0): TOut {\n return load(changetype(buffer) + (index << alignof()) + byteOffset, HEADER_SIZE);\n}\n\n@inline export function STORE(buffer: ArrayBuffer, index: i32, value: TIn, byteOffset: i32 = 0): void {\n store(changetype(buffer) + (index << alignof()) + byteOffset, value, HEADER_SIZE);\n}\n',"internal/hash":'import {\n HEADER_SIZE\n} from "./string";\n\n/** Computes the 32-bit hash of a value of any type. */\n@inline\nexport function HASH(key: T): u32 {\n // branch-level tree-shaking makes this a `(return (call ...))`\n if (isString(key)) {\n return hashStr(key);\n } else if (isReference()) {\n if (sizeof() == 4) return hash32(changetype(key));\n if (sizeof() == 8) return hash64(changetype(key));\n } else if (isFloat()) {\n if (sizeof() == 4) return hash32(reinterpret(key));\n if (sizeof() == 8) return hash64(reinterpret(key));\n } else {\n if (sizeof() == 1) return hash8 (key);\n if (sizeof() == 2) return hash16(key);\n if (sizeof() == 4) return hash32(key);\n if (sizeof() == 8) return hash64(key);\n }\n unreachable();\n}\n\n// FNV-1a 32-bit as a starting point, see: http://isthe.com/chongo/tech/comp/fnv/\n\nconst FNV_OFFSET: u32 = 2166136261;\nconst FNV_PRIME: u32 = 16777619;\n\nfunction hash8(key: u32): u32 {\n return (FNV_OFFSET ^ key) * FNV_PRIME;\n}\n\nfunction hash16(key: u32): u32 {\n var v = FNV_OFFSET;\n v = (v ^ ( key & 0xff)) * FNV_PRIME;\n v = (v ^ ( key >> 8 )) * FNV_PRIME;\n return v;\n}\n\nfunction hash32(key: u32): u32 {\n var v = FNV_OFFSET;\n v = (v ^ ( key & 0xff)) * FNV_PRIME;\n v = (v ^ ((key >> 8) & 0xff)) * FNV_PRIME;\n v = (v ^ ((key >> 16) & 0xff)) * FNV_PRIME;\n v = (v ^ ( key >> 24 )) * FNV_PRIME;\n return v;\n}\n\nfunction hash64(key: u64): u32 {\n var l = key;\n var h = (key >>> 32);\n var v = FNV_OFFSET;\n v = (v ^ ( l & 0xff)) * FNV_PRIME;\n v = (v ^ ((l >> 8) & 0xff)) * FNV_PRIME;\n v = (v ^ ((l >> 16) & 0xff)) * FNV_PRIME;\n v = (v ^ ( l >> 24 )) * FNV_PRIME;\n v = (v ^ ( h & 0xff)) * FNV_PRIME;\n v = (v ^ ((h >> 8) & 0xff)) * FNV_PRIME;\n v = (v ^ ((h >> 16) & 0xff)) * FNV_PRIME;\n v = (v ^ ( h >> 24 )) * FNV_PRIME;\n return v;\n}\n\nfunction hashStr(key: string): u32 {\n var v = FNV_OFFSET;\n for (let i: usize = 0, k: usize = key.length << 1; i < k; ++i) {\n v = (v ^ load(changetype(key) + i, HEADER_SIZE)) * FNV_PRIME;\n }\n return v;\n}\n',"internal/memory":"// this function will go away once `memory.copy` becomes an intrinsic\nexport function memcpy(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memcpy.c\n var w: u32, x: u32;\n\n // copy 1 byte each until src is aligned to 4 bytes\n while (n && (src & 3)) {\n store(dest++, load(src++));\n n--;\n }\n\n // if dst is aligned to 4 bytes as well, copy 4 bytes each\n if ((dest & 3) == 0) {\n while (n >= 16) {\n store(dest , load(src ));\n store(dest + 4, load(src + 4));\n store(dest + 8, load(src + 8));\n store(dest + 12, load(src + 12));\n src += 16; dest += 16; n -= 16;\n }\n if (n & 8) {\n store(dest , load(src ));\n store(dest + 4, load(src + 4));\n dest += 8; src += 8;\n }\n if (n & 4) {\n store(dest, load(src));\n dest += 4; src += 4;\n }\n if (n & 2) { // drop to 2 bytes each\n store(dest, load(src));\n dest += 2; src += 2;\n }\n if (n & 1) { // drop to 1 byte\n store(dest++, load(src++));\n }\n return;\n }\n\n // if dst is not aligned to 4 bytes, use alternating shifts to copy 4 bytes each\n // doing shifts if faster when copying enough bytes (here: 32 or more)\n if (n >= 32) {\n switch (dest & 3) {\n // known to be != 0\n case 1: {\n w = load(src);\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n n -= 3;\n while (n >= 17) {\n x = load(src + 1);\n store(dest, w >> 24 | x << 8);\n w = load(src + 5);\n store(dest + 4, x >> 24 | w << 8);\n x = load(src + 9);\n store(dest + 8, w >> 24 | x << 8);\n w = load(src + 13);\n store(dest + 12, x >> 24 | w << 8);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n case 2: {\n w = load(src);\n store(dest++, load(src++));\n store(dest++, load(src++));\n n -= 2;\n while (n >= 18) {\n x = load(src + 2);\n store(dest, w >> 16 | x << 16);\n w = load(src + 6);\n store(dest + 4, x >> 16 | w << 16);\n x = load(src + 10);\n store(dest + 8, w >> 16 | x << 16);\n w = load(src + 14);\n store(dest + 12, x >> 16 | w << 16);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n case 3: {\n w = load(src);\n store(dest++, load(src++));\n n -= 1;\n while (n >= 19) {\n x = load(src + 3);\n store(dest, w >> 8 | x << 24);\n w = load(src + 7);\n store(dest + 4, x >> 8 | w << 24);\n x = load(src + 11);\n store(dest + 8, w >> 8 | x << 24);\n w = load(src + 15);\n store(dest + 12, x >> 8 | w << 24);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n }\n }\n\n // copy remaining bytes one by one\n if (n & 16) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 8) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 4) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 2) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 1) {\n store(dest++, load(src++));\n }\n}\n\n// this function will go away once `memory.copy` becomes an intrinsic\nexport function memmove(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memmove.c\n if (dest === src) return;\n if (src + n <= dest || dest + n <= src) {\n memcpy(dest, src, n);\n return;\n }\n if (dest < src) {\n if ((src & 7) == (dest & 7)) {\n while (dest & 7) {\n if (!n) return;\n --n;\n store(dest++, load(src++));\n }\n while (n >= 8) {\n store(dest, load(src));\n n -= 8;\n dest += 8;\n src += 8;\n }\n }\n while (n) {\n store(dest++, load(src++));\n --n;\n }\n } else {\n if ((src & 7) == (dest & 7)) {\n while ((dest + n) & 7) {\n if (!n) return;\n store(dest + --n, load(src + n));\n }\n while (n >= 8) {\n n -= 8;\n store(dest + n, load(src + n));\n }\n }\n while (n) {\n store(dest + --n, load(src + n));\n }\n }\n}\n\n// this function will go away once `memory.fill` becomes an intrinsic\nexport function memset(dest: usize, c: u8, n: usize): void { // see: musl/src/string/memset\n\n // fill head and tail with minimal branching\n if (!n) return;\n store(dest, c);\n store(dest + n - 1, c);\n if (n <= 2) return;\n\n store(dest + 1, c);\n store(dest + 2, c);\n store(dest + n - 2, c);\n store(dest + n - 3, c);\n if (n <= 6) return;\n store(dest + 3, c);\n store(dest + n - 4, c);\n if (n <= 8) return;\n\n // advance pointer to align it at 4-byte boundary\n var k: usize = -dest & 3;\n dest += k;\n n -= k;\n n &= -4;\n\n var c32: u32 = -1 / 255 * c;\n\n // fill head/tail up to 28 bytes each in preparation\n store(dest, c32);\n store(dest + n - 4, c32);\n if (n <= 8) return;\n store(dest + 4, c32);\n store(dest + 8, c32);\n store(dest + n - 12, c32);\n store(dest + n - 8, c32);\n if (n <= 24) return;\n store(dest + 12, c32);\n store(dest + 16, c32);\n store(dest + 20, c32);\n store(dest + 24, c32);\n store(dest + n - 28, c32);\n store(dest + n - 24, c32);\n store(dest + n - 20, c32);\n store(dest + n - 16, c32);\n\n // align to a multiple of 8\n k = 24 + (dest & 4);\n dest += k;\n n -= k;\n\n // copy 32 bytes each\n var c64: u64 = c32 | (c32 << 32);\n while (n >= 32) {\n store(dest, c64);\n store(dest + 8, c64);\n store(dest + 16, c64);\n store(dest + 24, c64);\n n -= 32;\n dest += 32;\n }\n}\n\nexport function memcmp(vl: usize, vr: usize, n: usize): i32 { // see: musl/src/string/memcmp.c\n if (vl == vr) return 0;\n while (n != 0 && load(vl) == load(vr)) {\n n--; vl++; vr++;\n }\n return n ? load(vl) - load(vr) : 0;\n}\n","internal/number":'\nimport {\n CharCode,\n allocateUnsafe as allocateUnsafeString,\n freeUnsafe as freeUnsafeString,\n HEADER_SIZE as STRING_HEADER_SIZE\n} from "./string";\n\nimport {\n LOAD\n} from "./arraybuffer";\n\nexport const MAX_DOUBLE_LENGTH = 28;\n\n@inline\nexport function POWERS10(): u32[] {\n const table: u32[] = [\n 1,\n 10,\n 100,\n 1000,\n 10000,\n 100000,\n 1000000,\n 10000000,\n 100000000,\n 1000000000\n ];\n return table; // inlines to a constant memory offset\n}\n\n/*\n Lookup table for pairwise char codes in range [0-99]\n\n "00", "01", "02", "03", "04", "05", "06", "07", "08", "09",\n "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",\n "20", "21", "22", "23", "24", "25", "26", "27", "28", "29",\n "30", "31", "32", "33", "34", "35", "36", "37", "38", "39",\n "40", "41", "42", "43", "44", "45", "46", "47", "48", "49",\n "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",\n "60", "61", "62", "63", "64", "65", "66", "67", "68", "69",\n "70", "71", "72", "73", "74", "75", "76", "77", "78", "79",\n "80", "81", "82", "83", "84", "85", "86", "87", "88", "89",\n "90", "91", "92", "93", "94", "95", "96", "97", "98", "99"\n*/\n@inline\nexport function DIGITS(): u32[] {\n const table: u32[] = [\n 0x00300030, 0x00310030, 0x00320030, 0x00330030, 0x00340030,\n 0x00350030, 0x00360030, 0x00370030, 0x00380030, 0x00390030,\n 0x00300031, 0x00310031, 0x00320031, 0x00330031, 0x00340031,\n 0x00350031, 0x00360031, 0x00370031, 0x00380031, 0x00390031,\n 0x00300032, 0x00310032, 0x00320032, 0x00330032, 0x00340032,\n 0x00350032, 0x00360032, 0x00370032, 0x00380032, 0x00390032,\n 0x00300033, 0x00310033, 0x00320033, 0x00330033, 0x00340033,\n 0x00350033, 0x00360033, 0x00370033, 0x00380033, 0x00390033,\n 0x00300034, 0x00310034, 0x00320034, 0x00330034, 0x00340034,\n 0x00350034, 0x00360034, 0x00370034, 0x00380034, 0x00390034,\n 0x00300035, 0x00310035, 0x00320035, 0x00330035, 0x00340035,\n 0x00350035, 0x00360035, 0x00370035, 0x00380035, 0x00390035,\n 0x00300036, 0x00310036, 0x00320036, 0x00330036, 0x00340036,\n 0x00350036, 0x00360036, 0x00370036, 0x00380036, 0x00390036,\n 0x00300037, 0x00310037, 0x00320037, 0x00330037, 0x00340037,\n 0x00350037, 0x00360037, 0x00370037, 0x00380037, 0x00390037,\n 0x00300038, 0x00310038, 0x00320038, 0x00330038, 0x00340038,\n 0x00350038, 0x00360038, 0x00370038, 0x00380038, 0x00390038,\n 0x00300039, 0x00310039, 0x00320039, 0x00330039, 0x00340039,\n 0x00350039, 0x00360039, 0x00370039, 0x00380039, 0x00390039\n ];\n return table; // inlines to a constant memory offset\n}\n\n@inline\nfunction EXP_POWERS(): i16[] {\n const table: i16[] = [\n -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980,\n -954, -927, -901, -874, -847, -821, -794, -768, -741, -715,\n -688, -661, -635, -608, -582, -555, -529, -502, -475, -449,\n -422, -396, -369, -343, -316, -289, -263, -236, -210, -183,\n -157, -130, -103, -77, -50, -24, 3, 30, 56, 83,\n 109, 136, 162, 189, 216, 242, 269, 295, 322, 348,\n 375, 402, 428, 455, 481, 508, 534, 561, 588, 614,\n 641, 667, 694, 720, 747, 774, 800, 827, 853, 880,\n 907, 933, 960, 986, 1013, 1039, 1066\n ];\n return table;\n}\n\n// 1e-348, 1e-340, ..., 1e340\n@inline\nfunction FRC_POWERS(): u64[] {\n const table: u64[] = [\n 0xFA8FD5A0081C0288, 0xBAAEE17FA23EBF76, 0x8B16FB203055AC76, 0xCF42894A5DCE35EA,\n 0x9A6BB0AA55653B2D, 0xE61ACF033D1A45DF, 0xAB70FE17C79AC6CA, 0xFF77B1FCBEBCDC4F,\n 0xBE5691EF416BD60C, 0x8DD01FAD907FFC3C, 0xD3515C2831559A83, 0x9D71AC8FADA6C9B5,\n 0xEA9C227723EE8BCB, 0xAECC49914078536D, 0x823C12795DB6CE57, 0xC21094364DFB5637,\n 0x9096EA6F3848984F, 0xD77485CB25823AC7, 0xA086CFCD97BF97F4, 0xEF340A98172AACE5,\n 0xB23867FB2A35B28E, 0x84C8D4DFD2C63F3B, 0xC5DD44271AD3CDBA, 0x936B9FCEBB25C996,\n 0xDBAC6C247D62A584, 0xA3AB66580D5FDAF6, 0xF3E2F893DEC3F126, 0xB5B5ADA8AAFF80B8,\n 0x87625F056C7C4A8B, 0xC9BCFF6034C13053, 0x964E858C91BA2655, 0xDFF9772470297EBD,\n 0xA6DFBD9FB8E5B88F, 0xF8A95FCF88747D94, 0xB94470938FA89BCF, 0x8A08F0F8BF0F156B,\n 0xCDB02555653131B6, 0x993FE2C6D07B7FAC, 0xE45C10C42A2B3B06, 0xAA242499697392D3,\n 0xFD87B5F28300CA0E, 0xBCE5086492111AEB, 0x8CBCCC096F5088CC, 0xD1B71758E219652C,\n 0x9C40000000000000, 0xE8D4A51000000000, 0xAD78EBC5AC620000, 0x813F3978F8940984,\n 0xC097CE7BC90715B3, 0x8F7E32CE7BEA5C70, 0xD5D238A4ABE98068, 0x9F4F2726179A2245,\n 0xED63A231D4C4FB27, 0xB0DE65388CC8ADA8, 0x83C7088E1AAB65DB, 0xC45D1DF942711D9A,\n 0x924D692CA61BE758, 0xDA01EE641A708DEA, 0xA26DA3999AEF774A, 0xF209787BB47D6B85,\n 0xB454E4A179DD1877, 0x865B86925B9BC5C2, 0xC83553C5C8965D3D, 0x952AB45CFA97A0B3,\n 0xDE469FBD99A05FE3, 0xA59BC234DB398C25, 0xF6C69A72A3989F5C, 0xB7DCBF5354E9BECE,\n 0x88FCF317F22241E2, 0xCC20CE9BD35C78A5, 0x98165AF37B2153DF, 0xE2A0B5DC971F303A,\n 0xA8D9D1535CE3B396, 0xFB9B7CD9A4A7443C, 0xBB764C4CA7A44410, 0x8BAB8EEFB6409C1A,\n 0xD01FEF10A657842C, 0x9B10A4E5E9913129, 0xE7109BFBA19C0C9D, 0xAC2820D9623BF429,\n 0x80444B5E7AA7CF85, 0xBF21E44003ACDD2D, 0x8E679C2F5E44FF8F, 0xD433179D9C8CB841,\n 0x9E19DB92B4E31BA9, 0xEB96BF6EBADF77D9, 0xAF87023B9BF0EE6B\n ];\n return table;\n}\n\n// Count number of decimals for u32 values\n// In our case input value always non-zero so we can simplify some parts\nexport function decimalCount32(value: u32): u32 {\n if (ASC_SHRINK_LEVEL >= 1) {\n let l: u32 = 32 - clz(value); // log2\n let t = l * 1233 >>> 12; // log10\n\n let lutbuf = POWERS10().buffer_;\n let power = LOAD(lutbuf, t);\n t -= (value < power);\n return t + 1;\n } else {\n if (value < 100000) {\n if (value < 100) {\n return select(1, 2, value < 10);\n } else {\n let m = select(4, 5, value < 10000);\n return select(3, m, value < 1000);\n }\n } else {\n if (value < 10000000) {\n return select(6, 7, value < 1000000);\n } else {\n let m = select(9, 10, value < 1000000000);\n return select(8, m, value < 100000000);\n }\n }\n }\n}\n\n// Count number of decimals for u64 values\n// In our case input value always greater than 2^32-1 so we can skip some parts\nexport function decimalCount64(value: u64): u32 {\n if (ASC_SHRINK_LEVEL >= 1) {\n let l: u32 = 64 - clz(value); // log2\n let t = l * 1233 >>> 12; // log10\n\n let lutbuf = POWERS10().buffer_;\n let power = LOAD(lutbuf, t - 10);\n t -= (value < 10000000000 * power);\n return t + 1;\n } else {\n if (value < 1000000000000000) {\n if (value < 1000000000000) {\n return select(11, 12, value < 100000000000);\n } else {\n let m = select(14, 15, value < 100000000000000);\n return select(13, m, value < 10000000000000);\n }\n } else {\n if (value < 100000000000000000) {\n return select(16, 17, value < 10000000000000000);\n } else {\n let m = select(19, 20, value < 10000000000000000000);\n return select(18, m, value < 1000000000000000000);\n }\n }\n }\n}\n\nfunction utoa32_lut(buffer: usize, num: u32, offset: usize): void {\n var lutbuf = DIGITS().buffer_;\n\n while (num >= 10000) {\n // in most VMs i32/u32 div and modulo by constant can be shared and simplificate\n let t = num / 10000;\n let r = num % 10000;\n num = t;\n\n let d1 = r / 100;\n let d2 = r % 100;\n\n let digits1 = LOAD(lutbuf, d1);\n let digits2 = LOAD(lutbuf, d2);\n\n offset -= 4;\n store(buffer + (offset << 1), digits1 | (digits2 << 32), STRING_HEADER_SIZE);\n }\n\n if (num >= 100) {\n let t = num / 100;\n let d1 = num % 100;\n num = t;\n offset -= 2;\n let digits = LOAD(lutbuf, d1);\n store(buffer + (offset << 1), digits, STRING_HEADER_SIZE);\n }\n\n if (num >= 10) {\n offset -= 2;\n let digits = LOAD(lutbuf, num);\n store(buffer + (offset << 1), digits, STRING_HEADER_SIZE);\n } else {\n offset -= 1;\n let digit = CharCode._0 + num;\n store(buffer + (offset << 1), digit, STRING_HEADER_SIZE);\n }\n}\n\nfunction utoa64_lut(buffer: usize, num: u64, offset: usize): void {\n var lutbuf = DIGITS().buffer_;\n\n while (num >= 100000000) {\n let t = num / 100000000;\n let r = (num - t * 100000000);\n num = t;\n\n let b = r / 10000;\n let c = r % 10000;\n\n let b1 = b / 100;\n let b2 = b % 100;\n let c1 = c / 100;\n let c2 = c % 100;\n\n let digits1 = LOAD(lutbuf, c1);\n let digits2 = LOAD(lutbuf, c2);\n\n offset -= 4;\n store(buffer + (offset << 1), digits1 | (digits2 << 32), STRING_HEADER_SIZE);\n\n digits1 = LOAD(lutbuf, b1);\n digits2 = LOAD(lutbuf, b2);\n\n offset -= 4;\n store(buffer + (offset << 1), digits1 | (digits2 << 32), STRING_HEADER_SIZE);\n }\n\n utoa32_lut(buffer, num, offset);\n}\n\nfunction utoa_simple(buffer: usize, num: T, offset: usize): void {\n do {\n let t = num / 10;\n let r = (num % 10);\n num = t;\n offset -= 1;\n store(buffer + (offset << 1), CharCode._0 + r, STRING_HEADER_SIZE);\n } while (num);\n}\n\n@inline\nexport function utoa32_core(buffer: usize, num: u32, offset: u32): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n utoa_simple(buffer, num, offset);\n } else {\n utoa32_lut(buffer, num, offset);\n }\n}\n\n@inline\nexport function utoa64_core(buffer: usize, num: u64, offset: u32): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n utoa_simple(buffer, num, offset);\n } else {\n utoa64_lut(buffer, num, offset);\n }\n}\n\nexport function utoa32(value: u32): String {\n if (!value) return "0";\n\n var decimals = decimalCount32(value);\n var buffer = allocateUnsafeString(decimals);\n\n utoa32_core(changetype(buffer), value, decimals);\n return buffer;\n}\n\nexport function itoa32(value: i32): String {\n if (!value) return "0";\n\n var sign = value < 0;\n if (sign) value = -value;\n\n var decimals = decimalCount32(value) + sign;\n var buffer = allocateUnsafeString(decimals);\n\n utoa32_core(changetype(buffer), value, decimals);\n if (sign) store(changetype(buffer), CharCode.MINUS, STRING_HEADER_SIZE);\n\n return buffer;\n}\n\nexport function utoa64(value: u64): String {\n if (!value) return "0";\n\n var buffer: String;\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n let decimals = decimalCount32(val32);\n buffer = allocateUnsafeString(decimals);\n utoa32_core(changetype(buffer), val32, decimals);\n } else {\n let decimals = decimalCount64(value);\n buffer = allocateUnsafeString(decimals);\n utoa64_core(changetype(buffer), value, decimals);\n }\n return buffer;\n}\n\nexport function itoa64(value: i64): String {\n if (!value) return "0";\n\n var sign = value < 0;\n if (sign) value = -value;\n\n var buffer: String;\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n let decimals = decimalCount32(val32) + sign;\n buffer = allocateUnsafeString(decimals);\n utoa32_core(changetype(buffer), val32, decimals);\n } else {\n let decimals = decimalCount64(value) + sign;\n buffer = allocateUnsafeString(decimals);\n utoa64_core(changetype(buffer), value, decimals);\n }\n if (sign) store(changetype(buffer), CharCode.MINUS, STRING_HEADER_SIZE);\n\n return buffer;\n}\n\nexport function itoa(value: T): String {\n if (!isInteger()) {\n assert(false); // unexpecteble non-integer generic type\n } else {\n if (isSigned()) {\n if (sizeof() <= 4) {\n return itoa32(value);\n } else {\n return itoa64(value);\n }\n } else {\n if (sizeof() <= 4) {\n return utoa32(value);\n } else {\n return utoa64(value);\n }\n }\n }\n}\n\nvar _K: i32 = 0;\n\nvar _frc: u64 = 0;\nvar _exp: i32 = 0;\n\nvar _frc_minus: u64 = 0;\nvar _frc_plus: u64 = 0;\n\nvar _frc_pow: u64 = 0;\nvar _exp_pow: i32 = 0;\n\n@inline\nfunction umul64f(u: u64, v: u64): u64 {\n var u0 = u & 0xFFFFFFFF;\n var v0 = v & 0xFFFFFFFF;\n\n var u1 = u >> 32;\n var v1 = v >> 32;\n\n var l = u0 * v0;\n var t = u1 * v0 + (l >> 32);\n var w = u0 * v1 + (t & 0xFFFFFFFF);\n\n w += 0x7FFFFFFF; // rounding\n\n t >>= 32;\n w >>= 32;\n\n return u1 * v1 + t + w;\n}\n\n@inline\nfunction umul64e(e1: i32, e2: i32): i32 {\n return e1 + e2 + 64; // where 64 is significand size\n}\n\n@inline\nfunction normalizedBoundaries(f: u64, e: i32): void {\n var frc = (f << 1) + 1;\n var exp = e - 1;\n var off = clz(frc);\n frc <<= off;\n exp -= off;\n\n var m = 1 + (f == 0x0010000000000000);\n\n _frc_plus = frc;\n _frc_minus = ((f << m) - 1) << e - m - exp;\n _exp = exp;\n}\n\n@inline\nfunction grisuRound(buffer: usize, len: i32, delta: u64, rest: u64, ten_kappa: u64, wp_w: u64): void {\n var lastp = buffer + ((len - 1) << 1);\n var digit = load(lastp, STRING_HEADER_SIZE);\n while (\n rest < wp_w &&\n delta - rest >= ten_kappa && (\n rest + ten_kappa < wp_w ||\n wp_w - rest > rest + ten_kappa - wp_w\n )\n ) {\n --digit;\n rest += ten_kappa;\n }\n store(lastp, digit, STRING_HEADER_SIZE);\n}\n\n@inline\nfunction getCachedPower(minExp: i32): void {\n const c = reinterpret(0x3FD34413509F79FE); // 1 / lg(10) = 0.30102999566398114\n var dk = (-61 - minExp) * c + 347;\t // dk must be positive, so can do ceiling in positive\n var k = dk;\n k += (k != dk); // conversion with ceil\n\n var index = (k >> 3) + 1;\n _K = 348 - (index << 3);\t// decimal exponent no need lookup table\n var frcPowers = FRC_POWERS().buffer_;\n var expPowers = EXP_POWERS().buffer_;\n _frc_pow = LOAD(frcPowers, index);\n _exp_pow = LOAD(expPowers, index);\n}\n\n@inline\nfunction grisu2(value: f64, buffer: usize, sign: i32): i32 {\n\n // frexp routine\n var uv = reinterpret(value);\n var exp = ((uv & 0x7FF0000000000000) >>> 52);\n var sid = uv & 0x000FFFFFFFFFFFFF;\n var frc = ((exp != 0) << 52) + sid;\n exp = select(exp, 1, exp != 0) - (0x3FF + 52);\n\n normalizedBoundaries(frc, exp);\n getCachedPower(_exp);\n\n // normalize\n var off = clz(frc);\n frc <<= off;\n exp -= off;\n\n var frc_pow = _frc_pow;\n var exp_pow = _exp_pow;\n\n var w_frc = umul64f(frc, frc_pow);\n var w_exp = umul64e(exp, exp_pow);\n\n var wp_frc = umul64f(_frc_plus, frc_pow) - 1;\n var wp_exp = umul64e(_exp, exp_pow);\n\n var wm_frc = umul64f(_frc_minus, frc_pow) + 1;\n var delta = wp_frc - wm_frc;\n\n return genDigits(buffer, w_frc, w_exp, wp_frc, wp_exp, delta, sign);\n}\n\nfunction genDigits(buffer: usize, w_frc: u64, w_exp: i32, mp_frc: u64, mp_exp: i32, delta: u64, sign: i32): i32 {\n var one_exp = -mp_exp;\n var one_frc = (1) << one_exp;\n var mask = one_frc - 1;\n\n var wp_w_frc = mp_frc - w_frc;\n var wp_w_exp = mp_exp;\n\n var p1 = (mp_frc >> one_exp);\n var p2 = mp_frc & mask;\n\n var kappa = decimalCount32(p1);\n var len = sign;\n\n var powers10 = POWERS10().buffer_;\n\n while (kappa > 0) {\n let d: u32;\n switch (kappa) {\n case 10: { d = p1 / 1000000000; p1 %= 1000000000; break; }\n case 9: { d = p1 / 100000000; p1 %= 100000000; break; }\n case 8: { d = p1 / 10000000; p1 %= 10000000; break; }\n case 7: { d = p1 / 1000000; p1 %= 1000000; break; }\n case 6: { d = p1 / 100000; p1 %= 100000; break; }\n case 5: { d = p1 / 10000; p1 %= 10000; break; }\n case 4: { d = p1 / 1000; p1 %= 1000; break; }\n case 3: { d = p1 / 100; p1 %= 100; break; }\n case 2: { d = p1 / 10; p1 %= 10; break; }\n case 1: { d = p1; p1 = 0; break; }\n default: { d = 0; break; }\n }\n\n if (d | len) store(buffer + (len++ << 1), CharCode._0 + d, STRING_HEADER_SIZE);\n\n --kappa;\n let tmp = ((p1) << one_exp) + p2;\n if (tmp <= delta) {\n _K += kappa;\n grisuRound(buffer, len, delta, tmp, LOAD(powers10, kappa) << one_exp, wp_w_frc);\n return len;\n }\n }\n\n while (1) {\n p2 *= 10;\n delta *= 10;\n\n let d = p2 >> one_exp;\n if (d | len) store(buffer + (len++ << 1), CharCode._0 + d, STRING_HEADER_SIZE);\n\n p2 &= mask;\n --kappa;\n if (p2 < delta) {\n _K += kappa;\n wp_w_frc *= LOAD(powers10, -kappa);\n grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc);\n return len;\n }\n }\n\n return len;\n}\n\n@inline\nfunction genExponent(buffer: usize, k: i32): i32 {\n var sign = k < 0;\n if (sign) k = -k;\n var decimals = decimalCount32(k) + 1;\n utoa32_core(buffer, k, decimals);\n store(buffer, select(CharCode.MINUS, CharCode.PLUS, sign), STRING_HEADER_SIZE);\n return decimals;\n}\n\nfunction prettify(buffer: usize, length: i32, k: i32): i32 {\n if (!k) {\n store(buffer + (length << 1), CharCode.DOT | (CharCode._0 << 16), STRING_HEADER_SIZE);\n return length + 2;\n }\n\n var kk = length + k;\n if (length <= kk && kk <= 21) {\n // 1234e7 -> 12340000000\n for (let i = length; i < kk; ++i) {\n store(buffer + (i << 1), CharCode._0, STRING_HEADER_SIZE);\n }\n store(buffer + (kk << 1), CharCode.DOT | (CharCode._0 << 16), STRING_HEADER_SIZE);\n return kk + 2;\n } else if (kk > 0 && kk <= 21) {\n // 1234e-2 -> 12.34\n let ptr = buffer + (kk << 1);\n memory.copy(\n ptr + STRING_HEADER_SIZE + 2,\n ptr + STRING_HEADER_SIZE,\n -k << 1\n );\n store(buffer + (kk << 1), CharCode.DOT, STRING_HEADER_SIZE);\n return length + 1;\n } else if (-6 < kk && kk <= 0) {\n // 1234e-6 -> 0.001234\n let offset = 2 - kk;\n memory.copy(\n buffer + STRING_HEADER_SIZE + (offset << 1),\n buffer + STRING_HEADER_SIZE,\n length << 1\n );\n store(buffer, CharCode._0 | (CharCode.DOT << 16), STRING_HEADER_SIZE);\n for (let i = 2; i < offset; ++i) {\n store(buffer + (i << 1), CharCode._0, STRING_HEADER_SIZE);\n }\n return length + offset;\n } else if (length == 1) {\n // 1e30\n store(buffer, CharCode.e, STRING_HEADER_SIZE + 2);\n length = genExponent(buffer + 4, kk - 1);\n return length + 2;\n } else {\n let len = length << 1;\n memory.copy(\n buffer + STRING_HEADER_SIZE + 4,\n buffer + STRING_HEADER_SIZE + 2,\n len - 2\n );\n store(buffer, CharCode.DOT, STRING_HEADER_SIZE + 2);\n store(buffer + len, CharCode.e, STRING_HEADER_SIZE + 2);\n length += genExponent(buffer + len + 4, kk - 1);\n return length + 2;\n }\n}\n\nexport function dtoa_core(buffer: usize, value: f64): i32 {\n var sign = (value < 0);\n if (sign) {\n value = -value;\n store(buffer, CharCode.MINUS, STRING_HEADER_SIZE);\n }\n // assert(value > 0 && value <= 1.7976931348623157e308);\n var len = grisu2(value, buffer, sign);\n len = prettify(buffer + (sign << 1), len - sign, _K);\n return len + sign;\n}\n\nexport function dtoa(value: f64): String {\n if (value == 0) return "0.0";\n if (!isFinite(value)) {\n if (isNaN(value)) return "NaN";\n return select("-Infinity", "Infinity", value < 0);\n }\n var buffer = allocateUnsafeString(MAX_DOUBLE_LENGTH);\n var length = dtoa_core(changetype(buffer), value);\n var result = buffer.substring(0, length);\n freeUnsafeString(buffer);\n return result;\n}\n\nexport function itoa_stream(buffer: usize, offset: usize, value: T): u32 {\n buffer += (offset << 1);\n if (!value) {\n store(buffer, CharCode._0, STRING_HEADER_SIZE);\n return 1;\n }\n var decimals: u32 = 0;\n if (isSigned()) {\n let sign = value < 0;\n if (sign) value = -value;\n if (sizeof() <= 4) {\n decimals = decimalCount32(value) + sign;\n utoa32_core(buffer, value, decimals);\n } else {\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n decimals = decimalCount32(val32) + sign;\n utoa32_core(buffer, val32, decimals);\n } else {\n decimals = decimalCount64(value) + sign;\n utoa64_core(buffer, value, decimals);\n }\n }\n if (sign) store(buffer, CharCode.MINUS, STRING_HEADER_SIZE);\n } else {\n if (sizeof() <= 4) {\n decimals = decimalCount32(value);\n utoa32_core(buffer, value, decimals);\n } else {\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n decimals = decimalCount32(val32);\n utoa32_core(buffer, val32, decimals);\n } else {\n decimals = decimalCount64(value);\n utoa64_core(buffer, value, decimals);\n }\n }\n }\n return decimals;\n}\n\nexport function dtoa_stream(buffer: usize, offset: usize, value: f64): u32 {\n buffer += (offset << 1);\n if (value == 0.0) {\n store(buffer, CharCode._0, STRING_HEADER_SIZE + 0);\n store(buffer, CharCode.DOT, STRING_HEADER_SIZE + 2);\n store(buffer, CharCode._0, STRING_HEADER_SIZE + 4);\n return 3;\n }\n if (!isFinite(value)) {\n if (isNaN(value)) {\n store(buffer, CharCode.N, STRING_HEADER_SIZE + 0);\n store(buffer, CharCode.a, STRING_HEADER_SIZE + 2);\n store(buffer, CharCode.N, STRING_HEADER_SIZE + 4);\n return 3;\n } else {\n let sign = (value < 0);\n let len = 8 + sign;\n let source = changetype(select("-Infinity", "Infinity", sign));\n memory.copy(buffer + STRING_HEADER_SIZE, source + STRING_HEADER_SIZE, len << 1);\n return len;\n }\n }\n return dtoa_core(buffer, value);\n}\n',"internal/sort":"import {\n LOAD,\n STORE\n} from \"./arraybuffer\";\n\nimport {\n compareUnsafe\n} from \"./string\";\n\n/** Obtains the default comparator for the specified value type. */\n@inline\nexport function COMPARATOR(): (a: T, b: T) => i32 {\n if (isInteger()) {\n if (isSigned() && sizeof() <= 4) {\n return (a: T, b: T): i32 => ((a - b));\n } else {\n return (a: T, b: T): i32 => ((a > b) - (a < b));\n }\n } else if (isFloat()) {\n if (sizeof() == 4) {\n return (a: T, b: T): i32 => {\n var ia = reinterpret(a);\n var ib = reinterpret(b);\n ia ^= (ia >> 31) >>> 1;\n ib ^= (ib >> 31) >>> 1;\n return (ia > ib) - (ia < ib);\n };\n } else {\n return (a: T, b: T): i32 => {\n var ia = reinterpret(a);\n var ib = reinterpret(b);\n ia ^= (ia >> 63) >>> 1;\n ib ^= (ib >> 63) >>> 1;\n return (ia > ib) - (ia < ib);\n };\n }\n } else if (isString()) {\n return (a: T, b: T): i32 => {\n var sa = a, sb = b;\n return compareUnsafe(sa, 0, sb, 0, min(sa.length, sb.length));\n };\n } else {\n return (a: T, b: T): i32 => ((a > b) - (a < b));\n }\n}\n\n@inline\nexport function SORT(\n buffer: ArrayBuffer,\n byteOffset: i32,\n length: i32,\n comparator: (a: T, b: T) => i32\n): void {\n if (isReference()) {\n // TODO replace this to faster stable sort (TimSort) when it implemented\n insertionSort(buffer, byteOffset, length, comparator);\n } else {\n if (length < 256) {\n insertionSort(buffer, byteOffset, length, comparator);\n } else {\n weakHeapSort(buffer, byteOffset, length, comparator);\n }\n }\n}\n\n/** Sorts an Array with the 'Insertion Sort' algorithm. */\nfunction insertionSort(\n buffer: ArrayBuffer,\n byteOffset: i32,\n length: i32,\n comparator: (a: T, b: T) => i32\n): void {\n for (let i = 0; i < length; i++) {\n let a = LOAD(buffer, i, byteOffset); // a = arr[i]\n let j = i - 1;\n while (j >= 0) {\n let b = LOAD(buffer, j, byteOffset); // b = arr[j]\n if (comparator(a, b) < 0) {\n STORE(buffer, j-- + 1, b, byteOffset); // arr[j + 1] = b\n } else break;\n }\n STORE(buffer, j + 1, a, byteOffset); // arr[j + 1] = a\n }\n}\n\n/** Sorts an Array with the 'Weak Heap Sort' algorithm. */\nfunction weakHeapSort(\n buffer: ArrayBuffer,\n byteOffset: i32,\n length: i32,\n comparator: (a: T, b: T) => i32\n): void {\n const shift32 = alignof();\n\n var bitsetSize = (length + 31) >> 5 << shift32;\n var bitset = memory.allocate(bitsetSize); // indexed in 32-bit chunks below\n memory.fill(bitset, 0, bitsetSize);\n\n // see: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.21.1863&rep=rep1&type=pdf\n\n for (let i = length - 1; i > 0; i--) {\n let j = i;\n while ((j & 1) == (load(bitset + (j >> 6 << shift32)) >> (j >> 1 & 31) & 1)) j >>= 1;\n\n let p = j >> 1;\n let a = LOAD(buffer, p, byteOffset); // a = arr[p]\n let b = LOAD(buffer, i, byteOffset); // b = arr[i]\n if (comparator(a, b) < 0) {\n store(\n bitset + (i >> 5 << shift32),\n load(bitset + (i >> 5 << shift32)) ^ (1 << (i & 31))\n );\n STORE(buffer, i, a, byteOffset); // arr[i] = a\n STORE(buffer, p, b, byteOffset); // arr[p] = b\n }\n }\n\n for (let i = length - 1; i >= 2; i--) {\n let a = LOAD(buffer, 0, byteOffset);\n STORE(buffer, 0, LOAD(buffer, i, byteOffset), byteOffset);\n STORE(buffer, i, a, byteOffset);\n\n let x = 1, y: i32;\n while ((y = (x << 1) + ((load(bitset + (x >> 5 << shift32)) >> (x & 31)) & 1)) < i) x = y;\n\n while (x > 0) {\n a = LOAD(buffer, 0, byteOffset); // a = arr[0]\n let b = LOAD(buffer, x, byteOffset); // b = arr[x]\n\n if (comparator(a, b) < 0) {\n store(\n bitset + (x >> 5 << shift32),\n load(bitset + (x >> 5 << shift32)) ^ (1 << (x & 31))\n );\n STORE(buffer, x, a, byteOffset); // arr[x] = a\n STORE(buffer, 0, b, byteOffset); // arr[0] = b\n }\n x >>= 1;\n }\n }\n\n memory.free(bitset);\n\n var t = LOAD(buffer, 1, byteOffset); // t = arr[1]\n STORE(buffer, 1, LOAD(buffer, 0, byteOffset), byteOffset);\n STORE(buffer, 0, t, byteOffset); // arr[0] = t\n}\n","internal/string":'import { MAX_SIZE_32 } from "./allocator";\nimport { String } from "../string";\n\n/** Size of a String header. */\nexport const HEADER_SIZE = (offsetof() + 1) & ~1; // 2 byte aligned\n/** Maximum length of a String. */\nexport const MAX_LENGTH = (MAX_SIZE_32 - HEADER_SIZE) >>> 1;\n\n// Low-level utility\n\nfunction __gc(ref: usize): void {}\n\nexport function allocateUnsafe(length: i32): String {\n assert(length > 0 && length <= MAX_LENGTH);\n var buffer: usize;\n if (isManaged()) {\n buffer = __gc_allocate(HEADER_SIZE + (length << 1), __gc); // tslint:disable-line\n } else {\n buffer = memory.allocate(HEADER_SIZE + (length << 1));\n }\n store(buffer, length);\n return changetype(buffer);\n}\n\n@inline\nexport function freeUnsafe(buffer: String): void {\n if (!isManaged()) {\n assert(buffer);\n memory.free(changetype(buffer));\n }\n}\n\nexport function copyUnsafe(dest: String, destOffset: usize, src: String, srcOffset: usize, len: usize): void {\n memory.copy(\n changetype(dest) + (destOffset << 1) + HEADER_SIZE,\n changetype(src) + (srcOffset << 1) + HEADER_SIZE,\n len << 1\n );\n}\n\nexport function compareUnsafe(str1: String, offset1: usize, str2: String, offset2: usize, len: usize): i32 {\n var cmp: i32 = 0;\n var ptr1 = changetype(str1) + (offset1 << 1);\n var ptr2 = changetype(str2) + (offset2 << 1);\n while (len && !(cmp = load(ptr1, HEADER_SIZE) - load(ptr2, HEADER_SIZE))) {\n --len, ptr1 += 2, ptr2 += 2;\n }\n return cmp;\n}\n\nexport function repeatUnsafe(dest: String, destOffset: usize, src: String, count: i32): void {\n var length = src.length;\n if (ASC_SHRINK_LEVEL > 1) {\n let strLen = length << 1;\n let to = changetype(dest) + HEADER_SIZE + (destOffset << 1);\n let from = changetype(src) + HEADER_SIZE;\n for (let i = 0, len = strLen * count; i < len; i += strLen) {\n memory.copy(to + i, from, strLen);\n }\n } else {\n switch (length) {\n case 0: break;\n case 1: {\n let cc = load(changetype(src), HEADER_SIZE);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 1), cc, HEADER_SIZE);\n }\n break;\n }\n case 2: {\n let cc = load(changetype(src), HEADER_SIZE);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 2), cc, HEADER_SIZE);\n }\n break;\n }\n case 3: {\n let cc1 = load(changetype(src), HEADER_SIZE + 0);\n let cc2 = load(changetype(src), HEADER_SIZE + 4);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 2), cc1, HEADER_SIZE + 0);\n store(out + (i << 1), cc2, HEADER_SIZE + 4);\n }\n break;\n }\n case 4: {\n let cc = load(changetype(src), HEADER_SIZE);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 3), cc, HEADER_SIZE);\n }\n break;\n }\n default: {\n let strLen = length << 1;\n let to = changetype(dest) + HEADER_SIZE + (destOffset << 1);\n let from = changetype(src) + HEADER_SIZE;\n for (let i = 0, len = strLen * count; i < len; i += strLen) {\n memory.copy(to + i, from, strLen);\n }\n break;\n }\n }\n }\n}\n\n// Helpers\n\nexport const enum CharCode {\n PLUS = 0x2B,\n MINUS = 0x2D,\n DOT = 0x2E,\n _0 = 0x30,\n _1 = 0x31,\n _2 = 0x32,\n _3 = 0x33,\n _4 = 0x34,\n _5 = 0x35,\n _6 = 0x36,\n _7 = 0x37,\n _8 = 0x38,\n _9 = 0x39,\n A = 0x41,\n B = 0x42,\n E = 0x45,\n N = 0x4E,\n O = 0x4F,\n X = 0x58,\n Z = 0x5a,\n a = 0x61,\n b = 0x62,\n e = 0x65,\n n = 0x6E,\n o = 0x6F,\n x = 0x78,\n z = 0x7A\n}\n\nexport function isWhiteSpaceOrLineTerminator(c: u16): bool {\n switch (c) {\n case 9: // \n case 10: // \n case 13: // \n case 11: // \n case 12: // \n case 32: // \n case 160: // \n case 8232: // \n case 8233: // \n case 65279: return true; // \n default: return false;\n }\n}\n\n/** Parses a string to an integer (usually), using the specified radix. */\nexport function parse(str: String, radix: i32 = 0): T {\n var len: i32 = str.length;\n if (!len) return NaN;\n\n var ptr = changetype(str) /* + HEAD -> offset */;\n var code = load(ptr, HEADER_SIZE);\n\n // determine sign\n var sign: T;\n if (code == CharCode.MINUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = 1;\n } else {\n sign = 1;\n }\n\n // determine radix\n if (!radix) {\n if (code == CharCode._0 && len > 2) {\n switch (load(ptr + 2, HEADER_SIZE)) {\n case CharCode.B:\n case CharCode.b: {\n ptr += 4; len -= 2;\n radix = 2;\n break;\n }\n case CharCode.O:\n case CharCode.o: {\n ptr += 4; len -= 2;\n radix = 8;\n break;\n }\n case CharCode.X:\n case CharCode.x: {\n ptr += 4; len -= 2;\n radix = 16;\n break;\n }\n default: radix = 10;\n }\n } else radix = 10;\n } else if (radix < 2 || radix > 36) {\n return NaN;\n }\n\n // calculate value\n var num: T = 0;\n while (len--) {\n code = load(ptr, HEADER_SIZE);\n if (code >= CharCode._0 && code <= CharCode._9) {\n code -= CharCode._0;\n } else if (code >= CharCode.A && code <= CharCode.Z) {\n code -= CharCode.A - 10;\n } else if (code >= CharCode.a && code <= CharCode.z) {\n code -= CharCode.a - 10;\n } else break;\n if (code >= radix) break;\n num = (num * radix) + code;\n ptr += 2;\n }\n return sign * num;\n}\n',"internal/typedarray":'import {\n HEADER_SIZE as AB_HEADER_SIZE,\n MAX_BLENGTH as AB_MAX_BLENGTH,\n allocateUnsafe,\n LOAD,\n STORE\n} from "./arraybuffer";\n\nimport {\n SORT as SORT_IMPL\n} from "./sort";\n\n/** Typed array base class. Not a global object. */\nexport abstract class TypedArray {\n [key: number]: T; // compatibility only\n\n readonly buffer: ArrayBuffer;\n readonly byteOffset: i32;\n readonly byteLength: i32;\n\n constructor(length: i32) {\n const MAX_LENGTH = AB_MAX_BLENGTH / sizeof();\n if (length > MAX_LENGTH) throw new RangeError("Invalid typed array length");\n var byteLength = length << alignof();\n var buffer = allocateUnsafe(byteLength);\n memory.fill(changetype(buffer) + AB_HEADER_SIZE, 0, byteLength);\n this.buffer = buffer;\n this.byteOffset = 0;\n this.byteLength = byteLength;\n }\n\n @inline\n get length(): i32 {\n return this.byteLength >>> alignof();\n }\n\n @operator("[]")\n protected __get(index: i32): T {\n if (index >= (this.byteLength >>> alignof())) throw new Error("Index out of bounds");\n return LOAD(this.buffer, index, this.byteOffset);\n }\n\n @inline @operator("{}")\n protected __unchecked_get(index: i32): T {\n return LOAD(this.buffer, index, this.byteOffset);\n }\n\n @operator("[]=")\n protected __set(index: i32, value: NATIVE): void {\n if (index >= (this.byteLength >>> alignof())) throw new Error("Index out of bounds");\n STORE>(this.buffer, index, value, this.byteOffset);\n }\n\n @inline @operator("{}=")\n protected __unchecked_set(index: i32, value: NATIVE): void {\n STORE>(this.buffer, index, value, this.byteOffset);\n }\n\n // copyWithin(target: i32, start: i32, end: i32 = this.length): this\n}\n\n@inline\nexport function FILL, T extends number>(\n array: TArray,\n value: NATIVE,\n start: i32,\n end: i32\n): TArray {\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n var len = array.length;\n start = start < 0 ? max(len + start, 0) : min(start, len);\n end = end < 0 ? max(len + end, 0) : min(end, len);\n if (sizeof() == 1) {\n if (start < end) {\n memory.fill(\n changetype(buffer) + start + byteOffset + AB_HEADER_SIZE,\n value,\n (end - start)\n );\n }\n } else {\n for (; start < end; ++start) {\n STORE>(buffer, start, value, byteOffset);\n }\n }\n return array;\n}\n\n@inline\nexport function SORT, T>(\n array: TArray,\n comparator: (a: T, b: T) => i32\n): TArray {\n var byteOffset = array.byteOffset;\n var length = array.length;\n if (length <= 1) return array;\n var buffer = array.buffer;\n if (length == 2) {\n let a = LOAD(buffer, 1, byteOffset);\n let b = LOAD(buffer, 0, byteOffset);\n if (comparator(a, b) < 0) {\n STORE(buffer, 1, b, byteOffset);\n STORE(buffer, 0, a, byteOffset);\n }\n return array;\n }\n SORT_IMPL(buffer, byteOffset, length, comparator);\n return array;\n}\n\n@inline\nexport function SUBARRAY, T>(\n array: TArray,\n begin: i32,\n end: i32\n): TArray {\n var length = array.length;\n if (begin < 0) begin = max(length + begin, 0);\n else begin = min(begin, length);\n if (end < 0) end = max(length + end, begin);\n else end = max(min(end, length), begin);\n var slice = memory.allocate(offsetof());\n store(slice, array.buffer, offsetof("buffer"));\n store(slice, array.byteOffset + (begin << alignof()), offsetof("byteOffset"));\n store(slice, (end - begin) << alignof(), offsetof("byteLength"));\n return changetype(slice);\n}\n\n@inline\nexport function REDUCE, T, TRet>(\n array: TArray,\n callbackfn: (accumulator: TRet, value: T, index: i32, array: TArray) => TRet,\n initialValue: TRet\n): TRet {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n initialValue = callbackfn(\n initialValue,\n LOAD(buffer, i, byteOffset),\n i,\n array,\n );\n }\n return initialValue;\n}\n\n@inline\nexport function REDUCE_RIGHT, T, TRet>(\n array: TArray,\n callbackfn: (accumulator: TRet, value: T, index: i32, array: TArray) => TRet,\n initialValue: TRet\n): TRet {\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = array.length - 1; i >= 0; i--) {\n initialValue = callbackfn(\n initialValue,\n LOAD(buffer, i, byteOffset),\n i,\n array,\n );\n }\n return initialValue;\n}\n\n@inline\nexport function MAP, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, self: TArray) => T,\n): TArray {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n var result = instantiate(length);\n var resultBuffer = result.buffer;\n for (let i = 0; i < length; i++) {\n STORE>(resultBuffer, i, >callbackfn(LOAD(buffer, i, byteOffset), i, array));\n }\n\n return result;\n}\n\n@inline\nexport function FIND_INDEX, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, array: TArray) => bool,\n): i32 {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n if (callbackfn(LOAD(buffer, i, byteOffset), i, array)) {\n return i;\n }\n }\n return -1;\n}\n\n@inline\nexport function SOME, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, array: TArray) => bool,\n): bool {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n if (callbackfn(LOAD(buffer, i, byteOffset), i, array)) {\n return true;\n }\n }\n return false;\n}\n\n@inline\nexport function EVERY, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, array: TArray) => bool,\n): bool {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n if (callbackfn(LOAD(buffer, i, byteOffset), i, array)) {\n continue;\n }\n return false;\n }\n return true;\n}\n',iterator:"export abstract class Iterable {\n // ?\n}\n\n@sealed\nexport abstract class Iterator {\n\n // private constructor(iterable: Iterable) {\n // }\n\n // TODO: these need to evaluate the classId at the respective reference in order to obtain the\n // next value, i.e. arrays work differently than maps. we'd then have:\n //\n // ╒═══════════════════ Iterator layout (32-bit) ══════════════════╕\n // 3 2 1\n // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n // ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┤\n // │ index │\n // ├─────────────────────────────────────────────────────────┬───┬─┤\n // │ reference │ 0 │D│\n // └─────────────────────────────────────────────────────────┴───┴─┘\n // D: Done flag\n\n // get value(this: u64): T {\n // ?\n // }\n\n // next(this: u64): Iterator {\n // ?\n // }\n\n done(this: u64): bool {\n return (this & 1);\n }\n}\n",map:'import {\n HEADER_SIZE as HEADER_SIZE_AB\n} from "./internal/arraybuffer";\n\nimport {\n HASH\n} from "./internal/hash";\n\n// A deterministic hash map based on CloseTable from https://github.com/jorendorff/dht\n\nconst INITIAL_CAPACITY = 4;\nconst FILL_FACTOR: f64 = 8 / 3;\nconst FREE_FACTOR: f64 = 3 / 4;\n\n/** Structure of a map entry. */\n@unmanaged class MapEntry {\n key: K;\n value: V;\n taggedNext: usize; // LSB=1 indicates EMPTY\n}\n\n/** Empty bit. */\nconst EMPTY: usize = 1 << 0;\n\n/** Size of a bucket. */\nconst BUCKET_SIZE = sizeof();\n\n/** Computes the alignment of an entry. */\n@inline function ENTRY_ALIGN(): usize {\n // can align to 4 instead of 8 if 32-bit and K/V is <= 32-bits\n const maxkv = sizeof() > sizeof() ? sizeof() : sizeof();\n const align = (maxkv > sizeof() ? maxkv : sizeof()) - 1;\n return align;\n}\n\n/** Computes the aligned size of an entry. */\n@inline function ENTRY_SIZE(): usize {\n const align = ENTRY_ALIGN();\n const size = (offsetof>() + align) & ~align;\n return size;\n}\n\nexport class Map {\n\n // buckets holding references to the respective first entry within\n private buckets: ArrayBuffer; // usize[bucketsMask + 1]\n private bucketsMask: u32;\n\n // entries in insertion order\n private entries: ArrayBuffer; // MapEntry[entriesCapacity]\n private entriesCapacity: i32;\n private entriesOffset: i32;\n private entriesCount: i32;\n\n get size(): i32 { return this.entriesCount; }\n\n constructor() { this.clear(); }\n\n clear(): void {\n const bucketsSize = INITIAL_CAPACITY * BUCKET_SIZE;\n this.buckets = new ArrayBuffer(bucketsSize);\n this.bucketsMask = INITIAL_CAPACITY - 1;\n const entriesSize = INITIAL_CAPACITY * ENTRY_SIZE();\n this.entries = new ArrayBuffer(entriesSize, true);\n this.entriesCapacity = INITIAL_CAPACITY;\n this.entriesOffset = 0;\n this.entriesCount = 0;\n }\n\n private find(key: K, hashCode: u32): MapEntry | null {\n var entry = load>(\n changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE,\n HEADER_SIZE_AB\n );\n while (entry) {\n if (!(entry.taggedNext & EMPTY) && entry.key == key) return entry;\n entry = changetype>(entry.taggedNext & ~EMPTY);\n }\n return null;\n }\n\n has(key: K): bool {\n return this.find(key, HASH(key)) !== null;\n }\n\n get(key: K): V {\n var entry = this.find(key, HASH(key));\n return entry ? entry.value : unreachable();\n }\n\n set(key: K, value: V): void {\n var hashCode = HASH(key);\n var entry = this.find(key, hashCode);\n if (entry) {\n entry.value = value;\n } else {\n // check if rehashing is necessary\n if (this.entriesOffset == this.entriesCapacity) {\n this.rehash(\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ? this.bucketsMask // just rehash if 1/4+ entries are empty\n : (this.bucketsMask << 1) | 1 // grow capacity to next 2^N\n );\n }\n // append new entry\n let entries = this.entries;\n entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + this.entriesOffset++ * ENTRY_SIZE()\n );\n entry.key = key;\n entry.value = value;\n ++this.entriesCount;\n // link with previous entry in bucket\n let bucketPtrBase = changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE;\n entry.taggedNext = load(bucketPtrBase, HEADER_SIZE_AB);\n store(bucketPtrBase, changetype(entry), HEADER_SIZE_AB);\n if (isManaged()) __gc_link(changetype(this), changetype(key)); // tslint:disable-line\n if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line\n }\n }\n\n delete(key: K): bool {\n var entry = this.find(key, HASH(key));\n if (!entry) return false;\n entry.taggedNext |= EMPTY;\n --this.entriesCount;\n // check if rehashing is appropriate\n var halfBucketsMask = this.bucketsMask >> 1;\n if (\n halfBucketsMask + 1 >= max(INITIAL_CAPACITY, this.entriesCount) &&\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ) this.rehash(halfBucketsMask);\n return true;\n }\n\n private rehash(newBucketsMask: u32): void {\n var newBucketsCapacity = (newBucketsMask + 1);\n var newBuckets = new ArrayBuffer(newBucketsCapacity * BUCKET_SIZE);\n var newEntriesCapacity = (newBucketsCapacity * FILL_FACTOR);\n var newEntries = new ArrayBuffer(newEntriesCapacity * ENTRY_SIZE(), true);\n\n // copy old entries to new entries\n var oldPtr = changetype(this.entries) + HEADER_SIZE_AB;\n var oldEnd = oldPtr + this.entriesOffset * ENTRY_SIZE();\n var newPtr = changetype(newEntries) + HEADER_SIZE_AB;\n while (oldPtr != oldEnd) {\n let oldEntry = changetype>(oldPtr);\n if (!(oldEntry.taggedNext & EMPTY)) {\n let newEntry = changetype>(newPtr);\n newEntry.key = oldEntry.key;\n newEntry.value = oldEntry.value;\n let newBucketIndex = HASH(oldEntry.key) & newBucketsMask;\n let newBucketPtrBase = changetype(newBuckets) + newBucketIndex * BUCKET_SIZE;\n newEntry.taggedNext = load(newBucketPtrBase, HEADER_SIZE_AB);\n store(newBucketPtrBase, newPtr, HEADER_SIZE_AB);\n newPtr += ENTRY_SIZE();\n }\n oldPtr += ENTRY_SIZE();\n }\n\n this.buckets = newBuckets;\n this.bucketsMask = newBucketsMask;\n this.entries = newEntries;\n this.entriesCapacity = newEntriesCapacity;\n this.entriesOffset = this.entriesCount;\n }\n\n toString(): string {\n return "[object Map]";\n }\n\n private __gc(): void {\n __gc_mark(changetype(this.buckets)); // tslint:disable-line\n var entries = this.entries;\n __gc_mark(changetype(entries)); // tslint:disable-line\n if (isManaged() || isManaged()) {\n let offset: usize = 0;\n let end: usize = this.entriesOffset * ENTRY_SIZE();\n while (offset < end) {\n let entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + offset * ENTRY_SIZE()\n );\n if (!(entry.taggedNext & EMPTY)) {\n if (isManaged()) __gc_mark(changetype(entry.key)); // tslint:disable-line\n if (isManaged()) __gc_mark(changetype(entry.value)); // tslint:disable-line\n }\n offset += ENTRY_SIZE();\n }\n }\n }\n}\n',math:'import * as JSMath from "./bindings/Math";\nexport { JSMath };\n\nimport {\n abs as builtin_abs,\n ceil as builtin_ceil,\n clz as builtin_clz,\n copysign as builtin_copysign,\n floor as builtin_floor,\n max as builtin_max,\n min as builtin_min,\n sqrt as builtin_sqrt,\n trunc as builtin_trunc\n} from "./builtins";\n\n// SUN COPYRIGHT NOTICE\n//\n// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n// Developed at SunPro, a Sun Microsystems, Inc. business.\n// Permission to use, copy, modify, and distribute this software\n// is freely granted, provided that this notice is preserved.\n//\n// Applies to all functions marked with a comment referring here.\n\n// TODO: sin, cos, tan\n\n/** @internal */\nfunction R(z: f64): f64 { // Rational approximation of (asin(x)-x)/x^3\n const // see: musl/src/math/asin.c and SUN COPYRIGHT NOTICE above\n pS0 = reinterpret(0x3FC5555555555555), // 1.66666666666666657415e-01\n pS1 = reinterpret(0xBFD4D61203EB6F7D), // -3.25565818622400915405e-01\n pS2 = reinterpret(0x3FC9C1550E884455), // 2.01212532134862925881e-01\n pS3 = reinterpret(0xBFA48228B5688F3B), // -4.00555345006794114027e-02\n pS4 = reinterpret(0x3F49EFE07501B288), // 7.91534994289814532176e-04\n pS5 = reinterpret(0x3F023DE10DFDF709), // 3.47933107596021167570e-05\n qS1 = reinterpret(0xC0033A271C8A2D4B), // -2.40339491173441421878e+00\n qS2 = reinterpret(0x40002AE59C598AC8), // 2.02094576023350569471e+00\n qS3 = reinterpret(0xBFE6066C1B8D0159), // -6.88283971605453293030e-01\n qS4 = reinterpret(0x3FB3B8C5B12E9282); // 7.70381505559019352791e-02\n var p = z * (pS0 + z * (pS1 + z * (pS2 + z * (pS3 + z * (pS4 + z * pS5)))));\n var q = 1.0 + z * (qS1 + z * (qS2 + z * (qS3 + z * qS4)));\n return p / q;\n}\n\n@inline /** @internal */\nfunction expo2(x: f64): f64 { // exp(x)/2 for x >= log(DBL_MAX)\n const // see: musl/src/math/__expo2.c\n k = 2043,\n kln2 = reinterpret(0x40962066151ADD8B); // 0x1.62066151add8bp+10\n var scale = reinterpret(((0x3FF + k / 2) << 20) << 32);\n return NativeMath.exp(x - kln2) * scale * scale;\n}\n\nvar random_seeded = false;\nvar random_state0_64: u64;\nvar random_state1_64: u64;\nvar random_state0_32: u32;\nvar random_state1_32: u32;\n\n/** @internal */\nfunction murmurHash3(h: u64): u64 { // Force all bits of a hash block to avalanche\n h ^= h >> 33; // see: https://github.com/aappleby/smhasher\n h *= 0xFF51AFD7ED558CCD;\n h ^= h >> 33;\n h *= 0xC4CEB9FE1A85EC53;\n h ^= h >> 33;\n return h;\n}\n\n/** @internal */\nfunction splitMix32(h: u32): u32 {\n h += 0x6D2B79F5;\n h = (h ^ (h >> 15)) * (h | 1);\n h ^= h + (h ^ (h >> 7)) * (h | 61);\n return h ^ (h >> 14);\n}\n\nexport namespace NativeMath {\n\n export const E = reinterpret(0x4005BF0A8B145769); // 2.7182818284590452354\n export const LN2 = reinterpret(0x3FE62E42FEFA39EF); // 0.69314718055994530942\n export const LN10 = reinterpret(0x40026BB1BBB55516); // 2.30258509299404568402\n export const LOG2E = reinterpret(0x3FF71547652B82FE); // 1.4426950408889634074\n export const LOG10E = reinterpret(0x3FDBCB7B1526E50E); // 0.43429448190325182765\n export const PI = reinterpret(0x400921FB54442D18); // 3.14159265358979323846\n export const SQRT1_2 = reinterpret(0x3FE6A09E667F3BCD); // 0.70710678118654752440\n export const SQRT2 = reinterpret(0x3FF6A09E667F3BCD); // 1.41421356237309504880\n\n @inline\n export function abs(x: f64): f64 {\n return builtin_abs(x);\n }\n\n export function acos(x: f64): f64 { // see: musl/src/math/acos.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n pio2_lo = reinterpret(0x3C91A62633145C07), // 6.12323399573676603587e-17\n Ox1p_120f = reinterpret(0x03800000);\n var hx = (reinterpret(x) >> 32);\n var ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3FF00000) {\n let lx = reinterpret(x);\n if ((ix - 0x3FF00000 | lx) == 0) {\n if (hx >> 31) return 2 * pio2_hi + Ox1p_120f;\n return 0;\n }\n return 0 / (x - x);\n }\n if (ix < 0x3FE00000) {\n if (ix <= 0x3C600000) return pio2_hi + Ox1p_120f;\n return pio2_hi - (x - (pio2_lo - x * R(x * x)));\n }\n var s: f64, w: f64, z: f64;\n if (hx >> 31) {\n // z = (1.0 + x) * 0.5;\n z = 0.5 + x * 0.5;\n s = builtin_sqrt(z);\n w = R(z) * s - pio2_lo;\n return 2 * (pio2_hi - (s + w));\n }\n // z = (1.0 - x) * 0.5;\n z = 0.5 - x * 0.5;\n s = builtin_sqrt(z);\n var df = reinterpret(reinterpret(s) & 0xFFFFFFFF00000000);\n var c = (z - df * df) / (s + df);\n w = R(z) * s + c;\n return 2 * (df + w);\n }\n\n export function acosh(x: f64): f64 { // see: musl/src/math/acosh.c\n const s = reinterpret(0x3FE62E42FEFA39EF);\n var e = reinterpret(x) >> 52 & 0x7FF;\n if (e < 0x3FF + 1) return log1p(x - 1 + builtin_sqrt((x - 1) * (x - 1) + 2 * (x - 1)));\n if (e < 0x3FF + 26) return log(2 * x - 1 / (x + builtin_sqrt(x * x - 1)));\n return log(x) + s;\n }\n\n export function asin(x: f64): f64 { // see: musl/src/math/asin.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n pio2_lo = reinterpret(0x3C91A62633145C07), // 6.12323399573676603587e-17\n Ox1p_120f = reinterpret(0x03800000);\n var hx = (reinterpret(x) >> 32);\n var ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3FF00000) {\n let lx = reinterpret(x);\n if ((ix - 0x3FF00000 | lx) == 0) return x * pio2_hi + Ox1p_120f;\n return 0 / (x - x);\n }\n if (ix < 0x3FE00000) {\n if (ix < 0x3E500000 && ix >= 0x00100000) return x;\n return x + x * R(x * x);\n }\n // var z = (1.0 - builtin_abs(x)) * 0.5;\n var z = 0.5 - builtin_abs(x) * 0.5;\n var s = builtin_sqrt(z);\n var r = R(z);\n if (ix >= 0x3FEF3333) x = pio2_hi - (2 * (s + s * r) - pio2_lo);\n else {\n let f = reinterpret(reinterpret(s) & 0xFFFFFFFF00000000);\n let c = (z - f * f) / (s + f);\n x = 0.5 * pio2_hi - (2 * s * r - (pio2_lo - 2 * c) - (0.5 * pio2_hi - 2 * f));\n }\n if (hx >> 31) return -x;\n return x;\n }\n\n export function asinh(x: f64): f64 { // see: musl/src/math/asinh.c\n const c = reinterpret(0x3FE62E42FEFA39EF); // 0.693147180559945309417232121458176568\n var u = reinterpret(x);\n var e = u >> 52 & 0x7FF;\n var y = reinterpret(u & 0x7FFFFFFFFFFFFFFF);\n if (e >= 0x3FF + 26) y = log(y) + c;\n else if (e >= 0x3FF + 1) y = log(2 * y + 1 / (builtin_sqrt(y * y + 1) + y));\n else if (e >= 0x3FF - 26) y = log1p(y + y * y / (builtin_sqrt(y * y + 1) + 1));\n return builtin_copysign(y, x);\n }\n\n export function atan(x: f64): f64 { // see musl/src/math/atan.c and SUN COPYRIGHT NOTICE above\n const\n atanhi0 = reinterpret(0x3FDDAC670561BB4F), // 4.63647609000806093515e-01\n atanhi1 = reinterpret(0x3FE921FB54442D18), // 7.85398163397448278999e-01\n atanhi2 = reinterpret(0x3FEF730BD281F69B), // 9.82793723247329054082e-01\n atanhi3 = reinterpret(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n atanlo0 = reinterpret(0x3C7A2B7F222F65E2), // 2.26987774529616870924e-17\n atanlo1 = reinterpret(0x3C81A62633145C07), // 3.06161699786838301793e-17\n atanlo2 = reinterpret(0x3C7007887AF0CBBD), // 1.39033110312309984516e-17\n atanlo3 = reinterpret(0x3C91A62633145C07), // 6.12323399573676603587e-17\n aT0 = reinterpret(0x3FD555555555550D), // 3.33333333333329318027e-01\n aT1 = reinterpret(0xBFC999999998EBC4), // -1.99999999998764832476e-01\n aT2 = reinterpret(0x3FC24924920083FF), // 1.42857142725034663711e-01\n aT3 = reinterpret(0xBFBC71C6FE231671), // -1.11111104054623557880e-01,\n aT4 = reinterpret(0x3FB745CDC54C206E), // 9.09088713343650656196e-02\n aT5 = reinterpret(0xBFB3B0F2AF749A6D), // -7.69187620504482999495e-02\n aT6 = reinterpret(0x3FB10D66A0D03D51), // 6.66107313738753120669e-02\n aT7 = reinterpret(0xBFADDE2D52DEFD9A), // -5.83357013379057348645e-02\n aT8 = reinterpret(0x3FA97B4B24760DEB), // 4.97687799461593236017e-02\n aT9 = reinterpret(0xBFA2B4442C6A6C2F), // -3.65315727442169155270e-02\n aT10 = reinterpret(0x3F90AD3AE322DA11), // 1.62858201153657823623e-02\n Ox1p_120f = reinterpret(0x03800000);\n var ix = (reinterpret(x) >> 32);\n var sx = x;\n ix &= 0x7FFFFFFF;\n var z: f64;\n if (ix >= 0x44100000) {\n if (isNaN(x)) return x;\n z = atanhi3 + Ox1p_120f;\n return builtin_copysign(z, sx);\n }\n var id: i32;\n if (ix < 0x3FDC0000) {\n if (ix < 0x3E400000) return x;\n id = -1;\n } else {\n x = builtin_abs(x);\n if (ix < 0x3FF30000) {\n if (ix < 0x3FE60000) {\n id = 0;\n x = (2.0 * x - 1.0) / (2.0 + x);\n } else {\n id = 1;\n x = (x - 1.0) / (x + 1.0);\n }\n } else {\n if (ix < 0x40038000) {\n id = 2;\n x = (x - 1.5) / (1.0 + 1.5 * x);\n } else {\n id = 3;\n x = -1.0 / x;\n }\n }\n }\n z = x * x;\n var w = z * z;\n var s1 = z * (aT0 + w * (aT2 + w * (aT4 + w * (aT6 + w * (aT8 + w * aT10)))));\n var s2 = w * (aT1 + w * (aT3 + w * (aT5 + w * (aT7 + w * aT9))));\n var s3 = x * (s1 + s2);\n if (id < 0) return x - s3;\n switch (id) {\n case 0: { z = atanhi0 - ((s3 - atanlo0) - x); break; }\n case 1: { z = atanhi1 - ((s3 - atanlo1) - x); break; }\n case 2: { z = atanhi2 - ((s3 - atanlo2) - x); break; }\n case 3: { z = atanhi3 - ((s3 - atanlo3) - x); break; }\n default: unreachable();\n }\n return builtin_copysign(z, sx);\n }\n\n export function atanh(x: f64): f64 { // see: musl/src/math/atanh.c\n var u = reinterpret(x);\n var e = u >> 52 & 0x7FF;\n var s = u >> 63;\n u &= 0x7FFFFFFFFFFFFFFF;\n var y = reinterpret(u);\n if (e < 0x3FF - 1) {\n if (e >= 0x3FF - 32) y = 0.5 * log1p(2 * y + 2 * y * y / (1 - y));\n } else {\n y = 0.5 * log1p(2 * (y / (1 - y)));\n }\n return builtin_copysign(y, x);\n }\n\n export function atan2(y: f64, x: f64): f64 { // see: musl/src/math/atan2.c and SUN COPYRIGHT NOTICE above\n const pi_lo = reinterpret(0x3CA1A62633145C07); // 1.2246467991473531772E-16\n if (isNaN(x) || isNaN(y)) return x + y;\n var u = reinterpret(x);\n var ix = (u >> 32);\n var lx = u;\n u = reinterpret(y);\n var iy = (u >> 32);\n var ly = u;\n if ((ix - 0x3FF00000 | lx) == 0) return atan(y);\n var m = ((iy >> 31) & 1) | ((ix >> 30) & 2);\n ix = ix & 0x7FFFFFFF;\n iy = iy & 0x7FFFFFFF;\n if ((iy | ly) == 0) {\n switch (m) {\n case 0:\n case 1: return y;\n case 2: return PI;\n case 3: return -PI;\n }\n }\n if ((ix | lx) == 0) return m & 1 ? -PI / 2 : PI / 2;\n if (ix == 0x7FF00000) {\n if (iy == 0x7FF00000) {\n switch (m) {\n case 0: return PI / 4;\n case 1: return -PI / 4;\n case 2: return 3 * PI / 4;\n case 3: return -3 * PI / 4;\n }\n } else {\n switch (m) {\n case 0: return 0.0;\n case 1: return -0.0;\n case 2: return PI;\n case 3: return -PI;\n }\n }\n }\n var z: f64;\n if (ix + (64 << 20) < iy || iy == 0x7FF00000) return m & 1 ? -PI / 2 : PI / 2;\n if ((m & 2) && iy + (64 << 20) < ix) z = 0;\n else z = atan(builtin_abs(y / x));\n switch (m) {\n case 0: return z;\n case 1: return -z;\n case 2: return PI - (z - pi_lo);\n case 3: return (z - pi_lo) - PI;\n }\n unreachable();\n return 0;\n }\n\n export function cbrt(x: f64): f64 { // see: musl/src/math/cbrt.c and SUN COPYRIGHT NOTICE above\n const\n B1 = 715094163,\n B2 = 696219795,\n P0 = reinterpret(0x3FFE03E60F61E692), // 1.87595182427177009643\n P1 = reinterpret(0xBFFE28E092F02420), // -1.88497979543377169875\n P2 = reinterpret(0x3FF9F1604A49D6C2), // 1.621429720105354466140\n P3 = reinterpret(0xBFE844CBBEE751D9), // -0.758397934778766047437\n P4 = reinterpret(0x3FC2B000D4E4EDD7), // 0.145996192886612446982\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32) & 0x7FFFFFFF;\n if (hx >= 0x7FF00000) return x + x;\n if (hx < 0x00100000) {\n u = reinterpret(x * Ox1p54);\n hx = (u >> 32) & 0x7FFFFFFF;\n if (hx == 0) return x;\n hx = hx / 3 + B2;\n } else {\n hx = hx / 3 + B1;\n }\n u &= 1 << 63;\n u |= hx << 32;\n var t = reinterpret(u);\n var r = (t * t) * (t / x);\n t = t * ((P0 + r * (P1 + r * P2)) + ((r * r) * r) * (P3 + r * P4));\n t = reinterpret((reinterpret(t) + 0x80000000) & 0xFFFFFFFFC0000000);\n var s = t * t;\n r = x / s;\n r = (r - t) / (2 * t + r);\n t = t + t * r;\n return t;\n }\n\n @inline\n export function ceil(x: f64): f64 {\n return builtin_ceil(x);\n }\n\n @inline\n export function clz32(x: f64): f64 {\n return builtin_clz(x);\n }\n\n export function cos(x: f64): f64 { // TODO\n unreachable();\n return 0;\n }\n\n export function cosh(x: f64): f64 { // see: musl/src/math/cosh.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFFFFFFFFFF;\n x = reinterpret(u);\n var w = (u >> 32);\n var t: f64;\n if (w < 0x3FE62E42) {\n if (w < 0x3FF00000 - (26 << 20)) return 1;\n t = expm1(x);\n // return 1 + t * t / (2 * (1 + t));\n return 1 + t * t / (2 + 2 * t);\n }\n if (w < 0x40862E42) {\n t = exp(x);\n return 0.5 * (t + 1 / t);\n }\n t = expo2(x);\n return t;\n }\n\n export function exp(x: f64): f64 { // see: musl/src/math/exp.c and SUN COPYRIGHT NOTICE above\n const\n ln2hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n invln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n P1 = reinterpret(0x3FC555555555553E), // 1.66666666666666019037e-01\n P2 = reinterpret(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03\n P3 = reinterpret(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05\n P4 = reinterpret(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06\n P5 = reinterpret(0x3E66376972BEA4D0), // 4.13813679705723846039e-08\n overflow = reinterpret(0x40862E42FEFA39EF), // 709.782712893383973096\n underflow = reinterpret(0xC0874910D52D3051), // -745.13321910194110842\n Ox1p1023 = reinterpret(0x7FE0000000000000);\n var hx = (reinterpret(x) >> 32);\n var sign_ = (hx >> 31);\n hx &= 0x7FFFFFFF;\n if (hx >= 0x4086232B) {\n if (isNaN(x)) return x;\n if (x > overflow) return x * Ox1p1023;\n if (x < underflow) return 0;\n }\n var hi: f64, lo: f64 = 0;\n var k = 0;\n if (hx > 0x3FD62E42) {\n if (hx >= 0x3FF0A2B2) {\n k = (invln2 * x + builtin_copysign(0.5, x));\n } else {\n k = 1 - (sign_ << 1);\n }\n hi = x - k * ln2hi;\n lo = k * ln2lo;\n x = hi - lo;\n } else if (hx > 0x3E300000) {\n hi = x;\n } else return 1.0 + x;\n var xs = x * x;\n // var c = x - xp2 * (P1 + xp2 * (P2 + xp2 * (P3 + xp2 * (P4 + xp2 * P5))));\n var xq = xs * xs;\n var c = x - (xs * P1 + xq * ((P2 + xs * P3) + xq * (P4 + xs * P5)));\n var y = 1.0 + (x * c / (2 - c) - lo + hi);\n if (k == 0) return y;\n return scalbn(y, k);\n }\n\n export function expm1(x: f64): f64 { // see: musl/src/math/expm1.c and SUN COPYRIGHT NOTICE above\n const\n o_threshold = reinterpret(0x40862E42FEFA39EF), // 7.09782712893383973096e+02\n ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n invln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n Q1 = reinterpret(0xBFA11111111110F4), // -3.33333333333331316428e-02\n Q2 = reinterpret(0x3F5A01A019FE5585), // 1.58730158725481460165e-03\n Q3 = reinterpret(0xBF14CE199EAADBB7), // -7.93650757867487942473e-05\n Q4 = reinterpret(0x3ED0CFCA86E65239), // 4.00821782732936239552e-06\n Q5 = reinterpret(0xBE8AFDB76E09C32D), // -2.01099218183624371326e-07\n Ox1p1023 = reinterpret(0x7FE0000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32 & 0x7FFFFFFF);\n var k = 0, sign_ = (u >> 63);\n if (hx >= 0x4043687A) {\n if (isNaN(x)) return x;\n if (sign_) return -1;\n if (x > o_threshold) return x * Ox1p1023;\n }\n var c = 0.0, t: f64;\n if (hx > 0x3FD62E42) {\n k = select(\n 1 - (sign_ << 1),\n (invln2 * x + builtin_copysign(0.5, x)),\n hx < 0x3FF0A2B2\n );\n t = k;\n let hi = x - t * ln2_hi;\n let lo = t * ln2_lo;\n x = hi - lo;\n c = (hi - x) - lo;\n } else if (hx < 0x3C900000) return x;\n var hfx = 0.5 * x;\n var hxs = x * hfx;\n // var r1 = 1.0 + hxs * (Q1 + hxs * (Q2 + hxs * (Q3 + hxs * (Q4 + hxs * Q5))));\n var hxq = hxs * hxs;\n var r1 = (1.0 + hxs * Q1) + hxq * ((Q2 + hxs * Q3) + hxq * (Q4 + hxs * Q5));\n t = 3.0 - r1 * hfx;\n var e = hxs * ((r1 - t) / (6.0 - x * t));\n if (k == 0) return x - (x * e - hxs);\n e = x * (e - c) - c;\n e -= hxs;\n if (k == -1) return 0.5 * (x - e) - 0.5;\n if (k == 1) {\n if (x < -0.25) return -2.0 * (e - (x + 0.5));\n return 1.0 + 2.0 * (x - e);\n }\n u = (0x3FF + k) << 52;\n var twopk = reinterpret(u);\n var y: f64;\n if (k < 0 || k > 56) {\n y = x - e + 1.0;\n if (k == 1024) y = y * 2.0 * Ox1p1023;\n else y = y * twopk;\n return y - 1.0;\n }\n u = (0x3FF - k) << 52;\n y = reinterpret(u);\n if (k < 20) y = (1 - y) - e;\n else y = 1 - (e + y);\n return (x + y) * twopk;\n }\n\n @inline\n export function floor(x: f64): f64 {\n return builtin_floor(x);\n }\n\n @inline\n export function fround(x: f64): f32 {\n return x;\n }\n\n export function hypot(x: f64, y: f64): f64 { // see: musl/src/math/hypot.c\n const\n SPLIT = reinterpret(0x41A0000000000000) + 1, // 0x1p27 + 1\n Ox1p700 = reinterpret(0x6BB0000000000000),\n Ox1p_700 = reinterpret(0x1430000000000000);\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n ux &= 0x7FFFFFFFFFFFFFFF;\n uy &= 0x7FFFFFFFFFFFFFFF;\n if (ux < uy) {\n let ut = ux;\n ux = uy;\n uy = ut;\n }\n var ex = (ux >> 52);\n var ey = (uy >> 52);\n y = reinterpret(uy);\n if (ey == 0x7FF) return y;\n x = reinterpret(ux);\n if (ex == 0x7FF || uy == 0) return x;\n if (ex - ey > 64) return x + y;\n var z = 1.0;\n if (ex > 0x3FF + 510) {\n z = Ox1p700;\n x *= Ox1p_700;\n y *= Ox1p_700;\n } else if (ey < 0x3FF - 450) {\n z = Ox1p_700;\n x *= Ox1p700;\n y *= Ox1p700;\n }\n var c = x * SPLIT;\n var h = x - c + c;\n var l = x - h;\n var hx = x * x;\n var lx = h * h - hx + (2 * h + l) * l;\n c = y * SPLIT;\n h = y - c + c;\n l = y - h;\n var hy = y * y;\n var ly = h * h - hy + (2 * h + l) * l;\n return z * builtin_sqrt(ly + lx + hy + hx);\n }\n\n export function imul(x: f64, y: f64): f64 {\n /*\n * Wasm (MVP) and JS have different approachas for double->int conversions.\n *\n * For emulate JS conversion behavior and avoid trapping from wasm we should modulate by MAX_INT\n * our float-point arguments before actual convertion to integers.\n */\n if (!isFinite(x + y)) return 0;\n const inv32 = 1.0 / 4294967296;\n return (\n (x - 4294967296 * builtin_floor(x * inv32)) *\n (y - 4294967296 * builtin_floor(y * inv32))\n );\n }\n\n export function log(x: f64): f64 { // see: musl/src/math/log.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 0;\n if (hx < 0x00100000 || (hx >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (hx >> 31) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret(x);\n hx = (u >> 32);\n } else if (hx >= 0x7FF00000) return x;\n else if (hx == 0x3FF00000 && u << 32 == 0) return 0;\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret(u);\n var f = x - 1.0;\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var dk = k;\n return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi;\n }\n\n export function log10(x: f64): f64 { // see: musl/src/math/log10.c and SUN COPYRIGHT NOTICE above\n const\n ivln10hi = reinterpret(0x3FDBCB7B15200000), // 4.34294481878168880939e-01\n ivln10lo = reinterpret(0x3DBB9438CA9AADD5), // 2.50829467116452752298e-11\n log10_2hi = reinterpret(0x3FD34413509F6000), // 3.01029995663611771306e-01\n log10_2lo = reinterpret(0x3D59FEF311F12B36), // 3.69423907715893078616e-13\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 0;\n if (hx < 0x00100000 || (hx >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (hx >> 31) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret(x);\n hx = (u >> 32);\n } else if (hx >= 0x7FF00000) return x;\n else if (hx == 0x3FF00000 && u << 32 == 0) return 0;\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret(u);\n var f = x - 1.0;\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var hi = f - hfsq;\n u = reinterpret(hi);\n u &= 0xFFFFFFFF00000000;\n hi = reinterpret(u);\n var lo = f - hi - hfsq + s * (hfsq + r);\n var val_hi = hi * ivln10hi;\n var dk = k;\n var y = dk * log10_2hi;\n var val_lo = dk * log10_2lo + (lo + hi) * ivln10lo + lo * ivln10hi;\n w = y + val_hi;\n val_lo += (y - w) + val_hi;\n return val_lo + w;\n }\n\n export function log1p(x: f64): f64 { // see: musl/src/math/log1p.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244); // 1.479819860511658591e-01\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 1;\n var c = 0.0, f = 0.0;\n if (hx < 0x3FDA827A || (hx >> 31)) {\n if (hx >= 0xBFF00000) {\n if (x == -1) return x / 0.0;\n return (x - x) / 0.0;\n }\n if (hx << 1 < 0x3CA00000 << 1) return x;\n if (hx <= 0xBFD2BEC4) {\n k = 0;\n c = 0;\n f = x;\n }\n } else if (hx >= 0x7FF00000) return x;\n if (k) {\n u = reinterpret(1 + x);\n let hu = (u >> 32);\n hu += 0x3FF00000 - 0x3FE6A09E;\n k = (hu >> 20) - 0x3FF;\n if (k < 54) {\n let uf = reinterpret(u);\n c = k >= 2 ? 1 - (uf - x) : x - (uf - 1);\n c /= uf;\n } else c = 0;\n hu = (hu & 0x000FFFFF) + 0x3FE6A09E;\n u = hu << 32 | (u & 0xFFFFFFFF);\n f = reinterpret(u) - 1;\n }\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var dk = k;\n return s * (hfsq + r) + (dk * ln2_lo + c) - hfsq + f + dk * ln2_hi;\n }\n\n export function log2(x: f64): f64 { // see: musl/src/math/log2.c and SUN COPYRIGHT NOTICE above\n const\n ivln2hi = reinterpret(0x3FF7154765200000), // 1.44269504072144627571e+00\n ivln2lo = reinterpret(0x3DE705FC2EEFA200), // 1.67517131648865118353e-10\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 0;\n if (hx < 0x00100000 || (hx >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (hx >> 31) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret(x);\n hx = (u >> 32);\n } else if (hx >= 0x7FF00000) return x;\n else if (hx == 0x3FF00000 && u << 32 == 0) return 0;\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret(u);\n var f = x - 1.0;\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var hi = f - hfsq;\n u = reinterpret(hi);\n u &= 0xFFFFFFFF00000000;\n hi = reinterpret(u);\n var lo = f - hi - hfsq + s * (hfsq + r);\n var val_hi = hi * ivln2hi;\n var val_lo = (lo + hi) * ivln2lo + lo * ivln2hi;\n var y = k;\n w = y + val_hi;\n val_lo += (y - w) + val_hi;\n val_hi = w;\n return val_lo + val_hi;\n }\n\n @inline\n export function max(value1: f64, value2: f64): f64 {\n return builtin_max(value1, value2);\n }\n\n @inline\n export function min(value1: f64, value2: f64): f64 {\n return builtin_min(value1, value2);\n }\n\n export function pow(x: f64, y: f64): f64 { // see: musl/src/math/pow.c and SUN COPYRIGHT NOTICE above\n const\n dp_h1 = reinterpret(0x3FE2B80340000000), // 5.84962487220764160156e-01\n dp_l1 = reinterpret(0x3E4CFDEB43CFD006), // 1.35003920212974897128e-08\n two53 = reinterpret(0x4340000000000000), // 9007199254740992.0\n huge = reinterpret(0x7E37E43C8800759C), // 1e+300\n tiny = reinterpret(0x01A56E1FC2F8F359), // 1e-300\n L1 = reinterpret(0x3FE3333333333303), // 5.99999999999994648725e-01\n L2 = reinterpret(0x3FDB6DB6DB6FABFF), // 4.28571428578550184252e-01\n L3 = reinterpret(0x3FD55555518F264D), // 3.33333329818377432918e-01\n L4 = reinterpret(0x3FD17460A91D4101), // 2.72728123808534006489e-01\n L5 = reinterpret(0x3FCD864A93C9DB65), // 2.30660745775561754067e-01\n L6 = reinterpret(0x3FCA7E284A454EEF), // 2.06975017800338417784e-01\n P1 = reinterpret(0x3FC555555555553E), // 1.66666666666666019037e-01\n P2 = reinterpret(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03\n P3 = reinterpret(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05\n P4 = reinterpret(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06\n P5 = reinterpret(0x3E66376972BEA4D0), // 4.13813679705723846039e-08\n lg2 = reinterpret(0x3FE62E42FEFA39EF), // 6.93147180559945286227e-01\n lg2_h = reinterpret(0x3FE62E4300000000), // 6.93147182464599609375e-01\n lg2_l = reinterpret(0xBE205C610CA86C39), // -1.90465429995776804525e-09\n ovt = reinterpret(0x3C971547652B82FE), // 8.0085662595372944372e-017\n cp = reinterpret(0x3FEEC709DC3A03FD), // 9.61796693925975554329e-01\n cp_h = reinterpret(0x3FEEC709E0000000), // 9.61796700954437255859e-01\n cp_l = reinterpret(0xBE3E2FE0145B01F5), // -7.02846165095275826516e-09\n ivln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n ivln2_h = reinterpret(0x3FF7154760000000), // 1.44269502162933349609e+00\n ivln2_l = reinterpret(0x3E54AE0BF85DDF44), // 1.92596299112661746887e-08\n inv3 = reinterpret(0x3FD5555555555555); // 0.3333333333333333333333\n var u_ = reinterpret(x);\n var hx = (u_ >> 32);\n var lx = u_;\n u_ = reinterpret(y);\n var hy = (u_ >> 32);\n var ly = u_;\n var ix = hx & 0x7FFFFFFF;\n var iy = hy & 0x7FFFFFFF;\n if ((iy | ly) == 0) return 1.0; // x**0 = 1, even if x is NaN\n // if (hx == 0x3FF00000 && lx == 0) return 1.0; // C: 1**y = 1, even if y is NaN, JS: NaN\n if ( // NaN if either arg is NaN\n ix > 0x7FF00000 || (ix == 0x7FF00000 && lx != 0) ||\n iy > 0x7FF00000 || (iy == 0x7FF00000 && ly != 0)\n ) return x + y;\n var yisint = 0, k: i32;\n if (hx < 0) {\n if (iy >= 0x43400000) yisint = 2;\n else if (iy >= 0x3FF00000) {\n k = (iy >> 20) - 0x3FF;\n let kcond = k > 20;\n let offset = select(52, 20, kcond) - k;\n let Ly = select(ly, iy, kcond);\n let jj = Ly >> offset;\n if ((jj << offset) == Ly) yisint = 2 - (jj & 1);\n }\n }\n if (ly == 0) {\n if (iy == 0x7FF00000) { // y is +-inf\n if (((ix - 0x3FF00000) | lx) == 0) return NaN; // C: (-1)**+-inf is 1, JS: NaN\n else if (ix >= 0x3FF00000) return hy >= 0 ? y : 0.0; // (|x|>1)**+-inf = inf,0\n else return hy >= 0 ? 0.0 : -y; // (|x|<1)**+-inf = 0,inf\n }\n if (iy == 0x3FF00000) {\n if (hy >= 0) return x;\n return 1 / x;\n }\n if (hy == 0x40000000) return x * x;\n if (hy == 0x3FE00000) {\n if (hx >= 0) return builtin_sqrt(x);\n }\n }\n var ax = builtin_abs(x), z: f64;\n if (lx == 0) {\n if (ix == 0 || ix == 0x7FF00000 || ix == 0x3FF00000) {\n z = ax;\n if (hy < 0) z = 1.0 / z;\n if (hx < 0) {\n if (((ix - 0x3FF00000) | yisint) == 0) {\n let d = z - z;\n z = d / d;\n } else if (yisint == 1) z = -z;\n }\n return z;\n }\n }\n var s = 1.0;\n if (hx < 0) {\n if (yisint == 0) {\n let d = x - x;\n return d / d;\n }\n if (yisint == 1) s = -1.0;\n }\n var t1: f64, t2: f64, p_h: f64, p_l: f64, r: f64, t: f64, u: f64, v: f64, w: f64;\n var j: i32, n: i32;\n if (iy > 0x41E00000) {\n if (iy > 0x43F00000) {\n if (ix <= 0x3FEFFFFF) return hy < 0 ? huge * huge : tiny * tiny;\n if (ix >= 0x3FF00000) return hy > 0 ? huge * huge : tiny * tiny;\n }\n if (ix < 0x3FEFFFFF) return hy < 0 ? s * huge * huge : s * tiny * tiny;\n if (ix > 0x3FF00000) return hy > 0 ? s * huge * huge : s * tiny * tiny;\n t = ax - 1.0;\n w = (t * t) * (0.5 - t * (inv3 - t * 0.25));\n u = ivln2_h * t;\n v = t * ivln2_l - w * ivln2;\n t1 = u + v;\n t1 = reinterpret(reinterpret(t1) & 0xFFFFFFFF00000000);\n t2 = v - (t1 - u);\n } else {\n let ss: f64, s2: f64, s_h: f64, s_l: f64, t_h: f64, t_l: f64;\n n = 0;\n if (ix < 0x00100000) {\n ax *= two53;\n n -= 53;\n ix = (reinterpret(ax) >> 32);\n }\n n += (ix >> 20) - 0x3FF;\n j = ix & 0x000FFFFF;\n ix = j | 0x3FF00000;\n if (j <= 0x3988E) k = 0;\n else if (j < 0xBB67A) k = 1;\n else {\n k = 0;\n n += 1;\n ix -= 0x00100000;\n }\n ax = reinterpret(reinterpret(ax) & 0xFFFFFFFF | (ix << 32));\n let bp = select(1.5, 1.0, k); // k ? 1.5 : 1.0\n u = ax - bp;\n v = 1.0 / (ax + bp);\n ss = u * v;\n s_h = ss;\n s_h = reinterpret(reinterpret(s_h) & 0xFFFFFFFF00000000);\n t_h = reinterpret((((ix >> 1) | 0x20000000) + 0x00080000 + (k << 18)) << 32);\n t_l = ax - (t_h - bp);\n s_l = v * ((u - s_h * t_h) - s_h * t_l);\n s2 = ss * ss;\n r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6)))));\n r += s_l * (s_h + ss);\n s2 = s_h * s_h;\n t_h = 3.0 + s2 + r;\n t_h = reinterpret(reinterpret(t_h) & 0xFFFFFFFF00000000);\n t_l = r - ((t_h - 3.0) - s2);\n u = s_h * t_h;\n v = s_l * t_h + t_l * ss;\n p_h = u + v;\n p_h = reinterpret(reinterpret(p_h) & 0xFFFFFFFF00000000);\n p_l = v - (p_h - u);\n let z_h = cp_h * p_h;\n let dp_l = select(dp_l1, 0.0, k);\n let z_l = cp_l * p_h + p_l * cp + dp_l;\n t = n;\n let dp_h = select(dp_h1, 0.0, k);\n t1 = ((z_h + z_l) + dp_h) + t;\n t1 = reinterpret(reinterpret(t1) & 0xFFFFFFFF00000000);\n t2 = z_l - (((t1 - t) - dp_h) - z_h);\n }\n var y1 = y;\n y1 = reinterpret(reinterpret(y1) & 0xFFFFFFFF00000000);\n p_l = (y - y1) * t1 + y * t2;\n p_h = y1 * t1;\n z = p_l + p_h;\n u_ = reinterpret(z);\n j = (u_ >> 32);\n var i = u_;\n if (j >= 0x40900000) {\n if (((j - 0x40900000) | i) != 0) return s * huge * huge;\n if (p_l + ovt > z - p_h) return s * huge * huge;\n } else if ((j & 0x7FFFFFFF) >= 0x4090CC00) {\n if (((j - 0xC090CC00) | i) != 0) return s * tiny * tiny;\n if (p_l <= z - p_h) return s * tiny * tiny;\n }\n i = j & 0x7FFFFFFF;\n k = (i >> 20) - 0x3FF;\n n = 0;\n if (i > 0x3FE00000) {\n n = j + (0x00100000 >> (k + 1));\n k = ((n & 0x7FFFFFFF) >> 20) - 0x3FF;\n t = 0.0;\n t = reinterpret((n & ~(0x000FFFFF >> k)) << 32);\n n = ((n & 0x000FFFFF) | 0x00100000) >> (20 - k);\n if (j < 0) n = -n;\n p_h -= t;\n }\n t = p_l + p_h;\n t = reinterpret(reinterpret(t) & 0xFFFFFFFF00000000);\n u = t * lg2_h;\n v = (p_l - (t - p_h)) * lg2 + t * lg2_l;\n z = u + v;\n w = v - (z - u);\n t = z * z;\n t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));\n r = (z * t1) / (t1 - 2.0) - (w + z * w);\n z = 1.0 - (r - z);\n j = (reinterpret(z) >> 32);\n j += n << 20;\n if ((j >> 20) <= 0) z = scalbn(z, n);\n else z = reinterpret(reinterpret(z) & 0xFFFFFFFF | (j << 32));\n return s * z;\n }\n\n export function seedRandom(value: i64): void {\n assert(value);\n random_seeded = true;\n random_state0_64 = murmurHash3(value);\n random_state1_64 = murmurHash3(~random_state0_64);\n random_state0_32 = splitMix32(value);\n random_state1_32 = splitMix32(random_state0_32);\n }\n\n export function random(): f64 { // see: v8/src/base/random-number-generator.cc\n if (!random_seeded) throw new Error("PRNG must be seeded.");\n var s1 = random_state0_64;\n var s0 = random_state1_64;\n random_state0_64 = s0;\n s1 ^= s1 << 23;\n s1 ^= s1 >> 17;\n s1 ^= s0;\n s1 ^= s0 >> 26;\n random_state1_64 = s1;\n var r = ((s0 + s1) & 0x000FFFFFFFFFFFFF) | 0x3FF0000000000000;\n return reinterpret(r) - 1;\n }\n\n @inline\n export function round(x: f64): f64 {\n return builtin_copysign(builtin_floor(x + 0.5), x);\n }\n\n @inline\n export function sign(x: f64): f64 {\n if (ASC_SHRINK_LEVEL > 0) {\n return builtin_abs(x) > 0 ? builtin_copysign(1, x) : x;\n } else {\n return x > 0 ? 1 : x < 0 ? -1 : x;\n }\n }\n\n @inline\n export function signbit(x: f64): bool {\n // In ECMAScript all NaN values are indistinguishable from each other\n // so we need handle NaN and negative NaN in similar way\n return ((reinterpret(x) >>> 63) & (x == x));\n }\n\n export function sin(x: f64): f64 { // TODO\n unreachable();\n return 0;\n }\n\n export function sinh(x: f64): f64 { // see: musl/src/math/sinh.c\n var u = reinterpret(x) & 0x7FFFFFFFFFFFFFFF;\n var absx = reinterpret(u);\n var w = (u >> 32);\n var t: f64;\n var h = builtin_copysign(0.5, x);\n if (w < 0x40862E42) {\n t = expm1(absx);\n if (w < 0x3FF00000) {\n if (w < 0x3FF00000 - (26 << 20)) return x;\n return h * (2 * t - t * t / (t + 1));\n }\n return h * (t + t / (t + 1));\n }\n t = 2 * h * expo2(absx);\n return t;\n }\n\n @inline\n export function sqrt(x: f64): f64 {\n return builtin_sqrt(x);\n }\n\n export function tan(x: f64): f64 { // TODO\n unreachable();\n return 0;\n }\n\n export function tanh(x: f64): f64 { // see: musl/src/math/tanh.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFFFFFFFFFF;\n var y = reinterpret(u);\n var w = (u >> 32);\n var t: f64;\n if (w > 0x3FE193EA) {\n if (w > 0x40340000) {\n t = 1 - 0 / y;\n } else {\n t = expm1(2 * y);\n t = 1 - 2 / (t + 2);\n }\n } else if (w > 0x3FD058AE) {\n t = expm1(2 * y);\n t = t / (t + 2);\n } else if (w >= 0x00100000) {\n t = expm1(-2 * y);\n t = -t / (t + 2);\n } else t = y;\n return builtin_copysign(t, x);\n }\n\n @inline\n export function trunc(x: f64): f64 {\n return builtin_trunc(x);\n }\n\n /** @internal */\n export function scalbn(x: f64, n: i32): f64 { // see: https://git.musl-libc.org/cgit/musl/tree/src/math/scalbn.c\n const\n Ox1p53 = reinterpret(0x4340000000000000),\n Ox1p1023 = reinterpret(0x7FE0000000000000),\n Ox1p_1022 = reinterpret(0x0010000000000000);\n var y = x;\n if (n > 1023) {\n y *= Ox1p1023;\n n -= 1023;\n if (n > 1023) {\n y *= Ox1p1023;\n n = builtin_min(n - 1023, 1023);\n }\n } else if (n < -1022) {\n /* make sure final n < -53 to avoid double\n\t\t rounding in the subnormal range */\n y *= Ox1p_1022 * Ox1p53;\n n += 1022 - 53;\n if (n < -1022) {\n y *= Ox1p_1022 * Ox1p53;\n n = builtin_max(n + 1022 - 53, -1022);\n }\n }\n return y * reinterpret((0x3FF + n) << 52);\n }\n\n export function mod(x: f64, y: f64): f64 { // see: musl/src/math/fmod.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 52 & 0x7FF);\n var ey = (uy >> 52 & 0x7FF);\n var sx = ux >> 63;\n var uy1 = uy << 1;\n if (uy1 == 0 || ex == 0x7FF || isNaN(y)) {\n let m = x * y;\n return m / m;\n }\n var ux1 = ux << 1;\n if (ux1 <= uy1) {\n if (ux1 == uy1) return 0 * x;\n return x;\n }\n if (!ex) {\n ex -= builtin_clz(ux << 12);\n ux <<= -ex + 1;\n } else {\n ux &= -1 >> 12;\n ux |= 1 << 52;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 12);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 12;\n uy |= 1 << 52;\n }\n while (ex > ey) {\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n ux <<= 1;\n --ex;\n }\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n // for (; !(ux >> 52); ux <<= 1) --ex;\n var shift = builtin_clz(ux << 11);\n ex -= shift;\n ux <<= shift;\n if (ex > 0) {\n ux -= 1 << 52;\n ux |= ex << 52;\n } else {\n ux >>= -ex + 1;\n }\n ux |= sx << 63;\n return reinterpret(ux);\n }\n\n export function rem(x: f64, y: f64): f64 { // see: musl/src/math/remquo.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 52 & 0x7FF);\n var ey = (uy >> 52 & 0x7FF);\n var sx = (ux >> 63);\n if (uy << 1 == 0 || ex == 0x7FF || isNaN(y)) {\n let m = x * y;\n return m / m;\n }\n if (ux << 1 == 0) return x;\n var uxi = ux;\n if (!ex) {\n ex -= builtin_clz(uxi << 12);\n uxi <<= -ex + 1;\n } else {\n uxi &= -1 >> 12;\n uxi |= 1 << 52;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 12);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 12;\n uy |= 1 << 52;\n }\n var q: u32 = 0;\n do {\n if (ex < ey) {\n if (ex + 1 == ey) break; // goto end\n return x;\n }\n while (ex > ey) {\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n uxi <<= 1;\n q <<= 1;\n --ex;\n }\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n if (uxi == 0) ex = -60;\n else {\n let shift = builtin_clz(uxi << 11);\n ex -= shift;\n uxi <<= shift;\n }\n break;\n } while (false);\n // end:\n if (ex > 0) {\n uxi -= 1 << 52;\n uxi |= ex << 52;\n } else {\n uxi >>= -ex + 1;\n }\n x = reinterpret(uxi);\n y = builtin_abs(y);\n var x2 = x + x;\n if (ex == ey || (ex + 1 == ey && (x2 > y || (x2 == y && (q & 1))))) {\n x -= y;\n // ++q;\n }\n return sx ? -x : x;\n }\n}\n\n/** @internal */\nfunction Rf(z: f32): f32 { // Rational approximation of (asin(x)-x)/x^3\n const // see: musl/src/math/asinf.c and SUN COPYRIGHT NOTICE above\n pS0 = reinterpret(0x3E2AAA75), // 1.6666586697e-01f\n pS1 = reinterpret(0xBD2F13BA), // -4.2743422091e-02f\n pS2 = reinterpret(0xBC0DD36B), // -8.6563630030e-03f\n qS1 = reinterpret(0xBF34E5AE); // -7.0662963390e-01f\n var p = z * (pS0 + z * (pS1 + z * pS2));\n var q: f32 = 1 + z * qS1;\n return p / q;\n}\n\n@inline /** @internal */\nfunction expo2f(x: f32): f32 { // exp(x)/2 for x >= log(DBL_MAX)\n const // see: musl/src/math/__expo2f.c\n k = 235,\n kln2 = reinterpret(0x4322E3BC); // 0x1.45c778p+7f\n var scale = reinterpret((0x7F + (k >> 1)) << 23);\n return NativeMathf.exp(x - kln2) * scale * scale;\n}\n\nexport namespace NativeMathf {\n\n export const E = NativeMath.E;\n export const LN2 = NativeMath.LN2;\n export const LN10 = NativeMath.LN10;\n export const LOG2E = NativeMath.LOG2E;\n export const LOG10E = NativeMath.LOG10E;\n export const PI = NativeMath.PI;\n export const SQRT1_2 = NativeMath.SQRT1_2;\n export const SQRT2 = NativeMath.SQRT2;\n\n @inline\n export function abs(x: f32): f32 {\n return builtin_abs(x);\n }\n\n export function acos(x: f32): f32 { // see: musl/src/math/acosf.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret(0x3FC90FDA), // 1.5707962513e+00f\n pio2_lo = reinterpret(0x33A22168), // 7.5497894159e-08f\n Ox1p_120f = reinterpret(0x03800000);\n var hx = reinterpret(x);\n var ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3F800000) {\n if (ix == 0x3F800000) {\n if (hx >> 31) return 2 * pio2_hi + Ox1p_120f;\n return 0;\n }\n return 0 / (x - x);\n }\n if (ix < 0x3F000000) {\n if (ix <= 0x32800000) return pio2_hi + Ox1p_120f;\n return pio2_hi - (x - (pio2_lo - x * Rf(x * x)));\n }\n var z: f32, w: f32, s: f32;\n if (hx >> 31) {\n // z = (1 + x) * 0.5;\n z = 0.5 + x * 0.5;\n s = builtin_sqrt(z);\n w = Rf(z) * s - pio2_lo;\n return 2 * (pio2_hi - (s + w));\n }\n // z = (1 - x) * 0.5;\n z = 0.5 - x * 0.5;\n s = builtin_sqrt(z);\n hx = reinterpret(s);\n var df = reinterpret(hx & 0xFFFFF000);\n var c = (z - df * df) / (s + df);\n w = Rf(z) * s + c;\n return 2 * (df + w);\n }\n\n export function acosh(x: f32): f32 { // see: musl/src/math/acoshf.c\n const s = reinterpret(0x3F317218); // 0.693147180559945309417232121458176568f\n var u = reinterpret(x);\n var a = u & 0x7FFFFFFF;\n if (a < 0x3F800000 + (1 << 23)) {\n let xm1 = x - 1;\n return log1p(xm1 + builtin_sqrt(xm1 * (xm1 + 2)));\n }\n if (a < 0x3F800000 + (12 << 23)) return log(2 * x - 1 / (x + builtin_sqrt(x * x - 1)));\n return log(x) + s;\n }\n\n export function asin(x: f32): f32 { // see: musl/src/math/asinf.c and SUN COPYRIGHT NOTICE above\n const\n pio2 = reinterpret(0x3FC90FDB), // 1.570796326794896558e+00f\n Ox1p_120f = reinterpret(0x03800000);\n var sx = x;\n var hx = reinterpret(x) & 0x7FFFFFFF;\n if (hx >= 0x3F800000) {\n if (hx == 0x3F800000) return x * pio2 + Ox1p_120f;\n return 0 / (x - x);\n }\n if (hx < 0x3F000000) {\n if (hx < 0x39800000 && hx >= 0x00800000) return x;\n return x + x * Rf(x * x);\n }\n // var z: f32 = (1 - builtin_abs(x)) * 0.5;\n var z: f32 = 0.5 - builtin_abs(x) * 0.5;\n var s = builtin_sqrt(z); // sic\n x = (pio2 - 2 * (s + s * Rf(z)));\n return builtin_copysign(x, sx);\n }\n\n export function asinh(x: f32): f32 { // see: musl/src/math/asinhf.c\n const c = reinterpret(0x3F317218); // 0.693147180559945309417232121458176568f\n var u = reinterpret(x) & 0x7FFFFFFF;\n var y = reinterpret(u);\n if (u >= 0x3F800000 + (12 << 23)) y = log(y) + c;\n else if (u >= 0x3F800000 + (1 << 23)) y = log(2 * y + 1 / (builtin_sqrt(y * y + 1) + y));\n else if (u >= 0x3F800000 - (12 << 23)) y = log1p(y + y * y / (builtin_sqrt(y * y + 1) + 1));\n return builtin_copysign(y, x);\n }\n\n export function atan(x: f32): f32 { // see: musl/src/math/atanf.c and SUN COPYRIGHT NOTICE above\n const\n atanhi0 = reinterpret(0x3EED6338), // 4.6364760399e-01f\n atanhi1 = reinterpret(0x3F490FDA), // 7.8539812565e-01f\n atanhi2 = reinterpret(0x3F7B985E), // 9.8279368877e-01f\n atanhi3 = reinterpret(0x3FC90FDA), // 1.5707962513e+00f\n atanlo0 = reinterpret(0x31AC3769), // 5.0121582440e-09f\n atanlo1 = reinterpret(0x33222168), // 3.7748947079e-08f\n atanlo2 = reinterpret(0x33140FB4), // 3.4473217170e-08f\n atanlo3 = reinterpret(0x33A22168), // 7.5497894159e-08f\n aT0 = reinterpret(0x3EAAAAA9), // 3.3333328366e-01f\n aT1 = reinterpret(0xBE4CCA98), // -1.9999158382e-01f\n aT2 = reinterpret(0x3E11F50D), // 1.4253635705e-01f\n aT3 = reinterpret(0xBDDA1247), // -1.0648017377e-01f\n aT4 = reinterpret(0x3D7CAC25), // 6.1687607318e-02f\n Ox1p_120f = reinterpret(0x03800000);\n var ix = reinterpret(x);\n var sx = x;\n ix &= 0x7FFFFFFF;\n var z: f32;\n if (ix >= 0x4C800000) {\n if (isNaN(x)) return x;\n z = atanhi3 + Ox1p_120f;\n return builtin_copysign(z, sx);\n }\n var id: i32;\n if (ix < 0x3EE00000) {\n if (ix < 0x39800000) return x;\n id = -1;\n } else {\n x = builtin_abs(x);\n if (ix < 0x3F980000) {\n if (ix < 0x3F300000) {\n id = 0;\n x = (2.0 * x - 1.0) / (2.0 + x);\n } else {\n id = 1;\n x = (x - 1.0) / (x + 1.0);\n }\n } else {\n if (ix < 0x401C0000) {\n id = 2;\n x = (x - 1.5) / (1.0 + 1.5 * x);\n } else {\n id = 3;\n x = -1.0 / x;\n }\n }\n }\n z = x * x;\n var w = z * z;\n var s1 = z * (aT0 + w * (aT2 + w * aT4));\n var s2 = w * (aT1 + w * aT3);\n var s3 = x * (s1 + s2);\n if (id < 0) return x - s3;\n switch (id) {\n case 0: { z = atanhi0 - ((s3 - atanlo0) - x); break; }\n case 1: { z = atanhi1 - ((s3 - atanlo1) - x); break; }\n case 2: { z = atanhi2 - ((s3 - atanlo2) - x); break; }\n case 3: { z = atanhi3 - ((s3 - atanlo3) - x); break; }\n default: unreachable();\n }\n return builtin_copysign(z, sx);\n }\n\n export function atanh(x: f32): f32 { // see: musl/src/math/atanhf.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFF;\n var y = reinterpret(u);\n if (u < 0x3F800000 - (1 << 23)) {\n if (u >= 0x3F800000 - (32 << 23)) y = 0.5 * log1p(2 * y * (1.0 + y / (1 - y)));\n } else y = 0.5 * log1p(2 * (y / (1 - y)));\n return builtin_copysign(y, x);\n }\n\n export function atan2(y: f32, x: f32): f32 { // see: musl/src/math/atan2f.c and SUN COPYRIGHT NOTICE above\n const\n pi = reinterpret(0x40490FDB), // 3.1415927410e+00f\n pi_lo = reinterpret(0xB3BBBD2E); // -8.7422776573e-08f\n if (isNaN(x) || isNaN(y)) return x + y;\n var ix = reinterpret(x);\n var iy = reinterpret(y);\n if (ix == 0x3F800000) return atan(y);\n var m = (((iy >> 31) & 1) | ((ix >> 30) & 2));\n ix &= 0x7FFFFFFF;\n iy &= 0x7FFFFFFF;\n if (iy == 0) {\n switch (m) {\n case 0:\n case 1: return y;\n case 2: return pi;\n case 3: return -pi;\n }\n }\n if (ix == 0) return m & 1 ? -pi / 2 : pi / 2;\n if (ix == 0x7F800000) {\n if (iy == 0x7F800000) {\n switch (m) {\n case 0: return pi / 4;\n case 1: return -pi / 4;\n case 2: return 3 * pi / 4;\n case 3: return -3 * pi / 4;\n }\n } else {\n switch (m) {\n case 0: return 0;\n case 1: return -0;\n case 2: return pi;\n case 3: return -pi;\n }\n }\n }\n if (ix + (26 << 23) < iy || iy == 0x7F800000) return m & 1 ? -pi / 2 : pi / 2;\n var z: f32;\n if ((m & 2) && iy + (26 << 23) < ix) z = 0.0;\n else z = atan(builtin_abs(y / x));\n switch (m) {\n case 0: return z;\n case 1: return -z;\n case 2: return pi - (z - pi_lo);\n case 3: return (z - pi_lo) - pi;\n }\n unreachable();\n return 0;\n }\n\n export function cbrt(x: f32): f32 { // see: musl/src/math/cbrtf.c and SUN COPYRIGHT NOTICE above\n const\n B1 = 709958130,\n B2 = 642849266,\n Ox1p24f = reinterpret(0x4B800000);\n var u = reinterpret(x);\n var hx = u & 0x7FFFFFFF;\n if (hx >= 0x7F800000) return x + x;\n if (hx < 0x00800000) {\n if (hx == 0) return x;\n u = reinterpret(x * Ox1p24f);\n hx = u & 0x7FFFFFFF;\n hx = hx / 3 + B2;\n } else {\n hx = hx / 3 + B1;\n }\n u &= 0x80000000;\n u |= hx;\n var t = reinterpret(u);\n var r = t * t * t;\n t = t * (x + x + r) / (x + r + r);\n r = t * t * t;\n t = t * (x + x + r) / (x + r + r);\n return t;\n }\n\n @inline\n export function ceil(x: f32): f32 {\n return builtin_ceil(x);\n }\n\n @inline\n export function clz32(x: f32): f32 {\n return builtin_clz(x);\n }\n\n export function cos(x: f32): f32 { // TODO\n unreachable();\n return 0;\n }\n\n export function cosh(x: f32): f32 { // see: musl/src/math/coshf.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFF;\n x = reinterpret(u);\n if (u < 0x3F317217) {\n if (u < 0x3F800000 - (12 << 23)) return 1;\n let t = expm1(x);\n // return 1 + t * t / (2 * (1 + t));\n return 1 + t * t / (2 + 2 * t);\n }\n if (u < 0x42B17217) {\n let t = exp(x);\n // return 0.5 * (t + 1 / t);\n return 0.5 * t + 0.5 / t;\n }\n return expo2f(x);\n }\n\n @inline\n export function floor(x: f32): f32 {\n return builtin_floor(x);\n }\n\n export function exp(x: f32): f32 { // see: musl/src/math/expf.c and SUN COPYRIGHT NOTICE above\n const\n ln2hi = reinterpret(0x3F317200), // 6.9314575195e-1f\n ln2lo = reinterpret(0x35BFBE8E), // 1.4286067653e-6f\n invln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+0f\n P1 = reinterpret(0x3E2AAA8F), // 1.6666625440e-1f\n P2 = reinterpret(0xBB355215), // -2.7667332906e-3f\n Ox1p127f = reinterpret(0x7F000000);\n var hx = reinterpret(x);\n var sign_ = (hx >> 31);\n hx &= 0x7FFFFFFF;\n if (hx >= 0x42AEAC50) {\n if (hx >= 0x42B17218) {\n if (!sign_) return x * Ox1p127f;\n else if (hx >= 0x42CFF1B5) return 0;\n }\n }\n var hi: f32, lo: f32;\n var k: i32;\n if (hx > 0x3EB17218) {\n if (hx > 0x3F851592) {\n k = (invln2 * x + builtin_copysign(0.5, x));\n } else {\n k = 1 - (sign_ << 1);\n }\n hi = x - k * ln2hi;\n lo = k * ln2lo;\n x = hi - lo;\n } else if (hx > 0x39000000) {\n k = 0;\n hi = x;\n lo = 0;\n } else {\n return 1 + x;\n }\n var xx = x * x;\n var c = x - xx * (P1 + xx * P2);\n var y: f32 = 1 + (x * c / (2 - c) - lo + hi);\n if (k == 0) return y;\n return scalbn(y, k);\n }\n\n export function expm1(x: f32): f32 { // see: musl/src/math/expm1f.c and SUN COPYRIGHT NOTICE above\n const\n o_threshold = reinterpret(0x42B17180), // 8.8721679688e+01f\n ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01f\n ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06f\n invln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+00f\n Q1 = reinterpret(0xBD088868), // -3.3333212137e-02f\n Q2 = reinterpret(0x3ACF3010), // 1.5807170421e-03f\n Ox1p127f = reinterpret(0x7F000000);\n var u = reinterpret(x);\n var hx = u & 0x7FFFFFFF;\n var sign_ = (u >> 31);\n if (hx >= 0x4195B844) {\n if (hx > 0x7F800000) return x;\n if (sign_) return -1;\n if (x > o_threshold) {\n x *= Ox1p127f;\n return x;\n }\n }\n var c: f32 = 0.0, t: f32, k: i32;\n if (hx > 0x3EB17218) {\n k = select(\n 1 - (sign_ << 1),\n (invln2 * x + builtin_copysign(0.5, x)),\n hx < 0x3F851592\n );\n t = k;\n let hi = x - t * ln2_hi;\n let lo = t * ln2_lo;\n x = hi - lo;\n c = (hi - x) - lo;\n } else if (hx < 0x33000000) {\n return x;\n } else k = 0;\n var hfx: f32 = 0.5 * x;\n var hxs: f32 = x * hfx;\n var r1: f32 = 1.0 + hxs * (Q1 + hxs * Q2);\n t = 3.0 - r1 * hfx;\n var e = hxs * ((r1 - t) / (6.0 - x * t));\n if (k == 0) return x - (x * e - hxs);\n e = x * (e - c) - c;\n e -= hxs;\n if (k == -1) return 0.5 * (x - e) - 0.5;\n if (k == 1) {\n if (x < -0.25) return -2.0 * (e - (x + 0.5));\n return 1.0 + 2.0 * (x - e);\n }\n u = (0x7F + k) << 23;\n var twopk = reinterpret(u);\n var y: f32;\n if (k < 0 || k > 56) {\n y = x - e + 1.0;\n if (k == 128) y = y * 2.0 * Ox1p127f;\n else y = y * twopk;\n return y - 1.0;\n }\n u = (0x7F - k) << 23;\n y = reinterpret(u);\n if (k < 20) y = (1 - y) - e;\n else y = 1 - (e + y);\n return (x + y) * twopk;\n }\n\n @inline\n export function fround(x: f32): f32 {\n return x;\n }\n\n export function hypot(x: f32, y: f32): f32 { // see: musl/src/math/hypotf.c\n const\n Ox1p90f = reinterpret(0x6C800000),\n Ox1p_90f = reinterpret(0x12800000);\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n ux &= 0x7FFFFFFF;\n uy &= 0x7FFFFFFF;\n if (ux < uy) {\n let ut = ux;\n ux = uy;\n uy = ut;\n }\n x = reinterpret(ux);\n y = reinterpret(uy);\n if (uy == 0xFF << 23) return y;\n if (ux >= 0xFF << 23 || uy == 0 || ux - uy >= 25 << 23) return x + y;\n var z: f32 = 1;\n if (ux >= (0x7F + 60) << 23) {\n z = Ox1p90f;\n x *= Ox1p_90f;\n y *= Ox1p_90f;\n } else if (uy < (0x7F - 60) << 23) {\n z = Ox1p_90f;\n x *= Ox1p90f;\n y *= Ox1p90f;\n }\n return z * builtin_sqrt((x * x + y * y));\n }\n\n @inline\n export function imul(x: f32, y: f32): f32 {\n return (x * y);\n }\n\n export function log(x: f32): f32 { // see: musl/src/math/logf.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01f\n ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06f\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f\n Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f\n Ox1p25f = reinterpret(0x4C000000);\n var u = reinterpret(x);\n var k = 0;\n if (u < 0x00800000 || (u >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (u >> 31) return (x - x) / 0;\n k -= 25;\n x *= Ox1p25f;\n u = reinterpret(x);\n } else if (u >= 0x7F800000) return x;\n else if (u == 0x3F800000) return 0;\n u += 0x3F800000 - 0x3F3504F3;\n k += (u >> 23) - 0x7F;\n u = (u & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret(u);\n var f = x - 1.0;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq = 0.5 * f * f;\n var dk = k;\n return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi;\n }\n\n export function log10(x: f32): f32 { // see: musl/src/math/log10f.c and SUN COPYRIGHT NOTICE above\n const\n ivln10hi = reinterpret(0x3EDE6000), // 4.3432617188e-01f\n ivln10lo = reinterpret(0xB804EAD9), // -3.1689971365e-05f\n log10_2hi = reinterpret(0x3E9A2080), // 3.0102920532e-01f\n log10_2lo = reinterpret(0x355427DB), // 7.9034151668e-07f\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f, 0.24279078841f\n Ox1p25f = reinterpret(0x4C000000);\n var ix = reinterpret(x);\n var k = 0;\n if (ix < 0x00800000 || (ix >> 31)) {\n if (ix << 1 == 0) return -1 / (x * x);\n if (ix >> 31) return (x - x) / 0.0;\n k -= 25;\n x *= Ox1p25f;\n ix = reinterpret(x);\n } else if (ix >= 0x7F800000) return x;\n else if (ix == 0x3F800000) return 0;\n ix += 0x3F800000 - 0x3F3504F3;\n k += (ix >> 23) - 0x7F;\n ix = (ix & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret(ix);\n var f = x - 1.0;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq: f32 = 0.5 * f * f;\n var hi = f - hfsq;\n ix = reinterpret(hi);\n ix &= 0xFFFFF000;\n hi = reinterpret(ix);\n var lo = f - hi - hfsq + s * (hfsq + r);\n var dk = k;\n return dk * log10_2lo + (lo + hi) * ivln10lo + lo * ivln10hi + hi * ivln10hi + dk * log10_2hi;\n }\n\n export function log1p(x: f32): f32 { // see: musl/src/math/log1pf.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01\n ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret(0x3E789E26); // 0xf89e26.0p-26f, 0.24279078841f\n var ix = reinterpret(x);\n var c: f32 = 0, f: f32 = 0;\n var k: i32 = 1;\n if (ix < 0x3ED413D0 || (ix >> 31)) {\n if (ix >= 0xBF800000) {\n if (x == -1) return x / 0.0;\n return (x - x) / 0.0;\n }\n if (ix << 1 < 0x33800000 << 1) return x;\n if (ix <= 0xBE95F619) {\n k = 0;\n c = 0;\n f = x;\n }\n } else if (ix >= 0x7F800000) return x;\n if (k) {\n let uf: f32 = 1 + x;\n let iu = reinterpret(uf);\n iu += 0x3F800000 - 0x3F3504F3;\n k = (iu >> 23) - 0x7F;\n if (k < 25) {\n c = k >= 2 ? 1 - (uf - x) : x - (uf - 1);\n c /= uf;\n } else c = 0;\n iu = (iu & 0x007FFFFF) + 0x3F3504F3;\n f = reinterpret(iu) - 1;\n }\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq: f32 = 0.5 * f * f;\n var dk = k;\n return s * (hfsq + r) + (dk * ln2_lo + c) - hfsq + f + dk * ln2_hi;\n }\n\n export function log2(x: f32): f32 { // see: musl/src/math/log2f.c and SUN COPYRIGHT NOTICE above\n const\n ivln2hi = reinterpret(0x3FB8B000), // 1.4428710938e+00f\n ivln2lo = reinterpret(0xB9389AD4), // -1.7605285393e-04\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f, 0.24279078841f\n Ox1p25f = reinterpret(0x4C000000);\n var ix = reinterpret(x);\n var k: i32 = 0;\n if (ix < 0x00800000 || (ix >> 31)) {\n if (ix << 1 == 0) return -1 / (x * x);\n if (ix >> 31) return (x - x) / 0.0;\n k -= 25;\n x *= Ox1p25f;\n ix = reinterpret(x);\n } else if (ix >= 0x7F800000) return x;\n else if (ix == 0x3F800000) return 0;\n ix += 0x3F800000 - 0x3F3504F3;\n k += (ix >> 23) - 0x7F;\n ix = (ix & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret(ix);\n var f = x - 1.0;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq: f32 = 0.5 * f * f;\n var hi = f - hfsq;\n var u = reinterpret(hi);\n u &= 0xFFFFF000;\n hi = reinterpret(u);\n var lo: f32 = f - hi - hfsq + s * (hfsq + r);\n var dk = k;\n return (lo + hi) * ivln2lo + lo * ivln2hi + hi * ivln2hi + dk;\n }\n\n @inline\n export function max(value1: f32, value2: f32): f32 {\n return builtin_max(value1, value2);\n }\n\n @inline\n export function min(value1: f32, value2: f32): f32 {\n return builtin_min(value1, value2);\n }\n\n export function pow(x: f32, y: f32): f32 { // see: musl/src/math/powf.c and SUN COPYRIGHT NOTICE above\n const\n dp_h1 = reinterpret(0x3F15C000), // 5.84960938e-01f\n dp_l1 = reinterpret(0x35D1CFDC), // 1.56322085e-06f\n two24 = reinterpret(0x4B800000), // 16777216f\n huge = reinterpret(0x7149F2CA), // 1.0e+30f\n tiny = reinterpret(0x0DA24260), // 1.0e-30f\n L1 = reinterpret(0x3F19999A), // 6.0000002384e-01f\n L2 = reinterpret(0x3EDB6DB7), // 4.2857143283e-01f\n L3 = reinterpret(0x3EAAAAAB), // 3.3333334327e-01f\n L4 = reinterpret(0x3E8BA305), // 2.7272811532e-01f\n L5 = reinterpret(0x3E6C3255), // 2.3066075146e-01f\n L6 = reinterpret(0x3E53F142), // 2.0697501302e-01f\n P1 = reinterpret(0x3E2AAAAB), // 1.6666667163e-01f\n P2 = reinterpret(0xBB360B61), // -2.7777778450e-03f\n P3 = reinterpret(0x388AB355), // 6.6137559770e-05f\n P4 = reinterpret(0xB5DDEA0E), // -1.6533901999e-06f\n P5 = reinterpret(0x3331BB4C), // 4.1381369442e-08f\n lg2 = reinterpret(0x3F317218), // 6.9314718246e-01f\n lg2_h = reinterpret(0x3F317200), // 6.93145752e-01f\n lg2_l = reinterpret(0x35BFBE8C), // 1.42860654e-06f\n ovt = reinterpret(0x3338AA3C), // 4.2995665694e-08f\n cp = reinterpret(0x3F76384F), // 9.6179670095e-01\n cp_h = reinterpret(0x3F764000), // 9.6191406250e-01\n cp_l = reinterpret(0xB8F623C6), // -1.1736857402e-04\n ivln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+00\n ivln2_h = reinterpret(0x3FB8AA00), // 1.4426879883e+00\n ivln2_l = reinterpret(0x36ECA570), // 7.0526075433e-06\n inv3 = reinterpret(0x3EAAAAAB); // 0.333333333333\n var hx = reinterpret(x);\n var hy = reinterpret(y);\n var ix = hx & 0x7FFFFFFF;\n var iy = hy & 0x7FFFFFFF;\n if (iy == 0) return 1.0; // x**0 = 1, even if x is NaN\n // if (hx == 0x3F800000) return 1.0; // C: 1**y = 1, even if y is NaN, JS: NaN\n if (ix > 0x7F800000 || iy > 0x7F800000) return x + y; // NaN if either arg is NaN\n var yisint = 0, j: i32, k: i32;\n if (hx < 0) {\n if (iy >= 0x4B800000) yisint = 2;\n else if (iy >= 0x3F800000) {\n k = (iy >> 23) - 0x7F;\n let ki = 23 - k;\n j = iy >> ki;\n if ((j << ki) == iy) yisint = 2 - (j & 1);\n }\n }\n if (iy == 0x7F800000) { // y is +-inf\n if (ix == 0x3F800000) return NaN; // C: (-1)**+-inf is 1, JS: NaN\n else if (ix > 0x3F800000) return hy >= 0 ? y : 0.0; // (|x|>1)**+-inf = inf,0\n else return hy >= 0 ? 0.0 : -y; // (|x|<1)**+-inf = 0,inf\n }\n if (iy == 0x3F800000) return hy >= 0 ? x : 1.0 / x;\n if (hy == 0x40000000) return x * x;\n if (hy == 0x3F000000) {\n if (hx >= 0) return builtin_sqrt(x);\n }\n var ax = builtin_abs(x);\n var z: f32;\n if (ix == 0x7F800000 || ix == 0 || ix == 0x3F800000) {\n z = ax;\n if (hy < 0) z = 1.0 / z;\n if (hx < 0) {\n if (((ix - 0x3F800000) | yisint) == 0) {\n let d = z - z;\n z = d / d;\n }\n else if (yisint == 1) z = -z;\n }\n return z;\n }\n var sn = 1.0;\n if (hx < 0) {\n if (yisint == 0) {\n let d = x - x;\n return d / d;\n }\n if (yisint == 1) sn = -1.0;\n }\n var t1: f32, t2: f32, r: f32, s: f32, t: f32, u: f32, v: f32, w: f32, p_h: f32, p_l: f32;\n var n: i32, is: i32;\n if (iy > 0x4D000000) {\n if (ix < 0x3F7FFFF8) return hy < 0 ? sn * huge * huge : sn * tiny * tiny;\n if (ix > 0x3F800007) return hy > 0 ? sn * huge * huge : sn * tiny * tiny;\n t = ax - 1;\n w = (t * t) * (0.5 - t * (inv3 - t * 0.25));\n u = ivln2_h * t;\n v = t * ivln2_l - w * ivln2;\n t1 = u + v;\n is = reinterpret(t1);\n t1 = reinterpret(is & 0xFFFFF000);\n t2 = v - (t1 - u);\n } else {\n let s2: f32, s_h: f32, s_l: f32, t_h: f32, t_l: f32;\n n = 0;\n if (ix < 0x00800000) {\n ax *= two24;\n n -= 24;\n ix = reinterpret(ax);\n }\n n += (ix >> 23) - 0x7F;\n j = ix & 0x007FFFFF;\n ix = j | 0x3F800000;\n if (j <= 0x1CC471) k = 0;\n else if (j < 0x5DB3D7) k = 1;\n else {\n k = 0;\n n += 1;\n ix -= 0x00800000;\n }\n ax = reinterpret(ix);\n let bp = select(1.5, 1.0, k); // k ? 1.5 : 1.0\n u = ax - bp;\n v = 1.0 / (ax + bp);\n s = u * v;\n s_h = s;\n is = reinterpret(s_h);\n s_h = reinterpret(is & 0xFFFFF000);\n is = ((ix >> 1) & 0xFFFFF000) | 0x20000000;\n t_h = reinterpret(is + 0x00400000 + (k << 21));\n t_l = ax - (t_h - bp);\n s_l = v * ((u - s_h * t_h) - s_h * t_l);\n s2 = s * s;\n r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6)))));\n r += s_l * (s_h + s);\n s2 = s_h * s_h;\n t_h = 3.0 + s2 + r;\n is = reinterpret(t_h);\n t_h = reinterpret(is & 0xFFFFF000);\n t_l = r - ((t_h - 3.0) - s2);\n u = s_h * t_h;\n v = s_l * t_h + t_l * s;\n p_h = u + v;\n is = reinterpret(p_h);\n p_h = reinterpret(is & 0xFFFFF000);\n p_l = v - (p_h - u);\n let z_h = cp_h * p_h;\n let dp_l = select(dp_l1, 0.0, k);\n let z_l = cp_l * p_h + p_l * cp + dp_l;\n t = n;\n let dp_h = select(dp_h1, 0.0, k);\n t1 = (((z_h + z_l) + dp_h) + t);\n is = reinterpret(t1);\n t1 = reinterpret(is & 0xFFFFF000);\n t2 = z_l - (((t1 - t) - dp_h) - z_h);\n }\n is = reinterpret(y);\n var y1 = reinterpret(is & 0xFFFFF000);\n p_l = (y - y1) * t1 + y * t2;\n p_h = y1 * t1;\n z = p_l + p_h;\n j = reinterpret(z);\n if (j > 0x43000000) {\n return sn * huge * huge;\n } else if (j == 0x43000000) {\n if (p_l + ovt > z - p_h) return sn * huge * huge;\n } else if ((j & 0x7FFFFFFF) > 0x43160000) {\n return sn * tiny * tiny;\n } else if (j == 0xC3160000) {\n if (p_l <= z - p_h) return sn * tiny * tiny;\n }\n var i = j & 0x7FFFFFFF;\n k = (i >> 23) - 0x7F;\n n = 0;\n if (i > 0x3F000000) {\n n = j + (0x00800000 >> (k + 1));\n k = ((n & 0x7FFFFFFF) >> 23) - 0x7F;\n t = reinterpret(n & ~(0x007FFFFF >> k));\n n = ((n & 0x007FFFFF) | 0x00800000) >> (23 - k);\n if (j < 0) n = -n;\n p_h -= t;\n }\n t = p_l + p_h;\n is = reinterpret(t);\n t = reinterpret(is & 0xFFFF8000);\n u = t * lg2_h;\n v = (p_l - (t - p_h)) * lg2 + t * lg2_l;\n z = u + v;\n w = v - (z - u);\n t = z * z;\n t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));\n r = (z * t1) / (t1 - 2.0) - (w + z * w);\n z = 1.0 - (r - z);\n j = reinterpret(z);\n j += n << 23;\n if ((j >> 23) <= 0) z = scalbn(z, n);\n else z = reinterpret(j);\n return sn * z;\n }\n\n @inline\n export function seedRandom(value: i64): void {\n NativeMath.seedRandom(value);\n }\n\n // Using xoroshiro64starstar from http://xoshiro.di.unimi.it/xoroshiro64starstar.c\n export function random(): f32 {\n if (!random_seeded) throw new Error("PRNG must be seeded.");\n\n var s0 = random_state0_32;\n var s1 = random_state1_32;\n var r = rotl(s0 * 0x9E3779BB, 5) * 5;\n\n s1 ^= s0;\n random_state0_32 = rotl(s0, 26) ^ s1 ^ (s1 << 9);\n random_state1_32 = rotl(s1, 13);\n\n return reinterpret((r >> 9) | (127 << 23)) - 1.0;\n }\n\n @inline\n export function round(x: f32): f32 {\n return builtin_copysign(builtin_floor(x + 0.5), x);\n }\n\n @inline\n export function sign(x: f32): f32 {\n if (ASC_SHRINK_LEVEL > 0) {\n return builtin_abs(x) > 0 ? builtin_copysign(1, x) : x;\n } else {\n return x > 0 ? 1 : x < 0 ? -1 : x;\n }\n }\n\n @inline\n export function signbit(x: f32): bool {\n return ((reinterpret(x) >>> 31) & (x == x));\n }\n\n export function sin(x: f32): f32 { // TODO\n unreachable();\n return 0;\n }\n\n export function sinh(x: f32): f32 { // see: musl/src/math/sinhf.c\n var u = reinterpret(x) & 0x7FFFFFFF;\n var absx = reinterpret(u);\n var t: f32;\n var h = builtin_copysign(0.5, x);\n if (u < 0x42B17217) {\n t = expm1(absx);\n if (u < 0x3F800000) {\n if (u < 0x3F800000 - (12 << 23)) return x;\n return h * (2 * t - t * t / (t + 1));\n }\n return h * (t + t / (t + 1));\n }\n t = 2 * h * expo2f(absx);\n return t;\n }\n\n @inline\n export function sqrt(x: f32): f32 {\n return builtin_sqrt(x);\n }\n\n export function tan(x: f32): f32 { // TODO\n unreachable();\n return 0;\n }\n\n export function tanh(x: f32): f32 { // see: musl/src/math/tanhf.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFF;\n var y = reinterpret(u);\n var t: f32;\n if (u > 0x3F0C9F54) {\n if (u > 0x41200000) t = 1 + 0 / y;\n else {\n t = expm1(2 * y);\n t = 1 - 2 / (t + 2);\n }\n } else if (u > 0x3E82C578) {\n t = expm1(2 * y);\n t = t / (t + 2);\n } else if (u >= 0x00800000) {\n t = expm1(-2 * y);\n t = -t / (t + 2);\n } else t = y;\n return builtin_copysign(t, x);\n }\n\n @inline\n export function trunc(x: f32): f32 {\n return builtin_trunc(x);\n }\n\n /** @internal */\n export function scalbn(x: f32, n: i32): f32 { // see: https://git.musl-libc.org/cgit/musl/tree/src/math/scalbnf.c\n const\n Ox1p24f = reinterpret(0x4B800000),\n Ox1p127f = reinterpret(0x7F000000),\n Ox1p_126f = reinterpret(0x00800000);\n var y = x;\n if (n > 127) {\n y *= Ox1p127f;\n n -= 127;\n if (n > 127) {\n y *= Ox1p127f;\n n = builtin_min(n - 127, 127);\n }\n } else if (n < -126) {\n y *= Ox1p_126f * Ox1p24f;\n n += 126 - 24;\n if (n < -126) {\n y *= Ox1p_126f * Ox1p24f;\n n = builtin_max(n + 126 - 24, -126);\n }\n }\n return y * reinterpret((0x7F + n) << 23);\n }\n\n export function mod(x: f32, y: f32): f32 { // see: musl/src/math/fmodf.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 23 & 0xFF);\n var ey = (uy >> 23 & 0xFF);\n var sx = ux & 0x80000000;\n var uy1 = uy << 1;\n if (uy1 == 0 || ex == 0xFF || isNaN(y)) {\n let m = x * y;\n return m / m;\n }\n var ux1 = ux << 1;\n if (ux1 <= uy1) {\n if (ux1 == uy1) return 0 * x;\n return x;\n }\n if (!ex) {\n ex -= builtin_clz(ux << 9);\n ux <<= -ex + 1;\n } else {\n ux &= -1 >> 9;\n ux |= 1 << 23;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 9);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 9;\n uy |= 1 << 23;\n }\n while (ex > ey) {\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n ux <<= 1;\n --ex;\n }\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n // for (; !(ux >> 23); ux <<= 1) --ex;\n var shift = builtin_clz(ux << 8);\n ex -= shift;\n ux <<= shift;\n if (ex > 0) {\n ux -= 1 << 23;\n ux |= ex << 23;\n } else {\n ux >>= -ex + 1;\n }\n ux |= sx;\n return reinterpret(ux);\n }\n\n export function rem(x: f32, y: f32): f32 { // see: musl/src/math/remquof.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 23 & 0xFF);\n var ey = (uy >> 23 & 0xFF);\n var sx = (ux >> 31);\n var uxi = ux;\n if (uy << 1 == 0 || ex == 0xFF || isNaN(y)) return (x * y) / (x * y);\n if (ux << 1 == 0) return x;\n if (!ex) {\n ex -= builtin_clz(uxi << 9);\n uxi <<= -ex + 1;\n } else {\n uxi &= -1 >> 9;\n uxi |= 1 << 23;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 9);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 9;\n uy |= 1 << 23;\n }\n var q = 0;\n do {\n if (ex < ey) {\n if (ex + 1 == ey) break; // goto end\n return x;\n }\n while (ex > ey) {\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n uxi <<= 1;\n q <<= 1;\n --ex;\n }\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n if (uxi == 0) ex = -30;\n else {\n let shift = builtin_clz(uxi << 8);\n ex -= shift;\n uxi <<= shift;\n }\n break;\n } while (false);\n // end\n if (ex > 0) {\n uxi -= 1 << 23;\n uxi |= ex << 23;\n } else {\n uxi >>= -ex + 1;\n }\n x = reinterpret(uxi);\n y = builtin_abs(y);\n var x2 = x + x;\n if (ex == ey || (ex + 1 == ey && (x2 > y || (x2 == y && (q & 1))))) {\n x -= y;\n // q++;\n }\n return sx ? -x : x;\n }\n}\n\nexport function ipow32(x: i32, e: i32): i32 {\n var out = 1;\n if (ASC_SHRINK_LEVEL < 1) {\n if (e < 0) return 0;\n\n switch (e) {\n case 0: return 1;\n case 1: return x;\n case 2: return x * x;\n }\n\n let log = 32 - clz(e);\n if (log <= 5) {\n // 32 = 2 ^ 5, so need only five cases.\n // But some extra cases needs for properly overflowing\n switch (log) {\n case 5: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 4: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 3: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 2: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 1: {\n if (e & 1) out *= x;\n }\n }\n return out;\n }\n }\n\n while (e > 0) {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n return out;\n}\n\nexport function ipow64(x: i64, e: i32): i64 {\n var out: i64 = 1;\n if (ASC_SHRINK_LEVEL < 1) {\n if (e < 0) return 0;\n switch (e) {\n case 0: return 1;\n case 1: return x;\n case 2: return x * x;\n }\n\n let log = 32 - clz(e);\n if (log <= 6) {\n // 64 = 2 ^ 6, so need only six cases.\n // But some extra cases needs for properly overflowing\n switch (log) {\n case 6: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 5: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 4: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 3: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 2: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 1: {\n if (e & 1) out *= x;\n }\n }\n return out;\n }\n }\n\n while (e > 0) {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n return out;\n}\n\nexport function ipow32f(x: f32, e: i32): f32 {\n var sign = e >> 31;\n e = (e + sign) ^ sign; // abs(e)\n var out: f32 = 1;\n while (e) {\n out *= select(x, 1.0, e & 1);\n e >>= 1;\n x *= x;\n }\n return sign ? 1.0 / out : out;\n}\n\nexport function ipow64f(x: f64, e: i32): f64 {\n var sign = e >> 31;\n e = (e + sign) ^ sign; // abs(e)\n var out = 1.0;\n while (e) {\n out *= select(x, 1.0, e & 1);\n e >>= 1;\n x *= x;\n }\n return sign ? 1.0 / out : out;\n}\n',memory:'import { memcmp, memmove, memset } from "./internal/memory";\n\n@builtin export declare const HEAP_BASE: usize; // tslint:disable-line\n\n/* tslint:disable */\n\nexport namespace memory {\n\n @builtin export declare function size(): i32;\n\n @builtin export declare function grow(pages: i32): i32;\n\n @inline export function fill(dest: usize, c: u8, n: usize): void { // see: musl/src/string/memset\n if (isDefined(__memory_fill)) { __memory_fill(dest, c, n); return; }\n memset(dest, c, n);\n }\n\n @inline export function copy(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memmove.c\n if (isDefined(__memory_copy)) { __memory_copy(dest, src, n); return; }\n memmove(dest, src, n);\n }\n\n @inline export function compare(vl: usize, vr: usize, n: usize): i32 { // see: musl/src/string/memcmp.c\n if (isDefined(__memory_compare)) return __memory_compare(vl, vr, n);\n return memcmp(vl, vr, n);\n }\n\n // Passive segments\n\n // export function init(segmentIndex: u32, srcOffset: usize, dstOffset: usize, n: usize): void {\n // __memory_init(segmentIndex, srcOffset, dstOffset);\n // }\n\n // export function drop(segmentIndex: u32): void {\n // __memory_drop(segmentIndex);\n // }\n\n // Allocator\n\n @inline export function allocate(size: usize): usize {\n if (isDefined(__memory_allocate)) return __memory_allocate(size);\n WARNING("Calling \'memory.allocate\' requires a memory manager to be present.");\n return unreachable();\n }\n\n @inline export function free(ptr: usize): void {\n if (isDefined(__memory_free)) { __memory_free(ptr); return; }\n WARNING("Calling \'memory.free\' requires a memory manager to be present.");\n unreachable();\n }\n\n @inline export function reset(): void {\n if (isDefined(__memory_reset)) { __memory_reset(); return; }\n unreachable();\n }\n}\n',number:'import {\n itoa,\n dtoa\n} from "./internal/number";\n\nimport {\n isNaN as builtin_isNaN,\n isFinite as builtin_isFinite\n} from "./builtins";\n\n@sealed\nexport abstract class I8 {\n\n static readonly MIN_VALUE: i8 = i8.MIN_VALUE;\n static readonly MAX_VALUE: i8 = i8.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i8 {\n return parseI32(value, radix);\n }\n\n toString(this: i8): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class I16 {\n\n static readonly MIN_VALUE: i16 = i16.MIN_VALUE;\n static readonly MAX_VALUE: i16 = i16.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i16 {\n return parseI32(value, radix);\n }\n\n toString(this: i16): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class I32 {\n\n static readonly MIN_VALUE: i32 = i32.MIN_VALUE;\n static readonly MAX_VALUE: i32 = i32.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i32 {\n return parseI32(value, radix);\n }\n\n toString(this: i32): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class I64 {\n\n static readonly MIN_VALUE: i64 = i64.MIN_VALUE;\n static readonly MAX_VALUE: i64 = i64.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i64 {\n return parseI64(value, radix);\n }\n\n toString(this: i64): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class Isize {\n\n static readonly MIN_VALUE: isize = isize.MIN_VALUE;\n static readonly MAX_VALUE: isize = isize.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): isize {\n return parseI64(value, radix);\n }\n\n toString(this: isize): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U8 {\n\n static readonly MIN_VALUE: u8 = u8.MIN_VALUE;\n static readonly MAX_VALUE: u8 = u8.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u8 {\n return parseI32(value, radix);\n }\n\n toString(this: u8): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U16 {\n\n static readonly MIN_VALUE: u16 = u16.MIN_VALUE;\n static readonly MAX_VALUE: u16 = u16.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u16 {\n return parseI32(value, radix);\n }\n\n toString(this: u16): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U32 {\n\n static readonly MIN_VALUE: u32 = u32.MIN_VALUE;\n static readonly MAX_VALUE: u32 = u32.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u32 {\n return parseI32(value, radix);\n }\n\n toString(this: u32): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U64 {\n\n static readonly MIN_VALUE: u64 = u64.MIN_VALUE;\n static readonly MAX_VALUE: u64 = u64.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u64 {\n return parseI64(value, radix);\n }\n\n toString(this: u64): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class Usize {\n\n static readonly MIN_VALUE: usize = usize.MIN_VALUE;\n static readonly MAX_VALUE: usize = usize.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): usize {\n return parseI64(value, radix);\n }\n\n toString(this: usize): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class Bool {\n\n static readonly MIN_VALUE: bool = bool.MIN_VALUE;\n static readonly MAX_VALUE: bool = bool.MAX_VALUE;\n\n toString(this: bool): String {\n // TODO: radix?\n return this ? "true" : "false";\n }\n}\n\n@sealed\nexport abstract class Boolean extends Bool {}\n\n@sealed\nexport abstract class F32 {\n\n static readonly EPSILON: f32 = f32.EPSILON;\n static readonly MIN_VALUE: f32 = f32.MIN_VALUE;\n static readonly MAX_VALUE: f32 = f32.MAX_VALUE;\n static readonly MIN_SAFE_INTEGER: f32 = f32.MIN_SAFE_INTEGER;\n static readonly MAX_SAFE_INTEGER: f32 = f32.MAX_SAFE_INTEGER;\n static readonly POSITIVE_INFINITY: f32 = Infinity;\n static readonly NEGATIVE_INFINITY: f32 = -Infinity;\n static readonly NaN: f32 = NaN;\n\n static isNaN(value: f32): bool {\n return isNaN(value);\n }\n\n static isFinite(value: f32): bool {\n return isFinite(value);\n }\n\n static isSafeInteger(value: f32): bool {\n return abs(value) <= f32.MAX_SAFE_INTEGER && trunc(value) == value;\n }\n\n static isInteger(value: f32): bool {\n return isFinite(value) && trunc(value) == value;\n }\n\n static parseInt(value: string, radix: i32 = 0): f32 {\n return parseI64(value, radix);\n }\n\n static parseFloat(value: string): f32 {\n return parseFloat(value);\n }\n\n toString(this: f32): String {\n // TODO: radix\n return dtoa(this);\n }\n}\n\n@sealed\nexport abstract class F64 {\n\n static readonly EPSILON: f64 = f64.EPSILON;\n static readonly MIN_VALUE: f64 = f64.MIN_VALUE;\n static readonly MAX_VALUE: f64 = f64.MAX_VALUE;\n static readonly MIN_SAFE_INTEGER: f64 = f64.MIN_SAFE_INTEGER;\n static readonly MAX_SAFE_INTEGER: f64 = f64.MAX_SAFE_INTEGER;\n static readonly POSITIVE_INFINITY: f64 = Infinity;\n static readonly NEGATIVE_INFINITY: f64 = -Infinity;\n static readonly NaN: f64 = NaN;\n\n static isNaN(value: f64): bool {\n return builtin_isNaN(value);\n }\n\n static isFinite(value: f64): bool {\n return builtin_isFinite(value);\n }\n\n static isSafeInteger(value: f64): bool {\n return abs(value) <= f64.MAX_SAFE_INTEGER && trunc(value) == value;\n }\n\n static isInteger(value: f64): bool {\n return builtin_isFinite(value) && trunc(value) == value;\n }\n\n static parseInt(value: string, radix: i32 = 0): f64 {\n return parseI64(value, radix);\n }\n\n static parseFloat(value: string): f64 {\n return parseFloat(value);\n }\n\n toString(this: f64): String {\n // TODO: radix\n return dtoa(this);\n }\n}\n\n@sealed\nexport abstract class Number extends F64 {}\n',polyfills:"export function bswap(value: T): T {\n if (isInteger()) {\n if (sizeof() == 2) {\n return ((value << 8) | ((value >> 8) & 0x00FF));\n }\n if (sizeof() == 4) {\n return (\n rotl(value & 0xFF00FF00, 8) |\n rotr(value & 0x00FF00FF, 8)\n );\n }\n if (sizeof() == 8) {\n let a = (value >> 8) & 0x00FF00FF00FF00FF;\n let b = (value & 0x00FF00FF00FF00FF) << 8;\n let v = a | b;\n\n a = (v >> 16) & 0x0000FFFF0000FFFF;\n b = (v & 0x0000FFFF0000FFFF) << 16;\n\n return rotr(a | b, 32);\n }\n return value;\n }\n assert(false);\n return value;\n}\n\n@inline\nexport function bswap16(value: T): T {\n if (isInteger() && sizeof() <= 4) {\n if (sizeof() == 2) {\n return ((value << 8) | ((value >> 8) & 0x00FF));\n } else if (sizeof() == 4) {\n return (((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000));\n }\n return value;\n }\n assert(false);\n return value;\n}\n",regexp:'export class RegExp {\n\n // @binding(CALL_NEW, [ STRING, STRING], OBJECT_HANDLE)\n constructor(pattern: string, flags: string = "") { throw new Error("unreachable"); }\n\n // @binding(CALL_THIS, [ STRING ], PASS_THRU)\n test(search: string): bool { throw new Error("unreachable"); }\n\n // @binding(CALL_THIS, [], STRING)\n toString(): string { throw new Error("unreachable"); }\n\n}\n',set:'import {\n HEADER_SIZE as HEADER_SIZE_AB\n} from "./internal/arraybuffer";\n\nimport {\n HASH\n} from "./internal/hash";\n\n// A deterministic hash set based on CloseTable from https://github.com/jorendorff/dht\n\nconst INITIAL_CAPACITY = 4;\nconst FILL_FACTOR: f64 = 8 / 3;\nconst FREE_FACTOR: f64 = 3 / 4;\n\n/** Structure of a set entry. */\n@unmanaged class SetEntry {\n key: K;\n taggedNext: usize; // LSB=1 indicates EMPTY\n}\n\n/** Empty bit. */\nconst EMPTY: usize = 1 << 0;\n\n/** Size of a bucket. */\nconst BUCKET_SIZE = sizeof();\n\n/** Computes the alignment of an entry. */\n@inline function ENTRY_ALIGN(): usize {\n // can align to 4 instead of 8 if 32-bit and K is <= 32-bits\n const align = (sizeof() > sizeof() ? sizeof() : sizeof()) - 1;\n return align;\n}\n\n/** Computes the aligned size of an entry. */\n@inline function ENTRY_SIZE(): usize {\n const align = ENTRY_ALIGN();\n const size = (offsetof>() + align) & ~align;\n return size;\n}\n\nexport class Set {\n\n // buckets holding references to the respective first entry within\n private buckets: ArrayBuffer; // usize[bucketsMask + 1]\n private bucketsMask: u32;\n\n // entries in insertion order\n private entries: ArrayBuffer; // SetEntry[entriesCapacity]\n private entriesCapacity: i32;\n private entriesOffset: i32;\n private entriesCount: i32;\n\n get size(): i32 { return this.entriesCount; }\n\n constructor() { this.clear(); }\n\n clear(): void {\n const bucketsSize = INITIAL_CAPACITY * BUCKET_SIZE;\n this.buckets = new ArrayBuffer(bucketsSize);\n this.bucketsMask = INITIAL_CAPACITY - 1;\n const entriesSize = INITIAL_CAPACITY * ENTRY_SIZE();\n this.entries = new ArrayBuffer(entriesSize, true);\n this.entriesCapacity = INITIAL_CAPACITY;\n this.entriesOffset = 0;\n this.entriesCount = 0;\n }\n\n private find(key: K, hashCode: u32): SetEntry | null {\n var entry = load>(\n changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE,\n HEADER_SIZE_AB\n );\n while (entry) {\n if (!(entry.taggedNext & EMPTY) && entry.key == key) return entry;\n entry = changetype>(entry.taggedNext & ~EMPTY);\n }\n return null;\n }\n\n has(key: K): bool {\n return this.find(key, HASH(key)) !== null;\n }\n\n add(key: K): void {\n var hashCode = HASH(key);\n var entry = this.find(key, hashCode);\n if (!entry) {\n // check if rehashing is necessary\n if (this.entriesOffset == this.entriesCapacity) {\n this.rehash(\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ? this.bucketsMask // just rehash if 1/4+ entries are empty\n : (this.bucketsMask << 1) | 1 // grow capacity to next 2^N\n );\n }\n // append new entry\n let entries = this.entries;\n entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + this.entriesOffset++ * ENTRY_SIZE()\n );\n entry.key = key;\n ++this.entriesCount;\n // link with previous entry in bucket\n let bucketPtrBase = changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE;\n entry.taggedNext = load(bucketPtrBase, HEADER_SIZE_AB);\n store(bucketPtrBase, changetype(entry), HEADER_SIZE_AB);\n if (isManaged()) __gc_link(changetype(this), changetype(key)); // tslint:disable-line\n }\n }\n\n delete(key: K): bool {\n var entry = this.find(key, HASH(key));\n if (!entry) return false;\n entry.taggedNext |= EMPTY;\n --this.entriesCount;\n // check if rehashing is appropriate\n var halfBucketsMask = this.bucketsMask >> 1;\n if (\n halfBucketsMask + 1 >= max(INITIAL_CAPACITY, this.entriesCount) &&\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ) this.rehash(halfBucketsMask);\n return true;\n }\n\n private rehash(newBucketsMask: u32): void {\n var newBucketsCapacity = (newBucketsMask + 1);\n var newBuckets = new ArrayBuffer(newBucketsCapacity * BUCKET_SIZE);\n var newEntriesCapacity = (newBucketsCapacity * FILL_FACTOR);\n var newEntries = new ArrayBuffer(newEntriesCapacity * ENTRY_SIZE(), true);\n\n // copy old entries to new entries\n var oldPtr = changetype(this.entries) + HEADER_SIZE_AB;\n var oldEnd = oldPtr + this.entriesOffset * ENTRY_SIZE();\n var newPtr = changetype(newEntries) + HEADER_SIZE_AB;\n while (oldPtr != oldEnd) {\n let oldEntry = changetype>(oldPtr);\n if (!(oldEntry.taggedNext & EMPTY)) {\n let newEntry = changetype>(newPtr);\n newEntry.key = oldEntry.key;\n let newBucketIndex = HASH(oldEntry.key) & newBucketsMask;\n let newBucketPtrBase = changetype(newBuckets) + newBucketIndex * BUCKET_SIZE;\n newEntry.taggedNext = load(newBucketPtrBase, HEADER_SIZE_AB);\n store(newBucketPtrBase, newPtr, HEADER_SIZE_AB);\n newPtr += ENTRY_SIZE();\n }\n oldPtr += ENTRY_SIZE();\n }\n\n this.buckets = newBuckets;\n this.bucketsMask = newBucketsMask;\n this.entries = newEntries;\n this.entriesCapacity = newEntriesCapacity;\n this.entriesOffset = this.entriesCount;\n }\n\n toString(): string {\n return "[object Set]";\n }\n\n private __gc(): void {\n __gc_mark(changetype(this.buckets)); // tslint:disable-line\n var entries = this.entries;\n __gc_mark(changetype(entries)); // tslint:disable-line\n if (isManaged()) {\n let offset: usize = 0;\n let end: usize = this.entriesOffset * ENTRY_SIZE();\n while (offset < end) {\n let entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + offset * ENTRY_SIZE()\n );\n if (!(entry.taggedNext & EMPTY)) __gc_mark(changetype(entry.key)); // tslint:disable-line\n offset += ENTRY_SIZE();\n }\n }\n }\n}\n',string:'import {\n HEADER_SIZE,\n MAX_LENGTH,\n allocateUnsafe,\n compareUnsafe,\n repeatUnsafe,\n copyUnsafe,\n isWhiteSpaceOrLineTerminator,\n CharCode,\n parse\n} from "./internal/string";\n\nimport {\n STORE\n} from "./internal/arraybuffer";\n\n@sealed\nexport class String {\n\n readonly length: i32; // capped to [0, MAX_LENGTH]\n\n // TODO Add and handle second argument\n static fromCharCode(code: i32): String {\n var out = allocateUnsafe(1);\n store(\n changetype(out),\n code,\n HEADER_SIZE\n );\n return out;\n }\n\n static fromCodePoint(code: i32): String {\n assert(code <= 0x10FFFF);\n var sur = code > 0xFFFF;\n var out = allocateUnsafe(sur + 1);\n if (!sur) {\n store(\n changetype(out),\n code,\n HEADER_SIZE\n );\n } else {\n code -= 0x10000;\n let hi: u32 = (code >>> 10) + 0xD800;\n let lo: u32 = (code & 0x3FF) + 0xDC00;\n store(\n changetype(out),\n (hi << 16) | lo,\n HEADER_SIZE\n );\n }\n return out;\n }\n\n @operator("[]")\n charAt(pos: i32): String {\n assert(this !== null);\n\n if (pos >= this.length) return changetype("");\n\n var out = allocateUnsafe(1);\n store(\n changetype(out),\n load(\n changetype(this) + (pos << 1),\n HEADER_SIZE\n ),\n HEADER_SIZE\n );\n return out;\n }\n\n charCodeAt(pos: i32): i32 {\n assert(this !== null);\n if (pos >= this.length) return -1; // (NaN)\n\n return load(\n changetype(this) + (pos << 1),\n HEADER_SIZE\n );\n }\n\n codePointAt(pos: i32): i32 {\n assert(this !== null);\n if (pos >= this.length) return -1; // (undefined)\n\n var first = load(\n changetype(this) + (pos << 1),\n HEADER_SIZE\n );\n if (first < 0xD800 || first > 0xDBFF || pos + 1 == this.length) {\n return first;\n }\n var second = load(\n changetype(this) + ((pos + 1) << 1),\n HEADER_SIZE\n );\n if (second < 0xDC00 || second > 0xDFFF) return first;\n return ((first - 0xD800) << 10) + (second - 0xDC00) + 0x10000;\n }\n\n @operator("+")\n private static __concat(left: String, right: String): String {\n if (!changetype(left)) left = changetype("null");\n return left.concat(right);\n }\n\n concat(other: String): String {\n assert(this !== null);\n if (other === null) other = changetype("null");\n\n var thisLen: isize = this.length;\n var otherLen: isize = other.length;\n var outLen: usize = thisLen + otherLen;\n if (outLen == 0) return changetype("");\n var out = allocateUnsafe(outLen);\n copyUnsafe(out, 0, this, 0, thisLen);\n copyUnsafe(out, thisLen, other, 0, otherLen);\n return out;\n }\n\n endsWith(searchString: String, endPosition: i32 = MAX_LENGTH): bool {\n assert(this !== null);\n if (searchString === null) return false;\n var end = min(max(endPosition, 0), this.length);\n var searchLength: isize = searchString.length;\n var start: isize = end - searchLength;\n if (start < 0) return false;\n return !compareUnsafe(this, start, searchString, 0, searchLength);\n }\n\n @operator("==")\n private static __eq(left: String, right: String): bool {\n if (left === right) return true;\n if (left === null || right === null) return false;\n\n var leftLength = left.length;\n if (leftLength != right.length) return false;\n\n return !compareUnsafe(left, 0, right, 0, leftLength);\n }\n\n @operator("!=")\n private static __ne(left: String, right: String): bool {\n return !this.__eq(left, right);\n }\n\n @operator(">")\n private static __gt(left: String, right: String): bool {\n if (left === right || left === null || right === null) return false;\n\n var leftLength = left.length;\n var rightLength = right.length;\n\n if (!leftLength) return false;\n if (!rightLength) return true;\n\n var length = min(leftLength, rightLength);\n return compareUnsafe(left, 0, right, 0, length) > 0;\n }\n\n @operator(">=")\n private static __gte(left: String, right: String): bool {\n if (left === right) return true;\n if (left === null || right === null) return false;\n\n var leftLength = left.length;\n var rightLength = right.length;\n\n if (!leftLength) return !rightLength;\n if (!rightLength) return true;\n\n var length = min(leftLength, rightLength);\n return compareUnsafe(left, 0, right, 0, length) >= 0;\n }\n\n @operator("<")\n private static __lt(left: String, right: String): bool {\n if (left === right || left === null || right === null) return false;\n\n var leftLength = left.length;\n var rightLength = right.length;\n\n if (!rightLength) return false;\n if (!leftLength) return true;\n\n var length = min(leftLength, rightLength);\n return compareUnsafe(left, 0, right, 0, length) < 0;\n }\n\n @operator("<=")\n private static __lte(left: String, right: String): bool {\n if (left === right) return true;\n if (left === null || right === null) return false;\n\n var leftLength = left.length;\n var rightLength = right.length;\n\n if (!rightLength) return !leftLength;\n if (!leftLength) return true;\n\n var length = min(leftLength, rightLength);\n return compareUnsafe(left, 0, right, 0, length) <= 0;\n }\n\n @inline\n includes(searchString: String, position: i32 = 0): bool {\n return this.indexOf(searchString, position) != -1;\n }\n\n indexOf(searchString: String, fromIndex: i32 = 0): i32 {\n assert(this !== null);\n if (searchString === null) searchString = changetype("null");\n\n var searchLen: isize = searchString.length;\n if (!searchLen) return 0;\n var len: isize = this.length;\n if (!len) return -1;\n var start = min(max(fromIndex, 0), len);\n len -= searchLen;\n for (let k: isize = start; k <= len; ++k) {\n if (!compareUnsafe(this, k, searchString, 0, searchLen)) return k;\n }\n return -1;\n }\n\n lastIndexOf(searchString: String, fromIndex: i32 = i32.MAX_VALUE): i32 {\n assert(this !== null);\n if (searchString === null) searchString = changetype("null");\n\n var len: isize = this.length;\n var searchLen: isize = searchString.length;\n if (!searchLen) return len;\n if (!len) return -1;\n var start = min(max(fromIndex, 0), len - searchLen);\n for (let k = start; k >= 0; --k) {\n if (!compareUnsafe(this, k, searchString, 0, searchLen)) return k;\n }\n return -1;\n }\n\n startsWith(searchString: String, position: i32 = 0): bool {\n assert(this !== null);\n if (searchString === null) searchString = changetype("null");\n\n var pos: isize = position;\n var len: isize = this.length;\n var start = min(max(pos, 0), len);\n var searchLength: isize = searchString.length;\n if (searchLength + start > len) return false;\n return !compareUnsafe(this, start, searchString, 0, searchLength);\n }\n\n substr(start: i32, length: i32 = i32.MAX_VALUE): String {\n assert(this !== null);\n var intStart: isize = start;\n var end: isize = length;\n var size: isize = this.length;\n if (intStart < 0) intStart = max(size + intStart, 0);\n var resultLength = min(max(end, 0), size - intStart);\n if (resultLength <= 0) return changetype("");\n var out = allocateUnsafe(resultLength);\n copyUnsafe(out, 0, this, intStart, resultLength);\n return out;\n }\n\n substring(start: i32, end: i32 = i32.MAX_VALUE): String {\n assert(this !== null);\n var len = this.length;\n var finalStart = min(max(start, 0), len);\n var finalEnd = min(max(end, 0), len);\n var from = min(finalStart, finalEnd);\n var to = max(finalStart, finalEnd);\n len = to - from;\n if (!len) return changetype("");\n if (!from && to == this.length) return this;\n var out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, from, len);\n return out;\n }\n\n trim(): String {\n assert(this !== null);\n var length: usize = this.length;\n\n while (\n length &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (length << 1), HEADER_SIZE)\n )\n ) {\n --length;\n }\n var start: usize = 0;\n while (\n start < length &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (start << 1), HEADER_SIZE)\n )\n ) {\n ++start, --length;\n }\n if (!length) return changetype("");\n if (!start && length == this.length) return this;\n var out = allocateUnsafe(length);\n copyUnsafe(out, 0, this, start, length);\n return out;\n }\n\n @inline\n trimLeft(): String {\n return this.trimStart();\n }\n\n @inline\n trimRight(): String {\n return this.trimEnd();\n }\n\n trimStart(): String {\n assert(this !== null);\n var start: isize = 0;\n var len: isize = this.length;\n while (\n start < len &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (start << 1), HEADER_SIZE)\n )\n ) {\n ++start;\n }\n if (!start) return this;\n var outLen = len - start;\n if (!outLen) return changetype("");\n var out = allocateUnsafe(outLen);\n copyUnsafe(out, 0, this, start, outLen);\n return out;\n }\n\n trimEnd(): String {\n assert(this !== null);\n var len: isize = this.length;\n while (\n len > 0 &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (len << 1), HEADER_SIZE)\n )\n ) {\n --len;\n }\n if (len <= 0) return changetype("");\n if (len == this.length) return this;\n var out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, 0, len);\n return out;\n }\n\n padStart(targetLength: i32, padString: String = changetype(" ")): String {\n assert(this !== null);\n var length = this.length;\n var padLen = padString.length;\n if (targetLength < length || !padLen) return this;\n var len = targetLength - length;\n var out = allocateUnsafe(targetLength);\n if (len > padLen) {\n let count = (len - 1) / padLen;\n let base = count * padLen;\n let rest = len - base;\n repeatUnsafe(out, 0, padString, count);\n if (rest) copyUnsafe(out, base, padString, 0, rest);\n } else {\n copyUnsafe(out, 0, padString, 0, len);\n }\n if (length) copyUnsafe(out, len, this, 0, length);\n return out;\n }\n\n padEnd(targetLength: i32, padString: String = changetype(" ")): String {\n assert(this !== null);\n var length = this.length;\n var padLen = padString.length;\n if (targetLength < length || !padLen) return this;\n var len = targetLength - length;\n var out = allocateUnsafe(targetLength);\n if (length) copyUnsafe(out, 0, this, 0, length);\n if (len > padLen) {\n let count = (len - 1) / padLen;\n let base = count * padLen;\n let rest = len - base;\n repeatUnsafe(out, length, padString, count);\n if (rest) copyUnsafe(out, base + length, padString, 0, rest);\n } else {\n copyUnsafe(out, length, padString, 0, len);\n }\n return out;\n }\n\n repeat(count: i32 = 0): String {\n assert(this !== null);\n var length = this.length;\n\n // Most browsers can\'t handle strings 1 << 28 chars or longer\n if (count < 0 || length * count > (1 << 28)) {\n throw new RangeError("Invalid count value");\n }\n\n if (count == 0 || !length) return changetype("");\n if (count == 1) return this;\n\n var result = allocateUnsafe(length * count);\n repeatUnsafe(result, 0, this, count);\n return result;\n }\n\n slice(beginIndex: i32, endIndex: i32 = i32.MAX_VALUE): String {\n var length = this.length;\n var begin = (beginIndex < 0) ? max(beginIndex + length, 0) : min(beginIndex, length);\n var end = (endIndex < 0) ? max(endIndex + length, 0) : min(endIndex, length);\n var len = end - begin;\n if (len <= 0) return changetype("");\n var out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, begin, len);\n return out;\n }\n\n split(separator: String = null, limit: i32 = i32.MAX_VALUE): String[] {\n assert(this !== null);\n if (!limit) return new Array();\n if (separator === null) return [this];\n var length: isize = this.length;\n var sepLen: isize = separator.length;\n if (limit < 0) limit = i32.MAX_VALUE;\n if (!sepLen) {\n if (!length) return new Array();\n // split by chars\n length = min(length, limit);\n let result = new Array(length);\n let buffer = result.buffer_;\n for (let i: isize = 0; i < length; ++i) {\n let char = allocateUnsafe(1);\n store(\n changetype(char),\n load(\n changetype(this) + (i << 1),\n HEADER_SIZE\n ),\n HEADER_SIZE\n );\n STORE(buffer, i, char);\n }\n return result;\n } else if (!length) {\n let result = new Array(1);\n unchecked(result[0] = changetype(""));\n return result;\n }\n var result = new Array();\n var end = 0, start = 0, i = 0;\n while ((end = this.indexOf(separator, start)) != -1) {\n let len = end - start;\n if (len > 0) {\n let out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, start, len);\n result.push(out);\n } else {\n result.push(changetype(""));\n }\n if (++i == limit) return result;\n start = end + sepLen;\n }\n if (!start) {\n let result = new Array(1);\n unchecked(result[0] = this);\n return result;\n }\n var len = length - start;\n if (len > 0) {\n let out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, start, len);\n result.push(out);\n } else {\n result.push(changetype(""));\n }\n return result;\n }\n\n toString(): String {\n return this;\n }\n\n get lengthUTF8(): i32 {\n var len = 1; // null terminated\n var pos: usize = 0;\n var end = this.length;\n while (pos < end) {\n let c = load(changetype(this) + (pos << 1), HEADER_SIZE);\n if (c < 128) {\n len += 1; ++pos;\n } else if (c < 2048) {\n len += 2; ++pos;\n } else {\n if (\n (c & 0xFC00) == 0xD800 && pos + 1 < end &&\n (load(changetype(this) + ((pos + 1) << 1), HEADER_SIZE) & 0xFC00) == 0xDC00\n ) {\n len += 4; pos += 2;\n } else {\n len += 3; ++pos;\n }\n }\n }\n return len;\n }\n\n static fromUTF8(ptr: usize, len: usize): String {\n if (len < 1) return changetype("");\n var ptrPos = 0;\n var buf = memory.allocate(len << 1);\n var bufPos = 0;\n while (ptrPos < len) {\n let cp = load(ptr + ptrPos++);\n if (cp < 128) {\n store(buf + bufPos, cp);\n bufPos += 2;\n } else if (cp > 191 && cp < 224) {\n assert(ptrPos + 1 <= len);\n store(buf + bufPos, (cp & 31) << 6 | load(ptr + ptrPos++) & 63);\n bufPos += 2;\n } else if (cp > 239 && cp < 365) {\n assert(ptrPos + 3 <= len);\n cp = (\n (cp & 7) << 18 |\n (load(ptr + ptrPos++) & 63) << 12 |\n (load(ptr + ptrPos++) & 63) << 6 |\n load(ptr + ptrPos++) & 63\n ) - 0x10000;\n store(buf + bufPos, 0xD800 + (cp >> 10));\n bufPos += 2;\n store(buf + bufPos, 0xDC00 + (cp & 1023));\n bufPos += 2;\n } else {\n assert(ptrPos + 2 <= len);\n store(buf + bufPos,\n (cp & 15) << 12 |\n (load(ptr + ptrPos++) & 63) << 6 |\n load(ptr + ptrPos++) & 63\n );\n bufPos += 2;\n }\n }\n assert(ptrPos == len);\n var str = allocateUnsafe((bufPos >> 1));\n memory.copy(changetype(str) + HEADER_SIZE, buf, bufPos);\n memory.free(buf);\n return str;\n }\n\n toUTF8(): usize {\n var buf = memory.allocate(this.lengthUTF8);\n var pos: usize = 0;\n var end = this.length;\n var off: usize = 0;\n while (pos < end) {\n let c1 = load(changetype(this) + (pos << 1), HEADER_SIZE);\n if (c1 < 128) {\n store(buf + off, c1);\n ++off; ++pos;\n } else if (c1 < 2048) {\n let ptr = buf + off;\n store(ptr, c1 >> 6 | 192);\n store(ptr, c1 & 63 | 128, 1);\n off += 2; ++pos;\n } else {\n let ptr = buf + off;\n if ((c1 & 0xFC00) == 0xD800 && pos + 1 < end) {\n let c2 = load(changetype(this) + ((pos + 1) << 1), HEADER_SIZE);\n if ((c2 & 0xFC00) == 0xDC00) {\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\n store(ptr, c1 >> 18 | 240);\n store(ptr, c1 >> 12 & 63 | 128, 1);\n store(ptr, c1 >> 6 & 63 | 128, 2);\n store(ptr, c1 & 63 | 128, 3);\n off += 4; pos += 2;\n continue;\n }\n }\n store(ptr, c1 >> 12 | 224);\n store(ptr, c1 >> 6 & 63 | 128, 1);\n store(ptr, c1 & 63 | 128, 2);\n off += 3; ++pos;\n }\n }\n store(buf + off, 0);\n return buf;\n }\n}\n\nexport function parseInt(str: String, radix: i32 = 0): f64 {\n return parse(str, radix);\n}\n\nexport function parseI32(str: String, radix: i32 = 0): i32 {\n return parse(str, radix);\n}\n\nexport function parseI64(str: String, radix: i32 = 0): i64 {\n return parse(str, radix);\n}\n\n// FIXME: naive implementation\nexport function parseFloat(str: String): f64 {\n var len: i32 = str.length;\n if (!len) return NaN;\n\n var ptr = changetype(str) /* + HEAD -> offset */;\n var code = load(ptr, HEADER_SIZE);\n\n // determine sign\n var sign: f64;\n if (code == CharCode.MINUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = 1;\n } else {\n sign = 1;\n }\n\n // calculate value\n var num: f64 = 0;\n while (len--) {\n code = load(ptr, HEADER_SIZE);\n if (code == CharCode.DOT) {\n ptr += 2;\n let fac: f64 = 0.1; // precision :(\n while (len--) {\n code = load(ptr, HEADER_SIZE);\n if (code == CharCode.E || code == CharCode.e) {\n assert(false); // TODO\n }\n code -= CharCode._0;\n if (code > 9) break;\n num += code * fac;\n fac *= 0.1;\n ptr += 2;\n }\n break;\n }\n code -= CharCode._0;\n if (code >= 10) break;\n num = (num * 10) + code;\n ptr += 2;\n }\n return sign * num;\n}\n',symbol:'import { Map } from "./map";\n\nvar stringToId: Map;\nvar idToString: Map;\nvar nextId: usize = 12; // Symbol.unscopables + 1\n\n@unmanaged export class symbol {\n toString(): string {\n var id = changetype(this);\n var str = "";\n switch (id) {\n case 1: { str = "hasInstance"; break; }\n case 2: { str = "isConcatSpreadable"; break; }\n case 3: { str = "isRegExp"; break; }\n case 4: { str = "match"; break; }\n case 5: { str = "replace"; break; }\n case 6: { str = "search"; break; }\n case 7: { str = "species"; break; }\n case 8: { str = "split"; break; }\n case 9: { str = "toPrimitive"; break; }\n case 10: { str = "toStringTag"; break; }\n case 11: { str = "unscopables"; break; }\n default: {\n if (idToString !== null && idToString.has(id)) str = idToString.get(id);\n break;\n }\n }\n return "Symbol(" + str + ")";\n }\n}\n\ntype Symbol = symbol;\n\nexport function Symbol(description: string | null = null): symbol {\n var id = nextId++;\n if (!id) unreachable(); // out of ids\n return changetype(id);\n}\n\nexport namespace Symbol {\n\n // well-known symbols\n export const hasInstance = changetype(1);\n export const isConcatSpreadable = changetype(2);\n export const isRegExp = changetype(3);\n export const iterator = changetype(3);\n export const match = changetype(4);\n export const replace = changetype(5);\n export const search = changetype(6);\n export const species = changetype(7);\n export const split = changetype(8);\n export const toPrimitive = changetype(9);\n export const toStringTag = changetype(10);\n export const unscopables = changetype(11);\n\n /* tslint:disable */// not valid TS\n export function for(key: string): symbol {\n if (!stringToId) { stringToId = new Map(); idToString = new Map(); }\n else if (stringToId.has(key)) return changetype(stringToId.get(key));\n var id = nextId++;\n if (!id) unreachable(); // out of ids\n stringToId.set(key, id);\n idToString.set(id, key);\n return changetype(id);\n }\n /* tslint:enable */\n\n export function keyFor(sym: symbol): string | null {\n return idToString !== null && idToString.has(changetype(sym))\n ? idToString.get(changetype(sym))\n : null;\n }\n}\n',table:"export namespace table {\n\n // export function copy(dst: u32, src: u32, n: u32): void {\n // __table_copy(dst, src, n);\n // }\n\n // Passive elements\n\n // export function init(elementIndex: u32, srcOffset: u32, dstOffset: u32, n: u32): void {\n // __table_init(elementIndex, srcOffset, dstOffset, n);\n // }\n\n // export function drop(elementIndex: u32): void {\n // __table_drop(elementIndex);\n // }\n}\n",typedarray:"import {\n TypedArray,\n FILL,\n SORT,\n SUBARRAY,\n REDUCE,\n REDUCE_RIGHT,\n MAP,\n FIND_INDEX,\n SOME,\n EVERY,\n} from \"./internal/typedarray\";\n\nimport {\n COMPARATOR\n} from \"./internal/sort\";\n\nexport class Int8Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int8Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i8, b: i8) => i32 = COMPARATOR()): Int8Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int8Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i8, index: i32, array: Int8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i8, index: i32, array: Int8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i8, index: i32, self: Int8Array) => i8): Int8Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i8, index: i32, self: Int8Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i8, index: i32, self: Int8Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i8, index: i32, self: Int8Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint8Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u8, b: u8) => i32 = COMPARATOR()): Uint8Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint8Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u8, index: i32, array: Uint8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u8, index: i32, array: Uint8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u8, index: i32, self: Uint8Array) => u8): Uint8Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u8, index: i32, self: Uint8Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u8, index: i32, self: Uint8Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u8, index: i32, self: Uint8Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint8ClampedArray extends Uint8Array {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n @inline @operator(\"[]=\")\n protected __set(index: i32, value: i32): void {\n super.__set(index, max(min(value, 255), 0));\n }\n\n @inline @operator(\"{}=\")\n protected __unchecked_set(index: i32, value: i32): void {\n super.__unchecked_set(index, max(min(value, 255), 0));\n }\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8ClampedArray {\n return changetype(super.fill(value, start, end)); // safe because '.fill' reuses 'this'\n }\n\n sort(comparator: (a: u8, b: u8) => i32 = COMPARATOR()): Uint8ClampedArray {\n return changetype(super.sort(comparator)); // safe because '.sort' reuses 'this'\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint8ClampedArray {\n return SUBARRAY(this, begin, end);\n }\n\n map(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => u8): Uint8ClampedArray {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Int16Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int16Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i16, b: i16) => i32 = COMPARATOR()): Int16Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int16Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i16, index: i32, array: Int16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i16, index: i32, array: Int16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i16, index: i32, self: Int16Array) => i16): Int16Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i16, index: i32, self: Int16Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i16, index: i32, self: Int16Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i16, index: i32, self: Int16Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint16Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint16Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u16, b: u16) => i32 = COMPARATOR()): Uint16Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint16Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u16, index: i32, array: Uint16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u16, index: i32, array: Uint16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u16, index: i32, self: Uint16Array) => u16): Uint16Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u16, index: i32, self: Uint16Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u16, index: i32, self: Uint16Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u16, index: i32, self: Uint16Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Int32Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int32Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i32, b: i32) => i32 = COMPARATOR()): Int32Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int32Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i32, index: i32, array: Int32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i32, index: i32, array: Int32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i32, index: i32, self: Int32Array) => i32): Int32Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i32, index: i32, self: Int32Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i32, index: i32, self: Int32Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i32, index: i32, self: Int32Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint32Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint32Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u32, b: u32) => i32 = COMPARATOR()): Uint32Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint32Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u32, index: i32, array: Uint32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u32, index: i32, array: Uint32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u32, index: i32, self: Uint32Array) => u32): Uint32Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u32, index: i32, self: Uint32Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u32, index: i32, self: Uint32Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u32, index: i32, self: Uint32Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Int64Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int64Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i64, b: i64) => i32 = COMPARATOR()): Int64Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int64Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i64, index: i32, array: Int64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i64, index: i32, array: Int64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i64, index: i32, self: Int64Array) => i64): Int64Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i64, index: i32, self: Int64Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i64, index: i32, self: Int64Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i64, index: i32, self: Int64Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint64Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint64Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u64, b: u64) => i32 = COMPARATOR()): Uint64Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint64Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u64, index: i32, array: Uint64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u64, index: i32, array: Uint64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u64, index: i32, self: Uint64Array) => u64): Uint64Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u64, index: i32, self: Uint64Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u64, index: i32, self: Uint64Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u64, index: i32, self: Uint64Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Float32Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: f32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Float32Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: f32, b: f32) => i32 = COMPARATOR()): Float32Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Float32Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: f32, index: i32, array: Float32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: f32, index: i32, array: Float32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: f32, index: i32, self: Float32Array) => f32): Float32Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: f32, index: i32, self: Float32Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: f32, index: i32, self: Float32Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: f32, index: i32, self: Float32Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Float64Array extends TypedArray {\n static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: f64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Float64Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: f64, b: f64) => i32 = COMPARATOR()): Float64Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Float64Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: f64, index: i32, array: Float64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: f64, index: i32, array: Float64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: f64, index: i32, self: Float64Array) => f64): Float64Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: f64, index: i32, self: Float64Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: f64, index: i32, self: Float64Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: f64, index: i32, self: Float64Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n"}):(()=>{const e=path.join(".","..","std","assembly"),n=__webpack_require__(!function(){var e=new Error("Cannot find module 'glob'");throw e.code="MODULE_NOT_FOUND",e}()).sync("**/!(*.d).ts",{cwd:e}),t={};return n.forEach(n=>t[n.replace(/\.ts$/,"")]=fs.readFileSync(path.join(e,n),"utf8")),t})(),exports.definitionFiles=exports.isBundle?Object({assembly:"/**\n * Environment definitions for compiling AssemblyScript to WebAssembly using asc.\n * @module std/assembly\n *//***/\n\n/// \n\n// Types\n\n/** An 8-bit signed integer. */\ndeclare type i8 = number;\n/** A 16-bit signed integer. */\ndeclare type i16 = number;\n/** A 32-bit signed integer. */\ndeclare type i32 = number;\n/** A 64-bit signed integer. */\ndeclare type i64 = number;\n/** A 32-bit signed integer when targeting 32-bit WebAssembly or a 64-bit signed integer when targeting 64-bit WebAssembly. */\ndeclare type isize = number;\n/** An 8-bit unsigned integer. */\ndeclare type u8 = number;\n/** A 16-bit unsigned integer. */\ndeclare type u16 = number;\n/** A 32-bit unsigned integer. */\ndeclare type u32 = number;\n/** A 64-bit unsigned integer. */\ndeclare type u64 = number;\n/** A 32-bit unsigned integer when targeting 32-bit WebAssembly or a 64-bit unsigned integer when targeting 64-bit WebAssembly. */\ndeclare type usize = number;\n/** A 1-bit unsigned integer. */\ndeclare type bool = boolean | number;\n/** A 32-bit float. */\ndeclare type f32 = number;\n/** A 64-bit float. */\ndeclare type f64 = number;\n\n// Compiler hints\n\n/** Compiler target. 0 = JS, 1 = WASM32, 2 = WASM64. */\ndeclare const ASC_TARGET: i32;\n/** Provided noTreeshaking option. */\ndeclare const ASC_NO_TREESHAKING: bool;\n/** Provided noAssert option. */\ndeclare const ASC_NO_ASSERT: bool;\n/** Provided memoryBase option. */\ndeclare const ASC_MEMORY_BASE: i32;\n/** Provided optimizeLevel option. */\ndeclare const ASC_OPTIMIZE_LEVEL: i32;\n/** Provided shrinkLevel option. */\ndeclare const ASC_SHRINK_LEVEL: i32;\n/** Whether the mutable global feature is enabled. */\ndeclare const ASC_FEATURE_MUTABLE_GLOBAL: bool;\n/** Whether the sign extension feature is enabled. */\ndeclare const ASC_FEATURE_SIGN_EXTENSION: bool;\n\n// Builtins\n\n/** Performs the sign-agnostic count leading zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered leading if the value is zero. */\ndeclare function clz(value: T): T;\n/** Performs the sign-agnostic count tailing zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered trailing if the value is zero. */\ndeclare function ctz(value: T): T;\n/** Performs the sign-agnostic count number of one bits operation on a 32-bit or 64-bit integer. */\ndeclare function popcnt(value: T): T;\n/** Performs the sign-agnostic rotate left operation on a 32-bit or 64-bit integer. */\ndeclare function rotl(value: T, shift: T): T;\n/** Performs the sign-agnostic rotate right operation on a 32-bit or 64-bit integer. */\ndeclare function rotr(value: T, shift: T): T;\n/** Computes the absolute value of an integer or float. */\ndeclare function abs(value: T): T;\n/** Determines the maximum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function max(left: T, right: T): T;\n/** Determines the minimum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function min(left: T, right: T): T;\n/** Performs the ceiling operation on a 32-bit or 64-bit float. */\ndeclare function ceil(value: T): T;\n/** Composes a 32-bit or 64-bit float from the magnitude of `x` and the sign of `y`. */\ndeclare function copysign(x: T, y: T): T;\n/** Performs the floor operation on a 32-bit or 64-bit float. */\ndeclare function floor(value: T): T;\n/** Rounds to the nearest integer tied to even of a 32-bit or 64-bit float. */\ndeclare function nearest(value: T): T;\n/** Reinterprets the bits of the specified value as type `T`. Valid reinterpretations are u32/i32 to/from f32 and u64/i64 to/from f64. */\ndeclare function reinterpret(value: number): T;\n/** Selects one of two pre-evaluated values depending on the condition. */\ndeclare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n/** Calculates the square root of a 32-bit or 64-bit float. */\ndeclare function sqrt(value: T): T;\n/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */\ndeclare function trunc(value: T): T;\n/** Loads a value of the specified type from memory. Equivalent to dereferncing a pointer in other languages. */\ndeclare function load(ptr: usize, constantOffset?: usize): T;\n/** Stores a value of the specified type to memory. Equivalent to dereferencing a pointer in other languages when assigning a value. */\ndeclare function store(ptr: usize, value: any, constantOffset?: usize): void;\n/** Emits an unreachable operation that results in a runtime error when executed. Both a statement and an expression of any type. */\ndeclare function unreachable(): any; // sic\n\n/** NaN (not a number) as a 32-bit or 64-bit float depending on context. */\ndeclare const NaN: f32 | f64;\n/** Positive infinity as a 32-bit or 64-bit float depending on context. */\ndeclare const Infinity: f32 | f64;\n/** Heap base offset. */\ndeclare const HEAP_BASE: usize;\n/** Determines the byte size of the specified underlying core type. Compiles to a constant. */\ndeclare function sizeof(): usize;\n/** Determines the alignment (log2) of the specified underlying core type. Compiles to a constant. */\ndeclare function alignof(): usize;\n/** Determines the offset of the specified field within the given class type. Returns the class type's end offset if field name has been omitted. Compiles to a constant. */\ndeclare function offsetof(fieldName?: string): usize;\n/** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/\ndeclare function changetype(value: any): T;\n/** Explicitly requests no bounds checks on the provided expression. Useful for array accesses. */\ndeclare function unchecked(value: T): T;\n/** Emits a `call_indirect` instruction, calling the specified function in the function table by index with the specified arguments. Does result in a runtime error if the arguments do not match the called function. */\ndeclare function call_indirect(target: Function | u32, ...args: any[]): T;\n/** Instantiates a new instance of `T` using the specified constructor arguments. */\ndeclare function instantiate(...args: any[]): T;\n/** Tests if a 32-bit or 64-bit float is `NaN`. */\ndeclare function isNaN(value: T): bool;\n/** Tests if a 32-bit or 64-bit float is finite, that is not `NaN` or +/-`Infinity`. */\ndeclare function isFinite(value: T): bool;\n/** Tests if the specified type *or* expression is of an integer type and not a reference. Compiles to a constant. */\ndeclare function isInteger(value?: any): value is number;\n/** Tests if the specified type *or* expression is of a float type. Compiles to a constant. */\ndeclare function isFloat(value?: any): value is number;\n/** Tests if the specified type *or* expression can represent negative numbers. Compiles to a constant. */\ndeclare function isSigned(value?: any): value is number;\n/** Tests if the specified type *or* expression is of a reference type. Compiles to a constant. */\ndeclare function isReference(value?: any): value is object | string;\n/** Tests if the specified type *or* expression can be used as a string. Compiles to a constant. */\ndeclare function isString(value?: any): value is string | String;\n/** Tests if the specified type *or* expression can be used as an array. Compiles to a constant. */\ndeclare function isArray(value?: any): value is Array;\n/** Tests if the specified expression resolves to a defined element. Compiles to a constant. */\ndeclare function isDefined(expression: any): bool;\n/** Tests if the specified expression evaluates to a constant value. Compiles to a constant. */\ndeclare function isConstant(expression: any): bool;\n/** Tests if the specified type *or* expression is of a managed type. Compiles to a constant. */\ndeclare function isManaged(value?: any): bool;\n/** Traps if the specified value is not true-ish, otherwise returns the (non-nullable) value. */\ndeclare function assert(isTrueish: T, message?: string): T & object; // any better way to model `: T != null`?\n/** Parses an integer string to a 64-bit float. */\ndeclare function parseInt(str: string, radix?: i32): f64;\n/** Parses an integer string to a 32-bit integer. */\ndeclare function parseI32(str: string, radix?: i32): i32;\n/** Parses an integer string to a 64-bit integer. */\ndeclare function parseI64(str: string, radix?: i32): i64;\n/** Parses a string to a 64-bit float. */\ndeclare function parseFloat(str: string): f64;\n/** Returns the 64-bit floating-point remainder of `x/y`. */\ndeclare function fmod(x: f64, y: f64): f64;\n/** Returns the 32-bit floating-point remainder of `x/y`. */\ndeclare function fmodf(x: f32, y: f32): f32;\n\n/** Converts any other numeric value to an 8-bit signed integer. */\ndeclare function i8(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace i8 {\n /** Smallest representable value. */\n export const MIN_VALUE: i8;\n /** Largest representable value. */\n export const MAX_VALUE: i8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i8;\n}\n/** Converts any other numeric value to a 16-bit signed integer. */\ndeclare function i16(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace i16 {\n /** Smallest representable value. */\n export const MIN_VALUE: i16;\n /** Largest representable value. */\n export const MAX_VALUE: i16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i16;\n}\n/** Converts any other numeric value to a 32-bit signed integer. */\ndeclare function i32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i32;\ndeclare namespace i32 {\n /** Smallest representable value. */\n export const MIN_VALUE: i32;\n /** Largest representable value. */\n export const MAX_VALUE: i32;\n /** Loads an 8-bit signed integer from memory and returns it as a 32-bit integer. */\n export function load8_s(offset: usize, constantOffset?: usize): i32;\n /** Loads an 8-bit unsigned integer from memory and returns it as a 32-bit integer. */\n export function load8_u(offset: usize, constantOffset?: usize): i32;\n /** Loads a 16-bit signed integer from memory and returns it as a 32-bit integer. */\n export function load16_s(offset: usize, constantOffset?: usize): i32;\n /** Loads a 16-bit unsigned integer from memory and returns it as a 32-bit integer. */\n export function load16_u(offset: usize, constantOffset?: usize): i32;\n /** Loads a 32-bit integer from memory. */\n export function load(offset: usize, constantOffset?: usize): i32;\n /** Stores a 32-bit integer to memory as an 8-bit integer. */\n export function store8(offset: usize, value: i32, constantOffset?: usize): void;\n /** Stores a 32-bit integer to memory as a 16-bit integer. */\n export function store16(offset: usize, value: i32, constantOffset?: usize): void;\n /** Stores a 32-bit integer to memory. */\n export function store(offset: usize, value: i32, constantOffset?: usize): void;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i32;\n}\n/** Converts any other numeric value to a 64-bit signed integer. */\ndeclare function i64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i64;\ndeclare namespace i64 {\n /** Smallest representable value. */\n export const MIN_VALUE: i64;\n /** Largest representable value. */\n export const MAX_VALUE: i64;\n /** Loads an 8-bit signed integer from memory and returns it as a 64-bit signed integer. */\n export function load8_s(offset: usize, constantOffset?: usize): i64;\n /** Loads an 8-bit unsigned integer from memory and returns it as a 64-bit unsigned integer. */\n export function load8_u(offset: usize, constantOffset?: usize): u64;\n /** Loads a 16-bit signed integer from memory and returns it as a 64-bit signed integer. */\n export function load16_s(offset: usize, constantOffset?: usize): i64;\n /** Loads a 16-bit unsigned integer from memory and returns it as a 64-bit unsigned integer. */\n export function load16_u(offset: usize, constantOffset?: usize): u64;\n /** Loads a 32-bit signed integer from memory and returns it as a 64-bit signed integer. */\n export function load32_s(offset: usize, constantOffset?: usize): i64;\n /** Loads a 32-bit unsigned integer from memory and returns it as a 64-bit unsigned integer. */\n export function load32_u(offset: usize, constantOffset?: usize): u64;\n /** Loads a 64-bit unsigned integer from memory. */\n export function load(offset: usize, constantOffset?: usize): i64;\n /** Stores a 64-bit integer to memory as an 8-bit integer. */\n export function store8(offset: usize, value: i64, constantOffset?: usize): void;\n /** Stores a 64-bit integer to memory as a 16-bit integer. */\n export function store16(offset: usize, value: i64, constantOffset?: usize): void;\n /** Stores a 64-bit integer to memory as a 32-bit integer. */\n export function store32(offset: usize, value: i64, constantOffset?: usize): void;\n /** Stores a 64-bit integer to memory. */\n export function store(offset: usize, value: i64, constantOffset?: usize): void;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i64;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) signed integer. */\ndeclare var isize: typeof i32 | typeof i64;\n/** Converts any other numeric value to an 8-bit unsigned integer. */\ndeclare function u8(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace u8 {\n /** Smallest representable value. */\n export const MIN_VALUE: u8;\n /** Largest representable value. */\n export const MAX_VALUE: u8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u8;\n}\n/** Converts any other numeric value to a 16-bit unsigned integer. */\ndeclare function u16(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace u16 {\n /** Smallest representable value. */\n export const MIN_VALUE: u16;\n /** Largest representable value. */\n export const MAX_VALUE: u16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u16;\n}\n/** Converts any other numeric value to a 32-bit unsigned integer. */\ndeclare function u32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i32;\ndeclare namespace u32 {\n /** Smallest representable value. */\n export const MIN_VALUE: u32;\n /** Largest representable value. */\n export const MAX_VALUE: u32;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u64;\n}\n/** Converts any other numeric value to a 64-bit unsigned integer. */\ndeclare function u64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i64;\ndeclare namespace u64 {\n /** Smallest representable value. */\n export const MIN_VALUE: u64;\n /** Largest representable value. */\n export const MAX_VALUE: u64;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): u64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u64;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) unsigned integer. */\ndeclare var usize: typeof u32 | typeof u64;\n/** Converts any other numeric value to a 1-bit unsigned integer. */\ndeclare function bool(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): bool;\ndeclare namespace bool {\n /** Smallest representable value. */\n export const MIN_VALUE: bool;\n /** Largest representable value. */\n export const MAX_VALUE: bool;\n}\n/** Converts any other numeric value to a 32-bit float. */\ndeclare function f32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): f32;\ndeclare namespace f32 {\n /** Smallest representable value. */\n export const MIN_VALUE: f32;\n /** Largest representable value. */\n export const MAX_VALUE: f32;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f32;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f32;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f32;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f32;\n /** Returns the floating-point remainder of `x / y` (rounded towards zero). */\n export function mod(x: f32, y: f32): f32;\n /** Returns the floating-point remainder of `x / y` (rounded to nearest). */\n export function rem(x: f32, y: f32): f32;\n /** Loads a 32-bit float from memory. */\n export function load(offset: usize, constantOffset?: usize): f32;\n /** Stores a 32-bit float to memory. */\n export function store(offset: usize, value: f32, constantOffset?: usize): void;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n export function isNaN(value: f32): bool;\n /** Returns true if passed value is finite. */\n export function isFinite(value: f32): bool;\n /** Returns true if the value passed is a safe integer. */\n export function isSafeInteger(value: f32): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n export function isInteger(value: f32): bool;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): f32;\n /** Converts a string to an integer. */\n export function parseInt(string: string, radix?: i32): f32;\n}\n/** Converts any other numeric value to a 64-bit float. */\ndeclare function f64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): f64;\ndeclare namespace f64 {\n /** Smallest representable value. */\n export const MIN_VALUE: f64;\n /** Largest representable value. */\n export const MAX_VALUE: f64;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f64;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f64;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f64;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f64;\n /** Loads a 64-bit float from memory. */\n export function load(offset: usize, constantOffset?: usize): f64;\n /** Stores a 64-bit float to memory. */\n export function store(offset: usize, value: f64, constantOffset?: usize): void;\n}\n/** Macro type evaluating to the underlying native WebAssembly type. */\ndeclare type NATIVE = T;\n\n/** Pseudo-class representing the backing class of integer types. */\ndeclare class _Integer {\n /** Smallest representable value. */\n static readonly MIN_VALUE: number;\n /** Largest representable value. */\n static readonly MAX_VALUE: number;\n /** Converts a string to an integer of this type. */\n static parseInt(value: string, radix?: number): number;\n /** Converts this integer to a string. */\n toString(): string;\n}\n\n/** Pseudo-class representing the backing class of floating-point types. */\ndeclare class _Float {\n /** Difference between 1 and the smallest representable value greater than 1. */\n static readonly EPSILON: f32 | f64;\n /** Smallest representable value. */\n static readonly MIN_VALUE: f32 | f64;\n /** Largest representable value. */\n static readonly MAX_VALUE: f32 | f64;\n /** Smallest safely representable integer value. */\n static readonly MIN_SAFE_INTEGER: f32 | f64;\n /** Largest safely representable integer value. */\n static readonly MAX_SAFE_INTEGER: f32 | f64;\n /** Value representing positive infinity. */\n static readonly POSITIVE_INFINITY: f32 | f64;\n /** Value representing negative infinity. */\n static readonly NEGATIVE_INFINITY: f32 | f64;\n /** Value representing 'not a number'. */\n static readonly NaN: f32 | f64;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n static isNaN(value: f32 | f64): bool;\n /** Returns true if passed value is finite. */\n static isFinite(value: f32 | f64): bool;\n /** Returns true if the value passed is a safe integer. */\n static isSafeInteger(value: f32 | f64): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n static isInteger(value: f32 | f64): bool;\n /** Converts A string to an integer. */\n static parseInt(value: string, radix?: i32): f32 | f64;\n /** Converts a string to a floating-point number. */\n static parseFloat(value: string): f32 | f64;\n /** Converts this floating-point number to a string. */\n toString(this: f64): string;\n}\n\n/** Backing class of signed 8-bit integers. */\ndeclare const I8: typeof _Integer;\n/** Backing class of signed 16-bit integers. */\ndeclare const I16: typeof _Integer;\n/** Backing class of signed 32-bit integers. */\ndeclare const I32: typeof _Integer;\n/** Backing class of signed 64-bit integers. */\ndeclare const I64: typeof _Integer;\n/** Backing class of signed size integers. */\ndeclare const Isize: typeof _Integer;\n/** Backing class of unsigned 8-bit integers. */\ndeclare const U8: typeof _Integer;\n/** Backing class of unsigned 16-bit integers. */\ndeclare const U16: typeof _Integer;\n/** Backing class of unsigned 32-bit integers. */\ndeclare const U32: typeof _Integer;\n/** Backing class of unsigned 64-bit integers. */\ndeclare const U64: typeof _Integer;\n/** Backing class of unsigned size integers. */\ndeclare const Usize: typeof _Integer;\n/** Backing class of 32-bit floating-point values. */\ndeclare const F32: typeof _Float;\n/** Backing class of 64-bit floating-point values. */\ndeclare const F64: typeof _Float;\n\n// User-defined diagnostic macros\n\n/** Emits a user-defined diagnostic error when encountered. */\ndeclare function ERROR(message?: any): void;\n/** Emits a user-defined diagnostic warning when encountered. */\ndeclare function WARNING(message?: any): void;\n/** Emits a user-defined diagnostic info when encountered. */\ndeclare function INFO(message?: any): void;\n\n// Polyfills\n\n/** Performs the sign-agnostic reverse bytes **/\ndeclare function bswap(value: T): T;\n/** Performs the sign-agnostic reverse bytes only for last 16-bit **/\ndeclare function bswap16(value: T): T;\n\n// Standard library\n\n/** Memory operations. */\ndeclare namespace memory {\n /** Returns the current memory size in units of pages. One page is 64kb. */\n export function size(): i32;\n /** Grows linear memory by a given unsigned delta of pages. One page is 64kb. Returns the previous memory size in units of pages or `-1` on failure. */\n export function grow(value: i32): i32;\n /** Sets n bytes beginning at the specified destination in memory to the specified byte value. */\n export function fill(dst: usize, value: u8, count: usize): void;\n /** Copies n bytes from the specified source to the specified destination in memory. These regions may overlap. */\n export function copy(dst: usize, src: usize, n: usize): void;\n /** Copies elements from a passive element segment to a table. */\n // export function init(segmentIndex: u32, srcOffset: usize, dstOffset: usize, n: usize): void;\n /** Prevents further use of a passive element segment. */\n // export function drop(segmentIndex: u32): void;\n /** Copies elements from one region of a table to another region. */\n export function allocate(size: usize): usize;\n /** Disposes a chunk of memory by its pointer. */\n export function free(ptr: usize): void;\n /** Compares two chunks of memory. Returns `0` if equal, otherwise the difference of the first differing bytes. */\n export function compare(vl: usize, vr: usize, n: usize): i32;\n /** Resets the allocator to its initial state, if supported. */\n export function reset(): void;\n}\n\n/** Garbage collector operations. */\ndeclare namespace gc {\n /** Allocates a managed object identified by its visitor function. */\n export function allocate(size: usize, visitFn: (ref: usize) => void): usize;\n /** Performs a full garbage collection cycle. */\n export function collect(): void;\n}\n\n/** Table operations. */\ndeclare namespace table {\n /** Copies elements from a passive element segment to a table. */\n // export function init(elementIndex: u32, srcOffset: u32, dstOffset: u32, n: u32): void;\n /** Prevents further use of a passive element segment. */\n // export function drop(elementIndex: u32): void;\n /** Copies elements from one region of a table to another region. */\n // export function copy(dest: u32, src: u32, n: u32): void;\n}\n\n/** Class representing a generic, fixed-length raw binary data buffer. */\ndeclare class ArrayBuffer {\n /** The size, in bytes, of the array. */\n readonly byteLength: i32;\n /** Unsafe pointer to the start of the data in memory. */\n readonly data: usize;\n /** Constructs a new array buffer of the given length in bytes. */\n constructor(length: i32, unsafe?: bool);\n /** Returns a copy of this array buffer's bytes from begin, inclusive, up to end, exclusive. */\n slice(begin?: i32, end?: i32): ArrayBuffer;\n}\n\n/** The `DataView` view provides a low-level interface for reading and writing multiple number types in a binary `ArrayBuffer`, without having to care about the platform's endianness. */\ndeclare class DataView {\n /** The `buffer` accessor property represents the `ArrayBuffer` or `SharedArrayBuffer` referenced by the `DataView` at construction time. */\n readonly buffer: ArrayBuffer;\n /** The `byteLength` accessor property represents the length (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteLength: i32;\n /** The `byteOffset` accessor property represents the offset (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteOffset: i32;\n /** Constructs a new `DataView` with the given properties */\n constructor(buffer: ArrayBuffer, byteOffset?: i32, byteLength?: i32);\n /** The `getFloat32()` method gets a signed 32-bit float (float) at the specified byte offset from the start of the `DataView`. */\n getFloat32(byteOffset: i32, littleEndian?: boolean): f32;\n /** The `getFloat64()` method gets a signed 64-bit float (double) at the specified byte offset from the start of the `DataView`. */\n getFloat64(byteOffset: i32, littleEndian?: boolean): f64;\n /** The `getInt8()` method gets a signed 8-bit integer (byte) at the specified byte offset from the start of the `DataView`. */\n getInt8(byteOffset: i32): i8;\n /** The `getInt16()` method gets a signed 16-bit integer (short) at the specified byte offset from the start of the `DataView`. */\n getInt16(byteOffset: i32, littleEndian?: boolean): i16;\n /** The `getInt32()` method gets a signed 32-bit integer (long) at the specified byte offset from the start of the `DataView`. */\n getInt32(byteOffset: i32, littleEndian?: boolean): i32;\n /** The `getInt64()` method gets a signed 64-bit integer (long long) at the specified byte offset from the start of the `DataView`. */\n getInt64(byteOffset: i32, littleEndian?: boolean): i64;\n /** The `getUint8()` method gets an unsigned 8-bit integer (unsigned byte) at the specified byte offset from the start of the `DataView`. */\n getUint8(byteOffset: i32): u8;\n /** The `getUint16()` method gets an unsigned 16-bit integer (unsigned short) at the specified byte offset from the start of the `DataView`. */\n getUint16(byteOffset: i32, littleEndian?: boolean): u16;\n /** The `getUint32()` method gets an unsigned 32-bit integer (unsigned long) at the specified byte offset from the start of the `DataView`. */\n getUint32(byteOffset: i32, littleEndian?: boolean): u32;\n /** The `getUint64()` method gets an unsigned 64-bit integer (unsigned long long) at the specified byte offset from the start of the `DataView`. */\n getUint64(byteOffset: i32, littleEndian?: boolean): u64;\n /** The `setFloat32()` method stores a signed 32-bit float (float) value at the specified byte offset from the start of the `DataView`. */\n setFloat32(byteOffset: i32, value: f32, littleEndian?: boolean): void;\n /** The `setFloat64()` method stores a signed 64-bit float (double) value at the specified byte offset from the start of the `DataView`. */\n setFloat64(byteOffset: i32, value: f64, littleEndian?: boolean): void;\n /** The `setInt8()` method stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setInt8(byteOffset: i32, value: i8): void;\n /** The `setInt16()` method stores a signed 16-bit integer (short) value at the specified byte offset from the start of the `DataView`. */\n setInt16(byteOffset: i32, value: i16, littleEndian?: boolean): void;\n /** The `setInt32()` method stores a signed 32-bit integer (long) value at the specified byte offset from the start of the `DataView`. */\n setInt32(byteOffset: i32, value: i32, littleEndian?: boolean): void;\n /** The `setInt64()` method stores a signed 64-bit integer (long long) value at the specified byte offset from the start of the `DataView`. */\n setInt64(byteOffset: i32, value: i64, littleEndian?: boolean): void;\n /** The `setUint8()` method stores an unsigned 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setUint8(byteOffset: i32, value: u8): void;\n /** The `setUint16()` method stores an unsigned 16-bit integer (unsigned short) value at the specified byte offset from the start of the `DataView`. */\n setUint16(byteOffset: i32, value: u16, littleEndian?: boolean): void;\n /** The `setUint32()` method stores an unsigned 32-bit integer (unsigned long) value at the specified byte offset from the start of the `DataView`. */\n setUint32(byteOffset: i32, value: u32, littleEndian?: boolean): void;\n /** The `setUint64()` method stores an unsigned 64-bit integer (unsigned long long) value at the specified byte offset from the start of the `DataView`. */\n setUint64(byteOffset: i32, value: u64, littleEndian?: boolean): void;\n /** Returns a string representation of DataView. */\n toString(): string;\n}\n\n/** Interface for a typed view on an array buffer. */\ninterface ArrayBufferView {\n [key: number]: T;\n /** The {@link ArrayBuffer} referenced by this view. */\n readonly buffer: ArrayBuffer;\n /** The offset in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteOffset: i32;\n /** The length in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteLength: i32;\n}\n\n/* @internal */\ndeclare abstract class TypedArray implements ArrayBufferView {\n [key: number]: T;\n /** Number of bytes per element. */\n static readonly BYTES_PER_ELEMENT: usize;\n /** Constructs a new typed array. */\n constructor(length: i32);\n /** The {@link ArrayBuffer} referenced by this view. */\n readonly buffer: ArrayBuffer;\n /** The offset in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteOffset: i32;\n /** The length in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteLength: i32;\n /** The length (in elements). */\n readonly length: i32;\n /** Returns a new TypedArray of this type on the same ArrayBuffer from begin inclusive to end exclusive. */\n subarray(begin?: i32, end?: i32): this;\n /** The reduce() method applies a function against an accumulator and each value of the typed array (from left-to-right) has to reduce it to a single value. This method has the same algorithm as Array.prototype.reduce(). */\n reduce(\n callbackfn: (accumulator: W, value: T, index: i32, self: this) => W,\n initialValue: W,\n ): W;\n /** The reduceRight() method applies a function against an accumulator and each value of the typed array (from left-to-right) has to reduce it to a single value, starting from the end of the array. This method has the same algorithm as Array.prototype.reduceRight(). */\n reduceRight(\n callbackfn: (accumulator: W, value: T, index: i32, self: this) => W,\n initialValue: W,\n ): W;\n /** The some() method tests whether some element in the typed array passes the test implemented by the provided function. This method has the same algorithm as Array.prototype.some().*/\n some(callbackfn: (value: T, index: i32, self: this) => bool): bool;\n /** The map() method creates a new typed array with the results of calling a provided function on every element in this typed array. This method has the same algorithm as Array.prototype.map().*/\n map(callbackfn: (value: T, index: i32, self: this) => T): this;\n /** The sort() method sorts the elements of a typed array numerically in place and returns the typed array. This method has the same algorithm as Array.prototype.sort(), except that sorts the values numerically instead of as strings. TypedArray is one of the typed array types here. */\n sort(callback?: (a: T, b: T) => i32): this;\n /** The fill() method fills all the elements of a typed array from a start index to an end index with a static value. This method has the same algorithm as Array.prototype.fill(). */\n fill(value: T, start?: i32, end?: i32): this;\n /** The findIndex() method returns an index in the typed array, if an element in the typed array satisfies the provided testing function. Otherwise -1 is returned. See also the find() [not implemented] method, which returns the value of a found element in the typed array instead of its index. */\n findIndex(callbackfn: (value: T, index: i32, self: this) => bool): i32;\n /** The every() method tests whether all elements in the typed array pass the test implemented by the provided function. This method has the same algorithm as Array.prototype.every(). */\n every(callbackfn: (value: T, index: i32, self: this) => bool): i32;\n}\n\n/** An array of twos-complement 8-bit signed integers. */\ndeclare class Int8Array extends TypedArray {}\n/** An array of 8-bit unsigned integers. */\ndeclare class Uint8Array extends TypedArray {}\n/** A clamped array of 8-bit unsigned integers. */\ndeclare class Uint8ClampedArray extends TypedArray {}\n/** An array of twos-complement 16-bit signed integers. */\ndeclare class Int16Array extends TypedArray {}\n/** An array of 16-bit unsigned integers. */\ndeclare class Uint16Array extends TypedArray {}\n/** An array of twos-complement 32-bit signed integers. */\ndeclare class Int32Array extends TypedArray {}\n/** An array of 32-bit unsigned integers. */\ndeclare class Uint32Array extends TypedArray {}\n/** An array of twos-complement 64-bit signed integers. */\ndeclare class Int64Array extends TypedArray {}\n/** An array of 64-bit unsigned integers. */\ndeclare class Uint64Array extends TypedArray {}\n/** An array of 32-bit floating point numbers. */\ndeclare class Float32Array extends TypedArray {}\n/** An array of 64-bit floating point numbers. */\ndeclare class Float64Array extends TypedArray {}\n\n/** Class representing a sequence of values of type `T`. */\ndeclare class Array {\n\n static isArray(value: any): value is Array;\n\n [key: number]: T;\n /** Current length of the array. */\n length: i32;\n /** Constructs a new array. */\n constructor(capacity?: i32);\n\n fill(value: T, start?: i32, end?: i32): this;\n every(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n findIndex(predicate: (element: T, index: i32, array?: Array) => bool): i32;\n includes(searchElement: T, fromIndex?: i32): bool;\n indexOf(searchElement: T, fromIndex?: i32): i32;\n lastIndexOf(searchElement: T, fromIndex?: i32): i32;\n push(element: T): i32;\n concat(items: T[]): T[];\n copyWithin(target: i32, start: i32, end?: i32): this;\n pop(): T;\n forEach(callbackfn: (value: T, index: i32, array: Array) => void): void;\n map(callbackfn: (value: T, index: i32, array: Array) => U): Array;\n filter(callbackfn: (value: T, index: i32, array: Array) => bool): Array;\n reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n reduceRight(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n shift(): T;\n some(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n unshift(element: T): i32;\n slice(from: i32, to?: i32): Array;\n splice(start: i32, deleteCount?: i32): Array;\n sort(comparator?: (a: T, b: T) => i32): this;\n join(separator?: string): string;\n reverse(): T[];\n toString(): string;\n}\n\n/** Class representing a sequence of characters. */\ndeclare class String {\n\n static fromCharCode(ls: i32, hs?: i32): string;\n static fromCharCodes(arr: u16[]): string;\n static fromCodePoint(code: i32): string;\n static fromCodePoints(arr: i32[]): string;\n\n readonly length: i32;\n readonly lengthUTF8: i32;\n\n charAt(index: u32): string;\n charCodeAt(index: u32): u16;\n concat(other: string): string;\n endsWith(other: string): bool;\n indexOf(other: string, fromIndex?: i32): u32;\n lastIndexOf(other: string, fromIndex?: i32): i32;\n includes(other: string): bool;\n startsWith(other: string): bool;\n substr(start: u32, length?: u32): string;\n substring(start: u32, end?: u32): string;\n trim(): string;\n trimLeft(): string;\n trimRight(): string;\n trimStart(): string;\n trimEnd(): string;\n padStart(targetLength: i32, padString?: string): string;\n padEnd(targetLength: i32, padString?: string): string;\n repeat(count?: i32): string;\n slice(beginIndex: i32, endIndex?: i32): string;\n split(separator?: string, limit?: i32): string[];\n toString(): string;\n static fromUTF8(ptr: usize, len: usize): string;\n toUTF8(): usize;\n}\n\n/** Class for representing a runtime error. Base class of all errors. */\ndeclare class Error {\n\n /** Error name. */\n name: string;\n\n /** Message provided on construction. */\n message: string;\n\n /** Stack trace. */\n stack?: string;\n\n /** Constructs a new error, optionally with a message. */\n constructor(message?: string);\n\n /** Method returns a string representing the specified Error class. */\n toString(): string;\n}\n\n/** Class for indicating an error when a value is not in the set or range of allowed values. */\ndeclare class RangeError extends Error { }\n\n/** Class for indicating an error when a value is not of the expected type. */\ndeclare class TypeError extends Error { }\n\n/** Class for indicating an error when trying to interpret syntactically invalid code. */\ndeclare class SyntaxError extends Error { }\n\ninterface Boolean {}\ninterface Function {}\ninterface IArguments {}\ninterface Number {}\ninterface Object {}\ninterface RegExp {}\n\ndeclare class Map {\n readonly size: i32;\n has(key: K): bool;\n set(key: K, value: V): void;\n get(key: K): V;\n delete(key: K): bool;\n clear(): void;\n toString(): string;\n}\n\ndeclare class Set {\n readonly size: i32;\n has(value: T): bool;\n add(value: T): void;\n delete(value: T): bool;\n clear(): void;\n toString(): string;\n}\n\ninterface SymbolConstructor {\n readonly hasInstance: symbol;\n readonly isConcatSpreadable: symbol;\n readonly isRegExp: symbol;\n readonly iterator: symbol;\n readonly match: symbol;\n readonly replace: symbol;\n readonly search: symbol;\n readonly species: symbol;\n readonly split: symbol;\n readonly toPrimitive: symbol;\n readonly toStringTag: symbol;\n readonly unscopables: symbol;\n (description?: string | null): symbol;\n for(key: string): symbol;\n keyFor(sym: symbol): string | null;\n}\n\ndeclare const Symbol: SymbolConstructor;\n\ninterface IMath {\n /** The base of natural logarithms, e, approximately 2.718. */\n readonly E: T;\n /** The natural logarithm of 2, approximately 0.693. */\n readonly LN2: T;\n /** The natural logarithm of 10, approximately 2.302. */\n readonly LN10: T;\n /** The base 2 logarithm of e, approximately 1.442. */\n readonly LOG2E: T;\n /** The base 10 logarithm of e, approximately 0.434. */\n readonly LOG10E: T;\n /** The ratio of the circumference of a circle to its diameter, approximately 3.14159. */\n readonly PI: T;\n /** The square root of 1/2, approximately 0.707. */\n readonly SQRT1_2: T;\n /** The square root of 2, approximately 1.414. */\n readonly SQRT2: T;\n /** Returns the absolute value of `x`. */\n abs(x: T): T;\n /** Returns the arccosine (in radians) of `x`. */\n acos(x: T): T;\n /** Returns the hyperbolic arc-cosine of `x`. */\n acosh(x: T): T;\n /** Returns the arcsine (in radians) of `x` */\n asin(x: T): T;\n /** Returns the hyperbolic arcsine of `x`. */\n asinh(x: T): T;\n /** Returns the arctangent (in radians) of `x`. */\n atan(x: T): T;\n /** Returns the arctangent of the quotient of its arguments. */\n atan2(y: T, x: T): T;\n /** Returns the hyperbolic arctangent of `x`. */\n atanh(x: T): T;\n /** Returns the cube root of `x`. */\n cbrt(x: T): T;\n /** Returns the smallest integer greater than or equal to `x`. */\n ceil(x: T): T;\n /** Returns the number of leading zero bits in the 32-bit binary representation of `x`. */\n clz32(x: T): T;\n /** Returns the cosine (in radians) of `x`. */\n cos(x: T): T;\n /** Returns the hyperbolic cosine of `x`. */\n cosh(x: T): T;\n /** Returns e to the power of `x`. */\n exp(x: T): T;\n /** Returns e to the power of `x`, minus 1. */\n expm1(x: T): T;\n /** Returns the largest integer less than or equal to `x`. */\n floor(x: T): T;\n /** Returns the nearest 32-bit single precision float representation of `x`. */\n fround(x: T): f32;\n /** Returns the square root of the sum of squares of its arguments. */\n hypot(value1: T, value2: T): T; // TODO: rest\n /** Returns the result of the C-like 32-bit multiplication of `a` and `b`. */\n imul(a: T, b: T): T;\n /** Returns the natural logarithm (base e) of `x`. */\n log(x: T): T;\n /** Returns the base 10 logarithm of `x`. */\n log10(x: T): T;\n /** Returns the natural logarithm (base e) of 1 + `x`. */\n log1p(x: T): T;\n /** Returns the base 2 logarithm of `x`. */\n log2(x: T): T;\n /** Returns the largest-valued number of its arguments. */\n max(value1: T, value2: T): T; // TODO: rest\n /** Returns the lowest-valued number of its arguments. */\n min(value1: T, value2: T): T; // TODO: rest\n /** Returns `base` to the power of `exponent`. */\n pow(base: T, exponent: T): T;\n /** Returns a pseudo-random number in the range from 0.0 inclusive up to but not including 1.0. */\n random(): T;\n /** Returns the value of `x` rounded to the nearest integer. */\n round(x: T): T;\n /** Returns the sign of `x`, indicating whether the number is positive, negative or zero. */\n sign(x: T): T;\n /** Returns whether the sign bit of `x` is set */\n signbit(x: T): bool;\n /** Returns the sine of `x`. */\n sin(x: T): T;\n /** Returns the hyperbolic sine of `x`. */\n sinh(x: T): T;\n /** Returns the square root of `x`. */\n sqrt(x: T): T;\n /** Returns the tangent of `x`. */\n tan(x: T): T;\n /** Returns the hyperbolic tangent of `x`. */\n tanh(x: T): T;\n /** Returns the integer part of `x` by removing any fractional digits. */\n trunc(x: T): T;\n}\n\ninterface INativeMath extends IMath {\n /** Seeds the random number generator. */\n seedRandom(value: i64): void;\n /** Returns the floating-point remainder of `x / y` (rounded towards zero). */\n mod(x: T, y: T): T;\n /** Returns the floating-point remainder of `x / y` (rounded to nearest). */\n rem(x: T, y: T): T;\n}\n\n/** Double precision math imported from JavaScript. */\ndeclare const JSMath: IMath;\n/** Double precision math implemented natively. */\ndeclare const NativeMath: INativeMath;\n/** Single precision math implemented natively. */\ndeclare const NativeMathf: INativeMath;\n/** Alias of {@link NativeMath} or {@link JSMath} respectively. Defaults to `NativeMath`. */\ndeclare const Math: IMath;\n/** Alias of {@link NativeMathf} or {@link JSMath} respectively. Defaults to `NativeMathf`. */\ndeclare const Mathf: IMath;\n\ndeclare class Date {\n /** Returns the UTC timestamp in milliseconds of the specified date. */\n static UTC(\n year: i32,\n month: i32,\n day: i32,\n hour: i32,\n minute: i32,\n second: i32,\n millisecond: i32\n ): i64;\n /** Returns the current UTC timestamp in milliseconds. */\n static now(): i64;\n /** Constructs a new date object from an UTC timestamp in milliseconds. */\n constructor(value: i64);\n /** Returns the UTC timestamp of this date in milliseconds. */\n getTime(): i64;\n /** Sets the UTC timestamp of this date in milliseconds. */\n setTime(value: i64): i64;\n}\n\n/** Environmental tracing function for debugging purposes. */\ndeclare function trace(msg: string, n?: i32, a0?: f64, a1?: f64, a2?: f64, a3?: f64, a4?: f64): void;\n\n// Decorators\n\ninterface TypedPropertyDescriptor {\n configurable?: boolean;\n enumerable?: boolean;\n writable?: boolean;\n value?: T;\n get?(): T;\n set?(value: T): void;\n}\n\n/** Annotates an element as a program global. */\ndeclare function global(\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n): TypedPropertyDescriptor | void;\n\n/** Annotates a method as a binary operator overload for the specified `token`. */\ndeclare function operator(token: string): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n) => TypedPropertyDescriptor | void;\n\ndeclare namespace operator {\n /** Annotates a method as a binary operator overload for the specified `token`. */\n export function binary(token: string): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n ) => TypedPropertyDescriptor | void;\n /** Annotates a method as an unary prefix operator overload for the specified `token`. */\n export function prefix(token: string): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n ) => TypedPropertyDescriptor | void;\n /** Annotates a method as an unary postfix operator overload for the specified `token`. */\n export function postfix(token: string): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n ) => TypedPropertyDescriptor | void;\n}\n\n/** Annotates a class as being unmanaged with limited capabilities. */\ndeclare function unmanaged(constructor: Function): void;\n\n/** Annotates a class as being sealed / non-derivable. */\ndeclare function sealed(constructor: Function): void;\n\n/** Annotates a method or function as always inlined. */\ndeclare function inline(\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n): TypedPropertyDescriptor | void;\n\n/** Annotates an explicit external name of a function or global. */\ndeclare function external(namespace: string, name: string): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n) => TypedPropertyDescriptor | void;\n",portable:"/**\n * Environment definitions for compiling AssemblyScript to JavaScript using tsc.\n *\n * Note that semantic differences require additional explicit conversions for full compatibility.\n * For example, when casting an i32 to an u8, doing `(someI32 & 0xff)` will yield the same\n * result when compiling to WebAssembly or JS while `someI32` alone does nothing in JS.\n *\n * Note that i64's are not portable (JS numbers are IEEE754 doubles with a maximum safe integer\n * value of 2^53-1) and instead require a compatibility layer to work in JS as well, as for example\n * {@link glue/js/i64} respectively {@link glue/wasm/i64}.\n *\n * @module std/portable\n *//***/\n\n/// \n\n// Types\n\ndeclare type i8 = number;\ndeclare type i16 = number;\ndeclare type i32 = number;\ndeclare type isize = number;\ndeclare type u8 = number;\ndeclare type u16 = number;\ndeclare type u32 = number;\ndeclare type bool = boolean;\ndeclare type usize = number;\ndeclare type f32 = number;\ndeclare type f64 = number;\n\n// Compiler hints\n\n/** Compiler target. 0 = JS, 1 = WASM32, 2 = WASM64. */\ndeclare const ASC_TARGET: i32;\n\n// Builtins\n\n/** Performs the sign-agnostic count leading zero bits operation on a 32-bit integer. All zero bits are considered leading if the value is zero. */\ndeclare function clz(value: T): T;\n/** Performs the sign-agnostic count tailing zero bits operation on a 32-bit integer. All zero bits are considered trailing if the value is zero. */\ndeclare function ctz(value: T): T;\n/** Performs the sign-agnostic count number of one bits operation on a 32-bit integer. */\ndeclare function popcnt(value: T): T;\n/** Performs the sign-agnostic rotate left operation on a 32-bit integer. */\ndeclare function rotl(value: T, shift: T): T;\n/** Performs the sign-agnostic rotate right operation on a 32-bit integer. */\ndeclare function rotr(value: T, shift: T): T;\n/** Computes the absolute value of an integer or float. */\ndeclare function abs(value: T): T;\n/** Determines the maximum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function max(left: T, right: T): T;\n/** Determines the minimum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function min(left: T, right: T): T;\n/** Composes a 32-bit or 64-bit float from the magnitude of `x` and the sign of `y`. */\ndeclare function copysign(x: T, y: T): T;\n/** Performs the ceiling operation on a 32-bit or 64-bit float. */\ndeclare function ceil(value: T): T;\n/** Performs the floor operation on a 32-bit or 64-bit float. */\ndeclare function floor(value: T): T;\n/** Rounds to the nearest integer tied to even of a 32-bit or 64-bit float. */\ndeclare function nearest(value: T): T;\n/** Selects one of two pre-evaluated values depending on the condition. */\ndeclare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n/** Calculates the square root of a 32-bit or 64-bit float. */\ndeclare function sqrt(value: T): T;\n/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */\ndeclare function trunc(value: T): T;\n/** Loads a value of the specified type from memory. Type must be `u8`. */\ndeclare function load(ptr: usize, constantOffset?: usize): T;\n/** Stores a value of the specified type to memory. Type must be `u8`. */\ndeclare function store(ptr: usize, value: T, constantOffset?: usize): void;\n/** Emits an unreachable operation that results in a runtime error when executed. */\ndeclare function unreachable(): any; // sic\n\n/** NaN (not a number) as a 32-bit or 64-bit float depending on context. */\ndeclare const NaN: f32 | f64;\n/** Positive infinity as a 32-bit or 64-bit float depending on context. */\ndeclare const Infinity: f32 | f64;\n/** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/\ndeclare function changetype(value: any): T;\n/** Explicitly requests no bounds checks on the provided expression. Useful for array accesses. */\ndeclare function unchecked(value: T): T;\n/** Tests if a 32-bit or 64-bit float is `NaN`. */\ndeclare function isNaN(value: T): bool;\n/** Tests if a 32-bit or 64-bit float is finite, that is not `NaN` or +/-`Infinity`. */\ndeclare function isFinite(value: T): bool;\n/** Tests if the specified value is a valid integer. Can't distinguish an integer from an integral float. */\ndeclare function isInteger(value: any): value is number;\n/** Tests if the specified value is a valid float. Can't distinguish a float from an integer. */\ndeclare function isFloat(value: any): value is number;\n/** Tests if the specified value is of a reference type. */\ndeclare function isReference(value: any): value is object | string;\n/** Tests if the specified value can be used as a string. */\ndeclare function isString(value: any): value is string | String;\n/** Tests if the specified value can be used as an array. */\ndeclare function isArray(value: any): value is Array;\n/** Tests if the specified expression resolves to a defined element. */\ndeclare function isDefined(expression: any): bool;\n/** Tests if the specified expression evaluates to a constant value. */\ndeclare function isConstant(expression: any): bool;\n/** Traps if the specified value is not true-ish, otherwise returns the value. */\ndeclare function assert(isTrueish: T | null, message?: string): T;\n/** Parses an integer string to a 64-bit float. */\ndeclare function parseInt(str: string, radix?: i32): f64;\n/** Parses an integer string to a 32-bit integer. */\ndeclare function parseI32(str: string, radix?: i32): i32;\n/** Parses a floating point string to a 64-bit float. */\ndeclare function parseFloat(str: string): f64;\n/** Returns the 64-bit floating-point remainder of `x/y`. */\ndeclare function fmod(x: f64, y: f64): f64;\n/** Returns the 32-bit floating-point remainder of `x/y`. */\ndeclare function fmodf(x: f32, y: f32): f32;\n\n/** Converts any other numeric value to an 8-bit signed integer. */\ndeclare function i8(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace i8 {\n /** Smallest representable value. */\n export const MIN_VALUE: i8;\n /** Largest representable value. */\n export const MAX_VALUE: i8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i8;\n}\n/** Converts any other numeric value to a 16-bit signed integer. */\ndeclare function i16(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace i16 {\n /** Smallest representable value. */\n export const MIN_VALUE: i16;\n /** Largest representable value. */\n export const MAX_VALUE: i16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i16;\n}\n/** Converts any other numeric value to a 32-bit signed integer. */\ndeclare function i32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i32;\ndeclare namespace i32 {\n /** Smallest representable value. */\n export const MIN_VALUE: i32;\n /** Largest representable value. */\n export const MAX_VALUE: i32;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i32;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) signed integer. */\ndeclare function isize(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): isize;\ndeclare namespace isize {\n /** Smallest representable value. */\n export const MIN_VALUE: isize;\n /** Largest representable value. */\n export const MAX_VALUE: isize;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): isize;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): isize;\n}\n/** Converts any other numeric value to an 8-bit unsigned integer. */\ndeclare function u8(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace u8 {\n /** Smallest representable value. */\n export const MIN_VALUE: u8;\n /** Largest representable value. */\n export const MAX_VALUE: u8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u8;\n}\n/** Converts any other numeric value to a 16-bit unsigned integer. */\ndeclare function u16(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace u16 {\n /** Smallest representable value. */\n export const MIN_VALUE: u16;\n /** Largest representable value. */\n export const MAX_VALUE: u16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u16;\n}\n/** Converts any other numeric value to a 32-bit unsigned integer. */\ndeclare function u32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i32;\ndeclare namespace u32 {\n /** Smallest representable value. */\n export const MIN_VALUE: u32;\n /** Largest representable value. */\n export const MAX_VALUE: u32;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u32;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) unsigned integer. */\ndeclare function usize(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): isize;\ndeclare namespace usize {\n /** Smallest representable value. */\n export const MIN_VALUE: usize;\n /** Largest representable value. */\n export const MAX_VALUE: usize;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): usize;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): usize;\n}\n/** Converts any other numeric value to a 1-bit unsigned integer. */\ndeclare function bool(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): bool;\ndeclare namespace bool {\n /** Smallest representable value. */\n export const MIN_VALUE: bool;\n /** Largest representable value. */\n export const MAX_VALUE: bool;\n}\n/** Converts any other numeric value to a 32-bit float. */\ndeclare function f32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): f32;\ndeclare namespace f32 {\n /** Smallest representable value. */\n export const MIN_VALUE: f32;\n /** Largest representable value. */\n export const MAX_VALUE: f32;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f32;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f32;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f32;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f32;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n export function isNaN(value: f32): bool;\n /** Returns true if passed value is finite. */\n export function isFinite(value: f32): bool;\n /** Returns true if the value passed is a safe integer. */\n export function isSafeInteger(value: f32): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n export function isInteger(value: f32): bool;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): f32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): f32;\n}\n/** Converts any other numeric value to a 64-bit float. */\ndeclare function f64(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): f64;\ndeclare namespace f64 {\n /** Smallest representable value. */\n export const MIN_VALUE: f64;\n /** Largest representable value. */\n export const MAX_VALUE: f64;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f64;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f64;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f64;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f64;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n export function isNaN(value: f32): bool;\n /** Returns true if passed value is finite. */\n export function isFinite(value: f32): bool;\n /** Returns true if the value passed is a safe integer. */\n export function isSafeInteger(value: f64): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n export function isInteger(value: f64): bool;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): f64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): f64;\n}\n\n// Polyfills\n\n/** [Polyfill] Performs the sign-agnostic reverse bytes **/\ndeclare function bswap(value: T): T;\n/** [Polyfill] Performs the sign-agnostic reverse bytes only for last 16-bit **/\ndeclare function bswap16(value: T): T;\n\n// Standard library\n\n/** Memory operations. */\ndeclare namespace memory {\n /** Allocates a chunk of memory of the specified size and returns a pointer to it. */\n function allocate(size: usize): usize;\n /** Disposes a chunk of memory by its pointer. */\n function free(ptr: usize): void;\n /** Copies n bytes from the specified source to the specified destination in memory. These regions may overlap. */\n function copy(dst: usize, src: usize, n: usize): void;\n /** Fills size bytes from from the specified destination by same value in memory. */\n function fill(dst: usize, value: u8, size: usize): void;\n /** Resets the allocator to its initial state, if supported. */\n function reset(): void;\n}\n\n/** Class representing a generic, fixed-length raw binary data buffer. */\ndeclare class ArrayBuffer {\n /** The size, in bytes, of the array. */\n readonly byteLength: i32;\n /** Constructs a new array buffer of the given length in bytes. */\n constructor(length: i32);\n /** Returns a copy of this array buffer's bytes from begin, inclusive, up to end, exclusive. */\n slice(begin?: i32, end?: i32): ArrayBuffer;\n /** Returns a string representation of ArrayBuffer. */\n toString(): string;\n}\n\n/** The `DataView` view provides a low-level interface for reading and writing multiple number types in a binary `ArrayBuffer`, without having to care about the platform's endianness. */\ndeclare class DataView {\n /** The `buffer` accessor property represents the `ArrayBuffer` or `SharedArrayBuffer` referenced by the `DataView` at construction time. */\n readonly buffer: ArrayBuffer;\n /** The `byteLength` accessor property represents the length (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteLength: i32;\n /** The `byteOffset` accessor property represents the offset (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteOffset: i32;\n /** Constructs a new `DataView` with the given properties */\n constructor(buffer: ArrayBuffer, byteOffset?: i32, byteLength?: i32);\n /** The `getFloat32()` method gets a signed 32-bit float (float) at the specified byte offset from the start of the `DataView`. */\n getFloat32(byteOffset: i32, littleEndian?: boolean): f32;\n /** The `getFloat64()` method gets a signed 64-bit float (double) at the specified byte offset from the start of the `DataView`. */\n getFloat64(byteOffset: i32, littleEndian?: boolean): f64;\n /** The `getInt8()` method gets a signed 8-bit integer (byte) at the specified byte offset from the start of the `DataView`. */\n getInt8(byteOffset: i32): i8;\n /** The `getInt16()` method gets a signed 16-bit integer (short) at the specified byte offset from the start of the `DataView`. */\n getInt16(byteOffset: i32, littleEndian?: boolean): i16;\n /** The `getInt32()` method gets a signed 32-bit integer (long) at the specified byte offset from the start of the `DataView`. */\n getInt32(byteOffset: i32, littleEndian?: boolean): i32;\n /** The `getUint8()` method gets an unsigned 8-bit integer (unsigned byte) at the specified byte offset from the start of the `DataView`. */\n getUint8(byteOffset: i32): u8;\n /** The `getUint16()` method gets an unsigned 16-bit integer (unsigned short) at the specified byte offset from the start of the `DataView`. */\n getUint16(byteOffset: i32, littleEndian?: boolean): u16;\n /** The `getUint32()` method gets an unsigned 32-bit integer (unsigned long) at the specified byte offset from the start of the `DataView`. */\n getUint32(byteOffset: i32, littleEndian?: boolean): u32;\n /** The `setFloat32()` method stores a signed 32-bit float (float) value at the specified byte offset from the start of the `DataView`. */\n setFloat32(byteOffset: i32, value: f32, littleEndian?: boolean): void;\n /** The `setFloat64()` method stores a signed 64-bit float (double) value at the specified byte offset from the start of the `DataView`. */\n setFloat64(byteOffset: i32, value: f64, littleEndian?: boolean): void;\n /** The `setInt8()` method stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setInt8(byteOffset: i32, value: i8): void;\n /** The `setInt16()` method stores a signed 16-bit integer (short) value at the specified byte offset from the start of the `DataView`. */\n setInt16(byteOffset: i32, value: i16, littleEndian?: boolean): void;\n /** The `setInt32()` method stores a signed 32-bit integer (long) value at the specified byte offset from the start of the `DataView`. */\n setInt32(byteOffset: i32, value: i32, littleEndian?: boolean): void;\n /** The `setUint8()` method stores an unsigned 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setUint8(byteOffset: i32, value: u8): void;\n /** The `setUint16()` method stores an unsigned 16-bit integer (unsigned short) value at the specified byte offset from the start of the `DataView`. */\n setUint16(byteOffset: i32, value: u16, littleEndian?: boolean): void;\n /** The `setUint32()` method stores an unsigned 32-bit integer (unsigned long) value at the specified byte offset from the start of the `DataView`. */\n setUint32(byteOffset: i32, value: u32, littleEndian?: boolean): void;\n /** Returns a string representation of DataView. */\n toString(): string;\n}\n\ndeclare class Array {\n\n static isArray(value: any): value is Array;\n\n [key: number]: T;\n length: i32;\n constructor(capacity?: i32);\n\n fill(value: T, start?: i32, end?: i32): this;\n every(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n findIndex(predicate: (element: T, index: i32, array?: Array) => bool): i32;\n includes(searchElement: T, fromIndex?: i32): bool;\n indexOf(searchElement: T, fromIndex?: i32): i32;\n lastIndexOf(searchElement: T, fromIndex?: i32): i32;\n push(element: T): i32;\n concat(items: T[]): T[];\n copyWithin(target: i32, start: i32, end?: i32): this;\n pop(): T;\n forEach(callbackfn: (value: T, index: i32, array: Array) => void): void;\n map(callbackfn: (value: T, index: i32, array: Array) => U): Array;\n filter(callbackfn: (value: T, index: i32, array: Array) => bool): Array;\n reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n reduceRight(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n shift(): T;\n some(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n unshift(element: T): i32;\n slice(from?: i32, to?: i32): Array;\n splice(start: i32, deleteCount?: i32): Array;\n sort(comparator?: (a: T, b: T) => i32): this;\n join(separator?: string): string;\n reverse(): T[];\n toString(): string;\n}\n\ndeclare class Uint8Array extends Array {}\ndeclare class Uint8ClampedArray extends Array {}\ndeclare class Uint16Array extends Array {}\ndeclare class Uint32Array extends Array {}\ndeclare class Int8Array extends Array {}\ndeclare class Int16Array extends Array {}\ndeclare class Int32Array extends Array {}\ndeclare class Float32Array extends Array {}\ndeclare class Float64Array extends Array {}\n\ndeclare class String {\n\n static fromCharCode(ls: i32, hs?: i32): string;\n static fromCharCodes(arr: u16[]): string;\n static fromCodePoint(code: i32): string;\n static fromCodePoints(arr: i32[]): string;\n\n readonly length: i32;\n\n private constructor();\n\n charAt(index: i32): string;\n charCodeAt(index: i32): i32;\n concat(other: string): string;\n indexOf(other: string, fromIndex?: i32): i32;\n lastIndexOf(other: string, fromIndex?: i32): i32;\n includes(other: string): bool;\n startsWith(other: string): bool;\n endsWith(other: string): bool;\n substr(start: u32, length?: u32): string;\n substring(from: i32, to?: i32): string;\n trim(): string;\n trimLeft(): string;\n trimRight(): string;\n trimStart(): string;\n trimEnd(): string;\n padStart(targetLength: i32, padString?: string): string;\n padEnd(targetLength: i32, padString?: string): string;\n replace(search: string, replacement: string): string;\n repeat(count?: i32): string;\n slice(beginIndex: i32, endIndex?: i32): string;\n split(separator?: string, limit?: i32): string[];\n toString(): string;\n}\n\ninterface Boolean {}\n\ndeclare class Number {\n private constructor();\n toString(radix?: i32): string;\n}\n\ninterface Object {}\n\ninterface Function {}\n\ninterface RegExp {}\n\ninterface IArguments {}\n\n/** Class for representing a runtime error. Base class of all errors. */\ndeclare class Error {\n\n /** Error name. */\n name: string;\n\n /** Message provided on construction. */\n message: string;\n\n /** Stack trace. */\n stack?: string;\n\n /** Constructs a new error, optionally with a message. */\n constructor(message?: string);\n\n /** Method returns a string representing the specified Error class. */\n toString(): string;\n}\n\n/** Class for indicating an error when a value is not in the set or range of allowed values. */\ndeclare class RangeError extends Error { }\n\n/** Class for indicating an error when a value is not of the expected type. */\ndeclare class TypeError extends Error { }\n\n/** Class for indicating an error when trying to interpret syntactically invalid code. */\ndeclare class SyntaxError extends Error { }\n\ndeclare class Set {\n constructor(entries?: T[]);\n readonly size: i32;\n has(value: T): bool;\n add(value: T): void;\n delete(value: T): bool;\n clear(): void;\n toString(): string;\n [Symbol.iterator](): Iterator;\n}\n\ndeclare class Map {\n constructor(entries?: [K, V][]);\n readonly size: i32;\n set(key: K, value: V): void;\n has(key: K): bool;\n get(key: K): V | null;\n clear(): void;\n entries(): Iterable<[K, V]>;\n keys(): Iterable;\n values(): Iterable;\n delete(key: K): bool;\n toString(): string;\n [Symbol.iterator](): Iterator<[K,V]>;\n}\n\ninterface SymbolConstructor {\n readonly hasInstance: symbol;\n readonly isConcatSpreadable: symbol;\n readonly isRegExp: symbol;\n readonly iterator: symbol;\n readonly match: symbol;\n readonly replace: symbol;\n readonly search: symbol;\n readonly species: symbol;\n readonly split: symbol;\n readonly toPrimitive: symbol;\n readonly toStringTag: symbol;\n readonly unscopables: symbol;\n (description?: string | null): symbol;\n for(key: string): symbol;\n keyFor(sym: symbol): string | null;\n}\ndeclare const Symbol: SymbolConstructor;\n\ninterface Iterable {\n [Symbol.iterator](): Iterator;\n}\n\ninterface Iterator {}\n\ninterface IMath {\n readonly E: f64;\n readonly LN2: f64;\n readonly LN10: f64;\n readonly LOG2E: f64;\n readonly LOG10E: f64;\n readonly PI: f64;\n readonly SQRT1_2: f64;\n readonly SQRT2: f64;\n abs(x: f64): f64;\n acos(x: f64): f64;\n acosh(x: f64): f64;\n asin(x: f64): f64;\n asinh(x: f64): f64;\n atan(x: f64): f64;\n atan2(y: f64, x: f64): f64;\n atanh(x: f64): f64;\n cbrt(x: f64): f64;\n ceil(x: f64): f64;\n clz32(x: f64): i32;\n cos(x: f64): f64;\n cosh(x: f64): f64;\n exp(x: f64): f64;\n expm1(x: f64): f64;\n floor(x: f64): f64;\n fround(x: f64): f32;\n hypot(value1: f64, value2: f64): f64; // TODO: see std/math\n imul(a: f64, b: f64): i32;\n log(x: f64): f64;\n log10(x: f64): f64;\n log1p(x: f64): f64;\n log2(x: f64): f64;\n max(value1: f64, value2: f64): f64; // TODO: see std/math\n min(value1: f64, value2: f64): f64; // TODO: see std/math\n pow(base: f64, exponent: f64): f64;\n random(): f64;\n round(x: f64): f64;\n sign(x: f64): f64;\n signbit(x: f64): bool;\n sin(x: f64): f64;\n sinh(x: f64): f64;\n sqrt(x: f64): f64;\n tan(x: f64): f64;\n tanh(x: f64): f64;\n trunc(x: f64): f64;\n}\n\ndeclare const Math: IMath;\ndeclare const Mathf: IMath;\ndeclare const JSMath: IMath;\n\ndeclare class Date {\n /** Returns the UTC timestamp in milliseconds of the specified date. */\n static UTC(\n year: i32,\n month: i32,\n day: i32,\n hour: i32,\n minute: i32,\n second: i32,\n millisecond: i32\n ): number;\n /** Returns the current UTC timestamp in milliseconds. */\n static now(): number;\n /** Constructs a new date object from an UTC timestamp in milliseconds. */\n constructor(value: number);\n /** Returns the UTC timestamp of this date in milliseconds. */\n getTime(): number;\n /** Sets the UTC timestamp of this date in milliseconds. */\n setTime(value: number): number;\n}\n\ndeclare namespace console {\n /** @deprecated */\n function log(message: string): void;\n}\n"}):(()=>{const e=path.join(".","..","std");return{assembly:fs.readFileSync(path.join(e,"assembly","index.d.ts"),"utf8"),portable:fs.readFileSync(path.join(e,"portable","index.d.ts"),"utf8")}})(),exports.compileString=((e,n)=>{"string"==typeof e&&(e={"input.ts":e});const t=Object.create({stdout:createMemoryStream(),stderr:createMemoryStream()});var r=["--binaryFile","binary","--textFile","text"];return Object.keys(n||{}).forEach(e=>{var t=n[e];Array.isArray(t)?t.forEach(n=>r.push("--"+e,String(n))):r.push("--"+e,String(t))}),exports.main(r.concat(Object.keys(e)),{stdout:t.stdout,stderr:t.stderr,readFile:n=>e.hasOwnProperty(n)?e[n]:null,writeFile:(e,n)=>t[e]=n,listFiles:()=>[]}),t}),exports.main=function(e,n,t){"function"==typeof n?(t=n,n={}):n||(n={});const r=n.stdout||process.stdout,i=n.stderr||process.stderr,a=n.readFile||F,s=n.writeFile||S,o=n.listFiles||I,l=n.stats||createStats();if(!r)throw Error("'options.stdout' must be specified");if(!i)throw Error("'options.stderr' must be specified");const f=optionsUtil.parse(e,exports.options),u=f.options;if(e=f.arguments,u.noColors?colorsUtil.stdout.supported=colorsUtil.stderr.supported=!1:(colorsUtil.stdout=colorsUtil.from(r),colorsUtil.stderr=colorsUtil.from(i)),f.unknown.length&&f.unknown.forEach(e=>{i.write(colorsUtil.stderr.yellow("WARN: ")+"Unknown option '"+e+"'"+EOL)}),f.trailing.length&&i.write(colorsUtil.stderr.yellow("WARN: ")+"Unsupported trailing arguments: "+f.trailing.join(" ")+EOL),t||(t=function(e){var n=0;return e&&(i.write(colorsUtil.stderr.red("ERROR: ")+e.stack.replace(/^ERROR: /i,"")+EOL),n=1),n}),u.version)return r.write("Version "+exports.version+(isDev?"-dev":"")+EOL),t(null);if(u.help||!e.length){var c=u.help?r:i,p=u.help?colorsUtil.stdout:colorsUtil.stderr;return c.write([p.white("SYNTAX")," "+p.cyan("asc")+" [entryFile ...] [options]","",p.white("EXAMPLES")," "+p.cyan("asc")+" hello.ts"," "+p.cyan("asc")+" hello.ts -b hello.wasm -t hello.wat"," "+p.cyan("asc")+" hello1.ts hello2.ts -b -O > hello.wasm","",p.white("OPTIONS")].concat(optionsUtil.help(exports.options,24,EOL)).join(EOL)+EOL),t(null)}if(!fs.readFileSync){if(a===F)throw Error("'options.readFile' must be specified");if(s===S)throw Error("'options.writeFile' must be specified");if(o===I)throw Error("'options.listFiles' must be specified")}const d=u.baseDir?path.resolve(u.baseDir):".",h=[];u.transform&&u.transform.forEach(e=>h.push(__webpack_require__(12)(path.isAbsolute(e=e.trim())?e:path.join(process.cwd(),e))));var x=null;u.noLib?(l.parseCount++,l.parseTime+=measure(()=>{x=assemblyscript.parseFile(exports.libraryFiles.builtins,exports.libraryPrefix+"builtins.ts",!1,x)})):Object.keys(exports.libraryFiles).forEach(e=>{e.indexOf("/")>=0||(l.parseCount++,l.parseTime+=measure(()=>{x=assemblyscript.parseFile(exports.libraryFiles[e],exports.libraryPrefix+e+".ts",!1,x)}))});const b=[];if(u.lib){let e=u.lib;"string"==typeof e&&(e=e.split(",")),Array.prototype.push.apply(b,e.map(e=>e.trim()));for(let e=0,n=b.length;e{x=assemblyscript.parseFile(s,exports.libraryPrefix+i,!1,x)})}}}function g(){for(var e,n;null!=(e=x.nextFile());){if(e.startsWith(exports.libraryPrefix)){const t=e.substring(exports.libraryPrefix.length),r=e.substring(exports.libraryPrefix.length)+"/index";if(exports.libraryFiles.hasOwnProperty(t))n=exports.libraryFiles[t],e=exports.libraryPrefix+t+".ts";else if(exports.libraryFiles.hasOwnProperty(r))n=exports.libraryFiles[r],e=exports.libraryPrefix+r+".ts";else for(let i=0,s=b.length;i{assemblyscript.parseFile(n,e,!1,x)})}if(checkDiagnostics(x,i))return t(Error("Parse error"))}for(let n=0,r=e.length;n{x=assemblyscript.parseFile(s,i,!0,x)});let o=g();if(o)return o}!function(e,...n){h.forEach(t=>{"function"==typeof t[e]&&t[e](...n)})}("afterParse",x);{let e=g();if(e)return e}const y=assemblyscript.finishParsing(x);var m=0,v=0;u.optimize&&(m=exports.defaultOptimizeLevel,v=exports.defaultShrinkLevel),"number"==typeof u.optimizeLevel&&(m=u.optimizeLevel),"number"==typeof u.shrinkLevel&&(v=u.shrinkLevel),m=Math.min(Math.max(m,0),3),v=Math.min(Math.max(v,0),2);const E=assemblyscript.createOptions();if(assemblyscript.setTarget(E,0),assemblyscript.setNoTreeShaking(E,u.noTreeShaking),assemblyscript.setNoAssert(E,u.noAssert),assemblyscript.setImportMemory(E,u.importMemory),assemblyscript.setImportTable(E,u.importTable),assemblyscript.setMemoryBase(E,u.memoryBase>>>0),assemblyscript.setSourceMap(E,null!=u.sourceMap),assemblyscript.setOptimizeLevelHints(E,m,v),u.noLib||(assemblyscript.setGlobalAlias(E,"Math","NativeMath"),assemblyscript.setGlobalAlias(E,"Mathf","NativeMathf"),assemblyscript.setGlobalAlias(E,"abort","~lib/env/abort"),assemblyscript.setGlobalAlias(E,"trace","~lib/env/trace")),u.use){let e=u.use;for(let n=0,r=e.length;n{try{l.compileTime+=measure(()=>{_=assemblyscript.compileProgram(y,E)})}catch(e){return t(e)}})(),checkDiagnostics(x,i))return _&&_.dispose(),t(Error("Compile error"));if(u.validate&&(l.validateCount++,l.validateTime+=measure(()=>{if(!_.validate())return _.dispose(),t(Error("Validate error"))})),"clamp"===u.trapMode)l.optimizeCount++,l.optimizeTime+=measure(()=>{_.runPasses(["trap-mode-clamp"])});else if("js"===u.trapMode)l.optimizeCount++,l.optimizeTime+=measure(()=>{_.runPasses(["trap-mode-js"])});else if("allow"!==u.trapMode)return _.dispose(),t(Error("Unsupported trap mode"));(m>=3||v>=2)&&(m=4),_.setOptimizeLevel(m),_.setShrinkLevel(v),_.setDebugInfo(u.debug);var A=[];if(u.runPasses&&("string"==typeof u.runPasses&&(u.runPasses=u.runPasses.split(",")),u.runPasses.length&&u.runPasses.forEach(e=>{A.indexOf(e)<0&&A.push(e)})),(m>0||v>0)&&(l.optimizeCount++,l.optimizeTime+=measure(()=>{_.optimize()})),A.length&&(l.optimizeCount++,l.optimizeTime+=measure(()=>{_.runPasses(A.map(e=>e.trim()))})),!u.noEmit){let e=!1,n=!1;if(null!=u.outFile&&(/\.was?t$/.test(u.outFile)&&null==u.textFile?u.textFile=u.outFile:/\.js$/.test(u.outFile)&&null==u.asmjsFile?u.asmjsFile=u.outFile:null==u.binaryFile&&(u.binaryFile=u.outFile)),null!=u.binaryFile){let r,o=null!=u.sourceMap?u.sourceMap.length?u.sourceMap:path.basename(u.binaryFile)+".map":null;if(l.emitCount++,l.emitTime+=measure(()=>{r=_.toBinary(o)}),u.binaryFile.length?s(u.binaryFile,r.output,d):(z(r.output),e=!0),n=!0,null!=r.sourceMap)if(u.binaryFile.length){let e=JSON.parse(r.sourceMap);e.sourceRoot=exports.sourceMapRoot,e.sources.forEach((n,r)=>{let i=null;if(n.startsWith(exports.libraryPrefix)){let e=n.substring(exports.libraryPrefix.length).replace(/\.ts$/,"");if(exports.libraryFiles.hasOwnProperty(e))i=exports.libraryFiles[e];else for(let e=0,t=b.length;e{t=_.toAsmjs()}),s(u.asmjsFile,t,d)):e||(l.emitCount++,l.emitTime+=measure(()=>{t=_.toAsmjs()}),z(t),e=!0),n=!0}if(null!=u.idlFile){let t;u.idlFile.length?(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildIDL(y)}),s(u.idlFile,t,d)):e||(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildIDL(y)}),z(t),e=!0),n=!0}if(null!=u.tsdFile){let t;u.tsdFile.length?(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildTSD(y)}),s(u.tsdFile,t,d)):e||(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildTSD(y)}),z(t),e=!0),n=!0}if(null!=u.textFile||!n){let n;u.textFile&&u.textFile.length?(l.emitCount++,l.emitTime+=measure(()=>{n=_.toText()}),s(u.textFile,n,d)):e||(l.emitCount++,l.emitTime+=measure(()=>{n=_.toText()}),z(n))}}return _.dispose(),u.measure&&printStats(l,i),t(null);function F(e,n){try{let t;return l.readCount++,l.readTime+=measure(()=>{t=fs.readFileSync(path.join(n,e),{encoding:"utf8"})}),t}catch(e){return null}}function S(e,n,t){try{return l.writeCount++,l.writeTime+=measure(()=>{mkdirp(path.join(t,path.dirname(e))),"string"==typeof n?fs.writeFileSync(path.join(t,e),n,{encoding:"utf8"}):fs.writeFileSync(path.join(t,e),n)}),!0}catch(e){return!1}}function I(e,n){var t;try{return l.readTime+=measure(()=>{t=fs.readdirSync(path.join(n,e)).filter(e=>/^(?!.*\.d\.ts$).*\.ts$/.test(e))}),t}catch(e){return[]}}function z(e){z.used||(l.writeCount++,z.used=!0),l.writeTime+=measure(()=>{"string"==typeof e?r.write(e,{encoding:"utf8"}):r.write(e)})}};var argumentSubstitutions={"-O":["--optimize"],"-Os":["--optimize","--shrinkLevel","1"],"-Oz":["--optimize","--shrinkLevel","2"],"-O0":["--optimizeLevel","0","--shrinkLevel","0"],"-O0s":["--optimizeLevel","0","--shrinkLevel","1"],"-O0z":["--optimizeLevel","0","--shrinkLevel","2"],"-O1":["--optimizeLevel","1","--shrinkLevel","0"],"-O1s":["--optimizeLevel","1","--shrinkLevel","1"],"-O1z":["--optimizeLevel","1","--shrinkLevel","2"],"-O2":["--optimizeLevel","2","--shrinkLevel","0"],"-O2s":["--optimizeLevel","2","--shrinkLevel","1"],"-O2z":["--optimizeLevel","2","--shrinkLevel","2"],"-O3":["--optimizeLevel","3","--shrinkLevel","0"],"-O3s":["--optimizeLevel","3","--shrinkLevel","1"],"-O3z":["--optimizeLevel","3","--shrinkLevel","2"]};function checkDiagnostics(e,n){for(var t,r=!1;null!=(t=assemblyscript.nextDiagnostic(e));)n&&n.write(assemblyscript.formatDiagnostic(t,n.isTTY,!0)+EOL+EOL),assemblyscript.isError(t)&&(r=!0);return r}function createStats(){return{readTime:0,readCount:0,writeTime:0,writeCount:0,parseTime:0,parseCount:0,compileTime:0,compileCount:0,emitTime:0,emitCount:0,validateTime:0,validateCount:0,optimizeTime:0,optimizeCount:0}}function measure(e){const n=process.hrtime();e();const t=process.hrtime(n);return 1e9*t[0]+t[1]}function formatTime(e){return e?(e/1e6).toFixed(3)+" ms":"N/A"}function printStats(e,n){function t(e,n){return formatTime(e)}(n||process.stdout).write(["I/O Read : "+t(e.readTime,e.readCount),"I/O Write : "+t(e.writeTime,e.writeCount),"Parse : "+t(e.parseTime,e.parseCount),"Compile : "+t(e.compileTime,e.compileCount),"Emit : "+t(e.emitTime,e.emitCount),"Validate : "+t(e.validateTime,e.validateCount),"Optimize : "+t(e.optimizeTime,e.optimizeCount)].join(EOL)+EOL)}exports.checkDiagnostics=checkDiagnostics,exports.createStats=createStats,process.hrtime||(process.hrtime=__webpack_require__(13)),exports.measure=measure,exports.formatTime=formatTime,exports.printStats=printStats;var allocBuffer=void 0!==global&&global.Buffer?global.Buffer.allocUnsafe||function(e){return new global.Buffer(e)}:function(e){return new Uint8Array(e)};function createMemoryStream(e){var n=[];return n.write=function(n){if(e&&e(n),"string"==typeof n){let e=allocBuffer(utf8.length(n));utf8.write(n,e,0),n=e}this.push(n)},n.reset=function(){n.length=0},n.toBuffer=function(){for(var e=0,n=0,t=this.length;n191&&r<224?a[s++]=(31&r)<<6|63&e[n++]:r>239&&r<365?(r=((7&r)<<18|(63&e[n++])<<12|(63&e[n++])<<6|63&e[n++])-65536,a[s++]=55296+(r>>10),a[s++]=56320+(1023&r)):a[s++]=(15&r)<<12|(63&e[n++])<<6|63&e[n++],s>8191&&((i||(i=[])).push(String.fromCharCode.apply(String,a)),s=0);return i?(s&&i.push(String.fromCharCode.apply(String,a.slice(0,s))),i.join("")):String.fromCharCode.apply(String,a.slice(0,s))},r.write=function(e,n,t){for(var r,i,a=t,s=0;s>6|192,n[t++]=63&r|128):55296==(64512&r)&&56320==(64512&(i=e.charCodeAt(s+1)))?(r=65536+((1023&r)<<10)+(1023&i),++s,n[t++]=r>>18|240,n[t++]=r>>12&63|128,n[t++]=r>>6&63|128,n[t++]=63&r|128):(n[t++]=r>>12|224,n[t++]=r>>6&63|128,n[t++]=63&r|128);return t-a}},function(e,n,t){(function(e){var t=void 0!==e&&e||{},r=t.env&&"CI"in t.env;function i(e,t){var i=t||{};return i.supported=e&&!!e.isTTY||r,i.gray=(e=>i.supported?n.GRAY+e+n.RESET:e),i.red=(e=>i.supported?n.RED+e+n.RESET:e),i.green=(e=>i.supported?n.GREEN+e+n.RESET:e),i.yellow=(e=>i.supported?n.YELLOW+e+n.RESET:e),i.blue=(e=>i.supported?n.BLUE+e+n.RESET:e),i.magenta=(e=>i.supported?n.MAGENTA+e+n.RESET:e),i.cyan=(e=>i.supported?n.CYAN+e+n.RESET:e),i.white=(e=>i.supported?n.WHITE+e+n.RESET:e),i}n.stdout=i(t.stdout,n),n.stderr=i(t.stderr),n.from=i,n.GRAY="",n.RED="",n.GREEN="",n.YELLOW="",n.BLUE="",n.MAGENTA="",n.CYAN="",n.WHITE="",n.RESET=""}).call(this,t(0))},function(e,n){n.parse=function(e,n){var t={},r=[],arguments=[],i=[],a={};Object.keys(n).forEach(e=>{var r=n[e];null!=r.alias&&("string"==typeof r.alias?a[r.alias]=e:Array.isArray(r.alias)&&r.alias.forEach(n=>a[n]=e)),null!=r.default&&(t[e]=r.default)});for(var s=0,o=(e=e.slice()).length;st[e]=o.value[e])}else r.push(i)}for(;s{var s=e[n];if(null!=s.description){for(var o="";o.length{for(let n=0;n 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\r\n * Compiler frontend for node.js\r\n *\r\n * Uses the low-level API exported from src/index.ts so it works with the compiler compiled to\r\n * JavaScript as well as the compiler compiled to WebAssembly (eventually). Runs the sources\r\n * directly through ts-node if distribution files are not present (indicated by a `-dev` version).\r\n *\r\n * Can also be packaged as a bundle suitable for in-browser use with the standard library injected\r\n * in the build step. See dist/asc.js for the bundle and webpack.config.js for building details.\r\n *\r\n * @module cli/asc\r\n */\r\n\r\n// Use \".\" instead of \"/\" as cwd in browsers\r\nif (process.browser) process.cwd = function() { return \".\"; };\r\n\r\nconst fs = require(\"fs\");\r\nconst path = require(\"path\");\r\nconst utf8 = require(\"@protobufjs/utf8\");\r\nconst colorsUtil = require(\"./util/colors\");\r\nconst optionsUtil = require(\"./util/options\");\r\nconst mkdirp = require(\"./util/mkdirp\");\r\nconst EOL = process.platform === \"win32\" ? \"\\r\\n\" : \"\\n\";\r\n\r\n// Emscripten adds an `uncaughtException` listener to Binaryen that results in an additional\r\n// useless code fragment on top of an actual error. suppress this:\r\nif (process.removeAllListeners) process.removeAllListeners(\"uncaughtException\");\r\n\r\n// Use distribution files if present, otherwise run the sources directly\r\nvar assemblyscript, isDev = false;\r\n(() => {\r\n try { // `asc` on the command line\r\n assemblyscript = require(\"../dist/assemblyscript.js\");\r\n } catch (e) {\r\n try { // `asc` on the command line without dist files\r\n require(\"ts-node\").register({ project: path.join(__dirname, \"..\", \"src\", \"tsconfig.json\") });\r\n require(\"../src/glue/js\");\r\n assemblyscript = require(\"../src\");\r\n isDev = true;\r\n } catch (e_ts) {\r\n try { // `require(\"dist/asc.js\")` in explicit browser tests\r\n assemblyscript = eval(\"require('./assemblyscript')\");\r\n } catch (e) {\r\n // combine both errors that lead us here\r\n e.stack = e_ts.stack + \"\\n---\\n\" + e.stack;\r\n throw e;\r\n }\r\n }\r\n }\r\n})();\r\n\r\n/** Whether this is a webpack bundle or not. */\r\nexports.isBundle = typeof BUNDLE_VERSION === \"string\";\r\n\r\n/** Whether asc runs the sources directly or not. */\r\nexports.isDev = isDev;\r\n\r\n/** AssemblyScript version. */\r\nexports.version = exports.isBundle ? BUNDLE_VERSION : require(\"../package.json\").version;\r\n\r\n/** Available CLI options. */\r\nexports.options = require(\"./asc.json\");\r\n\r\n/** Common root used in source maps. */\r\nexports.sourceMapRoot = \"assemblyscript:///\";\r\n\r\n/** Prefix used for library files. */\r\nexports.libraryPrefix = assemblyscript.LIBRARY_PREFIX;\r\n\r\n/** Default Binaryen optimization level. */\r\nexports.defaultOptimizeLevel = 2;\r\n\r\n/** Default Binaryen shrink level. */\r\nexports.defaultShrinkLevel = 1;\r\n\r\n/** Bundled library files. */\r\nexports.libraryFiles = exports.isBundle ? BUNDLE_LIBRARY : (() => { // set up if not a bundle\r\n const libDir = path.join(__dirname, \"..\", \"std\", \"assembly\");\r\n const libFiles = require(\"glob\").sync(\"**/!(*.d).ts\", { cwd: libDir });\r\n const bundled = {};\r\n libFiles.forEach(file => bundled[file.replace(/\\.ts$/, \"\")] = fs.readFileSync(path.join(libDir, file), \"utf8\" ));\r\n return bundled;\r\n})();\r\n\r\n/** Bundled definition files. */\r\nexports.definitionFiles = exports.isBundle ? BUNDLE_DEFINITIONS : (() => { // set up if not a bundle\r\n const stdDir = path.join(__dirname, \"..\", \"std\");\r\n return {\r\n \"assembly\": fs.readFileSync(path.join(stdDir, \"assembly\", \"index.d.ts\"), \"utf8\"),\r\n \"portable\": fs.readFileSync(path.join(stdDir, \"portable\", \"index.d.ts\"), \"utf8\")\r\n };\r\n})();\r\n\r\n/** Convenience function that parses and compiles source strings directly. */\r\nexports.compileString = (sources, options) => {\r\n if (typeof sources === \"string\") sources = { \"input.ts\": sources };\r\n const output = Object.create({\r\n stdout: createMemoryStream(),\r\n stderr: createMemoryStream()\r\n });\r\n var argv = [\r\n \"--binaryFile\", \"binary\",\r\n \"--textFile\", \"text\",\r\n ];\r\n Object.keys(options || {}).forEach(key => {\r\n var val = options[key];\r\n if (Array.isArray(val)) val.forEach(val => argv.push(\"--\" + key, String(val)));\r\n else argv.push(\"--\" + key, String(val));\r\n });\r\n exports.main(argv.concat(Object.keys(sources)), {\r\n stdout: output.stdout,\r\n stderr: output.stderr,\r\n readFile: name => sources.hasOwnProperty(name) ? sources[name] : null,\r\n writeFile: (name, contents) => output[name] = contents,\r\n listFiles: () => []\r\n });\r\n return output;\r\n}\r\n\r\n/** Runs the command line utility using the specified arguments array. */\r\nexports.main = function main(argv, options, callback) {\r\n if (typeof options === \"function\") {\r\n callback = options;\r\n options = {};\r\n } else if (!options) {\r\n options = {};\r\n }\r\n\r\n const stdout = options.stdout || process.stdout;\r\n const stderr = options.stderr || process.stderr;\r\n const readFile = options.readFile || readFileNode;\r\n const writeFile = options.writeFile || writeFileNode;\r\n const listFiles = options.listFiles || listFilesNode;\r\n const stats = options.stats || createStats();\r\n\r\n // Output must be specified if not present in the environment\r\n if (!stdout) throw Error(\"'options.stdout' must be specified\");\r\n if (!stderr) throw Error(\"'options.stderr' must be specified\");\r\n\r\n const opts = optionsUtil.parse(argv, exports.options);\r\n const args = opts.options;\r\n argv = opts.arguments;\r\n if (args.noColors) {\r\n colorsUtil.stdout.supported =\r\n colorsUtil.stderr.supported = false;\r\n } else {\r\n colorsUtil.stdout = colorsUtil.from(stdout);\r\n colorsUtil.stderr = colorsUtil.from(stderr);\r\n }\r\n\r\n // Check for unknown arguments\r\n if (opts.unknown.length) {\r\n opts.unknown.forEach(arg => {\r\n stderr.write(colorsUtil.stderr.yellow(\"WARN: \") + \"Unknown option '\" + arg + \"'\" + EOL);\r\n });\r\n }\r\n\r\n // Check for trailing arguments\r\n if (opts.trailing.length) {\r\n stderr.write(colorsUtil.stderr.yellow(\"WARN: \") + \"Unsupported trailing arguments: \" + opts.trailing.join(\" \") + EOL);\r\n }\r\n\r\n // Use default callback if none is provided\r\n if (!callback) callback = function defaultCallback(err) {\r\n var code = 0;\r\n if (err) {\r\n stderr.write(colorsUtil.stderr.red(\"ERROR: \") + err.stack.replace(/^ERROR: /i, \"\") + EOL);\r\n code = 1;\r\n }\r\n return code;\r\n };\r\n\r\n // Just print the version if requested\r\n if (args.version) {\r\n stdout.write(\"Version \" + exports.version + (isDev ? \"-dev\" : \"\") + EOL);\r\n return callback(null);\r\n }\r\n // Print the help message if requested or no source files are provided\r\n if (args.help || !argv.length) {\r\n var out = args.help ? stdout : stderr;\r\n var color = args.help ? colorsUtil.stdout : colorsUtil.stderr;\r\n out.write([\r\n color.white(\"SYNTAX\"),\r\n \" \" + color.cyan(\"asc\") + \" [entryFile ...] [options]\",\r\n \"\",\r\n color.white(\"EXAMPLES\"),\r\n \" \" + color.cyan(\"asc\") + \" hello.ts\",\r\n \" \" + color.cyan(\"asc\") + \" hello.ts -b hello.wasm -t hello.wat\",\r\n \" \" + color.cyan(\"asc\") + \" hello1.ts hello2.ts -b -O > hello.wasm\",\r\n \"\",\r\n color.white(\"OPTIONS\"),\r\n ].concat(\r\n optionsUtil.help(exports.options, 24, EOL)\r\n ).join(EOL) + EOL);\r\n return callback(null);\r\n }\r\n\r\n // I/O must be specified if not present in the environment\r\n if (!fs.readFileSync) {\r\n if (readFile === readFileNode) throw Error(\"'options.readFile' must be specified\");\r\n if (writeFile === writeFileNode) throw Error(\"'options.writeFile' must be specified\");\r\n if (listFiles === listFilesNode) throw Error(\"'options.listFiles' must be specified\");\r\n }\r\n\r\n // Set up base directory\r\n const baseDir = args.baseDir ? path.resolve(args.baseDir) : \".\";\r\n\r\n // Set up transforms\r\n const transforms = [];\r\n if (args.transform) {\r\n args.transform.forEach(transform =>\r\n transforms.push(\r\n require(\r\n path.isAbsolute(transform = transform.trim())\r\n ? transform\r\n : path.join(process.cwd(), transform)\r\n )\r\n )\r\n );\r\n }\r\n function applyTransform(name, ...args) {\r\n transforms.forEach(transform => {\r\n if (typeof transform[name] === \"function\") transform[name](...args);\r\n });\r\n }\r\n\r\n // Begin parsing\r\n var parser = null;\r\n\r\n // Include library files\r\n if (!args.noLib) {\r\n Object.keys(exports.libraryFiles).forEach(libPath => {\r\n if (libPath.indexOf(\"/\") >= 0) return; // in sub-directory: imported on demand\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n parser = assemblyscript.parseFile(\r\n exports.libraryFiles[libPath],\r\n exports.libraryPrefix + libPath + \".ts\",\r\n false,\r\n parser\r\n );\r\n });\r\n });\r\n } else { // always include builtins\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n parser = assemblyscript.parseFile(\r\n exports.libraryFiles[\"builtins\"],\r\n exports.libraryPrefix + \"builtins.ts\",\r\n false,\r\n parser\r\n );\r\n });\r\n }\r\n const customLibDirs = [];\r\n if (args.lib) {\r\n let lib = args.lib;\r\n if (typeof lib === \"string\") lib = lib.split(\",\");\r\n Array.prototype.push.apply(customLibDirs, lib.map(lib => lib.trim()));\r\n for (let i = 0, k = customLibDirs.length; i < k; ++i) { // custom\r\n let libDir = customLibDirs[i];\r\n let libFiles;\r\n if (libDir.endsWith(\".ts\")) {\r\n libFiles = [ path.basename(libDir) ];\r\n libDir = path.dirname(libDir);\r\n } else {\r\n libFiles = listFiles(libDir);\r\n }\r\n for (let j = 0, l = libFiles.length; j < l; ++j) {\r\n let libPath = libFiles[j];\r\n let libText = readFile(libPath, libDir);\r\n if (libText === null) return callback(Error(\"Library file '\" + libPath + \"' not found.\"));\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n parser = assemblyscript.parseFile(\r\n libText,\r\n exports.libraryPrefix + libPath,\r\n false,\r\n parser\r\n );\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Parses the backlog of imported files after including entry files\r\n function parseBacklog() {\r\n var sourcePath, sourceText;\r\n while ((sourcePath = parser.nextFile()) != null) {\r\n\r\n // Load library file if explicitly requested\r\n if (sourcePath.startsWith(exports.libraryPrefix)) {\r\n const plainName = sourcePath.substring(exports.libraryPrefix.length);\r\n const indexName = sourcePath.substring(exports.libraryPrefix.length) + \"/index\";\r\n if (exports.libraryFiles.hasOwnProperty(plainName)) {\r\n sourceText = exports.libraryFiles[plainName];\r\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\r\n } else if (exports.libraryFiles.hasOwnProperty(indexName)) {\r\n sourceText = exports.libraryFiles[indexName];\r\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\r\n } else {\r\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\r\n sourceText = readFile(plainName + \".ts\", customLibDirs[i]);\r\n if (sourceText !== null) {\r\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\r\n break;\r\n } else {\r\n sourceText = readFile(indexName + \".ts\", customLibDirs[i]);\r\n if (sourceText !== null) {\r\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Otherwise try nextFile.ts, nextFile/index.ts, ~lib/nextFile.ts, ~lib/nextFile/index.ts\r\n } else {\r\n const plainName = sourcePath;\r\n const indexName = sourcePath + \"/index\";\r\n sourceText = readFile(plainName + \".ts\", baseDir);\r\n if (sourceText !== null) {\r\n sourcePath = plainName + \".ts\";\r\n } else {\r\n sourceText = readFile(indexName + \".ts\", baseDir);\r\n if (sourceText !== null) {\r\n sourcePath = indexName + \".ts\";\r\n } else if (!plainName.startsWith(\".\")) {\r\n if (exports.libraryFiles.hasOwnProperty(plainName)) {\r\n sourceText = exports.libraryFiles[plainName];\r\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\r\n } else if (exports.libraryFiles.hasOwnProperty(indexName)) {\r\n sourceText = exports.libraryFiles[indexName];\r\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\r\n } else {\r\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\r\n const dir = customLibDirs[i];\r\n sourceText = readFile(plainName + \".ts\", customLibDirs[i]);\r\n if (sourceText !== null) {\r\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\r\n break;\r\n } else {\r\n sourceText = readFile(indexName + \".ts\", customLibDirs[i]);\r\n if (sourceText !== null) {\r\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (sourceText == null) {\r\n return callback(Error(\"Import file '\" + sourcePath + \".ts' not found.\"));\r\n }\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n assemblyscript.parseFile(sourceText, sourcePath, false, parser);\r\n });\r\n }\r\n if (checkDiagnostics(parser, stderr)) {\r\n return callback(Error(\"Parse error\"));\r\n }\r\n }\r\n\r\n // Include entry files\r\n for (let i = 0, k = argv.length; i < k; ++i) {\r\n const filename = argv[i];\r\n\r\n let sourcePath = String(filename).replace(/\\\\/g, \"/\").replace(/(\\.ts|\\/)$/, \"\");\r\n\r\n // Try entryPath.ts, then entryPath/index.ts\r\n let sourceText = readFile(sourcePath + \".ts\", baseDir);\r\n if (sourceText === null) {\r\n sourceText = readFile(sourcePath + \"/index.ts\", baseDir);\r\n if (sourceText === null) {\r\n return callback(Error(\"Entry file '\" + sourcePath + \".ts' not found.\"));\r\n } else {\r\n sourcePath += \"/index.ts\";\r\n }\r\n } else {\r\n sourcePath += \".ts\";\r\n }\r\n\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n parser = assemblyscript.parseFile(sourceText, sourcePath, true, parser);\r\n });\r\n let code = parseBacklog();\r\n if (code) return code;\r\n }\r\n\r\n applyTransform(\"afterParse\", parser);\r\n {\r\n let code = parseBacklog();\r\n if (code) return code;\r\n }\r\n\r\n // Finish parsing\r\n const program = assemblyscript.finishParsing(parser);\r\n\r\n // Set up optimization levels\r\n var optimizeLevel = 0;\r\n var shrinkLevel = 0;\r\n if (args.optimize) {\r\n optimizeLevel = exports.defaultOptimizeLevel;\r\n shrinkLevel = exports.defaultShrinkLevel;\r\n }\r\n if (typeof args.optimizeLevel === \"number\") {\r\n optimizeLevel = args.optimizeLevel;\r\n }\r\n if (typeof args.shrinkLevel === \"number\") {\r\n shrinkLevel = args.shrinkLevel;\r\n }\r\n optimizeLevel = Math.min(Math.max(optimizeLevel, 0), 3);\r\n shrinkLevel = Math.min(Math.max(shrinkLevel, 0), 2);\r\n\r\n // Begin compilation\r\n const compilerOptions = assemblyscript.createOptions();\r\n assemblyscript.setTarget(compilerOptions, 0);\r\n assemblyscript.setNoTreeShaking(compilerOptions, args.noTreeShaking);\r\n assemblyscript.setNoAssert(compilerOptions, args.noAssert);\r\n assemblyscript.setImportMemory(compilerOptions, args.importMemory);\r\n assemblyscript.setImportTable(compilerOptions, args.importTable);\r\n assemblyscript.setMemoryBase(compilerOptions, args.memoryBase >>> 0);\r\n assemblyscript.setSourceMap(compilerOptions, args.sourceMap != null);\r\n assemblyscript.setOptimizeLevelHints(compilerOptions, optimizeLevel, shrinkLevel);\r\n\r\n if (!args.noLib) {\r\n // Initialize default aliases\r\n assemblyscript.setGlobalAlias(compilerOptions, \"Math\", \"NativeMath\");\r\n assemblyscript.setGlobalAlias(compilerOptions, \"Mathf\", \"NativeMathf\");\r\n assemblyscript.setGlobalAlias(compilerOptions, \"abort\", \"~lib/env/abort\");\r\n assemblyscript.setGlobalAlias(compilerOptions, \"trace\", \"~lib/env/trace\");\r\n }\r\n\r\n // Add or override aliases if specified\r\n if (args.use) {\r\n let aliases = args.use;\r\n for (let i = 0, k = aliases.length; i < k; ++i) {\r\n let part = aliases[i];\r\n let p = part.indexOf(\"=\");\r\n if (p < 0) return callback(Error(\"Global alias '\" + part + \"' is invalid.\"));\r\n let name = part.substring(0, p).trim();\r\n let alias = part.substring(p + 1).trim();\r\n if (!name.length) return callback(Error(\"Global alias '\" + part + \"' is invalid.\"));\r\n assemblyscript.setGlobalAlias(compilerOptions, name, alias);\r\n }\r\n }\r\n\r\n // Enable additional features if specified\r\n var features = args.enable;\r\n if (features != null) {\r\n if (typeof features === \"string\") features = features.split(\",\");\r\n for (let i = 0, k = features.length; i < k; ++i) {\r\n let name = features[i].trim();\r\n let flag = assemblyscript[\"FEATURE_\" + name.replace(/\\-/g, \"_\").toUpperCase()];\r\n if (!flag) return callback(Error(\"Feature '\" + name + \"' is unknown.\"));\r\n assemblyscript.enableFeature(compilerOptions, flag);\r\n }\r\n }\r\n\r\n var module;\r\n stats.compileCount++;\r\n (() => {\r\n try {\r\n stats.compileTime += measure(() => {\r\n module = assemblyscript.compileProgram(program, compilerOptions);\r\n });\r\n } catch (e) {\r\n return callback(e);\r\n }\r\n })();\r\n if (checkDiagnostics(parser, stderr)) {\r\n if (module) module.dispose();\r\n return callback(Error(\"Compile error\"));\r\n }\r\n\r\n // Validate the module if requested\r\n if (args.validate) {\r\n stats.validateCount++;\r\n stats.validateTime += measure(() => {\r\n if (!module.validate()) {\r\n module.dispose();\r\n return callback(Error(\"Validate error\"));\r\n }\r\n });\r\n }\r\n\r\n // Set Binaryen-specific options\r\n if (args.trapMode === \"clamp\") {\r\n stats.optimizeCount++;\r\n stats.optimizeTime += measure(() => {\r\n module.runPasses([ \"trap-mode-clamp\" ]);\r\n });\r\n } else if (args.trapMode === \"js\") {\r\n stats.optimizeCount++;\r\n stats.optimizeTime += measure(() => {\r\n module.runPasses([ \"trap-mode-js\" ]);\r\n });\r\n } else if (args.trapMode !== \"allow\") {\r\n module.dispose();\r\n return callback(Error(\"Unsupported trap mode\"));\r\n }\r\n\r\n // Implicitly run costly non-LLVM optimizations on -O3 or -Oz\r\n // see: https://github.com/WebAssembly/binaryen/pull/1596\r\n if (optimizeLevel >= 3 || shrinkLevel >= 2) optimizeLevel = 4;\r\n\r\n module.setOptimizeLevel(optimizeLevel);\r\n module.setShrinkLevel(shrinkLevel);\r\n module.setDebugInfo(args.debug);\r\n\r\n var runPasses = [];\r\n if (args.runPasses) {\r\n if (typeof args.runPasses === \"string\") {\r\n args.runPasses = args.runPasses.split(\",\");\r\n }\r\n if (args.runPasses.length) {\r\n args.runPasses.forEach(pass => {\r\n if (runPasses.indexOf(pass) < 0)\r\n runPasses.push(pass);\r\n });\r\n }\r\n }\r\n\r\n // Optimize the module if requested\r\n if (optimizeLevel > 0 || shrinkLevel > 0) {\r\n stats.optimizeCount++;\r\n stats.optimizeTime += measure(() => {\r\n module.optimize();\r\n });\r\n }\r\n\r\n // Run additional passes if requested\r\n if (runPasses.length) {\r\n stats.optimizeCount++;\r\n stats.optimizeTime += measure(() => {\r\n module.runPasses(runPasses.map(pass => pass.trim()));\r\n });\r\n }\r\n\r\n // Prepare output\r\n if (!args.noEmit) {\r\n let hasStdout = false;\r\n let hasOutput = false;\r\n\r\n if (args.outFile != null) {\r\n if (/\\.was?t$/.test(args.outFile) && args.textFile == null) {\r\n args.textFile = args.outFile;\r\n } else if (/\\.js$/.test(args.outFile) && args.asmjsFile == null) {\r\n args.asmjsFile = args.outFile;\r\n } else if (args.binaryFile == null) {\r\n args.binaryFile = args.outFile;\r\n }\r\n }\r\n\r\n // Write binary\r\n if (args.binaryFile != null) {\r\n let sourceMapURL = args.sourceMap != null\r\n ? args.sourceMap.length\r\n ? args.sourceMap\r\n : path.basename(args.binaryFile) + \".map\"\r\n : null;\r\n\r\n let wasm;\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n wasm = module.toBinary(sourceMapURL)\r\n });\r\n\r\n if (args.binaryFile.length) {\r\n writeFile(args.binaryFile, wasm.output, baseDir);\r\n } else {\r\n writeStdout(wasm.output);\r\n hasStdout = true;\r\n }\r\n hasOutput = true;\r\n\r\n // Post-process source map\r\n if (wasm.sourceMap != null) {\r\n if (args.binaryFile.length) {\r\n let sourceMap = JSON.parse(wasm.sourceMap);\r\n sourceMap.sourceRoot = exports.sourceMapRoot;\r\n sourceMap.sources.forEach((name, index) => {\r\n let text = null;\r\n if (name.startsWith(exports.libraryPrefix)) {\r\n let stdName = name.substring(exports.libraryPrefix.length).replace(/\\.ts$/, \"\");\r\n if (exports.libraryFiles.hasOwnProperty(stdName)) {\r\n text = exports.libraryFiles[stdName];\r\n } else {\r\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\r\n text = readFile(name.substring(exports.libraryPrefix.length), customLibDirs[i]);\r\n if (text !== null) break;\r\n }\r\n }\r\n } else {\r\n text = readFile(name, baseDir);\r\n }\r\n if (text === null) {\r\n return callback(Error(\"Source file '\" + name + \"' not found.\"));\r\n }\r\n if (!sourceMap.sourceContents) sourceMap.sourceContents = [];\r\n sourceMap.sourceContents[index] = text;\r\n });\r\n writeFile(path.join(\r\n path.dirname(args.binaryFile),\r\n path.basename(sourceMapURL)\r\n ).replace(/^\\.\\//, \"\"), JSON.stringify(sourceMap), baseDir);\r\n } else {\r\n stderr.write(\"Skipped source map (stdout already occupied)\" + EOL);\r\n }\r\n }\r\n }\r\n\r\n // Write asm.js\r\n if (args.asmjsFile != null) {\r\n let asm;\r\n if (args.asmjsFile.length) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n asm = module.toAsmjs();\r\n });\r\n writeFile(args.asmjsFile, asm, baseDir);\r\n } else if (!hasStdout) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n asm = module.toAsmjs();\r\n });\r\n writeStdout(asm);\r\n hasStdout = true;\r\n }\r\n hasOutput = true;\r\n }\r\n\r\n // Write WebIDL\r\n if (args.idlFile != null) {\r\n let idl;\r\n if (args.idlFile.length) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n idl = assemblyscript.buildIDL(program);\r\n });\r\n writeFile(args.idlFile, idl, baseDir);\r\n } else if (!hasStdout) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n idl = assemblyscript.buildIDL(program);\r\n });\r\n writeStdout(idl);\r\n hasStdout = true;\r\n }\r\n hasOutput = true;\r\n }\r\n\r\n // Write TypeScript definition\r\n if (args.tsdFile != null) {\r\n let tsd;\r\n if (args.tsdFile.length) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n tsd = assemblyscript.buildTSD(program);\r\n });\r\n writeFile(args.tsdFile, tsd, baseDir);\r\n } else if (!hasStdout) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n tsd = assemblyscript.buildTSD(program);\r\n });\r\n writeStdout(tsd);\r\n hasStdout = true;\r\n }\r\n hasOutput = true;\r\n }\r\n\r\n // Write text (must be last)\r\n if (args.textFile != null || !hasOutput) {\r\n let wat;\r\n if (args.textFile && args.textFile.length) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n wat = module.toText();\r\n });\r\n writeFile(args.textFile, wat, baseDir);\r\n } else if (!hasStdout) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n wat = module.toText()\r\n });\r\n writeStdout(wat);\r\n }\r\n }\r\n }\r\n\r\n module.dispose();\r\n if (args.measure) {\r\n printStats(stats, stderr);\r\n }\r\n return callback(null);\r\n\r\n function readFileNode(filename, baseDir) {\r\n try {\r\n let text;\r\n stats.readCount++;\r\n stats.readTime += measure(() => {\r\n text = fs.readFileSync(path.join(baseDir, filename), { encoding: \"utf8\" });\r\n });\r\n return text;\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n function writeFileNode(filename, contents, baseDir) {\r\n try {\r\n stats.writeCount++;\r\n stats.writeTime += measure(() => {\r\n mkdirp(path.join(baseDir, path.dirname(filename)));\r\n if (typeof contents === \"string\") {\r\n fs.writeFileSync(path.join(baseDir, filename), contents, { encoding: \"utf8\" } );\r\n } else {\r\n fs.writeFileSync(path.join(baseDir, filename), contents);\r\n }\r\n });\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n function listFilesNode(dirname, baseDir) {\r\n var files;\r\n try {\r\n stats.readTime += measure(() => {\r\n files = fs.readdirSync(path.join(baseDir, dirname)).filter(file => /^(?!.*\\.d\\.ts$).*\\.ts$/.test(file));\r\n });\r\n return files;\r\n } catch (e) {\r\n return [];\r\n }\r\n }\r\n\r\n function writeStdout(contents) {\r\n if (!writeStdout.used) {\r\n stats.writeCount++;\r\n writeStdout.used = true;\r\n }\r\n stats.writeTime += measure(() => {\r\n if (typeof contents === \"string\") {\r\n stdout.write(contents, { encoding: \"utf8\" });\r\n } else {\r\n stdout.write(contents);\r\n }\r\n });\r\n }\r\n}\r\n\r\nvar argumentSubstitutions = {\r\n \"-O\" : [ \"--optimize\" ],\r\n \"-Os\" : [ \"--optimize\", \"--shrinkLevel\", \"1\" ],\r\n \"-Oz\" : [ \"--optimize\", \"--shrinkLevel\", \"2\" ],\r\n \"-O0\" : [ \"--optimizeLevel\", \"0\", \"--shrinkLevel\", \"0\" ],\r\n \"-O0s\": [ \"--optimizeLevel\", \"0\", \"--shrinkLevel\", \"1\" ],\r\n \"-O0z\": [ \"--optimizeLevel\", \"0\", \"--shrinkLevel\", \"2\" ],\r\n \"-O1\" : [ \"--optimizeLevel\", \"1\", \"--shrinkLevel\", \"0\" ],\r\n \"-O1s\": [ \"--optimizeLevel\", \"1\", \"--shrinkLevel\", \"1\" ],\r\n \"-O1z\": [ \"--optimizeLevel\", \"1\", \"--shrinkLevel\", \"2\" ],\r\n \"-O2\" : [ \"--optimizeLevel\", \"2\", \"--shrinkLevel\", \"0\" ],\r\n \"-O2s\": [ \"--optimizeLevel\", \"2\", \"--shrinkLevel\", \"1\" ],\r\n \"-O2z\": [ \"--optimizeLevel\", \"2\", \"--shrinkLevel\", \"2\" ],\r\n \"-O3\" : [ \"--optimizeLevel\", \"3\", \"--shrinkLevel\", \"0\" ],\r\n \"-O3s\": [ \"--optimizeLevel\", \"3\", \"--shrinkLevel\", \"1\" ],\r\n \"-O3z\": [ \"--optimizeLevel\", \"3\", \"--shrinkLevel\", \"2\" ],\r\n};\r\n\r\n/** Checks diagnostics emitted so far for errors. */\r\nfunction checkDiagnostics(emitter, stderr) {\r\n var diagnostic;\r\n var hasErrors = false;\r\n while ((diagnostic = assemblyscript.nextDiagnostic(emitter)) != null) {\r\n if (stderr) {\r\n stderr.write(\r\n assemblyscript.formatDiagnostic(diagnostic, stderr.isTTY, true) +\r\n EOL + EOL\r\n );\r\n }\r\n if (assemblyscript.isError(diagnostic)) hasErrors = true;\r\n }\r\n return hasErrors;\r\n}\r\n\r\nexports.checkDiagnostics = checkDiagnostics;\r\n\r\n/** Creates an empty set of stats. */\r\nfunction createStats() {\r\n return {\r\n readTime: 0,\r\n readCount: 0,\r\n writeTime: 0,\r\n writeCount: 0,\r\n parseTime: 0,\r\n parseCount: 0,\r\n compileTime: 0,\r\n compileCount: 0,\r\n emitTime: 0,\r\n emitCount: 0,\r\n validateTime: 0,\r\n validateCount: 0,\r\n optimizeTime: 0,\r\n optimizeCount: 0\r\n };\r\n}\r\n\r\nexports.createStats = createStats;\r\n\r\nif (!process.hrtime) process.hrtime = require(\"browser-process-hrtime\");\r\n\r\n/** Measures the execution time of the specified function. */\r\nfunction measure(fn) {\r\n const start = process.hrtime();\r\n fn();\r\n const times = process.hrtime(start);\r\n return times[0] * 1e9 + times[1];\r\n}\r\n\r\nexports.measure = measure;\r\n\r\n/** Formats a high resolution time to a human readable string. */\r\nfunction formatTime(time) {\r\n return time ? (time / 1e6).toFixed(3) + \" ms\" : \"N/A\";\r\n}\r\n\r\nexports.formatTime = formatTime;\r\n\r\n/** Formats and prints out the contents of a set of stats. */\r\nfunction printStats(stats, output) {\r\n function format(time, count) {\r\n return formatTime(time);\r\n }\r\n (output || process.stdout).write([\r\n \"I/O Read : \" + format(stats.readTime, stats.readCount),\r\n \"I/O Write : \" + format(stats.writeTime, stats.writeCount),\r\n \"Parse : \" + format(stats.parseTime, stats.parseCount),\r\n \"Compile : \" + format(stats.compileTime, stats.compileCount),\r\n \"Emit : \" + format(stats.emitTime, stats.emitCount),\r\n \"Validate : \" + format(stats.validateTime, stats.validateCount),\r\n \"Optimize : \" + format(stats.optimizeTime, stats.optimizeCount)\r\n ].join(EOL) + EOL);\r\n}\r\n\r\nexports.printStats = printStats;\r\n\r\nvar allocBuffer = typeof global !== \"undefined\" && global.Buffer\r\n ? global.Buffer.allocUnsafe || function(len) { return new global.Buffer(len); }\r\n : function(len) { return new Uint8Array(len) };\r\n\r\n/** Creates a memory stream that can be used in place of stdout/stderr. */\r\nfunction createMemoryStream(fn) {\r\n var stream = [];\r\n stream.write = function(chunk) {\r\n if (fn) fn(chunk);\r\n if (typeof chunk === \"string\") {\r\n let buffer = allocBuffer(utf8.length(chunk));\r\n utf8.write(chunk, buffer, 0);\r\n chunk = buffer;\r\n }\r\n this.push(chunk);\r\n };\r\n stream.reset = function() {\r\n stream.length = 0;\r\n };\r\n stream.toBuffer = function() {\r\n var offset = 0, i = 0, k = this.length;\r\n while (i < k) offset += this[i++].length;\r\n var buffer = allocBuffer(offset);\r\n offset = i = 0;\r\n while (i < k) {\r\n buffer.set(this[i], offset);\r\n offset += this[i].length;\r\n ++i;\r\n }\r\n return buffer;\r\n };\r\n stream.toString = function() {\r\n var buffer = this.toBuffer();\r\n return utf8.read(buffer, 0, buffer.length);\r\n };\r\n return stream;\r\n}\r\n\r\nexports.createMemoryStream = createMemoryStream;\r\n\r\n/** Compatible TypeScript compiler options for syntax highlighting etc. */\r\nexports.tscOptions = {\r\n alwaysStrict: true,\r\n noImplicitAny: true,\r\n noImplicitReturns: true,\r\n noImplicitThis: true,\r\n noEmitOnError: true,\r\n strictNullChecks: true,\r\n experimentalDecorators: true,\r\n target: \"esnext\",\r\n module: \"commonjs\",\r\n noLib: true,\r\n types: [],\r\n allowJs: false\r\n};\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n var len = 0,\r\n c = 0;\r\n for (var i = 0; i < string.length; ++i) {\r\n c = string.charCodeAt(i);\r\n if (c < 128)\r\n len += 1;\r\n else if (c < 2048)\r\n len += 2;\r\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n ++i;\r\n len += 4;\r\n } else\r\n len += 3;\r\n }\r\n return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null,\r\n chunk = [],\r\n i = 0, // char offset\r\n t; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128)\r\n chunk[i++] = t;\r\n else if (t > 191 && t < 224)\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n } else\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n var start = offset,\r\n c1, // character 1\r\n c2; // character 2\r\n for (var i = 0; i < string.length; ++i) {\r\n c1 = string.charCodeAt(i);\r\n if (c1 < 128) {\r\n buffer[offset++] = c1;\r\n } else if (c1 < 2048) {\r\n buffer[offset++] = c1 >> 6 | 192;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n ++i;\r\n buffer[offset++] = c1 >> 18 | 240;\r\n buffer[offset++] = c1 >> 12 & 63 | 128;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else {\r\n buffer[offset++] = c1 >> 12 | 224;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n }\r\n }\r\n return offset - start;\r\n};\r\n","var proc = typeof process !== \"undefined\" && process || {};\r\nvar isCI = proc.env && \"CI\" in proc.env; // doesn't work when bundled because 'process' is a mock\r\n\r\nfunction from(stream, base) {\r\n var colors = base || {};\r\n colors.supported = (stream && !!stream.isTTY) || isCI;\r\n colors.gray = text => colors.supported ? exports.GRAY + text + exports.RESET : text;\r\n colors.red = text => colors.supported ? exports.RED + text + exports.RESET : text;\r\n colors.green = text => colors.supported ? exports.GREEN + text + exports.RESET : text;\r\n colors.yellow = text => colors.supported ? exports.YELLOW + text + exports.RESET : text;\r\n colors.blue = text => colors.supported ? exports.BLUE + text + exports.RESET : text;\r\n colors.magenta = text => colors.supported ? exports.MAGENTA + text + exports.RESET : text;\r\n colors.cyan = text => colors.supported ? exports.CYAN + text + exports.RESET : text;\r\n colors.white = text => colors.supported ? exports.WHITE + text + exports.RESET : text;\r\n return colors;\r\n}\r\n\r\nexports.stdout = from(proc.stdout, exports);\r\nexports.stderr = from(proc.stderr);\r\nexports.from = from;\r\n\r\nexports.GRAY = \"\\u001b[90m\";\r\nexports.RED = \"\\u001b[91m\";\r\nexports.GREEN = \"\\u001b[92m\";\r\nexports.YELLOW = \"\\u001b[93m\";\r\nexports.BLUE = \"\\u001b[94m\";\r\nexports.MAGENTA = \"\\u001b[95m\";\r\nexports.CYAN = \"\\u001b[96m\";\r\nexports.WHITE = \"\\u001b[97m\";\r\nexports.RESET = \"\\u001b[0m\";\r\n","// type | meaning\r\n// -----|---------------\r\n// b | boolean\r\n// i | integer\r\n// f | float\r\n// s | string\r\n// I | integer array\r\n// F | float array\r\n// S | string array\r\n\r\n/** Parses the specified command line arguments according to the given configuration. */\r\nfunction parse(argv, config) {\r\n var options = {};\r\n var unknown = [];\r\n var arguments = [];\r\n var trailing = [];\r\n\r\n // make an alias map and initialize defaults\r\n var aliases = {};\r\n Object.keys(config).forEach(key => {\r\n var option = config[key];\r\n if (option.alias != null) {\r\n if (typeof option.alias === \"string\") aliases[option.alias] = key;\r\n else if (Array.isArray(option.alias)) option.alias.forEach(alias => aliases[alias] = key);\r\n }\r\n if (option.default != null) options[key] = option.default;\r\n });\r\n\r\n // iterate over argv\r\n for (var i = 0, k = (argv = argv.slice()).length; i < k; ++i) {\r\n let arg = argv[i];\r\n if (arg == \"--\") { ++i; break; }\r\n let match = /^(?:(\\-\\w)(?:=(.*))?|(\\-\\-\\w{2,})(?:=(.*))?)$/.exec(arg), option, key;\r\n if (match) {\r\n if (config[arg]) option = config[key = arg]; // exact\r\n else if (match[1] != null) { // alias\r\n option = config[key = aliases[match[1].substring(1)]];\r\n if (option && match[2] != null) argv[i--] = match[2];\r\n } else if (match[3] != null) { // full\r\n option = config[key = match[3].substring(2)];\r\n if (option && match[4] != null) argv[i--] = match[4];\r\n }\r\n } else {\r\n if (arg.charCodeAt(0) == 45) option = config[key = arg]; // exact\r\n else { arguments.push(arg); continue; } // argument\r\n }\r\n if (option) {\r\n if (option.type == null || option.type === \"b\") options[key] = true; // flag\r\n else {\r\n if (i + 1 < argv.length && argv[i + 1].charCodeAt(0) != 45) { // present\r\n switch (option.type) {\r\n case \"i\": options[key] = parseInt(argv[++i], 10); break;\r\n case \"I\": options[key] = (options[key] || []).concat(parseInt(argv[++i], 10)); break;\r\n case \"f\": options[key] = parseFloat(argv[++i]); break;\r\n case \"F\": options[key] = (options[key] || []).concat(parseFloat(argv[++i])); break;\r\n case \"s\": options[key] = String(argv[++i]); break;\r\n case \"S\": options[key] = (options[key] || []).concat(argv[++i].split(\",\")); break;\r\n default: unknown.push(arg); --i;\r\n }\r\n } else { // omitted\r\n switch (option.type) {\r\n case \"i\":\r\n case \"f\": options[key] = option.default || 0; break;\r\n case \"s\": options[key] = option.default || \"\"; break;\r\n case \"I\":\r\n case \"F\":\r\n case \"S\": options[key] = options.default || []; break;\r\n default: unknown.push(arg);\r\n }\r\n }\r\n }\r\n if (option.value) Object.keys(option.value).forEach(k => options[k] = option.value[k]);\r\n } else unknown.push(arg);\r\n }\r\n while (i < k) trailing.push(argv[i++]); // trailing\r\n\r\n return { options, unknown, arguments, trailing };\r\n}\r\n\r\nexports.parse = parse;\r\n\r\n/** Generates the help text for the specified configuration. */\r\nfunction help(config, options) {\r\n if (!options) options = {};\r\n var indent = options.indent || 2;\r\n var padding = options.padding || 24;\r\n var eol = options.eol || \"\\n\";\r\n var sb = [];\r\n Object.keys(config).forEach(key => {\r\n var option = config[key];\r\n if (option.description == null) return;\r\n var text = \"\";\r\n while (text.length < indent) text += \" \";\r\n text += \"--\" + key;\r\n if (option.alias) text += \", -\" + option.alias;\r\n while (text.length < padding) text += \" \";\r\n if (Array.isArray(option.description)) {\r\n sb.push(text + option.description[0] + option.description.slice(1).map(line => {\r\n for (let i = 0; i < padding; ++i) line = \" \" + line;\r\n return eol + line;\r\n }).join(\"\"));\r\n } else sb.push(text + option.description);\r\n });\r\n return sb.join(eol);\r\n}\r\n\r\nexports.help = help;\r\n","/*\r\nCopyright 2010 James Halliday (mail@substack.net)\r\n\r\nThis project is free software released under the MIT/X11 license:\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nvar path = require(\"path\");\r\nvar fs = require(\"fs\");\r\nvar _0777 = parseInt(\"0777\", 8);\r\n\r\nmodule.exports = function mkdirp(p, opts, made) {\r\n if (!opts || typeof opts !== \"object\") {\r\n opts = { mode: opts };\r\n }\r\n var mode = opts.mode;\r\n if (mode === undefined) {\r\n mode = _0777 & (~process.umask());\r\n }\r\n if (!made) made = null;\r\n p = path.resolve(p);\r\n try {\r\n fs.mkdirSync(p, mode);\r\n made = made || p;\r\n } catch (err0) {\r\n switch (err0.code) {\r\n case \"ENOENT\":\r\n made = mkdirp(path.dirname(p), opts, made);\r\n mkdirp(p, opts, made);\r\n break;\r\n default:\r\n var stat;\r\n try {\r\n stat = fs.statSync(p);\r\n } catch (err1) {\r\n throw err0;\r\n }\r\n if (!stat.isDirectory()) throw err0;\r\n break;\r\n }\r\n }\r\n return made;\r\n};\r\n","if(typeof __WEBPACK_EXTERNAL_MODULE__10__ === 'undefined') {var e = new Error(\"Cannot find module 'assemblyscript'\"); e.code = 'MODULE_NOT_FOUND'; throw e;}\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__10__;","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 12;","module.exports = process.hrtime || hrtime\n\n// polyfil for window.performance.now\nvar performance = global.performance || {}\nvar performanceNow =\n performance.now ||\n performance.mozNow ||\n performance.msNow ||\n performance.oNow ||\n performance.webkitNow ||\n function(){ return (new Date()).getTime() }\n\n// generate timestamp or delta\n// see http://nodejs.org/api/process.html#process_process_hrtime\nfunction hrtime(previousTimestamp){\n var clocktime = performanceNow.call(performance)*1e-3\n var seconds = Math.floor(clocktime)\n var nanoseconds = Math.floor((clocktime%1)*1e9)\n if (previousTimestamp) {\n seconds = seconds - previousTimestamp[0]\n nanoseconds = nanoseconds - previousTimestamp[1]\n if (nanoseconds<0) {\n seconds--\n nanoseconds += 1e9\n }\n }\n return [seconds,nanoseconds]\n}"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://asc/webpack/universalModuleDefinition","webpack://asc/webpack/bootstrap","webpack://asc/../node_modules/node-libs-browser/mock/process.js","webpack://asc/../node_modules/path-browserify/index.js","webpack://asc/../node_modules/webpack/buildin/global.js","webpack://asc/./asc.js","webpack://asc/../node_modules/@protobufjs/utf8/index.js","webpack://asc/./util/colors.js","webpack://asc/./util/options.js","webpack://asc/./util/mkdirp.js","webpack://asc/external \"assemblyscript\"","webpack://asc/. sync","webpack://asc/../node_modules/browser-process-hrtime/index.js"],"names":["root","factory","exports","module","require","e","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE__10__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","path","cwd","nextTick","fn","setTimeout","platform","arch","execPath","title","pid","browser","env","argv","binding","Error","chdir","dir","resolve","exit","kill","umask","dlopen","uptime","memoryUsage","uvCounters","features","process","normalizeArray","parts","allowAboveRoot","up","length","last","splice","unshift","splitPathRe","splitPath","filename","exec","slice","filter","xs","f","res","push","resolvedPath","resolvedAbsolute","arguments","TypeError","charAt","split","join","normalize","isAbsolute","trailingSlash","substr","paths","Array","index","relative","from","to","trim","arr","start","end","fromParts","toParts","Math","min","samePartsLength","outputParts","concat","sep","delimiter","dirname","result","basename","ext","extname","str","len","g","Function","window","global","fs","utf8","colorsUtil","optionsUtil","mkdirp","EOL","removeAllListeners","assemblyscript","isDev","code","register","project","e_ts","eval","stack","isBundle","version","options","sourceMapRoot","libraryPrefix","LIBRARY_PREFIX","defaultOptimizeLevel","defaultShrinkLevel","libraryFiles","allocator/arena","allocator/buddy","allocator/emscripten","allocator/system","allocator/tlsf","array","arraybuffer","bindings/Date","bindings/Math","builtins","collector/itcm","dataview","date","diagnostics","error","gc","internal/allocator","internal/arraybuffer","internal/hash","internal/memory","internal/number","internal/sort","internal/string","internal/typedarray","iterator","map","math","memory","number","polyfills","regexp","set","string","symbol","table","typedarray","libDir","libFiles","sync","bundled","forEach","file","replace","readFileSync","definitionFiles","assembly","portable","stdDir","compileString","sources","input.ts","output","stdout","createMemoryStream","stderr","keys","val","isArray","String","main","readFile","writeFile","contents","listFiles","callback","readFileNode","writeFileNode","listFilesNode","stats","createStats","opts","parse","args","noColors","supported","unknown","arg","write","yellow","trailing","err","red","help","out","color","white","cyan","baseDir","transforms","transform","parser","noLib","parseCount","parseTime","measure","parseFile","libPath","indexOf","customLibDirs","lib","apply","k","endsWith","j","libText","parseBacklog","sourcePath","sourceText","nextFile","startsWith","plainName","substring","indexName","checkDiagnostics","applyTransform","program","finishParsing","optimizeLevel","shrinkLevel","optimize","max","compilerOptions","createOptions","setTarget","setNoTreeShaking","noTreeShaking","setNoAssert","noAssert","setImportMemory","importMemory","setImportTable","importTable","setMemoryBase","memoryBase","setSourceMap","sourceMap","setOptimizeLevelHints","setGlobalAlias","use","aliases","part","alias","enable","flag","toUpperCase","enableFeature","compileCount","compileTime","compileProgram","dispose","validate","validateCount","validateTime","trapMode","optimizeCount","optimizeTime","runPasses","setOptimizeLevel","setShrinkLevel","setDebugInfo","debug","pass","noEmit","hasStdout","hasOutput","outFile","test","textFile","asmjsFile","binaryFile","wasm","sourceMapURL","emitCount","emitTime","toBinary","writeStdout","JSON","sourceRoot","text","stdName","sourceContents","stringify","asm","toAsmjs","idlFile","idl","buildIDL","tsdFile","tsd","buildTSD","wat","toText","printStats","readCount","readTime","encoding","writeCount","writeTime","writeFileSync","files","readdirSync","used","argumentSubstitutions","-O","-Os","-Oz","-O0","-O0s","-O0z","-O1","-O1s","-O1z","-O2","-O2s","-O2z","-O3","-O3s","-O3z","emitter","diagnostic","hasErrors","nextDiagnostic","formatDiagnostic","isTTY","isError","hrtime","times","formatTime","time","toFixed","format","count","allocBuffer","Buffer","allocUnsafe","Uint8Array","stream","chunk","buffer","reset","toBuffer","offset","toString","read","tscOptions","alwaysStrict","noImplicitAny","noImplicitReturns","noImplicitThis","noEmitOnError","strictNullChecks","experimentalDecorators","target","types","allowJs","charCodeAt","fromCharCode","c1","c2","proc","isCI","base","colors","gray","GRAY","RESET","RED","green","GREEN","YELLOW","blue","BLUE","magenta","MAGENTA","CYAN","WHITE","config","option","default","match","type","parseInt","parseFloat","indent","padding","eol","sb","description","line","_0777","made","undefined","mkdirSync","err0","stat","statSync","err1","isDirectory","webpackEmptyContext","req","id","previousTimestamp","clocktime","performanceNow","performance","seconds","floor","nanoseconds","now","mozNow","msNow","oNow","webkitNow","Date","getTime"],"mappings":"CAAA,SAAAA,EAAAC,GACA,iBAAAC,SAAA,iBAAAC,OACAA,OAAAD,QAAAD,EAAA,WAA0E,IAAM,OAAAG,QAAA,kBAAoC,MAAAC,KAApH,IACA,mBAAAC,eAAAC,IACAD,OAAA,mBAAAL,GACA,iBAAAC,QACAA,QAAA,IAAAD,EAAA,WAA0E,IAAM,OAAAG,QAAA,kBAAoC,MAAAC,KAApH,IAEAL,EAAA,IAAAC,EAAAD,EAAA,gBARA,CASC,oBAAAQ,UAAAC,KAAA,SAAAC,iCACD,mBCTA,IAAAC,EAAA,GAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAX,QAGA,IAAAC,EAAAQ,EAAAE,GAAA,CACAC,EAAAD,EACAE,GAAA,EACAb,QAAA,IAUA,OANAc,EAAAH,GAAAI,KAAAd,EAAAD,QAAAC,IAAAD,QAAAU,GAGAT,EAAAY,GAAA,EAGAZ,EAAAD,QA0DA,OArDAU,EAAAM,EAAAF,EAGAJ,EAAAO,EAAAR,EAGAC,EAAAQ,EAAA,SAAAlB,EAAAmB,EAAAC,GACAV,EAAAW,EAAArB,EAAAmB,IACAG,OAAAC,eAAAvB,EAAAmB,EAAA,CAA0CK,YAAA,EAAAC,IAAAL,KAK1CV,EAAAgB,EAAA,SAAA1B,GACA,oBAAA2B,eAAAC,aACAN,OAAAC,eAAAvB,EAAA2B,OAAAC,YAAA,CAAwDC,MAAA,WAExDP,OAAAC,eAAAvB,EAAA,cAAiD6B,OAAA,KAQjDnB,EAAAoB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAAnB,EAAAmB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,iBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAX,OAAAY,OAAA,MAGA,GAFAxB,EAAAgB,EAAAO,GACAX,OAAAC,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAAnB,EAAAQ,EAAAe,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAvB,EAAA2B,EAAA,SAAApC,GACA,IAAAmB,EAAAnB,KAAA+B,WACA,WAA2B,OAAA/B,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAS,EAAAQ,EAAAE,EAAA,IAAAA,GACAA,GAIAV,EAAAW,EAAA,SAAAiB,EAAAC,GAAsD,OAAAjB,OAAAkB,UAAAC,eAAA1B,KAAAuB,EAAAC,IAGtD7B,EAAAgC,EAAA,GAIAhC,IAAAiC,EAAA,qBCnEA,IAEAC,EADAC,EAhBA7C,EAAA8C,SAAA,SAAAC,GACAC,WAAAD,EAAA,IAGA/C,EAAAiD,SAAAjD,EAAAkD,KACAlD,EAAAmD,SAAAnD,EAAAoD,MAAA,UACApD,EAAAqD,IAAA,EACArD,EAAAsD,SAAA,EACAtD,EAAAuD,IAAA,GACAvD,EAAAwD,KAAA,GAEAxD,EAAAyD,QAAA,SAAAtC,GACA,UAAAuC,MAAA,8CAIAb,EAAA,IAEA7C,EAAA6C,IAAA,WAA+B,OAAAA,GAC/B7C,EAAA2D,MAAA,SAAAC,GACAhB,MAA0BlC,EAAQ,IAClCmC,EAAAD,EAAAiB,QAAAD,EAAAf,IAIA7C,EAAA8D,KAAA9D,EAAA+D,KACA/D,EAAAgE,MAAAhE,EAAAiE,OACAjE,EAAAkE,OAAAlE,EAAAmE,YACAnE,EAAAoE,WAAA,aACApE,EAAAqE,SAAA,qBC7BA,SAAAC,GAyBA,SAAAC,EAAAC,EAAAC,GAGA,IADA,IAAAC,EAAA,EACA9D,EAAA4D,EAAAG,OAAA,EAAgC/D,GAAA,EAAQA,IAAA,CACxC,IAAAgE,EAAAJ,EAAA5D,GACA,MAAAgE,EACAJ,EAAAK,OAAAjE,EAAA,GACK,OAAAgE,GACLJ,EAAAK,OAAAjE,EAAA,GACA8D,KACKA,IACLF,EAAAK,OAAAjE,EAAA,GACA8D,KAKA,GAAAD,EACA,KAAUC,IAAMA,EAChBF,EAAAM,QAAA,MAIA,OAAAN,EAKA,IAAAO,EACA,gEACAC,EAAA,SAAAC,GACA,OAAAF,EAAAG,KAAAD,GAAAE,MAAA,IAuJA,SAAAC,EAAAC,EAAAC,GACA,GAAAD,EAAAD,OAAA,OAAAC,EAAAD,OAAAE,GAEA,IADA,IAAAC,EAAA,GACA3E,EAAA,EAAmBA,EAAAyE,EAAAV,OAAe/D,IAClC0E,EAAAD,EAAAzE,KAAAyE,IAAAE,EAAAC,KAAAH,EAAAzE,IAEA,OAAA2E,EAxJAvF,EAAA6D,QAAA,WAIA,IAHA,IAAA4B,EAAA,GACAC,GAAA,EAEA9E,EAAA+E,UAAAhB,OAAA,EAAoC/D,IAAA,IAAA8E,EAA8B9E,IAAA,CAClE,IAAAgC,EAAAhC,GAAA,EAAA+E,UAAA/E,GAAA0D,EAAAzB,MAGA,oBAAAD,EACA,UAAAgD,UAAA,6CACKhD,IAIL6C,EAAA7C,EAAA,IAAA6C,EACAC,EAAA,MAAA9C,EAAAiD,OAAA,IAWA,OAAAH,EAAA,SAJAD,EAAAlB,EAAAa,EAAAK,EAAAK,MAAA,cAAApD,GACA,QAAAA,KACGgD,GAAAK,KAAA,OAEH,KAKA/F,EAAAgG,UAAA,SAAApD,GACA,IAAAqD,EAAAjG,EAAAiG,WAAArD,GACAsD,EAAA,MAAAC,EAAAvD,GAAA,GAcA,OAXAA,EAAA2B,EAAAa,EAAAxC,EAAAkD,MAAA,cAAApD,GACA,QAAAA,KACGuD,GAAAF,KAAA,OAEHE,IACArD,EAAA,KAEAA,GAAAsD,IACAtD,GAAA,MAGAqD,EAAA,QAAArD,GAIA5C,EAAAiG,WAAA,SAAArD,GACA,YAAAA,EAAAiD,OAAA,IAIA7F,EAAA+F,KAAA,WACA,IAAAK,EAAAC,MAAA7D,UAAA2C,MAAApE,KAAA4E,UAAA,GACA,OAAA3F,EAAAgG,UAAAZ,EAAAgB,EAAA,SAAA1D,EAAA4D,GACA,oBAAA5D,EACA,UAAAkD,UAAA,0CAEA,OAAAlD,IACGqD,KAAA,OAMH/F,EAAAuG,SAAA,SAAAC,EAAAC,GAIA,SAAAC,EAAAC,GAEA,IADA,IAAAC,EAAA,EACUA,EAAAD,EAAAhC,QACV,KAAAgC,EAAAC,GAD8BA,KAK9B,IADA,IAAAC,EAAAF,EAAAhC,OAAA,EACUkC,GAAA,GACV,KAAAF,EAAAE,GADoBA,KAIpB,OAAAD,EAAAC,EAAA,GACAF,EAAAxB,MAAAyB,EAAAC,EAAAD,EAAA,GAfAJ,EAAAxG,EAAA6D,QAAA2C,GAAAL,OAAA,GACAM,EAAAzG,EAAA6D,QAAA4C,GAAAN,OAAA,GAsBA,IALA,IAAAW,EAAAJ,EAAAF,EAAAV,MAAA,MACAiB,EAAAL,EAAAD,EAAAX,MAAA,MAEAnB,EAAAqC,KAAAC,IAAAH,EAAAnC,OAAAoC,EAAApC,QACAuC,EAAAvC,EACA/D,EAAA,EAAiBA,EAAA+D,EAAY/D,IAC7B,GAAAkG,EAAAlG,KAAAmG,EAAAnG,GAAA,CACAsG,EAAAtG,EACA,MAIA,IAAAuG,EAAA,GACA,IAAAvG,EAAAsG,EAA+BtG,EAAAkG,EAAAnC,OAAsB/D,IACrDuG,EAAA3B,KAAA,MAKA,OAFA2B,IAAAC,OAAAL,EAAA5B,MAAA+B,KAEAnB,KAAA,MAGA/F,EAAAqH,IAAA,IACArH,EAAAsH,UAAA,IAEAtH,EAAAuH,QAAA,SAAA3E,GACA,IAAA4E,EAAAxC,EAAApC,GACA9C,EAAA0H,EAAA,GACA5D,EAAA4D,EAAA,GAEA,OAAA1H,GAAA8D,GAKAA,IAEAA,IAAAuC,OAAA,EAAAvC,EAAAe,OAAA,IAGA7E,EAAA8D,GARA,KAYA5D,EAAAyH,SAAA,SAAA7E,EAAA8E,GACA,IAAApC,EAAAN,EAAApC,GAAA,GAKA,OAHA8E,GAAApC,EAAAa,QAAA,EAAAuB,EAAA/C,UAAA+C,IACApC,IAAAa,OAAA,EAAAb,EAAAX,OAAA+C,EAAA/C,SAEAW,GAIAtF,EAAA2H,QAAA,SAAA/E,GACA,OAAAoC,EAAApC,GAAA,IAaA,IAAAuD,EAAA,WAAAA,QAAA,GACA,SAAAyB,EAAAhB,EAAAiB,GAAkC,OAAAD,EAAAzB,OAAAS,EAAAiB,IAClC,SAAAD,EAAAhB,EAAAiB,GAEA,OADAjB,EAAA,IAAAA,EAAAgB,EAAAjD,OAAAiC,GACAgB,EAAAzB,OAAAS,EAAAiB,qCC7NA,IAAAC,EAGAA,EAAA,WACA,OAAAvH,KADA,GAIA,IAEAuH,KAAA,IAAAC,SAAA,iBACC,MAAA5H,GAED,iBAAA6H,SAAAF,EAAAE,QAOA/H,EAAAD,QAAA8H,iGCnBA,SAAAxD,QAAA2D,QAcA3D,QAAAhB,UAAAgB,QAAAzB,IAAA,WAA+C,YAE/C,MAAAqF,GAAWxH,oBAAQ,GACnBkC,KAAalC,oBAAQ,GACrByH,KAAazH,oBAAQ,GACrB0H,WAAmB1H,oBAAQ,GAC3B2H,YAAoB3H,oBAAQ,GAC5B4H,OAAe5H,oBAAQ,GACvB6H,IAAA,UAAAjE,QAAArB,SAAA,YAIAqB,QAAAkE,oBAAAlE,QAAAkE,mBAAA,qBAGA,IAAAC,eAAAC,OAAA,EACA,MACA,IACAD,eAAqB/H,oBAAQ,IAC1B,MAAAP,GACH,IACMO,qBAAQ,eAAAP,EAAA,IAAAuD,MAAA,sCAAAvD,EAAAwI,KAAA,mBAAAxI,EAAA,IAASyI,SAAA,CAAYC,QAAAjG,KAAAmD,KAAoB,IAAS,8BAC1DrF,qBAAQ,eAAAP,EAAA,IAAAuD,MAAA,6CAAAvD,EAAAwI,KAAA,mBAAAxI,EAAA,IACdsI,eAAuB/H,qBAAQ,eAAAP,EAAA,IAAAuD,MAAA,qCAAAvD,EAAAwI,KAAA,mBAAAxI,EAAA,IAC/BuI,OAAA,EACK,MAAAI,MACL,IACAL,eAAAM,KAAA,+BACO,MAAA5I,GAGP,MADAA,EAAA6I,MAAAF,KAAAE,MAAA,UAAA7I,EAAA6I,MACA7I,MAfA,GAsBAH,QAAAiJ,UAAmB,EAGnBjJ,QAAA0I,YAGA1I,QAAAkJ,QAAAlJ,QAAAiJ,SAAqC,QAAiBvI,qBAAQ,eAAAP,EAAA,IAAAuD,MAAA,8CAAAvD,EAAAwI,KAAA,mBAAAxI,EAAA,IAAiB+I,QAG/ElJ,QAAAmJ,QAAkBzI,oBAAQ,IAG1BV,QAAAoJ,cAAA,qBAGApJ,QAAAqJ,cAAAZ,eAAAa,eAGAtJ,QAAAuJ,qBAAA,EAGAvJ,QAAAwJ,mBAAA,EAGAxJ,QAAAyJ,aAAAzJ,QAAAiJ,SAA0C3H,OAAA,CAAAoI,kBAAA,otCAAAC,kBAAA,+ymBAAAC,uBAAA,0nBAAAC,mBAAA,khBAAAC,iBAAA,mujBAAAC,MAAA,mnnBAAAC,YAAA,8mCAAAC,gBAAA,iVAAAC,gBAAA,q5DAAAC,SAAA,67TAAAC,iBAAA,8hPAAAC,SAAA,s5NAAAC,KAAA,upBAAAC,YAAA,yNAAAhH,IAAA,+QAAAiH,MAAA,itBAAAC,GAAA,yVAAAC,qBAAA,6VAAAC,uBAAA,u7GAAAC,gBAAA,yrEAAAC,kBAAA,u3OAAAC,kBAAA,ovrBAAAC,gBAAA,66IAAAC,kBAAA,ytMAAAC,sBAAA,g8MAAAC,SAAA,ukCAAAC,IAAA,wqNAAAC,KAAA,2zgFAAAC,OAAA,81DAAAC,OAAA,ojMAAAC,UAAA,4jCAAAC,OAAA,2YAAAC,IAAA,miMAAAC,OAAA,ymmBAAAC,OAAA,+hFAAAC,MAAA,8aAAAC,WAAA,6xhBAAc,MACxD,MAAAC,EAAAlJ,KAAAmD,KAA2B,IAAS,uBACpCgG,EAAmBrL,qBAAQ,eAAAP,EAAA,IAAAuD,MAAA,mCAAAvD,EAAAwI,KAAA,mBAAAxI,EAAA,IAAM6L,KAAA,gBAAwBnJ,IAAAiJ,IACzDG,EAAA,GAEA,OADAF,EAAAG,QAAAC,GAAAF,EAAAE,EAAAC,QAAA,aAAAlE,GAAAmE,aAAAzJ,KAAAmD,KAAA+F,EAAAK,GAAA,SACAF,GALwD,GASxDjM,QAAAsM,gBAAAtM,QAAAiJ,SAA6C3H,OAAA,CAAAiL,SAAA,ymgDAAAC,SAAA,sv1BAAkB,MAC/D,MAAAC,EAAA7J,KAAAmD,KAA2B,IAAS,YACpC,OACAwG,SAAArE,GAAAmE,aAAAzJ,KAAAmD,KAAA0G,EAAA,iCACAD,SAAAtE,GAAAmE,aAAAzJ,KAAAmD,KAAA0G,EAAA,mCAJ+D,GAS/DzM,QAAA0M,cAAA,EAAAC,EAAAxD,KACA,iBAAAwD,MAAA,CAA8CC,WAAAD,IAC9C,MAAAE,EAAAvL,OAAAY,OAAA,CACA4K,OAAAC,qBACAC,OAAAD,uBAEA,IAAAvJ,EAAA,CACA,wBACA,qBAcA,OAZAlC,OAAA2L,KAAA9D,GAAA,IAA2B+C,QAAA/J,IAC3B,IAAA+K,EAAA/D,EAAAhH,GACAkE,MAAA8G,QAAAD,KAAAhB,QAAAgB,GAAA1J,EAAAgC,KAAA,KAAArD,EAAAiL,OAAAF,KACA1J,EAAAgC,KAAA,KAAArD,EAAAiL,OAAAF,MAEAlN,QAAAqN,KAAA7J,EAAA4D,OAAA9F,OAAA2L,KAAAN,IAAA,CACAG,OAAAD,EAAAC,OACAE,OAAAH,EAAAG,OACAM,SAAAnM,GAAAwL,EAAAlK,eAAAtB,GAAAwL,EAAAxL,GAAA,KACAoM,UAAA,CAAApM,EAAAqM,IAAAX,EAAA1L,GAAAqM,EACAC,UAAA,SAEAZ,IAIA7M,QAAAqN,KAAA,SAAA7J,EAAA2F,EAAAuE,GACA,mBAAAvE,GACAuE,EAAAvE,EACAA,EAAA,IACGA,IACHA,EAAA,IAGA,MAAA2D,EAAA3D,EAAA2D,QAAAxI,QAAAwI,OACAE,EAAA7D,EAAA6D,QAAA1I,QAAA0I,OACAM,EAAAnE,EAAAmE,UAAAK,EACAJ,EAAApE,EAAAoE,WAAAK,EACAH,EAAAtE,EAAAsE,WAAAI,EACAC,EAAA3E,EAAA2E,OAAAC,cAGA,IAAAjB,EAAA,MAAApJ,MAAA,sCACA,IAAAsJ,EAAA,MAAAtJ,MAAA,sCAEA,MAAAsK,EAAA3F,YAAA4F,MAAAzK,EAAAxD,QAAAmJ,SACA+E,EAAAF,EAAA7E,QAiCA,GAhCA3F,EAAAwK,EAAArI,UACAuI,EAAAC,SACA/F,WAAA0E,OAAAsB,UACAhG,WAAA4E,OAAAoB,WAAA,GAEAhG,WAAA0E,OAAA1E,WAAA5B,KAAAsG,GACA1E,WAAA4E,OAAA5E,WAAA5B,KAAAwG,IAIAgB,EAAAK,QAAA1J,QACAqJ,EAAAK,QAAAnC,QAAAoC,IACAtB,EAAAuB,MAAAnG,WAAA4E,OAAAwB,OAAA,6BAAAF,EAAA,IAAA/F,OAKAyF,EAAAS,SAAA9J,QACAqI,EAAAuB,MAAAnG,WAAA4E,OAAAwB,OAAA,6CAAAR,EAAAS,SAAA1I,KAAA,KAAAwC,KAIAmF,MAAA,SAAAgB,GACA,IAAA/F,EAAA,EAKA,OAJA+F,IACA1B,EAAAuB,MAAAnG,WAAA4E,OAAA2B,IAAA,WAAAD,EAAA1F,MAAAoD,QAAA,gBAAA7D,KACAI,EAAA,GAEAA,IAIAuF,EAAAhF,QAEA,OADA4D,EAAAyB,MAAA,WAAAvO,QAAAkJ,SAAAR,MAAA,WAAAH,KACAmF,EAAA,MAGA,GAAAQ,EAAAU,OAAApL,EAAAmB,OAAA,CACA,IAAAkK,EAAAX,EAAAU,KAAA9B,EAAAE,EACA8B,EAAAZ,EAAAU,KAAAxG,WAAA0E,OAAA1E,WAAA4E,OAcA,OAbA6B,EAAAN,MAAA,CACAO,EAAAC,MAAA,UACA,KAAAD,EAAAE,KAAA,oCACA,GACAF,EAAAC,MAAA,YACA,KAAAD,EAAAE,KAAA,mBACA,KAAAF,EAAAE,KAAA,8CACA,KAAAF,EAAAE,KAAA,iDACA,GACAF,EAAAC,MAAA,YACA3H,OACAiB,YAAAuG,KAAA5O,QAAAmJ,QAAA,GAAAZ,MACAxC,KAAAwC,UACAmF,EAAA,MAIA,IAAAxF,GAAAmE,aAAA,CACA,GAAAiB,IAAAK,EAAA,MAAAjK,MAAA,wCACA,GAAA6J,IAAAK,EAAA,MAAAlK,MAAA,yCACA,GAAA+J,IAAAI,EAAA,MAAAnK,MAAA,yCAIA,MAAAuL,EAAAf,EAAAe,QAAArM,KAAAiB,QAAAqK,EAAAe,SAAA,IAGAC,EAAA,GACAhB,EAAAiB,WACAjB,EAAAiB,UAAAjD,QAAAiD,GACAD,EAAA1J,KACQ9E,oBAAA,GAAAA,CACEkC,KAAAqD,WAAAkJ,IAAAzI,QACVyI,EACAvM,KAAAmD,KAAAzB,QAAAzB,MAAAsM,MAYA,IAAAC,EAAA,KAGAlB,EAAAmB,OAcAvB,EAAAwB,aACAxB,EAAAyB,WAAAC,QAAA,KACAJ,EAAA3G,eAAAgH,UACAzP,QAAAyJ,aAAA,SACAzJ,QAAAqJ,cAAA,eACA,EACA+F,MAnBA9N,OAAA2L,KAAAjN,QAAAyJ,cAAAyC,QAAAwD,IACAA,EAAAC,QAAA,UACA7B,EAAAwB,aACAxB,EAAAyB,WAAAC,QAAA,KACAJ,EAAA3G,eAAAgH,UACAzP,QAAAyJ,aAAAiG,GACA1P,QAAAqJ,cAAAqG,EAAA,OACA,EACAN,QAeA,MAAAQ,EAAA,GACA,GAAA1B,EAAA2B,IAAA,CACA,IAAAA,EAAA3B,EAAA2B,IACA,iBAAAA,QAAA/J,MAAA,MACAO,MAAA7D,UAAAgD,KAAAsK,MAAAF,EAAAC,EAAA1E,IAAA0E,KAAAnJ,SACA,QAAA9F,EAAA,EAAAmP,EAAAH,EAAAjL,OAA6C/D,EAAAmP,IAAOnP,EAAA,CACpD,IACAmL,EADAD,EAAA8D,EAAAhP,GAEAkL,EAAAkE,SAAA,QACAjE,EAAA,CAAAnJ,KAAA6E,SAAAqE,IACAA,EAAAlJ,KAAA2E,QAAAuE,IAEAC,EAAA0B,EAAA3B,GAEA,QAAAmE,EAAA,EAAApP,EAAAkL,EAAApH,OAA0CsL,EAAApP,IAAOoP,EAAA,CACjD,IAAAP,EAAA3D,EAAAkE,GACAC,EAAA5C,EAAAoC,EAAA5D,GACA,UAAAoE,EAAA,OAAAxC,EAAAhK,MAAA,iBAAAgM,EAAA,iBACA5B,EAAAwB,aACAxB,EAAAyB,WAAAC,QAAA,KACAJ,EAAA3G,eAAAgH,UACAS,EACAlQ,QAAAqJ,cAAAqG,GACA,EACAN,OAQA,SAAAe,IAEA,IADA,IAAAC,EAAAC,EACA,OAAAD,EAAAhB,EAAAkB,aAAA,CAGA,GAAAF,EAAAG,WAAAvQ,QAAAqJ,eAAA,CACA,MAAAmH,EAAAJ,EAAAK,UAAAzQ,QAAAqJ,cAAA1E,QACA+L,EAAAN,EAAAK,UAAAzQ,QAAAqJ,cAAA1E,QAAA,SACA,GAAA3E,QAAAyJ,aAAAhH,eAAA+N,GACAH,EAAArQ,QAAAyJ,aAAA+G,GACAJ,EAAApQ,QAAAqJ,cAAAmH,EAAA,WACS,GAAAxQ,QAAAyJ,aAAAhH,eAAAiO,GACTL,EAAArQ,QAAAyJ,aAAAiH,GACAN,EAAApQ,QAAAqJ,cAAAqH,EAAA,WAEA,QAAA9P,EAAA,EAAAmP,EAAAH,EAAAjL,OAAmD/D,EAAAmP,IAAOnP,EAAA,CAE1D,WADAyP,EAAA/C,EAAAkD,EAAA,MAAAZ,EAAAhP,KACA,CACAwP,EAAApQ,QAAAqJ,cAAAmH,EAAA,MACA,MAGA,WADAH,EAAA/C,EAAAoD,EAAA,MAAAd,EAAAhP,KACA,CACAwP,EAAApQ,QAAAqJ,cAAAqH,EAAA,MACA,YAOO,CACP,MAAAF,EAAAJ,EACAM,EAAAN,EAAA,SAEA,WADAC,EAAA/C,EAAAkD,EAAA,MAAAvB,IAEAmB,EAAAI,EAAA,WAGA,WADAH,EAAA/C,EAAAoD,EAAA,MAAAzB,IAEAmB,EAAAM,EAAA,WACW,IAAAF,EAAAD,WAAA,KACX,GAAAvQ,QAAAyJ,aAAAhH,eAAA+N,GACAH,EAAArQ,QAAAyJ,aAAA+G,GACAJ,EAAApQ,QAAAqJ,cAAAmH,EAAA,WACa,GAAAxQ,QAAAyJ,aAAAhH,eAAAiO,GACbL,EAAArQ,QAAAyJ,aAAAiH,GACAN,EAAApQ,QAAAqJ,cAAAqH,EAAA,WAEA,QAAA9P,EAAA,EAAAmP,EAAAH,EAAAjL,OAAuD/D,EAAAmP,IAAOnP,EAAA,CAC9DgP,EAAAhP,GAEA,WADAyP,EAAA/C,EAAAkD,EAAA,MAAAZ,EAAAhP,KACA,CACAwP,EAAApQ,QAAAqJ,cAAAmH,EAAA,MACA,MAGA,WADAH,EAAA/C,EAAAoD,EAAA,MAAAd,EAAAhP,KACA,CACAwP,EAAApQ,QAAAqJ,cAAAqH,EAAA,MACA,QAQA,SAAAL,EACA,OAAA3C,EAAAhK,MAAA,gBAAA0M,EAAA,oBAEAtC,EAAAwB,aACAxB,EAAAyB,WAAAC,QAAA,KACA/G,eAAAgH,UAAAY,EAAAD,GAAA,EAAAhB,KAGA,GAAAuB,iBAAAvB,EAAApC,GACA,OAAAU,EAAAhK,MAAA,gBAKA,QAAA9C,EAAA,EAAAmP,EAAAvM,EAAAmB,OAAkC/D,EAAAmP,IAAOnP,EAAA,CACzC,MAAAqE,EAAAzB,EAAA5C,GAEA,IAAAwP,EAAAhD,OAAAnI,GAAAmH,QAAA,WAAAA,QAAA,iBAGAiE,EAAA/C,EAAA8C,EAAA,MAAAnB,GACA,UAAAoB,EAAA,CAEA,WADAA,EAAA/C,EAAA8C,EAAA,YAAAnB,IAEA,OAAAvB,EAAAhK,MAAA,eAAA0M,EAAA,oBAEAA,GAAA,iBAGAA,GAAA,MAGAtC,EAAAwB,aACAxB,EAAAyB,WAAAC,QAAA,KACAJ,EAAA3G,eAAAgH,UAAAY,EAAAD,GAAA,EAAAhB,KAEA,IAAAzG,EAAAwH,IACA,GAAAxH,EAAA,OAAAA,GA1KA,SAAAxH,KAAA+M,GACAgB,EAAAhD,QAAAiD,IACA,mBAAAA,EAAAhO,IAAAgO,EAAAhO,MAAA+M,KA2KA0C,CAAA,aAAAxB,GACA,CACA,IAAAzG,EAAAwH,IACA,GAAAxH,EAAA,OAAAA,EAIA,MAAAkI,EAAApI,eAAAqI,cAAA1B,GAGA,IAAA2B,EAAA,EACAC,EAAA,EACA9C,EAAA+C,WACAF,EAAA/Q,QAAAuJ,qBACAyH,EAAAhR,QAAAwJ,oBAEA,iBAAA0E,EAAA6C,gBACAA,EAAA7C,EAAA6C,eAEA,iBAAA7C,EAAA8C,cACAA,EAAA9C,EAAA8C,aAEAD,EAAA/J,KAAAC,IAAAD,KAAAkK,IAAAH,EAAA,MACAC,EAAAhK,KAAAC,IAAAD,KAAAkK,IAAAF,EAAA,MAGA,MAAAG,EAAA1I,eAAA2I,gBAmBA,GAlBA3I,eAAA4I,UAAAF,EAAA,GACA1I,eAAA6I,iBAAAH,EAAAjD,EAAAqD,eACA9I,eAAA+I,YAAAL,EAAAjD,EAAAuD,UACAhJ,eAAAiJ,gBAAAP,EAAAjD,EAAAyD,cACAlJ,eAAAmJ,eAAAT,EAAAjD,EAAA2D,aACApJ,eAAAqJ,cAAAX,EAAAjD,EAAA6D,aAAA,GACAtJ,eAAAuJ,aAAAb,EAAA,MAAAjD,EAAA+D,WACAxJ,eAAAyJ,sBAAAf,EAAAJ,EAAAC,GAEA9C,EAAAmB,QAEA5G,eAAA0J,eAAAhB,EAAA,qBACA1I,eAAA0J,eAAAhB,EAAA,uBACA1I,eAAA0J,eAAAhB,EAAA,0BACA1I,eAAA0J,eAAAhB,EAAA,2BAIAjD,EAAAkE,IAAA,CACA,IAAAC,EAAAnE,EAAAkE,IACA,QAAAxR,EAAA,EAAAmP,EAAAsC,EAAA1N,OAAuC/D,EAAAmP,IAAOnP,EAAA,CAC9C,IAAA0R,EAAAD,EAAAzR,GACA8B,EAAA4P,EAAA3C,QAAA,KACA,GAAAjN,EAAA,SAAAgL,EAAAhK,MAAA,iBAAA4O,EAAA,kBACA,IAAAnR,EAAAmR,EAAA7B,UAAA,EAAA/N,GAAAgE,OACA6L,EAAAD,EAAA7B,UAAA/N,EAAA,GAAAgE,OACA,IAAAvF,EAAAwD,OAAA,OAAA+I,EAAAhK,MAAA,iBAAA4O,EAAA,kBACA7J,eAAA0J,eAAAhB,EAAAhQ,EAAAoR,IAKA,IAWAtS,EAXAoE,EAAA6J,EAAAsE,OACA,SAAAnO,EAAA,CACA,iBAAAA,QAAAyB,MAAA,MACA,QAAAlF,EAAA,EAAAmP,EAAA1L,EAAAM,OAAwC/D,EAAAmP,IAAOnP,EAAA,CAC/C,IAAAO,EAAAkD,EAAAzD,GAAA8F,OACA+L,EAAAhK,eAAA,WAAAtH,EAAAiL,QAAA,WAAAsG,eACA,IAAAD,EAAA,OAAA/E,EAAAhK,MAAA,YAAAvC,EAAA,kBACAsH,eAAAkK,cAAAxB,EAAAsB,IAeA,GAVA3E,EAAA8E,eACA,MACA,IACA9E,EAAA+E,aAAArD,QAAA,KACAvP,EAAAwI,eAAAqK,eAAAjC,EAAAM,KAEK,MAAAhR,GACL,OAAAuN,EAAAvN,KANA,GASAwQ,iBAAAvB,EAAApC,GAEA,OADA/M,KAAA8S,UACArF,EAAAhK,MAAA,kBAeA,GAXAwK,EAAA8E,WACAlF,EAAAmF,gBACAnF,EAAAoF,cAAA1D,QAAA,KACA,IAAAvP,EAAA+S,WAEA,OADA/S,EAAA8S,UACArF,EAAAhK,MAAA,sBAMA,UAAAwK,EAAAiF,SACArF,EAAAsF,gBACAtF,EAAAuF,cAAA7D,QAAA,KACAvP,EAAAqT,UAAA,4BAEG,UAAApF,EAAAiF,SACHrF,EAAAsF,gBACAtF,EAAAuF,cAAA7D,QAAA,KACAvP,EAAAqT,UAAA,yBAEG,aAAApF,EAAAiF,SAEH,OADAlT,EAAA8S,UACArF,EAAAhK,MAAA,2BAKAqN,GAAA,GAAAC,GAAA,KAAAD,EAAA,GAEA9Q,EAAAsT,iBAAAxC,GACA9Q,EAAAuT,eAAAxC,GACA/Q,EAAAwT,aAAAvF,EAAAwF,OAEA,IAAAJ,EAAA,GA8BA,GA7BApF,EAAAoF,YACA,iBAAApF,EAAAoF,YACApF,EAAAoF,UAAApF,EAAAoF,UAAAxN,MAAA,MAEAoI,EAAAoF,UAAA3O,QACAuJ,EAAAoF,UAAApH,QAAAyH,IACAL,EAAA3D,QAAAgE,GAAA,GACAL,EAAA9N,KAAAmO,OAMA5C,EAAA,GAAAC,EAAA,KACAlD,EAAAsF,gBACAtF,EAAAuF,cAAA7D,QAAA,KACAvP,EAAAgR,cAKAqC,EAAA3O,SACAmJ,EAAAsF,gBACAtF,EAAAuF,cAAA7D,QAAA,KACAvP,EAAAqT,YAAAnI,IAAAwI,KAAAjN,aAKAwH,EAAA0F,OAAA,CACA,IAAAC,GAAA,EACAC,GAAA,EAaA,GAXA,MAAA5F,EAAA6F,UACA,WAAAC,KAAA9F,EAAA6F,UAAA,MAAA7F,EAAA+F,SACA/F,EAAA+F,SAAA/F,EAAA6F,QACO,QAAAC,KAAA9F,EAAA6F,UAAA,MAAA7F,EAAAgG,UACPhG,EAAAgG,UAAAhG,EAAA6F,QACO,MAAA7F,EAAAiG,aACPjG,EAAAiG,WAAAjG,EAAA6F,UAKA,MAAA7F,EAAAiG,WAAA,CACA,IAMAC,EANAC,EAAA,MAAAnG,EAAA+D,UACA/D,EAAA+D,UAAAtN,OACAuJ,EAAA+D,UACArP,KAAA6E,SAAAyG,EAAAiG,YAAA,OACA,KAiBA,GAdArG,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACA4E,EAAAnU,EAAAuU,SAAAH,KAGAnG,EAAAiG,WAAAxP,OACA4I,EAAAW,EAAAiG,WAAAC,EAAAvH,OAAAoC,IAEAwF,EAAAL,EAAAvH,QACAgH,GAAA,GAEAC,GAAA,EAGA,MAAAM,EAAAnC,UACA,GAAA/D,EAAAiG,WAAAxP,OAAA,CACA,IAAAsN,EAAAyC,KAAAzG,MAAAmG,EAAAnC,WACAA,EAAA0C,WAAA3U,QAAAoJ,cACA6I,EAAAtF,QAAAT,QAAA,CAAA/K,EAAAmF,KACA,IAAAsO,EAAA,KACA,GAAAzT,EAAAoP,WAAAvQ,QAAAqJ,eAAA,CACA,IAAAwL,EAAA1T,EAAAsP,UAAAzQ,QAAAqJ,cAAA1E,QAAAyH,QAAA,YACA,GAAApM,QAAAyJ,aAAAhH,eAAAoS,GACAD,EAAA5U,QAAAyJ,aAAAoL,QAEA,QAAAjU,EAAA,EAAAmP,EAAAH,EAAAjL,OAAyD/D,EAAAmP,GAEzD,QADA6E,EAAAtH,EAAAnM,EAAAsP,UAAAzQ,QAAAqJ,cAAA1E,QAAAiL,EAAAhP,OADgEA,SAMhEgU,EAAAtH,EAAAnM,EAAA8N,GAEA,UAAA2F,EACA,OAAAlH,EAAAhK,MAAA,gBAAAvC,EAAA,iBAEA8Q,EAAA6C,iBAAA7C,EAAA6C,eAAA,IACA7C,EAAA6C,eAAAxO,GAAAsO,IAEArH,EAAA3K,KAAAmD,KACAnD,KAAA2E,QAAA2G,EAAAiG,YACAvR,KAAA6E,SAAA4M,IACAjI,QAAA,YAAAsI,KAAAK,UAAA9C,GAAAhD,QAEAjC,EAAAuB,MAAA,+CAAAhG,KAMA,SAAA2F,EAAAgG,UAAA,CACA,IAAAc,EACA9G,EAAAgG,UAAAvP,QACAmJ,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACAwF,EAAA/U,EAAAgV,YAEA1H,EAAAW,EAAAgG,UAAAc,EAAA/F,IACO4E,IACP/F,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACAwF,EAAA/U,EAAAgV,YAEAR,EAAAO,GACAnB,GAAA,GAEAC,GAAA,EAIA,SAAA5F,EAAAgH,QAAA,CACA,IAAAC,EACAjH,EAAAgH,QAAAvQ,QACAmJ,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACA2F,EAAA1M,eAAA2M,SAAAvE,KAEAtD,EAAAW,EAAAgH,QAAAC,EAAAlG,IACO4E,IACP/F,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACA2F,EAAA1M,eAAA2M,SAAAvE,KAEA4D,EAAAU,GACAtB,GAAA,GAEAC,GAAA,EAIA,SAAA5F,EAAAmH,QAAA,CACA,IAAAC,EACApH,EAAAmH,QAAA1Q,QACAmJ,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACA8F,EAAA7M,eAAA8M,SAAA1E,KAEAtD,EAAAW,EAAAmH,QAAAC,EAAArG,IACO4E,IACP/F,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACA8F,EAAA7M,eAAA8M,SAAA1E,KAEA4D,EAAAa,GACAzB,GAAA,GAEAC,GAAA,EAIA,SAAA5F,EAAA+F,WAAAH,EAAA,CACA,IAAA0B,EACAtH,EAAA+F,UAAA/F,EAAA+F,SAAAtP,QACAmJ,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACAgG,EAAAvV,EAAAwV,WAEAlI,EAAAW,EAAA+F,SAAAuB,EAAAvG,IACO4E,IACP/F,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACAgG,EAAAvV,EAAAwV,WAEAhB,EAAAe,KASA,OAJAvV,EAAA8S,UACA7E,EAAAsB,SACAkG,WAAA5H,EAAAd,GAEAU,EAAA,MAEA,SAAAC,EAAA1I,EAAAgK,GACA,IACA,IAAA2F,EAKA,OAJA9G,EAAA6H,YACA7H,EAAA8H,UAAApG,QAAA,KACAoF,EAAA1M,GAAAmE,aAAAzJ,KAAAmD,KAAAkJ,EAAAhK,GAAA,CAA8D4Q,SAAA,WAE9DjB,EACK,MAAAzU,GACL,aAIA,SAAAyN,EAAA3I,EAAAuI,EAAAyB,GACA,IAUA,OATAnB,EAAAgI,aACAhI,EAAAiI,WAAAvG,QAAA,KACAlH,OAAA1F,KAAAmD,KAAAkJ,EAAArM,KAAA2E,QAAAtC,KACA,iBAAAuI,EACAtF,GAAA8N,cAAApT,KAAAmD,KAAAkJ,EAAAhK,GAAAuI,EAAA,CAAoEqI,SAAA,SAEpE3N,GAAA8N,cAAApT,KAAAmD,KAAAkJ,EAAAhK,GAAAuI,MAGA,EACK,MAAArN,GACL,UAIA,SAAA0N,EAAAtG,EAAA0H,GACA,IAAAgH,EACA,IAIA,OAHAnI,EAAA8H,UAAApG,QAAA,KACAyG,EAAA/N,GAAAgO,YAAAtT,KAAAmD,KAAAkJ,EAAA1H,IAAAnC,OAAA+G,GAAA,yBAAA6H,KAAA7H,MAEA8J,EACK,MAAA9V,GACL,UAIA,SAAAsU,EAAAjH,GACAiH,EAAA0B,OACArI,EAAAgI,aACArB,EAAA0B,MAAA,GAEArI,EAAAiI,WAAAvG,QAAA,KACA,iBAAAhC,EACAV,EAAAyB,MAAAf,EAAA,CAAgCqI,SAAA,SAEhC/I,EAAAyB,MAAAf,OAMA,IAAA4I,sBAAA,CACAC,KAAA,eACAC,MAAA,mCACAC,MAAA,mCACAC,MAAA,4CACAC,OAAA,4CACAC,OAAA,4CACAC,MAAA,4CACAC,OAAA,4CACAC,OAAA,4CACAC,MAAA,4CACAC,OAAA,4CACAC,OAAA,4CACAC,MAAA,4CACAC,OAAA,4CACAC,OAAA,6CAIA,SAAAxG,iBAAAyG,EAAApK,GAGA,IAFA,IAAAqK,EACAC,GAAA,EACA,OAAAD,EAAA5O,eAAA8O,eAAAH,KACApK,GACAA,EAAAuB,MACA9F,eAAA+O,iBAAAH,EAAArK,EAAAyK,OAAA,GACAlP,SAGAE,eAAAiP,QAAAL,KAAAC,GAAA,GAEA,OAAAA,EAMA,SAAAvJ,cACA,OACA6H,SAAA,EACAD,UAAA,EACAI,UAAA,EACAD,WAAA,EACAvG,UAAA,EACAD,WAAA,EACAuD,YAAA,EACAD,aAAA,EACA2B,SAAA,EACAD,UAAA,EACApB,aAAA,EACAD,cAAA,EACAI,aAAA,EACAD,cAAA,GASA,SAAA5D,QAAAzM,GACA,MAAA6D,EAAAtC,QAAAqT,SACA5U,IACA,MAAA6U,EAAAtT,QAAAqT,OAAA/Q,GACA,WAAAgR,EAAA,GAAAA,EAAA,GAMA,SAAAC,WAAAC,GACA,OAAAA,KAAA,KAAAC,QAAA,eAMA,SAAArC,WAAA5H,EAAAjB,GACA,SAAAmL,EAAAF,EAAAG,GACA,OAAAJ,WAAAC,IAEAjL,GAAAvI,QAAAwI,QAAAyB,MAAA,CACA,eAAAyJ,EAAAlK,EAAA8H,SAAA9H,EAAA6H,WACA,eAAAqC,EAAAlK,EAAAiI,UAAAjI,EAAAgI,YACA,eAAAkC,EAAAlK,EAAAyB,UAAAzB,EAAAwB,YACA,eAAA0I,EAAAlK,EAAA+E,YAAA/E,EAAA8E,cACA,eAAAoF,EAAAlK,EAAAyG,SAAAzG,EAAAwG,WACA,eAAA0D,EAAAlK,EAAAoF,aAAApF,EAAAmF,eACA,eAAA+E,EAAAlK,EAAAuF,aAAAvF,EAAAsF,gBACArN,KAAAwC,UAxDAvI,QAAA2Q,kCAsBA3Q,QAAA+N,wBAEAzJ,QAAAqT,SAAArT,QAAAqT,OAAsCjX,oBAAQ,KAU9CV,QAAAwP,gBAOAxP,QAAA6X,sBAkBA7X,QAAA0V,sBAEA,IAAAwC,iBAAA,IAAAjQ,eAAAkQ,OACAlQ,OAAAkQ,OAAAC,aAAA,SAAAvQ,GAAgD,WAAAI,OAAAkQ,OAAAtQ,IAChD,SAAAA,GAAmB,WAAAwQ,WAAAxQ,IAGnB,SAAAkF,mBAAAhK,GACA,IAAAuV,EAAA,GA6BA,OA5BAA,EAAA/J,MAAA,SAAAgK,GAEA,GADAxV,KAAAwV,GACA,iBAAAA,EAAA,CACA,IAAAC,EAAAN,YAAA/P,KAAAxD,OAAA4T,IACApQ,KAAAoG,MAAAgK,EAAAC,EAAA,GACAD,EAAAC,EAEAjY,KAAAiF,KAAA+S,IAEAD,EAAAG,MAAA,WACAH,EAAA3T,OAAA,GAEA2T,EAAAI,SAAA,WAEA,IADA,IAAAC,EAAA,EAAA/X,EAAA,EAAAmP,EAAAxP,KAAAoE,OACA/D,EAAAmP,GAAA4I,GAAApY,KAAAK,KAAA+D,OACA,IAAA6T,EAAAN,YAAAS,GAEA,IADAA,EAAA/X,EAAA,EACAA,EAAAmP,GACAyI,EAAA/M,IAAAlL,KAAAK,GAAA+X,GACAA,GAAApY,KAAAK,GAAA+D,SACA/D,EAEA,OAAA4X,GAEAF,EAAAM,SAAA,WACA,IAAAJ,EAAAjY,KAAAmY,WACA,OAAAvQ,KAAA0Q,KAAAL,EAAA,EAAAA,EAAA7T,SAEA2T,EAGAtY,QAAA+M,sCAGA/M,QAAA8Y,WAAA,CACAC,cAAA,EACAC,eAAA,EACAC,mBAAA,EACAC,gBAAA,EACAC,eAAA,EACAC,kBAAA,EACAC,wBAAA,EACAC,OAAA,SACArZ,OAAA,WACAoP,OAAA,EACAkK,MAAA,GACAC,SAAA,4FCn4BA,IAAArR,EAAAnI,EAOAmI,EAAAxD,OAAA,SAAA+G,GAGA,IAFA,IAAA7D,EAAA,EACA5G,EAAA,EACAL,EAAA,EAAmBA,EAAA8K,EAAA/G,SAAmB/D,GACtCK,EAAAyK,EAAA+N,WAAA7Y,IACA,IACAiH,GAAA,EACA5G,EAAA,KACA4G,GAAA,EACA,cAAA5G,IAAA,cAAAyK,EAAA+N,WAAA7Y,EAAA,OACAA,EACAiH,GAAA,GAEAA,GAAA,EAEA,OAAAA,GAUAM,EAAA0Q,KAAA,SAAAL,EAAA5R,EAAAC,GAEA,GADAA,EAAAD,EACA,EACA,SAKA,IAJA,IAGA9E,EAHA0C,EAAA,KACA+T,EAAA,GACA3X,EAAA,EAEAgG,EAAAC,IACA/E,EAAA0W,EAAA5R,MACA,IACA2R,EAAA3X,KAAAkB,EACAA,EAAA,KAAAA,EAAA,IACAyW,EAAA3X,MAAA,GAAAkB,IAAA,KAAA0W,EAAA5R,KACA9E,EAAA,KAAAA,EAAA,KACAA,IAAA,EAAAA,IAAA,OAAA0W,EAAA5R,OAAA,OAAA4R,EAAA5R,OAAA,KAAA4R,EAAA5R,MAAA,MACA2R,EAAA3X,KAAA,OAAAkB,GAAA,IACAyW,EAAA3X,KAAA,YAAAkB,IAEAyW,EAAA3X,MAAA,GAAAkB,IAAA,OAAA0W,EAAA5R,OAAA,KAAA4R,EAAA5R,KACAhG,EAAA,QACA4D,MAAA,KAAAgB,KAAA4H,OAAAsM,aAAA5J,MAAA1C,OAAAmL,IACA3X,EAAA,GAGA,OAAA4D,GACA5D,GACA4D,EAAAgB,KAAA4H,OAAAsM,aAAA5J,MAAA1C,OAAAmL,EAAApT,MAAA,EAAAvE,KACA4D,EAAAuB,KAAA,KAEAqH,OAAAsM,aAAA5J,MAAA1C,OAAAmL,EAAApT,MAAA,EAAAvE,KAUAuH,EAAAoG,MAAA,SAAA7C,EAAA8M,EAAAG,GAIA,IAHA,IACAgB,EACAC,EAFAhT,EAAA+R,EAGA/X,EAAA,EAAmBA,EAAA8K,EAAA/G,SAAmB/D,GACtC+Y,EAAAjO,EAAA+N,WAAA7Y,IACA,IACA4X,EAAAG,KAAAgB,EACSA,EAAA,MACTnB,EAAAG,KAAAgB,GAAA,MACAnB,EAAAG,KAAA,GAAAgB,EAAA,KACS,cAAAA,IAAA,eAAAC,EAAAlO,EAAA+N,WAAA7Y,EAAA,MACT+Y,EAAA,aAAAA,IAAA,UAAAC,KACAhZ,EACA4X,EAAAG,KAAAgB,GAAA,OACAnB,EAAAG,KAAAgB,GAAA,UACAnB,EAAAG,KAAAgB,GAAA,SACAnB,EAAAG,KAAA,GAAAgB,EAAA,MAEAnB,EAAAG,KAAAgB,GAAA,OACAnB,EAAAG,KAAAgB,GAAA,SACAnB,EAAAG,KAAA,GAAAgB,EAAA,KAGA,OAAAhB,EAAA/R,qBCvGA,SAAAtC,GAAA,IAAAuV,OAAA,IAAAvV,MAAA,GACAwV,EAAAD,EAAAtW,KAAA,OAAAsW,EAAAtW,IAEA,SAAAiD,EAAA8R,EAAAyB,GACA,IAAAC,EAAAD,GAAA,GAUA,OATAC,EAAA5L,UAAAkK,OAAAb,OAAAqC,EACAE,EAAAC,KAAArF,IAAAoF,EAAA5L,UAAApO,EAAAka,KAAAtF,EAAA5U,EAAAma,MAAAvF,GACAoF,EAAArL,IAAAiG,IAAAoF,EAAA5L,UAAApO,EAAAoa,IAAAxF,EAAA5U,EAAAma,MAAAvF,GACAoF,EAAAK,MAAAzF,IAAAoF,EAAA5L,UAAApO,EAAAsa,MAAA1F,EAAA5U,EAAAma,MAAAvF,GACAoF,EAAAxL,OAAAoG,IAAAoF,EAAA5L,UAAApO,EAAAua,OAAA3F,EAAA5U,EAAAma,MAAAvF,GACAoF,EAAAQ,KAAA5F,IAAAoF,EAAA5L,UAAApO,EAAAya,KAAA7F,EAAA5U,EAAAma,MAAAvF,GACAoF,EAAAU,QAAA9F,IAAAoF,EAAA5L,UAAApO,EAAA2a,QAAA/F,EAAA5U,EAAAma,MAAAvF,GACAoF,EAAAhL,KAAA4F,IAAAoF,EAAA5L,UAAApO,EAAA4a,KAAAhG,EAAA5U,EAAAma,MAAAvF,GACAoF,EAAAjL,MAAA6F,IAAAoF,EAAA5L,UAAApO,EAAA6a,MAAAjG,EAAA5U,EAAAma,MAAAvF,GACAoF,EAGAha,EAAA8M,OAAAtG,EAAAqT,EAAA/M,OAAA9M,GACAA,EAAAgN,OAAAxG,EAAAqT,EAAA7M,QACAhN,EAAAwG,OAEAxG,EAAAka,KAAA,QACAla,EAAAoa,IAAA,QACApa,EAAAsa,MAAA,QACAta,EAAAua,OAAA,QACAva,EAAAya,KAAA,QACAza,EAAA2a,QAAA,QACA3a,EAAA4a,KAAA,QACA5a,EAAA6a,MAAA,QACA7a,EAAAma,MAAA,wCCkDAna,EAAAiO,MApEA,SAAAzK,EAAAsX,GACA,IAAA3R,EAAA,GACAkF,EAAA,GACA1I,UAAA,GACA8I,EAAA,GAGA4D,EAAA,GACA/Q,OAAA2L,KAAA6N,GAAA5O,QAAA/J,IACA,IAAA4Y,EAAAD,EAAA3Y,GACA,MAAA4Y,EAAAxI,QACA,iBAAAwI,EAAAxI,MAAAF,EAAA0I,EAAAxI,OAAApQ,EACAkE,MAAA8G,QAAA4N,EAAAxI,QAAAwI,EAAAxI,MAAArG,QAAAqG,GAAAF,EAAAE,GAAApQ,IAEA,MAAA4Y,EAAAC,UAAA7R,EAAAhH,GAAA4Y,EAAAC,WAIA,QAAApa,EAAA,EAAAmP,GAAAvM,IAAA2B,SAAAR,OAAmD/D,EAAAmP,IAAOnP,EAAA,CAC1D,IAAA0N,EAAA9K,EAAA5C,GACA,SAAA0N,EAAA,GAAsB1N,EAAK,MAC3B,IAAiDma,EAAA5Y,EAAjD8Y,EAAA,gDAAiD/V,KAAAoJ,GACjD,GAAA2M,EACAH,EAAAxM,GAAAyM,EAAAD,EAAA3Y,EAAAmM,GACA,MAAA2M,EAAA,IACAF,EAAAD,EAAA3Y,EAAAkQ,EAAA4I,EAAA,GAAAxK,UAAA,OACA,MAAAwK,EAAA,KAAAzX,EAAA5C,KAAAqa,EAAA,IACO,MAAAA,EAAA,KACPF,EAAAD,EAAA3Y,EAAA8Y,EAAA,GAAAxK,UAAA,MACA,MAAAwK,EAAA,KAAAzX,EAAA5C,KAAAqa,EAAA,QAEK,CACL,OAAA3M,EAAAmL,WAAA,GACA,CAAY9T,UAAAH,KAAA8I,GAAqB,SADjCyM,EAAAD,EAAA3Y,EAAAmM,GAGA,GAAAyM,EAAA,CACA,SAAAA,EAAAG,MAAA,MAAAH,EAAAG,KAAA/R,EAAAhH,IAAA,OAEA,GAAAvB,EAAA,EAAA4C,EAAAmB,QAAA,IAAAnB,EAAA5C,EAAA,GAAA6Y,WAAA,GACA,OAAAsB,EAAAG,MACA,QAAA/R,EAAAhH,GAAAgZ,SAAA3X,IAAA5C,GAAA,IAA6D,MAC7D,QAAAuI,EAAAhH,IAAAgH,EAAAhH,IAAA,IAAAiF,OAAA+T,SAAA3X,IAAA5C,GAAA,KAA0F,MAC1F,QAAAuI,EAAAhH,GAAAiZ,WAAA5X,IAAA5C,IAA2D,MAC3D,QAAAuI,EAAAhH,IAAAgH,EAAAhH,IAAA,IAAAiF,OAAAgU,WAAA5X,IAAA5C,KAAwF,MACxF,QAAAuI,EAAAhH,GAAAiL,OAAA5J,IAAA5C,IAAuD,MACvD,QAAAuI,EAAAhH,IAAAgH,EAAAhH,IAAA,IAAAiF,OAAA5D,IAAA5C,GAAAkF,MAAA,MAAuF,MACvF,QAAAuI,EAAA7I,KAAA8I,KAAuC1N,OAGvC,OAAAma,EAAAG,MACA,QACA,QAAA/R,EAAAhH,GAAA4Y,EAAAC,SAAA,EAAyD,MACzD,QAAA7R,EAAAhH,GAAA4Y,EAAAC,SAAA,GAA0D,MAC1D,QACA,QACA,QAAA7R,EAAAhH,GAAAgH,EAAA6R,SAAA,GAA2D,MAC3D,QAAA3M,EAAA7I,KAAA8I,GAIAyM,EAAAlZ,OAAAP,OAAA2L,KAAA8N,EAAAlZ,OAAAqK,QAAA6D,GAAA5G,EAAA4G,GAAAgL,EAAAlZ,MAAAkO,SACK1B,EAAA7I,KAAA8I,GAEL,KAAA1N,EAAAmP,GAAAtB,EAAAjJ,KAAAhC,EAAA5C,MAEA,OAAUuI,UAAAkF,UAAA1I,oBAAA8I,aA8BVzO,EAAA4O,KAxBA,SAAAkM,EAAA3R,GACAA,MAAA,IACA,IAAAkS,EAAAlS,EAAAkS,QAAA,EACAC,EAAAnS,EAAAmS,SAAA,GACAC,EAAApS,EAAAoS,KAAA,KACAC,EAAA,GAgBA,OAfAla,OAAA2L,KAAA6N,GAAA5O,QAAA/J,IACA,IAAA4Y,EAAAD,EAAA3Y,GACA,SAAA4Y,EAAAU,YAAA,CAEA,IADA,IAAA7G,EAAA,GACAA,EAAAjQ,OAAA0W,GAAAzG,GAAA,IAGA,IAFAA,GAAA,KAAAzS,EACA4Y,EAAAxI,QAAAqC,GAAA,MAAAmG,EAAAxI,OACAqC,EAAAjQ,OAAA2W,GAAA1G,GAAA,IACAvO,MAAA8G,QAAA4N,EAAAU,aACAD,EAAAhW,KAAAoP,EAAAmG,EAAAU,YAAA,GAAAV,EAAAU,YAAAtW,MAAA,GAAAgG,IAAAuQ,IACA,QAAA9a,EAAA,EAAuBA,EAAA0a,IAAa1a,EAAA8a,EAAA,IAAAA,EACpC,OAAAH,EAAAG,IACO3V,KAAA,KACFyV,EAAAhW,KAAAoP,EAAAmG,EAAAU,gBAELD,EAAAzV,KAAAwV,sBCvGA,SAAAjX,GAwBA,IAAA1B,EAAWlC,EAAQ,GACnBwH,EAASxH,EAAQ,GACjBib,EAAAR,SAAA,UAEAlb,EAAAD,QAAA,SAAAsI,EAAA5F,EAAAsL,EAAA4N,GACA5N,GAAA,iBAAAA,IACAA,EAAA,CAAYjM,KAAAiM,IAEZ,IAAAjM,EAAAiM,EAAAjM,UACA8Z,IAAA9Z,IACAA,EAAA4Z,GAAArX,EAAAN,SAEA4X,MAAA,MACAlZ,EAAAE,EAAAiB,QAAAnB,GACA,IACAwF,EAAA4T,UAAApZ,EAAAX,GACA6Z,KAAAlZ,EACG,MAAAqZ,GACH,OAAAA,EAAApT,MACA,aACAiT,EAAAtT,EAAA1F,EAAA2E,QAAA7E,GAAAsL,EAAA4N,GACAtT,EAAA5F,EAAAsL,EAAA4N,GACA,MACA,QACA,IAAAI,EACA,IACAA,EAAA9T,EAAA+T,SAAAvZ,GACS,MAAAwZ,GACT,MAAAH,EAEA,IAAAC,EAAAG,cAAA,MAAAJ,GAIA,OAAAH,oCC1DA,YAAApb,gCAAA,CAA4D,IAAAL,EAAA,IAAAuD,MAAA,uCAAsF,MAA7BvD,EAAAwI,KAAA,mBAA6BxI,EAClJF,EAAAD,QAAAQ,yyICDA,SAAA4b,EAAAC,GACA,IAAAlc,EAAA,IAAAuD,MAAA,uBAAA2Y,EAAA,KAEA,MADAlc,EAAAwI,KAAA,mBACAxI,EAEAic,EAAAnP,KAAA,WAAuC,UACvCmP,EAAAvY,QAAAuY,EACAnc,EAAAD,QAAAoc,EACAA,EAAAE,GAAA,qBCRA,SAAAhY,EAAA2D,GAAAhI,EAAAD,QAAAsE,EAAAqT,QAcA,SAAA4E,GACA,IAAAC,EAAA,KAAAC,EAAA1b,KAAA2b,GACAC,EAAA3V,KAAA4V,MAAAJ,GACAK,EAAA7V,KAAA4V,MAAAJ,EAAA,OACAD,IACAI,GAAAJ,EAAA,IACAM,GAAAN,EAAA,IACA,IACAI,IACAE,GAAA,MAGA,OAAAF,EAAAE,IAvBA,IAAAH,EAAAzU,EAAAyU,aAAA,GACAD,EACAC,EAAAI,KACAJ,EAAAK,QACAL,EAAAM,OACAN,EAAAO,MACAP,EAAAQ,WACA,WAAa,WAAAC,MAAAC","file":"asc.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory((function webpackLoadOptionalExternalModule() { try { return require(\"assemblyscript\"); } catch(e) {} }()));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"assemblyscript\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"asc\"] = factory((function webpackLoadOptionalExternalModule() { try { return require(\"assemblyscript\"); } catch(e) {} }()));\n\telse\n\t\troot[\"asc\"] = factory(root[\"assemblyscript\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE__10__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n","exports.nextTick = function nextTick(fn) {\n\tsetTimeout(fn, 0);\n};\n\nexports.platform = exports.arch = \nexports.execPath = exports.title = 'browser';\nexports.pid = 1;\nexports.browser = true;\nexports.env = {};\nexports.argv = [];\n\nexports.binding = function (name) {\n\tthrow new Error('No such module. (Possibly not yet loaded)')\n};\n\n(function () {\n var cwd = '/';\n var path;\n exports.cwd = function () { return cwd };\n exports.chdir = function (dir) {\n if (!path) path = require('path');\n cwd = path.resolve(dir, cwd);\n };\n})();\n\nexports.exit = exports.kill = \nexports.umask = exports.dlopen = \nexports.uptime = exports.memoryUsage = \nexports.uvCounters = function() {};\nexports.features = {};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\n * Compiler frontend for node.js\n *\n * Uses the low-level API exported from src/index.ts so it works with the compiler compiled to\n * JavaScript as well as the compiler compiled to WebAssembly (eventually). Runs the sources\n * directly through ts-node if distribution files are not present (indicated by a `-dev` version).\n *\n * Can also be packaged as a bundle suitable for in-browser use with the standard library injected\n * in the build step. See dist/asc.js for the bundle and webpack.config.js for building details.\n *\n * @module cli/asc\n */\n\n// Use \".\" instead of \"/\" as cwd in browsers\nif (process.browser) process.cwd = function() { return \".\"; };\n\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst utf8 = require(\"@protobufjs/utf8\");\nconst colorsUtil = require(\"./util/colors\");\nconst optionsUtil = require(\"./util/options\");\nconst mkdirp = require(\"./util/mkdirp\");\nconst EOL = process.platform === \"win32\" ? \"\\r\\n\" : \"\\n\";\n\n// Emscripten adds an `uncaughtException` listener to Binaryen that results in an additional\n// useless code fragment on top of an actual error. suppress this:\nif (process.removeAllListeners) process.removeAllListeners(\"uncaughtException\");\n\n// Use distribution files if present, otherwise run the sources directly\nvar assemblyscript, isDev = false;\n(() => {\n try { // `asc` on the command line\n assemblyscript = require(\"../dist/assemblyscript.js\");\n } catch (e) {\n try { // `asc` on the command line without dist files\n require(\"ts-node\").register({ project: path.join(__dirname, \"..\", \"src\", \"tsconfig.json\") });\n require(\"../src/glue/js\");\n assemblyscript = require(\"../src\");\n isDev = true;\n } catch (e_ts) {\n try { // `require(\"dist/asc.js\")` in explicit browser tests\n assemblyscript = eval(\"require('./assemblyscript')\");\n } catch (e) {\n // combine both errors that lead us here\n e.stack = e_ts.stack + \"\\n---\\n\" + e.stack;\n throw e;\n }\n }\n }\n})();\n\n/** Whether this is a webpack bundle or not. */\nexports.isBundle = typeof BUNDLE_VERSION === \"string\";\n\n/** Whether asc runs the sources directly or not. */\nexports.isDev = isDev;\n\n/** AssemblyScript version. */\nexports.version = exports.isBundle ? BUNDLE_VERSION : require(\"../package.json\").version;\n\n/** Available CLI options. */\nexports.options = require(\"./asc.json\");\n\n/** Common root used in source maps. */\nexports.sourceMapRoot = \"assemblyscript:///\";\n\n/** Prefix used for library files. */\nexports.libraryPrefix = assemblyscript.LIBRARY_PREFIX;\n\n/** Default Binaryen optimization level. */\nexports.defaultOptimizeLevel = 2;\n\n/** Default Binaryen shrink level. */\nexports.defaultShrinkLevel = 1;\n\n/** Bundled library files. */\nexports.libraryFiles = exports.isBundle ? BUNDLE_LIBRARY : (() => { // set up if not a bundle\n const libDir = path.join(__dirname, \"..\", \"std\", \"assembly\");\n const libFiles = require(\"glob\").sync(\"**/!(*.d).ts\", { cwd: libDir });\n const bundled = {};\n libFiles.forEach(file => bundled[file.replace(/\\.ts$/, \"\")] = fs.readFileSync(path.join(libDir, file), \"utf8\" ));\n return bundled;\n})();\n\n/** Bundled definition files. */\nexports.definitionFiles = exports.isBundle ? BUNDLE_DEFINITIONS : (() => { // set up if not a bundle\n const stdDir = path.join(__dirname, \"..\", \"std\");\n return {\n \"assembly\": fs.readFileSync(path.join(stdDir, \"assembly\", \"index.d.ts\"), \"utf8\"),\n \"portable\": fs.readFileSync(path.join(stdDir, \"portable\", \"index.d.ts\"), \"utf8\")\n };\n})();\n\n/** Convenience function that parses and compiles source strings directly. */\nexports.compileString = (sources, options) => {\n if (typeof sources === \"string\") sources = { \"input.ts\": sources };\n const output = Object.create({\n stdout: createMemoryStream(),\n stderr: createMemoryStream()\n });\n var argv = [\n \"--binaryFile\", \"binary\",\n \"--textFile\", \"text\",\n ];\n Object.keys(options || {}).forEach(key => {\n var val = options[key];\n if (Array.isArray(val)) val.forEach(val => argv.push(\"--\" + key, String(val)));\n else argv.push(\"--\" + key, String(val));\n });\n exports.main(argv.concat(Object.keys(sources)), {\n stdout: output.stdout,\n stderr: output.stderr,\n readFile: name => sources.hasOwnProperty(name) ? sources[name] : null,\n writeFile: (name, contents) => output[name] = contents,\n listFiles: () => []\n });\n return output;\n}\n\n/** Runs the command line utility using the specified arguments array. */\nexports.main = function main(argv, options, callback) {\n if (typeof options === \"function\") {\n callback = options;\n options = {};\n } else if (!options) {\n options = {};\n }\n\n const stdout = options.stdout || process.stdout;\n const stderr = options.stderr || process.stderr;\n const readFile = options.readFile || readFileNode;\n const writeFile = options.writeFile || writeFileNode;\n const listFiles = options.listFiles || listFilesNode;\n const stats = options.stats || createStats();\n\n // Output must be specified if not present in the environment\n if (!stdout) throw Error(\"'options.stdout' must be specified\");\n if (!stderr) throw Error(\"'options.stderr' must be specified\");\n\n const opts = optionsUtil.parse(argv, exports.options);\n const args = opts.options;\n argv = opts.arguments;\n if (args.noColors) {\n colorsUtil.stdout.supported =\n colorsUtil.stderr.supported = false;\n } else {\n colorsUtil.stdout = colorsUtil.from(stdout);\n colorsUtil.stderr = colorsUtil.from(stderr);\n }\n\n // Check for unknown arguments\n if (opts.unknown.length) {\n opts.unknown.forEach(arg => {\n stderr.write(colorsUtil.stderr.yellow(\"WARN: \") + \"Unknown option '\" + arg + \"'\" + EOL);\n });\n }\n\n // Check for trailing arguments\n if (opts.trailing.length) {\n stderr.write(colorsUtil.stderr.yellow(\"WARN: \") + \"Unsupported trailing arguments: \" + opts.trailing.join(\" \") + EOL);\n }\n\n // Use default callback if none is provided\n if (!callback) callback = function defaultCallback(err) {\n var code = 0;\n if (err) {\n stderr.write(colorsUtil.stderr.red(\"ERROR: \") + err.stack.replace(/^ERROR: /i, \"\") + EOL);\n code = 1;\n }\n return code;\n };\n\n // Just print the version if requested\n if (args.version) {\n stdout.write(\"Version \" + exports.version + (isDev ? \"-dev\" : \"\") + EOL);\n return callback(null);\n }\n // Print the help message if requested or no source files are provided\n if (args.help || !argv.length) {\n var out = args.help ? stdout : stderr;\n var color = args.help ? colorsUtil.stdout : colorsUtil.stderr;\n out.write([\n color.white(\"SYNTAX\"),\n \" \" + color.cyan(\"asc\") + \" [entryFile ...] [options]\",\n \"\",\n color.white(\"EXAMPLES\"),\n \" \" + color.cyan(\"asc\") + \" hello.ts\",\n \" \" + color.cyan(\"asc\") + \" hello.ts -b hello.wasm -t hello.wat\",\n \" \" + color.cyan(\"asc\") + \" hello1.ts hello2.ts -b -O > hello.wasm\",\n \"\",\n color.white(\"OPTIONS\"),\n ].concat(\n optionsUtil.help(exports.options, 24, EOL)\n ).join(EOL) + EOL);\n return callback(null);\n }\n\n // I/O must be specified if not present in the environment\n if (!fs.readFileSync) {\n if (readFile === readFileNode) throw Error(\"'options.readFile' must be specified\");\n if (writeFile === writeFileNode) throw Error(\"'options.writeFile' must be specified\");\n if (listFiles === listFilesNode) throw Error(\"'options.listFiles' must be specified\");\n }\n\n // Set up base directory\n const baseDir = args.baseDir ? path.resolve(args.baseDir) : \".\";\n\n // Set up transforms\n const transforms = [];\n if (args.transform) {\n args.transform.forEach(transform =>\n transforms.push(\n require(\n path.isAbsolute(transform = transform.trim())\n ? transform\n : path.join(process.cwd(), transform)\n )\n )\n );\n }\n function applyTransform(name, ...args) {\n transforms.forEach(transform => {\n if (typeof transform[name] === \"function\") transform[name](...args);\n });\n }\n\n // Begin parsing\n var parser = null;\n\n // Include library files\n if (!args.noLib) {\n Object.keys(exports.libraryFiles).forEach(libPath => {\n if (libPath.indexOf(\"/\") >= 0) return; // in sub-directory: imported on demand\n stats.parseCount++;\n stats.parseTime += measure(() => {\n parser = assemblyscript.parseFile(\n exports.libraryFiles[libPath],\n exports.libraryPrefix + libPath + \".ts\",\n false,\n parser\n );\n });\n });\n } else { // always include builtins\n stats.parseCount++;\n stats.parseTime += measure(() => {\n parser = assemblyscript.parseFile(\n exports.libraryFiles[\"builtins\"],\n exports.libraryPrefix + \"builtins.ts\",\n false,\n parser\n );\n });\n }\n const customLibDirs = [];\n if (args.lib) {\n let lib = args.lib;\n if (typeof lib === \"string\") lib = lib.split(\",\");\n Array.prototype.push.apply(customLibDirs, lib.map(lib => lib.trim()));\n for (let i = 0, k = customLibDirs.length; i < k; ++i) { // custom\n let libDir = customLibDirs[i];\n let libFiles;\n if (libDir.endsWith(\".ts\")) {\n libFiles = [ path.basename(libDir) ];\n libDir = path.dirname(libDir);\n } else {\n libFiles = listFiles(libDir);\n }\n for (let j = 0, l = libFiles.length; j < l; ++j) {\n let libPath = libFiles[j];\n let libText = readFile(libPath, libDir);\n if (libText === null) return callback(Error(\"Library file '\" + libPath + \"' not found.\"));\n stats.parseCount++;\n stats.parseTime += measure(() => {\n parser = assemblyscript.parseFile(\n libText,\n exports.libraryPrefix + libPath,\n false,\n parser\n );\n });\n }\n }\n }\n\n // Parses the backlog of imported files after including entry files\n function parseBacklog() {\n var sourcePath, sourceText;\n while ((sourcePath = parser.nextFile()) != null) {\n\n // Load library file if explicitly requested\n if (sourcePath.startsWith(exports.libraryPrefix)) {\n const plainName = sourcePath.substring(exports.libraryPrefix.length);\n const indexName = sourcePath.substring(exports.libraryPrefix.length) + \"/index\";\n if (exports.libraryFiles.hasOwnProperty(plainName)) {\n sourceText = exports.libraryFiles[plainName];\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\n } else if (exports.libraryFiles.hasOwnProperty(indexName)) {\n sourceText = exports.libraryFiles[indexName];\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\n } else {\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\n sourceText = readFile(plainName + \".ts\", customLibDirs[i]);\n if (sourceText !== null) {\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\n break;\n } else {\n sourceText = readFile(indexName + \".ts\", customLibDirs[i]);\n if (sourceText !== null) {\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\n break;\n }\n }\n }\n }\n\n // Otherwise try nextFile.ts, nextFile/index.ts, ~lib/nextFile.ts, ~lib/nextFile/index.ts\n } else {\n const plainName = sourcePath;\n const indexName = sourcePath + \"/index\";\n sourceText = readFile(plainName + \".ts\", baseDir);\n if (sourceText !== null) {\n sourcePath = plainName + \".ts\";\n } else {\n sourceText = readFile(indexName + \".ts\", baseDir);\n if (sourceText !== null) {\n sourcePath = indexName + \".ts\";\n } else if (!plainName.startsWith(\".\")) {\n if (exports.libraryFiles.hasOwnProperty(plainName)) {\n sourceText = exports.libraryFiles[plainName];\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\n } else if (exports.libraryFiles.hasOwnProperty(indexName)) {\n sourceText = exports.libraryFiles[indexName];\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\n } else {\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\n const dir = customLibDirs[i];\n sourceText = readFile(plainName + \".ts\", customLibDirs[i]);\n if (sourceText !== null) {\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\n break;\n } else {\n sourceText = readFile(indexName + \".ts\", customLibDirs[i]);\n if (sourceText !== null) {\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\n break;\n }\n }\n }\n }\n }\n }\n }\n if (sourceText == null) {\n return callback(Error(\"Import file '\" + sourcePath + \".ts' not found.\"));\n }\n stats.parseCount++;\n stats.parseTime += measure(() => {\n assemblyscript.parseFile(sourceText, sourcePath, false, parser);\n });\n }\n if (checkDiagnostics(parser, stderr)) {\n return callback(Error(\"Parse error\"));\n }\n }\n\n // Include entry files\n for (let i = 0, k = argv.length; i < k; ++i) {\n const filename = argv[i];\n\n let sourcePath = String(filename).replace(/\\\\/g, \"/\").replace(/(\\.ts|\\/)$/, \"\");\n\n // Try entryPath.ts, then entryPath/index.ts\n let sourceText = readFile(sourcePath + \".ts\", baseDir);\n if (sourceText === null) {\n sourceText = readFile(sourcePath + \"/index.ts\", baseDir);\n if (sourceText === null) {\n return callback(Error(\"Entry file '\" + sourcePath + \".ts' not found.\"));\n } else {\n sourcePath += \"/index.ts\";\n }\n } else {\n sourcePath += \".ts\";\n }\n\n stats.parseCount++;\n stats.parseTime += measure(() => {\n parser = assemblyscript.parseFile(sourceText, sourcePath, true, parser);\n });\n let code = parseBacklog();\n if (code) return code;\n }\n\n applyTransform(\"afterParse\", parser);\n {\n let code = parseBacklog();\n if (code) return code;\n }\n\n // Finish parsing\n const program = assemblyscript.finishParsing(parser);\n\n // Set up optimization levels\n var optimizeLevel = 0;\n var shrinkLevel = 0;\n if (args.optimize) {\n optimizeLevel = exports.defaultOptimizeLevel;\n shrinkLevel = exports.defaultShrinkLevel;\n }\n if (typeof args.optimizeLevel === \"number\") {\n optimizeLevel = args.optimizeLevel;\n }\n if (typeof args.shrinkLevel === \"number\") {\n shrinkLevel = args.shrinkLevel;\n }\n optimizeLevel = Math.min(Math.max(optimizeLevel, 0), 3);\n shrinkLevel = Math.min(Math.max(shrinkLevel, 0), 2);\n\n // Begin compilation\n const compilerOptions = assemblyscript.createOptions();\n assemblyscript.setTarget(compilerOptions, 0);\n assemblyscript.setNoTreeShaking(compilerOptions, args.noTreeShaking);\n assemblyscript.setNoAssert(compilerOptions, args.noAssert);\n assemblyscript.setImportMemory(compilerOptions, args.importMemory);\n assemblyscript.setImportTable(compilerOptions, args.importTable);\n assemblyscript.setMemoryBase(compilerOptions, args.memoryBase >>> 0);\n assemblyscript.setSourceMap(compilerOptions, args.sourceMap != null);\n assemblyscript.setOptimizeLevelHints(compilerOptions, optimizeLevel, shrinkLevel);\n\n if (!args.noLib) {\n // Initialize default aliases\n assemblyscript.setGlobalAlias(compilerOptions, \"Math\", \"NativeMath\");\n assemblyscript.setGlobalAlias(compilerOptions, \"Mathf\", \"NativeMathf\");\n assemblyscript.setGlobalAlias(compilerOptions, \"abort\", \"~lib/env/abort\");\n assemblyscript.setGlobalAlias(compilerOptions, \"trace\", \"~lib/env/trace\");\n }\n\n // Add or override aliases if specified\n if (args.use) {\n let aliases = args.use;\n for (let i = 0, k = aliases.length; i < k; ++i) {\n let part = aliases[i];\n let p = part.indexOf(\"=\");\n if (p < 0) return callback(Error(\"Global alias '\" + part + \"' is invalid.\"));\n let name = part.substring(0, p).trim();\n let alias = part.substring(p + 1).trim();\n if (!name.length) return callback(Error(\"Global alias '\" + part + \"' is invalid.\"));\n assemblyscript.setGlobalAlias(compilerOptions, name, alias);\n }\n }\n\n // Enable additional features if specified\n var features = args.enable;\n if (features != null) {\n if (typeof features === \"string\") features = features.split(\",\");\n for (let i = 0, k = features.length; i < k; ++i) {\n let name = features[i].trim();\n let flag = assemblyscript[\"FEATURE_\" + name.replace(/\\-/g, \"_\").toUpperCase()];\n if (!flag) return callback(Error(\"Feature '\" + name + \"' is unknown.\"));\n assemblyscript.enableFeature(compilerOptions, flag);\n }\n }\n\n var module;\n stats.compileCount++;\n (() => {\n try {\n stats.compileTime += measure(() => {\n module = assemblyscript.compileProgram(program, compilerOptions);\n });\n } catch (e) {\n return callback(e);\n }\n })();\n if (checkDiagnostics(parser, stderr)) {\n if (module) module.dispose();\n return callback(Error(\"Compile error\"));\n }\n\n // Validate the module if requested\n if (args.validate) {\n stats.validateCount++;\n stats.validateTime += measure(() => {\n if (!module.validate()) {\n module.dispose();\n return callback(Error(\"Validate error\"));\n }\n });\n }\n\n // Set Binaryen-specific options\n if (args.trapMode === \"clamp\") {\n stats.optimizeCount++;\n stats.optimizeTime += measure(() => {\n module.runPasses([ \"trap-mode-clamp\" ]);\n });\n } else if (args.trapMode === \"js\") {\n stats.optimizeCount++;\n stats.optimizeTime += measure(() => {\n module.runPasses([ \"trap-mode-js\" ]);\n });\n } else if (args.trapMode !== \"allow\") {\n module.dispose();\n return callback(Error(\"Unsupported trap mode\"));\n }\n\n // Implicitly run costly non-LLVM optimizations on -O3 or -Oz\n // see: https://github.com/WebAssembly/binaryen/pull/1596\n if (optimizeLevel >= 3 || shrinkLevel >= 2) optimizeLevel = 4;\n\n module.setOptimizeLevel(optimizeLevel);\n module.setShrinkLevel(shrinkLevel);\n module.setDebugInfo(args.debug);\n\n var runPasses = [];\n if (args.runPasses) {\n if (typeof args.runPasses === \"string\") {\n args.runPasses = args.runPasses.split(\",\");\n }\n if (args.runPasses.length) {\n args.runPasses.forEach(pass => {\n if (runPasses.indexOf(pass) < 0)\n runPasses.push(pass);\n });\n }\n }\n\n // Optimize the module if requested\n if (optimizeLevel > 0 || shrinkLevel > 0) {\n stats.optimizeCount++;\n stats.optimizeTime += measure(() => {\n module.optimize();\n });\n }\n\n // Run additional passes if requested\n if (runPasses.length) {\n stats.optimizeCount++;\n stats.optimizeTime += measure(() => {\n module.runPasses(runPasses.map(pass => pass.trim()));\n });\n }\n\n // Prepare output\n if (!args.noEmit) {\n let hasStdout = false;\n let hasOutput = false;\n\n if (args.outFile != null) {\n if (/\\.was?t$/.test(args.outFile) && args.textFile == null) {\n args.textFile = args.outFile;\n } else if (/\\.js$/.test(args.outFile) && args.asmjsFile == null) {\n args.asmjsFile = args.outFile;\n } else if (args.binaryFile == null) {\n args.binaryFile = args.outFile;\n }\n }\n\n // Write binary\n if (args.binaryFile != null) {\n let sourceMapURL = args.sourceMap != null\n ? args.sourceMap.length\n ? args.sourceMap\n : path.basename(args.binaryFile) + \".map\"\n : null;\n\n let wasm;\n stats.emitCount++;\n stats.emitTime += measure(() => {\n wasm = module.toBinary(sourceMapURL)\n });\n\n if (args.binaryFile.length) {\n writeFile(args.binaryFile, wasm.output, baseDir);\n } else {\n writeStdout(wasm.output);\n hasStdout = true;\n }\n hasOutput = true;\n\n // Post-process source map\n if (wasm.sourceMap != null) {\n if (args.binaryFile.length) {\n let sourceMap = JSON.parse(wasm.sourceMap);\n sourceMap.sourceRoot = exports.sourceMapRoot;\n sourceMap.sources.forEach((name, index) => {\n let text = null;\n if (name.startsWith(exports.libraryPrefix)) {\n let stdName = name.substring(exports.libraryPrefix.length).replace(/\\.ts$/, \"\");\n if (exports.libraryFiles.hasOwnProperty(stdName)) {\n text = exports.libraryFiles[stdName];\n } else {\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\n text = readFile(name.substring(exports.libraryPrefix.length), customLibDirs[i]);\n if (text !== null) break;\n }\n }\n } else {\n text = readFile(name, baseDir);\n }\n if (text === null) {\n return callback(Error(\"Source file '\" + name + \"' not found.\"));\n }\n if (!sourceMap.sourceContents) sourceMap.sourceContents = [];\n sourceMap.sourceContents[index] = text;\n });\n writeFile(path.join(\n path.dirname(args.binaryFile),\n path.basename(sourceMapURL)\n ).replace(/^\\.\\//, \"\"), JSON.stringify(sourceMap), baseDir);\n } else {\n stderr.write(\"Skipped source map (stdout already occupied)\" + EOL);\n }\n }\n }\n\n // Write asm.js\n if (args.asmjsFile != null) {\n let asm;\n if (args.asmjsFile.length) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n asm = module.toAsmjs();\n });\n writeFile(args.asmjsFile, asm, baseDir);\n } else if (!hasStdout) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n asm = module.toAsmjs();\n });\n writeStdout(asm);\n hasStdout = true;\n }\n hasOutput = true;\n }\n\n // Write WebIDL\n if (args.idlFile != null) {\n let idl;\n if (args.idlFile.length) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n idl = assemblyscript.buildIDL(program);\n });\n writeFile(args.idlFile, idl, baseDir);\n } else if (!hasStdout) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n idl = assemblyscript.buildIDL(program);\n });\n writeStdout(idl);\n hasStdout = true;\n }\n hasOutput = true;\n }\n\n // Write TypeScript definition\n if (args.tsdFile != null) {\n let tsd;\n if (args.tsdFile.length) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n tsd = assemblyscript.buildTSD(program);\n });\n writeFile(args.tsdFile, tsd, baseDir);\n } else if (!hasStdout) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n tsd = assemblyscript.buildTSD(program);\n });\n writeStdout(tsd);\n hasStdout = true;\n }\n hasOutput = true;\n }\n\n // Write text (must be last)\n if (args.textFile != null || !hasOutput) {\n let wat;\n if (args.textFile && args.textFile.length) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n wat = module.toText();\n });\n writeFile(args.textFile, wat, baseDir);\n } else if (!hasStdout) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n wat = module.toText()\n });\n writeStdout(wat);\n }\n }\n }\n\n module.dispose();\n if (args.measure) {\n printStats(stats, stderr);\n }\n return callback(null);\n\n function readFileNode(filename, baseDir) {\n try {\n let text;\n stats.readCount++;\n stats.readTime += measure(() => {\n text = fs.readFileSync(path.join(baseDir, filename), { encoding: \"utf8\" });\n });\n return text;\n } catch (e) {\n return null;\n }\n }\n\n function writeFileNode(filename, contents, baseDir) {\n try {\n stats.writeCount++;\n stats.writeTime += measure(() => {\n mkdirp(path.join(baseDir, path.dirname(filename)));\n if (typeof contents === \"string\") {\n fs.writeFileSync(path.join(baseDir, filename), contents, { encoding: \"utf8\" } );\n } else {\n fs.writeFileSync(path.join(baseDir, filename), contents);\n }\n });\n return true;\n } catch (e) {\n return false;\n }\n }\n\n function listFilesNode(dirname, baseDir) {\n var files;\n try {\n stats.readTime += measure(() => {\n files = fs.readdirSync(path.join(baseDir, dirname)).filter(file => /^(?!.*\\.d\\.ts$).*\\.ts$/.test(file));\n });\n return files;\n } catch (e) {\n return [];\n }\n }\n\n function writeStdout(contents) {\n if (!writeStdout.used) {\n stats.writeCount++;\n writeStdout.used = true;\n }\n stats.writeTime += measure(() => {\n if (typeof contents === \"string\") {\n stdout.write(contents, { encoding: \"utf8\" });\n } else {\n stdout.write(contents);\n }\n });\n }\n}\n\nvar argumentSubstitutions = {\n \"-O\" : [ \"--optimize\" ],\n \"-Os\" : [ \"--optimize\", \"--shrinkLevel\", \"1\" ],\n \"-Oz\" : [ \"--optimize\", \"--shrinkLevel\", \"2\" ],\n \"-O0\" : [ \"--optimizeLevel\", \"0\", \"--shrinkLevel\", \"0\" ],\n \"-O0s\": [ \"--optimizeLevel\", \"0\", \"--shrinkLevel\", \"1\" ],\n \"-O0z\": [ \"--optimizeLevel\", \"0\", \"--shrinkLevel\", \"2\" ],\n \"-O1\" : [ \"--optimizeLevel\", \"1\", \"--shrinkLevel\", \"0\" ],\n \"-O1s\": [ \"--optimizeLevel\", \"1\", \"--shrinkLevel\", \"1\" ],\n \"-O1z\": [ \"--optimizeLevel\", \"1\", \"--shrinkLevel\", \"2\" ],\n \"-O2\" : [ \"--optimizeLevel\", \"2\", \"--shrinkLevel\", \"0\" ],\n \"-O2s\": [ \"--optimizeLevel\", \"2\", \"--shrinkLevel\", \"1\" ],\n \"-O2z\": [ \"--optimizeLevel\", \"2\", \"--shrinkLevel\", \"2\" ],\n \"-O3\" : [ \"--optimizeLevel\", \"3\", \"--shrinkLevel\", \"0\" ],\n \"-O3s\": [ \"--optimizeLevel\", \"3\", \"--shrinkLevel\", \"1\" ],\n \"-O3z\": [ \"--optimizeLevel\", \"3\", \"--shrinkLevel\", \"2\" ],\n};\n\n/** Checks diagnostics emitted so far for errors. */\nfunction checkDiagnostics(emitter, stderr) {\n var diagnostic;\n var hasErrors = false;\n while ((diagnostic = assemblyscript.nextDiagnostic(emitter)) != null) {\n if (stderr) {\n stderr.write(\n assemblyscript.formatDiagnostic(diagnostic, stderr.isTTY, true) +\n EOL + EOL\n );\n }\n if (assemblyscript.isError(diagnostic)) hasErrors = true;\n }\n return hasErrors;\n}\n\nexports.checkDiagnostics = checkDiagnostics;\n\n/** Creates an empty set of stats. */\nfunction createStats() {\n return {\n readTime: 0,\n readCount: 0,\n writeTime: 0,\n writeCount: 0,\n parseTime: 0,\n parseCount: 0,\n compileTime: 0,\n compileCount: 0,\n emitTime: 0,\n emitCount: 0,\n validateTime: 0,\n validateCount: 0,\n optimizeTime: 0,\n optimizeCount: 0\n };\n}\n\nexports.createStats = createStats;\n\nif (!process.hrtime) process.hrtime = require(\"browser-process-hrtime\");\n\n/** Measures the execution time of the specified function. */\nfunction measure(fn) {\n const start = process.hrtime();\n fn();\n const times = process.hrtime(start);\n return times[0] * 1e9 + times[1];\n}\n\nexports.measure = measure;\n\n/** Formats a high resolution time to a human readable string. */\nfunction formatTime(time) {\n return time ? (time / 1e6).toFixed(3) + \" ms\" : \"N/A\";\n}\n\nexports.formatTime = formatTime;\n\n/** Formats and prints out the contents of a set of stats. */\nfunction printStats(stats, output) {\n function format(time, count) {\n return formatTime(time);\n }\n (output || process.stdout).write([\n \"I/O Read : \" + format(stats.readTime, stats.readCount),\n \"I/O Write : \" + format(stats.writeTime, stats.writeCount),\n \"Parse : \" + format(stats.parseTime, stats.parseCount),\n \"Compile : \" + format(stats.compileTime, stats.compileCount),\n \"Emit : \" + format(stats.emitTime, stats.emitCount),\n \"Validate : \" + format(stats.validateTime, stats.validateCount),\n \"Optimize : \" + format(stats.optimizeTime, stats.optimizeCount)\n ].join(EOL) + EOL);\n}\n\nexports.printStats = printStats;\n\nvar allocBuffer = typeof global !== \"undefined\" && global.Buffer\n ? global.Buffer.allocUnsafe || function(len) { return new global.Buffer(len); }\n : function(len) { return new Uint8Array(len) };\n\n/** Creates a memory stream that can be used in place of stdout/stderr. */\nfunction createMemoryStream(fn) {\n var stream = [];\n stream.write = function(chunk) {\n if (fn) fn(chunk);\n if (typeof chunk === \"string\") {\n let buffer = allocBuffer(utf8.length(chunk));\n utf8.write(chunk, buffer, 0);\n chunk = buffer;\n }\n this.push(chunk);\n };\n stream.reset = function() {\n stream.length = 0;\n };\n stream.toBuffer = function() {\n var offset = 0, i = 0, k = this.length;\n while (i < k) offset += this[i++].length;\n var buffer = allocBuffer(offset);\n offset = i = 0;\n while (i < k) {\n buffer.set(this[i], offset);\n offset += this[i].length;\n ++i;\n }\n return buffer;\n };\n stream.toString = function() {\n var buffer = this.toBuffer();\n return utf8.read(buffer, 0, buffer.length);\n };\n return stream;\n}\n\nexports.createMemoryStream = createMemoryStream;\n\n/** Compatible TypeScript compiler options for syntax highlighting etc. */\nexports.tscOptions = {\n alwaysStrict: true,\n noImplicitAny: true,\n noImplicitReturns: true,\n noImplicitThis: true,\n noEmitOnError: true,\n strictNullChecks: true,\n experimentalDecorators: true,\n target: \"esnext\",\n module: \"commonjs\",\n noLib: true,\n types: [],\n allowJs: false\n};\n","\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n var len = 0,\r\n c = 0;\r\n for (var i = 0; i < string.length; ++i) {\r\n c = string.charCodeAt(i);\r\n if (c < 128)\r\n len += 1;\r\n else if (c < 2048)\r\n len += 2;\r\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n ++i;\r\n len += 4;\r\n } else\r\n len += 3;\r\n }\r\n return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null,\r\n chunk = [],\r\n i = 0, // char offset\r\n t; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128)\r\n chunk[i++] = t;\r\n else if (t > 191 && t < 224)\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n } else\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n var start = offset,\r\n c1, // character 1\r\n c2; // character 2\r\n for (var i = 0; i < string.length; ++i) {\r\n c1 = string.charCodeAt(i);\r\n if (c1 < 128) {\r\n buffer[offset++] = c1;\r\n } else if (c1 < 2048) {\r\n buffer[offset++] = c1 >> 6 | 192;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n ++i;\r\n buffer[offset++] = c1 >> 18 | 240;\r\n buffer[offset++] = c1 >> 12 & 63 | 128;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else {\r\n buffer[offset++] = c1 >> 12 | 224;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n }\r\n }\r\n return offset - start;\r\n};\r\n","var proc = typeof process !== \"undefined\" && process || {};\nvar isCI = proc.env && \"CI\" in proc.env; // doesn't work when bundled because 'process' is a mock\n\nfunction from(stream, base) {\n var colors = base || {};\n colors.supported = (stream && !!stream.isTTY) || isCI;\n colors.gray = text => colors.supported ? exports.GRAY + text + exports.RESET : text;\n colors.red = text => colors.supported ? exports.RED + text + exports.RESET : text;\n colors.green = text => colors.supported ? exports.GREEN + text + exports.RESET : text;\n colors.yellow = text => colors.supported ? exports.YELLOW + text + exports.RESET : text;\n colors.blue = text => colors.supported ? exports.BLUE + text + exports.RESET : text;\n colors.magenta = text => colors.supported ? exports.MAGENTA + text + exports.RESET : text;\n colors.cyan = text => colors.supported ? exports.CYAN + text + exports.RESET : text;\n colors.white = text => colors.supported ? exports.WHITE + text + exports.RESET : text;\n return colors;\n}\n\nexports.stdout = from(proc.stdout, exports);\nexports.stderr = from(proc.stderr);\nexports.from = from;\n\nexports.GRAY = \"\\u001b[90m\";\nexports.RED = \"\\u001b[91m\";\nexports.GREEN = \"\\u001b[92m\";\nexports.YELLOW = \"\\u001b[93m\";\nexports.BLUE = \"\\u001b[94m\";\nexports.MAGENTA = \"\\u001b[95m\";\nexports.CYAN = \"\\u001b[96m\";\nexports.WHITE = \"\\u001b[97m\";\nexports.RESET = \"\\u001b[0m\";\n","// type | meaning\n// -----|---------------\n// b | boolean\n// i | integer\n// f | float\n// s | string\n// I | integer array\n// F | float array\n// S | string array\n\n/** Parses the specified command line arguments according to the given configuration. */\nfunction parse(argv, config) {\n var options = {};\n var unknown = [];\n var arguments = [];\n var trailing = [];\n\n // make an alias map and initialize defaults\n var aliases = {};\n Object.keys(config).forEach(key => {\n var option = config[key];\n if (option.alias != null) {\n if (typeof option.alias === \"string\") aliases[option.alias] = key;\n else if (Array.isArray(option.alias)) option.alias.forEach(alias => aliases[alias] = key);\n }\n if (option.default != null) options[key] = option.default;\n });\n\n // iterate over argv\n for (var i = 0, k = (argv = argv.slice()).length; i < k; ++i) {\n let arg = argv[i];\n if (arg == \"--\") { ++i; break; }\n let match = /^(?:(\\-\\w)(?:=(.*))?|(\\-\\-\\w{2,})(?:=(.*))?)$/.exec(arg), option, key;\n if (match) {\n if (config[arg]) option = config[key = arg]; // exact\n else if (match[1] != null) { // alias\n option = config[key = aliases[match[1].substring(1)]];\n if (option && match[2] != null) argv[i--] = match[2];\n } else if (match[3] != null) { // full\n option = config[key = match[3].substring(2)];\n if (option && match[4] != null) argv[i--] = match[4];\n }\n } else {\n if (arg.charCodeAt(0) == 45) option = config[key = arg]; // exact\n else { arguments.push(arg); continue; } // argument\n }\n if (option) {\n if (option.type == null || option.type === \"b\") options[key] = true; // flag\n else {\n if (i + 1 < argv.length && argv[i + 1].charCodeAt(0) != 45) { // present\n switch (option.type) {\n case \"i\": options[key] = parseInt(argv[++i], 10); break;\n case \"I\": options[key] = (options[key] || []).concat(parseInt(argv[++i], 10)); break;\n case \"f\": options[key] = parseFloat(argv[++i]); break;\n case \"F\": options[key] = (options[key] || []).concat(parseFloat(argv[++i])); break;\n case \"s\": options[key] = String(argv[++i]); break;\n case \"S\": options[key] = (options[key] || []).concat(argv[++i].split(\",\")); break;\n default: unknown.push(arg); --i;\n }\n } else { // omitted\n switch (option.type) {\n case \"i\":\n case \"f\": options[key] = option.default || 0; break;\n case \"s\": options[key] = option.default || \"\"; break;\n case \"I\":\n case \"F\":\n case \"S\": options[key] = options.default || []; break;\n default: unknown.push(arg);\n }\n }\n }\n if (option.value) Object.keys(option.value).forEach(k => options[k] = option.value[k]);\n } else unknown.push(arg);\n }\n while (i < k) trailing.push(argv[i++]); // trailing\n\n return { options, unknown, arguments, trailing };\n}\n\nexports.parse = parse;\n\n/** Generates the help text for the specified configuration. */\nfunction help(config, options) {\n if (!options) options = {};\n var indent = options.indent || 2;\n var padding = options.padding || 24;\n var eol = options.eol || \"\\n\";\n var sb = [];\n Object.keys(config).forEach(key => {\n var option = config[key];\n if (option.description == null) return;\n var text = \"\";\n while (text.length < indent) text += \" \";\n text += \"--\" + key;\n if (option.alias) text += \", -\" + option.alias;\n while (text.length < padding) text += \" \";\n if (Array.isArray(option.description)) {\n sb.push(text + option.description[0] + option.description.slice(1).map(line => {\n for (let i = 0; i < padding; ++i) line = \" \" + line;\n return eol + line;\n }).join(\"\"));\n } else sb.push(text + option.description);\n });\n return sb.join(eol);\n}\n\nexports.help = help;\n","/*\nCopyright 2010 James Halliday (mail@substack.net)\n\nThis project is free software released under the MIT/X11 license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\nvar path = require(\"path\");\nvar fs = require(\"fs\");\nvar _0777 = parseInt(\"0777\", 8);\n\nmodule.exports = function mkdirp(p, opts, made) {\n if (!opts || typeof opts !== \"object\") {\n opts = { mode: opts };\n }\n var mode = opts.mode;\n if (mode === undefined) {\n mode = _0777 & (~process.umask());\n }\n if (!made) made = null;\n p = path.resolve(p);\n try {\n fs.mkdirSync(p, mode);\n made = made || p;\n } catch (err0) {\n switch (err0.code) {\n case \"ENOENT\":\n made = mkdirp(path.dirname(p), opts, made);\n mkdirp(p, opts, made);\n break;\n default:\n var stat;\n try {\n stat = fs.statSync(p);\n } catch (err1) {\n throw err0;\n }\n if (!stat.isDirectory()) throw err0;\n break;\n }\n }\n return made;\n};\n","if(typeof __WEBPACK_EXTERNAL_MODULE__10__ === 'undefined') {var e = new Error(\"Cannot find module 'assemblyscript'\"); e.code = 'MODULE_NOT_FOUND'; throw e;}\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__10__;","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 12;","module.exports = process.hrtime || hrtime\n\n// polyfil for window.performance.now\nvar performance = global.performance || {}\nvar performanceNow =\n performance.now ||\n performance.mozNow ||\n performance.msNow ||\n performance.oNow ||\n performance.webkitNow ||\n function(){ return (new Date()).getTime() }\n\n// generate timestamp or delta\n// see http://nodejs.org/api/process.html#process_process_hrtime\nfunction hrtime(previousTimestamp){\n var clocktime = performanceNow.call(performance)*1e-3\n var seconds = Math.floor(clocktime)\n var nanoseconds = Math.floor((clocktime%1)*1e9)\n if (previousTimestamp) {\n seconds = seconds - previousTimestamp[0]\n nanoseconds = nanoseconds - previousTimestamp[1]\n if (nanoseconds<0) {\n seconds--\n nanoseconds += 1e9\n }\n }\n return [seconds,nanoseconds]\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/assemblyscript.js b/dist/assemblyscript.js index 2f0662ff4f..9953a6802d 100644 --- a/dist/assemblyscript.js +++ b/dist/assemblyscript.js @@ -1,3 +1,3 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("binaryen")):"function"==typeof define&&define.amd?define(["binaryen"],t):"object"==typeof exports?exports.assemblyscript=t(require("binaryen")):e.assemblyscript=t(e.binaryen)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=15)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NONE=0]="NONE",e[e.IMPORT=1]="IMPORT",e[e.EXPORT=2]="EXPORT",e[e.DECLARE=4]="DECLARE",e[e.CONST=8]="CONST",e[e.LET=16]="LET",e[e.STATIC=32]="STATIC",e[e.READONLY=64]="READONLY",e[e.ABSTRACT=128]="ABSTRACT",e[e.PUBLIC=256]="PUBLIC",e[e.PRIVATE=512]="PRIVATE",e[e.PROTECTED=1024]="PROTECTED",e[e.GET=2048]="GET",e[e.SET=4096]="SET",e[e.DEFINITE_ASSIGNMENT=8192]="DEFINITE_ASSIGNMENT",e[e.AMBIENT=16384]="AMBIENT",e[e.GENERIC=32768]="GENERIC",e[e.GENERIC_CONTEXT=65536]="GENERIC_CONTEXT",e[e.INSTANCE=131072]="INSTANCE",e[e.CONSTRUCTOR=262144]="CONSTRUCTOR",e[e.ARROW=524288]="ARROW",e[e.MODULE_EXPORT=1048576]="MODULE_EXPORT",e[e.MODULE_IMPORT=2097152]="MODULE_IMPORT",e[e.RESOLVED=4194304]="RESOLVED",e[e.COMPILED=8388608]="COMPILED",e[e.INLINED=16777216]="INLINED",e[e.SCOPED=33554432]="SCOPED",e[e.TRAMPOLINE=67108864]="TRAMPOLINE",e[e.VIRTUAL=134217728]="VIRTUAL",e[e.MAIN=268435456]="MAIN",e[e.QUOTED=536870912]="QUOTED"}(t.CommonFlags||(t.CommonFlags={})),t.PATH_DELIMITER="/",t.PARENT_SUBST="..",t.GETTER_PREFIX="get:",t.SETTER_PREFIX="set:",t.INSTANCE_DELIMITER="#",t.STATIC_DELIMITER=".",t.INNER_DELIMITER="~",t.LIBRARY_SUBST="~lib",t.LIBRARY_PREFIX=t.LIBRARY_SUBST+t.PATH_DELIMITER,t.FILESPACE_PREFIX="file:"},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=r(10),a=r(2),s=r(10);function o(e){switch(e){case n.INFO:return"INFO";case n.WARNING:return"WARNING";case n.ERROR:return"ERROR";default:return assert(!1),""}}function c(e){switch(e){case n.INFO:return t.COLOR_BLUE;case n.WARNING:return t.COLOR_YELLOW;case n.ERROR:return t.COLOR_RED;default:return assert(!1),""}}t.DiagnosticCode=s.DiagnosticCode,t.diagnosticCodeToString=s.diagnosticCodeToString,function(e){e[e.INFO=0]="INFO",e[e.WARNING=1]="WARNING",e[e.ERROR=2]="ERROR"}(n=t.DiagnosticCategory||(t.DiagnosticCategory={})),t.diagnosticCategoryToString=o,t.COLOR_BLUE="",t.COLOR_YELLOW="",t.COLOR_RED="",t.COLOR_RESET="",t.diagnosticCategoryToColor=c;var l=function(){function e(e,t,r){this.range=null,this.code=e,this.category=t,this.message=r}return e.create=function(t,r,n,a,s){void 0===n&&(n=null),void 0===a&&(a=null),void 0===s&&(s=null);var o=i.diagnosticCodeToString(t);return null!=n&&(o=o.replace("{0}",n)),null!=a&&(o=o.replace("{1}",a)),null!=s&&(o=o.replace("{2}",s)),new e(t,r,o)},e.createInfo=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.INFO,r,i)},e.createWarning=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.WARNING,r,i)},e.createError=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.ERROR,r,i)},e.prototype.withRange=function(e){return this.range=e,this},e.prototype.toString=function(){return this.range?o(this.category)+" "+this.code.toString(10)+': "'+this.message+'" in '+this.range.source.normalizedPath+":"+this.range.line.toString(10)+":"+this.range.column.toString(10):o(this.category)+" "+this.code.toString(10)+": "+this.message},e}();function p(e,r){void 0===r&&(r=!1);for(var n=e.source.text,i=n.length,s=e.start,o=e.end;s>0&&!a.isLineBreak(n.charCodeAt(s-1));)s--;for(;o=0?c.substring(l+1):c,i.statements=new Array,i.range=new s.Range(i,0,r.length),i.text=r,i}return i(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==j.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==j.LIBRARY},enumerable:!0,configurable:!0}),t}(l);t.Source=J;var $=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.decorators=null,t.cachedProgramLevelInternalName=null,t.cachedFileLevelInternalName=null,t}return i(t,e),Object.defineProperty(t.prototype,"programLevelInternalName",{get:function(){return this.cachedProgramLevelInternalName||(this.cachedProgramLevelInternalName=Fe(this,!0)),this.cachedProgramLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fileLevelInternalName",{get:function(){return this.cachedFileLevelInternalName||(this.cachedFileLevelInternalName=Fe(this,!1)),this.cachedFileLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevel",{get:function(){var e=this.parent;return!!e&&(!(e.kind==o.VARIABLE&&!(e=e.parent))&&e.kind==o.SOURCE)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevelExport",{get:function(){var e=this.parent;return!(!e||e.kind==o.VARIABLE&&!(e=e.parent))&&(e.kind==o.NAMESPACEDECLARATION?this.is(a.CommonFlags.EXPORT)&&e.isTopLevelExport:e.kind==o.CLASSDECLARATION?this.is(a.CommonFlags.STATIC)&&e.isTopLevelExport:e.kind==o.SOURCE&&this.is(a.CommonFlags.EXPORT))},enumerable:!0,configurable:!0}),t.prototype.needsExplicitExport=function(e){return e.name.text!=e.externalName.text||this.range.source!=e.range.source||!this.isTopLevelExport},t}(Z);t.DeclarationStatement=$;var ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.INDEXSIGNATUREDECLARATION,t}return i(t,e),t}($);t.IndexSignatureDeclaration=ee;var te=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}($);t.VariableLikeDeclarationStatement=te;var re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.BLOCK,t}return i(t,e),t}(Z);t.BlockStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.BREAK,t}return i(t,e),t}(Z);t.BreakStatement=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.CLASSDECLARATION,t}return i(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}($);t.ClassDeclaration=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.CONTINUE,t}return i(t,e),t}(Z);t.ContinueStatement=ae;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.DO,t}return i(t,e),t}(Z);t.DoStatement=se;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EMPTY,t}return i(t,e),t}(Z);t.EmptyStatement=oe;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.ENUMDECLARATION,t}return i(t,e),t}($);t.EnumDeclaration=ce;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.ENUMVALUEDECLARATION,t}return i(t,e),t}($);t.EnumValueDeclaration=le;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPORTIMPORT,t}return i(t,e),t}(l);t.ExportImportStatement=pe;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPORTMEMBER,t}return i(t,e),t}(l);t.ExportMember=ue;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPORT,t}return i(t,e),t}(Z);t.ExportStatement=he;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPRESSION,t}return i(t,e),t}(Z);t.ExpressionStatement=de;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.FIELDDECLARATION,t.parameterIndex=-1,t}return i(t,e),t}(te);t.FieldDeclaration=_e;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.FOR,t}return i(t,e),t}(Z);t.ForStatement=me;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.FUNCTIONDECLARATION,t}return i(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}($);t.FunctionDeclaration=ge;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.IF,t}return i(t,e),t}(Z);t.IfStatement=ye;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.IMPORTDECLARATION,t}return i(t,e),t}($);t.ImportDeclaration=fe;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.IMPORT,t}return i(t,e),t}(Z);t.ImportStatement=Ee;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.INTERFACEDECLARATION,t}return i(t,e),t}(ie);t.InterfaceDeclaration=Te;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.METHODDECLARATION,t}return i(t,e),t}(ge);t.MethodDeclaration=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.NAMESPACEDECLARATION,t}return i(t,e),t}($);t.NamespaceDeclaration=ve;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.RETURN,t}return i(t,e),t}(Z);t.ReturnStatement=Ae;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.SWITCHCASE,t}return i(t,e),t}(l);t.SwitchCase=Ce;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.SWITCH,t}return i(t,e),t}(Z);t.SwitchStatement=Ne;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.THROW,t}return i(t,e),t}(Z);t.ThrowStatement=Oe;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.TRY,t}return i(t,e),t}(Z);t.TryStatement=Se;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.TYPEDECLARATION,t}return i(t,e),t}($);t.TypeDeclaration=Le;var ke=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.VARIABLEDECLARATION,t}return i(t,e),t}(te);t.VariableDeclaration=ke;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.VARIABLE,t}return i(t,e),t}(Z);t.VariableStatement=be;var Re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.VOID,t}return i(t,e),t}(Z);t.VoidStatement=Re;var xe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.WHILE,t}return i(t,e),t}(Z);function Fe(e,t){void 0===t&&(t=!1);var r=e.name.text,n=e.parent;return n&&(e.kind!=o.VARIABLEDECLARATION||n.kind!=o.VARIABLE||(n=n.parent))?n.kind==o.CLASSDECLARATION?Fe(n,t)+(e.is(a.CommonFlags.STATIC)?a.STATIC_DELIMITER:a.INSTANCE_DELIMITER)+r:n.kind==o.NAMESPACEDECLARATION||n.kind==o.ENUMDECLARATION?Fe(n,t)+a.STATIC_DELIMITER+r:t?r:e.range.source.internalPath+a.PATH_DELIMITER+r:r}function De(e){return e.endsWith(".ts")&&(e=e.substring(0,e.length-3)),e}function Be(e,t){for(var r=0,n=e.length;r=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o,c=r(0),l=r(1),p=r(7),u=r(3),h=r(5),d=r(11),_=function(){return function(){}}(),m=function(){return function(){}}(),g=function(){return function(){}}();function y(e,t){switch(assert(t.length),e){case u.DecoratorKind.OPERATOR:case u.DecoratorKind.OPERATOR_BINARY:switch(t.charCodeAt(0)){case 91:if("[]"==t)return o.INDEXED_GET;if("[]="==t)return o.INDEXED_SET;break;case 123:if("{}"==t)return o.UNCHECKED_INDEXED_GET;if("{}="==t)return o.UNCHECKED_INDEXED_SET;break;case 43:if("+"==t)return o.ADD;break;case 45:if("-"==t)return o.SUB;break;case 42:if("*"==t)return o.MUL;if("**"==t)return o.POW;break;case 47:if("/"==t)return o.DIV;break;case 37:if("%"==t)return o.REM;break;case 38:if("&"==t)return o.BITWISE_AND;break;case 124:if("|"==t)return o.BITWISE_OR;break;case 94:if("^"==t)return o.BITWISE_XOR;break;case 61:if("=="==t)return o.EQ;break;case 33:if("!="==t)return o.NE;break;case 62:if(">"==t)return o.GT;if(">="==t)return o.GE;if(">>"==t)return o.BITWISE_SHR;if(">>>"==t)return o.BITWISE_SHR_U;break;case 60:if("<"==t)return o.LT;if("<="==t)return o.LE;if("<<"==t)return o.BITWISE_SHL}break;case u.DecoratorKind.OPERATOR_PREFIX:switch(t.charCodeAt(0)){case 43:if("+"==t)return o.PLUS;if("++"==t)return o.PREFIX_INC;break;case 45:if("-"==t)return o.MINUS;if("--"==t)return o.PREFIX_DEC;break;case 33:if("!"==t)return o.NOT;break;case 126:if("~"==t)return o.BITWISE_NOT}break;case u.DecoratorKind.OPERATOR_POSTFIX:switch(t.charCodeAt(0)){case 43:if("++"==t)return o.POSTFIX_INC;break;case 45:if("--"==t)return o.POSTFIX_DEC}}return o.INVALID}!function(e){e[e.INVALID=0]="INVALID",e[e.INDEXED_GET=1]="INDEXED_GET",e[e.INDEXED_SET=2]="INDEXED_SET",e[e.UNCHECKED_INDEXED_GET=3]="UNCHECKED_INDEXED_GET",e[e.UNCHECKED_INDEXED_SET=4]="UNCHECKED_INDEXED_SET",e[e.ADD=5]="ADD",e[e.SUB=6]="SUB",e[e.MUL=7]="MUL",e[e.DIV=8]="DIV",e[e.REM=9]="REM",e[e.POW=10]="POW",e[e.BITWISE_AND=11]="BITWISE_AND",e[e.BITWISE_OR=12]="BITWISE_OR",e[e.BITWISE_XOR=13]="BITWISE_XOR",e[e.BITWISE_SHL=14]="BITWISE_SHL",e[e.BITWISE_SHR=15]="BITWISE_SHR",e[e.BITWISE_SHR_U=16]="BITWISE_SHR_U",e[e.EQ=17]="EQ",e[e.NE=18]="NE",e[e.GT=19]="GT",e[e.GE=20]="GE",e[e.LT=21]="LT",e[e.LE=22]="LE",e[e.PLUS=23]="PLUS",e[e.MINUS=24]="MINUS",e[e.NOT=25]="NOT",e[e.BITWISE_NOT=26]="BITWISE_NOT",e[e.PREFIX_INC=27]="PREFIX_INC",e[e.PREFIX_DEC=28]="PREFIX_DEC",e[e.POSTFIX_INC=29]="POSTFIX_INC",e[e.POSTFIX_DEC=30]="POSTFIX_DEC"}(o=t.OperatorKind||(t.OperatorKind={}));var f,E,T=new Map,I=function(e){function t(t){void 0===t&&(t=null);var r=e.call(this,t)||this;return r.diagnosticsOffset=0,r.elementsLookup=new Map,r.instancesLookup=new Map,r.typesLookup=T,r.typeAliases=new Map,r.fileLevelExports=new Map,r.moduleLevelExports=new Map,r.basicClasses=new Map,r.arrayBufferInstance=null,r.arrayPrototype=null,r.stringInstance=null,r.mainFunction=null,r.abortInstance=null,r.memoryAllocateInstance=null,r.hasGC=!1,r.gcAllocateInstance=null,r.gcLinkInstance=null,r.gcMarkInstance=null,r.gcHeaderSize=0,r.gcHookOffset=0,r.resolver=new d.Resolver(r),r.sources=[],r}return i(t,e),t.prototype.getSource=function(e){for(var t=this.sources,r=0,n=t.length;r=0),assert(null!=e.type),e.type.toNativeType()){case 1:t=this.tempI32s||(this.tempI32s=[]);break;case 2:t=this.tempI64s||(this.tempI64s=[]);break;case 3:t=this.tempF32s||(this.tempF32s=[]);break;case 4:t=this.tempF64s||(this.tempF64s=[]);break;default:throw new Error("concrete type expected")}assert(e.index>=0),t.push(e)}},t.prototype.getAndFreeTempLocal=function(e,t){var r,n;switch(e.toNativeType()){case 1:r=this.tempI32s||(this.tempI32s=[]);break;case 2:r=this.tempI64s||(this.tempI64s=[]);break;case 3:r=this.tempF32s||(this.tempF32s=[]);break;case 4:r=this.tempF64s||(this.tempF64s=[]);break;default:throw new Error("concrete type expected")}return r.length?(n=r[r.length-1]).type=e:(n=this.addLocal(e),r.push(n)),e.is(36)&&this.flow.setLocalWrapped(n.index,t),n},t.prototype.enterBreakContext=function(){var e=this.nextBreakId++;return this.breakStack?this.breakStack.push(e):this.breakStack=[e],this.breakContext=e.toString(10)},t.prototype.leaveBreakContext=function(){assert(null!=this.breakStack);var e=this.breakStack.length;assert(e>0),this.breakStack.pop(),e>1?this.breakContext=this.breakStack[e-2].toString(10):(this.breakContext=null,this.breakStack=null)},t.prototype.finalize=function(e,t){if(this.ref=t,assert(!this.breakStack||!this.breakStack.length),this.breakStack=null,this.breakContext=null,this.tempI32s=this.tempI64s=this.tempF32s=this.tempF64s=null,this.program.options.sourceMap)for(var r=this.debugLocations,n=0,i=r.length;n=r.length)return!1;t=r[n],e-=64*(n+1)}return i64_ne(i64_and(t,i64_shl(i64_one,i64_new(e))),i64_zero)},e.prototype.setLocalWrapped=function(e,t){var r,n=-1;if(e<64){if(e<0)return;r=this.wrappedLocals}else{var i=this.wrappedLocalsExt;for(n=(e-64)/64|0,i||(this.wrappedLocalsExt=i=new Array(n+1),i.length=0);i.length<=n;)i.push(i64_new(0));r=i[n],e-=64*(n+1)}r=t?i64_or(r,i64_shl(i64_one,i64_new(e))):i64_and(r,i64_not(i64_shl(i64_one,i64_new(e)))),n>=0?this.wrappedLocalsExt[n]=r:this.wrappedLocals=r},e.prototype.inherit=function(e){this.flags|=2047&e.flags,this.wrappedLocals=e.wrappedLocals,this.wrappedLocalsExt=e.wrappedLocalsExt},e.prototype.inheritConditional=function(e){e.is(1)&&this.set(64),e.is(4)&&this.set(128),e.is(8)&&e.breakLabel==this.breakLabel&&this.set(256),e.is(16)&&e.continueLabel==this.continueLabel&&this.set(512),e.is(32)&&this.set(1024)},e.prototype.inheritMutual=function(e,t){this.flags|=e.flags&t.flags&63,this.flags|=1984&e.flags,this.flags|=1984&t.flags,this.wrappedLocals=i64_and(e.wrappedLocals,t.wrappedLocals);var r=e.wrappedLocalsExt,n=t.wrappedLocalsExt;if(null!=r&&null!=n){var i=this.wrappedLocalsExt,a=min(r.length,n.length);if(a){if(i)for(;i.lengths):this.canOverflow(h.getBinaryLeft(e),t)&&!(h.getExpressionId(r=h.getBinaryRight(e))==h.ExpressionId.Const&&h.getConstValueI32(r)>=s);case h.BinaryOp.DivU32:case h.BinaryOp.RemI32:case h.BinaryOp.RemU32:return this.canOverflow(h.getBinaryLeft(e),t)||this.canOverflow(h.getBinaryRight(e),t)}break;case h.ExpressionId.Unary:switch(h.getUnaryOp(e)){case h.UnaryOp.EqzI32:case h.UnaryOp.EqzI64:return!1;case h.UnaryOp.ClzI32:case h.UnaryOp.CtzI32:case h.UnaryOp.PopcntI32:return t.size<7}break;case h.ExpressionId.Const:var o=0;switch(h.getExpressionType(e)){case 1:o=h.getConstValueI32(e);break;case 2:o=h.getConstValueI64Low(e);break;case 3:o=i32(h.getConstValueF32(e));break;case 4:o=i32(h.getConstValueF64(e));break;default:assert(!1)}switch(t.kind){case 0:return oi8.MAX_VALUE;case 1:return oi16.MAX_VALUE;case 5:return o<0||o>u8.MAX_VALUE;case 6:return o<0||o>u16.MAX_VALUE;case 10:return 0!=(-2&o)}break;case h.ExpressionId.Load:var c=void 0;switch(h.getLoadBytes(e)){case 1:c=h.isLoadSigned(e)?p.Type.i8:p.Type.u8;break;case 2:c=h.isLoadSigned(e)?p.Type.i16:p.Type.u16;break;default:c=h.isLoadSigned(e)?p.Type.i32:p.Type.u32}return V(c,t);case h.ExpressionId.Block:if(!h.getBlockName(e)){var l=assert(h.getBlockChildCount(e)),u=h.getBlockChild(e,l-1);return this.canOverflow(u,t)}break;case h.ExpressionId.If:return this.canOverflow(h.getIfTrue(e),t)||this.canOverflow(assert(h.getIfFalse(e)),t);case h.ExpressionId.Select:return this.canOverflow(h.getSelectThen(e),t)||this.canOverflow(h.getSelectElse(e),t);case h.ExpressionId.Call:var d=this.currentFunction.program,_=assert(d.instancesLookup.get(assert(h.getCallTarget(e))));assert(_.kind==f.FUNCTION);var m=_.signature.returnType;return!_.flow.is(2)||V(m,t);case h.ExpressionId.Unreachable:return!1}return!0},e.prototype.finalize=function(){assert(null==this.parent),this.continueLabel=null,this.breakLabel=null,this.returnLabel=null,this.contextualTypeArguments=null},e}();function V(e,t){return!e.is(4)||e.size>t.size||e.is(1)!=t.is(1)}t.Flow=z},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=r(9);!function(e){e[e.None=0]="None",e[e.I32=1]="I32",e[e.I64=2]="I64",e[e.F32=3]="F32",e[e.F64=4]="F64",e[e.Unreachable=5]="Unreachable",e[e.Auto=-1]="Auto"}(t.NativeType||(t.NativeType={})),function(e){e[e.Invalid=_BinaryenInvalidId()]="Invalid",e[e.Block=_BinaryenBlockId()]="Block",e[e.If=_BinaryenIfId()]="If",e[e.Loop=_BinaryenLoopId()]="Loop",e[e.Break=_BinaryenBreakId()]="Break",e[e.Switch=_BinaryenSwitchId()]="Switch",e[e.Call=_BinaryenCallId()]="Call",e[e.CallIndirect=_BinaryenCallIndirectId()]="CallIndirect",e[e.GetLocal=_BinaryenGetLocalId()]="GetLocal",e[e.SetLocal=_BinaryenSetLocalId()]="SetLocal",e[e.GetGlobal=_BinaryenGetGlobalId()]="GetGlobal",e[e.SetGlobal=_BinaryenSetGlobalId()]="SetGlobal",e[e.Load=_BinaryenLoadId()]="Load",e[e.Store=_BinaryenStoreId()]="Store",e[e.Const=_BinaryenConstId()]="Const",e[e.Unary=_BinaryenUnaryId()]="Unary",e[e.Binary=_BinaryenBinaryId()]="Binary",e[e.Select=_BinaryenSelectId()]="Select",e[e.Drop=_BinaryenDropId()]="Drop",e[e.Return=_BinaryenReturnId()]="Return",e[e.Host=_BinaryenHostId()]="Host",e[e.Nop=_BinaryenNopId()]="Nop",e[e.Unreachable=_BinaryenUnreachableId()]="Unreachable",e[e.AtomicCmpxchg=_BinaryenAtomicCmpxchgId()]="AtomicCmpxchg",e[e.AtomicRMW=_BinaryenAtomicRMWId()]="AtomicRMW",e[e.AtomicWait=_BinaryenAtomicWaitId()]="AtomicWait",e[e.AtomicWake=_BinaryenAtomicWakeId()]="AtomicWake"}(n=t.ExpressionId||(t.ExpressionId={})),function(e){e[e.ClzI32=_BinaryenClzInt32()]="ClzI32",e[e.CtzI32=_BinaryenCtzInt32()]="CtzI32",e[e.PopcntI32=_BinaryenPopcntInt32()]="PopcntI32",e[e.NegF32=_BinaryenNegFloat32()]="NegF32",e[e.AbsF32=_BinaryenAbsFloat32()]="AbsF32",e[e.CeilF32=_BinaryenCeilFloat32()]="CeilF32",e[e.FloorF32=_BinaryenFloorFloat32()]="FloorF32",e[e.TruncF32=_BinaryenTruncFloat32()]="TruncF32",e[e.NearestF32=_BinaryenNearestFloat32()]="NearestF32",e[e.SqrtF32=_BinaryenSqrtFloat32()]="SqrtF32",e[e.EqzI32=_BinaryenEqZInt32()]="EqzI32",e[e.ClzI64=_BinaryenClzInt64()]="ClzI64",e[e.CtzI64=_BinaryenCtzInt64()]="CtzI64",e[e.PopcntI64=_BinaryenPopcntInt64()]="PopcntI64",e[e.NegF64=_BinaryenNegFloat64()]="NegF64",e[e.AbsF64=_BinaryenAbsFloat64()]="AbsF64",e[e.CeilF64=_BinaryenCeilFloat64()]="CeilF64",e[e.FloorF64=_BinaryenFloorFloat64()]="FloorF64",e[e.TruncF64=_BinaryenTruncFloat64()]="TruncF64",e[e.NearestF64=_BinaryenNearestFloat64()]="NearestF64",e[e.SqrtF64=_BinaryenSqrtFloat64()]="SqrtF64",e[e.EqzI64=_BinaryenEqZInt64()]="EqzI64",e[e.ExtendI32=_BinaryenExtendSInt32()]="ExtendI32",e[e.ExtendU32=_BinaryenExtendUInt32()]="ExtendU32",e[e.WrapI64=_BinaryenWrapInt64()]="WrapI64",e[e.TruncF32ToI32=_BinaryenTruncSFloat32ToInt32()]="TruncF32ToI32",e[e.TruncF32ToI64=_BinaryenTruncSFloat32ToInt64()]="TruncF32ToI64",e[e.TruncF32ToU32=_BinaryenTruncUFloat32ToInt32()]="TruncF32ToU32",e[e.TruncF32ToU64=_BinaryenTruncUFloat32ToInt64()]="TruncF32ToU64",e[e.TruncF64ToI32=_BinaryenTruncSFloat64ToInt32()]="TruncF64ToI32",e[e.TruncF64ToI64=_BinaryenTruncSFloat64ToInt64()]="TruncF64ToI64",e[e.TruncF64ToU32=_BinaryenTruncUFloat64ToInt32()]="TruncF64ToU32",e[e.TruncF64ToU64=_BinaryenTruncUFloat64ToInt64()]="TruncF64ToU64",e[e.ReinterpretF32=_BinaryenReinterpretFloat32()]="ReinterpretF32",e[e.ReinterpretF64=_BinaryenReinterpretFloat64()]="ReinterpretF64",e[e.ConvertI32ToF32=_BinaryenConvertSInt32ToFloat32()]="ConvertI32ToF32",e[e.ConvertI32ToF64=_BinaryenConvertSInt32ToFloat64()]="ConvertI32ToF64",e[e.ConvertU32ToF32=_BinaryenConvertUInt32ToFloat32()]="ConvertU32ToF32",e[e.ConvertU32ToF64=_BinaryenConvertUInt32ToFloat64()]="ConvertU32ToF64",e[e.ConvertI64ToF32=_BinaryenConvertSInt64ToFloat32()]="ConvertI64ToF32",e[e.ConvertI64ToF64=_BinaryenConvertSInt64ToFloat64()]="ConvertI64ToF64",e[e.ConvertU64ToF32=_BinaryenConvertUInt64ToFloat32()]="ConvertU64ToF32",e[e.ConvertU64ToF64=_BinaryenConvertUInt64ToFloat64()]="ConvertU64ToF64",e[e.PromoteF32=_BinaryenPromoteFloat32()]="PromoteF32",e[e.DemoteF64=_BinaryenDemoteFloat64()]="DemoteF64",e[e.ReinterpretI32=_BinaryenReinterpretInt32()]="ReinterpretI32",e[e.ReinterpretI64=_BinaryenReinterpretInt64()]="ReinterpretI64",e[e.ExtendI8ToI32=_BinaryenExtendS8Int32()]="ExtendI8ToI32",e[e.ExtendI16ToI32=_BinaryenExtendS16Int32()]="ExtendI16ToI32",e[e.ExtendI8ToI64=_BinaryenExtendS8Int64()]="ExtendI8ToI64",e[e.ExtendI16ToI64=_BinaryenExtendS16Int64()]="ExtendI16ToI64",e[e.ExtendI32ToI64=_BinaryenExtendS32Int64()]="ExtendI32ToI64"}(t.UnaryOp||(t.UnaryOp={})),function(e){e[e.AddI32=_BinaryenAddInt32()]="AddI32",e[e.SubI32=_BinaryenSubInt32()]="SubI32",e[e.MulI32=_BinaryenMulInt32()]="MulI32",e[e.DivI32=_BinaryenDivSInt32()]="DivI32",e[e.DivU32=_BinaryenDivUInt32()]="DivU32",e[e.RemI32=_BinaryenRemSInt32()]="RemI32",e[e.RemU32=_BinaryenRemUInt32()]="RemU32",e[e.AndI32=_BinaryenAndInt32()]="AndI32",e[e.OrI32=_BinaryenOrInt32()]="OrI32",e[e.XorI32=_BinaryenXorInt32()]="XorI32",e[e.ShlI32=_BinaryenShlInt32()]="ShlI32",e[e.ShrU32=_BinaryenShrUInt32()]="ShrU32",e[e.ShrI32=_BinaryenShrSInt32()]="ShrI32",e[e.RotlI32=_BinaryenRotLInt32()]="RotlI32",e[e.RotrI32=_BinaryenRotRInt32()]="RotrI32",e[e.EqI32=_BinaryenEqInt32()]="EqI32",e[e.NeI32=_BinaryenNeInt32()]="NeI32",e[e.LtI32=_BinaryenLtSInt32()]="LtI32",e[e.LtU32=_BinaryenLtUInt32()]="LtU32",e[e.LeI32=_BinaryenLeSInt32()]="LeI32",e[e.LeU32=_BinaryenLeUInt32()]="LeU32",e[e.GtI32=_BinaryenGtSInt32()]="GtI32",e[e.GtU32=_BinaryenGtUInt32()]="GtU32",e[e.GeI32=_BinaryenGeSInt32()]="GeI32",e[e.GeU32=_BinaryenGeUInt32()]="GeU32",e[e.AddI64=_BinaryenAddInt64()]="AddI64",e[e.SubI64=_BinaryenSubInt64()]="SubI64",e[e.MulI64=_BinaryenMulInt64()]="MulI64",e[e.DivI64=_BinaryenDivSInt64()]="DivI64",e[e.DivU64=_BinaryenDivUInt64()]="DivU64",e[e.RemI64=_BinaryenRemSInt64()]="RemI64",e[e.RemU64=_BinaryenRemUInt64()]="RemU64",e[e.AndI64=_BinaryenAndInt64()]="AndI64",e[e.OrI64=_BinaryenOrInt64()]="OrI64",e[e.XorI64=_BinaryenXorInt64()]="XorI64",e[e.ShlI64=_BinaryenShlInt64()]="ShlI64",e[e.ShrU64=_BinaryenShrUInt64()]="ShrU64",e[e.ShrI64=_BinaryenShrSInt64()]="ShrI64",e[e.RotlI64=_BinaryenRotLInt64()]="RotlI64",e[e.RotrI64=_BinaryenRotRInt64()]="RotrI64",e[e.EqI64=_BinaryenEqInt64()]="EqI64",e[e.NeI64=_BinaryenNeInt64()]="NeI64",e[e.LtI64=_BinaryenLtSInt64()]="LtI64",e[e.LtU64=_BinaryenLtUInt64()]="LtU64",e[e.LeI64=_BinaryenLeSInt64()]="LeI64",e[e.LeU64=_BinaryenLeUInt64()]="LeU64",e[e.GtI64=_BinaryenGtSInt64()]="GtI64",e[e.GtU64=_BinaryenGtUInt64()]="GtU64",e[e.GeI64=_BinaryenGeSInt64()]="GeI64",e[e.GeU64=_BinaryenGeUInt64()]="GeU64",e[e.AddF32=_BinaryenAddFloat32()]="AddF32",e[e.SubF32=_BinaryenSubFloat32()]="SubF32",e[e.MulF32=_BinaryenMulFloat32()]="MulF32",e[e.DivF32=_BinaryenDivFloat32()]="DivF32",e[e.CopysignF32=_BinaryenCopySignFloat32()]="CopysignF32",e[e.MinF32=_BinaryenMinFloat32()]="MinF32",e[e.MaxF32=_BinaryenMaxFloat32()]="MaxF32",e[e.EqF32=_BinaryenEqFloat32()]="EqF32",e[e.NeF32=_BinaryenNeFloat32()]="NeF32",e[e.LtF32=_BinaryenLtFloat32()]="LtF32",e[e.LeF32=_BinaryenLeFloat32()]="LeF32",e[e.GtF32=_BinaryenGtFloat32()]="GtF32",e[e.GeF32=_BinaryenGeFloat32()]="GeF32",e[e.AddF64=_BinaryenAddFloat64()]="AddF64",e[e.SubF64=_BinaryenSubFloat64()]="SubF64",e[e.MulF64=_BinaryenMulFloat64()]="MulF64",e[e.DivF64=_BinaryenDivFloat64()]="DivF64",e[e.CopysignF64=_BinaryenCopySignFloat64()]="CopysignF64",e[e.MinF64=_BinaryenMinFloat64()]="MinF64",e[e.MaxF64=_BinaryenMaxFloat64()]="MaxF64",e[e.EqF64=_BinaryenEqFloat64()]="EqF64",e[e.NeF64=_BinaryenNeFloat64()]="NeF64",e[e.LtF64=_BinaryenLtFloat64()]="LtF64",e[e.LeF64=_BinaryenLeFloat64()]="LeF64",e[e.GtF64=_BinaryenGtFloat64()]="GtF64",e[e.GeF64=_BinaryenGeFloat64()]="GeF64"}(t.BinaryOp||(t.BinaryOp={})),function(e){e[e.CurrentMemory=_BinaryenCurrentMemory()]="CurrentMemory",e[e.GrowMemory=_BinaryenGrowMemory()]="GrowMemory"}(t.HostOp||(t.HostOp={})),function(e){e[e.Add=_BinaryenAtomicRMWAdd()]="Add",e[e.Sub=_BinaryenAtomicRMWSub()]="Sub",e[e.And=_BinaryenAtomicRMWAnd()]="And",e[e.Or=_BinaryenAtomicRMWOr()]="Or",e[e.Xor=_BinaryenAtomicRMWXor()]="Xor",e[e.Xchg=_BinaryenAtomicRMWXchg()]="Xchg"}(t.AtomicRMWOp||(t.AtomicRMWOp={}));var a=function(){function e(){}return e.create=function(t,r){var n=new e;return n.buffer=t,n.offset=r,n},e}();t.MemorySegment=a;var s=function(){function e(){this.cachedTemporaryName=0,this.hasTemporaryFunction=!1,this.cachedPrecomputeName=0,this.cachedPrecomputeNames=0}return e.create=function(){var t=new e;return t.ref=_BinaryenModuleCreate(),t.cachedByValue=memory.allocate(16),t},e.createFrom=function(t){var r=c(t);try{var n=new e;return n.ref=_BinaryenModuleRead(r,t.length),n.cachedByValue=memory.allocate(24),n}finally{memory.free(changetype(r))}},e.prototype.addFunctionType=function(e,t,r){var n=u(e),i=l(r);try{return _BinaryenAddFunctionType(this.ref,n,t,i,r?r.length:0)}finally{memory.free(i),memory.free(n)}},e.prototype.getFunctionTypeBySignature=function(e,t){var r=l(t);try{return _BinaryenGetFunctionTypeBySignature(this.ref,e,r,t?t.length:0)}finally{memory.free(r)}},e.prototype.removeFunctionType=function(e){var t=u(e);try{_BinaryenRemoveFunctionType(this.ref,t)}finally{memory.free(t)}},e.prototype.createI32=function(e){var t=this.cachedByValue;return _BinaryenLiteralInt32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createI64=function(e,t){void 0===t&&(t=0);var r=this.cachedByValue;return _BinaryenLiteralInt64(r,e,t),_BinaryenConst(this.ref,r)},e.prototype.createF32=function(e){var t=this.cachedByValue;return _BinaryenLiteralFloat32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createF64=function(e){var t=this.cachedByValue;return _BinaryenLiteralFloat64(t,e),_BinaryenConst(this.ref,t)},e.prototype.createUnary=function(e,t){return _BinaryenUnary(this.ref,e,t)},e.prototype.createBinary=function(e,t,r){return _BinaryenBinary(this.ref,e,t,r)},e.prototype.createHost=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=null);var n=u(t),i=p(r);try{return _BinaryenHost(this.ref,e,n,i,r?r.length:0)}finally{memory.free(i),memory.free(n)}},e.prototype.createGetLocal=function(e,t){return _BinaryenGetLocal(this.ref,e,t)},e.prototype.createTeeLocal=function(e,t){return _BinaryenTeeLocal(this.ref,e,t)},e.prototype.createGetGlobal=function(e,t){var r=u(e);try{return _BinaryenGetGlobal(this.ref,r,t)}finally{memory.free(r)}},e.prototype.createLoad=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenLoad(this.ref,e,t?1:0,i,e,n,r)},e.prototype.createStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenStore(this.ref,e,i,e,t,r,n)},e.prototype.createAtomicLoad=function(e,t,r,n){return void 0===n&&(n=0),_BinaryenAtomicLoad(this.ref,e,n,r,t)},e.prototype.createAtomicStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenAtomicStore(this.ref,e,i,t,r,n)},e.prototype.createAtomicRMW=function(e,t,r,n,i,a){return _BinaryenAtomicRMW(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicCmpxchg=function(e,t,r,n,i,a){return _BinaryenAtomicCmpxchg(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicWait=function(e,t,r,n){return _BinaryenAtomicWait(this.ref,e,t,r,n)},e.prototype.createAtomicWake=function(e,t){return _BinaryenAtomicWake(this.ref,e,t)},e.prototype.createSetLocal=function(e,t){return _BinaryenSetLocal(this.ref,e,t)},e.prototype.createSetGlobal=function(e,t){var r=u(e);try{return _BinaryenSetGlobal(this.ref,r,t)}finally{memory.free(r)}},e.prototype.createBlock=function(e,t,r){void 0===r&&(r=0);var n=u(e),i=p(t);try{return _BinaryenBlock(this.ref,n,i,t.length,r)}finally{memory.free(i),memory.free(n)}},e.prototype.createBreak=function(e,t,r){void 0===t&&(t=0),void 0===r&&(r=0);var n=u(e);try{return _BinaryenBreak(this.ref,n,t,r)}finally{memory.free(n)}},e.prototype.createDrop=function(e){return _BinaryenDrop(this.ref,e)},e.prototype.createLoop=function(e,t){var r=u(e);try{return _BinaryenLoop(this.ref,r,t)}finally{memory.free(r)}},e.prototype.createIf=function(e,t,r){return void 0===r&&(r=0),_BinaryenIf(this.ref,e,t,r)},e.prototype.createNop=function(){return _BinaryenNop(this.ref)},e.prototype.createReturn=function(e){return void 0===e&&(e=0),_BinaryenReturn(this.ref,e)},e.prototype.createSelect=function(e,t,r){return _BinaryenSelect(this.ref,r,e,t)},e.prototype.createSwitch=function(e,t,r,n){void 0===n&&(n=0);for(var i=e.length,a=new Array(i),s=0;s=0;--s)memory.free(a[s])}},e.prototype.createCall=function(e,t,r){var n=u(e),i=p(t);try{return _BinaryenCall(this.ref,n,i,t&&t.length||0,r)}finally{memory.free(i),memory.free(n)}},e.prototype.createCallIndirect=function(e,t,r){var n=p(t),i=u(r);try{return _BinaryenCallIndirect(this.ref,e,n,t&&t.length||0,i)}finally{memory.free(i),memory.free(n)}},e.prototype.createUnreachable=function(){return _BinaryenUnreachable(this.ref)},e.prototype.addGlobal=function(e,t,r,n){var i=u(e);try{return _BinaryenAddGlobal(this.ref,i,t,r?1:0,n)}finally{memory.free(i)}},e.prototype.removeGlobal=function(e){var t=u(e);try{_BinaryenRemoveGlobal(this.ref,t)}finally{memory.free(t)}},e.prototype.addFunction=function(e,t,r,n){var i=u(e),a=l(r);try{return _BinaryenAddFunction(this.ref,i,t,a,r?r.length:0,n)}finally{memory.free(a),memory.free(i)}},e.prototype.removeFunction=function(e){var t=u(e);try{_BinaryenRemoveFunction(this.ref,t)}finally{memory.free(t)}},e.prototype.addTemporaryFunction=function(e,t,r){this.hasTemporaryFunction=assert(!this.hasTemporaryFunction);var n=this.cachedTemporaryName;n||(this.cachedTemporaryName=n=u(""));var i=l(t);try{var a=_BinaryenAddFunctionType(this.ref,n,e,i,t?t.length:0);return _BinaryenAddFunction(this.ref,n,a,0,0,r)}finally{memory.free(i)}},e.prototype.removeTemporaryFunction=function(){this.hasTemporaryFunction=!assert(this.hasTemporaryFunction);var e=assert(this.cachedTemporaryName);_BinaryenRemoveFunction(this.ref,e),_BinaryenRemoveFunctionType(this.ref,e)},e.prototype.addFunctionExport=function(e,t){var r=u(e),n=u(t);try{return _BinaryenAddFunctionExport(this.ref,r,n)}finally{memory.free(n),memory.free(r)}},e.prototype.addTableExport=function(e,t){var r=u(e),n=u(t);try{return _BinaryenAddTableExport(this.ref,r,n)}finally{memory.free(n),memory.free(r)}},e.prototype.addMemoryExport=function(e,t){var r=u(e),n=u(t);try{return _BinaryenAddMemoryExport(this.ref,r,n)}finally{memory.free(n),memory.free(r)}},e.prototype.addGlobalExport=function(e,t){var r=u(e),n=u(t);try{return _BinaryenAddGlobalExport(this.ref,r,n)}finally{memory.free(n),memory.free(r)}},e.prototype.removeExport=function(e){var t=u(e);try{_BinaryenRemoveExport(this.ref,t)}finally{memory.free(t)}},e.prototype.addFunctionImport=function(e,t,r,n){var i=u(e),a=u(t),s=u(r);try{return _BinaryenAddFunctionImport(this.ref,i,a,s,n)}finally{memory.free(s),memory.free(a),memory.free(i)}},e.prototype.addTableImport=function(e,t,r){var n=u(e),i=u(t),a=u(r);try{return _BinaryenAddTableImport(this.ref,n,i,a)}finally{memory.free(a),memory.free(i),memory.free(n)}},e.prototype.addMemoryImport=function(e,t,r){var n=u(e),i=u(t),a=u(r);try{return _BinaryenAddMemoryImport(this.ref,n,i,a)}finally{memory.free(a),memory.free(i),memory.free(n)}},e.prototype.addGlobalImport=function(e,t,r,n){var i=u(e),a=u(t),s=u(r);try{return _BinaryenAddGlobalImport(this.ref,i,a,s,n)}finally{memory.free(s),memory.free(a),memory.free(i)}},e.prototype.setMemory=function(e,t,r,n,a){void 0===a&&(a=null);for(var s=u(a),o=r.length,p=new Array(o),h=new Array(o),d=new Array(o),_=0;_=0;--_)memory.free(p[_]);memory.free(s)}},e.prototype.setFunctionTable=function(e,t,r){for(var n=r.length,i=new Array(n),a=0;a=0;--a)memory.free(i[a])}},e.prototype.setStart=function(e){_BinaryenSetStart(this.ref,e)},e.prototype.getOptimizeLevel=function(){return _BinaryenGetOptimizeLevel()},e.prototype.setOptimizeLevel=function(e){void 0===e&&(e=2),_BinaryenSetOptimizeLevel(e)},e.prototype.getShrinkLevel=function(){return _BinaryenGetShrinkLevel()},e.prototype.setShrinkLevel=function(e){void 0===e&&(e=1),_BinaryenSetShrinkLevel(e)},e.prototype.setDebugInfo=function(e){void 0===e&&(e=!1),_BinaryenSetDebugInfo(e)},e.prototype.optimize=function(e){void 0===e&&(e=0),e?_BinaryenFunctionOptimize(e,this.ref):_BinaryenModuleOptimize(this.ref)},e.prototype.runPasses=function(e,t){void 0===t&&(t=0);for(var r=e.length,n=new Array(r),i=0;i=0;--i)memory.free(n[i])}},e.prototype.precomputeExpression=function(e){var t=_BinaryenGetOptimizeLevel(),r=_BinaryenGetShrinkLevel(),n=_BinaryenGetDebugInfo();_BinaryenSetOptimizeLevel(4),_BinaryenSetShrinkLevel(0),_BinaryenSetDebugInfo(!1);var i=_BinaryenExpressionGetType(e),a=this.addTemporaryFunction(i,null,e),s=this.cachedPrecomputeNames;if(!s){var o=u("precompute");this.cachedPrecomputeName=o,this.cachedPrecomputeNames=s=l([o])}return _BinaryenFunctionRunPasses(a,this.ref,s,1),e=_BinaryenFunctionGetBody(a),this.removeTemporaryFunction(),_BinaryenSetOptimizeLevel(t),_BinaryenSetShrinkLevel(r),_BinaryenSetDebugInfo(n),e},e.prototype.validate=function(){return 1==_BinaryenModuleValidate(this.ref)},e.prototype.interpret=function(){_BinaryenModuleInterpret(this.ref)},e.prototype.toBinary=function(e){var t=this.cachedByValue,r=u(e),n=0,i=0;try{_BinaryenModuleAllocateAndWrite(t,this.ref,r),n=h(t);var a=h(t+4);i=h(t+8);var s=new _;return s.output=function(e,t){for(var r=new Uint8Array(t),n=0;n>8&255),store(r+2,a>>16&255),store(r+3,a>>>24),r+=4}return t}function p(e){return l(e)}function u(e){if(null==e)return 0;for(var t=memory.allocate(function(e){for(var t=0,r=0,n=e.length;r=55296&&i<=57343&&r+1=55296&&a<=57343&&n+1>>6),store(r++,128|63&a)):a<=65535?(store(r++,224|a>>>12),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=2097151?(store(r++,240|a>>>18),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=67108863?(store(r++,248|a>>>24),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):(store(r++,252|a>>>30),store(r++,128|a>>>24&63),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a))}return store(r,0),t}function h(e){return load(e)|load(e+1)<<8|load(e+2)<<16|load(e+3)<<24}function d(e){if(!e)return null;for(var t,r,n,i,a,s=new Array;t=load(e++);)128&t?(r=63&load(e++),192!=(224&t)?(n=63&load(e++),224==(240&t)?t=(15&t)<<12|r<<6|n:(i=63&load(e++),240==(248&t)?t=(7&t)<<18|r<<12|n<<6|i:(a=63&load(e++),t=248==(252&t)?(3&t)<<24|r<<18|n<<12|i<<6|a:(1&t)<<30|r<<24|n<<18|i<<12|a<<6|63&load(e++))),s.push(t)):s.push((31&t)<<6|r)):s.push(t);return String.fromCodePoints(s)}t.Relooper=o,t.readString=d;var _=function(){return function(){}}();t.BinaryModule=_,t.needsExplicitUnreachable=function e(t){switch(_BinaryenExpressionGetType(t)){case 1:case 2:case 3:case 4:return!1}switch(_BinaryenExpressionGetId(t)){case n.Unreachable:case n.Return:return!1;case n.Break:return 0!=_BinaryenBreakGetCondition(t);case n.Block:if(!_BinaryenBlockGetName(t)){var r=_BinaryenBlockGetNumChildren(t);return r>0&&e(_BinaryenBlockGetChild(t,r-1))}}return!0}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var a,s,o=r(1),c=r(3),l=r(2);function p(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return a.ABSTRACT;case"as":return a.AS;case"async":return a.ASYNC;case"await":return a.AWAIT}break;case 98:switch(e){case"break":return a.BREAK}break;case 99:switch(e){case"case":return a.CASE;case"catch":return a.CATCH;case"class":return a.CLASS;case"continue":return a.CONTINUE;case"const":return a.CONST;case"constructor":return a.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return a.DEBUGGER;case"declare":return a.DECLARE;case"default":return a.DEFAULT;case"delete":return a.DELETE;case"do":return a.DO}break;case 101:switch(e){case"else":return a.ELSE;case"enum":return a.ENUM;case"export":return a.EXPORT;case"extends":return a.EXTENDS}break;case 102:switch(e){case"false":return a.FALSE;case"finally":return a.FINALLY;case"for":return a.FOR;case"from":return a.FROM;case"function":return a.FUNCTION}break;case 103:switch(e){case"get":return a.GET}break;case 105:switch(e){case"if":return a.IF;case"implements":return a.IMPLEMENTS;case"import":return a.IMPORT;case"in":return a.IN;case"instanceof":return a.INSTANCEOF;case"interface":return a.INTERFACE;case"is":return a.IS}break;case 107:switch(e){case"keyof":return a.KEYOF}break;case 108:switch(e){case"let":return a.LET}break;case 109:switch(e){case"module":return a.MODULE}break;case 110:switch(e){case"namespace":return a.NAMESPACE;case"new":return a.NEW;case"null":return a.NULL}break;case 111:switch(e){case"of":return a.OF}break;case 112:switch(e){case"package":return a.PACKAGE;case"private":return a.PRIVATE;case"protected":return a.PROTECTED;case"public":return a.PUBLIC}break;case 114:switch(e){case"readonly":return a.READONLY;case"return":return a.RETURN}break;case 115:switch(e){case"set":return a.SET;case"static":return a.STATIC;case"super":return a.SUPER;case"switch":return a.SWITCH}break;case 116:switch(e){case"this":return a.THIS;case"throw":return a.THROW;case"true":return a.TRUE;case"try":return a.TRY;case"type":return a.TYPE;case"typeof":return a.TYPEOF}break;case 118:switch(e){case"var":return a.VAR;case"void":return a.VOID}break;case 119:switch(e){case"while":return a.WHILE;case"with":return a.WITH}break;case 121:switch(e){case"yield":return a.YIELD}}return a.INVALID}function u(e){switch(e){case a.ABSTRACT:case a.AS:case a.CONSTRUCTOR:case a.DECLARE:case a.DELETE:case a.FROM:case a.FOR:case a.GET:case a.IS:case a.KEYOF:case a.MODULE:case a.NAMESPACE:case a.READONLY:case a.SET:case a.TYPE:case a.VOID:return!0;default:return!1}}!function(e){e[e.ABSTRACT=0]="ABSTRACT",e[e.AS=1]="AS",e[e.ASYNC=2]="ASYNC",e[e.AWAIT=3]="AWAIT",e[e.BREAK=4]="BREAK",e[e.CASE=5]="CASE",e[e.CATCH=6]="CATCH",e[e.CLASS=7]="CLASS",e[e.CONST=8]="CONST",e[e.CONTINUE=9]="CONTINUE",e[e.CONSTRUCTOR=10]="CONSTRUCTOR",e[e.DEBUGGER=11]="DEBUGGER",e[e.DECLARE=12]="DECLARE",e[e.DEFAULT=13]="DEFAULT",e[e.DELETE=14]="DELETE",e[e.DO=15]="DO",e[e.ELSE=16]="ELSE",e[e.ENUM=17]="ENUM",e[e.EXPORT=18]="EXPORT",e[e.EXTENDS=19]="EXTENDS",e[e.FALSE=20]="FALSE",e[e.FINALLY=21]="FINALLY",e[e.FOR=22]="FOR",e[e.FROM=23]="FROM",e[e.FUNCTION=24]="FUNCTION",e[e.GET=25]="GET",e[e.IF=26]="IF",e[e.IMPLEMENTS=27]="IMPLEMENTS",e[e.IMPORT=28]="IMPORT",e[e.IN=29]="IN",e[e.INSTANCEOF=30]="INSTANCEOF",e[e.INTERFACE=31]="INTERFACE",e[e.IS=32]="IS",e[e.KEYOF=33]="KEYOF",e[e.LET=34]="LET",e[e.MODULE=35]="MODULE",e[e.NAMESPACE=36]="NAMESPACE",e[e.NEW=37]="NEW",e[e.NULL=38]="NULL",e[e.OF=39]="OF",e[e.PACKAGE=40]="PACKAGE",e[e.PRIVATE=41]="PRIVATE",e[e.PROTECTED=42]="PROTECTED",e[e.PUBLIC=43]="PUBLIC",e[e.READONLY=44]="READONLY",e[e.RETURN=45]="RETURN",e[e.SET=46]="SET",e[e.STATIC=47]="STATIC",e[e.SUPER=48]="SUPER",e[e.SWITCH=49]="SWITCH",e[e.THIS=50]="THIS",e[e.THROW=51]="THROW",e[e.TRUE=52]="TRUE",e[e.TRY=53]="TRY",e[e.TYPE=54]="TYPE",e[e.TYPEOF=55]="TYPEOF",e[e.VAR=56]="VAR",e[e.VOID=57]="VOID",e[e.WHILE=58]="WHILE",e[e.WITH=59]="WITH",e[e.YIELD=60]="YIELD",e[e.OPENBRACE=61]="OPENBRACE",e[e.CLOSEBRACE=62]="CLOSEBRACE",e[e.OPENPAREN=63]="OPENPAREN",e[e.CLOSEPAREN=64]="CLOSEPAREN",e[e.OPENBRACKET=65]="OPENBRACKET",e[e.CLOSEBRACKET=66]="CLOSEBRACKET",e[e.DOT=67]="DOT",e[e.DOT_DOT_DOT=68]="DOT_DOT_DOT",e[e.SEMICOLON=69]="SEMICOLON",e[e.COMMA=70]="COMMA",e[e.LESSTHAN=71]="LESSTHAN",e[e.GREATERTHAN=72]="GREATERTHAN",e[e.LESSTHAN_EQUALS=73]="LESSTHAN_EQUALS",e[e.GREATERTHAN_EQUALS=74]="GREATERTHAN_EQUALS",e[e.EQUALS_EQUALS=75]="EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS=76]="EXCLAMATION_EQUALS",e[e.EQUALS_EQUALS_EQUALS=77]="EQUALS_EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS_EQUALS=78]="EXCLAMATION_EQUALS_EQUALS",e[e.EQUALS_GREATERTHAN=79]="EQUALS_GREATERTHAN",e[e.PLUS=80]="PLUS",e[e.MINUS=81]="MINUS",e[e.ASTERISK_ASTERISK=82]="ASTERISK_ASTERISK",e[e.ASTERISK=83]="ASTERISK",e[e.SLASH=84]="SLASH",e[e.PERCENT=85]="PERCENT",e[e.PLUS_PLUS=86]="PLUS_PLUS",e[e.MINUS_MINUS=87]="MINUS_MINUS",e[e.LESSTHAN_LESSTHAN=88]="LESSTHAN_LESSTHAN",e[e.GREATERTHAN_GREATERTHAN=89]="GREATERTHAN_GREATERTHAN",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN=90]="GREATERTHAN_GREATERTHAN_GREATERTHAN",e[e.AMPERSAND=91]="AMPERSAND",e[e.BAR=92]="BAR",e[e.CARET=93]="CARET",e[e.EXCLAMATION=94]="EXCLAMATION",e[e.TILDE=95]="TILDE",e[e.AMPERSAND_AMPERSAND=96]="AMPERSAND_AMPERSAND",e[e.BAR_BAR=97]="BAR_BAR",e[e.QUESTION=98]="QUESTION",e[e.COLON=99]="COLON",e[e.EQUALS=100]="EQUALS",e[e.PLUS_EQUALS=101]="PLUS_EQUALS",e[e.MINUS_EQUALS=102]="MINUS_EQUALS",e[e.ASTERISK_EQUALS=103]="ASTERISK_EQUALS",e[e.ASTERISK_ASTERISK_EQUALS=104]="ASTERISK_ASTERISK_EQUALS",e[e.SLASH_EQUALS=105]="SLASH_EQUALS",e[e.PERCENT_EQUALS=106]="PERCENT_EQUALS",e[e.LESSTHAN_LESSTHAN_EQUALS=107]="LESSTHAN_LESSTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_EQUALS=108]="GREATERTHAN_GREATERTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS=109]="GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS",e[e.AMPERSAND_EQUALS=110]="AMPERSAND_EQUALS",e[e.BAR_EQUALS=111]="BAR_EQUALS",e[e.CARET_EQUALS=112]="CARET_EQUALS",e[e.AT=113]="AT",e[e.IDENTIFIER=114]="IDENTIFIER",e[e.STRINGLITERAL=115]="STRINGLITERAL",e[e.INTEGERLITERAL=116]="INTEGERLITERAL",e[e.FLOATLITERAL=117]="FLOATLITERAL",e[e.INVALID=118]="INVALID",e[e.ENDOFFILE=119]="ENDOFFILE"}(a=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(s=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=p,t.tokenIsAlsoIdentifier=u,t.operatorTokenToString=function(e){switch(e){case a.DELETE:return"delete";case a.IN:return"in";case a.INSTANCEOF:return"instanceof";case a.NEW:return"new";case a.TYPEOF:return"typeof";case a.VOID:return"void";case a.YIELD:return"yield";case a.DOT_DOT_DOT:return"...";case a.COMMA:return",";case a.LESSTHAN:return"<";case a.GREATERTHAN:return">";case a.LESSTHAN_EQUALS:return"<=";case a.GREATERTHAN_EQUALS:return">=";case a.EQUALS_EQUALS:return"==";case a.EXCLAMATION_EQUALS:return"!=";case a.EQUALS_EQUALS_EQUALS:return"===";case a.EXCLAMATION_EQUALS_EQUALS:return"!==";case a.PLUS:return"+";case a.MINUS:return"-";case a.ASTERISK_ASTERISK:return"**";case a.ASTERISK:return"*";case a.SLASH:return"/";case a.PERCENT:return"%";case a.PLUS_PLUS:return"++";case a.MINUS_MINUS:return"--";case a.LESSTHAN_LESSTHAN:return"<<";case a.GREATERTHAN_GREATERTHAN:return">>";case a.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case a.AMPERSAND:return"&";case a.BAR:return"|";case a.CARET:return"^";case a.EXCLAMATION:return"!";case a.TILDE:return"~";case a.AMPERSAND_AMPERSAND:return"&&";case a.BAR_BAR:return"||";case a.EQUALS:return"=";case a.PLUS_EQUALS:return"+=";case a.MINUS_EQUALS:return"-=";case a.ASTERISK_EQUALS:return"*=";case a.ASTERISK_ASTERISK_EQUALS:return"**=";case a.SLASH_EQUALS:return"/=";case a.PERCENT_EQUALS:return"%=";case a.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case a.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case a.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case a.AMPERSAND_EQUALS:return"&=";case a.BAR_EQUALS:return"|=";case a.CARET_EQUALS:return"^=";default:return assert(!1),""}};var h=function(){function e(e,t,r){this.debugInfoRef=0,this.source=e,this.start=t,this.end=r}return e.join=function(t,r){if(t.source!=r.source)throw new Error("source mismatch");return new e(t.source,t.startr.end?t.end:r.end)},Object.defineProperty(e.prototype,"atStart",{get:function(){return new e(this.source,this.start,this.start)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"atEnd",{get:function(){return new e(this.source,this.end,this.end)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"line",{get:function(){for(var e=this.source.text,t=1,r=this.start;r>=0;--r)10==e.charCodeAt(r)&&t++;return t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"column",{get:function(){for(var e=this.source.text,t=0,r=this.start-1;r>=0&&10!=e.charCodeAt(r);--r)++t;return t},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return this.source.text.substring(this.start,this.end)},e}();t.Range=h;var d=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,r)||this;n.end=0,n.pos=0,n.token=-1,n.tokenPos=0,n.nextToken=-1,n.nextTokenPos=0,n.nextTokenOnNewLine=!1,n.onComment=null,n.source=t,n.pos=0,n.end=t.text.length,n.diagnostics=r||new Array;var i=t.text;if(n.pos1&&this.pos2&&this.pos1&&this.pos1&&this.pos1&&this.pos2&&this.pos1&&this.pos1&&this.pos1&&this.pos2&&this.pos+11&&this.pos1&&this.pos2&&this.pos1&&this.pos2&&this.pos1&&this.pos2&&this.pos3&&this.pos1&&this.pos1&&this.pos=this.end){n+=e.substring(r,this.pos),this.error(o.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.end));break}var i=e.charCodeAt(this.pos);if(i==t){n+=e.substring(r,this.pos++);break}if(92!=i){if(l.isLineBreak(i)){n+=e.substring(r,this.pos),this.error(o.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.pos));break}++this.pos}else n+=e.substring(r,this.pos),n+=this.readEscapeSequence(),r=this.pos}return n},t.prototype.readEscapeSequence=function(){if(++this.pos>=this.end)return this.error(o.DiagnosticCode.Unexpected_end_of_text,this.range(this.end)),"";var e=this.source.text,t=e.charCodeAt(this.pos++);switch(t){case 48:return"\0";case 98:return"\b";case 116:return"\t";case 110:return"\n";case 118:return"\v";case 102:return"\f";case 114:return"\r";case 39:return"'";case 34:return'"';case 117:return this.pos=this.end){this.error(o.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.end));break}if(92!=e.charCodeAt(this.pos)){var n=e.charCodeAt(this.pos);if(47==n&&!r)break;if(l.isLineBreak(n)){this.error(o.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.pos));break}++this.pos,r=!1}else++this.pos,r=!0}return e.substring(t,this.pos)},t.prototype.readRegexpFlags=function(){for(var e=this.source.text,t=this.pos,r=0;this.pos57)&&95!=r)break;t++}return!0},t.prototype.readInteger=function(){var e=this.source.text;if(48==e.charCodeAt(this.pos)&&this.pos+2=48&&s<=57)r=i64_add(i64_mul(r,n),i64_new(s-48,0));else if(s>=65&&s<=70)r=i64_add(i64_mul(r,n),i64_new(10+s-65,0));else if(s>=97&&s<=102)r=i64_add(i64_mul(r,n),i64_new(10+s-97,0));else{if(95!=s)break;i==a&&this.error(i==t?o.DiagnosticCode.Numeric_separators_are_not_allowed_here:o.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(o.DiagnosticCode.Hexadecimal_digit_expected,this.range(t)):i==this.pos&&this.error(o.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readDecimalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(10,0),i=t;this.pos=48&&s<=57)r=i64_add(i64_mul(r,n),i64_new(s-48,0));else{if(95!=s)break;i==a&&this.error(i==t?o.DiagnosticCode.Numeric_separators_are_not_allowed_here:o.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(o.DiagnosticCode.Digit_expected,this.range(t)):i==this.pos&&this.error(o.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readOctalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(8,0),i=t;this.pos=48&&s<=55)r=i64_add(i64_mul(r,n),i64_new(s-48,0));else{if(95!=s)break;i==a&&this.error(i==t?o.DiagnosticCode.Numeric_separators_are_not_allowed_here:o.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}++this.pos}return this.pos==t?this.error(o.DiagnosticCode.Octal_digit_expected,this.range(t)):i==this.pos&&this.error(o.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readBinaryInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(2,0),i=i64_new(1,0),a=t;this.pos=48&&n<=57)t=16*t+n-48;else if(n>=65&&n<=70)t=16*t+10+n-65;else{if(!(n>=97&&n<=102))return this.error(o.DiagnosticCode.Hexadecimal_digit_expected,this.range(this.pos-1,this.pos)),"";t=16*t+10+n-97}if(0==--e)break}return e?(this.error(o.DiagnosticCode.Unexpected_end_of_text,this.range(this.pos)),""):String.fromCharCode(t)},t.prototype.readExtendedUnicodeEscape=function(){var e=this.pos,t=this.readHexInteger(),r=i64_low(t),n=!1;assert(!i64_high(t)),r>1114111&&(this.error(o.DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,this.range(e,this.pos)),n=!0);var i=this.source.text;return this.pos>=this.end?(this.error(o.DiagnosticCode.Unexpected_end_of_text,this.range(e,this.end)),n=!0):125==i.charCodeAt(this.pos)?++this.pos:(this.error(o.DiagnosticCode.Unterminated_Unicode_escape_sequence,this.range(e,this.pos)),n=!0),n?"":r<65536?String.fromCharCode(r):String.fromCharCode(55296+((r-65536)/1024|0),(r-65536)%1024+56320)},t.prototype.finish=function(){},t}(o.DiagnosticEmitter);t.Tokenizer=d;var _=function(){return function(){}}();t.State=_;var m=null},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4);!function(e){e[e.I8=0]="I8",e[e.I16=1]="I16",e[e.I32=2]="I32",e[e.I64=3]="I64",e[e.ISIZE=4]="ISIZE",e[e.U8=5]="U8",e[e.U16=6]="U16",e[e.U32=7]="U32",e[e.U64=8]="U64",e[e.USIZE=9]="USIZE",e[e.BOOL=10]="BOOL",e[e.F32=11]="F32",e[e.F64=12]="F64",e[e.VOID=13]="VOID"}(t.TypeKind||(t.TypeKind={})),function(e){e[e.NONE=0]="NONE",e[e.SIGNED=1]="SIGNED",e[e.UNSIGNED=2]="UNSIGNED",e[e.INTEGER=4]="INTEGER",e[e.FLOAT=8]="FLOAT",e[e.POINTER=16]="POINTER",e[e.SHORT=32]="SHORT",e[e.LONG=64]="LONG",e[e.VALUE=128]="VALUE",e[e.REFERENCE=256]="REFERENCE",e[e.NULLABLE=512]="NULLABLE"}(t.TypeFlags||(t.TypeFlags={}));var i=function(){function e(e,t,r){this.cachedNullableType=null,this.kind=e,this.flags=t,this.size=r,this.byteSize=ceil(r/8),this.classReference=null,this.signatureReference=null,this.nonNullableType=this}return Object.defineProperty(e.prototype,"intType",{get:function(){switch(this.kind){case 0:return e.i8;case 1:return e.i16;case 11:case 2:return e.i32;case 12:case 3:return e.i64;case 4:return 64==this.size?e.isize64:e.isize32;case 5:return e.u8;case 6:return e.u16;case 7:return e.u32;case 8:return e.u64;case 9:return 64==this.size?e.usize64:e.usize32;case 10:default:return e.i32}},enumerable:!0,configurable:!0}),e.prototype.isManaged=function(e){if(e.hasGC){var t=this.classReference;return null!==t&&!t.hasDecorator(n.DecoratorFlags.UNMANAGED)}return!1},e.prototype.computeSmallIntegerShift=function(e){return e.size-this.size},e.prototype.computeSmallIntegerMask=function(e){var t=this.is(2)?this.size:this.size-1;return-1>>>e.size-t},e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.asClass=function(t){assert(9==this.kind&&!this.classReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.classReference=t,r},e.prototype.asFunction=function(t){assert(7==this.kind&&!this.signatureReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.signatureReference=t,r},e.prototype.asNullable=function(){return assert(this.is(256)),this.cachedNullableType||(assert(!this.is(512)),this.cachedNullableType=new e(this.kind,512|this.flags,this.size),this.cachedNullableType.nonNullableType=this,this.cachedNullableType.classReference=this.classReference,this.cachedNullableType.signatureReference=this.signatureReference),this.cachedNullableType},e.prototype.isAssignableTo=function(t,r){var n,i,a,s;if(void 0===r&&(r=!1),this.is(256)){if(t.is(256)&&(!this.is(512)||t.is(512)))if(n=this.classReference){if(i=t.classReference)return n.isAssignableTo(i)}else if((a=this.signatureReference)&&(s=t.signatureReference))return a.isAssignableTo(s)}else if(!t.is(256))if(this.is(4))if(t.is(4)){if(!r||this==e.bool||this.is(1)==t.is(1))return this.size<=t.size}else{if(11==t.kind)return this.size<=23;if(12==t.kind)return this.size<=52}else if(this.is(8)&&t.is(8))return this.size<=t.size;return!1},e.commonCompatible=function(e,t,r){return t.isAssignableTo(e,r)?e:e.isAssignableTo(t,r)?t:null},e.prototype.toString=function(e){if(void 0===e&&(e=!1),!e&&this.is(256)){var t=this.classReference;if(t)return this.is(512)?t.toString()+" | null":t.toString();var r=this.signatureReference;if(r)return this.is(512)?"("+r.toString(!0)+") | null":r.toString(!0);assert(!1)}switch(this.kind){case 0:return"i8";case 1:return"i16";case 2:return"i32";case 3:return"i64";case 4:return"isize";case 5:return"u8";case 6:return"u16";case 7:return"u32";case 8:return"u64";case 9:return"usize";case 10:return"bool";case 11:return"f32";case 12:return"f64";default:assert(!1);case 13:return"void"}},e.prototype.toNativeType=function(){switch(this.kind){default:return 1;case 3:case 8:return 2;case 4:case 9:return 64==this.size?2:1;case 11:return 3;case 12:return 4;case 13:return 0}},e.prototype.toNativeZero=function(e){switch(this.kind){case 13:assert(!1);default:return e.createI32(0);case 4:case 9:if(64!=this.size)return e.createI32(0);case 3:case 8:return e.createI64(0);case 11:return e.createF32(0);case 12:return e.createF64(0)}},e.prototype.toNativeOne=function(e){switch(this.kind){case 13:assert(!1);default:return e.createI32(1);case 4:case 9:if(64!=this.size)return e.createI32(1);case 3:case 8:return e.createI64(1);case 11:return e.createF32(1);case 12:return e.createF64(1)}},e.prototype.toNativeNegOne=function(e){switch(this.kind){case 13:assert(!1);default:return e.createI32(-1);case 4:case 9:if(64!=this.size)return e.createI32(-1);case 3:case 8:return e.createI64(-1,-1);case 11:return e.createF32(-1);case 12:return e.createF64(-1)}},e.prototype.toSignatureString=function(){switch(this.kind){default:return"i";case 3:case 8:return"I";case 4:case 9:return 64==this.size?"I":"i";case 11:return"f";case 12:return"F";case 13:return"v"}},e.i8=new e(0,165,8),e.i16=new e(1,165,16),e.i32=new e(2,133,32),e.i64=new e(3,197,64),e.isize32=new e(4,149,32),e.isize64=new e(4,213,64),e.u8=new e(5,166,8),e.u16=new e(6,166,16),e.u32=new e(7,134,32),e.u64=new e(8,198,64),e.usize32=new e(9,150,32),e.usize64=new e(9,214,64),e.bool=new e(10,166,1),e.f32=new e(11,137,32),e.f64=new e(12,201,64),e.void=new e(13,0,0),e}();t.Type=i,t.typesToNativeTypes=function(e){for(var t=e.length,r=new Array(t),n=0;ne?t[e]:o(e)},e.prototype.isAssignableTo=function(e){var t=this.thisType,r=e.thisType;if(t){if(!r||!t.isAssignableTo(r))return!1}else if(r)return!1;if(this.hasRest!=e.hasRest)return!1;var n=this.parameterTypes,i=e.parameterTypes,a=n.length;if(a!=i.length)return!1;for(var s=0;s=l&&u!=p?t.push("?: "):t.push(": "),t.push(i[u].toString());return t.push(") => "),t.push(this.returnType.toString()),t.join("")},e}();t.Signature=a;var s=null;function o(e){s||(s=[]);for(var t=s.length;t<=e;++t)s.push("arg$"+t.toString(10));return s[e-1]}t.getDefaultParameterName=o},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o,c=r(23),l=r(1),p=r(5),u=r(0),h=r(4),d=r(6),_=r(3),m=r(7),g=r(2);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(o=t.Target||(t.Target={}));var y=function(){function e(){this.target=o.WASM32,this.noTreeShaking=!1,this.noAssert=!1,this.importMemory=!1,this.importTable=!1,this.sourceMap=!1,this.memoryBase=0,this.globalAliases=null,this.features=0,this.optimizeLevelHint=0,this.shrinkLevelHint=0}return Object.defineProperty(e.prototype,"isWasm64",{get:function(){return this.target==o.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==o.WASM64?m.Type.usize64:m.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==o.WASM64?m.Type.isize64:m.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==o.WASM64?2:1},enumerable:!0,configurable:!0}),e.prototype.hasFeature=function(e){return 0!=(this.features&e)},e}();t.Options=y,function(e){e[e.NONE=0]="NONE",e[e.SIGN_EXTENSION=1]="SIGN_EXTENSION",e[e.MUTABLE_GLOBAL=2]="MUTABLE_GLOBAL"}(t.Feature||(t.Feature={})),function(e){e[e.NONE=0]="NONE",e[e.IMPLICIT=1]="IMPLICIT",e[e.EXPLICIT=2]="EXPLICIT"}(t.ConversionKind||(t.ConversionKind={})),function(e){e[e.NONE=0]="NONE",e[e.WRAP=1]="WRAP"}(t.WrapMode||(t.WrapMode={}));var f,E,T=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,t.diagnostics)||this;return n.currentOuterFunction=null,n.currentInlineFunctions=[],n.currentEnum=null,n.currentType=m.Type.void,n.memorySegments=[],n.stringSegments=new Map,n.functionTable=["null"],n.argcVar=0,n.argcSet=0,n.needsIterateRoots=!1,n.f32ModInstance=null,n.f64ModInstance=null,n.f32PowInstance=null,n.f64PowInstance=null,n.program=t,n.resolver=t.resolver,r||(r=new y),n.options=r,n.memoryOffset=i64_new(max(r.memoryBase,8)),n.module=p.Module.create(),n}return i(t,e),t.compile=function(e,r){return void 0===r&&(r=null),new t(e,r).compile()},t.prototype.compile=function(){var e,t,r=this.options,n=this.module,i=this.program;i.initialize(r);var o=new h.Function(i.startFunction,"start",new m.Signature([],m.Type.void));this.startFunctionInstance=o;var l=new Array;this.startFunctionBody=l,this.currentFunction=o,r.isWasm64?n.addGlobal("HEAP_BASE",2,!0,n.createI64(0,0)):n.addGlobal("HEAP_BASE",1,!1,n.createI32(0));for(var u=i.sources,d=0,_=u.length;d<_;++d)u[d].isEntry&&this.compileSource(u[d]);if(l.length||null!==i.mainFunction){var g=o.signature,y=n.addFunction(o.internalName,this.ensureFunctionType(g.parameterTypes,g.returnType,g.thisType),m.typesToNativeTypes(o.additionalLocals),n.createBlock(null,l));o.finalize(n,y),i.mainFunction||n.setStart(y)}var f=this.memoryOffset;f=i64_align(f,r.usizeType.byteSize),this.memoryOffset=f,n.removeGlobal("HEAP_BASE"),r.isWasm64?n.addGlobal("HEAP_BASE",2,!1,n.createI64(i64_low(f),i64_high(f))):n.addGlobal("HEAP_BASE",1,!1,n.createI32(i64_low(f))),n.setMemory(this.options.memoryBase||this.memorySegments.length?i64_low(i64_shr_u(i64_align(f,65536),i64_new(16,0))):0,p.Module.UNLIMITED_MEMORY,this.memorySegments,r.target,"memory"),r.importMemory&&n.addMemoryImport("0","env","memory");var E=this.functionTable;n.setFunctionTable(E.length,4294967295,E),n.addTableExport("0","table"),n.addFunction("null",this.ensureFunctionType(null,m.Type.void),null,n.createBlock(null,[])),r.importTable&&n.addTableImport("0","env","table");try{for(var T=a(i.moduleLevelExports),I=T.next();!I.done;I=T.next()){var v=s(I.value,2),A=v[0],C=v[1];this.makeModuleExport(A,C.element)}}catch(t){e={error:t}}finally{try{I&&!I.done&&(t=T.return)&&t.call(T)}finally{if(e)throw e.error}}return this.needsIterateRoots&&c.compileIterateRoots(this),n},t.prototype.makeModuleExport=function(e,t,r){var n,i,s,o,c,p,d,_,g,y;void 0===r&&(r="");var f=t.members;if(f){var E=r+e+(t.kind==h.ElementKind.CLASS?u.INSTANCE_DELIMITER:u.STATIC_DELIMITER);if(t.kind==h.ElementKind.NAMESPACE)try{for(var T=a(f.values()),I=T.next();!I.done;I=T.next()){(C=I.value).is(u.CommonFlags.EXPORT)&&this.makeModuleExport(C.simpleName,C,E)}}catch(e){n={error:e}}finally{try{I&&!I.done&&(i=T.return)&&i.call(T)}finally{if(n)throw n.error}}else try{for(var v=a(f.values()),A=v.next();!A.done;A=v.next()){var C;(C=A.value).is(u.CommonFlags.PRIVATE)||this.makeModuleExport(C.simpleName,C,E)}}catch(e){s={error:e}}finally{try{A&&!A.done&&(o=v.return)&&o.call(v)}finally{if(s)throw s.error}}}switch(t.kind){case h.ElementKind.GLOBAL:if(t.is(u.CommonFlags.CONST)||t.is(u.CommonFlags.STATIC|u.CommonFlags.READONLY)||this.options.hasFeature(2))this.module.addGlobalExport(t.internalName,r+e);else(N=t.declaration)&&this.error(l.DiagnosticCode.Cannot_export_a_mutable_global,N.name.range);break;case h.ElementKind.ENUMVALUE:var N;if(assert(t.parent).is(u.CommonFlags.CONST)||this.options.hasFeature(2))this.module.addGlobalExport(t.internalName,r+e);else(N=t.declaration)&&this.error(l.DiagnosticCode.Cannot_export_a_mutable_global,N.name.range);break;case h.ElementKind.FUNCTION:var O=(z=t).signature;O.requiredParameters"),!1;e.type=this.currentType,e.set(u.CommonFlags.RESOLVED)}else assert(!1);if(e.is(u.CommonFlags.AMBIENT)&&e.hasDecorator(h.DecoratorFlags.BUILTIN))return!0;var a=e.type.toNativeType(),s=e.is(u.CommonFlags.CONST)||e.is(u.CommonFlags.STATIC|u.CommonFlags.READONLY);if(e.is(u.CommonFlags.AMBIENT))return s||this.options.hasFeature(2)?(e.set(u.CommonFlags.MODULE_IMPORT),r?I(e,r):(f="env",E=e.simpleName),t.addGlobalImport(e.internalName,f,E,a),e.set(u.CommonFlags.COMPILED),!0):(this.error(l.DiagnosticCode.Operation_not_supported,assert(r).range),!1);var o=!1;if(null!==r&&null!==r.initializer){if(n||(n=this.compileExpression(r.initializer,e.type,1,1)),p.getExpressionId(n)!=p.ExpressionId.Const&&(s?(n=t.precomputeExpression(n),p.getExpressionId(n)!=p.ExpressionId.Const&&(this.warning(l.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,r.range),o=!0)):o=!0),e.hasDecorator(h.DecoratorFlags.INLINE)&&!o){switch(assert(p.getExpressionId(n)==p.ExpressionId.Const),p.getExpressionType(n)){case 1:e.constantValueKind=1,e.constantIntegerValue=i64_new(p.getConstValueI32(n),0);break;case 2:e.constantValueKind=1,e.constantIntegerValue=i64_new(p.getConstValueI64Low(n),p.getConstValueI64High(n));break;case 3:e.constantValueKind=2,e.constantFloatValue=p.getConstValueF32(n);break;case 4:e.constantValueKind=2,e.constantFloatValue=p.getConstValueF64(n);break;default:return assert(!1),!1}e.set(u.CommonFlags.INLINED)}}else n=e.type.toNativeZero(t);var c=e.internalName;return o?(t.addGlobal(c,a,!0,e.type.toNativeZero(t)),this.startFunctionBody.push(t.createSetGlobal(c,n))):t.addGlobal(c,a,!s,n),!0},t.prototype.compileEnumDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==h.ElementKind.ENUM),this.compileEnum(t)?t:null},t.prototype.compileEnum=function(e){var t,r;if(e.is(u.CommonFlags.COMPILED))return!0;e.set(u.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var i=null,s=!1;if(e.members)try{for(var o=a(e.members.values()),c=o.next();!c.done;c=o.next()){var d=c.value;if(d.kind==h.ElementKind.ENUMVALUE){var _=!1,g=d,y=g.declaration;g.set(u.CommonFlags.COMPILED);var f=void 0;y.value?(f=this.compileExpression(y.value,m.Type.i32,1,0),p.getExpressionId(f)!=p.ExpressionId.Const&&(e.is(u.CommonFlags.CONST)?(f=n.precomputeExpression(f),p.getExpressionId(f)!=p.ExpressionId.Const&&(this.error(l.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.value.range),_=!0)):_=!0)):null==i?f=n.createI32(0):(s&&this.error(l.DiagnosticCode.Enum_member_must_have_initializer,y.range),f=n.createBinary(p.BinaryOp.AddI32,n.createGetGlobal(i.internalName,1),n.createI32(1)),f=n.precomputeExpression(f),p.getExpressionId(f)!=p.ExpressionId.Const&&(e.is(u.CommonFlags.CONST)&&this.error(l.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.range),_=!0)),_?(n.addGlobal(g.internalName,1,!0,n.createI32(0)),this.startFunctionBody.push(n.createSetGlobal(g.internalName,f)),s=!0):(n.addGlobal(g.internalName,1,!e.is(u.CommonFlags.CONST),f),s=!1),i=g}}}catch(e){t={error:e}}finally{try{c&&!c.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}return this.currentEnum=null,!0},t.prototype.compileFunctionDeclaration=function(e,t){var r=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(r.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.compileFunctionUsingTypeArguments(r,t,g.makeMap(),null,r.declaration.name)},t.prototype.compileFunctionUsingTypeArguments=function(e,t,r,n,i){var a=this.resolver.resolveFunctionInclTypeArguments(e,t,r,i);return a?(a.outerScope=n,this.compileFunction(a)?a:null):null},t.prototype.ensureFunctionType=function(e,t,r){void 0===r&&(r=null);var n,i=e?e.length:0,a=0;if(r?((n=new Array(1+i))[0]=r.toNativeType(),a=1):n=new Array(i),e)for(var s=0;s=0)return e.functionTableIndex;var t=this.functionTable,r=t.length;return!e.is(u.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters=0?"case"+h.toString(10):"break")+"|"+a);var g=t.createBlock("case0|"+a,l,0),y=!0,f=!0,E=!0,T=!0;for(d=0;d=0&&(y&&s.set(1),f&&s.set(2),E&&s.set(4),T&&s.set(32)),g},t.prototype.compileThrowStatement=function(e){var t=this.currentFunction.flow;return t.set(4),t.set(1),c.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileVariableStatement=function(e,t){void 0===t&&(t=!1);var r=this.program,n=this.currentFunction,i=e.declarations,a=i.length;if(t||n==this.startFunctionInstance&&e.parent&&e.parent.kind==_.NodeKind.SOURCE){for(var s=0;s");continue}f=this.currentType}var T=!1;if(g.is(u.CommonFlags.CONST))if(E)if(E=this.module.precomputeExpression(E),p.getExpressionId(E)==p.ExpressionId.Const){var I=new h.Local(r,y,-1,f);switch(p.getExpressionType(E)){case 1:I=I.withConstantIntegerValue(i64_new(p.getConstValueI32(E),0));break;case 2:I=I.withConstantIntegerValue(i64_new(p.getConstValueI64Low(E),p.getConstValueI64High(E)));break;case 3:I=I.withConstantFloatValue(p.getConstValueF32(E));break;case 4:I=I.withConstantFloatValue(p.getConstValueF64(E));break;default:return assert(!1),this.module.createUnreachable()}var v=n.flow.scopedLocals;if(v){if(v.has(y))return this.error(l.DiagnosticCode.Duplicate_identifier_0,g.name.range,y),this.module.createUnreachable()}else n.flow.scopedLocals=v=new Map;v.set(y,I),T=!0}else this.warning(l.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,g.range);else this.error(l.DiagnosticCode._const_declarations_must_be_initialized,g.range);if(!T){I=void 0;I=g.isAny(u.CommonFlags.LET|u.CommonFlags.CONST)||c.is(2048)?c.addScopedLocal(f,y,!1,g):n.addLocal(f,y,g),E?(o.push(this.compileAssignmentWithValue(g.name,E)),I.type.is(36)&&c.setLocalWrapped(I.index,!c.canOverflow(E,f))):I.type.is(36)&&c.setLocalWrapped(I.index,!0)}}return o.length?1==o.length?o[0]:this.module.createBlock(null,o,0):0},t.prototype.compileVoidStatement=function(e){return this.compileExpression(e.expression,m.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,m.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(u.CommonFlags.GENERIC|u.CommonFlags.GENERIC_CONTEXT)){var n=t.precomputeExpression(r);if(p.getExpressionId(n)==p.ExpressionId.Const&&1==p.getExpressionType(n)){if(!p.getConstValueI32(n))return t.createNop()}else r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,m.Type.bool,0),this.currentType)}var i=this.currentFunction,a=i.enterBreakContext(),s=i.flow,o=s.fork();i.flow=o;var c="break|"+a;o.breakLabel=c;var l="continue|"+a;o.continueLabel=l;var h=this.compileStatement(e.statement),d=o.isAny(29);return i.flow=o.free(),i.leaveBreakContext(),o.unset(792),s.inheritConditional(o),t.createBlock(c,[t.createLoop(l,t.createIf(r,d?h:t.createBlock(null,[h,t.createBreak(l)],0)))])},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(u.CommonFlags.INLINED));var n=e.type;switch(!r&&n.is(4)&&t.is(4)&&n.size>i:0);case 5:case 6:case 10:var a=e.type.computeSmallIntegerMask(m.Type.i32);return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue)&a:0);case 2:case 7:return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 4:case 9:if(!e.program.options.isWasm64)return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 3:case 8:return 1==e.constantValueKind?this.module.createI64(i64_low(e.constantIntegerValue),i64_high(e.constantIntegerValue)):this.module.createI64(0);case 12:if(!e.hasDecorator(h.DecoratorFlags.BUILTIN)||t!=m.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=m.Type.f32;case 11:return this.module.createF32(e.constantFloatValue);default:return assert(!1),this.module.createUnreachable()}},t.prototype.compileExpression=function(e,t,r,n){var i;switch(this.currentType=t,e.kind){case _.NodeKind.ASSERTION:i=this.compileAssertionExpression(e,t);break;case _.NodeKind.BINARY:i=this.compileBinaryExpression(e,t);break;case _.NodeKind.CALL:i=this.compileCallExpression(e,t);break;case _.NodeKind.COMMA:i=this.compileCommaExpression(e,t);break;case _.NodeKind.ELEMENTACCESS:i=this.compileElementAccessExpression(e,t);break;case _.NodeKind.FUNCTION:i=this.compileFunctionExpression(e,t);break;case _.NodeKind.IDENTIFIER:case _.NodeKind.FALSE:case _.NodeKind.NULL:case _.NodeKind.THIS:case _.NodeKind.SUPER:case _.NodeKind.TRUE:i=this.compileIdentifierExpression(e,t,0==r);break;case _.NodeKind.INSTANCEOF:i=this.compileInstanceOfExpression(e,t);break;case _.NodeKind.LITERAL:i=this.compileLiteralExpression(e,t);break;case _.NodeKind.NEW:i=this.compileNewExpression(e,t);break;case _.NodeKind.PARENTHESIZED:i=this.compileParenthesizedExpression(e,t);break;case _.NodeKind.PROPERTYACCESS:i=this.compilePropertyAccessExpression(e,t,0==r);break;case _.NodeKind.TERNARY:i=this.compileTernaryExpression(e,t);break;case _.NodeKind.UNARYPOSTFIX:i=this.compileUnaryPostfixExpression(e,t);break;case _.NodeKind.UNARYPREFIX:i=this.compileUnaryPrefixExpression(e,t);break;default:this.error(l.DiagnosticCode.Operation_not_supported,e.range),i=this.module.createUnreachable()}var a=this.currentType;return 0!=r&&a!=t?(i=this.convertExpression(i,a,t,r,n,e),this.currentType=t):1==n&&(i=this.ensureSmallIntegerWrap(i,a)),this.options.sourceMap&&this.addDebugLocation(i,e.range),i},t.prototype.compileExpressionRetainType=function(e,t,r){return this.compileExpression(e,t==m.Type.void?m.Type.i32:t,0,r)},t.prototype.precomputeExpression=function(e,t,r,n){return this.module.precomputeExpression(this.compileExpression(e,t,r,n))},t.prototype.convertExpression=function(e,t,r,n,i,a){assert(0!=n);var s=this.module;return 13==t.kind?(assert(13!=r.kind),this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,a.range,t.toString(),r.toString()),s.createUnreachable()):13==r.kind?s.createDrop(e):(t.isAssignableTo(r)||1==n&&this.error(l.DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,a.range,t.toString(),r.toString()),t.is(8)?r.is(8)?11==t.kind?12==r.kind&&(e=s.createUnary(p.UnaryOp.PromoteF32,e)):11==r.kind&&(e=s.createUnary(p.UnaryOp.DemoteF64,e)):r.is(4)?11==t.kind?r==m.Type.bool?(e=s.createBinary(p.BinaryOp.NeF32,e,s.createF32(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(p.UnaryOp.TruncF32ToI64,e):s.createUnary(p.UnaryOp.TruncF32ToI32,e):r.is(64)?s.createUnary(p.UnaryOp.TruncF32ToU64,e):s.createUnary(p.UnaryOp.TruncF32ToU32,e):r==m.Type.bool?(e=s.createBinary(p.BinaryOp.NeF64,e,s.createF64(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(p.UnaryOp.TruncF64ToI64,e):s.createUnary(p.UnaryOp.TruncF64ToI32,e):r.is(64)?s.createUnary(p.UnaryOp.TruncF64ToU64,e):s.createUnary(p.UnaryOp.TruncF64ToU32,e):(assert(0==r.flags,"void type expected"),e=s.createDrop(e)):t.is(4)&&r.is(8)?e=11==r.kind?t.is(64)?s.createUnary(t.is(1)?p.UnaryOp.ConvertI64ToF32:p.UnaryOp.ConvertU64ToF32,e):s.createUnary(t.is(1)?p.UnaryOp.ConvertI32ToF32:p.UnaryOp.ConvertU32ToF32,e):t.is(64)?s.createUnary(t.is(1)?p.UnaryOp.ConvertI64ToF64:p.UnaryOp.ConvertU64ToF64,e):s.createUnary(t.is(1)?p.UnaryOp.ConvertI32ToF64:p.UnaryOp.ConvertU32ToF64,e):t.is(64)?r==m.Type.bool?(e=s.createBinary(p.BinaryOp.NeI64,e,s.createI64(0)),i=0):r.is(64)||(e=s.createUnary(p.UnaryOp.WrapI64,e)):r.is(64)?(e=s.createUnary(t.is(1)?p.UnaryOp.ExtendI32:p.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_),s.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.GtI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GtI64:p.BinaryOp.GtI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.GtU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GtU64:p.BinaryOp.GtU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.GtU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.GtF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.GtF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=m.Type.bool;break;case d.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.LE)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=m.Type.commonCompatible(n,a,!0)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_),s.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.LeI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.LeI64:p.BinaryOp.LeI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.LeU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.LeU64:p.BinaryOp.LeU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.LeU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.LeF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.LeF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=m.Type.bool;break;case d.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.GE)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=m.Type.commonCompatible(n,a,!0)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_),s.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.GeI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GeI64:p.BinaryOp.GeI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.GeU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GeU64:p.BinaryOp.GeU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.GeU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.GeF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.GeF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=m.Type.bool;break;case d.Token.EQUALS_EQUALS_EQUALS:case d.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,y==d.Token.EQUALS_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.EQ)){o=this.compileBinaryOverload(v,u,r,_,e);break}if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=m.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,d.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.EqI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.EqI64:p.BinaryOp.EqI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.EqI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.EqF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.EqF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=m.Type.bool;break;case d.Token.EXCLAMATION_EQUALS_EQUALS:case d.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,y==d.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.NE)){o=this.compileBinaryOverload(v,u,r,_,e);break}if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=m.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,d.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.NeI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.NeI64:p.BinaryOp.NeI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.NeI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.NeF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.NeF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=m.Type.bool;break;case d.Token.EQUALS:return this.compileAssignment(u,_,t);case d.Token.PLUS_EQUALS:g=!0;case d.Token.PLUS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.ADD)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(_,n,1,0);else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=m.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,_)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.AddI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.AddI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.AddF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.AddF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case d.Token.MINUS_EQUALS:g=!0;case d.Token.MINUS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.SUB)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(_,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=m.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,_)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.SubI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.SubI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.SubF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.SubF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case d.Token.ASTERISK_EQUALS:g=!0;case d.Token.ASTERISK:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.MUL)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(_,n,1,1);else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=m.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,_)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.MulI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.MulI64:p.BinaryOp.MulI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.MulI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.MulF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.MulF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case d.Token.ASTERISK_ASTERISK_EQUALS:g=!0;case d.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.POW)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}var f=void 0;if(11==this.currentType.kind){if(i=this.compileExpression(_,m.Type.f32,1,0),a=this.currentType,!(f=this.f32PowInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=c.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),o=c.createUnreachable();break}assert(T.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=f=this.resolver.resolveFunction(T,null)}}else if(r=this.convertExpression(r,this.currentType,m.Type.f64,1,0,u),n=this.currentType,i=this.compileExpression(_,m.Type.f64,1,0),a=this.currentType,!(f=this.f64PowInstance)){if(!(E=this.program.elementsLookup.get("Math"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=c.createUnreachable();break}if(!(T=E.members?E.members.get("pow"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),o=c.createUnreachable();break}assert(T.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):c.createUnreachable();break;case d.Token.SLASH_EQUALS:g=!0;case d.Token.SLASH:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.DIV)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(_,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=m.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_)}switch(this.currentType.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.DivI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.DivI64:p.BinaryOp.DivI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.DivU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.DivU64:p.BinaryOp.DivU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.DivU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.DivF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.DivF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case d.Token.PERCENT_EQUALS:g=!0;case d.Token.PERCENT:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.REM)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(_,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=m.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_)}switch(this.currentType.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.RemI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.RemI64:p.BinaryOp.RemI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.RemU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.RemU64:p.BinaryOp.RemU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.RemU64,r,i);break;case 11:if(!(f=this.f32ModInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=c.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),o=c.createUnreachable();break}assert(T.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):c.createUnreachable();break;case 12:if(!(f=this.f64ModInstance)){var E,T;if(!(E=this.program.elementsLookup.get("Math"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=c.createUnreachable();break}if(!(T=E.members?E.members.get("mod"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),o=c.createUnreachable();break}assert(T.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=f=this.resolver.resolveFunction(T,null)}o=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):c.createUnreachable();break;default:assert(!1),o=c.createUnreachable()}break;case d.Token.LESSTHAN_LESSTHAN_EQUALS:g=!0;case d.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_SHL)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(_,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.ShlI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.ShlI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShlI64:p.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,d.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case d.Token.GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case d.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_SHR)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(_,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.ShrI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.ShrI64,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrI64:p.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.ShrU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.ShrU64,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrU64:p.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,d.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case d.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:g=!0;case d.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_SHR_U)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(_,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:o=c.createBinary(p.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:o=c.createBinary(p.BinaryOp.ShrU32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.ShrU64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrU64:p.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,d.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case d.Token.AMPERSAND_EQUALS:g=!0;case d.Token.AMPERSAND:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_AND)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(_,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=m.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,_)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.AndI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.AndI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.AndI64:p.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,d.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case d.Token.BAR_EQUALS:g=!0;case d.Token.BAR:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_OR)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(_,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=m.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,_)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=c.createBinary(p.BinaryOp.OrI32,r,i);break;case 2:case 7:o=c.createBinary(p.BinaryOp.OrI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.OrI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.OrI64:p.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,d.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case d.Token.CARET_EQUALS:g=!0;case d.Token.CARET:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){var I,v;if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_XOR)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(g)i=this.compileExpression(_,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=m.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,_)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=c.createBinary(p.BinaryOp.XorI32,r,i);break;case 2:case 7:o=c.createBinary(p.BinaryOp.XorI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.XorI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.XorI64:p.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,d.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case d.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,i=this.compileExpression(_,n,1,0),a=this.currentType,o=c.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),o=c.createIf(this.makeIsTrueish(r,this.currentType),i,o);else{var A=this.currentFunction.flow,C=this.currentFunction.getAndFreeTempLocal(this.currentType,!A.canOverflow(r,this.currentType));o=c.createIf(this.makeIsTrueish(c.createTeeLocal(C.index,r),this.currentType),i,c.createGetLocal(assert(C).index,this.currentType.toNativeType()))}break;case d.Token.BAR_BAR:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,i=this.compileExpression(_,n,1,0),a=this.currentType,o=this.module.cloneExpression(r,!0,0))o=this.module.createIf(this.makeIsTrueish(r,this.currentType),o,i);else{A=this.currentFunction.flow,C=this.currentFunction.getAndFreeTempLocal(this.currentType,!A.canOverflow(r,this.currentType));o=c.createIf(this.makeIsTrueish(c.createTeeLocal(C.index,r),this.currentType),c.createGetLocal(assert(C).index,this.currentType.toNativeType()),i)}break;default:assert(!1),o=this.module.createUnreachable()}return g?this.compileAssignmentWithValue(u,o,t!=m.Type.void):o},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(u.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a,e.hasDecorator(h.DecoratorFlags.INLINE))},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,s=0;if(e.is(u.CommonFlags.INSTANCE)){var o=assert(e.parent);assert(o.kind==h.ElementKind.CLASS),s=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,s,e.hasDecorator(h.DecoratorFlags.INLINE))},t.prototype.compileAssignment=function(e,t,r){var n,i=this.program.resolver,a=this.currentFunction,s=i.resolveExpression(e,a);if(!s)return this.module.createUnreachable();switch(s.kind){case h.ElementKind.GLOBAL:if(!this.compileGlobal(s))return this.module.createUnreachable();assert(s.type!=m.Type.void);case h.ElementKind.LOCAL:case h.ElementKind.FIELD:n=s.type;break;case h.ElementKind.PROPERTY:var o=s.setterPrototype;if(o){var c=this.resolver.resolveFunction(o,null);if(!c)return this.module.createUnreachable();assert(1==c.signature.parameterTypes.length),n=c.signature.parameterTypes[0];break}return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,s.internalName),this.module.createUnreachable();case h.ElementKind.CLASS:if(i.currentElementExpression){var p=a.flow.is(4096),u=s.lookupOverload(h.OperatorKind.INDEXED_SET,p);if(!u)return s.lookupOverload(h.OperatorKind.INDEXED_GET,p)?this.error(l.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,s.internalName):this.error(l.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,s.internalName),this.module.createUnreachable();assert(2==u.signature.parameterTypes.length),n=u.signature.parameterTypes[1];break}default:return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=m.Type.void);var d=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,d,r!=m.Type.void)},t.prototype.compileAssignmentWithValue=function(e,t,r){void 0===r&&(r=!1);var n=this.module,i=this.resolver.resolveExpression(e,this.currentFunction);if(!i)return n.createUnreachable();switch(i.kind){case h.ElementKind.LOCAL:var a=i.type;if(assert(a!=m.Type.void),this.currentType=r?a:m.Type.void,i.is(u.CommonFlags.CONST))return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();var s=this.currentFunction.flow;return a.is(36)&&s.setLocalWrapped(i.index,!s.canOverflow(t,a)),r?n.createTeeLocal(i.index,t):n.createSetLocal(i.index,t);case h.ElementKind.GLOBAL:if(!this.compileGlobal(i))return n.createUnreachable();a=i.type;if(assert(a!=m.Type.void),this.currentType=r?a:m.Type.void,i.is(u.CommonFlags.CONST))return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();if(t=this.ensureSmallIntegerWrap(t,a),r){var o=a.toNativeType(),c=i.internalName;return n.createBlock(null,[n.createSetGlobal(c,t),n.createGetGlobal(c,o)],o)}return n.createSetGlobal(i.internalName,t);case h.ElementKind.FIELD:var p=i.declaration;if(i.is(u.CommonFlags.READONLY)&&!this.currentFunction.is(u.CommonFlags.CONSTRUCTOR)&&null!=p&&null==p.initializer)return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();var d=assert(this.resolver.currentThisExpression),_=this.compileExpressionRetainType(d,this.options.usizeType,0);a=i.type;this.currentType=r?a:m.Type.void;o=a.toNativeType();if(10==a.kind&&(t=this.ensureSmallIntegerWrap(t,a)),r){s=(L=this.currentFunction).flow;var g=L.getAndFreeTempLocal(a,!s.canOverflow(t,a)).index;return n.createBlock(null,[n.createSetLocal(g,t),n.createStore(a.byteSize,_,n.createGetLocal(g,o),o,i.memoryOffset),n.createGetLocal(g,o)],o)}return n.createStore(a.byteSize,_,t,o,i.memoryOffset);case h.ElementKind.PROPERTY:var y=i.setterPrototype;if(y){var f=this.resolver.resolveFunction(y,null);if(!f)return n.createUnreachable();if(!r){if(f.is(u.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),_=this.compileExpressionRetainType(d,this.options.usizeType,0);return this.makeCallDirect(f,[_,t])}return this.makeCallDirect(f,[t])}var E=i.getterPrototype;assert(null!=E);var T=this.resolver.resolveFunction(E,null);if(!T)return n.createUnreachable();var I=(R=T.signature.returnType).toNativeType();if(f.is(u.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),_=this.compileExpressionRetainType(d,this.options.usizeType,0),g=this.currentFunction.getAndFreeTempLocal(R,!1).index;return n.createBlock(null,[this.makeCallDirect(f,[n.createTeeLocal(g,_),t]),this.makeCallDirect(T,[n.createGetLocal(g,I)])],I)}return n.createBlock(null,[this.makeCallDirect(f,[t]),this.makeCallDirect(T)],I)}return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();case h.ElementKind.CLASS:var v=this.resolver.currentElementExpression;if(v){var A=this.currentFunction.flow.is(4096),C=i.lookupOverload(h.OperatorKind.INDEXED_GET,A);if(!C)return this.error(l.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,i.internalName),n.createUnreachable();var N=i.lookupOverload(h.OperatorKind.INDEXED_SET,A);if(!N)return this.error(l.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,i.internalName),this.currentType=r?C.signature.returnType:m.Type.void,n.createUnreachable();var O=i.type,S=(d=assert(this.resolver.currentThisExpression),_=this.compileExpressionRetainType(d,this.options.usizeType,0),this.compileExpression(v,m.Type.i32,1,0));if(r){var L,k=(L=this.currentFunction).getTempLocal(O,!1),b=L.getAndFreeTempLocal(this.currentType,!1),R=C.signature.returnType;return this.currentFunction.freeTempLocal(k),n.createBlock(null,[this.makeCallDirect(N,[n.createTeeLocal(k.index,_),n.createTeeLocal(b.index,S),t]),this.makeCallDirect(C,[n.createGetLocal(k.index,k.type.toNativeType()),n.createGetLocal(b.index,b.type.toNativeType())])],R.toNativeType())}return this.makeCallDirect(N,[_,S,t])}}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileCallExpression=function(e,t){var r,n,i=this.module,a=this.currentFunction,s=this.resolver.resolveExpression(e.expression,a);if(!s)return i.createUnreachable();switch(s.kind){case h.ElementKind.FUNCTION_PROTOTYPE:var o=s,c=e.typeArguments;if(o.hasDecorator(h.DecoratorFlags.BUILTIN))return this.compileCallExpressionBuiltin(o,e,t);var p=null;if(c){if(!o.is(u.CommonFlags.GENERIC))return this.error(l.DiagnosticCode.Type_0_is_not_generic,e.expression.range,o.internalName),i.createUnreachable();p=this.resolver.resolveFunctionInclTypeArguments(o,c,g.makeMap(this.currentFunction.flow.contextualTypeArguments),e)}else{if(o.is(u.CommonFlags.GENERIC)){for(var d=new Map,y=assert(o.declaration.typeParameters),f=y.length,E=0;Es&&!i)||(this.error(l.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,s.toString(),t.toString()),!1)},t.prototype.compileCallDirect=function(e,t,r,n,i){void 0===n&&(n=0),void 0===i&&(i=!1);var a=t.length,s=e.signature;if(!this.checkCallSignature(s,a,0!=n,r))return this.module.createUnreachable();if(i){if(assert(!e.is(u.CommonFlags.TRAMPOLINE)),!this.currentInlineFunctions.includes(e)){this.currentInlineFunctions.push(e);var o=this.compileCallInlineUnchecked(e,t,r,n);return this.currentInlineFunctions.pop(),o}this.warning(l.DiagnosticCode.Function_0_cannot_be_inlined_into_itself,r.range,e.internalName)}var c=n?a+1:a,p=new Array(c),h=0;n&&(p[0]=n,h=1);for(var d=s.parameterTypes,_=0;_1?g.createBlock(null,v,T.toNativeType()):v.length?v[0]:g.createNop():(this.error(l.DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,y.signature.returnType.range),g.createUnreachable())},t.prototype.ensureTrampoline=function(e){var t=e.trampoline;if(t)return t;var r=e.signature,n=e.internalName,i=r.parameterTypes,a=e.prototype.declaration.signature.parameters,s=r.returnType,o=r.thisType,c=e.is(u.CommonFlags.INSTANCE),d=r.requiredParameters,_=d,g=i.length,y=g;c&&(++_,++y);var f=assert(y-_),E=new Array(_),T=0,I=this.module;c&&(E[0]=I.createGetLocal(0,this.options.nativeSizeType),T=1);for(var v=0;v=i);var o=this.module;if(!this.compileFunction(e))return o.createUnreachable();var c=e.signature.returnType,l=e.is(u.CommonFlags.MODULE_IMPORT);if(r=a),this.ensureFunctionType(e.parameterTypes,e.returnType,e.thisType);var c=this.module;if(n=0),this.currentType=E,this.module.createGetLocal(T,E.toNativeType());case h.ElementKind.GLOBAL:if(!this.compileGlobal(f))return this.module.createUnreachable();var I=f.type;return assert(I!=m.Type.void),f.is(u.CommonFlags.INLINED)?this.compileInlineConstant(f,t,r):(this.currentType=I,this.module.createGetGlobal(f.internalName,I.toNativeType()));case h.ElementKind.ENUMVALUE:return f.is(u.CommonFlags.COMPILED)?(this.currentType=m.Type.i32,f.is(u.CommonFlags.INLINED)?this.module.createI32(f.constantValue):this.module.createGetGlobal(f.internalName,1)):(this.error(l.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=m.Type.i32,this.module.createUnreachable());case h.ElementKind.FUNCTION_PROTOTYPE:var v=this.resolver.resolveFunction(f,null,g.makeMap(i.flow.contextualTypeArguments));if(!v||!this.compileFunction(v))return n.createUnreachable();var A=this.ensureFunctionTableEntry(v);return this.currentType=v.signature.type,this.module.createI32(A)}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileInstanceOfExpression=function(e,t){var r=this.module,n=this.compileExpressionRetainType(e.expression,this.options.usizeType,0),i=this.currentType,a=this.resolver.resolveType(e.isType);return this.currentType=m.Type.bool,a?i.is(512)&&!a.is(512)?i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?p.BinaryOp.NeI64:p.BinaryOp.NeI32,n,i.toNativeZero(r)):r.createI32(0):r.createI32(i.isAssignableTo(a,!0)?1:0):r.createUnreachable()},t.prototype.compileLiteralExpression=function(e,t,r){void 0===r&&(r=!1);var n=this.module;switch(e.literalKind){case _.LiteralKind.ARRAY:assert(!r);var i=t.classReference;return i&&i.prototype==this.program.arrayPrototype?this.compileArrayLiteral(assert(i.typeArguments)[0],e.elementExpressions,!1,e):(this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case _.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==m.Type.f32?n.createF32(a):(this.currentType=m.Type.f64,n.createF64(a));case _.LiteralKind.INTEGER:var s=e.value;r&&(s=i64_sub(i64_new(0),s));var o=this.resolver.determineIntegerLiteralType(s,t);switch(this.currentType=o,o.kind){case 4:if(!this.options.isWasm64)return n.createI32(i64_low(s));case 3:return n.createI64(i64_low(s),i64_high(s));case 9:if(!this.options.isWasm64)return n.createI32(i64_low(s));case 8:return n.createI64(i64_low(s),i64_high(s));case 11:return n.createF32(i64_to_f32(s));case 12:return n.createF64(i64_to_f64(s));default:return n.createI32(i64_low(s))}case _.LiteralKind.STRING:return assert(!r),this.compileStringLiteral(e);case _.LiteralKind.OBJECT:return assert(!r),this.compileObjectLiteral(e,t)}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.currentType=t,n.createUnreachable()},t.prototype.ensureStaticString=function(e){var t,r=this.program,n=r.hasGC,i=r.gcHeaderSize,a=assert(r.stringInstance),s=this.stringSegments;if(s.has(e))t=s.get(e);else{var o=e.length,l=a.currentMemoryOffset+1&-2,p=l+2*o,u=void 0,h=void 0;n?(u=new Uint8Array(i+p),h=i,g.writeI32(c.ensureGCHook(this,a),u,r.gcHookOffset)):(u=new Uint8Array(p),h=0),g.writeI32(o,u,h+a.offsetof("length")),h+=l;for(var d=0;d",t.toString()),r.createUnreachable();var i=n.constructorInstance;if(i){if(i.signature.requiredParameters)return this.error(l.DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,e.range,n.toString()),r.createUnreachable();if(i.is(u.CommonFlags.PRIVATE))return this.error(l.DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable();if(i.is(u.CommonFlags.PROTECTED))return this.error(l.DiagnosticCode.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable()}var a=e.names,s=a.length,o=e.values,p=n.members,d=!1,_=new Array(s+2),m=this.currentFunction.getTempLocal(this.options.usizeType);assert(s==o.length);for(var g=0,y=s;g=0);var c=this.compileExpressionRetainType(o,this.options.usizeType,0);return this.currentType=i.type,n.createLoad(i.type.byteSize,i.type.is(5),c,i.type.toNativeType(),i.memoryOffset);case h.ElementKind.PROPERTY:return this.compileGetter(i,e);case h.ElementKind.FUNCTION_PROTOTYPE:return this.error(l.DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,e.range,i.simpleName),n.createUnreachable()}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileGetter=function(e,t){var r=e.getterPrototype;if(r){var n=this.resolver.resolveFunction(r,null);if(!n)return this.module.createUnreachable();var i=n.signature;if(!this.checkCallSignature(i,0,n.is(u.CommonFlags.INSTANCE),t))return this.module.createUnreachable();var a=0!=(n.decoratorFlags&h.DecoratorFlags.INLINE);if(n.is(u.CommonFlags.INSTANCE)){var s=assert(n.parent);assert(s.kind==h.ElementKind.CLASS);var o=assert(this.resolver.currentThisExpression),c=this.compileExpressionRetainType(o,this.options.usizeType,0);//!!! -return this.currentType=i.returnType,this.compileCallDirect(n,[],t,c,a)}return this.currentType=i.returnType,this.compileCallDirect(n,[],t,0,a)}return this.error(l.DiagnosticCode.Property_0_does_not_exist_on_type_1,t.range,e.simpleName,e.parent.toString()),this.module.createUnreachable()},t.prototype.compileTernaryExpression=function(e,t){var r=e.ifThen,n=e.ifElse,i=this.currentFunction,a=i.flow,s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,m.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(u.CommonFlags.GENERIC|u.CommonFlags.GENERIC_CONTEXT)){var o=this.module.precomputeExpression(s);if(p.getExpressionId(o)==p.ExpressionId.Const&&1==p.getExpressionType(o))return p.getConstValueI32(o)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,m.Type.bool,0),this.currentType)}var c=a.fork();i.flow=c;var h=this.compileExpressionRetainType(r,t,0),d=this.currentType;c.free();var _=a.fork();i.flow=_;var g=this.compileExpressionRetainType(n,t,0),y=this.currentType;i.flow=_.free(),a.inheritMutual(c,_);var f=m.Type.commonCompatible(d,y,!1);return f?(h=this.convertExpression(h,d,f,1,0,r),g=this.convertExpression(g,y,f,1,0,n),this.currentType=f,this.module.createIf(s,h,g)):(this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,e.range,d.toString(),y.toString()),this.currentType=t,this.module.createUnreachable())},t.prototype.compileUnaryPostfixExpression=function(e,t){var r=this.module,n=this.currentFunction,i=this.compileExpression(e.operand,t==m.Type.void?m.Type.i32:t,0,0);if(p.getExpressionId(i)==p.ExpressionId.Unreachable)return i;var a,s=this.currentType,o=null;switch(t!=m.Type.void&&(o=n.getTempLocal(s,!1),i=r.createTeeLocal(o.index,i)),e.operator){case d.Token.PLUS_PLUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(p.BinaryOp.AddI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){if(u=this.currentType.classReference)if(_=u.lookupOverload(h.OperatorKind.POSTFIX_INC)){a=this.compileUnaryOverload(_,e.operand,i,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:var c=this.options;a=r.createBinary(c.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(p.BinaryOp.AddI64,i,r.createI64(1));break;case 11:a=r.createBinary(p.BinaryOp.AddF32,i,r.createF32(1));break;case 12:a=r.createBinary(p.BinaryOp.AddF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;case d.Token.MINUS_MINUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(p.BinaryOp.SubI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){var u,_;if(u=this.currentType.classReference)if(_=u.lookupOverload(h.OperatorKind.POSTFIX_DEC)){a=this.compileUnaryOverload(_,e.operand,i,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:c=this.options;a=r.createBinary(c.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(p.BinaryOp.SubI64,i,r.createI64(1));break;case 11:a=r.createBinary(p.BinaryOp.SubF32,i,r.createF32(1));break;case 12:a=r.createBinary(p.BinaryOp.SubF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;default:return assert(!1),r.createUnreachable()}if(!o)return this.currentType=m.Type.void,this.compileAssignmentWithValue(e.operand,a,!1);var g=this.compileAssignmentWithValue(e.operand,a,!1);this.currentType=o.type,n.freeTempLocal(o);var y=o.type.toNativeType();return r.createBlock(null,[g,r.createGetLocal(o.index,y)],y)},t.prototype.compileUnaryPrefixExpression=function(e,t){var r,n=this.module,i=!1;switch(e.operator){case d.Token.PLUS:if(r=this.compileExpression(e.operand,t==m.Type.void?m.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.PLUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case d.Token.MINUS:if(e.operand.kind==_.NodeKind.LITERAL&&(e.operand.literalKind==_.LiteralKind.INTEGER||e.operand.literalKind==_.LiteralKind.FLOAT)){r=this.compileLiteralExpression(e.operand,t,!0),this.options.sourceMap&&this.addDebugLocation(r,e.range);break}if(r=this.compileExpression(e.operand,t==m.Type.void?m.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.MINUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(p.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(p.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(p.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case d.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==m.Type.void?m.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(p.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(p.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case d.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==m.Type.void?m.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(p.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(p.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case d.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==m.Type.void?m.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=m.Type.bool;break;case d.Token.TILDE:if(r=this.compileExpression(e.operand,t==m.Type.void?m.Type.i32:t.is(8)?m.Type.i64:t,0,0),this.currentType.is(256)){var a,s;if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(r=this.convertExpression(r,this.currentType,this.currentType.intType,1,0,e.operand),this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.XorI64:p.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case d.Token.TYPEOF:return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=m.Type.void):r},t.prototype.ensureSmallIntegerWrap=function(e,t){var r=this.module,n=this.currentFunction.flow;switch(t.kind){case 0:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(p.UnaryOp.ExtendI8ToI32,e):r.createBinary(p.BinaryOp.ShrI32,r.createBinary(p.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(p.UnaryOp.ExtendI16ToI32,e):r.createBinary(p.BinaryOp.ShrI32,r.createBinary(p.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.NeI32,e,r.createI32(0)))}return e},t.prototype.makeIsFalseish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return r.createUnary(p.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(p.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?p.UnaryOp.EqzI64:p.UnaryOp.EqzI32,e);case 11:return r.createBinary(p.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(p.BinaryOp.EqF64,e,r.createF64(0));default:return assert(!1),r.createI32(1)}},t.prototype.makeIsTrueish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return e;case 3:case 8:return r.createBinary(p.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(p.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(p.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(p.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocate=function(e,t){var r,n,i=this.module,s=this.currentFunction,o=this.options.nativeSizeType,l=s.getTempLocal(e.type,!1),p=new Array;if(p.push(i.createSetLocal(l.index,c.compileAllocate(this,e,t))),e.members)try{for(var d=a(e.members.values()),_=d.next();!_.done;_=d.next()){var m=_.value;if(m.kind==h.ElementKind.FIELD){var g=m,y=g.type,f=y.toNativeType(),E=g.prototype.declaration;if(assert(!g.isAny(u.CommonFlags.CONST)),E.initializer)p.push(i.createStore(y.byteSize,i.createGetLocal(l.index,o),this.compileExpression(E.initializer,y,1,0),f,g.memoryOffset));else{var T=g.prototype.declaration.parameterIndex;p.push(i.createStore(y.byteSize,i.createGetLocal(l.index,o),T>=0?i.createGetLocal(1+T,f):y.toNativeZero(i),f,g.memoryOffset))}}}}catch(e){r={error:e}}finally{try{_&&!_.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}return p.push(i.createGetLocal(l.index,o)),s.freeTempLocal(l),this.currentType=e.type,i.createBlock(null,p,o)},t.prototype.makeConditionalAllocate=function(e,t){var r=this.module,n=this.options.nativeSizeType;return this.currentType=e.type,r.createIf(2==n?r.createBinary(p.BinaryOp.NeI64,r.createGetLocal(0,2),r.createI64(0)):r.createGetLocal(0,1),r.createGetLocal(0,n),r.createTeeLocal(0,this.makeAllocate(e,t)))},t.prototype.addDebugLocation=function(e,t){var r=this.currentFunction,n=t.source;n.debugInfoIndex<0&&(n.debugInfoIndex=this.module.addDebugInfoFile(n.normalizedPath)),t.debugInfoRef=e,r.debugLocations.push(t)},t}(l.DiagnosticEmitter);function I(e,t){if(f=t.range.source.simplePath,E=t.programLevelInternalName,e.hasDecorator(h.DecoratorFlags.EXTERNAL)){var r=e.program,n=assert(_.findDecorator(_.DecoratorKind.EXTERNAL,t.decorators)),i=n.arguments;if(i&&i.length){var a=i[0];a.kind==_.NodeKind.LITERAL&&a.literalKind==_.LiteralKind.STRING?(E=a.value,i.length>=2&&((a=i[1]).kind==_.NodeKind.LITERAL&&a.literalKind==_.LiteralKind.STRING?(f=E,E=a.value,i.length>2&&r.error(l.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(l.DiagnosticCode.String_literal_expected,a.range))):r.error(l.DiagnosticCode.String_literal_expected,a.range)}else r.error(l.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=T},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.Operation_not_supported=100]="Operation_not_supported",e[e.Operation_is_unsafe=101]="Operation_is_unsafe",e[e.User_defined_0=102]="User_defined_0",e[e.Conversion_from_type_0_to_1_requires_an_explicit_cast=200]="Conversion_from_type_0_to_1_requires_an_explicit_cast",e[e.Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit=201]="Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit",e[e.Type_0_cannot_be_changed_to_type_1=202]="Type_0_cannot_be_changed_to_type_1",e[e.Type_0_cannot_be_reinterpreted_as_type_1=203]="Type_0_cannot_be_reinterpreted_as_type_1",e[e.Basic_type_0_cannot_be_nullable=204]="Basic_type_0_cannot_be_nullable",e[e.Cannot_export_a_mutable_global=205]="Cannot_export_a_mutable_global",e[e.Compiling_constant_with_non_constant_initializer_as_mutable=206]="Compiling_constant_with_non_constant_initializer_as_mutable",e[e.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa=207]="Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa",e[e.Unmanaged_classes_cannot_implement_interfaces=208]="Unmanaged_classes_cannot_implement_interfaces",e[e.Invalid_regular_expression_flags=209]="Invalid_regular_expression_flags",e[e.Implementation_0_must_match_the_signature_1=210]="Implementation_0_must_match_the_signature_1",e[e.Class_0_is_sealed_and_cannot_be_extended=211]="Class_0_is_sealed_and_cannot_be_extended",e[e.Decorator_0_is_not_valid_here=212]="Decorator_0_is_not_valid_here",e[e.Duplicate_decorator=213]="Duplicate_decorator",e[e.An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf=214]="An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf",e[e.Optional_parameter_must_have_an_initializer=215]="Optional_parameter_must_have_an_initializer",e[e.Constructor_of_class_0_must_not_require_any_arguments=216]="Constructor_of_class_0_must_not_require_any_arguments",e[e.Function_0_cannot_be_inlined_into_itself=217]="Function_0_cannot_be_inlined_into_itself",e[e.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set=218]="Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set",e[e.Optional_properties_are_not_supported=219]="Optional_properties_are_not_supported",e[e.Unterminated_string_literal=1002]="Unterminated_string_literal",e[e.Identifier_expected=1003]="Identifier_expected",e[e._0_expected=1005]="_0_expected",e[e.A_file_cannot_have_a_reference_to_itself=1006]="A_file_cannot_have_a_reference_to_itself",e[e.Trailing_comma_not_allowed=1009]="Trailing_comma_not_allowed",e[e.Unexpected_token=1012]="Unexpected_token",e[e.A_rest_parameter_must_be_last_in_a_parameter_list=1014]="A_rest_parameter_must_be_last_in_a_parameter_list",e[e.Parameter_cannot_have_question_mark_and_initializer=1015]="Parameter_cannot_have_question_mark_and_initializer",e[e.A_required_parameter_cannot_follow_an_optional_parameter=1016]="A_required_parameter_cannot_follow_an_optional_parameter",e[e.Statements_are_not_allowed_in_ambient_contexts=1036]="Statements_are_not_allowed_in_ambient_contexts",e[e.Initializers_are_not_allowed_in_ambient_contexts=1039]="Initializers_are_not_allowed_in_ambient_contexts",e[e._0_modifier_cannot_be_used_here=1042]="_0_modifier_cannot_be_used_here",e[e.A_rest_parameter_cannot_be_optional=1047]="A_rest_parameter_cannot_be_optional",e[e.A_rest_parameter_cannot_have_an_initializer=1048]="A_rest_parameter_cannot_have_an_initializer",e[e.A_set_accessor_must_have_exactly_one_parameter=1049]="A_set_accessor_must_have_exactly_one_parameter",e[e.A_set_accessor_parameter_cannot_have_an_initializer=1052]="A_set_accessor_parameter_cannot_have_an_initializer",e[e.A_get_accessor_cannot_have_parameters=1054]="A_get_accessor_cannot_have_parameters",e[e.Enum_member_must_have_initializer=1061]="Enum_member_must_have_initializer",e[e.Type_parameters_cannot_appear_on_a_constructor_declaration=1092]="Type_parameters_cannot_appear_on_a_constructor_declaration",e[e.Type_annotation_cannot_appear_on_a_constructor_declaration=1093]="Type_annotation_cannot_appear_on_a_constructor_declaration",e[e.An_accessor_cannot_have_type_parameters=1094]="An_accessor_cannot_have_type_parameters",e[e.A_set_accessor_cannot_have_a_return_type_annotation=1095]="A_set_accessor_cannot_have_a_return_type_annotation",e[e.Type_parameter_list_cannot_be_empty=1098]="Type_parameter_list_cannot_be_empty",e[e.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement=1104]="A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement",e[e.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement=1105]="A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement",e[e.A_return_statement_can_only_be_used_within_a_function_body=1108]="A_return_statement_can_only_be_used_within_a_function_body",e[e.Expression_expected=1109]="Expression_expected",e[e.Type_expected=1110]="Type_expected",e[e.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement=1113]="A_default_clause_cannot_appear_more_than_once_in_a_switch_statement",e[e.Duplicate_label_0=1114]="Duplicate_label_0",e[e.Octal_literals_are_not_allowed_in_strict_mode=1121]="Octal_literals_are_not_allowed_in_strict_mode",e[e.Digit_expected=1124]="Digit_expected",e[e.Hexadecimal_digit_expected=1125]="Hexadecimal_digit_expected",e[e.Unexpected_end_of_text=1126]="Unexpected_end_of_text",e[e.Invalid_character=1127]="Invalid_character",e[e._case_or_default_expected=1130]="_case_or_default_expected",e[e.A_declare_modifier_cannot_be_used_in_an_already_ambient_context=1038]="A_declare_modifier_cannot_be_used_in_an_already_ambient_context",e[e.Type_argument_expected=1140]="Type_argument_expected",e[e.String_literal_expected=1141]="String_literal_expected",e[e.Line_break_not_permitted_here=1142]="Line_break_not_permitted_here",e[e.Declaration_expected=1146]="Declaration_expected",e[e._const_declarations_must_be_initialized=1155]="_const_declarations_must_be_initialized",e[e.Unterminated_regular_expression_literal=1161]="Unterminated_regular_expression_literal",e[e.Interface_declaration_cannot_have_implements_clause=1176]="Interface_declaration_cannot_have_implements_clause",e[e.Binary_digit_expected=1177]="Binary_digit_expected",e[e.Octal_digit_expected=1178]="Octal_digit_expected",e[e.An_implementation_cannot_be_declared_in_ambient_contexts=1183]="An_implementation_cannot_be_declared_in_ambient_contexts",e[e.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive=1198]="An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive",e[e.Unterminated_Unicode_escape_sequence=1199]="Unterminated_Unicode_escape_sequence",e[e.Decorators_are_not_valid_here=1206]="Decorators_are_not_valid_here",e[e._abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration=1242]="_abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration",e[e.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract=1245]="Method_0_cannot_have_an_implementation_because_it_is_marked_abstract",e[e.A_definite_assignment_assertion_is_not_permitted_in_this_context=1255]="A_definite_assignment_assertion_is_not_permitted_in_this_context",e[e.A_class_may_only_extend_another_class=1311]="A_class_may_only_extend_another_class",e[e.A_parameter_property_cannot_be_declared_using_a_rest_parameter=1317]="A_parameter_property_cannot_be_declared_using_a_rest_parameter",e[e.Duplicate_identifier_0=2300]="Duplicate_identifier_0",e[e.Cannot_find_name_0=2304]="Cannot_find_name_0",e[e.Module_0_has_no_exported_member_1=2305]="Module_0_has_no_exported_member_1",e[e.Generic_type_0_requires_1_type_argument_s=2314]="Generic_type_0_requires_1_type_argument_s",e[e.Type_0_is_not_generic=2315]="Type_0_is_not_generic",e[e.Type_0_is_not_assignable_to_type_1=2322]="Type_0_is_not_assignable_to_type_1",e[e.Index_signature_is_missing_in_type_0=2329]="Index_signature_is_missing_in_type_0",e[e._this_cannot_be_referenced_in_current_location=2332]="_this_cannot_be_referenced_in_current_location",e[e._super_can_only_be_referenced_in_a_derived_class=2335]="_super_can_only_be_referenced_in_a_derived_class",e[e.Property_0_does_not_exist_on_type_1=2339]="Property_0_does_not_exist_on_type_1",e[e.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures=2349]="Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures",e[e.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature=2351]="Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature",e[e.A_function_whose_declared_type_is_not_void_must_return_a_value=2355]="A_function_whose_declared_type_is_not_void_must_return_a_value",e[e.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access=2357]="The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access",e[e.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access=2364]="The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access",e[e.Operator_0_cannot_be_applied_to_types_1_and_2=2365]="Operator_0_cannot_be_applied_to_types_1_and_2",e[e._get_and_set_accessor_must_have_the_same_type=2380]="_get_and_set_accessor_must_have_the_same_type",e[e.Constructor_implementation_is_missing=2390]="Constructor_implementation_is_missing",e[e.Function_implementation_is_missing_or_not_immediately_following_the_declaration=2391]="Function_implementation_is_missing_or_not_immediately_following_the_declaration",e[e.Multiple_constructor_implementations_are_not_allowed=2392]="Multiple_constructor_implementations_are_not_allowed",e[e.Duplicate_function_implementation=2393]="Duplicate_function_implementation",e[e.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local=2395]="Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local",e[e.Type_0_has_no_property_1=2460]="Type_0_has_no_property_1",e[e.The_0_operator_cannot_be_applied_to_type_1=2469]="The_0_operator_cannot_be_applied_to_type_1",e[e.In_const_enum_declarations_member_initializer_must_be_constant_expression=2474]="In_const_enum_declarations_member_initializer_must_be_constant_expression",e[e.Export_declaration_conflicts_with_exported_declaration_of_0=2484]="Export_declaration_conflicts_with_exported_declaration_of_0",e[e.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property=2540]="Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property",e[e.The_target_of_an_assignment_must_be_a_variable_or_a_property_access=2541]="The_target_of_an_assignment_must_be_a_variable_or_a_property_access",e[e.Index_signature_in_type_0_only_permits_reading=2542]="Index_signature_in_type_0_only_permits_reading",e[e.Expected_0_arguments_but_got_1=2554]="Expected_0_arguments_but_got_1",e[e.Expected_at_least_0_arguments_but_got_1=2555]="Expected_at_least_0_arguments_but_got_1",e[e.Expected_0_type_arguments_but_got_1=2558]="Expected_0_type_arguments_but_got_1",e[e.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums=2651]="A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums",e[e.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration=2673]="Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration",e[e.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration=2674]="Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration",e[e.Namespace_0_has_no_exported_member_1=2694]="Namespace_0_has_no_exported_member_1",e[e.Required_type_parameters_may_not_follow_optional_type_parameters=2706]="Required_type_parameters_may_not_follow_optional_type_parameters",e[e.File_0_not_found=6054]="File_0_not_found",e[e.Numeric_separators_are_not_allowed_here=6188]="Numeric_separators_are_not_allowed_here",e[e.Multiple_consecutive_numeric_separators_are_not_permitted=6189]="Multiple_consecutive_numeric_separators_are_not_permitted"}(t.DiagnosticCode||(t.DiagnosticCode={})),t.diagnosticCodeToString=function(e){switch(e){case 100:return"Operation not supported.";case 101:return"Operation is unsafe.";case 102:return"User-defined: {0}";case 200:return"Conversion from type '{0}' to '{1}' requires an explicit cast.";case 201:return"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.";case 202:return"Type '{0}' cannot be changed to type '{1}'.";case 203:return"Type '{0}' cannot be reinterpreted as type '{1}'.";case 204:return"Basic type '{0}' cannot be nullable.";case 205:return"Cannot export a mutable global.";case 206:return"Compiling constant with non-constant initializer as mutable.";case 207:return"Unmanaged classes cannot extend managed classes and vice-versa.";case 208:return"Unmanaged classes cannot implement interfaces.";case 209:return"Invalid regular expression flags.";case 210:return"Implementation '{0}' must match the signature '{1}'.";case 211:return"Class '{0}' is sealed and cannot be extended.";case 212:return"Decorator '{0}' is not valid here.";case 213:return"Duplicate decorator.";case 214:return"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.";case 215:return"Optional parameter must have an initializer.";case 216:return"Constructor of class '{0}' must not require any arguments.";case 217:return"Function '{0}' cannot be inlined into itself.";case 218:return"Cannot access method '{0}' without calling it as it requires 'this' to be set.";case 219:return"Optional properties are not supported.";case 1002:return"Unterminated string literal.";case 1003:return"Identifier expected.";case 1005:return"'{0}' expected.";case 1006:return"A file cannot have a reference to itself.";case 1009:return"Trailing comma not allowed.";case 1012:return"Unexpected token.";case 1014:return"A rest parameter must be last in a parameter list.";case 1015:return"Parameter cannot have question mark and initializer.";case 1016:return"A required parameter cannot follow an optional parameter.";case 1036:return"Statements are not allowed in ambient contexts.";case 1039:return"Initializers are not allowed in ambient contexts.";case 1042:return"'{0}' modifier cannot be used here.";case 1047:return"A rest parameter cannot be optional.";case 1048:return"A rest parameter cannot have an initializer.";case 1049:return"A 'set' accessor must have exactly one parameter.";case 1052:return"A 'set' accessor parameter cannot have an initializer.";case 1054:return"A 'get' accessor cannot have parameters.";case 1061:return"Enum member must have initializer.";case 1092:return"Type parameters cannot appear on a constructor declaration.";case 1093:return"Type annotation cannot appear on a constructor declaration.";case 1094:return"An accessor cannot have type parameters.";case 1095:return"A 'set' accessor cannot have a return type annotation.";case 1098:return"Type parameter list cannot be empty.";case 1104:return"A 'continue' statement can only be used within an enclosing iteration statement.";case 1105:return"A 'break' statement can only be used within an enclosing iteration or switch statement.";case 1108:return"A 'return' statement can only be used within a function body.";case 1109:return"Expression expected.";case 1110:return"Type expected.";case 1113:return"A 'default' clause cannot appear more than once in a 'switch' statement.";case 1114:return"Duplicate label '{0}'.";case 1121:return"Octal literals are not allowed in strict mode.";case 1124:return"Digit expected.";case 1125:return"Hexadecimal digit expected.";case 1126:return"Unexpected end of text.";case 1127:return"Invalid character.";case 1130:return"'case' or 'default' expected.";case 1038:return"A 'declare' modifier cannot be used in an already ambient context.";case 1140:return"Type argument expected.";case 1141:return"String literal expected.";case 1142:return"Line break not permitted here.";case 1146:return"Declaration expected.";case 1155:return"'const' declarations must be initialized.";case 1161:return"Unterminated regular expression literal.";case 1176:return"Interface declaration cannot have 'implements' clause.";case 1177:return"Binary digit expected.";case 1178:return"Octal digit expected.";case 1183:return"An implementation cannot be declared in ambient contexts.";case 1198:return"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.";case 1199:return"Unterminated Unicode escape sequence.";case 1206:return"Decorators are not valid here.";case 1242:return"'abstract' modifier can only appear on a class, method, or property declaration.";case 1245:return"Method '{0}' cannot have an implementation because it is marked abstract.";case 1255:return"A definite assignment assertion '!' is not permitted in this context.";case 1311:return"A class may only extend another class.";case 1317:return"A parameter property cannot be declared using a rest parameter.";case 2300:return"Duplicate identifier '{0}'.";case 2304:return"Cannot find name '{0}'.";case 2305:return"Module '{0}' has no exported member '{1}'.";case 2314:return"Generic type '{0}' requires {1} type argument(s).";case 2315:return"Type '{0}' is not generic.";case 2322:return"Type '{0}' is not assignable to type '{1}'.";case 2329:return"Index signature is missing in type '{0}'.";case 2332:return"'this' cannot be referenced in current location.";case 2335:return"'super' can only be referenced in a derived class.";case 2339:return"Property '{0}' does not exist on type '{1}'.";case 2349:return"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.";case 2351:return"Cannot use 'new' with an expression whose type lacks a construct signature.";case 2355:return"A function whose declared type is not 'void' must return a value.";case 2357:return"The operand of an increment or decrement operator must be a variable or a property access.";case 2364:return"The left-hand side of an assignment expression must be a variable or a property access.";case 2365:return"Operator '{0}' cannot be applied to types '{1}' and '{2}'.";case 2380:return"'get' and 'set' accessor must have the same type.";case 2390:return"Constructor implementation is missing.";case 2391:return"Function implementation is missing or not immediately following the declaration.";case 2392:return"Multiple constructor implementations are not allowed.";case 2393:return"Duplicate function implementation.";case 2395:return"Individual declarations in merged declaration '{0}' must be all exported or all local.";case 2460:return"Type '{0}' has no property '{1}'.";case 2469:return"The '{0}' operator cannot be applied to type '{1}'.";case 2474:return"In 'const' enum declarations member initializer must be constant expression.";case 2484:return"Export declaration conflicts with exported declaration of '{0}'.";case 2540:return"Cannot assign to '{0}' because it is a constant or a read-only property.";case 2541:return"The target of an assignment must be a variable or a property access.";case 2542:return"Index signature in type '{0}' only permits reading.";case 2554:return"Expected {0} arguments, but got {1}.";case 2555:return"Expected at least {0} arguments, but got {1}.";case 2558:return"Expected {0} type arguments, but got {1}.";case 2651:return"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.";case 2673:return"Constructor of class '{0}' is private and only accessible within the class declaration.";case 2674:return"Constructor of class '{0}' is protected and only accessible within the class declaration.";case 2694:return"Namespace '{0}' has no exported member '{1}'.";case 2706:return"Required type parameters may not follow optional type parameters.";case 6054:return"File '{0}' not found.";case 6188:return"Numeric separators are not allowed here.";case 6189:return"Multiple consecutive numeric separators are not permitted.";default:return""}}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o,c=r(1),l=r(4),p=r(3),u=r(7),h=r(0),d=r(2),_=r(6);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(o=t.ReportMode||(t.ReportMode={}));var m=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.program=t,r}return i(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=o.REPORT),e.kind==p.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==p.NodeKind.TYPE);var i=e,a=i.name.text,s=a,_=i.range.source.internalPath+h.PATH_DELIMITER+a,m=this.program.elementsLookup,g=void 0;if((g=m.get(_))||(g=m.get(s)))switch(g.kind){case l.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==o.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,e.range,g.internalName),null):u.Type.i32;case l.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(g,i.typeArguments,d.makeMap(t),e);return y?e.isNullable?y.type.asNullable():y.type:null}var f=this.program.typeAliases.get(a);if(f)return this.resolveType(f.type,t,r);var E=i.typeArguments,T=null;if(E){var I=E.length;T=new Array(I);for(var v=0;v",s+="<"+C+">")}else if(t){var N=t.get(s);if(N)return N}}var O=this.program.typesLookup,S=void 0;if((S=O.get(_))||(S=O.get(s)))return S;if("NATIVE"==a){if(!T||1!=T.length)return r==o.REPORT&&this.error(c.DiagnosticCode.Expected_0_type_arguments_but_got_1,i.range,"1",(E?E.length:1).toString(10)),null;switch(T[0].kind){case 0:case 1:case 2:return u.Type.i32;case 4:if(!this.program.options.isWasm64)return u.Type.i32;case 3:return u.Type.i64;case 5:case 6:case 7:case 10:return u.Type.u32;case 9:if(!this.program.options.isWasm64)return u.Type.u32;case 8:return u.Type.u64;case 11:return u.Type.f32;case 12:return u.Type.f64;case 13:return u.Type.void;default:assert(!1)}}return r==o.REPORT&&this.error(c.DiagnosticCode.Cannot_find_name_0,i.name.range,s),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=o.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,s=a.length,c=new Array(s),l=new Array(s),h=0,d=!1,_=0;_s)return this.error(c.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?p.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var w=new l.Function(e,P,U,A||f,r);return _||e.instances.set(a,_=new Map),_.set(s,w),this.program.instancesLookup.set(P,w),w},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=o.REPORT),assert(e.is(h.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=u.typesToString(t),s=new l.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+h.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return s.flags=e.flags,s.operatorKind=e.operatorKind,s.classTypeArguments=t,s.instances=e.instances,s},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=o.REPORT);var a=null;if(e.is(h.CommonFlags.GENERIC)){if(e.classTypeArguments&&e.applyClassTypeArguments(r),!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==o.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveFunction(e,a,r,i)},t.prototype.resolveClass=function(e,t,r,n){var i,_,m,g,y,f;void 0===r&&(r=d.makeMap()),void 0===n&&(n=o.REPORT);var E=t?u.typesToString(t):"",T=e.instances.get(E);if(T)return T;var I=e.declaration;if(t){var v=I.typeParameters,A=v.length,C=t.length;assert(C==A);for(var N=0;N",k+="<"+E+">"),(T=new l.Class(e,L,k,t,O)).contextualTypeArguments=r,e.instances.set(E,T),this.program.instancesLookup.set(k,T);var b=0;if(O){if(O.members){T.members||(T.members=new Map);try{for(var R=a(O.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){i={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(i)throw i.error}}}b=O.currentMemoryOffset}var D=e.constructorPrototype;if(D){var B=this.resolveFunctionPartially(D,t,n);if(!B)return null;T.constructorInstance=this.resolveFunction(B,null,d.makeMap(),n)}if(e.instanceMembers)try{for(var U=a(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case l.ElementKind.FIELD_PROTOTYPE:T.members||(T.members=new Map);var M=w.declaration,G=null;if(M.type)G=this.resolveType(M.type,T.contextualTypeArguments,n);else{if(null!==O&&null!==O.members){var K=O.members.get(w.simpleName);K&&!K.is(h.CommonFlags.PRIVATE)&&(assert(K.kind==l.ElementKind.FIELD),G=K.type)}G||n==o.REPORT&&this.error(c.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new l.Field(w,k+h.INSTANCE_DELIMITER+w.simpleName,G,M,T);switch(G.byteSize){case 1:break;case 2:1&b&&++b;break;case 4:3&b&&(b=1+(3|b));break;case 8:7&b&&(b=1+(7|b));break;default:assert(!1)}z.memoryOffset=b,b+=G.byteSize,T.members.set(w.simpleName,z);break;case l.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var V=this.resolveFunctionPartially(w,t,n);if(!V)return null;V.internalName=k+h.INSTANCE_DELIMITER+V.simpleName,T.members.set(w.simpleName,V);break;case l.ElementKind.PROPERTY:T.members||(T.members=new Map);var H=assert(w.getterPrototype),X=w.setterPrototype,W=new l.Property(this.program,w.simpleName,k+h.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(H,t,n);if(!Y)return null;if(Y.internalName=k+h.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=k+h.INSTANCE_DELIMITER+Q.simpleName,W.setterPrototype=Q}T.members.set(w.simpleName,W);break;default:assert(!1)}}}catch(e){m={error:e}}finally{try{P&&!P.done&&(g=U.return)&&g.call(U)}finally{if(m)throw m.error}}T.currentMemoryOffset=b;try{for(var q=a(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=s(j.value,2),J=Z[0],$=Z[1];assert(J!=l.OperatorKind.INVALID);var ee=void 0;if($.is(h.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,d.makeMap(),n)}else ee=this.resolveFunction($,null,d.makeMap(),n);if(ee){var re=T.overloads;re||(T.overloads=re=new Map),re.set(J,ee)}}}catch(e){y={error:e}}finally{try{j&&!j.done&&(f=q.return)&&f.call(q)}finally{if(y)throw y.error}}return T},t.prototype.resolveClassInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=o.REPORT);var a=null;if(e.is(h.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==o.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(c.DiagnosticEmitter);t.Resolver=m},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5),i=function(){function e(){this.text=[],this.functionId=0}return e.decompile=function(t){var r=new e;return r.decompile(t),r.finish()},e.prototype.decompile=function(e){throw new Error("not implemented")},e.prototype.decompileFunction=function(e){var t=n.getFunctionName(e)||"$"+this.functionId.toString(10),r=n.getFunctionBody(e);this.push("function "),this.push(t),this.push("(");for(var i=0,s=n.getFunctionParamCount(e);i0&&this.push(", "),this.push("$"),this.push(i.toString(10)),this.push(": "),this.push(a(n.getFunctionParamType(e,i)));this.push("): "),this.push(a(n.getFunctionResultType(e))),this.push(" "),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("{\n"),this.decompileExpression(r),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("\n}\n"),++this.functionId},e.prototype.decompileExpression=function(e){var t,r,i,s,o=n.getExpressionId(e),c=n.getExpressionType(e);switch(o){case n.ExpressionId.Block:for(null!=(r=n.getBlockName(e))&&(this.push(r),this.push(": ")),this.push("{\n"),s=n.getBlockChildCount(e),i=0;i("),this.push(n.getLoadOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getLoadPtr(e)),void this.push(")");case n.ExpressionId.Store:return this.push("store<"),this.push(a(c)),this.push(">("),this.push(n.getStoreOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getStorePtr(e)),this.push(", "),this.decompileExpression(n.getStoreValue(e)),void this.push(")");case n.ExpressionId.Const:switch(c){case 1:return void this.push(n.getConstValueI32(e).toString(10));case 2:return void this.push(i64_to_string(i64_new(n.getConstValueI64Low(e),n.getConstValueI64High(e))));case 3:return void this.push(n.getConstValueF32(e).toString(10));case 4:return void this.push(n.getConstValueF64(e).toString(10))}break;case n.ExpressionId.Unary:switch(n.getUnaryOp(e)){case n.UnaryOp.ClzI32:return this.push("clz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI32:return this.push("ctz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI32:return this.push("popcnt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NegF32:case n.UnaryOp.NegF64:return this.push("-"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.AbsF32:return this.push("abs("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF32:return this.push("ceil("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF32:return this.push("floor("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF32:return this.push("trunc("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF32:return this.push("nearest("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF32:return this.push("sqrt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.EqzI32:case n.UnaryOp.EqzI64:return this.push("!"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ClzI64:return this.push("clz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI64:return this.push("ctz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI64:return this.push("popcnt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.AbsF64:return this.push("abs("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF64:return this.push("ceil("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF64:return this.push("floor("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF64:return this.push("trunc("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF64:return this.push("nearest("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF64:return this.push("sqrt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ExtendI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ExtendU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.WrapI64:case n.UnaryOp.TruncF32ToI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToI64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretF32:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretF64:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ConvertI32ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI32ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.PromoteF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.DemoteF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretI32:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretI64:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")")}break;case n.ExpressionId.Binary:switch(n.getBinaryOp(e)){case n.BinaryOp.AddI32:case n.BinaryOp.AddI64:case n.BinaryOp.AddF32:case n.BinaryOp.AddF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" + "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.SubI32:case n.BinaryOp.SubI64:case n.BinaryOp.SubF32:case n.BinaryOp.SubF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" - "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.MulI32:case n.BinaryOp.MulI64:case n.BinaryOp.MulF32:case n.BinaryOp.MulF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" * "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivI32:case n.BinaryOp.DivI64:case n.BinaryOp.DivF32:case n.BinaryOp.DivF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU32:return this.push("("),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RemI32:case n.BinaryOp.RemI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU32:return this.push("("),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.AndI32:case n.BinaryOp.AndI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" & "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.OrI32:case n.BinaryOp.OrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" | "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.XorI32:case n.BinaryOp.XorI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" ^ "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShlI32:case n.BinaryOp.ShlI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" << "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrU32:case n.BinaryOp.ShrU64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >>> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrI32:case n.BinaryOp.ShrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI32:return this.push("rotl("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI32:return this.push("rotr("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.EqI32:case n.BinaryOp.EqI64:case n.BinaryOp.EqF32:case n.BinaryOp.EqF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" == "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.NeI32:case n.BinaryOp.NeI64:case n.BinaryOp.NeF32:case n.BinaryOp.NeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" != "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtI32:case n.BinaryOp.LtI64:case n.BinaryOp.LtF32:case n.BinaryOp.LtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeI32:case n.BinaryOp.LeI64:case n.BinaryOp.LeF32:case n.BinaryOp.LeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtI32:case n.BinaryOp.GtI64:case n.BinaryOp.GtF32:case n.BinaryOp.GtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeI32:case n.BinaryOp.GeI64:case n.BinaryOp.GeF32:case n.BinaryOp.GeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI64:return this.push("rotl("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI64:return this.push("rotr("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.LtU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.CopysignF32:return this.push("copysign("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF32:return this.push("min("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF32:return this.push("max("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.CopysignF64:return this.push("copysign("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF64:return this.push("min("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF64:return this.push("max("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")")}return;case n.ExpressionId.Select:return this.push("select<"),this.push(a(c)),this.push(">("),this.decompileExpression(n.getSelectThen(e)),this.push(", "),this.decompileExpression(n.getSelectElse(e)),this.push(", "),this.decompileExpression(n.getSelectCondition(e)),void this.push(")");case n.ExpressionId.Drop:return this.decompileExpression(n.getDropValue(e)),void this.push(";\n");case n.ExpressionId.Return:return void((t=n.getReturnValue(e))?(this.push("return "),this.decompileExpression(t),this.push(";\n")):this.push("return;\n"));case n.ExpressionId.Host:switch(n.getHostOp(e)){case n.HostOp.CurrentMemory:return void this.push("memory.size()");case n.HostOp.GrowMemory:return this.push("memory.grow("),this.decompileExpression(n.getHostOperand(e,0)),void this.push(")")}break;case n.ExpressionId.Nop:return void this.push(";\n");case n.ExpressionId.Unreachable:return void this.push("unreachable()");case n.ExpressionId.AtomicCmpxchg:case n.ExpressionId.AtomicRMW:case n.ExpressionId.AtomicWait:case n.ExpressionId.AtomicWake:}throw new Error("not implemented")},e.prototype.push=function(e){this.text.push(e)},e.prototype.finish=function(){var e=this.text.join("");return this.text=[],e},e}();function a(e){switch(e){case 0:return"void";case 1:return"i32";case 2:return"i64";case 3:return"f32";case 4:return"f64";case 5:throw new Error("unreachable type");case-1:throw new Error("auto type");default:throw new Error("unexpected type")}}t.Decompiler=i},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o=r(0),c=r(4),l=r(2),p=function(){function e(e,t){void 0===t&&(t=!1),this.todo=[],this.seen=new Set,this.program=e,this.includePrivate}return e.prototype.walk=function(){var e,t;try{for(var r=a(this.program.moduleLevelExports.values()),n=r.next();!n.done;n=r.next()){var i=n.value;this.visitElement(i.element)}}catch(t){e={error:t}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(e)throw e.error}}for(var s=this.todo;0"),null}if(e.skip(o.Token.BAR)){if(!e.skip(o.Token.NULL))return r||this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=p.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(o.Token.OPENBRACKET);){var g=e.tokenPos;if(!e.skip(o.Token.CLOSEBRACKET))return r||this.error(c.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(g,e.pos);_=!1;if(e.skip(o.Token.BAR)){if(!e.skip(o.Token.NULL))return r||this.error(c.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=p.Node.createType(p.Node.createIdentifierExpression("Array",y),[n],_,e.range(a,e.pos)),_)break}return n},t.prototype.tryParseSignature=function(e){var t,r=e.mark(),n=e.tokenPos,i=null,a=null,s=!1;if(e.skip(o.Token.CLOSEPAREN))s=!0,e.discard(r),i=[];else{s=!1;do{var l=p.ParameterKind.DEFAULT;if(e.skip(o.Token.DOT_DOT_DOT)&&(s=!0,e.discard(r),l=p.ParameterKind.REST),e.skip(o.Token.THIS)){if(!e.skip(o.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;s=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return s?this.error(c.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=s,null;var h=p.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(o.Token.QUESTION)&&(s=!0,e.discard(r),l==p.ParameterKind.REST?this.error(c.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):l=p.ParameterKind.OPTIONAL),e.skip(o.Token.COLON)){s=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=s,null;var _=new p.ParameterNode;_.parameterKind=l,_.name=h,_.type=d,i?i.push(_):i=[_]}else s&&this.error(c.DiagnosticCode.Type_expected,e.range())}}while(e.skip(o.Token.COMMA));if(!e.skip(o.Token.CLOSEPAREN))return s?this.error(c.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=s,null}return e.skip(o.Token.EQUALS_GREATERTHAN)?(s=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,p.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=s,null)):(s?this.error(c.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=s,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=p.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(o.Token.DOT);){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=p.Node.createPropertyAccessExpression(n,p.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(o.Token.OPENPAREN))return p.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return p.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(c.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseVariable=function(e,t,r,n){var i=new Array;do{var a=this.parseVariableDeclaration(e,t,r);if(!a)return null;i.push(a)}while(e.skip(o.Token.COMMA));var s=p.Node.createVariableStatement(i,r,t,e.range(n,e.pos));return e.skip(o.Token.SEMICOLON),s},t.prototype.parseVariableDeclaration=function(e,t,r){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var n=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),i=t;e.skip(o.Token.EXCLAMATION)&&(i|=a.CommonFlags.DEFINITE_ASSIGNMENT);var s=null;e.skip(o.Token.COLON)&&(s=this.parseType(e));var l=null;if(e.skip(o.Token.EQUALS)){if(i&a.CommonFlags.AMBIENT&&this.error(c.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(l=this.parseExpression(e,2)))return null}else i&a.CommonFlags.CONST?i&a.CommonFlags.AMBIENT||this.error(c.DiagnosticCode._const_declarations_must_be_initialized,n.range):s||this.error(c.DiagnosticCode.Type_expected,e.range(e.pos));var u=o.Range.join(n.range,e.range());return i&a.CommonFlags.DEFINITE_ASSIGNMENT&&l&&this.error(c.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),p.Node.createVariableDeclaration(n,s,l,r,i,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=o.Token.IDENTIFIER)return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=o.Token.OPENBRACE)return this.error(c.DiagnosticCode._0_expected,e.range(),"{"),null;for(var s=new Array;!e.skip(o.Token.CLOSEBRACE);){var l=this.parseEnumValue(e,a.CommonFlags.NONE);if(!l)return null;if(s.push(l),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.CLOSEBRACE))break;return this.error(c.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=p.Node.createEnumDeclaration(i,s,r,t,e.range(n,e.pos));return e.skip(o.Token.SEMICOLON),u},t.prototype.parseEnumValue=function(e,t){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(o.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:p.Node.createEnumValueDeclaration(r,n,t,o.Range.join(r.range,e.range()))},t.prototype.parseReturn=function(e){var t=null;if(e.peek(!0)!=o.Token.SEMICOLON&&e.nextToken!=o.Token.CLOSEBRACE&&!e.nextTokenOnNewLine&&!(t=this.parseExpression(e)))return null;var r=p.Node.createReturnStatement(t,e.range());return e.skip(o.Token.SEMICOLON),r},t.prototype.parseTypeParameters=function(e){for(var t=new Array,r=!1;!e.skip(o.Token.GREATERTHAN);){var n=this.parseTypeParameter(e);if(!n)return null;if(null!==n.defaultType?r=!0:r&&(this.error(c.DiagnosticCode.Required_type_parameters_may_not_follow_optional_type_parameters,n.range),n.defaultType=null),t.push(n),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.GREATERTHAN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(c.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==o.Token.IDENTIFIER){var t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(o.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,i.range),null;r=i}var n=null;if(e.skip(o.Token.EQUALS)){var i;if(!(i=this.parseType(e)))return null;if(i.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return p.Node.createTypeParameter(t,r,n,o.Range.join(t.range,e.range()))}return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseParameters=function(e,t){void 0===t&&(t=!1);var r=new Array,n=null,i=!1,a=!1,s=null;if(this.parseParametersThis=null,e.skip(o.Token.THIS)){if(!e.skip(o.Token.COLON))return this.error(c.DiagnosticCode._0_expected,e.range(),":"),null;if(!(s=this.parseType(e)))return null;if(s.kind==p.NodeKind.TYPE?this.parseParametersThis=s:this.error(c.DiagnosticCode.Operation_not_supported,s.range),!e.skip(o.Token.COMMA))return e.skip(o.Token.CLOSEPAREN)?r:(this.error(c.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(o.Token.CLOSEPAREN);){var l=this.parseParameter(e,t);if(!l)return null;switch(n&&!a&&(this.error(c.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),l.parameterKind){default:i&&this.error(c.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,l.name.range);break;case p.ParameterKind.OPTIONAL:i=!0;break;case p.ParameterKind.REST:n=l}if(r.push(l),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.CLOSEPAREN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,i=null,s=a.CommonFlags.NONE;if(t&&(e.skip(o.Token.PUBLIC)?(i=e.range(),s|=a.CommonFlags.PUBLIC):e.skip(o.Token.PROTECTED)?(i=e.range(),s|=a.CommonFlags.PROTECTED):e.skip(o.Token.PRIVATE)&&(i=e.range(),s|=a.CommonFlags.PRIVATE),e.peek()==o.Token.READONLY)){var l=e.mark();e.next(),e.peek()!=o.Token.COLON?(e.discard(l),i||(i=e.range()),s|=a.CommonFlags.READONLY):e.reset(l)}if(e.skip(o.Token.DOT_DOT_DOT)&&(s?this.error(c.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):i=e.range(),r=!0),e.skipIdentifier()){r||(i=e.range());var u=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(o.Token.QUESTION))&&r&&this.error(c.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(o.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=p.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(o.Token.EQUALS)&&(r&&this.error(c.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(c.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=p.Node.createParameter(u,h,d,r?p.ParameterKind.REST:n?p.ParameterKind.OPTIONAL:p.ParameterKind.DEFAULT,o.Range.join(i,e.range()));return _.flags|=s,_}return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),s=-1,l=null;if(e.skip(o.Token.LESSTHAN)){if(s=e.tokenPos,!(l=this.parseTypeParameters(e)))return null;t|=a.CommonFlags.GENERIC}if(!e.skip(o.Token.OPENPAREN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"("),null;s<0&&(s=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&a.CommonFlags.SET);d&&(1!=u.length&&this.error(c.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,i.range),u.length&&u[0].initializer&&this.error(c.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,i.range)),t&a.CommonFlags.GET&&u.length&&this.error(c.DiagnosticCode.A_get_accessor_cannot_have_parameters,i.range);var _=null;if(e.skip(o.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=p.Node.createOmittedType(e.range(e.pos)),d||this.error(c.DiagnosticCode.Type_expected,_.range));var m=p.Node.createSignature(u,_,h,!1,e.range(s,e.pos)),g=null;if(e.skip(o.Token.OPENBRACE)){if(t&a.CommonFlags.AMBIENT&&this.error(c.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(g=this.parseBlockStatement(e,!1)))return null}else t&a.CommonFlags.AMBIENT||this.error(c.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=p.Node.createFunctionDeclaration(i,l,m,g,r,t,e.range(n,e.pos));return e.skip(o.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==o.Token.FUNCTION){if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(o.Token.OPENPAREN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==o.Token.OPENPAREN),t=p.Node.createEmptyIdentifierExpression(e.range(e.tokenPos));var i=e.pos,a=this.parseParameters(e);return a?this.parseFunctionExpressionCommon(e,t,a,n,r,i):null},t.prototype.parseFunctionExpressionCommon=function(e,t,r,n,i,s){void 0===i&&(i=-1),void 0===s&&(s=-1),i<0&&(i=t.range.start),s<0&&(s=i);var l=null;if(e.skip(o.Token.COLON)){if(!(l=this.parseType(e)))return null}else l=p.Node.createOmittedType(e.range(e.pos)),this.error(c.DiagnosticCode.Type_expected,l.range);if(n&&!e.skip(o.Token.EQUALS_GREATERTHAN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=p.Node.createSignature(r,l,null,!1,e.range(s,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(o.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=p.Node.createFunctionDeclaration(t,null,h,u,null,n?a.CommonFlags.ARROW:a.CommonFlags.NONE,e.range(i,e.pos));return p.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var i=e.token==o.Token.INTERFACE;if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var s,l=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(o.Token.LESSTHAN)){if(!(s=this.parseTypeParameters(e)))return null;t|=a.CommonFlags.GENERIC}else s=[];var u=null;if(e.skip(o.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(o.Token.IMPLEMENTS)){i&&this.error(c.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;i||(d||(d=[]),d.push(_))}while(e.skip(o.Token.COMMA))}if(!e.skip(o.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(),"{"),null;var m,g=new Array;if(i?(assert(!d),m=p.Node.createInterfaceDeclaration(l,s,u,g,r,t,e.range(n,e.pos))):m=p.Node.createClassDeclaration(l,s,u,d,g,r,t,e.range(n,e.pos)),!e.skip(o.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,m);if(!y)return null;y.parent=m,g.push(y)}while(!e.skip(o.Token.CLOSEBRACE));return m},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(o.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,i=p.Node.createClassDeclaration(t,[],null,null,n,null,a.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(o.Token.CLOSEBRACE))do{var s=this.parseClassMember(e,i);if(!s)return null;s.parent=i,n.push(s)}while(!e.skip(o.Token.CLOSEBRACE));return p.Node.createClassExpression(i)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==p.NodeKind.INTERFACEDECLARATION,i=new Array;if(e.skip(o.Token.AT)){do{var s=this.parseDecorator(e);if(!s)break;i.push(s)}while(e.skip(o.Token.AT));n&&this.error(c.DiagnosticCode.Decorators_are_not_valid_here,o.Range.join(i[0].range,i[i.length-1].range))}var l=t.flags&a.CommonFlags.AMBIENT;n&&(l|=a.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(o.Token.PUBLIC)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),l|=a.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(o.Token.PRIVATE)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),l|=a.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(o.Token.PROTECTED)&&(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),l|=a.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,m=0,g=0;e.skip(o.Token.STATIC)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),l|=a.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(l|=a.CommonFlags.INSTANCE,e.skip(o.Token.ABSTRACT)&&(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),l|=a.CommonFlags.ABSTRACT,m=e.tokenPos,g=e.pos),t.flags&a.CommonFlags.GENERIC&&(l|=a.CommonFlags.GENERIC_CONTEXT));var y=0,f=0;e.skip(o.Token.READONLY)&&(l|=a.CommonFlags.READONLY,y=e.tokenPos,f=e.pos);var E,T=e.mark(),I=!1,v=!1,A=!1,C=0,N=0;if(n||(e.skip(o.Token.GET)?e.peek(!0,o.IdentifierHandling.PREFER)!=o.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(l|=a.CommonFlags.GET,v=!0,C=e.tokenPos,N=e.pos,l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(o.Token.SET)?e.peek(!0,o.IdentifierHandling.PREFER)!=o.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(l|=a.CommonFlags.SET,A=!0,C=e.tokenPos,N=e.pos,l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly")):e.skip(o.Token.CONSTRUCTOR)&&(I=!0,(l|=a.CommonFlags.CONSTRUCTOR)&a.CommonFlags.STATIC&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),l&a.CommonFlags.ABSTRACT&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly"))),I)E=p.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(o.Token.OPENBRACKET)){l&a.CommonFlags.PUBLIC?this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):l&a.CommonFlags.PROTECTED?this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):l&a.CommonFlags.PRIVATE&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),l&a.CommonFlags.STATIC&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),l&a.CommonFlags.ABSTRACT&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(m,g),"abstract"),l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,f),"readonly");var O=this.parseIndexSignatureDeclaration(e,i);return O?(e.skip(o.Token.SEMICOLON),O):null}if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;E=p.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var S=null;if(e.skip(o.Token.LESSTHAN)){var L=e.tokenPos;if(!(S=this.parseTypeParameters(e)))return null;I?this.error(c.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(L,e.pos)):v||A?this.error(c.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(L,e.pos)):l|=a.CommonFlags.GENERIC}if(e.skip(o.Token.OPENPAREN)){var k=e.tokenPos,b=this.parseParameters(e,I);if(!b)return null;var R=this.parseParametersThis;if(I)for(var x=0,F=b.length;x"),null):null;case o.Token.IDENTIFIER:return p.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case o.Token.THIS:return p.Node.createThisExpression(e.range(r,e.pos));case o.Token.CONSTRUCTOR:return p.Node.createConstructorExpression(e.range(r,e.pos));case o.Token.SUPER:return p.Node.createSuperExpression(e.range(r,e.pos));case o.Token.STRINGLITERAL:return p.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case o.Token.INTEGERLITERAL:return p.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case o.Token.FLOATLITERAL:return p.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case o.Token.SLASH:var E=e.readRegexpPattern();return e.skip(o.Token.SLASH)?p.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(c.DiagnosticCode._0_expected,e.range(),"/"),null);case o.Token.FUNCTION:return this.parseFunctionExpression(e);case o.Token.CLASS:return this.parseClassExpression(e);default:return t==o.Token.ENDOFFILE?this.error(c.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(c.DiagnosticCode.Expression_expected,e.range()),null}},t.prototype.tryParseTypeArgumentsBeforeArguments=function(e){var t=e.mark();if(!e.skip(o.Token.LESSTHAN))return null;var r=new Array;do{if(e.peek()===o.Token.GREATERTHAN)break;var n=this.parseType(e,!0,!0);if(!n)return e.reset(t),null;r.push(n)}while(e.skip(o.Token.COMMA));return e.skip(o.Token.GREATERTHAN)&&e.skip(o.Token.OPENPAREN)?r:(e.reset(t),null)},t.prototype.parseArguments=function(e){for(var t=new Array;!e.skip(o.Token.CLOSEPAREN);){var r=this.parseExpression(e,2);if(!r)return null;if(t.push(r),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.CLOSEPAREN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),")"),null}}return t},t.prototype.parseExpression=function(e,t){void 0===t&&(t=1),assert(0!=t);var r=this.parseExpressionStart(e);if(!r)return null;for(var n,i,a=(r=this.maybeParseCallExpression(e,r)).range.start,s=null;(i=h(n=e.peek()))>=t;){switch(e.next(),n){case o.Token.AS:var l=this.parseType(e);if(!l)return null;r=p.Node.createAssertionExpression(p.AssertionKind.AS,r,l,e.range(a,e.pos));break;case o.Token.INSTANCEOF:var u=this.parseType(e);if(!u)return null;r=p.Node.createInstanceOfExpression(r,u,e.range(a,e.pos));break;case o.Token.OPENBRACKET:if(!(s=this.parseExpression(e)))return null;if(!e.skip(o.Token.CLOSEBRACKET))return this.error(c.DiagnosticCode._0_expected,e.range(),"]"),null;r=p.Node.createElementAccessExpression(r,s,e.range(a,e.pos));break;case o.Token.PLUS_PLUS:case o.Token.MINUS_MINUS:r.kind!=p.NodeKind.IDENTIFIER&&r.kind!=p.NodeKind.ELEMENTACCESS&&r.kind!=p.NodeKind.PROPERTYACCESS&&this.error(c.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=p.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case o.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(o.Token.COLON))return this.error(c.DiagnosticCode._0_expected,e.range(),":"),null;var m=this.parseExpression(e,t>1?2:1);if(!m)return null;r=p.Node.createTernaryExpression(r,_,m,e.range(a,e.pos));break;case o.Token.COMMA:var g=[r];do{if(!(r=this.parseExpression(e,2)))return null;g.push(r)}while(e.skip(o.Token.COMMA));r=p.Node.createCommaExpression(g,e.range(a,e.pos));break;default:if(n==o.Token.DOT){if(e.skipIdentifier())s=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(s=this.parseExpression(e,d(n)?i:i+1)))return null;if(s.kind==p.NodeKind.IDENTIFIER)r=p.Node.createPropertyAccessExpression(r,s,e.range(a,e.pos));else{if(s.kind!=p.NodeKind.CALL)return this.error(c.DiagnosticCode.Identifier_expected,s.range),null;if(!(r=this.joinPropertyCall(e,a,r,s)))return null}}else{if(!(s=this.parseExpression(e,d(n)?i:i+1)))return null;r=p.Node.createBinaryExpression(n,r,s,e.range(a,e.pos))}}r=this.maybeParseCallExpression(e,r)}return r},t.prototype.joinPropertyCall=function(e,t,r,n){var i=n.expression;switch(i.kind){case p.NodeKind.IDENTIFIER:n.expression=p.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case p.NodeKind.CALL:var a=this.joinPropertyCall(e,t,r,i);if(!a)return null;n.expression=a,n.range=e.range(t,e.pos);break;default:return this.error(c.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(p.nodeIsCallable(t.kind))for(var r=null;e.skip(o.Token.OPENPAREN)||p.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=p.Node.createCallExpression(t,r,n,e.range(t.range.start,e.pos))}return t},t.prototype.skipStatement=function(e){for(e.peek(!0),e.nextTokenOnNewLine&&e.next();;){var t=e.peek(!0);if(t==o.Token.ENDOFFILE||t==o.Token.SEMICOLON){e.next();break}if(e.nextTokenOnNewLine)break;switch(e.next()){case o.Token.IDENTIFIER:e.readIdentifier();break;case o.Token.STRINGLITERAL:e.readString();break;case o.Token.INTEGERLITERAL:e.readInteger();break;case o.Token.FLOATLITERAL:e.readFloat()}}},t.prototype.skipBlock=function(e){var t=1,r=!0;do{switch(e.next()){case o.Token.ENDOFFILE:this.error(c.DiagnosticCode._0_expected,e.range(),"}"),r=!1;break;case o.Token.OPENBRACE:++t;break;case o.Token.CLOSEBRACE:--t||(r=!1);break;case o.Token.IDENTIFIER:e.readIdentifier();break;case o.Token.STRINGLITERAL:e.readString();break;case o.Token.INTEGERLITERAL:e.readInteger();break;case o.Token.FLOATLITERAL:e.readFloat()}}while(r)},t}(c.DiagnosticEmitter);function h(e){switch(e){case o.Token.COMMA:return 1;case o.Token.EQUALS:case o.Token.PLUS_EQUALS:case o.Token.MINUS_EQUALS:case o.Token.ASTERISK_ASTERISK_EQUALS:case o.Token.ASTERISK_EQUALS:case o.Token.SLASH_EQUALS:case o.Token.PERCENT_EQUALS:case o.Token.LESSTHAN_LESSTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.AMPERSAND_EQUALS:case o.Token.CARET_EQUALS:case o.Token.BAR_EQUALS:return 4;case o.Token.QUESTION:return 5;case o.Token.BAR_BAR:return 6;case o.Token.AMPERSAND_AMPERSAND:return 7;case o.Token.BAR:return 8;case o.Token.CARET:return 9;case o.Token.AMPERSAND:return 10;case o.Token.EQUALS_EQUALS:case o.Token.EXCLAMATION_EQUALS:case o.Token.EQUALS_EQUALS_EQUALS:case o.Token.EXCLAMATION_EQUALS_EQUALS:return 11;case o.Token.AS:case o.Token.IN:case o.Token.INSTANCEOF:case o.Token.LESSTHAN:case o.Token.GREATERTHAN:case o.Token.LESSTHAN_EQUALS:case o.Token.GREATERTHAN_EQUALS:return 12;case o.Token.LESSTHAN_LESSTHAN:case o.Token.GREATERTHAN_GREATERTHAN:case o.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:return 13;case o.Token.PLUS:case o.Token.MINUS:return 14;case o.Token.ASTERISK:case o.Token.SLASH:case o.Token.PERCENT:return 15;case o.Token.ASTERISK_ASTERISK:return 16;case o.Token.PLUS_PLUS:case o.Token.MINUS_MINUS:return 18;case o.Token.DOT:case o.Token.NEW:case o.Token.OPENBRACKET:return 20}return 0}function d(e){switch(e){case o.Token.EQUALS:case o.Token.PLUS_EQUALS:case o.Token.MINUS_EQUALS:case o.Token.ASTERISK_ASTERISK_EQUALS:case o.Token.ASTERISK_EQUALS:case o.Token.SLASH_EQUALS:case o.Token.PERCENT_EQUALS:case o.Token.LESSTHAN_LESSTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.AMPERSAND_EQUALS:case o.Token.CARET_EQUALS:case o.Token.BAR_EQUALS:case o.Token.QUESTION:case o.Token.ASTERISK_ASTERISK:return!0;default:return!1}}t.Parser=u,function(e){e[e.NONE=0]="NONE",e[e.COMMA=1]="COMMA",e[e.SPREAD=2]="SPREAD",e[e.YIELD=3]="YIELD",e[e.ASSIGNMENT=4]="ASSIGNMENT",e[e.CONDITIONAL=5]="CONDITIONAL",e[e.LOGICAL_OR=6]="LOGICAL_OR",e[e.LOGICAL_AND=7]="LOGICAL_AND",e[e.BITWISE_OR=8]="BITWISE_OR",e[e.BITWISE_XOR=9]="BITWISE_XOR",e[e.BITWISE_AND=10]="BITWISE_AND",e[e.EQUALITY=11]="EQUALITY",e[e.RELATIONAL=12]="RELATIONAL",e[e.SHIFT=13]="SHIFT",e[e.ADDITIVE=14]="ADDITIVE",e[e.MULTIPLICATIVE=15]="MULTIPLICATIVE",e[e.EXPONENTIATED=16]="EXPONENTIATED",e[e.UNARY_PREFIX=17]="UNARY_PREFIX",e[e.UNARY_POSTFIX=18]="UNARY_POSTFIX",e[e.CALL=19]="CALL",e[e.MEMBERACCESS=20]="MEMBERACCESS",e[e.GROUPING=21]="GROUPING"}(t.Precedence||(t.Precedence={}))},function(e,t,r){r(16),e.exports=r(29)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),r(17),r(19),r(20),r(21);var n=r(5);n.Module.prototype.toText=function(){return binaryen.wrapModule(this.ref).emitStackIR()},n.Module.prototype.toAsmjs=function(){return binaryen.wrapModule(this.ref).emitAsmjs()}},function(e,t,r){(function(e){const t=e.Binaryen||r(18);for(var n in e.binaryen=t,t)(n.startsWith("_Binaryen")||n.startsWith("_Relooper"))&&(e[n]=t[n]);e.__memory_allocate=t._malloc,e.__memory_free=t._free,e.__memory_copy=t._memmove,e.__store=function(e,r){t.HEAPU8[e]=r},e.__load=function(e){return t.HEAPU8[e]}}).call(this,r(8))},function(t,r){t.exports=e},function(e,t,r){(function(e){var t="undefined"!=typeof window&&window||void 0!==e&&e||self;t.ASC_TARGET=0;var r=new Float64Array(1),n=new Uint32Array(r.buffer);function i(){Error.captureStackTrace?Error.captureStackTrace(this,i):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}function a(e){this.message=e||"assertion failed",Error.captureStackTrace?Error.captureStackTrace(this,a):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}Object.defineProperties(t.i8=function(e){return e<<24>>24},{MIN_VALUE:{value:-128,writable:!1},MAX_VALUE:{value:127,writable:!1}}),Object.defineProperties(t.i16=function(e){return e<<16>>16},{MIN_VALUE:{value:-32768,writable:!1},MAX_VALUE:{value:32767,writable:!1}}),Object.defineProperties(t.i32=t.isize=function(e){return 0|e},{MIN_VALUE:{value:-2147483648,writable:!1},MAX_VALUE:{value:2147483647,writable:!1}}),Object.defineProperties(t.u8=function(e){return 255&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:255,writable:!1}}),Object.defineProperties(t.u16=function(e){return 65535&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:65535,writable:!1}}),Object.defineProperties(t.u32=t.usize=function(e){return e>>>0},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:4294967295,writable:!1}}),Object.defineProperties(t.bool=function(e){return!!e},{MIN_VALUE:{value:!1,writable:!1},MAX_VALUE:{value:!0,writable:!1}}),Object.defineProperties(t.f32=function(e){return Math.fround(e)},{EPSILON:{value:Math.fround(1.1920929e-7),writable:!1},MIN_VALUE:{value:Math.fround(1.4012985e-45),writable:!1},MAX_VALUE:{value:Math.fround(3.4028235e38),writable:!1},MIN_NORMAL_VALUE:{value:Math.fround(1.17549435e-38),writable:!1},MIN_SAFE_INTEGER:{value:-16777215,writable:!1},MAX_SAFE_INTEGER:{value:16777215,writable:!1}}),Object.defineProperties(t.f64=function(e){return+e},{EPSILON:{value:2.220446049250313e-16,writable:!1},MIN_VALUE:{value:5e-324,writable:!1},MAX_VALUE:{value:1.7976931348623157e308,writable:!1},MIN_NORMAL_VALUE:{value:2.2250738585072014e-308,writable:!1},MIN_SAFE_INTEGER:{value:-9007199254740991,writable:!1},MAX_SAFE_INTEGER:{value:9007199254740991,writable:!1}}),t.clz=Math.clz32,t.ctz=function(e){var t=Math.clz32(e&-e);return e?31-t:t},t.popcnt=function(e){return 16843009*((e=(858993459&(e-=e>>>1&1431655765))+(e>>>2&858993459))+(e>>>4)&252645135)>>>24},t.rotl=function(e,t){return e<<(t&=31)|e>>>32-t},t.rotr=function(e,t){return e>>>(t&=31)|e<<32-t},t.abs=Math.abs,t.max=Math.max,t.min=Math.min,t.ceil=Math.ceil,t.floor=Math.floor,t.nearest=function(e){return.5===Math.abs(e-Math.trunc(e))?2*Math.round(.5*e):Math.round(e)},t.select=function(e,t,r){return r?e:t},t.sqrt=Math.sqrt,t.trunc=Math.trunc,t.copysign=function(e,t){return Math.abs(e)*Math.sign(t)},t.bswap=function(e){var t=e>>8&16711935,r=(16711935&e)<<8;return(t=(e=t|r)>>16&65535)|(r=(65535&e)<<16)},t.bswap16=function(e){return e<<8&65280|e>>8&255|4294901760&e},i.prototype=Object.create(Error.prototype),i.prototype.name="UnreachableError",i.prototype.message="unreachable",t.unreachable=function(){throw new i},a.prototype=Object.create(Error.prototype),a.prototype.name="AssertionError",t.assert=function(e,t){if(e)return e;throw new a(t)},t.changetype=function(e){return e},t.parseI32=function(e,t){return 0|parseInt(e,void 0)},String.fromCharCodes=function(e){return String.fromCharCode.apply(String,e)},String.fromCodePoints=function(e){return String.fromCodePoint.apply(String,e)},t.isInteger=Number.isInteger,t.isFloat=function(e){return"number"==typeof e},t.isReference=function(e){return"object"==typeof e||"string"==typeof e},t.isString=function(e){return"string"==typeof e||e instanceof String},t.isArray=Array.isArray,t.isDefined=function(e){return void 0!==e},t.isConstant=function(e){return!1},t.unchecked=function(e){return e},t.fmod=function(e,t){return e%t},t.fmodf=function(e,t){return Math.fround(e%t)},t.JSMath=Math,t.JSMath.signbit=function(e){return r[0]=e,Boolean(n[1]>>>31&e==e)},t.memory=(()=>{var e=new Uint8Array(0),r=0;return{allocate:t.__memory_allocate||function(t){if(!(t>>>=0))return 0;if(r+t>e.length){var n=e;(e=new Uint8Array(Math.max(65536,e.length+t,2*e.length))).set(n)}var i=r;return 7&(r+=t)&&(r=1+(7|r)),i},fill:t.__memory_fill||function(t,r,n){e.fill(r,t,t+n)},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)},reset:t.__memory_reset||function(){e=new Uint8Array(0),r=0}}})(),t.store=t.__store||function(e,t,r){HEAP[(0|e)+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[(0|e)+(0|t)]}}).call(this,r(8))},function(e,t,r){(function(e){const t=new Float64Array(1),r=new Float32Array(t.buffer),n=new Int32Array(t.buffer);e.f32_as_i32=function(e){return r[0]=e,n[0]},e.i32_as_f32=function(e){return n[0]=e,r[0]},e.f64_as_i64=function(e){return t[0]=e,i64_new(n[0],n[1])},e.i64_as_f64=function(e){return n[0]=i64_low(e),n[1]=i64_high(e),t[0]}}).call(this,r(8))},function(e,t,r){(function(e){const t=e.Long||r(22);e.i64_zero=t.ZERO,e.i64_one=t.ONE,e.i64_new=function(e,r){return t.fromBits(e,r)},e.i64_low=function(e){return e.low},e.i64_high=function(e){return e.high},e.i64_add=function(e,t){return e.add(t)},e.i64_sub=function(e,t){return e.sub(t)},e.i64_mul=function(e,t){return e.mul(t)},e.i64_div=function(e,t){return e.div(t)},e.i64_div_u=function(e,t){return e.toUnsigned().div(t.toUnsigned()).toSigned()},e.i64_rem=function(e,t){return e.mod(t)},e.i64_rem_u=function(e,t){return e.toUnsigned().mod(t.toUnsigned()).toSigned()},e.i64_and=function(e,t){return e.and(t)},e.i64_or=function(e,t){return e.or(t)},e.i64_xor=function(e,t){return e.xor(t)},e.i64_shl=function(e,t){return e.shl(t)},e.i64_shr=function(e,t){return e.shr(t)},e.i64_shr_u=function(e,t){return e.shru(t)},e.i64_not=function(e){return e.not()},e.i64_eq=function(e,t){return e.eq(t)},e.i64_ne=function(e,t){return e.ne(t)},e.i64_align=function(e,r){assert(r&&0==(r&r-1));var n=t.fromInt(r-1);return e.add(n).and(n.not())},e.i64_is_i8=function(e){return 0===e.high&&e.low>=0&&e.low<=i8.MAX_VALUE||-1===e.high&&e.low>=i8.MIN_VALUE&&e.low<0},e.i64_is_i16=function(e){return 0===e.high&&e.low>=0&&e.low<=i16.MAX_VALUE||-1===e.high&&e.low>=i16.MIN_VALUE&&e.low<0},e.i64_is_i32=function(e){return 0===e.high&&e.low>=0||-1===e.high&&e.low<0},e.i64_is_u8=function(e){return 0===e.high&&e.low>=0&&e.low<=u8.MAX_VALUE},e.i64_is_u16=function(e){return 0===e.high&&e.low>=0&&e.low<=u16.MAX_VALUE},e.i64_is_u32=function(e){return 0===e.high},e.i64_is_bool=function(e){return 0===e.high&&(0===e.low||1===e.low)};const n=t.fromNumber(f32.MIN_SAFE_INTEGER),i=t.fromNumber(f32.MAX_SAFE_INTEGER);e.i64_is_f32=function(e){return e.gte(n)&&e.lte(i)};const a=t.fromNumber(f64.MIN_SAFE_INTEGER),s=t.fromNumber(f64.MAX_SAFE_INTEGER);e.i64_is_f64=function(e){return e.gte(a)&&e.lte(s)},e.i64_to_f32=function(t){return e.Math.fround(t.toNumber())},e.i64_to_f64=function(e){return e.toNumber()},e.i64_to_string=function(e,t){return(t?e.toUnsigned():e).toString(10)}}).call(this,r(8))},function(e,t){e.exports=n;var r=null;try{r=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function n(e,t,r){this.low=0|e,this.high=0|t,this.unsigned=!!r}function i(e){return!0===(e&&e.__isLong__)}n.prototype.__isLong__,Object.defineProperty(n.prototype,"__isLong__",{value:!0}),n.isLong=i;var a={},s={};function o(e,t){var r,n,i;return t?(i=0<=(e>>>=0)&&e<256)&&(n=s[e])?n:(r=l(e,(0|e)<0?-1:0,!0),i&&(s[e]=r),r):(i=-128<=(e|=0)&&e<128)&&(n=a[e])?n:(r=l(e,e<0?-1:0,!1),i&&(a[e]=r),r)}function c(e,t){if(isNaN(e))return t?f:y;if(t){if(e<0)return f;if(e>=_)return A}else{if(e<=-m)return C;if(e+1>=m)return v}return e<0?c(-e,t).neg():l(e%d|0,e/d|0,t)}function l(e,t,r){return new n(e,t,r)}n.fromInt=o,n.fromNumber=c,n.fromBits=l;var p=Math.pow;function u(e,t,r){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return y;if("number"==typeof t?(r=t,t=!1):t=!!t,(r=r||10)<2||360)throw Error("interior hyphen");if(0===n)return u(e.substring(1),t,r).neg();for(var i=c(p(r,8)),a=y,s=0;s>>0:this.low},N.toNumber=function(){return this.unsigned?(this.high>>>0)*d+(this.low>>>0):this.high*d+(this.low>>>0)},N.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((a=o).isZero())return l+s;for(;l.length<6;)l="0"+l;s=""+l+s}},N.getHighBits=function(){return this.high},N.getHighBitsUnsigned=function(){return this.high>>>0},N.getLowBits=function(){return this.low},N.getLowBitsUnsigned=function(){return this.low>>>0},N.getNumBitsAbs=function(){if(this.isNegative())return this.eq(C)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<=0},N.isOdd=function(){return 1==(1&this.low)},N.isEven=function(){return 0==(1&this.low)},N.equals=function(e){return i(e)||(e=h(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},N.eq=N.equals,N.notEquals=function(e){return!this.eq(e)},N.neq=N.notEquals,N.ne=N.notEquals,N.lessThan=function(e){return this.comp(e)<0},N.lt=N.lessThan,N.lessThanOrEqual=function(e){return this.comp(e)<=0},N.lte=N.lessThanOrEqual,N.le=N.lessThanOrEqual,N.greaterThan=function(e){return this.comp(e)>0},N.gt=N.greaterThan,N.greaterThanOrEqual=function(e){return this.comp(e)>=0},N.gte=N.greaterThanOrEqual,N.ge=N.greaterThanOrEqual,N.compare=function(e){if(i(e)||(e=h(e)),this.eq(e))return 0;var t=this.isNegative(),r=e.isNegative();return t&&!r?-1:!t&&r?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},N.comp=N.compare,N.negate=function(){return!this.unsigned&&this.eq(C)?C:this.not().add(E)},N.neg=N.negate,N.add=function(e){i(e)||(e=h(e));var t=this.high>>>16,r=65535&this.high,n=this.low>>>16,a=65535&this.low,s=e.high>>>16,o=65535&e.high,c=e.low>>>16,p=0,u=0,d=0,_=0;return d+=(_+=a+(65535&e.low))>>>16,u+=(d+=n+c)>>>16,p+=(u+=r+o)>>>16,p+=t+s,l((d&=65535)<<16|(_&=65535),(p&=65535)<<16|(u&=65535),this.unsigned)},N.subtract=function(e){return i(e)||(e=h(e)),this.add(e.neg())},N.sub=N.subtract,N.multiply=function(e){if(this.isZero())return y;if(i(e)||(e=h(e)),r)return l(r.mul(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned);if(e.isZero())return y;if(this.eq(C))return e.isOdd()?C:y;if(e.eq(C))return this.isOdd()?C:y;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(g)&&e.lt(g))return c(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,n=65535&this.high,a=this.low>>>16,s=65535&this.low,o=e.high>>>16,p=65535&e.high,u=e.low>>>16,d=65535&e.low,_=0,m=0,f=0,E=0;return f+=(E+=s*d)>>>16,m+=(f+=a*d)>>>16,f&=65535,m+=(f+=s*u)>>>16,_+=(m+=n*d)>>>16,m&=65535,_+=(m+=a*u)>>>16,m&=65535,_+=(m+=s*p)>>>16,_+=t*d+n*u+a*p+s*o,l((f&=65535)<<16|(E&=65535),(_&=65535)<<16|(m&=65535),this.unsigned)},N.mul=N.multiply,N.divide=function(e){if(i(e)||(e=h(e)),e.isZero())throw Error("division by zero");var t,n,a;if(r)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?l((this.unsigned?r.div_u:r.div_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?f:y;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return f;if(e.gt(this.shru(1)))return T;a=f}else{if(this.eq(C))return e.eq(E)||e.eq(I)?C:e.eq(C)?E:(t=this.shr(1).div(e).shl(1)).eq(y)?e.isNegative()?E:I:(n=this.sub(e.mul(t)),a=t.add(n.div(e)));if(e.eq(C))return this.unsigned?f:y;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();a=y}for(n=this;n.gte(e);){t=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var s=Math.ceil(Math.log(t)/Math.LN2),o=s<=48?1:p(2,s-48),u=c(t),d=u.mul(e);d.isNegative()||d.gt(n);)d=(u=c(t-=o,this.unsigned)).mul(e);u.isZero()&&(u=E),a=a.add(u),n=n.sub(d)}return a},N.div=N.divide,N.modulo=function(e){return i(e)||(e=h(e)),r?l((this.unsigned?r.rem_u:r.rem_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},N.mod=N.modulo,N.rem=N.modulo,N.not=function(){return l(~this.low,~this.high,this.unsigned)},N.and=function(e){return i(e)||(e=h(e)),l(this.low&e.low,this.high&e.high,this.unsigned)},N.or=function(e){return i(e)||(e=h(e)),l(this.low|e.low,this.high|e.high,this.unsigned)},N.xor=function(e){return i(e)||(e=h(e)),l(this.low^e.low,this.high^e.high,this.unsigned)},N.shiftLeft=function(e){return i(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?l(this.low<>>32-e,this.unsigned):l(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):l(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},N.shr=N.shiftRight,N.shiftRightUnsigned=function(e){if(i(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?l(this.low>>>e|t<<32-e,t>>>e,this.unsigned):l(32===e?t:t>>>e-32,0,this.unsigned)},N.shru=N.shiftRightUnsigned,N.shr_u=N.shiftRightUnsigned,N.toSigned=function(){return this.unsigned?l(this.low,this.high,!1):this},N.toUnsigned=function(){return this.unsigned?this:l(this.low,this.high,!0)},N.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},N.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},N.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},n.fromBytes=function(e,t,r){return r?n.fromBytesLE(e,t):n.fromBytesBE(e,t)},n.fromBytesLE=function(e,t){return new n(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},n.fromBytesBE=function(e,t){return new n(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},function(e,t,r){"use strict";var n=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i=r(1),a=r(3),s=r(7),o=r(5),c=r(4),l=r(11),p=r(0);function u(e,t,r,n,p,u){var g,y,f,E,T=e.module;switch(t.internalName){case"isInteger":var I=d(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(4)&&!I.is(256)?T.createI32(1):T.createI32(0):T.createUnreachable();case"isFloat":I=d(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(8)?T.createI32(1):T.createI32(0):T.createUnreachable();case"isSigned":I=d(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(1)?T.createI32(1):T.createI32(0):T.createUnreachable();case"isReference":I=d(e,r,n,u);return e.currentType=s.Type.bool,I?(e.currentType=s.Type.bool,I.is(256)?T.createI32(1):T.createI32(0)):T.createUnreachable();case"isString":I=d(e,r,n,u);if(e.currentType=s.Type.bool,!I)return T.createUnreachable();if(B=I.classReference){var v=e.program.stringInstance;if(v&&B.isAssignableTo(v))return T.createI32(1)}return T.createI32(0);case"isArray":I=d(e,r,n,u);return e.currentType=s.Type.bool,I?null!==(B=I.classReference)&&null!==B.lookupOverload(c.OperatorKind.INDEXED_GET)?T.createI32(1):T.createI32(0):T.createUnreachable();case"isDefined":if(e.currentType=s.Type.bool,r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),1!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();var A=e.resolver.resolveExpression(n[0],e.currentFunction,s.Type.void,l.ReportMode.SWALLOW);return T.createI32(A?1:0);case"isConstant":if(e.currentType=s.Type.bool,r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),1!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();var C=e.compileExpressionRetainType(n[0],s.Type.i32,0);return e.currentType=s.Type.bool,T.createI32(o.getExpressionId(C)==o.ExpressionId.Const?1:0);case"isManaged":if(!e.program.hasGC)return e.currentType=s.Type.bool,T.createI32(0);I=d(e,r,n,u);return e.currentType=s.Type.bool,I?null===(B=I.classReference)||B.hasDecorator(c.DecoratorFlags.UNMANAGED)?T.createI32(0):T.createI32(1):T.createUnreachable();case"clz":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=T.createUnary(o.UnaryOp.ClzI32,g);break;case 10:case 2:case 7:E=T.createUnary(o.UnaryOp.ClzI32,g);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable();break}case 4:E=T.createUnary(e.options.isWasm64?o.UnaryOp.ClzI64:o.UnaryOp.ClzI32,g);break;case 3:case 8:E=T.createUnary(o.UnaryOp.ClzI64,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"ctz":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],0,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=T.createUnary(o.UnaryOp.CtzI32,g);break;case 10:case 2:case 7:E=T.createUnary(o.UnaryOp.CtzI32,g);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable();break}case 4:E=T.createUnary(e.options.isWasm64?o.UnaryOp.CtzI64:o.UnaryOp.CtzI32,g);break;case 3:case 8:E=T.createUnary(o.UnaryOp.CtzI64,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"popcnt":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=T.createUnary(o.UnaryOp.PopcntI32,g);break;case 10:case 2:case 7:E=T.createUnary(o.UnaryOp.PopcntI32,g);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable();break}case 4:E=T.createUnary(e.options.isWasm64?o.UnaryOp.PopcntI64:o.UnaryOp.PopcntI32,g);break;case 3:case 8:E=T.createUnary(o.UnaryOp.PopcntI64,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"rotl":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(y=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:E=e.ensureSmallIntegerWrap(T.createBinary(o.BinaryOp.RotlI32,g,y),e.currentType);case 2:case 7:E=T.createBinary(o.BinaryOp.RotlI32,g,y);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable();break}case 4:E=T.createBinary(e.options.isWasm64?o.BinaryOp.RotlI64:o.BinaryOp.RotlI32,g,y);break;case 3:case 8:E=T.createBinary(o.BinaryOp.RotlI64,g,y);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"rotr":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(y=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:E=e.ensureSmallIntegerWrap(T.createBinary(o.BinaryOp.RotrI32,g,y),e.currentType);break;case 2:case 7:E=T.createBinary(o.BinaryOp.RotrI32,g,y);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable();break}case 4:E=T.createBinary(e.options.isWasm64?o.BinaryOp.RotrI64:o.BinaryOp.RotrI32,g,y);break;case 3:case 8:E=T.createBinary(o.BinaryOp.RotrI64,g,y);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"abs":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.f64,0,1);switch(e.currentType.kind){case 0:case 1:case 2:var N=(k=e.currentFunction).getTempLocal(s.Type.i32,!1),O=k.getAndFreeTempLocal(s.Type.i32,!1).index,S=N.index;E=T.createBinary(o.BinaryOp.XorI32,T.createBinary(o.BinaryOp.AddI32,T.createTeeLocal(O,T.createBinary(o.BinaryOp.ShrI32,T.createTeeLocal(S,g),T.createI32(31))),T.createGetLocal(S,1)),T.createGetLocal(O,1)),k.freeTempLocal(N);break;case 4:var L=e.options,k=e.currentFunction,b=L.isWasm64;N=k.getTempLocal(L.usizeType,!1),O=k.getAndFreeTempLocal(L.usizeType,!1).index,S=N.index;E=T.createBinary(b?o.BinaryOp.XorI64:o.BinaryOp.XorI32,T.createBinary(b?o.BinaryOp.AddI64:o.BinaryOp.AddI32,T.createTeeLocal(O,T.createBinary(b?o.BinaryOp.ShrI64:o.BinaryOp.ShrI32,T.createTeeLocal(S,g),b?T.createI64(63):T.createI32(31))),T.createGetLocal(S,L.nativeSizeType)),T.createGetLocal(O,L.nativeSizeType)),k.freeTempLocal(N);break;case 3:N=(k=e.currentFunction).getTempLocal(s.Type.i64,!1),O=k.getAndFreeTempLocal(s.Type.i64,!1).index,S=N.index;E=T.createBinary(o.BinaryOp.XorI64,T.createBinary(o.BinaryOp.AddI64,T.createTeeLocal(O,T.createBinary(o.BinaryOp.ShrI64,T.createTeeLocal(S,g),T.createI64(63))),T.createGetLocal(S,2)),T.createGetLocal(O,2)),k.freeTempLocal(N);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable();break}case 5:case 6:case 7:case 8:case 10:E=g;break;case 11:E=T.createUnary(o.UnaryOp.AbsF32,g);break;case 12:E=T.createUnary(o.UnaryOp.AbsF64,g);break;case 13:E=T.createUnreachable();break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"max":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.f64,0,1);switch(y=e.compileExpression(n[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:var R=e.currentFunction.flow,x=e.currentFunction.getTempLocal(e.currentType,!R.canOverflow(g,e.currentType));N=e.currentFunction.getAndFreeTempLocal(e.currentType,!R.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(x),E=T.createSelect(T.createTeeLocal(x.index,g),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(x.index,1),T.createGetLocal(N.index,1)));break;case 5:case 6:case 7:case 10:R=e.currentFunction.flow,x=e.currentFunction.getTempLocal(e.currentType,!R.canOverflow(g,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!R.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(x),E=T.createSelect(T.createTeeLocal(x.index,g),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(x.index,1),T.createGetLocal(N.index,1)));break;case 3:x=e.currentFunction.getTempLocal(s.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(x),E=T.createSelect(T.createTeeLocal(x.index,g),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(x.index,2),T.createGetLocal(N.index,2)));break;case 8:x=e.currentFunction.getTempLocal(s.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(x),E=T.createSelect(T.createTeeLocal(x.index,g),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(x.index,2),T.createGetLocal(N.index,2)));break;case 4:x=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(x),E=T.createSelect(T.createTeeLocal(x.index,g),T.createTeeLocal(N.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(x.index,e.options.nativeSizeType),T.createGetLocal(N.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable();break}x=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(x),E=T.createSelect(T.createTeeLocal(x.index,g),T.createTeeLocal(N.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(x.index,e.options.nativeSizeType),T.createGetLocal(N.index,e.options.nativeSizeType)));break;case 11:E=T.createBinary(o.BinaryOp.MaxF32,g,y);break;case 12:E=T.createBinary(o.BinaryOp.MaxF64,g,y);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"min":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.f64,0,1);switch(y=e.compileExpression(n[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:R=e.currentFunction.flow,x=e.currentFunction.getTempLocal(e.currentType,!R.canOverflow(g,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!R.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(x),E=T.createSelect(T.createTeeLocal(x.index,g),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(x.index,1),T.createGetLocal(N.index,1)));break;case 5:case 6:case 7:case 10:R=e.currentFunction.flow,x=e.currentFunction.getTempLocal(e.currentType,!R.canOverflow(g,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!R.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(x),E=T.createSelect(T.createTeeLocal(x.index,g),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(x.index,1),T.createGetLocal(N.index,1)));break;case 3:x=e.currentFunction.getTempLocal(s.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(x),E=T.createSelect(T.createTeeLocal(x.index,g),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(x.index,2),T.createGetLocal(N.index,2)));break;case 8:x=e.currentFunction.getTempLocal(s.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(x),E=T.createSelect(T.createTeeLocal(x.index,g),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(x.index,2),T.createGetLocal(N.index,2)));break;case 4:x=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(x),E=T.createSelect(T.createTeeLocal(x.index,g),T.createTeeLocal(N.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(x.index,e.options.nativeSizeType),T.createGetLocal(N.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable();break}x=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(x),E=T.createSelect(T.createTeeLocal(x.index,g),T.createTeeLocal(N.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(x.index,e.options.nativeSizeType),T.createGetLocal(N.index,e.options.nativeSizeType)));break;case 11:E=T.createBinary(o.BinaryOp.MinF32,g,y);break;case 12:E=T.createBinary(o.BinaryOp.MinF64,g,y);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"ceil":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable();break}default:E=g;break;case 11:E=T.createUnary(o.UnaryOp.CeilF32,g);break;case 12:E=T.createUnary(o.UnaryOp.CeilF64,g);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"floor":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable();break}default:E=g;break;case 11:E=T.createUnary(o.UnaryOp.FloorF32,g);break;case 12:E=T.createUnary(o.UnaryOp.FloorF64,g);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"copysign":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(y=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 11:E=T.createBinary(o.BinaryOp.CopysignF32,g,y);break;case 12:E=T.createBinary(o.BinaryOp.CopysignF64,g,y);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"nearest":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable();break}default:E=g;break;case 11:E=T.createUnary(o.UnaryOp.NearestF32,g);break;case 12:E=T.createUnary(o.UnaryOp.NearestF64,g);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"reinterpret":if(1!=n.length)return r&&1==r.length||(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0")),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(!r||1!=r.length)return r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),T.createUnreachable();switch(r[0].kind){case 2:case 7:g=e.compileExpression(n[0],s.Type.f32,1,0),E=T.createUnary(o.UnaryOp.ReinterpretF32,g);break;case 3:case 8:g=e.compileExpression(n[0],s.Type.f64,1,0),E=T.createUnary(o.UnaryOp.ReinterpretF64,g);break;case 9:if(r[0].is(256))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),e.currentType=r[0],T.createUnreachable();case 4:g=e.compileExpression(n[0],e.options.isWasm64?s.Type.f64:s.Type.f32,1,0),E=T.createUnary(e.options.isWasm64?o.UnaryOp.ReinterpretF64:o.UnaryOp.ReinterpretF32,g);break;case 11:g=e.compileExpression(n[0],s.Type.i32,1,0),E=T.createUnary(o.UnaryOp.ReinterpretI32,g);break;case 12:g=e.compileExpression(n[0],s.Type.i64,1,0),E=T.createUnary(o.UnaryOp.ReinterpretI64,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return e.currentType=r[0],E;case"sqrt":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 11:E=T.createUnary(o.UnaryOp.SqrtF32,g);break;case 12:E=T.createUnary(o.UnaryOp.SqrtF64,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"trunc":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r&&r.length){if(e.currentType=r[0],1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable();break}default:E=g;break;case 11:E=T.createUnary(o.UnaryOp.TruncF32,g);break;case 12:E=T.createUnary(o.UnaryOp.TruncF64,g);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"load":return n.length<1||n.length>2?(r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<1?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable()):r&&1==r.length?(g=e.compileExpression(n[0],e.options.usizeType,1,0),(U=2==n.length?_(e,n[1]):0)<0?T.createUnreachable():(e.currentType=r[0],T.createLoad(r[0].byteSize,r[0].is(5),g,r[0].is(4)&&p.is(4)&&p.size>r[0].size?(e.currentType=p).toNativeType():(e.currentType=r[0]).toNativeType(),U))):(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),T.createUnreachable());case"store":if(e.currentType=s.Type.void,n.length<2||n.length>3)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"2",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),T.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),T.createUnreachable();g=e.compileExpression(n[0],e.options.usizeType,1,0),y=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);I=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size1)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),T.createUnreachable();var B;if(!(B=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var U=void 0;if(n.length){if(n[0].kind!=a.NodeKind.LITERAL||n[0].literalKind!=a.LiteralKind.STRING)return e.error(i.DiagnosticCode.String_literal_expected,n[0].range),T.createUnreachable();var P=n[0].value,w=B.members?B.members.get(P):null;if(!w||w.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,B.internalName,P),T.createUnreachable();U=w.memoryOffset}else U=B.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(U)):T.createI64(U):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(U)):T.createI32(U);case"select":if(3!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpressionRetainType(n[0],s.Type.i32,0);I=e.currentType;switch(y=e.compileExpression(n[1],I,1,0),f=e.makeIsTrueish(e.compileExpressionRetainType(n[2],s.Type.bool,0),e.currentType),e.currentType=I,e.currentType.kind){case 0:case 1:case 5:case 6:case 10:default:E=T.createSelect(g,y,f);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=T.createUnreachable()}return E;case"unreachable":return 0!=n.length&&e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"0",n.length.toString(10)),r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),T.createUnreachable();case"memory.size":return e.currentType=s.Type.i32,0!=n.length&&e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"0",n.length.toString(10)),r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),T.createHost(o.HostOp.CurrentMemory);case"memory.grow":return e.currentType=s.Type.i32,1!=n.length?(e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"0",n.length.toString(10)),g=T.createUnreachable()):g=e.compileExpression(n[0],s.Type.i32,1,0),r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),T.createHost(o.HostOp.GrowMemory,null,[g]);case"memory.copy":if(r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),3!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),e.currentType=s.Type.void,T.createUnreachable();throw g=e.compileExpression(n[0],e.options.usizeType,1,0),y=e.compileExpression(n[1],e.options.usizeType,1,0),f=e.compileExpression(n[2],e.options.usizeType,1,0),e.currentType=s.Type.void,new Error("not implemented");case"memory.fill":if(r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),3!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),e.currentType=s.Type.void,T.createUnreachable();throw g=e.compileExpression(n[0],e.options.usizeType,1,0),y=e.compileExpression(n[1],s.Type.u32,1,0),f=e.compileExpression(n[2],e.options.usizeType,1,0),e.currentType=s.Type.void,new Error("not implemented");case"changetype":return r&&1==r.length?1!=n.length?(e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),e.currentType=r[0],T.createUnreachable()):(g=e.compileExpressionRetainType(n[0],r[0],0),e.currentType=r[0],e.currentType.size!=r[0].size?(e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable()):g):(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),T.createUnreachable());case"assert":if(n.length<1||n.length>2)return r&&(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),n.length<1?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)):n.length>2&&e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable();if(r){if(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpressionRetainType(n[0],s.Type.bool,1);I=e.currentType;if(e.currentType=I.nonNullableType,e.options.noAssert)return p==s.Type.void?(e.currentType=s.Type.void,T.createNop()):g;var M=m(e,2==n.length?n[1]:null,u);if(e.currentType=I.nonNullableType,p==s.Type.void){switch(e.currentType.kind){default:E=T.createIf(T.createUnary(o.UnaryOp.EqzI32,g),M);break;case 3:case 8:E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,g),M);break;case 4:case 9:E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,g),M);break;case 11:E=T.createIf(T.createBinary(o.BinaryOp.EqF32,g,T.createF32(0)),M);break;case 12:E=T.createIf(T.createBinary(o.BinaryOp.EqF64,g,T.createF64(0)),M);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=M}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:R=e.currentFunction.flow;var G=e.currentFunction.getAndFreeTempLocal(e.currentType,!R.canOverflow(g,e.currentType));E=T.createIf(T.createTeeLocal(G.index,g),T.createGetLocal(G.index,1),M);break;case 2:case 7:default:G=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);E=T.createIf(T.createTeeLocal(G.index,g),T.createGetLocal(G.index,1),M);break;case 3:case 8:G=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);E=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(G.index,g)),M,T.createGetLocal(G.index,2));break;case 4:case 9:G=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);E=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(G.index,g)),M,T.createGetLocal(G.index,e.options.nativeSizeType));break;case 11:G=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(G.index,g),T.createF32(0)),M,T.createGetLocal(G.index,3));break;case 12:G=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);E=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(G.index,g),T.createF64(0)),M,T.createGetLocal(G.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=M}return E;case"unchecked":return r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),1!=n.length?(e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable()):((R=e.currentFunction.flow).set(4096),E=e.compileExpressionRetainType(n[0],p,0),R.unset(4096),E);case"call_indirect":if(n.length<1)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();var K=void 0;if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();K=r[0]}else K=p;if(g=e.compileExpressionRetainType(n[0],s.Type.u32,0),7!=e.currentType.kind)return e.error(i.DiagnosticCode.Operation_not_supported,n[0].range),T.createUnreachable();for(var z=n.length-1,V=new Array(z),H=new Array(z+1),X=K.toNativeType(),W=new Array(z),Y=0;Y void"),T.createUnreachable())}var ee=function(e,t,r,n,i){switch(t.internalName){case"i32.clz":return h("clz",e,s.Type.i32,r,s.Type.i32,i);case"i64.clz":return h("clz",e,s.Type.i64,r,s.Type.i64,i);case"i32.ctz":return h("ctz",e,s.Type.i32,r,s.Type.i32,i);case"i64.ctz":return h("ctz",e,s.Type.i64,r,s.Type.i64,i);case"i32.popcnt":return h("popcnt",e,s.Type.i32,r,s.Type.i32,i);case"i64.popcnt":return h("popcnt",e,s.Type.i64,r,s.Type.i64,i);case"i32.rotl":return h("rotl",e,s.Type.i32,r,s.Type.i32,i);case"i64.rotl":return h("rotl",e,s.Type.i64,r,s.Type.i64,i);case"i32.rotr":return h("rotr",e,s.Type.i32,r,s.Type.i32,i);case"i64.rotr":return h("rotr",e,s.Type.i64,r,s.Type.i64,i);case"f32.abs":return h("abs",e,s.Type.f32,r,s.Type.f32,i);case"f64.abs":return h("abs",e,s.Type.f64,r,s.Type.f64,i);case"f32.max":return h("max",e,s.Type.f32,r,s.Type.f32,i);case"f64.max":return h("max",e,s.Type.f64,r,s.Type.f64,i);case"f32.min":return h("min",e,s.Type.f32,r,s.Type.f32,i);case"f64.min":return h("min",e,s.Type.f64,r,s.Type.f64,i);case"f32.ceil":return h("ceil",e,s.Type.f32,r,s.Type.f32,i);case"f64.ceil":return h("ceil",e,s.Type.f64,r,s.Type.f64,i);case"f32.floor":return h("floor",e,s.Type.f32,r,s.Type.f32,i);case"f64.floor":return h("floor",e,s.Type.f64,r,s.Type.f64,i);case"f32.copysign":return h("copysign",e,s.Type.f32,r,s.Type.f32,i);case"f64.copysign":return h("copysign",e,s.Type.f64,r,s.Type.f64,i);case"f32.nearest":return h("nearest",e,s.Type.f32,r,s.Type.f32,i);case"f64.nearest":return h("nearest",e,s.Type.f64,r,s.Type.f64,i);case"i32.reinterpret_f32":return h("reinterpret",e,s.Type.i32,r,s.Type.f32,i);case"i64.reinterpret_f64":return h("reinterpret",e,s.Type.i64,r,s.Type.f64,i);case"f32.reinterpret_i32":return h("reinterpret",e,s.Type.f32,r,s.Type.i32,i);case"f64.reinterpret_i64":return h("reinterpret",e,s.Type.f64,r,s.Type.i64,i);case"f32.sqrt":return h("sqrt",e,s.Type.f32,r,s.Type.f32,i);case"f64.sqrt":return h("sqrt",e,s.Type.f64,r,s.Type.f64,i);case"f32.trunc":return h("trunc",e,s.Type.f32,r,s.Type.f32,i);case"f64.trunc":return h("trunc",e,s.Type.f64,r,s.Type.f64,i);case"i32.load8_s":return h("load",e,s.Type.i8,r,s.Type.i32,i);case"i32.load8_u":return h("load",e,s.Type.u8,r,s.Type.u32,i);case"i32.load16_s":return h("load",e,s.Type.i16,r,s.Type.i32,i);case"i32.load16_u":return h("load",e,s.Type.u16,r,s.Type.u32,i);case"i32.load":return h("load",e,s.Type.i32,r,s.Type.i32,i);case"i64.load8_s":return h("load",e,s.Type.i8,r,s.Type.i64,i);case"i64.load8_u":return h("load",e,s.Type.u8,r,s.Type.u64,i);case"i64.load16_s":return h("load",e,s.Type.i16,r,s.Type.i64,i);case"i64.load16_u":return h("load",e,s.Type.u16,r,s.Type.u64,i);case"i64.load32_s":return h("load",e,s.Type.i32,r,s.Type.i64,i);case"i64.load32_u":return h("load",e,s.Type.u32,r,s.Type.u64,i);case"i64.load":return h("load",e,s.Type.i64,r,s.Type.i64,i);case"f32.load":return h("load",e,s.Type.f32,r,s.Type.f32,i);case"f64.load":return h("load",e,s.Type.f64,r,s.Type.f64,i);case"i32.store8":return h("store",e,s.Type.i8,r,s.Type.i32,i);case"i32.store16":return h("store",e,s.Type.i16,r,s.Type.i32,i);case"i32.store":return h("store",e,s.Type.i32,r,s.Type.i32,i);case"i64.store8":return h("store",e,s.Type.i8,r,s.Type.i64,i);case"i64.store16":return h("store",e,s.Type.i16,r,s.Type.i64,i);case"i64.store32":return h("store",e,s.Type.i32,r,s.Type.i64,i);case"i64.store":return h("store",e,s.Type.i64,r,s.Type.i64,i);case"f32.store":return h("store",e,s.Type.f32,r,s.Type.f32,i);case"f64.store":return h("store",e,s.Type.f64,r,s.Type.f64,i)}return 0}(e,t,n,0,u);return ee?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),ee):(e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable())}function h(e,t,r,n,i,a){var s=assert(t.program.elementsLookup.get(e));return assert(s.kind==c.ElementKind.FUNCTION_PROTOTYPE),u(t,s,[r],n,i,a)}function d(e,t,r,n){if(0==r.length)return t&&1==t.length?t[0]:(e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t?t.length.toString(10):"0"),null);if(1==r.length){if(t)if(1==t.length)e.compileExpression(r[0],t[0],1,0);else{if(t.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t.length.toString(10)),null;e.compileExpressionRetainType(r[0],s.Type.i32,0)}else e.compileExpressionRetainType(r[0],s.Type.i32,0);return e.currentType}return t&&t.length>1&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t.length.toString(10)),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"1",r.length.toString(10)),null}function _(e,t){var r,n;return e.options.isWasm64?(r=e.precomputeExpression(t,s.Type.usize64,1,0),(o.getExpressionId(r)!=o.ExpressionId.Const||2!=o.getExpressionType(r)||0!=o.getConstValueI64High(r)||(n=o.getConstValueI64Low(r))<0)&&(e.error(i.DiagnosticCode.Operation_not_supported,t.range),n=-1)):(r=e.precomputeExpression(t,s.Type.usize32,1,0),(o.getExpressionId(r)!=o.ExpressionId.Const||1!=o.getExpressionType(r)||(n=o.getConstValueI32(r))<0)&&(e.error(i.DiagnosticCode.Operation_not_supported,t.range),n=-1)),n}function m(e,t,r){var n=e.program,i=e.module,a=n.typesLookup.get("string");if(!a)return i.createUnreachable();var o=n.abortInstance;if(!o||!e.compileFunction(o))return i.createUnreachable();var c=null!=t?e.compileExpression(t,a,1,0):a.toNativeZero(i),l=e.ensureStaticString(r.range.source.normalizedPath);return e.currentType=s.Type.void,i.createBlock(null,[i.createCall(o.internalName,[c,l,i.createI32(r.range.line),i.createI32(r.range.column)],0),i.createUnreachable()])}function g(e,t){var r,i,a=e.program;assert(t.type.isManaged(a));var l=t.gcHookIndex;if(-1!=l)return l;var u=t.members;if(t.prototype.declaration.range.source.isLibrary&&null!==u&&u.has("__gc")){var h=assert(u.get("__gc"));assert(h.kind==c.ElementKind.FUNCTION_PROTOTYPE);var d=assert(a.resolver.resolveFunction(h,null));assert(d.is(p.CommonFlags.PRIVATE|p.CommonFlags.INSTANCE)),assert(!d.isAny(p.CommonFlags.AMBIENT|p.CommonFlags.VIRTUAL)),assert(0==d.signature.parameterTypes.length),assert(d.signature.returnType==s.Type.void),d.internalName=t.internalName+"~gc",assert(e.compileFunction(d));var _=e.ensureFunctionTableEntry(d);return t.gcHookIndex=_,_}var m=e.module,y=e.options,f=y.nativeSizeType,E=y.usizeType.byteSize,T=new Array;T.push(m.createIf(m.createUnary(y.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,m.createGetLocal(0,f)),m.createReturn()));var I=e.functionTable,v=I.length;I.push(""),t.gcHookIndex=v;var A=t.base;if(A?(assert(A.type.isManaged(a)),T.push(m.createCallIndirect(m.createI32(g(e,A.type.classReference)),[m.createGetLocal(0,f)],2==f?"Iv":"iv"))):T.push(m.createCall(assert(a.gcMarkInstance).internalName,[m.createGetLocal(0,f)],0)),u)try{for(var C=n(u.values()),N=C.next();!N.done;N=C.next()){var O=N.value;if(O.kind==c.ElementKind.FIELD)if(O.parent===t)if(O.type.isManaged(a)){var S=O.memoryOffset;assert(S>=0),T.push(m.createCall(assert(a.gcMarkInstance).internalName,[m.createLoad(E,!1,m.createGetLocal(0,f),f,S)],0))}}}catch(e){r={error:e}}finally{try{N&&!N.done&&(i=C.return)&&i.call(C)}finally{if(r)throw r.error}}var L=t.internalName+"~gc";return m.addFunction(L,e.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=L,v}t.compileCall=u,t.compileAllocate=function(e,t,r){var n=e.program;assert(t.program==n);var a=e.module,s=e.options;if(n.hasGC&&t.type.isManaged(n)){var o=assert(n.gcAllocateInstance);return e.compileFunction(o)?(e.currentType=t.type,a.createCall(o.internalName,[s.isWasm64?a.createI64(t.currentMemoryOffset):a.createI32(t.currentMemoryOffset),a.createI32(g(e,t))],s.nativeSizeType)):a.createUnreachable()}return(o=n.memoryAllocateInstance)?e.compileFunction(o)?(e.currentType=t.type,a.createCall(o.internalName,[s.isWasm64?a.createI64(t.currentMemoryOffset):a.createI32(t.currentMemoryOffset)],s.nativeSizeType)):a.createUnreachable():(n.error(i.DiagnosticCode.Cannot_find_name_0,r.range,"memory.allocate"),a.createUnreachable())},t.compileAbort=m,t.compileIterateRoots=function(e){var t,r,i=e.module,a=new Array;try{for(var o=n(e.program.elementsLookup.values()),l=o.next();!l.done;l=o.next()){var u=l.value;if(u.kind==c.ElementKind.GLOBAL){var h=u,d=h.type.classReference;if(h.is(p.CommonFlags.COMPILED)&&null!==d&&!d.hasDecorator(c.DecoratorFlags.UNMANAGED))if(h.is(p.CommonFlags.INLINED)){var _=h.constantIntegerValue;a.push(i.createCallIndirect(i.createGetLocal(0,1),[e.options.isWasm64?i.createI64(i64_low(_),i64_high(_)):i.createI32(i64_low(_))],"iv"))}else a.push(i.createCallIndirect(i.createGetLocal(0,1),[i.createGetGlobal(h.internalName,e.options.nativeSizeType)],"iv"))}}}catch(e){t={error:e}}finally{try{l&&!l.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}var m=e.ensureFunctionType([s.Type.i32],s.Type.void);i.addFunction("~iterateRoots",m,[],a.length?i.createBlock(null,a):i.createNop())},t.ensureGCHook=g},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NULL=0]="NULL",e[e.LINEFEED=10]="LINEFEED",e[e.CARRIAGERETURN=13]="CARRIAGERETURN",e[e.LINESEPARATOR=8232]="LINESEPARATOR",e[e.PARAGRAPHSEPARATOR=8233]="PARAGRAPHSEPARATOR",e[e.NEXTLINE=133]="NEXTLINE",e[e.SPACE=32]="SPACE",e[e.NONBREAKINGSPACE=160]="NONBREAKINGSPACE",e[e.ENQUAD=8192]="ENQUAD",e[e.EMQUAD=8193]="EMQUAD",e[e.ENSPACE=8194]="ENSPACE",e[e.EMSPACE=8195]="EMSPACE",e[e.THREEPEREMSPACE=8196]="THREEPEREMSPACE",e[e.FOURPEREMSPACE=8197]="FOURPEREMSPACE",e[e.SIXPEREMSPACE=8198]="SIXPEREMSPACE",e[e.FIGURESPACE=8199]="FIGURESPACE",e[e.PUNCTUATIONSPACE=8200]="PUNCTUATIONSPACE",e[e.THINSPACE=8201]="THINSPACE",e[e.HAIRSPACE=8202]="HAIRSPACE",e[e.ZEROWIDTHSPACE=8203]="ZEROWIDTHSPACE",e[e.NARROWNOBREAKSPACE=8239]="NARROWNOBREAKSPACE",e[e.IDEOGRAPHICSPACE=12288]="IDEOGRAPHICSPACE",e[e.MATHEMATICALSPACE=8287]="MATHEMATICALSPACE",e[e.OGHAM=5760]="OGHAM",e[e._=95]="_",e[e._0=48]="_0",e[e._1=49]="_1",e[e._2=50]="_2",e[e._3=51]="_3",e[e._4=52]="_4",e[e._5=53]="_5",e[e._6=54]="_6",e[e._7=55]="_7",e[e._8=56]="_8",e[e._9=57]="_9",e[e.a=97]="a",e[e.b=98]="b",e[e.c=99]="c",e[e.d=100]="d",e[e.e=101]="e",e[e.f=102]="f",e[e.g=103]="g",e[e.h=104]="h",e[e.i=105]="i",e[e.j=106]="j",e[e.k=107]="k",e[e.l=108]="l",e[e.m=109]="m",e[e.n=110]="n",e[e.o=111]="o",e[e.p=112]="p",e[e.q=113]="q",e[e.r=114]="r",e[e.s=115]="s",e[e.t=116]="t",e[e.u=117]="u",e[e.v=118]="v",e[e.w=119]="w",e[e.x=120]="x",e[e.y=121]="y",e[e.z=122]="z",e[e.A=65]="A",e[e.B=66]="B",e[e.C=67]="C",e[e.D=68]="D",e[e.E=69]="E",e[e.F=70]="F",e[e.G=71]="G",e[e.H=72]="H",e[e.I=73]="I",e[e.J=74]="J",e[e.K=75]="K",e[e.L=76]="L",e[e.M=77]="M",e[e.N=78]="N",e[e.O=79]="O",e[e.P=80]="P",e[e.Q=81]="Q",e[e.R=82]="R",e[e.S=83]="S",e[e.T=84]="T",e[e.U=85]="U",e[e.V=86]="V",e[e.W=87]="W",e[e.X=88]="X",e[e.Y=89]="Y",e[e.Z=90]="Z",e[e.AMPERSAND=38]="AMPERSAND",e[e.ASTERISK=42]="ASTERISK",e[e.AT=64]="AT",e[e.BACKSLASH=92]="BACKSLASH",e[e.BACKTICK=96]="BACKTICK",e[e.BAR=124]="BAR",e[e.CARET=94]="CARET",e[e.CLOSEBRACE=125]="CLOSEBRACE",e[e.CLOSEBRACKET=93]="CLOSEBRACKET",e[e.CLOSEPAREN=41]="CLOSEPAREN",e[e.COLON=58]="COLON",e[e.COMMA=44]="COMMA",e[e.DOLLAR=36]="DOLLAR",e[e.DOT=46]="DOT",e[e.DOUBLEQUOTE=34]="DOUBLEQUOTE",e[e.EQUALS=61]="EQUALS",e[e.EXCLAMATION=33]="EXCLAMATION",e[e.GREATERTHAN=62]="GREATERTHAN",e[e.HASH=35]="HASH",e[e.LESSTHAN=60]="LESSTHAN",e[e.MINUS=45]="MINUS",e[e.OPENBRACE=123]="OPENBRACE",e[e.OPENBRACKET=91]="OPENBRACKET",e[e.OPENPAREN=40]="OPENPAREN",e[e.PERCENT=37]="PERCENT",e[e.PLUS=43]="PLUS",e[e.QUESTION=63]="QUESTION",e[e.SEMICOLON=59]="SEMICOLON",e[e.SINGLEQUOTE=39]="SINGLEQUOTE",e[e.SLASH=47]="SLASH",e[e.TILDE=126]="TILDE",e[e.BACKSPACE=8]="BACKSPACE",e[e.FORMFEED=12]="FORMFEED",e[e.BYTEORDERMARK=65279]="BYTEORDERMARK",e[e.TAB=9]="TAB",e[e.VERTICALTAB=11]="VERTICALTAB"}(t.CharCode||(t.CharCode={})),t.isLineBreak=function(e){switch(e){case 10:case 13:case 8232:case 8233:return!0;default:return!1}},t.isWhiteSpace=function(e){switch(e){case 32:case 9:case 11:case 12:case 160:case 133:case 5760:case 8239:case 8287:case 12288:case 65279:return!0;default:return e>=8192&&e<=8203}},t.isDecimalDigit=function(e){return e>=48&&e<=57},t.isOctalDigit=function(e){return e>=48&&e<=55},t.isIdentifierStart=function(e){return e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>127&&!((t=e)<0||t>65535)&&a(t,n);var t},t.isKeywordCharacter=function(e){return e>=97&&e<=122},t.isIdentifierPart=function(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||36==e||95==e||e>127&&!((t=e)<0||t>65535)&&a(t,i);var t};var n=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,880,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1162,1319,1329,1366,1369,1369,1377,1415,1488,1514,1520,1522,1568,1610,1646,1647,1649,1747,1749,1749,1765,1766,1774,1775,1786,1788,1791,1791,1808,1808,1810,1839,1869,1957,1969,1969,1994,2026,2036,2037,2042,2042,2048,2069,2074,2074,2084,2084,2088,2088,2112,2136,2208,2208,2210,2220,2308,2361,2365,2365,2384,2384,2392,2401,2417,2423,2425,2431,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2493,2493,2510,2510,2524,2525,2527,2529,2544,2545,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2649,2652,2654,2654,2674,2676,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2749,2749,2768,2768,2784,2785,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2877,2877,2908,2909,2911,2913,2929,2929,2947,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3024,3024,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3133,3160,3161,3168,3169,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3261,3261,3294,3294,3296,3297,3313,3314,3333,3340,3342,3344,3346,3386,3389,3389,3406,3406,3424,3425,3450,3455,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3585,3632,3634,3635,3648,3654,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3760,3762,3763,3773,3773,3776,3780,3782,3782,3804,3807,3840,3840,3904,3911,3913,3948,3976,3980,4096,4138,4159,4159,4176,4181,4186,4189,4193,4193,4197,4198,4206,4208,4213,4225,4238,4238,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5905,5920,5937,5952,5969,5984,5996,5998,6e3,6016,6067,6103,6103,6108,6108,6176,6263,6272,6312,6314,6314,6320,6389,6400,6428,6480,6509,6512,6516,6528,6571,6593,6599,6656,6678,6688,6740,6823,6823,6917,6963,6981,6987,7043,7072,7086,7087,7098,7141,7168,7203,7245,7247,7258,7293,7401,7404,7406,7409,7413,7414,7424,7615,7680,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8305,8305,8319,8319,8336,8348,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11502,11506,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11648,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11823,11823,12293,12295,12321,12329,12337,12341,12344,12348,12353,12438,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42527,42538,42539,42560,42606,42623,42647,42656,42735,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43009,43011,43013,43015,43018,43020,43042,43072,43123,43138,43187,43250,43255,43259,43259,43274,43301,43312,43334,43360,43388,43396,43442,43471,43471,43520,43560,43584,43586,43588,43595,43616,43638,43642,43642,43648,43695,43697,43697,43701,43702,43705,43709,43712,43712,43714,43714,43739,43741,43744,43754,43762,43764,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44002,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64285,64287,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65136,65140,65142,65276,65313,65338,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500],i=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,768,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1155,1159,1162,1319,1329,1366,1369,1369,1377,1415,1425,1469,1471,1471,1473,1474,1476,1477,1479,1479,1488,1514,1520,1522,1552,1562,1568,1641,1646,1747,1749,1756,1759,1768,1770,1788,1791,1791,1808,1866,1869,1969,1984,2037,2042,2042,2048,2093,2112,2139,2208,2208,2210,2220,2276,2302,2304,2403,2406,2415,2417,2423,2425,2431,2433,2435,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2492,2500,2503,2504,2507,2510,2519,2519,2524,2525,2527,2531,2534,2545,2561,2563,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2620,2620,2622,2626,2631,2632,2635,2637,2641,2641,2649,2652,2654,2654,2662,2677,2689,2691,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2748,2757,2759,2761,2763,2765,2768,2768,2784,2787,2790,2799,2817,2819,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2876,2884,2887,2888,2891,2893,2902,2903,2908,2909,2911,2915,2918,2927,2929,2929,2946,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3006,3010,3014,3016,3018,3021,3024,3024,3031,3031,3046,3055,3073,3075,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3140,3142,3144,3146,3149,3157,3158,3160,3161,3168,3171,3174,3183,3202,3203,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3260,3268,3270,3272,3274,3277,3285,3286,3294,3294,3296,3299,3302,3311,3313,3314,3330,3331,3333,3340,3342,3344,3346,3386,3389,3396,3398,3400,3402,3406,3415,3415,3424,3427,3430,3439,3450,3455,3458,3459,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3530,3530,3535,3540,3542,3542,3544,3551,3570,3571,3585,3642,3648,3662,3664,3673,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3769,3771,3773,3776,3780,3782,3782,3784,3789,3792,3801,3804,3807,3840,3840,3864,3865,3872,3881,3893,3893,3895,3895,3897,3897,3902,3911,3913,3948,3953,3972,3974,3991,3993,4028,4038,4038,4096,4169,4176,4253,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4957,4959,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5908,5920,5940,5952,5971,5984,5996,5998,6e3,6002,6003,6016,6099,6103,6103,6108,6109,6112,6121,6155,6157,6160,6169,6176,6263,6272,6314,6320,6389,6400,6428,6432,6443,6448,6459,6470,6509,6512,6516,6528,6571,6576,6601,6608,6617,6656,6683,6688,6750,6752,6780,6783,6793,6800,6809,6823,6823,6912,6987,6992,7001,7019,7027,7040,7155,7168,7223,7232,7241,7245,7293,7376,7378,7380,7414,7424,7654,7676,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8204,8205,8255,8256,8276,8276,8305,8305,8319,8319,8336,8348,8400,8412,8417,8417,8421,8432,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11647,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11744,11775,11823,11823,12293,12295,12321,12335,12337,12341,12344,12348,12353,12438,12441,12442,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42539,42560,42607,42612,42621,42623,42647,42655,42737,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43047,43072,43123,43136,43204,43216,43225,43232,43255,43259,43259,43264,43309,43312,43347,43360,43388,43392,43456,43471,43481,43520,43574,43584,43597,43600,43609,43616,43638,43642,43643,43648,43714,43739,43741,43744,43759,43762,43766,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44010,44012,44013,44016,44025,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65024,65039,65056,65062,65075,65076,65101,65103,65136,65140,65142,65276,65296,65305,65313,65338,65343,65343,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500];function a(e,t){if(e=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},i=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0}),t.makeArray=function(e){if(void 0===e&&(e=null),e){for(var t=new Array(e.length),r=0,n=e.length;r0||i=0;)if(e.charCodeAt(a)==n){r-a==3&&46==e.charCodeAt(a+1)&&46==e.charCodeAt(a+2)||(e=t?e.substring(0,a):e.substring(0,a)+e.substring(r+3),i-=r+3-a,r=a-1);break}if(a<0&&r>0&&(2!=r||46!=e.charCodeAt(0)||46!=e.charCodeAt(1))){i=(e=e.substring(r+4)).length;continue}}}r++}return i>0?e:"."}function a(e){for(var t=e.length;--t>0;)if(e.charCodeAt(t)==n)return e.substring(0,t);return"."}t.normalizePath=i,t.resolvePath=function(e,t){return e.startsWith("std/")?e:i(a(t)+String.fromCharCode(n)+e)},t.dirname=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=" ",i=" ",a=" ";t.indent=function(e,t){for(;t>=4;)e.push(a),t-=4;t>=2&&(e.push(i),t-=2),t&&e.push(n)}},function(e,t,r){"use strict";function n(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function i(e,t,r){t[r]=e,t[r+1]=e>>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function a(e,t){var r=n(e,t),i=n(e,t+4);return i64_new(r,i)}Object.defineProperty(t,"__esModule",{value:!0}),t.readI8=function(e,t){return e[t]},t.writeI8=function(e,t,r){t[r]=e},t.readI16=function(e,t){return e[t]|e[t+1]<<8},t.writeI16=function(e,t,r){t[r]=e,t[r+1]=e>>>8},t.readI32=n,t.writeI32=i,t.readI64=a,t.writeI64=function(e,t,r){i(i64_low(e),t,r),i(i64_high(e),t,r+4)},t.readF32=function(e,t){return i32_as_f32(n(e,t))},t.writeF32=function(e,t,r){i(f32_as_i32(e),t,r)},t.readF64=function(e,t){return i64_as_f64(a(e,t))},t.writeF64=function(e,t,r){var n=f64_as_i64(e);i(i64_low(n),t,r),i(i64_high(n),t,r+4)}},function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(9),a=r(12),s=r(13),o=r(1);t.formatDiagnostic=o.formatDiagnosticMessage;var c=r(14);t.parseFile=function(e,t,r,n){return void 0===r&&(r=!1),void 0===n&&(n=null),n||(n=new c.Parser),n.parseFile(e,t,r),n},t.nextFile=function(e){return e.nextFile()},t.nextDiagnostic=function(e){var t=e.program;return t.diagnosticsOffset0&&!a.isLineBreak(n.charCodeAt(s-1));)s--;for(;o=0?c.substring(l+1):c,i.statements=new Array,i.range=new s.Range(i,0,r.length),i.text=r,i}return i(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==j.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==j.LIBRARY},enumerable:!0,configurable:!0}),t}(l);t.Source=J;var $=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.decorators=null,t.cachedProgramLevelInternalName=null,t.cachedFileLevelInternalName=null,t}return i(t,e),Object.defineProperty(t.prototype,"programLevelInternalName",{get:function(){return this.cachedProgramLevelInternalName||(this.cachedProgramLevelInternalName=Fe(this,!0)),this.cachedProgramLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fileLevelInternalName",{get:function(){return this.cachedFileLevelInternalName||(this.cachedFileLevelInternalName=Fe(this,!1)),this.cachedFileLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevel",{get:function(){var e=this.parent;return!!e&&(!(e.kind==o.VARIABLE&&!(e=e.parent))&&e.kind==o.SOURCE)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevelExport",{get:function(){var e=this.parent;return!(!e||e.kind==o.VARIABLE&&!(e=e.parent))&&(e.kind==o.NAMESPACEDECLARATION?this.is(a.CommonFlags.EXPORT)&&e.isTopLevelExport:e.kind==o.CLASSDECLARATION?this.is(a.CommonFlags.STATIC)&&e.isTopLevelExport:e.kind==o.SOURCE&&this.is(a.CommonFlags.EXPORT))},enumerable:!0,configurable:!0}),t.prototype.needsExplicitExport=function(e){return e.name.text!=e.externalName.text||this.range.source!=e.range.source||!this.isTopLevelExport},t}(Z);t.DeclarationStatement=$;var ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.INDEXSIGNATUREDECLARATION,t}return i(t,e),t}($);t.IndexSignatureDeclaration=ee;var te=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}($);t.VariableLikeDeclarationStatement=te;var re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.BLOCK,t}return i(t,e),t}(Z);t.BlockStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.BREAK,t}return i(t,e),t}(Z);t.BreakStatement=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.CLASSDECLARATION,t}return i(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}($);t.ClassDeclaration=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.CONTINUE,t}return i(t,e),t}(Z);t.ContinueStatement=ae;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.DO,t}return i(t,e),t}(Z);t.DoStatement=se;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EMPTY,t}return i(t,e),t}(Z);t.EmptyStatement=oe;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.ENUMDECLARATION,t}return i(t,e),t}($);t.EnumDeclaration=ce;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.ENUMVALUEDECLARATION,t}return i(t,e),t}($);t.EnumValueDeclaration=le;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPORTIMPORT,t}return i(t,e),t}(l);t.ExportImportStatement=pe;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPORTMEMBER,t}return i(t,e),t}(l);t.ExportMember=ue;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPORT,t}return i(t,e),t}(Z);t.ExportStatement=he;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPRESSION,t}return i(t,e),t}(Z);t.ExpressionStatement=de;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.FIELDDECLARATION,t.parameterIndex=-1,t}return i(t,e),t}(te);t.FieldDeclaration=_e;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.FOR,t}return i(t,e),t}(Z);t.ForStatement=ge;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.FUNCTIONDECLARATION,t}return i(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}($);t.FunctionDeclaration=me;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.IF,t}return i(t,e),t}(Z);t.IfStatement=ye;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.IMPORTDECLARATION,t}return i(t,e),t}($);t.ImportDeclaration=Ee;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.IMPORT,t}return i(t,e),t}(Z);t.ImportStatement=fe;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.INTERFACEDECLARATION,t}return i(t,e),t}(ie);t.InterfaceDeclaration=Te;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.METHODDECLARATION,t}return i(t,e),t}(me);t.MethodDeclaration=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.NAMESPACEDECLARATION,t}return i(t,e),t}($);t.NamespaceDeclaration=ve;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.RETURN,t}return i(t,e),t}(Z);t.ReturnStatement=Ce;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.SWITCHCASE,t}return i(t,e),t}(l);t.SwitchCase=Ae;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.SWITCH,t}return i(t,e),t}(Z);t.SwitchStatement=Ne;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.THROW,t}return i(t,e),t}(Z);t.ThrowStatement=Se;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.TRY,t}return i(t,e),t}(Z);t.TryStatement=Oe;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.TYPEDECLARATION,t}return i(t,e),t}($);t.TypeDeclaration=Le;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.VARIABLEDECLARATION,t}return i(t,e),t}(te);t.VariableDeclaration=be;var ke=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.VARIABLE,t}return i(t,e),t}(Z);t.VariableStatement=ke;var Re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.VOID,t}return i(t,e),t}(Z);t.VoidStatement=Re;var xe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.WHILE,t}return i(t,e),t}(Z);function Fe(e,t){void 0===t&&(t=!1);var r=e.name.text,n=e.parent;return n&&(e.kind!=o.VARIABLEDECLARATION||n.kind!=o.VARIABLE||(n=n.parent))?n.kind==o.CLASSDECLARATION?Fe(n,t)+(e.is(a.CommonFlags.STATIC)?a.STATIC_DELIMITER:a.INSTANCE_DELIMITER)+r:n.kind==o.NAMESPACEDECLARATION||n.kind==o.ENUMDECLARATION?Fe(n,t)+a.STATIC_DELIMITER+r:t?r:e.range.source.internalPath+a.PATH_DELIMITER+r:r}function De(e){return e.endsWith(".ts")&&(e=e.substring(0,e.length-3)),e}function Be(e,t){for(var r=0,n=e.length;r=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o,c=r(0),l=r(1),p=r(7),u=r(3),h=r(5),d=r(11),_=function(){return function(){}}(),g=function(){return function(){}}(),m=function(){return function(){}}();function y(e,t){switch(assert(t.length),e){case u.DecoratorKind.OPERATOR:case u.DecoratorKind.OPERATOR_BINARY:switch(t.charCodeAt(0)){case 91:if("[]"==t)return o.INDEXED_GET;if("[]="==t)return o.INDEXED_SET;break;case 123:if("{}"==t)return o.UNCHECKED_INDEXED_GET;if("{}="==t)return o.UNCHECKED_INDEXED_SET;break;case 43:if("+"==t)return o.ADD;break;case 45:if("-"==t)return o.SUB;break;case 42:if("*"==t)return o.MUL;if("**"==t)return o.POW;break;case 47:if("/"==t)return o.DIV;break;case 37:if("%"==t)return o.REM;break;case 38:if("&"==t)return o.BITWISE_AND;break;case 124:if("|"==t)return o.BITWISE_OR;break;case 94:if("^"==t)return o.BITWISE_XOR;break;case 61:if("=="==t)return o.EQ;break;case 33:if("!="==t)return o.NE;break;case 62:if(">"==t)return o.GT;if(">="==t)return o.GE;if(">>"==t)return o.BITWISE_SHR;if(">>>"==t)return o.BITWISE_SHR_U;break;case 60:if("<"==t)return o.LT;if("<="==t)return o.LE;if("<<"==t)return o.BITWISE_SHL}break;case u.DecoratorKind.OPERATOR_PREFIX:switch(t.charCodeAt(0)){case 43:if("+"==t)return o.PLUS;if("++"==t)return o.PREFIX_INC;break;case 45:if("-"==t)return o.MINUS;if("--"==t)return o.PREFIX_DEC;break;case 33:if("!"==t)return o.NOT;break;case 126:if("~"==t)return o.BITWISE_NOT}break;case u.DecoratorKind.OPERATOR_POSTFIX:switch(t.charCodeAt(0)){case 43:if("++"==t)return o.POSTFIX_INC;break;case 45:if("--"==t)return o.POSTFIX_DEC}}return o.INVALID}!function(e){e[e.INVALID=0]="INVALID",e[e.INDEXED_GET=1]="INDEXED_GET",e[e.INDEXED_SET=2]="INDEXED_SET",e[e.UNCHECKED_INDEXED_GET=3]="UNCHECKED_INDEXED_GET",e[e.UNCHECKED_INDEXED_SET=4]="UNCHECKED_INDEXED_SET",e[e.ADD=5]="ADD",e[e.SUB=6]="SUB",e[e.MUL=7]="MUL",e[e.DIV=8]="DIV",e[e.REM=9]="REM",e[e.POW=10]="POW",e[e.BITWISE_AND=11]="BITWISE_AND",e[e.BITWISE_OR=12]="BITWISE_OR",e[e.BITWISE_XOR=13]="BITWISE_XOR",e[e.BITWISE_SHL=14]="BITWISE_SHL",e[e.BITWISE_SHR=15]="BITWISE_SHR",e[e.BITWISE_SHR_U=16]="BITWISE_SHR_U",e[e.EQ=17]="EQ",e[e.NE=18]="NE",e[e.GT=19]="GT",e[e.GE=20]="GE",e[e.LT=21]="LT",e[e.LE=22]="LE",e[e.PLUS=23]="PLUS",e[e.MINUS=24]="MINUS",e[e.NOT=25]="NOT",e[e.BITWISE_NOT=26]="BITWISE_NOT",e[e.PREFIX_INC=27]="PREFIX_INC",e[e.PREFIX_DEC=28]="PREFIX_DEC",e[e.POSTFIX_INC=29]="POSTFIX_INC",e[e.POSTFIX_DEC=30]="POSTFIX_DEC"}(o=t.OperatorKind||(t.OperatorKind={}));var E,f,T=new Map,I=function(e){function t(t){void 0===t&&(t=null);var r=e.call(this,t)||this;return r.diagnosticsOffset=0,r.elementsLookup=new Map,r.instancesLookup=new Map,r.typesLookup=T,r.typeAliases=new Map,r.fileLevelExports=new Map,r.moduleLevelExports=new Map,r.basicClasses=new Map,r.arrayBufferInstance=null,r.arrayPrototype=null,r.stringInstance=null,r.mainFunction=null,r.abortInstance=null,r.memoryAllocateInstance=null,r.hasGC=!1,r.gcAllocateInstance=null,r.gcLinkInstance=null,r.gcMarkInstance=null,r.gcHeaderSize=0,r.gcHookOffset=0,r.resolver=new d.Resolver(r),r.sources=[],r}return i(t,e),t.prototype.getSource=function(e){for(var t=this.sources,r=0,n=t.length;r=0),assert(null!=e.type),e.type.toNativeType()){case 1:t=this.tempI32s||(this.tempI32s=[]);break;case 2:t=this.tempI64s||(this.tempI64s=[]);break;case 3:t=this.tempF32s||(this.tempF32s=[]);break;case 4:t=this.tempF64s||(this.tempF64s=[]);break;default:throw new Error("concrete type expected")}assert(e.index>=0),t.push(e)}},t.prototype.getAndFreeTempLocal=function(e,t){var r,n;switch(e.toNativeType()){case 1:r=this.tempI32s||(this.tempI32s=[]);break;case 2:r=this.tempI64s||(this.tempI64s=[]);break;case 3:r=this.tempF32s||(this.tempF32s=[]);break;case 4:r=this.tempF64s||(this.tempF64s=[]);break;default:throw new Error("concrete type expected")}return r.length?(n=r[r.length-1]).type=e:(n=this.addLocal(e),r.push(n)),e.is(36)&&this.flow.setLocalWrapped(n.index,t),n},t.prototype.enterBreakContext=function(){var e=this.nextBreakId++;return this.breakStack?this.breakStack.push(e):this.breakStack=[e],this.breakContext=e.toString(10)},t.prototype.leaveBreakContext=function(){assert(null!=this.breakStack);var e=this.breakStack.length;assert(e>0),this.breakStack.pop(),e>1?this.breakContext=this.breakStack[e-2].toString(10):(this.breakContext=null,this.breakStack=null)},t.prototype.finalize=function(e,t){if(this.ref=t,assert(!this.breakStack||!this.breakStack.length),this.breakStack=null,this.breakContext=null,this.tempI32s=this.tempI64s=this.tempF32s=this.tempF64s=null,this.program.options.sourceMap)for(var r=this.debugLocations,n=0,i=r.length;n=r.length)return!1;t=r[n],e-=64*(n+1)}return i64_ne(i64_and(t,i64_shl(i64_one,i64_new(e))),i64_zero)},e.prototype.setLocalWrapped=function(e,t){var r,n=-1;if(e<64){if(e<0)return;r=this.wrappedLocals}else{var i=this.wrappedLocalsExt;for(n=(e-64)/64|0,i||(this.wrappedLocalsExt=i=new Array(n+1),i.length=0);i.length<=n;)i.push(i64_new(0));r=i[n],e-=64*(n+1)}r=t?i64_or(r,i64_shl(i64_one,i64_new(e))):i64_and(r,i64_not(i64_shl(i64_one,i64_new(e)))),n>=0?this.wrappedLocalsExt[n]=r:this.wrappedLocals=r},e.prototype.inherit=function(e){this.flags|=4095&e.flags,this.wrappedLocals=e.wrappedLocals,this.wrappedLocalsExt=e.wrappedLocalsExt},e.prototype.inheritConditional=function(e){e.is(1)&&this.set(128),e.is(4)&&this.set(256),e.is(8)&&e.breakLabel==this.breakLabel&&this.set(512),e.is(16)&&e.continueLabel==this.continueLabel&&this.set(1024),e.is(32)&&this.set(2048)},e.prototype.inheritMutual=function(e,t){this.flags|=e.flags&t.flags&127,this.flags|=3968&e.flags,this.flags|=3968&t.flags,this.wrappedLocals=i64_and(e.wrappedLocals,t.wrappedLocals);var r=e.wrappedLocalsExt,n=t.wrappedLocalsExt;if(null!=r&&null!=n){var i=this.wrappedLocalsExt,a=min(r.length,n.length);if(a){if(i)for(;i.lengths):this.canOverflow(h.getBinaryLeft(e),t)&&!(h.getExpressionId(r=h.getBinaryRight(e))==h.ExpressionId.Const&&h.getConstValueI32(r)>=s);case h.BinaryOp.DivU32:case h.BinaryOp.RemI32:case h.BinaryOp.RemU32:return this.canOverflow(h.getBinaryLeft(e),t)||this.canOverflow(h.getBinaryRight(e),t)}break;case h.ExpressionId.Unary:switch(h.getUnaryOp(e)){case h.UnaryOp.EqzI32:case h.UnaryOp.EqzI64:return!1;case h.UnaryOp.ClzI32:case h.UnaryOp.CtzI32:case h.UnaryOp.PopcntI32:return t.size<7}break;case h.ExpressionId.Const:var o=0;switch(h.getExpressionType(e)){case 1:o=h.getConstValueI32(e);break;case 2:o=h.getConstValueI64Low(e);break;case 3:o=i32(h.getConstValueF32(e));break;case 4:o=i32(h.getConstValueF64(e));break;default:assert(!1)}switch(t.kind){case 0:return oi8.MAX_VALUE;case 1:return oi16.MAX_VALUE;case 5:return o<0||o>u8.MAX_VALUE;case 6:return o<0||o>u16.MAX_VALUE;case 10:return 0!=(-2&o)}break;case h.ExpressionId.Load:var c=void 0;switch(h.getLoadBytes(e)){case 1:c=h.isLoadSigned(e)?p.Type.i8:p.Type.u8;break;case 2:c=h.isLoadSigned(e)?p.Type.i16:p.Type.u16;break;default:c=h.isLoadSigned(e)?p.Type.i32:p.Type.u32}return V(c,t);case h.ExpressionId.Block:if(!h.getBlockName(e)){var l=assert(h.getBlockChildCount(e)),u=h.getBlockChild(e,l-1);return this.canOverflow(u,t)}break;case h.ExpressionId.If:return this.canOverflow(h.getIfTrue(e),t)||this.canOverflow(assert(h.getIfFalse(e)),t);case h.ExpressionId.Select:return this.canOverflow(h.getSelectThen(e),t)||this.canOverflow(h.getSelectElse(e),t);case h.ExpressionId.Call:var d=this.currentFunction.program,_=assert(d.instancesLookup.get(assert(h.getCallTarget(e))));assert(_.kind==E.FUNCTION);var g=_.signature.returnType;return!_.flow.is(2)||V(g,t);case h.ExpressionId.Unreachable:return!1}return!0},e.prototype.finalize=function(){assert(null==this.parent),this.continueLabel=null,this.breakLabel=null,this.returnLabel=null,this.contextualTypeArguments=null},e}();function V(e,t){return!e.is(4)||e.size>t.size||e.is(1)!=t.is(1)}t.Flow=z},function(e,t,r){"use strict";var n=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i,a=r(9);!function(e){e[e.None=0]="None",e[e.I32=1]="I32",e[e.I64=2]="I64",e[e.F32=3]="F32",e[e.F64=4]="F64",e[e.Unreachable=5]="Unreachable",e[e.Auto=-1]="Auto"}(t.NativeType||(t.NativeType={})),function(e){e[e.Invalid=_BinaryenInvalidId()]="Invalid",e[e.Block=_BinaryenBlockId()]="Block",e[e.If=_BinaryenIfId()]="If",e[e.Loop=_BinaryenLoopId()]="Loop",e[e.Break=_BinaryenBreakId()]="Break",e[e.Switch=_BinaryenSwitchId()]="Switch",e[e.Call=_BinaryenCallId()]="Call",e[e.CallIndirect=_BinaryenCallIndirectId()]="CallIndirect",e[e.GetLocal=_BinaryenGetLocalId()]="GetLocal",e[e.SetLocal=_BinaryenSetLocalId()]="SetLocal",e[e.GetGlobal=_BinaryenGetGlobalId()]="GetGlobal",e[e.SetGlobal=_BinaryenSetGlobalId()]="SetGlobal",e[e.Load=_BinaryenLoadId()]="Load",e[e.Store=_BinaryenStoreId()]="Store",e[e.Const=_BinaryenConstId()]="Const",e[e.Unary=_BinaryenUnaryId()]="Unary",e[e.Binary=_BinaryenBinaryId()]="Binary",e[e.Select=_BinaryenSelectId()]="Select",e[e.Drop=_BinaryenDropId()]="Drop",e[e.Return=_BinaryenReturnId()]="Return",e[e.Host=_BinaryenHostId()]="Host",e[e.Nop=_BinaryenNopId()]="Nop",e[e.Unreachable=_BinaryenUnreachableId()]="Unreachable",e[e.AtomicCmpxchg=_BinaryenAtomicCmpxchgId()]="AtomicCmpxchg",e[e.AtomicRMW=_BinaryenAtomicRMWId()]="AtomicRMW",e[e.AtomicWait=_BinaryenAtomicWaitId()]="AtomicWait",e[e.AtomicWake=_BinaryenAtomicWakeId()]="AtomicWake"}(i=t.ExpressionId||(t.ExpressionId={})),function(e){e[e.ClzI32=_BinaryenClzInt32()]="ClzI32",e[e.CtzI32=_BinaryenCtzInt32()]="CtzI32",e[e.PopcntI32=_BinaryenPopcntInt32()]="PopcntI32",e[e.NegF32=_BinaryenNegFloat32()]="NegF32",e[e.AbsF32=_BinaryenAbsFloat32()]="AbsF32",e[e.CeilF32=_BinaryenCeilFloat32()]="CeilF32",e[e.FloorF32=_BinaryenFloorFloat32()]="FloorF32",e[e.TruncF32=_BinaryenTruncFloat32()]="TruncF32",e[e.NearestF32=_BinaryenNearestFloat32()]="NearestF32",e[e.SqrtF32=_BinaryenSqrtFloat32()]="SqrtF32",e[e.EqzI32=_BinaryenEqZInt32()]="EqzI32",e[e.ClzI64=_BinaryenClzInt64()]="ClzI64",e[e.CtzI64=_BinaryenCtzInt64()]="CtzI64",e[e.PopcntI64=_BinaryenPopcntInt64()]="PopcntI64",e[e.NegF64=_BinaryenNegFloat64()]="NegF64",e[e.AbsF64=_BinaryenAbsFloat64()]="AbsF64",e[e.CeilF64=_BinaryenCeilFloat64()]="CeilF64",e[e.FloorF64=_BinaryenFloorFloat64()]="FloorF64",e[e.TruncF64=_BinaryenTruncFloat64()]="TruncF64",e[e.NearestF64=_BinaryenNearestFloat64()]="NearestF64",e[e.SqrtF64=_BinaryenSqrtFloat64()]="SqrtF64",e[e.EqzI64=_BinaryenEqZInt64()]="EqzI64",e[e.ExtendI32=_BinaryenExtendSInt32()]="ExtendI32",e[e.ExtendU32=_BinaryenExtendUInt32()]="ExtendU32",e[e.WrapI64=_BinaryenWrapInt64()]="WrapI64",e[e.TruncF32ToI32=_BinaryenTruncSFloat32ToInt32()]="TruncF32ToI32",e[e.TruncF32ToI64=_BinaryenTruncSFloat32ToInt64()]="TruncF32ToI64",e[e.TruncF32ToU32=_BinaryenTruncUFloat32ToInt32()]="TruncF32ToU32",e[e.TruncF32ToU64=_BinaryenTruncUFloat32ToInt64()]="TruncF32ToU64",e[e.TruncF64ToI32=_BinaryenTruncSFloat64ToInt32()]="TruncF64ToI32",e[e.TruncF64ToI64=_BinaryenTruncSFloat64ToInt64()]="TruncF64ToI64",e[e.TruncF64ToU32=_BinaryenTruncUFloat64ToInt32()]="TruncF64ToU32",e[e.TruncF64ToU64=_BinaryenTruncUFloat64ToInt64()]="TruncF64ToU64",e[e.ReinterpretF32=_BinaryenReinterpretFloat32()]="ReinterpretF32",e[e.ReinterpretF64=_BinaryenReinterpretFloat64()]="ReinterpretF64",e[e.ConvertI32ToF32=_BinaryenConvertSInt32ToFloat32()]="ConvertI32ToF32",e[e.ConvertI32ToF64=_BinaryenConvertSInt32ToFloat64()]="ConvertI32ToF64",e[e.ConvertU32ToF32=_BinaryenConvertUInt32ToFloat32()]="ConvertU32ToF32",e[e.ConvertU32ToF64=_BinaryenConvertUInt32ToFloat64()]="ConvertU32ToF64",e[e.ConvertI64ToF32=_BinaryenConvertSInt64ToFloat32()]="ConvertI64ToF32",e[e.ConvertI64ToF64=_BinaryenConvertSInt64ToFloat64()]="ConvertI64ToF64",e[e.ConvertU64ToF32=_BinaryenConvertUInt64ToFloat32()]="ConvertU64ToF32",e[e.ConvertU64ToF64=_BinaryenConvertUInt64ToFloat64()]="ConvertU64ToF64",e[e.PromoteF32=_BinaryenPromoteFloat32()]="PromoteF32",e[e.DemoteF64=_BinaryenDemoteFloat64()]="DemoteF64",e[e.ReinterpretI32=_BinaryenReinterpretInt32()]="ReinterpretI32",e[e.ReinterpretI64=_BinaryenReinterpretInt64()]="ReinterpretI64",e[e.ExtendI8ToI32=_BinaryenExtendS8Int32()]="ExtendI8ToI32",e[e.ExtendI16ToI32=_BinaryenExtendS16Int32()]="ExtendI16ToI32",e[e.ExtendI8ToI64=_BinaryenExtendS8Int64()]="ExtendI8ToI64",e[e.ExtendI16ToI64=_BinaryenExtendS16Int64()]="ExtendI16ToI64",e[e.ExtendI32ToI64=_BinaryenExtendS32Int64()]="ExtendI32ToI64"}(t.UnaryOp||(t.UnaryOp={})),function(e){e[e.AddI32=_BinaryenAddInt32()]="AddI32",e[e.SubI32=_BinaryenSubInt32()]="SubI32",e[e.MulI32=_BinaryenMulInt32()]="MulI32",e[e.DivI32=_BinaryenDivSInt32()]="DivI32",e[e.DivU32=_BinaryenDivUInt32()]="DivU32",e[e.RemI32=_BinaryenRemSInt32()]="RemI32",e[e.RemU32=_BinaryenRemUInt32()]="RemU32",e[e.AndI32=_BinaryenAndInt32()]="AndI32",e[e.OrI32=_BinaryenOrInt32()]="OrI32",e[e.XorI32=_BinaryenXorInt32()]="XorI32",e[e.ShlI32=_BinaryenShlInt32()]="ShlI32",e[e.ShrU32=_BinaryenShrUInt32()]="ShrU32",e[e.ShrI32=_BinaryenShrSInt32()]="ShrI32",e[e.RotlI32=_BinaryenRotLInt32()]="RotlI32",e[e.RotrI32=_BinaryenRotRInt32()]="RotrI32",e[e.EqI32=_BinaryenEqInt32()]="EqI32",e[e.NeI32=_BinaryenNeInt32()]="NeI32",e[e.LtI32=_BinaryenLtSInt32()]="LtI32",e[e.LtU32=_BinaryenLtUInt32()]="LtU32",e[e.LeI32=_BinaryenLeSInt32()]="LeI32",e[e.LeU32=_BinaryenLeUInt32()]="LeU32",e[e.GtI32=_BinaryenGtSInt32()]="GtI32",e[e.GtU32=_BinaryenGtUInt32()]="GtU32",e[e.GeI32=_BinaryenGeSInt32()]="GeI32",e[e.GeU32=_BinaryenGeUInt32()]="GeU32",e[e.AddI64=_BinaryenAddInt64()]="AddI64",e[e.SubI64=_BinaryenSubInt64()]="SubI64",e[e.MulI64=_BinaryenMulInt64()]="MulI64",e[e.DivI64=_BinaryenDivSInt64()]="DivI64",e[e.DivU64=_BinaryenDivUInt64()]="DivU64",e[e.RemI64=_BinaryenRemSInt64()]="RemI64",e[e.RemU64=_BinaryenRemUInt64()]="RemU64",e[e.AndI64=_BinaryenAndInt64()]="AndI64",e[e.OrI64=_BinaryenOrInt64()]="OrI64",e[e.XorI64=_BinaryenXorInt64()]="XorI64",e[e.ShlI64=_BinaryenShlInt64()]="ShlI64",e[e.ShrU64=_BinaryenShrUInt64()]="ShrU64",e[e.ShrI64=_BinaryenShrSInt64()]="ShrI64",e[e.RotlI64=_BinaryenRotLInt64()]="RotlI64",e[e.RotrI64=_BinaryenRotRInt64()]="RotrI64",e[e.EqI64=_BinaryenEqInt64()]="EqI64",e[e.NeI64=_BinaryenNeInt64()]="NeI64",e[e.LtI64=_BinaryenLtSInt64()]="LtI64",e[e.LtU64=_BinaryenLtUInt64()]="LtU64",e[e.LeI64=_BinaryenLeSInt64()]="LeI64",e[e.LeU64=_BinaryenLeUInt64()]="LeU64",e[e.GtI64=_BinaryenGtSInt64()]="GtI64",e[e.GtU64=_BinaryenGtUInt64()]="GtU64",e[e.GeI64=_BinaryenGeSInt64()]="GeI64",e[e.GeU64=_BinaryenGeUInt64()]="GeU64",e[e.AddF32=_BinaryenAddFloat32()]="AddF32",e[e.SubF32=_BinaryenSubFloat32()]="SubF32",e[e.MulF32=_BinaryenMulFloat32()]="MulF32",e[e.DivF32=_BinaryenDivFloat32()]="DivF32",e[e.CopysignF32=_BinaryenCopySignFloat32()]="CopysignF32",e[e.MinF32=_BinaryenMinFloat32()]="MinF32",e[e.MaxF32=_BinaryenMaxFloat32()]="MaxF32",e[e.EqF32=_BinaryenEqFloat32()]="EqF32",e[e.NeF32=_BinaryenNeFloat32()]="NeF32",e[e.LtF32=_BinaryenLtFloat32()]="LtF32",e[e.LeF32=_BinaryenLeFloat32()]="LeF32",e[e.GtF32=_BinaryenGtFloat32()]="GtF32",e[e.GeF32=_BinaryenGeFloat32()]="GeF32",e[e.AddF64=_BinaryenAddFloat64()]="AddF64",e[e.SubF64=_BinaryenSubFloat64()]="SubF64",e[e.MulF64=_BinaryenMulFloat64()]="MulF64",e[e.DivF64=_BinaryenDivFloat64()]="DivF64",e[e.CopysignF64=_BinaryenCopySignFloat64()]="CopysignF64",e[e.MinF64=_BinaryenMinFloat64()]="MinF64",e[e.MaxF64=_BinaryenMaxFloat64()]="MaxF64",e[e.EqF64=_BinaryenEqFloat64()]="EqF64",e[e.NeF64=_BinaryenNeFloat64()]="NeF64",e[e.LtF64=_BinaryenLtFloat64()]="LtF64",e[e.LeF64=_BinaryenLeFloat64()]="LeF64",e[e.GtF64=_BinaryenGtFloat64()]="GtF64",e[e.GeF64=_BinaryenGeFloat64()]="GeF64"}(t.BinaryOp||(t.BinaryOp={})),function(e){e[e.CurrentMemory=_BinaryenCurrentMemory()]="CurrentMemory",e[e.GrowMemory=_BinaryenGrowMemory()]="GrowMemory"}(t.HostOp||(t.HostOp={})),function(e){e[e.Add=_BinaryenAtomicRMWAdd()]="Add",e[e.Sub=_BinaryenAtomicRMWSub()]="Sub",e[e.And=_BinaryenAtomicRMWAnd()]="And",e[e.Or=_BinaryenAtomicRMWOr()]="Or",e[e.Xor=_BinaryenAtomicRMWXor()]="Xor",e[e.Xchg=_BinaryenAtomicRMWXchg()]="Xchg"}(t.AtomicRMWOp||(t.AtomicRMWOp={}));var s=function(){function e(){}return e.create=function(t,r){var n=new e;return n.buffer=t,n.offset=r,n},e}();t.MemorySegment=s;var o=function(){function e(){this.hasTemporaryFunction=!1,this.cachedPrecomputeNames=0,this.cachedStrings=new Map}return e.create=function(){var t=new e;return t.ref=_BinaryenModuleCreate(),t.cachedByValue=memory.allocate(16),t},e.createFrom=function(t){var r=l(t);try{var n=new e;return n.ref=_BinaryenModuleRead(r,t.length),n.cachedByValue=memory.allocate(24),n}finally{memory.free(changetype(r))}},e.prototype.addFunctionType=function(e,t,r){var n=this.allocStringCached(e),i=p(r);try{return _BinaryenAddFunctionType(this.ref,n,t,i,r?r.length:0)}finally{memory.free(i)}},e.prototype.getFunctionTypeBySignature=function(e,t){var r=p(t);try{return _BinaryenGetFunctionTypeBySignature(this.ref,e,r,t?t.length:0)}finally{memory.free(r)}},e.prototype.removeFunctionType=function(e){var t=this.allocStringCached(e);_BinaryenRemoveFunctionType(this.ref,t)},e.prototype.createI32=function(e){var t=this.cachedByValue;return _BinaryenLiteralInt32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createI64=function(e,t){void 0===t&&(t=0);var r=this.cachedByValue;return _BinaryenLiteralInt64(r,e,t),_BinaryenConst(this.ref,r)},e.prototype.createF32=function(e){var t=this.cachedByValue;return _BinaryenLiteralFloat32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createF64=function(e){var t=this.cachedByValue;return _BinaryenLiteralFloat64(t,e),_BinaryenConst(this.ref,t)},e.prototype.createUnary=function(e,t){return _BinaryenUnary(this.ref,e,t)},e.prototype.createBinary=function(e,t,r){return _BinaryenBinary(this.ref,e,t,r)},e.prototype.createHost=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=null);var n=this.allocStringCached(t),i=u(r);try{return _BinaryenHost(this.ref,e,n,i,r?r.length:0)}finally{memory.free(i)}},e.prototype.createGetLocal=function(e,t){return _BinaryenGetLocal(this.ref,e,t)},e.prototype.createTeeLocal=function(e,t){return _BinaryenTeeLocal(this.ref,e,t)},e.prototype.createGetGlobal=function(e,t){var r=this.allocStringCached(e);return _BinaryenGetGlobal(this.ref,r,t)},e.prototype.createLoad=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenLoad(this.ref,e,t?1:0,i,e,n,r)},e.prototype.createStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenStore(this.ref,e,i,e,t,r,n)},e.prototype.createAtomicLoad=function(e,t,r,n){return void 0===n&&(n=0),_BinaryenAtomicLoad(this.ref,e,n,r,t)},e.prototype.createAtomicStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenAtomicStore(this.ref,e,i,t,r,n)},e.prototype.createAtomicRMW=function(e,t,r,n,i,a){return _BinaryenAtomicRMW(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicCmpxchg=function(e,t,r,n,i,a){return _BinaryenAtomicCmpxchg(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicWait=function(e,t,r,n){return _BinaryenAtomicWait(this.ref,e,t,r,n)},e.prototype.createAtomicWake=function(e,t){return _BinaryenAtomicWake(this.ref,e,t)},e.prototype.createSetLocal=function(e,t){return _BinaryenSetLocal(this.ref,e,t)},e.prototype.createSetGlobal=function(e,t){var r=this.allocStringCached(e);return _BinaryenSetGlobal(this.ref,r,t)},e.prototype.createBlock=function(e,t,r){void 0===r&&(r=0);var n=this.allocStringCached(e),i=u(t);try{return _BinaryenBlock(this.ref,n,i,t.length,r)}finally{memory.free(i)}},e.prototype.createBreak=function(e,t,r){void 0===t&&(t=0),void 0===r&&(r=0);var n=this.allocStringCached(e);return _BinaryenBreak(this.ref,n,t,r)},e.prototype.createDrop=function(e){return _BinaryenDrop(this.ref,e)},e.prototype.createLoop=function(e,t){var r=this.allocStringCached(e);return _BinaryenLoop(this.ref,r,t)},e.prototype.createIf=function(e,t,r){return void 0===r&&(r=0),_BinaryenIf(this.ref,e,t,r)},e.prototype.createNop=function(){return _BinaryenNop(this.ref)},e.prototype.createReturn=function(e){return void 0===e&&(e=0),_BinaryenReturn(this.ref,e)},e.prototype.createSelect=function(e,t,r){return _BinaryenSelect(this.ref,r,e,t)},e.prototype.createSwitch=function(e,t,r,n){void 0===n&&(n=0);for(var i=e.length,a=new Array(i),s=0;s=0;--_)memory.free(u[_])}},e.prototype.setFunctionTable=function(e,t,r){for(var n=r.length,i=new Array(n),a=0;a=0;--i)memory.free(n[i])}},e.prototype.precomputeExpression=function(e){var t=_BinaryenGetOptimizeLevel(),r=_BinaryenGetShrinkLevel(),n=_BinaryenGetDebugInfo();_BinaryenSetOptimizeLevel(4),_BinaryenSetShrinkLevel(0),_BinaryenSetDebugInfo(!1);var i=_BinaryenExpressionGetType(e),a=this.addTemporaryFunction(i,null,e),s=this.cachedPrecomputeNames;return s||(this.cachedPrecomputeNames=s=p([this.allocStringCached("precompute")])),_BinaryenFunctionRunPasses(a,this.ref,s,1),e=_BinaryenFunctionGetBody(a),this.removeTemporaryFunction(),_BinaryenSetOptimizeLevel(t),_BinaryenSetShrinkLevel(r),_BinaryenSetDebugInfo(n),e},e.prototype.validate=function(){return 1==_BinaryenModuleValidate(this.ref)},e.prototype.interpret=function(){_BinaryenModuleInterpret(this.ref)},e.prototype.toBinary=function(e){var t=this.cachedByValue,r=d(e),n=0,i=0;try{_BinaryenModuleAllocateAndWrite(t,this.ref,r),n=_(t);var a=_(t+4);i=_(t+8);var s=new m;return s.output=function(e,t){for(var r=new Uint8Array(t),n=0;n>8&255),store(r+2,a>>16&255),store(r+3,a>>>24),r+=4}return t}function u(e){return p(e)}t.Relooper=c;var h=new Map;function d(e){if(null==e)return 0;if(h.has(e))return h.get(e);for(var t=memory.allocate(function(e){for(var t=0,r=0,n=e.length;r=55296&&i<=57343&&r+1=55296&&a<=57343&&n+1>>6),store(r++,128|63&a)):a<=65535?(store(r++,224|a>>>12),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=2097151?(store(r++,240|a>>>18),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=67108863?(store(r++,248|a>>>24),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):(store(r++,252|a>>>30),store(r++,128|a>>>24&63),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a))}return store(r,0),h.set(e,t),t}function _(e){return load(e)|load(e+1)<<8|load(e+2)<<16|load(e+3)<<24}function g(e){if(!e)return null;for(var t,r,n,i,a,s=new Array;t=load(e++);)128&t?(r=63&load(e++),192!=(224&t)?(n=63&load(e++),224==(240&t)?t=(15&t)<<12|r<<6|n:(i=63&load(e++),240==(248&t)?t=(7&t)<<18|r<<12|n<<6|i:(a=63&load(e++),t=248==(252&t)?(3&t)<<24|r<<18|n<<12|i<<6|a:(1&t)<<30|r<<24|n<<18|i<<12|a<<6|63&load(e++))),s.push(t)):s.push((31&t)<<6|r)):s.push(t);return String.fromCodePoints(s)}t.readString=g;var m=function(){return function(){}}();t.BinaryModule=m,t.needsExplicitUnreachable=function e(t){switch(_BinaryenExpressionGetType(t)){case 1:case 2:case 3:case 4:return!1}switch(_BinaryenExpressionGetId(t)){case i.Unreachable:case i.Return:return!1;case i.Break:return 0!=_BinaryenBreakGetCondition(t);case i.Block:if(!_BinaryenBlockGetName(t)){var r=_BinaryenBlockGetNumChildren(t);return r>0&&e(_BinaryenBlockGetChild(t,r-1))}}return!0}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var a,s,o=r(1),c=r(3),l=r(2);function p(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return a.ABSTRACT;case"as":return a.AS;case"async":return a.ASYNC;case"await":return a.AWAIT}break;case 98:switch(e){case"break":return a.BREAK}break;case 99:switch(e){case"case":return a.CASE;case"catch":return a.CATCH;case"class":return a.CLASS;case"continue":return a.CONTINUE;case"const":return a.CONST;case"constructor":return a.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return a.DEBUGGER;case"declare":return a.DECLARE;case"default":return a.DEFAULT;case"delete":return a.DELETE;case"do":return a.DO}break;case 101:switch(e){case"else":return a.ELSE;case"enum":return a.ENUM;case"export":return a.EXPORT;case"extends":return a.EXTENDS}break;case 102:switch(e){case"false":return a.FALSE;case"finally":return a.FINALLY;case"for":return a.FOR;case"from":return a.FROM;case"function":return a.FUNCTION}break;case 103:switch(e){case"get":return a.GET}break;case 105:switch(e){case"if":return a.IF;case"implements":return a.IMPLEMENTS;case"import":return a.IMPORT;case"in":return a.IN;case"instanceof":return a.INSTANCEOF;case"interface":return a.INTERFACE;case"is":return a.IS}break;case 107:switch(e){case"keyof":return a.KEYOF}break;case 108:switch(e){case"let":return a.LET}break;case 109:switch(e){case"module":return a.MODULE}break;case 110:switch(e){case"namespace":return a.NAMESPACE;case"new":return a.NEW;case"null":return a.NULL}break;case 111:switch(e){case"of":return a.OF}break;case 112:switch(e){case"package":return a.PACKAGE;case"private":return a.PRIVATE;case"protected":return a.PROTECTED;case"public":return a.PUBLIC}break;case 114:switch(e){case"readonly":return a.READONLY;case"return":return a.RETURN}break;case 115:switch(e){case"set":return a.SET;case"static":return a.STATIC;case"super":return a.SUPER;case"switch":return a.SWITCH}break;case 116:switch(e){case"this":return a.THIS;case"throw":return a.THROW;case"true":return a.TRUE;case"try":return a.TRY;case"type":return a.TYPE;case"typeof":return a.TYPEOF}break;case 118:switch(e){case"var":return a.VAR;case"void":return a.VOID}break;case 119:switch(e){case"while":return a.WHILE;case"with":return a.WITH}break;case 121:switch(e){case"yield":return a.YIELD}}return a.INVALID}function u(e){switch(e){case a.ABSTRACT:case a.AS:case a.CONSTRUCTOR:case a.DECLARE:case a.DELETE:case a.FROM:case a.FOR:case a.GET:case a.IS:case a.KEYOF:case a.MODULE:case a.NAMESPACE:case a.READONLY:case a.SET:case a.TYPE:case a.VOID:return!0;default:return!1}}!function(e){e[e.ABSTRACT=0]="ABSTRACT",e[e.AS=1]="AS",e[e.ASYNC=2]="ASYNC",e[e.AWAIT=3]="AWAIT",e[e.BREAK=4]="BREAK",e[e.CASE=5]="CASE",e[e.CATCH=6]="CATCH",e[e.CLASS=7]="CLASS",e[e.CONST=8]="CONST",e[e.CONTINUE=9]="CONTINUE",e[e.CONSTRUCTOR=10]="CONSTRUCTOR",e[e.DEBUGGER=11]="DEBUGGER",e[e.DECLARE=12]="DECLARE",e[e.DEFAULT=13]="DEFAULT",e[e.DELETE=14]="DELETE",e[e.DO=15]="DO",e[e.ELSE=16]="ELSE",e[e.ENUM=17]="ENUM",e[e.EXPORT=18]="EXPORT",e[e.EXTENDS=19]="EXTENDS",e[e.FALSE=20]="FALSE",e[e.FINALLY=21]="FINALLY",e[e.FOR=22]="FOR",e[e.FROM=23]="FROM",e[e.FUNCTION=24]="FUNCTION",e[e.GET=25]="GET",e[e.IF=26]="IF",e[e.IMPLEMENTS=27]="IMPLEMENTS",e[e.IMPORT=28]="IMPORT",e[e.IN=29]="IN",e[e.INSTANCEOF=30]="INSTANCEOF",e[e.INTERFACE=31]="INTERFACE",e[e.IS=32]="IS",e[e.KEYOF=33]="KEYOF",e[e.LET=34]="LET",e[e.MODULE=35]="MODULE",e[e.NAMESPACE=36]="NAMESPACE",e[e.NEW=37]="NEW",e[e.NULL=38]="NULL",e[e.OF=39]="OF",e[e.PACKAGE=40]="PACKAGE",e[e.PRIVATE=41]="PRIVATE",e[e.PROTECTED=42]="PROTECTED",e[e.PUBLIC=43]="PUBLIC",e[e.READONLY=44]="READONLY",e[e.RETURN=45]="RETURN",e[e.SET=46]="SET",e[e.STATIC=47]="STATIC",e[e.SUPER=48]="SUPER",e[e.SWITCH=49]="SWITCH",e[e.THIS=50]="THIS",e[e.THROW=51]="THROW",e[e.TRUE=52]="TRUE",e[e.TRY=53]="TRY",e[e.TYPE=54]="TYPE",e[e.TYPEOF=55]="TYPEOF",e[e.VAR=56]="VAR",e[e.VOID=57]="VOID",e[e.WHILE=58]="WHILE",e[e.WITH=59]="WITH",e[e.YIELD=60]="YIELD",e[e.OPENBRACE=61]="OPENBRACE",e[e.CLOSEBRACE=62]="CLOSEBRACE",e[e.OPENPAREN=63]="OPENPAREN",e[e.CLOSEPAREN=64]="CLOSEPAREN",e[e.OPENBRACKET=65]="OPENBRACKET",e[e.CLOSEBRACKET=66]="CLOSEBRACKET",e[e.DOT=67]="DOT",e[e.DOT_DOT_DOT=68]="DOT_DOT_DOT",e[e.SEMICOLON=69]="SEMICOLON",e[e.COMMA=70]="COMMA",e[e.LESSTHAN=71]="LESSTHAN",e[e.GREATERTHAN=72]="GREATERTHAN",e[e.LESSTHAN_EQUALS=73]="LESSTHAN_EQUALS",e[e.GREATERTHAN_EQUALS=74]="GREATERTHAN_EQUALS",e[e.EQUALS_EQUALS=75]="EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS=76]="EXCLAMATION_EQUALS",e[e.EQUALS_EQUALS_EQUALS=77]="EQUALS_EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS_EQUALS=78]="EXCLAMATION_EQUALS_EQUALS",e[e.EQUALS_GREATERTHAN=79]="EQUALS_GREATERTHAN",e[e.PLUS=80]="PLUS",e[e.MINUS=81]="MINUS",e[e.ASTERISK_ASTERISK=82]="ASTERISK_ASTERISK",e[e.ASTERISK=83]="ASTERISK",e[e.SLASH=84]="SLASH",e[e.PERCENT=85]="PERCENT",e[e.PLUS_PLUS=86]="PLUS_PLUS",e[e.MINUS_MINUS=87]="MINUS_MINUS",e[e.LESSTHAN_LESSTHAN=88]="LESSTHAN_LESSTHAN",e[e.GREATERTHAN_GREATERTHAN=89]="GREATERTHAN_GREATERTHAN",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN=90]="GREATERTHAN_GREATERTHAN_GREATERTHAN",e[e.AMPERSAND=91]="AMPERSAND",e[e.BAR=92]="BAR",e[e.CARET=93]="CARET",e[e.EXCLAMATION=94]="EXCLAMATION",e[e.TILDE=95]="TILDE",e[e.AMPERSAND_AMPERSAND=96]="AMPERSAND_AMPERSAND",e[e.BAR_BAR=97]="BAR_BAR",e[e.QUESTION=98]="QUESTION",e[e.COLON=99]="COLON",e[e.EQUALS=100]="EQUALS",e[e.PLUS_EQUALS=101]="PLUS_EQUALS",e[e.MINUS_EQUALS=102]="MINUS_EQUALS",e[e.ASTERISK_EQUALS=103]="ASTERISK_EQUALS",e[e.ASTERISK_ASTERISK_EQUALS=104]="ASTERISK_ASTERISK_EQUALS",e[e.SLASH_EQUALS=105]="SLASH_EQUALS",e[e.PERCENT_EQUALS=106]="PERCENT_EQUALS",e[e.LESSTHAN_LESSTHAN_EQUALS=107]="LESSTHAN_LESSTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_EQUALS=108]="GREATERTHAN_GREATERTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS=109]="GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS",e[e.AMPERSAND_EQUALS=110]="AMPERSAND_EQUALS",e[e.BAR_EQUALS=111]="BAR_EQUALS",e[e.CARET_EQUALS=112]="CARET_EQUALS",e[e.AT=113]="AT",e[e.IDENTIFIER=114]="IDENTIFIER",e[e.STRINGLITERAL=115]="STRINGLITERAL",e[e.INTEGERLITERAL=116]="INTEGERLITERAL",e[e.FLOATLITERAL=117]="FLOATLITERAL",e[e.INVALID=118]="INVALID",e[e.ENDOFFILE=119]="ENDOFFILE"}(a=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(s=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=p,t.tokenIsAlsoIdentifier=u,t.operatorTokenToString=function(e){switch(e){case a.DELETE:return"delete";case a.IN:return"in";case a.INSTANCEOF:return"instanceof";case a.NEW:return"new";case a.TYPEOF:return"typeof";case a.VOID:return"void";case a.YIELD:return"yield";case a.DOT_DOT_DOT:return"...";case a.COMMA:return",";case a.LESSTHAN:return"<";case a.GREATERTHAN:return">";case a.LESSTHAN_EQUALS:return"<=";case a.GREATERTHAN_EQUALS:return">=";case a.EQUALS_EQUALS:return"==";case a.EXCLAMATION_EQUALS:return"!=";case a.EQUALS_EQUALS_EQUALS:return"===";case a.EXCLAMATION_EQUALS_EQUALS:return"!==";case a.PLUS:return"+";case a.MINUS:return"-";case a.ASTERISK_ASTERISK:return"**";case a.ASTERISK:return"*";case a.SLASH:return"/";case a.PERCENT:return"%";case a.PLUS_PLUS:return"++";case a.MINUS_MINUS:return"--";case a.LESSTHAN_LESSTHAN:return"<<";case a.GREATERTHAN_GREATERTHAN:return">>";case a.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case a.AMPERSAND:return"&";case a.BAR:return"|";case a.CARET:return"^";case a.EXCLAMATION:return"!";case a.TILDE:return"~";case a.AMPERSAND_AMPERSAND:return"&&";case a.BAR_BAR:return"||";case a.EQUALS:return"=";case a.PLUS_EQUALS:return"+=";case a.MINUS_EQUALS:return"-=";case a.ASTERISK_EQUALS:return"*=";case a.ASTERISK_ASTERISK_EQUALS:return"**=";case a.SLASH_EQUALS:return"/=";case a.PERCENT_EQUALS:return"%=";case a.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case a.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case a.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case a.AMPERSAND_EQUALS:return"&=";case a.BAR_EQUALS:return"|=";case a.CARET_EQUALS:return"^=";default:return assert(!1),""}};var h=function(){function e(e,t,r){this.debugInfoRef=0,this.source=e,this.start=t,this.end=r}return e.join=function(t,r){if(t.source!=r.source)throw new Error("source mismatch");return new e(t.source,t.startr.end?t.end:r.end)},Object.defineProperty(e.prototype,"atStart",{get:function(){return new e(this.source,this.start,this.start)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"atEnd",{get:function(){return new e(this.source,this.end,this.end)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"line",{get:function(){for(var e=this.source.text,t=1,r=this.start;r>=0;--r)10==e.charCodeAt(r)&&t++;return t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"column",{get:function(){for(var e=this.source.text,t=0,r=this.start-1;r>=0&&10!=e.charCodeAt(r);--r)++t;return t},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return this.source.text.substring(this.start,this.end)},e}();t.Range=h;var d=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,r)||this;n.end=0,n.pos=0,n.token=-1,n.tokenPos=0,n.nextToken=-1,n.nextTokenPos=0,n.nextTokenOnNewLine=!1,n.onComment=null,n.source=t,n.pos=0,n.end=t.text.length,n.diagnostics=r||new Array;var i=t.text;if(n.pos1&&this.pos2&&this.pos1&&this.pos1&&this.pos1&&this.pos2&&this.pos1&&this.pos1&&this.pos1&&this.pos2&&this.pos+11&&this.pos1&&this.pos2&&this.pos1&&this.pos2&&this.pos1&&this.pos2&&this.pos3&&this.pos1&&this.pos1&&this.pos=this.end){n+=e.substring(r,this.pos),this.error(o.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.end));break}var i=e.charCodeAt(this.pos);if(i==t){n+=e.substring(r,this.pos++);break}if(92!=i){if(l.isLineBreak(i)){n+=e.substring(r,this.pos),this.error(o.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.pos));break}++this.pos}else n+=e.substring(r,this.pos),n+=this.readEscapeSequence(),r=this.pos}return n},t.prototype.readEscapeSequence=function(){if(++this.pos>=this.end)return this.error(o.DiagnosticCode.Unexpected_end_of_text,this.range(this.end)),"";var e=this.source.text,t=e.charCodeAt(this.pos++);switch(t){case 48:return"\0";case 98:return"\b";case 116:return"\t";case 110:return"\n";case 118:return"\v";case 102:return"\f";case 114:return"\r";case 39:return"'";case 34:return'"';case 117:return this.pos=this.end){this.error(o.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.end));break}if(92!=e.charCodeAt(this.pos)){var n=e.charCodeAt(this.pos);if(47==n&&!r)break;if(l.isLineBreak(n)){this.error(o.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.pos));break}++this.pos,r=!1}else++this.pos,r=!0}return e.substring(t,this.pos)},t.prototype.readRegexpFlags=function(){for(var e=this.source.text,t=this.pos,r=0;this.pos57)&&95!=r)break;t++}return!0},t.prototype.readInteger=function(){var e=this.source.text;if(48==e.charCodeAt(this.pos)&&this.pos+2=48&&s<=57)r=i64_add(i64_mul(r,n),i64_new(s-48,0));else if(s>=65&&s<=70)r=i64_add(i64_mul(r,n),i64_new(10+s-65,0));else if(s>=97&&s<=102)r=i64_add(i64_mul(r,n),i64_new(10+s-97,0));else{if(95!=s)break;i==a&&this.error(i==t?o.DiagnosticCode.Numeric_separators_are_not_allowed_here:o.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(o.DiagnosticCode.Hexadecimal_digit_expected,this.range(t)):i==this.pos&&this.error(o.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readDecimalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(10,0),i=t;this.pos=48&&s<=57)r=i64_add(i64_mul(r,n),i64_new(s-48,0));else{if(95!=s)break;i==a&&this.error(i==t?o.DiagnosticCode.Numeric_separators_are_not_allowed_here:o.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(o.DiagnosticCode.Digit_expected,this.range(t)):i==this.pos&&this.error(o.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readOctalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(8,0),i=t;this.pos=48&&s<=55)r=i64_add(i64_mul(r,n),i64_new(s-48,0));else{if(95!=s)break;i==a&&this.error(i==t?o.DiagnosticCode.Numeric_separators_are_not_allowed_here:o.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}++this.pos}return this.pos==t?this.error(o.DiagnosticCode.Octal_digit_expected,this.range(t)):i==this.pos&&this.error(o.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readBinaryInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(2,0),i=i64_new(1,0),a=t;this.pos=48&&n<=57)t=16*t+n-48;else if(n>=65&&n<=70)t=16*t+10+n-65;else{if(!(n>=97&&n<=102))return this.error(o.DiagnosticCode.Hexadecimal_digit_expected,this.range(this.pos-1,this.pos)),"";t=16*t+10+n-97}if(0==--e)break}return e?(this.error(o.DiagnosticCode.Unexpected_end_of_text,this.range(this.pos)),""):String.fromCharCode(t)},t.prototype.readExtendedUnicodeEscape=function(){var e=this.pos,t=this.readHexInteger(),r=i64_low(t),n=!1;assert(!i64_high(t)),r>1114111&&(this.error(o.DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,this.range(e,this.pos)),n=!0);var i=this.source.text;return this.pos>=this.end?(this.error(o.DiagnosticCode.Unexpected_end_of_text,this.range(e,this.end)),n=!0):125==i.charCodeAt(this.pos)?++this.pos:(this.error(o.DiagnosticCode.Unterminated_Unicode_escape_sequence,this.range(e,this.pos)),n=!0),n?"":r<65536?String.fromCharCode(r):String.fromCharCode(55296+((r-65536)/1024|0),(r-65536)%1024+56320)},t.prototype.finish=function(){},t}(o.DiagnosticEmitter);t.Tokenizer=d;var _=function(){return function(){}}();t.State=_;var g=null},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4);!function(e){e[e.I8=0]="I8",e[e.I16=1]="I16",e[e.I32=2]="I32",e[e.I64=3]="I64",e[e.ISIZE=4]="ISIZE",e[e.U8=5]="U8",e[e.U16=6]="U16",e[e.U32=7]="U32",e[e.U64=8]="U64",e[e.USIZE=9]="USIZE",e[e.BOOL=10]="BOOL",e[e.F32=11]="F32",e[e.F64=12]="F64",e[e.VOID=13]="VOID"}(t.TypeKind||(t.TypeKind={})),function(e){e[e.NONE=0]="NONE",e[e.SIGNED=1]="SIGNED",e[e.UNSIGNED=2]="UNSIGNED",e[e.INTEGER=4]="INTEGER",e[e.FLOAT=8]="FLOAT",e[e.POINTER=16]="POINTER",e[e.SHORT=32]="SHORT",e[e.LONG=64]="LONG",e[e.VALUE=128]="VALUE",e[e.REFERENCE=256]="REFERENCE",e[e.NULLABLE=512]="NULLABLE"}(t.TypeFlags||(t.TypeFlags={}));var i=function(){function e(e,t,r){this.cachedNullableType=null,this.kind=e,this.flags=t,this.size=r,this.byteSize=ceil(r/8),this.classReference=null,this.signatureReference=null,this.nonNullableType=this}return Object.defineProperty(e.prototype,"intType",{get:function(){switch(this.kind){case 0:return e.i8;case 1:return e.i16;case 11:case 2:return e.i32;case 12:case 3:return e.i64;case 4:return 64==this.size?e.isize64:e.isize32;case 5:return e.u8;case 6:return e.u16;case 7:return e.u32;case 8:return e.u64;case 9:return 64==this.size?e.usize64:e.usize32;case 10:default:return e.i32}},enumerable:!0,configurable:!0}),e.prototype.isManaged=function(e){if(e.hasGC){var t=this.classReference;return null!==t&&!t.hasDecorator(n.DecoratorFlags.UNMANAGED)}return!1},e.prototype.computeSmallIntegerShift=function(e){return e.size-this.size},e.prototype.computeSmallIntegerMask=function(e){var t=this.is(2)?this.size:this.size-1;return-1>>>e.size-t},e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.asClass=function(t){assert(9==this.kind&&!this.classReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.classReference=t,r},e.prototype.asFunction=function(t){assert(7==this.kind&&!this.signatureReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.signatureReference=t,r},e.prototype.asNullable=function(){return assert(this.is(256)),this.cachedNullableType||(assert(!this.is(512)),this.cachedNullableType=new e(this.kind,512|this.flags,this.size),this.cachedNullableType.nonNullableType=this,this.cachedNullableType.classReference=this.classReference,this.cachedNullableType.signatureReference=this.signatureReference),this.cachedNullableType},e.prototype.isAssignableTo=function(t,r){var n,i,a,s;if(void 0===r&&(r=!1),this.is(256)){if(t.is(256)&&(!this.is(512)||t.is(512)))if(n=this.classReference){if(i=t.classReference)return n.isAssignableTo(i)}else if((a=this.signatureReference)&&(s=t.signatureReference))return a.isAssignableTo(s)}else if(!t.is(256))if(this.is(4))if(t.is(4)){if(!r||this==e.bool||this.is(1)==t.is(1))return this.size<=t.size}else{if(11==t.kind)return this.size<=23;if(12==t.kind)return this.size<=52}else if(this.is(8)&&t.is(8))return this.size<=t.size;return!1},e.commonCompatible=function(e,t,r){return t.isAssignableTo(e,r)?e:e.isAssignableTo(t,r)?t:null},e.prototype.toString=function(e){if(void 0===e&&(e=!1),!e&&this.is(256)){var t=this.classReference;if(t)return this.is(512)?t.toString()+" | null":t.toString();var r=this.signatureReference;if(r)return this.is(512)?"("+r.toString(!0)+") | null":r.toString(!0);assert(!1)}switch(this.kind){case 0:return"i8";case 1:return"i16";case 2:return"i32";case 3:return"i64";case 4:return"isize";case 5:return"u8";case 6:return"u16";case 7:return"u32";case 8:return"u64";case 9:return"usize";case 10:return"bool";case 11:return"f32";case 12:return"f64";default:assert(!1);case 13:return"void"}},e.prototype.toNativeType=function(){switch(this.kind){default:return 1;case 3:case 8:return 2;case 4:case 9:return 64==this.size?2:1;case 11:return 3;case 12:return 4;case 13:return 0}},e.prototype.toNativeZero=function(e){switch(this.kind){case 13:assert(!1);default:return e.createI32(0);case 4:case 9:if(64!=this.size)return e.createI32(0);case 3:case 8:return e.createI64(0);case 11:return e.createF32(0);case 12:return e.createF64(0)}},e.prototype.toNativeOne=function(e){switch(this.kind){case 13:assert(!1);default:return e.createI32(1);case 4:case 9:if(64!=this.size)return e.createI32(1);case 3:case 8:return e.createI64(1);case 11:return e.createF32(1);case 12:return e.createF64(1)}},e.prototype.toNativeNegOne=function(e){switch(this.kind){case 13:assert(!1);default:return e.createI32(-1);case 4:case 9:if(64!=this.size)return e.createI32(-1);case 3:case 8:return e.createI64(-1,-1);case 11:return e.createF32(-1);case 12:return e.createF64(-1)}},e.prototype.toSignatureString=function(){switch(this.kind){default:return"i";case 3:case 8:return"I";case 4:case 9:return 64==this.size?"I":"i";case 11:return"f";case 12:return"F";case 13:return"v"}},e.i8=new e(0,165,8),e.i16=new e(1,165,16),e.i32=new e(2,133,32),e.i64=new e(3,197,64),e.isize32=new e(4,149,32),e.isize64=new e(4,213,64),e.u8=new e(5,166,8),e.u16=new e(6,166,16),e.u32=new e(7,134,32),e.u64=new e(8,198,64),e.usize32=new e(9,150,32),e.usize64=new e(9,214,64),e.bool=new e(10,166,1),e.f32=new e(11,137,32),e.f64=new e(12,201,64),e.void=new e(13,0,0),e}();t.Type=i,t.typesToNativeTypes=function(e){for(var t=e.length,r=new Array(t),n=0;ne?t[e]:o(e)},e.prototype.isAssignableTo=function(e){var t=this.thisType,r=e.thisType;if(t){if(!r||!t.isAssignableTo(r))return!1}else if(r)return!1;if(this.hasRest!=e.hasRest)return!1;var n=this.parameterTypes,i=e.parameterTypes,a=n.length;if(a!=i.length)return!1;for(var s=0;s=l&&u!=p?t.push("?: "):t.push(": "),t.push(i[u].toString());return t.push(") => "),t.push(this.returnType.toString()),t.join("")},e}();t.Signature=a;var s=null;function o(e){s||(s=[]);for(var t=s.length;t<=e;++t)s.push("arg$"+t.toString(10));return s[e-1]}t.getDefaultParameterName=o},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o,c=r(23),l=r(1),p=r(5),u=r(0),h=r(4),d=r(6),_=r(3),g=r(7),m=r(2);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(o=t.Target||(t.Target={}));var y=function(){function e(){this.target=o.WASM32,this.noTreeShaking=!1,this.noAssert=!1,this.importMemory=!1,this.importTable=!1,this.sourceMap=!1,this.memoryBase=0,this.globalAliases=null,this.features=0,this.optimizeLevelHint=0,this.shrinkLevelHint=0}return Object.defineProperty(e.prototype,"isWasm64",{get:function(){return this.target==o.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==o.WASM64?g.Type.usize64:g.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==o.WASM64?g.Type.isize64:g.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==o.WASM64?2:1},enumerable:!0,configurable:!0}),e.prototype.hasFeature=function(e){return 0!=(this.features&e)},e}();t.Options=y,function(e){e[e.NONE=0]="NONE",e[e.SIGN_EXTENSION=1]="SIGN_EXTENSION",e[e.MUTABLE_GLOBAL=2]="MUTABLE_GLOBAL"}(t.Feature||(t.Feature={})),function(e){e[e.NONE=0]="NONE",e[e.IMPLICIT=1]="IMPLICIT",e[e.EXPLICIT=2]="EXPLICIT"}(t.ConversionKind||(t.ConversionKind={})),function(e){e[e.NONE=0]="NONE",e[e.WRAP=1]="WRAP"}(t.WrapMode||(t.WrapMode={}));var E,f,T=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,t.diagnostics)||this;return n.currentOuterFunction=null,n.currentInlineFunctions=[],n.currentEnum=null,n.currentType=g.Type.void,n.memorySegments=[],n.stringSegments=new Map,n.functionTable=["null"],n.argcVar=0,n.argcSet=0,n.needsIterateRoots=!1,n.f32ModInstance=null,n.f64ModInstance=null,n.f32PowInstance=null,n.f64PowInstance=null,n.program=t,n.resolver=t.resolver,r||(r=new y),n.options=r,n.memoryOffset=i64_new(max(r.memoryBase,8)),n.module=p.Module.create(),n}return i(t,e),t.compile=function(e,r){return void 0===r&&(r=null),new t(e,r).compile()},t.prototype.compile=function(){var e,t,r=this.options,n=this.module,i=this.program;i.initialize(r);var o=new h.Function(i.startFunction,"start",new g.Signature([],g.Type.void));this.startFunctionInstance=o;var l=new Array;this.startFunctionBody=l,this.currentFunction=o,r.isWasm64?n.addGlobal("HEAP_BASE",2,!0,n.createI64(0,0)):n.addGlobal("HEAP_BASE",1,!1,n.createI32(0));for(var u=i.sources,d=0,_=u.length;d<_;++d)u[d].isEntry&&this.compileSource(u[d]);if(l.length||null!==i.mainFunction){var m=o.signature,y=n.addFunction(o.internalName,this.ensureFunctionType(m.parameterTypes,m.returnType,m.thisType),g.typesToNativeTypes(o.additionalLocals),n.createBlock(null,l));o.finalize(n,y),i.mainFunction||n.setStart(y)}var E=this.memoryOffset;E=i64_align(E,r.usizeType.byteSize),this.memoryOffset=E,n.removeGlobal("HEAP_BASE"),r.isWasm64?n.addGlobal("HEAP_BASE",2,!1,n.createI64(i64_low(E),i64_high(E))):n.addGlobal("HEAP_BASE",1,!1,n.createI32(i64_low(E))),n.setMemory(this.options.memoryBase||this.memorySegments.length?i64_low(i64_shr_u(i64_align(E,65536),i64_new(16,0))):0,p.Module.UNLIMITED_MEMORY,this.memorySegments,r.target,"memory"),r.importMemory&&n.addMemoryImport("0","env","memory");var f=this.functionTable;n.setFunctionTable(f.length,4294967295,f),n.addTableExport("0","table"),n.addFunction("null",this.ensureFunctionType(null,g.Type.void),null,n.createBlock(null,[])),r.importTable&&n.addTableImport("0","env","table");try{for(var T=a(i.moduleLevelExports),I=T.next();!I.done;I=T.next()){var v=s(I.value,2),C=v[0],A=v[1];this.makeModuleExport(C,A.element)}}catch(t){e={error:t}}finally{try{I&&!I.done&&(t=T.return)&&t.call(T)}finally{if(e)throw e.error}}return this.needsIterateRoots&&c.compileIterateRoots(this),n},t.prototype.makeModuleExport=function(e,t,r){var n,i,s,o,c,p,d,_,m,y;void 0===r&&(r="");var E=t.members;if(E){var f=r+e+(t.kind==h.ElementKind.CLASS?u.INSTANCE_DELIMITER:u.STATIC_DELIMITER);if(t.kind==h.ElementKind.NAMESPACE)try{for(var T=a(E.values()),I=T.next();!I.done;I=T.next()){(A=I.value).is(u.CommonFlags.EXPORT)&&this.makeModuleExport(A.simpleName,A,f)}}catch(e){n={error:e}}finally{try{I&&!I.done&&(i=T.return)&&i.call(T)}finally{if(n)throw n.error}}else try{for(var v=a(E.values()),C=v.next();!C.done;C=v.next()){var A;(A=C.value).is(u.CommonFlags.PRIVATE)||this.makeModuleExport(A.simpleName,A,f)}}catch(e){s={error:e}}finally{try{C&&!C.done&&(o=v.return)&&o.call(v)}finally{if(s)throw s.error}}}switch(t.kind){case h.ElementKind.GLOBAL:if(t.is(u.CommonFlags.CONST)||t.is(u.CommonFlags.STATIC|u.CommonFlags.READONLY)||this.options.hasFeature(2))this.module.addGlobalExport(t.internalName,r+e);else(N=t.declaration)&&this.error(l.DiagnosticCode.Cannot_export_a_mutable_global,N.name.range);break;case h.ElementKind.ENUMVALUE:var N;if(assert(t.parent).is(u.CommonFlags.CONST)||this.options.hasFeature(2))this.module.addGlobalExport(t.internalName,r+e);else(N=t.declaration)&&this.error(l.DiagnosticCode.Cannot_export_a_mutable_global,N.name.range);break;case h.ElementKind.FUNCTION:var S=(z=t).signature;S.requiredParameters"),!1;e.type=this.currentType,e.set(u.CommonFlags.RESOLVED)}else assert(!1);if(e.is(u.CommonFlags.AMBIENT)&&e.hasDecorator(h.DecoratorFlags.BUILTIN))return!0;var a=e.type.toNativeType(),s=e.is(u.CommonFlags.CONST)||e.is(u.CommonFlags.STATIC|u.CommonFlags.READONLY);if(e.is(u.CommonFlags.AMBIENT))return s||this.options.hasFeature(2)?(e.set(u.CommonFlags.MODULE_IMPORT),r?I(e,r):(E="env",f=e.simpleName),t.addGlobalImport(e.internalName,E,f,a),e.set(u.CommonFlags.COMPILED),!0):(this.error(l.DiagnosticCode.Operation_not_supported,assert(r).range),!1);var o=!1;if(null!==r&&null!==r.initializer){if(n||(n=this.compileExpression(r.initializer,e.type,1,1)),p.getExpressionId(n)!=p.ExpressionId.Const&&(s?(n=t.precomputeExpression(n),p.getExpressionId(n)!=p.ExpressionId.Const&&(this.warning(l.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,r.range),o=!0)):o=!0),e.hasDecorator(h.DecoratorFlags.INLINE)&&!o){switch(assert(p.getExpressionId(n)==p.ExpressionId.Const),p.getExpressionType(n)){case 1:e.constantValueKind=1,e.constantIntegerValue=i64_new(p.getConstValueI32(n),0);break;case 2:e.constantValueKind=1,e.constantIntegerValue=i64_new(p.getConstValueI64Low(n),p.getConstValueI64High(n));break;case 3:e.constantValueKind=2,e.constantFloatValue=p.getConstValueF32(n);break;case 4:e.constantValueKind=2,e.constantFloatValue=p.getConstValueF64(n);break;default:return assert(!1),!1}e.set(u.CommonFlags.INLINED)}}else n=e.type.toNativeZero(t);var c=e.internalName;return o?(t.addGlobal(c,a,!0,e.type.toNativeZero(t)),this.startFunctionBody.push(t.createSetGlobal(c,n))):t.addGlobal(c,a,!s,n),!0},t.prototype.compileEnumDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==h.ElementKind.ENUM),this.compileEnum(t)?t:null},t.prototype.compileEnum=function(e){var t,r;if(e.is(u.CommonFlags.COMPILED))return!0;e.set(u.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var i=null,s=!1;if(e.members)try{for(var o=a(e.members.values()),c=o.next();!c.done;c=o.next()){var d=c.value;if(d.kind==h.ElementKind.ENUMVALUE){var _=!1,m=d,y=m.declaration;m.set(u.CommonFlags.COMPILED);var E=void 0;y.value?(E=this.compileExpression(y.value,g.Type.i32,1,0),p.getExpressionId(E)!=p.ExpressionId.Const&&(e.is(u.CommonFlags.CONST)?(E=n.precomputeExpression(E),p.getExpressionId(E)!=p.ExpressionId.Const&&(this.error(l.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.value.range),_=!0)):_=!0)):null==i?E=n.createI32(0):(s&&this.error(l.DiagnosticCode.Enum_member_must_have_initializer,y.range),E=n.createBinary(p.BinaryOp.AddI32,n.createGetGlobal(i.internalName,1),n.createI32(1)),E=n.precomputeExpression(E),p.getExpressionId(E)!=p.ExpressionId.Const&&(e.is(u.CommonFlags.CONST)&&this.error(l.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,y.range),_=!0)),_?(n.addGlobal(m.internalName,1,!0,n.createI32(0)),this.startFunctionBody.push(n.createSetGlobal(m.internalName,E)),s=!0):(n.addGlobal(m.internalName,1,!e.is(u.CommonFlags.CONST),E),s=!1),i=m}}}catch(e){t={error:e}}finally{try{c&&!c.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}return this.currentEnum=null,!0},t.prototype.compileFunctionDeclaration=function(e,t){var r=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(r.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.compileFunctionUsingTypeArguments(r,t,m.makeMap(),null,r.declaration.name)},t.prototype.compileFunctionUsingTypeArguments=function(e,t,r,n,i){var a=this.resolver.resolveFunctionInclTypeArguments(e,t,r,i);return a?(a.outerScope=n,this.compileFunction(a)?a:null):null},t.prototype.ensureFunctionType=function(e,t,r){void 0===r&&(r=null);var n,i=e?e.length:0,a=0;if(r?((n=new Array(1+i))[0]=r.toNativeType(),a=1):n=new Array(i),e)for(var s=0;s=0)return e.functionTableIndex;var t=this.functionTable,r=t.length;return!e.is(u.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters=0?"case"+h.toString(10):"break")+"|"+a);var m=t.createBlock("case0|"+a,l,0),y=!0,E=!0,f=!0,T=!0;for(d=0;d=0&&(y&&s.set(1),E&&s.set(2),f&&s.set(4),T&&s.set(32)),m},t.prototype.compileThrowStatement=function(e){var t=this.currentFunction.flow;return t.set(4),t.set(1),c.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileVariableStatement=function(e,t){void 0===t&&(t=!1);var r=this.program,n=this.currentFunction,i=e.declarations,a=i.length;if(t||n==this.startFunctionInstance&&e.parent&&e.parent.kind==_.NodeKind.SOURCE){for(var s=0;s");continue}E=this.currentType}var T=!1;if(m.is(u.CommonFlags.CONST))if(f)if(f=this.module.precomputeExpression(f),p.getExpressionId(f)==p.ExpressionId.Const){var I=new h.Local(r,y,-1,E);switch(p.getExpressionType(f)){case 1:I=I.withConstantIntegerValue(i64_new(p.getConstValueI32(f),0));break;case 2:I=I.withConstantIntegerValue(i64_new(p.getConstValueI64Low(f),p.getConstValueI64High(f)));break;case 3:I=I.withConstantFloatValue(p.getConstValueF32(f));break;case 4:I=I.withConstantFloatValue(p.getConstValueF64(f));break;default:return assert(!1),this.module.createUnreachable()}var v=n.flow.scopedLocals;if(v){if(v.has(y))return this.error(l.DiagnosticCode.Duplicate_identifier_0,m.name.range,y),this.module.createUnreachable()}else n.flow.scopedLocals=v=new Map;v.set(y,I),T=!0}else this.warning(l.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,m.range);else this.error(l.DiagnosticCode._const_declarations_must_be_initialized,m.range);if(!T){I=void 0;I=m.isAny(u.CommonFlags.LET|u.CommonFlags.CONST)||c.is(4096)?c.addScopedLocal(E,y,!1,m):n.addLocal(E,y,m),f?(o.push(this.compileAssignmentWithValue(m.name,f)),I.type.is(36)&&c.setLocalWrapped(I.index,!c.canOverflow(f,E))):I.type.is(36)&&c.setLocalWrapped(I.index,!0)}}return o.length?1==o.length?o[0]:this.module.createBlock(null,o,0):0},t.prototype.compileVoidStatement=function(e){return this.compileExpression(e.expression,g.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,g.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(u.CommonFlags.GENERIC|u.CommonFlags.GENERIC_CONTEXT)){var n=t.precomputeExpression(r);if(p.getExpressionId(n)==p.ExpressionId.Const&&1==p.getExpressionType(n)){if(!p.getConstValueI32(n))return t.createNop()}else r=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,g.Type.bool,0),this.currentType)}var i=this.currentFunction,a=i.enterBreakContext(),s=i.flow,o=s.fork();i.flow=o;var c="break|"+a;o.breakLabel=c;var l="continue|"+a;o.continueLabel=l;var h=this.compileStatement(e.statement),d=o.isAny(29);return i.flow=o.free(),i.leaveBreakContext(),o.unset(1560),s.inheritConditional(o),t.createBlock(c,[t.createLoop(l,t.createIf(r,d?h:t.createBlock(null,[h,t.createBreak(l)],0)))])},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(u.CommonFlags.INLINED));var n=e.type;switch(!r&&n.is(4)&&t.is(4)&&n.size>i:0);case 5:case 6:case 10:var a=e.type.computeSmallIntegerMask(g.Type.i32);return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue)&a:0);case 2:case 7:return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 4:case 9:if(!e.program.options.isWasm64)return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 3:case 8:return 1==e.constantValueKind?this.module.createI64(i64_low(e.constantIntegerValue),i64_high(e.constantIntegerValue)):this.module.createI64(0);case 12:if(!e.hasDecorator(h.DecoratorFlags.BUILTIN)||t!=g.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=g.Type.f32;case 11:return this.module.createF32(e.constantFloatValue);default:return assert(!1),this.module.createUnreachable()}},t.prototype.compileExpression=function(e,t,r,n){var i;switch(this.currentType=t,e.kind){case _.NodeKind.ASSERTION:i=this.compileAssertionExpression(e,t);break;case _.NodeKind.BINARY:i=this.compileBinaryExpression(e,t);break;case _.NodeKind.CALL:i=this.compileCallExpression(e,t);break;case _.NodeKind.COMMA:i=this.compileCommaExpression(e,t);break;case _.NodeKind.ELEMENTACCESS:i=this.compileElementAccessExpression(e,t);break;case _.NodeKind.FUNCTION:i=this.compileFunctionExpression(e,t);break;case _.NodeKind.IDENTIFIER:case _.NodeKind.FALSE:case _.NodeKind.NULL:case _.NodeKind.THIS:case _.NodeKind.SUPER:case _.NodeKind.TRUE:i=this.compileIdentifierExpression(e,t,0==r);break;case _.NodeKind.INSTANCEOF:i=this.compileInstanceOfExpression(e,t);break;case _.NodeKind.LITERAL:i=this.compileLiteralExpression(e,t);break;case _.NodeKind.NEW:i=this.compileNewExpression(e,t);break;case _.NodeKind.PARENTHESIZED:i=this.compileParenthesizedExpression(e,t);break;case _.NodeKind.PROPERTYACCESS:i=this.compilePropertyAccessExpression(e,t,0==r);break;case _.NodeKind.TERNARY:i=this.compileTernaryExpression(e,t);break;case _.NodeKind.UNARYPOSTFIX:i=this.compileUnaryPostfixExpression(e,t);break;case _.NodeKind.UNARYPREFIX:i=this.compileUnaryPrefixExpression(e,t);break;default:this.error(l.DiagnosticCode.Operation_not_supported,e.range),i=this.module.createUnreachable()}var a=this.currentType;return 0!=r&&a!=t?(i=this.convertExpression(i,a,t,r,n,e),this.currentType=t):1==n&&(i=this.ensureSmallIntegerWrap(i,a)),this.options.sourceMap&&this.addDebugLocation(i,e.range),i},t.prototype.compileExpressionRetainType=function(e,t,r){return this.compileExpression(e,t==g.Type.void?g.Type.i32:t,0,r)},t.prototype.precomputeExpression=function(e,t,r,n){return this.module.precomputeExpression(this.compileExpression(e,t,r,n))},t.prototype.convertExpression=function(e,t,r,n,i,a){assert(0!=n);var s=this.module;return 13==t.kind?(assert(13!=r.kind),this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,a.range,t.toString(),r.toString()),s.createUnreachable()):13==r.kind?s.createDrop(e):(t.isAssignableTo(r)||1==n&&this.error(l.DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,a.range,t.toString(),r.toString()),t.is(8)?r.is(8)?11==t.kind?12==r.kind&&(e=s.createUnary(p.UnaryOp.PromoteF32,e)):11==r.kind&&(e=s.createUnary(p.UnaryOp.DemoteF64,e)):r.is(4)?11==t.kind?r==g.Type.bool?(e=s.createBinary(p.BinaryOp.NeF32,e,s.createF32(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(p.UnaryOp.TruncF32ToI64,e):s.createUnary(p.UnaryOp.TruncF32ToI32,e):r.is(64)?s.createUnary(p.UnaryOp.TruncF32ToU64,e):s.createUnary(p.UnaryOp.TruncF32ToU32,e):r==g.Type.bool?(e=s.createBinary(p.BinaryOp.NeF64,e,s.createF64(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(p.UnaryOp.TruncF64ToI64,e):s.createUnary(p.UnaryOp.TruncF64ToI32,e):r.is(64)?s.createUnary(p.UnaryOp.TruncF64ToU64,e):s.createUnary(p.UnaryOp.TruncF64ToU32,e):(assert(0==r.flags,"void type expected"),e=s.createDrop(e)):t.is(4)&&r.is(8)?e=11==r.kind?t.is(64)?s.createUnary(t.is(1)?p.UnaryOp.ConvertI64ToF32:p.UnaryOp.ConvertU64ToF32,e):s.createUnary(t.is(1)?p.UnaryOp.ConvertI32ToF32:p.UnaryOp.ConvertU32ToF32,e):t.is(64)?s.createUnary(t.is(1)?p.UnaryOp.ConvertI64ToF64:p.UnaryOp.ConvertU64ToF64,e):s.createUnary(t.is(1)?p.UnaryOp.ConvertI32ToF64:p.UnaryOp.ConvertU32ToF64,e):t.is(64)?r==g.Type.bool?(e=s.createBinary(p.BinaryOp.NeI64,e,s.createI64(0)),i=0):r.is(64)||(e=s.createUnary(p.UnaryOp.WrapI64,e)):r.is(64)?(e=s.createUnary(t.is(1)?p.UnaryOp.ExtendI32:p.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_),s.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.GtI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GtI64:p.BinaryOp.GtI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.GtU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GtU64:p.BinaryOp.GtU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.GtU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.GtF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.GtF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=g.Type.bool;break;case d.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.LE)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=g.Type.commonCompatible(n,a,!0)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_),s.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.LeI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.LeI64:p.BinaryOp.LeI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.LeU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.LeU64:p.BinaryOp.LeU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.LeU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.LeF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.LeF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=g.Type.bool;break;case d.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.GE)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=g.Type.commonCompatible(n,a,!0)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_),s.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.GeI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GeI64:p.BinaryOp.GeI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.GeU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GeU64:p.BinaryOp.GeU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.GeU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.GeF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.GeF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=g.Type.bool;break;case d.Token.EQUALS_EQUALS_EQUALS:case d.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,y==d.Token.EQUALS_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.EQ)){o=this.compileBinaryOverload(v,u,r,_,e);break}if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,d.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.EqI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.EqI64:p.BinaryOp.EqI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.EqI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.EqF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.EqF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=g.Type.bool;break;case d.Token.EXCLAMATION_EQUALS_EQUALS:case d.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,y==d.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.NE)){o=this.compileBinaryOverload(v,u,r,_,e);break}if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,d.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.NeI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.NeI64:p.BinaryOp.NeI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.NeI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.NeF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.NeF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=g.Type.bool;break;case d.Token.EQUALS:return this.compileAssignment(u,_,t);case d.Token.PLUS_EQUALS:m=!0;case d.Token.PLUS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.ADD)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(_,n,1,0);else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,_)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.AddI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.AddI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.AddF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.AddF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case d.Token.MINUS_EQUALS:m=!0;case d.Token.MINUS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.SUB)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(_,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,_)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.SubI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.SubI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.SubF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.SubF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case d.Token.ASTERISK_EQUALS:m=!0;case d.Token.ASTERISK:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.MUL)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(_,n,1,1);else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,_)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.MulI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.MulI64:p.BinaryOp.MulI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.MulI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.MulF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.MulF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case d.Token.ASTERISK_ASTERISK_EQUALS:m=!0;case d.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.POW)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}var E=void 0;if(11==this.currentType.kind){if(i=this.compileExpression(_,g.Type.f32,1,0),a=this.currentType,!(E=this.f32PowInstance)){if(!(f=this.program.elementsLookup.get("Mathf"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=c.createUnreachable();break}if(!(T=f.members?f.members.get("pow"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),o=c.createUnreachable();break}assert(T.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=E=this.resolver.resolveFunction(T,null)}}else if(r=this.convertExpression(r,this.currentType,g.Type.f64,1,0,u),n=this.currentType,i=this.compileExpression(_,g.Type.f64,1,0),a=this.currentType,!(E=this.f64PowInstance)){if(!(f=this.program.elementsLookup.get("Math"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=c.createUnreachable();break}if(!(T=f.members?f.members.get("pow"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),o=c.createUnreachable();break}assert(T.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=E=this.resolver.resolveFunction(T,null)}o=E&&this.compileFunction(E)?this.makeCallDirect(E,[r,i]):c.createUnreachable();break;case d.Token.SLASH_EQUALS:m=!0;case d.Token.SLASH:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.DIV)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(_,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_)}switch(this.currentType.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.DivI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.DivI64:p.BinaryOp.DivI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.DivU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.DivU64:p.BinaryOp.DivU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.DivU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.DivF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.DivF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case d.Token.PERCENT_EQUALS:m=!0;case d.Token.PERCENT:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.REM)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(_,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,_)}switch(this.currentType.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.RemI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.RemI64:p.BinaryOp.RemI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.RemU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.RemU64:p.BinaryOp.RemU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.RemU64,r,i);break;case 11:if(!(E=this.f32ModInstance)){if(!(f=this.program.elementsLookup.get("Mathf"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=c.createUnreachable();break}if(!(T=f.members?f.members.get("mod"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),o=c.createUnreachable();break}assert(T.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=E=this.resolver.resolveFunction(T,null)}o=E&&this.compileFunction(E)?this.makeCallDirect(E,[r,i]):c.createUnreachable();break;case 12:if(!(E=this.f64ModInstance)){var f,T;if(!(f=this.program.elementsLookup.get("Math"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=c.createUnreachable();break}if(!(T=f.members?f.members.get("mod"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),o=c.createUnreachable();break}assert(T.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=E=this.resolver.resolveFunction(T,null)}o=E&&this.compileFunction(E)?this.makeCallDirect(E,[r,i]):c.createUnreachable();break;default:assert(!1),o=c.createUnreachable()}break;case d.Token.LESSTHAN_LESSTHAN_EQUALS:m=!0;case d.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_SHL)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(_,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.ShlI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.ShlI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShlI64:p.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,d.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case d.Token.GREATERTHAN_GREATERTHAN_EQUALS:m=!0;case d.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_SHR)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(_,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.ShrI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.ShrI64,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrI64:p.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.ShrU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.ShrU64,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrU64:p.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,d.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case d.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:m=!0;case d.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_SHR_U)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(_,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:o=c.createBinary(p.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:o=c.createBinary(p.BinaryOp.ShrU32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.ShrU64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrU64:p.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,d.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case d.Token.AMPERSAND_EQUALS:m=!0;case d.Token.AMPERSAND:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_AND)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(_,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,_)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.AndI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.AndI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.AndI64:p.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,d.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case d.Token.BAR_EQUALS:m=!0;case d.Token.BAR:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_OR)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(_,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,_)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=c.createBinary(p.BinaryOp.OrI32,r,i);break;case 2:case 7:o=c.createBinary(p.BinaryOp.OrI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.OrI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.OrI64:p.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,d.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case d.Token.CARET_EQUALS:m=!0;case d.Token.CARET:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){var I,v;if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_XOR)){o=this.compileBinaryOverload(v,u,r,_,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(_,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(_,n,0),a=this.currentType,!(s=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,_)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=c.createBinary(p.BinaryOp.XorI32,r,i);break;case 2:case 7:o=c.createBinary(p.BinaryOp.XorI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.XorI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.XorI64:p.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,d.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case d.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,i=this.compileExpression(_,n,1,0),a=this.currentType,o=c.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),o=c.createIf(this.makeIsTrueish(r,this.currentType),i,o);else{var C=this.currentFunction.flow,A=this.currentFunction.getAndFreeTempLocal(this.currentType,!C.canOverflow(r,this.currentType));o=c.createIf(this.makeIsTrueish(c.createTeeLocal(A.index,r),this.currentType),i,c.createGetLocal(assert(A).index,this.currentType.toNativeType()))}break;case d.Token.BAR_BAR:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,i=this.compileExpression(_,n,1,0),a=this.currentType,o=this.module.cloneExpression(r,!0,0))o=this.module.createIf(this.makeIsTrueish(r,this.currentType),o,i);else{C=this.currentFunction.flow,A=this.currentFunction.getAndFreeTempLocal(this.currentType,!C.canOverflow(r,this.currentType));o=c.createIf(this.makeIsTrueish(c.createTeeLocal(A.index,r),this.currentType),c.createGetLocal(assert(A).index,this.currentType.toNativeType()),i)}break;default:assert(!1),o=this.module.createUnreachable()}return m?this.compileAssignmentWithValue(u,o,t!=g.Type.void):o},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(u.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a,e.hasDecorator(h.DecoratorFlags.INLINE))},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,s=0;if(e.is(u.CommonFlags.INSTANCE)){var o=assert(e.parent);assert(o.kind==h.ElementKind.CLASS),s=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,s,e.hasDecorator(h.DecoratorFlags.INLINE))},t.prototype.compileAssignment=function(e,t,r){var n,i=this.program.resolver,a=this.currentFunction,s=i.resolveExpression(e,a);if(!s)return this.module.createUnreachable();switch(s.kind){case h.ElementKind.GLOBAL:if(!this.compileGlobal(s))return this.module.createUnreachable();assert(s.type!=g.Type.void);case h.ElementKind.LOCAL:case h.ElementKind.FIELD:n=s.type;break;case h.ElementKind.PROPERTY:var o=s.setterPrototype;if(o){var c=this.resolver.resolveFunction(o,null);if(!c)return this.module.createUnreachable();assert(1==c.signature.parameterTypes.length),n=c.signature.parameterTypes[0];break}return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,s.internalName),this.module.createUnreachable();case h.ElementKind.CLASS:if(i.currentElementExpression){var p=a.flow.is(8192),u=s.lookupOverload(h.OperatorKind.INDEXED_SET,p);if(!u)return s.lookupOverload(h.OperatorKind.INDEXED_GET,p)?this.error(l.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,s.internalName):this.error(l.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,s.internalName),this.module.createUnreachable();assert(2==u.signature.parameterTypes.length),n=u.signature.parameterTypes[1];break}default:return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=g.Type.void);var d=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,d,r!=g.Type.void)},t.prototype.compileAssignmentWithValue=function(e,t,r){void 0===r&&(r=!1);var n=this.module,i=this.resolver.resolveExpression(e,this.currentFunction);if(!i)return n.createUnreachable();switch(i.kind){case h.ElementKind.LOCAL:var a=i.type;if(assert(a!=g.Type.void),this.currentType=r?a:g.Type.void,i.is(u.CommonFlags.CONST))return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();var s=this.currentFunction.flow;return a.is(36)&&s.setLocalWrapped(i.index,!s.canOverflow(t,a)),r?n.createTeeLocal(i.index,t):n.createSetLocal(i.index,t);case h.ElementKind.GLOBAL:if(!this.compileGlobal(i))return n.createUnreachable();a=i.type;if(assert(a!=g.Type.void),this.currentType=r?a:g.Type.void,i.is(u.CommonFlags.CONST))return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();if(t=this.ensureSmallIntegerWrap(t,a),r){var o=a.toNativeType(),c=i.internalName;return n.createBlock(null,[n.createSetGlobal(c,t),n.createGetGlobal(c,o)],o)}return n.createSetGlobal(i.internalName,t);case h.ElementKind.FIELD:var p=i.declaration;if(i.is(u.CommonFlags.READONLY)&&!this.currentFunction.is(u.CommonFlags.CONSTRUCTOR)&&null!=p&&null==p.initializer)return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();var d=assert(this.resolver.currentThisExpression),_=this.compileExpressionRetainType(d,this.options.usizeType,0);a=i.type;this.currentType=r?a:g.Type.void;o=a.toNativeType();if(10==a.kind&&(t=this.ensureSmallIntegerWrap(t,a)),r){s=(L=this.currentFunction).flow;var m=L.getAndFreeTempLocal(a,!s.canOverflow(t,a)).index;return n.createBlock(null,[n.createSetLocal(m,t),n.createStore(a.byteSize,_,n.createGetLocal(m,o),o,i.memoryOffset),n.createGetLocal(m,o)],o)}return n.createStore(a.byteSize,_,t,o,i.memoryOffset);case h.ElementKind.PROPERTY:var y=i.setterPrototype;if(y){var E=this.resolver.resolveFunction(y,null);if(!E)return n.createUnreachable();if(!r){if(E.is(u.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),_=this.compileExpressionRetainType(d,this.options.usizeType,0);return this.makeCallDirect(E,[_,t])}return this.makeCallDirect(E,[t])}var f=i.getterPrototype;assert(null!=f);var T=this.resolver.resolveFunction(f,null);if(!T)return n.createUnreachable();var I=(R=T.signature.returnType).toNativeType();if(E.is(u.CommonFlags.INSTANCE)){d=assert(this.resolver.currentThisExpression),_=this.compileExpressionRetainType(d,this.options.usizeType,0),m=this.currentFunction.getAndFreeTempLocal(R,!1).index;return n.createBlock(null,[this.makeCallDirect(E,[n.createTeeLocal(m,_),t]),this.makeCallDirect(T,[n.createGetLocal(m,I)])],I)}return n.createBlock(null,[this.makeCallDirect(E,[t]),this.makeCallDirect(T)],I)}return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,i.internalName),n.createUnreachable();case h.ElementKind.CLASS:var v=this.resolver.currentElementExpression;if(v){var C=this.currentFunction.flow.is(8192),A=i.lookupOverload(h.OperatorKind.INDEXED_GET,C);if(!A)return this.error(l.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,i.internalName),n.createUnreachable();var N=i.lookupOverload(h.OperatorKind.INDEXED_SET,C);if(!N)return this.error(l.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,i.internalName),this.currentType=r?A.signature.returnType:g.Type.void,n.createUnreachable();var S=i.type,O=(d=assert(this.resolver.currentThisExpression),_=this.compileExpressionRetainType(d,this.options.usizeType,0),this.compileExpression(v,g.Type.i32,1,0));if(r){var L,b=(L=this.currentFunction).getTempLocal(S,!1),k=L.getAndFreeTempLocal(this.currentType,!1),R=A.signature.returnType;return this.currentFunction.freeTempLocal(b),n.createBlock(null,[this.makeCallDirect(N,[n.createTeeLocal(b.index,_),n.createTeeLocal(k.index,O),t]),this.makeCallDirect(A,[n.createGetLocal(b.index,b.type.toNativeType()),n.createGetLocal(k.index,k.type.toNativeType())])],R.toNativeType())}return this.makeCallDirect(N,[_,O,t])}}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileCallExpression=function(e,t){var r,n,i=this.module,a=this.currentFunction,s=this.resolver.resolveExpression(e.expression,a);if(!s)return i.createUnreachable();switch(s.kind){case h.ElementKind.FUNCTION_PROTOTYPE:var o=s,c=e.typeArguments;if(o.hasDecorator(h.DecoratorFlags.BUILTIN))return this.compileCallExpressionBuiltin(o,e,t);var p=null;if(c){if(!o.is(u.CommonFlags.GENERIC))return this.error(l.DiagnosticCode.Type_0_is_not_generic,e.expression.range,o.internalName),i.createUnreachable();p=this.resolver.resolveFunctionInclTypeArguments(o,c,m.makeMap(this.currentFunction.flow.contextualTypeArguments),e)}else{if(o.is(u.CommonFlags.GENERIC)){for(var d=new Map,y=assert(o.declaration.typeParameters),E=y.length,f=0;fs&&!i)||(this.error(l.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,s.toString(),t.toString()),!1)},t.prototype.compileCallDirect=function(e,t,r,n,i){void 0===n&&(n=0),void 0===i&&(i=!1);var a=t.length,s=e.signature;if(!this.checkCallSignature(s,a,0!=n,r))return this.module.createUnreachable();if(i){if(assert(!e.is(u.CommonFlags.TRAMPOLINE)),!this.currentInlineFunctions.includes(e)){this.currentInlineFunctions.push(e);var o=this.compileCallInlineUnchecked(e,t,r,n);return this.currentInlineFunctions.pop(),o}this.warning(l.DiagnosticCode.Function_0_cannot_be_inlined_into_itself,r.range,e.internalName)}var c=n?a+1:a,p=new Array(c),h=0;n&&(p[0]=n,h=1);for(var d=s.parameterTypes,_=0;_1?m.createBlock(null,v,T.toNativeType()):v.length?v[0]:m.createNop():(this.error(l.DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,y.signature.returnType.range),m.createUnreachable())},t.prototype.ensureTrampoline=function(e){var t=e.trampoline;if(t)return t;var r=e.signature,n=e.internalName,i=r.parameterTypes,a=e.prototype.declaration.signature.parameters,s=r.returnType,o=r.thisType,c=e.is(u.CommonFlags.INSTANCE),d=r.requiredParameters,_=d,m=i.length,y=m;c&&(++_,++y);var E=assert(y-_),f=new Array(_),T=0,I=this.module;c&&(f[0]=I.createGetLocal(0,this.options.nativeSizeType),T=1);for(var v=0;v=i);var o=this.module;if(!this.compileFunction(e))return o.createUnreachable();var c=e.signature.returnType,l=e.is(u.CommonFlags.MODULE_IMPORT);if(r=a),this.ensureFunctionType(e.parameterTypes,e.returnType,e.thisType);var c=this.module;if(n=0),this.currentType=A,this.module.createGetLocal(N,A.toNativeType());case h.ElementKind.GLOBAL:if(!this.compileGlobal(C))return this.module.createUnreachable();var S=C.type;return assert(S!=g.Type.void),C.is(u.CommonFlags.INLINED)?this.compileInlineConstant(C,t,r):(this.currentType=S,this.module.createGetGlobal(C.internalName,S.toNativeType()));case h.ElementKind.ENUMVALUE:return C.is(u.CommonFlags.COMPILED)?(this.currentType=g.Type.i32,C.is(u.CommonFlags.INLINED)?this.module.createI32(C.constantValue):this.module.createGetGlobal(C.internalName,1)):(this.error(l.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=g.Type.i32,this.module.createUnreachable());case h.ElementKind.FUNCTION_PROTOTYPE:var O=this.resolver.resolveFunction(C,null,m.makeMap(i.flow.contextualTypeArguments));if(!O||!this.compileFunction(O))return n.createUnreachable();var L=this.ensureFunctionTableEntry(O);return this.currentType=O.signature.type,this.module.createI32(L)}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileInstanceOfExpression=function(e,t){var r=this.module,n=this.compileExpressionRetainType(e.expression,this.options.usizeType,0),i=this.currentType,a=this.resolver.resolveType(e.isType);return this.currentType=g.Type.bool,a?i.is(512)&&!a.is(512)?i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?p.BinaryOp.NeI64:p.BinaryOp.NeI32,n,i.toNativeZero(r)):r.createI32(0):r.createI32(i.isAssignableTo(a,!0)?1:0):r.createUnreachable()},t.prototype.compileLiteralExpression=function(e,t,r){void 0===r&&(r=!1);var n=this.module;switch(e.literalKind){case _.LiteralKind.ARRAY:assert(!r);var i=t.classReference;return i&&i.prototype==this.program.arrayPrototype?this.compileArrayLiteral(assert(i.typeArguments)[0],e.elementExpressions,!1,e):(this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case _.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==g.Type.f32?n.createF32(a):(this.currentType=g.Type.f64,n.createF64(a));case _.LiteralKind.INTEGER:var s=e.value;r&&(s=i64_sub(i64_new(0),s));var o=this.resolver.determineIntegerLiteralType(s,t);switch(this.currentType=o,o.kind){case 4:if(!this.options.isWasm64)return n.createI32(i64_low(s));case 3:return n.createI64(i64_low(s),i64_high(s));case 9:if(!this.options.isWasm64)return n.createI32(i64_low(s));case 8:return n.createI64(i64_low(s),i64_high(s));case 11:return n.createF32(i64_to_f32(s));case 12:return n.createF64(i64_to_f64(s));default:return n.createI32(i64_low(s))}case _.LiteralKind.STRING:return assert(!r),this.compileStringLiteral(e);case _.LiteralKind.OBJECT:return assert(!r),this.compileObjectLiteral(e,t)}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.currentType=t,n.createUnreachable()},t.prototype.ensureStaticString=function(e){var t,r=this.program,n=r.hasGC,i=r.gcHeaderSize,a=assert(r.stringInstance),s=this.stringSegments;if(s.has(e))t=s.get(e);else{var o=e.length,l=a.currentMemoryOffset+1&-2,p=l+2*o,u=void 0,h=void 0;n?(u=new Uint8Array(i+p),h=i,m.writeI32(c.ensureGCHook(this,a),u,r.gcHookOffset)):(u=new Uint8Array(p),h=0),m.writeI32(o,u,h+a.offsetof("length")),h+=l;for(var d=0;d",t.toString()),r.createUnreachable();var i=n.constructorInstance;if(i){if(i.signature.requiredParameters)return this.error(l.DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,e.range,n.toString()),r.createUnreachable();if(i.is(u.CommonFlags.PRIVATE))return this.error(l.DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable();if(i.is(u.CommonFlags.PROTECTED))return this.error(l.DiagnosticCode.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable()}var a=e.names,s=a.length,o=e.values,c=n.members,p=!1,d=new Array(s+2),_=this.currentFunction.getTempLocal(this.options.usizeType);assert(s==o.length);for(var g=0,m=s;g=0);var c=this.compileExpressionRetainType(o,this.options.usizeType,0);return this.currentType=i.type,n.createLoad(i.type.byteSize,i.type.is(5),c,i.type.toNativeType(),i.memoryOffset);case h.ElementKind.PROPERTY:return this.compileGetter(i,e);case h.ElementKind.FUNCTION_PROTOTYPE:return this.error(l.DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,e.range,i.simpleName),n.createUnreachable()}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileGetter=function(e,t){var r=e.getterPrototype;if(r){var n=this.resolver.resolveFunction(r,null);if(!n)return this.module.createUnreachable();var i=n.signature;if(!this.checkCallSignature(i,0,n.is(u.CommonFlags.INSTANCE),t))return this.module.createUnreachable();var a=0!=(n.decoratorFlags&h.DecoratorFlags.INLINE);if(n.is(u.CommonFlags.INSTANCE)){var s=assert(n.parent);assert(s.kind==h.ElementKind.CLASS);var o=assert(this.resolver.currentThisExpression),c=this.compileExpressionRetainType(o,this.options.usizeType,0);//!!! +return this.currentType=i.returnType,this.compileCallDirect(n,[],t,c,a)}return this.currentType=i.returnType,this.compileCallDirect(n,[],t,0,a)}return this.error(l.DiagnosticCode.Property_0_does_not_exist_on_type_1,t.range,e.simpleName,e.parent.toString()),this.module.createUnreachable()},t.prototype.compileTernaryExpression=function(e,t){var r=e.ifThen,n=e.ifElse,i=this.currentFunction,a=i.flow,s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,g.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||this.currentFunction.isAny(u.CommonFlags.GENERIC|u.CommonFlags.GENERIC_CONTEXT)){var o=this.module.precomputeExpression(s);if(p.getExpressionId(o)==p.ExpressionId.Const&&1==p.getExpressionType(o))return p.getConstValueI32(o)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);s=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,g.Type.bool,0),this.currentType)}var c=a.fork();i.flow=c;var h=this.compileExpressionRetainType(r,t,0),d=this.currentType;c.free();var _=a.fork();i.flow=_;var m=this.compileExpressionRetainType(n,t,0),y=this.currentType;i.flow=_.free(),a.inheritMutual(c,_);var E=g.Type.commonCompatible(d,y,!1);return E?(h=this.convertExpression(h,d,E,1,0,r),m=this.convertExpression(m,y,E,1,0,n),this.currentType=E,this.module.createIf(s,h,m)):(this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,e.range,d.toString(),y.toString()),this.currentType=t,this.module.createUnreachable())},t.prototype.compileUnaryPostfixExpression=function(e,t){var r=this.module,n=this.currentFunction,i=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0);if(p.getExpressionId(i)==p.ExpressionId.Unreachable)return i;var a,s=this.currentType,o=null;switch(t!=g.Type.void&&(o=n.getTempLocal(s,!1),i=r.createTeeLocal(o.index,i)),e.operator){case d.Token.PLUS_PLUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(p.BinaryOp.AddI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){if(u=this.currentType.classReference)if(_=u.lookupOverload(h.OperatorKind.POSTFIX_INC)){a=this.compileUnaryOverload(_,e.operand,i,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:var c=this.options;a=r.createBinary(c.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(p.BinaryOp.AddI64,i,r.createI64(1));break;case 11:a=r.createBinary(p.BinaryOp.AddF32,i,r.createF32(1));break;case 12:a=r.createBinary(p.BinaryOp.AddF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;case d.Token.MINUS_MINUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(p.BinaryOp.SubI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){var u,_;if(u=this.currentType.classReference)if(_=u.lookupOverload(h.OperatorKind.POSTFIX_DEC)){a=this.compileUnaryOverload(_,e.operand,i,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:c=this.options;a=r.createBinary(c.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(p.BinaryOp.SubI64,i,r.createI64(1));break;case 11:a=r.createBinary(p.BinaryOp.SubF32,i,r.createF32(1));break;case 12:a=r.createBinary(p.BinaryOp.SubF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;default:return assert(!1),r.createUnreachable()}if(!o)return this.currentType=g.Type.void,this.compileAssignmentWithValue(e.operand,a,!1);var m=this.compileAssignmentWithValue(e.operand,a,!1);this.currentType=o.type,n.freeTempLocal(o);var y=o.type.toNativeType();return r.createBlock(null,[m,r.createGetLocal(o.index,y)],y)},t.prototype.compileUnaryPrefixExpression=function(e,t){var r,n=this.module,i=!1;switch(e.operator){case d.Token.PLUS:if(r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.PLUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case d.Token.MINUS:if(e.operand.kind==_.NodeKind.LITERAL&&(e.operand.literalKind==_.LiteralKind.INTEGER||e.operand.literalKind==_.LiteralKind.FLOAT)){r=this.compileLiteralExpression(e.operand,t,!0),this.options.sourceMap&&this.addDebugLocation(r,e.range);break}if(r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.MINUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(p.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(p.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(p.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case d.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(p.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(p.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case d.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(p.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(p.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case d.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=g.Type.bool;break;case d.Token.TILDE:if(r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t.is(8)?g.Type.i64:t,0,0),this.currentType.is(256)){var a,s;if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(r=this.convertExpression(r,this.currentType,this.currentType.intType,1,0,e.operand),this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.XorI64:p.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case d.Token.TYPEOF:return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=g.Type.void):r},t.prototype.ensureSmallIntegerWrap=function(e,t){var r=this.module,n=this.currentFunction.flow;switch(t.kind){case 0:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(p.UnaryOp.ExtendI8ToI32,e):r.createBinary(p.BinaryOp.ShrI32,r.createBinary(p.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(p.UnaryOp.ExtendI16ToI32,e):r.createBinary(p.BinaryOp.ShrI32,r.createBinary(p.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.NeI32,e,r.createI32(0)))}return e},t.prototype.makeIsFalseish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return r.createUnary(p.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(p.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?p.UnaryOp.EqzI64:p.UnaryOp.EqzI32,e);case 11:return r.createBinary(p.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(p.BinaryOp.EqF64,e,r.createF64(0));default:return assert(!1),r.createI32(1)}},t.prototype.makeIsTrueish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return e;case 3:case 8:return r.createBinary(p.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(p.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(p.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(p.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocation=function(e){var t=this.program;assert(e.program==t);var r=this.module,n=this.options;if(t.hasGC&&e.type.isManaged(t)){var i=assert(t.gcAllocateInstance);return this.compileFunction(i)?(this.currentType=e.type,r.createCall(i.internalName,[n.isWasm64?r.createI64(e.currentMemoryOffset):r.createI32(e.currentMemoryOffset),r.createI32(c.ensureGCHook(this,e))],n.nativeSizeType)):r.createUnreachable()}return(i=t.memoryAllocateInstance)&&this.compileFunction(i)?(this.currentType=e.type,r.createCall(i.internalName,[n.isWasm64?r.createI64(e.currentMemoryOffset):r.createI32(e.currentMemoryOffset)],n.nativeSizeType)):r.createUnreachable()},t.prototype.makeFieldInitialization=function(e,t){var r,n;if(void 0===t&&(t=[]),assert(!this.currentFunction.flow.is(4096)),e.members){var i=this.module,s=this.options.nativeSizeType;try{for(var o=a(e.members.values()),c=o.next();!c.done;c=o.next()){var l=c.value;if(l.parent==e&&l.kind==h.ElementKind.FIELD){var p=l,d=p.type,_=d.toNativeType(),g=p.prototype.declaration;if(assert(!p.isAny(u.CommonFlags.CONST)),g.initializer)t.push(i.createStore(d.byteSize,i.createGetLocal(0,s),this.compileExpression(g.initializer,d,1,0),_,p.memoryOffset));else{var m=p.prototype.declaration.parameterIndex;t.push(i.createStore(d.byteSize,i.createGetLocal(0,s),m>=0?i.createGetLocal(1+m,_):d.toNativeZero(i),_,p.memoryOffset))}}}}catch(e){r={error:e}}finally{try{c&&!c.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}}return t},t.prototype.addDebugLocation=function(e,t){var r=this.currentFunction,n=t.source;n.debugInfoIndex<0&&(n.debugInfoIndex=this.module.addDebugInfoFile(n.normalizedPath)),t.debugInfoRef=e,r.debugLocations.push(t)},t}(l.DiagnosticEmitter);function I(e,t){if(E=t.range.source.simplePath,f=t.programLevelInternalName,e.hasDecorator(h.DecoratorFlags.EXTERNAL)){var r=e.program,n=assert(_.findDecorator(_.DecoratorKind.EXTERNAL,t.decorators)),i=n.arguments;if(i&&i.length){var a=i[0];a.kind==_.NodeKind.LITERAL&&a.literalKind==_.LiteralKind.STRING?(f=a.value,i.length>=2&&((a=i[1]).kind==_.NodeKind.LITERAL&&a.literalKind==_.LiteralKind.STRING?(E=f,f=a.value,i.length>2&&r.error(l.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(l.DiagnosticCode.String_literal_expected,a.range))):r.error(l.DiagnosticCode.String_literal_expected,a.range)}else r.error(l.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=T},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.Operation_not_supported=100]="Operation_not_supported",e[e.Operation_is_unsafe=101]="Operation_is_unsafe",e[e.User_defined_0=102]="User_defined_0",e[e.Conversion_from_type_0_to_1_requires_an_explicit_cast=200]="Conversion_from_type_0_to_1_requires_an_explicit_cast",e[e.Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit=201]="Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit",e[e.Type_0_cannot_be_changed_to_type_1=202]="Type_0_cannot_be_changed_to_type_1",e[e.Type_0_cannot_be_reinterpreted_as_type_1=203]="Type_0_cannot_be_reinterpreted_as_type_1",e[e.Basic_type_0_cannot_be_nullable=204]="Basic_type_0_cannot_be_nullable",e[e.Cannot_export_a_mutable_global=205]="Cannot_export_a_mutable_global",e[e.Compiling_constant_with_non_constant_initializer_as_mutable=206]="Compiling_constant_with_non_constant_initializer_as_mutable",e[e.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa=207]="Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa",e[e.Unmanaged_classes_cannot_implement_interfaces=208]="Unmanaged_classes_cannot_implement_interfaces",e[e.Invalid_regular_expression_flags=209]="Invalid_regular_expression_flags",e[e.Implementation_0_must_match_the_signature_1=210]="Implementation_0_must_match_the_signature_1",e[e.Class_0_is_sealed_and_cannot_be_extended=211]="Class_0_is_sealed_and_cannot_be_extended",e[e.Decorator_0_is_not_valid_here=212]="Decorator_0_is_not_valid_here",e[e.Duplicate_decorator=213]="Duplicate_decorator",e[e.An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf=214]="An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf",e[e.Optional_parameter_must_have_an_initializer=215]="Optional_parameter_must_have_an_initializer",e[e.Constructor_of_class_0_must_not_require_any_arguments=216]="Constructor_of_class_0_must_not_require_any_arguments",e[e.Function_0_cannot_be_inlined_into_itself=217]="Function_0_cannot_be_inlined_into_itself",e[e.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set=218]="Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set",e[e.Optional_properties_are_not_supported=219]="Optional_properties_are_not_supported",e[e.Unterminated_string_literal=1002]="Unterminated_string_literal",e[e.Identifier_expected=1003]="Identifier_expected",e[e._0_expected=1005]="_0_expected",e[e.A_file_cannot_have_a_reference_to_itself=1006]="A_file_cannot_have_a_reference_to_itself",e[e.Trailing_comma_not_allowed=1009]="Trailing_comma_not_allowed",e[e.Unexpected_token=1012]="Unexpected_token",e[e.A_rest_parameter_must_be_last_in_a_parameter_list=1014]="A_rest_parameter_must_be_last_in_a_parameter_list",e[e.Parameter_cannot_have_question_mark_and_initializer=1015]="Parameter_cannot_have_question_mark_and_initializer",e[e.A_required_parameter_cannot_follow_an_optional_parameter=1016]="A_required_parameter_cannot_follow_an_optional_parameter",e[e.Statements_are_not_allowed_in_ambient_contexts=1036]="Statements_are_not_allowed_in_ambient_contexts",e[e.Initializers_are_not_allowed_in_ambient_contexts=1039]="Initializers_are_not_allowed_in_ambient_contexts",e[e._0_modifier_cannot_be_used_here=1042]="_0_modifier_cannot_be_used_here",e[e.A_rest_parameter_cannot_be_optional=1047]="A_rest_parameter_cannot_be_optional",e[e.A_rest_parameter_cannot_have_an_initializer=1048]="A_rest_parameter_cannot_have_an_initializer",e[e.A_set_accessor_must_have_exactly_one_parameter=1049]="A_set_accessor_must_have_exactly_one_parameter",e[e.A_set_accessor_parameter_cannot_have_an_initializer=1052]="A_set_accessor_parameter_cannot_have_an_initializer",e[e.A_get_accessor_cannot_have_parameters=1054]="A_get_accessor_cannot_have_parameters",e[e.Enum_member_must_have_initializer=1061]="Enum_member_must_have_initializer",e[e.Type_parameters_cannot_appear_on_a_constructor_declaration=1092]="Type_parameters_cannot_appear_on_a_constructor_declaration",e[e.Type_annotation_cannot_appear_on_a_constructor_declaration=1093]="Type_annotation_cannot_appear_on_a_constructor_declaration",e[e.An_accessor_cannot_have_type_parameters=1094]="An_accessor_cannot_have_type_parameters",e[e.A_set_accessor_cannot_have_a_return_type_annotation=1095]="A_set_accessor_cannot_have_a_return_type_annotation",e[e.Type_parameter_list_cannot_be_empty=1098]="Type_parameter_list_cannot_be_empty",e[e.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement=1104]="A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement",e[e.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement=1105]="A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement",e[e.A_return_statement_can_only_be_used_within_a_function_body=1108]="A_return_statement_can_only_be_used_within_a_function_body",e[e.Expression_expected=1109]="Expression_expected",e[e.Type_expected=1110]="Type_expected",e[e.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement=1113]="A_default_clause_cannot_appear_more_than_once_in_a_switch_statement",e[e.Duplicate_label_0=1114]="Duplicate_label_0",e[e.Octal_literals_are_not_allowed_in_strict_mode=1121]="Octal_literals_are_not_allowed_in_strict_mode",e[e.Digit_expected=1124]="Digit_expected",e[e.Hexadecimal_digit_expected=1125]="Hexadecimal_digit_expected",e[e.Unexpected_end_of_text=1126]="Unexpected_end_of_text",e[e.Invalid_character=1127]="Invalid_character",e[e._case_or_default_expected=1130]="_case_or_default_expected",e[e._super_must_be_followed_by_an_argument_list_or_member_access=1034]="_super_must_be_followed_by_an_argument_list_or_member_access",e[e.A_declare_modifier_cannot_be_used_in_an_already_ambient_context=1038]="A_declare_modifier_cannot_be_used_in_an_already_ambient_context",e[e.Type_argument_expected=1140]="Type_argument_expected",e[e.String_literal_expected=1141]="String_literal_expected",e[e.Line_break_not_permitted_here=1142]="Line_break_not_permitted_here",e[e.Declaration_expected=1146]="Declaration_expected",e[e._const_declarations_must_be_initialized=1155]="_const_declarations_must_be_initialized",e[e.Unterminated_regular_expression_literal=1161]="Unterminated_regular_expression_literal",e[e.Interface_declaration_cannot_have_implements_clause=1176]="Interface_declaration_cannot_have_implements_clause",e[e.Binary_digit_expected=1177]="Binary_digit_expected",e[e.Octal_digit_expected=1178]="Octal_digit_expected",e[e.An_implementation_cannot_be_declared_in_ambient_contexts=1183]="An_implementation_cannot_be_declared_in_ambient_contexts",e[e.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive=1198]="An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive",e[e.Unterminated_Unicode_escape_sequence=1199]="Unterminated_Unicode_escape_sequence",e[e.Decorators_are_not_valid_here=1206]="Decorators_are_not_valid_here",e[e._abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration=1242]="_abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration",e[e.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract=1245]="Method_0_cannot_have_an_implementation_because_it_is_marked_abstract",e[e.A_definite_assignment_assertion_is_not_permitted_in_this_context=1255]="A_definite_assignment_assertion_is_not_permitted_in_this_context",e[e.A_class_may_only_extend_another_class=1311]="A_class_may_only_extend_another_class",e[e.A_parameter_property_cannot_be_declared_using_a_rest_parameter=1317]="A_parameter_property_cannot_be_declared_using_a_rest_parameter",e[e.Duplicate_identifier_0=2300]="Duplicate_identifier_0",e[e.Cannot_find_name_0=2304]="Cannot_find_name_0",e[e.Module_0_has_no_exported_member_1=2305]="Module_0_has_no_exported_member_1",e[e.Generic_type_0_requires_1_type_argument_s=2314]="Generic_type_0_requires_1_type_argument_s",e[e.Type_0_is_not_generic=2315]="Type_0_is_not_generic",e[e.Type_0_is_not_assignable_to_type_1=2322]="Type_0_is_not_assignable_to_type_1",e[e.Index_signature_is_missing_in_type_0=2329]="Index_signature_is_missing_in_type_0",e[e._this_cannot_be_referenced_in_current_location=2332]="_this_cannot_be_referenced_in_current_location",e[e._super_can_only_be_referenced_in_a_derived_class=2335]="_super_can_only_be_referenced_in_a_derived_class",e[e.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors=2337]="Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors",e[e.Property_0_does_not_exist_on_type_1=2339]="Property_0_does_not_exist_on_type_1",e[e.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures=2349]="Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures",e[e.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature=2351]="Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature",e[e.A_function_whose_declared_type_is_not_void_must_return_a_value=2355]="A_function_whose_declared_type_is_not_void_must_return_a_value",e[e.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access=2357]="The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access",e[e.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access=2364]="The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access",e[e.Operator_0_cannot_be_applied_to_types_1_and_2=2365]="Operator_0_cannot_be_applied_to_types_1_and_2",e[e.A_super_call_must_be_the_first_statement_in_the_constructor=2376]="A_super_call_must_be_the_first_statement_in_the_constructor",e[e.Constructors_for_derived_classes_must_contain_a_super_call=2377]="Constructors_for_derived_classes_must_contain_a_super_call",e[e._get_and_set_accessor_must_have_the_same_type=2380]="_get_and_set_accessor_must_have_the_same_type",e[e.Constructor_implementation_is_missing=2390]="Constructor_implementation_is_missing",e[e.Function_implementation_is_missing_or_not_immediately_following_the_declaration=2391]="Function_implementation_is_missing_or_not_immediately_following_the_declaration",e[e.Multiple_constructor_implementations_are_not_allowed=2392]="Multiple_constructor_implementations_are_not_allowed",e[e.Duplicate_function_implementation=2393]="Duplicate_function_implementation",e[e.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local=2395]="Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local",e[e.Type_0_has_no_property_1=2460]="Type_0_has_no_property_1",e[e.The_0_operator_cannot_be_applied_to_type_1=2469]="The_0_operator_cannot_be_applied_to_type_1",e[e.In_const_enum_declarations_member_initializer_must_be_constant_expression=2474]="In_const_enum_declarations_member_initializer_must_be_constant_expression",e[e.Export_declaration_conflicts_with_exported_declaration_of_0=2484]="Export_declaration_conflicts_with_exported_declaration_of_0",e[e.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property=2540]="Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property",e[e.The_target_of_an_assignment_must_be_a_variable_or_a_property_access=2541]="The_target_of_an_assignment_must_be_a_variable_or_a_property_access",e[e.Index_signature_in_type_0_only_permits_reading=2542]="Index_signature_in_type_0_only_permits_reading",e[e.Expected_0_arguments_but_got_1=2554]="Expected_0_arguments_but_got_1",e[e.Expected_at_least_0_arguments_but_got_1=2555]="Expected_at_least_0_arguments_but_got_1",e[e.Expected_0_type_arguments_but_got_1=2558]="Expected_0_type_arguments_but_got_1",e[e.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums=2651]="A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums",e[e.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration=2673]="Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration",e[e.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration=2674]="Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration",e[e.Namespace_0_has_no_exported_member_1=2694]="Namespace_0_has_no_exported_member_1",e[e.Required_type_parameters_may_not_follow_optional_type_parameters=2706]="Required_type_parameters_may_not_follow_optional_type_parameters",e[e.File_0_not_found=6054]="File_0_not_found",e[e.Numeric_separators_are_not_allowed_here=6188]="Numeric_separators_are_not_allowed_here",e[e.Multiple_consecutive_numeric_separators_are_not_permitted=6189]="Multiple_consecutive_numeric_separators_are_not_permitted",e[e._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class=17009]="_super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class",e[e._super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class=17011]="_super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class"}(t.DiagnosticCode||(t.DiagnosticCode={})),t.diagnosticCodeToString=function(e){switch(e){case 100:return"Operation not supported.";case 101:return"Operation is unsafe.";case 102:return"User-defined: {0}";case 200:return"Conversion from type '{0}' to '{1}' requires an explicit cast.";case 201:return"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.";case 202:return"Type '{0}' cannot be changed to type '{1}'.";case 203:return"Type '{0}' cannot be reinterpreted as type '{1}'.";case 204:return"Basic type '{0}' cannot be nullable.";case 205:return"Cannot export a mutable global.";case 206:return"Compiling constant with non-constant initializer as mutable.";case 207:return"Unmanaged classes cannot extend managed classes and vice-versa.";case 208:return"Unmanaged classes cannot implement interfaces.";case 209:return"Invalid regular expression flags.";case 210:return"Implementation '{0}' must match the signature '{1}'.";case 211:return"Class '{0}' is sealed and cannot be extended.";case 212:return"Decorator '{0}' is not valid here.";case 213:return"Duplicate decorator.";case 214:return"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.";case 215:return"Optional parameter must have an initializer.";case 216:return"Constructor of class '{0}' must not require any arguments.";case 217:return"Function '{0}' cannot be inlined into itself.";case 218:return"Cannot access method '{0}' without calling it as it requires 'this' to be set.";case 219:return"Optional properties are not supported.";case 1002:return"Unterminated string literal.";case 1003:return"Identifier expected.";case 1005:return"'{0}' expected.";case 1006:return"A file cannot have a reference to itself.";case 1009:return"Trailing comma not allowed.";case 1012:return"Unexpected token.";case 1014:return"A rest parameter must be last in a parameter list.";case 1015:return"Parameter cannot have question mark and initializer.";case 1016:return"A required parameter cannot follow an optional parameter.";case 1036:return"Statements are not allowed in ambient contexts.";case 1039:return"Initializers are not allowed in ambient contexts.";case 1042:return"'{0}' modifier cannot be used here.";case 1047:return"A rest parameter cannot be optional.";case 1048:return"A rest parameter cannot have an initializer.";case 1049:return"A 'set' accessor must have exactly one parameter.";case 1052:return"A 'set' accessor parameter cannot have an initializer.";case 1054:return"A 'get' accessor cannot have parameters.";case 1061:return"Enum member must have initializer.";case 1092:return"Type parameters cannot appear on a constructor declaration.";case 1093:return"Type annotation cannot appear on a constructor declaration.";case 1094:return"An accessor cannot have type parameters.";case 1095:return"A 'set' accessor cannot have a return type annotation.";case 1098:return"Type parameter list cannot be empty.";case 1104:return"A 'continue' statement can only be used within an enclosing iteration statement.";case 1105:return"A 'break' statement can only be used within an enclosing iteration or switch statement.";case 1108:return"A 'return' statement can only be used within a function body.";case 1109:return"Expression expected.";case 1110:return"Type expected.";case 1113:return"A 'default' clause cannot appear more than once in a 'switch' statement.";case 1114:return"Duplicate label '{0}'.";case 1121:return"Octal literals are not allowed in strict mode.";case 1124:return"Digit expected.";case 1125:return"Hexadecimal digit expected.";case 1126:return"Unexpected end of text.";case 1127:return"Invalid character.";case 1130:return"'case' or 'default' expected.";case 1034:return"'super' must be followed by an argument list or member access.";case 1038:return"A 'declare' modifier cannot be used in an already ambient context.";case 1140:return"Type argument expected.";case 1141:return"String literal expected.";case 1142:return"Line break not permitted here.";case 1146:return"Declaration expected.";case 1155:return"'const' declarations must be initialized.";case 1161:return"Unterminated regular expression literal.";case 1176:return"Interface declaration cannot have 'implements' clause.";case 1177:return"Binary digit expected.";case 1178:return"Octal digit expected.";case 1183:return"An implementation cannot be declared in ambient contexts.";case 1198:return"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.";case 1199:return"Unterminated Unicode escape sequence.";case 1206:return"Decorators are not valid here.";case 1242:return"'abstract' modifier can only appear on a class, method, or property declaration.";case 1245:return"Method '{0}' cannot have an implementation because it is marked abstract.";case 1255:return"A definite assignment assertion '!' is not permitted in this context.";case 1311:return"A class may only extend another class.";case 1317:return"A parameter property cannot be declared using a rest parameter.";case 2300:return"Duplicate identifier '{0}'.";case 2304:return"Cannot find name '{0}'.";case 2305:return"Module '{0}' has no exported member '{1}'.";case 2314:return"Generic type '{0}' requires {1} type argument(s).";case 2315:return"Type '{0}' is not generic.";case 2322:return"Type '{0}' is not assignable to type '{1}'.";case 2329:return"Index signature is missing in type '{0}'.";case 2332:return"'this' cannot be referenced in current location.";case 2335:return"'super' can only be referenced in a derived class.";case 2337:return"Super calls are not permitted outside constructors or in nested functions inside constructors.";case 2339:return"Property '{0}' does not exist on type '{1}'.";case 2349:return"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.";case 2351:return"Cannot use 'new' with an expression whose type lacks a construct signature.";case 2355:return"A function whose declared type is not 'void' must return a value.";case 2357:return"The operand of an increment or decrement operator must be a variable or a property access.";case 2364:return"The left-hand side of an assignment expression must be a variable or a property access.";case 2365:return"Operator '{0}' cannot be applied to types '{1}' and '{2}'.";case 2376:return"A 'super' call must be the first statement in the constructor.";case 2377:return"Constructors for derived classes must contain a 'super' call.";case 2380:return"'get' and 'set' accessor must have the same type.";case 2390:return"Constructor implementation is missing.";case 2391:return"Function implementation is missing or not immediately following the declaration.";case 2392:return"Multiple constructor implementations are not allowed.";case 2393:return"Duplicate function implementation.";case 2395:return"Individual declarations in merged declaration '{0}' must be all exported or all local.";case 2460:return"Type '{0}' has no property '{1}'.";case 2469:return"The '{0}' operator cannot be applied to type '{1}'.";case 2474:return"In 'const' enum declarations member initializer must be constant expression.";case 2484:return"Export declaration conflicts with exported declaration of '{0}'.";case 2540:return"Cannot assign to '{0}' because it is a constant or a read-only property.";case 2541:return"The target of an assignment must be a variable or a property access.";case 2542:return"Index signature in type '{0}' only permits reading.";case 2554:return"Expected {0} arguments, but got {1}.";case 2555:return"Expected at least {0} arguments, but got {1}.";case 2558:return"Expected {0} type arguments, but got {1}.";case 2651:return"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.";case 2673:return"Constructor of class '{0}' is private and only accessible within the class declaration.";case 2674:return"Constructor of class '{0}' is protected and only accessible within the class declaration.";case 2694:return"Namespace '{0}' has no exported member '{1}'.";case 2706:return"Required type parameters may not follow optional type parameters.";case 6054:return"File '{0}' not found.";case 6188:return"Numeric separators are not allowed here.";case 6189:return"Multiple consecutive numeric separators are not permitted.";case 17009:return"'super' must be called before accessing 'this' in the constructor of a derived class.";case 17011:return"'super' must be called before accessing a property of 'super' in the constructor of a derived class.";default:return""}}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o,c=r(1),l=r(4),p=r(3),u=r(7),h=r(0),d=r(2),_=r(6);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(o=t.ReportMode||(t.ReportMode={}));var g=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.program=t,r}return i(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=o.REPORT),e.kind==p.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==p.NodeKind.TYPE);var i=e,a=i.name.text,s=a,_=i.range.source.internalPath+h.PATH_DELIMITER+a,g=this.program.elementsLookup,m=void 0;if((m=g.get(_))||(m=g.get(s)))switch(m.kind){case l.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==o.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,e.range,m.internalName),null):u.Type.i32;case l.ElementKind.CLASS_PROTOTYPE:var y=this.resolveClassInclTypeArguments(m,i.typeArguments,d.makeMap(t),e);return y?e.isNullable?y.type.asNullable():y.type:null}var E=this.program.typeAliases.get(a);if(E)return this.resolveType(E.type,t,r);var f=i.typeArguments,T=null;if(f){var I=f.length;T=new Array(I);for(var v=0;v",s+="<"+A+">")}else if(t){var N=t.get(s);if(N)return N}}var S=this.program.typesLookup,O=void 0;if((O=S.get(_))||(O=S.get(s)))return!O.is(256)&&e.isNullable&&r==o.REPORT&&this.error(c.DiagnosticCode.Basic_type_0_cannot_be_nullable,e.range,O.toString()),O;if("NATIVE"==a){if(!T||1!=T.length)return r==o.REPORT&&this.error(c.DiagnosticCode.Expected_0_type_arguments_but_got_1,i.range,"1",(f?f.length:1).toString(10)),null;switch(T[0].kind){case 0:case 1:case 2:return u.Type.i32;case 4:if(!this.program.options.isWasm64)return u.Type.i32;case 3:return u.Type.i64;case 5:case 6:case 7:case 10:return u.Type.u32;case 9:if(!this.program.options.isWasm64)return u.Type.u32;case 8:return u.Type.u64;case 11:return u.Type.f32;case 12:return u.Type.f64;case 13:return u.Type.void;default:assert(!1)}}return r==o.REPORT&&this.error(c.DiagnosticCode.Cannot_find_name_0,i.name.range,s),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=o.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,s=a.length,c=new Array(s),l=new Array(s),h=0,d=!1,_=0;_s)return this.error(c.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?p.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var w=new l.Function(e,P,U,C||E,r);return _||e.instances.set(a,_=new Map),_.set(s,w),this.program.instancesLookup.set(P,w),w},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=o.REPORT),assert(e.is(h.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=u.typesToString(t),s=new l.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+h.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return s.flags=e.flags,s.operatorKind=e.operatorKind,s.classTypeArguments=t,s.instances=e.instances,s},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=o.REPORT);var a=null;if(e.is(h.CommonFlags.GENERIC)){if(e.classTypeArguments&&e.applyClassTypeArguments(r),!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==o.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveFunction(e,a,r,i)},t.prototype.resolveClass=function(e,t,r,n){var i,_,g,m,y,E;void 0===r&&(r=d.makeMap()),void 0===n&&(n=o.REPORT);var f=t?u.typesToString(t):"",T=e.instances.get(f);if(T)return T;var I=e.declaration;if(t){var v=I.typeParameters,C=v.length,A=t.length;assert(A==C);for(var N=0;N",b+="<"+f+">"),(T=new l.Class(e,L,b,t,S)).contextualTypeArguments=r,e.instances.set(f,T),this.program.instancesLookup.set(b,T);var k=0;if(S){if(S.members){T.members||(T.members=new Map);try{for(var R=a(S.members.values()),x=R.next();!x.done;x=R.next()){var F=x.value;T.members.set(F.simpleName,F)}}catch(e){i={error:e}}finally{try{x&&!x.done&&(_=R.return)&&_.call(R)}finally{if(i)throw i.error}}}k=S.currentMemoryOffset}var D=e.constructorPrototype;if(D){var B=this.resolveFunctionPartially(D,t,n);if(!B)return null;T.constructorInstance=this.resolveFunction(B,null,d.makeMap(),n)}if(e.instanceMembers)try{for(var U=a(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case l.ElementKind.FIELD_PROTOTYPE:var M=w.declaration;if(T.members){if(T.members.has(w.simpleName)){this.error(c.DiagnosticCode.Duplicate_identifier_0,M.name.range,w.simpleName);break}}else T.members=new Map;var G=null;if(M.type)G=this.resolveType(M.type,T.contextualTypeArguments,n);else{if(null!==S&&null!==S.members){var K=S.members.get(w.simpleName);K&&!K.is(h.CommonFlags.PRIVATE)&&(assert(K.kind==l.ElementKind.FIELD),G=K.type)}G||n==o.REPORT&&this.error(c.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var z=new l.Field(w,b+h.INSTANCE_DELIMITER+w.simpleName,G,M,T);switch(G.byteSize){case 1:break;case 2:1&k&&++k;break;case 4:3&k&&(k=1+(3|k));break;case 8:7&k&&(k=1+(7|k));break;default:assert(!1)}z.memoryOffset=k,k+=G.byteSize,T.members.set(w.simpleName,z);break;case l.ElementKind.FUNCTION_PROTOTYPE:T.members||(T.members=new Map);var V=this.resolveFunctionPartially(w,t,n);if(!V)return null;V.internalName=b+h.INSTANCE_DELIMITER+V.simpleName,T.members.set(w.simpleName,V);break;case l.ElementKind.PROPERTY:T.members||(T.members=new Map);var H=assert(w.getterPrototype),X=w.setterPrototype,W=new l.Property(this.program,w.simpleName,b+h.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(H,t,n);if(!Y)return null;if(Y.internalName=b+h.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=b+h.INSTANCE_DELIMITER+Q.simpleName,W.setterPrototype=Q}T.members.set(w.simpleName,W);break;default:assert(!1)}}}catch(e){g={error:e}}finally{try{P&&!P.done&&(m=U.return)&&m.call(U)}finally{if(g)throw g.error}}T.currentMemoryOffset=k;try{for(var q=a(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=s(j.value,2),J=Z[0],$=Z[1];assert(J!=l.OperatorKind.INVALID);var ee=void 0;if($.is(h.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,d.makeMap(),n)}else ee=this.resolveFunction($,null,d.makeMap(),n);if(ee){var re=T.overloads;re||(T.overloads=re=new Map),re.set(J,ee)}}}catch(e){y={error:e}}finally{try{j&&!j.done&&(E=q.return)&&E.call(q)}finally{if(y)throw y.error}}return T},t.prototype.resolveClassInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=o.REPORT);var a=null;if(e.is(h.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==o.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(c.DiagnosticEmitter);t.Resolver=g},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5),i=function(){function e(){this.text=[],this.functionId=0}return e.decompile=function(t){var r=new e;return r.decompile(t),r.finish()},e.prototype.decompile=function(e){throw new Error("not implemented")},e.prototype.decompileFunction=function(e){var t=n.getFunctionName(e)||"$"+this.functionId.toString(10),r=n.getFunctionBody(e);this.push("function "),this.push(t),this.push("(");for(var i=0,s=n.getFunctionParamCount(e);i0&&this.push(", "),this.push("$"),this.push(i.toString(10)),this.push(": "),this.push(a(n.getFunctionParamType(e,i)));this.push("): "),this.push(a(n.getFunctionResultType(e))),this.push(" "),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("{\n"),this.decompileExpression(r),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("\n}\n"),++this.functionId},e.prototype.decompileExpression=function(e){var t,r,i,s,o=n.getExpressionId(e),c=n.getExpressionType(e);switch(o){case n.ExpressionId.Block:for(null!=(r=n.getBlockName(e))&&(this.push(r),this.push(": ")),this.push("{\n"),s=n.getBlockChildCount(e),i=0;i("),this.push(n.getLoadOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getLoadPtr(e)),void this.push(")");case n.ExpressionId.Store:return this.push("store<"),this.push(a(c)),this.push(">("),this.push(n.getStoreOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getStorePtr(e)),this.push(", "),this.decompileExpression(n.getStoreValue(e)),void this.push(")");case n.ExpressionId.Const:switch(c){case 1:return void this.push(n.getConstValueI32(e).toString(10));case 2:return void this.push(i64_to_string(i64_new(n.getConstValueI64Low(e),n.getConstValueI64High(e))));case 3:return void this.push(n.getConstValueF32(e).toString(10));case 4:return void this.push(n.getConstValueF64(e).toString(10))}break;case n.ExpressionId.Unary:switch(n.getUnaryOp(e)){case n.UnaryOp.ClzI32:return this.push("clz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI32:return this.push("ctz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI32:return this.push("popcnt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NegF32:case n.UnaryOp.NegF64:return this.push("-"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.AbsF32:return this.push("abs("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF32:return this.push("ceil("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF32:return this.push("floor("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF32:return this.push("trunc("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF32:return this.push("nearest("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF32:return this.push("sqrt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.EqzI32:case n.UnaryOp.EqzI64:return this.push("!"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ClzI64:return this.push("clz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI64:return this.push("ctz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI64:return this.push("popcnt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.AbsF64:return this.push("abs("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF64:return this.push("ceil("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF64:return this.push("floor("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF64:return this.push("trunc("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF64:return this.push("nearest("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF64:return this.push("sqrt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ExtendI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ExtendU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.WrapI64:case n.UnaryOp.TruncF32ToI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToI64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretF32:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretF64:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ConvertI32ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI32ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.PromoteF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.DemoteF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretI32:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretI64:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")")}break;case n.ExpressionId.Binary:switch(n.getBinaryOp(e)){case n.BinaryOp.AddI32:case n.BinaryOp.AddI64:case n.BinaryOp.AddF32:case n.BinaryOp.AddF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" + "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.SubI32:case n.BinaryOp.SubI64:case n.BinaryOp.SubF32:case n.BinaryOp.SubF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" - "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.MulI32:case n.BinaryOp.MulI64:case n.BinaryOp.MulF32:case n.BinaryOp.MulF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" * "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivI32:case n.BinaryOp.DivI64:case n.BinaryOp.DivF32:case n.BinaryOp.DivF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU32:return this.push("("),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RemI32:case n.BinaryOp.RemI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU32:return this.push("("),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.AndI32:case n.BinaryOp.AndI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" & "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.OrI32:case n.BinaryOp.OrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" | "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.XorI32:case n.BinaryOp.XorI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" ^ "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShlI32:case n.BinaryOp.ShlI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" << "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrU32:case n.BinaryOp.ShrU64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >>> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrI32:case n.BinaryOp.ShrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI32:return this.push("rotl("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI32:return this.push("rotr("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.EqI32:case n.BinaryOp.EqI64:case n.BinaryOp.EqF32:case n.BinaryOp.EqF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" == "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.NeI32:case n.BinaryOp.NeI64:case n.BinaryOp.NeF32:case n.BinaryOp.NeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" != "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtI32:case n.BinaryOp.LtI64:case n.BinaryOp.LtF32:case n.BinaryOp.LtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeI32:case n.BinaryOp.LeI64:case n.BinaryOp.LeF32:case n.BinaryOp.LeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtI32:case n.BinaryOp.GtI64:case n.BinaryOp.GtF32:case n.BinaryOp.GtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeI32:case n.BinaryOp.GeI64:case n.BinaryOp.GeF32:case n.BinaryOp.GeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI64:return this.push("rotl("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI64:return this.push("rotr("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.LtU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.CopysignF32:return this.push("copysign("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF32:return this.push("min("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF32:return this.push("max("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.CopysignF64:return this.push("copysign("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF64:return this.push("min("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF64:return this.push("max("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")")}return;case n.ExpressionId.Select:return this.push("select<"),this.push(a(c)),this.push(">("),this.decompileExpression(n.getSelectThen(e)),this.push(", "),this.decompileExpression(n.getSelectElse(e)),this.push(", "),this.decompileExpression(n.getSelectCondition(e)),void this.push(")");case n.ExpressionId.Drop:return this.decompileExpression(n.getDropValue(e)),void this.push(";\n");case n.ExpressionId.Return:return void((t=n.getReturnValue(e))?(this.push("return "),this.decompileExpression(t),this.push(";\n")):this.push("return;\n"));case n.ExpressionId.Host:switch(n.getHostOp(e)){case n.HostOp.CurrentMemory:return void this.push("memory.size()");case n.HostOp.GrowMemory:return this.push("memory.grow("),this.decompileExpression(n.getHostOperand(e,0)),void this.push(")")}break;case n.ExpressionId.Nop:return void this.push(";\n");case n.ExpressionId.Unreachable:return void this.push("unreachable()");case n.ExpressionId.AtomicCmpxchg:case n.ExpressionId.AtomicRMW:case n.ExpressionId.AtomicWait:case n.ExpressionId.AtomicWake:}throw new Error("not implemented")},e.prototype.push=function(e){this.text.push(e)},e.prototype.finish=function(){var e=this.text.join("");return this.text=[],e},e}();function a(e){switch(e){case 0:return"void";case 1:return"i32";case 2:return"i64";case 3:return"f32";case 4:return"f64";case 5:throw new Error("unreachable type");case-1:throw new Error("auto type");default:throw new Error("unexpected type")}}t.Decompiler=i},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o=r(0),c=r(4),l=r(2),p=function(){function e(e,t){void 0===t&&(t=!1),this.todo=[],this.seen=new Set,this.program=e,this.includePrivate}return e.prototype.walk=function(){var e,t;try{for(var r=a(this.program.moduleLevelExports.values()),n=r.next();!n.done;n=r.next()){var i=n.value;this.visitElement(i.element)}}catch(t){e={error:t}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(e)throw e.error}}for(var s=this.todo;0"),null}for(;e.skip(o.Token.BAR);){if(!e.skip(o.Token.NULL))return r||this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;_=!0}n=p.Node.createType(h,d,_,e.range(a,e.pos))}for(;e.skip(o.Token.OPENBRACKET);){var m=e.tokenPos;if(!e.skip(o.Token.CLOSEBRACKET))return r||this.error(c.DiagnosticCode._0_expected,e.range(),"]"),null;var y=e.range(m,e.pos);_=!1;if(e.skip(o.Token.BAR)){if(!e.skip(o.Token.NULL))return r||this.error(c.DiagnosticCode._0_expected,e.range(),"null"),null;_=!0}if(n=p.Node.createType(p.Node.createIdentifierExpression("Array",y),[n],_,e.range(a,e.pos)),_)break}return n},t.prototype.tryParseSignature=function(e){var t,r=e.mark(),n=e.tokenPos,i=null,a=null,s=!1;if(e.skip(o.Token.CLOSEPAREN))s=!0,e.discard(r),i=[];else{s=!1;do{var l=p.ParameterKind.DEFAULT;if(e.skip(o.Token.DOT_DOT_DOT)&&(s=!0,e.discard(r),l=p.ParameterKind.REST),e.skip(o.Token.THIS)){if(!e.skip(o.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;s=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return s?this.error(c.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=s,null;var h=p.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(o.Token.QUESTION)&&(s=!0,e.discard(r),l==p.ParameterKind.REST?this.error(c.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):l=p.ParameterKind.OPTIONAL),e.skip(o.Token.COLON)){s=!0,e.discard(r);var d=this.parseType(e);if(!d)return this.tryParseSignatureIsSignature=s,null;var _=new p.ParameterNode;_.parameterKind=l,_.name=h,_.type=d,i?i.push(_):i=[_]}else s&&this.error(c.DiagnosticCode.Type_expected,e.range())}}while(e.skip(o.Token.COMMA));if(!e.skip(o.Token.CLOSEPAREN))return s?this.error(c.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=s,null}return e.skip(o.Token.EQUALS_GREATERTHAN)?(s=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,p.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=s,null)):(s?this.error(c.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=s,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=p.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(o.Token.DOT);){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=p.Node.createPropertyAccessExpression(n,p.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(o.Token.OPENPAREN))return p.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return p.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(c.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseVariable=function(e,t,r,n){var i=new Array;do{var a=this.parseVariableDeclaration(e,t,r);if(!a)return null;i.push(a)}while(e.skip(o.Token.COMMA));var s=p.Node.createVariableStatement(i,r,t,e.range(n,e.pos));return e.skip(o.Token.SEMICOLON),s},t.prototype.parseVariableDeclaration=function(e,t,r){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var n=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),i=t;e.skip(o.Token.EXCLAMATION)&&(i|=a.CommonFlags.DEFINITE_ASSIGNMENT);var s=null;e.skip(o.Token.COLON)&&(s=this.parseType(e));var l=null;if(e.skip(o.Token.EQUALS)){if(i&a.CommonFlags.AMBIENT&&this.error(c.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(l=this.parseExpression(e,2)))return null}else i&a.CommonFlags.CONST?i&a.CommonFlags.AMBIENT||this.error(c.DiagnosticCode._const_declarations_must_be_initialized,n.range):s||this.error(c.DiagnosticCode.Type_expected,e.range(e.pos));var u=o.Range.join(n.range,e.range());return i&a.CommonFlags.DEFINITE_ASSIGNMENT&&l&&this.error(c.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),p.Node.createVariableDeclaration(n,s,l,r,i,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=o.Token.IDENTIFIER)return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=o.Token.OPENBRACE)return this.error(c.DiagnosticCode._0_expected,e.range(),"{"),null;for(var s=new Array;!e.skip(o.Token.CLOSEBRACE);){var l=this.parseEnumValue(e,a.CommonFlags.NONE);if(!l)return null;if(s.push(l),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.CLOSEBRACE))break;return this.error(c.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=p.Node.createEnumDeclaration(i,s,r,t,e.range(n,e.pos));return e.skip(o.Token.SEMICOLON),u},t.prototype.parseEnumValue=function(e,t){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(o.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:p.Node.createEnumValueDeclaration(r,n,t,o.Range.join(r.range,e.range()))},t.prototype.parseReturn=function(e){var t=null;if(e.peek(!0)!=o.Token.SEMICOLON&&e.nextToken!=o.Token.CLOSEBRACE&&!e.nextTokenOnNewLine&&!(t=this.parseExpression(e)))return null;var r=p.Node.createReturnStatement(t,e.range());return e.skip(o.Token.SEMICOLON),r},t.prototype.parseTypeParameters=function(e){for(var t=new Array,r=!1;!e.skip(o.Token.GREATERTHAN);){var n=this.parseTypeParameter(e);if(!n)return null;if(null!==n.defaultType?r=!0:r&&(this.error(c.DiagnosticCode.Required_type_parameters_may_not_follow_optional_type_parameters,n.range),n.defaultType=null),t.push(n),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.GREATERTHAN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(c.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==o.Token.IDENTIFIER){var t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(o.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,i.range),null;r=i}var n=null;if(e.skip(o.Token.EQUALS)){var i;if(!(i=this.parseType(e)))return null;if(i.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return p.Node.createTypeParameter(t,r,n,o.Range.join(t.range,e.range()))}return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseParameters=function(e,t){void 0===t&&(t=!1);var r=new Array,n=null,i=!1,a=!1,s=null;if(this.parseParametersThis=null,e.skip(o.Token.THIS)){if(!e.skip(o.Token.COLON))return this.error(c.DiagnosticCode._0_expected,e.range(),":"),null;if(!(s=this.parseType(e)))return null;if(s.kind==p.NodeKind.TYPE?this.parseParametersThis=s:this.error(c.DiagnosticCode.Operation_not_supported,s.range),!e.skip(o.Token.COMMA))return e.skip(o.Token.CLOSEPAREN)?r:(this.error(c.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(o.Token.CLOSEPAREN);){var l=this.parseParameter(e,t);if(!l)return null;switch(n&&!a&&(this.error(c.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),l.parameterKind){default:i&&this.error(c.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,l.name.range);break;case p.ParameterKind.OPTIONAL:i=!0;break;case p.ParameterKind.REST:n=l}if(r.push(l),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.CLOSEPAREN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,i=null,s=a.CommonFlags.NONE;if(t&&(e.skip(o.Token.PUBLIC)?(i=e.range(),s|=a.CommonFlags.PUBLIC):e.skip(o.Token.PROTECTED)?(i=e.range(),s|=a.CommonFlags.PROTECTED):e.skip(o.Token.PRIVATE)&&(i=e.range(),s|=a.CommonFlags.PRIVATE),e.peek()==o.Token.READONLY)){var l=e.mark();e.next(),e.peek()!=o.Token.COLON?(e.discard(l),i||(i=e.range()),s|=a.CommonFlags.READONLY):e.reset(l)}if(e.skip(o.Token.DOT_DOT_DOT)&&(s?this.error(c.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):i=e.range(),r=!0),e.skipIdentifier()){r||(i=e.range());var u=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(o.Token.QUESTION))&&r&&this.error(c.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(o.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=p.Node.createOmittedType(e.range(e.pos));var d=null;if(e.skip(o.Token.EQUALS)&&(r&&this.error(c.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(c.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(d=this.parseExpression(e,2))))return null;var _=p.Node.createParameter(u,h,d,r?p.ParameterKind.REST:n?p.ParameterKind.OPTIONAL:p.ParameterKind.DEFAULT,o.Range.join(i,e.range()));return _.flags|=s,_}return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),s=-1,l=null;if(e.skip(o.Token.LESSTHAN)){if(s=e.tokenPos,!(l=this.parseTypeParameters(e)))return null;t|=a.CommonFlags.GENERIC}if(!e.skip(o.Token.OPENPAREN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"("),null;s<0&&(s=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,d=0!=(t&a.CommonFlags.SET);d&&(1!=u.length&&this.error(c.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,i.range),u.length&&u[0].initializer&&this.error(c.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,i.range)),t&a.CommonFlags.GET&&u.length&&this.error(c.DiagnosticCode.A_get_accessor_cannot_have_parameters,i.range);var _=null;if(e.skip(o.Token.COLON)&&!(_=this.parseType(e,!0,d)))return null;_||(_=p.Node.createOmittedType(e.range(e.pos)),d||this.error(c.DiagnosticCode.Type_expected,_.range));var g=p.Node.createSignature(u,_,h,!1,e.range(s,e.pos)),m=null;if(e.skip(o.Token.OPENBRACE)){if(t&a.CommonFlags.AMBIENT&&this.error(c.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(m=this.parseBlockStatement(e,!1)))return null}else t&a.CommonFlags.AMBIENT||this.error(c.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var y=p.Node.createFunctionDeclaration(i,l,g,m,r,t,e.range(n,e.pos));return e.skip(o.Token.SEMICOLON),y},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==o.Token.FUNCTION){if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(o.Token.OPENPAREN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==o.Token.OPENPAREN),t=p.Node.createEmptyIdentifierExpression(e.range(e.tokenPos));var i=e.pos,a=this.parseParameters(e);return a?this.parseFunctionExpressionCommon(e,t,a,n,r,i):null},t.prototype.parseFunctionExpressionCommon=function(e,t,r,n,i,s){void 0===i&&(i=-1),void 0===s&&(s=-1),i<0&&(i=t.range.start),s<0&&(s=i);var l=null;if(e.skip(o.Token.COLON)){if(!(l=this.parseType(e)))return null}else l=p.Node.createOmittedType(e.range(e.pos)),this.error(c.DiagnosticCode.Type_expected,l.range);if(n&&!e.skip(o.Token.EQUALS_GREATERTHAN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=p.Node.createSignature(r,l,null,!1,e.range(s,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(o.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var d=p.Node.createFunctionDeclaration(t,null,h,u,null,n?a.CommonFlags.ARROW:a.CommonFlags.NONE,e.range(i,e.pos));return p.Node.createFunctionExpression(d)},t.prototype.parseClassOrInterface=function(e,t,r,n){var i=e.token==o.Token.INTERFACE;if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var s,l=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(o.Token.LESSTHAN)){if(!(s=this.parseTypeParameters(e)))return null;t|=a.CommonFlags.GENERIC}else s=[];var u=null;if(e.skip(o.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var d=null;if(e.skip(o.Token.IMPLEMENTS)){i&&this.error(c.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var _=this.parseType(e);if(!_)return null;i||(d||(d=[]),d.push(_))}while(e.skip(o.Token.COMMA))}if(!e.skip(o.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(),"{"),null;var g,m=new Array;if(i?(assert(!d),g=p.Node.createInterfaceDeclaration(l,s,u,m,r,t,e.range(n,e.pos))):g=p.Node.createClassDeclaration(l,s,u,d,m,r,t,e.range(n,e.pos)),!e.skip(o.Token.CLOSEBRACE))do{var y=this.parseClassMember(e,g);if(!y)return null;y.parent=g,m.push(y)}while(!e.skip(o.Token.CLOSEBRACE));return g},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(o.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,i=p.Node.createClassDeclaration(t,[],null,null,n,null,a.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(o.Token.CLOSEBRACE))do{var s=this.parseClassMember(e,i);if(!s)return null;s.parent=i,n.push(s)}while(!e.skip(o.Token.CLOSEBRACE));return p.Node.createClassExpression(i)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==p.NodeKind.INTERFACEDECLARATION,i=new Array;if(e.skip(o.Token.AT)){do{var s=this.parseDecorator(e);if(!s)break;i.push(s)}while(e.skip(o.Token.AT));n&&this.error(c.DiagnosticCode.Decorators_are_not_valid_here,o.Range.join(i[0].range,i[i.length-1].range))}var l=t.flags&a.CommonFlags.AMBIENT;n&&(l|=a.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(o.Token.PUBLIC)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),l|=a.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(o.Token.PRIVATE)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),l|=a.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(o.Token.PROTECTED)&&(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),l|=a.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var d=0,_=0,g=0,m=0;e.skip(o.Token.STATIC)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),l|=a.CommonFlags.STATIC,d=e.tokenPos,_=e.pos):(l|=a.CommonFlags.INSTANCE,e.skip(o.Token.ABSTRACT)&&(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),l|=a.CommonFlags.ABSTRACT,g=e.tokenPos,m=e.pos),t.flags&a.CommonFlags.GENERIC&&(l|=a.CommonFlags.GENERIC_CONTEXT));var y=0,E=0;e.skip(o.Token.READONLY)&&(l|=a.CommonFlags.READONLY,y=e.tokenPos,E=e.pos);var f,T=e.mark(),I=!1,v=!1,C=!1,A=0,N=0;if(n||(e.skip(o.Token.GET)?e.peek(!0,o.IdentifierHandling.PREFER)!=o.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(l|=a.CommonFlags.GET,v=!0,A=e.tokenPos,N=e.pos,l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,E),"readonly")):e.skip(o.Token.SET)?e.peek(!0,o.IdentifierHandling.PREFER)!=o.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(T):(l|=a.CommonFlags.SET,C=!0,A=e.tokenPos,N=e.pos,l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,E),"readonly")):e.skip(o.Token.CONSTRUCTOR)&&(I=!0,(l|=a.CommonFlags.CONSTRUCTOR)&a.CommonFlags.STATIC&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),l&a.CommonFlags.ABSTRACT&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,m),"abstract"),l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,E),"readonly"))),I)f=p.Node.createConstructorExpression(e.range());else{if(!v&&!C&&e.skip(o.Token.OPENBRACKET)){l&a.CommonFlags.PUBLIC?this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):l&a.CommonFlags.PROTECTED?this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):l&a.CommonFlags.PRIVATE&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),l&a.CommonFlags.STATIC&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(d,_),"static"),l&a.CommonFlags.ABSTRACT&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,m),"abstract"),l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,E),"readonly");var S=this.parseIndexSignatureDeclaration(e,i);return S?(e.skip(o.Token.SEMICOLON),S):null}if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;f=p.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var O=null;if(e.skip(o.Token.LESSTHAN)){var L=e.tokenPos;if(!(O=this.parseTypeParameters(e)))return null;I?this.error(c.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(L,e.pos)):v||C?this.error(c.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(L,e.pos)):l|=a.CommonFlags.GENERIC}if(e.skip(o.Token.OPENPAREN)){var b=e.tokenPos,k=this.parseParameters(e,I);if(!k)return null;var R=this.parseParametersThis;if(I)for(var x=0,F=k.length;x"),null):null;case o.Token.IDENTIFIER:return p.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case o.Token.THIS:return p.Node.createThisExpression(e.range(r,e.pos));case o.Token.CONSTRUCTOR:return p.Node.createConstructorExpression(e.range(r,e.pos));case o.Token.SUPER:return e.peek()!=o.Token.DOT&&e.nextToken!=o.Token.OPENPAREN&&this.error(c.DiagnosticCode._super_must_be_followed_by_an_argument_list_or_member_access,e.range()),p.Node.createSuperExpression(e.range(r,e.pos));case o.Token.STRINGLITERAL:return p.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case o.Token.INTEGERLITERAL:return p.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case o.Token.FLOATLITERAL:return p.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case o.Token.SLASH:var f=e.readRegexpPattern();return e.skip(o.Token.SLASH)?p.Node.createRegexpLiteralExpression(f,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(c.DiagnosticCode._0_expected,e.range(),"/"),null);case o.Token.FUNCTION:return this.parseFunctionExpression(e);case o.Token.CLASS:return this.parseClassExpression(e);default:return t==o.Token.ENDOFFILE?this.error(c.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(c.DiagnosticCode.Expression_expected,e.range()),null}},t.prototype.tryParseTypeArgumentsBeforeArguments=function(e){var t=e.mark();if(!e.skip(o.Token.LESSTHAN))return null;var r=new Array;do{if(e.peek()===o.Token.GREATERTHAN)break;var n=this.parseType(e,!0,!0);if(!n)return e.reset(t),null;r.push(n)}while(e.skip(o.Token.COMMA));return e.skip(o.Token.GREATERTHAN)&&e.skip(o.Token.OPENPAREN)?r:(e.reset(t),null)},t.prototype.parseArguments=function(e){for(var t=new Array;!e.skip(o.Token.CLOSEPAREN);){var r=this.parseExpression(e,2);if(!r)return null;if(t.push(r),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.CLOSEPAREN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),")"),null}}return t},t.prototype.parseExpression=function(e,t){void 0===t&&(t=1),assert(0!=t);var r=this.parseExpressionStart(e);if(!r)return null;for(var n,i,a=(r=this.maybeParseCallExpression(e,r)).range.start,s=null;(i=h(n=e.peek()))>=t;){switch(e.next(),n){case o.Token.AS:var l=this.parseType(e);if(!l)return null;r=p.Node.createAssertionExpression(p.AssertionKind.AS,r,l,e.range(a,e.pos));break;case o.Token.EXCLAMATION:r=p.Node.createAssertionExpression(p.AssertionKind.NONNULL,r,null,e.range(a,e.pos));break;case o.Token.INSTANCEOF:var u=this.parseType(e);if(!u)return null;r=p.Node.createInstanceOfExpression(r,u,e.range(a,e.pos));break;case o.Token.OPENBRACKET:if(!(s=this.parseExpression(e)))return null;if(!e.skip(o.Token.CLOSEBRACKET))return this.error(c.DiagnosticCode._0_expected,e.range(),"]"),null;r=p.Node.createElementAccessExpression(r,s,e.range(a,e.pos));break;case o.Token.PLUS_PLUS:case o.Token.MINUS_MINUS:r.kind!=p.NodeKind.IDENTIFIER&&r.kind!=p.NodeKind.ELEMENTACCESS&&r.kind!=p.NodeKind.PROPERTYACCESS&&this.error(c.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=p.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case o.Token.QUESTION:var _=this.parseExpression(e);if(!_)return null;if(!e.skip(o.Token.COLON))return this.error(c.DiagnosticCode._0_expected,e.range(),":"),null;var g=this.parseExpression(e,t>1?2:1);if(!g)return null;r=p.Node.createTernaryExpression(r,_,g,e.range(a,e.pos));break;case o.Token.COMMA:var m=[r];do{if(!(r=this.parseExpression(e,2)))return null;m.push(r)}while(e.skip(o.Token.COMMA));r=p.Node.createCommaExpression(m,e.range(a,e.pos));break;default:if(n==o.Token.DOT){if(e.skipIdentifier())s=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(s=this.parseExpression(e,d(n)?i:i+1)))return null;if(s.kind==p.NodeKind.IDENTIFIER)r=p.Node.createPropertyAccessExpression(r,s,e.range(a,e.pos));else{if(s.kind!=p.NodeKind.CALL)return this.error(c.DiagnosticCode.Identifier_expected,s.range),null;if(!(r=this.joinPropertyCall(e,a,r,s)))return null}}else{if(!(s=this.parseExpression(e,d(n)?i:i+1)))return null;r=p.Node.createBinaryExpression(n,r,s,e.range(a,e.pos))}}r=this.maybeParseCallExpression(e,r)}return r},t.prototype.joinPropertyCall=function(e,t,r,n){var i=n.expression;switch(i.kind){case p.NodeKind.IDENTIFIER:n.expression=p.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case p.NodeKind.CALL:var a=this.joinPropertyCall(e,t,r,i);if(!a)return null;n.expression=a,n.range=e.range(t,e.pos);break;default:return this.error(c.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(p.nodeIsCallable(t.kind))for(var r=null;e.skip(o.Token.OPENPAREN)||p.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=p.Node.createCallExpression(t,r,n,e.range(t.range.start,e.pos))}return t},t.prototype.skipStatement=function(e){for(e.peek(!0),e.nextTokenOnNewLine&&e.next();;){var t=e.peek(!0);if(t==o.Token.ENDOFFILE||t==o.Token.SEMICOLON){e.next();break}if(e.nextTokenOnNewLine)break;switch(e.next()){case o.Token.IDENTIFIER:e.readIdentifier();break;case o.Token.STRINGLITERAL:e.readString();break;case o.Token.INTEGERLITERAL:e.readInteger();break;case o.Token.FLOATLITERAL:e.readFloat()}}},t.prototype.skipBlock=function(e){var t=1,r=!0;do{switch(e.next()){case o.Token.ENDOFFILE:this.error(c.DiagnosticCode._0_expected,e.range(),"}"),r=!1;break;case o.Token.OPENBRACE:++t;break;case o.Token.CLOSEBRACE:--t||(r=!1);break;case o.Token.IDENTIFIER:e.readIdentifier();break;case o.Token.STRINGLITERAL:e.readString();break;case o.Token.INTEGERLITERAL:e.readInteger();break;case o.Token.FLOATLITERAL:e.readFloat()}}while(r)},t}(c.DiagnosticEmitter);function h(e){switch(e){case o.Token.COMMA:return 1;case o.Token.EQUALS:case o.Token.PLUS_EQUALS:case o.Token.MINUS_EQUALS:case o.Token.ASTERISK_ASTERISK_EQUALS:case o.Token.ASTERISK_EQUALS:case o.Token.SLASH_EQUALS:case o.Token.PERCENT_EQUALS:case o.Token.LESSTHAN_LESSTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.AMPERSAND_EQUALS:case o.Token.CARET_EQUALS:case o.Token.BAR_EQUALS:return 4;case o.Token.QUESTION:return 5;case o.Token.BAR_BAR:return 6;case o.Token.AMPERSAND_AMPERSAND:return 7;case o.Token.BAR:return 8;case o.Token.CARET:return 9;case o.Token.AMPERSAND:return 10;case o.Token.EQUALS_EQUALS:case o.Token.EXCLAMATION_EQUALS:case o.Token.EQUALS_EQUALS_EQUALS:case o.Token.EXCLAMATION_EQUALS_EQUALS:return 11;case o.Token.AS:case o.Token.IN:case o.Token.INSTANCEOF:case o.Token.LESSTHAN:case o.Token.GREATERTHAN:case o.Token.LESSTHAN_EQUALS:case o.Token.GREATERTHAN_EQUALS:return 12;case o.Token.LESSTHAN_LESSTHAN:case o.Token.GREATERTHAN_GREATERTHAN:case o.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:return 13;case o.Token.PLUS:case o.Token.MINUS:return 14;case o.Token.ASTERISK:case o.Token.SLASH:case o.Token.PERCENT:return 15;case o.Token.ASTERISK_ASTERISK:return 16;case o.Token.PLUS_PLUS:case o.Token.MINUS_MINUS:return 18;case o.Token.DOT:case o.Token.NEW:case o.Token.OPENBRACKET:case o.Token.EXCLAMATION:return 20}return 0}function d(e){switch(e){case o.Token.EQUALS:case o.Token.PLUS_EQUALS:case o.Token.MINUS_EQUALS:case o.Token.ASTERISK_ASTERISK_EQUALS:case o.Token.ASTERISK_EQUALS:case o.Token.SLASH_EQUALS:case o.Token.PERCENT_EQUALS:case o.Token.LESSTHAN_LESSTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.AMPERSAND_EQUALS:case o.Token.CARET_EQUALS:case o.Token.BAR_EQUALS:case o.Token.QUESTION:case o.Token.ASTERISK_ASTERISK:return!0;default:return!1}}t.Parser=u,function(e){e[e.NONE=0]="NONE",e[e.COMMA=1]="COMMA",e[e.SPREAD=2]="SPREAD",e[e.YIELD=3]="YIELD",e[e.ASSIGNMENT=4]="ASSIGNMENT",e[e.CONDITIONAL=5]="CONDITIONAL",e[e.LOGICAL_OR=6]="LOGICAL_OR",e[e.LOGICAL_AND=7]="LOGICAL_AND",e[e.BITWISE_OR=8]="BITWISE_OR",e[e.BITWISE_XOR=9]="BITWISE_XOR",e[e.BITWISE_AND=10]="BITWISE_AND",e[e.EQUALITY=11]="EQUALITY",e[e.RELATIONAL=12]="RELATIONAL",e[e.SHIFT=13]="SHIFT",e[e.ADDITIVE=14]="ADDITIVE",e[e.MULTIPLICATIVE=15]="MULTIPLICATIVE",e[e.EXPONENTIATED=16]="EXPONENTIATED",e[e.UNARY_PREFIX=17]="UNARY_PREFIX",e[e.UNARY_POSTFIX=18]="UNARY_POSTFIX",e[e.CALL=19]="CALL",e[e.MEMBERACCESS=20]="MEMBERACCESS",e[e.GROUPING=21]="GROUPING"}(t.Precedence||(t.Precedence={}))},function(e,t,r){r(16),e.exports=r(29)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),r(17),r(19),r(20),r(21);var n=r(5);n.Module.prototype.toText=function(){return binaryen.wrapModule(this.ref).emitStackIR()},n.Module.prototype.toAsmjs=function(){return binaryen.wrapModule(this.ref).emitAsmjs()}},function(e,t,r){(function(e){const t=e.Binaryen||r(18);for(var n in e.binaryen=t,t)(n.startsWith("_Binaryen")||n.startsWith("_Relooper"))&&(e[n]=t[n]);e.__memory_allocate=t._malloc,e.__memory_free=t._free,e.__memory_copy=t._memmove,e.__store=function(e,r){t.HEAPU8[e]=r},e.__load=function(e){return t.HEAPU8[e]}}).call(this,r(8))},function(t,r){t.exports=e},function(e,t,r){(function(e){var t="undefined"!=typeof window&&window||void 0!==e&&e||self;t.ASC_TARGET=0;var r=new Float64Array(1),n=new Uint32Array(r.buffer);function i(){Error.captureStackTrace?Error.captureStackTrace(this,i):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}function a(e){this.message=e||"assertion failed",Error.captureStackTrace?Error.captureStackTrace(this,a):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}Object.defineProperties(t.i8=function(e){return e<<24>>24},{MIN_VALUE:{value:-128,writable:!1},MAX_VALUE:{value:127,writable:!1}}),Object.defineProperties(t.i16=function(e){return e<<16>>16},{MIN_VALUE:{value:-32768,writable:!1},MAX_VALUE:{value:32767,writable:!1}}),Object.defineProperties(t.i32=t.isize=function(e){return 0|e},{MIN_VALUE:{value:-2147483648,writable:!1},MAX_VALUE:{value:2147483647,writable:!1}}),Object.defineProperties(t.u8=function(e){return 255&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:255,writable:!1}}),Object.defineProperties(t.u16=function(e){return 65535&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:65535,writable:!1}}),Object.defineProperties(t.u32=t.usize=function(e){return e>>>0},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:4294967295,writable:!1}}),Object.defineProperties(t.bool=function(e){return!!e},{MIN_VALUE:{value:!1,writable:!1},MAX_VALUE:{value:!0,writable:!1}}),Object.defineProperties(t.f32=function(e){return Math.fround(e)},{EPSILON:{value:Math.fround(1.1920929e-7),writable:!1},MIN_VALUE:{value:Math.fround(1.4012985e-45),writable:!1},MAX_VALUE:{value:Math.fround(3.4028235e38),writable:!1},MIN_NORMAL_VALUE:{value:Math.fround(1.17549435e-38),writable:!1},MIN_SAFE_INTEGER:{value:-16777215,writable:!1},MAX_SAFE_INTEGER:{value:16777215,writable:!1}}),Object.defineProperties(t.f64=function(e){return+e},{EPSILON:{value:2.220446049250313e-16,writable:!1},MIN_VALUE:{value:5e-324,writable:!1},MAX_VALUE:{value:1.7976931348623157e308,writable:!1},MIN_NORMAL_VALUE:{value:2.2250738585072014e-308,writable:!1},MIN_SAFE_INTEGER:{value:-9007199254740991,writable:!1},MAX_SAFE_INTEGER:{value:9007199254740991,writable:!1}}),t.clz=Math.clz32,t.ctz=function(e){var t=Math.clz32(e&-e);return e?31-t:t},t.popcnt=function(e){return 16843009*((e=(858993459&(e-=e>>>1&1431655765))+(e>>>2&858993459))+(e>>>4)&252645135)>>>24},t.rotl=function(e,t){return e<<(t&=31)|e>>>32-t},t.rotr=function(e,t){return e>>>(t&=31)|e<<32-t},t.abs=Math.abs,t.max=Math.max,t.min=Math.min,t.ceil=Math.ceil,t.floor=Math.floor,t.nearest=function(e){return.5===Math.abs(e-Math.trunc(e))?2*Math.round(.5*e):Math.round(e)},t.select=function(e,t,r){return r?e:t},t.sqrt=Math.sqrt,t.trunc=Math.trunc,t.copysign=function(e,t){return Math.abs(e)*Math.sign(t)},t.bswap=function(e){var t=e>>8&16711935,r=(16711935&e)<<8;return(t=(e=t|r)>>16&65535)|(r=(65535&e)<<16)},t.bswap16=function(e){return e<<8&65280|e>>8&255|4294901760&e},i.prototype=Object.create(Error.prototype),i.prototype.name="UnreachableError",i.prototype.message="unreachable",t.unreachable=function(){throw new i},a.prototype=Object.create(Error.prototype),a.prototype.name="AssertionError",t.assert=function(e,t){if(e)return e;throw new a(t)},t.changetype=function(e){return e},t.parseI32=function(e,t){return 0|parseInt(e,void 0)},String.fromCharCodes=function(e){return String.fromCharCode.apply(String,e)},String.fromCodePoints=function(e){return String.fromCodePoint.apply(String,e)},t.isInteger=Number.isInteger,t.isFloat=function(e){return"number"==typeof e},t.isReference=function(e){return"object"==typeof e||"string"==typeof e},t.isString=function(e){return"string"==typeof e||e instanceof String},t.isArray=Array.isArray,t.isDefined=function(e){return void 0!==e},t.isConstant=function(e){return!1},t.unchecked=function(e){return e},t.fmod=function(e,t){return e%t},t.fmodf=function(e,t){return Math.fround(e%t)},t.JSMath=Math,t.JSMath.signbit=function(e){return r[0]=e,Boolean(n[1]>>>31&e==e)},t.memory=(()=>{var e=new Uint8Array(0),r=0;return{allocate:t.__memory_allocate||function(t){if(!(t>>>=0))return 0;if(r+t>e.length){var n=e;(e=new Uint8Array(Math.max(65536,e.length+t,2*e.length))).set(n)}var i=r;return 7&(r+=t)&&(r=1+(7|r)),i},fill:t.__memory_fill||function(t,r,n){e.fill(r,t,t+n)},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)},reset:t.__memory_reset||function(){e=new Uint8Array(0),r=0}}})(),t.store=t.__store||function(e,t,r){HEAP[(0|e)+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[(0|e)+(0|t)]}}).call(this,r(8))},function(e,t,r){(function(e){const t=new Float64Array(1),r=new Float32Array(t.buffer),n=new Int32Array(t.buffer);e.f32_as_i32=function(e){return r[0]=e,n[0]},e.i32_as_f32=function(e){return n[0]=e,r[0]},e.f64_as_i64=function(e){return t[0]=e,i64_new(n[0],n[1])},e.i64_as_f64=function(e){return n[0]=i64_low(e),n[1]=i64_high(e),t[0]}}).call(this,r(8))},function(e,t,r){(function(e){const t=e.Long||r(22);e.i64_zero=t.ZERO,e.i64_one=t.ONE,e.i64_new=function(e,r){return t.fromBits(e,r)},e.i64_low=function(e){return e.low},e.i64_high=function(e){return e.high},e.i64_add=function(e,t){return e.add(t)},e.i64_sub=function(e,t){return e.sub(t)},e.i64_mul=function(e,t){return e.mul(t)},e.i64_div=function(e,t){return e.div(t)},e.i64_div_u=function(e,t){return e.toUnsigned().div(t.toUnsigned()).toSigned()},e.i64_rem=function(e,t){return e.mod(t)},e.i64_rem_u=function(e,t){return e.toUnsigned().mod(t.toUnsigned()).toSigned()},e.i64_and=function(e,t){return e.and(t)},e.i64_or=function(e,t){return e.or(t)},e.i64_xor=function(e,t){return e.xor(t)},e.i64_shl=function(e,t){return e.shl(t)},e.i64_shr=function(e,t){return e.shr(t)},e.i64_shr_u=function(e,t){return e.shru(t)},e.i64_not=function(e){return e.not()},e.i64_eq=function(e,t){return e.eq(t)},e.i64_ne=function(e,t){return e.ne(t)},e.i64_align=function(e,r){assert(r&&0==(r&r-1));var n=t.fromInt(r-1);return e.add(n).and(n.not())},e.i64_is_i8=function(e){return 0===e.high&&e.low>=0&&e.low<=i8.MAX_VALUE||-1===e.high&&e.low>=i8.MIN_VALUE&&e.low<0},e.i64_is_i16=function(e){return 0===e.high&&e.low>=0&&e.low<=i16.MAX_VALUE||-1===e.high&&e.low>=i16.MIN_VALUE&&e.low<0},e.i64_is_i32=function(e){return 0===e.high&&e.low>=0||-1===e.high&&e.low<0},e.i64_is_u8=function(e){return 0===e.high&&e.low>=0&&e.low<=u8.MAX_VALUE},e.i64_is_u16=function(e){return 0===e.high&&e.low>=0&&e.low<=u16.MAX_VALUE},e.i64_is_u32=function(e){return 0===e.high},e.i64_is_bool=function(e){return 0===e.high&&(0===e.low||1===e.low)};const n=t.fromNumber(f32.MIN_SAFE_INTEGER),i=t.fromNumber(f32.MAX_SAFE_INTEGER);e.i64_is_f32=function(e){return e.gte(n)&&e.lte(i)};const a=t.fromNumber(f64.MIN_SAFE_INTEGER),s=t.fromNumber(f64.MAX_SAFE_INTEGER);e.i64_is_f64=function(e){return e.gte(a)&&e.lte(s)},e.i64_to_f32=function(t){return e.Math.fround(t.toNumber())},e.i64_to_f64=function(e){return e.toNumber()},e.i64_to_string=function(e,t){return(t?e.toUnsigned():e).toString(10)}}).call(this,r(8))},function(e,t){e.exports=n;var r=null;try{r=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function n(e,t,r){this.low=0|e,this.high=0|t,this.unsigned=!!r}function i(e){return!0===(e&&e.__isLong__)}n.prototype.__isLong__,Object.defineProperty(n.prototype,"__isLong__",{value:!0}),n.isLong=i;var a={},s={};function o(e,t){var r,n,i;return t?(i=0<=(e>>>=0)&&e<256)&&(n=s[e])?n:(r=l(e,(0|e)<0?-1:0,!0),i&&(s[e]=r),r):(i=-128<=(e|=0)&&e<128)&&(n=a[e])?n:(r=l(e,e<0?-1:0,!1),i&&(a[e]=r),r)}function c(e,t){if(isNaN(e))return t?E:y;if(t){if(e<0)return E;if(e>=_)return C}else{if(e<=-g)return A;if(e+1>=g)return v}return e<0?c(-e,t).neg():l(e%d|0,e/d|0,t)}function l(e,t,r){return new n(e,t,r)}n.fromInt=o,n.fromNumber=c,n.fromBits=l;var p=Math.pow;function u(e,t,r){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return y;if("number"==typeof t?(r=t,t=!1):t=!!t,(r=r||10)<2||360)throw Error("interior hyphen");if(0===n)return u(e.substring(1),t,r).neg();for(var i=c(p(r,8)),a=y,s=0;s>>0:this.low},N.toNumber=function(){return this.unsigned?(this.high>>>0)*d+(this.low>>>0):this.high*d+(this.low>>>0)},N.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((a=o).isZero())return l+s;for(;l.length<6;)l="0"+l;s=""+l+s}},N.getHighBits=function(){return this.high},N.getHighBitsUnsigned=function(){return this.high>>>0},N.getLowBits=function(){return this.low},N.getLowBitsUnsigned=function(){return this.low>>>0},N.getNumBitsAbs=function(){if(this.isNegative())return this.eq(A)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<=0},N.isOdd=function(){return 1==(1&this.low)},N.isEven=function(){return 0==(1&this.low)},N.equals=function(e){return i(e)||(e=h(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},N.eq=N.equals,N.notEquals=function(e){return!this.eq(e)},N.neq=N.notEquals,N.ne=N.notEquals,N.lessThan=function(e){return this.comp(e)<0},N.lt=N.lessThan,N.lessThanOrEqual=function(e){return this.comp(e)<=0},N.lte=N.lessThanOrEqual,N.le=N.lessThanOrEqual,N.greaterThan=function(e){return this.comp(e)>0},N.gt=N.greaterThan,N.greaterThanOrEqual=function(e){return this.comp(e)>=0},N.gte=N.greaterThanOrEqual,N.ge=N.greaterThanOrEqual,N.compare=function(e){if(i(e)||(e=h(e)),this.eq(e))return 0;var t=this.isNegative(),r=e.isNegative();return t&&!r?-1:!t&&r?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},N.comp=N.compare,N.negate=function(){return!this.unsigned&&this.eq(A)?A:this.not().add(f)},N.neg=N.negate,N.add=function(e){i(e)||(e=h(e));var t=this.high>>>16,r=65535&this.high,n=this.low>>>16,a=65535&this.low,s=e.high>>>16,o=65535&e.high,c=e.low>>>16,p=0,u=0,d=0,_=0;return d+=(_+=a+(65535&e.low))>>>16,u+=(d+=n+c)>>>16,p+=(u+=r+o)>>>16,p+=t+s,l((d&=65535)<<16|(_&=65535),(p&=65535)<<16|(u&=65535),this.unsigned)},N.subtract=function(e){return i(e)||(e=h(e)),this.add(e.neg())},N.sub=N.subtract,N.multiply=function(e){if(this.isZero())return y;if(i(e)||(e=h(e)),r)return l(r.mul(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned);if(e.isZero())return y;if(this.eq(A))return e.isOdd()?A:y;if(e.eq(A))return this.isOdd()?A:y;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(m)&&e.lt(m))return c(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,n=65535&this.high,a=this.low>>>16,s=65535&this.low,o=e.high>>>16,p=65535&e.high,u=e.low>>>16,d=65535&e.low,_=0,g=0,E=0,f=0;return E+=(f+=s*d)>>>16,g+=(E+=a*d)>>>16,E&=65535,g+=(E+=s*u)>>>16,_+=(g+=n*d)>>>16,g&=65535,_+=(g+=a*u)>>>16,g&=65535,_+=(g+=s*p)>>>16,_+=t*d+n*u+a*p+s*o,l((E&=65535)<<16|(f&=65535),(_&=65535)<<16|(g&=65535),this.unsigned)},N.mul=N.multiply,N.divide=function(e){if(i(e)||(e=h(e)),e.isZero())throw Error("division by zero");var t,n,a;if(r)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?l((this.unsigned?r.div_u:r.div_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?E:y;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return E;if(e.gt(this.shru(1)))return T;a=E}else{if(this.eq(A))return e.eq(f)||e.eq(I)?A:e.eq(A)?f:(t=this.shr(1).div(e).shl(1)).eq(y)?e.isNegative()?f:I:(n=this.sub(e.mul(t)),a=t.add(n.div(e)));if(e.eq(A))return this.unsigned?E:y;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();a=y}for(n=this;n.gte(e);){t=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var s=Math.ceil(Math.log(t)/Math.LN2),o=s<=48?1:p(2,s-48),u=c(t),d=u.mul(e);d.isNegative()||d.gt(n);)d=(u=c(t-=o,this.unsigned)).mul(e);u.isZero()&&(u=f),a=a.add(u),n=n.sub(d)}return a},N.div=N.divide,N.modulo=function(e){return i(e)||(e=h(e)),r?l((this.unsigned?r.rem_u:r.rem_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},N.mod=N.modulo,N.rem=N.modulo,N.not=function(){return l(~this.low,~this.high,this.unsigned)},N.and=function(e){return i(e)||(e=h(e)),l(this.low&e.low,this.high&e.high,this.unsigned)},N.or=function(e){return i(e)||(e=h(e)),l(this.low|e.low,this.high|e.high,this.unsigned)},N.xor=function(e){return i(e)||(e=h(e)),l(this.low^e.low,this.high^e.high,this.unsigned)},N.shiftLeft=function(e){return i(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?l(this.low<>>32-e,this.unsigned):l(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):l(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},N.shr=N.shiftRight,N.shiftRightUnsigned=function(e){if(i(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?l(this.low>>>e|t<<32-e,t>>>e,this.unsigned):l(32===e?t:t>>>e-32,0,this.unsigned)},N.shru=N.shiftRightUnsigned,N.shr_u=N.shiftRightUnsigned,N.toSigned=function(){return this.unsigned?l(this.low,this.high,!1):this},N.toUnsigned=function(){return this.unsigned?this:l(this.low,this.high,!0)},N.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},N.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},N.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},n.fromBytes=function(e,t,r){return r?n.fromBytesLE(e,t):n.fromBytesBE(e,t)},n.fromBytesLE=function(e,t){return new n(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},n.fromBytesBE=function(e,t){return new n(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},function(e,t,r){"use strict";var n=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i=r(1),a=r(3),s=r(7),o=r(5),c=r(4),l=r(11),p=r(0);function u(e,t,r,n,p,u){var m,y,E,f,T=e.module;switch(t.internalName){case"isInteger":var I=d(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(4)&&!I.is(256)?T.createI32(1):T.createI32(0):T.createUnreachable();case"isFloat":I=d(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(8)?T.createI32(1):T.createI32(0):T.createUnreachable();case"isSigned":I=d(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(1)?T.createI32(1):T.createI32(0):T.createUnreachable();case"isReference":I=d(e,r,n,u);return e.currentType=s.Type.bool,I?(e.currentType=s.Type.bool,I.is(256)?T.createI32(1):T.createI32(0)):T.createUnreachable();case"isString":I=d(e,r,n,u);if(e.currentType=s.Type.bool,!I)return T.createUnreachable();if(B=I.classReference){var v=e.program.stringInstance;if(v&&B.isAssignableTo(v))return T.createI32(1)}return T.createI32(0);case"isArray":I=d(e,r,n,u);return e.currentType=s.Type.bool,I?null!==(B=I.classReference)&&null!==B.lookupOverload(c.OperatorKind.INDEXED_GET)?T.createI32(1):T.createI32(0):T.createUnreachable();case"isDefined":if(e.currentType=s.Type.bool,r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),1!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();var C=e.resolver.resolveExpression(n[0],e.currentFunction,s.Type.void,l.ReportMode.SWALLOW);return T.createI32(C?1:0);case"isConstant":if(e.currentType=s.Type.bool,r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),1!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();var A=e.compileExpressionRetainType(n[0],s.Type.i32,0);return e.currentType=s.Type.bool,T.createI32(o.getExpressionId(A)==o.ExpressionId.Const?1:0);case"isManaged":if(!e.program.hasGC)return e.currentType=s.Type.bool,T.createI32(0);I=d(e,r,n,u);return e.currentType=s.Type.bool,I?null===(B=I.classReference)||B.hasDecorator(c.DecoratorFlags.UNMANAGED)?T.createI32(0):T.createI32(1):T.createUnreachable();case"clz":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:f=T.createUnary(o.UnaryOp.ClzI32,m);break;case 10:case 2:case 7:f=T.createUnary(o.UnaryOp.ClzI32,m);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable();break}case 4:f=T.createUnary(e.options.isWasm64?o.UnaryOp.ClzI64:o.UnaryOp.ClzI32,m);break;case 3:case 8:f=T.createUnary(o.UnaryOp.ClzI64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"ctz":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],0,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:f=T.createUnary(o.UnaryOp.CtzI32,m);break;case 10:case 2:case 7:f=T.createUnary(o.UnaryOp.CtzI32,m);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable();break}case 4:f=T.createUnary(e.options.isWasm64?o.UnaryOp.CtzI64:o.UnaryOp.CtzI32,m);break;case 3:case 8:f=T.createUnary(o.UnaryOp.CtzI64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"popcnt":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:f=T.createUnary(o.UnaryOp.PopcntI32,m);break;case 10:case 2:case 7:f=T.createUnary(o.UnaryOp.PopcntI32,m);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable();break}case 4:f=T.createUnary(e.options.isWasm64?o.UnaryOp.PopcntI64:o.UnaryOp.PopcntI32,m);break;case 3:case 8:f=T.createUnary(o.UnaryOp.PopcntI64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"rotl":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(y=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:f=e.ensureSmallIntegerWrap(T.createBinary(o.BinaryOp.RotlI32,m,y),e.currentType);case 2:case 7:f=T.createBinary(o.BinaryOp.RotlI32,m,y);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable();break}case 4:f=T.createBinary(e.options.isWasm64?o.BinaryOp.RotlI64:o.BinaryOp.RotlI32,m,y);break;case 3:case 8:f=T.createBinary(o.BinaryOp.RotlI64,m,y);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"rotr":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(y=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:f=e.ensureSmallIntegerWrap(T.createBinary(o.BinaryOp.RotrI32,m,y),e.currentType);break;case 2:case 7:f=T.createBinary(o.BinaryOp.RotrI32,m,y);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable();break}case 4:f=T.createBinary(e.options.isWasm64?o.BinaryOp.RotrI64:o.BinaryOp.RotrI32,m,y);break;case 3:case 8:f=T.createBinary(o.BinaryOp.RotrI64,m,y);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"abs":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.f64,0,1);switch(e.currentType.kind){case 0:case 1:case 2:var N=(b=e.currentFunction).getTempLocal(s.Type.i32,!1),S=b.getAndFreeTempLocal(s.Type.i32,!1).index,O=N.index;f=T.createBinary(o.BinaryOp.XorI32,T.createBinary(o.BinaryOp.AddI32,T.createTeeLocal(S,T.createBinary(o.BinaryOp.ShrI32,T.createTeeLocal(O,m),T.createI32(31))),T.createGetLocal(O,1)),T.createGetLocal(S,1)),b.freeTempLocal(N);break;case 4:var L=e.options,b=e.currentFunction,k=L.isWasm64;N=b.getTempLocal(L.usizeType,!1),S=b.getAndFreeTempLocal(L.usizeType,!1).index,O=N.index;f=T.createBinary(k?o.BinaryOp.XorI64:o.BinaryOp.XorI32,T.createBinary(k?o.BinaryOp.AddI64:o.BinaryOp.AddI32,T.createTeeLocal(S,T.createBinary(k?o.BinaryOp.ShrI64:o.BinaryOp.ShrI32,T.createTeeLocal(O,m),k?T.createI64(63):T.createI32(31))),T.createGetLocal(O,L.nativeSizeType)),T.createGetLocal(S,L.nativeSizeType)),b.freeTempLocal(N);break;case 3:N=(b=e.currentFunction).getTempLocal(s.Type.i64,!1),S=b.getAndFreeTempLocal(s.Type.i64,!1).index,O=N.index;f=T.createBinary(o.BinaryOp.XorI64,T.createBinary(o.BinaryOp.AddI64,T.createTeeLocal(S,T.createBinary(o.BinaryOp.ShrI64,T.createTeeLocal(O,m),T.createI64(63))),T.createGetLocal(O,2)),T.createGetLocal(S,2)),b.freeTempLocal(N);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable();break}case 5:case 6:case 7:case 8:case 10:f=m;break;case 11:f=T.createUnary(o.UnaryOp.AbsF32,m);break;case 12:f=T.createUnary(o.UnaryOp.AbsF64,m);break;case 13:f=T.createUnreachable();break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"max":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.f64,0,1);switch(y=e.compileExpression(n[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:var R=e.currentFunction.flow,x=e.currentFunction.getTempLocal(e.currentType,!R.canOverflow(m,e.currentType));N=e.currentFunction.getAndFreeTempLocal(e.currentType,!R.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(x),f=T.createSelect(T.createTeeLocal(x.index,m),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.GtI32,T.createGetLocal(x.index,1),T.createGetLocal(N.index,1)));break;case 5:case 6:case 7:case 10:R=e.currentFunction.flow,x=e.currentFunction.getTempLocal(e.currentType,!R.canOverflow(m,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!R.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(x),f=T.createSelect(T.createTeeLocal(x.index,m),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.GtU32,T.createGetLocal(x.index,1),T.createGetLocal(N.index,1)));break;case 3:x=e.currentFunction.getTempLocal(s.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(x),f=T.createSelect(T.createTeeLocal(x.index,m),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.GtI64,T.createGetLocal(x.index,2),T.createGetLocal(N.index,2)));break;case 8:x=e.currentFunction.getTempLocal(s.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(x),f=T.createSelect(T.createTeeLocal(x.index,m),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.GtU64,T.createGetLocal(x.index,2),T.createGetLocal(N.index,2)));break;case 4:x=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(x),f=T.createSelect(T.createTeeLocal(x.index,m),T.createTeeLocal(N.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,T.createGetLocal(x.index,e.options.nativeSizeType),T.createGetLocal(N.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable();break}x=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(x),f=T.createSelect(T.createTeeLocal(x.index,m),T.createTeeLocal(N.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,T.createGetLocal(x.index,e.options.nativeSizeType),T.createGetLocal(N.index,e.options.nativeSizeType)));break;case 11:f=T.createBinary(o.BinaryOp.MaxF32,m,y);break;case 12:f=T.createBinary(o.BinaryOp.MaxF64,m,y);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"min":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.f64,0,1);switch(y=e.compileExpression(n[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:R=e.currentFunction.flow,x=e.currentFunction.getTempLocal(e.currentType,!R.canOverflow(m,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!R.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(x),f=T.createSelect(T.createTeeLocal(x.index,m),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.LtI32,T.createGetLocal(x.index,1),T.createGetLocal(N.index,1)));break;case 5:case 6:case 7:case 10:R=e.currentFunction.flow,x=e.currentFunction.getTempLocal(e.currentType,!R.canOverflow(m,e.currentType)),N=e.currentFunction.getAndFreeTempLocal(e.currentType,!R.canOverflow(y,e.currentType));e.currentFunction.freeTempLocal(x),f=T.createSelect(T.createTeeLocal(x.index,m),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.LtU32,T.createGetLocal(x.index,1),T.createGetLocal(N.index,1)));break;case 3:x=e.currentFunction.getTempLocal(s.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(x),f=T.createSelect(T.createTeeLocal(x.index,m),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.LtI64,T.createGetLocal(x.index,2),T.createGetLocal(N.index,2)));break;case 8:x=e.currentFunction.getTempLocal(s.Type.i64,!1),N=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);e.currentFunction.freeTempLocal(x),f=T.createSelect(T.createTeeLocal(x.index,m),T.createTeeLocal(N.index,y),T.createBinary(o.BinaryOp.LtU64,T.createGetLocal(x.index,2),T.createGetLocal(N.index,2)));break;case 4:x=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(x),f=T.createSelect(T.createTeeLocal(x.index,m),T.createTeeLocal(N.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,T.createGetLocal(x.index,e.options.nativeSizeType),T.createGetLocal(N.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable();break}x=e.currentFunction.getTempLocal(e.options.usizeType,!1),N=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);e.currentFunction.freeTempLocal(x),f=T.createSelect(T.createTeeLocal(x.index,m),T.createTeeLocal(N.index,y),T.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,T.createGetLocal(x.index,e.options.nativeSizeType),T.createGetLocal(N.index,e.options.nativeSizeType)));break;case 11:f=T.createBinary(o.BinaryOp.MinF32,m,y);break;case 12:f=T.createBinary(o.BinaryOp.MinF64,m,y);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"ceil":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable();break}default:f=m;break;case 11:f=T.createUnary(o.UnaryOp.CeilF32,m);break;case 12:f=T.createUnary(o.UnaryOp.CeilF64,m);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"floor":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable();break}default:f=m;break;case 11:f=T.createUnary(o.UnaryOp.FloorF32,m);break;case 12:f=T.createUnary(o.UnaryOp.FloorF64,m);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"copysign":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(y=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 11:f=T.createBinary(o.BinaryOp.CopysignF32,m,y);break;case 12:f=T.createBinary(o.BinaryOp.CopysignF64,m,y);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"nearest":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable();break}default:f=m;break;case 11:f=T.createUnary(o.UnaryOp.NearestF32,m);break;case 12:f=T.createUnary(o.UnaryOp.NearestF64,m);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"reinterpret":if(1!=n.length)return r&&1==r.length||(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0")),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(!r||1!=r.length)return r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),T.createUnreachable();switch(r[0].kind){case 2:case 7:m=e.compileExpression(n[0],s.Type.f32,1,0),f=T.createUnary(o.UnaryOp.ReinterpretF32,m);break;case 3:case 8:m=e.compileExpression(n[0],s.Type.f64,1,0),f=T.createUnary(o.UnaryOp.ReinterpretF64,m);break;case 9:if(r[0].is(256))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),e.currentType=r[0],T.createUnreachable();case 4:m=e.compileExpression(n[0],e.options.isWasm64?s.Type.f64:s.Type.f32,1,0),f=T.createUnary(e.options.isWasm64?o.UnaryOp.ReinterpretF64:o.UnaryOp.ReinterpretF32,m);break;case 11:m=e.compileExpression(n[0],s.Type.i32,1,0),f=T.createUnary(o.UnaryOp.ReinterpretI32,m);break;case 12:m=e.compileExpression(n[0],s.Type.i64,1,0),f=T.createUnary(o.UnaryOp.ReinterpretI64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return e.currentType=r[0],f;case"sqrt":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 11:f=T.createUnary(o.UnaryOp.SqrtF32,m);break;case 12:f=T.createUnary(o.UnaryOp.SqrtF64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"trunc":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(r&&r.length){if(e.currentType=r[0],1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable();break}default:f=m;break;case 11:f=T.createUnary(o.UnaryOp.TruncF32,m);break;case 12:f=T.createUnary(o.UnaryOp.TruncF64,m);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"load":return n.length<1||n.length>2?(r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<1?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable()):r&&1==r.length?(m=e.compileExpression(n[0],e.options.usizeType,1,0),(U=2==n.length?_(e,n[1]):0)<0?T.createUnreachable():(e.currentType=r[0],T.createLoad(r[0].byteSize,r[0].is(5),m,r[0].is(4)&&p.is(4)&&p.size>r[0].size?(e.currentType=p).toNativeType():(e.currentType=r[0]).toNativeType(),U))):(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),T.createUnreachable());case"store":if(e.currentType=s.Type.void,n.length<2||n.length>3)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"2",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),T.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),T.createUnreachable();m=e.compileExpression(n[0],e.options.usizeType,1,0),y=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);I=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size1)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),T.createUnreachable();var B;if(!(B=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable();var U=void 0;if(n.length){if(n[0].kind!=a.NodeKind.LITERAL||n[0].literalKind!=a.LiteralKind.STRING)return e.error(i.DiagnosticCode.String_literal_expected,n[0].range),T.createUnreachable();var P=n[0].value,w=B.members?B.members.get(P):null;if(!w||w.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,B.internalName,P),T.createUnreachable();U=w.memoryOffset}else U=B.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,T.createI32(U)):T.createI64(U):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,T.createI64(U)):T.createI32(U);case"select":if(3!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),T.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpressionRetainType(n[0],s.Type.i32,0);I=e.currentType;switch(y=e.compileExpression(n[1],I,1,0),E=e.makeIsTrueish(e.compileExpressionRetainType(n[2],s.Type.bool,0),e.currentType),e.currentType=I,e.currentType.kind){case 0:case 1:case 5:case 6:case 10:default:f=T.createSelect(m,y,E);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=T.createUnreachable()}return f;case"unreachable":return 0!=n.length&&e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"0",n.length.toString(10)),r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),T.createUnreachable();case"memory.size":return e.currentType=s.Type.i32,0!=n.length&&e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"0",n.length.toString(10)),r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),T.createHost(o.HostOp.CurrentMemory);case"memory.grow":return e.currentType=s.Type.i32,1!=n.length?(e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"0",n.length.toString(10)),m=T.createUnreachable()):m=e.compileExpression(n[0],s.Type.i32,1,0),r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),T.createHost(o.HostOp.GrowMemory,null,[m]);case"memory.copy":if(r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),3!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),e.currentType=s.Type.void,T.createUnreachable();throw m=e.compileExpression(n[0],e.options.usizeType,1,0),y=e.compileExpression(n[1],e.options.usizeType,1,0),E=e.compileExpression(n[2],e.options.usizeType,1,0),e.currentType=s.Type.void,new Error("not implemented");case"memory.fill":if(r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),3!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),e.currentType=s.Type.void,T.createUnreachable();throw m=e.compileExpression(n[0],e.options.usizeType,1,0),y=e.compileExpression(n[1],s.Type.u32,1,0),E=e.compileExpression(n[2],e.options.usizeType,1,0),e.currentType=s.Type.void,new Error("not implemented");case"changetype":return r&&1==r.length?1!=n.length?(e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),e.currentType=r[0],T.createUnreachable()):(m=e.compileExpressionRetainType(n[0],r[0],0),e.currentType=r[0],e.currentType.size!=r[0].size?(e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable()):m):(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),T.createUnreachable());case"assert":if(n.length<1||n.length>2)return r&&(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),n.length<1?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)):n.length>2&&e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),T.createUnreachable();if(r){if(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpressionRetainType(n[0],s.Type.bool,1);I=e.currentType;if(e.currentType=I.nonNullableType,e.options.noAssert)return p==s.Type.void?(e.currentType=s.Type.void,T.createNop()):m;var M=g(e,2==n.length?n[1]:null,u);if(e.currentType=I.nonNullableType,p==s.Type.void){switch(e.currentType.kind){default:f=T.createIf(T.createUnary(o.UnaryOp.EqzI32,m),M);break;case 3:case 8:f=T.createIf(T.createUnary(o.UnaryOp.EqzI64,m),M);break;case 4:case 9:f=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,m),M);break;case 11:f=T.createIf(T.createBinary(o.BinaryOp.EqF32,m,T.createF32(0)),M);break;case 12:f=T.createIf(T.createBinary(o.BinaryOp.EqF64,m,T.createF64(0)),M);break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=M}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:R=e.currentFunction.flow;var G=e.currentFunction.getAndFreeTempLocal(e.currentType,!R.canOverflow(m,e.currentType));f=T.createIf(T.createTeeLocal(G.index,m),T.createGetLocal(G.index,1),M);break;case 2:case 7:default:G=e.currentFunction.getAndFreeTempLocal(s.Type.i32,!1);f=T.createIf(T.createTeeLocal(G.index,m),T.createGetLocal(G.index,1),M);break;case 3:case 8:G=e.currentFunction.getAndFreeTempLocal(s.Type.i64,!1);f=T.createIf(T.createUnary(o.UnaryOp.EqzI64,T.createTeeLocal(G.index,m)),M,T.createGetLocal(G.index,2));break;case 4:case 9:G=e.currentFunction.getAndFreeTempLocal(e.options.usizeType,!1);f=T.createIf(T.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,T.createTeeLocal(G.index,m)),M,T.createGetLocal(G.index,e.options.nativeSizeType));break;case 11:G=e.currentFunction.getAndFreeTempLocal(s.Type.f32,!1);f=T.createIf(T.createBinary(o.BinaryOp.EqF32,T.createTeeLocal(G.index,m),T.createF32(0)),M,T.createGetLocal(G.index,3));break;case 12:G=e.currentFunction.getAndFreeTempLocal(s.Type.f64,!1);f=T.createIf(T.createBinary(o.BinaryOp.EqF64,T.createTeeLocal(G.index,m),T.createF64(0)),M,T.createGetLocal(G.index,4));break;case 13:e.error(i.DiagnosticCode.Operation_not_supported,u.range),f=M}return f;case"unchecked":return r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),1!=n.length?(e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable()):((R=e.currentFunction.flow).set(8192),f=e.compileExpressionRetainType(n[0],p,0),R.unset(8192),f);case"call_indirect":if(n.length<1)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),T.createUnreachable();var K=void 0;if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),T.createUnreachable();K=r[0]}else K=p;if(m=e.compileExpressionRetainType(n[0],s.Type.u32,0),7!=e.currentType.kind)return e.error(i.DiagnosticCode.Operation_not_supported,n[0].range),T.createUnreachable();for(var z=n.length-1,V=new Array(z),H=new Array(z+1),X=K.toNativeType(),W=new Array(z),Y=0;Y void"),T.createUnreachable())}var ee=function(e,t,r,n,i){switch(t.internalName){case"i32.clz":return h("clz",e,s.Type.i32,r,s.Type.i32,i);case"i64.clz":return h("clz",e,s.Type.i64,r,s.Type.i64,i);case"i32.ctz":return h("ctz",e,s.Type.i32,r,s.Type.i32,i);case"i64.ctz":return h("ctz",e,s.Type.i64,r,s.Type.i64,i);case"i32.popcnt":return h("popcnt",e,s.Type.i32,r,s.Type.i32,i);case"i64.popcnt":return h("popcnt",e,s.Type.i64,r,s.Type.i64,i);case"i32.rotl":return h("rotl",e,s.Type.i32,r,s.Type.i32,i);case"i64.rotl":return h("rotl",e,s.Type.i64,r,s.Type.i64,i);case"i32.rotr":return h("rotr",e,s.Type.i32,r,s.Type.i32,i);case"i64.rotr":return h("rotr",e,s.Type.i64,r,s.Type.i64,i);case"f32.abs":return h("abs",e,s.Type.f32,r,s.Type.f32,i);case"f64.abs":return h("abs",e,s.Type.f64,r,s.Type.f64,i);case"f32.max":return h("max",e,s.Type.f32,r,s.Type.f32,i);case"f64.max":return h("max",e,s.Type.f64,r,s.Type.f64,i);case"f32.min":return h("min",e,s.Type.f32,r,s.Type.f32,i);case"f64.min":return h("min",e,s.Type.f64,r,s.Type.f64,i);case"f32.ceil":return h("ceil",e,s.Type.f32,r,s.Type.f32,i);case"f64.ceil":return h("ceil",e,s.Type.f64,r,s.Type.f64,i);case"f32.floor":return h("floor",e,s.Type.f32,r,s.Type.f32,i);case"f64.floor":return h("floor",e,s.Type.f64,r,s.Type.f64,i);case"f32.copysign":return h("copysign",e,s.Type.f32,r,s.Type.f32,i);case"f64.copysign":return h("copysign",e,s.Type.f64,r,s.Type.f64,i);case"f32.nearest":return h("nearest",e,s.Type.f32,r,s.Type.f32,i);case"f64.nearest":return h("nearest",e,s.Type.f64,r,s.Type.f64,i);case"i32.reinterpret_f32":return h("reinterpret",e,s.Type.i32,r,s.Type.f32,i);case"i64.reinterpret_f64":return h("reinterpret",e,s.Type.i64,r,s.Type.f64,i);case"f32.reinterpret_i32":return h("reinterpret",e,s.Type.f32,r,s.Type.i32,i);case"f64.reinterpret_i64":return h("reinterpret",e,s.Type.f64,r,s.Type.i64,i);case"f32.sqrt":return h("sqrt",e,s.Type.f32,r,s.Type.f32,i);case"f64.sqrt":return h("sqrt",e,s.Type.f64,r,s.Type.f64,i);case"f32.trunc":return h("trunc",e,s.Type.f32,r,s.Type.f32,i);case"f64.trunc":return h("trunc",e,s.Type.f64,r,s.Type.f64,i);case"i32.load8_s":return h("load",e,s.Type.i8,r,s.Type.i32,i);case"i32.load8_u":return h("load",e,s.Type.u8,r,s.Type.u32,i);case"i32.load16_s":return h("load",e,s.Type.i16,r,s.Type.i32,i);case"i32.load16_u":return h("load",e,s.Type.u16,r,s.Type.u32,i);case"i32.load":return h("load",e,s.Type.i32,r,s.Type.i32,i);case"i64.load8_s":return h("load",e,s.Type.i8,r,s.Type.i64,i);case"i64.load8_u":return h("load",e,s.Type.u8,r,s.Type.u64,i);case"i64.load16_s":return h("load",e,s.Type.i16,r,s.Type.i64,i);case"i64.load16_u":return h("load",e,s.Type.u16,r,s.Type.u64,i);case"i64.load32_s":return h("load",e,s.Type.i32,r,s.Type.i64,i);case"i64.load32_u":return h("load",e,s.Type.u32,r,s.Type.u64,i);case"i64.load":return h("load",e,s.Type.i64,r,s.Type.i64,i);case"f32.load":return h("load",e,s.Type.f32,r,s.Type.f32,i);case"f64.load":return h("load",e,s.Type.f64,r,s.Type.f64,i);case"i32.store8":return h("store",e,s.Type.i8,r,s.Type.i32,i);case"i32.store16":return h("store",e,s.Type.i16,r,s.Type.i32,i);case"i32.store":return h("store",e,s.Type.i32,r,s.Type.i32,i);case"i64.store8":return h("store",e,s.Type.i8,r,s.Type.i64,i);case"i64.store16":return h("store",e,s.Type.i16,r,s.Type.i64,i);case"i64.store32":return h("store",e,s.Type.i32,r,s.Type.i64,i);case"i64.store":return h("store",e,s.Type.i64,r,s.Type.i64,i);case"f32.store":return h("store",e,s.Type.f32,r,s.Type.f32,i);case"f64.store":return h("store",e,s.Type.f64,r,s.Type.f64,i)}return 0}(e,t,n,0,u);return ee?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),ee):(e.error(i.DiagnosticCode.Operation_not_supported,u.range),T.createUnreachable())}function h(e,t,r,n,i,a){var s=assert(t.program.elementsLookup.get(e));return assert(s.kind==c.ElementKind.FUNCTION_PROTOTYPE),u(t,s,[r],n,i,a)}function d(e,t,r,n){if(0==r.length)return t&&1==t.length?t[0]:(e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t?t.length.toString(10):"0"),null);if(1==r.length){if(t)if(1==t.length)e.compileExpression(r[0],t[0],1,0);else{if(t.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t.length.toString(10)),null;e.compileExpressionRetainType(r[0],s.Type.i32,0)}else e.compileExpressionRetainType(r[0],s.Type.i32,0);return e.currentType}return t&&t.length>1&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t.length.toString(10)),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"1",r.length.toString(10)),null}function _(e,t){var r,n;return e.options.isWasm64?(r=e.precomputeExpression(t,s.Type.usize64,1,0),(o.getExpressionId(r)!=o.ExpressionId.Const||2!=o.getExpressionType(r)||0!=o.getConstValueI64High(r)||(n=o.getConstValueI64Low(r))<0)&&(e.error(i.DiagnosticCode.Operation_not_supported,t.range),n=-1)):(r=e.precomputeExpression(t,s.Type.usize32,1,0),(o.getExpressionId(r)!=o.ExpressionId.Const||1!=o.getExpressionType(r)||(n=o.getConstValueI32(r))<0)&&(e.error(i.DiagnosticCode.Operation_not_supported,t.range),n=-1)),n}function g(e,t,r){var n=e.program,i=e.module,a=n.typesLookup.get("string");if(!a)return i.createUnreachable();var o=n.abortInstance;if(!o||!e.compileFunction(o))return i.createUnreachable();var c=null!=t?e.compileExpression(t,a,1,0):a.toNativeZero(i),l=e.ensureStaticString(r.range.source.normalizedPath);return e.currentType=s.Type.void,i.createBlock(null,[i.createCall(o.internalName,[c,l,i.createI32(r.range.line),i.createI32(r.range.column)],0),i.createUnreachable()])}t.compileCall=u,t.compileAbort=g,t.compileIterateRoots=function(e){var t,r,i=e.module,a=new Array;try{for(var o=n(e.program.elementsLookup.values()),l=o.next();!l.done;l=o.next()){var u=l.value;if(u.kind==c.ElementKind.GLOBAL){var h=u,d=h.type.classReference;if(h.is(p.CommonFlags.COMPILED)&&null!==d&&!d.hasDecorator(c.DecoratorFlags.UNMANAGED))if(h.is(p.CommonFlags.INLINED)){var _=h.constantIntegerValue;a.push(i.createCallIndirect(i.createGetLocal(0,1),[e.options.isWasm64?i.createI64(i64_low(_),i64_high(_)):i.createI32(i64_low(_))],"iv"))}else a.push(i.createCallIndirect(i.createGetLocal(0,1),[i.createGetGlobal(h.internalName,e.options.nativeSizeType)],"iv"))}}}catch(e){t={error:e}}finally{try{l&&!l.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}var g=e.ensureFunctionType([s.Type.i32],s.Type.void);i.addFunction("~iterateRoots",g,[],a.length?i.createBlock(null,a):i.createNop())},t.ensureGCHook=function e(t,r){var i,a,l=t.program;assert(r.type.isManaged(l));var u=r.gcHookIndex;if(-1!=u)return u;var h=r.members;if(r.prototype.declaration.range.source.isLibrary&&null!==h&&h.has("__gc")){var d=assert(h.get("__gc"));assert(d.kind==c.ElementKind.FUNCTION_PROTOTYPE);var _=assert(l.resolver.resolveFunction(d,null));assert(_.is(p.CommonFlags.PRIVATE|p.CommonFlags.INSTANCE)),assert(!_.isAny(p.CommonFlags.AMBIENT|p.CommonFlags.VIRTUAL)),assert(0==_.signature.parameterTypes.length),assert(_.signature.returnType==s.Type.void),_.internalName=r.internalName+"~gc",assert(t.compileFunction(_));var g=t.ensureFunctionTableEntry(_);return r.gcHookIndex=g,g}var m=t.module,y=t.options,E=y.nativeSizeType,f=y.usizeType.byteSize,T=new Array;T.push(m.createIf(m.createUnary(y.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,m.createGetLocal(0,E)),m.createReturn()));var I=t.functionTable,v=I.length;I.push(""),r.gcHookIndex=v;var C=r.base;if(C?(assert(C.type.isManaged(l)),T.push(m.createCallIndirect(m.createI32(e(t,C.type.classReference)),[m.createGetLocal(0,E)],2==E?"Iv":"iv"))):T.push(m.createCall(assert(l.gcMarkInstance).internalName,[m.createGetLocal(0,E)],0)),h)try{for(var A=n(h.values()),N=A.next();!N.done;N=A.next()){var S=N.value;if(S.kind==c.ElementKind.FIELD&&S.parent===r&&S.type.isManaged(l)){var O=S.memoryOffset;assert(O>=0),T.push(m.createCall(assert(l.gcMarkInstance).internalName,[m.createLoad(f,!1,m.createGetLocal(0,E),E,O)],0))}}}catch(e){i={error:e}}finally{try{N&&!N.done&&(a=A.return)&&a.call(A)}finally{if(i)throw i.error}}var L=r.internalName+"~gc";return m.addFunction(L,t.ensureFunctionType(null,s.Type.void,y.usizeType),null,m.createBlock(null,T)),I[v]=L,v}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NULL=0]="NULL",e[e.LINEFEED=10]="LINEFEED",e[e.CARRIAGERETURN=13]="CARRIAGERETURN",e[e.LINESEPARATOR=8232]="LINESEPARATOR",e[e.PARAGRAPHSEPARATOR=8233]="PARAGRAPHSEPARATOR",e[e.NEXTLINE=133]="NEXTLINE",e[e.SPACE=32]="SPACE",e[e.NONBREAKINGSPACE=160]="NONBREAKINGSPACE",e[e.ENQUAD=8192]="ENQUAD",e[e.EMQUAD=8193]="EMQUAD",e[e.ENSPACE=8194]="ENSPACE",e[e.EMSPACE=8195]="EMSPACE",e[e.THREEPEREMSPACE=8196]="THREEPEREMSPACE",e[e.FOURPEREMSPACE=8197]="FOURPEREMSPACE",e[e.SIXPEREMSPACE=8198]="SIXPEREMSPACE",e[e.FIGURESPACE=8199]="FIGURESPACE",e[e.PUNCTUATIONSPACE=8200]="PUNCTUATIONSPACE",e[e.THINSPACE=8201]="THINSPACE",e[e.HAIRSPACE=8202]="HAIRSPACE",e[e.ZEROWIDTHSPACE=8203]="ZEROWIDTHSPACE",e[e.NARROWNOBREAKSPACE=8239]="NARROWNOBREAKSPACE",e[e.IDEOGRAPHICSPACE=12288]="IDEOGRAPHICSPACE",e[e.MATHEMATICALSPACE=8287]="MATHEMATICALSPACE",e[e.OGHAM=5760]="OGHAM",e[e._=95]="_",e[e._0=48]="_0",e[e._1=49]="_1",e[e._2=50]="_2",e[e._3=51]="_3",e[e._4=52]="_4",e[e._5=53]="_5",e[e._6=54]="_6",e[e._7=55]="_7",e[e._8=56]="_8",e[e._9=57]="_9",e[e.a=97]="a",e[e.b=98]="b",e[e.c=99]="c",e[e.d=100]="d",e[e.e=101]="e",e[e.f=102]="f",e[e.g=103]="g",e[e.h=104]="h",e[e.i=105]="i",e[e.j=106]="j",e[e.k=107]="k",e[e.l=108]="l",e[e.m=109]="m",e[e.n=110]="n",e[e.o=111]="o",e[e.p=112]="p",e[e.q=113]="q",e[e.r=114]="r",e[e.s=115]="s",e[e.t=116]="t",e[e.u=117]="u",e[e.v=118]="v",e[e.w=119]="w",e[e.x=120]="x",e[e.y=121]="y",e[e.z=122]="z",e[e.A=65]="A",e[e.B=66]="B",e[e.C=67]="C",e[e.D=68]="D",e[e.E=69]="E",e[e.F=70]="F",e[e.G=71]="G",e[e.H=72]="H",e[e.I=73]="I",e[e.J=74]="J",e[e.K=75]="K",e[e.L=76]="L",e[e.M=77]="M",e[e.N=78]="N",e[e.O=79]="O",e[e.P=80]="P",e[e.Q=81]="Q",e[e.R=82]="R",e[e.S=83]="S",e[e.T=84]="T",e[e.U=85]="U",e[e.V=86]="V",e[e.W=87]="W",e[e.X=88]="X",e[e.Y=89]="Y",e[e.Z=90]="Z",e[e.AMPERSAND=38]="AMPERSAND",e[e.ASTERISK=42]="ASTERISK",e[e.AT=64]="AT",e[e.BACKSLASH=92]="BACKSLASH",e[e.BACKTICK=96]="BACKTICK",e[e.BAR=124]="BAR",e[e.CARET=94]="CARET",e[e.CLOSEBRACE=125]="CLOSEBRACE",e[e.CLOSEBRACKET=93]="CLOSEBRACKET",e[e.CLOSEPAREN=41]="CLOSEPAREN",e[e.COLON=58]="COLON",e[e.COMMA=44]="COMMA",e[e.DOLLAR=36]="DOLLAR",e[e.DOT=46]="DOT",e[e.DOUBLEQUOTE=34]="DOUBLEQUOTE",e[e.EQUALS=61]="EQUALS",e[e.EXCLAMATION=33]="EXCLAMATION",e[e.GREATERTHAN=62]="GREATERTHAN",e[e.HASH=35]="HASH",e[e.LESSTHAN=60]="LESSTHAN",e[e.MINUS=45]="MINUS",e[e.OPENBRACE=123]="OPENBRACE",e[e.OPENBRACKET=91]="OPENBRACKET",e[e.OPENPAREN=40]="OPENPAREN",e[e.PERCENT=37]="PERCENT",e[e.PLUS=43]="PLUS",e[e.QUESTION=63]="QUESTION",e[e.SEMICOLON=59]="SEMICOLON",e[e.SINGLEQUOTE=39]="SINGLEQUOTE",e[e.SLASH=47]="SLASH",e[e.TILDE=126]="TILDE",e[e.BACKSPACE=8]="BACKSPACE",e[e.FORMFEED=12]="FORMFEED",e[e.BYTEORDERMARK=65279]="BYTEORDERMARK",e[e.TAB=9]="TAB",e[e.VERTICALTAB=11]="VERTICALTAB"}(t.CharCode||(t.CharCode={})),t.isLineBreak=function(e){switch(e){case 10:case 13:case 8232:case 8233:return!0;default:return!1}},t.isWhiteSpace=function(e){switch(e){case 32:case 9:case 11:case 12:case 160:case 133:case 5760:case 8239:case 8287:case 12288:case 65279:return!0;default:return e>=8192&&e<=8203}},t.isDecimalDigit=function(e){return e>=48&&e<=57},t.isOctalDigit=function(e){return e>=48&&e<=55},t.isIdentifierStart=function(e){return e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>127&&!((t=e)<0||t>65535)&&a(t,n);var t},t.isKeywordCharacter=function(e){return e>=97&&e<=122},t.isIdentifierPart=function(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||36==e||95==e||e>127&&!((t=e)<0||t>65535)&&a(t,i);var t};var n=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,880,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1162,1319,1329,1366,1369,1369,1377,1415,1488,1514,1520,1522,1568,1610,1646,1647,1649,1747,1749,1749,1765,1766,1774,1775,1786,1788,1791,1791,1808,1808,1810,1839,1869,1957,1969,1969,1994,2026,2036,2037,2042,2042,2048,2069,2074,2074,2084,2084,2088,2088,2112,2136,2208,2208,2210,2220,2308,2361,2365,2365,2384,2384,2392,2401,2417,2423,2425,2431,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2493,2493,2510,2510,2524,2525,2527,2529,2544,2545,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2649,2652,2654,2654,2674,2676,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2749,2749,2768,2768,2784,2785,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2877,2877,2908,2909,2911,2913,2929,2929,2947,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3024,3024,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3133,3160,3161,3168,3169,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3261,3261,3294,3294,3296,3297,3313,3314,3333,3340,3342,3344,3346,3386,3389,3389,3406,3406,3424,3425,3450,3455,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3585,3632,3634,3635,3648,3654,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3760,3762,3763,3773,3773,3776,3780,3782,3782,3804,3807,3840,3840,3904,3911,3913,3948,3976,3980,4096,4138,4159,4159,4176,4181,4186,4189,4193,4193,4197,4198,4206,4208,4213,4225,4238,4238,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5905,5920,5937,5952,5969,5984,5996,5998,6e3,6016,6067,6103,6103,6108,6108,6176,6263,6272,6312,6314,6314,6320,6389,6400,6428,6480,6509,6512,6516,6528,6571,6593,6599,6656,6678,6688,6740,6823,6823,6917,6963,6981,6987,7043,7072,7086,7087,7098,7141,7168,7203,7245,7247,7258,7293,7401,7404,7406,7409,7413,7414,7424,7615,7680,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8305,8305,8319,8319,8336,8348,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11502,11506,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11648,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11823,11823,12293,12295,12321,12329,12337,12341,12344,12348,12353,12438,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42527,42538,42539,42560,42606,42623,42647,42656,42735,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43009,43011,43013,43015,43018,43020,43042,43072,43123,43138,43187,43250,43255,43259,43259,43274,43301,43312,43334,43360,43388,43396,43442,43471,43471,43520,43560,43584,43586,43588,43595,43616,43638,43642,43642,43648,43695,43697,43697,43701,43702,43705,43709,43712,43712,43714,43714,43739,43741,43744,43754,43762,43764,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44002,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64285,64287,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65136,65140,65142,65276,65313,65338,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500],i=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,768,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1155,1159,1162,1319,1329,1366,1369,1369,1377,1415,1425,1469,1471,1471,1473,1474,1476,1477,1479,1479,1488,1514,1520,1522,1552,1562,1568,1641,1646,1747,1749,1756,1759,1768,1770,1788,1791,1791,1808,1866,1869,1969,1984,2037,2042,2042,2048,2093,2112,2139,2208,2208,2210,2220,2276,2302,2304,2403,2406,2415,2417,2423,2425,2431,2433,2435,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2492,2500,2503,2504,2507,2510,2519,2519,2524,2525,2527,2531,2534,2545,2561,2563,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2620,2620,2622,2626,2631,2632,2635,2637,2641,2641,2649,2652,2654,2654,2662,2677,2689,2691,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2748,2757,2759,2761,2763,2765,2768,2768,2784,2787,2790,2799,2817,2819,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2876,2884,2887,2888,2891,2893,2902,2903,2908,2909,2911,2915,2918,2927,2929,2929,2946,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3006,3010,3014,3016,3018,3021,3024,3024,3031,3031,3046,3055,3073,3075,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3140,3142,3144,3146,3149,3157,3158,3160,3161,3168,3171,3174,3183,3202,3203,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3260,3268,3270,3272,3274,3277,3285,3286,3294,3294,3296,3299,3302,3311,3313,3314,3330,3331,3333,3340,3342,3344,3346,3386,3389,3396,3398,3400,3402,3406,3415,3415,3424,3427,3430,3439,3450,3455,3458,3459,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3530,3530,3535,3540,3542,3542,3544,3551,3570,3571,3585,3642,3648,3662,3664,3673,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3769,3771,3773,3776,3780,3782,3782,3784,3789,3792,3801,3804,3807,3840,3840,3864,3865,3872,3881,3893,3893,3895,3895,3897,3897,3902,3911,3913,3948,3953,3972,3974,3991,3993,4028,4038,4038,4096,4169,4176,4253,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4957,4959,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5908,5920,5940,5952,5971,5984,5996,5998,6e3,6002,6003,6016,6099,6103,6103,6108,6109,6112,6121,6155,6157,6160,6169,6176,6263,6272,6314,6320,6389,6400,6428,6432,6443,6448,6459,6470,6509,6512,6516,6528,6571,6576,6601,6608,6617,6656,6683,6688,6750,6752,6780,6783,6793,6800,6809,6823,6823,6912,6987,6992,7001,7019,7027,7040,7155,7168,7223,7232,7241,7245,7293,7376,7378,7380,7414,7424,7654,7676,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8204,8205,8255,8256,8276,8276,8305,8305,8319,8319,8336,8348,8400,8412,8417,8417,8421,8432,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11647,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11744,11775,11823,11823,12293,12295,12321,12335,12337,12341,12344,12348,12353,12438,12441,12442,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42539,42560,42607,42612,42621,42623,42647,42655,42737,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43047,43072,43123,43136,43204,43216,43225,43232,43255,43259,43259,43264,43309,43312,43347,43360,43388,43392,43456,43471,43481,43520,43574,43584,43597,43600,43609,43616,43638,43642,43643,43648,43714,43739,43741,43744,43759,43762,43766,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44010,44012,44013,44016,44025,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65024,65039,65056,65062,65075,65076,65101,65103,65136,65140,65142,65276,65296,65305,65313,65338,65343,65343,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500];function a(e,t){if(e=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},i=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0}),t.makeArray=function(e){if(void 0===e&&(e=null),e){for(var t=new Array(e.length),r=0,n=e.length;r0||i=0;)if(e.charCodeAt(a)==n){r-a==3&&46==e.charCodeAt(a+1)&&46==e.charCodeAt(a+2)||(e=t?e.substring(0,a):e.substring(0,a)+e.substring(r+3),i-=r+3-a,r=a-1);break}if(a<0&&r>0&&(2!=r||46!=e.charCodeAt(0)||46!=e.charCodeAt(1))){i=(e=e.substring(r+4)).length;continue}}}r++}return i>0?e:"."}function a(e){for(var t=e.length;--t>0;)if(e.charCodeAt(t)==n)return e.substring(0,t);return"."}t.normalizePath=i,t.resolvePath=function(e,t){return e.startsWith("std/")?e:i(a(t)+String.fromCharCode(n)+e)},t.dirname=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=" ",i=" ",a=" ";t.indent=function(e,t){for(;t>=4;)e.push(a),t-=4;t>=2&&(e.push(i),t-=2),t&&e.push(n)}},function(e,t,r){"use strict";function n(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function i(e,t,r){t[r]=e,t[r+1]=e>>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function a(e,t){var r=n(e,t),i=n(e,t+4);return i64_new(r,i)}Object.defineProperty(t,"__esModule",{value:!0}),t.readI8=function(e,t){return e[t]},t.writeI8=function(e,t,r){t[r]=e},t.readI16=function(e,t){return e[t]|e[t+1]<<8},t.writeI16=function(e,t,r){t[r]=e,t[r+1]=e>>>8},t.readI32=n,t.writeI32=i,t.readI64=a,t.writeI64=function(e,t,r){i(i64_low(e),t,r),i(i64_high(e),t,r+4)},t.readF32=function(e,t){return i32_as_f32(n(e,t))},t.writeF32=function(e,t,r){i(f32_as_i32(e),t,r)},t.readF64=function(e,t){return i64_as_f64(a(e,t))},t.writeF64=function(e,t,r){var n=f64_as_i64(e);i(i64_low(n),t,r),i(i64_high(n),t,r+4)}},function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(9),a=r(12),s=r(13),o=r(1);t.formatDiagnostic=o.formatDiagnosticMessage;var c=r(14);t.parseFile=function(e,t,r,n){return void 0===r&&(r=!1),void 0===n&&(n=null),n||(n=new c.Parser),n.parseFile(e,t,r),n},t.nextFile=function(e){return e.nextFile()},t.nextDiagnostic=function(e){var t=e.program;return t.diagnosticsOffset 0 && !isLineBreak(text.charCodeAt(start - 1))) start--;\r\n while (end < len && !isLineBreak(text.charCodeAt(end))) end++;\r\n var sb: string[] = [\r\n \"\\n \",\r\n text.substring(start, end),\r\n \"\\n \"\r\n ];\r\n while (start < range.start) {\r\n sb.push(\" \");\r\n start++;\r\n }\r\n if (useColors) sb.push(COLOR_RED);\r\n if (range.start == range.end) {\r\n sb.push(\"^\");\r\n } else {\r\n while (start++ < range.end) sb.push(\"~\");\r\n }\r\n if (useColors) sb.push(COLOR_RESET);\r\n return sb.join(\"\");\r\n}\r\n\r\n/** Base class of all diagnostic emitters. */\r\nexport abstract class DiagnosticEmitter {\r\n\r\n /** Diagnostic messages emitted so far. */\r\n diagnostics: DiagnosticMessage[];\r\n\r\n /** Initializes this diagnostic emitter. */\r\n protected constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n this.diagnostics = diagnostics ? diagnostics : new Array();\r\n }\r\n\r\n /** Emits a diagnostic message of the specified category. */\r\n emitDiagnostic(\r\n code: DiagnosticCode,\r\n category: DiagnosticCategory,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n var message = DiagnosticMessage.create(code, category, arg0, arg1, arg2).withRange(range);\r\n this.diagnostics.push(message);\r\n // console.log(formatDiagnosticMessage(message, true, true) + \"\\n\"); // temporary\r\n // console.log(new Error(\"stack\").stack);\r\n }\r\n\r\n /** Emits an informatory diagnostic message. */\r\n info(\r\n code: DiagnosticCode,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.INFO, range, arg0, arg1, arg2);\r\n }\r\n\r\n /** Emits a warning diagnostic message. */\r\n warning(\r\n code: DiagnosticCode,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, arg0, arg1, arg2);\r\n }\r\n\r\n /** Emits an error diagnostic message. */\r\n error(\r\n code: DiagnosticCode,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, arg0, arg1, arg2);\r\n }\r\n}\r\n","/**\r\n * Various compiler utilities.\r\n * @module util\r\n * @preferred\r\n *//***/\r\n\r\nexport * from \"./charcode\";\r\nexport * from \"./collections\";\r\nexport * from \"./path\";\r\nexport * from \"./text\";\r\nexport * from \"./binary\";\r\n","/**\r\n * Abstract syntax tree representing a source file once parsed.\r\n * @module ast\r\n *//***/\r\n\r\nimport {\r\n CommonFlags,\r\n PATH_DELIMITER,\r\n STATIC_DELIMITER,\r\n INSTANCE_DELIMITER,\r\n LIBRARY_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n Token,\r\n Tokenizer,\r\n Range\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n normalizePath,\r\n resolvePath,\r\n CharCode\r\n} from \"./util\";\r\n\r\nexport { Token, Range };\r\n\r\n/** Indicates the kind of a node. */\r\nexport enum NodeKind {\r\n\r\n SOURCE,\r\n\r\n // types\r\n TYPE,\r\n TYPEPARAMETER,\r\n PARAMETER,\r\n SIGNATURE,\r\n\r\n // expressions\r\n IDENTIFIER,\r\n ASSERTION,\r\n BINARY,\r\n CALL,\r\n CLASS,\r\n COMMA,\r\n ELEMENTACCESS,\r\n FALSE,\r\n FUNCTION,\r\n INSTANCEOF,\r\n LITERAL,\r\n NEW,\r\n NULL,\r\n PARENTHESIZED,\r\n PROPERTYACCESS,\r\n TERNARY,\r\n SUPER,\r\n THIS,\r\n TRUE,\r\n CONSTRUCTOR,\r\n UNARYPOSTFIX,\r\n UNARYPREFIX,\r\n\r\n // statements\r\n BLOCK,\r\n BREAK,\r\n CONTINUE,\r\n DO,\r\n EMPTY,\r\n EXPORT,\r\n EXPORTIMPORT,\r\n EXPRESSION,\r\n FOR,\r\n IF,\r\n IMPORT,\r\n RETURN,\r\n SWITCH,\r\n THROW,\r\n TRY,\r\n VARIABLE,\r\n VOID,\r\n WHILE,\r\n\r\n // declaration statements\r\n CLASSDECLARATION,\r\n ENUMDECLARATION,\r\n ENUMVALUEDECLARATION,\r\n FIELDDECLARATION,\r\n FUNCTIONDECLARATION,\r\n IMPORTDECLARATION,\r\n INDEXSIGNATUREDECLARATION,\r\n INTERFACEDECLARATION,\r\n METHODDECLARATION,\r\n NAMESPACEDECLARATION,\r\n TYPEDECLARATION,\r\n VARIABLEDECLARATION,\r\n\r\n // special\r\n DECORATOR,\r\n EXPORTMEMBER,\r\n SWITCHCASE,\r\n COMMENT\r\n}\r\n\r\n/** Checks if a node represents a constant value. */\r\nexport function nodeIsConstantValue(kind: NodeKind): bool {\r\n switch (kind) {\r\n case NodeKind.LITERAL:\r\n case NodeKind.NULL:\r\n case NodeKind.TRUE:\r\n case NodeKind.FALSE: return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Checks if a node might be callable. */\r\nexport function nodeIsCallable(kind: NodeKind): bool {\r\n switch (kind) {\r\n case NodeKind.IDENTIFIER:\r\n case NodeKind.CALL:\r\n case NodeKind.ELEMENTACCESS:\r\n case NodeKind.PROPERTYACCESS:\r\n case NodeKind.PARENTHESIZED: return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Checks if a node might be callable with generic arguments. */\r\nexport function nodeIsGenericCallable(kind: NodeKind): bool {\r\n switch (kind) {\r\n case NodeKind.IDENTIFIER:\r\n case NodeKind.PROPERTYACCESS: return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Base class of all nodes. */\r\nexport abstract class Node {\r\n\r\n /** Node kind indicator. */\r\n kind: NodeKind;\r\n /** Source range. */\r\n range: Range;\r\n /** Parent node. */\r\n parent: Node | null = null;\r\n /** Common flags indicating specific traits. */\r\n flags: CommonFlags = CommonFlags.NONE;\r\n\r\n /** Tests if this node has the specified flag or flags. */\r\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\r\n /** Tests if this node has one of the specified flags. */\r\n isAny(flag: CommonFlags): bool { return (this.flags & flag) != 0; }\r\n /** Sets a specific flag or flags. */\r\n set(flag: CommonFlags): void { this.flags |= flag; }\r\n\r\n // types\r\n\r\n static createType(\r\n name: IdentifierExpression,\r\n typeArguments: CommonTypeNode[] | null,\r\n isNullable: bool,\r\n range: Range\r\n ): TypeNode {\r\n var type = new TypeNode();\r\n type.range = range;\r\n type.name = name; name.parent = type;\r\n type.typeArguments = typeArguments; if (typeArguments) setParent(typeArguments, type);\r\n type.isNullable = isNullable;\r\n return type;\r\n }\r\n\r\n static createOmittedType(\r\n range: Range\r\n ): TypeNode {\r\n return Node.createType(\r\n Node.createIdentifierExpression(\"\", range),\r\n null,\r\n false,\r\n range\r\n );\r\n }\r\n\r\n static createTypeParameter(\r\n name: IdentifierExpression,\r\n extendsType: TypeNode | null,\r\n defaultType: TypeNode | null,\r\n range: Range\r\n ): TypeParameterNode {\r\n var elem = new TypeParameterNode();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n elem.extendsType = extendsType; if (extendsType) extendsType.parent = elem;\r\n elem.defaultType = defaultType; if (defaultType) defaultType.parent = elem;\r\n return elem;\r\n }\r\n\r\n static createParameter(\r\n name: IdentifierExpression,\r\n type: CommonTypeNode,\r\n initializer: Expression | null,\r\n kind: ParameterKind,\r\n range: Range\r\n ): ParameterNode {\r\n var elem = new ParameterNode();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n elem.type = type; if (type) type.parent = elem;\r\n elem.initializer = initializer; if (initializer) initializer.parent = elem;\r\n elem.parameterKind = kind;\r\n return elem;\r\n }\r\n\r\n static createSignature(\r\n parameters: ParameterNode[],\r\n returnType: CommonTypeNode,\r\n explicitThisType: TypeNode | null,\r\n isNullable: bool,\r\n range: Range\r\n ): SignatureNode {\r\n var sig = new SignatureNode();\r\n sig.range = range;\r\n sig.parameters = parameters; setParent(parameters, sig);\r\n sig.returnType = returnType; returnType.parent = sig;\r\n sig.explicitThisType = explicitThisType; if (explicitThisType) explicitThisType.parent = sig;\r\n sig.isNullable = isNullable;\r\n return sig;\r\n }\r\n\r\n // special\r\n\r\n static createDecorator(\r\n name: Expression,\r\n args: Expression[] | null,\r\n range: Range\r\n ): DecoratorNode {\r\n var stmt = new DecoratorNode();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.arguments = args; if (args) setParent(args, stmt);\r\n stmt.decoratorKind = decoratorNameToKind(name);\r\n return stmt;\r\n }\r\n\r\n static createComment(\r\n text: string,\r\n kind: CommentKind,\r\n range: Range\r\n ): CommentNode {\r\n var node = new CommentNode();\r\n node.range = range;\r\n node.commentKind = kind;\r\n node.text = text;\r\n return node;\r\n }\r\n\r\n // expressions\r\n\r\n static createIdentifierExpression(\r\n name: string,\r\n range: Range\r\n ): IdentifierExpression {\r\n var expr = new IdentifierExpression();\r\n expr.range = range;\r\n expr.text = name;\r\n return expr;\r\n }\r\n\r\n static createEmptyIdentifierExpression(\r\n range: Range\r\n ): IdentifierExpression {\r\n var expr = new IdentifierExpression();\r\n expr.range = range;\r\n expr.text = \"\";\r\n return expr;\r\n }\r\n\r\n static createArrayLiteralExpression(\r\n elements: (Expression | null)[],\r\n range: Range\r\n ): ArrayLiteralExpression {\r\n var expr = new ArrayLiteralExpression();\r\n expr.range = range;\r\n expr.elementExpressions = elements; setParentIfNotNull(elements, expr);\r\n return expr;\r\n }\r\n\r\n static createAssertionExpression(\r\n assertionKind: AssertionKind,\r\n expression: Expression,\r\n toType: CommonTypeNode,\r\n range: Range\r\n ): AssertionExpression {\r\n var expr = new AssertionExpression();\r\n expr.range = range;\r\n expr.assertionKind = assertionKind;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.toType = toType; toType.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createBinaryExpression(\r\n operator: Token,\r\n left: Expression,\r\n right: Expression,\r\n range: Range\r\n ): BinaryExpression {\r\n var expr = new BinaryExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.left = left; left.parent = expr;\r\n expr.right = right; right.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createCallExpression(\r\n expression: Expression,\r\n typeArgs: CommonTypeNode[] | null,\r\n args: Expression[],\r\n range: Range\r\n ): CallExpression {\r\n var expr = new CallExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\r\n expr.arguments = args; setParent(args, expr);\r\n return expr;\r\n }\r\n\r\n static createClassExpression(\r\n declaration: ClassDeclaration\r\n ): ClassExpression {\r\n var expr = new ClassExpression();\r\n expr.range = declaration.range;\r\n expr.declaration = declaration;\r\n return expr;\r\n }\r\n\r\n static createCommaExpression(\r\n expressions: Expression[],\r\n range: Range\r\n ): CommaExpression {\r\n var expr = new CommaExpression();\r\n expr.range = range;\r\n expr.expressions = expressions; setParent(expressions, expr);\r\n return expr;\r\n }\r\n\r\n static createConstructorExpression(\r\n range: Range\r\n ): ConstructorExpression {\r\n var expr = new ConstructorExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createElementAccessExpression(\r\n expression: Expression,\r\n element: Expression,\r\n range: Range\r\n ): ElementAccessExpression {\r\n var expr = new ElementAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.elementExpression = element; element.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createFalseExpression(\r\n range: Range\r\n ): FalseExpression {\r\n var expr = new FalseExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createFloatLiteralExpression(\r\n value: f64,\r\n range: Range\r\n ): FloatLiteralExpression {\r\n var expr = new FloatLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createFunctionExpression(\r\n declaration: FunctionDeclaration\r\n ): FunctionExpression {\r\n var expr = new FunctionExpression();\r\n expr.flags = declaration.flags & CommonFlags.ARROW;\r\n expr.range = declaration.range;\r\n expr.declaration = declaration;\r\n return expr;\r\n }\r\n\r\n static createInstanceOfExpression(\r\n expression: Expression,\r\n isType: CommonTypeNode,\r\n range: Range\r\n ): InstanceOfExpression {\r\n var expr = new InstanceOfExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.isType = isType; isType.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createIntegerLiteralExpression(\r\n value: I64,\r\n range: Range\r\n ): IntegerLiteralExpression {\r\n var expr = new IntegerLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createNewExpression(\r\n expression: Expression,\r\n typeArgs: CommonTypeNode[] | null,\r\n args: Expression[],\r\n range: Range\r\n ): NewExpression {\r\n var expr = new NewExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\r\n expr.arguments = args; setParent(args, expr);\r\n return expr;\r\n }\r\n\r\n static createNullExpression(\r\n range: Range\r\n ): NullExpression {\r\n var expr = new NullExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createObjectLiteralExpression(\r\n names: IdentifierExpression[],\r\n values: Expression[],\r\n range: Range\r\n ): ObjectLiteralExpression {\r\n var expr = new ObjectLiteralExpression();\r\n expr.range = range;\r\n expr.names = names;\r\n expr.values = values;\r\n return expr;\r\n }\r\n\r\n static createParenthesizedExpression(\r\n expression: Expression,\r\n range: Range\r\n ): ParenthesizedExpression {\r\n var expr = new ParenthesizedExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createPropertyAccessExpression(\r\n expression: Expression,\r\n property: IdentifierExpression,\r\n range: Range\r\n ): PropertyAccessExpression {\r\n var expr = new PropertyAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.property = property; property.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createRegexpLiteralExpression(\r\n pattern: string,\r\n flags: string,\r\n range: Range\r\n ): RegexpLiteralExpression {\r\n var expr = new RegexpLiteralExpression();\r\n expr.range = range;\r\n expr.pattern = pattern;\r\n expr.patternFlags = flags;\r\n return expr;\r\n }\r\n\r\n static createTernaryExpression(\r\n condition: Expression,\r\n ifThen: Expression,\r\n ifElse: Expression,\r\n range: Range\r\n ): TernaryExpression {\r\n var expr = new TernaryExpression();\r\n expr.range = range;\r\n expr.condition = condition; condition.parent = expr;\r\n expr.ifThen = ifThen; ifThen.parent = expr;\r\n expr.ifElse = ifElse; ifElse.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createStringLiteralExpression(\r\n value: string,\r\n range: Range\r\n ): StringLiteralExpression {\r\n var expr = new StringLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createSuperExpression(\r\n range: Range\r\n ): SuperExpression {\r\n var expr = new SuperExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createThisExpression(\r\n range: Range\r\n ): ThisExpression {\r\n var expr = new ThisExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createTrueExpression(\r\n range: Range\r\n ): TrueExpression {\r\n var expr = new TrueExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createUnaryPostfixExpression(\r\n operator: Token,\r\n operand: Expression,\r\n range: Range\r\n ): UnaryPostfixExpression {\r\n var expr = new UnaryPostfixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand; operand.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createUnaryPrefixExpression(\r\n operator: Token,\r\n operand: Expression,\r\n range: Range\r\n ): UnaryPrefixExpression {\r\n var expr = new UnaryPrefixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand; operand.parent = expr;\r\n return expr;\r\n }\r\n\r\n // statements\r\n\r\n static createBlockStatement(\r\n statements: Statement[],\r\n range: Range\r\n ): BlockStatement {\r\n var stmt = new BlockStatement();\r\n stmt.range = range;\r\n stmt.statements = statements; setParent(statements, stmt);\r\n return stmt;\r\n }\r\n\r\n static createBreakStatement(\r\n label: IdentifierExpression | null,\r\n range: Range\r\n ): BreakStatement {\r\n var stmt = new BreakStatement();\r\n stmt.range = range;\r\n stmt.label = label; if (label) label.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createClassDeclaration(\r\n identifier: IdentifierExpression,\r\n typeParameters: TypeParameterNode[],\r\n extendsType: TypeNode | null, // can't be a function\r\n implementsTypes: TypeNode[] | null, // can't be functions\r\n members: DeclarationStatement[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): ClassDeclaration {\r\n var stmt = new ClassDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = identifier; identifier.parent = stmt;\r\n stmt.typeParameters = typeParameters; setParent(typeParameters, stmt);\r\n stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\r\n stmt.implementsTypes = implementsTypes; if (implementsTypes) setParent(implementsTypes, stmt);\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createContinueStatement(\r\n label: IdentifierExpression | null,\r\n range: Range\r\n ): ContinueStatement {\r\n var stmt = new ContinueStatement();\r\n stmt.range = range;\r\n stmt.label = label; if (label) label.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createDoStatement(\r\n statement: Statement,\r\n condition: Expression,\r\n range: Range\r\n ): DoStatement {\r\n var stmt = new DoStatement();\r\n stmt.range = range;\r\n stmt.statement = statement; statement.parent = stmt;\r\n stmt.condition = condition; condition.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createEmptyStatement(\r\n range: Range\r\n ): EmptyStatement {\r\n var stmt = new EmptyStatement();\r\n stmt.range = range;\r\n return stmt;\r\n }\r\n\r\n static createEnumDeclaration(\r\n name: IdentifierExpression,\r\n members: EnumValueDeclaration[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): EnumDeclaration {\r\n var stmt = new EnumDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.values = members; setParent(members, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createEnumValueDeclaration(\r\n name: IdentifierExpression,\r\n value: Expression | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): EnumValueDeclaration {\r\n var stmt = new EnumValueDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.value = value; if (value) value.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createExportStatement(\r\n members: ExportMember[] | null,\r\n path: StringLiteralExpression | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): ExportStatement {\r\n var stmt = new ExportStatement();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.members = members; if (members) setParent(members, stmt);\r\n stmt.path = path;\r\n if (path) {\r\n let normalizedPath = normalizePath(path.value);\r\n if (path.value.startsWith(\".\")) { // relative\r\n stmt.normalizedPath = resolvePath(\r\n normalizedPath,\r\n range.source.normalizedPath\r\n );\r\n } else { // absolute\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n } else {\r\n stmt.normalizedPath = null;\r\n stmt.internalPath = null;\r\n }\r\n return stmt;\r\n }\r\n\r\n static createExportImportStatement(\r\n name: IdentifierExpression,\r\n externalName: IdentifierExpression,\r\n range: Range\r\n ): ExportImportStatement {\r\n var stmt = new ExportImportStatement();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.externalName = externalName; externalName.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createExportMember(\r\n name: IdentifierExpression,\r\n externalName: IdentifierExpression | null,\r\n range: Range\r\n ): ExportMember {\r\n var elem = new ExportMember();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n if (!externalName) {\r\n externalName = name;\r\n } else {\r\n externalName.parent = elem;\r\n }\r\n elem.externalName = externalName;\r\n return elem;\r\n }\r\n\r\n static createExpressionStatement(\r\n expression: Expression\r\n ): ExpressionStatement {\r\n var stmt = new ExpressionStatement();\r\n stmt.range = expression.range;\r\n stmt.expression = expression; expression.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createIfStatement(\r\n condition: Expression,\r\n ifTrue: Statement,\r\n ifFalse: Statement | null,\r\n range: Range\r\n ): IfStatement {\r\n var stmt = new IfStatement();\r\n stmt.range = range;\r\n stmt.condition = condition; condition.parent = stmt;\r\n stmt.ifTrue = ifTrue; ifTrue.parent = stmt;\r\n stmt.ifFalse = ifFalse; if (ifFalse) ifFalse.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createImportStatement(\r\n decls: ImportDeclaration[] | null,\r\n path: StringLiteralExpression,\r\n range: Range\r\n ): ImportStatement {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = decls; if (decls) setParent(decls, stmt);\r\n stmt.namespaceName = null;\r\n stmt.path = path;\r\n var normalizedPath = normalizePath(path.value);\r\n if (path.value.startsWith(\".\")) { // relative in project\r\n stmt.normalizedPath = resolvePath(\r\n normalizedPath,\r\n range.source.normalizedPath\r\n );\r\n } else { // absolute in library\r\n if (!normalizedPath.startsWith(LIBRARY_PREFIX)) {\r\n normalizedPath = LIBRARY_PREFIX + normalizedPath;\r\n }\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n }\r\n\r\n static createImportStatementWithWildcard(\r\n identifier: IdentifierExpression,\r\n path: StringLiteralExpression,\r\n range: Range\r\n ): ImportStatement {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = null;\r\n stmt.namespaceName = identifier;\r\n stmt.path = path;\r\n stmt.normalizedPath = resolvePath(\r\n normalizePath(path.value),\r\n range.source.normalizedPath\r\n );\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n }\r\n\r\n static createImportDeclaration(\r\n externalName: IdentifierExpression,\r\n name: IdentifierExpression | null,\r\n range: Range\r\n ): ImportDeclaration {\r\n var elem = new ImportDeclaration();\r\n elem.range = range;\r\n elem.externalName = externalName; externalName.parent = elem;\r\n if (!name) {\r\n name = externalName;\r\n } else {\r\n name.parent = elem;\r\n }\r\n elem.name = name;\r\n return elem;\r\n }\r\n\r\n static createInterfaceDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameterNode[],\r\n extendsType: TypeNode | null, // can't be a function\r\n members: DeclarationStatement[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): InterfaceDeclaration {\r\n var stmt = new InterfaceDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createFieldDeclaration(\r\n name: IdentifierExpression,\r\n type: CommonTypeNode | null,\r\n initializer: Expression | null,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): FieldDeclaration {\r\n var stmt = new FieldDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.type = type; if (type) type.parent = stmt;\r\n stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createForStatement(\r\n initializer: Statement | null,\r\n condition: Expression | null,\r\n incrementor: Expression | null,\r\n statement: Statement,\r\n range: Range\r\n ): ForStatement {\r\n var stmt = new ForStatement();\r\n stmt.range = range;\r\n stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\r\n stmt.condition = condition; if (condition) condition.parent = stmt;\r\n stmt.incrementor = incrementor; if (incrementor) incrementor.parent = stmt;\r\n stmt.statement = statement; statement.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createFunctionDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameterNode[] | null,\r\n signature: SignatureNode,\r\n body: Statement | null,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): FunctionDeclaration {\r\n var stmt = new FunctionDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n stmt.signature = signature; signature.parent = stmt;\r\n stmt.body = body; if (body) body.parent = stmt;\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createIndexSignatureDeclaration(\r\n keyType: TypeNode,\r\n valueType: CommonTypeNode,\r\n range: Range\r\n ): IndexSignatureDeclaration {\r\n var elem = new IndexSignatureDeclaration();\r\n elem.range = range;\r\n elem.keyType = keyType; keyType.parent = elem;\r\n elem.valueType = valueType; valueType.parent = elem;\r\n return elem;\r\n }\r\n\r\n static createMethodDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameterNode[] | null,\r\n signature: SignatureNode,\r\n body: Statement | null,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): MethodDeclaration {\r\n var stmt = new MethodDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n stmt.signature = signature; signature.parent = stmt;\r\n stmt.body = body; if (body) body.parent = stmt;\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createNamespaceDeclaration(\r\n name: IdentifierExpression,\r\n members: Statement[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): NamespaceDeclaration {\r\n var stmt = new NamespaceDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createReturnStatement(\r\n value: Expression | null,\r\n range: Range\r\n ): ReturnStatement {\r\n var stmt = new ReturnStatement();\r\n stmt.range = range;\r\n stmt.value = value; if (value) value.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createSwitchStatement(\r\n condition: Expression,\r\n cases: SwitchCase[],\r\n range: Range\r\n ): SwitchStatement {\r\n var stmt = new SwitchStatement();\r\n stmt.range = range;\r\n stmt.condition = condition; condition.parent = stmt;\r\n stmt.cases = cases; setParent(cases, stmt);\r\n return stmt;\r\n }\r\n\r\n static createSwitchCase(\r\n label: Expression | null,\r\n statements: Statement[],\r\n range: Range\r\n ): SwitchCase {\r\n var elem = new SwitchCase();\r\n elem.range = range;\r\n elem.label = label; if (label) label.parent = elem;\r\n elem.statements = statements; setParent(statements, elem);\r\n return elem;\r\n }\r\n\r\n static createThrowStatement(\r\n value: Expression,\r\n range: Range\r\n ): ThrowStatement {\r\n var stmt = new ThrowStatement();\r\n stmt.range = range;\r\n stmt.value = value; value.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createTryStatement(\r\n statements: Statement[],\r\n catchVariable: IdentifierExpression | null,\r\n catchStatements: Statement[] | null,\r\n finallyStatements: Statement[] | null,\r\n range: Range\r\n ): TryStatement {\r\n var stmt = new TryStatement();\r\n stmt.range = range;\r\n stmt.statements = statements; setParent(statements, stmt);\r\n stmt.catchVariable = catchVariable;\r\n if (catchVariable) catchVariable.parent = stmt;\r\n stmt.catchStatements = catchStatements;\r\n if (catchStatements) setParent(catchStatements, stmt);\r\n stmt.finallyStatements = finallyStatements;\r\n if (finallyStatements) setParent(finallyStatements, stmt);\r\n return stmt;\r\n }\r\n\r\n static createTypeDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameterNode[] | null,\r\n alias: CommonTypeNode,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): TypeDeclaration {\r\n var stmt = new TypeDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n stmt.type = alias; alias.parent = stmt;\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createVariableStatement(\r\n declarations: VariableDeclaration[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): VariableStatement {\r\n var stmt = new VariableStatement();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.declarations = declarations; setParent(declarations, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createVariableDeclaration(\r\n name: IdentifierExpression,\r\n type: CommonTypeNode | null,\r\n initializer: Expression | null,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): VariableDeclaration {\r\n var elem = new VariableDeclaration();\r\n elem.range = range;\r\n elem.flags = flags;\r\n elem.name = name; name.parent = elem;\r\n elem.type = type; if (type) type.parent = elem;\r\n elem.initializer = initializer; if (initializer) initializer.parent = elem;\r\n elem.decorators = decorators; // inherited\r\n return elem;\r\n }\r\n\r\n static createVoidStatement(\r\n expression: Expression,\r\n range: Range\r\n ): VoidStatement {\r\n var stmt = new VoidStatement();\r\n stmt.range = range;\r\n stmt.expression = expression;\r\n return stmt;\r\n }\r\n\r\n static createWhileStatement(\r\n condition: Expression,\r\n statement: Statement,\r\n range: Range\r\n ): WhileStatement {\r\n var stmt = new WhileStatement();\r\n stmt.range = range;\r\n stmt.condition = condition; condition.parent = stmt;\r\n stmt.statement = statement; statement.parent = stmt;\r\n return stmt;\r\n }\r\n}\r\n\r\n// types\r\n\r\nexport abstract class CommonTypeNode extends Node {\r\n // kind varies\r\n\r\n /** Whether nullable or not. */\r\n isNullable: bool;\r\n}\r\n\r\n/** Represents a type annotation. */\r\nexport class TypeNode extends CommonTypeNode {\r\n kind = NodeKind.TYPE;\r\n\r\n /** Identifier reference. */\r\n name: IdentifierExpression;\r\n /** Type argument references. */\r\n typeArguments: CommonTypeNode[] | null;\r\n}\r\n\r\n/** Represents a type parameter. */\r\nexport class TypeParameterNode extends Node {\r\n kind = NodeKind.TYPEPARAMETER;\r\n\r\n /** Identifier reference. */\r\n name: IdentifierExpression;\r\n /** Extended type reference, if any. */\r\n extendsType: TypeNode | null; // can't be a function\r\n /** Default type if omitted, if any. */\r\n defaultType: TypeNode | null; // can't be a function\r\n}\r\n\r\n/** Represents the kind of a parameter. */\r\nexport enum ParameterKind {\r\n /** No specific flags. */\r\n DEFAULT,\r\n /** Is an optional parameter. */\r\n OPTIONAL,\r\n /** Is a rest parameter. */\r\n REST\r\n}\r\n\r\n/** Represents a function parameter. */\r\nexport class ParameterNode extends Node {\r\n kind = NodeKind.PARAMETER;\r\n\r\n /** Parameter kind. */\r\n parameterKind: ParameterKind;\r\n /** Parameter name. */\r\n name: IdentifierExpression;\r\n /** Parameter type. */\r\n type: CommonTypeNode;\r\n /** Initializer expression, if present. */\r\n initializer: Expression | null;\r\n /** Implicit field declaration, if applicable. */\r\n implicitFieldDeclaration: FieldDeclaration | null = null;\r\n}\r\n\r\n/** Represents a function signature. */\r\nexport class SignatureNode extends CommonTypeNode {\r\n kind = NodeKind.SIGNATURE;\r\n\r\n /** Accepted parameters. */\r\n parameters: ParameterNode[];\r\n /** Return type. */\r\n returnType: CommonTypeNode;\r\n /** Explicitly provided this type, if any. */\r\n explicitThisType: TypeNode | null; // can't be a function\r\n}\r\n\r\n// special\r\n\r\n/** Built-in decorator kinds. */\r\nexport enum DecoratorKind {\r\n CUSTOM,\r\n GLOBAL,\r\n OPERATOR,\r\n OPERATOR_BINARY,\r\n OPERATOR_PREFIX,\r\n OPERATOR_POSTFIX,\r\n UNMANAGED,\r\n SEALED,\r\n INLINE,\r\n EXTERNAL,\r\n BUILTIN\r\n}\r\n\r\n/** Returns the kind of the specified decorator. Defaults to {@link DecoratorKind.CUSTOM}. */\r\nexport function decoratorNameToKind(name: Expression): DecoratorKind {\r\n // @global, @inline, @operator, @sealed, @unmanaged\r\n if (name.kind == NodeKind.IDENTIFIER) {\r\n let nameStr = (name).text;\r\n assert(nameStr.length);\r\n switch (nameStr.charCodeAt(0)) {\r\n case CharCode.b: {\r\n if (nameStr == \"builtin\") return DecoratorKind.BUILTIN;\r\n break;\r\n }\r\n case CharCode.e: {\r\n if (nameStr == \"external\") return DecoratorKind.EXTERNAL;\r\n break;\r\n }\r\n case CharCode.g: {\r\n if (nameStr == \"global\") return DecoratorKind.GLOBAL;\r\n break;\r\n }\r\n case CharCode.i: {\r\n if (nameStr == \"inline\") return DecoratorKind.INLINE;\r\n break;\r\n }\r\n case CharCode.o: {\r\n if (nameStr == \"operator\") return DecoratorKind.OPERATOR;\r\n break;\r\n }\r\n case CharCode.s: {\r\n if (nameStr == \"sealed\") return DecoratorKind.SEALED;\r\n break;\r\n }\r\n case CharCode.u: {\r\n if (nameStr == \"unmanaged\") return DecoratorKind.UNMANAGED;\r\n break;\r\n }\r\n }\r\n } else if (\r\n name.kind == NodeKind.PROPERTYACCESS &&\r\n (name).expression.kind == NodeKind.IDENTIFIER\r\n ) {\r\n let nameStr = ((name).expression).text;\r\n assert(nameStr.length);\r\n let propStr = (name).property.text;\r\n assert(propStr.length);\r\n // @operator.binary, @operator.prefix, @operator.postfix\r\n if (nameStr == \"operator\") {\r\n switch (propStr.charCodeAt(0)) {\r\n case CharCode.b: {\r\n if (propStr == \"binary\") return DecoratorKind.OPERATOR_BINARY;\r\n break;\r\n }\r\n case CharCode.p: {\r\n switch (propStr) {\r\n case \"prefix\": return DecoratorKind.OPERATOR_PREFIX;\r\n case \"postfix\": return DecoratorKind.OPERATOR_POSTFIX;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return DecoratorKind.CUSTOM;\r\n}\r\n\r\n/** Represents a decorator. */\r\nexport class DecoratorNode extends Node {\r\n kind = NodeKind.DECORATOR;\r\n\r\n /** Built-in kind, if applicable. */\r\n decoratorKind: DecoratorKind;\r\n /** Name expression. */\r\n name: Expression;\r\n /** Argument expressions. */\r\n arguments: Expression[] | null;\r\n}\r\n\r\n/** Comment kinds. */\r\nexport enum CommentKind {\r\n /** Line comment. */\r\n LINE,\r\n /** Triple-slash comment. */\r\n TRIPLE,\r\n /** Block comment. */\r\n BLOCK\r\n}\r\n\r\n/** Represents a comment. */\r\nexport class CommentNode extends Node {\r\n kind = NodeKind.COMMENT;\r\n\r\n /** Comment kind. */\r\n commentKind: CommentKind;\r\n /** Comment text. */\r\n text: string;\r\n}\r\n\r\n// expressions\r\n\r\n/** Base class of all expression nodes. */\r\nexport abstract class Expression extends Node { }\r\n\r\n/** Represents an identifier expression. */\r\nexport class IdentifierExpression extends Expression {\r\n kind = NodeKind.IDENTIFIER;\r\n\r\n /** Textual name. */\r\n text: string;\r\n}\r\n\r\n/** Indicates the kind of a literal. */\r\nexport enum LiteralKind {\r\n FLOAT,\r\n INTEGER,\r\n STRING,\r\n REGEXP,\r\n ARRAY,\r\n OBJECT\r\n}\r\n\r\n/** Base class of all literal expressions. */\r\nexport abstract class LiteralExpression extends Expression {\r\n kind = NodeKind.LITERAL;\r\n\r\n /** Specific literal kind. */\r\n literalKind: LiteralKind;\r\n}\r\n\r\n/** Represents an `[]` literal expression. */\r\nexport class ArrayLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.ARRAY;\r\n\r\n /** Nested element expressions. */\r\n elementExpressions: (Expression | null)[];\r\n}\r\n\r\n/** Indicates the kind of an assertion. */\r\nexport enum AssertionKind {\r\n PREFIX,\r\n AS\r\n}\r\n\r\n/** Represents an assertion expression. */\r\nexport class AssertionExpression extends Expression {\r\n kind = NodeKind.ASSERTION;\r\n\r\n /** Specific kind of this assertion. */\r\n assertionKind: AssertionKind;\r\n /** Expression being asserted. */\r\n expression: Expression;\r\n /** Target type. */\r\n toType: CommonTypeNode;\r\n}\r\n\r\n/** Represents a binary expression. */\r\nexport class BinaryExpression extends Expression {\r\n kind = NodeKind.BINARY;\r\n\r\n /** Operator token. */\r\n operator: Token;\r\n /** Left-hand side expression */\r\n left: Expression;\r\n /** Right-hand side expression. */\r\n right: Expression;\r\n}\r\n\r\n/** Represents a call expression. */\r\nexport class CallExpression extends Expression {\r\n kind = NodeKind.CALL;\r\n\r\n /** Called expression. Usually an identifier or property access expression. */\r\n expression: Expression;\r\n /** Provided type arguments. */\r\n typeArguments: CommonTypeNode[] | null;\r\n /** Provided arguments. */\r\n arguments: Expression[];\r\n}\r\n\r\n/** Represents a class expression using the 'class' keyword. */\r\nexport class ClassExpression extends Expression {\r\n kind = NodeKind.CLASS;\r\n\r\n /** Inline class declaration. */\r\n declaration: ClassDeclaration;\r\n}\r\n\r\n/** Represents a comma expression composed of multiple expressions. */\r\nexport class CommaExpression extends Expression {\r\n kind = NodeKind.COMMA;\r\n\r\n /** Sequential expressions. */\r\n expressions: Expression[];\r\n}\r\n\r\n/** Represents a `constructor` expression. */\r\nexport class ConstructorExpression extends IdentifierExpression {\r\n kind = NodeKind.CONSTRUCTOR;\r\n text = \"constructor\";\r\n}\r\n\r\n/** Represents an element access expression, e.g., array access. */\r\nexport class ElementAccessExpression extends Expression {\r\n kind = NodeKind.ELEMENTACCESS;\r\n\r\n /** Expression being accessed. */\r\n expression: Expression;\r\n /** Element of the expression being accessed. */\r\n elementExpression: Expression;\r\n}\r\n\r\n/** Represents a float literal expression. */\r\nexport class FloatLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.FLOAT;\r\n\r\n /** Float value. */\r\n value: f64;\r\n}\r\n\r\n/** Represents a function expression using the 'function' keyword. */\r\nexport class FunctionExpression extends Expression {\r\n kind = NodeKind.FUNCTION;\r\n\r\n /** Inline function declaration. */\r\n declaration: FunctionDeclaration;\r\n}\r\n\r\n/** Represents an `instanceof` expression. */\r\nexport class InstanceOfExpression extends Expression {\r\n kind = NodeKind.INSTANCEOF;\r\n\r\n /** Expression being asserted. */\r\n expression: Expression;\r\n /** Type to test for. */\r\n isType: CommonTypeNode;\r\n}\r\n\r\n/** Represents an integer literal expression. */\r\nexport class IntegerLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.INTEGER;\r\n\r\n /** Integer value. */\r\n value: I64;\r\n}\r\n\r\n/** Represents a `new` expression. Like a call but with its own kind. */\r\nexport class NewExpression extends CallExpression {\r\n kind = NodeKind.NEW;\r\n}\r\n\r\n/** Represents a `null` expression. */\r\nexport class NullExpression extends IdentifierExpression {\r\n kind = NodeKind.NULL;\r\n text = \"null\";\r\n}\r\n\r\n/** Represents an object literal expression. */\r\nexport class ObjectLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.OBJECT;\r\n\r\n /** Field names. */\r\n names: IdentifierExpression[];\r\n /** Field values. */\r\n values: Expression[];\r\n}\r\n\r\n/** Represents a parenthesized expression. */\r\nexport class ParenthesizedExpression extends Expression {\r\n kind = NodeKind.PARENTHESIZED;\r\n\r\n /** Expression in parenthesis. */\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a property access expression. */\r\nexport class PropertyAccessExpression extends Expression {\r\n kind = NodeKind.PROPERTYACCESS;\r\n\r\n /** Expression being accessed. */\r\n expression: Expression;\r\n /** Property of the expression being accessed. */\r\n property: IdentifierExpression;\r\n}\r\n\r\n/** Represents a regular expression literal expression. */\r\nexport class RegexpLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.REGEXP;\r\n\r\n /** Regular expression pattern. */\r\n pattern: string;\r\n /** Regular expression flags. */\r\n patternFlags: string;\r\n}\r\n\r\n/** Represents a ternary expression, i.e., short if notation. */\r\nexport class TernaryExpression extends Expression {\r\n kind = NodeKind.TERNARY;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Expression executed when condition is `true`. */\r\n ifThen: Expression;\r\n /** Expression executed when condition is `false`. */\r\n ifElse: Expression;\r\n}\r\n\r\n/** Represents a string literal expression. */\r\nexport class StringLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.STRING;\r\n\r\n /** String value without quotes. */\r\n value: string;\r\n}\r\n\r\n/** Represents a `super` expression. */\r\nexport class SuperExpression extends IdentifierExpression {\r\n kind = NodeKind.SUPER;\r\n text = \"super\";\r\n}\r\n\r\n/** Represents a `this` expression. */\r\nexport class ThisExpression extends IdentifierExpression {\r\n kind = NodeKind.THIS;\r\n text = \"this\";\r\n}\r\n\r\n/** Represents a `true` expression. */\r\nexport class TrueExpression extends IdentifierExpression {\r\n kind = NodeKind.TRUE;\r\n text = \"true\";\r\n}\r\n\r\n/** Represents a `false` expression. */\r\nexport class FalseExpression extends IdentifierExpression {\r\n kind = NodeKind.FALSE;\r\n text = \"false\";\r\n}\r\n\r\n/** Base class of all unary expressions. */\r\nexport abstract class UnaryExpression extends Expression {\r\n\r\n /** Operator token. */\r\n operator: Token;\r\n /** Operand expression. */\r\n operand: Expression;\r\n}\r\n\r\n/** Represents a unary postfix expression, e.g. a postfix increment. */\r\nexport class UnaryPostfixExpression extends UnaryExpression {\r\n kind = NodeKind.UNARYPOSTFIX;\r\n}\r\n\r\n/** Represents a unary prefix expression, e.g. a negation. */\r\nexport class UnaryPrefixExpression extends UnaryExpression {\r\n kind = NodeKind.UNARYPREFIX;\r\n}\r\n\r\n// statements\r\n\r\nexport function isLastStatement(statement: Statement): bool {\r\n var parent = assert(statement.parent);\r\n if (parent.kind == NodeKind.BLOCK) {\r\n let statements = (parent).statements;\r\n if (statements[statements.length - 1] === statement) {\r\n switch (assert(parent.parent).kind) {\r\n case NodeKind.FUNCTIONDECLARATION:\r\n case NodeKind.METHODDECLARATION: return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/** Base class of all statement nodes. */\r\nexport abstract class Statement extends Node { }\r\n\r\n/** Indicates the specific kind of a source. */\r\nexport enum SourceKind {\r\n /** Default source. Usually imported from an entry file. */\r\n DEFAULT,\r\n /** Entry file. */\r\n ENTRY,\r\n /** Library file. */\r\n LIBRARY\r\n}\r\n\r\n/** A top-level source node. */\r\nexport class Source extends Node {\r\n kind = NodeKind.SOURCE;\r\n parent = null;\r\n\r\n /** Source kind. */\r\n sourceKind: SourceKind;\r\n /** Normalized path. */\r\n normalizedPath: string;\r\n /** Path used internally. */\r\n internalPath: string;\r\n /** Simple path (last part without extension). */\r\n simplePath: string;\r\n /** Contained statements. */\r\n statements: Statement[];\r\n /** Full source text. */\r\n text: string;\r\n /** Tokenizer reference. */\r\n tokenizer: Tokenizer | null = null;\r\n /** Source map index. */\r\n debugInfoIndex: i32 = -1;\r\n /** Re-exported sources. */\r\n exportPaths: Set | null = null;\r\n\r\n /** Constructs a new source node. */\r\n constructor(normalizedPath: string, text: string, kind: SourceKind) {\r\n super();\r\n this.sourceKind = kind;\r\n this.normalizedPath = normalizedPath;\r\n var internalPath = mangleInternalPath(this.normalizedPath);\r\n this.internalPath = internalPath;\r\n var pos = internalPath.lastIndexOf(PATH_DELIMITER);\r\n this.simplePath = pos >= 0 ? internalPath.substring(pos + 1) : internalPath;\r\n this.statements = new Array();\r\n this.range = new Range(this, 0, text.length);\r\n this.text = text;\r\n }\r\n\r\n /** Tests if this source is an entry file. */\r\n get isEntry(): bool { return this.sourceKind == SourceKind.ENTRY; }\r\n /** Tests if this source is a stdlib file. */\r\n get isLibrary(): bool { return this.sourceKind == SourceKind.LIBRARY; }\r\n}\r\n\r\n/** Base class of all declaration statements. */\r\nexport abstract class DeclarationStatement extends Statement {\r\n\r\n /** Simple name being declared. */\r\n name: IdentifierExpression;\r\n /** Array of decorators. */\r\n decorators: DecoratorNode[] | null = null;\r\n\r\n protected cachedProgramLevelInternalName: string | null = null;\r\n protected cachedFileLevelInternalName: string | null = null;\r\n\r\n /** Gets the mangled program-level internal name of this declaration. */\r\n get programLevelInternalName(): string {\r\n if (!this.cachedProgramLevelInternalName) {\r\n this.cachedProgramLevelInternalName = mangleInternalName(this, true);\r\n }\r\n return this.cachedProgramLevelInternalName;\r\n }\r\n\r\n /** Gets the mangled file-level internal name of this declaration. */\r\n get fileLevelInternalName(): string {\r\n if (!this.cachedFileLevelInternalName) {\r\n this.cachedFileLevelInternalName = mangleInternalName(this, false);\r\n }\r\n return this.cachedFileLevelInternalName;\r\n }\r\n\r\n /** Tests if this is a top-level declaration within its source file. */\r\n get isTopLevel(): bool {\r\n var parent = this.parent;\r\n if (!parent) {\r\n return false;\r\n }\r\n if (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent)) {\r\n return false;\r\n }\r\n return parent.kind == NodeKind.SOURCE;\r\n }\r\n\r\n /** Tests if this declaration is a top-level export within its source file. */\r\n get isTopLevelExport(): bool {\r\n var parent = this.parent;\r\n if (!parent || (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent))) {\r\n return false;\r\n }\r\n if (parent.kind == NodeKind.NAMESPACEDECLARATION) {\r\n return this.is(CommonFlags.EXPORT) && (parent).isTopLevelExport;\r\n }\r\n if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n return this.is(CommonFlags.STATIC) && (parent).isTopLevelExport;\r\n }\r\n return parent.kind == NodeKind.SOURCE && this.is(CommonFlags.EXPORT);\r\n }\r\n\r\n /** Tests if this declaration needs an explicit export. */\r\n needsExplicitExport(member: ExportMember): bool {\r\n // This is necessary because module-level exports are automatically created\r\n // for top level declarations of all sorts. This function essentially tests\r\n // that there isn't a otherwise duplicate top-level export already.\r\n return (\r\n member.name.text != member.externalName.text || // if aliased\r\n this.range.source != member.range.source || // if a re-export\r\n !this.isTopLevelExport // if not top-level\r\n );\r\n }\r\n}\r\n\r\n/** Represents an index signature declaration. */\r\nexport class IndexSignatureDeclaration extends DeclarationStatement {\r\n kind = NodeKind.INDEXSIGNATUREDECLARATION;\r\n\r\n /** Key type. */\r\n keyType: TypeNode;\r\n /** Value type. */\r\n valueType: CommonTypeNode;\r\n}\r\n\r\n/** Base class of all variable-like declaration statements. */\r\nexport abstract class VariableLikeDeclarationStatement extends DeclarationStatement {\r\n\r\n /** Variable type. */\r\n type: CommonTypeNode | null;\r\n /** Variable initializer. */\r\n initializer: Expression | null;\r\n}\r\n\r\n/** Represents a block statement. */\r\nexport class BlockStatement extends Statement {\r\n kind = NodeKind.BLOCK;\r\n\r\n /** Contained statements. */\r\n statements: Statement[];\r\n}\r\n\r\n/** Represents a `break` statement. */\r\nexport class BreakStatement extends Statement {\r\n kind = NodeKind.BREAK;\r\n\r\n /** Target label, if applicable. */\r\n label: IdentifierExpression | null;\r\n}\r\n\r\n/** Represents a `class` declaration. */\r\nexport class ClassDeclaration extends DeclarationStatement {\r\n kind = NodeKind.CLASSDECLARATION;\r\n\r\n /** Accepted type parameters. */\r\n typeParameters: TypeParameterNode[];\r\n /** Base class type being extended, if any. */\r\n extendsType: TypeNode | null; // can't be a function\r\n /** Interface types being implemented, if any. */\r\n implementsTypes: TypeNode[] | null; // can't be functions\r\n /** Class member declarations. */\r\n members: DeclarationStatement[];\r\n\r\n get isGeneric(): bool {\r\n var typeParameters = this.typeParameters;\r\n return typeParameters != null && typeParameters.length > 0;\r\n }\r\n}\r\n\r\n/** Represents a `continue` statement. */\r\nexport class ContinueStatement extends Statement {\r\n kind = NodeKind.CONTINUE;\r\n\r\n /** Target label, if applicable. */\r\n label: IdentifierExpression | null;\r\n}\r\n\r\n/** Represents a `do` statement. */\r\nexport class DoStatement extends Statement {\r\n kind = NodeKind.DO;\r\n\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n /** Condition when to repeat. */\r\n condition: Expression;\r\n}\r\n\r\n/** Represents an empty statement, i.e., a semicolon terminating nothing. */\r\nexport class EmptyStatement extends Statement {\r\n kind = NodeKind.EMPTY;\r\n}\r\n\r\n/** Represents an `enum` declaration. */\r\nexport class EnumDeclaration extends DeclarationStatement {\r\n kind = NodeKind.ENUMDECLARATION;\r\n\r\n /** Enum value declarations. */\r\n values: EnumValueDeclaration[];\r\n}\r\n\r\n/** Represents a value of an `enum` declaration. */\r\nexport class EnumValueDeclaration extends DeclarationStatement {\r\n kind = NodeKind.ENUMVALUEDECLARATION;\r\n // name is inherited\r\n\r\n /** Value expression. */\r\n value: Expression | null;\r\n}\r\n\r\n/** Represents an `export import` statement of an interface. */\r\nexport class ExportImportStatement extends Node {\r\n kind = NodeKind.EXPORTIMPORT;\r\n\r\n /** Identifier being imported. */\r\n name: IdentifierExpression;\r\n /** Identifier being exported. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents a member of an `export` statement. */\r\nexport class ExportMember extends Node {\r\n kind = NodeKind.EXPORTMEMBER;\r\n\r\n /** Identifier being exported. */\r\n name: IdentifierExpression;\r\n /** Identifier seen when imported again. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `export` statement. */\r\nexport class ExportStatement extends Statement {\r\n kind = NodeKind.EXPORT;\r\n\r\n /** Array of members if a set of named exports, or `null` if a filespace export. */\r\n members: ExportMember[] | null;\r\n /** Path being exported from, if applicable. */\r\n path: StringLiteralExpression | null;\r\n /** Normalized path, if `path` is set. */\r\n normalizedPath: string | null;\r\n /** Mangled internal path being referenced, if `path` is set. */\r\n internalPath: string | null;\r\n}\r\n\r\n/** Represents an expression that is used as a statement. */\r\nexport class ExpressionStatement extends Statement {\r\n kind = NodeKind.EXPRESSION;\r\n\r\n /** Expression being used as a statement.*/\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a field declaration within a `class`. */\r\nexport class FieldDeclaration extends VariableLikeDeclarationStatement {\r\n kind = NodeKind.FIELDDECLARATION;\r\n\r\n /** Parameter index within the constructor, if applicable. */\r\n parameterIndex: i32 = -1;\r\n}\r\n\r\n/** Represents a `for` statement. */\r\nexport class ForStatement extends Statement {\r\n kind = NodeKind.FOR;\r\n\r\n /**\r\n * Initializer statement, if present.\r\n * Either a {@link VariableStatement} or {@link ExpressionStatement}.\r\n */\r\n initializer: Statement | null;\r\n /** Condition expression, if present. */\r\n condition: Expression | null;\r\n /** Incrementor expression, if present. */\r\n incrementor: Expression | null;\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n}\r\n\r\n/** Represents a `function` declaration. */\r\nexport class FunctionDeclaration extends DeclarationStatement {\r\n kind = NodeKind.FUNCTIONDECLARATION;\r\n\r\n /** Type parameters, if any. */\r\n typeParameters: TypeParameterNode[] | null;\r\n /** Function signature. */\r\n signature: SignatureNode;\r\n /** Body statement. Usually a block. */\r\n body: Statement | null;\r\n\r\n get isGeneric(): bool {\r\n var typeParameters = this.typeParameters;\r\n return typeParameters != null && typeParameters.length > 0;\r\n }\r\n}\r\n\r\n/** Represents an `if` statement. */\r\nexport class IfStatement extends Statement {\r\n kind = NodeKind.IF;\r\n\r\n /** Condition. */\r\n condition: Expression;\r\n /** Statement executed when condition is `true`. */\r\n ifTrue: Statement;\r\n /** Statement executed when condition is `false`. */\r\n ifFalse: Statement | null;\r\n}\r\n\r\n/** Represents an `import` declaration part of an {@link ImportStatement}. */\r\nexport class ImportDeclaration extends DeclarationStatement {\r\n kind = NodeKind.IMPORTDECLARATION;\r\n\r\n /** Identifier being imported. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `import` statement. */\r\nexport class ImportStatement extends Statement {\r\n kind = NodeKind.IMPORT;\r\n\r\n /** Array of member declarations or `null` if an asterisk import. */\r\n declarations: ImportDeclaration[] | null;\r\n /** Name of the local namespace, if an asterisk import. */\r\n namespaceName: IdentifierExpression | null;\r\n /** Path being imported from. */\r\n path: StringLiteralExpression;\r\n /** Normalized path. */\r\n normalizedPath: string;\r\n /** Mangled internal path being referenced. */\r\n internalPath: string;\r\n}\r\n\r\n/** Represents an `interfarce` declaration. */\r\nexport class InterfaceDeclaration extends ClassDeclaration {\r\n kind = NodeKind.INTERFACEDECLARATION;\r\n}\r\n\r\n/** Represents a method declaration within a `class`. */\r\nexport class MethodDeclaration extends FunctionDeclaration {\r\n kind = NodeKind.METHODDECLARATION;\r\n}\r\n\r\n/** Represents a `namespace` declaration. */\r\nexport class NamespaceDeclaration extends DeclarationStatement {\r\n kind = NodeKind.NAMESPACEDECLARATION;\r\n\r\n /** Array of namespace members. */\r\n members: Statement[];\r\n}\r\n\r\n/** Represents a `return` statement. */\r\nexport class ReturnStatement extends Statement {\r\n kind = NodeKind.RETURN;\r\n\r\n /** Value expression being returned, if present. */\r\n value: Expression | null;\r\n}\r\n\r\n/** Represents a single `case` within a `switch` statement. */\r\nexport class SwitchCase extends Node {\r\n kind = NodeKind.SWITCHCASE;\r\n\r\n /** Label expression. `null` indicates the default case. */\r\n label: Expression | null;\r\n /** Contained statements. */\r\n statements: Statement[];\r\n}\r\n\r\n/** Represents a `switch` statement. */\r\nexport class SwitchStatement extends Statement {\r\n kind = NodeKind.SWITCH;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Contained cases. */\r\n cases: SwitchCase[];\r\n}\r\n\r\n/** Represents a `throw` statement. */\r\nexport class ThrowStatement extends Statement {\r\n kind = NodeKind.THROW;\r\n\r\n /** Value expression being thrown. */\r\n value: Expression;\r\n}\r\n\r\n/** Represents a `try` statement. */\r\nexport class TryStatement extends Statement {\r\n kind = NodeKind.TRY;\r\n\r\n /** Contained statements. */\r\n statements: Statement[];\r\n /** Exception variable name, if a `catch` clause is present. */\r\n catchVariable: IdentifierExpression | null;\r\n /** Statements being executed on catch, if a `catch` clause is present. */\r\n catchStatements: Statement[] | null;\r\n /** Statements being executed afterwards, if a `finally` clause is present. */\r\n finallyStatements: Statement[] | null;\r\n}\r\n\r\n/** Represents a `type` declaration. */\r\nexport class TypeDeclaration extends DeclarationStatement {\r\n kind = NodeKind.TYPEDECLARATION;\r\n\r\n /** Type parameters, if any. */\r\n typeParameters: TypeParameterNode[] | null;\r\n /** Type being aliased. */\r\n type: CommonTypeNode;\r\n}\r\n\r\n/** Represents a variable declaration part of a {@link VariableStatement}. */\r\nexport class VariableDeclaration extends VariableLikeDeclarationStatement {\r\n kind = NodeKind.VARIABLEDECLARATION;\r\n}\r\n\r\n/** Represents a variable statement wrapping {@link VariableDeclaration}s. */\r\nexport class VariableStatement extends Statement {\r\n kind = NodeKind.VARIABLE;\r\n\r\n /** Array of decorators. */\r\n decorators: DecoratorNode[] | null;\r\n /** Array of member declarations. */\r\n declarations: VariableDeclaration[];\r\n}\r\n\r\n/** Represents a void statement dropping an expression's value. */\r\nexport class VoidStatement extends Statement {\r\n kind = NodeKind.VOID;\r\n\r\n /** Expression being dropped. */\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a `while` statement. */\r\nexport class WhileStatement extends Statement {\r\n kind = NodeKind.WHILE;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n}\r\n\r\n/** Finds the first decorator matching the specified kind. */\r\nexport function findDecorator(kind: DecoratorKind, decorators: DecoratorNode[] | null): DecoratorNode | null {\r\n if (decorators) {\r\n for (let i = 0, k = decorators.length; i < k; ++i) {\r\n let decorator = decorators[i];\r\n if (decorator.decoratorKind == kind) return decorator;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** Mangles a declaration's name to an internal name. */\r\nexport function mangleInternalName(declaration: DeclarationStatement, asGlobal: bool = false): string {\r\n var name = declaration.name.text;\r\n var parent = declaration.parent;\r\n if (!parent) return name;\r\n if (\r\n declaration.kind == NodeKind.VARIABLEDECLARATION &&\r\n parent.kind == NodeKind.VARIABLE\r\n ) { // skip over\r\n if (!(parent = parent.parent)) return name;\r\n }\r\n if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n return mangleInternalName(parent, asGlobal) + (\r\n declaration.is(CommonFlags.STATIC)\r\n ? STATIC_DELIMITER\r\n : INSTANCE_DELIMITER\r\n ) + name;\r\n }\r\n if (\r\n parent.kind == NodeKind.NAMESPACEDECLARATION ||\r\n parent.kind == NodeKind.ENUMDECLARATION\r\n ) {\r\n return mangleInternalName(parent, asGlobal) +\r\n STATIC_DELIMITER + name;\r\n }\r\n return asGlobal\r\n ? name\r\n : declaration.range.source.internalPath + PATH_DELIMITER + name;\r\n}\r\n\r\n/** Mangles an external to an internal path. */\r\nexport function mangleInternalPath(path: string): string {\r\n if (path.endsWith(\".ts\")) path = path.substring(0, path.length - 3);\r\n return path;\r\n}\r\n\r\n// Helpers\r\n\r\n/** Sets the parent node on an array of nodes. */\r\nfunction setParent(nodes: Node[], parent: Node): void {\r\n for (let i = 0, k = nodes.length; i < k; ++i) {\r\n nodes[i].parent = parent;\r\n }\r\n}\r\n\r\n/** Sets the parent node on an array of nullable nodes. */\r\nfunction setParentIfNotNull(nodes: (Node | null)[], parent: Node): void {\r\n for (let i = 0, k = nodes.length; i < k; ++i) {\r\n let node = nodes[i];\r\n if (node) node.parent = parent;\r\n }\r\n}\r\n","/**\r\n * AssemblyScript's intermediate representation describing a program's elements.\r\n * @module program\r\n *//***/\r\n\r\nimport {\r\n CommonFlags,\r\n PATH_DELIMITER,\r\n STATIC_DELIMITER,\r\n INSTANCE_DELIMITER,\r\n LIBRARY_PREFIX,\r\n GETTER_PREFIX,\r\n SETTER_PREFIX,\r\n FILESPACE_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n Options,\r\n Feature\r\n} from \"./compiler\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticMessage,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags,\r\n Signature\r\n} from \"./types\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n Source,\r\n Range,\r\n CommonTypeNode,\r\n TypeParameterNode,\r\n DecoratorNode,\r\n DecoratorKind,\r\n\r\n Expression,\r\n IdentifierExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n StringLiteralExpression,\r\n\r\n ClassDeclaration,\r\n DeclarationStatement,\r\n EnumDeclaration,\r\n EnumValueDeclaration,\r\n ExportMember,\r\n ExportStatement,\r\n FieldDeclaration,\r\n FunctionDeclaration,\r\n ImportDeclaration,\r\n ImportStatement,\r\n InterfaceDeclaration,\r\n MethodDeclaration,\r\n NamespaceDeclaration,\r\n TypeDeclaration,\r\n VariableDeclaration,\r\n VariableLikeDeclarationStatement,\r\n VariableStatement,\r\n\r\n decoratorNameToKind,\r\n findDecorator\r\n} from \"./ast\";\r\n\r\nimport {\r\n Module,\r\n NativeType,\r\n FunctionRef,\r\n ExpressionRef,\r\n ExpressionId,\r\n BinaryOp,\r\n UnaryOp,\r\n\r\n getExpressionId,\r\n getGetLocalIndex,\r\n isTeeLocal,\r\n getSetLocalValue,\r\n getBinaryOp,\r\n getConstValueI32,\r\n getBinaryLeft,\r\n getBinaryRight,\r\n getUnaryOp,\r\n getExpressionType,\r\n getLoadBytes,\r\n isLoadSigned,\r\n getIfTrue,\r\n getIfFalse,\r\n getSelectThen,\r\n getSelectElse,\r\n getCallTarget,\r\n getBlockChildCount,\r\n getBlockChild,\r\n getBlockName,\r\n getConstValueF32,\r\n getConstValueF64,\r\n getConstValueI64Low,\r\n getGetGlobalName\r\n} from \"./module\";\r\n\r\nimport {\r\n CharCode\r\n} from \"./util\";\r\n\r\nimport {\r\n Resolver\r\n} from \"./resolver\";\r\n\r\n/** Represents a yet unresolved import. */\r\nclass QueuedImport {\r\n localName: string;\r\n externalName: string;\r\n externalNameAlt: string;\r\n declaration: ImportDeclaration | null; // not set if a filespace\r\n}\r\n\r\n/** Represents a yet unresolved export. */\r\nclass QueuedExport {\r\n externalName: string;\r\n isReExport: bool;\r\n member: ExportMember;\r\n}\r\n\r\n/** Represents a type alias. */\r\nclass TypeAlias {\r\n typeParameters: TypeParameterNode[] | null;\r\n type: CommonTypeNode;\r\n}\r\n\r\n/** Represents a module-level export. */\r\nclass ModuleExport {\r\n element: Element;\r\n identifier: IdentifierExpression;\r\n}\r\n\r\n/** Represents the kind of an operator overload. */\r\nexport enum OperatorKind {\r\n INVALID,\r\n\r\n // indexed access\r\n INDEXED_GET, // a[]\r\n INDEXED_SET, // a[]=b\r\n UNCHECKED_INDEXED_GET, // unchecked(a[])\r\n UNCHECKED_INDEXED_SET, // unchecked(a[]=b)\r\n\r\n // binary\r\n ADD, // a + b\r\n SUB, // a - b\r\n MUL, // a * b\r\n DIV, // a / b\r\n REM, // a % b\r\n POW, // a ** b\r\n BITWISE_AND, // a & b\r\n BITWISE_OR, // a | b\r\n BITWISE_XOR, // a ^ b\r\n BITWISE_SHL, // a << b\r\n BITWISE_SHR, // a >> b\r\n BITWISE_SHR_U, // a >>> b\r\n EQ, // a == b\r\n NE, // a != b\r\n GT, // a > b\r\n GE, // a >= b\r\n LT, // a < b\r\n LE, // a <= b\r\n\r\n // unary prefix\r\n PLUS, // +a\r\n MINUS, // -a\r\n NOT, // !a\r\n BITWISE_NOT, // ~a\r\n PREFIX_INC, // ++a\r\n PREFIX_DEC, // --a\r\n\r\n // unary postfix\r\n POSTFIX_INC, // a++\r\n POSTFIX_DEC // a--\r\n\r\n // not overridable:\r\n // IDENTITY // a === b\r\n // LOGICAL_AND // a && b\r\n // LOGICAL_OR // a || b\r\n}\r\n\r\n/** Returns the operator kind represented by the specified decorator and string argument. */\r\nfunction operatorKindFromDecorator(decoratorKind: DecoratorKind, arg: string): OperatorKind {\r\n assert(arg.length);\r\n switch (decoratorKind) {\r\n case DecoratorKind.OPERATOR:\r\n case DecoratorKind.OPERATOR_BINARY: {\r\n switch (arg.charCodeAt(0)) {\r\n case CharCode.OPENBRACKET: {\r\n if (arg == \"[]\") return OperatorKind.INDEXED_GET;\r\n if (arg == \"[]=\") return OperatorKind.INDEXED_SET;\r\n break;\r\n }\r\n case CharCode.OPENBRACE: {\r\n if (arg == \"{}\") return OperatorKind.UNCHECKED_INDEXED_GET;\r\n if (arg == \"{}=\") return OperatorKind.UNCHECKED_INDEXED_SET;\r\n break;\r\n }\r\n case CharCode.PLUS: {\r\n if (arg == \"+\") return OperatorKind.ADD;\r\n break;\r\n }\r\n case CharCode.MINUS: {\r\n if (arg == \"-\") return OperatorKind.SUB;\r\n break;\r\n }\r\n case CharCode.ASTERISK: {\r\n if (arg == \"*\") return OperatorKind.MUL;\r\n if (arg == \"**\") return OperatorKind.POW;\r\n break;\r\n }\r\n case CharCode.SLASH: {\r\n if (arg == \"/\") return OperatorKind.DIV;\r\n break;\r\n }\r\n case CharCode.PERCENT: {\r\n if (arg == \"%\") return OperatorKind.REM;\r\n break;\r\n }\r\n case CharCode.AMPERSAND: {\r\n if (arg == \"&\") return OperatorKind.BITWISE_AND;\r\n break;\r\n }\r\n case CharCode.BAR: {\r\n if (arg == \"|\") return OperatorKind.BITWISE_OR;\r\n break;\r\n }\r\n case CharCode.CARET: {\r\n if (arg == \"^\") return OperatorKind.BITWISE_XOR;\r\n break;\r\n }\r\n case CharCode.EQUALS: {\r\n if (arg == \"==\") return OperatorKind.EQ;\r\n break;\r\n }\r\n case CharCode.EXCLAMATION: {\r\n if (arg == \"!=\") return OperatorKind.NE;\r\n break;\r\n }\r\n case CharCode.GREATERTHAN: {\r\n if (arg == \">\") return OperatorKind.GT;\r\n if (arg == \">=\") return OperatorKind.GE;\r\n if (arg == \">>\") return OperatorKind.BITWISE_SHR;\r\n if (arg == \">>>\") return OperatorKind.BITWISE_SHR_U;\r\n break;\r\n }\r\n case CharCode.LESSTHAN: {\r\n if (arg == \"<\") return OperatorKind.LT;\r\n if (arg == \"<=\") return OperatorKind.LE;\r\n if (arg == \"<<\") return OperatorKind.BITWISE_SHL;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n case DecoratorKind.OPERATOR_PREFIX: {\r\n switch (arg.charCodeAt(0)) {\r\n case CharCode.PLUS: {\r\n if (arg == \"+\") return OperatorKind.PLUS;\r\n if (arg == \"++\") return OperatorKind.PREFIX_INC;\r\n break;\r\n }\r\n case CharCode.MINUS: {\r\n if (arg == \"-\") return OperatorKind.MINUS;\r\n if (arg == \"--\") return OperatorKind.PREFIX_DEC;\r\n break;\r\n }\r\n case CharCode.EXCLAMATION: {\r\n if (arg == \"!\") return OperatorKind.NOT;\r\n break;\r\n }\r\n case CharCode.TILDE: {\r\n if (arg == \"~\") return OperatorKind.BITWISE_NOT;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n case DecoratorKind.OPERATOR_POSTFIX: {\r\n switch (arg.charCodeAt(0)) {\r\n case CharCode.PLUS: {\r\n if (arg == \"++\") return OperatorKind.POSTFIX_INC;\r\n break;\r\n }\r\n case CharCode.MINUS: {\r\n if (arg == \"--\") return OperatorKind.POSTFIX_DEC;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n return OperatorKind.INVALID;\r\n}\r\n\r\nconst noTypesYet = new Map();\r\n\r\n/** Represents an AssemblyScript program. */\r\nexport class Program extends DiagnosticEmitter {\r\n\r\n /** Array of source files. */\r\n sources: Source[];\r\n /** Resolver instance. */\r\n resolver: Resolver;\r\n /** Diagnostic offset used where successively obtaining the next diagnostic. */\r\n diagnosticsOffset: i32 = 0;\r\n /** Compiler options. */\r\n options: Options;\r\n\r\n /** Elements by internal name. */\r\n elementsLookup: Map = new Map();\r\n /** Class and function instances by internal name. */\r\n instancesLookup: Map = new Map();\r\n /** Types by internal name. */\r\n typesLookup: Map = noTypesYet;\r\n /** Declared type aliases. */\r\n typeAliases: Map = new Map();\r\n /** File-level exports by exported name. */\r\n fileLevelExports: Map = new Map();\r\n /** Module-level exports by exported name. */\r\n moduleLevelExports: Map = new Map();\r\n /** Classes backing basic types like `i32`. */\r\n basicClasses: Map = new Map();\r\n\r\n /** ArrayBuffer instance reference. */\r\n arrayBufferInstance: Class | null = null;\r\n /** Array prototype reference. */\r\n arrayPrototype: ClassPrototype | null = null;\r\n /** String instance reference. */\r\n stringInstance: Class | null = null;\r\n /** Start function reference. */\r\n startFunction: FunctionPrototype;\r\n /** Main function reference, if present. */\r\n mainFunction: FunctionPrototype | null = null;\r\n /** Abort function reference, if present. */\r\n abortInstance: Function | null = null;\r\n /** Memory allocation function. */\r\n memoryAllocateInstance: Function | null = null;\r\n\r\n /** Whether a garbage collector is present or not. */\r\n hasGC: bool = false;\r\n /** Garbage collector allocation function. */\r\n gcAllocateInstance: Function | null = null;\r\n /** Garbage collector link function called when a managed object is referenced from a parent. */\r\n gcLinkInstance: Function | null = null;\r\n /** Garbage collector mark function called to on reachable managed objects. */\r\n gcMarkInstance: Function | null = null;\r\n /** Size of a managed object header. */\r\n gcHeaderSize: u32 = 0;\r\n /** Offset of the GC hook. */\r\n gcHookOffset: u32 = 0;\r\n\r\n /** Currently processing filespace. */\r\n currentFilespace: Filespace;\r\n\r\n /** Constructs a new program, optionally inheriting parser diagnostics. */\r\n constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n super(diagnostics);\r\n this.resolver = new Resolver(this);\r\n this.sources = [];\r\n }\r\n\r\n /** Gets a source by its exact path. */\r\n getSource(normalizedPath: string): Source | null {\r\n var sources = this.sources;\r\n for (let i = 0, k = sources.length; i < k; ++i) {\r\n let source = sources[i];\r\n if (source.normalizedPath == normalizedPath) return source;\r\n }\r\n return null;\r\n }\r\n\r\n /** Looks up the source for the specified possibly ambiguous path. */\r\n lookupSourceByPath(normalizedPathWithoutExtension: string): Source | null {\r\n var tmp: string;\r\n return (\r\n this.getSource(normalizedPathWithoutExtension + \".ts\") ||\r\n this.getSource(normalizedPathWithoutExtension + \"/index.ts\") ||\r\n this.getSource((tmp = LIBRARY_PREFIX + normalizedPathWithoutExtension) + \".ts\") ||\r\n this.getSource( tmp + \"/index.ts\")\r\n );\r\n }\r\n\r\n /** Initializes the program and its elements prior to compilation. */\r\n initialize(options: Options): void {\r\n this.options = options;\r\n\r\n // add built-in types\r\n this.typesLookup = new Map([\r\n [\"i8\", Type.i8],\r\n [\"i16\", Type.i16],\r\n [\"i32\", Type.i32],\r\n [\"i64\", Type.i64],\r\n [\"isize\", options.isizeType],\r\n [\"u8\", Type.u8],\r\n [\"u16\", Type.u16],\r\n [\"u32\", Type.u32],\r\n [\"u64\", Type.u64],\r\n [\"usize\", options.usizeType],\r\n [\"bool\", Type.bool],\r\n [\"f32\", Type.f32],\r\n [\"f64\", Type.f64],\r\n [\"void\", Type.void],\r\n [\"number\", Type.f64],\r\n [\"boolean\", Type.bool]\r\n ]);\r\n\r\n // add compiler hints\r\n this.setConstantInteger(\"ASC_TARGET\", Type.i32,\r\n i64_new(options.isWasm64 ? 2 : 1));\r\n this.setConstantInteger(\"ASC_NO_TREESHAKING\", Type.bool,\r\n i64_new(options.noTreeShaking ? 1 : 0, 0));\r\n this.setConstantInteger(\"ASC_NO_ASSERT\", Type.bool,\r\n i64_new(options.noAssert ? 1 : 0, 0));\r\n this.setConstantInteger(\"ASC_MEMORY_BASE\", Type.i32,\r\n i64_new(options.memoryBase, 0));\r\n this.setConstantInteger(\"ASC_OPTIMIZE_LEVEL\", Type.i32,\r\n i64_new(options.optimizeLevelHint, 0));\r\n this.setConstantInteger(\"ASC_SHRINK_LEVEL\", Type.i32,\r\n i64_new(options.shrinkLevelHint, 0));\r\n this.setConstantInteger(\"ASC_FEATURE_MUTABLE_GLOBAL\", Type.bool,\r\n i64_new(options.hasFeature(Feature.MUTABLE_GLOBAL) ? 1 : 0, 0));\r\n this.setConstantInteger(\"ASC_FEATURE_SIGN_EXTENSION\", Type.bool,\r\n i64_new(options.hasFeature(Feature.SIGN_EXTENSION) ? 1 : 0, 0));\r\n\r\n // remember deferred elements\r\n var queuedImports = new Array();\r\n var queuedExports = new Map();\r\n var queuedExtends = new Array();\r\n var queuedImplements = new Array();\r\n\r\n // build initial lookup maps of internal names to declarations\r\n for (let i = 0, k = this.sources.length; i < k; ++i) {\r\n let source = this.sources[i];\r\n\r\n // create one filespace per source\r\n let filespace = new Filespace(this, source);\r\n this.elementsLookup.set(filespace.internalName, filespace);\r\n this.currentFilespace = filespace;\r\n\r\n // process this source's statements\r\n let statements = source.statements;\r\n for (let j = 0, l = statements.length; j < l; ++j) {\r\n let statement = statements[j];\r\n switch (statement.kind) {\r\n case NodeKind.CLASSDECLARATION: {\r\n this.initializeClass(statement, queuedExtends, queuedImplements);\r\n break;\r\n }\r\n case NodeKind.ENUMDECLARATION: {\r\n this.initializeEnum(statement);\r\n break;\r\n }\r\n case NodeKind.EXPORT: {\r\n this.initializeExports(statement, queuedExports);\r\n break;\r\n }\r\n case NodeKind.FUNCTIONDECLARATION: {\r\n this.initializeFunction(statement);\r\n break;\r\n }\r\n case NodeKind.IMPORT: {\r\n this.initializeImports(statement, queuedExports, queuedImports);\r\n break;\r\n }\r\n case NodeKind.INTERFACEDECLARATION: {\r\n this.initializeInterface(statement);\r\n break;\r\n }\r\n case NodeKind.NAMESPACEDECLARATION: {\r\n this.initializeNamespace(statement, queuedExtends, queuedImplements);\r\n break;\r\n }\r\n case NodeKind.TYPEDECLARATION: {\r\n this.initializeTypeAlias(statement);\r\n break;\r\n }\r\n case NodeKind.VARIABLE: {\r\n this.initializeVariables(statement);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // queued imports should be resolvable now through traversing exports and queued exports\r\n for (let i = 0; i < queuedImports.length;) {\r\n let queuedImport = queuedImports[i];\r\n let declaration = queuedImport.declaration;\r\n if (declaration) { // named\r\n let element = this.tryLocateImport(queuedImport.externalName, queuedExports);\r\n if (element) {\r\n this.elementsLookup.set(queuedImport.localName, element);\r\n queuedImports.splice(i, 1);\r\n } else {\r\n if (element = this.tryLocateImport(queuedImport.externalNameAlt, queuedExports)) {\r\n this.elementsLookup.set(queuedImport.localName, element);\r\n queuedImports.splice(i, 1);\r\n } else {\r\n this.error(\r\n DiagnosticCode.Module_0_has_no_exported_member_1,\r\n declaration.range,\r\n (declaration.parent).path.value,\r\n declaration.externalName.text\r\n );\r\n ++i;\r\n }\r\n }\r\n } else { // filespace\r\n let element = this.elementsLookup.get(queuedImport.externalName);\r\n if (element) {\r\n this.elementsLookup.set(queuedImport.localName, element);\r\n queuedImports.splice(i, 1);\r\n } else {\r\n if (element = this.elementsLookup.get(queuedImport.externalNameAlt)) {\r\n this.elementsLookup.set(queuedImport.localName, element);\r\n queuedImports.splice(i, 1);\r\n } else {\r\n assert(false); // already reported by the parser not finding the file\r\n ++i;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // queued exports should be resolvable now that imports are finalized\r\n for (let [exportName, queuedExport] of queuedExports) {\r\n let currentExport: QueuedExport | null = queuedExport; // nullable below\r\n let element: Element | null;\r\n do {\r\n if (currentExport.isReExport) {\r\n if (element = this.fileLevelExports.get(currentExport.externalName)) {\r\n this.setExportAndCheckLibrary(\r\n exportName,\r\n element,\r\n queuedExport.member.externalName\r\n );\r\n break;\r\n }\r\n currentExport = queuedExports.get(currentExport.externalName);\r\n if (!currentExport) {\r\n this.error(\r\n DiagnosticCode.Module_0_has_no_exported_member_1,\r\n queuedExport.member.externalName.range,\r\n ((queuedExport.member.parent).path).value,\r\n queuedExport.member.externalName.text\r\n );\r\n }\r\n } else {\r\n if (\r\n // normal export\r\n (element = this.elementsLookup.get(currentExport.externalName)) ||\r\n // library re-export\r\n (element = this.elementsLookup.get(currentExport.member.name.text))\r\n ) {\r\n this.setExportAndCheckLibrary(\r\n exportName,\r\n element,\r\n queuedExport.member.externalName\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n queuedExport.member.range, queuedExport.member.name.text\r\n );\r\n }\r\n break;\r\n }\r\n } while (currentExport);\r\n }\r\n\r\n // resolve base prototypes of derived classes\r\n var resolver = this.resolver;\r\n for (let i = 0, k = queuedExtends.length; i < k; ++i) {\r\n let derivedPrototype = queuedExtends[i];\r\n let derivedDeclaration = derivedPrototype.declaration;\r\n let derivedType = assert(derivedDeclaration.extendsType);\r\n let baseElement = resolver.resolveIdentifier(derivedType.name, null); // reports\r\n if (!baseElement) continue;\r\n if (baseElement.kind == ElementKind.CLASS_PROTOTYPE) {\r\n let basePrototype = baseElement;\r\n derivedPrototype.basePrototype = basePrototype;\r\n } else {\r\n this.error(\r\n DiagnosticCode.A_class_may_only_extend_another_class,\r\n derivedType.range\r\n );\r\n }\r\n }\r\n\r\n // set up global aliases\r\n {\r\n let globalAliases = options.globalAliases;\r\n if (globalAliases) {\r\n for (let [alias, name] of globalAliases) {\r\n if (!name.length) continue; // explicitly disabled\r\n let element = this.elementsLookup.get(name);\r\n if (element) this.elementsLookup.set(alias, element);\r\n else throw new Error(\"element not found: \" + name);\r\n }\r\n }\r\n }\r\n\r\n // register 'ArrayBuffer'\r\n if (this.elementsLookup.has(\"ArrayBuffer\")) {\r\n let element = assert(this.elementsLookup.get(\"ArrayBuffer\"));\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n this.arrayBufferInstance = resolver.resolveClass(element, null);\r\n }\r\n\r\n // register 'Array'\r\n if (this.elementsLookup.has(\"Array\")) {\r\n let element = assert(this.elementsLookup.get(\"Array\"));\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n this.arrayPrototype = element;\r\n }\r\n\r\n // register 'String'\r\n if (this.elementsLookup.has(\"String\")) {\r\n let element = assert(this.elementsLookup.get(\"String\"));\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n let instance = resolver.resolveClass(element, null);\r\n if (instance) {\r\n if (this.typesLookup.has(\"string\")) {\r\n let declaration = (element).declaration;\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, declaration.programLevelInternalName\r\n );\r\n } else {\r\n this.stringInstance = instance;\r\n this.typesLookup.set(\"string\", instance.type);\r\n }\r\n }\r\n }\r\n\r\n // register classes backing basic types\r\n this.registerBasicClass(TypeKind.I8, \"I8\");\r\n this.registerBasicClass(TypeKind.I16, \"I16\");\r\n this.registerBasicClass(TypeKind.I32, \"I32\");\r\n this.registerBasicClass(TypeKind.I64, \"I64\");\r\n this.registerBasicClass(TypeKind.ISIZE, \"Isize\");\r\n this.registerBasicClass(TypeKind.U8, \"U8\");\r\n this.registerBasicClass(TypeKind.U16, \"U16\");\r\n this.registerBasicClass(TypeKind.U32, \"U32\");\r\n this.registerBasicClass(TypeKind.U64, \"U64\");\r\n this.registerBasicClass(TypeKind.USIZE, \"Usize\");\r\n this.registerBasicClass(TypeKind.BOOL, \"Bool\");\r\n this.registerBasicClass(TypeKind.F32, \"F32\");\r\n this.registerBasicClass(TypeKind.F64, \"F64\");\r\n\r\n // register 'start'\r\n {\r\n let element = assert(this.elementsLookup.get(\"start\"));\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.startFunction = element;\r\n }\r\n\r\n // register 'main' if present\r\n if (this.moduleLevelExports.has(\"main\")) {\r\n let element = (this.moduleLevelExports.get(\"main\")).element;\r\n if (\r\n element.kind == ElementKind.FUNCTION_PROTOTYPE &&\r\n !(element).isAny(CommonFlags.GENERIC | CommonFlags.AMBIENT)\r\n ) {\r\n (element).set(CommonFlags.MAIN);\r\n this.mainFunction = element;\r\n }\r\n }\r\n\r\n // register 'abort' if present\r\n if (this.elementsLookup.has(\"abort\")) {\r\n let element = this.elementsLookup.get(\"abort\");\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let instance = this.resolver.resolveFunction(element, null);\r\n if (instance) this.abortInstance = instance;\r\n }\r\n\r\n // register 'memory.allocate' if present\r\n if (this.elementsLookup.has(\"memory\")) {\r\n let element = this.elementsLookup.get(\"memory\");\r\n let members = element.members;\r\n if (members) {\r\n if (members.has(\"allocate\")) {\r\n element = assert(members.get(\"allocate\"));\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let instance = this.resolver.resolveFunction(element, null);\r\n if (instance) this.memoryAllocateInstance = instance;\r\n }\r\n }\r\n }\r\n\r\n // register GC hooks if present\r\n if (\r\n this.elementsLookup.has(\"__gc_allocate\") &&\r\n this.elementsLookup.has(\"__gc_link\") &&\r\n this.elementsLookup.has(\"__gc_mark\")\r\n ) {\r\n // __gc_allocate(usize, (ref: usize) => void): usize\r\n let element = this.elementsLookup.get(\"__gc_allocate\");\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let gcAllocateInstance = assert(this.resolver.resolveFunction(element, null));\r\n let signature = gcAllocateInstance.signature;\r\n assert(signature.parameterTypes.length == 2);\r\n assert(signature.parameterTypes[0] == this.options.usizeType);\r\n assert(signature.parameterTypes[1].signatureReference);\r\n assert(signature.returnType == this.options.usizeType);\r\n\r\n // __gc_link(usize, usize): void\r\n element = this.elementsLookup.get(\"__gc_link\");\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let gcLinkInstance = assert(this.resolver.resolveFunction(element, null));\r\n signature = gcLinkInstance.signature;\r\n assert(signature.parameterTypes.length == 2);\r\n assert(signature.parameterTypes[0] == this.options.usizeType);\r\n assert(signature.parameterTypes[1] == this.options.usizeType);\r\n assert(signature.returnType == Type.void);\r\n\r\n // __gc_mark(usize): void\r\n element = this.elementsLookup.get(\"__gc_mark\");\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let gcMarkInstance = assert(this.resolver.resolveFunction(element, null));\r\n signature = gcMarkInstance.signature;\r\n assert(signature.parameterTypes.length == 1);\r\n assert(signature.parameterTypes[0] == this.options.usizeType);\r\n assert(signature.returnType == Type.void);\r\n\r\n this.gcAllocateInstance = gcAllocateInstance;\r\n this.gcLinkInstance = gcLinkInstance;\r\n this.gcMarkInstance = gcMarkInstance;\r\n let gcHookOffset = 2 * options.usizeType.byteSize; // .next + .prev\r\n this.gcHookOffset = gcHookOffset;\r\n this.gcHeaderSize = (gcHookOffset + 4 + 7) & ~7; // + .hook index + alignment\r\n this.hasGC = true;\r\n }\r\n }\r\n\r\n private registerBasicClass(typeKind: TypeKind, className: string): void {\r\n if (this.elementsLookup.has(className)) {\r\n let element = assert(this.elementsLookup.get(className));\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n let classElement = this.resolver.resolveClass(element, null);\r\n if (classElement) this.basicClasses.set(typeKind, classElement);\r\n }\r\n }\r\n\r\n /** Sets a constant integer value. */\r\n setConstantInteger(globalName: string, type: Type, value: I64): void {\r\n assert(type.is(TypeFlags.INTEGER));\r\n var global = new Global(this, globalName, globalName, type, null, DecoratorFlags.NONE)\r\n .withConstantIntegerValue(value);\r\n global.set(CommonFlags.RESOLVED);\r\n this.elementsLookup.set(globalName, global);\r\n }\r\n\r\n /** Sets a constant float value. */\r\n setConstantFloat(globalName: string, type: Type, value: f64): void {\r\n assert(type.is(TypeFlags.FLOAT));\r\n var global = new Global(this, globalName, globalName, type, null, DecoratorFlags.NONE)\r\n .withConstantFloatValue(value);\r\n global.set(CommonFlags.RESOLVED);\r\n this.elementsLookup.set(globalName, global);\r\n }\r\n\r\n /** Tries to locate an import by traversing exports and queued exports. */\r\n private tryLocateImport(\r\n externalName: string,\r\n queuedNamedExports: Map\r\n ): Element | null {\r\n var element: Element | null;\r\n var fileLevelExports = this.fileLevelExports;\r\n do {\r\n if (element = fileLevelExports.get(externalName)) return element;\r\n let queuedExport = queuedNamedExports.get(externalName);\r\n if (!queuedExport) break;\r\n if (queuedExport.isReExport) {\r\n externalName = queuedExport.externalName;\r\n continue;\r\n }\r\n return this.elementsLookup.get(queuedExport.externalName);\r\n } while (true);\r\n return null;\r\n }\r\n\r\n /** Checks that only supported decorators are present. */\r\n private checkDecorators(\r\n decorators: DecoratorNode[],\r\n acceptedFlags: DecoratorFlags\r\n ): DecoratorFlags {\r\n var presentFlags = DecoratorFlags.NONE;\r\n for (let i = 0, k = decorators.length; i < k; ++i) {\r\n let decorator = decorators[i];\r\n let kind = decoratorNameToKind(decorator.name);\r\n let flag = decoratorKindToFlag(kind);\r\n if (flag) {\r\n if (flag == DecoratorFlags.BUILTIN) {\r\n if (decorator.range.source.isLibrary) {\r\n presentFlags |= flag;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Decorator_0_is_not_valid_here,\r\n decorator.range, decorator.name.range.toString()\r\n );\r\n }\r\n } else if (!(acceptedFlags & flag)) {\r\n this.error(\r\n DiagnosticCode.Decorator_0_is_not_valid_here,\r\n decorator.range, decorator.name.range.toString()\r\n );\r\n } else if (presentFlags & flag) {\r\n this.error(\r\n DiagnosticCode.Duplicate_decorator,\r\n decorator.range, decorator.name.range.toString()\r\n );\r\n } else {\r\n presentFlags |= flag;\r\n }\r\n }\r\n }\r\n return presentFlags;\r\n }\r\n\r\n /** Checks and sets up global options of an element. */\r\n private checkGlobal(\r\n element: Element,\r\n declaration: DeclarationStatement\r\n ): void {\r\n var parentNode = declaration.parent;\r\n // alias globally if explicitly annotated @global or exported from a top-level library file\r\n if (\r\n (element.hasDecorator(DecoratorFlags.GLOBAL)) ||\r\n (\r\n declaration.range.source.isLibrary &&\r\n element.is(CommonFlags.EXPORT) &&\r\n (\r\n assert(parentNode).kind == NodeKind.SOURCE ||\r\n (\r\n parentNode).kind == NodeKind.VARIABLE &&\r\n assert((parentNode).parent).kind == NodeKind.SOURCE\r\n )\r\n )\r\n ) {\r\n let globalName = declaration.programLevelInternalName;\r\n if (this.elementsLookup.has(globalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, element.internalName\r\n );\r\n } else {\r\n this.elementsLookup.set(globalName, element);\r\n }\r\n }\r\n // builtins use the global name directly\r\n if (element.hasDecorator(DecoratorFlags.BUILTIN)) {\r\n element.internalName = declaration.programLevelInternalName;\r\n }\r\n }\r\n\r\n /** Initializes a class declaration. */\r\n private initializeClass(\r\n declaration: ClassDeclaration,\r\n queuedExtends: ClassPrototype[],\r\n queuedImplements: ClassPrototype[],\r\n namespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n\r\n var decorators = declaration.decorators;\r\n var simpleName = declaration.name.text;\r\n var prototype = new ClassPrototype(\r\n this,\r\n simpleName,\r\n internalName,\r\n declaration,\r\n decorators\r\n ? this.checkDecorators(decorators,\r\n DecoratorFlags.GLOBAL |\r\n DecoratorFlags.SEALED |\r\n DecoratorFlags.UNMANAGED\r\n )\r\n : DecoratorFlags.NONE\r\n );\r\n prototype.parent = namespace;\r\n this.elementsLookup.set(internalName, prototype);\r\n\r\n var implementsTypes = declaration.implementsTypes;\r\n if (implementsTypes) {\r\n let numImplementsTypes = implementsTypes.length;\r\n if (prototype.hasDecorator(DecoratorFlags.UNMANAGED)) {\r\n if (numImplementsTypes) {\r\n this.error(\r\n DiagnosticCode.Unmanaged_classes_cannot_implement_interfaces,\r\n Range.join(\r\n declaration.name.range,\r\n implementsTypes[numImplementsTypes - 1].range\r\n )\r\n );\r\n }\r\n\r\n // remember classes that implement interfaces\r\n } else if (numImplementsTypes) {\r\n for (let i = 0; i < numImplementsTypes; ++i) {\r\n this.warning( // TODO\r\n DiagnosticCode.Operation_not_supported,\r\n implementsTypes[i].range\r\n );\r\n }\r\n queuedImplements.push(prototype);\r\n }\r\n }\r\n\r\n // remember classes that extend another one\r\n if (declaration.extendsType) queuedExtends.push(prototype);\r\n\r\n // add as namespace member if applicable\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(simpleName, prototype);\r\n if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n\r\n // otherwise add to file-level exports if exported\r\n } else if (prototype.is(CommonFlags.EXPORT)) {\r\n if (this.fileLevelExports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.fileLevelExports.set(internalName, prototype);\r\n this.currentFilespace.members.set(simpleName, prototype);\r\n if (prototype.is(CommonFlags.EXPORT) && declaration.range.source.isEntry) {\r\n if (this.moduleLevelExports.has(simpleName)) {\r\n let existingExport = this.moduleLevelExports.get(simpleName);\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, existingExport.element.internalName\r\n );\r\n return;\r\n }\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n this.moduleLevelExports.set(simpleName, {\r\n element: prototype,\r\n identifier: declaration.name\r\n });\r\n }\r\n }\r\n\r\n // initialize members\r\n var memberDeclarations = declaration.members;\r\n for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n let memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n case NodeKind.FIELDDECLARATION: {\r\n this.initializeField(memberDeclaration, prototype);\r\n break;\r\n }\r\n case NodeKind.METHODDECLARATION: {\r\n if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\r\n this.initializeAccessor(memberDeclaration, prototype);\r\n } else {\r\n this.initializeMethod(memberDeclaration, prototype);\r\n }\r\n break;\r\n }\r\n case NodeKind.INDEXSIGNATUREDECLARATION: break; // ignored for now\r\n default: {\r\n assert(false); // should have been reported while parsing\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.checkGlobal(prototype, declaration);\r\n }\r\n\r\n /** Initializes a field of a class or interface. */\r\n private initializeField(\r\n declaration: FieldDeclaration,\r\n classPrototype: ClassPrototype\r\n ): void {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n var decorators = declaration.decorators;\r\n var isInterface = classPrototype.kind == ElementKind.INTERFACE_PROTOTYPE;\r\n\r\n // static fields become global variables\r\n if (declaration.is(CommonFlags.STATIC)) {\r\n if (isInterface) {\r\n // should have been reported while parsing\r\n assert(false);\r\n }\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.members = new Map();\r\n }\r\n let staticField = new Global(\r\n this,\r\n name,\r\n internalName,\r\n Type.void, // resolved later on\r\n declaration,\r\n decorators\r\n ? this.checkDecorators(decorators, DecoratorFlags.INLINE)\r\n : DecoratorFlags.NONE\r\n );\r\n staticField.parent = classPrototype;\r\n classPrototype.members.set(name, staticField);\r\n this.elementsLookup.set(internalName, staticField);\r\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n staticField.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n\r\n if (staticField.hasDecorator(DecoratorFlags.INLINE) && !staticField.is(CommonFlags.READONLY)) {\r\n this.error(\r\n DiagnosticCode.Decorator_0_is_not_valid_here,\r\n assert(findDecorator(DecoratorKind.INLINE, decorators)).range, \"inline\"\r\n );\r\n }\r\n\r\n // instance fields are remembered until resolved\r\n } else {\r\n if (isInterface) {\r\n // should have been reported while parsing\r\n assert(!declaration.isAny(CommonFlags.ABSTRACT | CommonFlags.GET | CommonFlags.SET));\r\n }\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n let instanceField = new FieldPrototype(\r\n classPrototype,\r\n name,\r\n internalName,\r\n declaration\r\n );\r\n if (decorators) this.checkDecorators(decorators, DecoratorFlags.NONE);\r\n classPrototype.instanceMembers.set(name, instanceField);\r\n }\r\n }\r\n\r\n /** Initializes a method of a class or interface. */\r\n private initializeMethod(\r\n declaration: MethodDeclaration,\r\n classPrototype: ClassPrototype\r\n ): void {\r\n var simpleName = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n var prototype: FunctionPrototype | null = null;\r\n\r\n var decorators = declaration.decorators;\r\n var decoratorFlags = DecoratorFlags.NONE;\r\n if (decorators) {\r\n decoratorFlags = this.checkDecorators(decorators,\r\n DecoratorFlags.OPERATOR_BINARY |\r\n DecoratorFlags.OPERATOR_PREFIX |\r\n DecoratorFlags.OPERATOR_POSTFIX |\r\n DecoratorFlags.INLINE\r\n );\r\n }\r\n\r\n // static methods become global functions\r\n if (declaration.is(CommonFlags.STATIC)) {\r\n assert(declaration.name.kind != NodeKind.CONSTRUCTOR);\r\n\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0, declaration.name.range,\r\n internalName\r\n );\r\n return;\r\n }\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.members = new Map();\r\n }\r\n prototype = new FunctionPrototype(\r\n this,\r\n simpleName,\r\n internalName,\r\n declaration,\r\n classPrototype,\r\n decoratorFlags\r\n );\r\n classPrototype.members.set(simpleName, prototype);\r\n this.elementsLookup.set(internalName, prototype);\r\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n\r\n // instance methods are remembered until resolved\r\n } else {\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n prototype = new FunctionPrototype(\r\n this,\r\n simpleName,\r\n internalName,\r\n declaration,\r\n classPrototype,\r\n decoratorFlags\r\n );\r\n // if (classPrototype.isUnmanaged && instancePrototype.isAbstract) {\r\n // this.error( Unmanaged classes cannot declare abstract methods. );\r\n // }\r\n if (declaration.name.kind == NodeKind.CONSTRUCTOR) {\r\n if (classPrototype.constructorPrototype) {\r\n this.error(\r\n DiagnosticCode.Multiple_constructor_implementations_are_not_allowed,\r\n declaration.name.range\r\n );\r\n } else {\r\n prototype.set(CommonFlags.CONSTRUCTOR);\r\n classPrototype.constructorPrototype = prototype;\r\n }\r\n } else {\r\n classPrototype.instanceMembers.set(simpleName, prototype);\r\n }\r\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n }\r\n\r\n this.checkOperatorOverloads(declaration.decorators, prototype, classPrototype);\r\n }\r\n\r\n private checkOperatorOverloads(\r\n decorators: DecoratorNode[] | null,\r\n prototype: FunctionPrototype,\r\n classPrototype: ClassPrototype\r\n ): void {\r\n if (decorators) {\r\n for (let i = 0, k = decorators.length; i < k; ++i) {\r\n let decorator = decorators[i];\r\n switch (decorator.decoratorKind) {\r\n case DecoratorKind.OPERATOR:\r\n case DecoratorKind.OPERATOR_BINARY:\r\n case DecoratorKind.OPERATOR_PREFIX:\r\n case DecoratorKind.OPERATOR_POSTFIX: {\r\n let numArgs = decorator.arguments && decorator.arguments.length || 0;\r\n if (numArgs == 1) {\r\n let firstArg = (decorator.arguments)[0];\r\n if (\r\n firstArg.kind == NodeKind.LITERAL &&\r\n (firstArg).literalKind == LiteralKind.STRING\r\n ) {\r\n let kind = operatorKindFromDecorator(\r\n decorator.decoratorKind,\r\n (firstArg).value\r\n );\r\n if (kind == OperatorKind.INVALID) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n firstArg.range\r\n );\r\n } else {\r\n let overloads = classPrototype.overloadPrototypes;\r\n if (overloads.has(kind)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_function_implementation,\r\n firstArg.range\r\n );\r\n } else {\r\n prototype.operatorKind = kind;\r\n overloads.set(kind, prototype);\r\n }\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n firstArg.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n decorator.range, \"1\", numArgs.toString(0)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private initializeAccessor(\r\n declaration: MethodDeclaration,\r\n classPrototype: ClassPrototype\r\n ): void {\r\n var simpleName = declaration.name.text;\r\n var internalPropertyName = declaration.fileLevelInternalName;\r\n var propertyElement = this.elementsLookup.get(internalPropertyName);\r\n var isGetter = declaration.is(CommonFlags.GET);\r\n var isNew = false;\r\n if (propertyElement) {\r\n if (\r\n propertyElement.kind != ElementKind.PROPERTY ||\r\n (isGetter\r\n ? (propertyElement).getterPrototype\r\n : (propertyElement).setterPrototype\r\n ) != null\r\n ) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalPropertyName\r\n );\r\n return;\r\n }\r\n } else {\r\n propertyElement = new Property(\r\n this,\r\n simpleName,\r\n internalPropertyName,\r\n classPrototype\r\n );\r\n isNew = true;\r\n }\r\n\r\n var decorators = declaration.decorators;\r\n var decoratorFlags = DecoratorFlags.NONE;\r\n if (decorators) {\r\n decoratorFlags = this.checkDecorators(decorators,\r\n DecoratorFlags.INLINE\r\n );\r\n }\r\n\r\n var baseName = (isGetter ? GETTER_PREFIX : SETTER_PREFIX) + simpleName;\r\n\r\n // static accessors become global functions\r\n if (declaration.is(CommonFlags.STATIC)) {\r\n let staticName = classPrototype.internalName + STATIC_DELIMITER + baseName;\r\n if (this.elementsLookup.has(staticName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, staticName\r\n );\r\n return;\r\n }\r\n let staticPrototype = new FunctionPrototype(\r\n this,\r\n baseName,\r\n staticName,\r\n declaration,\r\n null,\r\n decoratorFlags\r\n );\r\n if (isGetter) {\r\n (propertyElement).getterPrototype = staticPrototype;\r\n } else {\r\n (propertyElement).setterPrototype = staticPrototype;\r\n }\r\n if (isNew) {\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, staticName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.members = new Map();\r\n }\r\n classPrototype.members.set(simpleName, propertyElement); // check above\r\n } else {\r\n assert(classPrototype.members && classPrototype.members.has(simpleName));\r\n }\r\n this.elementsLookup.set(internalPropertyName, propertyElement);\r\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n propertyElement.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n\r\n // instance accessors are remembered until resolved\r\n } else {\r\n let instanceName = classPrototype.internalName + INSTANCE_DELIMITER + baseName;\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(baseName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalPropertyName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n let instancePrototype = new FunctionPrototype(\r\n this,\r\n baseName,\r\n instanceName,\r\n declaration,\r\n classPrototype,\r\n decoratorFlags\r\n );\r\n if (isGetter) {\r\n (propertyElement).getterPrototype = instancePrototype;\r\n } else {\r\n (propertyElement).setterPrototype = instancePrototype;\r\n }\r\n classPrototype.instanceMembers.set(baseName, propertyElement);\r\n this.elementsLookup.set(internalPropertyName, propertyElement);\r\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n propertyElement.set(CommonFlags.MODULE_EXPORT);\r\n instancePrototype.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n }\r\n }\r\n\r\n private initializeEnum(\r\n declaration: EnumDeclaration,\r\n namespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n var simpleName = declaration.name.text;\r\n var element = new Enum(this, simpleName, internalName, declaration);\r\n element.parent = namespace;\r\n this.elementsLookup.set(internalName, element);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(simpleName, element);\r\n if (namespace.is(CommonFlags.MODULE_EXPORT) && element.is(CommonFlags.EXPORT)) {\r\n element.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n } else if (element.is(CommonFlags.EXPORT)) { // no namespace\r\n if (this.fileLevelExports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.fileLevelExports.set(internalName, element);\r\n this.currentFilespace.members.set(simpleName, element);\r\n if (declaration.range.source.isEntry) {\r\n if (this.moduleLevelExports.has(simpleName)) {\r\n let existingExport = this.moduleLevelExports.get(simpleName);\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, existingExport.element.internalName\r\n );\r\n return;\r\n }\r\n element.set(CommonFlags.MODULE_EXPORT);\r\n this.moduleLevelExports.set(simpleName, {\r\n element,\r\n identifier: declaration.name\r\n });\r\n }\r\n }\r\n\r\n var values = declaration.values;\r\n for (let i = 0, k = values.length; i < k; ++i) {\r\n this.initializeEnumValue(values[i], element);\r\n }\r\n\r\n this.checkGlobal(element, declaration);\r\n }\r\n\r\n private initializeEnumValue(\r\n declaration: EnumValueDeclaration,\r\n enm: Enum\r\n ): void {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n if (enm.members) {\r\n if (enm.members.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n enm.members = new Map();\r\n }\r\n var value = new EnumValue(enm, this, name, internalName, declaration);\r\n enm.members.set(name, value);\r\n if (enm.is(CommonFlags.MODULE_EXPORT)) {\r\n value.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n }\r\n\r\n private initializeExports(\r\n statement: ExportStatement,\r\n queuedExports: Map\r\n ): void {\r\n var members = statement.members;\r\n if (members) { // named\r\n for (let i = 0, k = members.length; i < k; ++i) {\r\n this.initializeExport(members[i], statement.internalPath, queuedExports);\r\n }\r\n } else { // TODO: filespace\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.range\r\n );\r\n }\r\n }\r\n\r\n private setExportAndCheckLibrary(\r\n internalName: string,\r\n element: Element,\r\n externalIdentifier: IdentifierExpression\r\n ): void {\r\n // add to file-level exports\r\n this.fileLevelExports.set(internalName, element);\r\n\r\n // add to filespace\r\n var internalPath = externalIdentifier.range.source.internalPath;\r\n var prefix = FILESPACE_PREFIX + internalPath;\r\n var filespace = this.elementsLookup.get(prefix);\r\n if (!filespace) filespace = assert(this.elementsLookup.get(prefix + PATH_DELIMITER + \"index\"));\r\n assert(filespace.kind == ElementKind.FILESPACE);\r\n var simpleName = externalIdentifier.text;\r\n (filespace).members.set(simpleName, element);\r\n\r\n // add global alias if a top-level export of a library file\r\n var source = externalIdentifier.range.source;\r\n if (source.isLibrary) {\r\n if (this.elementsLookup.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n externalIdentifier.range, simpleName\r\n );\r\n } else {\r\n element.internalName = simpleName;\r\n this.elementsLookup.set(simpleName, element);\r\n }\r\n\r\n // add module level export if a top-level export of an entry file\r\n } else if (source.isEntry) {\r\n this.moduleLevelExports.set(externalIdentifier.text, {\r\n element,\r\n identifier: externalIdentifier\r\n });\r\n }\r\n }\r\n\r\n private initializeExport(\r\n member: ExportMember,\r\n internalPath: string | null,\r\n queuedExports: Map\r\n ): void {\r\n var externalName = member.range.source.internalPath + PATH_DELIMITER + member.externalName.text;\r\n if (this.fileLevelExports.has(externalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.externalName.range, externalName\r\n );\r\n return;\r\n }\r\n var referencedName: string;\r\n var referencedElement: Element | null;\r\n var queuedExport: QueuedExport | null;\r\n\r\n // export local element\r\n if (internalPath == null) {\r\n referencedName = member.range.source.internalPath + PATH_DELIMITER + member.name.text;\r\n\r\n // resolve right away if the element exists\r\n if (this.elementsLookup.has(referencedName)) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n this.elementsLookup.get(referencedName),\r\n member.externalName\r\n );\r\n return;\r\n }\r\n\r\n // otherwise queue it\r\n if (queuedExports.has(externalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.externalName.range, externalName\r\n );\r\n return;\r\n }\r\n queuedExport = new QueuedExport();\r\n queuedExport.isReExport = false;\r\n queuedExport.externalName = referencedName; // -> here: local name\r\n queuedExport.member = member;\r\n queuedExports.set(externalName, queuedExport);\r\n\r\n // export external element\r\n } else {\r\n referencedName = internalPath + PATH_DELIMITER + member.name.text;\r\n\r\n // resolve right away if the export exists\r\n referencedElement = this.elementsLookup.get(referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n\r\n // walk already known queued exports\r\n let seen = new Set();\r\n while (queuedExport = queuedExports.get(referencedName)) {\r\n if (queuedExport.isReExport) {\r\n referencedElement = this.fileLevelExports.get(queuedExport.externalName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n referencedName = queuedExport.externalName;\r\n if (seen.has(queuedExport)) break;\r\n seen.add(queuedExport);\r\n } else {\r\n referencedElement = this.elementsLookup.get(queuedExport.externalName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // otherwise queue it\r\n if (queuedExports.has(externalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.externalName.range, externalName\r\n );\r\n return;\r\n }\r\n queuedExport = new QueuedExport();\r\n queuedExport.isReExport = true;\r\n queuedExport.externalName = referencedName; // -> here: external name\r\n queuedExport.member = member;\r\n queuedExports.set(externalName, queuedExport);\r\n }\r\n }\r\n\r\n private initializeFunction(\r\n declaration: FunctionDeclaration,\r\n namespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n var simpleName = declaration.name.text;\r\n var decorators = declaration.decorators;\r\n var prototype = new FunctionPrototype(\r\n this,\r\n simpleName,\r\n internalName,\r\n declaration,\r\n null,\r\n decorators\r\n ? this.checkDecorators(decorators,\r\n DecoratorFlags.GLOBAL |\r\n DecoratorFlags.INLINE |\r\n DecoratorFlags.EXTERNAL\r\n )\r\n : DecoratorFlags.NONE\r\n );\r\n prototype.parent = namespace;\r\n this.elementsLookup.set(internalName, prototype);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(simpleName, prototype);\r\n if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\r\n prototype.parent = namespace;\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n } else if (prototype.is(CommonFlags.EXPORT)) { // no namespace\r\n if (this.fileLevelExports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.fileLevelExports.set(internalName, prototype);\r\n this.currentFilespace.members.set(simpleName, prototype);\r\n if (declaration.range.source.isEntry) {\r\n if (this.moduleLevelExports.has(simpleName)) {\r\n let existingExport = this.moduleLevelExports.get(simpleName);\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, existingExport.element.internalName\r\n );\r\n return;\r\n }\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n this.moduleLevelExports.set(simpleName, {\r\n element: prototype,\r\n identifier: declaration.name\r\n });\r\n }\r\n }\r\n\r\n this.checkGlobal(prototype, declaration);\r\n }\r\n\r\n private initializeImports(\r\n statement: ImportStatement,\r\n queuedExports: Map,\r\n queuedImports: QueuedImport[]\r\n ): void {\r\n var declarations = statement.declarations;\r\n if (declarations) {\r\n for (let i = 0, k = declarations.length; i < k; ++i) {\r\n this.initializeImport(\r\n declarations[i],\r\n statement.internalPath,\r\n queuedExports, queuedImports\r\n );\r\n }\r\n } else if (statement.namespaceName) { // import * as simpleName from \"file\"\r\n let simpleName = statement.namespaceName.text;\r\n let internalName = (\r\n statement.range.source.internalPath +\r\n PATH_DELIMITER +\r\n simpleName\r\n );\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n statement.namespaceName.range,\r\n internalName\r\n );\r\n return;\r\n }\r\n\r\n // resolve right away if the exact filespace exists\r\n let filespace = this.elementsLookup.get(statement.internalPath);\r\n if (filespace) {\r\n this.elementsLookup.set(internalName, filespace);\r\n return;\r\n }\r\n\r\n // otherwise queue it\r\n let queuedImport = new QueuedImport();\r\n queuedImport.localName = internalName;\r\n let externalName = FILESPACE_PREFIX + statement.internalPath;\r\n queuedImport.externalName = externalName;\r\n queuedImport.externalNameAlt = externalName + PATH_DELIMITER + \"index\";\r\n queuedImport.declaration = null; // filespace\r\n queuedImports.push(queuedImport);\r\n }\r\n }\r\n\r\n private initializeImport(\r\n declaration: ImportDeclaration,\r\n internalPath: string,\r\n queuedNamedExports: Map,\r\n queuedImports: QueuedImport[]\r\n ): void {\r\n var localName = declaration.fileLevelInternalName;\r\n if (this.elementsLookup.has(localName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, localName\r\n );\r\n return;\r\n }\r\n\r\n var externalName = internalPath + PATH_DELIMITER + declaration.externalName.text;\r\n\r\n // resolve right away if the exact export exists\r\n var element: Element | null;\r\n if (element = this.fileLevelExports.get(externalName)) {\r\n this.elementsLookup.set(localName, element);\r\n return;\r\n }\r\n\r\n // otherwise queue it\r\n const indexPart = PATH_DELIMITER + \"index\";\r\n var queuedImport = new QueuedImport();\r\n queuedImport.localName = localName;\r\n if (internalPath.endsWith(indexPart)) {\r\n queuedImport.externalName = externalName; // try exact first\r\n queuedImport.externalNameAlt = (\r\n internalPath.substring(0, internalPath.length - indexPart.length + 1) +\r\n declaration.externalName.text\r\n );\r\n } else {\r\n queuedImport.externalName = externalName; // try exact first\r\n queuedImport.externalNameAlt = (\r\n internalPath +\r\n indexPart +\r\n PATH_DELIMITER +\r\n declaration.externalName.text\r\n );\r\n }\r\n queuedImport.declaration = declaration; // named\r\n queuedImports.push(queuedImport);\r\n }\r\n\r\n private initializeInterface(declaration: InterfaceDeclaration, namespace: Element | null = null): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n\r\n var decorators = declaration.decorators;\r\n var simpleName = declaration.name.text;\r\n var prototype = new InterfacePrototype(\r\n this,\r\n simpleName,\r\n internalName,\r\n declaration,\r\n decorators\r\n ? this.checkDecorators(decorators, DecoratorFlags.GLOBAL)\r\n : DecoratorFlags.NONE\r\n );\r\n prototype.parent = namespace;\r\n this.elementsLookup.set(internalName, prototype);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(prototype.internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(prototype.internalName, prototype);\r\n if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n } else if (prototype.is(CommonFlags.EXPORT)) { // no namespace\r\n if (this.fileLevelExports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.fileLevelExports.set(internalName, prototype);\r\n this.currentFilespace.members.set(simpleName, prototype);\r\n if (declaration.range.source.isEntry) {\r\n if (this.moduleLevelExports.has(simpleName)) {\r\n let existingExport = this.moduleLevelExports.get(simpleName);\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, existingExport.element.internalName\r\n );\r\n return;\r\n }\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n this.moduleLevelExports.set(simpleName, {\r\n element: prototype,\r\n identifier: declaration.name\r\n });\r\n }\r\n }\r\n\r\n var memberDeclarations = declaration.members;\r\n for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n let memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n\r\n case NodeKind.FIELDDECLARATION: {\r\n this.initializeField(memberDeclaration, prototype);\r\n break;\r\n }\r\n case NodeKind.METHODDECLARATION: {\r\n if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\r\n this.initializeAccessor(memberDeclaration, prototype);\r\n } else {\r\n this.initializeMethod(memberDeclaration, prototype);\r\n }\r\n break;\r\n }\r\n default: {\r\n throw new Error(\"interface member expected\");\r\n }\r\n }\r\n }\r\n\r\n this.checkGlobal(prototype, declaration);\r\n }\r\n\r\n private initializeNamespace(\r\n declaration: NamespaceDeclaration,\r\n queuedExtends: ClassPrototype[],\r\n queuedImplements: ClassPrototype[],\r\n parentNamespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n var simpleName = declaration.name.text;\r\n var namespace = this.elementsLookup.get(internalName);\r\n if (!namespace) {\r\n namespace = new Namespace(this, simpleName, internalName, declaration);\r\n namespace.parent = parentNamespace;\r\n this.elementsLookup.set(internalName, namespace);\r\n this.checkGlobal(namespace, declaration);\r\n }\r\n\r\n if (parentNamespace) {\r\n if (parentNamespace.members) {\r\n if (parentNamespace.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n parentNamespace.members = new Map();\r\n }\r\n parentNamespace.members.set(simpleName, namespace);\r\n if (parentNamespace.is(CommonFlags.MODULE_EXPORT) && namespace.is(CommonFlags.EXPORT)) {\r\n namespace.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n } else if (namespace.is(CommonFlags.EXPORT)) { // no parent namespace\r\n let existingExport = this.fileLevelExports.get(internalName);\r\n if (existingExport) {\r\n if (!existingExport.is(CommonFlags.EXPORT)) {\r\n this.error(\r\n DiagnosticCode.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local,\r\n declaration.name.range, namespace.internalName\r\n ); // recoverable\r\n }\r\n namespace = existingExport; // join\r\n } else {\r\n this.fileLevelExports.set(internalName, namespace);\r\n }\r\n this.currentFilespace.members.set(simpleName, namespace);\r\n if (declaration.range.source.isEntry) {\r\n if (this.moduleLevelExports.has(simpleName)) {\r\n let existingExport = this.moduleLevelExports.get(simpleName);\r\n if (existingExport.element !== namespace) { // not merged\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, existingExport.element.internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n this.moduleLevelExports.set(simpleName, {\r\n element: namespace,\r\n identifier: declaration.name\r\n });\r\n }\r\n namespace.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n }\r\n\r\n var members = declaration.members;\r\n for (let i = 0, k = members.length; i < k; ++i) {\r\n switch (members[i].kind) {\r\n case NodeKind.CLASSDECLARATION: {\r\n this.initializeClass(members[i], queuedExtends, queuedImplements, namespace);\r\n break;\r\n }\r\n case NodeKind.ENUMDECLARATION: {\r\n this.initializeEnum(members[i], namespace);\r\n break;\r\n }\r\n case NodeKind.FUNCTIONDECLARATION: {\r\n this.initializeFunction(members[i], namespace);\r\n break;\r\n }\r\n case NodeKind.INTERFACEDECLARATION: {\r\n this.initializeInterface(members[i], namespace);\r\n break;\r\n }\r\n case NodeKind.NAMESPACEDECLARATION: {\r\n this.initializeNamespace(members[i], queuedExtends, queuedImplements, namespace);\r\n break;\r\n }\r\n case NodeKind.TYPEDECLARATION: {\r\n // this.initializeTypeAlias(members[i], namespace);\r\n // TODO: what about namespaced types?\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n members[i].range\r\n );\r\n break;\r\n }\r\n case NodeKind.VARIABLE: {\r\n this.initializeVariables(members[i], namespace);\r\n break;\r\n }\r\n default: {\r\n throw new Error(\"namespace member expected\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n private initializeTypeAlias(declaration: TypeDeclaration, namespace: Element | null = null): void {\r\n // type aliases are program globals\r\n // TODO: what about namespaced types?\r\n var name = declaration.name.text;\r\n if (this.typesLookup.has(name) || this.typeAliases.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, name\r\n );\r\n return;\r\n }\r\n var alias = new TypeAlias();\r\n alias.typeParameters = declaration.typeParameters;\r\n alias.type = declaration.type;\r\n this.typeAliases.set(name, alias);\r\n }\r\n\r\n private initializeVariables(statement: VariableStatement, namespace: Element | null = null): void {\r\n var declarations = statement.declarations;\r\n for (let i = 0, k = declarations.length; i < k; ++i) {\r\n let declaration = declarations[i];\r\n let decorators = declaration.decorators;\r\n let internalName = declaration.fileLevelInternalName;\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n continue;\r\n }\r\n let simpleName = declaration.name.text;\r\n let global = new Global(\r\n this,\r\n simpleName,\r\n internalName,\r\n Type.void, // resolved later on\r\n declaration,\r\n decorators\r\n ? this.checkDecorators(decorators,\r\n DecoratorFlags.GLOBAL |\r\n DecoratorFlags.INLINE |\r\n DecoratorFlags.EXTERNAL\r\n )\r\n : DecoratorFlags.NONE\r\n );\r\n global.parent = namespace;\r\n this.elementsLookup.set(internalName, global);\r\n\r\n if (global.hasDecorator(DecoratorFlags.INLINE) && !global.is(CommonFlags.CONST)) {\r\n this.error(\r\n DiagnosticCode.Decorator_0_is_not_valid_here,\r\n assert(findDecorator(DecoratorKind.INLINE, decorators)).range, \"inline\"\r\n );\r\n }\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n continue;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(simpleName, global);\r\n if (namespace.is(CommonFlags.MODULE_EXPORT) && global.is(CommonFlags.EXPORT)) {\r\n global.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n } else if (global.is(CommonFlags.EXPORT)) { // no namespace\r\n if (this.fileLevelExports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n } else {\r\n this.fileLevelExports.set(internalName, global);\r\n }\r\n this.currentFilespace.members.set(simpleName, global);\r\n if (declaration.range.source.isEntry) {\r\n if (this.moduleLevelExports.has(simpleName)) {\r\n let existingExport = this.moduleLevelExports.get(simpleName);\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, existingExport.element.internalName\r\n );\r\n continue;\r\n }\r\n global.set(CommonFlags.MODULE_EXPORT);\r\n this.moduleLevelExports.set(simpleName, {\r\n element: global,\r\n identifier: declaration.name\r\n });\r\n }\r\n }\r\n this.checkGlobal(global, declaration);\r\n }\r\n }\r\n}\r\n\r\n/** Indicates the specific kind of an {@link Element}. */\r\nexport enum ElementKind {\r\n /** A {@link Global}. */\r\n GLOBAL,\r\n /** A {@link Local}. */\r\n LOCAL,\r\n /** An {@link Enum}. */\r\n ENUM,\r\n /** An {@link EnumValue}. */\r\n ENUMVALUE,\r\n /** A {@link FunctionPrototype}. */\r\n FUNCTION_PROTOTYPE,\r\n /** A {@link Function}. */\r\n FUNCTION,\r\n /** A {@link FunctionTarget}. */\r\n FUNCTION_TARGET,\r\n /** A {@link ClassPrototype}. */\r\n CLASS_PROTOTYPE,\r\n /** A {@link Class}. */\r\n CLASS,\r\n /** An {@link InterfacePrototype}. */\r\n INTERFACE_PROTOTYPE,\r\n /** An {@link Interface}. */\r\n INTERFACE,\r\n /** A {@link FieldPrototype}. */\r\n FIELD_PROTOTYPE,\r\n /** A {@link Field}. */\r\n FIELD,\r\n /** A {@link Property}. */\r\n PROPERTY,\r\n /** A {@link Namespace}. */\r\n NAMESPACE,\r\n /** A {@link Filespace}. */\r\n FILESPACE,\r\n}\r\n\r\nexport enum DecoratorFlags {\r\n /** No flags set. */\r\n NONE = 0,\r\n /** Is a program global. */\r\n GLOBAL = 1 << 0,\r\n /** Is a binary operator overload. */\r\n OPERATOR_BINARY = 1 << 1,\r\n /** Is a unary prefix operator overload. */\r\n OPERATOR_PREFIX = 1 << 2,\r\n /** Is a unary postfix operator overload. */\r\n OPERATOR_POSTFIX = 1 << 3,\r\n /** Is an unmanaged class. */\r\n UNMANAGED = 1 << 4,\r\n /** Is a sealed class. */\r\n SEALED = 1 << 5,\r\n /** Is always inlined. */\r\n INLINE = 1 << 6,\r\n /** Is using a different external name. */\r\n EXTERNAL = 1 << 7,\r\n /** Is a builtin. */\r\n BUILTIN = 1 << 8\r\n}\r\n\r\nexport function decoratorKindToFlag(kind: DecoratorKind): DecoratorFlags {\r\n switch (kind) {\r\n case DecoratorKind.GLOBAL: return DecoratorFlags.GLOBAL;\r\n case DecoratorKind.OPERATOR:\r\n case DecoratorKind.OPERATOR_BINARY: return DecoratorFlags.OPERATOR_BINARY;\r\n case DecoratorKind.OPERATOR_PREFIX: return DecoratorFlags.OPERATOR_PREFIX;\r\n case DecoratorKind.OPERATOR_POSTFIX: return DecoratorFlags.OPERATOR_POSTFIX;\r\n case DecoratorKind.UNMANAGED: return DecoratorFlags.UNMANAGED;\r\n case DecoratorKind.SEALED: return DecoratorFlags.SEALED;\r\n case DecoratorKind.INLINE: return DecoratorFlags.INLINE;\r\n case DecoratorKind.EXTERNAL: return DecoratorFlags.EXTERNAL;\r\n case DecoratorKind.BUILTIN: return DecoratorFlags.BUILTIN;\r\n default: return DecoratorFlags.NONE;\r\n }\r\n}\r\n\r\n/** Base class of all program elements. */\r\nexport abstract class Element {\r\n\r\n /** Specific element kind. */\r\n kind: ElementKind;\r\n /** Containing {@link Program}. */\r\n program: Program;\r\n /** Simple name. */\r\n simpleName: string;\r\n /** Internal name referring to this element. */\r\n internalName: string;\r\n /** Common flags indicating specific traits. */\r\n flags: CommonFlags = CommonFlags.NONE;\r\n /** Decorator flags indicating annotated traits. */\r\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE;\r\n /** Namespaced member elements. */\r\n members: Map | null = null;\r\n /** Parent element, if applicable. */\r\n parent: Element | null = null;\r\n\r\n /** Constructs a new element, linking it to its containing {@link Program}. */\r\n protected constructor(program: Program, simpleName: string, internalName: string) {\r\n this.program = program;\r\n this.simpleName = simpleName;\r\n this.internalName = internalName;\r\n }\r\n\r\n /** Tests if this element has a specific flag or flags. */\r\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\r\n /** Tests if this element has any of the specified flags. */\r\n isAny(flags: CommonFlags): bool { return (this.flags & flags) != 0; }\r\n /** Sets a specific flag or flags. */\r\n set(flag: CommonFlags): void { this.flags |= flag; }\r\n /** Tests if this element has a specific decorator flag or flags. */\r\n hasDecorator(flag: DecoratorFlags): bool { return (this.decoratorFlags & flag) == flag; }\r\n}\r\n\r\n/** A filespace representing the implicit top-level namespace of a source. */\r\nexport class Filespace extends Element {\r\n\r\n kind = ElementKind.FILESPACE;\r\n\r\n /** File members (externally visible only). */\r\n members: Map; // more specific\r\n\r\n /** Constructs a new filespace. */\r\n constructor(\r\n program: Program,\r\n source: Source\r\n ) {\r\n super(program, source.internalPath, FILESPACE_PREFIX + source.internalPath);\r\n this.members = new Map();\r\n }\r\n}\r\n\r\n/** A namespace that differs from a filespace in being user-declared with a name. */\r\nexport class Namespace extends Element {\r\n\r\n // All elements have namespace semantics. This is an explicitly declared one.\r\n kind = ElementKind.NAMESPACE;\r\n\r\n /** Declaration reference. */\r\n declaration: NamespaceDeclaration; // more specific\r\n\r\n /** Constructs a new namespace. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: NamespaceDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n this.flags = declaration.flags;\r\n }\r\n}\r\n\r\n/** An enum. */\r\nexport class Enum extends Element {\r\n\r\n kind = ElementKind.ENUM;\r\n\r\n /** Declaration reference. */\r\n declaration: EnumDeclaration;\r\n\r\n /** Constructs a new enum. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: EnumDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n this.flags = declaration.flags;\r\n }\r\n}\r\n\r\n/** An enum value. */\r\nexport class EnumValue extends Element {\r\n\r\n kind = ElementKind.ENUMVALUE;\r\n\r\n /** Declaration reference. */\r\n declaration: EnumValueDeclaration;\r\n /** Constant value, if applicable. */\r\n constantValue: i32 = 0;\r\n\r\n constructor(\r\n enm: Enum,\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: EnumValueDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.parent = enm;\r\n this.declaration = declaration;\r\n }\r\n}\r\n\r\nexport const enum ConstantValueKind {\r\n NONE,\r\n INTEGER,\r\n FLOAT\r\n}\r\n\r\nexport class VariableLikeElement extends Element {\r\n\r\n // kind varies\r\n\r\n /** Declaration reference. */\r\n declaration: VariableLikeDeclarationStatement | null;\r\n /** Variable type. Is {@link Type.void} for type-inferred {@link Global}s before compilation. */\r\n type: Type;\r\n /** Constant value kind. */\r\n constantValueKind: ConstantValueKind = ConstantValueKind.NONE;\r\n /** Constant integer value, if applicable. */\r\n constantIntegerValue: I64;\r\n /** Constant float value, if applicable. */\r\n constantFloatValue: f64;\r\n\r\n protected constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n type: Type,\r\n declaration: VariableLikeDeclarationStatement | null\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.type = type;\r\n this.declaration = declaration;\r\n }\r\n\r\n withConstantIntegerValue(value: I64): this {\r\n this.constantValueKind = ConstantValueKind.INTEGER;\r\n this.constantIntegerValue = value;\r\n this.set(CommonFlags.CONST | CommonFlags.INLINED);\r\n return this;\r\n }\r\n\r\n withConstantFloatValue(value: f64): this {\r\n this.constantValueKind = ConstantValueKind.FLOAT;\r\n this.constantFloatValue = value;\r\n this.set(CommonFlags.CONST | CommonFlags.INLINED);\r\n return this;\r\n }\r\n}\r\n\r\n/** A global variable. */\r\nexport class Global extends VariableLikeElement {\r\n\r\n kind = ElementKind.GLOBAL;\r\n\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n type: Type,\r\n declaration: VariableLikeDeclarationStatement | null,\r\n decoratorFlags: DecoratorFlags\r\n ) {\r\n super(program, simpleName, internalName, type, declaration);\r\n this.flags = declaration ? declaration.flags : CommonFlags.NONE;\r\n this.decoratorFlags = decoratorFlags;\r\n this.type = type; // resolved later if `void`\r\n }\r\n}\r\n\r\n/** A function parameter. */\r\nexport class Parameter {\r\n\r\n // not an Element on its own\r\n\r\n /** Parameter name. */\r\n name: string;\r\n /** Parameter type. */\r\n type: Type;\r\n /** Parameter initializer. */\r\n initializer: Expression | null;\r\n\r\n /** Constructs a new function parameter. */\r\n constructor(name: string, type: Type, initializer: Expression | null = null) {\r\n this.name = name;\r\n this.type = type;\r\n this.initializer = initializer;\r\n }\r\n}\r\n\r\n/** A function local. */\r\nexport class Local extends VariableLikeElement {\r\n\r\n kind = ElementKind.LOCAL;\r\n\r\n /** Local index. */\r\n index: i32;\r\n /** Respective scoped global, if any. */\r\n scopedGlobal: Global | null = null;\r\n\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n index: i32,\r\n type: Type,\r\n declaration: VariableLikeDeclarationStatement | null = null\r\n ) {\r\n super(program, simpleName, simpleName, type, declaration);\r\n this.index = index;\r\n }\r\n}\r\n\r\n/** A yet unresolved function prototype. */\r\nexport class FunctionPrototype extends Element {\r\n\r\n kind = ElementKind.FUNCTION_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: FunctionDeclaration;\r\n /** If an instance method, the class prototype reference. */\r\n classPrototype: ClassPrototype | null;\r\n /** Resolved instances by class type arguments and function type arguments. */\r\n instances: Map> = new Map();\r\n /** Class type arguments, if a partially resolved method of a generic class. Not set otherwise. */\r\n classTypeArguments: Type[] | null = null;\r\n /** Operator kind, if an overload. */\r\n operatorKind: OperatorKind = OperatorKind.INVALID;\r\n\r\n /** Constructs a new function prototype. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: FunctionDeclaration,\r\n classPrototype: ClassPrototype | null = null,\r\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n this.flags = declaration.flags;\r\n this.classPrototype = classPrototype;\r\n this.decoratorFlags = decoratorFlags;\r\n }\r\n\r\n /** Applies class type arguments to the context of a partially resolved instance method. */\r\n applyClassTypeArguments(contextualTypeArguments: Map): void {\r\n var classTypeArguments = assert(this.classTypeArguments); // set only if partial\r\n var classDeclaration = assert(this.classPrototype).declaration;\r\n var classTypeParameters = classDeclaration.typeParameters;\r\n var numClassTypeParameters = classTypeParameters.length;\r\n assert(numClassTypeParameters == classTypeArguments.length);\r\n for (let i = 0; i < numClassTypeParameters; ++i) {\r\n contextualTypeArguments.set(\r\n classTypeParameters[i].name.text,\r\n classTypeArguments[i]\r\n );\r\n }\r\n }\r\n\r\n toString(): string { return this.simpleName; }\r\n}\r\n\r\n/** A resolved function. */\r\nexport class Function extends Element {\r\n\r\n kind = ElementKind.FUNCTION;\r\n\r\n /** Prototype reference. */\r\n prototype: FunctionPrototype;\r\n /** Function signature. */\r\n signature: Signature;\r\n /** Map of locals by name. */\r\n localsByName: Map = new Map();\r\n /** Array of locals by index. */\r\n localsByIndex: Local[] = [];\r\n /** List of additional non-parameter locals. */\r\n additionalLocals: Type[] = [];\r\n /** Current break context label. */\r\n breakContext: string | null = null;\r\n /** Contextual type arguments. */\r\n contextualTypeArguments: Map | null;\r\n /** Current control flow. */\r\n flow: Flow;\r\n /** Remembered debug locations. */\r\n debugLocations: Range[] = [];\r\n /** Function reference, if compiled. */\r\n ref: FunctionRef = 0;\r\n /** Function table index, if any. */\r\n functionTableIndex: i32 = -1;\r\n /** Trampoline function for calling with omitted arguments. */\r\n trampoline: Function | null = null;\r\n /** The outer scope, if a function expression. */\r\n outerScope: Flow | null = null;\r\n\r\n private nextBreakId: i32 = 0;\r\n private breakStack: i32[] | null = null;\r\n nextInlineId: i32 = 0;\r\n\r\n /** Constructs a new concrete function. */\r\n constructor(\r\n prototype: FunctionPrototype,\r\n internalName: string,\r\n signature: Signature,\r\n parent: Element | null = null,\r\n contextualTypeArguments: Map | null = null\r\n ) {\r\n super(prototype.program, prototype.simpleName, internalName);\r\n this.prototype = prototype;\r\n this.signature = signature;\r\n this.parent = parent;\r\n this.flags = prototype.flags;\r\n this.decoratorFlags = prototype.decoratorFlags;\r\n this.contextualTypeArguments = contextualTypeArguments;\r\n if (!(prototype.is(CommonFlags.AMBIENT))) {\r\n let localIndex = 0;\r\n if (parent && parent.kind == ElementKind.CLASS) {\r\n assert(this.is(CommonFlags.INSTANCE));\r\n let local = new Local(\r\n prototype.program,\r\n \"this\",\r\n localIndex++,\r\n assert(signature.thisType)\r\n );\r\n this.localsByName.set(\"this\", local);\r\n this.localsByIndex[local.index] = local;\r\n let inheritedTypeArguments = (parent).contextualTypeArguments;\r\n if (inheritedTypeArguments) {\r\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n for (let [inheritedName, inheritedType] of inheritedTypeArguments) {\r\n if (!this.contextualTypeArguments.has(inheritedName)) {\r\n this.contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n }\r\n } else {\r\n assert(!this.is(CommonFlags.INSTANCE)); // internal error\r\n }\r\n let parameterTypes = signature.parameterTypes;\r\n for (let i = 0, k = parameterTypes.length; i < k; ++i) {\r\n let parameterType = parameterTypes[i];\r\n let parameterName = signature.getParameterName(i);\r\n let local = new Local(\r\n prototype.program,\r\n parameterName,\r\n localIndex++,\r\n parameterType\r\n // FIXME: declaration?\r\n );\r\n this.localsByName.set(parameterName, local);\r\n this.localsByIndex[local.index] = local;\r\n }\r\n }\r\n this.flow = Flow.create(this);\r\n }\r\n\r\n /** Adds a local of the specified type, with an optional name. */\r\n addLocal(type: Type, name: string | null = null, declaration: VariableDeclaration | null = null): Local {\r\n // if it has a name, check previously as this method will throw otherwise\r\n var localIndex = this.signature.parameterTypes.length + this.additionalLocals.length;\r\n if (this.is(CommonFlags.INSTANCE)) ++localIndex;\r\n var local = new Local(\r\n this.prototype.program,\r\n name\r\n ? name\r\n : \"var$\" + localIndex.toString(10),\r\n localIndex,\r\n type,\r\n declaration\r\n );\r\n if (name) {\r\n if (this.localsByName.has(name)) throw new Error(\"duplicate local name\");\r\n this.localsByName.set(name, local);\r\n }\r\n this.localsByIndex[local.index] = local;\r\n this.additionalLocals.push(type);\r\n return local;\r\n }\r\n\r\n private tempI32s: Local[] | null = null;\r\n private tempI64s: Local[] | null = null;\r\n private tempF32s: Local[] | null = null;\r\n private tempF64s: Local[] | null = null;\r\n\r\n /** Gets a free temporary local of the specified type. */\r\n getTempLocal(type: Type, wrapped: bool = false): Local {\r\n var temps: Local[] | null;\r\n switch (type.toNativeType()) {\r\n case NativeType.I32: {\r\n temps = this.tempI32s;\r\n break;\r\n }\r\n case NativeType.I64: {\r\n temps = this.tempI64s;\r\n break;\r\n }\r\n case NativeType.F32: {\r\n temps = this.tempF32s;\r\n break;\r\n }\r\n case NativeType.F64: {\r\n temps = this.tempF64s;\r\n break;\r\n }\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n var local: Local;\r\n if (temps && temps.length) {\r\n local = temps.pop();\r\n local.type = type;\r\n local.flags = CommonFlags.NONE;\r\n } else {\r\n local = this.addLocal(type);\r\n }\r\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n this.flow.setLocalWrapped(local.index, wrapped);\r\n }\r\n return local;\r\n }\r\n\r\n /** Frees the temporary local for reuse. */\r\n freeTempLocal(local: Local): void {\r\n if (local.is(CommonFlags.INLINED)) return;\r\n assert(local.index >= 0);\r\n var temps: Local[];\r\n assert(local.type != null); // internal error\r\n switch ((local.type).toNativeType()) {\r\n case NativeType.I32: {\r\n temps = this.tempI32s || (this.tempI32s = []);\r\n break;\r\n }\r\n case NativeType.I64: {\r\n temps = this.tempI64s || (this.tempI64s = []);\r\n break;\r\n }\r\n case NativeType.F32: {\r\n temps = this.tempF32s || (this.tempF32s = []);\r\n break;\r\n }\r\n case NativeType.F64: {\r\n temps = this.tempF64s || (this.tempF64s = []);\r\n break;\r\n }\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n assert(local.index >= 0);\r\n temps.push(local);\r\n }\r\n\r\n /** Gets and immediately frees a temporary local of the specified type. */\r\n getAndFreeTempLocal(type: Type, wrapped: bool): Local {\r\n var temps: Local[];\r\n switch (type.toNativeType()) {\r\n case NativeType.I32: {\r\n temps = this.tempI32s || (this.tempI32s = []);\r\n break;\r\n }\r\n case NativeType.I64: {\r\n temps = this.tempI64s || (this.tempI64s = []);\r\n break;\r\n }\r\n case NativeType.F32: {\r\n temps = this.tempF32s || (this.tempF32s = []);\r\n break;\r\n }\r\n case NativeType.F64: {\r\n temps = this.tempF64s || (this.tempF64s = []);\r\n break;\r\n }\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n var local: Local;\r\n if (temps.length) {\r\n local = temps[temps.length - 1];\r\n local.type = type;\r\n } else {\r\n local = this.addLocal(type);\r\n temps.push(local);\r\n }\r\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n this.flow.setLocalWrapped(local.index, wrapped);\r\n }\r\n return local;\r\n }\r\n\r\n /** Enters a(nother) break context. */\r\n enterBreakContext(): string {\r\n var id = this.nextBreakId++;\r\n if (!this.breakStack) this.breakStack = [ id ];\r\n else this.breakStack.push(id);\r\n return this.breakContext = id.toString(10);\r\n }\r\n\r\n /** Leaves the current break context. */\r\n leaveBreakContext(): void {\r\n assert(this.breakStack != null);\r\n var length = (this.breakStack).length;\r\n assert(length > 0);\r\n (this.breakStack).pop();\r\n if (length > 1) {\r\n this.breakContext = (this.breakStack)[length - 2].toString(10);\r\n } else {\r\n this.breakContext = null;\r\n this.breakStack = null;\r\n }\r\n }\r\n\r\n /** Finalizes the function once compiled, releasing no longer needed resources. */\r\n finalize(module: Module, ref: FunctionRef): void {\r\n this.ref = ref;\r\n assert(!this.breakStack || !this.breakStack.length); // internal error\r\n this.breakStack = null;\r\n this.breakContext = null;\r\n this.tempI32s = this.tempI64s = this.tempF32s = this.tempF64s = null;\r\n if (this.program.options.sourceMap) {\r\n let debugLocations = this.debugLocations;\r\n for (let i = 0, k = debugLocations.length; i < k; ++i) {\r\n let debugLocation = debugLocations[i];\r\n module.setDebugLocation(\r\n ref,\r\n debugLocation.debugInfoRef,\r\n debugLocation.source.debugInfoIndex,\r\n debugLocation.line,\r\n debugLocation.column\r\n );\r\n }\r\n }\r\n }\r\n\r\n /** Returns the TypeScript representation of this function. */\r\n toString(): string { return this.prototype.simpleName; }\r\n}\r\n\r\n/** A resolved function target, that is a function called indirectly by an index and signature. */\r\nexport class FunctionTarget extends Element {\r\n\r\n kind = ElementKind.FUNCTION_TARGET;\r\n\r\n /** Underlying signature. */\r\n signature: Signature;\r\n /** Function type. */\r\n type: Type;\r\n\r\n /** Constructs a new function target. */\r\n constructor(program: Program, signature: Signature) {\r\n super(program, \"\", \"\");\r\n var simpleName = signature.toSignatureString();\r\n this.simpleName = simpleName;\r\n this.internalName = simpleName;\r\n this.signature = signature;\r\n this.type = Type.u32.asFunction(signature);\r\n }\r\n}\r\n\r\n/** A yet unresolved instance field prototype. */\r\nexport class FieldPrototype extends Element {\r\n\r\n kind = ElementKind.FIELD_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: FieldDeclaration;\r\n /** Parent class prototype. */\r\n classPrototype: ClassPrototype;\r\n\r\n /** Constructs a new field prototype. */\r\n constructor(\r\n classPrototype: ClassPrototype,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: FieldDeclaration\r\n ) {\r\n super(classPrototype.program, simpleName, internalName);\r\n this.classPrototype = classPrototype;\r\n this.declaration = declaration;\r\n this.flags = declaration.flags;\r\n }\r\n}\r\n\r\n/** A resolved instance field. */\r\nexport class Field extends VariableLikeElement {\r\n\r\n kind = ElementKind.FIELD;\r\n\r\n /** Field prototype reference. */\r\n prototype: FieldPrototype;\r\n /** Field memory offset, if an instance field. */\r\n memoryOffset: i32 = -1;\r\n\r\n /** Constructs a new field. */\r\n constructor(\r\n prototype: FieldPrototype,\r\n internalName: string,\r\n type: Type,\r\n declaration: FieldDeclaration,\r\n parent: Class\r\n ) {\r\n super(prototype.program, prototype.simpleName, internalName, type, declaration);\r\n this.prototype = prototype;\r\n this.flags = prototype.flags;\r\n this.type = type;\r\n this.parent = parent;\r\n }\r\n}\r\n\r\n/** A property comprised of a getter and a setter function. */\r\nexport class Property extends Element {\r\n\r\n kind = ElementKind.PROPERTY;\r\n\r\n /** Parent class prototype. */\r\n parent: ClassPrototype;\r\n /** Getter prototype. */\r\n getterPrototype: FunctionPrototype | null = null;\r\n /** Setter prototype. */\r\n setterPrototype: FunctionPrototype | null = null;\r\n\r\n /** Constructs a new property prototype. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n parent: ClassPrototype\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.parent = parent;\r\n }\r\n}\r\n\r\n/** A yet unresolved class prototype. */\r\nexport class ClassPrototype extends Element {\r\n\r\n kind = ElementKind.CLASS_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: ClassDeclaration;\r\n /** Resolved instances. */\r\n instances: Map = new Map();\r\n /** Instance member prototypes. */\r\n instanceMembers: Map | null = null;\r\n /** Base class prototype, if applicable. */\r\n basePrototype: ClassPrototype | null = null; // set in Program#initialize\r\n /** Constructor prototype. */\r\n constructorPrototype: FunctionPrototype | null = null;\r\n /** Operator overload prototypes. */\r\n overloadPrototypes: Map = new Map();\r\n\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: ClassDeclaration,\r\n decoratorFlags: DecoratorFlags\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n this.flags = declaration.flags;\r\n this.decoratorFlags = decoratorFlags;\r\n }\r\n\r\n toString(): string {\r\n return this.simpleName;\r\n }\r\n}\r\n\r\n/** A resolved class. */\r\nexport class Class extends Element {\r\n\r\n kind = ElementKind.CLASS;\r\n\r\n /** Prototype reference. */\r\n prototype: ClassPrototype;\r\n /** Resolved type arguments. */\r\n typeArguments: Type[] | null;\r\n /** Resolved class type. */\r\n type: Type;\r\n /** Base class, if applicable. */\r\n base: Class | null;\r\n /** Contextual type arguments for fields and methods. */\r\n contextualTypeArguments: Map | null = null;\r\n /** Current member memory offset. */\r\n currentMemoryOffset: u32 = 0;\r\n /** Constructor instance. */\r\n constructorInstance: Function | null = null;\r\n /** Operator overloads. */\r\n overloads: Map | null = null;\r\n /** Function index of the GC hook. */\r\n gcHookIndex: u32 = -1;\r\n\r\n /** Constructs a new class. */\r\n constructor(\r\n prototype: ClassPrototype,\r\n simpleName: string,\r\n internalName: string,\r\n typeArguments: Type[] | null = null,\r\n base: Class | null = null\r\n ) {\r\n super(prototype.program, simpleName, internalName);\r\n this.prototype = prototype;\r\n this.flags = prototype.flags;\r\n this.decoratorFlags = prototype.decoratorFlags;\r\n this.typeArguments = typeArguments;\r\n this.type = prototype.program.options.usizeType.asClass(this);\r\n this.base = base;\r\n\r\n // inherit static members and contextual type arguments from base class\r\n if (base) {\r\n let inheritedTypeArguments = base.contextualTypeArguments;\r\n if (inheritedTypeArguments) {\r\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n for (let [baseName, baseType] of inheritedTypeArguments) {\r\n this.contextualTypeArguments.set(baseName, baseType);\r\n }\r\n }\r\n }\r\n\r\n // apply instance-specific contextual type arguments\r\n var declaration = this.prototype.declaration;\r\n var i: i32, k: i32;\r\n if (declaration) { // irrelevant for built-ins\r\n let typeParameters = declaration.typeParameters;\r\n if (typeArguments) {\r\n if ((k = typeArguments.length) != typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n if (k) {\r\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n for (i = 0; i < k; ++i) {\r\n this.contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n }\r\n } else if (typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n }\r\n }\r\n\r\n /** Tests if a value of this class type is assignable to a target of the specified class type. */\r\n isAssignableTo(target: Class): bool {\r\n var current: Class | null = this;\r\n do if (current == target) return true;\r\n while (current = current.base);\r\n return false;\r\n }\r\n\r\n /** Looks up the operator overload of the specified kind. */\r\n lookupOverload(kind: OperatorKind, unchecked: bool = false): Function | null {\r\n if (unchecked) {\r\n switch (kind) {\r\n case OperatorKind.INDEXED_GET: {\r\n let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_GET);\r\n if (uncheckedOverload) return uncheckedOverload;\r\n break;\r\n }\r\n case OperatorKind.INDEXED_SET: {\r\n let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_SET);\r\n if (uncheckedOverload) return uncheckedOverload;\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n var instance: Class | null = this;\r\n do {\r\n let overloads = instance.overloads;\r\n if (overloads) {\r\n let overload = overloads.get(kind);\r\n if (overload) return overload;\r\n }\r\n } while (instance = instance.base);\r\n return null;\r\n }\r\n\r\n offsetof(fieldName: string): u32 {\r\n var members = assert(this.members);\r\n assert(members.has(fieldName));\r\n var field = members.get(fieldName);\r\n assert(field.kind == ElementKind.FIELD);\r\n return (field).memoryOffset;\r\n }\r\n\r\n toString(): string {\r\n return this.simpleName;\r\n }\r\n}\r\n\r\n/** A yet unresolved interface. */\r\nexport class InterfacePrototype extends ClassPrototype {\r\n\r\n kind = ElementKind.INTERFACE_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: InterfaceDeclaration; // more specific\r\n\r\n /** Constructs a new interface prototype. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: InterfaceDeclaration,\r\n decoratorFlags: DecoratorFlags\r\n ) {\r\n super(program, simpleName, internalName, declaration, decoratorFlags);\r\n }\r\n}\r\n\r\n/** A resolved interface. */\r\nexport class Interface extends Class {\r\n\r\n kind = ElementKind.INTERFACE;\r\n\r\n /** Prototype reference. */\r\n prototype: InterfacePrototype; // more specific\r\n /** Base interface, if applcable. */\r\n base: Interface | null; // more specific\r\n\r\n /** Constructs a new interface. */\r\n constructor(\r\n prototype: InterfacePrototype,\r\n simpleName: string,\r\n internalName: string,\r\n typeArguments: Type[] = [],\r\n base: Interface | null = null\r\n ) {\r\n super(prototype, simpleName, internalName, typeArguments, base);\r\n }\r\n}\r\n\r\n/** Control flow flags indicating specific conditions. */\r\nexport const enum FlowFlags {\r\n /** No specific conditions. */\r\n NONE = 0,\r\n\r\n // categorical\r\n\r\n /** This branch always returns. */\r\n RETURNS = 1 << 0,\r\n /** This branch always returns a wrapped value. */\r\n RETURNS_WRAPPED = 1 << 1,\r\n /** This branch always throws. */\r\n THROWS = 1 << 2,\r\n /** This branch always breaks. */\r\n BREAKS = 1 << 3,\r\n /** This branch always continues. */\r\n CONTINUES = 1 << 4,\r\n /** This branch always allocates. Constructors only. */\r\n ALLOCATES = 1 << 5,\r\n\r\n // conditional\r\n\r\n /** This branch conditionally returns in a child branch. */\r\n CONDITIONALLY_RETURNS = 1 << 6,\r\n /** This branch conditionally throws in a child branch. */\r\n CONDITIONALLY_THROWS = 1 << 7,\r\n /** This branch conditionally breaks in a child branch. */\r\n CONDITIONALLY_BREAKS = 1 << 8,\r\n /** This branch conditionally continues in a child branch. */\r\n CONDITIONALLY_CONTINUES = 1 << 9,\r\n /** This branch conditionally allocates in a child branch. Constructors only. */\r\n CONDITIONALLY_ALLOCATES = 1 << 10,\r\n\r\n // special\r\n\r\n /** This branch is part of inlining a function. */\r\n INLINE_CONTEXT = 1 << 11,\r\n /** This branch explicitly requests no bounds checking. */\r\n UNCHECKED_CONTEXT = 1 << 12,\r\n\r\n // masks\r\n\r\n /** Any terminating flag. */\r\n ANY_TERMINATING = FlowFlags.RETURNS\r\n | FlowFlags.THROWS\r\n | FlowFlags.BREAKS\r\n | FlowFlags.CONTINUES,\r\n\r\n /** Any categorical flag. */\r\n ANY_CATEGORICAL = FlowFlags.RETURNS\r\n | FlowFlags.RETURNS_WRAPPED\r\n | FlowFlags.THROWS\r\n | FlowFlags.BREAKS\r\n | FlowFlags.CONTINUES\r\n | FlowFlags.ALLOCATES,\r\n\r\n /** Any conditional flag. */\r\n ANY_CONDITIONAL = FlowFlags.CONDITIONALLY_RETURNS\r\n | FlowFlags.CONDITIONALLY_THROWS\r\n | FlowFlags.CONDITIONALLY_BREAKS\r\n | FlowFlags.CONDITIONALLY_CONTINUES\r\n | FlowFlags.CONDITIONALLY_ALLOCATES\r\n}\r\n\r\n/** A control flow evaluator. */\r\nexport class Flow {\r\n\r\n /** Parent flow. */\r\n parent: Flow | null;\r\n /** Flow flags indicating specific conditions. */\r\n flags: FlowFlags;\r\n /** Function this flow belongs to. */\r\n currentFunction: Function;\r\n /** The label we break to when encountering a continue statement. */\r\n continueLabel: string | null;\r\n /** The label we break to when encountering a break statement. */\r\n breakLabel: string | null;\r\n /** The label we break to when encountering a return statement, when inlining. */\r\n returnLabel: string | null;\r\n /** The current return type. */\r\n returnType: Type;\r\n /** The current contextual type arguments. */\r\n contextualTypeArguments: Map | null;\r\n /** Scoped local variables. */\r\n scopedLocals: Map | null = null;\r\n /** Local variable wrap states for the first 64 locals. */\r\n wrappedLocals: I64;\r\n /** Local variable wrap states for locals with index >= 64. */\r\n wrappedLocalsExt: I64[] | null;\r\n\r\n /** Creates the parent flow of the specified function. */\r\n static create(currentFunction: Function): Flow {\r\n var parentFlow = new Flow();\r\n parentFlow.parent = null;\r\n parentFlow.flags = FlowFlags.NONE;\r\n parentFlow.currentFunction = currentFunction;\r\n parentFlow.continueLabel = null;\r\n parentFlow.breakLabel = null;\r\n parentFlow.returnLabel = null;\r\n parentFlow.returnType = currentFunction.signature.returnType;\r\n parentFlow.contextualTypeArguments = currentFunction.contextualTypeArguments;\r\n parentFlow.wrappedLocals = i64_new(0);\r\n parentFlow.wrappedLocalsExt = null;\r\n return parentFlow;\r\n }\r\n\r\n private constructor() { }\r\n\r\n /** Tests if this flow has the specified flag or flags. */\r\n is(flag: FlowFlags): bool { return (this.flags & flag) == flag; }\r\n /** Tests if this flow has one of the specified flags. */\r\n isAny(flag: FlowFlags): bool { return (this.flags & flag) != 0; }\r\n /** Sets the specified flag or flags. */\r\n set(flag: FlowFlags): void { this.flags |= flag; }\r\n /** Unsets the specified flag or flags. */\r\n unset(flag: FlowFlags): void { this.flags &= ~flag; }\r\n\r\n /** Forks this flow to a child flow. */\r\n fork(): Flow {\r\n var branch = new Flow();\r\n branch.parent = this;\r\n branch.flags = this.flags;\r\n branch.currentFunction = this.currentFunction;\r\n branch.continueLabel = this.continueLabel;\r\n branch.breakLabel = this.breakLabel;\r\n branch.returnLabel = this.returnLabel;\r\n branch.returnType = this.returnType;\r\n branch.contextualTypeArguments = this.contextualTypeArguments;\r\n branch.wrappedLocals = this.wrappedLocals;\r\n branch.wrappedLocalsExt = this.wrappedLocalsExt ? this.wrappedLocalsExt.slice() : null;\r\n return branch;\r\n }\r\n\r\n /** Frees this flow's scoped variables. */\r\n free(): Flow {\r\n var parent = assert(this.parent);\r\n if (this.scopedLocals) { // free block-scoped locals\r\n for (let scopedLocal of this.scopedLocals.values()) {\r\n if (scopedLocal.is(CommonFlags.SCOPED)) { // otherwise an alias\r\n this.currentFunction.freeTempLocal(scopedLocal);\r\n }\r\n }\r\n this.scopedLocals = null;\r\n }\r\n return parent;\r\n }\r\n\r\n /** Adds a new scoped local of the specified name. */\r\n addScopedLocal(type: Type, name: string, wrapped: bool, declaration?: VariableDeclaration): Local {\r\n var scopedLocal = this.currentFunction.getTempLocal(type, false);\r\n if (!this.scopedLocals) this.scopedLocals = new Map();\r\n else {\r\n let existingLocal = this.scopedLocals.get(name);\r\n if (existingLocal) {\r\n if (declaration) {\r\n this.currentFunction.program.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range\r\n );\r\n } else assert(false);\r\n return existingLocal;\r\n }\r\n }\r\n scopedLocal.set(CommonFlags.SCOPED);\r\n this.scopedLocals.set(name, scopedLocal);\r\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n this.setLocalWrapped(scopedLocal.index, wrapped);\r\n }\r\n return scopedLocal;\r\n }\r\n\r\n /** Adds a new scoped alias for the specified local. */\r\n addScopedLocalAlias(index: i32, type: Type, name: string): Local {\r\n if (!this.scopedLocals) this.scopedLocals = new Map();\r\n else {\r\n let existingLocal = this.scopedLocals.get(name);\r\n if (existingLocal) {\r\n let declaration = existingLocal.declaration;\r\n if (declaration) {\r\n this.currentFunction.program.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range\r\n );\r\n } else assert(false);\r\n return existingLocal;\r\n }\r\n }\r\n assert(index < this.currentFunction.localsByIndex.length);\r\n var scopedAlias = new Local( // not SCOPED as an indicator that it isn't automatically free'd\r\n this.currentFunction.program,\r\n name,\r\n index,\r\n type,\r\n null\r\n );\r\n this.scopedLocals.set(name, scopedAlias);\r\n return scopedAlias;\r\n }\r\n\r\n /** Gets the local of the specified name in the current scope. */\r\n getScopedLocal(name: string): Local | null {\r\n var local: Local | null;\r\n var current: Flow | null = this;\r\n do {\r\n if (current.scopedLocals && (local = current.scopedLocals.get(name))) {\r\n return local;\r\n }\r\n } while (current = current.parent);\r\n return this.currentFunction.localsByName.get(name);\r\n }\r\n\r\n /** Tests if the local with the specified index is considered wrapped. */\r\n isLocalWrapped(index: i32): bool {\r\n var map: I64;\r\n var ext: I64[] | null;\r\n if (index < 64) {\r\n if (index < 0) return true; // inlined constant\r\n map = this.wrappedLocals;\r\n } else if (ext = this.wrappedLocalsExt) {\r\n let i = ((index - 64) / 64) | 0;\r\n if (i >= ext.length) return false;\r\n map = ext[i];\r\n index -= (i + 1) * 64;\r\n } else {\r\n return false;\r\n }\r\n return i64_ne(\r\n i64_and(\r\n map,\r\n i64_shl(\r\n i64_one,\r\n i64_new(index)\r\n )\r\n ),\r\n i64_zero\r\n );\r\n }\r\n\r\n /** Sets if the local with the specified index is considered wrapped. */\r\n setLocalWrapped(index: i32, wrapped: bool): void {\r\n var map: I64;\r\n var off: i32 = -1;\r\n if (index < 64) {\r\n if (index < 0) return; // inlined constant\r\n map = this.wrappedLocals;\r\n } else {\r\n let ext = this.wrappedLocalsExt;\r\n off = ((index - 64) / 64) | 0;\r\n if (!ext) {\r\n this.wrappedLocalsExt = ext = new Array(off + 1);\r\n ext.length = 0;\r\n }\r\n while (ext.length <= off) ext.push(i64_new(0));\r\n map = ext[off];\r\n index -= (off + 1) * 64;\r\n }\r\n map = wrapped\r\n ? i64_or(\r\n map,\r\n i64_shl(\r\n i64_one,\r\n i64_new(index)\r\n )\r\n )\r\n : i64_and(\r\n map,\r\n i64_not(\r\n i64_shl(\r\n i64_one,\r\n i64_new(index)\r\n )\r\n )\r\n );\r\n if (off >= 0) (this.wrappedLocalsExt)[off] = map;\r\n else this.wrappedLocals = map;\r\n }\r\n\r\n /** Inherits flags and local wrap states from the specified flow (e.g. blocks). */\r\n inherit(other: Flow): void {\r\n this.flags |= other.flags & (FlowFlags.ANY_CATEGORICAL | FlowFlags.ANY_CONDITIONAL);\r\n this.wrappedLocals = other.wrappedLocals;\r\n this.wrappedLocalsExt = other.wrappedLocalsExt; // no need to slice because other flow is finished\r\n }\r\n\r\n /** Inherits categorical flags as conditional flags from the specified flow (e.g. then without else). */\r\n inheritConditional(other: Flow): void {\r\n if (other.is(FlowFlags.RETURNS)) {\r\n this.set(FlowFlags.CONDITIONALLY_RETURNS);\r\n }\r\n if (other.is(FlowFlags.THROWS)) {\r\n this.set(FlowFlags.CONDITIONALLY_THROWS);\r\n }\r\n if (other.is(FlowFlags.BREAKS) && other.breakLabel == this.breakLabel) {\r\n this.set(FlowFlags.CONDITIONALLY_BREAKS);\r\n }\r\n if (other.is(FlowFlags.CONTINUES) && other.continueLabel == this.continueLabel) {\r\n this.set(FlowFlags.CONDITIONALLY_CONTINUES);\r\n }\r\n if (other.is(FlowFlags.ALLOCATES)) {\r\n this.set(FlowFlags.CONDITIONALLY_ALLOCATES);\r\n }\r\n }\r\n\r\n /** Inherits mutual flags and local wrap states from the specified flows (e.g. then with else). */\r\n inheritMutual(left: Flow, right: Flow): void {\r\n // categorical flags set in both arms\r\n this.flags |= left.flags & right.flags & FlowFlags.ANY_CATEGORICAL;\r\n\r\n // conditional flags set in at least one arm\r\n this.flags |= left.flags & FlowFlags.ANY_CONDITIONAL;\r\n this.flags |= right.flags & FlowFlags.ANY_CONDITIONAL;\r\n\r\n // locals wrapped in both arms\r\n this.wrappedLocals = i64_and(left.wrappedLocals, right.wrappedLocals);\r\n var leftExt = left.wrappedLocalsExt;\r\n var rightExt = right.wrappedLocalsExt;\r\n if (leftExt != null && rightExt != null) {\r\n let thisExt = this.wrappedLocalsExt;\r\n let minLength = min(leftExt.length, rightExt.length);\r\n if (minLength) {\r\n if (!thisExt) thisExt = new Array(minLength);\r\n else while (thisExt.length < minLength) thisExt.push(i64_new(0));\r\n for (let i = 0; i < minLength; ++i) {\r\n thisExt[i] = i64_and(\r\n leftExt[i],\r\n rightExt[i]\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Tests if an expression can possibly overflow in the context of this flow. Assumes that the\r\n * expression might already have overflown and returns `false` only if the operation neglects\r\n * any possible combination of garbage bits being present.\r\n */\r\n canOverflow(expr: ExpressionRef, type: Type): bool {\r\n // TODO: the following catches most common and a few uncommon cases, but there are additional\r\n // opportunities here, obviously.\r\n assert(type != Type.void);\r\n\r\n // types other than i8, u8, i16, u16 and bool do not overflow\r\n if (!type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) return false;\r\n\r\n var operand: ExpressionRef;\r\n switch (getExpressionId(expr)) {\r\n\r\n // overflows if the local isn't wrapped or the conversion does\r\n case ExpressionId.GetLocal: {\r\n let currentFunction = this.currentFunction;\r\n let local = currentFunction.localsByIndex[getGetLocalIndex(expr)];\r\n return !currentFunction.flow.isLocalWrapped(local.index)\r\n || canConversionOverflow(local.type, type);\r\n }\r\n\r\n // overflows if the value does\r\n case ExpressionId.SetLocal: { // tee\r\n assert(isTeeLocal(expr));\r\n return this.canOverflow(getSetLocalValue(expr), type);\r\n }\r\n\r\n // overflows if the conversion does (globals are wrapped on set)\r\n case ExpressionId.GetGlobal: {\r\n // TODO: this is inefficient because it has to read a string\r\n let global = assert(this.currentFunction.program.elementsLookup.get(assert(getGetGlobalName(expr))));\r\n assert(global.kind == ElementKind.GLOBAL);\r\n return canConversionOverflow(assert((global).type), type);\r\n }\r\n\r\n case ExpressionId.Binary: {\r\n switch (getBinaryOp(expr)) {\r\n\r\n // comparisons do not overflow (result is 0 or 1)\r\n case BinaryOp.EqI32:\r\n case BinaryOp.EqI64:\r\n case BinaryOp.EqF32:\r\n case BinaryOp.EqF64:\r\n case BinaryOp.NeI32:\r\n case BinaryOp.NeI64:\r\n case BinaryOp.NeF32:\r\n case BinaryOp.NeF64:\r\n case BinaryOp.LtI32:\r\n case BinaryOp.LtU32:\r\n case BinaryOp.LtI64:\r\n case BinaryOp.LtU64:\r\n case BinaryOp.LtF32:\r\n case BinaryOp.LtF64:\r\n case BinaryOp.LeI32:\r\n case BinaryOp.LeU32:\r\n case BinaryOp.LeI64:\r\n case BinaryOp.LeU64:\r\n case BinaryOp.LeF32:\r\n case BinaryOp.LeF64:\r\n case BinaryOp.GtI32:\r\n case BinaryOp.GtU32:\r\n case BinaryOp.GtI64:\r\n case BinaryOp.GtU64:\r\n case BinaryOp.GtF32:\r\n case BinaryOp.GtF64:\r\n case BinaryOp.GeI32:\r\n case BinaryOp.GeU32:\r\n case BinaryOp.GeI64:\r\n case BinaryOp.GeU64:\r\n case BinaryOp.GeF32:\r\n case BinaryOp.GeF64: return false;\r\n\r\n // result won't overflow if one side is 0 or if one side is 1 and the other wrapped\r\n case BinaryOp.MulI32: {\r\n return !(\r\n (\r\n getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\r\n (\r\n getConstValueI32(operand) == 0 ||\r\n (\r\n getConstValueI32(operand) == 1 &&\r\n !this.canOverflow(getBinaryRight(expr), type)\r\n )\r\n )\r\n ) || (\r\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n (\r\n getConstValueI32(operand) == 0 ||\r\n (\r\n getConstValueI32(operand) == 1 &&\r\n !this.canOverflow(getBinaryLeft(expr), type)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n\r\n // result won't overflow if one side is a constant less than this type's mask or one side\r\n // is wrapped\r\n case BinaryOp.AndI32: {\r\n // note that computeSmallIntegerMask returns the mask minus the MSB for signed types\r\n // because signed value garbage bits must be guaranteed to be equal to the MSB.\r\n return !(\r\n (\r\n (\r\n getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\r\n getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\r\n ) || !this.canOverflow(operand, type)\r\n ) || (\r\n (\r\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\r\n ) || !this.canOverflow(operand, type)\r\n )\r\n );\r\n }\r\n\r\n // overflows if the shift doesn't clear potential garbage bits\r\n case BinaryOp.ShlI32: {\r\n let shift = 32 - type.size;\r\n return getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const\r\n || getConstValueI32(operand) < shift;\r\n }\r\n\r\n // overflows if the value does and the shift doesn't clear potential garbage bits\r\n case BinaryOp.ShrI32: {\r\n let shift = 32 - type.size;\r\n return this.canOverflow(getBinaryLeft(expr), type) && (\r\n getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const ||\r\n getConstValueI32(operand) < shift\r\n );\r\n }\r\n\r\n // overflows if the shift does not clear potential garbage bits. if an unsigned value is\r\n // wrapped, it can't overflow.\r\n case BinaryOp.ShrU32: {\r\n let shift = 32 - type.size;\r\n return type.is(TypeFlags.SIGNED)\r\n ? !(\r\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n getConstValueI32(operand) > shift // must clear MSB\r\n )\r\n : this.canOverflow(getBinaryLeft(expr), type) && !(\r\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n getConstValueI32(operand) >= shift // can leave MSB\r\n );\r\n }\r\n\r\n // overflows if any side does\r\n case BinaryOp.DivU32:\r\n case BinaryOp.RemI32:\r\n case BinaryOp.RemU32: {\r\n return this.canOverflow(getBinaryLeft(expr), type)\r\n || this.canOverflow(getBinaryRight(expr), type);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case ExpressionId.Unary: {\r\n switch (getUnaryOp(expr)) {\r\n\r\n // comparisons do not overflow (result is 0 or 1)\r\n case UnaryOp.EqzI32:\r\n case UnaryOp.EqzI64: return false;\r\n\r\n // overflow if the maximum result (32) cannot be represented in the target type\r\n case UnaryOp.ClzI32:\r\n case UnaryOp.CtzI32:\r\n case UnaryOp.PopcntI32: return type.size < 7;\r\n }\r\n break;\r\n }\r\n\r\n // overflows if the value cannot be represented in the target type\r\n case ExpressionId.Const: {\r\n let value: i32 = 0;\r\n switch (getExpressionType(expr)) {\r\n case NativeType.I32: { value = getConstValueI32(expr); break; }\r\n case NativeType.I64: { value = getConstValueI64Low(expr); break; } // discards upper bits\r\n case NativeType.F32: { value = i32(getConstValueF32(expr)); break; }\r\n case NativeType.F64: { value = i32(getConstValueF64(expr)); break; }\r\n default: assert(false);\r\n }\r\n switch (type.kind) {\r\n case TypeKind.I8: return value < i8.MIN_VALUE || value > i8.MAX_VALUE;\r\n case TypeKind.I16: return value < i16.MIN_VALUE || value > i16.MAX_VALUE;\r\n case TypeKind.U8: return value < 0 || value > u8.MAX_VALUE;\r\n case TypeKind.U16: return value < 0 || value > u16.MAX_VALUE;\r\n case TypeKind.BOOL: return (value & ~1) != 0;\r\n }\r\n break;\r\n }\r\n\r\n // overflows if the conversion does\r\n case ExpressionId.Load: {\r\n let fromType: Type;\r\n switch (getLoadBytes(expr)) {\r\n case 1: { fromType = isLoadSigned(expr) ? Type.i8 : Type.u8; break; }\r\n case 2: { fromType = isLoadSigned(expr) ? Type.i16 : Type.u16; break; }\r\n default: { fromType = isLoadSigned(expr) ? Type.i32 : Type.u32; break; }\r\n }\r\n return canConversionOverflow(fromType, type);\r\n }\r\n\r\n // overflows if the result does, which is either\r\n // - the last expression of the block, by contract, if the block doesn't have a label\r\n // - the last expression or the value of an inner br if the block has a label (TODO)\r\n case ExpressionId.Block: {\r\n if (!getBlockName(expr)) {\r\n let size = assert(getBlockChildCount(expr));\r\n let last = getBlockChild(expr, size - 1);\r\n return this.canOverflow(last, type);\r\n }\r\n // actually, brs with a value that'd be handled here is not emitted atm\r\n break;\r\n }\r\n\r\n // overflows if either side does\r\n case ExpressionId.If: {\r\n return this.canOverflow(getIfTrue(expr), type)\r\n || this.canOverflow(assert(getIfFalse(expr)), type);\r\n }\r\n\r\n // overflows if either side does\r\n case ExpressionId.Select: {\r\n return this.canOverflow(getSelectThen(expr), type)\r\n || this.canOverflow(getSelectElse(expr), type);\r\n }\r\n\r\n // overflows if the call does not return a wrapped value or the conversion does\r\n case ExpressionId.Call: {\r\n let program = this.currentFunction.program;\r\n let instance = assert(program.instancesLookup.get(assert(getCallTarget(expr))));\r\n assert(instance.kind == ElementKind.FUNCTION);\r\n let returnType = (instance).signature.returnType;\r\n return !(instance).flow.is(FlowFlags.RETURNS_WRAPPED)\r\n || canConversionOverflow(returnType, type);\r\n }\r\n\r\n // doesn't technically overflow\r\n case ExpressionId.Unreachable: return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** Finalizes this flow. Must be the topmost parent flow of the function. */\r\n finalize(): void {\r\n assert(this.parent == null); // must be the topmost parent flow\r\n this.continueLabel = null;\r\n this.breakLabel = null;\r\n this.returnLabel = null;\r\n this.contextualTypeArguments = null;\r\n }\r\n}\r\n\r\n/** Tests if a conversion from one type to another can technically overflow. */\r\nfunction canConversionOverflow(fromType: Type, toType: Type): bool {\r\n return !fromType.is(TypeFlags.INTEGER) // non-i32 locals or returns\r\n || fromType.size > toType.size\r\n || fromType.is(TypeFlags.SIGNED) != toType.is(TypeFlags.SIGNED);\r\n}\r\n","/**\r\n * A thin wrapper around Binaryen's C-API.\r\n * @module module\r\n *//***/\r\n\r\nimport {\r\n Target\r\n} from \"./compiler\";\r\n\r\nexport type ModuleRef = usize;\r\nexport type FunctionTypeRef = usize;\r\nexport type FunctionRef = usize;\r\nexport type ExpressionRef = usize;\r\nexport type GlobalRef = usize;\r\nexport type ImportRef = usize;\r\nexport type ExportRef = usize;\r\nexport type RelooperRef = usize;\r\nexport type RelooperBlockRef = usize;\r\nexport type Index = u32;\r\n\r\nexport const enum NativeType {\r\n None = 0, // _BinaryenTypeNone(),\r\n I32 = 1, // _BinaryenTypeInt32(),\r\n I64 = 2, // _BinaryenTypeInt64(),\r\n F32 = 3, // _BinaryenTypeFloat32(),\r\n F64 = 4, // _BinaryenTypeFloat64(),\r\n Unreachable = 5, // _BinaryenTypeUnreachable(),\r\n Auto = -1 // _BinaryenTypeAuto()\r\n}\r\n\r\nexport enum ExpressionId {\r\n Invalid = _BinaryenInvalidId(),\r\n Block = _BinaryenBlockId(),\r\n If = _BinaryenIfId(),\r\n Loop = _BinaryenLoopId(),\r\n Break = _BinaryenBreakId(),\r\n Switch = _BinaryenSwitchId(),\r\n Call = _BinaryenCallId(),\r\n CallIndirect = _BinaryenCallIndirectId(),\r\n GetLocal = _BinaryenGetLocalId(),\r\n SetLocal = _BinaryenSetLocalId(),\r\n GetGlobal = _BinaryenGetGlobalId(),\r\n SetGlobal = _BinaryenSetGlobalId(),\r\n Load = _BinaryenLoadId(),\r\n Store = _BinaryenStoreId(),\r\n Const = _BinaryenConstId(),\r\n Unary = _BinaryenUnaryId(),\r\n Binary = _BinaryenBinaryId(),\r\n Select = _BinaryenSelectId(),\r\n Drop = _BinaryenDropId(),\r\n Return = _BinaryenReturnId(),\r\n Host = _BinaryenHostId(),\r\n Nop = _BinaryenNopId(),\r\n Unreachable = _BinaryenUnreachableId(),\r\n AtomicCmpxchg = _BinaryenAtomicCmpxchgId(),\r\n AtomicRMW = _BinaryenAtomicRMWId(),\r\n AtomicWait = _BinaryenAtomicWaitId(),\r\n AtomicWake = _BinaryenAtomicWakeId()\r\n // SIMDExtract = _BinaryenSIMDExtractId(),\r\n // SIMDReplace = _BinaryenSIMDReplaceId(),\r\n // SIMDShuffle = _BinaryenSIMDShuffleId(),\r\n // SIMDBitselect = _BinaryenSIMDBitselectId(),\r\n // SIMDShift = _BinaryenSIMDShiftId()\r\n}\r\n\r\nexport enum UnaryOp {\r\n ClzI32 = _BinaryenClzInt32(),\r\n CtzI32 = _BinaryenCtzInt32(),\r\n PopcntI32 = _BinaryenPopcntInt32(),\r\n NegF32 = _BinaryenNegFloat32(),\r\n AbsF32 = _BinaryenAbsFloat32(),\r\n CeilF32 = _BinaryenCeilFloat32(),\r\n FloorF32 = _BinaryenFloorFloat32(),\r\n TruncF32 = _BinaryenTruncFloat32(),\r\n NearestF32 = _BinaryenNearestFloat32(),\r\n SqrtF32 = _BinaryenSqrtFloat32(),\r\n EqzI32 = _BinaryenEqZInt32(),\r\n ClzI64 = _BinaryenClzInt64(),\r\n CtzI64 = _BinaryenCtzInt64(),\r\n PopcntI64 = _BinaryenPopcntInt64(),\r\n NegF64 = _BinaryenNegFloat64(),\r\n AbsF64 = _BinaryenAbsFloat64(),\r\n CeilF64 = _BinaryenCeilFloat64(),\r\n FloorF64 = _BinaryenFloorFloat64(),\r\n TruncF64 = _BinaryenTruncFloat64(),\r\n NearestF64 = _BinaryenNearestFloat64(),\r\n SqrtF64 = _BinaryenSqrtFloat64(),\r\n EqzI64 = _BinaryenEqZInt64(),\r\n ExtendI32 = _BinaryenExtendSInt32(),\r\n ExtendU32 = _BinaryenExtendUInt32(),\r\n WrapI64 = _BinaryenWrapInt64(),\r\n TruncF32ToI32 = _BinaryenTruncSFloat32ToInt32(),\r\n TruncF32ToI64 = _BinaryenTruncSFloat32ToInt64(),\r\n TruncF32ToU32 = _BinaryenTruncUFloat32ToInt32(),\r\n TruncF32ToU64 = _BinaryenTruncUFloat32ToInt64(),\r\n TruncF64ToI32 = _BinaryenTruncSFloat64ToInt32(),\r\n TruncF64ToI64 = _BinaryenTruncSFloat64ToInt64(),\r\n TruncF64ToU32 = _BinaryenTruncUFloat64ToInt32(),\r\n TruncF64ToU64 = _BinaryenTruncUFloat64ToInt64(),\r\n ReinterpretF32 = _BinaryenReinterpretFloat32(),\r\n ReinterpretF64 = _BinaryenReinterpretFloat64(),\r\n ConvertI32ToF32 = _BinaryenConvertSInt32ToFloat32(),\r\n ConvertI32ToF64 = _BinaryenConvertSInt32ToFloat64(),\r\n ConvertU32ToF32 = _BinaryenConvertUInt32ToFloat32(),\r\n ConvertU32ToF64 = _BinaryenConvertUInt32ToFloat64(),\r\n ConvertI64ToF32 = _BinaryenConvertSInt64ToFloat32(),\r\n ConvertI64ToF64 = _BinaryenConvertSInt64ToFloat64(),\r\n ConvertU64ToF32 = _BinaryenConvertUInt64ToFloat32(),\r\n ConvertU64ToF64 = _BinaryenConvertUInt64ToFloat64(),\r\n PromoteF32 = _BinaryenPromoteFloat32(),\r\n DemoteF64 = _BinaryenDemoteFloat64(),\r\n ReinterpretI32 = _BinaryenReinterpretInt32(),\r\n ReinterpretI64 = _BinaryenReinterpretInt64(),\r\n\r\n // see: https://github.com/WebAssembly/sign-extension-ops\r\n ExtendI8ToI32 = _BinaryenExtendS8Int32(),\r\n ExtendI16ToI32 = _BinaryenExtendS16Int32(),\r\n ExtendI8ToI64 = _BinaryenExtendS8Int64(),\r\n ExtendI16ToI64 = _BinaryenExtendS16Int64(),\r\n ExtendI32ToI64 = _BinaryenExtendS32Int64()\r\n\r\n // see: https://github.com/WebAssembly/nontrapping-float-to-int-conversions\r\n // TruncF32ToI32Sat\r\n // TruncF32ToU32Sat\r\n // TruncF64ToI32Sat\r\n // TruncF64ToU32Sat\r\n // TruncF32ToI64Sat\r\n // TruncF32ToU64Sat\r\n // TruncF64ToI64Sat\r\n // TruncF64ToU64Sat\r\n}\r\n\r\nexport enum BinaryOp {\r\n AddI32 = _BinaryenAddInt32(),\r\n SubI32 = _BinaryenSubInt32(),\r\n MulI32 = _BinaryenMulInt32(),\r\n DivI32 = _BinaryenDivSInt32(),\r\n DivU32 = _BinaryenDivUInt32(),\r\n RemI32 = _BinaryenRemSInt32(),\r\n RemU32 = _BinaryenRemUInt32(),\r\n AndI32 = _BinaryenAndInt32(),\r\n OrI32 = _BinaryenOrInt32(),\r\n XorI32 = _BinaryenXorInt32(),\r\n ShlI32 = _BinaryenShlInt32(),\r\n ShrU32 = _BinaryenShrUInt32(),\r\n ShrI32 = _BinaryenShrSInt32(),\r\n RotlI32 = _BinaryenRotLInt32(),\r\n RotrI32 = _BinaryenRotRInt32(),\r\n EqI32 = _BinaryenEqInt32(),\r\n NeI32 = _BinaryenNeInt32(),\r\n LtI32 = _BinaryenLtSInt32(),\r\n LtU32 = _BinaryenLtUInt32(),\r\n LeI32 = _BinaryenLeSInt32(),\r\n LeU32 = _BinaryenLeUInt32(),\r\n GtI32 = _BinaryenGtSInt32(),\r\n GtU32 = _BinaryenGtUInt32(),\r\n GeI32 = _BinaryenGeSInt32(),\r\n GeU32 = _BinaryenGeUInt32(),\r\n AddI64 = _BinaryenAddInt64(),\r\n SubI64 = _BinaryenSubInt64(),\r\n MulI64 = _BinaryenMulInt64(),\r\n DivI64 = _BinaryenDivSInt64(),\r\n DivU64 = _BinaryenDivUInt64(),\r\n RemI64 = _BinaryenRemSInt64(),\r\n RemU64 = _BinaryenRemUInt64(),\r\n AndI64 = _BinaryenAndInt64(),\r\n OrI64 = _BinaryenOrInt64(),\r\n XorI64 = _BinaryenXorInt64(),\r\n ShlI64 = _BinaryenShlInt64(),\r\n ShrU64 = _BinaryenShrUInt64(),\r\n ShrI64 = _BinaryenShrSInt64(),\r\n RotlI64 = _BinaryenRotLInt64(),\r\n RotrI64 = _BinaryenRotRInt64(),\r\n EqI64 = _BinaryenEqInt64(),\r\n NeI64 = _BinaryenNeInt64(),\r\n LtI64 = _BinaryenLtSInt64(),\r\n LtU64 = _BinaryenLtUInt64(),\r\n LeI64 = _BinaryenLeSInt64(),\r\n LeU64 = _BinaryenLeUInt64(),\r\n GtI64 = _BinaryenGtSInt64(),\r\n GtU64 = _BinaryenGtUInt64(),\r\n GeI64 = _BinaryenGeSInt64(),\r\n GeU64 = _BinaryenGeUInt64(),\r\n AddF32 = _BinaryenAddFloat32(),\r\n SubF32 = _BinaryenSubFloat32(),\r\n MulF32 = _BinaryenMulFloat32(),\r\n DivF32 = _BinaryenDivFloat32(),\r\n CopysignF32 = _BinaryenCopySignFloat32(),\r\n MinF32 = _BinaryenMinFloat32(),\r\n MaxF32 = _BinaryenMaxFloat32(),\r\n EqF32 = _BinaryenEqFloat32(),\r\n NeF32 = _BinaryenNeFloat32(),\r\n LtF32 = _BinaryenLtFloat32(),\r\n LeF32 = _BinaryenLeFloat32(),\r\n GtF32 = _BinaryenGtFloat32(),\r\n GeF32 = _BinaryenGeFloat32(),\r\n AddF64 = _BinaryenAddFloat64(),\r\n SubF64 = _BinaryenSubFloat64(),\r\n MulF64 = _BinaryenMulFloat64(),\r\n DivF64 = _BinaryenDivFloat64(),\r\n CopysignF64 = _BinaryenCopySignFloat64(),\r\n MinF64 = _BinaryenMinFloat64(),\r\n MaxF64 = _BinaryenMaxFloat64(),\r\n EqF64 = _BinaryenEqFloat64(),\r\n NeF64 = _BinaryenNeFloat64(),\r\n LtF64 = _BinaryenLtFloat64(),\r\n LeF64 = _BinaryenLeFloat64(),\r\n GtF64 = _BinaryenGtFloat64(),\r\n GeF64 = _BinaryenGeFloat64()\r\n}\r\n\r\nexport enum HostOp {\r\n CurrentMemory = _BinaryenCurrentMemory(),\r\n GrowMemory = _BinaryenGrowMemory(),\r\n\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n // MoveMemory\r\n // SetMemory\r\n}\r\n\r\nexport enum AtomicRMWOp {\r\n Add = _BinaryenAtomicRMWAdd(),\r\n Sub = _BinaryenAtomicRMWSub(),\r\n And = _BinaryenAtomicRMWAnd(),\r\n Or = _BinaryenAtomicRMWOr(),\r\n Xor = _BinaryenAtomicRMWXor(),\r\n Xchg = _BinaryenAtomicRMWXchg()\r\n}\r\n\r\n// export enum SIMDOp {\r\n// SplatVecI8x16 = _BinaryenSplatVecI8x16(),\r\n// SplatVecI16x8 = _BinaryenSplatVecI16x8(),\r\n// SplatVecI32x4 = _BinaryenSplatVecI32x4(),\r\n// SplatVecI64x2 = _BinaryenSplatVecI64x2(),\r\n// SplatVecF32x4 = _BinaryenSplatVecF32x4(),\r\n// SplatVecF64x2 = _BinaryenSplatVecF64x2(),\r\n// NotVec128 = _BinaryenNotVec128(),\r\n// NegVecI8x16 = _BinaryenNegVecI8x16(),\r\n// AnyTrueVecI8x16 = _BinaryenAnyTrueVecI8x16(),\r\n// AllTrueVecI8x16 = _BinaryenAllTrueVecI8x16(),\r\n// NegVecI16x8 = _BinaryenNegVecI16x8(),\r\n// AnyTrueVecI16x8 = _BinaryenAnyTrueVecI16x8(),\r\n// AllTrueVecI16x8 = _BinaryenAllTrueVecI16x8(),\r\n// NegVecI32x4 = _BinaryenNegVecI32x4(),\r\n// AnyTrueVecI32x4 = _BinaryenAnyTrueVecI32x4(),\r\n// AllTrueVecI32x4 = _BinaryenAllTrueVecI32x4(),\r\n// NegVecI64x2 = _BinaryenNegVecI64x2(),\r\n// AnyTrueVecI64x2 = _BinaryenAnyTrueVecI64x2(),\r\n// AllTrueVecI64x2 = _BinaryenAllTrueVecI64x2(),\r\n// AbsVecF32x4 = _BinaryenAbsVecF32x4(),\r\n// NegVecF32x4 = _BinaryenNegVecF32x4(),\r\n// SqrtVecF32x4 = _BinaryenSqrtVecF32x4(),\r\n// AbsVecF64x2 = _BinaryenAbsVecF64x2(),\r\n// NegVecF64x2 = _BinaryenNegVecF64x2(),\r\n// SqrtVecF64x2 = _BinaryenSqrtVecF64x2(),\r\n// TruncSatSVecF32x4ToVecI32x4 = _BinaryenTruncSatSVecF32x4ToVecI32x4(),\r\n// TruncSatUVecF32x4ToVecI32x4 = _BinaryenTruncSatUVecF32x4ToVecI32x4(),\r\n// TruncSatSVecF64x2ToVecI64x2 = _BinaryenTruncSatSVecF64x2ToVecI64x2(),\r\n// TruncSatUVecF64x2ToVecI64x2 = _BinaryenTruncSatUVecF64x2ToVecI64x2(),\r\n// ConvertSVecI32x4ToVecF32x4 = _BinaryenConvertSVecI32x4ToVecF32x4(),\r\n// ConvertUVecI32x4ToVecF32x4 = _BinaryenConvertUVecI32x4ToVecF32x4(),\r\n// ConvertSVecI64x2ToVecF64x2 = _BinaryenConvertSVecI64x2ToVecF64x2(),\r\n// ConvertUVecI64x2ToVecF64x2 = _BinaryenConvertUVecI64x2ToVecF64x2(),\r\n// EqVecI8x16 = _BinaryenEqVecI8x16(),\r\n// NeVecI8x16 = _BinaryenNeVecI8x16(),\r\n// LtSVecI8x16 = _BinaryenLtSVecI8x16(),\r\n// LtUVecI8x16 = _BinaryenLtUVecI8x16(),\r\n// LeSVecI8x16 = _BinaryenLeSVecI8x16(),\r\n// LeUVecI8x16 = _BinaryenLeUVecI8x16(),\r\n// GtSVecI8x16 = _BinaryenGtSVecI8x16(),\r\n// GtUVecI8x16 = _BinaryenGtUVecI8x16(),\r\n// GeSVecI8x16 = _BinaryenGeSVecI8x16(),\r\n// GeUVecI8x16 = _BinaryenGeUVecI8x16(),\r\n// EqVecI16x8 = _BinaryenEqVecI16x8(),\r\n// NeVecI16x8 = _BinaryenNeVecI16x8(),\r\n// LtSVecI16x8 = _BinaryenLtSVecI16x8(),\r\n// LtUVecI16x8 = _BinaryenLtUVecI16x8(),\r\n// LeSVecI16x8 = _BinaryenLeSVecI16x8(),\r\n// LeUVecI16x8 = _BinaryenLeUVecI16x8(),\r\n// GtSVecI16x8 = _BinaryenGtSVecI16x8(),\r\n// GtUVecI16x8 = _BinaryenGtUVecI16x8(),\r\n// GeSVecI16x8 = _BinaryenGeSVecI16x8(),\r\n// GeUVecI16x8 = _BinaryenGeUVecI16x8(),\r\n// EqVecI32x4 = _BinaryenEqVecI32x4(),\r\n// NeVecI32x4 = _BinaryenNeVecI32x4(),\r\n// LtSVecI32x4 = _BinaryenLtSVecI32x4(),\r\n// LtUVecI32x4 = _BinaryenLtUVecI32x4(),\r\n// LeSVecI32x4 = _BinaryenLeSVecI32x4(),\r\n// LeUVecI32x4 = _BinaryenLeUVecI32x4(),\r\n// GtSVecI32x4 = _BinaryenGtSVecI32x4(),\r\n// GtUVecI32x4 = _BinaryenGtUVecI32x4(),\r\n// GeSVecI32x4 = _BinaryenGeSVecI32x4(),\r\n// GeUVecI32x4 = _BinaryenGeUVecI32x4(),\r\n// EqVecF32x4 = _BinaryenEqVecF32x4(),\r\n// NeVecF32x4 = _BinaryenNeVecF32x4(),\r\n// LtVecF32x4 = _BinaryenLtVecF32x4(),\r\n// LeVecF32x4 = _BinaryenLeVecF32x4(),\r\n// GtVecF32x4 = _BinaryenGtVecF32x4(),\r\n// GeVecF32x4 = _BinaryenGeVecF32x4(),\r\n// EqVecF64x2 = _BinaryenEqVecF64x2(),\r\n// NeVecF64x2 = _BinaryenNeVecF64x2(),\r\n// LtVecF64x2 = _BinaryenLtVecF64x2(),\r\n// LeVecF64x2 = _BinaryenLeVecF64x2(),\r\n// GtVecF64x2 = _BinaryenGtVecF64x2(),\r\n// GeVecF64x2 = _BinaryenGeVecF64x2(),\r\n// AndVec128 = _BinaryenAndVec128(),\r\n// OrVec128 = _BinaryenOrVec128(),\r\n// XorVec128 = _BinaryenXorVec128(),\r\n// AddVecI8x16 = _BinaryenAddVecI8x16(),\r\n// AddSatSVecI8x16 = _BinaryenAddSatSVecI8x16(),\r\n// AddSatUVecI8x16 = _BinaryenAddSatUVecI8x16(),\r\n// SubVecI8x16 = _BinaryenSubVecI8x16(),\r\n// SubSatSVecI8x16 = _BinaryenSubSatSVecI8x16(),\r\n// SubSatUVecI8x16 = _BinaryenSubSatUVecI8x16(),\r\n// MulVecI8x16 = _BinaryenMulVecI8x16(),\r\n// AddVecI16x8 = _BinaryenAddVecI16x8(),\r\n// AddSatSVecI16x8 = _BinaryenAddSatSVecI16x8(),\r\n// AddSatUVecI16x8 = _BinaryenAddSatUVecI16x8(),\r\n// SubVecI16x8 = _BinaryenSubVecI16x8(),\r\n// SubSatSVecI16x8 = _BinaryenSubSatSVecI16x8(),\r\n// SubSatUVecI16x8 = _BinaryenSubSatUVecI16x8(),\r\n// MulVecI16x8 = _BinaryenMulVecI16x8(),\r\n// AddVecI32x4 = _BinaryenAddVecI32x4(),\r\n// SubVecI32x4 = _BinaryenSubVecI32x4(),\r\n// MulVecI32x4 = _BinaryenMulVecI32x4(),\r\n// AddVecI64x2 = _BinaryenAddVecI64x2(),\r\n// SubVecI64x2 = _BinaryenSubVecI64x2(),\r\n// AddVecF32x4 = _BinaryenAddVecF32x4(),\r\n// SubVecF32x4 = _BinaryenSubVecF32x4(),\r\n// MulVecF32x4 = _BinaryenMulVecF32x4(),\r\n// DivVecF32x4 = _BinaryenDivVecF32x4(),\r\n// MinVecF32x4 = _BinaryenMinVecF32x4(),\r\n// MaxVecF32x4 = _BinaryenMaxVecF32x4(),\r\n// AddVecF64x2 = _BinaryenAddVecF64x2(),\r\n// SubVecF64x2 = _BinaryenSubVecF64x2(),\r\n// MulVecF64x2 = _BinaryenMulVecF64x2(),\r\n// DivVecF64x2 = _BinaryenDivVecF64x2(),\r\n// MinVecF64x2 = _BinaryenMinVecF64x2(),\r\n// MaxVecF64x2 = _BinaryenMaxVecF64x2()\r\n// }\r\n\r\nexport class MemorySegment {\r\n\r\n buffer: Uint8Array;\r\n offset: I64;\r\n\r\n static create(buffer: Uint8Array, offset: I64): MemorySegment {\r\n var segment = new MemorySegment();\r\n segment.buffer = buffer;\r\n segment.offset = offset;\r\n return segment;\r\n }\r\n}\r\n\r\nexport class Module {\r\n\r\n ref: ModuleRef;\r\n\r\n private cachedByValue: usize;\r\n\r\n static create(): Module {\r\n var module = new Module();\r\n module.ref = _BinaryenModuleCreate();\r\n module.cachedByValue = memory.allocate(16);\r\n return module;\r\n }\r\n\r\n static createFrom(buffer: Uint8Array): Module {\r\n var cArr = allocU8Array(buffer);\r\n try {\r\n let module = new Module();\r\n module.ref = _BinaryenModuleRead(cArr, buffer.length);\r\n module.cachedByValue = memory.allocate(3 * 8); // LLVM C-ABI, max used is 3 * usize\r\n return module;\r\n } finally {\r\n memory.free(changetype(cArr));\r\n }\r\n }\r\n\r\n private constructor() { }\r\n\r\n // types\r\n\r\n addFunctionType(\r\n name: string,\r\n result: NativeType,\r\n paramTypes: NativeType[] | null\r\n ): FunctionRef {\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenAddFunctionType(this.ref, cStr, result, cArr, paramTypes ? paramTypes.length : 0);\r\n } finally {\r\n memory.free(cArr);\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n getFunctionTypeBySignature(\r\n result: NativeType,\r\n paramTypes: NativeType[] | null\r\n ): FunctionTypeRef {\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenGetFunctionTypeBySignature(this.ref, result, cArr, paramTypes ? paramTypes.length : 0);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n removeFunctionType(name: string): void {\r\n var cStr = allocString(name);\r\n try {\r\n _BinaryenRemoveFunctionType(this.ref, cStr);\r\n } finally {\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n // constants\r\n\r\n createI32(value: i32): ExpressionRef {\r\n var out = this.cachedByValue;\r\n _BinaryenLiteralInt32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createI64(valueLow: i32, valueHigh: i32 = 0): ExpressionRef {\r\n var out = this.cachedByValue;\r\n _BinaryenLiteralInt64(out, valueLow, valueHigh);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createF32(value: f32): ExpressionRef {\r\n var out = this.cachedByValue;\r\n _BinaryenLiteralFloat32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createF64(value: f64): ExpressionRef {\r\n var out = this.cachedByValue;\r\n _BinaryenLiteralFloat64(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n // expressions\r\n\r\n createUnary(\r\n op: UnaryOp,\r\n expr: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenUnary(this.ref, op, expr);\r\n }\r\n\r\n createBinary(\r\n op: BinaryOp,\r\n left: ExpressionRef,\r\n right: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenBinary(this.ref, op, left, right);\r\n }\r\n\r\n createHost(\r\n op: HostOp,\r\n name: string | null = null,\r\n operands: ExpressionRef[] | null = null\r\n ): ExpressionRef {\r\n var cStr = allocString(name);\r\n var cArr = allocPtrArray(operands);\r\n try {\r\n return _BinaryenHost(this.ref, op, cStr, cArr, operands ? (operands).length : 0);\r\n } finally {\r\n memory.free(cArr);\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n createGetLocal(\r\n index: i32,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenGetLocal(this.ref, index, type);\r\n }\r\n\r\n createTeeLocal(\r\n index: i32,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenTeeLocal(this.ref, index, value);\r\n }\r\n\r\n createGetGlobal(\r\n name: string,\r\n type: NativeType\r\n ): ExpressionRef {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenGetGlobal(this.ref, cStr, type);\r\n } finally {\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n createLoad(\r\n bytes: Index,\r\n signed: bool,\r\n ptr: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenLoad(this.ref, bytes, signed ? 1 : 0, offset, /* always aligned */ bytes, type, ptr);\r\n }\r\n\r\n createStore(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenStore(this.ref, bytes, offset, /* always aligned */ bytes, ptr, value, type);\r\n }\r\n\r\n createAtomicLoad(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenAtomicLoad(this.ref, bytes, offset, type, ptr);\r\n }\r\n\r\n createAtomicStore(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenAtomicStore(this.ref, bytes, offset, ptr, value, type);\r\n }\r\n\r\n createAtomicRMW(\r\n op: AtomicRMWOp,\r\n bytes: Index,\r\n offset: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicRMW(this.ref, op, bytes, offset, ptr, value, type);\r\n }\r\n\r\n createAtomicCmpxchg(\r\n bytes: Index,\r\n offset: Index,\r\n ptr: ExpressionRef,\r\n expected: ExpressionRef,\r\n replacement: ExpressionRef,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicCmpxchg(this.ref, bytes, offset, ptr, expected, replacement, type);\r\n }\r\n\r\n createAtomicWait(\r\n ptr: ExpressionRef,\r\n expected: ExpressionRef,\r\n timeout: ExpressionRef,\r\n expectedType: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicWait(this.ref, ptr, expected, timeout, expectedType);\r\n }\r\n\r\n createAtomicWake(\r\n ptr: ExpressionRef,\r\n wakeCount: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenAtomicWake(this.ref, ptr, wakeCount);\r\n }\r\n\r\n // statements\r\n\r\n createSetLocal(\r\n index: Index,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenSetLocal(this.ref, index, value);\r\n }\r\n\r\n createSetGlobal(\r\n name: string,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenSetGlobal(this.ref, cStr, value);\r\n } finally {\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n createBlock(\r\n label: string | null,\r\n children: ExpressionRef[],\r\n type: NativeType = NativeType.None\r\n ): ExpressionRef {\r\n var cStr = allocString(label);\r\n var cArr = allocPtrArray(children);\r\n try {\r\n return _BinaryenBlock(this.ref, cStr, cArr, children.length, type);\r\n } finally {\r\n memory.free(cArr);\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n createBreak(\r\n label: string | null,\r\n condition: ExpressionRef = 0,\r\n value: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var cStr = allocString(label);\r\n try {\r\n return _BinaryenBreak(this.ref, cStr, condition, value);\r\n } finally {\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n createDrop(\r\n expression: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenDrop(this.ref, expression);\r\n }\r\n\r\n createLoop(\r\n label: string | null,\r\n body: ExpressionRef\r\n ): ExpressionRef {\r\n var cStr = allocString(label);\r\n try {\r\n return _BinaryenLoop(this.ref, cStr, body);\r\n } finally {\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n createIf(\r\n condition: ExpressionRef,\r\n ifTrue: ExpressionRef,\r\n ifFalse: ExpressionRef = 0\r\n ): ExpressionRef {\r\n return _BinaryenIf(this.ref, condition, ifTrue, ifFalse);\r\n }\r\n\r\n createNop(): ExpressionRef {\r\n return _BinaryenNop(this.ref);\r\n }\r\n\r\n createReturn(\r\n expression: ExpressionRef = 0\r\n ): ExpressionRef {\r\n return _BinaryenReturn(this.ref, expression);\r\n }\r\n\r\n createSelect(\r\n ifTrue: ExpressionRef,\r\n ifFalse: ExpressionRef,\r\n condition: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenSelect(this.ref, condition, ifTrue, ifFalse);\r\n }\r\n\r\n createSwitch(\r\n names: string[],\r\n defaultName: string | null,\r\n condition: ExpressionRef,\r\n value: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var numNames = names.length;\r\n var strs = new Array(numNames);\r\n for (let i = 0; i < numNames; ++i) {\r\n strs[i] = allocString(names[i]);\r\n }\r\n var cArr = allocI32Array(strs);\r\n var cStr = allocString(defaultName);\r\n try {\r\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\r\n } finally {\r\n memory.free(cStr);\r\n memory.free(cArr);\r\n for (let i = numNames - 1; i >= 0; --i) memory.free(strs[i]);\r\n }\r\n }\r\n\r\n createCall(\r\n target: string,\r\n operands: ExpressionRef[] | null,\r\n returnType: NativeType\r\n ): ExpressionRef {\r\n var cStr = allocString(target);\r\n var cArr = allocPtrArray(operands);\r\n try {\r\n return _BinaryenCall(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n } finally {\r\n memory.free(cArr);\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n createCallIndirect(\r\n index: ExpressionRef,\r\n operands: ExpressionRef[] | null,\r\n typeName: string\r\n ): ExpressionRef {\r\n var cArr = allocPtrArray(operands);\r\n var cStr = allocString(typeName);\r\n try {\r\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\r\n } finally {\r\n memory.free(cStr);\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n createUnreachable(): ExpressionRef {\r\n return _BinaryenUnreachable(this.ref);\r\n }\r\n\r\n // meta\r\n\r\n addGlobal(\r\n name: string,\r\n type: NativeType,\r\n mutable: bool,\r\n initializer: ExpressionRef\r\n ): GlobalRef {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\r\n } finally {\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n removeGlobal(\r\n name: string\r\n ): void {\r\n var cStr = allocString(name);\r\n try {\r\n _BinaryenRemoveGlobal(this.ref, cStr);\r\n } finally {\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n addFunction(\r\n name: string,\r\n type: FunctionTypeRef,\r\n varTypes: NativeType[] | null,\r\n body: ExpressionRef\r\n ): FunctionRef {\r\n var cStr = allocString(name);\r\n var cArr = allocI32Array(varTypes);\r\n try {\r\n return _BinaryenAddFunction(this.ref, cStr, type, cArr, varTypes ? varTypes.length : 0, body);\r\n } finally {\r\n memory.free(cArr);\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n removeFunction(name: string): void {\r\n var cStr = allocString(name);\r\n try {\r\n _BinaryenRemoveFunction(this.ref, cStr);\r\n } finally {\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n private cachedTemporaryName: usize = 0;\r\n private hasTemporaryFunction: bool = false;\r\n\r\n addTemporaryFunction(result: NativeType, paramTypes: NativeType[] | null, body: ExpressionRef): FunctionRef {\r\n this.hasTemporaryFunction = assert(!this.hasTemporaryFunction);\r\n var tempName = this.cachedTemporaryName;\r\n if (!tempName) this.cachedTemporaryName = tempName = allocString(\"\"); // works because strings are interned\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n let typeRef = _BinaryenAddFunctionType(this.ref, tempName, result, cArr, paramTypes ? paramTypes.length : 0);\r\n return _BinaryenAddFunction(this.ref, tempName, typeRef, 0, 0, body);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n removeTemporaryFunction(): void {\r\n this.hasTemporaryFunction = !assert(this.hasTemporaryFunction);\r\n var tempName = assert(this.cachedTemporaryName);\r\n _BinaryenRemoveFunction(this.ref, tempName);\r\n _BinaryenRemoveFunctionType(this.ref, tempName);\r\n }\r\n\r\n addFunctionExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\r\n } finally {\r\n memory.free(cStr2);\r\n memory.free(cStr1);\r\n }\r\n }\r\n\r\n addTableExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\r\n } finally {\r\n memory.free(cStr2);\r\n memory.free(cStr1);\r\n }\r\n }\r\n\r\n addMemoryExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\r\n } finally {\r\n memory.free(cStr2);\r\n memory.free(cStr1);\r\n }\r\n }\r\n\r\n addGlobalExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalName);\r\n try {\r\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\r\n } finally {\r\n memory.free(cStr2);\r\n memory.free(cStr1);\r\n }\r\n }\r\n\r\n removeExport(externalName: string): void {\r\n var cStr = allocString(externalName);\r\n try {\r\n _BinaryenRemoveExport(this.ref, cStr);\r\n } finally {\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n addFunctionImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string,\r\n functionType: FunctionTypeRef\r\n ): ImportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\r\n } finally {\r\n memory.free(cStr3);\r\n memory.free(cStr2);\r\n memory.free(cStr1);\r\n }\r\n }\r\n\r\n addTableImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string\r\n ): ImportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\r\n } finally {\r\n memory.free(cStr3);\r\n memory.free(cStr2);\r\n memory.free(cStr1);\r\n }\r\n }\r\n\r\n addMemoryImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string\r\n ): ImportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3);\r\n } finally {\r\n memory.free(cStr3);\r\n memory.free(cStr2);\r\n memory.free(cStr1);\r\n }\r\n }\r\n\r\n addGlobalImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string,\r\n globalType: NativeType\r\n ): ImportRef {\r\n var cStr1 = allocString(internalName);\r\n var cStr2 = allocString(externalModuleName);\r\n var cStr3 = allocString(externalBaseName);\r\n try {\r\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\r\n } finally {\r\n memory.free(cStr3);\r\n memory.free(cStr2);\r\n memory.free(cStr1);\r\n }\r\n }\r\n\r\n /** Unlimited memory constant. */\r\n static readonly UNLIMITED_MEMORY: Index = -1;\r\n\r\n setMemory(\r\n initial: Index,\r\n maximum: Index,\r\n segments: MemorySegment[],\r\n target: Target,\r\n exportName: string | null = null\r\n ): void {\r\n var cStr = allocString(exportName);\r\n var k = segments.length;\r\n var segs = new Array(k);\r\n var offs = new Array(k);\r\n var sizs = new Array(k);\r\n for (let i = 0; i < k; ++i) {\r\n let buffer = segments[i].buffer;\r\n let offset = segments[i].offset;\r\n segs[i] = allocU8Array(buffer);\r\n offs[i] = target == Target.WASM64\r\n ? this.createI64(i64_low(offset), i64_high(offset))\r\n : this.createI32(i64_low(offset));\r\n sizs[i] = buffer.length;\r\n }\r\n var cArr1 = allocI32Array(segs);\r\n var cArr2 = allocI32Array(offs);\r\n var cArr3 = allocI32Array(sizs);\r\n try {\r\n _BinaryenSetMemory(this.ref, initial, maximum, cStr, cArr1, cArr2, cArr3, k);\r\n } finally {\r\n memory.free(cArr3);\r\n memory.free(cArr2);\r\n memory.free(cArr1);\r\n for (let i = k - 1; i >= 0; --i) memory.free(segs[i]);\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n setFunctionTable(\r\n initial: Index,\r\n maximum: Index,\r\n funcs: string[]\r\n ): void {\r\n var numNames = funcs.length;\r\n var names = new Array(numNames);\r\n for (let i = 0; i < numNames; ++i) {\r\n names[i] = allocString(funcs[i]);\r\n }\r\n var cArr = allocI32Array(names);\r\n try {\r\n _BinaryenSetFunctionTable(this.ref, initial, maximum, cArr, numNames);\r\n } finally {\r\n memory.free(cArr);\r\n for (let i = numNames; i >= 0; --i) memory.free(names[i]);\r\n }\r\n }\r\n\r\n setStart(func: FunctionRef): void {\r\n _BinaryenSetStart(this.ref, func);\r\n }\r\n\r\n getOptimizeLevel(): i32 {\r\n return _BinaryenGetOptimizeLevel();\r\n }\r\n\r\n setOptimizeLevel(level: i32 = 2): void {\r\n _BinaryenSetOptimizeLevel(level);\r\n }\r\n\r\n getShrinkLevel(): i32 {\r\n return _BinaryenGetShrinkLevel();\r\n }\r\n\r\n setShrinkLevel(level: i32 = 1): void {\r\n _BinaryenSetShrinkLevel(level);\r\n }\r\n\r\n setDebugInfo(on: bool = false): void {\r\n _BinaryenSetDebugInfo(on);\r\n }\r\n\r\n optimize(func: FunctionRef = 0): void {\r\n if (func) {\r\n _BinaryenFunctionOptimize(func, this.ref);\r\n } else {\r\n _BinaryenModuleOptimize(this.ref);\r\n }\r\n }\r\n\r\n runPasses(passes: string[], func: FunctionRef = 0): void {\r\n var numNames = passes.length;\r\n var names = new Array(numNames);\r\n for (let i = 0; i < numNames; ++i) {\r\n names[i] = allocString(passes[i]);\r\n }\r\n var cArr = allocI32Array(names);\r\n try {\r\n if (func) {\r\n _BinaryenFunctionRunPasses(func, this.ref, cArr, numNames);\r\n } else {\r\n _BinaryenModuleRunPasses(this.ref, cArr, numNames);\r\n }\r\n } finally {\r\n memory.free(cArr);\r\n for (let i = numNames; i >= 0; --i) memory.free(names[i]);\r\n }\r\n }\r\n\r\n private cachedPrecomputeName: usize = 0; // for free'ing\r\n private cachedPrecomputeNames: usize = 0;\r\n\r\n precomputeExpression(expr: ExpressionRef): ExpressionRef {\r\n // remember the previous optimize levels and set to max instead, to be sure\r\n var previousOptimizeLevel = _BinaryenGetOptimizeLevel();\r\n var previousShrinkLevel = _BinaryenGetShrinkLevel();\r\n var previousDebugInfo = _BinaryenGetDebugInfo();\r\n _BinaryenSetOptimizeLevel(4);\r\n _BinaryenSetShrinkLevel(0);\r\n _BinaryenSetDebugInfo(false);\r\n\r\n // wrap the expression in a temp. function and run the precompute pass on it\r\n var type = _BinaryenExpressionGetType(expr);\r\n var func = this.addTemporaryFunction(type, null, expr);\r\n var names = this.cachedPrecomputeNames;\r\n if (!names) {\r\n let name = allocString(\"precompute\");\r\n this.cachedPrecomputeName = name;\r\n this.cachedPrecomputeNames = names = allocI32Array([ name ]);\r\n }\r\n _BinaryenFunctionRunPasses(func, this.ref, names, 1);\r\n expr = _BinaryenFunctionGetBody(func);\r\n this.removeTemporaryFunction();\r\n\r\n // reset optimize levels to previous\r\n _BinaryenSetOptimizeLevel(previousOptimizeLevel);\r\n _BinaryenSetShrinkLevel(previousShrinkLevel);\r\n _BinaryenSetDebugInfo(previousDebugInfo);\r\n return expr;\r\n }\r\n\r\n validate(): bool {\r\n return _BinaryenModuleValidate(this.ref) == 1;\r\n }\r\n\r\n interpret(): void {\r\n _BinaryenModuleInterpret(this.ref);\r\n }\r\n\r\n toBinary(sourceMapUrl: string | null): BinaryModule {\r\n var out = this.cachedByValue;\r\n var cStr = allocString(sourceMapUrl);\r\n var binaryPtr: usize = 0;\r\n var sourceMapPtr: usize = 0;\r\n try {\r\n _BinaryenModuleAllocateAndWrite(out, this.ref, cStr);\r\n binaryPtr = readInt(out);\r\n let binaryBytes = readInt(out + 4);\r\n sourceMapPtr = readInt(out + 4 * 2);\r\n let ret = new BinaryModule();\r\n ret.output = readBuffer(binaryPtr, binaryBytes);\r\n ret.sourceMap = readString(sourceMapPtr);\r\n return ret;\r\n } finally {\r\n if (cStr) memory.free(cStr);\r\n if (binaryPtr) memory.free(binaryPtr);\r\n if (sourceMapPtr) memory.free(sourceMapPtr);\r\n }\r\n }\r\n\r\n toText(): string {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n }\r\n\r\n toAsmjs(): string {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n }\r\n\r\n dispose(): void {\r\n assert(this.ref);\r\n memory.free(this.cachedByValue);\r\n memory.free(this.cachedTemporaryName);\r\n memory.free(this.cachedPrecomputeName);\r\n memory.free(this.cachedPrecomputeNames);\r\n _BinaryenModuleDispose(this.ref);\r\n this.ref = 0;\r\n }\r\n\r\n createRelooper(): Relooper {\r\n return Relooper.create(this);\r\n }\r\n\r\n cloneExpression(\r\n expr: ExpressionRef,\r\n noSideEffects: bool = false,\r\n maxDepth: i32 = i32.MAX_VALUE\r\n ): ExpressionRef { // currently supports side effect free expressions only\r\n if (maxDepth < 0) return 0;\r\n maxDepth -= 1;\r\n\r\n var nested1: ExpressionRef,\r\n nested2: ExpressionRef;\r\n\r\n switch (_BinaryenExpressionGetId(expr)) {\r\n case ExpressionId.Const: {\r\n switch (_BinaryenExpressionGetType(expr)) {\r\n case NativeType.I32: {\r\n return this.createI32(_BinaryenConstGetValueI32(expr));\r\n }\r\n case NativeType.I64: {\r\n return this.createI64(\r\n _BinaryenConstGetValueI64Low(expr),\r\n _BinaryenConstGetValueI64High(expr)\r\n );\r\n }\r\n case NativeType.F32: {\r\n return this.createF32(_BinaryenConstGetValueF32(expr));\r\n }\r\n case NativeType.F64: {\r\n return this.createF64(_BinaryenConstGetValueF64(expr));\r\n }\r\n default: {\r\n throw new Error(\"concrete type expected\");\r\n }\r\n }\r\n }\r\n case ExpressionId.GetLocal: {\r\n return _BinaryenGetLocal(this.ref,\r\n _BinaryenGetLocalGetIndex(expr),\r\n _BinaryenExpressionGetType(expr)\r\n );\r\n }\r\n case ExpressionId.GetGlobal: {\r\n let globalName = _BinaryenGetGlobalGetName(expr);\r\n if (!globalName) break;\r\n return _BinaryenGetGlobal(this.ref, globalName, _BinaryenExpressionGetType(expr));\r\n }\r\n case ExpressionId.Load: {\r\n if (!(nested1 = this.cloneExpression(_BinaryenLoadGetPtr(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return (\r\n _BinaryenLoadIsAtomic(expr)\r\n ? _BinaryenAtomicLoad(this.ref,\r\n _BinaryenLoadGetBytes(expr),\r\n _BinaryenLoadGetOffset(expr),\r\n _BinaryenExpressionGetType(expr),\r\n nested1\r\n )\r\n : _BinaryenLoad(this.ref,\r\n _BinaryenLoadGetBytes(expr),\r\n _BinaryenLoadIsSigned(expr) ? 1 : 0,\r\n _BinaryenLoadGetOffset(expr),\r\n _BinaryenLoadGetAlign(expr),\r\n _BinaryenExpressionGetType(expr),\r\n nested1\r\n )\r\n );\r\n }\r\n case ExpressionId.Unary: {\r\n if (!(nested1 = this.cloneExpression(_BinaryenUnaryGetValue(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenUnary(this.ref, _BinaryenUnaryGetOp(expr), nested1);\r\n }\r\n case ExpressionId.Binary: {\r\n if (!(nested1 = this.cloneExpression(_BinaryenBinaryGetLeft(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n if (!(nested2 = this.cloneExpression(_BinaryenBinaryGetRight(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenBinary(this.ref, _BinaryenBinaryGetOp(expr), nested1, nested2);\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n // source map generation\r\n\r\n addDebugInfoFile(name: string): Index {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenModuleAddDebugInfoFileName(this.ref, cStr);\r\n } finally {\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n getDebugInfoFile(index: Index): string | null {\r\n return readString(_BinaryenModuleGetDebugInfoFileName(this.ref, index));\r\n }\r\n\r\n setDebugLocation(\r\n func: FunctionRef,\r\n expr: ExpressionRef,\r\n fileIndex: Index,\r\n lineNumber: Index,\r\n columnNumber: Index\r\n ): void {\r\n _BinaryenFunctionSetDebugLocation(func, expr, fileIndex, lineNumber, columnNumber);\r\n }\r\n}\r\n\r\n// expressions\r\n\r\nexport function getExpressionId(expr: ExpressionRef): ExpressionId {\r\n return _BinaryenExpressionGetId(expr);\r\n}\r\n\r\nexport function getExpressionType(expr: ExpressionRef): NativeType {\r\n return _BinaryenExpressionGetType(expr);\r\n}\r\n\r\nexport function getConstValueI32(expr: ExpressionRef): i32 {\r\n return _BinaryenConstGetValueI32(expr);\r\n}\r\n\r\nexport function getConstValueI64Low(expr: ExpressionRef): i32 {\r\n return _BinaryenConstGetValueI64Low(expr);\r\n}\r\n\r\nexport function getConstValueI64High(expr: ExpressionRef): i32 {\r\n return _BinaryenConstGetValueI64High(expr);\r\n}\r\n\r\nexport function getConstValueF32(expr: ExpressionRef): f32 {\r\n return _BinaryenConstGetValueF32(expr);\r\n}\r\n\r\nexport function getConstValueF64(expr: ExpressionRef): f32 {\r\n return _BinaryenConstGetValueF64(expr);\r\n}\r\n\r\nexport function getGetLocalIndex(expr: ExpressionRef): Index {\r\n return _BinaryenGetLocalGetIndex(expr);\r\n}\r\n\r\nexport function getSetLocalIndex(expr: ExpressionRef): Index {\r\n return _BinaryenSetLocalGetIndex(expr);\r\n}\r\n\r\nexport function getSetLocalValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenSetLocalGetValue(expr);\r\n}\r\n\r\nexport function isTeeLocal(expr: ExpressionRef): bool {\r\n return _BinaryenSetLocalIsTee(expr);\r\n}\r\n\r\nexport function getGetGlobalName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenGetGlobalGetName(expr));\r\n}\r\n\r\nexport function getBinaryOp(expr: ExpressionRef): BinaryOp {\r\n return _BinaryenBinaryGetOp(expr);\r\n}\r\n\r\nexport function getBinaryLeft(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenBinaryGetLeft(expr);\r\n}\r\n\r\nexport function getBinaryRight(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenBinaryGetRight(expr);\r\n}\r\n\r\nexport function getUnaryOp(expr: ExpressionRef): UnaryOp {\r\n return _BinaryenUnaryGetOp(expr);\r\n}\r\n\r\nexport function getUnaryValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenUnaryGetValue(expr);\r\n}\r\n\r\nexport function getLoadBytes(expr: ExpressionRef): u32 {\r\n return _BinaryenLoadGetBytes(expr);\r\n}\r\n\r\nexport function getLoadOffset(expr: ExpressionRef): u32 {\r\n return _BinaryenLoadGetOffset(expr);\r\n}\r\n\r\nexport function getLoadPtr(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenLoadGetPtr(expr);\r\n}\r\n\r\nexport function isLoadSigned(expr: ExpressionRef): bool {\r\n return _BinaryenLoadIsSigned(expr);\r\n}\r\n\r\nexport function getStoreBytes(expr: ExpressionRef): u32 {\r\n return _BinaryenStoreGetBytes(expr);\r\n}\r\n\r\nexport function getStoreOffset(expr: ExpressionRef): u32 {\r\n return _BinaryenStoreGetOffset(expr);\r\n}\r\n\r\nexport function getStorePtr(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenStoreGetPtr(expr);\r\n}\r\n\r\nexport function getStoreValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenStoreGetValue(expr);\r\n}\r\n\r\nexport function getBlockName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenBlockGetName(expr));\r\n}\r\n\r\nexport function getBlockChildCount(expr: ExpressionRef): Index {\r\n return _BinaryenBlockGetNumChildren(expr);\r\n}\r\n\r\nexport function getBlockChild(expr: ExpressionRef, index: Index): ExpressionRef {\r\n return _BinaryenBlockGetChild(expr, index);\r\n}\r\n\r\nexport function getIfCondition(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenIfGetCondition(expr);\r\n}\r\n\r\nexport function getIfTrue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenIfGetIfTrue(expr);\r\n}\r\n\r\nexport function getIfFalse(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenIfGetIfFalse(expr);\r\n}\r\n\r\nexport function getLoopName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenLoopGetName(expr));\r\n}\r\n\r\nexport function getLoopBody(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenLoopGetBody(expr);\r\n}\r\n\r\nexport function getBreakName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenBreakGetName(expr));\r\n}\r\n\r\nexport function getBreakCondition(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenBreakGetCondition(expr);\r\n}\r\n\r\nexport function getSelectThen(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenSelectGetIfTrue(expr);\r\n}\r\n\r\nexport function getSelectElse(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenSelectGetIfFalse(expr);\r\n}\r\n\r\nexport function getSelectCondition(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenSelectGetCondition(expr);\r\n}\r\n\r\nexport function getDropValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenDropGetValue(expr);\r\n}\r\n\r\nexport function getReturnValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenReturnGetValue(expr);\r\n}\r\n\r\nexport function getCallTarget(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenCallGetTarget(expr));\r\n}\r\n\r\nexport function getHostOp(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenHostGetOp(expr);\r\n}\r\n\r\nexport function getHostOperandCount(expr: ExpressionRef): Index {\r\n return _BinaryenHostGetNumOperands(expr);\r\n}\r\n\r\nexport function getHostOperand(expr: ExpressionRef, index: Index): ExpressionRef {\r\n return _BinaryenHostGetOperand(expr, index);\r\n}\r\n\r\nexport function getHostName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenHostGetNameOperand(expr));\r\n}\r\n\r\n// functions\r\n\r\nexport function getFunctionBody(func: FunctionRef): ExpressionRef {\r\n return _BinaryenFunctionGetBody(func);\r\n}\r\n\r\nexport function getFunctionName(func: FunctionRef): string | null {\r\n return readString(_BinaryenFunctionGetName(func));\r\n}\r\n\r\nexport function getFunctionParamCount(func: FunctionRef): Index {\r\n return _BinaryenFunctionGetNumParams(func);\r\n}\r\n\r\nexport function getFunctionParamType(func: FunctionRef, index: Index): NativeType {\r\n return _BinaryenFunctionGetParam(func, index);\r\n}\r\n\r\nexport function getFunctionResultType(func: FunctionRef): NativeType {\r\n return _BinaryenFunctionGetResult(func);\r\n}\r\n\r\nexport class Relooper {\r\n\r\n module: Module;\r\n ref: RelooperRef;\r\n\r\n static create(module: Module): Relooper {\r\n var relooper = new Relooper();\r\n relooper.module = module;\r\n relooper.ref = _RelooperCreate(module.ref);\r\n return relooper;\r\n }\r\n\r\n private constructor() {}\r\n\r\n addBlock(code: ExpressionRef): RelooperBlockRef {\r\n return _RelooperAddBlock(this.ref, code);\r\n }\r\n\r\n addBranch(\r\n from: RelooperBlockRef,\r\n to: RelooperBlockRef,\r\n condition: ExpressionRef = 0,\r\n code: ExpressionRef = 0\r\n ): void {\r\n _RelooperAddBranch(from, to, condition, code);\r\n }\r\n\r\n addBlockWithSwitch(code: ExpressionRef, condition: ExpressionRef): RelooperBlockRef {\r\n return _RelooperAddBlockWithSwitch(this.ref, code, condition);\r\n }\r\n\r\n addBranchForSwitch(\r\n from: RelooperBlockRef,\r\n to: RelooperBlockRef,\r\n indexes: i32[],\r\n code: ExpressionRef = 0\r\n ): void {\r\n var cArr = allocI32Array(indexes);\r\n try {\r\n _RelooperAddBranchForSwitch(from, to, cArr, indexes.length, code);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n renderAndDispose(entry: RelooperBlockRef, labelHelper: Index): ExpressionRef {\r\n return _RelooperRenderAndDispose(this.ref, entry, labelHelper);\r\n }\r\n}\r\n\r\n// export function hasSideEffects(expr: ExpressionRef): bool {\r\n// switch (_BinaryenExpressionGetId(expr = getPtr(expr))) {\r\n// case ExpressionId.GetLocal:\r\n// case ExpressionId.GetGlobal:\r\n// case ExpressionId.Const:\r\n// case ExpressionId.Nop:\r\n// case ExpressionId.Unreachable: {\r\n// return false;\r\n// }\r\n// case ExpressionId.Block: {\r\n// for (let i = 0, k = _BinaryenBlockGetNumChildren(expr); i < k; ++i) {\r\n// if (hasSideEffects(_BinaryenBlockGetChild(expr, i))) return true;\r\n// }\r\n// return false;\r\n// }\r\n// case ExpressionId.If: {\r\n// return hasSideEffects(_BinaryenIfGetCondition(expr))\r\n// || hasSideEffects(_BinaryenIfGetIfTrue(expr))\r\n// || hasSideEffects(_BinaryenIfGetIfFalse(expr));\r\n// }\r\n// case ExpressionId.Unary: {\r\n// return hasSideEffects(_BinaryenUnaryGetValue(expr));\r\n// }\r\n// case ExpressionId.Binary: {\r\n// return hasSideEffects(_BinaryenBinaryGetLeft(expr))\r\n// || hasSideEffects(_BinaryenBinaryGetRight(expr));\r\n// }\r\n// case ExpressionId.Drop: {\r\n// return hasSideEffects(_BinaryenDropGetValue(expr));\r\n// }\r\n// case ExpressionId.Select: {\r\n// return hasSideEffects(_BinaryenSelectGetIfTrue(expr))\r\n// || hasSideEffects(_BinaryenSelectGetIfFalse(expr))\r\n// || hasSideEffects(_BinaryenSelectGetCondition(expr));\r\n// }\r\n// }\r\n// return true;\r\n// }\r\n\r\n// helpers\r\n// can't do stack allocation here: STACKTOP is a global in WASM but a hidden variable in asm.js\r\n\r\nfunction allocU8Array(u8s: Uint8Array | null): usize {\r\n if (!u8s) return 0;\r\n var numValues = u8s.length;\r\n var ptr = memory.allocate(numValues);\r\n var idx = ptr;\r\n for (let i = 0; i < numValues; ++i) {\r\n store(idx++, u8s[i]);\r\n }\r\n return ptr;\r\n}\r\n\r\nfunction allocI32Array(i32s: i32[] | null): usize {\r\n if (!i32s) return 0;\r\n var ptr = memory.allocate(i32s.length << 2);\r\n var idx = ptr;\r\n for (let i = 0, k = i32s.length; i < k; ++i) {\r\n let val = i32s[i];\r\n // store(idx, val) is not portable\r\n store(idx , ( val & 0xff) as u8);\r\n store(idx + 1, ((val >> 8) & 0xff) as u8);\r\n store(idx + 2, ((val >> 16) & 0xff) as u8);\r\n store(idx + 3, ( val >>> 24 ) as u8);\r\n idx += 4;\r\n }\r\n return ptr;\r\n}\r\n\r\nfunction allocPtrArray(ptrs: usize[] | null): usize {\r\n return allocI32Array(ptrs); // TODO: WASM64 one day\r\n}\r\n\r\nfunction stringLengthUTF8(str: string): usize {\r\n var len = 0;\r\n for (let i = 0, k = str.length; i < k; ++i) {\r\n let u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n ++len;\r\n } else if (u <= 0x7FF) {\r\n len += 2;\r\n } else if (u <= 0xFFFF) {\r\n len += 3;\r\n } else if (u <= 0x1FFFFF) {\r\n len += 4;\r\n } else if (u <= 0x3FFFFFF) {\r\n len += 5;\r\n } else {\r\n len += 6;\r\n }\r\n }\r\n return len;\r\n}\r\n\r\nfunction allocString(str: string | null): usize {\r\n if (str == null) return 0;\r\n var ptr = memory.allocate(stringLengthUTF8(str) + 1);\r\n // the following is based on Emscripten's stringToUTF8Array\r\n var idx = ptr;\r\n for (let i = 0, k = str.length; i < k; ++i) {\r\n let u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n store(idx++, u as u8);\r\n } else if (u <= 0x7FF) {\r\n store(idx++, (0xC0 | (u >>> 6) ) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0xFFFF) {\r\n store(idx++, (0xE0 | (u >>> 12) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0x1FFFFF) {\r\n store(idx++, (0xF0 | (u >>> 18) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0x3FFFFFF) {\r\n store(idx++, (0xF8 | (u >>> 24) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else {\r\n store(idx++, (0xFC | (u >>> 30) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 24) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n }\r\n }\r\n store(idx, 0);\r\n return ptr;\r\n}\r\n\r\nfunction readInt(ptr: usize): i32 {\r\n return (\r\n load(ptr ) |\r\n (load(ptr + 1) << 8) |\r\n (load(ptr + 2) << 16) |\r\n (load(ptr + 3) << 24)\r\n );\r\n}\r\n\r\nfunction readBuffer(ptr: usize, length: usize): Uint8Array {\r\n var ret = new Uint8Array(length);\r\n for (let i: usize = 0; i < length; ++i) {\r\n ret[i] = load(ptr + i);\r\n }\r\n return ret;\r\n}\r\n\r\nexport function readString(ptr: usize): string | null {\r\n if (!ptr) return null;\r\n var arr = new Array();\r\n // the following is based on Emscripten's UTF8ArrayToString\r\n var cp: u32;\r\n var u1: u32, u2: u32, u3: u32, u4: u32, u5: u32;\r\n while (cp = load(ptr++)) {\r\n if (!(cp & 0x80)) {\r\n arr.push(cp);\r\n continue;\r\n }\r\n u1 = load(ptr++) & 63;\r\n if ((cp & 0xE0) == 0xC0) {\r\n arr.push(((cp & 31) << 6) | u1);\r\n continue;\r\n }\r\n u2 = load(ptr++) & 63;\r\n if ((cp & 0xF0) == 0xE0) {\r\n cp = ((cp & 15) << 12) | (u1 << 6) | u2;\r\n } else {\r\n u3 = load(ptr++) & 63;\r\n if ((cp & 0xF8) == 0xF0) {\r\n cp = ((cp & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;\r\n } else {\r\n u4 = load(ptr++) & 63;\r\n if ((cp & 0xFC) == 0xF8) {\r\n cp = ((cp & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;\r\n } else {\r\n u5 = load(ptr++) & 63;\r\n cp = ((cp & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;\r\n }\r\n }\r\n }\r\n arr.push(cp);\r\n // if (cp < 0x10000) {\r\n // arr.push(cp);\r\n // } else {\r\n // var ch = cp - 0x10000;\r\n // arr.push(0xD800 | (ch >> 10));\r\n // arr.push(0xDC00 | (ch & 0x3FF));\r\n // }\r\n }\r\n // return String.fromCharCodes(arr);\r\n return String.fromCodePoints(arr);\r\n}\r\n\r\n/** Result structure of {@link Module#toBinary}. */\r\nexport class BinaryModule {\r\n /** WebAssembly binary. */\r\n output: Uint8Array;\r\n /** Source map, if generated. */\r\n sourceMap: string | null;\r\n}\r\n\r\n/** Tests if an expression needs an explicit 'unreachable' when it is the terminating statement. */\r\nexport function needsExplicitUnreachable(expr: ExpressionRef): bool {\r\n // not applicable if pushing a value to the stack\r\n switch (_BinaryenExpressionGetType(expr)) {\r\n case NativeType.I32:\r\n case NativeType.I64:\r\n case NativeType.F32:\r\n case NativeType.F64: return false;\r\n }\r\n switch (_BinaryenExpressionGetId(expr)) {\r\n case ExpressionId.Unreachable:\r\n case ExpressionId.Return: return false;\r\n case ExpressionId.Break: return _BinaryenBreakGetCondition(expr) != 0;\r\n case ExpressionId.Block: {\r\n if (!_BinaryenBlockGetName(expr)) { // can't break out of it\r\n let numChildren = _BinaryenBlockGetNumChildren(expr); // last child needs unreachable\r\n return numChildren > 0 && needsExplicitUnreachable(_BinaryenBlockGetChild(expr, numChildren - 1));\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n","/**\r\n * A TypeScript tokenizer modified for AssemblyScript.\r\n *\r\n * Skips over trivia and provides a general mark/reset mechanism for the parser to utilize on\r\n * ambiguous tokens.\r\n *\r\n * @module tokenizer\r\n *//***/\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticMessage,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Source,\r\n CommentKind\r\n} from \"./ast\";\r\n\r\nimport {\r\n CharCode,\r\n isLineBreak,\r\n isWhiteSpace,\r\n isIdentifierStart,\r\n isIdentifierPart,\r\n isDecimalDigit,\r\n isOctalDigit,\r\n isKeywordCharacter\r\n} from \"./util\";\r\n\r\n/** Named token types. */\r\nexport enum Token {\r\n\r\n // keywords\r\n // discarded: ANY, BOOLEAN, NEVER, NUMBER, STRING, SYMBOL, UNDEFINED, LESSTHAN_SLASH\r\n\r\n ABSTRACT,\r\n AS,\r\n ASYNC,\r\n AWAIT, // ES2017\r\n BREAK, // ES2017\r\n CASE, // ES2017\r\n CATCH, // ES2017\r\n CLASS, // ES2017\r\n CONST, // ES2017\r\n CONTINUE, // ES2017\r\n CONSTRUCTOR,\r\n DEBUGGER, // ES2017\r\n DECLARE,\r\n DEFAULT, // ES2017\r\n DELETE, // ES2017\r\n DO, // ES2017\r\n ELSE, // ES2017\r\n ENUM, // ES2017 future\r\n EXPORT, // ES2017\r\n EXTENDS, // ES2017\r\n FALSE, // ES\r\n FINALLY, // ES2017\r\n FOR, // ES2017\r\n FROM, // AS possible identifier\r\n FUNCTION, // ES2017\r\n GET,\r\n IF, // ES2017\r\n IMPLEMENTS, // ES2017 non-lexical\r\n IMPORT, // ES2017\r\n IN, // ES2017\r\n INSTANCEOF, // ES2017\r\n INTERFACE, // ES2017 non-lexical\r\n IS,\r\n KEYOF,\r\n LET, // ES2017 non-lexical\r\n MODULE, // AS possible identifier\r\n NAMESPACE, // AS possible identifier\r\n NEW, // ES2017\r\n NULL, // ES\r\n OF,\r\n PACKAGE, // ES2017 non-lexical\r\n PRIVATE, // ES2017 non-lexical\r\n PROTECTED, // ES2017 non-lexical\r\n PUBLIC, // ES2017 non-lexical\r\n READONLY,\r\n RETURN, // ES2017\r\n SET,\r\n STATIC, // ES2017 non-lexical\r\n SUPER, // ES2017\r\n SWITCH, // ES2017\r\n THIS, // ES2017\r\n THROW, // ES2017\r\n TRUE, // ES\r\n TRY, // ES2017\r\n TYPE, // AS possible identifier\r\n TYPEOF, // ES2017\r\n VAR, // ES2017\r\n VOID, // ES2017\r\n WHILE, // ES2017\r\n WITH, // ES2017\r\n YIELD, // ES2017\r\n\r\n // punctuation\r\n\r\n OPENBRACE,\r\n CLOSEBRACE,\r\n OPENPAREN,\r\n CLOSEPAREN,\r\n OPENBRACKET,\r\n CLOSEBRACKET,\r\n DOT,\r\n DOT_DOT_DOT,\r\n SEMICOLON,\r\n COMMA,\r\n LESSTHAN,\r\n GREATERTHAN,\r\n LESSTHAN_EQUALS,\r\n GREATERTHAN_EQUALS,\r\n EQUALS_EQUALS,\r\n EXCLAMATION_EQUALS,\r\n EQUALS_EQUALS_EQUALS,\r\n EXCLAMATION_EQUALS_EQUALS,\r\n EQUALS_GREATERTHAN,\r\n PLUS,\r\n MINUS,\r\n ASTERISK_ASTERISK,\r\n ASTERISK,\r\n SLASH,\r\n PERCENT,\r\n PLUS_PLUS,\r\n MINUS_MINUS,\r\n LESSTHAN_LESSTHAN,\r\n GREATERTHAN_GREATERTHAN,\r\n GREATERTHAN_GREATERTHAN_GREATERTHAN,\r\n AMPERSAND,\r\n BAR,\r\n CARET,\r\n EXCLAMATION,\r\n TILDE,\r\n AMPERSAND_AMPERSAND,\r\n BAR_BAR,\r\n QUESTION,\r\n COLON,\r\n EQUALS,\r\n PLUS_EQUALS,\r\n MINUS_EQUALS,\r\n ASTERISK_EQUALS,\r\n ASTERISK_ASTERISK_EQUALS,\r\n SLASH_EQUALS,\r\n PERCENT_EQUALS,\r\n LESSTHAN_LESSTHAN_EQUALS,\r\n GREATERTHAN_GREATERTHAN_EQUALS,\r\n GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS,\r\n AMPERSAND_EQUALS,\r\n BAR_EQUALS,\r\n CARET_EQUALS,\r\n AT,\r\n\r\n // literals\r\n\r\n IDENTIFIER,\r\n STRINGLITERAL,\r\n INTEGERLITERAL,\r\n FLOATLITERAL,\r\n\r\n // meta\r\n\r\n INVALID,\r\n ENDOFFILE\r\n}\r\n\r\nexport enum IdentifierHandling {\r\n DEFAULT,\r\n PREFER,\r\n ALWAYS\r\n}\r\n\r\nexport function tokenFromKeyword(text: string): Token {\r\n assert(text.length);\r\n switch (text.charCodeAt(0)) {\r\n case CharCode.a: {\r\n switch (text) {\r\n case \"abstract\": return Token.ABSTRACT;\r\n case \"as\": return Token.AS;\r\n case \"async\": return Token.ASYNC;\r\n case \"await\": return Token.AWAIT;\r\n }\r\n break;\r\n }\r\n case CharCode.b: {\r\n switch (text) {\r\n case \"break\": return Token.BREAK;\r\n }\r\n break;\r\n }\r\n case CharCode.c: {\r\n switch (text) {\r\n case \"case\": return Token.CASE;\r\n case \"catch\": return Token.CATCH;\r\n case \"class\": return Token.CLASS;\r\n case \"continue\": return Token.CONTINUE;\r\n case \"const\": return Token.CONST;\r\n case \"constructor\": return Token.CONSTRUCTOR;\r\n }\r\n break;\r\n }\r\n case CharCode.d: {\r\n switch (text) {\r\n case \"debugger\": return Token.DEBUGGER;\r\n case \"declare\": return Token.DECLARE;\r\n case \"default\": return Token.DEFAULT;\r\n case \"delete\": return Token.DELETE;\r\n case \"do\": return Token.DO;\r\n }\r\n break;\r\n }\r\n case CharCode.e: {\r\n switch (text) {\r\n case \"else\": return Token.ELSE;\r\n case \"enum\": return Token.ENUM;\r\n case \"export\": return Token.EXPORT;\r\n case \"extends\": return Token.EXTENDS;\r\n }\r\n break;\r\n }\r\n case CharCode.f: {\r\n switch (text) {\r\n case \"false\": return Token.FALSE;\r\n case \"finally\": return Token.FINALLY;\r\n case \"for\": return Token.FOR;\r\n case \"from\": return Token.FROM;\r\n case \"function\": return Token.FUNCTION;\r\n }\r\n break;\r\n }\r\n case CharCode.g: {\r\n switch (text) {\r\n case \"get\": return Token.GET;\r\n }\r\n break;\r\n }\r\n case CharCode.i: {\r\n switch (text) {\r\n case \"if\": return Token.IF;\r\n case \"implements\": return Token.IMPLEMENTS;\r\n case \"import\": return Token.IMPORT;\r\n case \"in\": return Token.IN;\r\n case \"instanceof\": return Token.INSTANCEOF;\r\n case \"interface\": return Token.INTERFACE;\r\n case \"is\": return Token.IS;\r\n }\r\n break;\r\n }\r\n case CharCode.k: {\r\n switch (text) {\r\n case \"keyof\": return Token.KEYOF;\r\n }\r\n break;\r\n }\r\n case CharCode.l: {\r\n switch (text) {\r\n case \"let\": return Token.LET;\r\n }\r\n break;\r\n }\r\n case CharCode.m: {\r\n switch (text) {\r\n case \"module\": return Token.MODULE;\r\n }\r\n break;\r\n }\r\n case CharCode.n: {\r\n switch (text) {\r\n case \"namespace\": return Token.NAMESPACE;\r\n case \"new\": return Token.NEW;\r\n case \"null\": return Token.NULL;\r\n }\r\n break;\r\n }\r\n case CharCode.o: {\r\n switch (text) {\r\n case \"of\": return Token.OF;\r\n }\r\n break;\r\n }\r\n case CharCode.p: {\r\n switch (text) {\r\n case \"package\": return Token.PACKAGE;\r\n case \"private\": return Token.PRIVATE;\r\n case \"protected\": return Token.PROTECTED;\r\n case \"public\": return Token.PUBLIC;\r\n }\r\n break;\r\n }\r\n case CharCode.r: {\r\n switch (text) {\r\n case \"readonly\": return Token.READONLY;\r\n case \"return\": return Token.RETURN;\r\n }\r\n break;\r\n }\r\n case CharCode.s: {\r\n switch (text) {\r\n case \"set\": return Token.SET;\r\n case \"static\": return Token.STATIC;\r\n case \"super\": return Token.SUPER;\r\n case \"switch\": return Token.SWITCH;\r\n }\r\n break;\r\n }\r\n case CharCode.t: {\r\n switch (text) {\r\n case \"this\": return Token.THIS;\r\n case \"throw\": return Token.THROW;\r\n case \"true\": return Token.TRUE;\r\n case \"try\": return Token.TRY;\r\n case \"type\": return Token.TYPE;\r\n case \"typeof\": return Token.TYPEOF;\r\n }\r\n break;\r\n }\r\n case CharCode.v: {\r\n switch (text) {\r\n case \"var\": return Token.VAR;\r\n case \"void\": return Token.VOID;\r\n }\r\n break;\r\n }\r\n case CharCode.w: {\r\n switch (text) {\r\n case \"while\": return Token.WHILE;\r\n case \"with\": return Token.WITH;\r\n }\r\n break;\r\n }\r\n case CharCode.y: {\r\n switch (text) {\r\n case \"yield\": return Token.YIELD;\r\n }\r\n break;\r\n }\r\n }\r\n return Token.INVALID;\r\n}\r\n\r\nexport function tokenIsAlsoIdentifier(token: Token): bool {\r\n switch (token) {\r\n case Token.ABSTRACT:\r\n case Token.AS:\r\n case Token.CONSTRUCTOR:\r\n case Token.DECLARE:\r\n case Token.DELETE:\r\n case Token.FROM:\r\n case Token.FOR:\r\n case Token.GET:\r\n case Token.IS:\r\n case Token.KEYOF:\r\n case Token.MODULE:\r\n case Token.NAMESPACE:\r\n case Token.READONLY:\r\n case Token.SET:\r\n case Token.TYPE:\r\n case Token.VOID: return true;\r\n default: return false;\r\n }\r\n}\r\n\r\nexport function operatorTokenToString(token: Token): string {\r\n switch (token) {\r\n case Token.DELETE: return \"delete\";\r\n case Token.IN: return \"in\";\r\n case Token.INSTANCEOF: return \"instanceof\";\r\n case Token.NEW: return \"new\";\r\n case Token.TYPEOF: return \"typeof\";\r\n case Token.VOID: return \"void\";\r\n case Token.YIELD: return \"yield\";\r\n case Token.DOT_DOT_DOT: return \"...\";\r\n case Token.COMMA: return \",\";\r\n case Token.LESSTHAN: return \"<\";\r\n case Token.GREATERTHAN: return \">\";\r\n case Token.LESSTHAN_EQUALS: return \"<=\";\r\n case Token.GREATERTHAN_EQUALS: return \">=\";\r\n case Token.EQUALS_EQUALS: return \"==\";\r\n case Token.EXCLAMATION_EQUALS: return \"!=\";\r\n case Token.EQUALS_EQUALS_EQUALS: return \"===\";\r\n case Token.EXCLAMATION_EQUALS_EQUALS: return \"!==\";\r\n case Token.PLUS: return \"+\";\r\n case Token.MINUS: return \"-\";\r\n case Token.ASTERISK_ASTERISK: return \"**\";\r\n case Token.ASTERISK: return \"*\";\r\n case Token.SLASH: return \"/\";\r\n case Token.PERCENT: return \"%\";\r\n case Token.PLUS_PLUS: return \"++\";\r\n case Token.MINUS_MINUS: return \"--\";\r\n case Token.LESSTHAN_LESSTHAN: return \"<<\";\r\n case Token.GREATERTHAN_GREATERTHAN: return \">>\";\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return \">>>\";\r\n case Token.AMPERSAND: return \"&\";\r\n case Token.BAR: return \"|\";\r\n case Token.CARET: return \"^\";\r\n case Token.EXCLAMATION: return \"!\";\r\n case Token.TILDE: return \"~\";\r\n case Token.AMPERSAND_AMPERSAND: return \"&&\";\r\n case Token.BAR_BAR: return \"||\";\r\n case Token.EQUALS: return \"=\";\r\n case Token.PLUS_EQUALS: return \"+=\";\r\n case Token.MINUS_EQUALS: return \"-=\";\r\n case Token.ASTERISK_EQUALS: return \"*=\";\r\n case Token.ASTERISK_ASTERISK_EQUALS: return \"**=\";\r\n case Token.SLASH_EQUALS: return \"/=\";\r\n case Token.PERCENT_EQUALS: return \"%=\";\r\n case Token.LESSTHAN_LESSTHAN_EQUALS: return \"<<=\";\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS: return \">>=\";\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: return \">>>=\";\r\n case Token.AMPERSAND_EQUALS: return \"&=\";\r\n case Token.BAR_EQUALS: return \"|=\";\r\n case Token.CARET_EQUALS: return \"^=\";\r\n default: {\r\n assert(false);\r\n return \"\";\r\n }\r\n }\r\n}\r\n\r\nexport class Range {\r\n\r\n source: Source;\r\n start: i32;\r\n end: i32;\r\n\r\n // TODO: set these while tokenizing\r\n // line: i32;\r\n // column: i32;\r\n\r\n constructor(source: Source, start: i32, end: i32) {\r\n this.source = source;\r\n this.start = start;\r\n this.end = end;\r\n }\r\n\r\n static join(a: Range, b: Range): Range {\r\n if (a.source != b.source) throw new Error(\"source mismatch\");\r\n return new Range(a.source,\r\n a.start < b.start ? a.start : b.start,\r\n a.end > b.end ? a.end : b.end\r\n );\r\n }\r\n\r\n get atStart(): Range {\r\n return new Range(this.source, this.start, this.start);\r\n }\r\n get atEnd(): Range {\r\n return new Range(this.source, this.end, this.end);\r\n }\r\n\r\n get line(): i32 {\r\n var text = this.source.text;\r\n var line = 1;\r\n for (let pos = this.start; pos >= 0; --pos) {\r\n if (text.charCodeAt(pos) == CharCode.LINEFEED) line++;\r\n }\r\n return line;\r\n }\r\n\r\n get column(): i32 {\r\n var text = this.source.text;\r\n var column = 0;\r\n for (let pos = this.start - 1; pos >= 0; --pos) {\r\n if (text.charCodeAt(pos) == CharCode.LINEFEED) break;\r\n ++column;\r\n }\r\n return column;\r\n }\r\n\r\n toString(): string {\r\n return this.source.text.substring(this.start, this.end);\r\n }\r\n\r\n debugInfoRef: usize = 0;\r\n}\r\n\r\ndeclare function parseFloat(str: string): f64;\r\n\r\n/** Handler for intercepting comments while tokenizing. */\r\nexport type CommentHandler = (kind: CommentKind, text: string, range: Range) => void;\r\n\r\n/** Tokenizes a source to individual {@link Token}s. */\r\nexport class Tokenizer extends DiagnosticEmitter {\r\n\r\n source: Source;\r\n end: i32 = 0;\r\n\r\n pos: i32 = 0;\r\n token: Token = -1;\r\n tokenPos: i32 = 0;\r\n\r\n nextToken: Token = -1;\r\n nextTokenPos: i32 = 0;\r\n nextTokenOnNewLine: bool = false;\r\n\r\n onComment: CommentHandler | null = null;\r\n\r\n /** Constructs a new tokenizer. */\r\n constructor(source: Source, diagnostics: DiagnosticMessage[] | null = null) {\r\n super(diagnostics);\r\n this.source = source;\r\n this.pos = 0;\r\n this.end = source.text.length;\r\n this.diagnostics = diagnostics ? diagnostics : new Array();\r\n\r\n var text = source.text;\r\n\r\n // skip bom\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.BYTEORDERMARK\r\n ) {\r\n ++this.pos;\r\n }\r\n\r\n // skip shebang\r\n if (\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.HASH &&\r\n text.charCodeAt(this.pos + 1) == CharCode.EXCLAMATION\r\n ) {\r\n this.pos += 2;\r\n while (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) != CharCode.LINEFEED\r\n ) {\r\n ++this.pos;\r\n }\r\n // 'next' now starts at lf or eof\r\n }\r\n }\r\n\r\n next(identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): Token {\r\n this.nextToken = -1;\r\n return this.token = this.unsafeNext(identifierHandling);\r\n }\r\n\r\n private unsafeNext(\r\n identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\r\n maxTokenLength: i32 = i32.MAX_VALUE\r\n ): Token {\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n this.tokenPos = this.pos;\r\n let c = text.charCodeAt(this.pos);\r\n switch (c) {\r\n case CharCode.CARRIAGERETURN: {\r\n if (!(\r\n ++this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n )) break;\r\n // otherwise fall-through\r\n }\r\n case CharCode.LINEFEED:\r\n case CharCode.TAB:\r\n case CharCode.VERTICALTAB:\r\n case CharCode.FORMFEED:\r\n case CharCode.SPACE: {\r\n ++this.pos;\r\n break;\r\n }\r\n case CharCode.EXCLAMATION: {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.EXCLAMATION_EQUALS_EQUALS;\r\n }\r\n return Token.EXCLAMATION_EQUALS;\r\n }\r\n return Token.EXCLAMATION;\r\n }\r\n case CharCode.DOUBLEQUOTE:\r\n case CharCode.SINGLEQUOTE:\r\n case CharCode.BACKTICK: { // TODO\r\n return Token.STRINGLITERAL; // expects a call to readString\r\n }\r\n case CharCode.PERCENT: {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.PERCENT_EQUALS;\r\n }\r\n return Token.PERCENT;\r\n }\r\n case CharCode.AMPERSAND: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.AMPERSAND) {\r\n ++this.pos;\r\n return Token.AMPERSAND_AMPERSAND;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.AMPERSAND_EQUALS;\r\n }\r\n }\r\n return Token.AMPERSAND;\r\n }\r\n case CharCode.OPENPAREN: {\r\n ++this.pos;\r\n return Token.OPENPAREN;\r\n }\r\n case CharCode.CLOSEPAREN: {\r\n ++this.pos;\r\n return Token.CLOSEPAREN;\r\n }\r\n case CharCode.ASTERISK: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.ASTERISK_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.ASTERISK_ASTERISK_EQUALS;\r\n }\r\n return Token.ASTERISK_ASTERISK;\r\n }\r\n }\r\n return Token.ASTERISK;\r\n }\r\n case CharCode.PLUS: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.PLUS) {\r\n ++this.pos;\r\n return Token.PLUS_PLUS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.PLUS_EQUALS;\r\n }\r\n }\r\n return Token.PLUS;\r\n }\r\n case CharCode.COMMA: {\r\n ++this.pos;\r\n return Token.COMMA;\r\n }\r\n case CharCode.MINUS: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.MINUS) {\r\n ++this.pos;\r\n return Token.MINUS_MINUS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.MINUS_EQUALS;\r\n }\r\n }\r\n return Token.MINUS;\r\n }\r\n case CharCode.DOT: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (isDecimalDigit(text.charCodeAt(this.pos))) {\r\n --this.pos;\r\n return Token.FLOATLITERAL; // expects a call to readFloat\r\n }\r\n if (\r\n maxTokenLength > 2 && this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.DOT &&\r\n text.charCodeAt(this.pos + 1) == CharCode.DOT\r\n ) {\r\n this.pos += 2;\r\n return Token.DOT_DOT_DOT;\r\n }\r\n }\r\n return Token.DOT;\r\n }\r\n case CharCode.SLASH: {\r\n let commentStartPos = this.pos;\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.SLASH) { // single-line\r\n let commentKind = CommentKind.LINE;\r\n if (\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n ) {\r\n ++this.pos;\r\n commentKind = CommentKind.TRIPLE;\r\n }\r\n while (++this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.LINEFEED) {\r\n ++this.pos;\r\n break;\r\n }\r\n }\r\n if (this.onComment) {\r\n this.onComment(\r\n commentKind,\r\n text.substring(commentStartPos, this.pos),\r\n this.range(commentStartPos, this.pos)\r\n );\r\n }\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) { // multi-line\r\n let closed = false;\r\n while (++this.pos < this.end) {\r\n c = text.charCodeAt(this.pos);\r\n if (\r\n c == CharCode.ASTERISK &&\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n ) {\r\n this.pos += 2;\r\n closed = true;\r\n break;\r\n }\r\n }\r\n if (!closed) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n this.range(this.pos), \"*/\"\r\n );\r\n } else if (this.onComment) {\r\n this.onComment(\r\n CommentKind.BLOCK,\r\n text.substring(commentStartPos, this.pos),\r\n this.range(commentStartPos, this.pos)\r\n );\r\n }\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.SLASH_EQUALS;\r\n }\r\n }\r\n return Token.SLASH;\r\n }\r\n case CharCode._0:\r\n case CharCode._1:\r\n case CharCode._2:\r\n case CharCode._3:\r\n case CharCode._4:\r\n case CharCode._5:\r\n case CharCode._6:\r\n case CharCode._7:\r\n case CharCode._8:\r\n case CharCode._9: {\r\n return this.testInteger()\r\n ? Token.INTEGERLITERAL // expects a call to readInteger\r\n : Token.FLOATLITERAL; // expects a call to readFloat\r\n }\r\n case CharCode.COLON: {\r\n ++this.pos;\r\n return Token.COLON;\r\n }\r\n case CharCode.SEMICOLON: {\r\n ++this.pos;\r\n return Token.SEMICOLON;\r\n }\r\n case CharCode.LESSTHAN: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.LESSTHAN) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.LESSTHAN_LESSTHAN_EQUALS;\r\n }\r\n return Token.LESSTHAN_LESSTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.LESSTHAN_EQUALS;\r\n }\r\n }\r\n return Token.LESSTHAN;\r\n }\r\n case CharCode.EQUALS: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.EQUALS_EQUALS_EQUALS;\r\n }\r\n return Token.EQUALS_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n return Token.EQUALS_GREATERTHAN;\r\n }\r\n }\r\n return Token.EQUALS;\r\n }\r\n case CharCode.GREATERTHAN: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 3 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN;\r\n }\r\n case CharCode.QUESTION: {\r\n ++this.pos;\r\n return Token.QUESTION;\r\n }\r\n case CharCode.OPENBRACKET: {\r\n ++this.pos;\r\n return Token.OPENBRACKET;\r\n }\r\n case CharCode.CLOSEBRACKET: {\r\n ++this.pos;\r\n return Token.CLOSEBRACKET;\r\n }\r\n case CharCode.CARET: {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.CARET_EQUALS;\r\n }\r\n return Token.CARET;\r\n }\r\n case CharCode.OPENBRACE: {\r\n ++this.pos;\r\n return Token.OPENBRACE;\r\n }\r\n case CharCode.BAR: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.BAR) {\r\n ++this.pos;\r\n return Token.BAR_BAR;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.BAR_EQUALS;\r\n }\r\n }\r\n return Token.BAR;\r\n }\r\n case CharCode.CLOSEBRACE: {\r\n ++this.pos;\r\n return Token.CLOSEBRACE;\r\n }\r\n case CharCode.TILDE: {\r\n ++this.pos;\r\n return Token.TILDE;\r\n }\r\n case CharCode.AT: {\r\n ++this.pos;\r\n return Token.AT;\r\n }\r\n default: {\r\n if (isIdentifierStart(c)) {\r\n if (isKeywordCharacter(c)) {\r\n let posBefore = this.pos;\r\n while (\r\n ++this.pos < this.end &&\r\n isIdentifierPart(c = text.charCodeAt(this.pos))\r\n ) {\r\n if (!isKeywordCharacter(c)) {\r\n this.pos = posBefore;\r\n return Token.IDENTIFIER;\r\n }\r\n }\r\n let keywordText = text.substring(posBefore, this.pos);\r\n let keywordToken = tokenFromKeyword(keywordText);\r\n if (\r\n keywordToken != Token.INVALID &&\r\n identifierHandling !== IdentifierHandling.ALWAYS &&\r\n !(\r\n identifierHandling === IdentifierHandling.PREFER &&\r\n tokenIsAlsoIdentifier(keywordToken)\r\n )\r\n ) {\r\n return keywordToken;\r\n }\r\n this.pos = posBefore;\r\n }\r\n return Token.IDENTIFIER; // expects a call to readIdentifier\r\n } else if (isWhiteSpace(c)) {\r\n ++this.pos;\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Invalid_character,\r\n this.range(this.pos, this.pos + 1)\r\n );\r\n ++this.pos;\r\n return Token.INVALID;\r\n }\r\n }\r\n }\r\n return Token.ENDOFFILE;\r\n }\r\n\r\n peek(\r\n checkOnNewLine: bool = false,\r\n identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\r\n maxCompoundLength: i32 = i32.MAX_VALUE\r\n ): Token {\r\n var text = this.source.text;\r\n if (this.nextToken < 0) {\r\n let posBefore = this.pos;\r\n let tokenBefore = this.token;\r\n let tokenPosBefore = this.tokenPos;\r\n this.nextToken = this.unsafeNext(identifierHandling, maxCompoundLength);\r\n this.nextTokenPos = this.tokenPos;\r\n if (checkOnNewLine) {\r\n this.nextTokenOnNewLine = false;\r\n for (let pos = posBefore, end = this.nextTokenPos; pos < end; ++pos) {\r\n if (isLineBreak(text.charCodeAt(pos))) {\r\n this.nextTokenOnNewLine = true;\r\n break;\r\n }\r\n }\r\n }\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n }\r\n return this.nextToken;\r\n }\r\n\r\n skipIdentifier(identifierHandling: IdentifierHandling = IdentifierHandling.PREFER): bool {\r\n return this.skip(Token.IDENTIFIER, identifierHandling);\r\n }\r\n\r\n skip(token: Token, identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): bool {\r\n var posBefore = this.pos;\r\n var tokenBefore = this.token;\r\n var tokenPosBefore = this.tokenPos;\r\n var maxCompoundLength = i32.MAX_VALUE;\r\n switch (token) {\r\n case Token.GREATERTHAN: { // where parsing type arguments\r\n maxCompoundLength = 1;\r\n break;\r\n }\r\n }\r\n this.token = this.unsafeNext(identifierHandling, maxCompoundLength);\r\n if (this.token == token) {\r\n this.nextToken = -1;\r\n return true;\r\n } else {\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n return false;\r\n }\r\n }\r\n\r\n mark(): State {\r\n var state: State;\r\n if (reusableState) {\r\n state = reusableState;\r\n reusableState = null;\r\n } else {\r\n state = new State();\r\n }\r\n state.pos = this.pos;\r\n state.token = this.token;\r\n state.tokenPos = this.tokenPos;\r\n return state;\r\n }\r\n\r\n discard(state: State): void {\r\n reusableState = state;\r\n }\r\n\r\n reset(state: State): void {\r\n this.pos = state.pos;\r\n this.token = state.token;\r\n this.tokenPos = state.tokenPos;\r\n this.nextToken = -1;\r\n }\r\n\r\n range(start: i32 = -1, end: i32 = -1): Range {\r\n if (start < 0) {\r\n start = this.tokenPos;\r\n end = this.pos;\r\n } else if (end < 0) {\r\n end = start;\r\n }\r\n return new Range(this.source, start, end);\r\n }\r\n\r\n readIdentifier(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n while (\r\n ++this.pos < this.end &&\r\n isIdentifierPart(text.charCodeAt(this.pos))\r\n );\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n readString(): string {\r\n var text = this.source.text;\r\n var quote = text.charCodeAt(this.pos++);\r\n var start = this.pos;\r\n var result = \"\";\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n result += text.substring(start, this.pos);\r\n this.error(\r\n DiagnosticCode.Unterminated_string_literal,\r\n this.range(start - 1, this.end)\r\n );\r\n break;\r\n }\r\n let c = text.charCodeAt(this.pos);\r\n if (c == quote) {\r\n result += text.substring(start, this.pos++);\r\n break;\r\n }\r\n if (c == CharCode.BACKSLASH) {\r\n result += text.substring(start, this.pos);\r\n result += this.readEscapeSequence();\r\n start = this.pos;\r\n continue;\r\n }\r\n if (isLineBreak(c)) {\r\n result += text.substring(start, this.pos);\r\n this.error(\r\n DiagnosticCode.Unterminated_string_literal,\r\n this.range(start - 1, this.pos)\r\n );\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n return result;\r\n }\r\n\r\n readEscapeSequence(): string {\r\n if (++this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(this.end)\r\n );\r\n return \"\";\r\n }\r\n\r\n var text = this.source.text;\r\n var c = text.charCodeAt(this.pos++);\r\n switch (c) {\r\n case CharCode._0: return \"\\0\";\r\n case CharCode.b: return \"\\b\";\r\n case CharCode.t: return \"\\t\";\r\n case CharCode.n: return \"\\n\";\r\n case CharCode.v: return \"\\v\";\r\n case CharCode.f: return \"\\f\";\r\n case CharCode.r: return \"\\r\";\r\n case CharCode.SINGLEQUOTE: return \"'\";\r\n case CharCode.DOUBLEQUOTE: return \"\\\"\";\r\n case CharCode.u: {\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.OPENBRACE\r\n ) {\r\n ++this.pos;\r\n return this.readExtendedUnicodeEscape(); // \\u{DDDDDDDD}\r\n }\r\n return this.readUnicodeEscape(); // \\uDDDD\r\n }\r\n case CharCode.CARRIAGERETURN: {\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n ) {\r\n ++this.pos;\r\n }\r\n // fall through\r\n }\r\n case CharCode.LINEFEED:\r\n case CharCode.LINESEPARATOR:\r\n case CharCode.PARAGRAPHSEPARATOR: return \"\";\r\n default: return String.fromCharCode(c);\r\n }\r\n }\r\n\r\n readRegexpPattern(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var escaped = false;\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unterminated_regular_expression_literal,\r\n this.range(start, this.end)\r\n );\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.BACKSLASH) {\r\n ++this.pos;\r\n escaped = true;\r\n continue;\r\n }\r\n let c = text.charCodeAt(this.pos);\r\n if (c == CharCode.SLASH && !escaped) break;\r\n if (isLineBreak(c)) {\r\n this.error(\r\n DiagnosticCode.Unterminated_regular_expression_literal,\r\n this.range(start, this.pos)\r\n );\r\n break;\r\n }\r\n ++this.pos;\r\n escaped = false;\r\n }\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n readRegexpFlags(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var flags = 0;\r\n while (this.pos < this.end) {\r\n let c: i32 = text.charCodeAt(this.pos);\r\n if (!isIdentifierPart(c)) break;\r\n ++this.pos;\r\n\r\n // make sure each supported flag is unique\r\n switch (c) {\r\n case CharCode.g: {\r\n flags |= flags & 1 ? -1 : 1;\r\n break;\r\n }\r\n case CharCode.i: {\r\n flags |= flags & 2 ? -1 : 2;\r\n break;\r\n }\r\n case CharCode.m: {\r\n flags |= flags & 4 ? -1 : 4;\r\n break;\r\n }\r\n default: {\r\n flags = -1;\r\n break;\r\n }\r\n }\r\n }\r\n if (flags == -1) {\r\n this.error(\r\n DiagnosticCode.Invalid_regular_expression_flags,\r\n this.range(start, this.pos)\r\n );\r\n }\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n testInteger(): bool {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 1 < this.end) {\r\n switch (text.charCodeAt(this.pos + 2)) {\r\n case CharCode.X:\r\n case CharCode.x:\r\n case CharCode.B:\r\n case CharCode.b:\r\n case CharCode.O:\r\n case CharCode.o: return true;\r\n }\r\n }\r\n var pos = this.pos;\r\n while (pos < this.end) {\r\n let c = text.charCodeAt(pos);\r\n if (c == CharCode.DOT || c == CharCode.E || c == CharCode.e) {\r\n return false;\r\n }\r\n if ((c < CharCode._0 || c > CharCode._9) && c != CharCode._) break;\r\n // does not validate separator placement (this is done in readXYInteger)\r\n pos++;\r\n }\r\n return true;\r\n }\r\n\r\n readInteger(): I64 {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\r\n switch (text.charCodeAt(this.pos + 1)) {\r\n case CharCode.X:\r\n case CharCode.x: {\r\n this.pos += 2;\r\n return this.readHexInteger();\r\n }\r\n case CharCode.B:\r\n case CharCode.b: {\r\n this.pos += 2;\r\n return this.readBinaryInteger();\r\n }\r\n case CharCode.O:\r\n case CharCode.o: {\r\n this.pos += 2;\r\n return this.readOctalInteger();\r\n }\r\n }\r\n if (isOctalDigit(text.charCodeAt(this.pos + 1))) {\r\n let start = this.pos;\r\n ++this.pos;\r\n let value = this.readOctalInteger();\r\n this.error(\r\n DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode,\r\n this.range(start, this.pos)\r\n );\r\n return value;\r\n }\r\n }\r\n return this.readDecimalInteger();\r\n }\r\n\r\n readHexInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_16 = i64_new(16, 0);\r\n var sepEnd = start;\r\n while (this.pos < this.end) {\r\n let pos = this.pos;\r\n let c = text.charCodeAt(pos);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n // value = value * 16 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else if (c >= CharCode.A && c <= CharCode.F) {\r\n // value = value * 16 + 10 + c - CharCode.A;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(10 + c - CharCode.A, 0)\r\n );\r\n } else if (c >= CharCode.a && c <= CharCode.f) {\r\n // value = value * 16 + 10 + c - CharCode.a;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(10 + c - CharCode.a, 0)\r\n );\r\n } else if (c == CharCode._) {\r\n if (sepEnd == pos) {\r\n this.error(\r\n sepEnd == start\r\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n this.range(pos)\r\n );\r\n }\r\n sepEnd = pos + 1;\r\n } else {\r\n break;\r\n }\r\n this.pos = pos + 1;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Hexadecimal_digit_expected,\r\n this.range(start)\r\n );\r\n } else if (sepEnd == this.pos) {\r\n this.error(\r\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n this.range(sepEnd - 1)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readDecimalInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_10 = i64_new(10, 0);\r\n var sepEnd = start;\r\n while (this.pos < this.end) {\r\n let pos = this.pos;\r\n let c = text.charCodeAt(pos);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n // value = value * 10 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_10),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else if (c == CharCode._) {\r\n if (sepEnd == pos) {\r\n this.error(\r\n sepEnd == start\r\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n this.range(pos)\r\n );\r\n }\r\n sepEnd = pos + 1;\r\n } else {\r\n break;\r\n }\r\n this.pos = pos + 1;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Digit_expected,\r\n this.range(start)\r\n );\r\n } else if (sepEnd == this.pos) {\r\n this.error(\r\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n this.range(sepEnd - 1)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readOctalInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_8 = i64_new(8, 0);\r\n var sepEnd = start;\r\n while (this.pos < this.end) {\r\n let pos = this.pos;\r\n let c = text.charCodeAt(pos);\r\n if (c >= CharCode._0 && c <= CharCode._7) {\r\n // value = value * 8 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_8),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else if (c == CharCode._) {\r\n if (sepEnd == pos) {\r\n this.error(\r\n sepEnd == start\r\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n this.range(pos)\r\n );\r\n }\r\n sepEnd = pos + 1;\r\n } else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Octal_digit_expected,\r\n this.range(start)\r\n );\r\n } else if (sepEnd == this.pos) {\r\n this.error(\r\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n this.range(sepEnd - 1)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readBinaryInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_2 = i64_new(2, 0);\r\n var i64_1 = i64_new(1, 0);\r\n var sepEnd = start;\r\n while (this.pos < this.end) {\r\n let pos = this.pos;\r\n let c = text.charCodeAt(pos);\r\n if (c == CharCode._0) {\r\n // value = value * 2;\r\n value = i64_mul(\r\n value,\r\n i64_2\r\n );\r\n } else if (c == CharCode._1) {\r\n // value = value * 2 + 1;\r\n value = i64_add(\r\n i64_mul(value, i64_2),\r\n i64_1\r\n );\r\n } else if (c == CharCode._) {\r\n if (sepEnd == pos) {\r\n this.error(\r\n sepEnd == start\r\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n this.range(pos)\r\n );\r\n }\r\n sepEnd = pos + 1;\r\n } else {\r\n break;\r\n }\r\n this.pos = pos + 1;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Binary_digit_expected,\r\n this.range(start)\r\n );\r\n } else if (sepEnd == this.pos) {\r\n this.error(\r\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n this.range(sepEnd - 1)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readFloat(): f64 {\r\n // var text = this.source.text;\r\n // if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\r\n // switch (text.charCodeAt(this.pos + 1)) {\r\n // case CharCode.X:\r\n // case CharCode.x: {\r\n // this.pos += 2;\r\n // return this.readHexFloat();\r\n // }\r\n // }\r\n // }\r\n return this.readDecimalFloat();\r\n }\r\n\r\n readDecimalFloat(): f64 {\r\n // TODO: numeric separators (parseFloat can't handle these)\r\n var start = this.pos;\r\n var text = this.source.text;\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n if (this.pos < this.end && text.charCodeAt(this.pos) == CharCode.DOT) {\r\n ++this.pos;\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n if (this.pos < this.end) {\r\n let c = text.charCodeAt(this.pos);\r\n if (c == CharCode.E || c == CharCode.e) {\r\n if (\r\n ++this.pos < this.end && (\r\n text.charCodeAt(this.pos) == CharCode.MINUS ||\r\n text.charCodeAt(this.pos) == CharCode.PLUS\r\n ) &&\r\n isDecimalDigit(text.charCodeAt(this.pos + 1))\r\n ) {\r\n ++this.pos;\r\n }\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n }\r\n return parseFloat(text.substring(start, this.pos));\r\n }\r\n\r\n readHexFloat(): f64 {\r\n throw new Error(\"not implemented\"); // TBD\r\n }\r\n\r\n readUnicodeEscape(): string {\r\n var remain = 4;\r\n var value = 0;\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n let c = text.charCodeAt(this.pos++);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n value = value * 16 + c - CharCode._0;\r\n } else if (c >= CharCode.A && c <= CharCode.F) {\r\n value = value * 16 + 10 + c - CharCode.A;\r\n } else if (c >= CharCode.a && c <= CharCode.f) {\r\n value = value * 16 + 10 + c - CharCode.a;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Hexadecimal_digit_expected,\r\n this.range(this.pos - 1, this.pos)\r\n );\r\n return \"\";\r\n }\r\n if (--remain == 0) break;\r\n }\r\n if (remain) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(this.pos)\r\n );\r\n return \"\";\r\n }\r\n return String.fromCharCode(value);\r\n }\r\n\r\n private readExtendedUnicodeEscape(): string {\r\n var start = this.pos;\r\n var value = this.readHexInteger();\r\n var value32 = i64_low(value);\r\n var invalid = false;\r\n\r\n assert(!i64_high(value));\r\n if (value32 > 0x10FFFF) {\r\n this.error(\r\n DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,\r\n this.range(start, this.pos)\r\n );\r\n invalid = true;\r\n }\r\n\r\n var text = this.source.text;\r\n if (this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(start, this.end)\r\n );\r\n invalid = true;\r\n } else if (text.charCodeAt(this.pos) == CharCode.CLOSEBRACE) {\r\n ++this.pos;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Unterminated_Unicode_escape_sequence,\r\n this.range(start, this.pos)\r\n );\r\n invalid = true;\r\n }\r\n\r\n if (invalid) return \"\";\r\n return value32 < 65536\r\n ? String.fromCharCode(value32)\r\n : String.fromCharCode(\r\n (((value32 - 65536) / 1024 | 0) + 0xD800) as i32,\r\n ( (value32 - 65536) % 1024 + 0xDC00) as i32\r\n );\r\n }\r\n\r\n finish(): void {\r\n }\r\n}\r\n\r\n/** Tokenizer state as returned by {@link Tokenizer#mark} and consumed by {@link Tokenizer#reset}. */\r\nexport class State {\r\n /** Current position. */\r\n pos: i32;\r\n /** Current token. */\r\n token: Token;\r\n /** Current token's position. */\r\n tokenPos: i32;\r\n}\r\n\r\n// Reusable state object to reduce allocations\r\nvar reusableState: State | null = null;\r\n","/**\r\n * Mappings from AssemblyScript types to WebAssembly types.\r\n * @module types\r\n *//***/\r\n\r\nimport {\r\n Class,\r\n FunctionTarget,\r\n Program,\r\n DecoratorFlags\r\n} from \"./program\";\r\n\r\nimport {\r\n NativeType,\r\n ExpressionRef,\r\n Module\r\n} from \"./module\";\r\n\r\n/** Indicates the kind of a type. */\r\nexport const enum TypeKind {\r\n\r\n // signed integers\r\n\r\n /** An 8-bit signed integer. */\r\n I8,\r\n /** A 16-bit signed integer. */\r\n I16,\r\n /** A 32-bit signed integer. */\r\n I32,\r\n /** A 64-bit signed integer. */\r\n I64,\r\n /** A 32-bit/64-bit signed integer, depending on the target. */\r\n ISIZE,\r\n\r\n // unsigned integers\r\n\r\n /** An 8-bit unsigned integer. */\r\n U8,\r\n /** A 16-bit unsigned integer. */\r\n U16,\r\n /** A 32-bit unsigned integer. Also the base of function types. */\r\n U32,\r\n /** A 64-bit unsigned integer. */\r\n U64,\r\n /** A 32-bit/64-bit unsigned integer, depending on the target. Also the base of class types. */\r\n USIZE,\r\n /** A 1-bit unsigned integer. */\r\n BOOL, // sic\r\n\r\n // floats\r\n\r\n /** A 32-bit float. */\r\n F32,\r\n /** A 64-bit double. */\r\n F64,\r\n\r\n // other\r\n\r\n /** No return type. */\r\n VOID\r\n}\r\n\r\n/** Indicates capabilities of a type. */\r\nexport const enum TypeFlags {\r\n NONE = 0,\r\n /** Is a signed type that can represent negative values. */\r\n SIGNED = 1 << 0,\r\n /** Is an unsigned type that cannot represent negative values. */\r\n UNSIGNED = 1 << 1,\r\n /** Is an integer type. */\r\n INTEGER = 1 << 2,\r\n /** Is a floating point type. */\r\n FLOAT = 1 << 3,\r\n /** Is a pointer type. */\r\n POINTER = 1 << 4,\r\n /** Is smaller than 32-bits. */\r\n SHORT = 1 << 5,\r\n /** Is larger than 32-bits. */\r\n LONG = 1 << 6,\r\n /** Is a value type. */\r\n VALUE = 1 << 7,\r\n /** Is a reference type. */\r\n REFERENCE = 1 << 8,\r\n /** Is a nullable type. */\r\n NULLABLE = 1 << 9\r\n}\r\n\r\n/** Represents a resolved type. */\r\nexport class Type {\r\n\r\n /** Type kind. */\r\n kind: TypeKind;\r\n /** Type flags. */\r\n flags: TypeFlags;\r\n /** Size in bits. */\r\n size: u32;\r\n /** Size in bytes. */\r\n byteSize: i32;\r\n /** Underlying class reference, if a class type. */\r\n classReference: Class | null;\r\n /** Underlying signature reference, if a function type. */\r\n signatureReference: Signature | null;\r\n /** Respective non-nullable type, if nullable. */\r\n nonNullableType: Type;\r\n /** Cached nullable type, if non-nullable. */\r\n private cachedNullableType: Type | null = null;\r\n\r\n /** Constructs a new resolved type. */\r\n constructor(kind: TypeKind, flags: TypeFlags, size: u32) {\r\n this.kind = kind;\r\n this.flags = flags;\r\n this.size = size;\r\n this.byteSize = ceil(size / 8);\r\n this.classReference = null;\r\n this.signatureReference = null;\r\n this.nonNullableType = this;\r\n }\r\n\r\n /** Returns the closest int type representing this type. */\r\n get intType(): Type {\r\n switch (this.kind) {\r\n case TypeKind.I8: return Type.i8;\r\n case TypeKind.I16: return Type.i16;\r\n case TypeKind.F32:\r\n case TypeKind.I32: return Type.i32;\r\n case TypeKind.F64:\r\n case TypeKind.I64: return Type.i64;\r\n case TypeKind.ISIZE: return this.size == 64 ? Type.isize64 : Type.isize32;\r\n case TypeKind.U8: return Type.u8;\r\n case TypeKind.U16: return Type.u16;\r\n case TypeKind.U32: return Type.u32;\r\n case TypeKind.U64: return Type.u64;\r\n case TypeKind.USIZE: return this.size == 64 ? Type.usize64 : Type.usize32;\r\n case TypeKind.BOOL:\r\n default: return Type.i32;\r\n }\r\n }\r\n\r\n /** Tests if this is a managed type that needs GC hooks. */\r\n isManaged(program: Program): bool {\r\n if (program.hasGC) {\r\n let classReference = this.classReference;\r\n return classReference !== null && !classReference.hasDecorator(DecoratorFlags.UNMANAGED);\r\n }\r\n return false;\r\n }\r\n\r\n /** Computes the sign-extending shift in the target type. */\r\n computeSmallIntegerShift(targetType: Type): u32 {\r\n return targetType.size - this.size;\r\n }\r\n\r\n /** Computes the truncating mask in the target type. */\r\n computeSmallIntegerMask(targetType: Type): u32 {\r\n var size = this.is(TypeFlags.UNSIGNED) ? this.size : this.size - 1;\r\n return ~0 >>> (targetType.size - size);\r\n }\r\n\r\n /** Tests if this type has (all of) the specified flags. */\r\n is(flags: TypeFlags): bool { return (this.flags & flags) == flags; }\r\n /** Tests if this type has any of the specified flags. */\r\n isAny(flags: TypeFlags): bool { return (this.flags & flags) != 0; }\r\n\r\n /** Composes a class type from this type and a class. */\r\n asClass(classType: Class): Type {\r\n assert(this.kind == TypeKind.USIZE && !this.classReference);\r\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n ret.classReference = classType;\r\n return ret;\r\n }\r\n\r\n /** Composes a function type from this type and a function. */\r\n asFunction(signature: Signature): Type {\r\n assert(this.kind == TypeKind.U32 && !this.signatureReference);\r\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n ret.signatureReference = signature;\r\n return ret;\r\n }\r\n\r\n /** Composes the respective nullable type of this type. */\r\n asNullable(): Type {\r\n assert(this.is(TypeFlags.REFERENCE));\r\n if (!this.cachedNullableType) {\r\n assert(!this.is(TypeFlags.NULLABLE));\r\n this.cachedNullableType = new Type(this.kind, this.flags | TypeFlags.NULLABLE, this.size);\r\n this.cachedNullableType.nonNullableType = this;\r\n this.cachedNullableType.classReference = this.classReference; // either a class reference\r\n this.cachedNullableType.signatureReference = this.signatureReference; // or a function reference\r\n }\r\n return this.cachedNullableType;\r\n }\r\n\r\n /** Tests if a value of this type is assignable to a target of the specified type. */\r\n isAssignableTo(target: Type, signednessIsRelevant: bool = false): bool {\r\n var currentClass: Class | null;\r\n var targetClass: Class | null;\r\n var currentFunction: Signature | null;\r\n var targetFunction: Signature | null;\r\n if (this.is(TypeFlags.REFERENCE)) {\r\n if (target.is(TypeFlags.REFERENCE)) {\r\n if (!this.is(TypeFlags.NULLABLE) || target.is(TypeFlags.NULLABLE)) {\r\n if (currentClass = this.classReference) {\r\n if (targetClass = target.classReference) {\r\n return currentClass.isAssignableTo(targetClass);\r\n }\r\n } else if (currentFunction = this.signatureReference) {\r\n if (targetFunction = target.signatureReference) {\r\n return currentFunction.isAssignableTo(targetFunction);\r\n }\r\n }\r\n }\r\n }\r\n } else if (!target.is(TypeFlags.REFERENCE)) {\r\n if (this.is(TypeFlags.INTEGER)) {\r\n if (target.is(TypeFlags.INTEGER)) {\r\n if (\r\n !signednessIsRelevant ||\r\n this == Type.bool || // a bool (0 or 1) can be safely assigned to all sorts of integers\r\n this.is(TypeFlags.SIGNED) == target.is(TypeFlags.SIGNED)\r\n ) {\r\n return this.size <= target.size;\r\n }\r\n } else if (target.kind == TypeKind.F32) {\r\n return this.size <= 23; // mantissa bits\r\n } else if (target.kind == TypeKind.F64) {\r\n return this.size <= 52; // ^\r\n }\r\n } else if (this.is(TypeFlags.FLOAT)) {\r\n if (target.is(TypeFlags.FLOAT)) {\r\n return this.size <= target.size;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /** Determines the common compatible type of two types, if any. */\r\n static commonCompatible(left: Type, right: Type, signednessIsImportant: bool): Type | null {\r\n if (right.isAssignableTo(left, signednessIsImportant)) return left;\r\n else if (left.isAssignableTo(right, signednessIsImportant)) return right;\r\n return null;\r\n }\r\n\r\n /** Converts this type to its TypeScript representation. */\r\n toString(kindOnly: bool = false): string {\r\n if (!kindOnly && this.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.classReference;\r\n if (classReference) {\r\n return this.is(TypeFlags.NULLABLE)\r\n ? classReference.toString() + \" | null\"\r\n : classReference.toString();\r\n }\r\n let signatureReference = this.signatureReference;\r\n if (signatureReference) {\r\n return this.is(TypeFlags.NULLABLE)\r\n ? \"(\" + signatureReference.toString(true) + \") | null\"\r\n : signatureReference.toString(true);\r\n }\r\n assert(false);\r\n }\r\n switch (this.kind) {\r\n case TypeKind.I8: return \"i8\";\r\n case TypeKind.I16: return \"i16\";\r\n case TypeKind.I32: return \"i32\";\r\n case TypeKind.I64: return \"i64\";\r\n case TypeKind.ISIZE: return \"isize\";\r\n case TypeKind.U8: return \"u8\";\r\n case TypeKind.U16: return \"u16\";\r\n case TypeKind.U32: return \"u32\";\r\n case TypeKind.U64: return \"u64\";\r\n case TypeKind.USIZE: return \"usize\";\r\n case TypeKind.BOOL: return \"bool\";\r\n case TypeKind.F32: return \"f32\";\r\n case TypeKind.F64: return \"f64\";\r\n default: assert(false);\r\n case TypeKind.VOID: return \"void\";\r\n }\r\n }\r\n\r\n // Binaryen specific\r\n\r\n /** Converts this type to its respective native type. */\r\n toNativeType(): NativeType {\r\n switch (this.kind) {\r\n default: return NativeType.I32;\r\n case TypeKind.I64:\r\n case TypeKind.U64: return NativeType.I64;\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: return this.size == 64 ? NativeType.I64 : NativeType.I32;\r\n case TypeKind.F32: return NativeType.F32;\r\n case TypeKind.F64: return NativeType.F64;\r\n case TypeKind.VOID: return NativeType.None;\r\n }\r\n }\r\n\r\n /** Converts this type to its native `0` value. */\r\n toNativeZero(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n case TypeKind.VOID: assert(false);\r\n default: return module.createI32(0);\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(0);\r\n case TypeKind.I64:\r\n case TypeKind.U64: return module.createI64(0);\r\n case TypeKind.F32: return module.createF32(0);\r\n case TypeKind.F64: return module.createF64(0);\r\n }\r\n }\r\n\r\n /** Converts this type to its native `1` value. */\r\n toNativeOne(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n case TypeKind.VOID: assert(false);\r\n default: return module.createI32(1);\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(1);\r\n case TypeKind.I64:\r\n case TypeKind.U64: return module.createI64(1);\r\n case TypeKind.F32: return module.createF32(1);\r\n case TypeKind.F64: return module.createF64(1);\r\n }\r\n }\r\n\r\n /** Converts this type to its native `-1` value. */\r\n toNativeNegOne(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n case TypeKind.VOID: assert(false);\r\n default: return module.createI32(-1);\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(-1);\r\n case TypeKind.I64:\r\n case TypeKind.U64: return module.createI64(-1, -1);\r\n case TypeKind.F32: return module.createF32(-1);\r\n case TypeKind.F64: return module.createF64(-1);\r\n }\r\n }\r\n\r\n /** Converts this type to its signature string. */\r\n toSignatureString(): string {\r\n switch (this.kind) {\r\n default: return \"i\";\r\n case TypeKind.I64:\r\n case TypeKind.U64: return \"I\";\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: return this.size == 64 ? \"I\" : \"i\";\r\n case TypeKind.F32: return \"f\";\r\n case TypeKind.F64: return \"F\";\r\n case TypeKind.VOID: return \"v\";\r\n }\r\n }\r\n\r\n // Types\r\n\r\n /** An 8-bit signed integer. */\r\n static readonly i8: Type = new Type(TypeKind.I8,\r\n TypeFlags.SIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 8\r\n );\r\n\r\n /** A 16-bit signed integer. */\r\n static readonly i16: Type = new Type(TypeKind.I16,\r\n TypeFlags.SIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 16\r\n );\r\n\r\n /** A 32-bit signed integer. */\r\n static readonly i32: Type = new Type(TypeKind.I32,\r\n TypeFlags.SIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit signed integer. */\r\n static readonly i64: Type = new Type(TypeKind.I64,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 32-bit signed size. WASM32 only. */\r\n static readonly isize32: Type = new Type(TypeKind.ISIZE,\r\n TypeFlags.SIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.POINTER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit signed size. WASM64 only. */\r\n static readonly isize64: Type = new Type(TypeKind.ISIZE,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.POINTER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** An 8-bit unsigned integer. */\r\n static readonly u8: Type = new Type(TypeKind.U8,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 8\r\n );\r\n\r\n /** A 16-bit unsigned integer. */\r\n static readonly u16: Type = new Type(TypeKind.U16,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 16\r\n );\r\n\r\n /** A 32-bit unsigned integer. */\r\n static readonly u32: Type = new Type(TypeKind.U32,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit unsigned integer. */\r\n static readonly u64: Type = new Type(TypeKind.U64,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 32-bit unsigned size. WASM32 only. */\r\n static readonly usize32: Type = new Type(TypeKind.USIZE,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.POINTER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit unsigned size. WASM64 only. */\r\n static readonly usize64: Type = new Type(TypeKind.USIZE,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.POINTER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 1-bit unsigned integer. */\r\n static readonly bool: Type = new Type(TypeKind.BOOL,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 1\r\n );\r\n\r\n /** A 32-bit float. */\r\n static readonly f32: Type = new Type(TypeKind.F32,\r\n TypeFlags.SIGNED |\r\n TypeFlags.FLOAT |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit float. */\r\n static readonly f64: Type = new Type(TypeKind.F64,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.FLOAT |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** No return type. */\r\n static readonly void: Type = new Type(TypeKind.VOID, TypeFlags.NONE, 0);\r\n}\r\n\r\n/** Converts an array of types to an array of native types. */\r\nexport function typesToNativeTypes(types: Type[]): NativeType[] {\r\n var numTypes = types.length;\r\n var ret = new Array(numTypes);\r\n for (let i = 0; i < numTypes; ++i) ret[i] = types[i].toNativeType();\r\n return ret;\r\n}\r\n\r\n/** Converts an array of types to its combined string representation. */\r\nexport function typesToString(types: Type[]): string {\r\n var numTypes = types.length;\r\n if (!numTypes) return \"\";\r\n var sb = new Array(numTypes);\r\n for (let i = 0; i < numTypes; ++i) sb[i] = types[i].toString();\r\n return sb.join(\",\");\r\n}\r\n\r\n/** Represents a fully resolved function signature. */\r\nexport class Signature {\r\n\r\n /** Parameter types, if any, excluding `this`. */\r\n parameterTypes: Type[];\r\n /** Parameter names, if known, excluding `this`. */\r\n parameterNames: string[] | null;\r\n /** Number of required parameters excluding `this`. Other parameters are considered optional. */\r\n requiredParameters: i32;\r\n /** Return type. */\r\n returnType: Type;\r\n /** This type, if an instance signature. */\r\n thisType: Type | null;\r\n /** Whether the last parameter is a rest parameter. */\r\n hasRest: bool;\r\n /** Cached {@link FunctionTarget}. */\r\n cachedFunctionTarget: FunctionTarget | null = null;\r\n /** Respective function type. */\r\n type: Type;\r\n\r\n /** Constructs a new signature. */\r\n constructor(\r\n parameterTypes: Type[] | null = null,\r\n returnType: Type | null = null,\r\n thisType: Type | null = null\r\n ) {\r\n this.parameterTypes = parameterTypes ? parameterTypes : [];\r\n this.parameterNames = null;\r\n this.requiredParameters = 0;\r\n this.returnType = returnType ? returnType : Type.void;\r\n this.thisType = thisType;\r\n this.hasRest = false;\r\n this.type = Type.u32.asFunction(this);\r\n }\r\n\r\n /** Gets the known or, alternatively, generic parameter name at the specified index. */\r\n getParameterName(index: i32): string {\r\n var parameterNames = this.parameterNames;\r\n return parameterNames && parameterNames.length > index\r\n ? parameterNames[index]\r\n : getDefaultParameterName(index);\r\n }\r\n\r\n /** Tests if a value of this function type is assignable to a target of the specified function type. */\r\n isAssignableTo(target: Signature): bool {\r\n // TODO: maybe cache results?\r\n\r\n // check `this` type\r\n var thisThisType = this.thisType;\r\n var targetThisType = target.thisType;\r\n if (thisThisType) {\r\n if (!(targetThisType && thisThisType.isAssignableTo(targetThisType))) return false;\r\n } else if (targetThisType) {\r\n return false;\r\n }\r\n\r\n // check rest parameter\r\n if (this.hasRest != target.hasRest) return false; // TODO\r\n\r\n // check parameter types\r\n var thisParameterTypes = this.parameterTypes;\r\n var targetParameterTypes = target.parameterTypes;\r\n var numParameters = thisParameterTypes.length;\r\n if (numParameters != targetParameterTypes.length) return false;\r\n for (let i = 0; i < numParameters; ++i) {\r\n let thisParameterType = thisParameterTypes[i];\r\n let targetParameterType = targetParameterTypes[i];\r\n if (!thisParameterType.isAssignableTo(targetParameterType)) return false;\r\n }\r\n\r\n // check return type\r\n var thisReturnType = this.returnType;\r\n var targetReturnType = target.returnType;\r\n return thisReturnType == targetReturnType || thisReturnType.isAssignableTo(targetReturnType);\r\n }\r\n\r\n /** Converts a signature to a function type string. */\r\n static makeSignatureString(parameterTypes: Type[] | null, returnType: Type, thisType: Type | null = null): string {\r\n var sb = [];\r\n if (thisType) sb.push(thisType.toSignatureString());\r\n if (parameterTypes) {\r\n for (let i = 0, k = parameterTypes.length; i < k; ++i) sb.push(parameterTypes[i].toSignatureString());\r\n }\r\n sb.push(returnType.toSignatureString());\r\n return sb.join(\"\");\r\n }\r\n\r\n /** Converts this signature to a function type string. */\r\n toSignatureString(): string {\r\n return Signature.makeSignatureString(this.parameterTypes, this.returnType, this.thisType);\r\n }\r\n\r\n /** Converts this signature to a string. */\r\n toString(includeThis: bool = false): string {\r\n var sb = new Array();\r\n sb.push(\"(\");\r\n var index = 0;\r\n var thisType = this.thisType;\r\n if (thisType) {\r\n if (includeThis) {\r\n sb.push(\"this: \");\r\n sb.push(thisType.toString());\r\n index = 1;\r\n }\r\n }\r\n var parameters = this.parameterTypes;\r\n var numParameters = parameters.length;\r\n if (numParameters) {\r\n let names = this.parameterNames;\r\n let numNames = names ? names.length : 0;\r\n let optionalStart = this.requiredParameters;\r\n let restIndex = this.hasRest ? numParameters - 1 : -1;\r\n for (let i = 0; i < numParameters; ++i, ++index) {\r\n if (index) sb.push(\", \");\r\n if (i == restIndex) sb.push(\"...\");\r\n if (i < numNames) sb.push((names)[i]);\r\n else sb.push(getDefaultParameterName(i));\r\n if (i >= optionalStart && i != restIndex) sb.push(\"?: \");\r\n else sb.push(\": \");\r\n sb.push(parameters[i].toString());\r\n }\r\n }\r\n sb.push(\") => \");\r\n sb.push(this.returnType.toString());\r\n return sb.join(\"\");\r\n }\r\n}\r\n\r\n// helpers\r\n\r\n// Cached default parameter names used where names are unknown.\r\nvar cachedDefaultParameterNames: string[] | null = null;\r\n\r\n/** Gets the cached default parameter name for the specified index. */\r\nexport function getDefaultParameterName(index: i32): string {\r\n if (!cachedDefaultParameterNames) cachedDefaultParameterNames = [];\r\n for (let i = cachedDefaultParameterNames.length; i <= index; ++i) {\r\n cachedDefaultParameterNames.push(\"arg$\" + i.toString(10));\r\n }\r\n return cachedDefaultParameterNames[index - 1];\r\n}\r\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\r\n * The AssemblyScript compiler.\r\n * @module compiler\r\n *//***/\r\n\r\nimport {\r\n compileCall as compileBuiltinCall,\r\n compileAllocate,\r\n compileAbort,\r\n compileIterateRoots,\r\n ensureGCHook\r\n} from \"./builtins\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Module,\r\n MemorySegment,\r\n ExpressionRef,\r\n UnaryOp,\r\n BinaryOp,\r\n NativeType,\r\n FunctionRef,\r\n ExpressionId,\r\n FunctionTypeRef,\r\n GlobalRef,\r\n getExpressionId,\r\n getExpressionType,\r\n getConstValueI32,\r\n getConstValueI64Low,\r\n getConstValueI64High,\r\n getConstValueF32,\r\n getConstValueF64,\r\n getGetLocalIndex,\r\n getBlockChildCount,\r\n getBlockChild,\r\n getBlockName,\r\n needsExplicitUnreachable\r\n} from \"./module\";\r\n\r\nimport {\r\n CommonFlags,\r\n PATH_DELIMITER,\r\n INNER_DELIMITER,\r\n INSTANCE_DELIMITER,\r\n STATIC_DELIMITER,\r\n GETTER_PREFIX,\r\n SETTER_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n Program,\r\n ClassPrototype,\r\n Class,\r\n Element,\r\n ElementKind,\r\n Enum,\r\n Field,\r\n FunctionPrototype,\r\n Function,\r\n FunctionTarget,\r\n Global,\r\n Local,\r\n Namespace,\r\n EnumValue,\r\n Property,\r\n VariableLikeElement,\r\n FlowFlags,\r\n ConstantValueKind,\r\n Flow,\r\n OperatorKind,\r\n DecoratorFlags\r\n} from \"./program\";\r\n\r\nimport {\r\n Resolver, ReportMode\r\n} from \"./resolver\";\r\n\r\nimport {\r\n Token,\r\n operatorTokenToString\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n TypeNode,\r\n Source,\r\n Range,\r\n DecoratorKind,\r\n\r\n Statement,\r\n BlockStatement,\r\n BreakStatement,\r\n ClassDeclaration,\r\n ContinueStatement,\r\n DeclarationStatement,\r\n DoStatement,\r\n EmptyStatement,\r\n EnumDeclaration,\r\n ExportStatement,\r\n ExpressionStatement,\r\n FunctionDeclaration,\r\n ForStatement,\r\n IfStatement,\r\n ImportStatement,\r\n InstanceOfExpression,\r\n InterfaceDeclaration,\r\n NamespaceDeclaration,\r\n ReturnStatement,\r\n SwitchStatement,\r\n ThrowStatement,\r\n TryStatement,\r\n VariableDeclaration,\r\n VariableStatement,\r\n VoidStatement,\r\n WhileStatement,\r\n\r\n Expression,\r\n AssertionExpression,\r\n BinaryExpression,\r\n CallExpression,\r\n CommaExpression,\r\n ElementAccessExpression,\r\n FloatLiteralExpression,\r\n FunctionExpression,\r\n IdentifierExpression,\r\n IntegerLiteralExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n NewExpression,\r\n ObjectLiteralExpression,\r\n ParenthesizedExpression,\r\n PropertyAccessExpression,\r\n TernaryExpression,\r\n ArrayLiteralExpression,\r\n StringLiteralExpression,\r\n UnaryPostfixExpression,\r\n UnaryPrefixExpression,\r\n FieldDeclaration,\r\n\r\n nodeIsConstantValue,\r\n isLastStatement,\r\n findDecorator\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags,\r\n Signature,\r\n\r\n typesToNativeTypes\r\n} from \"./types\";\r\n\r\nimport {\r\n writeI8,\r\n writeI16,\r\n writeI32,\r\n writeI64,\r\n writeF32,\r\n writeF64,\r\n makeMap\r\n} from \"./util\";\r\n\r\n/** Compilation target. */\r\nexport enum Target {\r\n /** WebAssembly with 32-bit pointers. */\r\n WASM32,\r\n /** WebAssembly with 64-bit pointers. Experimental and not supported by any runtime yet. */\r\n WASM64\r\n}\r\n\r\n/** Compiler options. */\r\nexport class Options {\r\n\r\n /** WebAssembly target. Defaults to {@link Target.WASM32}. */\r\n target: Target = Target.WASM32;\r\n /** If true, compiles everything instead of just reachable code. */\r\n noTreeShaking: bool = false;\r\n /** If true, replaces assertions with nops. */\r\n noAssert: bool = false;\r\n /** If true, imports the memory provided by the embedder. */\r\n importMemory: bool = false;\r\n /** If true, imports the function table provided by the embedder. */\r\n importTable: bool = false;\r\n /** If true, generates information necessary for source maps. */\r\n sourceMap: bool = false;\r\n /** Static memory start offset. */\r\n memoryBase: i32 = 0;\r\n /** Global aliases. */\r\n globalAliases: Map | null = null;\r\n /** Additional features to activate. */\r\n features: Feature = Feature.NONE;\r\n\r\n /** Hinted optimize level. Not applied by the compiler itself. */\r\n optimizeLevelHint: i32 = 0;\r\n /** Hinted shrink level. Not applied by the compiler itself. */\r\n shrinkLevelHint: i32 = 0;\r\n\r\n /** Tests if the target is WASM64 or, otherwise, WASM32. */\r\n get isWasm64(): bool {\r\n return this.target == Target.WASM64;\r\n }\r\n\r\n /** Gets the unsigned size type matching the target. */\r\n get usizeType(): Type {\r\n return this.target == Target.WASM64 ? Type.usize64 : Type.usize32;\r\n }\r\n\r\n /** Gets the signed size type matching the target. */\r\n get isizeType(): Type {\r\n return this.target == Target.WASM64 ? Type.isize64 : Type.isize32;\r\n }\r\n\r\n /** Gets the native size type matching the target. */\r\n get nativeSizeType(): NativeType {\r\n return this.target == Target.WASM64 ? NativeType.I64 : NativeType.I32;\r\n }\r\n\r\n /** Tests if a specific feature is activated. */\r\n hasFeature(feature: Feature): bool {\r\n return (this.features & feature) != 0;\r\n }\r\n}\r\n\r\n/** Indicates specific features to activate. */\r\nexport const enum Feature {\r\n /** No additional features. */\r\n NONE = 0,\r\n /** Sign extension operations. */\r\n SIGN_EXTENSION = 1 << 0, // see: https://github.com/WebAssembly/sign-extension-ops\r\n /** Mutable global imports and exports. */\r\n MUTABLE_GLOBAL = 1 << 1 // see: https://github.com/WebAssembly/mutable-global\r\n}\r\n\r\n/** Indicates the desired kind of a conversion. */\r\nexport const enum ConversionKind {\r\n /** No conversion. */\r\n NONE,\r\n /** Implicit conversion. */\r\n IMPLICIT,\r\n /** Explicit conversion. */\r\n EXPLICIT\r\n}\r\n\r\n/** Indicates the desired wrap mode of a conversion. */\r\nexport const enum WrapMode {\r\n /** No wrapping. */\r\n NONE,\r\n /** Wrap small integer values. */\r\n WRAP\r\n}\r\n\r\n/** Compiler interface. */\r\nexport class Compiler extends DiagnosticEmitter {\r\n\r\n /** Program reference. */\r\n program: Program;\r\n /** Resolver reference. */\r\n resolver: Resolver;\r\n /** Provided options. */\r\n options: Options;\r\n /** Module instance being compiled. */\r\n module: Module;\r\n /** Current function in compilation. */\r\n currentFunction: Function;\r\n /** Current outer function in compilation, if compiling a function expression. */\r\n currentOuterFunction: Function | null = null;\r\n /** Current inline functions stack. */\r\n currentInlineFunctions: Function[] = [];\r\n /** Current enum in compilation. */\r\n currentEnum: Enum | null = null;\r\n /** Current type in compilation. */\r\n currentType: Type = Type.void;\r\n /** Start function being compiled. */\r\n startFunctionInstance: Function;\r\n /** Start function statements. */\r\n startFunctionBody: ExpressionRef[];\r\n /** Counting memory offset. */\r\n memoryOffset: I64;\r\n /** Memory segments being compiled. */\r\n memorySegments: MemorySegment[] = [];\r\n /** Map of already compiled static string segments. */\r\n stringSegments: Map = new Map();\r\n /** Function table being compiled. */\r\n functionTable: string[] = [ \"null\" ];\r\n /** Argument count helper global. */\r\n argcVar: GlobalRef = 0;\r\n /** Argument count helper setter. */\r\n argcSet: FunctionRef = 0;\r\n /** Indicates whether the iterateRoots function must be generated. */\r\n needsIterateRoots: bool = false;\r\n\r\n /** Compiles a {@link Program} to a {@link Module} using the specified options. */\r\n static compile(program: Program, options: Options | null = null): Module {\r\n return new Compiler(program, options).compile();\r\n }\r\n\r\n /** Constructs a new compiler for a {@link Program} using the specified options. */\r\n constructor(program: Program, options: Options | null = null) {\r\n super(program.diagnostics);\r\n this.program = program;\r\n this.resolver = program.resolver;\r\n if (!options) options = new Options();\r\n this.options = options;\r\n this.memoryOffset = i64_new(\r\n // leave space for `null`. also functions as a sentinel for erroneous stores at offset 0.\r\n // note that Binaryen's asm.js output utilizes the first 8 bytes for reinterpretations (#1547)\r\n max(options.memoryBase, 8)\r\n );\r\n this.module = Module.create();\r\n }\r\n\r\n /** Performs compilation of the underlying {@link Program} to a {@link Module}. */\r\n compile(): Module {\r\n var options = this.options;\r\n var module = this.module;\r\n var program = this.program;\r\n\r\n // initialize lookup maps, built-ins, imports, exports, etc.\r\n program.initialize(options);\r\n\r\n // set up the start function\r\n var startFunctionInstance = new Function(program.startFunction, \"start\", new Signature([], Type.void));\r\n this.startFunctionInstance = startFunctionInstance;\r\n var startFunctionBody = new Array();\r\n this.startFunctionBody = startFunctionBody;\r\n this.currentFunction = startFunctionInstance;\r\n\r\n // add a mutable heap base dummy\r\n if (options.isWasm64) {\r\n module.addGlobal(\r\n \"HEAP_BASE\",\r\n NativeType.I64,\r\n true,\r\n module.createI64(0, 0)\r\n );\r\n } else {\r\n module.addGlobal(\r\n \"HEAP_BASE\",\r\n NativeType.I32,\r\n false,\r\n module.createI32(0)\r\n );\r\n }\r\n\r\n // compile entry file(s) while traversing reachable elements\r\n var sources = program.sources;\r\n for (let i = 0, k = sources.length; i < k; ++i) {\r\n if (sources[i].isEntry) this.compileSource(sources[i]);\r\n }\r\n\r\n // compile the start function if not empty or called by main\r\n if (startFunctionBody.length || program.mainFunction !== null) {\r\n let signature = startFunctionInstance.signature;\r\n let funcRef = module.addFunction(\r\n startFunctionInstance.internalName,\r\n this.ensureFunctionType(\r\n signature.parameterTypes,\r\n signature.returnType,\r\n signature.thisType\r\n ),\r\n typesToNativeTypes(startFunctionInstance.additionalLocals),\r\n module.createBlock(null, startFunctionBody)\r\n );\r\n startFunctionInstance.finalize(module, funcRef);\r\n if (!program.mainFunction) module.setStart(funcRef);\r\n }\r\n\r\n // update the heap base pointer\r\n var memoryOffset = this.memoryOffset;\r\n memoryOffset = i64_align(memoryOffset, options.usizeType.byteSize);\r\n this.memoryOffset = memoryOffset;\r\n module.removeGlobal(\"HEAP_BASE\");\r\n if (options.isWasm64) {\r\n module.addGlobal(\r\n \"HEAP_BASE\",\r\n NativeType.I64,\r\n false,\r\n module.createI64(i64_low(memoryOffset), i64_high(memoryOffset))\r\n );\r\n } else {\r\n module.addGlobal(\r\n \"HEAP_BASE\",\r\n NativeType.I32,\r\n false,\r\n module.createI32(i64_low(memoryOffset))\r\n );\r\n }\r\n\r\n // set up memory\r\n module.setMemory(\r\n this.options.memoryBase /* is specified */ || this.memorySegments.length\r\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\r\n : 0,\r\n Module.UNLIMITED_MEMORY,\r\n this.memorySegments,\r\n options.target,\r\n \"memory\"\r\n );\r\n\r\n // import memory if requested (default memory is named '0' by Binaryen)\r\n if (options.importMemory) module.addMemoryImport(\"0\", \"env\", \"memory\");\r\n\r\n // set up function table\r\n var functionTable = this.functionTable;\r\n module.setFunctionTable(functionTable.length, 0xffffffff, functionTable);\r\n module.addTableExport(\"0\", \"table\");\r\n module.addFunction(\"null\", this.ensureFunctionType(null, Type.void), null, module.createBlock(null, []));\r\n\r\n // import table if requested (default table is named '0' by Binaryen)\r\n if (options.importTable) module.addTableImport(\"0\", \"env\", \"table\");\r\n\r\n // set up module exports\r\n for (let [name, moduleExport] of program.moduleLevelExports) {\r\n this.makeModuleExport(name, moduleExport.element);\r\n }\r\n\r\n // set up gc\r\n if (this.needsIterateRoots) compileIterateRoots(this);\r\n\r\n return module;\r\n }\r\n\r\n /** Applies the respective module export(s) for the specified element. */\r\n private makeModuleExport(name: string, element: Element, prefix: string = \"\"): void {\r\n\r\n // traverse members\r\n var members = element.members;\r\n if (members) {\r\n let subPrefix = prefix + name + (element.kind == ElementKind.CLASS\r\n ? INSTANCE_DELIMITER\r\n : STATIC_DELIMITER\r\n );\r\n if (element.kind == ElementKind.NAMESPACE) {\r\n for (let member of members.values()) {\r\n if (!member.is(CommonFlags.EXPORT)) continue;\r\n this.makeModuleExport(member.simpleName, member, subPrefix);\r\n }\r\n } else {\r\n for (let member of members.values()) {\r\n if (member.is(CommonFlags.PRIVATE)) continue;\r\n this.makeModuleExport(member.simpleName, member, subPrefix);\r\n }\r\n }\r\n }\r\n\r\n switch (element.kind) {\r\n\r\n // export global\r\n case ElementKind.GLOBAL: {\r\n let isConst = element.is(CommonFlags.CONST) || element.is(CommonFlags.STATIC | CommonFlags.READONLY);\r\n if (!isConst && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n let declaration = (element).declaration;\r\n if (declaration) {\r\n this.error(\r\n DiagnosticCode.Cannot_export_a_mutable_global,\r\n declaration.name.range\r\n );\r\n }\r\n } else {\r\n this.module.addGlobalExport(element.internalName, prefix + name);\r\n }\r\n break;\r\n }\r\n case ElementKind.ENUMVALUE: {\r\n if (!assert(element.parent).is(CommonFlags.CONST) && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n let declaration = (element).declaration;\r\n if (declaration) {\r\n this.error(\r\n DiagnosticCode.Cannot_export_a_mutable_global,\r\n declaration.name.range\r\n );\r\n }\r\n } else {\r\n this.module.addGlobalExport(element.internalName, prefix + name);\r\n }\r\n break;\r\n }\r\n\r\n // export function\r\n case ElementKind.FUNCTION: {\r\n let instance = element;\r\n let signature = instance.signature;\r\n if (signature.requiredParameters < signature.parameterTypes.length) {\r\n // utilize trampoline to fill in omitted arguments\r\n instance = this.ensureTrampoline(instance);\r\n this.ensureArgcSet();\r\n }\r\n if (instance.is(CommonFlags.COMPILED)) this.module.addFunctionExport(instance.internalName, prefix + name);\r\n break;\r\n }\r\n\r\n // export getter and setter\r\n case ElementKind.PROPERTY: {\r\n let getter = assert((element).getterPrototype);\r\n this.makeModuleExport(GETTER_PREFIX + name, getter, prefix);\r\n let setter = (element).setterPrototype;\r\n if (setter) this.makeModuleExport(SETTER_PREFIX + name, setter, prefix);\r\n break;\r\n }\r\n\r\n // export a getter and a setter\r\n case ElementKind.FIELD: {\r\n let module = this.module;\r\n let type = (element).type;\r\n let nativeType = type.toNativeType();\r\n let offset = (element).memoryOffset;\r\n let usizeType = this.options.usizeType;\r\n let nativeSizeType = this.options.nativeSizeType;\r\n\r\n // make a getter\r\n let getterName = prefix + GETTER_PREFIX + name;\r\n module.addFunction(\r\n getterName,\r\n this.ensureFunctionType(null, type, usizeType),\r\n null,\r\n module.createLoad(\r\n type.byteSize,\r\n type.is(TypeFlags.SIGNED),\r\n module.createGetLocal(0, nativeSizeType),\r\n nativeType,\r\n offset\r\n )\r\n );\r\n module.addFunctionExport(getterName, getterName);\r\n\r\n // make a setter\r\n if (!element.is(CommonFlags.READONLY)) {\r\n let setterName = prefix + SETTER_PREFIX + name;\r\n module.addFunction(\r\n setterName,\r\n this.ensureFunctionType([ type ], Type.void, usizeType),\r\n null,\r\n module.createStore(\r\n type.byteSize,\r\n module.createGetLocal(0, nativeSizeType),\r\n module.createGetLocal(1, nativeType),\r\n nativeType,\r\n offset\r\n )\r\n );\r\n module.addFunctionExport(setterName, setterName);\r\n }\r\n break;\r\n }\r\n\r\n // skip prototype and export instances\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n for (let instances of (element).instances.values()) {\r\n for (let instance of instances.values()) {\r\n let instanceName = name;\r\n if (instance.is(CommonFlags.GENERIC)) {\r\n let fullName = instance.internalName;\r\n instanceName += fullName.substring(fullName.lastIndexOf(\"<\"));\r\n }\r\n this.makeModuleExport(instanceName, instance, prefix);\r\n }\r\n }\r\n break;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n for (let instance of (element).instances.values()) {\r\n let instanceName = name;\r\n if (instance.is(CommonFlags.GENERIC)) {\r\n let fullName = instance.internalName;\r\n instanceName += fullName.substring(fullName.lastIndexOf(\"<\"));\r\n }\r\n let ctor = instance.constructorInstance;\r\n if (ctor) this.makeModuleExport(instanceName + INSTANCE_DELIMITER + ctor.simpleName, ctor, prefix);\r\n this.makeModuleExport(instanceName, instance, prefix);\r\n }\r\n break;\r\n }\r\n\r\n // all possible members already handled above\r\n case ElementKind.ENUM:\r\n case ElementKind.CLASS:\r\n case ElementKind.NAMESPACE: break;\r\n\r\n default: assert(false);\r\n }\r\n }\r\n\r\n // sources\r\n\r\n /** Compiles a source by looking it up by path first. */\r\n compileSourceByPath(normalizedPathWithoutExtension: string, reportNode: Node): void {\r\n var source = this.program.lookupSourceByPath(normalizedPathWithoutExtension);\r\n if (source) this.compileSource(source);\r\n else {\r\n this.error(\r\n DiagnosticCode.File_0_not_found,\r\n reportNode.range, normalizedPathWithoutExtension\r\n );\r\n }\r\n }\r\n\r\n /** Compiles a source. */\r\n compileSource(source: Source): void {\r\n if (source.is(CommonFlags.COMPILED)) return;\r\n source.set(CommonFlags.COMPILED);\r\n\r\n // compile top-level statements\r\n var noTreeShaking = this.options.noTreeShaking;\r\n var isEntry = source.isEntry;\r\n var startFunctionInstance = this.startFunctionInstance;\r\n var startFunctionBody = this.startFunctionBody;\r\n var statements = source.statements;\r\n for (let i = 0, k = statements.length; i < k; ++i) {\r\n let statement = statements[i];\r\n switch (statement.kind) {\r\n case NodeKind.CLASSDECLARATION: {\r\n if (\r\n (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&\r\n !(statement).isGeneric\r\n ) {\r\n this.compileClassDeclaration(statement, []);\r\n }\r\n break;\r\n }\r\n case NodeKind.INTERFACEDECLARATION: break;\r\n case NodeKind.ENUMDECLARATION: {\r\n if (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) {\r\n this.compileEnumDeclaration(statement);\r\n }\r\n break;\r\n }\r\n case NodeKind.FUNCTIONDECLARATION: {\r\n if (\r\n (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&\r\n !(statement).isGeneric\r\n ) {\r\n this.compileFunctionDeclaration(statement, []);\r\n }\r\n break;\r\n }\r\n case NodeKind.IMPORT: {\r\n this.compileSourceByPath(\r\n (statement).normalizedPath,\r\n (statement).path\r\n );\r\n break;\r\n }\r\n case NodeKind.NAMESPACEDECLARATION: {\r\n if (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) {\r\n this.compileNamespaceDeclaration(statement);\r\n }\r\n break;\r\n }\r\n case NodeKind.VARIABLE: { // global, always compiled as initializers might have side effects\r\n let variableInit = this.compileVariableStatement(statement);\r\n if (variableInit) startFunctionBody.push(variableInit);\r\n break;\r\n }\r\n case NodeKind.EXPORT: {\r\n if ((statement).normalizedPath != null) {\r\n this.compileSourceByPath(\r\n (statement).normalizedPath,\r\n (statement).path\r\n );\r\n }\r\n if (noTreeShaking || isEntry) {\r\n this.compileExportStatement(statement);\r\n }\r\n break;\r\n }\r\n default: { // otherwise a top-level statement that is part of the start function's body\r\n let previousFunction = this.currentFunction;\r\n this.currentFunction = startFunctionInstance;\r\n startFunctionBody.push(this.compileStatement(statement));\r\n this.currentFunction = previousFunction;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // globals\r\n\r\n compileGlobalDeclaration(declaration: VariableDeclaration): Global | null {\r\n // look up the initialized program element\r\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n assert(element.kind == ElementKind.GLOBAL);\r\n if (!this.compileGlobal(element)) return null; // reports\r\n return element;\r\n }\r\n\r\n compileGlobal(global: Global): bool {\r\n if (global.is(CommonFlags.COMPILED)) return true;\r\n global.set(CommonFlags.COMPILED);\r\n\r\n var module = this.module;\r\n var declaration = global.declaration;\r\n var initExpr: ExpressionRef = 0;\r\n\r\n if (!global.is(CommonFlags.RESOLVED)) {\r\n if (declaration) {\r\n\r\n // resolve now if annotated\r\n if (declaration.type) {\r\n let resolvedType = this.resolver.resolveType(declaration.type); // reports\r\n if (!resolvedType) return false;\r\n if (resolvedType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n declaration.type.range\r\n );\r\n return false;\r\n }\r\n global.type = resolvedType;\r\n global.set(CommonFlags.RESOLVED);\r\n\r\n // infer from initializer if not annotated\r\n } else if (declaration.initializer) { // infer type using void/NONE for literal inference\r\n initExpr = this.compileExpressionRetainType( // reports\r\n declaration.initializer,\r\n Type.void,\r\n WrapMode.WRAP\r\n );\r\n if (this.currentType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n declaration.initializer.range, this.currentType.toString(), \"\"\r\n );\r\n return false;\r\n }\r\n global.type = this.currentType;\r\n global.set(CommonFlags.RESOLVED);\r\n\r\n // must either be annotated or have an initializer\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n declaration.name.range.atEnd\r\n );\r\n return false;\r\n }\r\n } else {\r\n assert(false); // must have a declaration if resolved lazily\r\n }\r\n }\r\n\r\n // ambient builtins like 'HEAP_BASE' need to be resolved but are added explicitly\r\n if (global.is(CommonFlags.AMBIENT) && global.hasDecorator(DecoratorFlags.BUILTIN)) return true;\r\n\r\n var nativeType = global.type.toNativeType();\r\n var isDeclaredConstant = global.is(CommonFlags.CONST) || global.is(CommonFlags.STATIC | CommonFlags.READONLY);\r\n\r\n // handle imports\r\n if (global.is(CommonFlags.AMBIENT)) {\r\n\r\n // constant global\r\n if (isDeclaredConstant || this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n global.set(CommonFlags.MODULE_IMPORT);\r\n if (declaration) {\r\n mangleImportName(global, declaration);\r\n } else {\r\n mangleImportName_moduleName = \"env\";\r\n mangleImportName_elementName = global.simpleName;\r\n }\r\n module.addGlobalImport(\r\n global.internalName,\r\n mangleImportName_moduleName,\r\n mangleImportName_elementName,\r\n nativeType\r\n );\r\n global.set(CommonFlags.COMPILED);\r\n return true;\r\n\r\n // importing mutable globals is not supported in the MVP\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n assert(declaration).range\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n // the MVP does not yet support initializer expressions other than constant values (and constant\r\n // get_globals), hence such initializations must be performed in the start function for now.\r\n var initializeInStart = false;\r\n\r\n // evaluate initializer if present\r\n if (declaration !== null && declaration.initializer !== null) {\r\n if (!initExpr) {\r\n initExpr = this.compileExpression(\r\n declaration.initializer,\r\n global.type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP\r\n );\r\n }\r\n\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n if (isDeclaredConstant) {\r\n initExpr = module.precomputeExpression(initExpr);\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n declaration.range\r\n );\r\n initializeInStart = true;\r\n }\r\n } else {\r\n initializeInStart = true;\r\n }\r\n }\r\n\r\n // explicitly inline if annotated\r\n if (global.hasDecorator(DecoratorFlags.INLINE)) {\r\n if (!initializeInStart) { // reported above\r\n assert(getExpressionId(initExpr) == ExpressionId.Const);\r\n let exprType = getExpressionType(initExpr);\r\n switch (exprType) {\r\n case NativeType.I32: {\r\n global.constantValueKind = ConstantValueKind.INTEGER;\r\n global.constantIntegerValue = i64_new(getConstValueI32(initExpr), 0);\r\n break;\r\n }\r\n case NativeType.I64: {\r\n global.constantValueKind = ConstantValueKind.INTEGER;\r\n global.constantIntegerValue = i64_new(\r\n getConstValueI64Low(initExpr),\r\n getConstValueI64High(initExpr)\r\n );\r\n break;\r\n }\r\n case NativeType.F32: {\r\n global.constantValueKind = ConstantValueKind.FLOAT;\r\n global.constantFloatValue = getConstValueF32(initExpr);\r\n break;\r\n }\r\n case NativeType.F64: {\r\n global.constantValueKind = ConstantValueKind.FLOAT;\r\n global.constantFloatValue = getConstValueF64(initExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return false;\r\n }\r\n }\r\n global.set(CommonFlags.INLINED); // inline the value from now on\r\n }\r\n }\r\n\r\n // initialize to zero if there's no initializer\r\n } else {\r\n initExpr = global.type.toNativeZero(module);\r\n }\r\n\r\n var internalName = global.internalName;\r\n\r\n if (initializeInStart) { // initialize to mutable zero and set the actual value in start\r\n module.addGlobal(internalName, nativeType, true, global.type.toNativeZero(module));\r\n this.startFunctionBody.push(module.createSetGlobal(internalName, initExpr));\r\n\r\n } else { // compile normally\r\n module.addGlobal(internalName, nativeType, !isDeclaredConstant, initExpr);\r\n }\r\n return true;\r\n }\r\n\r\n // enums\r\n\r\n compileEnumDeclaration(declaration: EnumDeclaration): Enum | null {\r\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n assert(element.kind == ElementKind.ENUM);\r\n if (!this.compileEnum(element)) return null;\r\n return element;\r\n }\r\n\r\n compileEnum(element: Enum): bool {\r\n if (element.is(CommonFlags.COMPILED)) return true;\r\n element.set(CommonFlags.COMPILED);\r\n\r\n var module = this.module;\r\n this.currentEnum = element;\r\n var previousValue: EnumValue | null = null;\r\n var previousValueIsMut = false;\r\n\r\n if (element.members) {\r\n for (let member of element.members.values()) {\r\n if (member.kind != ElementKind.ENUMVALUE) continue; // happens if an enum is also a namespace\r\n let initInStart = false;\r\n let val = member;\r\n let valueDeclaration = val.declaration;\r\n val.set(CommonFlags.COMPILED);\r\n let initExpr: ExpressionRef;\r\n if (valueDeclaration.value) {\r\n initExpr = this.compileExpression(\r\n valueDeclaration.value,\r\n Type.i32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n if (element.is(CommonFlags.CONST)) {\r\n initExpr = module.precomputeExpression(initExpr);\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n this.error(\r\n DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,\r\n valueDeclaration.value.range\r\n );\r\n initInStart = true;\r\n }\r\n } else {\r\n initInStart = true;\r\n }\r\n }\r\n } else if (previousValue == null) {\r\n initExpr = module.createI32(0);\r\n } else {\r\n if (previousValueIsMut) {\r\n this.error(\r\n DiagnosticCode.Enum_member_must_have_initializer,\r\n valueDeclaration.range\r\n );\r\n }\r\n initExpr = module.createBinary(BinaryOp.AddI32,\r\n module.createGetGlobal(previousValue.internalName, NativeType.I32),\r\n module.createI32(1)\r\n );\r\n initExpr = module.precomputeExpression(initExpr);\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n if (element.is(CommonFlags.CONST)) {\r\n this.error(\r\n DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,\r\n valueDeclaration.range\r\n );\r\n }\r\n initInStart = true;\r\n }\r\n }\r\n if (initInStart) {\r\n module.addGlobal(val.internalName, NativeType.I32, true, module.createI32(0));\r\n this.startFunctionBody.push(module.createSetGlobal(val.internalName, initExpr));\r\n previousValueIsMut = true;\r\n } else {\r\n module.addGlobal(val.internalName, NativeType.I32, !element.is(CommonFlags.CONST), initExpr);\r\n previousValueIsMut = false;\r\n }\r\n previousValue = val;\r\n }\r\n }\r\n this.currentEnum = null;\r\n return true;\r\n }\r\n\r\n // functions\r\n\r\n /** Compiles a top-level function given its declaration. */\r\n compileFunctionDeclaration(\r\n declaration: FunctionDeclaration,\r\n typeArguments: TypeNode[]\r\n ): Function | null {\r\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n return this.compileFunctionUsingTypeArguments( // reports\r\n element,\r\n typeArguments,\r\n makeMap(),\r\n null,\r\n (element).declaration.name\r\n );\r\n }\r\n\r\n /** Resolves the specified type arguments prior to compiling the resulting function instance. */\r\n compileFunctionUsingTypeArguments(\r\n prototype: FunctionPrototype,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map,\r\n outerScope: Flow | null,\r\n reportNode: Node\r\n ): Function | null {\r\n var instance = this.resolver.resolveFunctionInclTypeArguments(\r\n prototype,\r\n typeArguments,\r\n contextualTypeArguments,\r\n reportNode\r\n );\r\n if (!instance) return null;\r\n instance.outerScope = outerScope;\r\n if (!this.compileFunction(instance)) return null; // reports\r\n return instance;\r\n }\r\n\r\n /** Either reuses or creates the function type matching the specified signature. */\r\n ensureFunctionType(\r\n parameterTypes: Type[] | null,\r\n returnType: Type,\r\n thisType: Type | null = null\r\n ): FunctionTypeRef {\r\n var numParameters = parameterTypes ? parameterTypes.length : 0;\r\n var paramTypes: NativeType[];\r\n var index = 0;\r\n if (thisType) {\r\n paramTypes = new Array(1 + numParameters);\r\n paramTypes[0] = thisType.toNativeType();\r\n index = 1;\r\n } else {\r\n paramTypes = new Array(numParameters);\r\n }\r\n if (parameterTypes) {\r\n for (let i = 0; i < numParameters; ++i, ++index) {\r\n paramTypes[index] = parameterTypes[i].toNativeType();\r\n }\r\n }\r\n var resultType = returnType.toNativeType();\r\n var module = this.module;\r\n var typeRef = module.getFunctionTypeBySignature(resultType, paramTypes);\r\n if (!typeRef) {\r\n let name = Signature.makeSignatureString(parameterTypes, returnType, thisType);\r\n typeRef = module.addFunctionType(name, resultType, paramTypes);\r\n }\r\n return typeRef;\r\n }\r\n\r\n /** Compiles a readily resolved function instance. */\r\n compileFunction(instance: Function): bool {\r\n if (instance.is(CommonFlags.COMPILED)) return true;\r\n assert(!(instance.is(CommonFlags.AMBIENT) && instance.hasDecorator(DecoratorFlags.BUILTIN)));\r\n instance.set(CommonFlags.COMPILED);\r\n\r\n // check that modifiers are matching\r\n var declaration = instance.prototype.declaration;\r\n var body = declaration.body;\r\n if (body) {\r\n if (instance.is(CommonFlags.AMBIENT)) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n declaration.name.range\r\n );\r\n }\r\n } else {\r\n if (!instance.is(CommonFlags.AMBIENT)) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n declaration.name.range\r\n );\r\n }\r\n }\r\n\r\n var ref: FunctionRef;\r\n var signature = instance.signature;\r\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\r\n var module = this.module;\r\n if (body) {\r\n let isConstructor = instance.is(CommonFlags.CONSTRUCTOR);\r\n let returnType = instance.signature.returnType;\r\n\r\n // compile body\r\n let previousFunction = this.currentFunction;\r\n this.currentFunction = instance;\r\n let flow = instance.flow;\r\n let stmt: ExpressionRef;\r\n if (body.kind == NodeKind.EXPRESSION) { // () => expression\r\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\r\n assert(instance.is(CommonFlags.ARROW));\r\n stmt = this.compileExpression(\r\n (body).expression,\r\n returnType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n flow.set(FlowFlags.RETURNS);\r\n if (!flow.canOverflow(stmt, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\r\n flow.finalize();\r\n } else {\r\n assert(body.kind == NodeKind.BLOCK);\r\n let stmts = this.compileStatements((body).statements);\r\n if (instance.is(CommonFlags.MAIN)) {\r\n module.addGlobal(\"~started\", NativeType.I32, true, module.createI32(0));\r\n stmts.unshift(\r\n module.createIf(\r\n module.createUnary(\r\n UnaryOp.EqzI32,\r\n module.createGetGlobal(\"~started\", NativeType.I32)\r\n ),\r\n module.createBlock(null, [\r\n module.createCall(\"start\", null, NativeType.None),\r\n module.createSetGlobal(\"~started\", module.createI32(1))\r\n ])\r\n )\r\n );\r\n }\r\n flow.finalize();\r\n if (isConstructor) {\r\n let nativeSizeType = this.options.nativeSizeType;\r\n assert(instance.is(CommonFlags.INSTANCE));\r\n\r\n // implicitly return `this` if the constructor doesn't always return on its own\r\n if (!flow.is(FlowFlags.RETURNS)) {\r\n\r\n // if all branches are guaranteed to allocate, skip the final conditional allocation\r\n if (flow.is(FlowFlags.ALLOCATES)) {\r\n stmts.push(module.createGetLocal(0, nativeSizeType));\r\n\r\n // if not all branches are guaranteed to allocate, also append a conditional allocation\r\n } else {\r\n let parent = assert(instance.parent);\r\n assert(parent.kind == ElementKind.CLASS);\r\n stmts.push(module.createTeeLocal(0,\r\n this.makeConditionalAllocate(parent, declaration.name)\r\n ));\r\n }\r\n }\r\n\r\n // make sure all branches return\r\n } else if (returnType != Type.void && !flow.is(FlowFlags.RETURNS)) {\r\n this.error(\r\n DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\r\n declaration.signature.returnType.range\r\n );\r\n }\r\n stmt = !stmts.length\r\n ? module.createNop()\r\n : stmts.length == 1\r\n ? stmts[0]\r\n : module.createBlock(null, stmts, returnType.toNativeType());\r\n }\r\n this.currentFunction = previousFunction;\r\n\r\n // create the function\r\n ref = module.addFunction(\r\n instance.internalName,\r\n typeRef,\r\n typesToNativeTypes(instance.additionalLocals),\r\n stmt\r\n );\r\n\r\n // concrete functions cannot have an annotated external name\r\n if (instance.hasDecorator(DecoratorFlags.EXTERNAL)) {\r\n let decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n decorator.range\r\n );\r\n }\r\n\r\n } else {\r\n instance.set(CommonFlags.MODULE_IMPORT);\r\n mangleImportName(instance, declaration); // TODO: check for duplicates\r\n\r\n // create the function import\r\n ref = module.addFunctionImport(\r\n instance.internalName,\r\n mangleImportName_moduleName,\r\n mangleImportName_elementName,\r\n typeRef\r\n );\r\n }\r\n\r\n instance.finalize(module, ref);\r\n return true;\r\n }\r\n\r\n // namespaces\r\n\r\n compileNamespaceDeclaration(declaration: NamespaceDeclaration): void {\r\n var members = declaration.members;\r\n var noTreeShaking = this.options.noTreeShaking;\r\n for (let i = 0, k = members.length; i < k; ++i) {\r\n let member = members[i];\r\n switch (member.kind) {\r\n case NodeKind.CLASSDECLARATION: {\r\n if (\r\n (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\r\n !(member).isGeneric\r\n ) {\r\n this.compileClassDeclaration(member, []);\r\n }\r\n break;\r\n }\r\n case NodeKind.INTERFACEDECLARATION: {\r\n if (\r\n (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\r\n !(member).isGeneric\r\n ) {\r\n this.compileInterfaceDeclaration(member, []);\r\n }\r\n break;\r\n }\r\n case NodeKind.ENUMDECLARATION: {\r\n if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\r\n this.compileEnumDeclaration(member);\r\n }\r\n break;\r\n }\r\n case NodeKind.FUNCTIONDECLARATION: {\r\n if (\r\n (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\r\n !(member).isGeneric\r\n ) {\r\n this.compileFunctionDeclaration(member, []);\r\n }\r\n break;\r\n }\r\n case NodeKind.NAMESPACEDECLARATION: {\r\n if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\r\n this.compileNamespaceDeclaration(member);\r\n }\r\n break;\r\n }\r\n case NodeKind.VARIABLE: {\r\n if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\r\n let variableInit = this.compileVariableStatement(member, true);\r\n if (variableInit) this.startFunctionBody.push(variableInit);\r\n }\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n }\r\n\r\n compileNamespace(ns: Namespace): void {\r\n if (!ns.members) return;\r\n\r\n var noTreeShaking = this.options.noTreeShaking;\r\n for (let element of ns.members.values()) {\r\n switch (element.kind) {\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n if (\r\n (\r\n noTreeShaking ||\r\n (element).is(CommonFlags.EXPORT)\r\n ) && !(element).is(CommonFlags.GENERIC)\r\n ) {\r\n this.compileClassUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap()\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.ENUM: {\r\n this.compileEnum(element);\r\n break;\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (\r\n (\r\n noTreeShaking || (element).is(CommonFlags.EXPORT)\r\n ) && !(element).is(CommonFlags.GENERIC)\r\n ) {\r\n if (element.hasDecorator(DecoratorFlags.BUILTIN)) break;\r\n this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap(),\r\n null,\r\n (element).declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.GLOBAL: {\r\n this.compileGlobal(element);\r\n break;\r\n }\r\n case ElementKind.NAMESPACE: {\r\n this.compileNamespace(element);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // exports\r\n\r\n compileExportStatement(statement: ExportStatement): void {\r\n var fileLevelExports = this.program.fileLevelExports;\r\n var members = statement.members;\r\n if (!members) return; // filespace\r\n for (let i = 0, k = members.length; i < k; ++i) {\r\n let member = members[i];\r\n let element = fileLevelExports.get(\r\n statement.range.source.internalPath + PATH_DELIMITER + member.externalName.text\r\n );\r\n if (!element) continue; // reported in Program#initialize\r\n switch (element.kind) {\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n if (!(element).is(CommonFlags.GENERIC)) {\r\n this.compileClassUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap()\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.ENUM: {\r\n this.compileEnum(element);\r\n break;\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (\r\n !(element).is(CommonFlags.GENERIC) &&\r\n statement.range.source.isEntry\r\n ) {\r\n this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap(),\r\n null,\r\n (element).declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.GLOBAL: {\r\n this.compileGlobal(element);\r\n break;\r\n }\r\n case ElementKind.NAMESPACE: {\r\n this.compileNamespace(element);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // classes\r\n\r\n compileClassDeclaration(\r\n declaration: ClassDeclaration,\r\n typeArguments: TypeNode[]\r\n ): void {\r\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n this.compileClassUsingTypeArguments(\r\n element,\r\n typeArguments,\r\n makeMap(),\r\n declaration\r\n );\r\n }\r\n\r\n compileClassUsingTypeArguments(\r\n prototype: ClassPrototype,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map,\r\n alternativeReportNode: Node | null = null\r\n ): void {\r\n var instance = this.resolver.resolveClassInclTypeArguments(\r\n prototype,\r\n typeArguments,\r\n contextualTypeArguments,\r\n alternativeReportNode || prototype.declaration\r\n );\r\n if (!instance) return;\r\n this.compileClass(instance);\r\n }\r\n\r\n compileClass(instance: Class): bool {\r\n if (instance.is(CommonFlags.COMPILED)) return true;\r\n instance.set(CommonFlags.COMPILED);\r\n\r\n var staticMembers = instance.prototype.members;\r\n if (staticMembers) {\r\n for (let element of staticMembers.values()) {\r\n switch (element.kind) {\r\n case ElementKind.GLOBAL: {\r\n this.compileGlobal(element);\r\n break;\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (\r\n !(element).is(CommonFlags.GENERIC)\r\n ) {\r\n this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap(),\r\n null,\r\n (element).declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let getter = (element).getterPrototype;\r\n if (getter) {\r\n this.compileFunctionUsingTypeArguments(\r\n getter,\r\n [],\r\n makeMap(),\r\n null,\r\n getter.declaration.name\r\n );\r\n }\r\n let setter = (element).setterPrototype;\r\n if (setter) {\r\n this.compileFunctionUsingTypeArguments(\r\n setter,\r\n [],\r\n makeMap(),\r\n null,\r\n setter.declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n var ctorInstance = instance.constructorInstance;\r\n if (ctorInstance) this.compileFunction(ctorInstance);\r\n var instanceMembers = instance.members;\r\n if (instanceMembers) {\r\n for (let element of instanceMembers.values()) {\r\n switch (element.kind) {\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (\r\n !(element).is(CommonFlags.GENERIC)\r\n ) {\r\n this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap(instance.contextualTypeArguments),\r\n null,\r\n (element).declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.FIELD: {\r\n element.set(CommonFlags.COMPILED);\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let getter = (element).getterPrototype;\r\n if (getter) {\r\n this.compileFunctionUsingTypeArguments(\r\n getter,\r\n [],\r\n makeMap(instance.contextualTypeArguments),\r\n null,\r\n getter.declaration.name\r\n );\r\n }\r\n let setter = (element).setterPrototype;\r\n if (setter) {\r\n this.compileFunctionUsingTypeArguments(\r\n setter,\r\n [],\r\n makeMap(instance.contextualTypeArguments),\r\n null,\r\n setter.declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n compileInterfaceDeclaration(\r\n declaration: InterfaceDeclaration,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null = null,\r\n alternativeReportNode: Node | null = null\r\n ): void {\r\n // TODO\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n declaration.range\r\n );\r\n }\r\n\r\n // memory\r\n\r\n /** Adds a static memory segment with the specified data. */\r\n addMemorySegment(buffer: Uint8Array, alignment: i32 = 8): MemorySegment {\r\n var memoryOffset = i64_align(this.memoryOffset, alignment);\r\n var segment = MemorySegment.create(buffer, memoryOffset);\r\n this.memorySegments.push(segment);\r\n this.memoryOffset = i64_add(memoryOffset, i64_new(buffer.length, 0));\r\n return segment;\r\n }\r\n\r\n // function table\r\n\r\n /** Ensures that a table entry exists for the specified function and returns its index. */\r\n ensureFunctionTableEntry(func: Function): i32 {\r\n assert(func.is(CommonFlags.COMPILED));\r\n if (func.functionTableIndex >= 0) {\r\n return func.functionTableIndex;\r\n }\r\n var functionTable = this.functionTable;\r\n var index = functionTable.length;\r\n if (!func.is(CommonFlags.TRAMPOLINE) && func.signature.requiredParameters < func.signature.parameterTypes.length) {\r\n // insert the trampoline if the function has optional parameters\r\n func = this.ensureTrampoline(func);\r\n }\r\n functionTable.push(func.internalName);\r\n func.functionTableIndex = index;\r\n return index;\r\n }\r\n\r\n // statements\r\n\r\n compileStatement(statement: Statement): ExpressionRef {\r\n var module = this.module;\r\n var stmt: ExpressionRef;\r\n switch (statement.kind) {\r\n case NodeKind.BLOCK: {\r\n stmt = this.compileBlockStatement(statement);\r\n break;\r\n }\r\n case NodeKind.BREAK: {\r\n stmt = this.compileBreakStatement(statement);\r\n break;\r\n }\r\n case NodeKind.CONTINUE: {\r\n stmt = this.compileContinueStatement(statement);\r\n break;\r\n }\r\n case NodeKind.DO: {\r\n stmt = this.compileDoStatement(statement);\r\n break;\r\n }\r\n case NodeKind.EMPTY: {\r\n stmt = this.compileEmptyStatement(statement);\r\n break;\r\n }\r\n case NodeKind.EXPRESSION: {\r\n stmt = this.compileExpressionStatement(statement);\r\n break;\r\n }\r\n case NodeKind.FOR: {\r\n stmt = this.compileForStatement(statement);\r\n break;\r\n }\r\n case NodeKind.IF: {\r\n stmt = this.compileIfStatement(statement);\r\n break;\r\n }\r\n case NodeKind.RETURN: {\r\n stmt = this.compileReturnStatement(statement);\r\n break;\r\n }\r\n case NodeKind.SWITCH: {\r\n stmt = this.compileSwitchStatement(statement);\r\n break;\r\n }\r\n case NodeKind.THROW: {\r\n stmt = this.compileThrowStatement(statement);\r\n break;\r\n }\r\n case NodeKind.TRY: {\r\n stmt = this.compileTryStatement(statement);\r\n break;\r\n }\r\n case NodeKind.VARIABLE: {\r\n stmt = this.compileVariableStatement(statement);\r\n if (!stmt) stmt = module.createNop();\r\n break;\r\n }\r\n case NodeKind.VOID: {\r\n stmt = this.compileVoidStatement(statement);\r\n break;\r\n }\r\n case NodeKind.WHILE: {\r\n stmt = this.compileWhileStatement(statement);\r\n break;\r\n }\r\n case NodeKind.TYPEDECLARATION: {\r\n // type declarations must be top-level because function bodies are evaluated when\r\n // reachaable only.\r\n if (this.currentFunction == this.startFunctionInstance) {\r\n return module.createNop();\r\n }\r\n // otherwise fall-through\r\n }\r\n default: {\r\n assert(false);\r\n stmt = module.createUnreachable();\r\n }\r\n }\r\n if (this.options.sourceMap) this.addDebugLocation(stmt, statement.range);\r\n return stmt;\r\n }\r\n\r\n compileStatements(statements: Statement[]): ExpressionRef[] {\r\n var numStatements = statements.length;\r\n var stmts = new Array(numStatements);\r\n stmts.length = 0;\r\n var flow = this.currentFunction.flow;\r\n for (let i = 0; i < numStatements; ++i) {\r\n let stmt = this.compileStatement(statements[i]);\r\n switch (getExpressionId(stmt)) {\r\n case ExpressionId.Block: {\r\n if (!getBlockName(stmt)) {\r\n for (let j = 0, k = getBlockChildCount(stmt); j < k; ++j) stmts.push(getBlockChild(stmt, j));\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: stmts.push(stmt);\r\n case ExpressionId.Nop:\r\n }\r\n if (flow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n if (needsExplicitUnreachable(stmt)) stmts.push(this.module.createUnreachable());\r\n break;\r\n }\r\n }\r\n return stmts;\r\n }\r\n\r\n compileBlockStatement(statement: BlockStatement): ExpressionRef {\r\n var statements = statement.statements;\r\n var parentFlow = this.currentFunction.flow;\r\n var flow = parentFlow.fork();\r\n this.currentFunction.flow = flow;\r\n\r\n var stmts = this.compileStatements(statements);\r\n var stmt = stmts.length == 0\r\n ? this.module.createNop()\r\n : stmts.length == 1\r\n ? stmts[0]\r\n : this.module.createBlock(null, stmts,getExpressionType(stmts[stmts.length - 1]));\r\n\r\n this.currentFunction.flow = flow.free();\r\n parentFlow.inherit(flow);\r\n return stmt;\r\n }\r\n\r\n compileBreakStatement(statement: BreakStatement): ExpressionRef {\r\n var module = this.module;\r\n if (statement.label) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.label.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n var flow = this.currentFunction.flow;\r\n var breakLabel = flow.breakLabel;\r\n if (breakLabel == null) {\r\n this.error(\r\n DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement,\r\n statement.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n flow.set(FlowFlags.BREAKS);\r\n return module.createBreak(breakLabel);\r\n }\r\n\r\n compileContinueStatement(statement: ContinueStatement): ExpressionRef {\r\n var module = this.module;\r\n var label = statement.label;\r\n if (label) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n label.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n // Check if 'continue' is allowed here\r\n var flow = this.currentFunction.flow;\r\n var continueLabel = flow.continueLabel;\r\n if (continueLabel == null) {\r\n this.error(\r\n DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement,\r\n statement.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n flow.set(FlowFlags.CONTINUES);\r\n return module.createBreak(continueLabel);\r\n }\r\n\r\n compileDoStatement(statement: DoStatement): ExpressionRef {\r\n var currentFunction = this.currentFunction;\r\n var module = this.module;\r\n\r\n var label = currentFunction.enterBreakContext();\r\n var parentFlow = currentFunction.flow;\r\n var flow = parentFlow.fork();\r\n currentFunction.flow = flow;\r\n var breakLabel = \"break|\" + label;\r\n flow.breakLabel = breakLabel;\r\n var continueLabel = \"continue|\" + label;\r\n flow.continueLabel = continueLabel;\r\n\r\n var body = this.compileStatement(statement.statement);\r\n var condExpr = this.makeIsTrueish(\r\n this.compileExpression(statement.condition, Type.i32, ConversionKind.NONE, WrapMode.NONE),\r\n this.currentType\r\n );\r\n // TODO: check if condition is always false and if so, omit it (just a block)\r\n\r\n // Switch back to the parent flow\r\n currentFunction.flow = flow.free();\r\n currentFunction.leaveBreakContext();\r\n var terminated = flow.isAny(FlowFlags.ANY_TERMINATING);\r\n flow.unset(\r\n FlowFlags.BREAKS |\r\n FlowFlags.CONDITIONALLY_BREAKS |\r\n FlowFlags.CONTINUES |\r\n FlowFlags.CONDITIONALLY_CONTINUES\r\n );\r\n parentFlow.inherit(flow);\r\n\r\n var block: ExpressionRef[] = [\r\n module.createLoop(continueLabel,\r\n terminated\r\n ? body // skip trailing continue if unnecessary\r\n : module.createBlock(null, [\r\n body,\r\n module.createBreak(continueLabel, condExpr)\r\n ], NativeType.None)\r\n )\r\n ];\r\n if (terminated) block.push(module.createUnreachable());\r\n return module.createBlock(breakLabel, block);\r\n }\r\n\r\n compileEmptyStatement(statement: EmptyStatement): ExpressionRef {\r\n return this.module.createNop();\r\n }\r\n\r\n compileExpressionStatement(statement: ExpressionStatement): ExpressionRef {\r\n var expr = this.compileExpression(statement.expression, Type.void, ConversionKind.NONE, WrapMode.NONE);\r\n if (this.currentType != Type.void) {\r\n expr = this.module.createDrop(expr);\r\n this.currentType = Type.void;\r\n }\r\n return expr;\r\n }\r\n\r\n compileForStatement(statement: ForStatement): ExpressionRef {\r\n // A for statement initiates a new branch with its own scoped variables\r\n // possibly declared in its initializer, and break context.\r\n var currentFunction = this.currentFunction;\r\n var label = currentFunction.enterBreakContext();\r\n var parentFlow = currentFunction.flow;\r\n var flow = parentFlow.fork();\r\n currentFunction.flow = flow;\r\n var breakLabel = flow.breakLabel = \"break|\" + label;\r\n flow.breakLabel = breakLabel;\r\n var continueLabel = \"continue|\" + label;\r\n flow.continueLabel = continueLabel;\r\n var repeatLabel = \"repeat|\" + label;\r\n\r\n // Compile in correct order\r\n var module = this.module;\r\n var initExpr = statement.initializer\r\n ? this.compileStatement(statement.initializer)\r\n : 0;\r\n var condExpr: ExpressionRef = 0;\r\n var alwaysTrue = false;\r\n if (statement.condition) {\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n // check if the condition is always true\r\n let condPre = module.precomputeExpression(condExpr);\r\n if (getExpressionId(condPre) == ExpressionId.Const) {\r\n assert(getExpressionType(condPre) == NativeType.I32);\r\n if (getConstValueI32(condPre) != 0) alwaysTrue = true;\r\n // TODO: could skip compilation if the condition is always false here, but beware that the\r\n // initializer could still declare new 'var's that are used later on.\r\n }\r\n // recompile to original\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n } else {\r\n // omitted condition is always true\r\n condExpr = module.createI32(1);\r\n alwaysTrue = true;\r\n }\r\n var incrExpr = statement.incrementor\r\n ? this.compileExpression(statement.incrementor, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n : 0;\r\n var bodyStatement = statement.statement;\r\n var bodyExpr = bodyStatement.kind == NodeKind.BLOCK && (bodyStatement).statements.length == 1\r\n ? this.compileStatement((bodyStatement).statements[0])\r\n : this.compileStatement(bodyStatement);\r\n\r\n // Switch back to the parent flow\r\n currentFunction.flow = flow.free();\r\n currentFunction.leaveBreakContext();\r\n var usesContinue = flow.isAny(FlowFlags.CONTINUES | FlowFlags.CONDITIONALLY_CONTINUES);\r\n flow.unset(\r\n FlowFlags.BREAKS |\r\n FlowFlags.CONDITIONALLY_BREAKS |\r\n FlowFlags.CONTINUES |\r\n FlowFlags.CONDITIONALLY_CONTINUES\r\n );\r\n if (alwaysTrue) parentFlow.inherit(flow);\r\n else parentFlow.inheritConditional(flow);\r\n\r\n var breakBlock = new Array(); // outer 'break' block\r\n if (initExpr) breakBlock.push(initExpr);\r\n\r\n var repeatBlock = new Array(); // block repeating the loop\r\n if (usesContinue) {\r\n repeatBlock.push(\r\n module.createBlock(continueLabel, [ // inner 'continue' block\r\n module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr)),\r\n bodyExpr\r\n ], NativeType.None)\r\n );\r\n } else { // can omit the 'continue' block\r\n repeatBlock.push(\r\n module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr))\r\n );\r\n repeatBlock.push(bodyExpr);\r\n }\r\n if (incrExpr) repeatBlock.push(incrExpr);\r\n repeatBlock.push(\r\n module.createBreak(repeatLabel)\r\n );\r\n\r\n breakBlock.push(\r\n module.createLoop(repeatLabel, module.createBlock(null, repeatBlock, NativeType.None))\r\n );\r\n\r\n return module.createBlock(breakLabel, breakBlock);\r\n }\r\n\r\n compileIfStatement(statement: IfStatement): ExpressionRef {\r\n var module = this.module;\r\n var currentFunction = this.currentFunction;\r\n var ifTrue = statement.ifTrue;\r\n var ifFalse = statement.ifFalse;\r\n\r\n // The condition doesn't initiate a branch yet\r\n var condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n\r\n if (\r\n !this.options.noTreeShaking ||\r\n this.currentFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\r\n ) {\r\n // Try to eliminate unnecesssary branches if the condition is constant\r\n let condExprPrecomp = module.precomputeExpression(condExpr);\r\n if (\r\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n getExpressionType(condExprPrecomp) == NativeType.I32\r\n ) {\r\n return getConstValueI32(condExprPrecomp)\r\n ? this.compileStatement(ifTrue)\r\n : ifFalse\r\n ? this.compileStatement(ifFalse)\r\n : module.createNop();\r\n\r\n // Otherwise recompile to the original and let the optimizer decide\r\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n }\r\n }\r\n\r\n // Each arm initiates a branch\r\n var parentFlow = currentFunction.flow;\r\n var ifTrueFlow = parentFlow.fork();\r\n currentFunction.flow = ifTrueFlow;\r\n var ifTrueExpr = this.compileStatement(ifTrue);\r\n currentFunction.flow = ifTrueFlow.free();\r\n\r\n var ifFalseExpr: ExpressionRef = 0;\r\n if (ifFalse) {\r\n let ifFalseFlow = parentFlow.fork();\r\n currentFunction.flow = ifFalseFlow;\r\n ifFalseExpr = this.compileStatement(ifFalse);\r\n currentFunction.flow = ifFalseFlow.free();\r\n parentFlow.inheritMutual(ifTrueFlow, ifFalseFlow);\r\n } else {\r\n parentFlow.inheritConditional(ifTrueFlow);\r\n }\r\n return module.createIf(condExpr, ifTrueExpr, ifFalseExpr);\r\n }\r\n\r\n compileReturnStatement(statement: ReturnStatement): ExpressionRef {\r\n var module = this.module;\r\n var currentFunction = this.currentFunction;\r\n var expr: ExpressionRef = 0;\r\n var flow = currentFunction.flow;\r\n\r\n // Remember that this flow returns\r\n flow.set(FlowFlags.RETURNS);\r\n\r\n if (statement.value) {\r\n let returnType = flow.returnType;\r\n if (returnType == Type.void) {\r\n this.compileExpressionRetainType(statement.value, returnType, WrapMode.NONE);\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n statement.value.range, this.currentType.toString(), returnType.toString()\r\n );\r\n this.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n expr = this.compileExpression(\r\n statement.value,\r\n returnType,\r\n ConversionKind.IMPLICIT,\r\n currentFunction.is(CommonFlags.MODULE_EXPORT)\r\n ? WrapMode.WRAP\r\n : WrapMode.NONE\r\n );\r\n\r\n // Remember whether returning a properly wrapped value\r\n if (!flow.canOverflow(expr, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\r\n }\r\n\r\n // If the last statement anyway, make it the block's return value\r\n if (isLastStatement(statement)) return expr ? expr : module.createNop();\r\n\r\n // When inlining, break to the end of the inlined function's block (no need to wrap)\r\n return flow.is(FlowFlags.INLINE_CONTEXT)\r\n ? module.createBreak(assert(flow.returnLabel), 0, expr)\r\n : module.createReturn(expr);\r\n }\r\n\r\n compileSwitchStatement(statement: SwitchStatement): ExpressionRef {\r\n var module = this.module;\r\n var currentFunction = this.currentFunction;\r\n\r\n var cases = statement.cases;\r\n var numCases = cases.length;\r\n if (!numCases) {\r\n return this.compileExpression(statement.condition, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n }\r\n\r\n // Everything within a switch uses the same break context\r\n var context = currentFunction.enterBreakContext();\r\n var parentFlow = currentFunction.flow;\r\n\r\n // introduce a local for evaluating the condition (exactly once)\r\n var tempLocal = currentFunction.getTempLocal(Type.u32, false);\r\n var tempLocalIndex = tempLocal.index;\r\n\r\n // Prepend initializer to inner block. Does not initiate a new branch, yet.\r\n var breaks = new Array(1 + numCases);\r\n breaks[0] = module.createSetLocal( // initializer\r\n tempLocalIndex,\r\n this.compileExpression(statement.condition, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n );\r\n\r\n // make one br_if per (possibly dynamic) labeled case (binaryen optimizes to br_table where possible)\r\n var breakIndex = 1;\r\n var defaultIndex = -1;\r\n for (let i = 0; i < numCases; ++i) {\r\n let case_ = cases[i];\r\n let label = case_.label;\r\n if (label) {\r\n breaks[breakIndex++] = module.createBreak(\"case\" + i.toString(10) + \"|\" + context,\r\n module.createBinary(BinaryOp.EqI32,\r\n module.createGetLocal(tempLocalIndex, NativeType.I32),\r\n this.compileExpression(label, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n )\r\n );\r\n } else {\r\n defaultIndex = i;\r\n }\r\n }\r\n\r\n currentFunction.freeTempLocal(tempLocal);\r\n\r\n // otherwise br to default respectively out of the switch if there is no default case\r\n breaks[breakIndex] = module.createBreak((defaultIndex >= 0\r\n ? \"case\" + defaultIndex.toString(10)\r\n : \"break\"\r\n ) + \"|\" + context);\r\n\r\n // nest blocks in order\r\n var currentBlock = module.createBlock(\"case0|\" + context, breaks, NativeType.None);\r\n var alwaysReturns = true;\r\n var alwaysReturnsWrapped = true;\r\n var alwaysThrows = true;\r\n var alwaysAllocates = true;\r\n for (let i = 0; i < numCases; ++i) {\r\n let case_ = cases[i];\r\n let statements = case_.statements;\r\n let numStatements = statements.length;\r\n\r\n // Each switch case initiates a new branch\r\n let flow = parentFlow.fork();\r\n currentFunction.flow = flow;\r\n let breakLabel = \"break|\" + context;\r\n flow.breakLabel = breakLabel;\r\n\r\n let isLast = i == numCases - 1;\r\n let nextLabel = isLast ? breakLabel : \"case\" + (i + 1).toString(10) + \"|\" + context;\r\n let stmts = new Array(1 + numStatements);\r\n stmts[0] = currentBlock;\r\n let count = 1;\r\n let terminated = false;\r\n for (let j = 0; j < numStatements; ++j) {\r\n let stmt = this.compileStatement(statements[j]);\r\n if (getExpressionId(stmt) != ExpressionId.Nop) {\r\n stmts[count++] = stmt;\r\n if (flow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n terminated = true;\r\n break;\r\n }\r\n }\r\n }\r\n stmts.length = count;\r\n if (terminated || isLast) {\r\n if (!flow.is(FlowFlags.RETURNS)) alwaysReturns = false;\r\n if (!flow.is(FlowFlags.RETURNS_WRAPPED)) alwaysReturnsWrapped = false;\r\n if (!flow.is(FlowFlags.THROWS)) alwaysThrows = false;\r\n if (!flow.is(FlowFlags.ALLOCATES)) alwaysAllocates = false;\r\n }\r\n\r\n // Switch back to the parent flow\r\n flow.unset(\r\n FlowFlags.BREAKS |\r\n FlowFlags.CONDITIONALLY_BREAKS\r\n );\r\n currentFunction.flow = flow.free();\r\n currentBlock = module.createBlock(nextLabel, stmts, NativeType.None); // must be a labeled block\r\n }\r\n currentFunction.leaveBreakContext();\r\n\r\n // If the switch has a default (guaranteed to handle any value), propagate common flags\r\n if (defaultIndex >= 0) {\r\n if (alwaysReturns) parentFlow.set(FlowFlags.RETURNS);\r\n if (alwaysReturnsWrapped) parentFlow.set(FlowFlags.RETURNS_WRAPPED);\r\n if (alwaysThrows) parentFlow.set(FlowFlags.THROWS);\r\n if (alwaysAllocates) parentFlow.set(FlowFlags.ALLOCATES);\r\n }\r\n return currentBlock;\r\n }\r\n\r\n compileThrowStatement(statement: ThrowStatement): ExpressionRef {\r\n var flow = this.currentFunction.flow;\r\n\r\n // Remember that this branch throws\r\n flow.set(FlowFlags.THROWS);\r\n\r\n // FIXME: without try-catch it is safe to assume RETURNS as well for now\r\n flow.set(FlowFlags.RETURNS);\r\n\r\n // TODO: requires exception-handling spec.\r\n return compileAbort(this, null, statement);\r\n }\r\n\r\n compileTryStatement(statement: TryStatement): ExpressionRef {\r\n // TODO\r\n // can't yet support something like: try { return ... } finally { ... }\r\n // worthwhile to investigate lowering returns to block results (here)?\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n /**\r\n * Compiles a variable statement. Returns `0` if an initializer is not\r\n * necessary.\r\n */\r\n compileVariableStatement(statement: VariableStatement, isKnownGlobal: bool = false): ExpressionRef {\r\n var program = this.program;\r\n var currentFunction = this.currentFunction;\r\n var declarations = statement.declarations;\r\n var numDeclarations = declarations.length;\r\n\r\n // top-level variables and constants become globals\r\n if (isKnownGlobal || (\r\n currentFunction == this.startFunctionInstance &&\r\n statement.parent && statement.parent.kind == NodeKind.SOURCE\r\n )) {\r\n // NOTE that the above condition also covers top-level variables declared with 'let', even\r\n // though such variables could also become start function locals if, and only if, not used\r\n // within any function declared in the same source, which is unknown at this point. the only\r\n // efficient way to deal with this would be to keep track of all occasions it is used and\r\n // replace these instructions afterwards, dynamically. (TOOD: what about a Binaryen pass?)\r\n for (let i = 0; i < numDeclarations; ++i) {\r\n this.compileGlobalDeclaration(declarations[i]);\r\n }\r\n return 0;\r\n }\r\n\r\n // other variables become locals\r\n var initializers = new Array();\r\n var flow = this.currentFunction.flow;\r\n var resolver = this.resolver;\r\n for (let i = 0; i < numDeclarations; ++i) {\r\n let declaration = declarations[i];\r\n let name = declaration.name.text;\r\n let type: Type | null = null;\r\n let initExpr: ExpressionRef = 0;\r\n if (declaration.type) {\r\n type = resolver.resolveType( // reports\r\n declaration.type,\r\n flow.contextualTypeArguments\r\n );\r\n if (!type) continue;\r\n if (declaration.initializer) {\r\n initExpr = this.compileExpression( // reports\r\n declaration.initializer,\r\n type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n } else if (declaration.initializer) { // infer type using void/NONE for proper literal inference\r\n initExpr = this.compileExpressionRetainType( // reports\r\n declaration.initializer,\r\n Type.void,\r\n WrapMode.NONE\r\n );\r\n if (this.currentType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n declaration.range, this.currentType.toString(), \"\"\r\n );\r\n continue;\r\n }\r\n type = this.currentType;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n declaration.name.range.atEnd\r\n );\r\n continue;\r\n }\r\n let isInlined = false;\r\n if (declaration.is(CommonFlags.CONST)) {\r\n if (initExpr) {\r\n initExpr = this.module.precomputeExpression(initExpr);\r\n if (getExpressionId(initExpr) == ExpressionId.Const) {\r\n let local = new Local(program, name, -1, type);\r\n switch (getExpressionType(initExpr)) {\r\n case NativeType.I32: {\r\n local = local.withConstantIntegerValue(\r\n i64_new(\r\n getConstValueI32(initExpr),\r\n 0\r\n )\r\n );\r\n break;\r\n }\r\n case NativeType.I64: {\r\n local = local.withConstantIntegerValue(\r\n i64_new(\r\n getConstValueI64Low(initExpr),\r\n getConstValueI64High(initExpr)\r\n )\r\n );\r\n break;\r\n }\r\n case NativeType.F32: {\r\n local = local.withConstantFloatValue(getConstValueF32(initExpr));\r\n break;\r\n }\r\n case NativeType.F64: {\r\n local = local.withConstantFloatValue(getConstValueF64(initExpr));\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n // Create a virtual local that doesn't actually exist in WebAssembly\r\n let scopedLocals = currentFunction.flow.scopedLocals;\r\n if (!scopedLocals) currentFunction.flow.scopedLocals = scopedLocals = new Map();\r\n else if (scopedLocals.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, name\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n scopedLocals.set(name, local);\r\n isInlined = true;\r\n } else {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n declaration.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._const_declarations_must_be_initialized,\r\n declaration.range\r\n );\r\n }\r\n }\r\n if (!isInlined) {\r\n let local: Local;\r\n if (\r\n declaration.isAny(CommonFlags.LET | CommonFlags.CONST) ||\r\n flow.is(FlowFlags.INLINE_CONTEXT)\r\n ) { // here: not top-level\r\n local = flow.addScopedLocal(type, name, false, declaration); // reports\r\n } else {\r\n local = currentFunction.addLocal(type, name, declaration); // reports\r\n }\r\n if (initExpr) {\r\n initializers.push(this.compileAssignmentWithValue(declaration.name, initExpr));\r\n if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n flow.setLocalWrapped(local.index, !flow.canOverflow(initExpr, type));\r\n }\r\n } else if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n flow.setLocalWrapped(local.index, true); // zero\r\n }\r\n }\r\n }\r\n return initializers.length // we can unwrap these here because the\r\n ? initializers.length == 1 // source didn't tell us exactly what to do\r\n ? initializers[0]\r\n : this.module.createBlock(null, initializers, NativeType.None)\r\n : 0;\r\n }\r\n\r\n compileVoidStatement(statement: VoidStatement): ExpressionRef {\r\n return this.compileExpression(statement.expression, Type.void, ConversionKind.EXPLICIT, WrapMode.NONE);\r\n }\r\n\r\n compileWhileStatement(statement: WhileStatement): ExpressionRef {\r\n var module = this.module;\r\n\r\n // The condition does not yet initialize a branch\r\n var condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n\r\n if (\r\n !this.options.noTreeShaking ||\r\n this.currentFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\r\n ) {\r\n // Try to eliminate unnecesssary loops if the condition is constant\r\n let condExprPrecomp = module.precomputeExpression(condExpr);\r\n if (\r\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n getExpressionType(condExprPrecomp) == NativeType.I32\r\n ) {\r\n if (!getConstValueI32(condExprPrecomp)) return module.createNop();\r\n\r\n // Otherwise recompile to the original and let the optimizer decide\r\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n }\r\n }\r\n\r\n // Statements initiate a new branch with its own break context\r\n var currentFunction = this.currentFunction;\r\n var label = currentFunction.enterBreakContext();\r\n var parentFlow = currentFunction.flow;\r\n var flow = parentFlow.fork();\r\n currentFunction.flow = flow;\r\n var breakLabel = \"break|\" + label;\r\n flow.breakLabel = breakLabel;\r\n var continueLabel = \"continue|\" + label;\r\n flow.continueLabel = continueLabel;\r\n\r\n var body = this.compileStatement(statement.statement);\r\n var alwaysTrue = false; // TODO\r\n var terminated = flow.isAny(FlowFlags.ANY_TERMINATING);\r\n\r\n // Switch back to the parent flow\r\n currentFunction.flow = flow.free();\r\n currentFunction.leaveBreakContext();\r\n flow.unset(\r\n FlowFlags.BREAKS |\r\n FlowFlags.CONDITIONALLY_BREAKS |\r\n FlowFlags.CONTINUES |\r\n FlowFlags.CONDITIONALLY_CONTINUES\r\n );\r\n if (alwaysTrue) parentFlow.inherit(flow);\r\n else parentFlow.inheritConditional(flow);\r\n\r\n return module.createBlock(breakLabel, [\r\n module.createLoop(continueLabel,\r\n module.createIf(condExpr,\r\n terminated\r\n ? body // skip trailing continue if unnecessary\r\n : module.createBlock(null, [\r\n body,\r\n module.createBreak(continueLabel)\r\n ], NativeType.None)\r\n )\r\n )\r\n ]);\r\n }\r\n\r\n // expressions\r\n\r\n /**\r\n * Compiles the value of an inlined constant element.\r\n * @param retainType If true, the annotated type of the constant is retained. Otherwise, the value\r\n * is precomputed according to context.\r\n */\r\n compileInlineConstant(\r\n element: VariableLikeElement,\r\n contextualType: Type,\r\n retainType: bool\r\n ): ExpressionRef {\r\n assert(element.is(CommonFlags.INLINED));\r\n var type = element.type;\r\n switch (\r\n !retainType &&\r\n type.is(TypeFlags.INTEGER) &&\r\n contextualType.is(TypeFlags.INTEGER) &&\r\n type.size < contextualType.size\r\n ? (this.currentType = contextualType).kind // essentially precomputes a (sign-)extension\r\n : (this.currentType = type).kind\r\n ) {\r\n case TypeKind.I8:\r\n case TypeKind.I16: {\r\n let shift = type.computeSmallIntegerShift(Type.i32);\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue) << shift >> shift\r\n : 0\r\n ); // recognized by canOverflow\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n let mask = element.type.computeSmallIntegerMask(Type.i32);\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue) & mask\r\n : 0\r\n ); // recognized by canOverflow\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue)\r\n : 0\r\n );\r\n }\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: {\r\n if (!element.program.options.isWasm64) {\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue)\r\n : 0\r\n );\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n return element.constantValueKind == ConstantValueKind.INTEGER\r\n ? this.module.createI64(\r\n i64_low(element.constantIntegerValue),\r\n i64_high(element.constantIntegerValue)\r\n )\r\n : this.module.createI64(0);\r\n }\r\n case TypeKind.F64: {\r\n // monkey-patch for converting built-in floats to f32 implicitly\r\n if (!(element.hasDecorator(DecoratorFlags.BUILTIN) && contextualType == Type.f32)) {\r\n return this.module.createF64((element).constantFloatValue);\r\n }\r\n // otherwise fall-through: basically precomputes f32.demote/f64 of NaN / Infinity\r\n this.currentType = Type.f32;\r\n }\r\n case TypeKind.F32: {\r\n return this.module.createF32((element).constantFloatValue);\r\n }\r\n default: {\r\n assert(false);\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n }\r\n\r\n compileExpression(\r\n expression: Expression,\r\n contextualType: Type,\r\n conversionKind: ConversionKind,\r\n wrapMode: WrapMode\r\n ): ExpressionRef {\r\n this.currentType = contextualType;\r\n\r\n var expr: ExpressionRef;\r\n switch (expression.kind) {\r\n case NodeKind.ASSERTION: {\r\n expr = this.compileAssertionExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.BINARY: {\r\n expr = this.compileBinaryExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.CALL: {\r\n expr = this.compileCallExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.COMMA: {\r\n expr = this.compileCommaExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.ELEMENTACCESS: {\r\n expr = this.compileElementAccessExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.FUNCTION: {\r\n expr = this.compileFunctionExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.IDENTIFIER:\r\n case NodeKind.FALSE:\r\n case NodeKind.NULL:\r\n case NodeKind.THIS:\r\n case NodeKind.SUPER:\r\n case NodeKind.TRUE: {\r\n expr = this.compileIdentifierExpression(\r\n expression,\r\n contextualType,\r\n conversionKind == ConversionKind.NONE // retain type of inlined constants\r\n );\r\n break;\r\n }\r\n case NodeKind.INSTANCEOF: {\r\n expr = this.compileInstanceOfExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.LITERAL: {\r\n expr = this.compileLiteralExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.NEW: {\r\n expr = this.compileNewExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.PARENTHESIZED: {\r\n expr = this.compileParenthesizedExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.PROPERTYACCESS: {\r\n expr = this.compilePropertyAccessExpression(\r\n expression,\r\n contextualType,\r\n conversionKind == ConversionKind.NONE // retain type of inlined constants\r\n );\r\n break;\r\n }\r\n case NodeKind.TERNARY: {\r\n expr = this.compileTernaryExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.UNARYPOSTFIX: {\r\n expr = this.compileUnaryPostfixExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.UNARYPREFIX: {\r\n expr = this.compileUnaryPrefixExpression(expression, contextualType);\r\n break;\r\n }\r\n default: {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n expr = this.module.createUnreachable();\r\n }\r\n }\r\n\r\n var currentType = this.currentType;\r\n if (conversionKind != ConversionKind.NONE && currentType != contextualType) {\r\n expr = this.convertExpression(expr, currentType, contextualType, conversionKind, wrapMode, expression);\r\n this.currentType = contextualType;\r\n } else if (wrapMode == WrapMode.WRAP) {\r\n expr = this.ensureSmallIntegerWrap(expr, currentType);\r\n }\r\n\r\n if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\r\n return expr;\r\n }\r\n\r\n compileExpressionRetainType(\r\n expression: Expression,\r\n contextualType: Type,\r\n wrapMode: WrapMode\r\n ): ExpressionRef {\r\n return this.compileExpression(\r\n expression,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n wrapMode\r\n );\r\n }\r\n\r\n precomputeExpression(\r\n expression: Expression,\r\n contextualType: Type,\r\n conversionKind: ConversionKind,\r\n wrapMode: WrapMode\r\n ): ExpressionRef {\r\n return this.module.precomputeExpression(\r\n this.compileExpression(expression, contextualType, conversionKind, wrapMode)\r\n );\r\n }\r\n\r\n convertExpression(\r\n expr: ExpressionRef,\r\n fromType: Type,\r\n toType: Type,\r\n conversionKind: ConversionKind,\r\n wrapMode: WrapMode,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n assert(conversionKind != ConversionKind.NONE);\r\n var module = this.module;\r\n\r\n // void to any\r\n if (fromType.kind == TypeKind.VOID) {\r\n assert(toType.kind != TypeKind.VOID); // convertExpression should not be called with void -> void\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n reportNode.range, fromType.toString(), toType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n // any to void\r\n if (toType.kind == TypeKind.VOID) return module.createDrop(expr);\r\n\r\n if (!fromType.isAssignableTo(toType)) {\r\n if (conversionKind == ConversionKind.IMPLICIT) {\r\n this.error(\r\n DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,\r\n reportNode.range, fromType.toString(), toType.toString()\r\n ); // recoverable\r\n }\r\n }\r\n\r\n if (fromType.is(TypeFlags.FLOAT)) {\r\n\r\n // float to float\r\n if (toType.is(TypeFlags.FLOAT)) {\r\n if (fromType.kind == TypeKind.F32) {\r\n\r\n // f32 to f64\r\n if (toType.kind == TypeKind.F64) {\r\n expr = module.createUnary(UnaryOp.PromoteF32, expr);\r\n }\r\n\r\n // otherwise f32 to f32\r\n\r\n // f64 to f32\r\n } else if (toType.kind == TypeKind.F32) {\r\n expr = module.createUnary(UnaryOp.DemoteF64, expr);\r\n }\r\n\r\n // otherwise f64 to f64\r\n\r\n // float to int\r\n } else if (toType.is(TypeFlags.INTEGER)) {\r\n\r\n // f32 to int\r\n if (fromType.kind == TypeKind.F32) {\r\n if (toType == Type.bool) {\r\n expr = module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\r\n wrapMode = WrapMode.NONE;\r\n } else if (toType.is(TypeFlags.SIGNED)) {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.TruncF32ToI64, expr);\r\n } else {\r\n expr = module.createUnary(UnaryOp.TruncF32ToI32, expr);\r\n }\r\n } else {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.TruncF32ToU64, expr);\r\n } else {\r\n expr = module.createUnary(UnaryOp.TruncF32ToU32, expr);\r\n }\r\n }\r\n\r\n // f64 to int\r\n } else {\r\n if (toType == Type.bool) {\r\n expr = module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\r\n wrapMode = WrapMode.NONE;\r\n } else if (toType.is(TypeFlags.SIGNED)) {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.TruncF64ToI64, expr);\r\n } else {\r\n expr = module.createUnary(UnaryOp.TruncF64ToI32, expr);\r\n }\r\n } else {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.TruncF64ToU64, expr);\r\n } else {\r\n expr = module.createUnary(UnaryOp.TruncF64ToU32, expr);\r\n }\r\n }\r\n }\r\n\r\n // float to void\r\n } else {\r\n assert(toType.flags == TypeFlags.NONE, \"void type expected\");\r\n expr = module.createDrop(expr);\r\n }\r\n\r\n // int to float\r\n } else if (fromType.is(TypeFlags.INTEGER) && toType.is(TypeFlags.FLOAT)) {\r\n\r\n // int to f32\r\n if (toType.kind == TypeKind.F32) {\r\n if (fromType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI64ToF32\r\n : UnaryOp.ConvertU64ToF32,\r\n expr\r\n );\r\n } else {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI32ToF32\r\n : UnaryOp.ConvertU32ToF32,\r\n expr\r\n );\r\n }\r\n\r\n // int to f64\r\n } else {\r\n if (fromType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI64ToF64\r\n : UnaryOp.ConvertU64ToF64,\r\n expr\r\n );\r\n } else {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI32ToF64\r\n : UnaryOp.ConvertU32ToF64,\r\n expr\r\n );\r\n }\r\n }\r\n\r\n // int to int\r\n } else {\r\n // i64 to ...\r\n if (fromType.is(TypeFlags.LONG)) {\r\n\r\n // i64 to i32 or smaller\r\n if (toType == Type.bool) {\r\n expr = module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\r\n wrapMode = WrapMode.NONE;\r\n } else if (!toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.WrapI64, expr); // discards upper bits\r\n }\r\n\r\n // i32 or smaller to i64\r\n } else if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED) ? UnaryOp.ExtendI32 : UnaryOp.ExtendU32,\r\n this.ensureSmallIntegerWrap(expr, fromType) // must clear garbage bits\r\n );\r\n wrapMode = WrapMode.NONE;\r\n\r\n // i32 to i32\r\n } else {\r\n // small i32 to ...\r\n if (fromType.is(TypeFlags.SHORT)) {\r\n // small i32 to larger i32\r\n if (fromType.size < toType.size) {\r\n expr = this.ensureSmallIntegerWrap(expr, fromType); // must clear garbage bits\r\n wrapMode = WrapMode.NONE;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.currentType = toType;\r\n return wrapMode == WrapMode.WRAP\r\n ? this.ensureSmallIntegerWrap(expr, toType)\r\n : expr;\r\n }\r\n\r\n compileAssertionExpression(expression: AssertionExpression, contextualType: Type): ExpressionRef {\r\n var toType = this.resolver.resolveType( // reports\r\n expression.toType,\r\n this.currentFunction.flow.contextualTypeArguments\r\n );\r\n if (!toType) return this.module.createUnreachable();\r\n return this.compileExpression(expression.expression, toType, ConversionKind.EXPLICIT, WrapMode.NONE);\r\n }\r\n\r\n private f32ModInstance: Function | null = null;\r\n private f64ModInstance: Function | null = null;\r\n private f32PowInstance: Function | null = null;\r\n private f64PowInstance: Function | null = null;\r\n\r\n compileBinaryExpression(\r\n expression: BinaryExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var left = expression.left;\r\n var right = expression.right;\r\n\r\n var leftExpr: ExpressionRef;\r\n var leftType: Type;\r\n var rightExpr: ExpressionRef;\r\n var rightType: Type;\r\n var commonType: Type | null;\r\n\r\n var expr: ExpressionRef;\r\n var compound = false;\r\n\r\n var operator = expression.operator;\r\n switch (operator) {\r\n case Token.LESSTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.LT);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"<\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.LtI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.LtI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LtI64\r\n : BinaryOp.LtI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.LtU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LtU64\r\n : BinaryOp.LtU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.LtU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.LtF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.LtF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.GREATERTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.GT);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \">\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.GtI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GtI64\r\n : BinaryOp.GtI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.GtI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.GtU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GtU64\r\n : BinaryOp.GtU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.GtU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.GtF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.GtF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.LESSTHAN_EQUALS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.LE);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"<=\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.LeI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LeI64\r\n : BinaryOp.LeI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.LeI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.LeU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LeU64\r\n : BinaryOp.LeU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.LeU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.LeF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.LeF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.GREATERTHAN_EQUALS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.GE);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \">=\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.GeI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GeI64\r\n : BinaryOp.GeI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.GeI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.GeU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GeU64\r\n : BinaryOp.GeU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.GeU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.GeF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.GeF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n\r\n case Token.EQUALS_EQUALS_EQUALS:\r\n case Token.EQUALS_EQUALS: {\r\n\r\n // NOTE that this favors correctness, in terms of emitting a binary expression, over\r\n // checking for a possible use of unary EQZ. while the most classic of all optimizations,\r\n // that's not what the source told us to do. for reference, `!left` emits unary EQZ.\r\n\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (operator == Token.EQUALS_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.EQ);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n // still allow '==' with references\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.EqI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.EqI64\r\n : BinaryOp.EqI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.EqI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.EqF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.EqF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.EXCLAMATION_EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (operator == Token.EXCLAMATION_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.NE);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n // still allow '!=' with references\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.NeI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.NeI64\r\n : BinaryOp.NeI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.NeI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.NeF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.NeF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.EQUALS: {\r\n return this.compileAssignment(left, right, contextualType);\r\n }\r\n case Token.PLUS_EQUALS: compound = true;\r\n case Token.PLUS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.ADD);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"+\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8: // addition might overflow\r\n case TypeKind.I16: // ^\r\n case TypeKind.U8: // ^\r\n case TypeKind.U16: // ^\r\n case TypeKind.BOOL: // ^\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.AddI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.AddI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.AddF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.AddF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.MINUS_EQUALS: compound = true;\r\n case Token.MINUS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.SUB);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"-\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8: // subtraction might overflow\r\n case TypeKind.I16: // ^\r\n case TypeKind.U8: // ^\r\n case TypeKind.U16: // ^\r\n case TypeKind.BOOL: // ^\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.SubI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.SubI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.SubF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.SubF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.ASTERISK_EQUALS: compound = true;\r\n case Token.ASTERISK: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.MUL);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"*\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.MulI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.MulI64\r\n : BinaryOp.MulI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.MulI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.MulF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.MulF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.ASTERISK_ASTERISK_EQUALS: compound = true;\r\n case Token.ASTERISK_ASTERISK: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.POW);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n let instance: Function | null;\r\n\r\n // Mathf.pow if lhs is f32 (result is f32)\r\n if (this.currentType.kind == TypeKind.F32) {\r\n rightExpr = this.compileExpression(right, Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (!(instance = this.f32PowInstance)) {\r\n let namespace = this.program.elementsLookup.get(\"Mathf\");\r\n if (!namespace) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Mathf\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n let prototype = namespace.members ? namespace.members.get(\"pow\") : null;\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Mathf.pow\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.f32PowInstance = instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n\r\n // Math.pow otherwise (result is f64)\r\n // TODO: should the result be converted back?\r\n } else {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n this.currentType,\r\n Type.f64,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n leftType = this.currentType;\r\n rightExpr = this.compileExpression(\r\n right,\r\n Type.f64,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n rightType = this.currentType;\r\n if (!(instance = this.f64PowInstance)) {\r\n let namespace = this.program.elementsLookup.get(\"Math\");\r\n if (!namespace) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Math\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n let prototype = namespace.members ? namespace.members.get(\"pow\") : null;\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Math.pow\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.f64PowInstance = instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n }\r\n if (!(instance && this.compileFunction(instance))) {\r\n expr = module.createUnreachable();\r\n } else {\r\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n }\r\n break;\r\n }\r\n case Token.SLASH_EQUALS: compound = true;\r\n case Token.SLASH: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.DIV);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP, // !\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP, // !\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"/\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8: // signed div on signed small integers might overflow, e.g. -128/-1\r\n case TypeKind.I16: // ^\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.DivI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.DivI64\r\n : BinaryOp.DivI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.DivI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.DivU64\r\n : BinaryOp.DivU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.DivU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.DivF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.DivF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.PERCENT_EQUALS: compound = true;\r\n case Token.PERCENT: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.REM);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP, // !\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP, // !\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"%\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16: {\r\n expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.RemI64\r\n : BinaryOp.RemI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.RemI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.RemU64\r\n : BinaryOp.RemU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.RemU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n let instance = this.f32ModInstance;\r\n if (!instance) {\r\n let namespace = this.program.elementsLookup.get(\"Mathf\");\r\n if (!namespace) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Mathf\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n let prototype = namespace.members ? namespace.members.get(\"mod\") : null;\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Mathf.mod\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.f32ModInstance = instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n if (!(instance && this.compileFunction(instance))) {\r\n expr = module.createUnreachable();\r\n } else {\r\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n }\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n let instance = this.f64ModInstance;\r\n if (!instance) {\r\n let namespace = this.program.elementsLookup.get(\"Math\");\r\n if (!namespace) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Math\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n let prototype = namespace.members ? namespace.members.get(\"mod\") : null;\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Math.mod\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.f64ModInstance = instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n if (!(instance && this.compileFunction(instance))) {\r\n expr = module.createUnreachable();\r\n } else {\r\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n }\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.LESSTHAN_LESSTHAN_EQUALS: compound = true;\r\n case Token.LESSTHAN_LESSTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHL);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.ShlI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.ShlI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShlI64\r\n : BinaryOp.ShlI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\r\n case Token.GREATERTHAN_GREATERTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n rightType = this.currentType;\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16: {\r\n expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.ShrI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrI64\r\n : BinaryOp.ShrI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrU64\r\n : BinaryOp.ShrU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR_U);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n switch (this.currentType.kind) {\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: { // assumes that unsigned shr on unsigned small integers does not overflow\r\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n }\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrU64\r\n : BinaryOp.ShrU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.AMPERSAND_EQUALS: compound = true;\r\n case Token.AMPERSAND: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overloadd\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_AND);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"&\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.AndI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.AndI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AndI64\r\n : BinaryOp.AndI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.BAR_EQUALS: compound = true;\r\n case Token.BAR: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_OR);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"|\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.OrI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.OrI64\r\n : BinaryOp.OrI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.CARET_EQUALS: compound = true;\r\n case Token.CARET: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_XOR);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"^\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.XorI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.XorI64\r\n : BinaryOp.XorI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n\r\n // logical (no overloading)\r\n\r\n case Token.AMPERSAND_AMPERSAND: { // left && right\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n\r\n // simplify if cloning left without side effects is possible\r\n if (expr = module.cloneExpression(leftExpr, true, 0)) {\r\n this.makeIsTrueish(leftExpr, this.currentType);\r\n expr = module.createIf(\r\n this.makeIsTrueish(leftExpr, this.currentType),\r\n rightExpr,\r\n expr\r\n );\r\n\r\n // if not possible, tee left to a temp. local\r\n } else {\r\n let flow = this.currentFunction.flow;\r\n let tempLocal = this.currentFunction.getAndFreeTempLocal(\r\n this.currentType,\r\n !flow.canOverflow(leftExpr, this.currentType)\r\n );\r\n expr = module.createIf(\r\n this.makeIsTrueish(\r\n module.createTeeLocal(tempLocal.index, leftExpr),\r\n this.currentType\r\n ),\r\n rightExpr,\r\n module.createGetLocal(\r\n assert(tempLocal).index, // to be sure\r\n this.currentType.toNativeType()\r\n )\r\n );\r\n }\r\n break;\r\n }\r\n case Token.BAR_BAR: { // left || right\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n\r\n // simplify if cloning left without side effects is possible\r\n if (expr = this.module.cloneExpression(leftExpr, true, 0)) {\r\n expr = this.module.createIf(\r\n this.makeIsTrueish(leftExpr, this.currentType),\r\n expr,\r\n rightExpr\r\n );\r\n\r\n // if not possible, tee left to a temp. local\r\n } else {\r\n let flow = this.currentFunction.flow;\r\n let tempLocal = this.currentFunction.getAndFreeTempLocal(\r\n this.currentType,\r\n !flow.canOverflow(leftExpr, this.currentType)\r\n );\r\n expr = module.createIf(\r\n this.makeIsTrueish(\r\n module.createTeeLocal(tempLocal.index, leftExpr),\r\n this.currentType\r\n ),\r\n module.createGetLocal(\r\n assert(tempLocal).index, // to be sure\r\n this.currentType.toNativeType()\r\n ),\r\n rightExpr\r\n );\r\n }\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = this.module.createUnreachable();\r\n }\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(left, expr, contextualType != Type.void)\r\n : expr;\r\n }\r\n\r\n compileUnaryOverload(\r\n operatorInstance: Function,\r\n value: Expression,\r\n valueExpr: ExpressionRef,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n var argumentExpressions: Expression[];\r\n var thisArg: ExpressionRef = 0;\r\n if (operatorInstance.is(CommonFlags.INSTANCE)) {\r\n thisArg = valueExpr; // can reuse the previously evaluated expr as the this value here\r\n argumentExpressions = [];\r\n } else {\r\n argumentExpressions = [ value ]; // annotated type might differ -> recompile\r\n }\r\n return this.compileCallDirect(\r\n operatorInstance,\r\n argumentExpressions,\r\n reportNode,\r\n thisArg,\r\n operatorInstance.hasDecorator(DecoratorFlags.INLINE)\r\n );\r\n }\r\n\r\n compileBinaryOverload(\r\n operatorInstance: Function,\r\n left: Expression,\r\n leftExpr: ExpressionRef,\r\n right: Expression,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n var argumentExpressions: Expression[];\r\n var thisArg: ExpressionRef = 0;\r\n if (operatorInstance.is(CommonFlags.INSTANCE)) {\r\n let parent = assert(operatorInstance.parent);\r\n assert(parent.kind == ElementKind.CLASS);\r\n thisArg = leftExpr; // can reuse the previously evaluated leftExpr as the this value here\r\n argumentExpressions = [ right ];\r\n } else {\r\n argumentExpressions = [ left, right ]; // annotated type of LHS might differ -> recompile\r\n }\r\n var ret = this.compileCallDirect(\r\n operatorInstance,\r\n argumentExpressions,\r\n reportNode,\r\n thisArg,\r\n operatorInstance.hasDecorator(DecoratorFlags.INLINE)\r\n );\r\n return ret;\r\n }\r\n\r\n compileAssignment(expression: Expression, valueExpression: Expression, contextualType: Type): ExpressionRef {\r\n var program = this.program;\r\n var resolver = program.resolver;\r\n var currentFunction = this.currentFunction;\r\n var target = resolver.resolveExpression(expression, currentFunction); // reports\r\n if (!target) return this.module.createUnreachable();\r\n\r\n // to compile just the value, we need to know the target's type\r\n var targetType: Type;\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL: {\r\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field compiled as a global\r\n return this.module.createUnreachable();\r\n }\r\n assert((target).type != Type.void); // compileGlobal must guarantee this\r\n // fall-through\r\n }\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD: {\r\n targetType = (target).type;\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let setterPrototype = (target).setterPrototype;\r\n if (setterPrototype) {\r\n let instance = this.resolver.resolveFunction(setterPrototype, null);\r\n if (!instance) return this.module.createUnreachable();\r\n assert(instance.signature.parameterTypes.length == 1); // parser must guarantee this\r\n targetType = instance.signature.parameterTypes[0];\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (target).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n case ElementKind.CLASS: {\r\n if (resolver.currentElementExpression) { // indexed access\r\n let isUnchecked = currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n let indexedSet = (target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\r\n if (!indexedSet) {\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n if (!indexedGet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n expression.range, (target).internalName\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n expression.range, (target).internalName\r\n );\r\n }\r\n return this.module.createUnreachable();\r\n }\r\n assert(indexedSet.signature.parameterTypes.length == 2); // parser must guarantee this\r\n targetType = indexedSet.signature.parameterTypes[1]; // 2nd parameter is the element\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n\r\n // compile the value and do the assignment\r\n assert(targetType != Type.void);\r\n var valueExpr = this.compileExpression(valueExpression, targetType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n return this.compileAssignmentWithValue(\r\n expression,\r\n valueExpr,\r\n contextualType != Type.void\r\n );\r\n }\r\n\r\n compileAssignmentWithValue(\r\n expression: Expression,\r\n valueWithCorrectType: ExpressionRef,\r\n tee: bool = false\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var target = this.resolver.resolveExpression(expression, this.currentFunction); // reports\r\n if (!target) return module.createUnreachable();\r\n\r\n switch (target.kind) {\r\n case ElementKind.LOCAL: {\r\n let type = (target).type;\r\n assert(type != Type.void);\r\n this.currentType = tee ? type : Type.void;\r\n if ((target).is(CommonFlags.CONST)) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, target.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n let flow = this.currentFunction.flow;\r\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n flow.setLocalWrapped((target).index, !flow.canOverflow(valueWithCorrectType, type));\r\n }\r\n return tee\r\n ? module.createTeeLocal((target).index, valueWithCorrectType)\r\n : module.createSetLocal((target).index, valueWithCorrectType);\r\n }\r\n case ElementKind.GLOBAL: {\r\n if (!this.compileGlobal(target)) return module.createUnreachable();\r\n let type = (target).type;\r\n assert(type != Type.void);\r\n this.currentType = tee ? type : Type.void;\r\n if ((target).is(CommonFlags.CONST)) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range,\r\n target.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type); // guaranteed\r\n if (tee) {\r\n let nativeType = type.toNativeType();\r\n let internalName = target.internalName;\r\n return module.createBlock(null, [ // emulated teeGlobal\r\n module.createSetGlobal(internalName, valueWithCorrectType),\r\n module.createGetGlobal(internalName, nativeType)\r\n ], nativeType);\r\n } else {\r\n return module.createSetGlobal(target.internalName, valueWithCorrectType);\r\n }\r\n }\r\n case ElementKind.FIELD: {\r\n const declaration = (target).declaration;\r\n if (\r\n (target).is(CommonFlags.READONLY) &&\r\n !(\r\n this.currentFunction.is(CommonFlags.CONSTRUCTOR) ||\r\n declaration == null ||\r\n declaration.initializer != null\r\n )\r\n ) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (target).internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n let type = (target).type;\r\n this.currentType = tee ? type : Type.void;\r\n let nativeType = type.toNativeType();\r\n if (type.kind == TypeKind.BOOL) {\r\n // make sure bools are wrapped (usually are) when storing as 8 bits\r\n valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type);\r\n }\r\n if (tee) {\r\n let currentFunction = this.currentFunction;\r\n let flow = currentFunction.flow;\r\n let tempLocal = currentFunction.getAndFreeTempLocal(\r\n type,\r\n !flow.canOverflow(valueWithCorrectType, type)\r\n );\r\n let tempLocalIndex = tempLocal.index;\r\n // TODO: simplify if valueWithCorrectType has no side effects\r\n // TODO: call __gc_link here if a GC is present\r\n return module.createBlock(null, [\r\n module.createSetLocal(tempLocalIndex, valueWithCorrectType),\r\n module.createStore(\r\n type.byteSize,\r\n thisExpr,\r\n module.createGetLocal(tempLocalIndex, nativeType),\r\n nativeType,\r\n (target).memoryOffset\r\n ),\r\n module.createGetLocal(tempLocalIndex, nativeType)\r\n ], nativeType);\r\n } else {\r\n // TODO: call __gc_link here if a GC is present\r\n return module.createStore(\r\n type.byteSize,\r\n thisExpr,\r\n valueWithCorrectType,\r\n nativeType,\r\n (target).memoryOffset\r\n );\r\n }\r\n }\r\n case ElementKind.PROPERTY: {\r\n let setterPrototype = (target).setterPrototype;\r\n if (setterPrototype) {\r\n let setterInstance = this.resolver.resolveFunction(setterPrototype, null);\r\n if (!setterInstance) return module.createUnreachable();\r\n\r\n // call just the setter if the return value isn't of interest\r\n if (!tee) {\r\n if (setterInstance.is(CommonFlags.INSTANCE)) {\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n return this.makeCallDirect(setterInstance, [ thisExpr, valueWithCorrectType ]);\r\n } else {\r\n return this.makeCallDirect(setterInstance, [ valueWithCorrectType ]);\r\n }\r\n }\r\n\r\n // otherwise call the setter first, then the getter\r\n let getterPrototype = (target).getterPrototype;\r\n assert(getterPrototype != null); // must have one if there is a setter\r\n let getterInstance = this.resolver.resolveFunction(getterPrototype, null);\r\n if (!getterInstance) return module.createUnreachable();\r\n let returnType = getterInstance.signature.returnType;\r\n let nativeReturnType = returnType.toNativeType();\r\n if (setterInstance.is(CommonFlags.INSTANCE)) {\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n let tempLocal = this.currentFunction.getAndFreeTempLocal(returnType, false);\r\n let tempLocalIndex = tempLocal.index;\r\n return module.createBlock(null, [\r\n this.makeCallDirect(setterInstance, [ // set and remember the target\r\n module.createTeeLocal(tempLocalIndex, thisExpr),\r\n valueWithCorrectType\r\n ]),\r\n this.makeCallDirect(getterInstance, [ // get from remembered target\r\n module.createGetLocal(tempLocalIndex, nativeReturnType)\r\n ])\r\n ], nativeReturnType);\r\n } else {\r\n // note that this must be performed here because `resolved` is shared\r\n return module.createBlock(null, [\r\n this.makeCallDirect(setterInstance, [ valueWithCorrectType ]),\r\n this.makeCallDirect(getterInstance)\r\n ], nativeReturnType);\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, target.internalName\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n case ElementKind.CLASS: {\r\n let elementExpression = this.resolver.currentElementExpression;\r\n if (elementExpression) {\r\n let isUnchecked = this.currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n if (!indexedGet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n expression.range, target.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n let indexedSet = (target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\r\n if (!indexedSet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n expression.range, target.internalName\r\n );\r\n this.currentType = tee ? indexedGet.signature.returnType : Type.void;\r\n return module.createUnreachable();\r\n }\r\n let targetType = (target).type;\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n let elementExpr = this.compileExpression(\r\n elementExpression,\r\n Type.i32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n if (tee) {\r\n let currentFunction = this.currentFunction;\r\n let tempLocalTarget = currentFunction.getTempLocal(targetType, false);\r\n let tempLocalElement = currentFunction.getAndFreeTempLocal(this.currentType, false);\r\n let returnType = indexedGet.signature.returnType;\r\n this.currentFunction.freeTempLocal(tempLocalTarget);\r\n return module.createBlock(null, [\r\n this.makeCallDirect(indexedSet, [\r\n module.createTeeLocal(tempLocalTarget.index, thisExpr),\r\n module.createTeeLocal(tempLocalElement.index, elementExpr),\r\n valueWithCorrectType\r\n ]),\r\n this.makeCallDirect(indexedGet, [\r\n module.createGetLocal(tempLocalTarget.index, tempLocalTarget.type.toNativeType()),\r\n module.createGetLocal(tempLocalElement.index, tempLocalElement.type.toNativeType())\r\n ])\r\n ], returnType.toNativeType());\r\n } else {\r\n return this.makeCallDirect(indexedSet, [\r\n thisExpr,\r\n elementExpr,\r\n valueWithCorrectType\r\n ]);\r\n }\r\n }\r\n // fall-through\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n compileCallExpression(expression: CallExpression, contextualType: Type): ExpressionRef {\r\n var module = this.module;\r\n var currentFunction = this.currentFunction;\r\n var target = this.resolver.resolveExpression(expression.expression, currentFunction); // reports\r\n if (!target) return module.createUnreachable();\r\n\r\n var signature: Signature | null;\r\n var indexArg: ExpressionRef;\r\n switch (target.kind) {\r\n\r\n // direct call: concrete function\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n let prototype = target;\r\n let typeArguments = expression.typeArguments;\r\n\r\n // builtins handle present respectively omitted type arguments on their own\r\n if (prototype.hasDecorator(DecoratorFlags.BUILTIN)) {\r\n return this.compileCallExpressionBuiltin(prototype, expression, contextualType);\r\n }\r\n\r\n let instance: Function | null = null;\r\n\r\n // resolve generic call if type arguments have been provided\r\n if (typeArguments) {\r\n if (!prototype.is(CommonFlags.GENERIC)) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n expression.expression.range, prototype.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n instance = this.resolver.resolveFunctionInclTypeArguments(\r\n prototype,\r\n typeArguments,\r\n makeMap(this.currentFunction.flow.contextualTypeArguments),\r\n expression\r\n );\r\n\r\n // infer generic call if type arguments have been omitted\r\n } else if (prototype.is(CommonFlags.GENERIC)) {\r\n let inferredTypes = new Map();\r\n let typeParameters = assert(prototype.declaration.typeParameters);\r\n let numTypeParameters = typeParameters.length;\r\n for (let i = 0; i < numTypeParameters; ++i) {\r\n inferredTypes.set(typeParameters[i].name.text, null);\r\n }\r\n // let numInferred = 0;\r\n let parameterTypes = prototype.declaration.signature.parameters;\r\n let numParameterTypes = parameterTypes.length;\r\n let argumentExpressions = expression.arguments;\r\n let numArguments = argumentExpressions.length;\r\n let argumentExprs = new Array(numArguments);\r\n for (let i = 0; i < numParameterTypes; ++i) {\r\n let typeNode = parameterTypes[i].type;\r\n let name = typeNode.kind == NodeKind.TYPE ? (typeNode).name.text : null;\r\n let argumentExpression = i < numArguments\r\n ? argumentExpressions[i]\r\n : prototype.declaration.signature.parameters[i].initializer;\r\n if (!argumentExpression) { // missing initializer -> too few arguments\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n expression.range, numParameterTypes.toString(10), numArguments.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (name !== null && inferredTypes.has(name)) {\r\n let inferredType = inferredTypes.get(name);\r\n if (inferredType) {\r\n argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, inferredType, WrapMode.NONE);\r\n let commonType: Type | null;\r\n if (!(commonType = Type.commonCompatible(inferredType, this.currentType, true))) {\r\n if (!(commonType = Type.commonCompatible(inferredType, this.currentType, false))) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n parameterTypes[i].type.range, this.currentType.toString(), inferredType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n inferredType = commonType;\r\n } else {\r\n argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, Type.i32, WrapMode.NONE);\r\n inferredType = this.currentType;\r\n // ++numInferred;\r\n }\r\n inferredTypes.set(name, inferredType);\r\n } else {\r\n let concreteType = this.resolver.resolveType(\r\n parameterTypes[i].type,\r\n this.currentFunction.flow.contextualTypeArguments\r\n );\r\n if (!concreteType) return module.createUnreachable();\r\n argumentExprs[i] = this.compileExpression(\r\n argumentExpression,\r\n concreteType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n }\r\n let resolvedTypeArguments = new Array(numTypeParameters);\r\n for (let i = 0; i < numTypeParameters; ++i) {\r\n let inferredType = assert(inferredTypes.get(typeParameters[i].name.text)); // TODO\r\n resolvedTypeArguments[i] = inferredType;\r\n }\r\n instance = this.resolver.resolveFunction(\r\n prototype,\r\n resolvedTypeArguments,\r\n makeMap(this.currentFunction.flow.contextualTypeArguments)\r\n );\r\n if (!instance) return this.module.createUnreachable();\r\n return this.makeCallDirect(instance, argumentExprs);\r\n // TODO: this skips inlining because inlining requires compiling its temporary locals in\r\n // the scope of the inlined flow. might need another mechanism to lock temp. locals early,\r\n // so inlining can be performed in `makeCallDirect` instead?\r\n\r\n // otherwise resolve the non-generic call as usual\r\n } else {\r\n instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n if (!instance) return this.module.createUnreachable();\r\n\r\n // compile 'this' expression if an instance method\r\n let thisExpr: ExpressionRef = 0;\r\n if (instance.is(CommonFlags.INSTANCE)) {\r\n thisExpr = this.compileExpressionRetainType(\r\n assert(this.resolver.currentThisExpression),\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n }\r\n\r\n return this.compileCallDirect(\r\n instance,\r\n expression.arguments,\r\n expression,\r\n thisExpr,\r\n instance.hasDecorator(DecoratorFlags.INLINE)\r\n );\r\n }\r\n\r\n // indirect call: index argument with signature (non-generic, can't be inlined)\r\n case ElementKind.LOCAL: {\r\n if (signature = (target).type.signatureReference) {\r\n if ((target).is(CommonFlags.INLINED)) {\r\n indexArg = module.createI32(i64_low((target).constantIntegerValue));\r\n } else {\r\n indexArg = module.createGetLocal((target).index, NativeType.I32);\r\n }\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, (target).type.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case ElementKind.GLOBAL: {\r\n if (signature = (target).type.signatureReference) {\r\n indexArg = module.createGetGlobal((target).internalName, (target).type.toNativeType());\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, (target).type.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case ElementKind.FIELD: {\r\n let type = (target).type;\r\n if (signature = type.signatureReference) {\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n indexArg = module.createLoad(\r\n 4,\r\n false,\r\n thisExpr,\r\n NativeType.I32,\r\n (target).memoryOffset\r\n );\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, type.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case ElementKind.FUNCTION_TARGET: {\r\n signature = (target).signature;\r\n indexArg = this.compileExpression(\r\n expression.expression,\r\n (target).type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n break;\r\n }\r\n\r\n case ElementKind.PROPERTY: {\r\n indexArg = this.compileGetter(target, expression.expression);\r\n let type = this.currentType;\r\n signature = type.signatureReference;\r\n if (!signature) {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, type.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n break;\r\n }\r\n\r\n // not supported\r\n default: {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n return this.compileCallIndirect(\r\n signature,\r\n indexArg,\r\n expression.arguments,\r\n expression\r\n );\r\n }\r\n\r\n private compileCallExpressionBuiltin(\r\n prototype: FunctionPrototype,\r\n expression: CallExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var typeArguments: Type[] | null = null;\r\n\r\n // builtins handle omitted type arguments on their own. if present, however, resolve them here\r\n // and pass them to the builtin, even if it's still up to the builtin how to handle them.\r\n var typeArgumentNodes = expression.typeArguments;\r\n if (expression.typeArguments) {\r\n if (!prototype.is(CommonFlags.GENERIC)) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n expression.range, prototype.internalName\r\n );\r\n }\r\n typeArguments = this.resolver.resolveTypeArguments(\r\n assert(prototype.declaration.typeParameters),\r\n typeArgumentNodes,\r\n makeMap(this.currentFunction.flow.contextualTypeArguments),\r\n expression\r\n );\r\n }\r\n\r\n // now compile the builtin, which usually returns a block of code that replaces the call.\r\n var expr = compileBuiltinCall(\r\n this,\r\n prototype,\r\n typeArguments,\r\n expression.arguments,\r\n contextualType,\r\n expression\r\n );\r\n if (!expr) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n return expr;\r\n }\r\n\r\n /**\r\n * Checks that a call with the given number as arguments can be performed according to the\r\n * specified signature.\r\n */\r\n checkCallSignature(\r\n signature: Signature,\r\n numArguments: i32,\r\n hasThis: bool,\r\n reportNode: Node\r\n ): bool {\r\n\r\n // cannot call an instance method without a `this` argument (TODO: `.call`?)\r\n var thisType = signature.thisType;\r\n if (hasThis != (thisType != null)) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported, // TODO: better message?\r\n reportNode.range\r\n );\r\n return false;\r\n }\r\n\r\n // not yet implemented (TODO: maybe some sort of an unmanaged/lightweight array?)\r\n var hasRest = signature.hasRest;\r\n if (hasRest) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return false;\r\n }\r\n\r\n var minimum = signature.requiredParameters;\r\n var maximum = signature.parameterTypes.length;\r\n\r\n // must at least be called with required arguments\r\n if (numArguments < minimum) {\r\n this.error(\r\n minimum < maximum\r\n ? DiagnosticCode.Expected_at_least_0_arguments_but_got_1\r\n : DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, minimum.toString(), numArguments.toString()\r\n );\r\n return false;\r\n }\r\n\r\n // must not be called with more than the maximum arguments\r\n if (numArguments > maximum && !hasRest) {\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, maximum.toString(), numArguments.toString()\r\n );\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** Compiles a direct call to a concrete function. */\r\n compileCallDirect(\r\n instance: Function,\r\n argumentExpressions: Expression[],\r\n reportNode: Node,\r\n thisArg: ExpressionRef = 0,\r\n inline: bool = false\r\n ): ExpressionRef {\r\n var numArguments = argumentExpressions.length;\r\n var signature = instance.signature;\r\n\r\n if (!this.checkCallSignature( // reports\r\n signature,\r\n numArguments,\r\n thisArg != 0,\r\n reportNode\r\n )) {\r\n return this.module.createUnreachable();\r\n }\r\n\r\n // Inline if explicitly requested\r\n if (inline) {\r\n assert(!instance.is(CommonFlags.TRAMPOLINE)); // doesn't make sense\r\n if (this.currentInlineFunctions.includes(instance)) {\r\n this.warning(\r\n DiagnosticCode.Function_0_cannot_be_inlined_into_itself,\r\n reportNode.range, instance.internalName\r\n );\r\n } else {\r\n this.currentInlineFunctions.push(instance);\r\n let expr = this.compileCallInlineUnchecked(instance, argumentExpressions, reportNode, thisArg);\r\n this.currentInlineFunctions.pop();\r\n return expr;\r\n }\r\n }\r\n\r\n // Otherwise compile to just a call\r\n var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\r\n var operands = new Array(numArgumentsInclThis);\r\n var index = 0;\r\n if (thisArg) {\r\n operands[0] = thisArg;\r\n index = 1;\r\n }\r\n var parameterTypes = signature.parameterTypes;\r\n for (let i = 0; i < numArguments; ++i, ++index) {\r\n operands[index] = this.compileExpression(\r\n argumentExpressions[i],\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n assert(index == numArgumentsInclThis);\r\n return this.makeCallDirect(instance, operands);\r\n }\r\n\r\n // Depends on being pre-checked in compileCallDirect\r\n private compileCallInlineUnchecked(\r\n instance: Function,\r\n argumentExpressions: Expression[],\r\n reportNode: Node,\r\n thisArg: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var numArguments = argumentExpressions.length;\r\n var signature = instance.signature;\r\n var currentFunction = this.currentFunction;\r\n var module = this.module;\r\n var declaration = instance.prototype.declaration;\r\n\r\n // Create an empty child flow with its own scope and mark it for inlining\r\n var previousFlow = currentFunction.flow;\r\n var returnLabel = instance.internalName + \"|inlined.\" + (instance.nextInlineId++).toString(10);\r\n var returnType = instance.signature.returnType;\r\n var flow = Flow.create(currentFunction);\r\n flow.set(FlowFlags.INLINE_CONTEXT);\r\n flow.returnLabel = returnLabel;\r\n flow.returnType = returnType;\r\n flow.contextualTypeArguments = instance.contextualTypeArguments;\r\n\r\n // Convert provided call arguments to temporary locals. It is important that these are compiled\r\n // here, with their respective locals being blocked. There is no 'makeCallInline'.\r\n var body = [];\r\n if (thisArg) {\r\n let parent = assert(instance.parent);\r\n assert(parent.kind == ElementKind.CLASS);\r\n let thisType = assert(instance.signature.thisType);\r\n let classType = thisType.classReference;\r\n let superType = classType\r\n ? classType.base\r\n ? classType.base.type\r\n : null\r\n : null;\r\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) { // reuse this var\r\n flow.addScopedLocalAlias(getGetLocalIndex(thisArg), thisType, \"this\");\r\n if (superType) flow.addScopedLocalAlias(getGetLocalIndex(thisArg), superType, \"super\");\r\n } else { // use a temp var\r\n let thisLocal = flow.addScopedLocal(thisType, \"this\", false);\r\n body.push(\r\n module.createSetLocal(thisLocal.index, thisArg)\r\n );\r\n if (superType) flow.addScopedLocalAlias(thisLocal.index, superType, \"super\");\r\n }\r\n }\r\n var parameterTypes = signature.parameterTypes;\r\n for (let i = 0; i < numArguments; ++i) {\r\n let paramExpr = this.compileExpression(\r\n argumentExpressions[i],\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n if (getExpressionId(paramExpr) == ExpressionId.GetLocal) {\r\n flow.addScopedLocalAlias(\r\n getGetLocalIndex(paramExpr),\r\n parameterTypes[i],\r\n signature.getParameterName(i)\r\n );\r\n // inherits wrap status\r\n } else {\r\n let argumentLocal = flow.addScopedLocal(\r\n parameterTypes[i],\r\n signature.getParameterName(i),\r\n !flow.canOverflow(paramExpr, parameterTypes[i])\r\n );\r\n body.push(\r\n module.createSetLocal(argumentLocal.index, paramExpr)\r\n );\r\n }\r\n }\r\n\r\n // Compile optional parameter initializers in the scope of the inlined flow\r\n currentFunction.flow = flow;\r\n var numParameters = signature.parameterTypes.length;\r\n for (let i = numArguments; i < numParameters; ++i) {\r\n let initExpr = this.compileExpression(\r\n assert(declaration.signature.parameters[i].initializer),\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP\r\n );\r\n let argumentLocal = flow.addScopedLocal(\r\n parameterTypes[i],\r\n signature.getParameterName(i),\r\n !flow.canOverflow(initExpr, parameterTypes[i])\r\n );\r\n body.push(\r\n module.createSetLocal(argumentLocal.index, initExpr)\r\n );\r\n }\r\n\r\n // Compile the called function's body in the scope of the inlined flow\r\n var bodyStatement = assert(declaration.body);\r\n if (bodyStatement.kind == NodeKind.BLOCK) {\r\n let statements = (bodyStatement).statements;\r\n for (let i = 0, k = statements.length; i < k; ++i) {\r\n let stmt = this.compileStatement(statements[i]);\r\n if (getExpressionId(stmt) != ExpressionId.Nop) {\r\n body.push(stmt);\r\n if (flow.isAny(FlowFlags.ANY_TERMINATING)) break;\r\n }\r\n }\r\n } else {\r\n body.push(this.compileStatement(bodyStatement));\r\n }\r\n\r\n // Free any new scoped locals and reset to the original flow\r\n var scopedLocals = flow.scopedLocals;\r\n if (scopedLocals) {\r\n for (let scopedLocal of scopedLocals.values()) {\r\n if (scopedLocal.is(CommonFlags.SCOPED)) { // otherwise an alias\r\n currentFunction.freeTempLocal(scopedLocal);\r\n }\r\n }\r\n flow.scopedLocals = null;\r\n }\r\n flow.finalize();\r\n this.currentFunction.flow = previousFlow;\r\n this.currentType = returnType;\r\n\r\n // Check that all branches are terminated\r\n if (returnType != Type.void && !flow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n this.error(\r\n DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\r\n declaration.signature.returnType.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n return flow.is(FlowFlags.RETURNS)\r\n ? module.createBlock(returnLabel, body, returnType.toNativeType())\r\n : body.length > 1\r\n ? module.createBlock(null, body, returnType.toNativeType())\r\n : body.length\r\n ? body[0]\r\n : module.createNop();\r\n }\r\n\r\n /** Gets the trampoline for the specified function. */\r\n ensureTrampoline(original: Function): Function {\r\n // A trampoline is a function that takes a fixed amount of operands with some of them possibly\r\n // being zeroed. It takes one additional argument denoting the number of actual operands\r\n // provided to the call, and takes appropriate steps to initialize zeroed operands to their\r\n // default values using the optional parameter initializers of the original function. Doing so\r\n // allows calls to functions with optional parameters to circumvent the trampoline when all\r\n // parameters are provided as a fast route, respectively setting up omitted operands in a proper\r\n // context otherwise.\r\n var trampoline = original.trampoline;\r\n if (trampoline) return trampoline;\r\n\r\n var originalSignature = original.signature;\r\n var originalName = original.internalName;\r\n var originalParameterTypes = originalSignature.parameterTypes;\r\n var originalParameterDeclarations = original.prototype.declaration.signature.parameters;\r\n var commonReturnType = originalSignature.returnType;\r\n var commonThisType = originalSignature.thisType;\r\n var isInstance = original.is(CommonFlags.INSTANCE);\r\n\r\n // arguments excl. `this`, operands incl. `this`\r\n var minArguments = originalSignature.requiredParameters;\r\n var minOperands = minArguments;\r\n var maxArguments = originalParameterTypes.length;\r\n var maxOperands = maxArguments;\r\n if (isInstance) {\r\n ++minOperands;\r\n ++maxOperands;\r\n }\r\n var numOptional = assert(maxOperands - minOperands);\r\n\r\n var forwardedOperands = new Array(minOperands);\r\n var operandIndex = 0;\r\n\r\n // forward `this` if applicable\r\n var module = this.module;\r\n if (isInstance) {\r\n forwardedOperands[0] = module.createGetLocal(0, this.options.nativeSizeType);\r\n operandIndex = 1;\r\n }\r\n\r\n // forward required arguments\r\n for (let i = 0; i < minArguments; ++i, ++operandIndex) {\r\n forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, originalParameterTypes[i].toNativeType());\r\n }\r\n assert(operandIndex == minOperands);\r\n\r\n // create the trampoline element\r\n var trampolineSignature = new Signature(originalParameterTypes, commonReturnType, commonThisType);\r\n var trampolineName = originalName + \"|trampoline\";\r\n trampolineSignature.requiredParameters = maxArguments;\r\n trampoline = new Function(\r\n original.prototype,\r\n trampolineName,\r\n trampolineSignature,\r\n original.parent,\r\n original.contextualTypeArguments\r\n );\r\n trampoline.set(original.flags | CommonFlags.TRAMPOLINE | CommonFlags.COMPILED);\r\n original.trampoline = trampoline;\r\n\r\n // compile initializers of omitted arguments in scope of the trampoline function\r\n // this is necessary because initializers might need additional locals and a proper this context\r\n var previousFunction = this.currentFunction;\r\n this.currentFunction = trampoline;\r\n\r\n // create a br_table switching over the number of optional parameters provided\r\n var numNames = numOptional + 1; // incl. outer block\r\n var names = new Array(numNames);\r\n var ofN = \"of\" + numOptional.toString(10);\r\n for (let i = 0; i < numNames; ++i) {\r\n let label = i.toString(10) + ofN;\r\n names[i] = label;\r\n }\r\n var body = module.createBlock(names[0], [\r\n module.createBlock(\"outOfRange\", [\r\n module.createSwitch(names, \"outOfRange\",\r\n // condition is number of provided optional arguments, so subtract required arguments\r\n minArguments\r\n ? module.createBinary(\r\n BinaryOp.SubI32,\r\n module.createGetGlobal(\"~argc\", NativeType.I32),\r\n module.createI32(minArguments)\r\n )\r\n : module.createGetGlobal(\"~argc\", NativeType.I32)\r\n )\r\n ]),\r\n module.createUnreachable()\r\n ]);\r\n for (let i = 0; i < numOptional; ++i, ++operandIndex) {\r\n let type = originalParameterTypes[minArguments + i];\r\n let declaration = originalParameterDeclarations[minArguments + i];\r\n let initializer = declaration.initializer;\r\n let initExpr: ExpressionRef;\r\n if (initializer) {\r\n initExpr = module.createSetLocal(operandIndex,\r\n this.compileExpression(\r\n initializer,\r\n type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP\r\n )\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Optional_parameter_must_have_an_initializer,\r\n declaration.range\r\n );\r\n initExpr = module.createUnreachable();\r\n }\r\n body = module.createBlock(names[i + 1], [\r\n body,\r\n initExpr,\r\n ]);\r\n forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, type.toNativeType());\r\n }\r\n this.currentFunction = previousFunction;\r\n assert(operandIndex == maxOperands);\r\n\r\n var funcRef = module.addFunction(\r\n trampolineName,\r\n this.ensureFunctionType(\r\n trampolineSignature.parameterTypes,\r\n trampolineSignature.returnType,\r\n trampolineSignature.thisType\r\n ),\r\n typesToNativeTypes(trampoline.additionalLocals),\r\n module.createBlock(null, [\r\n body,\r\n module.createCall(\r\n originalName,\r\n forwardedOperands,\r\n commonReturnType.toNativeType()\r\n )\r\n ], commonReturnType.toNativeType())\r\n );\r\n trampoline.finalize(module, funcRef);\r\n return trampoline;\r\n }\r\n\r\n /** Makes sure that the argument count helper global is present and returns its name. */\r\n private ensureArgcVar(): string {\r\n var internalName = \"~argc\";\r\n if (!this.argcVar) {\r\n let module = this.module;\r\n this.argcVar = module.addGlobal(\r\n internalName,\r\n NativeType.I32,\r\n true,\r\n module.createI32(0)\r\n );\r\n }\r\n return internalName;\r\n }\r\n\r\n /** Makes sure that the argument count helper setter is present and returns its name. */\r\n private ensureArgcSet(): string {\r\n var internalName = \"~setargc\";\r\n if (!this.argcSet) {\r\n let module = this.module;\r\n this.argcSet = module.addFunction(internalName,\r\n this.ensureFunctionType([ Type.u32 ], Type.void),\r\n null,\r\n module.createSetGlobal(this.ensureArgcVar(),\r\n module.createGetLocal(0, NativeType.I32)\r\n )\r\n );\r\n module.addFunctionExport(internalName, \"_setargc\");\r\n }\r\n return internalName;\r\n }\r\n\r\n /** Creates a direct call to the specified function. */\r\n makeCallDirect(\r\n instance: Function,\r\n operands: ExpressionRef[] | null = null\r\n ): ExpressionRef {\r\n var numOperands = operands ? operands.length : 0;\r\n var numArguments = numOperands;\r\n var minArguments = instance.signature.requiredParameters;\r\n var minOperands = minArguments;\r\n var maxArguments = instance.signature.parameterTypes.length;\r\n var maxOperands = maxArguments;\r\n if (instance.is(CommonFlags.INSTANCE)) {\r\n ++minOperands;\r\n ++maxOperands;\r\n --numArguments;\r\n }\r\n assert(numOperands >= minOperands);\r\n\r\n var module = this.module;\r\n if (!this.compileFunction(instance)) return module.createUnreachable();\r\n var returnType = instance.signature.returnType;\r\n var isCallImport = instance.is(CommonFlags.MODULE_IMPORT);\r\n\r\n // fill up omitted arguments with their initializers, if constant, otherwise with zeroes.\r\n if (numOperands < maxOperands) {\r\n if (!operands) {\r\n operands = new Array(maxOperands);\r\n operands.length = 0;\r\n }\r\n let parameterTypes = instance.signature.parameterTypes;\r\n let parameterNodes = instance.prototype.declaration.signature.parameters;\r\n let allOptionalsAreConstant = true;\r\n for (let i = numArguments; i < maxArguments; ++i) {\r\n let initializer = parameterNodes[i].initializer;\r\n if (!(initializer !== null && nodeIsConstantValue(initializer.kind))) {\r\n allOptionalsAreConstant = false;\r\n break;\r\n }\r\n }\r\n if (allOptionalsAreConstant) { // inline into the call\r\n for (let i = numArguments; i < maxArguments; ++i) {\r\n operands.push(\r\n this.compileExpression(\r\n parameterNodes[i].initializer,\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n )\r\n );\r\n }\r\n } else { // otherwise fill up with zeroes and call the trampoline\r\n for (let i = numArguments; i < maxArguments; ++i) {\r\n operands.push(parameterTypes[i].toNativeZero(module));\r\n }\r\n if (!isCallImport) {\r\n let original = instance;\r\n instance = this.ensureTrampoline(instance);\r\n if (!this.compileFunction(instance)) return module.createUnreachable();\r\n instance.flow.flags = original.flow.flags;\r\n this.program.instancesLookup.set(instance.internalName, instance); // so canOverflow can find it\r\n let nativeReturnType = returnType.toNativeType();\r\n this.currentType = returnType;\r\n return module.createBlock(null, [\r\n module.createSetGlobal(this.ensureArgcVar(), module.createI32(numArguments)),\r\n module.createCall(instance.internalName, operands, nativeReturnType)\r\n ], nativeReturnType);\r\n }\r\n }\r\n }\r\n\r\n // otherwise just call through\r\n this.currentType = returnType;\r\n return module.createCall(instance.internalName, operands, returnType.toNativeType());\r\n }\r\n\r\n /** Compiles an indirect call using an index argument and a signature. */\r\n compileCallIndirect(\r\n signature: Signature,\r\n indexArg: ExpressionRef,\r\n argumentExpressions: Expression[],\r\n reportNode: Node,\r\n thisArg: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var numArguments = argumentExpressions.length;\r\n\r\n if (!this.checkCallSignature( // reports\r\n signature,\r\n numArguments,\r\n thisArg != 0,\r\n reportNode\r\n )) {\r\n return this.module.createUnreachable();\r\n }\r\n\r\n var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\r\n var operands = new Array(numArgumentsInclThis);\r\n var index = 0;\r\n if (thisArg) {\r\n operands[0] = thisArg;\r\n index = 1;\r\n }\r\n var parameterTypes = signature.parameterTypes;\r\n for (let i = 0; i < numArguments; ++i, ++index) {\r\n operands[index] = this.compileExpression(\r\n argumentExpressions[i],\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n assert(index == numArgumentsInclThis);\r\n return this.makeCallIndirect(signature, indexArg, operands);\r\n }\r\n\r\n /** Creates an indirect call to the function at `indexArg` in the function table. */\r\n makeCallIndirect(\r\n signature: Signature,\r\n indexArg: ExpressionRef,\r\n operands: ExpressionRef[] | null = null\r\n ): ExpressionRef {\r\n var numOperands = operands ? operands.length : 0;\r\n var numArguments = numOperands;\r\n var minArguments = signature.requiredParameters;\r\n var minOperands = minArguments;\r\n var maxArguments = signature.parameterTypes.length;\r\n var maxOperands = maxArguments;\r\n if (signature.thisType) {\r\n ++minOperands;\r\n ++maxOperands;\r\n --numArguments;\r\n }\r\n assert(numOperands >= minOperands);\r\n\r\n this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\r\n var module = this.module;\r\n\r\n // fill up omitted arguments with zeroes\r\n if (numOperands < maxOperands) {\r\n if (!operands) {\r\n operands = new Array(maxOperands);\r\n operands.length = 0;\r\n }\r\n let parameterTypes = signature.parameterTypes;\r\n for (let i = numArguments; i < maxArguments; ++i) {\r\n operands.push(parameterTypes[i].toNativeZero(module));\r\n }\r\n }\r\n\r\n var returnType = signature.returnType;\r\n this.currentType = returnType;\r\n return module.createBlock(null, [\r\n module.createSetGlobal(this.ensureArgcVar(), // might still be calling a trampoline\r\n module.createI32(numArguments)\r\n ),\r\n module.createCallIndirect(indexArg, operands, signature.toSignatureString())\r\n ], returnType.toNativeType()); // not necessarily wrapped\r\n }\r\n\r\n compileCommaExpression(expression: CommaExpression, contextualType: Type): ExpressionRef {\r\n var expressions = expression.expressions;\r\n var numExpressions = expressions.length;\r\n var exprs = new Array(numExpressions--);\r\n for (let i = 0; i < numExpressions; ++i) {\r\n exprs[i] = this.compileExpression(\r\n expressions[i],\r\n Type.void, // drop all\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n exprs[numExpressions] = this.compileExpression(\r\n expressions[numExpressions],\r\n contextualType, // except last\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n return this.module.createBlock(null, exprs, this.currentType.toNativeType());\r\n }\r\n\r\n compileElementAccessExpression(expression: ElementAccessExpression, contextualType: Type): ExpressionRef {\r\n var target = this.resolver.resolveElementAccess(expression, this.currentFunction, contextualType); // reports\r\n if (!target) return this.module.createUnreachable();\r\n switch (target.kind) {\r\n case ElementKind.CLASS: {\r\n let isUnchecked = this.currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n if (!indexedGet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n expression.expression.range, (target).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n let thisArg = this.compileExpression(\r\n expression.expression,\r\n (target).type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n return this.compileCallDirect(indexedGet, [\r\n expression.elementExpression\r\n ], expression, thisArg);\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileFunctionExpression(expression: FunctionExpression, contextualType: Type): ExpressionRef {\r\n var declaration = expression.declaration;\r\n var name = declaration.name;\r\n var simpleName = (name.text.length\r\n ? name.text\r\n : \"anonymous\") + \"|\" + this.functionTable.length.toString(10);\r\n var currentFunction = this.currentFunction;\r\n var prototype = new FunctionPrototype(\r\n this.program,\r\n simpleName,\r\n currentFunction.internalName + INNER_DELIMITER + simpleName,\r\n declaration,\r\n null,\r\n DecoratorFlags.NONE\r\n );\r\n var flow = currentFunction.flow;\r\n var instance = this.compileFunctionUsingTypeArguments(\r\n prototype,\r\n [],\r\n makeMap(flow.contextualTypeArguments),\r\n flow,\r\n declaration\r\n );\r\n if (!instance) return this.module.createUnreachable();\r\n this.currentType = instance.signature.type; // TODO: get cached type?\r\n // NOTE that, in order to make this work in every case, the function must be represented by a\r\n // value, so we add it and rely on the optimizer to figure out where it can be called directly.\r\n var index = this.ensureFunctionTableEntry(instance); // reports\r\n return index < 0\r\n ? this.module.createUnreachable()\r\n : this.module.createI32(index);\r\n }\r\n\r\n /**\r\n * Compiles an identifier in the specified context.\r\n * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\r\n * precomputes them according to context.\r\n */\r\n compileIdentifierExpression(\r\n expression: IdentifierExpression,\r\n contextualType: Type,\r\n retainConstantType: bool\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var currentFunction = this.currentFunction;\r\n\r\n // check special keywords first\r\n switch (expression.kind) {\r\n case NodeKind.NULL: {\r\n let options = this.options;\r\n if (!contextualType.classReference) {\r\n this.currentType = options.usizeType;\r\n }\r\n return options.isWasm64\r\n ? module.createI64(0)\r\n : module.createI32(0);\r\n }\r\n case NodeKind.TRUE: {\r\n this.currentType = Type.bool;\r\n return module.createI32(1);\r\n }\r\n case NodeKind.FALSE: {\r\n this.currentType = Type.bool;\r\n return module.createI32(0);\r\n }\r\n case NodeKind.THIS: {\r\n let flow = currentFunction.flow;\r\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n let scopedThis = flow.getScopedLocal(\"this\");\r\n if (scopedThis) {\r\n this.currentType = scopedThis.type;\r\n return module.createGetLocal(scopedThis.index, scopedThis.type.toNativeType());\r\n }\r\n }\r\n if (currentFunction.is(CommonFlags.INSTANCE)) {\r\n let parent = assert(currentFunction.parent);\r\n assert(parent.kind == ElementKind.CLASS);\r\n let thisType = assert(currentFunction.signature.thisType);\r\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\r\n if (!flow.is(FlowFlags.ALLOCATES)) {\r\n flow.set(FlowFlags.ALLOCATES);\r\n // must be conditional because `this` could have been provided by a derived class\r\n this.currentType = thisType;\r\n return module.createTeeLocal(0,\r\n this.makeConditionalAllocate(parent, expression)\r\n );\r\n }\r\n }\r\n this.currentType = thisType;\r\n return module.createGetLocal(0, thisType.toNativeType());\r\n }\r\n this.error(\r\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n expression.range\r\n );\r\n this.currentType = this.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n case NodeKind.SUPER: {\r\n let flow = currentFunction.flow;\r\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n let scopedThis = flow.getScopedLocal(\"this\");\r\n if (scopedThis) {\r\n let scopedThisClass = assert(scopedThis.type.classReference);\r\n let base = scopedThisClass.base;\r\n if (base) {\r\n this.currentType = base.type;\r\n return module.createGetLocal(scopedThis.index, base.type.toNativeType());\r\n }\r\n }\r\n }\r\n if (currentFunction.is(CommonFlags.INSTANCE)) {\r\n let parent = assert(currentFunction.parent);\r\n assert(parent.kind == ElementKind.CLASS);\r\n let base = (parent).base;\r\n if (base) {\r\n let superType = base.type;\r\n this.currentType = superType;\r\n return module.createGetLocal(0, superType.toNativeType());\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n expression.range\r\n );\r\n this.currentType = this.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n\r\n // otherwise resolve\r\n var target = this.resolver.resolveIdentifier( // reports\r\n expression,\r\n this.currentEnum || currentFunction\r\n );\r\n if (!target) return module.createUnreachable();\r\n\r\n switch (target.kind) {\r\n case ElementKind.LOCAL: {\r\n let localType = (target).type;\r\n assert(localType != Type.void);\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return this.compileInlineConstant(target, contextualType, retainConstantType);\r\n }\r\n let localIndex = (target).index;\r\n assert(localIndex >= 0);\r\n this.currentType = localType;\r\n return this.module.createGetLocal(localIndex, localType.toNativeType());\r\n }\r\n case ElementKind.GLOBAL: {\r\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field\r\n return this.module.createUnreachable();\r\n }\r\n let globalType = (target).type;\r\n assert(globalType != Type.void);\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return this.compileInlineConstant(target, contextualType, retainConstantType);\r\n }\r\n this.currentType = globalType;\r\n return this.module.createGetGlobal((target).internalName, globalType.toNativeType());\r\n }\r\n case ElementKind.ENUMVALUE: { // here: if referenced from within the same enum\r\n if (!target.is(CommonFlags.COMPILED)) {\r\n this.error(\r\n DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,\r\n expression.range\r\n );\r\n this.currentType = Type.i32;\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = Type.i32;\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return this.module.createI32((target).constantValue);\r\n }\r\n return this.module.createGetGlobal((target).internalName, NativeType.I32);\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n let instance = this.resolver.resolveFunction(\r\n target,\r\n null,\r\n makeMap(currentFunction.flow.contextualTypeArguments)\r\n );\r\n if (!(instance && this.compileFunction(instance))) return module.createUnreachable();\r\n let index = this.ensureFunctionTableEntry(instance);\r\n this.currentType = instance.signature.type;\r\n return this.module.createI32(index);\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileInstanceOfExpression(\r\n expression: InstanceOfExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var module = this.module;\r\n // NOTE that this differs from TypeScript in that the rhs is a type, not an expression. at the\r\n // time of implementation, this seemed more useful because dynamic rhs expressions are not\r\n // possible in AS anyway.\r\n var expr = this.compileExpressionRetainType(expression.expression, this.options.usizeType, WrapMode.NONE);\r\n var type = this.currentType;\r\n var isType = this.resolver.resolveType(expression.isType);\r\n this.currentType = Type.bool;\r\n if (!isType) return module.createUnreachable();\r\n return type.is(TypeFlags.NULLABLE) && !isType.is(TypeFlags.NULLABLE)\r\n ? type.nonNullableType.isAssignableTo(isType)\r\n ? module.createBinary( // not precomputeable\r\n type.is(TypeFlags.LONG)\r\n ? BinaryOp.NeI64\r\n : BinaryOp.NeI32,\r\n expr,\r\n type.toNativeZero(module)\r\n )\r\n : module.createI32(0)\r\n : module.createI32(type.isAssignableTo(isType, true) ? 1 : 0);\r\n }\r\n\r\n compileLiteralExpression(\r\n expression: LiteralExpression,\r\n contextualType: Type,\r\n implicitNegate: bool = false\r\n ): ExpressionRef {\r\n var module = this.module;\r\n\r\n switch (expression.literalKind) {\r\n case LiteralKind.ARRAY: {\r\n assert(!implicitNegate);\r\n let classType = contextualType.classReference;\r\n if (\r\n classType &&\r\n classType.prototype == this.program.arrayPrototype\r\n ) {\r\n return this.compileArrayLiteral(\r\n assert(classType.typeArguments)[0],\r\n (expression).elementExpressions,\r\n false, // TODO: isConst?\r\n expression\r\n );\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n case LiteralKind.FLOAT: {\r\n let floatValue = (expression).value;\r\n if (implicitNegate) {\r\n floatValue = -floatValue;\r\n }\r\n if (contextualType == Type.f32) {\r\n return module.createF32(floatValue);\r\n }\r\n this.currentType = Type.f64;\r\n return module.createF64(floatValue);\r\n }\r\n case LiteralKind.INTEGER: {\r\n let intValue = (expression).value;\r\n if (implicitNegate) {\r\n intValue = i64_sub(\r\n i64_new(0),\r\n intValue\r\n );\r\n }\r\n let type = this.resolver.determineIntegerLiteralType(intValue, contextualType);\r\n this.currentType = type;\r\n switch (type.kind) {\r\n case TypeKind.ISIZE: if (!this.options.isWasm64) return module.createI32(i64_low(intValue));\r\n case TypeKind.I64: return module.createI64(i64_low(intValue), i64_high(intValue));\r\n case TypeKind.USIZE: if (!this.options.isWasm64) return module.createI32(i64_low(intValue));\r\n case TypeKind.U64: return module.createI64(i64_low(intValue), i64_high(intValue));\r\n case TypeKind.F32: return module.createF32(i64_to_f32(intValue));\r\n case TypeKind.F64: return module.createF64(i64_to_f64(intValue));\r\n default: return module.createI32(i64_low(intValue));\r\n }\r\n }\r\n case LiteralKind.STRING: {\r\n assert(!implicitNegate);\r\n return this.compileStringLiteral(expression);\r\n }\r\n case LiteralKind.OBJECT: {\r\n assert(!implicitNegate);\r\n return this.compileObjectLiteral(expression, contextualType);\r\n }\r\n // case LiteralKind.REGEXP:\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n\r\n /** Ensures that the specified string exists in static memory and returns a pointer to it. */\r\n ensureStaticString(stringValue: string): ExpressionRef {\r\n var program = this.program;\r\n var hasGC = program.hasGC;\r\n var gcHeaderSize = program.gcHeaderSize;\r\n\r\n var stringInstance = assert(program.stringInstance);\r\n var stringSegment: MemorySegment;\r\n\r\n // if the string already exists, reuse it\r\n var segments = this.stringSegments;\r\n if (segments.has(stringValue)) {\r\n stringSegment = segments.get(stringValue);\r\n\r\n // otherwise create it\r\n } else {\r\n let length = stringValue.length;\r\n let headerSize = (stringInstance.currentMemoryOffset + 1) & ~1;\r\n let totalSize = headerSize + length * 2;\r\n\r\n let buf: Uint8Array;\r\n let pos: u32;\r\n\r\n if (hasGC) {\r\n buf = new Uint8Array(gcHeaderSize + totalSize);\r\n pos = gcHeaderSize;\r\n writeI32(ensureGCHook(this, stringInstance), buf, program.gcHookOffset);\r\n } else {\r\n buf = new Uint8Array(totalSize);\r\n pos = 0;\r\n }\r\n writeI32(length, buf, pos + stringInstance.offsetof(\"length\"));\r\n pos += headerSize;\r\n for (let i = 0; i < length; ++i) {\r\n writeI16(stringValue.charCodeAt(i), buf, pos + (i << 1));\r\n }\r\n stringSegment = this.addMemorySegment(buf);\r\n segments.set(stringValue, stringSegment);\r\n }\r\n var stringOffset = stringSegment.offset;\r\n if (hasGC) stringOffset = i64_add(stringOffset, i64_new(gcHeaderSize));\r\n\r\n this.currentType = stringInstance.type;\r\n if (this.options.isWasm64) {\r\n return this.module.createI64(i64_low(stringOffset), i64_high(stringOffset));\r\n } else {\r\n assert(i64_is_u32(stringOffset));\r\n return this.module.createI32(i64_low(stringOffset));\r\n }\r\n }\r\n\r\n compileStringLiteral(expression: StringLiteralExpression): ExpressionRef {\r\n return this.ensureStaticString(expression.value);\r\n }\r\n\r\n /** Ensures that the specified array exists in static memory and returns a pointer to it. */\r\n ensureStaticArray(elementType: Type, values: ExpressionRef[]): ExpressionRef {\r\n var program = this.program;\r\n var hasGC = program.hasGC;\r\n var gcHeaderSize = program.gcHeaderSize;\r\n\r\n var length = values.length;\r\n var byteSize = elementType.byteSize;\r\n var byteLength = length * byteSize;\r\n var usizeTypeSize = this.options.usizeType.byteSize;\r\n\r\n var buf: Uint8Array;\r\n var pos: u32;\r\n\r\n // create the backing ArrayBuffer segment\r\n var bufferInstance = assert(program.arrayBufferInstance);\r\n var bufferHeaderSize = (bufferInstance.currentMemoryOffset + 7) & ~7;\r\n var bufferTotalSize = 1 << (32 - clz(bufferHeaderSize + byteLength - 1));\r\n if (hasGC) {\r\n buf = new Uint8Array(gcHeaderSize + bufferTotalSize);\r\n pos = gcHeaderSize;\r\n writeI32(ensureGCHook(this, bufferInstance), buf, program.gcHookOffset);\r\n } else {\r\n buf = new Uint8Array(bufferTotalSize);\r\n pos = 0;\r\n }\r\n writeI32(byteLength, buf, pos + bufferInstance.offsetof(\"byteLength\"));\r\n pos += bufferHeaderSize;\r\n var nativeType = elementType.toNativeType();\r\n switch (nativeType) {\r\n case NativeType.I32: {\r\n switch (byteSize) {\r\n case 1: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeI8(getConstValueI32(value), buf, pos);\r\n pos += 1;\r\n }\r\n break;\r\n }\r\n case 2: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeI16(getConstValueI32(value), buf, pos);\r\n pos += 2;\r\n }\r\n break;\r\n }\r\n case 4: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeI32(getConstValueI32(value), buf, pos);\r\n pos += 4;\r\n }\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n break;\r\n }\r\n case NativeType.I64: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeI64(i64_new(getConstValueI64Low(value), getConstValueI64High(value)), buf, pos);\r\n pos += 8;\r\n }\r\n break;\r\n }\r\n case NativeType.F32: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeF32(getConstValueF32(value), buf, pos);\r\n pos += 4;\r\n }\r\n break;\r\n }\r\n case NativeType.F64: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeF64(getConstValueF64(value), buf, pos);\r\n pos += 8;\r\n }\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n var bufferSegment = this.addMemorySegment(buf);\r\n var bufferOffset = bufferSegment.offset;\r\n if (hasGC) bufferOffset = i64_add(bufferOffset, i64_new(gcHeaderSize));\r\n\r\n // create the Array segment and return a pointer to it\r\n var arrayPrototype = assert(program.arrayPrototype);\r\n var arrayInstance = assert(this.resolver.resolveClass(\r\n arrayPrototype,\r\n [ elementType ],\r\n makeMap()\r\n ));\r\n var arrayHeaderSize = (arrayInstance.currentMemoryOffset + 7) & ~7;\r\n if (hasGC) {\r\n buf = new Uint8Array(gcHeaderSize + arrayHeaderSize);\r\n pos = gcHeaderSize;\r\n writeI32(ensureGCHook(this, arrayInstance), buf, program.gcHookOffset);\r\n } else {\r\n buf = new Uint8Array(arrayHeaderSize);\r\n pos = 0;\r\n }\r\n var arraySegment = this.addMemorySegment(buf);\r\n var arrayOffset = arraySegment.offset;\r\n if (hasGC) arrayOffset = i64_add(arrayOffset, i64_new(gcHeaderSize));\r\n this.currentType = arrayInstance.type;\r\n if (usizeTypeSize == 8) {\r\n writeI64(bufferOffset, buf, pos + arrayInstance.offsetof(\"buffer_\"));\r\n writeI32(length, buf, pos + arrayInstance.offsetof(\"length_\"));\r\n return this.module.createI64(i64_low(arrayOffset), i64_high(arrayOffset));\r\n } else {\r\n assert(i64_is_u32(bufferOffset));\r\n writeI32(i64_low(bufferOffset), buf, pos + arrayInstance.offsetof(\"buffer_\"));\r\n writeI32(length, buf, pos + arrayInstance.offsetof(\"length_\"));\r\n assert(i64_is_u32(arrayOffset));\r\n return this.module.createI32(i64_low(arrayOffset));\r\n }\r\n }\r\n\r\n compileArrayLiteral(\r\n elementType: Type,\r\n expressions: (Expression | null)[],\r\n isConst: bool,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n var module = this.module;\r\n\r\n // find out whether all elements are constant (array is static)\r\n var length = expressions.length;\r\n var compiledValues = new Array(length);\r\n var constantValues = new Array(length);\r\n var nativeElementType = elementType.toNativeType();\r\n var isStatic = true;\r\n for (let i = 0; i < length; ++i) {\r\n let expr = expressions[i]\r\n ? this.compileExpression(expressions[i], elementType, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n : elementType.toNativeZero(module);\r\n compiledValues[i] = expr;\r\n if (isStatic) {\r\n expr = module.precomputeExpression(compiledValues[i]);\r\n if (getExpressionId(expr) == ExpressionId.Const) {\r\n assert(getExpressionType(expr) == nativeElementType);\r\n constantValues[i] = expr;\r\n } else {\r\n if (isConst) {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n reportNode.range\r\n );\r\n }\r\n isStatic = false;\r\n }\r\n }\r\n }\r\n\r\n // make a static array if possible\r\n if (isStatic) return this.ensureStaticArray(elementType, constantValues);\r\n\r\n // otherwise obtain the array type\r\n var arrayPrototype = assert(this.program.arrayPrototype);\r\n var arrayInstance = assert(this.resolver.resolveClass(\r\n arrayPrototype,\r\n [ elementType ],\r\n makeMap()\r\n ));\r\n var arrayType = arrayInstance.type;\r\n\r\n // and compile an explicit instantiation\r\n this.currentType = arrayType;\r\n var setter = arrayInstance.lookupOverload(OperatorKind.INDEXED_SET, true);\r\n if (!setter) {\r\n this.error(\r\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n reportNode.range, arrayInstance.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n var nativeArrayType = arrayType.toNativeType();\r\n var currentFunction = this.currentFunction;\r\n var tempLocal = currentFunction.addLocal(arrayType); // can't reuse a temp (used in compiledValues)\r\n var stmts = new Array(2 + length);\r\n var index = 0;\r\n stmts[index++] = module.createSetLocal(tempLocal.index,\r\n this.makeCallDirect(assert(arrayInstance.constructorInstance), [\r\n module.createI32(0), // this\r\n module.createI32(length)\r\n ])\r\n );\r\n for (let i = 0; i < length; ++i) {\r\n stmts[index++] = this.makeCallDirect(setter, [\r\n module.createGetLocal(tempLocal.index, nativeArrayType), // this\r\n module.createI32(i),\r\n compiledValues[i]\r\n ]);\r\n }\r\n assert(index + 1 == stmts.length);\r\n stmts[index] = module.createGetLocal(tempLocal.index, nativeArrayType);\r\n currentFunction.freeTempLocal(tempLocal); // but can be reused now\r\n this.currentType = arrayType;\r\n return module.createBlock(null, stmts, nativeArrayType);\r\n }\r\n\r\n compileObjectLiteral(expression: ObjectLiteralExpression, contextualType: Type): ExpressionRef {\r\n var module = this.module;\r\n\r\n // contextual type must be a class\r\n var classReference = contextualType.classReference;\r\n if (!classReference || classReference.is(CommonFlags.ABSTRACT)) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n expression.range, \"\", contextualType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n // if present, check that the constructor is compatible with object literals\r\n var ctor = classReference.constructorInstance;\r\n if (ctor) {\r\n // TODO: if the constructor requires parameters, check whether these are given as part of the\r\n // object literal and use them to call the ctor while not generating a store.\r\n if (ctor.signature.requiredParameters) {\r\n this.error(\r\n DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,\r\n expression.range, classReference.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (ctor.is(CommonFlags.PRIVATE)) {\r\n this.error(\r\n DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,\r\n expression.range, classReference.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (ctor.is(CommonFlags.PROTECTED)) {\r\n this.error(\r\n DiagnosticCode.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration,\r\n expression.range, classReference.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n\r\n // check and compile field values\r\n var names = expression.names;\r\n var numNames = names.length;\r\n var values = expression.values;\r\n var members = classReference.members;\r\n var hasErrors = false;\r\n var exprs = new Array(numNames + 2);\r\n var tempLocal = this.currentFunction.getTempLocal(this.options.usizeType);\r\n assert(numNames == values.length);\r\n for (let i = 0, k = numNames; i < k; ++i) {\r\n let member = members ? members.get(names[i].text) : null;\r\n if (!member || member.kind != ElementKind.FIELD) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n names[i].range, names[i].text, classReference.toString()\r\n );\r\n hasErrors = true;\r\n continue;\r\n }\r\n let type = (member).type;\r\n exprs[i + 1] = this.module.createStore( // TODO: handle setters as well\r\n type.byteSize,\r\n this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType),\r\n this.compileExpression(values[i], (member).type, ConversionKind.IMPLICIT, WrapMode.NONE),\r\n type.toNativeType(),\r\n (member).memoryOffset\r\n );\r\n }\r\n this.currentType = classReference.type.nonNullableType;\r\n if (hasErrors) return module.createUnreachable();\r\n\r\n // allocate a new instance first and assign 'this' to the temp. local\r\n exprs[0] = module.createSetLocal(\r\n tempLocal.index,\r\n compileAllocate(this, classReference, expression)\r\n );\r\n\r\n // once all field values have been set, return 'this'\r\n exprs[exprs.length - 1] = module.createGetLocal(tempLocal.index, this.options.nativeSizeType);\r\n\r\n return module.createBlock(null, exprs, this.options.nativeSizeType);\r\n }\r\n\r\n compileNewExpression(expression: NewExpression, contextualType: Type): ExpressionRef {\r\n var module = this.module;\r\n var options = this.options;\r\n var currentFunction = this.currentFunction;\r\n\r\n // obtain the class being instantiated\r\n var target = this.resolver.resolveExpression( // reports\r\n expression.expression,\r\n currentFunction\r\n );\r\n if (!target) return module.createUnreachable();\r\n if (target.kind != ElementKind.CLASS_PROTOTYPE) {\r\n this.error(\r\n DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature,\r\n expression.expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n var classPrototype = target;\r\n var classInstance: Class | null = null;\r\n var typeArguments = expression.typeArguments;\r\n var classReference: Class | null;\r\n if (\r\n !typeArguments &&\r\n (classReference = contextualType.classReference) !== null &&\r\n classReference.is(CommonFlags.GENERIC)\r\n ) {\r\n classInstance = this.resolver.resolveClass(\r\n classPrototype,\r\n classReference.typeArguments,\r\n makeMap(currentFunction.flow.contextualTypeArguments)\r\n );\r\n } else {\r\n classInstance = this.resolver.resolveClassInclTypeArguments(\r\n classPrototype,\r\n typeArguments,\r\n makeMap(currentFunction.flow.contextualTypeArguments),\r\n expression\r\n );\r\n }\r\n if (!classInstance) return module.createUnreachable();\r\n return this.compileInstantiate(classInstance, expression.arguments, expression);\r\n }\r\n\r\n compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\r\n // traverse to the top-most visible constructor\r\n var currentClassInstance: Class | null = classInstance;\r\n var constructorInstance: Function | null = null;\r\n do {\r\n constructorInstance = currentClassInstance.constructorInstance;\r\n if (constructorInstance) break; // TODO: check visibility\r\n } while (currentClassInstance = currentClassInstance.base);\r\n\r\n // if a constructor is present, call it with a zero `this`\r\n var expr: ExpressionRef;\r\n if (constructorInstance) {\r\n expr = this.compileCallDirect(constructorInstance, argumentExpressions, reportNode,\r\n this.options.usizeType.toNativeZero(this.module)\r\n );\r\n\r\n // otherwise simply allocate a new instance and initialize its fields\r\n } else {\r\n if (argumentExpressions.length) {\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", argumentExpressions.length.toString(10)\r\n );\r\n }\r\n expr = this.makeAllocate(classInstance, reportNode);\r\n }\r\n\r\n this.currentType = classInstance.type;\r\n return expr;\r\n }\r\n\r\n compileParenthesizedExpression(\r\n expression: ParenthesizedExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n // does not change types, just order\r\n return this.compileExpression(\r\n expression.expression,\r\n contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n }\r\n\r\n /**\r\n * Compiles a property access in the specified context.\r\n * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\r\n * precomputes them according to context.\r\n */\r\n compilePropertyAccessExpression(\r\n propertyAccess: PropertyAccessExpression,\r\n contextualType: Type,\r\n retainConstantType: bool\r\n ): ExpressionRef {\r\n var module = this.module;\r\n\r\n var target = this.resolver.resolvePropertyAccess(propertyAccess, this.currentFunction, contextualType); // reports\r\n if (!target) return module.createUnreachable();\r\n\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL: { // static property\r\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field\r\n return module.createUnreachable();\r\n }\r\n let globalType = (target).type;\r\n assert(globalType != Type.void);\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return this.compileInlineConstant(target, contextualType, retainConstantType);\r\n }\r\n this.currentType = globalType;\r\n return module.createGetGlobal((target).internalName, globalType.toNativeType());\r\n }\r\n case ElementKind.ENUMVALUE: { // enum value\r\n let parent = (target).parent;\r\n assert(parent !== null && parent.kind == ElementKind.ENUM);\r\n if (!this.compileEnum(parent)) {\r\n this.currentType = Type.i32;\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = Type.i32;\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return module.createI32((target).constantValue);\r\n }\r\n return module.createGetGlobal((target).internalName, NativeType.I32);\r\n }\r\n case ElementKind.FIELD: { // instance field\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n assert((target).memoryOffset >= 0);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n this.currentType = (target).type;\r\n return module.createLoad(\r\n (target).type.byteSize,\r\n (target).type.is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n thisExpr,\r\n (target).type.toNativeType(),\r\n (target).memoryOffset\r\n );\r\n }\r\n case ElementKind.PROPERTY: {// instance property (here: getter)\r\n return this.compileGetter(target, propertyAccess);\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n this.error(\r\n DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,\r\n propertyAccess.range, (target).simpleName\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n propertyAccess.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n private compileGetter(target: Property, reportNode: Node): ExpressionRef {\r\n var prototype = target.getterPrototype;\r\n if (prototype) {\r\n let instance = this.resolver.resolveFunction(prototype, null);\r\n if (!instance) return this.module.createUnreachable();\r\n let signature = instance.signature;\r\n if (!this.checkCallSignature( // reports\r\n signature,\r\n 0,\r\n instance.is(CommonFlags.INSTANCE),\r\n reportNode\r\n )) {\r\n return this.module.createUnreachable();\r\n }\r\n let inline = (instance.decoratorFlags & DecoratorFlags.INLINE) != 0;\r\n if (instance.is(CommonFlags.INSTANCE)) {\r\n let parent = assert(instance.parent);\r\n assert(parent.kind == ElementKind.CLASS);\r\n let thisExpression = assert(this.resolver.currentThisExpression); //!!!\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n this.currentType = signature.returnType;\r\n return this.compileCallDirect(instance, [], reportNode, thisExpr, inline);\r\n } else {\r\n this.currentType = signature.returnType;\r\n return this.compileCallDirect(instance, [], reportNode, 0, inline);\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n reportNode.range, (target).simpleName, (target).parent.toString()\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n\r\n compileTernaryExpression(expression: TernaryExpression, contextualType: Type): ExpressionRef {\r\n var ifThen = expression.ifThen;\r\n var ifElse = expression.ifElse;\r\n var currentFunction = this.currentFunction;\r\n var parentFlow = currentFunction.flow;\r\n\r\n var condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n\r\n if (\r\n !this.options.noTreeShaking ||\r\n this.currentFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\r\n ) {\r\n // Try to eliminate unnecesssary branches if the condition is constant\r\n let condExprPrecomp = this.module.precomputeExpression(condExpr);\r\n if (\r\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n getExpressionType(condExprPrecomp) == NativeType.I32\r\n ) {\r\n return getConstValueI32(condExprPrecomp)\r\n ? this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE)\r\n : this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\r\n\r\n // Otherwise recompile to the original and let the optimizer decide\r\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n }\r\n }\r\n\r\n var ifThenFlow = parentFlow.fork();\r\n currentFunction.flow = ifThenFlow;\r\n var ifThenExpr = this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE);\r\n var ifThenType = this.currentType;\r\n ifThenFlow.free();\r\n\r\n var ifElseFlow = parentFlow.fork();\r\n currentFunction.flow = ifElseFlow;\r\n var ifElseExpr = this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\r\n var ifElseType = this.currentType;\r\n currentFunction.flow = ifElseFlow.free();\r\n\r\n parentFlow.inheritMutual(ifThenFlow, ifElseFlow);\r\n\r\n var commonType = Type.commonCompatible(ifThenType, ifElseType, false);\r\n if (!commonType) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n expression.range, ifThenType.toString(), ifElseType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return this.module.createUnreachable();\r\n }\r\n ifThenExpr = this.convertExpression(\r\n ifThenExpr,\r\n ifThenType,\r\n commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n ifThen\r\n );\r\n ifElseExpr = this.convertExpression(\r\n ifElseExpr,\r\n ifElseType,\r\n commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n ifElse\r\n );\r\n this.currentType = commonType;\r\n return this.module.createIf(condExpr, ifThenExpr, ifElseExpr);\r\n }\r\n\r\n compileUnaryPostfixExpression(expression: UnaryPostfixExpression, contextualType: Type): ExpressionRef {\r\n var module = this.module;\r\n var currentFunction = this.currentFunction;\r\n\r\n // make a getter for the expression (also obtains the type)\r\n var getValue = this.compileExpression( // reports\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // shortcut if compiling the getter already failed\r\n if (getExpressionId(getValue) == ExpressionId.Unreachable) return getValue;\r\n\r\n var currentType = this.currentType;\r\n\r\n // if the value isn't dropped, a temp. local is required to remember the original value\r\n var tempLocal: Local | null = null;\r\n if (contextualType != Type.void) {\r\n tempLocal = currentFunction.getTempLocal(currentType, false);\r\n getValue = module.createTeeLocal(\r\n tempLocal.index,\r\n getValue\r\n );\r\n }\r\n\r\n var calcValue: ExpressionRef;\r\n\r\n switch (expression.operator) {\r\n case Token.PLUS_PLUS: {\r\n switch (currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n calcValue = module.createBinary(\r\n BinaryOp.AddI32,\r\n getValue,\r\n module.createI32(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.POSTFIX_INC);\r\n if (overload) {\r\n calcValue = this.compileUnaryOverload(overload, expression.operand, getValue, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case TypeKind.ISIZE: {\r\n let options = this.options;\r\n calcValue = module.createBinary(\r\n options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n getValue,\r\n currentType.toNativeOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n calcValue = module.createBinary(\r\n BinaryOp.AddI64,\r\n getValue,\r\n module.createI64(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n calcValue = module.createBinary(\r\n BinaryOp.AddF32,\r\n getValue,\r\n module.createF32(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n calcValue = module.createBinary(\r\n BinaryOp.AddF64,\r\n getValue,\r\n module.createF64(1)\r\n );\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.MINUS_MINUS: {\r\n switch (currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n calcValue = module.createBinary(\r\n BinaryOp.SubI32,\r\n getValue,\r\n module.createI32(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.POSTFIX_DEC);\r\n if (overload) {\r\n calcValue = this.compileUnaryOverload(overload, expression.operand, getValue, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case TypeKind.ISIZE: {\r\n let options = this.options;\r\n calcValue = module.createBinary(\r\n options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n getValue,\r\n currentType.toNativeOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n calcValue = module.createBinary(\r\n BinaryOp.SubI64,\r\n getValue,\r\n module.createI64(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n calcValue = module.createBinary(\r\n BinaryOp.SubF32,\r\n getValue,\r\n module.createF32(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n calcValue = module.createBinary(\r\n BinaryOp.SubF64,\r\n getValue,\r\n module.createF64(1)\r\n );\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return module.createUnreachable();\r\n }\r\n }\r\n\r\n // simplify if dropped anyway\r\n if (!tempLocal) {\r\n this.currentType = Type.void;\r\n return this.compileAssignmentWithValue(expression.operand,\r\n calcValue,\r\n false\r\n );\r\n }\r\n\r\n // otherwise use the temp. local for the intermediate value (always possibly overflows)\r\n var setValue = this.compileAssignmentWithValue(expression.operand,\r\n calcValue, // also tees getValue to tempLocal\r\n false\r\n );\r\n\r\n this.currentType = tempLocal.type;\r\n currentFunction.freeTempLocal(tempLocal);\r\n var nativeType = tempLocal.type.toNativeType();\r\n\r\n return module.createBlock(null, [\r\n setValue,\r\n module.createGetLocal(tempLocal.index, nativeType)\r\n ], nativeType); // result of 'x++' / 'x--' might overflow\r\n }\r\n\r\n compileUnaryPrefixExpression(\r\n expression: UnaryPrefixExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var compound = false;\r\n var expr: ExpressionRef;\r\n\r\n switch (expression.operator) {\r\n case Token.PLUS: {\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.PLUS);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n // nop\r\n break;\r\n }\r\n case Token.MINUS: {\r\n if (expression.operand.kind == NodeKind.LITERAL && (\r\n (expression.operand).literalKind == LiteralKind.INTEGER ||\r\n (expression.operand).literalKind == LiteralKind.FLOAT\r\n )) {\r\n // implicitly negate integer and float literals. also enables proper checking of literal ranges.\r\n expr = this.compileLiteralExpression(expression.operand, contextualType, true);\r\n // compileExpression normally does this:\r\n if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\r\n break;\r\n }\r\n\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.MINUS);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.SubI32, module.createI32(0), expr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n this.currentType.toNativeZero(module),\r\n expr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.SubI64, module.createI64(0), expr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createUnary(UnaryOp.NegF32, expr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createUnary(UnaryOp.NegF64, expr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.PLUS_PLUS: {\r\n compound = true;\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.PREFIX_INC);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.AddI32, expr, this.module.createI32(1));\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n expr,\r\n this.currentType.toNativeOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.AddI64, expr, module.createI64(1));\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.AddF32, expr, module.createF32(1));\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.AddF64, expr, module.createF64(1));\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.MINUS_MINUS: {\r\n compound = true;\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.PREFIX_DEC);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.SubI32, expr, module.createI32(1));\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n expr,\r\n this.currentType.toNativeOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.SubI64, expr, module.createI64(1));\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.SubF32, expr, module.createF32(1));\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.SubF64, expr, module.createF64(1));\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.EXCLAMATION: {\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.NOT);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n // allow '!' for references even without an overload\r\n }\r\n\r\n expr = this.makeIsFalseish(expr, this.currentType);\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.TILDE: {\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_NOT);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n } else {\r\n expr = this.convertExpression(\r\n expr,\r\n this.currentType, this.currentType.intType,\r\n ConversionKind.IMPLICIT, WrapMode.NONE,\r\n expression.operand\r\n );\r\n }\r\n\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.XorI32, expr, module.createI32(-1));\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.XorI64\r\n : BinaryOp.XorI32,\r\n expr,\r\n this.currentType.toNativeNegOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.XorI64, expr, module.createI64(-1, -1));\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.TYPEOF: {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n return module.createUnreachable();\r\n }\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(expression.operand, expr, contextualType != Type.void)\r\n : expr;\r\n }\r\n\r\n /** Makes sure that a 32-bit integer value is wrapped to a valid value of the specified type. */\r\n ensureSmallIntegerWrap(expr: ExpressionRef, type: Type): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFunction.flow;\r\n switch (type.kind) {\r\n case TypeKind.I8: {\r\n if (flow.canOverflow(expr, type)) {\r\n expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\r\n ? module.createUnary(UnaryOp.ExtendI8ToI32, expr)\r\n : module.createBinary(BinaryOp.ShrI32,\r\n module.createBinary(BinaryOp.ShlI32,\r\n expr,\r\n module.createI32(24)\r\n ),\r\n module.createI32(24)\r\n );\r\n }\r\n break;\r\n }\r\n case TypeKind.I16: {\r\n if (flow.canOverflow(expr, type)) {\r\n expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\r\n ? module.createUnary(UnaryOp.ExtendI16ToI32, expr)\r\n : module.createBinary(BinaryOp.ShrI32,\r\n module.createBinary(BinaryOp.ShlI32,\r\n expr,\r\n module.createI32(16)\r\n ),\r\n module.createI32(16)\r\n );\r\n }\r\n break;\r\n }\r\n case TypeKind.U8: {\r\n if (flow.canOverflow(expr, type)) {\r\n expr = module.createBinary(BinaryOp.AndI32,\r\n expr,\r\n module.createI32(0xff)\r\n );\r\n }\r\n break;\r\n }\r\n case TypeKind.U16: {\r\n if (flow.canOverflow(expr, type)) {\r\n expr = module.createBinary(BinaryOp.AndI32,\r\n expr,\r\n module.createI32(0xffff)\r\n );\r\n }\r\n break;\r\n }\r\n case TypeKind.BOOL: {\r\n if (flow.canOverflow(expr, type)) {\r\n // bool is special in that it compares to 0 instead of masking with 0x1\r\n expr = module.createBinary(BinaryOp.NeI32,\r\n expr,\r\n module.createI32(0)\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n return expr;\r\n }\r\n\r\n /** Creates a comparison whether an expression is 'false' in a broader sense. */\r\n makeIsFalseish(expr: ExpressionRef, type: Type): ExpressionRef {\r\n var module = this.module;\r\n switch (type.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = this.ensureSmallIntegerWrap(expr, type);\r\n // fall-through\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n return module.createUnary(UnaryOp.EqzI32, expr);\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n return module.createUnary(UnaryOp.EqzI64, expr);\r\n }\r\n case TypeKind.USIZE: // TODO: strings?\r\n case TypeKind.ISIZE: {\r\n return module.createUnary(type.size == 64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32, expr);\r\n }\r\n case TypeKind.F32: {\r\n return module.createBinary(BinaryOp.EqF32, expr, module.createF32(0));\r\n }\r\n case TypeKind.F64: {\r\n return module.createBinary(BinaryOp.EqF64, expr, module.createF64(0));\r\n }\r\n default: {\r\n assert(false);\r\n return module.createI32(1);\r\n }\r\n }\r\n }\r\n\r\n /** Creates a comparison whether an expression is 'true' in a broader sense. */\r\n makeIsTrueish(expr: ExpressionRef, type: Type): ExpressionRef {\r\n var module = this.module;\r\n switch (type.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = this.ensureSmallIntegerWrap(expr, type);\r\n // fall-through\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n return expr;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n return module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\r\n }\r\n case TypeKind.USIZE: // TODO: strings?\r\n case TypeKind.ISIZE: {\r\n return type.size == 64\r\n ? module.createBinary(BinaryOp.NeI64, expr, module.createI64(0))\r\n : expr;\r\n }\r\n case TypeKind.F32: {\r\n return module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\r\n }\r\n case TypeKind.F64: {\r\n return module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\r\n }\r\n default: {\r\n assert(false);\r\n return module.createI32(0);\r\n }\r\n }\r\n }\r\n\r\n /** Makes an allocation expression for an instance of the specified class. */\r\n makeAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\r\n var module = this.module;\r\n var currentFunction = this.currentFunction;\r\n var nativeSizeType = this.options.nativeSizeType;\r\n\r\n // allocate the necessary memory and tee the pointer to a temp. local for reuse\r\n var tempLocal = currentFunction.getTempLocal(classInstance.type, false);\r\n var initializers = new Array();\r\n initializers.push(\r\n module.createSetLocal(tempLocal.index,\r\n compileAllocate(this, classInstance, reportNode)\r\n )\r\n );\r\n\r\n // apply field initializers\r\n if (classInstance.members) {\r\n for (let member of classInstance.members.values()) {\r\n if (member.kind == ElementKind.FIELD) {\r\n let field = member;\r\n let fieldType = field.type;\r\n let nativeFieldType = fieldType.toNativeType();\r\n let fieldDeclaration = field.prototype.declaration;\r\n assert(!field.isAny(CommonFlags.CONST));\r\n if (fieldDeclaration.initializer) { // use initializer\r\n initializers.push(module.createStore(fieldType.byteSize,\r\n module.createGetLocal(tempLocal.index, nativeSizeType),\r\n this.compileExpression( // reports\r\n fieldDeclaration.initializer,\r\n fieldType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n ),\r\n nativeFieldType,\r\n field.memoryOffset\r\n ));\r\n } else { // initialize with zero\r\n // TODO: might be unnecessary if the ctor initializes the field\r\n let parameterIndex = (field.prototype.declaration).parameterIndex;\r\n initializers.push(module.createStore(fieldType.byteSize,\r\n module.createGetLocal(tempLocal.index, nativeSizeType),\r\n parameterIndex >= 0 // initialized via parameter\r\n ? module.createGetLocal(1 + parameterIndex, nativeFieldType)\r\n : fieldType.toNativeZero(module),\r\n nativeFieldType,\r\n field.memoryOffset\r\n ));\r\n }\r\n }\r\n }\r\n }\r\n\r\n // return `this`\r\n initializers.push(\r\n module.createGetLocal(tempLocal.index, nativeSizeType)\r\n );\r\n\r\n currentFunction.freeTempLocal(tempLocal);\r\n this.currentType = classInstance.type;\r\n return module.createBlock(null, initializers, nativeSizeType);\r\n }\r\n\r\n /** Makes a conditional allocation expression inside of the constructor of the specified class. */\r\n makeConditionalAllocate(classInstance: Class, reportNode: Node): ExpressionRef {\r\n // requires that `this` is the first local\r\n var module = this.module;\r\n var nativeSizeType = this.options.nativeSizeType;\r\n this.currentType = classInstance.type;\r\n return module.createIf(\r\n nativeSizeType == NativeType.I64\r\n ? module.createBinary(\r\n BinaryOp.NeI64,\r\n module.createGetLocal(0, NativeType.I64),\r\n module.createI64(0)\r\n )\r\n : module.createGetLocal(0, NativeType.I32),\r\n module.createGetLocal(0, nativeSizeType),\r\n module.createTeeLocal(0,\r\n this.makeAllocate(classInstance, reportNode)\r\n )\r\n );\r\n }\r\n\r\n /** Adds the debug location of the specified expression at the specified range to the source map. */\r\n addDebugLocation(expr: ExpressionRef, range: Range): void {\r\n var currentFunction = this.currentFunction;\r\n var source = range.source;\r\n if (source.debugInfoIndex < 0) source.debugInfoIndex = this.module.addDebugInfoFile(source.normalizedPath);\r\n range.debugInfoRef = expr;\r\n currentFunction.debugLocations.push(range);\r\n }\r\n}\r\n\r\n// helpers\r\n\r\nfunction mangleImportName(\r\n element: Element,\r\n declaration: DeclarationStatement\r\n): void {\r\n // by default, use the file name as the module name\r\n mangleImportName_moduleName = declaration.range.source.simplePath;\r\n // and the internal name of the element within that file as the element name\r\n mangleImportName_elementName = declaration.programLevelInternalName;\r\n\r\n if (!element.hasDecorator(DecoratorFlags.EXTERNAL)) return;\r\n\r\n var program = element.program;\r\n var decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\r\n var args = decorator.arguments;\r\n if (args && args.length) {\r\n let arg = args[0];\r\n // if one argument is given, override just the element name\r\n // if two arguments are given, override both module and element name\r\n if (arg.kind == NodeKind.LITERAL && (arg).literalKind == LiteralKind.STRING) {\r\n mangleImportName_elementName = (arg).value;\r\n if (args.length >= 2) {\r\n arg = args[1];\r\n if (arg.kind == NodeKind.LITERAL && (arg).literalKind == LiteralKind.STRING) {\r\n mangleImportName_moduleName = mangleImportName_elementName;\r\n mangleImportName_elementName = (arg).value;\r\n if (args.length > 2) {\r\n program.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n decorator.range, \"2\", args.length.toString()\r\n );\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.String_literal_expected,\r\n arg.range\r\n );\r\n }\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.String_literal_expected,\r\n arg.range\r\n );\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n decorator.range, \"1\", \"0\"\r\n );\r\n }\r\n}\r\n\r\nvar mangleImportName_moduleName: string;\r\nvar mangleImportName_elementName: string;\r\n","/**\r\n * Generated from diagnosticsMessages.json. Do not edit.\r\n * @module diagnostics\r\n *//***/\r\n\r\n/* tslint:disable:max-line-length */\r\n\r\n/** Enum of available diagnostic codes. */\r\nexport enum DiagnosticCode {\r\n Operation_not_supported = 100,\r\n Operation_is_unsafe = 101,\r\n User_defined_0 = 102,\r\n Conversion_from_type_0_to_1_requires_an_explicit_cast = 200,\r\n Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit = 201,\r\n Type_0_cannot_be_changed_to_type_1 = 202,\r\n Type_0_cannot_be_reinterpreted_as_type_1 = 203,\r\n Basic_type_0_cannot_be_nullable = 204,\r\n Cannot_export_a_mutable_global = 205,\r\n Compiling_constant_with_non_constant_initializer_as_mutable = 206,\r\n Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa = 207,\r\n Unmanaged_classes_cannot_implement_interfaces = 208,\r\n Invalid_regular_expression_flags = 209,\r\n Implementation_0_must_match_the_signature_1 = 210,\r\n Class_0_is_sealed_and_cannot_be_extended = 211,\r\n Decorator_0_is_not_valid_here = 212,\r\n Duplicate_decorator = 213,\r\n An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf = 214,\r\n Optional_parameter_must_have_an_initializer = 215,\r\n Constructor_of_class_0_must_not_require_any_arguments = 216,\r\n Function_0_cannot_be_inlined_into_itself = 217,\r\n Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set = 218,\r\n Optional_properties_are_not_supported = 219,\r\n Unterminated_string_literal = 1002,\r\n Identifier_expected = 1003,\r\n _0_expected = 1005,\r\n A_file_cannot_have_a_reference_to_itself = 1006,\r\n Trailing_comma_not_allowed = 1009,\r\n Unexpected_token = 1012,\r\n A_rest_parameter_must_be_last_in_a_parameter_list = 1014,\r\n Parameter_cannot_have_question_mark_and_initializer = 1015,\r\n A_required_parameter_cannot_follow_an_optional_parameter = 1016,\r\n Statements_are_not_allowed_in_ambient_contexts = 1036,\r\n Initializers_are_not_allowed_in_ambient_contexts = 1039,\r\n _0_modifier_cannot_be_used_here = 1042,\r\n A_rest_parameter_cannot_be_optional = 1047,\r\n A_rest_parameter_cannot_have_an_initializer = 1048,\r\n A_set_accessor_must_have_exactly_one_parameter = 1049,\r\n A_set_accessor_parameter_cannot_have_an_initializer = 1052,\r\n A_get_accessor_cannot_have_parameters = 1054,\r\n Enum_member_must_have_initializer = 1061,\r\n Type_parameters_cannot_appear_on_a_constructor_declaration = 1092,\r\n Type_annotation_cannot_appear_on_a_constructor_declaration = 1093,\r\n An_accessor_cannot_have_type_parameters = 1094,\r\n A_set_accessor_cannot_have_a_return_type_annotation = 1095,\r\n Type_parameter_list_cannot_be_empty = 1098,\r\n A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement = 1104,\r\n A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement = 1105,\r\n A_return_statement_can_only_be_used_within_a_function_body = 1108,\r\n Expression_expected = 1109,\r\n Type_expected = 1110,\r\n A_default_clause_cannot_appear_more_than_once_in_a_switch_statement = 1113,\r\n Duplicate_label_0 = 1114,\r\n Octal_literals_are_not_allowed_in_strict_mode = 1121,\r\n Digit_expected = 1124,\r\n Hexadecimal_digit_expected = 1125,\r\n Unexpected_end_of_text = 1126,\r\n Invalid_character = 1127,\r\n _case_or_default_expected = 1130,\r\n A_declare_modifier_cannot_be_used_in_an_already_ambient_context = 1038,\r\n Type_argument_expected = 1140,\r\n String_literal_expected = 1141,\r\n Line_break_not_permitted_here = 1142,\r\n Declaration_expected = 1146,\r\n _const_declarations_must_be_initialized = 1155,\r\n Unterminated_regular_expression_literal = 1161,\r\n Interface_declaration_cannot_have_implements_clause = 1176,\r\n Binary_digit_expected = 1177,\r\n Octal_digit_expected = 1178,\r\n An_implementation_cannot_be_declared_in_ambient_contexts = 1183,\r\n An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive = 1198,\r\n Unterminated_Unicode_escape_sequence = 1199,\r\n Decorators_are_not_valid_here = 1206,\r\n _abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration = 1242,\r\n Method_0_cannot_have_an_implementation_because_it_is_marked_abstract = 1245,\r\n A_definite_assignment_assertion_is_not_permitted_in_this_context = 1255,\r\n A_class_may_only_extend_another_class = 1311,\r\n A_parameter_property_cannot_be_declared_using_a_rest_parameter = 1317,\r\n Duplicate_identifier_0 = 2300,\r\n Cannot_find_name_0 = 2304,\r\n Module_0_has_no_exported_member_1 = 2305,\r\n Generic_type_0_requires_1_type_argument_s = 2314,\r\n Type_0_is_not_generic = 2315,\r\n Type_0_is_not_assignable_to_type_1 = 2322,\r\n Index_signature_is_missing_in_type_0 = 2329,\r\n _this_cannot_be_referenced_in_current_location = 2332,\r\n _super_can_only_be_referenced_in_a_derived_class = 2335,\r\n Property_0_does_not_exist_on_type_1 = 2339,\r\n Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures = 2349,\r\n Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature = 2351,\r\n A_function_whose_declared_type_is_not_void_must_return_a_value = 2355,\r\n The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access = 2357,\r\n The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access = 2364,\r\n Operator_0_cannot_be_applied_to_types_1_and_2 = 2365,\r\n _get_and_set_accessor_must_have_the_same_type = 2380,\r\n Constructor_implementation_is_missing = 2390,\r\n Function_implementation_is_missing_or_not_immediately_following_the_declaration = 2391,\r\n Multiple_constructor_implementations_are_not_allowed = 2392,\r\n Duplicate_function_implementation = 2393,\r\n Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local = 2395,\r\n Type_0_has_no_property_1 = 2460,\r\n The_0_operator_cannot_be_applied_to_type_1 = 2469,\r\n In_const_enum_declarations_member_initializer_must_be_constant_expression = 2474,\r\n Export_declaration_conflicts_with_exported_declaration_of_0 = 2484,\r\n Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property = 2540,\r\n The_target_of_an_assignment_must_be_a_variable_or_a_property_access = 2541,\r\n Index_signature_in_type_0_only_permits_reading = 2542,\r\n Expected_0_arguments_but_got_1 = 2554,\r\n Expected_at_least_0_arguments_but_got_1 = 2555,\r\n Expected_0_type_arguments_but_got_1 = 2558,\r\n A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums = 2651,\r\n Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration = 2673,\r\n Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration = 2674,\r\n Namespace_0_has_no_exported_member_1 = 2694,\r\n Required_type_parameters_may_not_follow_optional_type_parameters = 2706,\r\n File_0_not_found = 6054,\r\n Numeric_separators_are_not_allowed_here = 6188,\r\n Multiple_consecutive_numeric_separators_are_not_permitted = 6189\r\n}\r\n\r\n/** Translates a diagnostic code to its respective string. */\r\nexport function diagnosticCodeToString(code: DiagnosticCode): string {\r\n switch (code) {\r\n case 100: return \"Operation not supported.\";\r\n case 101: return \"Operation is unsafe.\";\r\n case 102: return \"User-defined: {0}\";\r\n case 200: return \"Conversion from type '{0}' to '{1}' requires an explicit cast.\";\r\n case 201: return \"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.\";\r\n case 202: return \"Type '{0}' cannot be changed to type '{1}'.\";\r\n case 203: return \"Type '{0}' cannot be reinterpreted as type '{1}'.\";\r\n case 204: return \"Basic type '{0}' cannot be nullable.\";\r\n case 205: return \"Cannot export a mutable global.\";\r\n case 206: return \"Compiling constant with non-constant initializer as mutable.\";\r\n case 207: return \"Unmanaged classes cannot extend managed classes and vice-versa.\";\r\n case 208: return \"Unmanaged classes cannot implement interfaces.\";\r\n case 209: return \"Invalid regular expression flags.\";\r\n case 210: return \"Implementation '{0}' must match the signature '{1}'.\";\r\n case 211: return \"Class '{0}' is sealed and cannot be extended.\";\r\n case 212: return \"Decorator '{0}' is not valid here.\";\r\n case 213: return \"Duplicate decorator.\";\r\n case 214: return \"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.\";\r\n case 215: return \"Optional parameter must have an initializer.\";\r\n case 216: return \"Constructor of class '{0}' must not require any arguments.\";\r\n case 217: return \"Function '{0}' cannot be inlined into itself.\";\r\n case 218: return \"Cannot access method '{0}' without calling it as it requires 'this' to be set.\";\r\n case 219: return \"Optional properties are not supported.\";\r\n case 1002: return \"Unterminated string literal.\";\r\n case 1003: return \"Identifier expected.\";\r\n case 1005: return \"'{0}' expected.\";\r\n case 1006: return \"A file cannot have a reference to itself.\";\r\n case 1009: return \"Trailing comma not allowed.\";\r\n case 1012: return \"Unexpected token.\";\r\n case 1014: return \"A rest parameter must be last in a parameter list.\";\r\n case 1015: return \"Parameter cannot have question mark and initializer.\";\r\n case 1016: return \"A required parameter cannot follow an optional parameter.\";\r\n case 1036: return \"Statements are not allowed in ambient contexts.\";\r\n case 1039: return \"Initializers are not allowed in ambient contexts.\";\r\n case 1042: return \"'{0}' modifier cannot be used here.\";\r\n case 1047: return \"A rest parameter cannot be optional.\";\r\n case 1048: return \"A rest parameter cannot have an initializer.\";\r\n case 1049: return \"A 'set' accessor must have exactly one parameter.\";\r\n case 1052: return \"A 'set' accessor parameter cannot have an initializer.\";\r\n case 1054: return \"A 'get' accessor cannot have parameters.\";\r\n case 1061: return \"Enum member must have initializer.\";\r\n case 1092: return \"Type parameters cannot appear on a constructor declaration.\";\r\n case 1093: return \"Type annotation cannot appear on a constructor declaration.\";\r\n case 1094: return \"An accessor cannot have type parameters.\";\r\n case 1095: return \"A 'set' accessor cannot have a return type annotation.\";\r\n case 1098: return \"Type parameter list cannot be empty.\";\r\n case 1104: return \"A 'continue' statement can only be used within an enclosing iteration statement.\";\r\n case 1105: return \"A 'break' statement can only be used within an enclosing iteration or switch statement.\";\r\n case 1108: return \"A 'return' statement can only be used within a function body.\";\r\n case 1109: return \"Expression expected.\";\r\n case 1110: return \"Type expected.\";\r\n case 1113: return \"A 'default' clause cannot appear more than once in a 'switch' statement.\";\r\n case 1114: return \"Duplicate label '{0}'.\";\r\n case 1121: return \"Octal literals are not allowed in strict mode.\";\r\n case 1124: return \"Digit expected.\";\r\n case 1125: return \"Hexadecimal digit expected.\";\r\n case 1126: return \"Unexpected end of text.\";\r\n case 1127: return \"Invalid character.\";\r\n case 1130: return \"'case' or 'default' expected.\";\r\n case 1038: return \"A 'declare' modifier cannot be used in an already ambient context.\";\r\n case 1140: return \"Type argument expected.\";\r\n case 1141: return \"String literal expected.\";\r\n case 1142: return \"Line break not permitted here.\";\r\n case 1146: return \"Declaration expected.\";\r\n case 1155: return \"'const' declarations must be initialized.\";\r\n case 1161: return \"Unterminated regular expression literal.\";\r\n case 1176: return \"Interface declaration cannot have 'implements' clause.\";\r\n case 1177: return \"Binary digit expected.\";\r\n case 1178: return \"Octal digit expected.\";\r\n case 1183: return \"An implementation cannot be declared in ambient contexts.\";\r\n case 1198: return \"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.\";\r\n case 1199: return \"Unterminated Unicode escape sequence.\";\r\n case 1206: return \"Decorators are not valid here.\";\r\n case 1242: return \"'abstract' modifier can only appear on a class, method, or property declaration.\";\r\n case 1245: return \"Method '{0}' cannot have an implementation because it is marked abstract.\";\r\n case 1255: return \"A definite assignment assertion '!' is not permitted in this context.\";\r\n case 1311: return \"A class may only extend another class.\";\r\n case 1317: return \"A parameter property cannot be declared using a rest parameter.\";\r\n case 2300: return \"Duplicate identifier '{0}'.\";\r\n case 2304: return \"Cannot find name '{0}'.\";\r\n case 2305: return \"Module '{0}' has no exported member '{1}'.\";\r\n case 2314: return \"Generic type '{0}' requires {1} type argument(s).\";\r\n case 2315: return \"Type '{0}' is not generic.\";\r\n case 2322: return \"Type '{0}' is not assignable to type '{1}'.\";\r\n case 2329: return \"Index signature is missing in type '{0}'.\";\r\n case 2332: return \"'this' cannot be referenced in current location.\";\r\n case 2335: return \"'super' can only be referenced in a derived class.\";\r\n case 2339: return \"Property '{0}' does not exist on type '{1}'.\";\r\n case 2349: return \"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.\";\r\n case 2351: return \"Cannot use 'new' with an expression whose type lacks a construct signature.\";\r\n case 2355: return \"A function whose declared type is not 'void' must return a value.\";\r\n case 2357: return \"The operand of an increment or decrement operator must be a variable or a property access.\";\r\n case 2364: return \"The left-hand side of an assignment expression must be a variable or a property access.\";\r\n case 2365: return \"Operator '{0}' cannot be applied to types '{1}' and '{2}'.\";\r\n case 2380: return \"'get' and 'set' accessor must have the same type.\";\r\n case 2390: return \"Constructor implementation is missing.\";\r\n case 2391: return \"Function implementation is missing or not immediately following the declaration.\";\r\n case 2392: return \"Multiple constructor implementations are not allowed.\";\r\n case 2393: return \"Duplicate function implementation.\";\r\n case 2395: return \"Individual declarations in merged declaration '{0}' must be all exported or all local.\";\r\n case 2460: return \"Type '{0}' has no property '{1}'.\";\r\n case 2469: return \"The '{0}' operator cannot be applied to type '{1}'.\";\r\n case 2474: return \"In 'const' enum declarations member initializer must be constant expression.\";\r\n case 2484: return \"Export declaration conflicts with exported declaration of '{0}'.\";\r\n case 2540: return \"Cannot assign to '{0}' because it is a constant or a read-only property.\";\r\n case 2541: return \"The target of an assignment must be a variable or a property access.\";\r\n case 2542: return \"Index signature in type '{0}' only permits reading.\";\r\n case 2554: return \"Expected {0} arguments, but got {1}.\";\r\n case 2555: return \"Expected at least {0} arguments, but got {1}.\";\r\n case 2558: return \"Expected {0} type arguments, but got {1}.\";\r\n case 2651: return \"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.\";\r\n case 2673: return \"Constructor of class '{0}' is private and only accessible within the class declaration.\";\r\n case 2674: return \"Constructor of class '{0}' is protected and only accessible within the class declaration.\";\r\n case 2694: return \"Namespace '{0}' has no exported member '{1}'.\";\r\n case 2706: return \"Required type parameters may not follow optional type parameters.\";\r\n case 6054: return \"File '{0}' not found.\";\r\n case 6188: return \"Numeric separators are not allowed here.\";\r\n case 6189: return \"Multiple consecutive numeric separators are not permitted.\";\r\n default: return \"\";\r\n }\r\n}\r\n","/**\r\n * Resolve infrastructure to obtain types and elements.\r\n * @module resolver\r\n *//***/\r\n\r\nimport {\r\n DiagnosticEmitter,\r\n DiagnosticCode\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Program,\r\n ElementKind,\r\n OperatorKind,\r\n FlowFlags,\r\n\r\n Element,\r\n Class,\r\n ClassPrototype,\r\n Function,\r\n FunctionTarget,\r\n FunctionPrototype,\r\n VariableLikeElement,\r\n Property,\r\n DecoratorFlags,\r\n FieldPrototype,\r\n Field,\r\n Global\r\n} from \"./program\";\r\n\r\nimport {\r\n SignatureNode,\r\n ParameterKind,\r\n CommonTypeNode,\r\n NodeKind,\r\n TypeNode,\r\n TypeParameterNode,\r\n Node,\r\n Range,\r\n IdentifierExpression,\r\n CallExpression,\r\n ElementAccessExpression,\r\n PropertyAccessExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n ParenthesizedExpression,\r\n AssertionExpression,\r\n Expression,\r\n IntegerLiteralExpression,\r\n UnaryPrefixExpression,\r\n UnaryPostfixExpression\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n Signature,\r\n typesToString,\r\n TypeKind,\r\n TypeFlags\r\n} from \"./types\";\r\n\r\nimport {\r\n PATH_DELIMITER,\r\n INSTANCE_DELIMITER,\r\n CommonFlags\r\n} from \"./common\";\r\n\r\nimport {\r\n makeMap\r\n} from \"./util\";\r\n\r\nimport {\r\n Token\r\n} from \"./tokenizer\";\r\n\r\n/** Indicates whether errors are reported or not. */\r\nexport enum ReportMode {\r\n /** Report errors. */\r\n REPORT,\r\n /** Swallow errors. */\r\n SWALLOW\r\n}\r\n\r\n/** Provides tools to resolve types and expressions. */\r\nexport class Resolver extends DiagnosticEmitter {\r\n\r\n /** The program this resolver belongs to. */\r\n program: Program;\r\n\r\n /** Target expression of the previously resolved property or element access. */\r\n currentThisExpression: Expression | null = null;\r\n /** Element expression of the previously resolved element access. */\r\n currentElementExpression : Expression | null = null;\r\n\r\n /** Constructs the resolver for the specified program. */\r\n constructor(program: Program) {\r\n super(program.diagnostics);\r\n this.program = program;\r\n }\r\n\r\n /** Resolves a {@link CommonTypeNode} to a concrete {@link Type}. */\r\n resolveType(\r\n node: CommonTypeNode,\r\n contextualTypeArguments: Map | null = null,\r\n reportMode = ReportMode.REPORT\r\n ): Type | null {\r\n\r\n // handle signatures specifically\r\n if (node.kind == NodeKind.SIGNATURE) {\r\n let signature = this.resolveSignature(node, contextualTypeArguments, reportMode);\r\n if (!signature) return null;\r\n return node.isNullable ? signature.type.asNullable() : signature.type;\r\n }\r\n\r\n // now dealing with TypeNode\r\n assert(node.kind == NodeKind.TYPE);\r\n var typeNode = node;\r\n var simpleName = typeNode.name.text;\r\n var globalName = simpleName;\r\n var localName = typeNode.range.source.internalPath + PATH_DELIMITER + simpleName; // TODO cache\r\n\r\n // check file-global / program-global enum or class\r\n {\r\n let elementsLookup = this.program.elementsLookup;\r\n let element: Element | null;\r\n if (\r\n (element = elementsLookup.get(localName)) || // file-global\r\n (element = elementsLookup.get(globalName)) // program-global\r\n ) {\r\n switch (element.kind) {\r\n case ElementKind.ENUM: {\r\n if (typeNode.typeArguments !== null && typeNode.typeArguments.length) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n node.range, element.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n return Type.i32;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n let instance = this.resolveClassInclTypeArguments(\r\n element,\r\n typeNode.typeArguments,\r\n makeMap(contextualTypeArguments),\r\n node\r\n ); // reports\r\n if (!instance) return null;\r\n return node.isNullable ? instance.type.asNullable() : instance.type;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // check (global) type alias\r\n {\r\n let alias = this.program.typeAliases.get(simpleName);\r\n if (alias) return this.resolveType(alias.type, contextualTypeArguments, reportMode);\r\n }\r\n\r\n // resolve parameters\r\n var typeArgumentNodes = typeNode.typeArguments;\r\n var typeArguments: Type[] | null = null;\r\n if (typeArgumentNodes) {\r\n let numTypeArguments = typeArgumentNodes.length;\r\n typeArguments = new Array(numTypeArguments);\r\n for (let i = 0; i < numTypeArguments; ++i) {\r\n let paramType = this.resolveType( // reports\r\n typeArgumentNodes[i],\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!paramType) return null;\r\n typeArguments[i] = paramType;\r\n }\r\n if (numTypeArguments) { // can't be a placeholder if it has parameters\r\n let instanceKey = typesToString(typeArguments);\r\n if (instanceKey.length) {\r\n localName += \"<\" + instanceKey + \">\";\r\n globalName += \"<\" + instanceKey + \">\";\r\n }\r\n } else if (contextualTypeArguments) {\r\n let placeholderType = contextualTypeArguments.get(globalName);\r\n if (placeholderType) return placeholderType;\r\n }\r\n }\r\n\r\n // check file-global / program-global type\r\n {\r\n let typesLookup = this.program.typesLookup;\r\n let type: Type | null;\r\n if (\r\n (type = typesLookup.get(localName)) ||\r\n (type = typesLookup.get(globalName))\r\n ) {\r\n return type;\r\n }\r\n }\r\n\r\n // check built-in macro types\r\n if (simpleName == \"NATIVE\") {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n typeNode.range, \"1\", (typeArgumentNodes ? typeArgumentNodes.length : 1).toString(10)\r\n );\r\n }\r\n return null;\r\n }\r\n switch (typeArguments[0].kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: return Type.i32;\r\n case TypeKind.ISIZE: if (!this.program.options.isWasm64) return Type.i32;\r\n case TypeKind.I64: return Type.i64;\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: return Type.u32;\r\n case TypeKind.USIZE: if (!this.program.options.isWasm64) return Type.u32;\r\n case TypeKind.U64: return Type.u64;\r\n case TypeKind.F32: return Type.f32;\r\n case TypeKind.F64: return Type.f64;\r\n case TypeKind.VOID: return Type.void;\r\n default: assert(false);\r\n }\r\n }\r\n\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n typeNode.name.range, globalName\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a {@link SignatureNode} to a concrete {@link Signature}. */\r\n resolveSignature(\r\n node: SignatureNode,\r\n contextualTypeArguments: Map | null = null,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Signature | null {\r\n var explicitThisType = node.explicitThisType;\r\n var thisType: Type | null = null;\r\n if (explicitThisType) {\r\n thisType = this.resolveType(explicitThisType, contextualTypeArguments, reportMode);\r\n if (!thisType) return null;\r\n }\r\n var parameterTypeNodes = node.parameters;\r\n var numParameters = parameterTypeNodes.length;\r\n var parameterTypes = new Array(numParameters);\r\n var parameterNames = new Array(numParameters);\r\n var requiredParameters = 0;\r\n var hasRest = false;\r\n for (let i = 0; i < numParameters; ++i) {\r\n let parameterTypeNode = parameterTypeNodes[i];\r\n switch (parameterTypeNode.parameterKind) {\r\n case ParameterKind.DEFAULT: {\r\n requiredParameters = i + 1;\r\n break;\r\n }\r\n case ParameterKind.REST: {\r\n assert(i == numParameters);\r\n hasRest = true;\r\n break;\r\n }\r\n }\r\n let parameterType = this.resolveType(\r\n assert(parameterTypeNode.type),\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!parameterType) return null;\r\n parameterTypes[i] = parameterType;\r\n parameterNames[i] = parameterTypeNode.name.text;\r\n }\r\n var returnTypeNode = node.returnType;\r\n var returnType: Type | null;\r\n if (returnTypeNode) {\r\n returnType = this.resolveType(returnTypeNode, contextualTypeArguments, reportMode);\r\n if (!returnType) return null;\r\n } else {\r\n returnType = Type.void;\r\n }\r\n var signature = new Signature(parameterTypes, returnType, thisType);\r\n signature.parameterNames = parameterNames;\r\n signature.requiredParameters = requiredParameters;\r\n signature.hasRest = hasRest;\r\n return signature;\r\n }\r\n\r\n /** Resolves an array of type arguments to concrete types. */\r\n resolveTypeArguments(\r\n typeParameters: TypeParameterNode[],\r\n typeArgumentNodes: CommonTypeNode[] | null,\r\n contextualTypeArguments: Map,\r\n alternativeReportNode: Node | null = null,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Type[] | null {\r\n var minParameterCount = 0;\r\n var maxParameterCount = 0;\r\n for (let i = 0; i < typeParameters.length; ++i) {\r\n if (!typeParameters[i].defaultType) ++minParameterCount;\r\n ++maxParameterCount;\r\n }\r\n var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;\r\n if (argumentCount < minParameterCount || argumentCount > maxParameterCount) {\r\n this.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n argumentCount\r\n ? Range.join(\r\n (typeArgumentNodes)[0].range,\r\n (typeArgumentNodes)[argumentCount - 1].range\r\n )\r\n : assert(alternativeReportNode).range.atEnd,\r\n (argumentCount < minParameterCount ? minParameterCount : maxParameterCount).toString(10),\r\n argumentCount.toString(10)\r\n );\r\n return null;\r\n }\r\n var typeArguments = new Array(maxParameterCount);\r\n for (let i = 0; i < maxParameterCount; ++i) {\r\n let type = i < argumentCount\r\n ? this.resolveType( // reports\r\n (typeArgumentNodes)[i],\r\n contextualTypeArguments,\r\n reportMode\r\n )\r\n : this.resolveType( // reports\r\n assert(typeParameters[i].defaultType),\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!type) return null;\r\n // TODO: check extendsType\r\n contextualTypeArguments.set(typeParameters[i].name.text, type);\r\n typeArguments[i] = type;\r\n }\r\n return typeArguments;\r\n }\r\n\r\n /** Resolves an identifier to the element it refers to. */\r\n resolveIdentifier(\r\n identifier: IdentifierExpression,\r\n context: Element | null,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n var name = identifier.text;\r\n var element: Element | null;\r\n\r\n if (context) {\r\n\r\n switch (context.kind) {\r\n case ElementKind.FUNCTION: { // search locals, use prototype\r\n element = (context).flow.getScopedLocal(name);\r\n if (element) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return element;\r\n }\r\n context = (context).prototype.parent;\r\n break;\r\n }\r\n case ElementKind.CLASS: { // use prototype\r\n context = (context).prototype.parent;\r\n break;\r\n }\r\n }\r\n\r\n // search context\r\n while (context) {\r\n let members = context.members;\r\n if (members) {\r\n if (element = members.get(name)) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return element;\r\n }\r\n }\r\n context = context.parent;\r\n }\r\n }\r\n\r\n // search current file\r\n var elementsLookup = this.program.elementsLookup;\r\n if (element = elementsLookup.get(identifier.range.source.internalPath + PATH_DELIMITER + name)) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE\r\n }\r\n\r\n // search global scope\r\n if (element = elementsLookup.get(name)) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE\r\n }\r\n\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n identifier.range, name\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a lazily compiled global, i.e. a static class field. */\r\n ensureResolvedLazyGlobal(global: Global, reportMode: ReportMode = ReportMode.REPORT): bool {\r\n if (global.is(CommonFlags.RESOLVED)) return true;\r\n var resolveType = assert(global.declaration).type;\r\n if (!resolveType) return false;\r\n var resolvedType = this.resolveType(resolveType, null, reportMode);\r\n if (!resolvedType) return false;\r\n global.type = resolvedType;\r\n global.set(CommonFlags.RESOLVED);\r\n return true;\r\n }\r\n\r\n /** Resolves a property access to the element it refers to. */\r\n resolvePropertyAccess(\r\n propertyAccess: PropertyAccessExpression,\r\n contextualFunction: Function,\r\n contextualType: Type,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n // start by resolving the lhs target (expression before the last dot)\r\n var targetExpression = propertyAccess.expression;\r\n var target = this.resolveExpression(targetExpression, contextualFunction, contextualType, reportMode); // reports\r\n if (!target) return null;\r\n\r\n // at this point we know exactly what the target is, so look up the element within\r\n var propertyName = propertyAccess.property.text;\r\n\r\n // Resolve variable-likes to the class type they reference first\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL: if (!this.ensureResolvedLazyGlobal(target, reportMode)) return null;\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD: {\r\n let type = (target).type;\r\n assert(type != Type.void);\r\n let classReference = type.classReference;\r\n if (!classReference) {\r\n let basicClasses = this.program.basicClasses;\r\n if (!type.is(TypeFlags.REFERENCE) && basicClasses.has(type.kind)) {\r\n classReference = assert(basicClasses.get(type.kind));\r\n } else {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, (target).type.toString()\r\n );\r\n return null;\r\n }\r\n }\r\n target = classReference;\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let getter = this.resolveFunction(\r\n assert((target).getterPrototype),\r\n null,\r\n makeMap(),\r\n reportMode\r\n );\r\n if (!getter) return null;\r\n let classReference = getter.signature.returnType.classReference;\r\n if (!classReference) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, getter.signature.returnType.toString()\r\n );\r\n return null;\r\n }\r\n target = classReference;\r\n break;\r\n }\r\n case ElementKind.CLASS: {\r\n let elementExpression = this.currentElementExpression;\r\n if (elementExpression) {\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET);\r\n if (!indexedGet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n elementExpression.range, (target).internalName\r\n );\r\n return null;\r\n }\r\n let returnType = indexedGet.signature.returnType;\r\n if (!(target = returnType.classReference)) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, returnType.toString()\r\n );\r\n return null;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Look up the member within\r\n switch (target.kind) {\r\n case ElementKind.CLASS_PROTOTYPE:\r\n case ElementKind.CLASS: {\r\n do {\r\n let members = target.members;\r\n let member: Element | null;\r\n if (members && (member = members.get(propertyName))) {\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = null;\r\n return member; // instance FIELD, static GLOBAL, FUNCTION_PROTOTYPE...\r\n }\r\n // traverse inherited static members on the base prototype if target is a class prototype\r\n if (target.kind == ElementKind.CLASS_PROTOTYPE) {\r\n if ((target).basePrototype) {\r\n target = (target).basePrototype;\r\n } else {\r\n break;\r\n }\r\n // traverse inherited instance members on the base class if target is a class instance\r\n } else if (target.kind == ElementKind.CLASS) {\r\n if ((target).base) {\r\n target = (target).base;\r\n } else {\r\n break;\r\n }\r\n } else {\r\n break;\r\n }\r\n } while (true);\r\n break;\r\n }\r\n default: { // enums or other namespace-like elements\r\n let members = target.members;\r\n if (members) {\r\n let member = members.get(propertyName);\r\n if (member) {\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = null;\r\n return member; // static ENUMVALUE, static GLOBAL, static FUNCTION_PROTOTYPE...\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, target.internalName\r\n );\r\n return null;\r\n }\r\n\r\n resolveElementAccess(\r\n elementAccess: ElementAccessExpression,\r\n contextualFunction: Function,\r\n contextualType: Type,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n var targetExpression = elementAccess.expression;\r\n var target = this.resolveExpression(targetExpression, contextualFunction, contextualType, reportMode);\r\n if (!target) return null;\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL: if (!this.ensureResolvedLazyGlobal(target, reportMode)) return null;\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD: {\r\n let type = (target).type;\r\n if (target = type.classReference) {\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = elementAccess.elementExpression;\r\n return target;\r\n }\r\n break;\r\n }\r\n case ElementKind.CLASS: {\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET);\r\n if (!indexedGet) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n elementAccess.range, (target).internalName\r\n );\r\n }\r\n return null;\r\n }\r\n if (targetExpression.kind == NodeKind.ELEMENTACCESS) { // nested element access\r\n let returnType = indexedGet.signature.returnType;\r\n if (target = returnType.classReference) {\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = elementAccess.elementExpression;\r\n return target;\r\n }\r\n return null;\r\n }\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = elementAccess.elementExpression;\r\n return target;\r\n }\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n targetExpression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n determineIntegerLiteralType(\r\n intValue: I64,\r\n contextualType: Type\r\n ): Type {\r\n\r\n if (!contextualType.is(TypeFlags.REFERENCE)) {\r\n // compile to contextualType if matching\r\n switch (contextualType.kind) {\r\n case TypeKind.I8: {\r\n if (i64_is_i8(intValue)) return Type.i8;\r\n break;\r\n }\r\n case TypeKind.U8: {\r\n if (i64_is_u8(intValue)) return Type.u8;\r\n break;\r\n }\r\n case TypeKind.I16: {\r\n if (i64_is_i16(intValue)) return Type.i16;\r\n break;\r\n }\r\n case TypeKind.U16: {\r\n if (i64_is_u16(intValue)) return Type.u16;\r\n break;\r\n }\r\n case TypeKind.I32: {\r\n if (i64_is_i32(intValue)) return Type.i32;\r\n break;\r\n }\r\n case TypeKind.U32: {\r\n if (i64_is_u32(intValue)) return Type.u32;\r\n break;\r\n }\r\n case TypeKind.BOOL: {\r\n if (i64_is_bool(intValue)) return Type.bool;\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n if (!this.program.options.isWasm64) {\r\n if (i64_is_i32(intValue)) return Type.isize32;\r\n break;\r\n }\r\n return Type.isize64;\r\n }\r\n case TypeKind.USIZE: {\r\n if (!this.program.options.isWasm64) {\r\n if (i64_is_u32(intValue)) return Type.usize32;\r\n break;\r\n }\r\n return Type.usize64;\r\n }\r\n case TypeKind.I64: return Type.i64;\r\n case TypeKind.U64: return Type.u64;\r\n case TypeKind.F32: return Type.f32;\r\n case TypeKind.F64: return Type.f64;\r\n case TypeKind.VOID: break; // best fitting below\r\n default: assert(false);\r\n }\r\n }\r\n\r\n // otherwise compile to best fitting native type\r\n if (i64_is_i32(intValue)) return Type.i32;\r\n if (i64_is_u32(intValue)) return Type.u32;\r\n return Type.i64;\r\n }\r\n\r\n resolveExpression(\r\n expression: Expression,\r\n contextualFunction: Function,\r\n contextualType: Type = Type.void,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n while (expression.kind == NodeKind.PARENTHESIZED) {\r\n expression = (expression).expression;\r\n }\r\n switch (expression.kind) {\r\n case NodeKind.ASSERTION: {\r\n let type = this.resolveType(\r\n (expression).toType,\r\n contextualFunction.flow.contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!type) return null;\r\n let classType = type.classReference;\r\n if (!classType) return null;\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return classType;\r\n }\r\n case NodeKind.UNARYPREFIX: {\r\n // TODO: overloads\r\n switch ((expression).operator) {\r\n case Token.MINUS: {\r\n let operand = (expression).operand;\r\n // implicitly negate if an integer literal to distinguish between i32/u32/i64\r\n if (operand.kind == NodeKind.LITERAL && (operand).literalKind == LiteralKind.INTEGER) {\r\n let type = this.determineIntegerLiteralType(\r\n i64_sub(i64_zero, (operand).value),\r\n contextualType\r\n );\r\n return assert(this.program.basicClasses.get(type.kind));\r\n }\r\n return this.resolveExpression(\r\n operand,\r\n contextualFunction,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n case Token.PLUS:\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS: {\r\n return this.resolveExpression(\r\n (expression).operand,\r\n contextualFunction,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n case Token.EXCLAMATION: {\r\n return assert(this.program.basicClasses.get(TypeKind.BOOL));\r\n }\r\n case Token.TILDE: {\r\n let resolvedOperand = this.resolveExpression(\r\n (expression).operand,\r\n contextualFunction,\r\n contextualType,\r\n reportMode\r\n );\r\n if (!resolvedOperand) return null;\r\n throw new Error(\"not implemented\"); // TODO: should all elements have a corresponding type right away?\r\n }\r\n default: assert(false);\r\n }\r\n return null;\r\n }\r\n case NodeKind.UNARYPOSTFIX: {\r\n // TODO: overloads\r\n switch ((expression).operator) {\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS: {\r\n return this.resolveExpression(\r\n (expression).operand,\r\n contextualFunction,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n default: assert(false);\r\n }\r\n return null;\r\n }\r\n case NodeKind.BINARY: {\r\n // TODO: all sorts of unary and binary expressions, which means looking up overloads and\r\n // evaluating their return types, knowing the semantics of different operators etc.\r\n // should probably share that code with the compiler somehow, as it also does exactly this.\r\n throw new Error(\"not implemented\");\r\n }\r\n case NodeKind.THIS: { // -> Class / ClassPrototype\r\n if (contextualFunction.flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n let explicitLocal = contextualFunction.flow.getScopedLocal(\"this\");\r\n if (explicitLocal) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return explicitLocal;\r\n }\r\n }\r\n let parent = contextualFunction.parent;\r\n if (parent) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return parent;\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n case NodeKind.SUPER: { // -> Class\r\n if (contextualFunction.flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n let explicitLocal = contextualFunction.flow.getScopedLocal(\"super\");\r\n if (explicitLocal) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return explicitLocal;\r\n }\r\n }\r\n let parent = contextualFunction.parent;\r\n if (parent && parent.kind == ElementKind.CLASS && (parent = (parent).base)) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return parent;\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n case NodeKind.IDENTIFIER: {\r\n return this.resolveIdentifier(expression, contextualFunction, reportMode);\r\n }\r\n case NodeKind.LITERAL: {\r\n switch ((expression).literalKind) {\r\n case LiteralKind.INTEGER: {\r\n return assert(\r\n this.program.basicClasses.get(\r\n this.determineIntegerLiteralType(\r\n (expression).value,\r\n contextualType\r\n ).kind\r\n )\r\n );\r\n }\r\n case LiteralKind.FLOAT: {\r\n this.currentThisExpression = expression;\r\n this.currentElementExpression = null;\r\n return assert(\r\n this.program.basicClasses.get(\r\n contextualType == Type.f32\r\n ? TypeKind.F32\r\n : TypeKind.F64\r\n )\r\n );\r\n }\r\n case LiteralKind.STRING: {\r\n this.currentThisExpression = expression;\r\n this.currentElementExpression = null;\r\n return this.program.stringInstance;\r\n }\r\n // case LiteralKind.ARRAY: // TODO\r\n }\r\n break;\r\n }\r\n case NodeKind.PROPERTYACCESS: {\r\n return this.resolvePropertyAccess(\r\n expression,\r\n contextualFunction,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n case NodeKind.ELEMENTACCESS: {\r\n return this.resolveElementAccess(\r\n expression,\r\n contextualFunction,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n case NodeKind.CALL: {\r\n let targetExpression = (expression).expression;\r\n let target = this.resolveExpression(targetExpression, contextualFunction, contextualType, reportMode);\r\n if (!target) return null;\r\n if (target.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n let instance = this.resolveFunctionInclTypeArguments(\r\n target,\r\n (expression).typeArguments,\r\n makeMap(contextualFunction.flow.contextualTypeArguments),\r\n expression,\r\n reportMode\r\n );\r\n if (!instance) return null;\r\n let returnType = instance.signature.returnType;\r\n let classType = returnType.classReference;\r\n if (classType) {\r\n // reuse resolvedThisExpression (might be property access)\r\n // reuse resolvedElementExpression (might be element access)\r\n return classType;\r\n } else {\r\n let signature = returnType.signatureReference;\r\n if (signature) {\r\n let functionTarget = signature.cachedFunctionTarget;\r\n if (!functionTarget) {\r\n functionTarget = new FunctionTarget(this.program, signature);\r\n signature.cachedFunctionTarget = functionTarget;\r\n }\r\n // reuse resolvedThisExpression (might be property access)\r\n // reuse resolvedElementExpression (might be element access)\r\n return functionTarget;\r\n }\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n targetExpression.range, target.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n break;\r\n }\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a function prototype to an instance using the specified concrete type arguments. */\r\n resolveFunction(\r\n prototype: FunctionPrototype,\r\n typeArguments: Type[] | null,\r\n contextualTypeArguments: Map = makeMap(),\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Function | null {\r\n var classTypeArguments = prototype.classTypeArguments; // set only if partially resolved\r\n var classInstanceKey = classTypeArguments ? typesToString(classTypeArguments) : \"\";\r\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\r\n var classInstances = prototype.instances.get(classInstanceKey);\r\n if (classInstances) {\r\n let instance = classInstances.get(instanceKey);\r\n if (instance) return instance;\r\n }\r\n\r\n var declaration = prototype.declaration;\r\n var isInstance = prototype.is(CommonFlags.INSTANCE);\r\n var classPrototype = prototype.classPrototype;\r\n\r\n // apply class type arguments if a partially resolved instance method\r\n if (classTypeArguments) prototype.applyClassTypeArguments(contextualTypeArguments);\r\n\r\n // override with function specific type arguments\r\n var signatureNode = declaration.signature;\r\n var functionTypeParameters = declaration.typeParameters;\r\n var numFunctionTypeArguments: i32;\r\n if (typeArguments && (numFunctionTypeArguments = typeArguments.length)) {\r\n assert(functionTypeParameters && numFunctionTypeArguments == functionTypeParameters.length);\r\n for (let i = 0; i < numFunctionTypeArguments; ++i) {\r\n contextualTypeArguments.set(\r\n (functionTypeParameters)[i].name.text,\r\n typeArguments[i]\r\n );\r\n }\r\n } else {\r\n assert(!functionTypeParameters || functionTypeParameters.length == 0);\r\n }\r\n\r\n // resolve class if an instance method\r\n var classInstance: Class | null = null;\r\n var thisType: Type | null = null;\r\n if (isInstance) {\r\n classInstance = this.resolveClass(\r\n assert(classPrototype),\r\n classTypeArguments,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!classInstance) return null;\r\n let explicitThisType = signatureNode.explicitThisType;\r\n if (explicitThisType) {\r\n thisType = this.resolveType(explicitThisType, contextualTypeArguments, reportMode);\r\n if (!thisType) return null;\r\n } else {\r\n thisType = classInstance.type;\r\n }\r\n contextualTypeArguments.set(\"this\", thisType);\r\n } else {\r\n if (signatureNode.explicitThisType) {\r\n this.error(\r\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n signatureNode.explicitThisType.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n // resolve signature node\r\n var signatureParameters = signatureNode.parameters;\r\n var signatureParameterCount = signatureParameters.length;\r\n var parameterTypes = new Array(signatureParameterCount);\r\n var parameterNames = new Array(signatureParameterCount);\r\n var requiredParameters = 0;\r\n for (let i = 0; i < signatureParameterCount; ++i) {\r\n let parameterDeclaration = signatureParameters[i];\r\n if (parameterDeclaration.parameterKind == ParameterKind.DEFAULT) {\r\n requiredParameters = i + 1;\r\n }\r\n let typeNode = assert(parameterDeclaration.type);\r\n let parameterType = this.resolveType(typeNode, contextualTypeArguments, reportMode);\r\n if (!parameterType) return null;\r\n parameterTypes[i] = parameterType;\r\n parameterNames[i] = parameterDeclaration.name.text;\r\n }\r\n\r\n var returnType: Type;\r\n if (prototype.is(CommonFlags.SET)) {\r\n returnType = Type.void; // not annotated\r\n } else if (prototype.is(CommonFlags.CONSTRUCTOR)) {\r\n returnType = assert(classInstance).type; // not annotated\r\n } else {\r\n let typeNode = assert(signatureNode.returnType);\r\n let type = this.resolveType(typeNode, contextualTypeArguments, reportMode);\r\n if (!type) return null;\r\n returnType = type;\r\n }\r\n\r\n var signature = new Signature(parameterTypes, returnType, thisType);\r\n signature.parameterNames = parameterNames;\r\n signature.requiredParameters = requiredParameters;\r\n\r\n var internalName = prototype.internalName;\r\n if (instanceKey.length) internalName += \"<\" + instanceKey + \">\";\r\n var instance = new Function(\r\n prototype,\r\n internalName,\r\n signature,\r\n classInstance\r\n ? classInstance\r\n : classPrototype,\r\n contextualTypeArguments\r\n );\r\n if (!classInstances) prototype.instances.set(classInstanceKey, classInstances = new Map());\r\n classInstances.set(instanceKey, instance);\r\n this.program.instancesLookup.set(internalName, instance);\r\n return instance;\r\n }\r\n\r\n /** Resolves a function prototype partially by applying the specified type arguments. */\r\n resolveFunctionPartially(\r\n prototype: FunctionPrototype,\r\n typeArguments: Type[] | null,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): FunctionPrototype | null {\r\n assert(prototype.is(CommonFlags.INSTANCE));\r\n var classPrototype = assert(prototype.classPrototype);\r\n\r\n if (!(typeArguments && typeArguments.length)) return prototype; // no need to clone\r\n\r\n var simpleName = prototype.simpleName;\r\n var partialKey = typesToString(typeArguments);\r\n var partialPrototype = new FunctionPrototype(\r\n this.program,\r\n simpleName,\r\n classPrototype.internalName + \"<\" + partialKey + \">\" + INSTANCE_DELIMITER + simpleName,\r\n prototype.declaration,\r\n classPrototype,\r\n prototype.decoratorFlags\r\n );\r\n partialPrototype.flags = prototype.flags;\r\n partialPrototype.operatorKind = prototype.operatorKind;\r\n partialPrototype.classTypeArguments = typeArguments;\r\n partialPrototype.instances = prototype.instances;\r\n return partialPrototype;\r\n }\r\n\r\n /** Resolves a function prototype to an instance by first resolving the specified type arguments. */\r\n resolveFunctionInclTypeArguments(\r\n prototype: FunctionPrototype,\r\n typeArgumentNodes: CommonTypeNode[] | null,\r\n contextualTypeArguments: Map,\r\n reportNode: Node,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Function | null {\r\n var resolvedTypeArguments: Type[] | null = null;\r\n\r\n // Resolve type arguments if generic\r\n if (prototype.is(CommonFlags.GENERIC)) {\r\n\r\n // apply class type arguments if a partially resolved instance method\r\n // FIXME: this is done once more in resolveFunction. required here for resolveTypeArguments,\r\n // required there for just resolving a function no matter if a partial or not.\r\n let classTypeArguments = prototype.classTypeArguments;\r\n if (classTypeArguments) prototype.applyClassTypeArguments(contextualTypeArguments);\r\n\r\n resolvedTypeArguments = this.resolveTypeArguments( // reports\r\n assert(prototype.declaration.typeParameters),\r\n typeArgumentNodes,\r\n contextualTypeArguments,\r\n reportNode,\r\n reportMode\r\n );\r\n if (!resolvedTypeArguments) return null;\r\n\r\n // Otherwise make sure that no type arguments have been specified\r\n } else {\r\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Continue with concrete types\r\n return this.resolveFunction(\r\n prototype,\r\n resolvedTypeArguments,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n }\r\n\r\n /** Resolves a class prototype using the specified concrete type arguments. */\r\n resolveClass(\r\n prototype: ClassPrototype,\r\n typeArguments: Type[] | null,\r\n contextualTypeArguments: Map = makeMap(),\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Class | null {\r\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\r\n\r\n // Check if this exact instance has already been resolved\r\n var instance = prototype.instances.get(instanceKey);\r\n if (instance) return instance;\r\n\r\n // Insert contextual type arguments for this operation. Internally, this method is always\r\n // called with matching type parameter / argument counts.\r\n var declaration = prototype.declaration;\r\n if (typeArguments) {\r\n let typeParameters = declaration.typeParameters;\r\n let expectedTypeArguments = typeParameters.length;\r\n let actualTypeArguments = typeArguments.length;\r\n assert(actualTypeArguments == expectedTypeArguments);\r\n for (let i = 0; i < actualTypeArguments; ++i) {\r\n contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n } else {\r\n assert(declaration.typeParameters.length == 0);\r\n }\r\n\r\n // Resolve base class if applicable\r\n var baseClass: Class | null = null;\r\n if (declaration.extendsType) {\r\n let baseClassType = this.resolveType(\r\n declaration.extendsType,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!baseClassType) return null;\r\n if (!(baseClass = baseClassType.classReference)) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.program.error(\r\n DiagnosticCode.A_class_may_only_extend_another_class,\r\n declaration.extendsType.range\r\n );\r\n }\r\n return null;\r\n }\r\n if (baseClass.hasDecorator(DecoratorFlags.SEALED)) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.program.error(\r\n DiagnosticCode.Class_0_is_sealed_and_cannot_be_extended,\r\n declaration.extendsType.range, baseClass.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n if (baseClass.hasDecorator(DecoratorFlags.UNMANAGED) != prototype.hasDecorator(DecoratorFlags.UNMANAGED)) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.program.error(\r\n DiagnosticCode.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa,\r\n Range.join(declaration.name.range, declaration.extendsType.range)\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Construct the instance and remember that it has been resolved already\r\n var simpleName = prototype.simpleName;\r\n var internalName = prototype.internalName;\r\n if (instanceKey.length) {\r\n simpleName += \"<\" + instanceKey + \">\";\r\n internalName += \"<\" + instanceKey + \">\";\r\n }\r\n instance = new Class(prototype, simpleName, internalName, typeArguments, baseClass);\r\n instance.contextualTypeArguments = contextualTypeArguments;\r\n prototype.instances.set(instanceKey, instance);\r\n this.program.instancesLookup.set(internalName, instance);\r\n\r\n // Inherit base class members and set up the initial memory offset for own fields\r\n var memoryOffset: u32 = 0;\r\n if (baseClass) {\r\n if (baseClass.members) {\r\n if (!instance.members) instance.members = new Map();\r\n for (let inheritedMember of baseClass.members.values()) {\r\n instance.members.set(inheritedMember.simpleName, inheritedMember);\r\n }\r\n }\r\n memoryOffset = baseClass.currentMemoryOffset;\r\n }\r\n\r\n // Resolve constructor by first applying the class type arguments\r\n var constructorPrototype = prototype.constructorPrototype;\r\n if (constructorPrototype) {\r\n let constructorPartial = this.resolveFunctionPartially(\r\n constructorPrototype,\r\n typeArguments,\r\n reportMode\r\n );\r\n if (!constructorPartial) return null;\r\n instance.constructorInstance = this.resolveFunction(\r\n constructorPartial,\r\n null,\r\n makeMap(),\r\n reportMode\r\n );\r\n }\r\n\r\n // Resolve instance members\r\n if (prototype.instanceMembers) {\r\n for (let member of prototype.instanceMembers.values()) {\r\n switch (member.kind) {\r\n\r\n // Lay out fields in advance\r\n case ElementKind.FIELD_PROTOTYPE: {\r\n if (!instance.members) instance.members = new Map();\r\n let fieldDeclaration = (member).declaration;\r\n let fieldType: Type | null = null;\r\n // TODO: handle duplicate non-private fields\r\n if (!fieldDeclaration.type) {\r\n if (baseClass !== null && baseClass.members !== null) {\r\n let baseField = baseClass.members.get((member).simpleName);\r\n if (baseField && !baseField.is(CommonFlags.PRIVATE)) {\r\n assert(baseField.kind == ElementKind.FIELD);\r\n fieldType = (baseField).type;\r\n }\r\n }\r\n if (!fieldType) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n fieldDeclaration.name.range.atEnd\r\n );\r\n }\r\n }\r\n } else {\r\n fieldType = this.resolveType(\r\n fieldDeclaration.type,\r\n instance.contextualTypeArguments,\r\n reportMode\r\n );\r\n }\r\n if (!fieldType) break;\r\n let fieldInstance = new Field(\r\n member,\r\n internalName + INSTANCE_DELIMITER + (member).simpleName,\r\n fieldType,\r\n fieldDeclaration,\r\n instance\r\n );\r\n switch (fieldType.byteSize) { // align\r\n case 1: break;\r\n case 2: { if (memoryOffset & 1) ++memoryOffset; break; }\r\n case 4: { if (memoryOffset & 3) memoryOffset = (memoryOffset | 3) + 1; break; }\r\n case 8: { if (memoryOffset & 7) memoryOffset = (memoryOffset | 7) + 1; break; }\r\n default: assert(false);\r\n }\r\n fieldInstance.memoryOffset = memoryOffset;\r\n memoryOffset += fieldType.byteSize;\r\n instance.members.set(member.simpleName, fieldInstance);\r\n break;\r\n }\r\n\r\n // Partially resolve methods as these might have type arguments on their own\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (!instance.members) instance.members = new Map();\r\n let partialPrototype = this.resolveFunctionPartially(\r\n member,\r\n typeArguments,\r\n reportMode\r\n );\r\n if (!partialPrototype) return null;\r\n partialPrototype.internalName = internalName + INSTANCE_DELIMITER + partialPrototype.simpleName;\r\n instance.members.set(member.simpleName, partialPrototype);\r\n break;\r\n }\r\n\r\n // Clone properties and partially resolve the wrapped accessors for consistence with other methods\r\n case ElementKind.PROPERTY: {\r\n if (!instance.members) instance.members = new Map();\r\n let getterPrototype = assert((member).getterPrototype); // must be present\r\n let setterPrototype = (member).setterPrototype; // might be present\r\n let instanceProperty = new Property(\r\n this.program,\r\n member.simpleName,\r\n internalName + INSTANCE_DELIMITER + member.simpleName,\r\n prototype\r\n );\r\n let partialGetterPrototype = this.resolveFunctionPartially(\r\n getterPrototype,\r\n typeArguments,\r\n reportMode\r\n );\r\n if (!partialGetterPrototype) return null;\r\n partialGetterPrototype\r\n .internalName = internalName + INSTANCE_DELIMITER + partialGetterPrototype.simpleName;\r\n instanceProperty.getterPrototype = partialGetterPrototype;\r\n if (setterPrototype) {\r\n let partialSetterPrototype = this.resolveFunctionPartially(\r\n setterPrototype,\r\n typeArguments,\r\n reportMode\r\n );\r\n if (!partialSetterPrototype) return null;\r\n partialSetterPrototype\r\n .internalName = internalName + INSTANCE_DELIMITER + partialSetterPrototype.simpleName;\r\n instanceProperty.setterPrototype = partialSetterPrototype;\r\n }\r\n instance.members.set(member.simpleName, instanceProperty);\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n }\r\n\r\n // Finalize memory offset\r\n instance.currentMemoryOffset = memoryOffset;\r\n\r\n // Fully resolve operator overloads (don't have type parameters on their own)\r\n for (let [kind, overloadPrototype] of prototype.overloadPrototypes) {\r\n assert(kind != OperatorKind.INVALID);\r\n let operatorInstance: Function | null;\r\n if (overloadPrototype.is(CommonFlags.INSTANCE)) {\r\n let operatorPartial = this.resolveFunctionPartially(\r\n overloadPrototype,\r\n typeArguments,\r\n reportMode\r\n );\r\n if (!operatorPartial) continue;\r\n operatorInstance = this.resolveFunction(\r\n operatorPartial,\r\n null,\r\n makeMap(),\r\n reportMode\r\n );\r\n } else {\r\n operatorInstance = this.resolveFunction(\r\n overloadPrototype,\r\n null,\r\n makeMap(),\r\n reportMode\r\n );\r\n }\r\n if (!operatorInstance) continue;\r\n let overloads = instance.overloads;\r\n if (!overloads) instance.overloads = overloads = new Map();\r\n overloads.set(kind, operatorInstance);\r\n }\r\n return instance;\r\n }\r\n\r\n /** Resolves a class prototype by first resolving the specified type arguments. */\r\n resolveClassInclTypeArguments(\r\n prototype: ClassPrototype,\r\n typeArgumentNodes: CommonTypeNode[] | null,\r\n contextualTypeArguments: Map,\r\n reportNode: Node,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Class | null {\r\n var resolvedTypeArguments: Type[] | null = null;\r\n\r\n // Resolve type arguments if generic\r\n if (prototype.is(CommonFlags.GENERIC)) {\r\n resolvedTypeArguments = this.resolveTypeArguments(\r\n assert(prototype.declaration.typeParameters),\r\n typeArgumentNodes,\r\n contextualTypeArguments,\r\n reportNode,\r\n reportMode\r\n );\r\n if (!resolvedTypeArguments) return null;\r\n\r\n // Otherwise make sure that no type arguments have been specified\r\n } else {\r\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Continue with concrete types\r\n return this.resolveClass(\r\n prototype,\r\n resolvedTypeArguments,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n }\r\n}\r\n","/**\r\n * A decompiler that generates low-level AssemblyScript from WebAssembly binaries.\r\n * @module decompiler\r\n *//***/\r\n\r\nimport {\r\n Module,\r\n NativeType,\r\n ExpressionId,\r\n UnaryOp,\r\n BinaryOp,\r\n HostOp,\r\n FunctionRef,\r\n ExpressionRef,\r\n Index,\r\n getFunctionName,\r\n getFunctionBody,\r\n getFunctionParamCount,\r\n getFunctionParamType,\r\n getFunctionResultType,\r\n getExpressionId,\r\n getExpressionType,\r\n getBlockName,\r\n getBlockChildCount,\r\n getBlockChild,\r\n getIfCondition,\r\n getIfTrue,\r\n getIfFalse,\r\n getLoopName,\r\n getLoopBody,\r\n getBreakName,\r\n getBreakCondition,\r\n getGetLocalIndex,\r\n getSetLocalIndex,\r\n getSetLocalValue,\r\n getLoadOffset,\r\n getLoadPtr,\r\n getStoreOffset,\r\n getStorePtr,\r\n getStoreValue,\r\n getConstValueI32,\r\n getConstValueI64Low,\r\n getConstValueI64High,\r\n getConstValueF32,\r\n getConstValueF64,\r\n getUnaryOp,\r\n getUnaryValue,\r\n getBinaryOp,\r\n getBinaryLeft,\r\n getBinaryRight,\r\n getSelectThen,\r\n getSelectElse,\r\n getSelectCondition,\r\n getDropValue,\r\n getReturnValue,\r\n getHostOp,\r\n getHostOperand\r\n} from \"./module\";\r\n\r\n// TODO :-)\r\n\r\nexport class Decompiler {\r\n\r\n static decompile(module: Module): string {\r\n var decompiler = new Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n }\r\n\r\n text: string[] = [];\r\n functionId: i32 = 0;\r\n\r\n constructor() { }\r\n\r\n /** Decompiles a module to an AST that can then be serialized. */\r\n decompile(module: Module): void {\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n decompileFunction(func: FunctionRef): void {\r\n var name = getFunctionName(func) || \"$\" + this.functionId.toString(10);\r\n var body = getFunctionBody(func);\r\n this.push(\"function \");\r\n this.push(name);\r\n this.push(\"(\");\r\n for (let i: Index = 0, k: Index = getFunctionParamCount(func); i < k; ++i) {\r\n if (i > 0) this.push(\", \");\r\n this.push(\"$\");\r\n this.push(i.toString(10));\r\n this.push(\": \");\r\n this.push(nativeTypeToType(getFunctionParamType(func, i)));\r\n }\r\n this.push(\"): \");\r\n this.push(nativeTypeToType(getFunctionResultType(func)));\r\n this.push(\" \");\r\n if (getExpressionId(body) != ExpressionId.Block) {\r\n this.push(\"{\\n\");\r\n }\r\n this.decompileExpression(body);\r\n if (getExpressionId(body) != ExpressionId.Block) {\r\n this.push(\"\\n}\\n\");\r\n }\r\n ++this.functionId;\r\n }\r\n\r\n decompileExpression(expr: ExpressionRef): void {\r\n var id = getExpressionId(expr);\r\n var type = getExpressionType(expr);\r\n\r\n var nested: ExpressionRef;\r\n var string: string | null;\r\n var i: Index, k: Index;\r\n\r\n switch (id) {\r\n case ExpressionId.Block: { // TODO: magic\r\n if ((string = getBlockName(expr)) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"{\\n\");\r\n k = getBlockChildCount(expr);\r\n for (i = 0; i < k; ++i) {\r\n this.decompileExpression(getBlockChild(expr, i));\r\n }\r\n this.push(\"}\\n\");\r\n return;\r\n }\r\n case ExpressionId.If: {\r\n if (type == NativeType.None) {\r\n this.push(\"if (\");\r\n this.decompileExpression(getIfCondition(expr));\r\n this.push(\") \");\r\n this.decompileExpression(getIfTrue(expr));\r\n if (nested = getIfFalse(expr)) {\r\n this.push(\" else \");\r\n this.decompileExpression(nested);\r\n }\r\n } else {\r\n this.decompileExpression(getIfCondition(expr));\r\n this.push(\" ? \");\r\n this.decompileExpression(getIfTrue(expr));\r\n this.push(\" : \");\r\n this.decompileExpression(getIfFalse(expr));\r\n }\r\n return;\r\n }\r\n case ExpressionId.Loop: {\r\n if ((string = getLoopName(expr)) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"do \");\r\n this.decompileExpression(getLoopBody(expr));\r\n this.push(\"while (0);\\n\");\r\n }\r\n case ExpressionId.Break: {\r\n if (nested = getBreakCondition(expr)) {\r\n this.push(\"if (\");\r\n this.decompileExpression(nested);\r\n this.push(\") \");\r\n }\r\n if ((string = getBreakName(expr)) != null) {\r\n this.push(\"break \");\r\n this.push(string);\r\n this.push(\";\\n\");\r\n } else {\r\n this.push(\"break;\\n\");\r\n }\r\n return;\r\n }\r\n case ExpressionId.Switch:\r\n case ExpressionId.Call:\r\n case ExpressionId.CallIndirect: {\r\n throw new Error(\"not implemented\");\r\n }\r\n case ExpressionId.GetLocal: {\r\n this.push(\"$\");\r\n this.push(getGetLocalIndex(expr).toString(10));\r\n return;\r\n }\r\n case ExpressionId.SetLocal: {\r\n this.push(\"$\");\r\n this.push(getSetLocalIndex(expr).toString(10));\r\n this.push(\" = \");\r\n this.decompileExpression(getSetLocalValue(expr));\r\n return;\r\n }\r\n case ExpressionId.GetGlobal:\r\n case ExpressionId.SetGlobal: {\r\n throw new Error(\"not implemented\");\r\n }\r\n case ExpressionId.Load: {\r\n this.push(\"load<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(getLoadOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(getLoadPtr(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case ExpressionId.Store: {\r\n this.push(\"store<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(getStoreOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(getStorePtr(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getStoreValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case ExpressionId.Const: {\r\n switch (type) {\r\n case NativeType.I32: {\r\n this.push(getConstValueI32(expr).toString(10));\r\n return;\r\n }\r\n case NativeType.I64: {\r\n this.push(\r\n i64_to_string(\r\n i64_new(\r\n getConstValueI64Low(expr),\r\n getConstValueI64High(expr)\r\n )\r\n )\r\n );\r\n return;\r\n }\r\n case NativeType.F32: {\r\n this.push(getConstValueF32(expr).toString(10));\r\n return;\r\n }\r\n case NativeType.F64: {\r\n this.push(getConstValueF64(expr).toString(10));\r\n return;\r\n }\r\n }\r\n break;\r\n }\r\n case ExpressionId.Unary: {\r\n switch (getUnaryOp(expr)) {\r\n case UnaryOp.ClzI32: {\r\n this.push(\"clz(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.CtzI32: {\r\n this.push(\"ctz(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.PopcntI32: {\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.NegF32:\r\n case UnaryOp.NegF64: {\r\n this.push(\"-\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.AbsF32: {\r\n this.push(\"abs(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.CeilF32: {\r\n this.push(\"ceil(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.FloorF32: {\r\n this.push(\"floor(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.TruncF32: {\r\n this.push(\"trunc(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.NearestF32: {\r\n this.push(\"nearest(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.SqrtF32: {\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.EqzI32:\r\n case UnaryOp.EqzI64: {\r\n this.push(\"!\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ClzI64: {\r\n this.push(\"clz(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.CtzI64: {\r\n this.push(\"ctz(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.PopcntI64: {\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.AbsF64: {\r\n this.push(\"abs(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.CeilF64: {\r\n this.push(\"ceil(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.FloorF64: {\r\n this.push(\"floor(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.TruncF64: {\r\n this.push(\"trunc(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.NearestF64: {\r\n this.push(\"nearest(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.SqrtF64: {\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.ExtendI32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ExtendU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.WrapI64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF32ToI32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF32ToI64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF32ToU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF32ToU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF64ToI32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF64ToI64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF64ToU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF64ToU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ReinterpretF32: {\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.ReinterpretF64: {\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.ConvertI32ToF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertI32ToF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertU32ToF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertU32ToF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertI64ToF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertI64ToF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertU64ToF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertU64ToF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.PromoteF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.DemoteF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ReinterpretI32: {\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.ReinterpretI64: {\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n }\r\n break;\r\n }\r\n case ExpressionId.Binary: { // TODO: precedence\r\n switch (getBinaryOp(expr)) {\r\n case BinaryOp.AddI32:\r\n case BinaryOp.AddI64:\r\n case BinaryOp.AddF32:\r\n case BinaryOp.AddF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" + \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.SubI32:\r\n case BinaryOp.SubI64:\r\n case BinaryOp.SubF32:\r\n case BinaryOp.SubF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" - \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.MulI32:\r\n case BinaryOp.MulI64:\r\n case BinaryOp.MulF32:\r\n case BinaryOp.MulF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" * \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.DivI32:\r\n case BinaryOp.DivI64:\r\n case BinaryOp.DivF32:\r\n case BinaryOp.DivF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.DivU32: {\r\n this.push(\"(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.RemI32:\r\n case BinaryOp.RemI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.RemU32: {\r\n this.push(\"(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.AndI32:\r\n case BinaryOp.AndI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" & \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.OrI32:\r\n case BinaryOp.OrI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" | \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.XorI32:\r\n case BinaryOp.XorI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" ^ \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.ShlI32:\r\n case BinaryOp.ShlI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" << \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.ShrU32:\r\n case BinaryOp.ShrU64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >>> \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.ShrI32:\r\n case BinaryOp.ShrI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >> \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.RotlI32: {\r\n this.push(\"rotl(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.RotrI32: {\r\n this.push(\"rotr(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.EqI32:\r\n case BinaryOp.EqI64:\r\n case BinaryOp.EqF32:\r\n case BinaryOp.EqF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" == \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.NeI32:\r\n case BinaryOp.NeI64:\r\n case BinaryOp.NeF32:\r\n case BinaryOp.NeF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" != \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LtI32:\r\n case BinaryOp.LtI64:\r\n case BinaryOp.LtF32:\r\n case BinaryOp.LtF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LtU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LeI32:\r\n case BinaryOp.LeI64:\r\n case BinaryOp.LeF32:\r\n case BinaryOp.LeF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LeU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GtI32:\r\n case BinaryOp.GtI64:\r\n case BinaryOp.GtF32:\r\n case BinaryOp.GtF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GtU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GeI32:\r\n case BinaryOp.GeI64:\r\n case BinaryOp.GeF32:\r\n case BinaryOp.GeF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GeU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.DivU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.RemU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.RotlI64: {\r\n this.push(\"rotl(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.RotrI64: {\r\n this.push(\"rotr(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.LtU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LeU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GtU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GeU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.CopysignF32: {\r\n this.push(\"copysign(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.MinF32: {\r\n this.push(\"min(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.MaxF32: {\r\n this.push(\"max(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.CopysignF64: {\r\n this.push(\"copysign(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.MinF64: {\r\n this.push(\"min(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.MaxF64: {\r\n this.push(\"max(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n }\r\n return;\r\n }\r\n case ExpressionId.Select: {\r\n this.push(\"select<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.decompileExpression(getSelectThen(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getSelectElse(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getSelectCondition(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case ExpressionId.Drop: {\r\n this.decompileExpression(getDropValue(expr));\r\n this.push(\";\\n\");\r\n return;\r\n }\r\n case ExpressionId.Return: {\r\n if (nested = getReturnValue(expr)) {\r\n this.push(\"return \");\r\n this.decompileExpression(nested);\r\n this.push(\";\\n\");\r\n } else {\r\n this.push(\"return;\\n\");\r\n }\r\n return;\r\n }\r\n case ExpressionId.Host: {\r\n switch (getHostOp(expr)) {\r\n case HostOp.CurrentMemory: {\r\n this.push(\"memory.size()\");\r\n return;\r\n }\r\n case HostOp.GrowMemory: {\r\n this.push(\"memory.grow(\");\r\n this.decompileExpression(getHostOperand(expr, 0));\r\n this.push(\")\");\r\n return;\r\n }\r\n }\r\n break;\r\n }\r\n case ExpressionId.Nop: {\r\n this.push(\";\\n\");\r\n return;\r\n }\r\n case ExpressionId.Unreachable: {\r\n this.push(\"unreachable()\");\r\n return;\r\n }\r\n case ExpressionId.AtomicCmpxchg:\r\n case ExpressionId.AtomicRMW:\r\n case ExpressionId.AtomicWait:\r\n case ExpressionId.AtomicWake:\r\n }\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n private push(text: string): void {\r\n // mostly here so we can add debugging if necessary\r\n this.text.push(text);\r\n }\r\n\r\n finish(): string {\r\n var ret = this.text.join(\"\");\r\n this.text = [];\r\n return ret;\r\n }\r\n}\r\n\r\nfunction nativeTypeToType(type: NativeType): string {\r\n switch (type) {\r\n case NativeType.None: return \"void\";\r\n case NativeType.I32: return \"i32\";\r\n case NativeType.I64: return \"i64\";\r\n case NativeType.F32: return \"f32\";\r\n case NativeType.F64: return \"f64\";\r\n case NativeType.Unreachable: throw new Error(\"unreachable type\");\r\n case NativeType.Auto: throw new Error(\"auto type\");\r\n default: throw new Error(\"unexpected type\");\r\n }\r\n}\r\n","/**\r\n * Definition builders for WebIDL and TypeScript.\r\n * @module definitions\r\n *//***/\r\n\r\nimport {\r\n CommonFlags\r\n} from \"./common\";\r\n\r\nimport {\r\n Program,\r\n Element,\r\n ElementKind,\r\n Global,\r\n Enum,\r\n EnumValue,\r\n Field,\r\n Function,\r\n FunctionPrototype,\r\n Class,\r\n ClassPrototype,\r\n Namespace,\r\n ConstantValueKind,\r\n Interface,\r\n Property\r\n} from \"./program\";\r\n\r\nimport {\r\n Type,\r\n TypeKind\r\n} from \"./types\";\r\n\r\nimport {\r\n indent\r\n} from \"./util\";\r\n\r\n/** Walker base class. */\r\nabstract class ExportsWalker {\r\n\r\n /** Program reference. */\r\n program: Program;\r\n /** Whether to include private members */\r\n includePrivate: bool;\r\n /** Elements still to do. */\r\n todo: Element[] = [];\r\n /** Already seen elements. */\r\n seen: Set = new Set();\r\n\r\n /** Constructs a new Element walker. */\r\n constructor(program: Program, includePrivate: bool = false) {\r\n this.program = program;\r\n this.includePrivate;\r\n }\r\n\r\n /** Walks all exports and calls the respective handlers. */\r\n walk(): void {\r\n for (let moduleExport of this.program.moduleLevelExports.values()) {\r\n // FIXME: doesn't honor the actual externally visible name\r\n this.visitElement(moduleExport.element);\r\n }\r\n var todo = this.todo;\r\n for (let i = 0; i < todo.length; ) this.visitElement(todo[i]);\r\n }\r\n\r\n /** Visits an element.*/\r\n visitElement(element: Element): void {\r\n if (element.is(CommonFlags.PRIVATE) && !this.includePrivate) return;\r\n if (this.seen.has(element)) return;\r\n this.seen.add(element);\r\n switch (element.kind) {\r\n case ElementKind.GLOBAL: {\r\n if (element.is(CommonFlags.COMPILED)) this.visitGlobal(element);\r\n break;\r\n }\r\n case ElementKind.ENUM: {\r\n if (element.is(CommonFlags.COMPILED)) this.visitEnum(element);\r\n break;\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n this.visitFunctionInstances(element);\r\n break;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n this.visitClassInstances(element);\r\n break;\r\n }\r\n case ElementKind.FIELD: {\r\n if ((element).is(CommonFlags.COMPILED)) this.visitField(element);\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let prop = element;\r\n let getter = prop.getterPrototype;\r\n if (getter) this.visitFunctionInstances(getter);\r\n let setter = prop.setterPrototype;\r\n if (setter) this.visitFunctionInstances(setter);\r\n break;\r\n }\r\n case ElementKind.NAMESPACE: {\r\n if (hasCompiledMember(element)) this.visitNamespace(element);\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n\r\n private visitFunctionInstances(element: FunctionPrototype): void {\r\n for (let instances of element.instances.values()) {\r\n for (let instance of instances.values()) {\r\n if (instance.is(CommonFlags.COMPILED)) this.visitFunction(instance);\r\n }\r\n }\r\n }\r\n\r\n private visitClassInstances(element: ClassPrototype): void {\r\n for (let instance of element.instances.values()) {\r\n if (instance.is(CommonFlags.COMPILED)) this.visitClass(instance);\r\n }\r\n }\r\n\r\n abstract visitGlobal(element: Global): void;\r\n abstract visitEnum(element: Enum): void;\r\n abstract visitFunction(element: Function): void;\r\n abstract visitClass(element: Class): void;\r\n abstract visitInterface(element: Interface): void;\r\n abstract visitField(element: Field): void;\r\n abstract visitNamespace(element: Element): void;\r\n}\r\n\r\n/** A WebIDL definitions builder. */\r\nexport class IDLBuilder extends ExportsWalker {\r\n\r\n /** Builds WebIDL definitions for the specified program. */\r\n static build(program: Program): string {\r\n return new IDLBuilder(program).build();\r\n }\r\n\r\n private sb: string[] = [];\r\n private indentLevel: i32 = 0;\r\n\r\n /** Constructs a new WebIDL builder. */\r\n constructor(program: Program, includePrivate: bool = false) {\r\n super(program, includePrivate);\r\n }\r\n\r\n visitGlobal(element: Global): void {\r\n var sb = this.sb;\r\n var isConst = element.is(CommonFlags.INLINED);\r\n indent(sb, this.indentLevel);\r\n if (isConst) sb.push(\"const \");\r\n sb.push(this.typeToString(element.type));\r\n sb.push(\" \");\r\n sb.push(element.simpleName);\r\n if (isConst) {\r\n switch (element.constantValueKind) {\r\n case ConstantValueKind.INTEGER: {\r\n sb.push(\" = \");\r\n sb.push(i64_to_string(element.constantIntegerValue));\r\n break;\r\n }\r\n case ConstantValueKind.FLOAT: {\r\n sb.push(\" = \");\r\n sb.push(element.constantFloatValue.toString());\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n sb.push(\";\\n\");\r\n }\r\n\r\n visitEnum(element: Enum): void {\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"interface \");\r\n sb.push(element.simpleName);\r\n sb.push(\" {\\n\");\r\n var members = element.members;\r\n if (members) {\r\n for (let [name, member] of members) {\r\n if (member.kind == ElementKind.ENUMVALUE) {\r\n let isConst = (member).is(CommonFlags.INLINED);\r\n indent(sb, this.indentLevel);\r\n if (isConst) sb.push(\"const \");\r\n else sb.push(\"readonly \");\r\n sb.push(\"unsigned long \");\r\n sb.push(name);\r\n if (isConst) {\r\n sb.push(\" = \");\r\n sb.push((member).constantValue.toString(10));\r\n }\r\n sb.push(\";\\n\");\r\n }\r\n }\r\n for (let member of members.values()) {\r\n if (member.kind != ElementKind.ENUMVALUE) this.visitElement(member);\r\n }\r\n }\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n visitFunction(element: Function): void {\r\n var sb = this.sb;\r\n var signature = element.signature;\r\n indent(sb, this.indentLevel);\r\n sb.push(this.typeToString(signature.returnType));\r\n sb.push(\" \");\r\n sb.push(element.simpleName);\r\n sb.push(\"(\");\r\n var parameters = signature.parameterTypes;\r\n var numParameters = parameters.length;\r\n // var requiredParameters = signature.requiredParameters;\r\n for (let i = 0; i < numParameters; ++i) {\r\n if (i) sb.push(\", \");\r\n // if (i >= requiredParameters) sb.push(\"optional \");\r\n sb.push(this.typeToString(parameters[i]));\r\n sb.push(\" \");\r\n sb.push(signature.getParameterName(i));\r\n }\r\n sb.push(\");\\n\");\r\n var members = element.members;\r\n if (members && members.size) {\r\n indent(sb, this.indentLevel);\r\n sb.push(\"interface \");\r\n sb.push(element.simpleName);\r\n sb.push(\" {\\n\");\r\n for (let member of members.values()) this.visitElement(member);\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n }\r\n\r\n visitClass(element: Class): void {\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"interface \");\r\n sb.push(element.simpleName);\r\n sb.push(\" {\\n\");\r\n // TODO\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n visitInterface(element: Interface): void {\r\n this.visitClass(element);\r\n }\r\n\r\n visitField(element: Field): void {\r\n // TODO\r\n }\r\n\r\n visitNamespace(element: Namespace): void {\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"interface \");\r\n sb.push(element.simpleName);\r\n sb.push(\" {\\n\");\r\n var members = element.members;\r\n if (members) {\r\n for (let member of members.values()) this.visitElement(member);\r\n }\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n typeToString(type: Type): string {\r\n switch (type.kind) {\r\n case TypeKind.I8: return \"byte\";\r\n case TypeKind.I16: return \"short\";\r\n case TypeKind.I32: return \"long\";\r\n case TypeKind.I64: return \"long long\";\r\n case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"long long\" : \"long\";\r\n case TypeKind.U8: return \"octet\";\r\n case TypeKind.U16: return \"unsigned short\";\r\n case TypeKind.U32: return \"unsigned long\";\r\n // ^ TODO: function types\r\n case TypeKind.U64: return \"unsigned long long\";\r\n case TypeKind.USIZE: return this.program.options.isWasm64 ? \"unsigned long long\" : \"unsigned long\";\r\n // ^ TODO: class types\r\n case TypeKind.BOOL: return \"boolean\";\r\n case TypeKind.F32: return \"unrestricted float\";\r\n case TypeKind.F64: return \"unrestricted double\";\r\n case TypeKind.VOID: return \"void\";\r\n default: {\r\n assert(false);\r\n return \"\";\r\n }\r\n }\r\n }\r\n\r\n build(): string {\r\n var sb = this.sb;\r\n sb.push(\"interface ASModule {\\n\");\r\n ++this.indentLevel;\r\n this.walk();\r\n --this.indentLevel;\r\n sb.push(\"}\\n\");\r\n return sb.join(\"\");\r\n }\r\n}\r\n\r\n/** A TypeScript definitions builder. */\r\nexport class TSDBuilder extends ExportsWalker {\r\n\r\n /** Builds TypeScript definitions for the specified program. */\r\n static build(program: Program): string {\r\n return new TSDBuilder(program).build();\r\n }\r\n\r\n private sb: string[] = [];\r\n private indentLevel: i32 = 0;\r\n\r\n /** Constructs a new WebIDL builder. */\r\n constructor(program: Program, includePrivate: bool = false) {\r\n super(program, includePrivate);\r\n }\r\n\r\n visitGlobal(element: Global): void {\r\n var sb = this.sb;\r\n var isConst = element.is(CommonFlags.INLINED);\r\n indent(sb, this.indentLevel);\r\n if (element.is(CommonFlags.STATIC)) {\r\n if (isConst) sb.push(\"static readonly \");\r\n else sb.push(\"static \");\r\n } else {\r\n if (isConst) sb.push(\"const \");\r\n else sb.push(\"var \");\r\n }\r\n sb.push(element.simpleName);\r\n sb.push(\": \");\r\n sb.push(this.typeToString(element.type));\r\n sb.push(\";\\n\");\r\n this.visitNamespace(element);\r\n }\r\n\r\n visitEnum(element: Enum): void {\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"enum \");\r\n sb.push(element.simpleName);\r\n sb.push(\" {\\n\");\r\n var members = element.members;\r\n if (members) {\r\n let numMembers = members.size;\r\n for (let [name, member] of members) {\r\n if (member.kind == ElementKind.ENUMVALUE) {\r\n indent(sb, this.indentLevel);\r\n sb.push(name);\r\n if (member.is(CommonFlags.INLINED)) {\r\n sb.push(\" = \");\r\n sb.push((member).constantValue.toString(10));\r\n }\r\n sb.push(\",\\n\");\r\n --numMembers;\r\n }\r\n }\r\n if (numMembers) this.visitNamespace(element);\r\n }\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n visitFunction(element: Function): void {\r\n if (element.isAny(CommonFlags.PRIVATE | CommonFlags.SET)) return;\r\n var sb = this.sb;\r\n var signature = element.signature;\r\n indent(sb, this.indentLevel);\r\n if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\r\n if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\r\n if (element.is(CommonFlags.GET)) {\r\n sb.push(element.prototype.declaration.name.text); // 'get:funcName' internally\r\n sb.push(\": \");\r\n sb.push(this.typeToString(signature.returnType));\r\n sb.push(\";\\n\");\r\n return;\r\n } else {\r\n if (!element.isAny(CommonFlags.STATIC | CommonFlags.INSTANCE)) sb.push(\"function \");\r\n sb.push(element.simpleName);\r\n }\r\n sb.push(\"(\");\r\n var parameters = signature.parameterTypes;\r\n var numParameters = parameters.length;\r\n // var requiredParameters = signature.requiredParameters;\r\n for (let i = 0; i < numParameters; ++i) {\r\n if (i) sb.push(\", \");\r\n // if (i >= requiredParameters) sb.push(\"optional \");\r\n sb.push(signature.getParameterName(i));\r\n sb.push(\": \");\r\n sb.push(this.typeToString(parameters[i]));\r\n }\r\n if (element.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.SET)) {\r\n sb.push(\")\");\r\n } else {\r\n sb.push(\"): \");\r\n sb.push(this.typeToString(signature.returnType));\r\n }\r\n sb.push(\";\\n\");\r\n this.visitNamespace(element);\r\n }\r\n\r\n visitClass(element: Class): void {\r\n var sb = this.sb;\r\n var isInterface = element.kind == ElementKind.INTERFACE;\r\n indent(sb, this.indentLevel++);\r\n if (isInterface) {\r\n sb.push(\"interface \");\r\n } else {\r\n if (element.is(CommonFlags.ABSTRACT)) sb.push(\"abstract \");\r\n sb.push(\"class \");\r\n }\r\n sb.push(element.simpleName);\r\n var base = element.base;\r\n if (base && base.is(CommonFlags.COMPILED | CommonFlags.MODULE_EXPORT)) {\r\n sb.push(\" extends \");\r\n sb.push(base.simpleName); // TODO: fqn\r\n }\r\n sb.push(\" {\\n\");\r\n var members = element.prototype.members; // static\r\n if (members) {\r\n for (let member of members.values()) {\r\n this.visitElement(member);\r\n }\r\n }\r\n var ctor = element.constructorInstance;\r\n if (ctor) this.visitFunction(ctor);\r\n members = element.members; // instance\r\n if (members) {\r\n for (let member of members.values()) this.visitElement(member);\r\n }\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n visitInterface(element: Interface): void {\r\n this.visitClass(element);\r\n }\r\n\r\n visitField(element: Field): void {\r\n if (element.is(CommonFlags.PRIVATE)) return;\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel);\r\n if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\r\n if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\r\n if (element.is(CommonFlags.READONLY)) sb.push(\"readonly \");\r\n sb.push(element.simpleName);\r\n sb.push(\": \");\r\n sb.push(this.typeToString(element.type));\r\n sb.push(\";\\n\");\r\n }\r\n\r\n visitNamespace(element: Element): void {\r\n var members = element.members;\r\n if (members && members.size) {\r\n let sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"namespace \");\r\n sb.push(element.simpleName);\r\n sb.push(\" {\\n\");\r\n for (let member of members.values()) this.visitElement(member);\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n }\r\n\r\n typeToString(type: Type): string {\r\n switch (type.kind) {\r\n case TypeKind.I8: return \"i8\";\r\n case TypeKind.I16: return \"i16\";\r\n case TypeKind.I32: return \"i32\";\r\n case TypeKind.I64: return \"I64\";\r\n case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"I64\" : \"i32\";\r\n case TypeKind.U8: return \"u8\";\r\n case TypeKind.U16: return \"u16\";\r\n case TypeKind.U32: return \"u32\";\r\n // ^ TODO: function types\r\n case TypeKind.U64: return \"U64\";\r\n case TypeKind.USIZE: return this.program.options.isWasm64 ? \"U64\" : \"u32\";\r\n // ^ TODO: class types\r\n case TypeKind.BOOL: return \"bool\";\r\n case TypeKind.F32: return \"f32\";\r\n case TypeKind.F64: return \"f64\";\r\n case TypeKind.VOID: return \"void\";\r\n default: {\r\n assert(false);\r\n return \"\";\r\n }\r\n }\r\n }\r\n\r\n build(): string {\r\n var sb = this.sb;\r\n sb.push(\"declare module ASModule {\\n\");\r\n sb.push(\" type i8 = number;\\n\");\r\n sb.push(\" type i16 = number;\\n\");\r\n sb.push(\" type i32 = number;\\n\");\r\n sb.push(\" type u8 = number;\\n\");\r\n sb.push(\" type u16 = number;\\n\");\r\n sb.push(\" type u32 = number;\\n\");\r\n sb.push(\" type f32 = number;\\n\");\r\n sb.push(\" type f64 = number;\\n\");\r\n sb.push(\" type bool = any;\\n\");\r\n ++this.indentLevel;\r\n this.walk();\r\n --this.indentLevel;\r\n sb.push(\"}\\n\");\r\n sb.push(\"export default ASModule;\\n\");\r\n return this.sb.join(\"\");\r\n }\r\n}\r\n\r\n// helpers\r\n\r\n/** Tests if a namespace-like element has at least one compiled member. */\r\nfunction hasCompiledMember(element: Element): bool {\r\n var members = element.members;\r\n if (members) {\r\n for (let member of members.values()) {\r\n switch (member.kind) {\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n for (let instances of (member).instances.values()) {\r\n for (let instance of instances.values()) {\r\n if (instance.is(CommonFlags.COMPILED)) return true;\r\n }\r\n }\r\n break;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n for (let instance of (member).instances.values()) {\r\n if (instance.is(CommonFlags.COMPILED)) return true;\r\n }\r\n break;\r\n }\r\n default: {\r\n if (member.is(CommonFlags.COMPILED) || hasCompiledMember(member)) return true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n","/**\r\n * A TypeScript parser for the AssemblyScript subset.\r\n * @module parser\r\n *//***/\r\n\r\nimport {\r\n CommonFlags,\r\n LIBRARY_PREFIX,\r\n PATH_DELIMITER\r\n} from \"./common\";\r\n\r\nimport {\r\n Program\r\n} from \"./program\";\r\n\r\nimport {\r\n Tokenizer,\r\n Token,\r\n Range,\r\n CommentHandler,\r\n IdentifierHandling\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n normalizePath\r\n} from \"./util\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n Source,\r\n SourceKind,\r\n CommonTypeNode,\r\n TypeNode,\r\n SignatureNode,\r\n\r\n Expression,\r\n AssertionKind,\r\n CallExpression,\r\n ClassExpression,\r\n FunctionExpression,\r\n IdentifierExpression,\r\n StringLiteralExpression,\r\n\r\n Statement,\r\n BlockStatement,\r\n BreakStatement,\r\n ClassDeclaration,\r\n ContinueStatement,\r\n DeclarationStatement,\r\n DecoratorNode,\r\n DoStatement,\r\n EnumDeclaration,\r\n EnumValueDeclaration,\r\n ExportImportStatement,\r\n ExportMember,\r\n ExportStatement,\r\n ExpressionStatement,\r\n ForStatement,\r\n FunctionDeclaration,\r\n IfStatement,\r\n ImportDeclaration,\r\n ImportStatement,\r\n NamespaceDeclaration,\r\n ParameterNode,\r\n ParameterKind,\r\n ReturnStatement,\r\n SwitchCase,\r\n SwitchStatement,\r\n ThrowStatement,\r\n TryStatement,\r\n TypeDeclaration,\r\n TypeParameterNode,\r\n VariableStatement,\r\n VariableDeclaration,\r\n VoidStatement,\r\n WhileStatement,\r\n\r\n mangleInternalPath,\r\n nodeIsCallable,\r\n nodeIsGenericCallable,\r\n IndexSignatureDeclaration\r\n} from \"./ast\";\r\n\r\n/** Parser interface. */\r\nexport class Parser extends DiagnosticEmitter {\r\n\r\n /** Program being created. */\r\n program: Program;\r\n /** Source file names to be requested next. */\r\n backlog: string[] = new Array();\r\n /** Source file names already seen, that is processed or backlogged. */\r\n seenlog: Set = new Set();\r\n /** Source file names already completely processed. */\r\n donelog: Set = new Set();\r\n /** Optional handler to intercept comments while tokenizing. */\r\n onComment: CommentHandler | null = null;\r\n\r\n /** Constructs a new parser. */\r\n constructor() {\r\n super();\r\n this.program = new Program(this.diagnostics);\r\n }\r\n\r\n /** Parses a file and adds its definitions to the program. */\r\n parseFile(\r\n text: string,\r\n path: string,\r\n isEntry: bool\r\n ): void {\r\n var normalizedPath = normalizePath(path);\r\n var internalPath = mangleInternalPath(normalizedPath);\r\n\r\n // check if already processed\r\n if (this.donelog.has(internalPath)) return;\r\n this.donelog.add(internalPath); // do not parse again\r\n this.seenlog.add(internalPath); // do not request again\r\n\r\n // create the source element\r\n var source = new Source(\r\n normalizedPath,\r\n text,\r\n isEntry\r\n ? SourceKind.ENTRY\r\n : path.startsWith(LIBRARY_PREFIX) && path.indexOf(PATH_DELIMITER, LIBRARY_PREFIX.length) < 0\r\n ? SourceKind.LIBRARY\r\n : SourceKind.DEFAULT\r\n );\r\n var program = this.program;\r\n program.sources.push(source);\r\n\r\n // tokenize and parse\r\n var tn = new Tokenizer(source, program.diagnostics);\r\n tn.onComment = this.onComment;\r\n source.tokenizer = tn;\r\n var statements = source.statements;\r\n while (!tn.skip(Token.ENDOFFILE)) {\r\n let statement = this.parseTopLevelStatement(tn);\r\n if (statement) {\r\n statement.parent = source;\r\n statements.push(statement);\r\n }\r\n }\r\n tn.finish();\r\n }\r\n\r\n /** Parses a top-level statement. */\r\n parseTopLevelStatement(\r\n tn: Tokenizer,\r\n namespace: Node | null = null\r\n ): Statement | null {\r\n var flags = CommonFlags.NONE;\r\n var startPos: i32 = -1;\r\n\r\n // check decorators\r\n var decorators: DecoratorNode[] | null = null;\r\n while (tn.skip(Token.AT)) {\r\n if (startPos < 0) startPos = tn.tokenPos;\r\n let decorator = this.parseDecorator(tn);\r\n if (!decorator) {\r\n this.skipStatement(tn);\r\n continue;\r\n }\r\n if (!decorators) decorators = [];\r\n decorators.push(decorator);\r\n }\r\n\r\n // check modifiers\r\n var exportStart: i32 = 0;\r\n var exportEnd: i32 = 0;\r\n if (tn.skip(Token.EXPORT)) {\r\n if (tn.skip(Token.DEFAULT)) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n tn.range()\r\n );\r\n }\r\n if (startPos < 0) startPos = tn.tokenPos;\r\n flags |= CommonFlags.EXPORT;\r\n exportStart = tn.tokenPos;\r\n exportEnd = tn.pos;\r\n }\r\n\r\n var declareStart: i32 = 0;\r\n var declareEnd: i32 = 0;\r\n var contextIsAmbient = namespace != null && namespace.is(CommonFlags.AMBIENT);\r\n if (tn.skip(Token.DECLARE)) {\r\n if (startPos < 0) startPos = tn.tokenPos;\r\n if (contextIsAmbient) {\r\n this.error(\r\n DiagnosticCode.A_declare_modifier_cannot_be_used_in_an_already_ambient_context,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n flags |= CommonFlags.DECLARE | CommonFlags.AMBIENT;\r\n } else if (contextIsAmbient) {\r\n flags |= CommonFlags.AMBIENT;\r\n }\r\n\r\n // parse the statement\r\n var statement: Statement | null = null;\r\n\r\n // handle declarations\r\n var first = tn.peek();\r\n if (startPos < 0) startPos = tn.nextTokenPos;\r\n switch (first) {\r\n case Token.CONST: {\r\n tn.next();\r\n flags |= CommonFlags.CONST;\r\n if (tn.skip(Token.ENUM)) {\r\n statement = this.parseEnum(tn, flags, decorators, startPos);\r\n break;\r\n } else {\r\n statement = this.parseVariable(tn, flags, decorators, startPos);\r\n decorators = null;\r\n }\r\n break;\r\n }\r\n case Token.LET: flags |= CommonFlags.LET;\r\n case Token.VAR: {\r\n tn.next();\r\n statement = this.parseVariable(tn, flags, decorators, startPos);\r\n decorators = null;\r\n break;\r\n }\r\n case Token.ENUM: {\r\n tn.next();\r\n statement = this.parseEnum(tn, flags, decorators, startPos);\r\n decorators = null;\r\n break;\r\n }\r\n case Token.FUNCTION: {\r\n tn.next();\r\n statement = this.parseFunction(tn, flags, decorators, startPos);\r\n decorators = null;\r\n break;\r\n }\r\n case Token.ABSTRACT: {\r\n let state = tn.mark();\r\n tn.next();\r\n if (!tn.skip(Token.CLASS)) {\r\n tn.reset(state);\r\n statement = this.parseStatement(tn, true);\r\n break;\r\n } else {\r\n tn.discard(state);\r\n }\r\n flags |= CommonFlags.ABSTRACT;\r\n // fall through\r\n }\r\n case Token.CLASS:\r\n case Token.INTERFACE: {\r\n tn.next();\r\n statement = this.parseClassOrInterface(tn, flags, decorators, startPos);\r\n decorators = null;\r\n break;\r\n }\r\n case Token.NAMESPACE: {\r\n let state = tn.mark();\r\n tn.next();\r\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n tn.discard(state);\r\n statement = this.parseNamespace(tn, flags, decorators, startPos);\r\n decorators = null;\r\n } else {\r\n tn.reset(state);\r\n statement = this.parseStatement(tn, true);\r\n }\r\n break;\r\n }\r\n case Token.IMPORT: {\r\n tn.next();\r\n flags |= CommonFlags.IMPORT;\r\n if (flags & CommonFlags.EXPORT) {\r\n statement = this.parseExportImport(tn, startPos);\r\n } else {\r\n statement = this.parseImport(tn);\r\n }\r\n break;\r\n }\r\n case Token.TYPE: { // also identifier\r\n let state = tn.mark();\r\n tn.next();\r\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n tn.discard(state);\r\n statement = this.parseTypeDeclaration(tn, flags, decorators, startPos);\r\n decorators = null;\r\n } else {\r\n tn.reset(state);\r\n statement = this.parseStatement(tn, true);\r\n }\r\n break;\r\n }\r\n default: {\r\n\r\n // handle plain exports\r\n if (flags & CommonFlags.EXPORT) {\r\n statement = this.parseExport(tn, flags, startPos);\r\n\r\n // handle non-declaration statements\r\n } else {\r\n if (exportEnd) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(exportStart, exportEnd), \"export\"\r\n ); // recoverable\r\n }\r\n if (declareEnd) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(declareStart, declareEnd), \"declare\"\r\n ); // recoverable\r\n }\r\n if (!namespace) {\r\n statement = this.parseStatement(tn, true);\r\n } // TODO: else?\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // check for decorators that weren't consumed\r\n if (decorators) {\r\n for (let i = 0, k = decorators.length; i < k; ++i) {\r\n this.error(\r\n DiagnosticCode.Decorators_are_not_valid_here,\r\n decorators[i].range\r\n );\r\n }\r\n }\r\n return statement;\r\n }\r\n\r\n /** Obtains the next file to parse. */\r\n nextFile(): string | null {\r\n var backlog = this.backlog;\r\n return backlog.length ? backlog.shift() : null;\r\n }\r\n\r\n /** Finishes parsing and returns the program. */\r\n finish(): Program {\r\n if (this.backlog.length) throw new Error(\"backlog is not empty\");\r\n this.backlog = [];\r\n this.seenlog.clear();\r\n this.donelog.clear();\r\n return this.program;\r\n }\r\n\r\n /** Parses a type. */\r\n parseType(\r\n tn: Tokenizer,\r\n acceptParenthesized: bool = true,\r\n suppressErrors: bool = false\r\n ): CommonTypeNode | null {\r\n\r\n // NOTE: this parses our limited subset\r\n var token = tn.next();\r\n var startPos = tn.tokenPos;\r\n\r\n var type: CommonTypeNode;\r\n\r\n // '(' ...\r\n if (token == Token.OPENPAREN) {\r\n\r\n // '(' FunctionSignature ')' '|' 'null'?\r\n let isNullableSignature = tn.skip(Token.OPENPAREN);\r\n // FunctionSignature?\r\n let signature = this.tryParseSignature(tn);\r\n if (signature) {\r\n if (isNullableSignature) {\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.BAR)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"|\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.NULL)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"null\"\r\n );\r\n }\r\n signature.isNullable = true;\r\n }\r\n return signature;\r\n } else if (isNullableSignature || this.tryParseSignatureIsSignature) {\r\n this.error(\r\n DiagnosticCode.Unexpected_token,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n\r\n // Type (',' Type)* ')'\r\n if (acceptParenthesized) {\r\n let innerType = this.parseType(tn, false, suppressErrors);\r\n if (!innerType) return null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"}\"\r\n );\r\n }\r\n return null;\r\n }\r\n type = innerType;\r\n type.range.start = startPos;\r\n type.range.end = tn.pos;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Unexpected_token,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n\r\n // 'void'\r\n } else if (token == Token.VOID) {\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"void\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // 'this'\r\n } else if (token == Token.THIS) {\r\n type = Node.createType(\r\n Node.createThisExpression(tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // 'true'\r\n } else if (token == Token.TRUE || token == Token.FALSE) {\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"bool\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // StringLiteral\r\n } else if (token == Token.STRINGLITERAL) {\r\n tn.readString();\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"string\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // Identifier\r\n } else if (token == Token.IDENTIFIER) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let parameters = new Array();\r\n let nullable = false;\r\n\r\n // Identifier ('.' Identifier)+\r\n while (tn.skip(Token.DOT)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n // TODO: this works for now, but the representation isn't great\r\n identifier = Node.createIdentifierExpression(\r\n identifier.text + \".\" + tn.readIdentifier(),\r\n tn.range(identifier.range.start, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range(tn.pos)\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n // Name\r\n if (tn.skip(Token.LESSTHAN)) {\r\n do {\r\n let parameter = this.parseType(tn, true, suppressErrors);\r\n if (!parameter) return null;\r\n parameters.push(parameter);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \">\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n // ... | null\r\n if (tn.skip(Token.BAR)) {\r\n if (tn.skip(Token.NULL)) {\r\n nullable = true;\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"null\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n type = Node.createType(identifier, parameters, nullable, tn.range(startPos, tn.pos));\r\n\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n // ... [][]\r\n while (tn.skip(Token.OPENBRACKET)) {\r\n let bracketStart = tn.tokenPos;\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n }\r\n return null;\r\n }\r\n let bracketRange = tn.range(bracketStart, tn.pos);\r\n\r\n // ...[] | null\r\n let nullable = false;\r\n if (tn.skip(Token.BAR)) {\r\n if (tn.skip(Token.NULL)) {\r\n nullable = true;\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"null\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"Array\", bracketRange),\r\n [ type ],\r\n nullable,\r\n tn.range(startPos, tn.pos)\r\n );\r\n if (nullable) break;\r\n }\r\n\r\n return type;\r\n }\r\n\r\n // Indicates whether tryParseSignature determined that it is handling a Signature\r\n private tryParseSignatureIsSignature: bool = false;\r\n\r\n /** Parses a function signature, as used in type declarations. */\r\n tryParseSignature(\r\n tn: Tokenizer\r\n ): SignatureNode | null {\r\n\r\n // at '(': ('...'? Identifier '?'? ':' Type (',' '...'? Identifier '?'? ':' Type)* )? ')' '=>' Type\r\n\r\n var state = tn.mark();\r\n var startPos = tn.tokenPos;\r\n var parameters: ParameterNode[] | null = null;\r\n var thisType: TypeNode | null = null;\r\n var isSignature: bool = false;\r\n\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n parameters = [];\r\n\r\n } else {\r\n isSignature = false; // not yet known\r\n do {\r\n let kind = ParameterKind.DEFAULT;\r\n if (tn.skip(Token.DOT_DOT_DOT)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n kind = ParameterKind.REST;\r\n }\r\n if (tn.skip(Token.THIS)) {\r\n if (tn.skip(Token.COLON)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n let t = this.parseType(tn, false);\r\n if (!t) return null;\r\n if (t.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n t.range\r\n );\r\n this.tryParseSignatureIsSignature = true;\r\n return null;\r\n }\r\n thisType = t;\r\n } else {\r\n tn.reset(state);\r\n this.tryParseSignatureIsSignature = false;\r\n return null;\r\n }\r\n } else if (tn.skipIdentifier()) {\r\n let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range(tn.tokenPos, tn.pos));\r\n if (tn.skip(Token.QUESTION)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n if (kind == ParameterKind.REST) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\r\n tn.range()\r\n ); // recoverable\r\n } else {\r\n kind = ParameterKind.OPTIONAL;\r\n }\r\n }\r\n if (tn.skip(Token.COLON)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n let type = this.parseType(tn); // not suppressing errors because known\r\n if (!type) {\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n let param = new ParameterNode();\r\n param.parameterKind = kind;\r\n param.name = name;\r\n param.type = type;\r\n if (!parameters) parameters = [ param ];\r\n else parameters.push(param);\r\n } else {\r\n if (isSignature) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n }\r\n } else {\r\n if (isSignature) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n } else {\r\n tn.reset(state);\r\n }\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n if (isSignature) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n } else {\r\n tn.reset(state);\r\n }\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n }\r\n\r\n var returnType: CommonTypeNode | null;\r\n if (tn.skip(Token.EQUALS_GREATERTHAN)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n returnType = this.parseType(tn);\r\n if (!returnType) {\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n } else {\r\n if (isSignature) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=>\"\r\n );\r\n } else {\r\n tn.reset(state);\r\n }\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n this.tryParseSignatureIsSignature = true;\r\n return Node.createSignature(\r\n parameters || [],\r\n returnType,\r\n thisType,\r\n false,\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n\r\n // statements\r\n\r\n parseDecorator(\r\n tn: Tokenizer\r\n ): DecoratorNode | null {\r\n\r\n // at '@': Identifier ('.' Identifier)* '(' Arguments\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skipIdentifier()) {\r\n let name = tn.readIdentifier();\r\n let expression: Expression = Node.createIdentifierExpression(name, tn.range(startPos, tn.pos));\r\n while (tn.skip(Token.DOT)) {\r\n if (tn.skipIdentifier()) {\r\n name = tn.readIdentifier();\r\n expression = Node.createPropertyAccessExpression(\r\n expression,\r\n Node.createIdentifierExpression(name, tn.range()),\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n let args: Expression[] | null;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n args = this.parseArguments(tn);\r\n if (args) {\r\n return Node.createDecorator(expression, args, tn.range(startPos, tn.pos));\r\n }\r\n } else {\r\n return Node.createDecorator(expression, null, tn.range(startPos, tn.pos));\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseVariable(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): VariableStatement | null {\r\n\r\n // at ('const' | 'let' | 'var'): VariableDeclaration (',' VariableDeclaration)* ';'?\r\n\r\n var members = new Array();\r\n do {\r\n let member = this.parseVariableDeclaration(tn, flags, decorators);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (tn.skip(Token.COMMA));\r\n\r\n var ret = Node.createVariableStatement(members, decorators, flags, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseVariableDeclaration(\r\n tn: Tokenizer,\r\n parentFlags: CommonFlags,\r\n parentDecorators: DecoratorNode[] | null\r\n ): VariableDeclaration | null {\r\n\r\n // before: Identifier (':' Type)? ('=' Expression)?\r\n\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var flags = parentFlags;\r\n if (tn.skip(Token.EXCLAMATION)) {\r\n flags |= CommonFlags.DEFINITE_ASSIGNMENT;\r\n }\r\n\r\n var type: CommonTypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n }\r\n\r\n var initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n if (flags & CommonFlags.AMBIENT) {\r\n this.error(\r\n DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!initializer) return null;\r\n } else {\r\n if (flags & CommonFlags.CONST) {\r\n if (!(flags & CommonFlags.AMBIENT)) {\r\n this.error(\r\n DiagnosticCode._const_declarations_must_be_initialized,\r\n identifier.range\r\n ); // recoverable\r\n }\r\n } else if (!type) { // neither type nor initializer\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range(tn.pos)\r\n ); // recoverable\r\n }\r\n }\r\n var range = Range.join(identifier.range, tn.range());\r\n if ((flags & CommonFlags.DEFINITE_ASSIGNMENT) && initializer) {\r\n this.error(\r\n DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,\r\n range);\r\n }\r\n return Node.createVariableDeclaration(\r\n identifier,\r\n type,\r\n initializer,\r\n parentDecorators,\r\n flags,\r\n range\r\n );\r\n }\r\n\r\n parseEnum(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): EnumDeclaration | null {\r\n\r\n // at 'enum': Identifier '{' (EnumValueDeclaration (',' EnumValueDeclaration )*)? '}' ';'?\r\n\r\n if (tn.next() != Token.IDENTIFIER) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.next() != Token.OPENBRACE) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n var members = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let member = this.parseEnumValue(tn, CommonFlags.NONE);\r\n if (!member) return null;\r\n members.push(member);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACE)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n var ret = Node.createEnumDeclaration(\r\n identifier,\r\n members,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseEnumValue(\r\n tn: Tokenizer,\r\n parentFlags: CommonFlags\r\n ): EnumValueDeclaration | null {\r\n\r\n // before: Identifier ('=' Expression)?\r\n\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var value: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n value = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!value) return null;\r\n }\r\n return Node.createEnumValueDeclaration(\r\n identifier,\r\n value,\r\n parentFlags,\r\n Range.join(identifier.range, tn.range())\r\n );\r\n }\r\n\r\n parseReturn(\r\n tn: Tokenizer\r\n ): ReturnStatement | null {\r\n\r\n // at 'return': Expression | (';' | '}' | ...'\\n')\r\n\r\n var expr: Expression | null = null;\r\n if (\r\n tn.peek(true) != Token.SEMICOLON &&\r\n tn.nextToken != Token.CLOSEBRACE &&\r\n !tn.nextTokenOnNewLine\r\n ) {\r\n if (!(expr = this.parseExpression(tn))) return null;\r\n }\r\n\r\n var ret = Node.createReturnStatement(expr, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseTypeParameters(\r\n tn: Tokenizer\r\n ): TypeParameterNode[] | null {\r\n\r\n // at '<': TypeParameter (',' TypeParameter)* '>'\r\n\r\n var typeParameters = new Array();\r\n var seenOptional = false;\r\n while (!tn.skip(Token.GREATERTHAN)) {\r\n let typeParameter = this.parseTypeParameter(tn);\r\n if (!typeParameter) return null;\r\n if (typeParameter.defaultType !== null) {\r\n seenOptional = true;\r\n } else if (seenOptional) {\r\n this.error(\r\n DiagnosticCode.Required_type_parameters_may_not_follow_optional_type_parameters,\r\n typeParameter.range\r\n );\r\n typeParameter.defaultType = null;\r\n }\r\n typeParameters.push(typeParameter);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.GREATERTHAN)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \">\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n if (typeParameters.length === 0) {\r\n this.error(\r\n DiagnosticCode.Type_parameter_list_cannot_be_empty,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n return typeParameters;\r\n }\r\n\r\n parseTypeParameter(\r\n tn: Tokenizer\r\n ): TypeParameterNode | null {\r\n\r\n // before: Identifier ('extends' Type)? ('=' Type)?\r\n\r\n if (tn.next() == Token.IDENTIFIER) {\r\n let identifier = Node.createIdentifierExpression(\r\n tn.readIdentifier(),\r\n tn.range()\r\n );\r\n let extendsType: TypeNode | null = null;\r\n if (tn.skip(Token.EXTENDS)) {\r\n let t = this.parseType(tn);\r\n if (!t) return null;\r\n if (t.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n t.range\r\n );\r\n return null;\r\n }\r\n extendsType = t;\r\n }\r\n let defaultType: TypeNode | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n let t = this.parseType(tn);\r\n if (!t) return null;\r\n if (t.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n t.range\r\n );\r\n return null;\r\n }\r\n defaultType = t;\r\n }\r\n return Node.createTypeParameter(\r\n identifier,\r\n extendsType,\r\n defaultType,\r\n Range.join(identifier.range, tn.range())\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private parseParametersThis: TypeNode | null = null;\r\n\r\n parseParameters(\r\n tn: Tokenizer,\r\n isConstructor: bool = false\r\n ): ParameterNode[] | null {\r\n\r\n // at '(': (Parameter (',' Parameter)*)? ')'\r\n\r\n var parameters = new Array();\r\n var seenRest: ParameterNode | null = null;\r\n var seenOptional = false;\r\n var reportedRest = false;\r\n var thisType: CommonTypeNode | null = null;\r\n\r\n // check if there is a leading `this` parameter\r\n this.parseParametersThis = null;\r\n if (tn.skip(Token.THIS)) {\r\n if (tn.skip(Token.COLON)) {\r\n thisType = this.parseType(tn); // reports\r\n if (!thisType) return null;\r\n if (thisType.kind == NodeKind.TYPE) {\r\n this.parseParametersThis = thisType;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n thisType.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n return parameters;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n while (!tn.skip(Token.CLOSEPAREN)) {\r\n let param = this.parseParameter(tn, isConstructor); // reports\r\n if (!param) return null;\r\n if (seenRest && !reportedRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,\r\n seenRest.name.range\r\n );\r\n reportedRest = true;\r\n }\r\n switch (param.parameterKind) {\r\n default: {\r\n if (seenOptional) {\r\n this.error(\r\n DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,\r\n param.name.range\r\n );\r\n }\r\n break;\r\n }\r\n case ParameterKind.OPTIONAL: {\r\n seenOptional = true;\r\n break;\r\n }\r\n case ParameterKind.REST: {\r\n seenRest = param;\r\n break;\r\n }\r\n }\r\n parameters.push(param);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n return parameters;\r\n }\r\n\r\n parseParameter(\r\n tn: Tokenizer,\r\n isConstructor: bool = false\r\n ): ParameterNode | null {\r\n\r\n // before: ('public' | 'private' | 'protected' | '...')? Identifier '?'? (':' Type)? ('=' Expression)?\r\n\r\n var isRest = false;\r\n var isOptional = false;\r\n var startRange: Range | null = null;\r\n var accessFlags: CommonFlags = CommonFlags.NONE;\r\n if (isConstructor) {\r\n if (tn.skip(Token.PUBLIC)) {\r\n startRange = tn.range();\r\n accessFlags |= CommonFlags.PUBLIC;\r\n } else if (tn.skip(Token.PROTECTED)) {\r\n startRange = tn.range();\r\n accessFlags |= CommonFlags.PROTECTED;\r\n } else if (tn.skip(Token.PRIVATE)) {\r\n startRange = tn.range();\r\n accessFlags |= CommonFlags.PRIVATE;\r\n }\r\n if (tn.peek() == Token.READONLY) {\r\n let state = tn.mark();\r\n tn.next();\r\n if (tn.peek() != Token.COLON) { // modifier\r\n tn.discard(state);\r\n if (!startRange) startRange = tn.range();\r\n accessFlags |= CommonFlags.READONLY;\r\n } else { // identifier\r\n tn.reset(state);\r\n }\r\n }\r\n }\r\n if (tn.skip(Token.DOT_DOT_DOT)) {\r\n if (accessFlags) {\r\n this.error(\r\n DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,\r\n tn.range()\r\n );\r\n } else {\r\n startRange = tn.range();\r\n }\r\n isRest = true;\r\n }\r\n if (tn.skipIdentifier()) {\r\n if (!isRest) startRange = tn.range();\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let type: CommonTypeNode | null = null;\r\n if (isOptional = tn.skip(Token.QUESTION)) {\r\n if (isRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\r\n identifier.range\r\n );\r\n }\r\n }\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type) return null;\r\n } else {\r\n type = Node.createOmittedType(tn.range(tn.pos));\r\n }\r\n let initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n if (isRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,\r\n identifier.range\r\n );\r\n }\r\n if (isOptional) {\r\n this.error(\r\n DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,\r\n identifier.range\r\n );\r\n } else {\r\n isOptional = true;\r\n }\r\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!initializer) return null;\r\n }\r\n let param = Node.createParameter(\r\n identifier,\r\n type,\r\n initializer,\r\n isRest\r\n ? ParameterKind.REST\r\n : isOptional\r\n ? ParameterKind.OPTIONAL\r\n : ParameterKind.DEFAULT,\r\n Range.join(startRange, tn.range())\r\n );\r\n param.flags |= accessFlags;\r\n return param;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseFunction(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): FunctionDeclaration | null {\r\n\r\n // at 'function':\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // '(' Parameters (':' Type)?\r\n // '{' Statement* '}'\r\n // ';'?\r\n\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range(tn.pos)\r\n );\r\n return null;\r\n }\r\n\r\n var name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var signatureStart: i32 = -1;\r\n\r\n var typeParameters: TypeParameterNode[] | null = null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n signatureStart = tn.tokenPos;\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n flags |= CommonFlags.GENERIC;\r\n }\r\n\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"(\"\r\n );\r\n return null;\r\n }\r\n\r\n if (signatureStart < 0) {\r\n signatureStart = tn.tokenPos;\r\n }\r\n\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters) return null;\r\n var thisType = this.parseParametersThis;\r\n\r\n var isSetter = (flags & CommonFlags.SET) != 0;\r\n if (isSetter) {\r\n if (parameters.length != 1) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n name.range\r\n ); // recoverable\r\n }\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n name.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n if (flags & CommonFlags.GET) {\r\n if (parameters.length) {\r\n this.error(\r\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n name.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n var returnType: CommonTypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n returnType = this.parseType(tn, true, isSetter);\r\n if (!returnType) return null;\r\n }\r\n\r\n if (!returnType) {\r\n returnType = Node.createOmittedType(\r\n tn.range(tn.pos)\r\n );\r\n if (!isSetter) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n returnType.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n var signature = Node.createSignature(\r\n parameters,\r\n returnType,\r\n thisType,\r\n false,\r\n tn.range(signatureStart, tn.pos)\r\n );\r\n\r\n var body: Statement | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n if (flags & CommonFlags.AMBIENT) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n\r\n body = this.parseBlockStatement(tn, false);\r\n if (!body) return null;\r\n } else if (!(flags & CommonFlags.AMBIENT)) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n tn.range(tn.pos)\r\n );\r\n }\r\n\r\n var ret = Node.createFunctionDeclaration(\r\n name,\r\n typeParameters,\r\n signature,\r\n body,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseFunctionExpression(tn: Tokenizer): FunctionExpression | null {\r\n var startPos = tn.tokenPos;\r\n var name: IdentifierExpression;\r\n var isArrow = false;\r\n\r\n // either at 'function':\r\n // Identifier?\r\n // '(' Parameters (':' Type)?\r\n // Statement\r\n\r\n if (tn.token == Token.FUNCTION) {\r\n if (tn.skipIdentifier()) {\r\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else { // empty name\r\n name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\r\n }\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"(\"\r\n );\r\n return null;\r\n }\r\n\r\n // or at '(' of arrow function:\r\n // Parameters (':' Type)?\r\n // Statement\r\n\r\n } else {\r\n isArrow = true;\r\n assert(tn.token == Token.OPENPAREN);\r\n name = Node.createEmptyIdentifierExpression(tn.range(tn.tokenPos));\r\n }\r\n\r\n // TODO: type parameters? doesn't seem worth it.\r\n\r\n var signatureStart = tn.pos;\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters) return null;\r\n\r\n return this.parseFunctionExpressionCommon(tn, name, parameters, isArrow, startPos, signatureStart);\r\n }\r\n\r\n private parseFunctionExpressionCommon(\r\n tn: Tokenizer,\r\n name: IdentifierExpression,\r\n parameters: ParameterNode[],\r\n isArrow: bool,\r\n startPos: i32 = -1,\r\n signatureStart: i32 = -1\r\n ): FunctionExpression | null {\r\n if (startPos < 0) startPos = name.range.start;\r\n if (signatureStart < 0) signatureStart = startPos;\r\n\r\n var returnType: CommonTypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n returnType = this.parseType(tn);\r\n if (!returnType) return null;\r\n } else {\r\n returnType = Node.createOmittedType(tn.range(tn.pos));\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n returnType.range\r\n ); // recoverable\r\n }\r\n\r\n if (isArrow) {\r\n if (!tn.skip(Token.EQUALS_GREATERTHAN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"=>\"\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n var signature = Node.createSignature(\r\n parameters,\r\n returnType,\r\n null, // TODO?\r\n false,\r\n tn.range(signatureStart, tn.pos)\r\n );\r\n\r\n var body: Statement | null;\r\n if (isArrow) {\r\n body = this.parseStatement(tn, false);\r\n } else {\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"{\"\r\n );\r\n return null;\r\n }\r\n body = this.parseBlockStatement(tn, false);\r\n }\r\n if (!body) return null;\r\n\r\n var declaration = Node.createFunctionDeclaration(\r\n name,\r\n null,\r\n signature,\r\n body,\r\n null,\r\n isArrow ? CommonFlags.ARROW : CommonFlags.NONE,\r\n tn.range(startPos, tn.pos)\r\n );\r\n return Node.createFunctionExpression(declaration);\r\n }\r\n\r\n parseClassOrInterface(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): ClassDeclaration | null {\r\n\r\n // at ('class' | 'interface'):\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // ('extends' Type)?\r\n // ('implements' Type (',' Type)*)?\r\n // '{' ClassMember* '}'\r\n\r\n var isInterface = tn.token == Token.INTERFACE;\r\n\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n\r\n var identifier = Node.createIdentifierExpression(\r\n tn.readIdentifier(),\r\n tn.range()\r\n );\r\n\r\n var typeParameters: TypeParameterNode[] | null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n flags |= CommonFlags.GENERIC;\r\n } else {\r\n typeParameters = [];\r\n }\r\n\r\n var extendsType: TypeNode | null = null;\r\n if (tn.skip(Token.EXTENDS)) {\r\n let t = this.parseType(tn);\r\n if (!t) return null;\r\n if (t.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n t.range\r\n );\r\n return null;\r\n }\r\n extendsType = t;\r\n }\r\n\r\n var implementsTypes: TypeNode[] | null = null;\r\n if (tn.skip(Token.IMPLEMENTS)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode.Interface_declaration_cannot_have_implements_clause,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n do {\r\n let type = this.parseType(tn);\r\n if (!type) return null;\r\n if (!isInterface) {\r\n if (!implementsTypes) implementsTypes = [];\r\n implementsTypes.push(type);\r\n }\r\n } while (tn.skip(Token.COMMA));\r\n }\r\n\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n\r\n var members = new Array();\r\n var declaration: ClassDeclaration;\r\n if (isInterface) {\r\n assert(!implementsTypes);\r\n declaration = Node.createInterfaceDeclaration(\r\n identifier,\r\n typeParameters,\r\n extendsType,\r\n members,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n declaration = Node.createClassDeclaration(\r\n identifier,\r\n typeParameters,\r\n extendsType,\r\n implementsTypes,\r\n members,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n do {\r\n let member = this.parseClassMember(tn, declaration);\r\n if (!member) return null;\r\n member.parent = declaration;\r\n members.push(member);\r\n } while (!tn.skip(Token.CLOSEBRACE));\r\n }\r\n return declaration;\r\n }\r\n\r\n parseClassExpression(tn: Tokenizer): ClassExpression | null {\r\n\r\n // at 'class': Identifier? '{' ... '}'\r\n\r\n var startPos = tn.tokenPos;\r\n var name: IdentifierExpression;\r\n\r\n if (tn.skipIdentifier()) {\r\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\r\n }\r\n\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"{\"\r\n );\r\n return null;\r\n }\r\n\r\n var members = new Array();\r\n var declaration = Node.createClassDeclaration(\r\n name,\r\n [],\r\n null,\r\n null,\r\n members,\r\n null,\r\n CommonFlags.NONE,\r\n tn.range(startPos, tn.pos)\r\n );\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n do {\r\n let member = this.parseClassMember(tn, declaration);\r\n if (!member) return null;\r\n member.parent = declaration;\r\n members.push(member);\r\n } while (!tn.skip(Token.CLOSEBRACE));\r\n }\r\n return Node.createClassExpression(declaration);\r\n }\r\n\r\n parseClassMember(\r\n tn: Tokenizer,\r\n parent: ClassDeclaration\r\n ): DeclarationStatement | null {\r\n\r\n // before:\r\n // ('public' | 'private' | 'protected')?\r\n // ('static' | 'abstract')?\r\n // 'readonly'?\r\n // ('get' | 'set')?\r\n // Identifier ...\r\n\r\n var startPos = tn.pos;\r\n var isInterface = parent.kind == NodeKind.INTERFACEDECLARATION;\r\n\r\n var decorators = new Array();\r\n if (tn.skip(Token.AT)) {\r\n do {\r\n let decorator = this.parseDecorator(tn);\r\n if (!decorator) break;\r\n decorators.push(decorator);\r\n } while (tn.skip(Token.AT));\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode.Decorators_are_not_valid_here,\r\n Range.join(decorators[0].range, decorators[decorators.length - 1].range)\r\n );\r\n }\r\n }\r\n\r\n // inherit ambient status\r\n var flags = parent.flags & CommonFlags.AMBIENT;\r\n\r\n // implemented methods are virtual\r\n if (isInterface) flags |= CommonFlags.VIRTUAL;\r\n\r\n var accessStart = 0;\r\n var accessEnd = 0;\r\n if (tn.skip(Token.PUBLIC)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"public\"\r\n );\r\n }\r\n flags |= CommonFlags.PUBLIC;\r\n accessStart = tn.tokenPos;\r\n accessEnd = tn.pos;\r\n } else if (tn.skip(Token.PRIVATE)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"private\"\r\n );\r\n }\r\n flags |= CommonFlags.PRIVATE;\r\n accessStart = tn.tokenPos;\r\n accessEnd = tn.pos;\r\n } else if (tn.skip(Token.PROTECTED)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"protected\"\r\n );\r\n }\r\n flags |= CommonFlags.PROTECTED;\r\n accessStart = tn.tokenPos;\r\n accessEnd = tn.pos;\r\n }\r\n\r\n var staticStart = 0;\r\n var staticEnd = 0;\r\n var abstractStart = 0;\r\n var abstractEnd = 0;\r\n if (tn.skip(Token.STATIC)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"static\"\r\n );\r\n }\r\n flags |= CommonFlags.STATIC;\r\n staticStart = tn.tokenPos;\r\n staticEnd = tn.pos;\r\n } else {\r\n flags |= CommonFlags.INSTANCE;\r\n if (tn.skip(Token.ABSTRACT)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"abstract\"\r\n );\r\n }\r\n flags |= CommonFlags.ABSTRACT;\r\n abstractStart = tn.tokenPos;\r\n abstractEnd = tn.pos;\r\n }\r\n if (parent.flags & CommonFlags.GENERIC) flags |= CommonFlags.GENERIC_CONTEXT;\r\n }\r\n\r\n var readonlyStart: i32 = 0;\r\n var readonlyEnd: i32 = 0;\r\n if (tn.skip(Token.READONLY)) {\r\n flags |= CommonFlags.READONLY;\r\n readonlyStart = tn.tokenPos;\r\n readonlyEnd = tn.pos;\r\n }\r\n\r\n // check if accessor: ('get' | 'set') ^\\n Identifier\r\n var state = tn.mark();\r\n var isConstructor = false;\r\n var isGetter = false;\r\n var getStart: i32 = 0;\r\n var getEnd: i32 = 0;\r\n var isSetter = false;\r\n var setStart: i32 = 0;\r\n var setEnd: i32 = 0;\r\n if (!isInterface) {\r\n if (tn.skip(Token.GET)) {\r\n if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n flags |= CommonFlags.GET;\r\n isGetter = true;\r\n setStart = tn.tokenPos;\r\n setEnd = tn.pos;\r\n if (flags & CommonFlags.READONLY) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n ); // recoverable\r\n }\r\n } else {\r\n tn.reset(state);\r\n }\r\n } else if (tn.skip(Token.SET)) {\r\n if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n flags |= CommonFlags.SET;\r\n isSetter = true;\r\n setStart = tn.tokenPos;\r\n setEnd = tn.pos;\r\n if (flags & CommonFlags.READONLY) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n ); // recoverable\r\n }\r\n } else {\r\n tn.reset(state);\r\n }\r\n } else if (tn.skip(Token.CONSTRUCTOR)) {\r\n flags |= CommonFlags.CONSTRUCTOR;\r\n isConstructor = true;\r\n if (flags & CommonFlags.STATIC) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(staticStart, staticEnd), \"static\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.ABSTRACT) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(abstractStart, abstractEnd), \"abstract\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.READONLY) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n ); // recoverable\r\n }\r\n }\r\n }\r\n\r\n var name: IdentifierExpression;\r\n if (isConstructor) {\r\n name = Node.createConstructorExpression(tn.range());\r\n } else {\r\n if (!(isGetter || isSetter) && tn.skip(Token.OPENBRACKET)) {\r\n // TODO: also handle symbols, which might have some of these modifiers\r\n if (flags & CommonFlags.PUBLIC) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(accessStart, accessEnd), \"public\"\r\n ); // recoverable\r\n } else if (flags & CommonFlags.PROTECTED) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(accessStart, accessEnd), \"protected\"\r\n ); // recoverable\r\n } else if (flags & CommonFlags.PRIVATE) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(accessStart, accessEnd), \"protected\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.STATIC) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(staticStart, staticEnd), \"static\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.ABSTRACT) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(abstractStart, abstractEnd), \"abstract\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.READONLY) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n ); // recoverable\r\n }\r\n let retIndex = this.parseIndexSignatureDeclaration(tn, decorators);\r\n if (!retIndex) return null;\r\n tn.skip(Token.SEMICOLON);\r\n return retIndex;\r\n }\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var typeParameters: TypeParameterNode[] | null = null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n let typeParametersStart = tn.tokenPos;\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n if (isConstructor) {\r\n this.error(\r\n DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,\r\n tn.range(typeParametersStart, tn.pos)\r\n ); // recoverable\r\n } else if (isGetter || isSetter) {\r\n this.error(\r\n DiagnosticCode.An_accessor_cannot_have_type_parameters,\r\n tn.range(typeParametersStart, tn.pos)\r\n ); // recoverable\r\n } else {\r\n flags |= CommonFlags.GENERIC;\r\n }\r\n }\r\n\r\n // method: '(' Parameters (':' Type)? '{' Statement* '}' ';'?\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let signatureStart = tn.tokenPos;\r\n let parameters = this.parseParameters(tn, isConstructor);\r\n if (!parameters) return null;\r\n let thisType = this.parseParametersThis;\r\n if (isConstructor) {\r\n for (let i = 0, k = parameters.length; i < k; ++i) {\r\n let parameter = parameters[i];\r\n if (parameter.isAny(\r\n CommonFlags.PUBLIC |\r\n CommonFlags.PROTECTED |\r\n CommonFlags.PRIVATE |\r\n CommonFlags.READONLY\r\n )) {\r\n let implicitFieldDeclaration = Node.createFieldDeclaration(\r\n parameter.name,\r\n parameter.type,\r\n null, // initialized via parameter\r\n null,\r\n parameter.flags | CommonFlags.INSTANCE,\r\n parameter.range\r\n );\r\n implicitFieldDeclaration.parameterIndex = i;\r\n implicitFieldDeclaration.parent = parent;\r\n parameter.implicitFieldDeclaration = implicitFieldDeclaration;\r\n parent.members.push(implicitFieldDeclaration);\r\n }\r\n }\r\n } else if (isGetter) {\r\n if (parameters.length) {\r\n this.error(\r\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n name.range\r\n );\r\n }\r\n } else if (isSetter) {\r\n if (parameters.length != 1) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n name.range\r\n );\r\n }\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n name.range\r\n );\r\n }\r\n }\r\n\r\n let returnType: CommonTypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n if (name.kind == NodeKind.CONSTRUCTOR) {\r\n this.error(\r\n DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration,\r\n tn.range()\r\n );\r\n } else if (isSetter) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation,\r\n tn.range()\r\n );\r\n }\r\n returnType = this.parseType(tn, name.kind == NodeKind.CONSTRUCTOR || isSetter);\r\n if (!returnType) return null;\r\n } else {\r\n returnType = Node.createOmittedType(tn.range(tn.pos));\r\n if (!isSetter && name.kind != NodeKind.CONSTRUCTOR) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n returnType.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n let signature = Node.createSignature(\r\n parameters,\r\n returnType,\r\n thisType,\r\n false,\r\n tn.range(signatureStart, tn.pos)\r\n );\r\n\r\n let body: Statement | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n if (flags & CommonFlags.AMBIENT) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n } else if (flags & CommonFlags.ABSTRACT) {\r\n this.error(\r\n DiagnosticCode.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract,\r\n tn.range(), name.text\r\n ); // recoverable\r\n }\r\n body = this.parseBlockStatement(tn, false);\r\n if (!body) return null;\r\n } else if (!(flags & CommonFlags.AMBIENT) && !isInterface) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n\r\n let retMethod = Node.createMethodDeclaration(\r\n name,\r\n typeParameters,\r\n signature,\r\n body,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return retMethod;\r\n\r\n } else if (isConstructor) {\r\n this.error(\r\n DiagnosticCode.Constructor_implementation_is_missing,\r\n name.range\r\n );\r\n\r\n } else if (isGetter || isSetter) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n name.range\r\n );\r\n\r\n // field: (':' Type)? ('=' Expression)? ';'?\r\n } else {\r\n if (flags & CommonFlags.ABSTRACT) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(abstractStart, abstractEnd), \"abstract\"\r\n ); // recoverable\r\n }\r\n\r\n if (flags & CommonFlags.GET) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(getStart, getEnd), \"get\"\r\n ); // recoverable\r\n }\r\n\r\n if (flags & CommonFlags.SET) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(setStart, setEnd), \"set\"\r\n ); // recoverable\r\n }\r\n\r\n let type: CommonTypeNode | null = null;\r\n if (tn.skip(Token.QUESTION)) {\r\n this.error(\r\n DiagnosticCode.Optional_properties_are_not_supported,\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n if (tn.skip(Token.EXCLAMATION)) {\r\n flags |= CommonFlags.DEFINITE_ASSIGNMENT;\r\n }\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type) return null;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n let initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n initializer = this.parseExpression(tn);\r\n if (!initializer) return null;\r\n }\r\n let range = tn.range(startPos, tn.pos);\r\n if ((flags & CommonFlags.DEFINITE_ASSIGNMENT) && ((flags & CommonFlags.STATIC) || isInterface || initializer)) {\r\n this.error(\r\n DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,\r\n range\r\n );\r\n }\r\n let retField = Node.createFieldDeclaration(\r\n name,\r\n type,\r\n initializer,\r\n decorators,\r\n flags,\r\n range\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return retField;\r\n }\r\n return null;\r\n }\r\n\r\n parseIndexSignatureDeclaration(tn: Tokenizer, decorators: DecoratorNode[]): IndexSignatureDeclaration | null {\r\n\r\n // at: '[': 'key' ':' Type ']' ':' Type\r\n\r\n if (decorators.length) {\r\n this.error(\r\n DiagnosticCode.Decorators_are_not_valid_here,\r\n Range.join(decorators[0].range, decorators[decorators.length - 1].range)\r\n ); // recoverable\r\n }\r\n\r\n var start = tn.tokenPos;\r\n if (tn.skipIdentifier()) {\r\n let id = tn.readIdentifier();\r\n if (id == \"key\") {\r\n if (tn.skip(Token.COLON)) {\r\n let keyType = this.parseType(tn);\r\n if (!keyType) return null;\r\n if (keyType.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n if (tn.skip(Token.CLOSEBRACKET)) {\r\n if (tn.skip(Token.COLON)) {\r\n let valueType = this.parseType(tn);\r\n if (!valueType) return null;\r\n return Node.createIndexSignatureDeclaration(keyType, valueType, tn.range(start, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"key\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseNamespace(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): NamespaceDeclaration | null {\r\n\r\n // at 'namespace': Identifier '{' (Variable | Function)* '}'\r\n\r\n if (tn.skipIdentifier()) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(Token.OPENBRACE)) {\r\n let members = new Array();\r\n let ns = Node.createNamespaceDeclaration(\r\n identifier,\r\n members,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let member = this.parseTopLevelStatement(tn, ns);\r\n if (!member) return null;\r\n member.parent = ns;\r\n members.push(member);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ns;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExport(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n startPos: i32\r\n ): ExportStatement | null {\r\n\r\n // at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?\r\n\r\n var path: StringLiteralExpression | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n let members = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let member = this.parseExportMember(tn);\r\n if (!member) return null;\r\n members.push(member);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACE)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n if (tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n let ret = Node.createExportStatement(members, path, flags, tn.range(startPos, tn.pos));\r\n let internalPath = ret.internalPath;\r\n if (internalPath !== null && !this.seenlog.has(internalPath)) {\r\n this.backlog.push(internalPath);\r\n this.seenlog.add(internalPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else if (tn.skip(Token.ASTERISK)) {\r\n if (tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n let ret = Node.createExportStatement(null, path, flags, tn.range(startPos, tn.pos));\r\n let internalPath = assert(ret.internalPath);\r\n let source = tn.source;\r\n if (!source.exportPaths) source.exportPaths = new Set();\r\n source.exportPaths.add(internalPath);\r\n if (!this.seenlog.has(internalPath)) {\r\n this.backlog.push(internalPath);\r\n this.seenlog.add(internalPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"from\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExportMember(\r\n tn: Tokenizer\r\n ): ExportMember | null {\r\n\r\n // before: Identifier ('as' Identifier)?\r\n\r\n if (tn.skipIdentifier()) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let asIdentifier: IdentifierExpression | null = null;\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {\r\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n return Node.createExportMember(\r\n identifier,\r\n asIdentifier,\r\n asIdentifier\r\n ? Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseImport(\r\n tn: Tokenizer\r\n ): ImportStatement | null {\r\n\r\n // at 'import':\r\n // ('{' (ImportMember (',' ImportMember)* '}') | ('*' 'as' Identifier)?\r\n // 'from' StringLiteral ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var members: ImportDeclaration[] | null = null;\r\n var namespaceName: IdentifierExpression | null = null;\r\n var skipFrom = false;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n members = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let member = this.parseImportDeclaration(tn);\r\n if (!member) return null;\r\n members.push(member);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACE)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n } else if (tn.skip(Token.ASTERISK)) {\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skipIdentifier()) {\r\n namespaceName = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"as\"\r\n );\r\n return null;\r\n }\r\n } else {\r\n skipFrom = true;\r\n }\r\n\r\n if (skipFrom || tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n let path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n let ret: ImportStatement;\r\n if (namespaceName) {\r\n assert(!members);\r\n ret = Node.createImportStatementWithWildcard(namespaceName, path, tn.range(startPos, tn.pos));\r\n } else {\r\n ret = Node.createImportStatement(members, path, tn.range(startPos, tn.pos));\r\n }\r\n let internalPath = ret.internalPath;\r\n if (!this.seenlog.has(internalPath)) {\r\n this.backlog.push(internalPath);\r\n this.seenlog.add(internalPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"from\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseImportDeclaration(\r\n tn: Tokenizer\r\n ): ImportDeclaration | null {\r\n\r\n // before: Identifier ('as' Identifier)?\r\n\r\n if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let asIdentifier: IdentifierExpression | null = null;\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skipIdentifier()) {\r\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n return Node.createImportDeclaration(\r\n identifier,\r\n asIdentifier,\r\n asIdentifier\r\n ? Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExportImport(\r\n tn: Tokenizer,\r\n startPos: i32\r\n ): ExportImportStatement | null {\r\n\r\n // at 'export' 'import': Identifier ('=' Identifier)? ';'?\r\n\r\n if (tn.skipIdentifier()) {\r\n let asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(Token.EQUALS)) {\r\n if (tn.skipIdentifier()) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let ret = Node.createExportImportStatement(identifier, asIdentifier, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseStatement(\r\n tn: Tokenizer,\r\n topLevel: bool = false\r\n ): Statement | null {\r\n\r\n // at previous token\r\n\r\n var state = tn.mark();\r\n var token = tn.next();\r\n var statement: Statement | null = null;\r\n switch (token) {\r\n case Token.BREAK: {\r\n statement = this.parseBreak(tn);\r\n break;\r\n }\r\n case Token.CONST: {\r\n statement = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\r\n break;\r\n }\r\n case Token.CONTINUE: {\r\n statement = this.parseContinue(tn);\r\n break;\r\n }\r\n case Token.DO: {\r\n statement = this.parseDoStatement(tn);\r\n break;\r\n }\r\n case Token.FOR: {\r\n statement = this.parseForStatement(tn);\r\n break;\r\n }\r\n case Token.IF: {\r\n statement = this.parseIfStatement(tn);\r\n break;\r\n }\r\n case Token.LET: {\r\n statement = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\r\n break;\r\n }\r\n case Token.VAR: {\r\n statement = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n break;\r\n }\r\n case Token.OPENBRACE: {\r\n statement = this.parseBlockStatement(tn, topLevel);\r\n break;\r\n }\r\n case Token.RETURN: {\r\n if (topLevel) {\r\n this.error(\r\n DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n statement = this.parseReturn(tn);\r\n break;\r\n }\r\n case Token.SEMICOLON: {\r\n return Node.createEmptyStatement(tn.range(tn.tokenPos));\r\n }\r\n case Token.SWITCH: {\r\n statement = this.parseSwitchStatement(tn);\r\n break;\r\n }\r\n case Token.THROW: {\r\n statement = this.parseThrowStatement(tn);\r\n break;\r\n }\r\n case Token.TRY: {\r\n statement = this.parseTryStatement(tn);\r\n break;\r\n }\r\n case Token.VOID: {\r\n statement = this.parseVoidStatement(tn);\r\n break;\r\n }\r\n case Token.WHILE: {\r\n statement = this.parseWhileStatement(tn);\r\n break;\r\n }\r\n case Token.TYPE: { // also identifier\r\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n statement = this.parseTypeDeclaration(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: {\r\n tn.reset(state);\r\n statement = this.parseExpressionStatement(tn);\r\n break;\r\n }\r\n }\r\n if (!statement) { // has been reported\r\n tn.reset(state);\r\n this.skipStatement(tn);\r\n } else {\r\n tn.discard(state);\r\n }\r\n return statement;\r\n }\r\n\r\n parseBlockStatement(\r\n tn: Tokenizer,\r\n topLevel: bool\r\n ): BlockStatement | null {\r\n\r\n // at '{': Statement* '}' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var statements = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let state = tn.mark();\r\n let statement = this.parseStatement(tn, topLevel);\r\n if (!statement) {\r\n if (tn.token == Token.ENDOFFILE) return null;\r\n tn.reset(state);\r\n this.skipStatement(tn);\r\n } else {\r\n tn.discard(state);\r\n statements.push(statement);\r\n }\r\n }\r\n var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseBreak(\r\n tn: Tokenizer\r\n ): BreakStatement | null {\r\n\r\n // at 'break': Identifier? ';'?\r\n\r\n var identifier: IdentifierExpression | null = null;\r\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(IdentifierHandling.PREFER);\r\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = Node.createBreakStatement(identifier, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseContinue(\r\n tn: Tokenizer\r\n ): ContinueStatement | null {\r\n\r\n // at 'continue': Identifier? ';'?\r\n\r\n var identifier: IdentifierExpression | null = null;\r\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(IdentifierHandling.PREFER);\r\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = Node.createContinueStatement(identifier, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseDoStatement(\r\n tn: Tokenizer\r\n ): DoStatement | null {\r\n\r\n // at 'do': Statement 'while' '(' Expression ')' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n\r\n if (tn.skip(Token.WHILE)) {\r\n\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n let ret = Node.createDoStatement(statement, condition, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"while\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExpressionStatement(\r\n tn: Tokenizer\r\n ): ExpressionStatement | null {\r\n\r\n // at previous token\r\n\r\n var expr = this.parseExpression(tn);\r\n if (!expr) return null;\r\n\r\n var ret = Node.createExpressionStatement(expr);\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseForStatement(\r\n tn: Tokenizer\r\n ): ForStatement | null {\r\n\r\n // at 'for': '(' Statement? Expression? ';' Expression? ')' Statement\r\n\r\n var startPos = tn.tokenPos;\r\n\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let initializer: Statement | null = null;\r\n\r\n if (tn.skip(Token.CONST)) {\r\n initializer = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\r\n } else if (tn.skip(Token.LET)) {\r\n initializer = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\r\n } else if (tn.skip(Token.VAR)) {\r\n initializer = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n\r\n } else if (!tn.skip(Token.SEMICOLON)) {\r\n initializer = this.parseExpressionStatement(tn);\r\n if (!initializer) return null;\r\n }\r\n\r\n if (tn.token == Token.SEMICOLON) {\r\n let condition: ExpressionStatement | null = null;\r\n if (!tn.skip(Token.SEMICOLON)) {\r\n condition = this.parseExpressionStatement(tn);\r\n if (!condition) return null;\r\n }\r\n\r\n if (tn.token == Token.SEMICOLON) {\r\n let incrementor: Expression | null = null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n incrementor = this.parseExpression(tn);\r\n if (!incrementor) return null;\r\n\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n let statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n\r\n return Node.createForStatement(\r\n initializer,\r\n condition\r\n ? condition.expression\r\n : null,\r\n incrementor,\r\n statement,\r\n tn.range(startPos, tn.pos)\r\n );\r\n\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \";\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \";\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseIfStatement(\r\n tn: Tokenizer\r\n ): IfStatement | null {\r\n\r\n // at 'if': '(' Expression ')' Statement ('else' Statement)?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n let statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n let elseStatement: Statement | null = null;\r\n if (tn.skip(Token.ELSE)) {\r\n elseStatement = this.parseStatement(tn);\r\n if (!elseStatement) return null;\r\n }\r\n return Node.createIfStatement(\r\n condition,\r\n statement,\r\n elseStatement,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseSwitchStatement(\r\n tn: Tokenizer\r\n ): SwitchStatement | null {\r\n\r\n // at 'switch': '(' Expression ')' '{' SwitchCase* '}' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n if (tn.skip(Token.OPENBRACE)) {\r\n let cases = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let case_ = this.parseSwitchCase(tn);\r\n if (!case_) return null;\r\n cases.push(case_);\r\n }\r\n let ret = Node.createSwitchStatement(condition, cases, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseSwitchCase(\r\n tn: Tokenizer\r\n ): SwitchCase | null {\r\n\r\n var startPos = tn.tokenPos;\r\n var statements: Statement[],\r\n statement: Statement | null;\r\n\r\n // 'case' Expression ':' Statement*\r\n\r\n if (tn.skip(Token.CASE)) {\r\n let label = this.parseExpression(tn);\r\n if (!label) return null;\r\n if (tn.skip(Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n return Node.createSwitchCase(label, statements, tn.range(startPos, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n\r\n // 'default' ':' Statement*\r\n\r\n } else if (tn.skip(Token.DEFAULT)) {\r\n if (tn.skip(Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n return Node.createSwitchCase(null, statements, tn.range(startPos, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._case_or_default_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseThrowStatement(\r\n tn: Tokenizer\r\n ): ThrowStatement | null {\r\n\r\n // at 'throw': Expression ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var expression = this.parseExpression(tn);\r\n if (!expression) return null;\r\n var ret = Node.createThrowStatement(expression, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseTryStatement(\r\n tn: Tokenizer\r\n ): TryStatement | null {\r\n\r\n // at 'try':\r\n // '{' Statement* '}'\r\n // ('catch' '(' VariableMember ')' '{' Statement* '}')?\r\n // ('finally' '{' Statement* '}'? ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var stmt: Statement | null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n let statements = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n statements.push(stmt);\r\n }\r\n let catchVariable: IdentifierExpression | null = null;\r\n let catchStatements: Statement[] | null = null;\r\n let finallyStatements: Statement[] | null = null;\r\n if (tn.skip(Token.CATCH)) {\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n catchVariable = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n catchStatements = [];\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n catchStatements.push(stmt);\r\n }\r\n }\r\n if (tn.skip(Token.FINALLY)) {\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n finallyStatements = [];\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n finallyStatements.push(stmt);\r\n }\r\n }\r\n if (!(catchStatements || finallyStatements)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"catch\"\r\n );\r\n return null;\r\n }\r\n let ret = Node.createTryStatement(\r\n statements,\r\n catchVariable,\r\n catchStatements,\r\n finallyStatements,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseTypeDeclaration(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): TypeDeclaration | null {\r\n\r\n // at 'type': Identifier ('<' TypeParameters '>')? '=' Type ';'?\r\n\r\n if (tn.skipIdentifier()) {\r\n let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let typeParameters: TypeParameterNode[] | null = null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n flags |= CommonFlags.GENERIC;\r\n }\r\n if (tn.skip(Token.EQUALS)) {\r\n let type = this.parseType(tn);\r\n if (!type) return null;\r\n let ret = Node.createTypeDeclaration(\r\n name,\r\n typeParameters,\r\n type,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseVoidStatement(\r\n tn: Tokenizer\r\n ): VoidStatement | null {\r\n\r\n // at 'void': Expression ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var expression = this.parseExpression(tn, Precedence.GROUPING);\r\n if (!expression) return null;\r\n var ret = Node.createVoidStatement(expression, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseWhileStatement(\r\n tn: Tokenizer\r\n ): WhileStatement | null {\r\n\r\n // at 'while': '(' Expression ')' Statement ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let expression = this.parseExpression(tn);\r\n if (!expression) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n let statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n let ret = Node.createWhileStatement(expression, statement, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n // expressions\r\n // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing\r\n\r\n parseExpressionStart(\r\n tn: Tokenizer\r\n ): Expression | null {\r\n\r\n var token = tn.next(IdentifierHandling.PREFER);\r\n var startPos = tn.tokenPos;\r\n var precedence = determinePrecedenceStart(token);\r\n if (precedence != Precedence.NONE) {\r\n let operand: Expression | null;\r\n\r\n // TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)\r\n\r\n // NewExpression\r\n if (token == Token.NEW) {\r\n operand = this.parseExpression(tn, Precedence.CALL);\r\n if (!operand) return null;\r\n if (operand.kind == NodeKind.CALL) {\r\n return Node.createNewExpression(\r\n (operand).expression,\r\n (operand).typeArguments,\r\n (operand).arguments,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n } else {\r\n operand = this.parseExpression(tn, precedence);\r\n if (!operand) return null;\r\n }\r\n\r\n // UnaryPrefixExpression\r\n if (token == Token.PLUS_PLUS || token == Token.MINUS_MINUS) {\r\n if (\r\n operand.kind != NodeKind.IDENTIFIER &&\r\n operand.kind != NodeKind.ELEMENTACCESS &&\r\n operand.kind != NodeKind.PROPERTYACCESS\r\n ) {\r\n this.error(\r\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n operand.range\r\n );\r\n }\r\n }\r\n return Node.createUnaryPrefixExpression(token, operand, tn.range(startPos, tn.pos));\r\n }\r\n\r\n var expr: Expression | null = null;\r\n switch (token) {\r\n\r\n case Token.NULL: return Node.createNullExpression(tn.range());\r\n case Token.TRUE: return Node.createTrueExpression(tn.range());\r\n case Token.FALSE: return Node.createFalseExpression(tn.range());\r\n\r\n // ParenthesizedExpression\r\n // FunctionExpression\r\n case Token.OPENPAREN: {\r\n\r\n // determine whether this is a function expression\r\n if (tn.skip(Token.CLOSEPAREN)) { // must be a function expression (fast route)\r\n return this.parseFunctionExpressionCommon(\r\n tn,\r\n Node.createEmptyIdentifierExpression(tn.range(startPos)),\r\n [],\r\n true\r\n );\r\n }\r\n let state = tn.mark();\r\n let again = true;\r\n do {\r\n switch (tn.next(IdentifierHandling.PREFER)) {\r\n\r\n // function expression\r\n case Token.DOT_DOT_DOT: {\r\n tn.reset(state);\r\n return this.parseFunctionExpression(tn);\r\n }\r\n // can be both\r\n case Token.IDENTIFIER: {\r\n tn.readIdentifier();\r\n switch (tn.next()) {\r\n\r\n // if we got here, check for arrow\r\n case Token.CLOSEPAREN: {\r\n if (\r\n !tn.skip(Token.COLON) &&\r\n !tn.skip(Token.EQUALS_GREATERTHAN)\r\n ) {\r\n again = false;\r\n break;\r\n }\r\n // fall-through\r\n }\r\n // function expression\r\n case Token.COLON: { // type annotation\r\n tn.reset(state);\r\n return this.parseFunctionExpression(tn);\r\n }\r\n // optional parameter or parenthesized\r\n case Token.QUESTION: {\r\n if (\r\n tn.skip(Token.COLON) || // optional parameter with type\r\n tn.skip(Token.COMMA) || // optional parameter without type\r\n tn.skip(Token.CLOSEPAREN) // last optional parameter without type\r\n ) {\r\n tn.reset(state);\r\n return this.parseFunctionExpression(tn);\r\n }\r\n again = false; // parenthesized\r\n break;\r\n }\r\n case Token.COMMA: {\r\n break; // continue\r\n }\r\n // parenthesized expression\r\n // case Token.EQUALS: // missing type annotation for simplicity\r\n default: {\r\n again = false;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n // parenthesized expression\r\n default: {\r\n again = false;\r\n break;\r\n }\r\n }\r\n } while (again);\r\n tn.reset(state);\r\n\r\n // parse parenthesized\r\n expr = this.parseExpression(tn);\r\n if (!expr) return null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n return Node.createParenthesizedExpression(expr, tn.range(startPos, tn.pos));\r\n }\r\n // ArrayLiteralExpression\r\n case Token.OPENBRACKET: {\r\n let elementExpressions = new Array();\r\n while (!tn.skip(Token.CLOSEBRACKET)) {\r\n if (tn.peek() == Token.COMMA) {\r\n expr = null; // omitted\r\n } else {\r\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n }\r\n elementExpressions.push(expr);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACKET)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n return Node.createArrayLiteralExpression(elementExpressions, tn.range(startPos, tn.pos));\r\n }\r\n // ObjectLiteralExpression\r\n case Token.OPENBRACE: {\r\n let startPos = tn.tokenPos;\r\n let names = new Array();\r\n let values = new Array();\r\n let name: IdentifierExpression;\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n if (!tn.skipIdentifier()) {\r\n if (!tn.skip(Token.STRINGLITERAL)) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range(),\r\n );\r\n return null;\r\n }\r\n name = Node.createIdentifierExpression(tn.readString(), tn.range());\r\n name.set(CommonFlags.QUOTED);\r\n } else {\r\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n names.push(name);\r\n if (tn.skip(Token.COLON)) {\r\n let value = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!value) return null;\r\n values.push(value);\r\n } else if (!name.is(CommonFlags.QUOTED)) {\r\n values.push(name);\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACE)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n return Node.createObjectLiteralExpression(names, values, tn.range(startPos, tn.pos));\r\n }\r\n // AssertionExpression (unary prefix)\r\n case Token.LESSTHAN: {\r\n let toType = this.parseType(tn);\r\n if (!toType) return null;\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \">\"\r\n );\r\n return null;\r\n }\r\n expr = this.parseExpression(tn, Precedence.CALL);\r\n if (!expr) return null;\r\n return Node.createAssertionExpression(\r\n AssertionKind.PREFIX,\r\n expr,\r\n toType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n case Token.IDENTIFIER: {\r\n return Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));\r\n }\r\n case Token.THIS: {\r\n return Node.createThisExpression(tn.range(startPos, tn.pos));\r\n }\r\n case Token.CONSTRUCTOR: {\r\n return Node.createConstructorExpression(tn.range(startPos, tn.pos));\r\n }\r\n case Token.SUPER: {\r\n return Node.createSuperExpression(tn.range(startPos, tn.pos));\r\n }\r\n case Token.STRINGLITERAL: {\r\n return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos));\r\n }\r\n case Token.INTEGERLITERAL: {\r\n return Node.createIntegerLiteralExpression(tn.readInteger(), tn.range(startPos, tn.pos));\r\n }\r\n case Token.FLOATLITERAL: {\r\n return Node.createFloatLiteralExpression(tn.readFloat(), tn.range(startPos, tn.pos));\r\n }\r\n // RegexpLiteralExpression\r\n // note that this also continues on invalid ones so the surrounding AST remains intact\r\n case Token.SLASH: {\r\n let regexpPattern = tn.readRegexpPattern(); // also reports\r\n if (!tn.skip(Token.SLASH)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"/\"\r\n );\r\n return null;\r\n }\r\n return Node.createRegexpLiteralExpression(\r\n regexpPattern,\r\n tn.readRegexpFlags(), // also reports\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n case Token.FUNCTION: {\r\n return this.parseFunctionExpression(tn);\r\n }\r\n case Token.CLASS: {\r\n return this.parseClassExpression(tn);\r\n }\r\n default: {\r\n if (token == Token.ENDOFFILE) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n tn.range(startPos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Expression_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n tryParseTypeArgumentsBeforeArguments(\r\n tn: Tokenizer\r\n ): CommonTypeNode[] | null {\r\n\r\n // at '<': Type (',' Type)* '>' '('\r\n\r\n var state = tn.mark();\r\n if (!tn.skip(Token.LESSTHAN)) return null;\r\n var typeArguments = new Array();\r\n do {\r\n if (tn.peek() === Token.GREATERTHAN) {\r\n break;\r\n }\r\n let type = this.parseType(tn, true, true);\r\n if (!type) {\r\n tn.reset(state);\r\n return null;\r\n }\r\n typeArguments.push(type);\r\n } while (tn.skip(Token.COMMA));\r\n if (tn.skip(Token.GREATERTHAN) && tn.skip(Token.OPENPAREN)) {\r\n return typeArguments;\r\n }\r\n tn.reset(state);\r\n return null;\r\n }\r\n\r\n parseArguments(\r\n tn: Tokenizer\r\n ): Expression[] | null {\r\n\r\n // at '(': (Expression (',' Expression)*)? ')'\r\n\r\n var args = new Array();\r\n while (!tn.skip(Token.CLOSEPAREN)) {\r\n let expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n args.push(expr);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n return args;\r\n }\r\n\r\n parseExpression(\r\n tn: Tokenizer,\r\n precedence: Precedence = Precedence.COMMA\r\n ): Expression | null {\r\n assert(precedence != Precedence.NONE);\r\n\r\n var expr = this.parseExpressionStart(tn);\r\n if (!expr) return null;\r\n expr = this.maybeParseCallExpression(tn, expr); // simple call like on an Identifier\r\n\r\n var startPos = expr.range.start;\r\n var token: Token;\r\n var next: Expression | null = null;\r\n var nextPrecedence: Precedence;\r\n while (\r\n (nextPrecedence = determinePrecedence(token = tn.peek())) >= precedence\r\n ) { // precedence climbing\r\n tn.next();\r\n switch (token) {\r\n // AssertionExpression\r\n case Token.AS: {\r\n let toType = this.parseType(tn); // reports\r\n if (!toType) return null;\r\n expr = Node.createAssertionExpression(\r\n AssertionKind.AS,\r\n expr,\r\n toType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // InstanceOfExpression\r\n case Token.INSTANCEOF: {\r\n let isType = this.parseType(tn); // reports\r\n if (!isType) return null;\r\n expr = Node.createInstanceOfExpression(\r\n expr,\r\n isType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // ElementAccessExpression\r\n case Token.OPENBRACKET: {\r\n next = this.parseExpression(tn); // reports\r\n if (!next) return null;\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n return null;\r\n }\r\n expr = Node.createElementAccessExpression(\r\n expr,\r\n next,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // UnaryPostfixExpression\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS: {\r\n if (\r\n expr.kind != NodeKind.IDENTIFIER &&\r\n expr.kind != NodeKind.ELEMENTACCESS &&\r\n expr.kind != NodeKind.PROPERTYACCESS\r\n ) {\r\n this.error(\r\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n expr.range\r\n );\r\n }\r\n expr = Node.createUnaryPostfixExpression(\r\n token,\r\n expr,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // TernaryExpression\r\n case Token.QUESTION: {\r\n let ifThen = this.parseExpression(tn);\r\n if (!ifThen) return null;\r\n if (!tn.skip(Token.COLON)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n return null;\r\n }\r\n let ifElse = this.parseExpression(tn, precedence > Precedence.COMMA\r\n ? Precedence.COMMA + 1\r\n : Precedence.COMMA\r\n );\r\n if (!ifElse) return null;\r\n expr = Node.createTernaryExpression(\r\n expr,\r\n ifThen,\r\n ifElse,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // CommaExpression\r\n case Token.COMMA: {\r\n let commaExprs: Expression[] = [ expr ];\r\n do {\r\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n commaExprs.push(expr);\r\n } while (tn.skip(Token.COMMA));\r\n expr = Node.createCommaExpression(commaExprs, tn.range(startPos, tn.pos));\r\n break;\r\n }\r\n default: {\r\n\r\n // PropertyAccessExpression\r\n if (token == Token.DOT) {\r\n if (tn.skipIdentifier()) {\r\n next = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n next = this.parseExpression(tn,\r\n isRightAssociative(token)\r\n ? nextPrecedence\r\n : nextPrecedence + 1\r\n );\r\n if (!next) return null;\r\n }\r\n if (next.kind == NodeKind.IDENTIFIER) { // expr '.' Identifier\r\n expr = Node.createPropertyAccessExpression(\r\n expr,\r\n next,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else if (next.kind == NodeKind.CALL) { // expr '.' CallExpression\r\n expr = this.joinPropertyCall(tn, startPos, expr, next);\r\n if (!expr) return null;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n next.range\r\n );\r\n return null;\r\n }\r\n\r\n // BinaryExpression\r\n } else {\r\n next = this.parseExpression(tn,\r\n isRightAssociative(token)\r\n ? nextPrecedence\r\n : nextPrecedence + 1\r\n );\r\n if (!next) return null;\r\n expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));\r\n }\r\n break;\r\n }\r\n }\r\n expr = this.maybeParseCallExpression(tn, expr); // compound call like on an ElementAccess\r\n }\r\n return expr;\r\n }\r\n\r\n private joinPropertyCall(\r\n tn: Tokenizer,\r\n startPos: i32,\r\n expr: Expression,\r\n call: CallExpression\r\n ): Expression | null {\r\n var callee = call.expression;\r\n switch (callee.kind) {\r\n case NodeKind.IDENTIFIER: { // join property access and use as call target\r\n call.expression = Node.createPropertyAccessExpression(\r\n expr,\r\n callee,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n case NodeKind.CALL: { // join call target und wrap the original call around it\r\n let inner = this.joinPropertyCall(tn, startPos, expr, callee);\r\n if (!inner) return null;\r\n call.expression = inner;\r\n call.range = tn.range(startPos, tn.pos);\r\n break;\r\n }\r\n default: {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n call.range\r\n );\r\n return null;\r\n }\r\n }\r\n return call;\r\n }\r\n\r\n private maybeParseCallExpression(\r\n tn: Tokenizer,\r\n expr: Expression\r\n ): Expression {\r\n if (nodeIsCallable(expr.kind)) {\r\n let typeArguments: CommonTypeNode[] | null = null;\r\n while (\r\n tn.skip(Token.OPENPAREN)\r\n ||\r\n nodeIsGenericCallable(expr.kind) && (typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null\r\n ) {\r\n let args = this.parseArguments(tn);\r\n if (!args) break;\r\n expr = Node.createCallExpression( // is again callable\r\n expr,\r\n typeArguments,\r\n args,\r\n tn.range(expr.range.start, tn.pos)\r\n );\r\n }\r\n }\r\n return expr;\r\n }\r\n\r\n /** Skips over a statement on errors in an attempt to reduce unnecessary diagnostic noise. */\r\n skipStatement(tn: Tokenizer): void {\r\n tn.peek(true);\r\n if (tn.nextTokenOnNewLine) tn.next(); // if reset() to the previous line\r\n do {\r\n let nextToken = tn.peek(true);\r\n if (\r\n nextToken == Token.ENDOFFILE || // next step should handle this\r\n nextToken == Token.SEMICOLON // end of the statement for sure\r\n ) {\r\n tn.next();\r\n break;\r\n }\r\n if (tn.nextTokenOnNewLine) break; // end of the statement maybe\r\n switch (tn.next()) {\r\n case Token.IDENTIFIER: {\r\n tn.readIdentifier();\r\n break;\r\n }\r\n case Token.STRINGLITERAL: {\r\n tn.readString();\r\n break;\r\n }\r\n case Token.INTEGERLITERAL: {\r\n tn.readInteger();\r\n break;\r\n }\r\n case Token.FLOATLITERAL: {\r\n tn.readFloat();\r\n break;\r\n }\r\n }\r\n } while (true);\r\n }\r\n\r\n /** Skips over a block on errors in an attempt to reduce unnecessary diagnostic noise. */\r\n skipBlock(tn: Tokenizer): void {\r\n // at '{': ... '}'\r\n var depth = 1;\r\n var again = true;\r\n do {\r\n switch (tn.next()) {\r\n case Token.ENDOFFILE: {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n again = false;\r\n break;\r\n }\r\n case Token.OPENBRACE: {\r\n ++depth;\r\n break;\r\n }\r\n case Token.CLOSEBRACE: {\r\n --depth;\r\n if (!depth) again = false;\r\n break;\r\n }\r\n case Token.IDENTIFIER: {\r\n tn.readIdentifier();\r\n break;\r\n }\r\n case Token.STRINGLITERAL: {\r\n tn.readString();\r\n break;\r\n }\r\n case Token.INTEGERLITERAL: {\r\n tn.readInteger();\r\n break;\r\n }\r\n case Token.FLOATLITERAL: {\r\n tn.readFloat();\r\n break;\r\n }\r\n }\r\n } while (again);\r\n }\r\n}\r\n\r\n/** Operator precedence from least to largest. */\r\nexport const enum Precedence {\r\n NONE,\r\n COMMA,\r\n SPREAD,\r\n YIELD,\r\n ASSIGNMENT,\r\n CONDITIONAL,\r\n LOGICAL_OR,\r\n LOGICAL_AND,\r\n BITWISE_OR,\r\n BITWISE_XOR,\r\n BITWISE_AND,\r\n EQUALITY,\r\n RELATIONAL,\r\n SHIFT,\r\n ADDITIVE,\r\n MULTIPLICATIVE,\r\n EXPONENTIATED,\r\n UNARY_PREFIX,\r\n UNARY_POSTFIX,\r\n CALL,\r\n MEMBERACCESS,\r\n GROUPING\r\n}\r\n\r\n/** Determines the precedence of a starting token. */\r\nfunction determinePrecedenceStart(kind: Token): Precedence {\r\n switch (kind) {\r\n case Token.DOT_DOT_DOT: return Precedence.SPREAD;\r\n case Token.YIELD: return Precedence.YIELD;\r\n case Token.EXCLAMATION:\r\n case Token.TILDE:\r\n case Token.PLUS:\r\n case Token.MINUS:\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS:\r\n case Token.TYPEOF:\r\n case Token.VOID:\r\n case Token.DELETE: return Precedence.UNARY_PREFIX;\r\n case Token.NEW: return Precedence.MEMBERACCESS;\r\n }\r\n return Precedence.NONE;\r\n}\r\n\r\n/** Determines the precende of a non-starting token. */\r\nfunction determinePrecedence(kind: Token): Precedence {\r\n switch (kind) {\r\n case Token.COMMA: return Precedence.COMMA;\r\n case Token.EQUALS:\r\n case Token.PLUS_EQUALS:\r\n case Token.MINUS_EQUALS:\r\n case Token.ASTERISK_ASTERISK_EQUALS:\r\n case Token.ASTERISK_EQUALS:\r\n case Token.SLASH_EQUALS:\r\n case Token.PERCENT_EQUALS:\r\n case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.AMPERSAND_EQUALS:\r\n case Token.CARET_EQUALS:\r\n case Token.BAR_EQUALS: return Precedence.ASSIGNMENT;\r\n case Token.QUESTION: return Precedence.CONDITIONAL;\r\n case Token.BAR_BAR: return Precedence.LOGICAL_OR;\r\n case Token.AMPERSAND_AMPERSAND: return Precedence.LOGICAL_AND;\r\n case Token.BAR: return Precedence.BITWISE_OR;\r\n case Token.CARET: return Precedence.BITWISE_XOR;\r\n case Token.AMPERSAND: return Precedence.BITWISE_AND;\r\n case Token.EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS:\r\n case Token.EQUALS_EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS_EQUALS: return Precedence.EQUALITY;\r\n case Token.AS:\r\n case Token.IN:\r\n case Token.INSTANCEOF:\r\n case Token.LESSTHAN:\r\n case Token.GREATERTHAN:\r\n case Token.LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_EQUALS: return Precedence.RELATIONAL;\r\n case Token.LESSTHAN_LESSTHAN:\r\n case Token.GREATERTHAN_GREATERTHAN:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return Precedence.SHIFT;\r\n case Token.PLUS:\r\n case Token.MINUS: return Precedence.ADDITIVE;\r\n case Token.ASTERISK:\r\n case Token.SLASH:\r\n case Token.PERCENT: return Precedence.MULTIPLICATIVE;\r\n case Token.ASTERISK_ASTERISK: return Precedence.EXPONENTIATED;\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS: return Precedence.UNARY_POSTFIX;\r\n case Token.DOT:\r\n case Token.NEW:\r\n case Token.OPENBRACKET: return Precedence.MEMBERACCESS;\r\n }\r\n return Precedence.NONE;\r\n}\r\n\r\n/** Determines whether a non-starting token is right associative. */\r\nfunction isRightAssociative(kind: Token): bool {\r\n switch (kind) {\r\n case Token.EQUALS:\r\n case Token.PLUS_EQUALS:\r\n case Token.MINUS_EQUALS:\r\n case Token.ASTERISK_ASTERISK_EQUALS:\r\n case Token.ASTERISK_EQUALS:\r\n case Token.SLASH_EQUALS:\r\n case Token.PERCENT_EQUALS:\r\n case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.AMPERSAND_EQUALS:\r\n case Token.CARET_EQUALS:\r\n case Token.BAR_EQUALS:\r\n case Token.QUESTION:\r\n case Token.ASTERISK_ASTERISK: return true;\r\n default: return false;\r\n }\r\n}\r\n","/**\r\n * JavaScript glue code.\r\n * @module glue/js\r\n * @preferred\r\n *//***/\r\n\r\n/// \r\n\r\nimport \"./binaryen\"; // must be first so portable can pick up the memory implementation\r\nimport \"../../../std/portable/index\";\r\nimport \"./float\";\r\nimport \"./i64\";\r\n\r\nimport { Module } from \"../../module\";\r\n\r\nModule.prototype.toText = function(this: Module) {\r\n return binaryen.wrapModule(this.ref).emitStackIR();\r\n};\r\n\r\nModule.prototype.toAsmjs = function(this: Module) {\r\n return binaryen.wrapModule(this.ref).emitAsmjs();\r\n};\r\n","// Copy Binaryen exports to global scope\r\n\r\nconst binaryen = global.Binaryen || require(\"binaryen\");\r\nglobal.binaryen = binaryen;\r\n\r\nfor (var key in binaryen) {\r\n if (key.startsWith(\"_Binaryen\") || key.startsWith(\"_Relooper\")) global[key] = binaryen[key];\r\n}\r\n\r\n// Utilize Binaryen's heap\r\n\r\nglobal.__memory_allocate = binaryen._malloc;\r\nglobal.__memory_free = binaryen._free;\r\nglobal.__memory_copy = binaryen._memmove;\r\nglobal.__store = function(ptr, val) { binaryen.HEAPU8[ptr] = val; };\r\nglobal.__load = function(ptr) { return binaryen.HEAPU8[ptr]; };\r\n","module.exports = __WEBPACK_EXTERNAL_MODULE__18__;","/** @module std/portable *//***/\r\n\r\nvar globalScope = typeof window !== \"undefined\" && window || typeof global !== \"undefined\" && global || self;\r\n\r\nglobalScope.ASC_TARGET = 0;\r\n\r\nvar F64 = new Float64Array(1);\r\nvar U64 = new Uint32Array(F64.buffer);\r\n\r\nObject.defineProperties(\r\n globalScope[\"i8\"] = function i8(value) { return value << 24 >> 24; }\r\n, {\r\n \"MIN_VALUE\": { value: -128, writable: false },\r\n \"MAX_VALUE\": { value: 127, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i16\"] = function i16(value) { return value << 16 >> 16; }\r\n, {\r\n \"MIN_VALUE\": { value: -32768, writable: false },\r\n \"MAX_VALUE\": { value: 32767, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i32\"] = globalScope[\"isize\"] = function i32(value) { return value | 0; }\r\n, {\r\n \"MIN_VALUE\": { value: -2147483648, writable: false },\r\n \"MAX_VALUE\": { value: 2147483647, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u8\"] = function u8(value) { return value & 0xff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 255, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u16\"] = function u16(value) { return value & 0xffff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 65535, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u32\"] = globalScope[\"usize\"] = function u32(value) { return value >>> 0; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 4294967295, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"bool\"] = function bool(value) { return !!value; }\r\n, {\r\n \"MIN_VALUE\": { value: false, writable: false },\r\n \"MAX_VALUE\": { value: true, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f32\"] = function f32(value) { return Math.fround(value); }\r\n, {\r\n \"EPSILON\": { value: Math.fround(1.1920929e-07), writable: false },\r\n \"MIN_VALUE\": { value: Math.fround(1.4012985e-45), writable: false },\r\n \"MAX_VALUE\": { value: Math.fround(3.4028235e+38), writable: false },\r\n \"MIN_NORMAL_VALUE\": { value: Math.fround(1.17549435e-38), writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -16777215, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 16777215, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f64\"] = function f64(value) { return +value; }\r\n, {\r\n \"EPSILON\": { value: 2.2204460492503131e-16, writable: false },\r\n \"MIN_VALUE\": { value: 5e-324, writable: false },\r\n \"MAX_VALUE\": { value: 1.7976931348623157e+308, writable: false },\r\n \"MIN_NORMAL_VALUE\": { value: 2.2250738585072014e-308 , writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -9007199254740991, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 9007199254740991, writable: false }\r\n});\r\n\r\nglobalScope[\"clz\"] = Math.clz32;\r\n\r\nglobalScope[\"ctz\"] = function ctz(value) {\r\n var c = Math.clz32(value & -value);\r\n return value ? 31 - c : c;\r\n};\r\n\r\nglobalScope[\"popcnt\"] = function popcnt(value) {\r\n value -= value >>> 1 & 0x55555555;\r\n value = (value & 0x33333333) + (value >>> 2 & 0x33333333);\r\n return (((value + (value >>> 4)) & 0x0F0F0F0F) * 0x01010101) >>> 24;\r\n};\r\n\r\nglobalScope[\"rotl\"] = function rotl(value, shift) {\r\n shift &= 31;\r\n return (value << shift) | (value >>> (32 - shift));\r\n};\r\n\r\nglobalScope[\"rotr\"] = function rotr(value, shift) {\r\n shift &= 31;\r\n return (value >>> shift) | (value << (32 - shift));\r\n};\r\n\r\nglobalScope[\"abs\"] = Math.abs;\r\n\r\nglobalScope[\"max\"] = Math.max;\r\n\r\nglobalScope[\"min\"] = Math.min;\r\n\r\nglobalScope[\"ceil\"] = Math.ceil;\r\n\r\nglobalScope[\"floor\"] = Math.floor;\r\n\r\n// Adopt code from https://github.com/rfk/wasm-polyfill\r\nglobalScope[\"nearest\"] = function nearest(value) {\r\n if (Math.abs(value - Math.trunc(value)) === 0.5) {\r\n return 2.0 * Math.round(value * 0.5);\r\n }\r\n return Math.round(value);\r\n};\r\n\r\nglobalScope[\"select\"] = function select(ifTrue, ifFalse, condition) {\r\n return condition ? ifTrue : ifFalse;\r\n};\r\n\r\nglobalScope[\"sqrt\"] = Math.sqrt;\r\n\r\nglobalScope[\"trunc\"] = Math.trunc;\r\n\r\nglobalScope[\"copysign\"] = function copysign(x, y) {\r\n return Math.abs(x) * Math.sign(y);\r\n};\r\n\r\nglobalScope[\"bswap\"] = function bswap(value) {\r\n var a = value >> 8 & 0x00FF00FF;\r\n var b = (value & 0x00FF00FF) << 8;\r\n value = a | b;\r\n a = value >> 16 & 0x0000FFFF;\r\n b = (value & 0x0000FFFF) << 16;\r\n return a | b;\r\n};\r\n\r\nglobalScope[\"bswap16\"] = function bswap16(value) {\r\n return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);\r\n};\r\n\r\nfunction UnreachableError() {\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, UnreachableError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nUnreachableError.prototype = Object.create(Error.prototype);\r\nUnreachableError.prototype.name = \"UnreachableError\";\r\nUnreachableError.prototype.message = \"unreachable\";\r\n\r\nglobalScope[\"unreachable\"] = function unreachable() {\r\n throw new UnreachableError();\r\n};\r\n\r\nfunction AssertionError(message) {\r\n this.message = message || \"assertion failed\";\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, AssertionError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nAssertionError.prototype = Object.create(Error.prototype);\r\nAssertionError.prototype.name = \"AssertionError\";\r\n\r\nglobalScope[\"assert\"] = function assert(isTrueish, message) {\r\n if (isTrueish) return isTrueish;\r\n throw new AssertionError(message);\r\n};\r\n\r\nglobalScope[\"changetype\"] = function changetype(value) {\r\n return value;\r\n};\r\n\r\nglobalScope[\"parseI32\"] = function parseI32(str, radix) {\r\n return parseInt(str, undefined) | 0;\r\n};\r\n\r\nString[\"fromCharCodes\"] = function fromCharCodes(arr) {\r\n return String.fromCharCode.apply(String, arr);\r\n};\r\n\r\nString[\"fromCodePoints\"] = function fromCodePoints(arr) {\r\n return String.fromCodePoint.apply(String, arr);\r\n};\r\n\r\nglobalScope[\"isInteger\"] = Number.isInteger;\r\n\r\nglobalScope[\"isFloat\"] = function isFloat(arg) {\r\n return typeof arg === \"number\";\r\n};\r\n\r\nglobalScope[\"isReference\"] = function isClass(arg) {\r\n return typeof arg === \"object\" || typeof arg === \"string\";\r\n};\r\n\r\nglobalScope[\"isString\"] = function isString(arg) {\r\n return typeof arg === \"string\" || arg instanceof String;\r\n};\r\n\r\nglobalScope[\"isArray\"] = Array.isArray;\r\n\r\nglobalScope[\"isDefined\"] = function isDefined(expr) {\r\n return typeof expr !== \"undefined\";\r\n}\r\n\r\nglobalScope[\"isConstant\"] = function isConstant(expr) {\r\n return false;\r\n};\r\n\r\nglobalScope[\"unchecked\"] = function unchecked(expr) {\r\n return expr;\r\n};\r\n\r\nglobalScope[\"fmod\"] = function fmod(x, y) {\r\n return x % y;\r\n};\r\n\r\nglobalScope[\"fmodf\"] = function fmodf(x, y) {\r\n return Math.fround(x % y);\r\n};\r\n\r\nglobalScope[\"JSMath\"] = Math;\r\nglobalScope[\"JSMath\"].signbit = function signbit(x) {\r\n F64[0] = x; return Boolean((U64[1] >>> 31) & (x == x));\r\n}\r\n\r\nglobalScope[\"memory\"] = (() => {\r\n var HEAP = new Uint8Array(0);\r\n var HEAP_OFFSET = 0;\r\n return {\r\n allocate: globalScope[\"__memory_allocate\"] || function allocate(size) {\r\n if (!(size >>>= 0)) return 0;\r\n if (HEAP_OFFSET + size > HEAP.length) {\r\n var oldHeap = HEAP;\r\n HEAP = new Uint8Array(Math.max(65536, HEAP.length + size, HEAP.length * 2));\r\n HEAP.set(oldHeap);\r\n }\r\n var ptr = HEAP_OFFSET;\r\n if ((HEAP_OFFSET += size) & 7) HEAP_OFFSET = (HEAP_OFFSET | 7) + 1;\r\n return ptr;\r\n },\r\n fill: globalScope[\"__memory_fill\"] || function fill(dest, value, size) {\r\n HEAP.fill(value, dest, dest + size);\r\n },\r\n free: globalScope[\"__memory_free\"] || function free(ptr) { },\r\n copy: globalScope[\"__memory_copy\"] || function copy(dest, src, size) {\r\n HEAP.copyWithin(dest, src, src + size);\r\n },\r\n reset: globalScope[\"__memory_reset\"] || function reset() {\r\n HEAP = new Uint8Array(0);\r\n HEAP_OFFSET = 0;\r\n }\r\n };\r\n})();\r\n\r\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\r\n HEAP[(ptr | 0) + (offset | 0)] = value;\r\n};\r\n\r\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\r\n return HEAP[(ptr | 0) + (offset | 0)];\r\n};\r\n","const F64 = new Float64Array(1);\r\nconst F32 = new Float32Array(F64.buffer);\r\nconst I32 = new Int32Array(F64.buffer);\r\n\r\nglobal.f32_as_i32 = function(value) {\r\n F32[0] = value;\r\n return I32[0];\r\n};\r\n\r\nglobal.i32_as_f32 = function(value) {\r\n I32[0] = value;\r\n return F32[0];\r\n};\r\n\r\nglobal.f64_as_i64 = function(value) {\r\n F64[0] = value;\r\n return i64_new(I32[0], I32[1]);\r\n};\r\n\r\nglobal.i64_as_f64 = function(value) {\r\n I32[0] = i64_low(value);\r\n I32[1] = i64_high(value);\r\n return F64[0];\r\n};\r\n","const Long = global.Long || require(\"long\");\r\n\r\nglobal.i64_zero = Long.ZERO;\r\n\r\nglobal.i64_one = Long.ONE;\r\n\r\nglobal.i64_new = function(lo, hi) {\r\n return Long.fromBits(lo, hi);\r\n};\r\n\r\nglobal.i64_low = function(value) {\r\n return value.low;\r\n};\r\n\r\nglobal.i64_high = function(value) {\r\n return value.high;\r\n};\r\n\r\nglobal.i64_add = function(left, right) {\r\n return left.add(right);\r\n};\r\n\r\nglobal.i64_sub = function(left, right) {\r\n return left.sub(right);\r\n};\r\n\r\nglobal.i64_mul = function(left, right) {\r\n return left.mul(right);\r\n};\r\n\r\nglobal.i64_div = function(left, right) {\r\n return left.div(right);\r\n};\r\n\r\nglobal.i64_div_u = function(left, right) {\r\n return left.toUnsigned().div(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_rem = function(left, right) {\r\n return left.mod(right);\r\n};\r\n\r\nglobal.i64_rem_u = function(left, right) {\r\n return left.toUnsigned().mod(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_and = function(left, right) {\r\n return left.and(right);\r\n};\r\n\r\nglobal.i64_or = function(left, right) {\r\n return left.or(right);\r\n};\r\n\r\nglobal.i64_xor = function(left, right) {\r\n return left.xor(right);\r\n};\r\n\r\nglobal.i64_shl = function(left, right) {\r\n return left.shl(right);\r\n};\r\n\r\nglobal.i64_shr = function(left, right) {\r\n return left.shr(right);\r\n};\r\n\r\nglobal.i64_shr_u = function(left, right) {\r\n return left.shru(right);\r\n};\r\n\r\nglobal.i64_not = function(value) {\r\n return value.not();\r\n};\r\n\r\nglobal.i64_eq = function(left, right) {\r\n return left.eq(right);\r\n};\r\n\r\nglobal.i64_ne = function(left, right) {\r\n return left.ne(right);\r\n};\r\n\r\nglobal.i64_align = function(value, alignment) {\r\n assert(alignment && (alignment & (alignment - 1)) == 0);\r\n var mask = Long.fromInt(alignment - 1);\r\n return value.add(mask).and(mask.not());\r\n};\r\n\r\nglobal.i64_is_i8 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i8.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i8.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i16 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i16.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i16.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i32 = function(value) {\r\n return (value.high === 0 && value.low >= 0)\r\n || (value.high === -1 && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_u8 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u8.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u16 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u16.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u32 = function(value) {\r\n return value.high === 0;\r\n};\r\n\r\nglobal.i64_is_bool = function(value) {\r\n return value.high === 0 && (value.low === 0 || value.low === 1);\r\n};\r\n\r\nconst minSafeF32 = Long.fromNumber(f32.MIN_SAFE_INTEGER);\r\nconst maxSafeF32 = Long.fromNumber(f32.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f32 = function(value) {\r\n return value.gte(minSafeF32) && value.lte(maxSafeF32);\r\n};\r\n\r\nconst minSafeF64 = Long.fromNumber(f64.MIN_SAFE_INTEGER);\r\nconst maxSafeF64 = Long.fromNumber(f64.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f64 = function(value) {\r\n return value.gte(minSafeF64) && value.lte(maxSafeF64);\r\n};\r\n\r\nglobal.i64_to_f32 = function(value) {\r\n return global.Math.fround(value.toNumber());\r\n};\r\n\r\nglobal.i64_to_f64 = function(value) {\r\n return value.toNumber();\r\n};\r\n\r\nglobal.i64_to_string = function(value, unsigned) {\r\n return (unsigned ? value.toUnsigned() : value).toString(10);\r\n};\r\n","module.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n ])), {}).exports;\r\n} catch (e) {\r\n // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n * See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n /**\r\n * The low 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.low = low | 0;\r\n\r\n /**\r\n * The high 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.high = high | 0;\r\n\r\n /**\r\n * Whether unsigned or not.\r\n * @type {boolean}\r\n */\r\n this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations. For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative). Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n var obj, cachedObj, cache;\r\n if (unsigned) {\r\n value >>>= 0;\r\n if (cache = (0 <= value && value < 256)) {\r\n cachedObj = UINT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n if (cache)\r\n UINT_CACHE[value] = obj;\r\n return obj;\r\n } else {\r\n value |= 0;\r\n if (cache = (-128 <= value && value < 128)) {\r\n cachedObj = INT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n if (cache)\r\n INT_CACHE[value] = obj;\r\n return obj;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n if (isNaN(value))\r\n return unsigned ? UZERO : ZERO;\r\n if (unsigned) {\r\n if (value < 0)\r\n return UZERO;\r\n if (value >= TWO_PWR_64_DBL)\r\n return MAX_UNSIGNED_VALUE;\r\n } else {\r\n if (value <= -TWO_PWR_63_DBL)\r\n return MIN_VALUE;\r\n if (value + 1 >= TWO_PWR_63_DBL)\r\n return MAX_VALUE;\r\n }\r\n if (value < 0)\r\n return fromNumber(-value, unsigned).neg();\r\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n * assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n if (str.length === 0)\r\n throw Error('empty string');\r\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n return ZERO;\r\n if (typeof unsigned === 'number') {\r\n // For goog.math.long compatibility\r\n radix = unsigned,\r\n unsigned = false;\r\n } else {\r\n unsigned = !! unsigned;\r\n }\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n\r\n var p;\r\n if ((p = str.indexOf('-')) > 0)\r\n throw Error('interior hyphen');\r\n else if (p === 0) {\r\n return fromString(str.substring(1), unsigned, radix).neg();\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n var result = ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i),\r\n value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = fromNumber(pow_dbl(radix, size));\r\n result = result.mul(power).add(fromNumber(value));\r\n } else {\r\n result = result.mul(radixToPower);\r\n result = result.add(fromNumber(value));\r\n }\r\n }\r\n result.unsigned = unsigned;\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n if (typeof val === 'number')\r\n return fromNumber(val, unsigned);\r\n if (typeof val === 'string')\r\n return fromString(val, unsigned);\r\n // Throws for non-objects, converts non-instanceof Long:\r\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n if (this.unsigned)\r\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n if (this.isZero())\r\n return '0';\r\n if (this.isNegative()) { // Unsigned Longs are never negative\r\n if (this.eq(MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = fromNumber(radix),\r\n div = this.div(radixLong),\r\n rem1 = div.mul(radixLong).sub(this);\r\n return div.toString(radix) + rem1.toInt().toString(radix);\r\n } else\r\n return '-' + this.neg().toString(radix);\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower),\r\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n digits = intval.toString(radix);\r\n rem = remDiv;\r\n if (rem.isZero())\r\n return digits + result;\r\n else {\r\n while (digits.length < 6)\r\n digits = '0' + digits;\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n if (this.isNegative()) // Unsigned Longs are never negative\r\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n var val = this.high != 0 ? this.high : this.low;\r\n for (var bit = 31; bit > 0; bit--)\r\n if ((val & (1 << bit)) != 0)\r\n break;\r\n return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n return false;\r\n return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.eq(other))\r\n return 0;\r\n var thisNeg = this.isNegative(),\r\n otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg)\r\n return -1;\r\n if (!thisNeg && otherNeg)\r\n return 1;\r\n // At this point the sign bits are the same\r\n if (!this.unsigned)\r\n return this.sub(other).isNegative() ? -1 : 1;\r\n // Both are positive if at least one is unsigned\r\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n if (!this.unsigned && this.eq(MIN_VALUE))\r\n return MIN_VALUE;\r\n return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n if (!isLong(addend))\r\n addend = fromValue(addend);\r\n\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = addend.high >>> 16;\r\n var b32 = addend.high & 0xFFFF;\r\n var b16 = addend.low >>> 16;\r\n var b00 = addend.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n if (!isLong(subtrahend))\r\n subtrahend = fromValue(subtrahend);\r\n return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n if (this.isZero())\r\n return ZERO;\r\n if (!isLong(multiplier))\r\n multiplier = fromValue(multiplier);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = wasm.mul(this.low,\r\n this.high,\r\n multiplier.low,\r\n multiplier.high);\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (multiplier.isZero())\r\n return ZERO;\r\n if (this.eq(MIN_VALUE))\r\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n if (multiplier.eq(MIN_VALUE))\r\n return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n if (this.isNegative()) {\r\n if (multiplier.isNegative())\r\n return this.neg().mul(multiplier.neg());\r\n else\r\n return this.neg().mul(multiplier).neg();\r\n } else if (multiplier.isNegative())\r\n return this.mul(multiplier.neg()).neg();\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = multiplier.high >>> 16;\r\n var b32 = multiplier.high & 0xFFFF;\r\n var b16 = multiplier.low >>> 16;\r\n var b00 = multiplier.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n * unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n if (divisor.isZero())\r\n throw Error('division by zero');\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n // guard against signed division overflow: the largest\r\n // negative number / -1 would be 1 larger than the largest\r\n // positive number, due to two's complement.\r\n if (!this.unsigned &&\r\n this.high === -0x80000000 &&\r\n divisor.low === -1 && divisor.high === -1) {\r\n // be consistent with non-wasm code path\r\n return this;\r\n }\r\n var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (this.isZero())\r\n return this.unsigned ? UZERO : ZERO;\r\n var approx, rem, res;\r\n if (!this.unsigned) {\r\n // This section is only relevant for signed longs and is derived from the\r\n // closure library as a whole.\r\n if (this.eq(MIN_VALUE)) {\r\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n else if (divisor.eq(MIN_VALUE))\r\n return ONE;\r\n else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shr(1);\r\n approx = halfThis.div(divisor).shl(1);\r\n if (approx.eq(ZERO)) {\r\n return divisor.isNegative() ? ONE : NEG_ONE;\r\n } else {\r\n rem = this.sub(divisor.mul(approx));\r\n res = approx.add(rem.div(divisor));\r\n return res;\r\n }\r\n }\r\n } else if (divisor.eq(MIN_VALUE))\r\n return this.unsigned ? UZERO : ZERO;\r\n if (this.isNegative()) {\r\n if (divisor.isNegative())\r\n return this.neg().div(divisor.neg());\r\n return this.neg().div(divisor).neg();\r\n } else if (divisor.isNegative())\r\n return this.div(divisor.neg()).neg();\r\n res = ZERO;\r\n } else {\r\n // The algorithm below has not been made for unsigned longs. It's therefore\r\n // required to take special care of the MSB prior to running it.\r\n if (!divisor.unsigned)\r\n divisor = divisor.toUnsigned();\r\n if (divisor.gt(this))\r\n return UZERO;\r\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n return UONE;\r\n res = UZERO;\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n rem = this;\r\n while (rem.gte(divisor)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n approxRes = fromNumber(approx),\r\n approxRem = approxRes.mul(divisor);\r\n while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n approx -= delta;\r\n approxRes = fromNumber(approx, this.unsigned);\r\n approxRem = approxRes.mul(divisor);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero())\r\n approxRes = ONE;\r\n\r\n res = res.add(approxRes);\r\n rem = rem.sub(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n else\r\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n else\r\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n numBits &= 63;\r\n if (numBits === 0)\r\n return this;\r\n else {\r\n var high = this.high;\r\n if (numBits < 32) {\r\n var low = this.low;\r\n return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n } else if (numBits === 32)\r\n return fromBits(high, 0, this.unsigned);\r\n else\r\n return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n if (!this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n if (this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n lo & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo >>> 16 & 0xff,\r\n lo >>> 24 ,\r\n hi & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi >>> 16 & 0xff,\r\n hi >>> 24\r\n ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n hi >>> 24 ,\r\n hi >>> 16 & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi & 0xff,\r\n lo >>> 24 ,\r\n lo >>> 16 & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo & 0xff\r\n ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n return new Long(\r\n bytes[0] |\r\n bytes[1] << 8 |\r\n bytes[2] << 16 |\r\n bytes[3] << 24,\r\n bytes[4] |\r\n bytes[5] << 8 |\r\n bytes[6] << 16 |\r\n bytes[7] << 24,\r\n unsigned\r\n );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n return new Long(\r\n bytes[4] << 24 |\r\n bytes[5] << 16 |\r\n bytes[6] << 8 |\r\n bytes[7],\r\n bytes[0] << 24 |\r\n bytes[1] << 16 |\r\n bytes[2] << 8 |\r\n bytes[3],\r\n unsigned\r\n );\r\n};\r\n","/**\r\n * Built-in elements providing WebAssembly core functionality.\r\n * @module builtins\r\n *//***/\r\n\r\n import {\r\n Compiler,\r\n ConversionKind,\r\n WrapMode\r\n} from \"./compiler\";\r\n\r\nimport {\r\n DiagnosticCode\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n Expression,\r\n LiteralKind,\r\n LiteralExpression,\r\n StringLiteralExpression\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags\r\n} from \"./types\";\r\n\r\nimport {\r\n BinaryOp,\r\n UnaryOp,\r\n HostOp,\r\n NativeType,\r\n ExpressionRef,\r\n ExpressionId,\r\n getExpressionId,\r\n getExpressionType,\r\n getConstValueI64High,\r\n getConstValueI64Low,\r\n getConstValueI32\r\n} from \"./module\";\r\n\r\nimport {\r\n ElementKind,\r\n FunctionPrototype,\r\n Class,\r\n Field,\r\n OperatorKind,\r\n FlowFlags,\r\n Global,\r\n DecoratorFlags\r\n} from \"./program\";\r\n\r\nimport {\r\n ReportMode\r\n} from \"./resolver\";\r\n\r\nimport {\r\n CommonFlags\r\n} from \"./common\";\r\n\r\n/** Compiles a call to a built-in function. */\r\nexport function compileCall(\r\n compiler: Compiler,\r\n prototype: FunctionPrototype,\r\n typeArguments: Type[] | null,\r\n operands: Expression[],\r\n contextualType: Type,\r\n reportNode: Node\r\n): ExpressionRef {\r\n var module = compiler.module;\r\n\r\n var arg0: ExpressionRef,\r\n arg1: ExpressionRef,\r\n arg2: ExpressionRef,\r\n ret: ExpressionRef;\r\n\r\n // NOTE that some implementations below make use of the select expression where straight-forward.\r\n // whether worth or not should probably be tested once it's known if/how embedders handle it.\r\n // search: createSelect\r\n\r\n switch (prototype.internalName) {\r\n\r\n // types\r\n\r\n case \"isInteger\": { // isInteger() / isInteger(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n return type.is(TypeFlags.INTEGER) && !type.is(TypeFlags.REFERENCE)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case \"isFloat\": { // isFloat() / isFloat(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n return type.is(TypeFlags.FLOAT)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case \"isSigned\": { // isSigned() / isSigned(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n return type.is(TypeFlags.SIGNED)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case \"isReference\": { // isReference() / isReference(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n compiler.currentType = Type.bool;\r\n return type.is(TypeFlags.REFERENCE)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case \"isString\": { // isString() / isString(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n let classType = type.classReference;\r\n if (classType) {\r\n let stringInstance = compiler.program.stringInstance;\r\n if (stringInstance && classType.isAssignableTo(stringInstance)) return module.createI32(1);\r\n }\r\n return module.createI32(0);\r\n }\r\n case \"isArray\": { // isArray() / isArray(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n let classType = type.classReference;\r\n return classType !== null && classType.lookupOverload(OperatorKind.INDEXED_GET) !== null\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case \"isDefined\": { // isDefined(expression) -> bool\r\n compiler.currentType = Type.bool;\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n let element = compiler.resolver.resolveExpression(\r\n operands[0],\r\n compiler.currentFunction,\r\n Type.void,\r\n ReportMode.SWALLOW\r\n );\r\n return module.createI32(element ? 1 : 0);\r\n }\r\n case \"isConstant\": { // isConstant(expression) -> bool\r\n compiler.currentType = Type.bool;\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n let expr = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n compiler.currentType = Type.bool;\r\n return module.createI32(getExpressionId(expr) == ExpressionId.Const ? 1 : 0);\r\n }\r\n case \"isManaged\": { // isManaged() -> bool\r\n if (!compiler.program.hasGC) {\r\n compiler.currentType = Type.bool;\r\n return module.createI32(0);\r\n }\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n let classType = type.classReference;\r\n return classType !== null && !classType.hasDecorator(DecoratorFlags.UNMANAGED)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n\r\n // math\r\n\r\n case \"clz\": { // clz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16: {\r\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\r\n break;\r\n }\r\n case TypeKind.BOOL: // usually overflows\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.ClzI64\r\n : UnaryOp.ClzI32,\r\n arg0\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createUnary(UnaryOp.ClzI64, arg0);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"ctz\": { // ctz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.NONE, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16: {\r\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\r\n break;\r\n }\r\n case TypeKind.BOOL: // usually overflows\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.CtzI64\r\n : UnaryOp.CtzI32,\r\n arg0\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createUnary(UnaryOp.CtzI64, arg0);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"popcnt\": { // popcnt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16: {\r\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\r\n break;\r\n }\r\n case TypeKind.BOOL: // usually overflows\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.PopcntI64\r\n : UnaryOp.PopcntI32,\r\n arg0\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createUnary(UnaryOp.PopcntI64, arg0);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"rotl\": { // rotl(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n ret = compiler.ensureSmallIntegerWrap(\r\n module.createBinary(BinaryOp.RotlI32, arg0, arg1),\r\n compiler.currentType\r\n );\r\n // fall-through\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createBinary(BinaryOp.RotlI32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.RotlI64\r\n : BinaryOp.RotlI32,\r\n arg0,\r\n arg1\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createBinary(BinaryOp.RotlI64, arg0, arg1);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret; // possibly overflows\r\n }\r\n case \"rotr\": { // rotr(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n ret = compiler.ensureSmallIntegerWrap(\r\n module.createBinary(BinaryOp.RotrI32, arg0, arg1),\r\n compiler.currentType\r\n );\r\n break;\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createBinary(BinaryOp.RotrI32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.RotrI64\r\n : BinaryOp.RotrI32,\r\n arg0,\r\n arg1\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createBinary(BinaryOp.RotrI64, arg0, arg1);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret; // possibly overflowws\r\n }\r\n case \"abs\": { // abs(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n let currentFunction = compiler.currentFunction;\r\n\r\n // possibly overflows, e.g. abs(-128) == 128\r\n let tempLocal1 = currentFunction.getTempLocal(Type.i32, false);\r\n let tempLocalIndex2 = currentFunction.getAndFreeTempLocal(Type.i32, false).index;\r\n let tempLocalIndex1 = tempLocal1.index;\r\n\r\n // (x + (x >> 31)) ^ (x >> 31)\r\n ret = module.createBinary(BinaryOp.XorI32,\r\n module.createBinary(BinaryOp.AddI32,\r\n module.createTeeLocal(\r\n tempLocalIndex2,\r\n module.createBinary(BinaryOp.ShrI32,\r\n module.createTeeLocal(tempLocalIndex1, arg0),\r\n module.createI32(31)\r\n )\r\n ),\r\n module.createGetLocal(tempLocalIndex1, NativeType.I32)\r\n ),\r\n module.createGetLocal(tempLocalIndex2, NativeType.I32)\r\n );\r\n\r\n currentFunction.freeTempLocal(tempLocal1);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n let options = compiler.options;\r\n let currentFunction = compiler.currentFunction;\r\n let wasm64 = options.isWasm64;\r\n\r\n let tempLocal1 = currentFunction.getTempLocal(options.usizeType, false);\r\n let tempLocalIndex2 = currentFunction.getAndFreeTempLocal(options.usizeType, false).index;\r\n let tempLocalIndex1 = tempLocal1.index;\r\n\r\n ret = module.createBinary(wasm64 ? BinaryOp.XorI64 : BinaryOp.XorI32,\r\n module.createBinary(wasm64 ? BinaryOp.AddI64 : BinaryOp.AddI32,\r\n module.createTeeLocal(\r\n tempLocalIndex2,\r\n module.createBinary(wasm64 ? BinaryOp.ShrI64 : BinaryOp.ShrI32,\r\n module.createTeeLocal(tempLocalIndex1, arg0),\r\n wasm64 ? module.createI64(63) : module.createI32(31)\r\n )\r\n ),\r\n module.createGetLocal(tempLocalIndex1, options.nativeSizeType)\r\n ),\r\n module.createGetLocal(tempLocalIndex2, options.nativeSizeType)\r\n );\r\n\r\n currentFunction.freeTempLocal(tempLocal1);\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n let currentFunction = compiler.currentFunction;\r\n\r\n let tempLocal1 = currentFunction.getTempLocal(Type.i64, false);\r\n let tempLocalIndex2 = currentFunction.getAndFreeTempLocal(Type.i64, false).index;\r\n let tempLocalIndex1 = tempLocal1.index;\r\n\r\n // (x + (x >> 63)) ^ (x >> 63)\r\n ret = module.createBinary(BinaryOp.XorI64,\r\n module.createBinary(BinaryOp.AddI64,\r\n module.createTeeLocal(\r\n tempLocalIndex2,\r\n module.createBinary(BinaryOp.ShrI64,\r\n module.createTeeLocal(tempLocalIndex1, arg0),\r\n module.createI64(63)\r\n )\r\n ),\r\n module.createGetLocal(tempLocalIndex1, NativeType.I64)\r\n ),\r\n module.createGetLocal(tempLocalIndex2, NativeType.I64)\r\n );\r\n\r\n currentFunction.freeTempLocal(tempLocal1);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.U64:\r\n case TypeKind.BOOL: {\r\n ret = arg0;\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.AbsF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.AbsF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n default: { // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"max\": { // max(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n let flow = compiler.currentFunction.flow;\r\n let tempLocal0 = compiler.currentFunction.getTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg1, compiler.currentType)\r\n );\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n let flow = compiler.currentFunction.flow;\r\n let tempLocal0 = compiler.currentFunction.getTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg1, compiler.currentType)\r\n );\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtU32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\r\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtI64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\r\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtU64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\r\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.GtI64\r\n : BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\r\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.GtU64\r\n : BinaryOp.GtU32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createBinary(BinaryOp.MaxF32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createBinary(BinaryOp.MaxF64, arg0, arg1);\r\n break;\r\n }\r\n default: { // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"min\": { // min(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n let flow = compiler.currentFunction.flow;\r\n let tempLocal0 = compiler.currentFunction.getTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg1, compiler.currentType)\r\n );\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtI32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n let flow = compiler.currentFunction.flow;\r\n let tempLocal0 = compiler.currentFunction.getTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg1, compiler.currentType)\r\n );\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtU32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\r\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtI64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\r\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtU64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\r\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.LtI64\r\n : BinaryOp.LtI32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\r\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n compiler.currentFunction.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.LtU64\r\n : BinaryOp.LtU32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createBinary(BinaryOp.MinF32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createBinary(BinaryOp.MinF64, arg0, arg1);\r\n break;\r\n }\r\n default: { // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"ceil\": { // ceil(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: { // any integer\r\n ret = arg0;\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.CeilF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.CeilF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"floor\": { // floor(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: { // any integer\r\n ret = arg0;\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.FloorF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.FloorF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"copysign\": { // copysign(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n switch (compiler.currentType.kind) { // TODO: does an integer version make sense?\r\n case TypeKind.F32: {\r\n ret = module.createBinary(BinaryOp.CopysignF32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createBinary(BinaryOp.CopysignF64, arg0, arg1);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"nearest\": { // nearest(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: { // any integer\r\n ret = arg0;\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.NearestF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.NearestF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"reinterpret\": { // reinterpret(value: *) -> T\r\n if (operands.length != 1) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n switch (typeArguments[0].kind) {\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n arg0 = compiler.compileExpression(operands[0], Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n ret = module.createUnary(UnaryOp.ReinterpretF32, arg0);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n ret = module.createUnary(UnaryOp.ReinterpretF64, arg0);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (typeArguments[0].is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.isWasm64\r\n ? Type.f64\r\n : Type.f32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.ReinterpretF64\r\n : UnaryOp.ReinterpretF32,\r\n arg0\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n ret = module.createUnary(UnaryOp.ReinterpretI32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n arg0 = compiler.compileExpression(operands[0], Type.i64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n ret = module.createUnary(UnaryOp.ReinterpretI64, arg0);\r\n break;\r\n }\r\n default: { // small integers and void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return ret;\r\n }\r\n case \"sqrt\": { // sqrt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) { // TODO: integer versions (that return f64 or convert)?\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.SqrtF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.SqrtF64, arg0);\r\n break;\r\n }\r\n // case TypeKind.VOID:\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"trunc\": { // trunc(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments && typeArguments.length) {\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: { // any integer\r\n ret = arg0;\r\n break;\r\n }\r\n // TODO: truncate to contextual type directly (if not void etc.)?\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.TruncF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.TruncF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n // memory access\r\n\r\n case \"load\": { // load(offset: usize, constantOffset?: usize) -> *\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n let offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return module.createLoad(\r\n typeArguments[0].byteSize,\r\n typeArguments[0].is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n arg0,\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n contextualType.is(TypeFlags.INTEGER) &&\r\n contextualType.size > typeArguments[0].size\r\n ? (compiler.currentType = contextualType).toNativeType()\r\n : (compiler.currentType = typeArguments[0]).toNativeType(),\r\n offset\r\n );\r\n }\r\n case \"store\": { // store(offset: usize, value: *, constantOffset?: usize) -> void\r\n compiler.currentType = Type.void;\r\n if (operands.length < 2 || operands.length > 3) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n let type: Type;\r\n if (\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n (\r\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\r\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n )\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[1]\r\n );\r\n type = typeArguments[0];\r\n } else {\r\n type = compiler.currentType;\r\n }\r\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = Type.void;\r\n return module.createStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\r\n }\r\n case \"sizeof\": { // sizeof() -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length != 0) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n let byteSize = (typeArguments)[0].byteSize;\r\n if (compiler.options.isWasm64) {\r\n // implicitly wrap if contextual type is a 32-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n compiler.currentType = Type.u32;\r\n ret = module.createI32(byteSize);\r\n } else {\r\n ret = module.createI64(byteSize, 0);\r\n }\r\n } else {\r\n // implicitly extend if contextual type is a 64-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n compiler.currentType = Type.u64;\r\n ret = module.createI64(byteSize, 0);\r\n } else {\r\n ret = module.createI32(byteSize);\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"alignof\": { // alignof() -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length != 0) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n let byteSize = (typeArguments)[0].byteSize;\r\n let alignLog2: i32;\r\n switch (byteSize) {\r\n case 1: { alignLog2 = 0; break; }\r\n case 2: { alignLog2 = 1; break; }\r\n case 4: { alignLog2 = 2; break; }\r\n case 8: { alignLog2 = 3; break; }\r\n default: { assert(false); return module.createUnreachable(); }\r\n }\r\n if (compiler.options.isWasm64) {\r\n // implicitly wrap if contextual type is a 32-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n compiler.currentType = Type.u32;\r\n ret = module.createI32(alignLog2);\r\n } else {\r\n ret = module.createI64(alignLog2, 0);\r\n }\r\n } else {\r\n // implicitly extend if contextual type is a 64-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n compiler.currentType = Type.u64;\r\n ret = module.createI64(alignLog2, 0);\r\n } else {\r\n ret = module.createI32(alignLog2);\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"offsetof\": { // offsetof(fieldName?: string) -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length > 1) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n let classType = typeArguments[0].classReference;\r\n if (!classType) {\r\n compiler.error( // TODO: better error\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n let offset: i32;\r\n if (operands.length) {\r\n if (\r\n operands[0].kind != NodeKind.LITERAL ||\r\n (operands[0]).literalKind != LiteralKind.STRING\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.String_literal_expected,\r\n operands[0].range\r\n );\r\n return module.createUnreachable();\r\n }\r\n let fieldName = (operands[0]).value;\r\n let field = classType.members ? classType.members.get(fieldName) : null;\r\n if (!(field && field.kind == ElementKind.FIELD)) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_has_no_property_1,\r\n operands[0].range, classType.internalName, fieldName\r\n );\r\n return module.createUnreachable();\r\n }\r\n offset = (field).memoryOffset;\r\n } else {\r\n offset = classType.currentMemoryOffset;\r\n }\r\n if (compiler.options.isWasm64) {\r\n // implicitly wrap if contextual type is a 32-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n compiler.currentType = Type.u32;\r\n return module.createI32(offset);\r\n } else {\r\n return module.createI64(offset);\r\n }\r\n } else {\r\n // implicitly extend if contextual type is a 64-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n compiler.currentType = Type.u64;\r\n return module.createI64(offset);\r\n } else {\r\n return module.createI32(offset);\r\n }\r\n }\r\n }\r\n\r\n // control flow\r\n\r\n case \"select\": { // select(ifTrue: T, ifFalse: T, condition: bool) -> T\r\n if (operands.length != 3) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n }\r\n let type = compiler.currentType;\r\n arg1 = compiler.compileExpression(operands[1], type, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n arg2 = compiler.makeIsTrueish(\r\n compiler.compileExpressionRetainType(operands[2], Type.bool, WrapMode.NONE),\r\n compiler.currentType\r\n );\r\n compiler.currentType = type;\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n ret = module.createSelect(arg0, arg1, arg2);\r\n break;\r\n }\r\n default: { // any other value type\r\n ret = module.createSelect(arg0, arg1, arg2);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"unreachable\": { // unreachable() -> *\r\n if (operands.length != 0) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n\r\n // host operations\r\n\r\n case \"memory.size\": { // memory.size() -> i32\r\n compiler.currentType = Type.i32;\r\n if (operands.length != 0) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createHost(HostOp.CurrentMemory);\r\n }\r\n case \"memory.grow\": { // memory.grow(pages: i32) -> i32\r\n compiler.currentType = Type.i32;\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n arg0 = module.createUnreachable();\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createHost(HostOp.GrowMemory, null, [ arg0 ]);\r\n }\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n case \"memory.copy\": { // memory.copy(dest: usize, src: usize: n: usize) -> void\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg2 = compiler.compileExpression(\r\n operands[2],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n compiler.currentType = Type.void;\r\n throw new Error(\"not implemented\");\r\n // return module.createHost(HostOp.MoveMemory, null, [ arg0, arg1, arg2 ]);\r\n }\r\n case \"memory.fill\": { // memory.fill(dest: usize, value: u8, n: usize) -> void\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n Type.u32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg2 = compiler.compileExpression(\r\n operands[2],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n compiler.currentType = Type.void;\r\n throw new Error(\"not implemented\");\r\n // return module.createHost(HostOp.SetMemory, null, [ arg0, arg1, arg2 ]);\r\n }\r\n\r\n // other\r\n\r\n case \"changetype\": { // changetype(value: *) -> T\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpressionRetainType(\r\n operands[0],\r\n typeArguments[0],\r\n WrapMode.NONE\r\n );\r\n compiler.currentType = typeArguments[0];\r\n if (compiler.currentType.size != typeArguments[0].size) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n // if (reportNode.range.source.sourceKind != SourceKind.STDLIB)\r\n // compiler.warning(DiagnosticCode.Operation_is_unsafe, reportNode.range);\r\n return arg0; // any usize to any usize\r\n }\r\n case \"assert\": { // assert(isTrueish: T, message?: string) -> T with T != null\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n } else if (operands.length > 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.bool, WrapMode.WRAP);\r\n }\r\n\r\n let type = compiler.currentType;\r\n compiler.currentType = type.nonNullableType;\r\n\r\n // just return ifTrueish if assertions are disabled, or simplify if dropped anyway\r\n if (compiler.options.noAssert) {\r\n if (contextualType == Type.void) {\r\n compiler.currentType = Type.void;\r\n return module.createNop();\r\n }\r\n return arg0;\r\n }\r\n\r\n let abort = compileAbort(compiler, operands.length == 2 ? operands[1] : null, reportNode);\r\n\r\n compiler.currentType = type.nonNullableType;\r\n\r\n if (contextualType == Type.void) { // simplify if dropped anyway\r\n switch (compiler.currentType.kind) {\r\n default: { // any integer up to 32-bits incl. bool\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI32,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI64,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: {\r\n ret = module.createIf(\r\n module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n // TODO: also check for NaN in float assertions, as in `Boolean(NaN) -> false`?\r\n case TypeKind.F32: {\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF32,\r\n arg0,\r\n module.createF32(0)\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF64,\r\n arg0,\r\n module.createF64(0)\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = abort;\r\n break;\r\n }\r\n }\r\n compiler.currentType = Type.void;\r\n } else {\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n let flow = compiler.currentFunction.flow;\r\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n ret = module.createIf(\r\n module.createTeeLocal(tempLocal.index, arg0),\r\n module.createGetLocal(tempLocal.index, NativeType.I32),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n default: {\r\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\r\n ret = module.createIf(\r\n module.createTeeLocal(tempLocal.index, arg0),\r\n module.createGetLocal(tempLocal.index, NativeType.I32),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI64,\r\n module.createTeeLocal(tempLocal.index, arg0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal.index, NativeType.I64)\r\n );\r\n break;\r\n }\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: {\r\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n ret = module.createIf(\r\n module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n module.createTeeLocal(tempLocal.index, arg0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f32, false);\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF32,\r\n module.createTeeLocal(tempLocal.index, arg0),\r\n module.createF32(0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal.index, NativeType.F32)\r\n );\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f64, false);\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF64,\r\n module.createTeeLocal(tempLocal.index, arg0),\r\n module.createF64(0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal.index, NativeType.F64)\r\n );\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = abort;\r\n break;\r\n }\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"unchecked\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n let flow = compiler.currentFunction.flow;\r\n flow.set(FlowFlags.UNCHECKED_CONTEXT);\r\n ret = compiler.compileExpressionRetainType(operands[0], contextualType, WrapMode.NONE);\r\n flow.unset(FlowFlags.UNCHECKED_CONTEXT);\r\n return ret;\r\n }\r\n case \"call_indirect\": { // call_indirect(target: Function | u32, ...args: *[]) -> T\r\n if (operands.length < 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n let returnType: Type;\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n returnType = typeArguments[0];\r\n } else {\r\n returnType = contextualType;\r\n }\r\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\r\n if (compiler.currentType.kind != TypeKind.U32) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n operands[0].range\r\n );\r\n return module.createUnreachable();\r\n }\r\n let numOperands = operands.length - 1;\r\n let operandExprs = new Array(numOperands);\r\n let signatureParts = new Array(numOperands + 1);\r\n let nativeReturnType = returnType.toNativeType();\r\n let nativeParamTypes = new Array(numOperands);\r\n for (let i = 0; i < numOperands; ++i) {\r\n operandExprs[i] = compiler.compileExpressionRetainType(operands[1 + i], Type.i32, WrapMode.NONE);\r\n let operandType = compiler.currentType;\r\n signatureParts[i] = operandType.toSignatureString();\r\n nativeParamTypes[i] = operandType.toNativeType();\r\n }\r\n signatureParts[numOperands] = returnType.toSignatureString();\r\n let typeName = signatureParts.join(\"\");\r\n let typeRef = module.getFunctionTypeBySignature(nativeReturnType, nativeParamTypes);\r\n if (!typeRef) typeRef = module.addFunctionType(typeName, nativeReturnType, nativeParamTypes);\r\n compiler.currentType = returnType;\r\n // of course this can easily result in a 'RuntimeError: function signature mismatch' trap and\r\n // thus must be used with care. it exists because it *might* be useful in specific scenarios.\r\n return module.createCallIndirect(arg0, operandExprs, typeName);\r\n }\r\n case \"instantiate\": {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n let classInstance = typeArguments[0].classReference;\r\n if (!classInstance) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileInstantiate(classInstance, operands, reportNode);\r\n }\r\n\r\n // user-defined diagnostic macros\r\n\r\n case \"ERROR\": {\r\n compiler.error(\r\n DiagnosticCode.User_defined_0,\r\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n case \"WARNING\": {\r\n compiler.warning(\r\n DiagnosticCode.User_defined_0,\r\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\r\n );\r\n return module.createNop();\r\n }\r\n case \"INFO\": {\r\n compiler.info(\r\n DiagnosticCode.User_defined_0,\r\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\r\n );\r\n return module.createNop();\r\n }\r\n\r\n // conversions\r\n\r\n case \"i8\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.i8,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"i16\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.i16,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"i32\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.i32,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"i64\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.i64,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"isize\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = compiler.options.isWasm64\r\n ? Type.isize64\r\n : Type.isize32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n compiler.options.isWasm64\r\n ? Type.isize64\r\n : Type.isize32,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"u8\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.u8,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"u16\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.u16,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"u32\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.u32,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"u64\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.u64,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"usize\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = compiler.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"bool\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.bool;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.bool,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"f32\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.f32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.f32,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"f64\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.f64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.f64,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n\r\n // gc\r\n\r\n case \"iterateRoots\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n let expr = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\r\n let type = compiler.currentType;\r\n let signatureReference = type.signatureReference;\r\n compiler.currentType = Type.void;\r\n if (\r\n !type.is(TypeFlags.REFERENCE) ||\r\n !signatureReference ||\r\n signatureReference.parameterTypes.length != 1 ||\r\n signatureReference.parameterTypes[0] != compiler.options.usizeType\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n reportNode.range, type.toString(), \"(ref: usize) => void\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = Type.void;\r\n // just emit a call even if the function doesn't yet exist\r\n compiler.needsIterateRoots = true;\r\n return module.createCall(\"~iterateRoots\", [ expr ], NativeType.None);\r\n }\r\n }\r\n var expr = deferASMCall(compiler, prototype, operands, contextualType, reportNode);\r\n if (expr) {\r\n if (typeArguments && typeArguments.length) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return expr;\r\n }\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n}\r\n\r\n/** Defers an inline-assembler-like call to a built-in function. */\r\nfunction deferASMCall(\r\n compiler: Compiler,\r\n prototype: FunctionPrototype,\r\n operands: Expression[],\r\n contextualType: Type,\r\n reportNode: Node\r\n): ExpressionRef {\r\n switch (prototype.internalName) {\r\n\r\n // TODO: Operators can't be just deferred (don't have a corresponding generic built-in)\r\n // add, sub, mul, div_s, div_u, rem_s, rem_u\r\n // and, or, xor, shl, shr_u, shr_s\r\n // eq, eqz, ne, lt_s, lt_u, le_s, le_u, gt_s, gt_u, ge_s, ge_u\r\n\r\n case \"i32.clz\": return deferASM(\"clz\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.clz\": return deferASM(\"clz\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n case \"i32.ctz\": return deferASM(\"ctz\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.ctz\": return deferASM(\"ctz\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n case \"i32.popcnt\": return deferASM(\"popcnt\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.popcnt\": return deferASM(\"popcnt\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n case \"i32.rotl\": return deferASM(\"rotl\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.rotl\": return deferASM(\"rotl\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n case \"i32.rotr\": return deferASM(\"rotr\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.rotr\": return deferASM(\"rotr\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n case \"f32.abs\": return deferASM(\"abs\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.abs\": return deferASM(\"abs\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.max\": return deferASM(\"max\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.max\": return deferASM(\"max\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.min\": return deferASM(\"min\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.min\": return deferASM(\"min\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.ceil\": return deferASM(\"ceil\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.ceil\": return deferASM(\"ceil\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.floor\": return deferASM(\"floor\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.floor\": return deferASM(\"floor\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.copysign\": return deferASM(\"copysign\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.copysign\": return deferASM(\"copysign\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.nearest\": return deferASM(\"nearest\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.nearest\": return deferASM(\"nearest\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"i32.reinterpret_f32\": return deferASM(\"reinterpret\", compiler, Type.i32, operands, Type.f32, reportNode);\r\n case \"i64.reinterpret_f64\": return deferASM(\"reinterpret\", compiler, Type.i64, operands, Type.f64, reportNode);\r\n case \"f32.reinterpret_i32\": return deferASM(\"reinterpret\", compiler, Type.f32, operands, Type.i32, reportNode);\r\n case \"f64.reinterpret_i64\": return deferASM(\"reinterpret\", compiler, Type.f64, operands, Type.i64, reportNode);\r\n\r\n case \"f32.sqrt\": return deferASM(\"sqrt\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.sqrt\": return deferASM(\"sqrt\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.trunc\": return deferASM(\"trunc\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.trunc\": return deferASM(\"trunc\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"i32.load8_s\": return deferASM(\"load\", compiler, Type.i8, operands, Type.i32, reportNode);\r\n case \"i32.load8_u\": return deferASM(\"load\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.load16_s\": return deferASM(\"load\", compiler, Type.i16, operands, Type.i32, reportNode);\r\n case \"i32.load16_u\": return deferASM(\"load\", compiler, Type.u16, operands, Type.u32, reportNode);\r\n case \"i32.load\": return deferASM(\"load\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.load8_s\": return deferASM(\"load\", compiler, Type.i8, operands, Type.i64, reportNode);\r\n case \"i64.load8_u\": return deferASM(\"load\", compiler, Type.u8, operands, Type.u64, reportNode);\r\n case \"i64.load16_s\": return deferASM(\"load\", compiler, Type.i16, operands, Type.i64, reportNode);\r\n case \"i64.load16_u\": return deferASM(\"load\", compiler, Type.u16, operands, Type.u64, reportNode);\r\n case \"i64.load32_s\": return deferASM(\"load\", compiler, Type.i32, operands, Type.i64, reportNode);\r\n case \"i64.load32_u\": return deferASM(\"load\", compiler, Type.u32, operands, Type.u64, reportNode);\r\n case \"i64.load\": return deferASM(\"load\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n case \"f32.load\": return deferASM(\"load\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.load\": return deferASM(\"load\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"i32.store8\": return deferASM(\"store\", compiler, Type.i8, operands, Type.i32, reportNode);\r\n case \"i32.store16\": return deferASM(\"store\", compiler, Type.i16, operands, Type.i32, reportNode);\r\n case \"i32.store\": return deferASM(\"store\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.store8\": return deferASM(\"store\", compiler, Type.i8, operands, Type.i64, reportNode);\r\n case \"i64.store16\": return deferASM(\"store\", compiler, Type.i16, operands, Type.i64, reportNode);\r\n case \"i64.store32\": return deferASM(\"store\", compiler, Type.i32, operands, Type.i64, reportNode);\r\n case \"i64.store\": return deferASM(\"store\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n case \"f32.store\": return deferASM(\"store\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.store\": return deferASM(\"store\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n }\r\n return 0;\r\n}\r\n\r\n/** A helper for deferring inline-assembler-like calls to built-in functions. */\r\nfunction deferASM(\r\n name: string,\r\n compiler: Compiler,\r\n typeArgument: Type,\r\n operands: Expression[],\r\n valueType: Type,\r\n reportNode: Node\r\n): ExpressionRef {\r\n var prototype = assert(compiler.program.elementsLookup.get(name));\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n return compileCall(compiler, prototype, [ typeArgument ], operands, valueType, reportNode);\r\n}\r\n\r\n/** Evaluates the constant type of a type argument *or* expression. */\r\nfunction evaluateConstantType(\r\n compiler: Compiler,\r\n typeArguments: Type[] | null,\r\n operands: Expression[],\r\n reportNode: Node\r\n): Type | null {\r\n if (operands.length == 0) { // requires type argument\r\n if (!typeArguments || typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return null;\r\n }\r\n return typeArguments[0];\r\n }\r\n if (operands.length == 1) { // optional type argument\r\n if (typeArguments) {\r\n if (typeArguments.length == 1) {\r\n compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n if (typeArguments.length) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return null;\r\n }\r\n compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n }\r\n } else {\r\n compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n }\r\n return compiler.currentType;\r\n }\r\n if (typeArguments && typeArguments.length > 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return null;\r\n}\r\n\r\n/** Evaluates a `constantOffset` argument.*/\r\nfunction evaluateConstantOffset(compiler: Compiler, expression: Expression): i32 {\r\n var expr: ExpressionRef;\r\n var value: i32;\r\n if (compiler.options.isWasm64) {\r\n expr = compiler.precomputeExpression(expression, Type.usize64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n if (\r\n getExpressionId(expr) != ExpressionId.Const ||\r\n getExpressionType(expr) != NativeType.I64 ||\r\n getConstValueI64High(expr) != 0 ||\r\n (value = getConstValueI64Low(expr)) < 0\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n value = -1;\r\n }\r\n } else {\r\n expr = compiler.precomputeExpression(expression, Type.usize32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n if (\r\n getExpressionId(expr) != ExpressionId.Const ||\r\n getExpressionType(expr) != NativeType.I32 ||\r\n (value = getConstValueI32(expr)) < 0\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n value = -1;\r\n }\r\n }\r\n return value;\r\n}\r\n\r\n/** Compiles a memory allocation for an instance of the specified class. */\r\nexport function compileAllocate(\r\n compiler: Compiler,\r\n classInstance: Class,\r\n reportNode: Node\r\n): ExpressionRef {\r\n var program = compiler.program;\r\n assert(classInstance.program == program);\r\n var module = compiler.module;\r\n var options = compiler.options;\r\n\r\n // __gc_allocate(size, markFn)\r\n if (program.hasGC && classInstance.type.isManaged(program)) {\r\n let allocateInstance = assert(program.gcAllocateInstance);\r\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\r\n compiler.currentType = classInstance.type;\r\n return module.createCall(\r\n allocateInstance.internalName, [\r\n options.isWasm64\r\n ? module.createI64(classInstance.currentMemoryOffset)\r\n : module.createI32(classInstance.currentMemoryOffset),\r\n module.createI32(\r\n ensureGCHook(compiler, classInstance)\r\n )\r\n ],\r\n options.nativeSizeType\r\n );\r\n\r\n // memory.allocate(size)\r\n } else {\r\n let allocateInstance = program.memoryAllocateInstance;\r\n if (!allocateInstance) {\r\n program.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n reportNode.range, \"memory.allocate\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!compiler.compileFunction(allocateInstance)) return module.createUnreachable();\r\n\r\n compiler.currentType = classInstance.type;\r\n return module.createCall(\r\n allocateInstance.internalName, [\r\n options.isWasm64\r\n ? module.createI64(classInstance.currentMemoryOffset)\r\n : module.createI32(classInstance.currentMemoryOffset)\r\n ],\r\n options.nativeSizeType\r\n );\r\n }\r\n}\r\n\r\n/** Compiles an abort wired to the conditionally imported 'abort' function. */\r\nexport function compileAbort(\r\n compiler: Compiler,\r\n message: Expression | null,\r\n reportNode: Node\r\n): ExpressionRef {\r\n var program = compiler.program;\r\n var module = compiler.module;\r\n\r\n var stringType = program.typesLookup.get(\"string\");\r\n if (!stringType) return module.createUnreachable();\r\n\r\n var abortInstance = program.abortInstance;\r\n if (!(abortInstance && compiler.compileFunction(abortInstance))) return module.createUnreachable();\r\n\r\n var messageArg = message != null\r\n ? compiler.compileExpression(message, stringType, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n : stringType.toNativeZero(module);\r\n\r\n var filenameArg = compiler.ensureStaticString(reportNode.range.source.normalizedPath);\r\n\r\n compiler.currentType = Type.void;\r\n return module.createBlock(null, [\r\n module.createCall(\r\n abortInstance.internalName, [\r\n messageArg,\r\n filenameArg,\r\n module.createI32(reportNode.range.line),\r\n module.createI32(reportNode.range.column)\r\n ],\r\n NativeType.None\r\n ),\r\n module.createUnreachable()\r\n ]);\r\n}\r\n\r\n/** Compiles the iterateRoots function if requires. */\r\nexport function compileIterateRoots(compiler: Compiler): void {\r\n var module = compiler.module;\r\n var exprs = new Array();\r\n\r\n for (let element of compiler.program.elementsLookup.values()) {\r\n if (element.kind != ElementKind.GLOBAL) continue;\r\n let global = element;\r\n let classReference = global.type.classReference;\r\n if (\r\n global.is(CommonFlags.COMPILED) &&\r\n classReference !== null &&\r\n !classReference.hasDecorator(DecoratorFlags.UNMANAGED)\r\n ) {\r\n if (global.is(CommonFlags.INLINED)) {\r\n let value = global.constantIntegerValue;\r\n exprs.push(\r\n module.createCallIndirect(\r\n module.createGetLocal(0, NativeType.I32),\r\n [\r\n compiler.options.isWasm64\r\n ? module.createI64(i64_low(value), i64_high(value))\r\n : module.createI32(i64_low(value))\r\n ],\r\n \"iv\"\r\n )\r\n );\r\n } else {\r\n exprs.push(\r\n module.createCallIndirect(\r\n module.createGetLocal(0, NativeType.I32),\r\n [\r\n module.createGetGlobal(\r\n global.internalName,\r\n compiler.options.nativeSizeType\r\n )\r\n ],\r\n \"iv\"\r\n )\r\n );\r\n }\r\n }\r\n }\r\n var typeRef = compiler.ensureFunctionType([ Type.i32 ], Type.void);\r\n module.addFunction(\"~iterateRoots\", typeRef, [],\r\n exprs.length\r\n ? module.createBlock(null, exprs)\r\n : module.createNop()\r\n );\r\n}\r\n\r\n/** Ensures that the specified class's GC hook exists and returns its function table index. */\r\nexport function ensureGCHook(\r\n compiler: Compiler,\r\n classInstance: Class\r\n): u32 {\r\n var program = compiler.program;\r\n assert(classInstance.type.isManaged(program));\r\n\r\n // check if the GC hook has already been created\r\n {\r\n let existingIndex = classInstance.gcHookIndex;\r\n if (existingIndex != -1) return existingIndex;\r\n }\r\n\r\n // check if the class implements a custom GC function (only valid for internals)\r\n var members = classInstance.members;\r\n if (classInstance.prototype.declaration.range.source.isLibrary) {\r\n if (members !== null && members.has(\"__gc\")) {\r\n let gcPrototype = assert(members.get(\"__gc\"));\r\n assert(gcPrototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let gcInstance = assert(program.resolver.resolveFunction(gcPrototype, null));\r\n assert(gcInstance.is(CommonFlags.PRIVATE | CommonFlags.INSTANCE));\r\n assert(!gcInstance.isAny(CommonFlags.AMBIENT | CommonFlags.VIRTUAL));\r\n assert(gcInstance.signature.parameterTypes.length == 0);\r\n assert(gcInstance.signature.returnType == Type.void);\r\n gcInstance.internalName = classInstance.internalName + \"~gc\";\r\n assert(compiler.compileFunction(gcInstance));\r\n let index = compiler.ensureFunctionTableEntry(gcInstance);\r\n classInstance.gcHookIndex = index;\r\n return index;\r\n }\r\n }\r\n\r\n var module = compiler.module;\r\n var options = compiler.options;\r\n var nativeSizeType = options.nativeSizeType;\r\n var nativeSizeSize = options.usizeType.byteSize;\r\n var body = new Array();\r\n\r\n // nothing to mark if 'this' is null\r\n body.push(\r\n module.createIf(\r\n module.createUnary(\r\n options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n module.createGetLocal(0, nativeSizeType)\r\n ),\r\n module.createReturn()\r\n )\r\n );\r\n\r\n // remember the function index so we don't recurse infinitely\r\n var functionTable = compiler.functionTable;\r\n var gcHookIndex = functionTable.length;\r\n functionTable.push(\"\");\r\n classInstance.gcHookIndex = gcHookIndex;\r\n\r\n // if the class extends a base class, call its hook first (calls mark)\r\n var baseInstance = classInstance.base;\r\n if (baseInstance) {\r\n assert(baseInstance.type.isManaged(program));\r\n body.push(\r\n module.createCallIndirect(\r\n module.createI32(\r\n ensureGCHook(compiler, baseInstance.type.classReference)\r\n ),\r\n [\r\n module.createGetLocal(0, nativeSizeType)\r\n ],\r\n nativeSizeType == NativeType.I64 ? \"Iv\" : \"iv\"\r\n )\r\n );\r\n\r\n // if this class is the top-most base class, mark the instance\r\n } else {\r\n body.push(\r\n module.createCall(assert(program.gcMarkInstance).internalName, [\r\n module.createGetLocal(0, nativeSizeType)\r\n ], NativeType.None)\r\n );\r\n }\r\n\r\n // mark instances assigned to own fields that are again references\r\n if (members) {\r\n for (let member of members.values()) {\r\n if (member.kind == ElementKind.FIELD) {\r\n if ((member).parent === classInstance) {\r\n let type = (member).type;\r\n if (type.isManaged(program)) {\r\n let offset = (member).memoryOffset;\r\n assert(offset >= 0);\r\n body.push(\r\n module.createCall(assert(program.gcMarkInstance).internalName, [\r\n module.createLoad(\r\n nativeSizeSize,\r\n false,\r\n module.createGetLocal(0, nativeSizeType),\r\n nativeSizeType,\r\n offset\r\n )\r\n ], NativeType.None)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // add the function to the module and return its table index\r\n var funcName = classInstance.internalName + \"~gc\";\r\n module.addFunction(\r\n funcName,\r\n compiler.ensureFunctionType(null, Type.void, options.usizeType),\r\n null,\r\n module.createBlock(null, body)\r\n );\r\n functionTable[gcHookIndex] = funcName;\r\n return gcHookIndex;\r\n}\r\n","/** @module util *//***/\r\n\r\n/** An enum of named character codes. */\r\nexport const enum CharCode {\r\n\r\n NULL = 0,\r\n LINEFEED = 0x0A,\r\n CARRIAGERETURN = 0x0D,\r\n LINESEPARATOR = 0x2028,\r\n PARAGRAPHSEPARATOR = 0x2029,\r\n NEXTLINE = 0x0085,\r\n\r\n SPACE = 0x20,\r\n NONBREAKINGSPACE = 0xA0,\r\n ENQUAD = 0x2000,\r\n EMQUAD = 0x2001,\r\n ENSPACE = 0x2002,\r\n EMSPACE = 0x2003,\r\n THREEPEREMSPACE = 0x2004,\r\n FOURPEREMSPACE = 0x2005,\r\n SIXPEREMSPACE = 0x2006,\r\n FIGURESPACE = 0x2007,\r\n PUNCTUATIONSPACE = 0x2008,\r\n THINSPACE = 0x2009,\r\n HAIRSPACE = 0x200A,\r\n ZEROWIDTHSPACE = 0x200B,\r\n NARROWNOBREAKSPACE = 0x202F,\r\n IDEOGRAPHICSPACE = 0x3000,\r\n MATHEMATICALSPACE = 0x205F,\r\n OGHAM = 0x1680,\r\n\r\n _ = 0x5F,\r\n\r\n _0 = 0x30,\r\n _1 = 0x31,\r\n _2 = 0x32,\r\n _3 = 0x33,\r\n _4 = 0x34,\r\n _5 = 0x35,\r\n _6 = 0x36,\r\n _7 = 0x37,\r\n _8 = 0x38,\r\n _9 = 0x39,\r\n\r\n a = 0x61,\r\n b = 0x62,\r\n c = 0x63,\r\n d = 0x64,\r\n e = 0x65,\r\n f = 0x66,\r\n g = 0x67,\r\n h = 0x68,\r\n i = 0x69,\r\n j = 0x6A,\r\n k = 0x6B,\r\n l = 0x6C,\r\n m = 0x6D,\r\n n = 0x6E,\r\n o = 0x6F,\r\n p = 0x70,\r\n q = 0x71,\r\n r = 0x72,\r\n s = 0x73,\r\n t = 0x74,\r\n u = 0x75,\r\n v = 0x76,\r\n w = 0x77,\r\n x = 0x78,\r\n y = 0x79,\r\n z = 0x7A,\r\n\r\n A = 0x41,\r\n B = 0x42,\r\n C = 0x43,\r\n D = 0x44,\r\n E = 0x45,\r\n F = 0x46,\r\n G = 0x47,\r\n H = 0x48,\r\n I = 0x49,\r\n J = 0x4A,\r\n K = 0x4B,\r\n L = 0x4C,\r\n M = 0x4D,\r\n N = 0x4E,\r\n O = 0x4F,\r\n P = 0x50,\r\n Q = 0x51,\r\n R = 0x52,\r\n S = 0x53,\r\n T = 0x54,\r\n U = 0x55,\r\n V = 0x56,\r\n W = 0x57,\r\n X = 0x58,\r\n Y = 0x59,\r\n Z = 0x5a,\r\n\r\n AMPERSAND = 0x26,\r\n ASTERISK = 0x2A,\r\n AT = 0x40,\r\n BACKSLASH = 0x5C,\r\n BACKTICK = 0x60,\r\n BAR = 0x7C,\r\n CARET = 0x5E,\r\n CLOSEBRACE = 0x7D,\r\n CLOSEBRACKET = 0x5D,\r\n CLOSEPAREN = 0x29,\r\n COLON = 0x3A,\r\n COMMA = 0x2C,\r\n DOLLAR = 0x24,\r\n DOT = 0x2E,\r\n DOUBLEQUOTE = 0x22,\r\n EQUALS = 0x3D,\r\n EXCLAMATION = 0x21,\r\n GREATERTHAN = 0x3E,\r\n HASH = 0x23,\r\n LESSTHAN = 0x3C,\r\n MINUS = 0x2D,\r\n OPENBRACE = 0x7B,\r\n OPENBRACKET = 0x5B,\r\n OPENPAREN = 0x28,\r\n PERCENT = 0x25,\r\n PLUS = 0x2B,\r\n QUESTION = 0x3F,\r\n SEMICOLON = 0x3B,\r\n SINGLEQUOTE = 0x27,\r\n SLASH = 0x2F,\r\n TILDE = 0x7E,\r\n\r\n BACKSPACE = 0x08,\r\n FORMFEED = 0x0C,\r\n BYTEORDERMARK = 0xFEFF,\r\n TAB = 0x09,\r\n VERTICALTAB = 0x0B\r\n}\r\n\r\n/** Tests if the specified character code is some sort of line break. */\r\nexport function isLineBreak(c: CharCode): bool {\r\n switch (c) {\r\n case CharCode.LINEFEED:\r\n case CharCode.CARRIAGERETURN:\r\n case CharCode.LINESEPARATOR:\r\n case CharCode.PARAGRAPHSEPARATOR: {\r\n return true;\r\n }\r\n default: {\r\n return false;\r\n }\r\n }\r\n}\r\n\r\n/** Tests if the specified character code is some sort of white space. */\r\nexport function isWhiteSpace(c: i32): bool {\r\n switch (c) {\r\n case CharCode.SPACE:\r\n case CharCode.TAB:\r\n case CharCode.VERTICALTAB:\r\n case CharCode.FORMFEED:\r\n case CharCode.NONBREAKINGSPACE:\r\n case CharCode.NEXTLINE:\r\n case CharCode.OGHAM:\r\n case CharCode.NARROWNOBREAKSPACE:\r\n case CharCode.MATHEMATICALSPACE:\r\n case CharCode.IDEOGRAPHICSPACE:\r\n case CharCode.BYTEORDERMARK: {\r\n return true;\r\n }\r\n default: {\r\n return c >= CharCode.ENQUAD && c <= CharCode.ZEROWIDTHSPACE;\r\n }\r\n }\r\n}\r\n\r\n/** Tests if the specified character code is a valid decimal digit. */\r\nexport function isDecimalDigit(c: i32): bool {\r\n return c >= CharCode._0 && c <= CharCode._9;\r\n}\r\n\r\n/** Tests if the specified character code is a valid octal digit. */\r\nexport function isOctalDigit(c: i32): bool {\r\n return c >= CharCode._0 && c <= CharCode._7;\r\n}\r\n\r\n/** Tests if the specified character code is a valid start of an identifier. */\r\nexport function isIdentifierStart(c: i32): bool {\r\n return c >= CharCode.A && c <= CharCode.Z\r\n || c >= CharCode.a && c <= CharCode.z\r\n || c == CharCode.DOLLAR\r\n || c == CharCode._\r\n || c > 0x7f && isUnicodeIdentifierStart(c);\r\n}\r\n\r\n/** Tests if the specified character code is a valid keyword character. */\r\nexport function isKeywordCharacter(c: i32): bool {\r\n return c >= CharCode.a && c <= CharCode.z;\r\n}\r\n\r\n/** Tests if the specified character code is a valid part of an identifier. */\r\nexport function isIdentifierPart(c: i32): bool {\r\n return c >= CharCode.A && c <= CharCode.Z\r\n || c >= CharCode.a && c <= CharCode.z\r\n || c >= CharCode._0 && c <= CharCode._9\r\n || c == CharCode.DOLLAR\r\n || c == CharCode._\r\n || c > 0x7f && isUnicodeIdentifierPart(c);\r\n}\r\n\r\n// storing as u16 to save memory\r\nconst unicodeIdentifierStart: u16[] = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514,\r\n 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774,\r\n 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969,\r\n 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088,\r\n 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384,\r\n 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474,\r\n 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\r\n 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\r\n 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705,\r\n 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784,\r\n 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873,\r\n 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958,\r\n 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986,\r\n 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125,\r\n 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240,\r\n 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333,\r\n 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\r\n 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634,\r\n 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725,\r\n 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\r\n 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840,\r\n 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186,\r\n 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293,\r\n 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\r\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798,\r\n 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\r\n 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872,\r\n 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016,\r\n 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389,\r\n 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688,\r\n 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141,\r\n 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424,\r\n 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025,\r\n 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130,\r\n 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\r\n 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\r\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505,\r\n 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520,\r\n 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670,\r\n 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720,\r\n 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540,\r\n 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893,\r\n 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538,\r\n 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888,\r\n 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015,\r\n 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\r\n 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520,\r\n 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695,\r\n 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739,\r\n 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798,\r\n 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243,\r\n 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285,\r\n 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323,\r\n 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\r\n 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\r\n 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\nconst unicodeIdentifierPart: u16[] = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415,\r\n 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520,\r\n 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788,\r\n 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112,\r\n 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423,\r\n 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482,\r\n 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525,\r\n 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602,\r\n 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632,\r\n 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693,\r\n 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757,\r\n 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821,\r\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884,\r\n 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929,\r\n 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972,\r\n 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018,\r\n 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088,\r\n 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157,\r\n 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216,\r\n 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\r\n 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340,\r\n 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424,\r\n 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515,\r\n 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570,\r\n 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720,\r\n 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751,\r\n 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789,\r\n 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895,\r\n 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028,\r\n 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304,\r\n 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744,\r\n 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808,\r\n 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108,\r\n 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902,\r\n 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099,\r\n 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272,\r\n 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516,\r\n 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783,\r\n 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155,\r\n 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676,\r\n 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027,\r\n 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134,\r\n 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205,\r\n 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417,\r\n 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477,\r\n 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\r\n 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559,\r\n 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686,\r\n 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728,\r\n 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\r\n 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799,\r\n 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512,\r\n 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783,\r\n 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072,\r\n 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309,\r\n 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584,\r\n 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741,\r\n 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808,\r\n 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203,\r\n 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275,\r\n 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321,\r\n 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008,\r\n 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140,\r\n 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382,\r\n 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\n\r\nfunction lookupInUnicodeMap(code: u16, map: u16[]): bool {\r\n if (code < map[0]) return false;\r\n\r\n var lo = 0;\r\n var hi = map.length;\r\n var mid: i32;\r\n\r\n while (lo + 1 < hi) {\r\n mid = lo + (hi - lo) / 2;\r\n mid -= mid % 2;\r\n if (map[mid] <= code && code <= map[mid + 1]) {\r\n return true;\r\n }\r\n if (code < map[mid]) {\r\n hi = mid;\r\n } else {\r\n lo = mid + 2;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isUnicodeIdentifierStart(code: i32): bool {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code as u16, unicodeIdentifierStart);\r\n}\r\n\r\nfunction isUnicodeIdentifierPart(code: i32): bool {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code as u16, unicodeIdentifierPart);\r\n}\r\n","export function makeArray(original: Array | null = null): Array {\r\n if (original) {\r\n let cloned = new Array(original.length);\r\n for (let i = 0, k = original.length; i < k; ++i) unchecked(cloned[i] = original[i]);\r\n return cloned;\r\n }\r\n return new Array();\r\n}\r\n\r\nexport function makeSet(original: Set | null = null): Set {\r\n if (original) {\r\n let cloned = new Set();\r\n for (let v of original) cloned.add(v);\r\n return cloned;\r\n }\r\n return new Set();\r\n}\r\n\r\nexport function makeMap(original: Map | null = null): Map {\r\n if (original) {\r\n let cloned = new Map();\r\n for (let [k, v] of original) cloned.set(k, v);\r\n return cloned;\r\n }\r\n return new Map();\r\n}\r\n","/** @module util *//***/\r\n\r\nimport {\r\n CharCode\r\n} from \"./charcode\";\r\n\r\nconst separator = CharCode.SLASH;\r\n\r\n/**\r\n * Normalizes the specified path, removing interior placeholders.\r\n * Expects a posix-compatible relative path (not Windows compatible).\r\n */\r\nexport function normalizePath(path: string): string {\r\n var pos = 0;\r\n var len = path.length;\r\n\r\n // trim leading './'\r\n while (pos + 1 < len &&\r\n path.charCodeAt(pos) == CharCode.DOT &&\r\n path.charCodeAt(pos + 1) == separator\r\n ) {\r\n pos += 2;\r\n }\r\n\r\n if (pos > 0 || len < path.length) {\r\n path = path.substring(pos, len);\r\n len -= pos;\r\n pos = 0;\r\n }\r\n\r\n var atEnd: bool;\r\n while (pos + 1 < len) {\r\n atEnd = false;\r\n\r\n // we are only interested in '/.' sequences ...\r\n if (\r\n path.charCodeAt(pos) == separator &&\r\n path.charCodeAt(pos + 1) == CharCode.DOT\r\n ) {\r\n // '/.' ( '/' | $ )\r\n atEnd = pos + 2 == len;\r\n if (atEnd ||\r\n pos + 2 < len &&\r\n path.charCodeAt(pos + 2) == separator\r\n ) {\r\n path = atEnd\r\n ? path.substring(0, pos)\r\n : path.substring(0, pos) + path.substring(pos + 2);\r\n len -= 2;\r\n continue;\r\n }\r\n\r\n // '/.' ( './' | '.' $ )\r\n atEnd = pos + 3 == len;\r\n if (atEnd && path.charCodeAt(pos + 2) == CharCode.DOT ||\r\n pos + 3 < len &&\r\n path.charCodeAt(pos + 2) == CharCode.DOT &&\r\n path.charCodeAt(pos + 3) == separator\r\n ) {\r\n // find preceeding '/'\r\n let ipos = pos;\r\n while (--ipos >= 0) {\r\n if (path.charCodeAt(ipos) == separator) {\r\n if (pos - ipos != 3 ||\r\n path.charCodeAt(ipos + 1) != CharCode.DOT ||\r\n path.charCodeAt(ipos + 2) != CharCode.DOT\r\n ) { // exclude '..' itself\r\n path = atEnd\r\n ? path.substring(0, ipos)\r\n : path.substring(0, ipos) + path.substring(pos + 3);\r\n len -= pos + 3 - ipos;\r\n pos = ipos - 1; // incremented again at end of loop\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // if there's no preceeding '/', trim start if non-empty\r\n if (ipos < 0 && pos > 0) {\r\n if (pos != 2 ||\r\n path.charCodeAt(0) != CharCode.DOT ||\r\n path.charCodeAt(1) != CharCode.DOT\r\n ) { // exclude '..' itself\r\n path = path.substring(pos + 4);\r\n len = path.length;\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n pos++;\r\n }\r\n return len > 0 ? path : \".\";\r\n}\r\n\r\n/** Resolves the specified path relative to the specified origin. */\r\nexport function resolvePath(normalizedPath: string, origin: string): string {\r\n if (normalizedPath.startsWith(\"std/\")) {\r\n return normalizedPath;\r\n }\r\n return normalizePath(\r\n dirname(origin) + String.fromCharCode(separator) + normalizedPath\r\n );\r\n}\r\n\r\n/** Obtains the directory portion of a normalized path. */\r\nexport function dirname(normalizedPath: string): string {\r\n var pos = normalizedPath.length;\r\n while (--pos > 0) {\r\n if (normalizedPath.charCodeAt(pos) == separator) {\r\n return normalizedPath.substring(0, pos);\r\n }\r\n }\r\n return \".\";\r\n}\r\n","/** @module util *//***/\r\n\r\nconst indentX1 = \" \";\r\nconst indentX2 = \" \";\r\nconst indentX4 = \" \";\r\n\r\n/** Creates an indentation matching the number of specified levels. */\r\nexport function indent(sb: string[], level: i32): void {\r\n while (level >= 4) {\r\n sb.push(indentX4);\r\n level -= 4;\r\n }\r\n if (level >= 2) {\r\n sb.push(indentX2);\r\n level -= 2;\r\n }\r\n if (level) {\r\n sb.push(indentX1);\r\n }\r\n}\r\n","/** @module util *//***/\r\n\r\n/** Reads an 8-bit integer from the specified buffer. */\r\nexport function readI8(buffer: Uint8Array, offset: i32): i32 {\r\n return buffer[offset];\r\n}\r\n\r\n/** Writes an 8-bit integer to the specified buffer. */\r\nexport function writeI8(value: i32, buffer: Uint8Array, offset: i32): void {\r\n buffer[offset] = value;\r\n}\r\n\r\n/** Reads a 16-bit integer from the specified buffer. */\r\nexport function readI16(buffer: Uint8Array, offset: i32): i32 {\r\n return buffer[offset ]\r\n | buffer[offset + 1] << 8;\r\n}\r\n\r\n/** Writes a 16-bit integer to the specified buffer. */\r\nexport function writeI16(value: i32, buffer: Uint8Array, offset: i32): void {\r\n buffer[offset ] = value;\r\n buffer[offset + 1] = value >>> 8;\r\n}\r\n\r\n/** Reads a 32-bit integer from the specified buffer. */\r\nexport function readI32(buffer: Uint8Array, offset: i32): i32 {\r\n return buffer[offset ]\r\n | buffer[offset + 1] << 8\r\n | buffer[offset + 2] << 16\r\n | buffer[offset + 3] << 24;\r\n}\r\n\r\n/** Writes a 32-bit integer to the specified buffer. */\r\nexport function writeI32(value: i32, buffer: Uint8Array, offset: i32): void {\r\n buffer[offset ] = value;\r\n buffer[offset + 1] = value >>> 8;\r\n buffer[offset + 2] = value >>> 16;\r\n buffer[offset + 3] = value >>> 24;\r\n}\r\n\r\n/** Reads a 64-bit integer from the specified buffer. */\r\nexport function readI64(buffer: Uint8Array, offset: i32): I64 {\r\n var lo = readI32(buffer, offset);\r\n var hi = readI32(buffer, offset + 4);\r\n return i64_new(lo, hi);\r\n}\r\n\r\n/** Writes a 64-bit integer to the specified buffer. */\r\nexport function writeI64(value: I64, buffer: Uint8Array, offset: i32): void {\r\n writeI32(i64_low(value), buffer, offset);\r\n writeI32(i64_high(value), buffer, offset + 4);\r\n}\r\n\r\n/** Reads a 32-bit float from the specified buffer. */\r\nexport function readF32(buffer: Uint8Array, offset: i32): f32 {\r\n return i32_as_f32(readI32(buffer, offset));\r\n}\r\n\r\n/** Writes a 32-bit float to the specified buffer. */\r\nexport function writeF32(value: f32, buffer: Uint8Array, offset: i32): void {\r\n writeI32(f32_as_i32(value), buffer, offset);\r\n}\r\n\r\n/** Reads a 64-bit float from the specified buffer. */\r\nexport function readF64(buffer: Uint8Array, offset: i32): f64 {\r\n return i64_as_f64(readI64(buffer, offset));\r\n}\r\n\r\n/** Writes a 64-bit float to the specified buffer. */\r\nexport function writeF64(value: f64, buffer: Uint8Array, offset: i32): void {\r\n var valueI64 = f64_as_i64(value);\r\n writeI32(i64_low(valueI64), buffer, offset);\r\n writeI32(i64_high(valueI64), buffer, offset + 4);\r\n}\r\n","/**\r\n * Low-level C-like compiler API.\r\n * @module index\r\n *//***/\r\n\r\nimport {\r\n Compiler,\r\n Options,\r\n Target,\r\n Feature\r\n} from \"./compiler\";\r\n\r\nimport {\r\n Decompiler\r\n} from \"./decompiler\";\r\n\r\nimport {\r\n IDLBuilder,\r\n TSDBuilder\r\n} from \"./definitions\";\r\n\r\nimport {\r\n DiagnosticMessage,\r\n DiagnosticCategory,\r\n formatDiagnosticMessage\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Module\r\n} from \"./module\";\r\n\r\nimport {\r\n Parser\r\n} from \"./parser\";\r\n\r\nimport {\r\n Program\r\n} from \"./program\";\r\n\r\n/** Parses a source file. If `parser` has been omitted a new one is created. */\r\nexport function parseFile(text: string, path: string, isEntry: bool = false,\r\n parser: Parser | null = null\r\n): Parser {\r\n if (!parser) parser = new Parser();\r\n parser.parseFile(text, path, isEntry);\r\n return parser;\r\n}\r\n\r\n/** Obtains the next required file's path. Returns `null` once complete. */\r\nexport function nextFile(parser: Parser): string | null {\r\n return parser.nextFile();\r\n}\r\n\r\n/** Obtains the next diagnostic message. Returns `null` once complete. */\r\nexport function nextDiagnostic(parser: Parser): DiagnosticMessage | null {\r\n var program = parser.program;\r\n return program.diagnosticsOffset < program.diagnostics.length\r\n ? program.diagnostics[program.diagnosticsOffset++]\r\n : null;\r\n}\r\n\r\n/** Formats a diagnostic message to a string. */\r\nexport { formatDiagnosticMessage as formatDiagnostic };\r\n\r\n/** Tests whether a diagnostic is informatory. */\r\nexport function isInfo(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.INFO;\r\n}\r\n\r\n/** Tests whether a diagnostic is a warning. */\r\nexport function isWarning(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.WARNING;\r\n}\r\n\r\n/** Tests whether a diagnostic is an error. */\r\nexport function isError(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.ERROR;\r\n}\r\n\r\n/** Creates a new set of compiler options. */\r\nexport function createOptions(): Options {\r\n return new Options();\r\n}\r\n\r\n/** Sets the `target` option. */\r\nexport function setTarget(options: Options, target: Target): void {\r\n options.target = target;\r\n}\r\n\r\n/** Sets the `noTreeShaking` option. */\r\nexport function setNoTreeShaking(options: Options, noTreeShaking: bool): void {\r\n options.noTreeShaking = noTreeShaking;\r\n}\r\n\r\n/** Sets the `noAssert` option. */\r\nexport function setNoAssert(options: Options, noAssert: bool): void {\r\n options.noAssert = noAssert;\r\n}\r\n\r\n/** Sets the `importMemory` option. */\r\nexport function setImportMemory(options: Options, importMemory: bool): void {\r\n options.importMemory = importMemory;\r\n}\r\n\r\n/** Sets the `importTable` option. */\r\nexport function setImportTable(options: Options, importTable: bool): void {\r\n options.importTable = importTable;\r\n}\r\n\r\n/** Sets the `sourceMap` option. */\r\nexport function setSourceMap(options: Options, sourceMap: bool): void {\r\n options.sourceMap = sourceMap;\r\n}\r\n\r\n/** Sets the `memoryBase` option. */\r\nexport function setMemoryBase(options: Options, memoryBase: u32): void {\r\n options.memoryBase = memoryBase;\r\n}\r\n\r\n/** Sets a 'globalAliases' value. */\r\nexport function setGlobalAlias(options: Options, name: string, alias: string): void {\r\n var globalAliases = options.globalAliases;\r\n if (!globalAliases) options.globalAliases = globalAliases = new Map();\r\n globalAliases.set(name, alias);\r\n}\r\n\r\n/** Sign extension operations. */\r\nexport const FEATURE_SIGN_EXTENSION = Feature.SIGN_EXTENSION;\r\n/** Mutable global imports and exports. */\r\nexport const FEATURE_MUTABLE_GLOBAL = Feature.MUTABLE_GLOBAL;\r\n\r\n/** Enables a specific feature. */\r\nexport function enableFeature(options: Options, feature: Feature): void {\r\n options.features |= feature;\r\n}\r\n\r\n/** Gives the compiler a hint at the optimize levels that will be used later on. */\r\nexport function setOptimizeLevelHints(options: Options, optimizeLevel: i32, shrinkLevel: i32): void {\r\n options.optimizeLevelHint = optimizeLevel;\r\n options.shrinkLevelHint = shrinkLevel;\r\n}\r\n\r\n/** Finishes parsing. */\r\nexport function finishParsing(parser: Parser): Program {\r\n return parser.finish();\r\n}\r\n\r\n/** Compiles the sources computed by the parser to a module. */\r\nexport function compileProgram(program: Program, options: Options | null = null): Module {\r\n return new Compiler(program, options).compile();\r\n}\r\n\r\n/** Decompiles a module to its (low level) source. */\r\nexport function decompileModule(module: Module): string {\r\n var decompiler = new Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n}\r\n\r\n/** Builds WebIDL definitions for the specified program. */\r\nexport function buildIDL(program: Program): string {\r\n return IDLBuilder.build(program);\r\n}\r\n\r\n/** Builds TypeScript definitions for the specified program. */\r\nexport function buildTSD(program: Program): string {\r\n return TSDBuilder.build(program);\r\n}\r\n\r\n/** Prefix indicating a library file. */\r\nexport { LIBRARY_PREFIX } from \"./common\";\r\n\r\n// Full API\r\nexport * from \"./ast\";\r\n// export * from \"./binary\";\r\nexport * from \"./common\";\r\nexport * from \"./compiler\";\r\nexport * from \"./decompiler\";\r\nexport * from \"./definitions\";\r\nexport * from \"./diagnosticMessages.generated\";\r\nexport * from \"./diagnostics\";\r\nexport * from \"./module\";\r\nexport * from \"./parser\";\r\nexport * from \"./program\";\r\nexport * from \"./resolver\";\r\nexport * from \"./tokenizer\";\r\nexport * from \"./types\";\r\nexport * from \"./util\";\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://assemblyscript/webpack/universalModuleDefinition","webpack://assemblyscript/webpack/bootstrap","webpack://assemblyscript/./src/common.ts","webpack://assemblyscript/./src/diagnostics.ts","webpack://assemblyscript/./src/util/index.ts","webpack://assemblyscript/./src/ast.ts","webpack://assemblyscript/./src/program.ts","webpack://assemblyscript/./src/module.ts","webpack://assemblyscript/./src/tokenizer.ts","webpack://assemblyscript/./src/types.ts","webpack://assemblyscript/(webpack)/buildin/global.js","webpack://assemblyscript/./src/compiler.ts","webpack://assemblyscript/./src/diagnosticMessages.generated.ts","webpack://assemblyscript/./src/resolver.ts","webpack://assemblyscript/./src/decompiler.ts","webpack://assemblyscript/./src/definitions.ts","webpack://assemblyscript/./src/parser.ts","webpack://assemblyscript/./src/glue/js/index.ts","webpack://assemblyscript/./src/glue/js/binaryen.js","webpack://assemblyscript/external \"binaryen\"","webpack://assemblyscript/./std/portable/index.js","webpack://assemblyscript/./src/glue/js/float.js","webpack://assemblyscript/./src/glue/js/i64.js","webpack://assemblyscript/./node_modules/long/src/long.js","webpack://assemblyscript/./src/builtins.ts","webpack://assemblyscript/./src/util/charcode.ts","webpack://assemblyscript/./src/util/collections.ts","webpack://assemblyscript/./src/util/path.ts","webpack://assemblyscript/./src/util/text.ts","webpack://assemblyscript/./src/util/binary.ts","webpack://assemblyscript/./src/index.ts"],"names":["root","factory","exports","module","require","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE__18__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","CommonFlags","PATH_DELIMITER","PARENT_SUBST","GETTER_PREFIX","SETTER_PREFIX","INSTANCE_DELIMITER","STATIC_DELIMITER","INNER_DELIMITER","LIBRARY_SUBST","LIBRARY_PREFIX","FILESPACE_PREFIX","DiagnosticCategory","diagnosticMessages_generated_1","util_1","diagnosticMessages_generated_2","diagnosticCategoryToString","category","INFO","WARNING","ERROR","assert","diagnosticCategoryToColor","COLOR_BLUE","COLOR_YELLOW","COLOR_RED","DiagnosticCode","diagnosticCodeToString","COLOR_RESET","DiagnosticMessage","code","message","range","arg0","arg1","arg2","replace","createInfo","createWarning","createError","withRange","toString","source","normalizedPath","line","column","formatDiagnosticContext","useColors","text","len","length","start","end","isLineBreak","charCodeAt","sb","substring","push","join","formatDiagnosticMessage","showContext","DiagnosticEmitter","diagnostics","Array","emitDiagnostic","info","warning","error","__export","common_1","tokenizer_1","Token","Range","NodeKind","nodeIsConstantValue","kind","LITERAL","NULL","TRUE","FALSE","nodeIsCallable","IDENTIFIER","ASSERTION","CALL","ELEMENTACCESS","PARENTHESIZED","PROPERTYACCESS","SUPER","nodeIsGenericCallable","Node","parent","flags","NONE","is","flag","isAny","set","createType","typeArguments","isNullable","type","TypeNode","setParent","createOmittedType","createIdentifierExpression","createTypeParameter","extendsType","defaultType","elem","TypeParameterNode","createParameter","initializer","ParameterNode","parameterKind","createSignature","parameters","returnType","explicitThisType","sig","SignatureNode","createDecorator","args","stmt","DecoratorNode","arguments","decoratorKind","decoratorNameToKind","createComment","node","CommentNode","commentKind","expr","IdentifierExpression","createEmptyIdentifierExpression","createArrayLiteralExpression","elements","ArrayLiteralExpression","elementExpressions","nodes","k","setParentIfNotNull","createAssertionExpression","assertionKind","expression","toType","AssertionExpression","createBinaryExpression","operator","left","right","BinaryExpression","createCallExpression","typeArgs","CallExpression","createClassExpression","declaration","ClassExpression","createCommaExpression","expressions","CommaExpression","createConstructorExpression","ConstructorExpression","createElementAccessExpression","element","ElementAccessExpression","elementExpression","createFalseExpression","FalseExpression","createFloatLiteralExpression","FloatLiteralExpression","createFunctionExpression","FunctionExpression","ARROW","createInstanceOfExpression","isType","InstanceOfExpression","createIntegerLiteralExpression","IntegerLiteralExpression","createNewExpression","NewExpression","createNullExpression","NullExpression","createObjectLiteralExpression","names","values","ObjectLiteralExpression","createParenthesizedExpression","ParenthesizedExpression","createPropertyAccessExpression","PropertyAccessExpression","createRegexpLiteralExpression","pattern","RegexpLiteralExpression","patternFlags","createTernaryExpression","condition","ifThen","ifElse","TernaryExpression","createStringLiteralExpression","StringLiteralExpression","createSuperExpression","SuperExpression","createThisExpression","ThisExpression","createTrueExpression","TrueExpression","createUnaryPostfixExpression","operand","UnaryPostfixExpression","createUnaryPrefixExpression","UnaryPrefixExpression","createBlockStatement","statements","BlockStatement","createBreakStatement","label","BreakStatement","createClassDeclaration","identifier","typeParameters","implementsTypes","members","decorators","ClassDeclaration","createContinueStatement","ContinueStatement","createDoStatement","statement","DoStatement","createEmptyStatement","EmptyStatement","createEnumDeclaration","EnumDeclaration","createEnumValueDeclaration","EnumValueDeclaration","createExportStatement","path","ExportStatement","normalizePath","startsWith","resolvePath","internalPath","mangleInternalPath","createExportImportStatement","externalName","ExportImportStatement","createExportMember","ExportMember","createExpressionStatement","ExpressionStatement","createIfStatement","ifTrue","ifFalse","IfStatement","createImportStatement","decls","ImportStatement","declarations","namespaceName","createImportStatementWithWildcard","createImportDeclaration","ImportDeclaration","createInterfaceDeclaration","InterfaceDeclaration","createFieldDeclaration","FieldDeclaration","createForStatement","incrementor","ForStatement","createFunctionDeclaration","signature","body","FunctionDeclaration","createIndexSignatureDeclaration","keyType","valueType","IndexSignatureDeclaration","createMethodDeclaration","MethodDeclaration","createNamespaceDeclaration","NamespaceDeclaration","createReturnStatement","ReturnStatement","createSwitchStatement","cases","SwitchStatement","createSwitchCase","SwitchCase","createThrowStatement","ThrowStatement","createTryStatement","catchVariable","catchStatements","finallyStatements","TryStatement","createTypeDeclaration","alias","TypeDeclaration","createVariableStatement","VariableStatement","createVariableDeclaration","VariableDeclaration","createVoidStatement","VoidStatement","createWhileStatement","WhileStatement","CommonTypeNode","_super","__extends","_this","apply","TYPE","TYPEPARAMETER","ParameterKind","PARAMETER","implicitFieldDeclaration","DecoratorKind","SIGNATURE","nameStr","BUILTIN","EXTERNAL","GLOBAL","INLINE","OPERATOR","SEALED","UNMANAGED","propStr","OPERATOR_BINARY","OPERATOR_PREFIX","OPERATOR_POSTFIX","CUSTOM","DECORATOR","CommentKind","COMMENT","Expression","LiteralKind","LiteralExpression","literalKind","ARRAY","AssertionKind","BINARY","CLASS","COMMA","CONSTRUCTOR","FLOAT","FUNCTION","INSTANCEOF","INTEGER","NEW","OBJECT","REGEXP","TERNARY","STRING","THIS","UnaryExpression","UNARYPOSTFIX","UNARYPREFIX","isLastStatement","BLOCK","FUNCTIONDECLARATION","METHODDECLARATION","SourceKind","Statement","Source","SOURCE","tokenizer","debugInfoIndex","exportPaths","sourceKind","pos","lastIndexOf","simplePath","ENTRY","LIBRARY","DeclarationStatement","cachedProgramLevelInternalName","cachedFileLevelInternalName","mangleInternalName","VARIABLE","NAMESPACEDECLARATION","EXPORT","isTopLevelExport","CLASSDECLARATION","STATIC","needsExplicitExport","member","INDEXSIGNATUREDECLARATION","VariableLikeDeclarationStatement","BREAK","CONTINUE","DO","EMPTY","ENUMDECLARATION","ENUMVALUEDECLARATION","EXPORTIMPORT","EXPORTMEMBER","EXPRESSION","FIELDDECLARATION","parameterIndex","FOR","IF","IMPORTDECLARATION","IMPORT","INTERFACEDECLARATION","RETURN","SWITCHCASE","SWITCH","THROW","TRY","TYPEDECLARATION","VARIABLEDECLARATION","VOID","WHILE","asGlobal","endsWith","findDecorator","decorator","OperatorKind","diagnostics_1","types_1","ast_1","module_1","resolver_1","QueuedImport","QueuedExport","TypeAlias","operatorKindFromDecorator","arg","INDEXED_GET","INDEXED_SET","UNCHECKED_INDEXED_GET","UNCHECKED_INDEXED_SET","ADD","SUB","MUL","POW","DIV","REM","BITWISE_AND","BITWISE_OR","BITWISE_XOR","EQ","NE","GT","GE","BITWISE_SHR","BITWISE_SHR_U","LT","LE","BITWISE_SHL","PLUS","PREFIX_INC","MINUS","PREFIX_DEC","NOT","BITWISE_NOT","POSTFIX_INC","POSTFIX_DEC","INVALID","ElementKind","DecoratorFlags","noTypesYet","Map","Program","diagnosticsOffset","elementsLookup","instancesLookup","typesLookup","typeAliases","fileLevelExports","moduleLevelExports","basicClasses","arrayBufferInstance","arrayPrototype","stringInstance","mainFunction","abortInstance","memoryAllocateInstance","hasGC","gcAllocateInstance","gcLinkInstance","gcMarkInstance","gcHeaderSize","gcHookOffset","resolver","Resolver","sources","getSource","lookupSourceByPath","normalizedPathWithoutExtension","tmp","initialize","options","Type","i8","i16","i32","i64","isizeType","u8","u16","u32","u64","usizeType","bool","f32","f64","void","setConstantInteger","i64_new","isWasm64","noTreeShaking","noAssert","memoryBase","optimizeLevelHint","shrinkLevelHint","hasFeature","queuedImports","queuedExports","queuedExtends","queuedImplements","filespace","Filespace","internalName","currentFilespace","j","initializeClass","initializeEnum","initializeExports","initializeFunction","initializeImports","initializeInterface","initializeNamespace","initializeTypeAlias","initializeVariables","queuedImport","tryLocateImport","localName","splice","externalNameAlt","Module_0_has_no_exported_member_1","queuedExports_1","__values","queuedExports_1_1","next","done","_c","__read","exportName","queuedExport","currentExport","isReExport","setExportAndCheckLibrary","Cannot_find_name_0","derivedPrototype","derivedDeclaration","derivedType","baseElement","resolveIdentifier","CLASS_PROTOTYPE","basePrototype","A_class_may_only_extend_another_class","globalAliases","globalAliases_1","globalAliases_1_1","_d","Error","has","resolveClass","instance","Duplicate_identifier_0","programLevelInternalName","registerBasicClass","FUNCTION_PROTOTYPE","startFunction","GENERIC","AMBIENT","MAIN","resolveFunction","parameterTypes","signatureReference","byteSize","typeKind","className","classElement","globalName","global","Global","withConstantIntegerValue","RESOLVED","setConstantFloat","withConstantFloatValue","queuedNamedExports","checkDecorators","acceptedFlags","presentFlags","decoratorKindToFlag","isLibrary","Decorator_0_is_not_valid_here","Duplicate_decorator","checkGlobal","parentNode","hasDecorator","namespace","fileLevelInternalName","simpleName","ClassPrototype","numImplementsTypes","Unmanaged_classes_cannot_implement_interfaces","Operation_not_supported","MODULE_EXPORT","Export_declaration_conflicts_with_exported_declaration_of_0","isEntry","existingExport","memberDeclarations","memberDeclaration","initializeField","GET","SET","initializeAccessor","initializeMethod","classPrototype","isInterface","INTERFACE_PROTOTYPE","staticField","READONLY","ABSTRACT","instanceMembers","instanceField","FieldPrototype","decoratorFlags","FunctionPrototype","constructorPrototype","Multiple_constructor_implementations_are_not_allowed","checkOperatorOverloads","numArgs","firstArg","overloads","overloadPrototypes","Duplicate_function_implementation","operatorKind","String_literal_expected","Expected_0_arguments_but_got_1","internalPropertyName","propertyElement","isGetter","isNew","PROPERTY","getterPrototype","setterPrototype","Property","baseName","staticName","staticPrototype","instanceName","instancePrototype","Enum","initializeEnumValue","enm","EnumValue","initializeExport","externalIdentifier","prefix","FILESPACE","referencedName","referencedElement","seen","Set","add","initializeImport","indexPart","InterfacePrototype","parentNamespace","Namespace","Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local","existingExport_1","global_1","CONST","Element","program","NAMESPACE","ENUM","ENUMVALUE","constantValue","ConstantValueKind","VariableLikeElement","constantValueKind","constantIntegerValue","INLINED","constantFloatValue","Parameter","Local","index","LOCAL","scopedGlobal","instances","classTypeArguments","applyClassTypeArguments","contextualTypeArguments","classTypeParameters","numClassTypeParameters","Function","localsByName","localsByIndex","additionalLocals","breakContext","debugLocations","ref","functionTableIndex","trampoline","outerScope","nextBreakId","breakStack","nextInlineId","tempI32s","tempI64s","tempF32s","tempF64s","localIndex","INSTANCE","local","thisType","inheritedTypeArguments","inheritedTypeArguments_1","inheritedTypeArguments_1_1","_b","inheritedName","inheritedType","parameterType","parameterName","getParameterName","flow","Flow","addLocal","getTempLocal","wrapped","temps","toNativeType","pop","setLocalWrapped","freeTempLocal","getAndFreeTempLocal","enterBreakContext","id","leaveBreakContext","finalize","sourceMap","debugLocation","setDebugLocation","debugInfoRef","FunctionTarget","FUNCTION_TARGET","toSignatureString","asFunction","FIELD_PROTOTYPE","Field","FIELD","memoryOffset","Class","base","currentMemoryOffset","constructorInstance","gcHookIndex","asClass","inheritedTypeArguments_2","inheritedTypeArguments_2_1","baseType","isAssignableTo","target","current","lookupOverload","unchecked","uncheckedOverload","overload","offsetof","fieldName","field","Interface","INTERFACE","FlowFlags","scopedLocals","currentFunction","parentFlow","continueLabel","breakLabel","returnLabel","wrappedLocals","wrappedLocalsExt","unset","fork","branch","slice","free","scopedLocal","SCOPED","addScopedLocal","existingLocal","addScopedLocalAlias","scopedAlias","getScopedLocal","isLocalWrapped","map","ext","i64_ne","i64_and","i64_shl","i64_one","i64_zero","off","i64_or","i64_not","inherit","other","inheritConditional","inheritMutual","leftExt","rightExt","thisExt","minLength","min","canOverflow","getExpressionId","ExpressionId","GetLocal","getGetLocalIndex","canConversionOverflow","SetLocal","isTeeLocal","getSetLocalValue","GetGlobal","global_2","getGetGlobalName","Binary","getBinaryOp","BinaryOp","EqI32","EqI64","EqF32","EqF64","NeI32","NeI64","NeF32","NeF64","LtI32","LtU32","LtI64","LtU64","LtF32","LtF64","LeI32","LeU32","LeI64","LeU64","LeF32","LeF64","GtI32","GtU32","GtI64","GtU64","GtF32","GtF64","GeI32","GeU32","GeI64","GeU64","GeF32","GeF64","MulI32","getBinaryLeft","Const","getConstValueI32","getBinaryRight","AndI32","computeSmallIntegerMask","ShlI32","shift","size","ShrI32","ShrU32","DivU32","RemI32","RemU32","Unary","getUnaryOp","UnaryOp","EqzI32","EqzI64","ClzI32","CtzI32","PopcntI32","getExpressionType","getConstValueI64Low","getConstValueF32","getConstValueF64","MIN_VALUE","MAX_VALUE","Load","fromType","getLoadBytes","isLoadSigned","Block","getBlockName","getBlockChildCount","last","getBlockChild","If","getIfTrue","getIfFalse","Select","getSelectThen","getSelectElse","Call","getCallTarget","Unreachable","compiler_1","NativeType","_BinaryenInvalidId","_BinaryenBlockId","_BinaryenIfId","_BinaryenLoopId","_BinaryenBreakId","_BinaryenSwitchId","_BinaryenCallId","_BinaryenCallIndirectId","_BinaryenGetLocalId","_BinaryenSetLocalId","_BinaryenGetGlobalId","_BinaryenSetGlobalId","_BinaryenLoadId","_BinaryenStoreId","_BinaryenConstId","_BinaryenUnaryId","_BinaryenBinaryId","_BinaryenSelectId","_BinaryenDropId","_BinaryenReturnId","_BinaryenHostId","_BinaryenNopId","_BinaryenUnreachableId","_BinaryenAtomicCmpxchgId","_BinaryenAtomicRMWId","_BinaryenAtomicWaitId","_BinaryenAtomicWakeId","_BinaryenClzInt32","_BinaryenCtzInt32","_BinaryenPopcntInt32","_BinaryenNegFloat32","_BinaryenAbsFloat32","_BinaryenCeilFloat32","_BinaryenFloorFloat32","_BinaryenTruncFloat32","_BinaryenNearestFloat32","_BinaryenSqrtFloat32","_BinaryenEqZInt32","_BinaryenClzInt64","_BinaryenCtzInt64","_BinaryenPopcntInt64","_BinaryenNegFloat64","_BinaryenAbsFloat64","_BinaryenCeilFloat64","_BinaryenFloorFloat64","_BinaryenTruncFloat64","_BinaryenNearestFloat64","_BinaryenSqrtFloat64","_BinaryenEqZInt64","_BinaryenExtendSInt32","_BinaryenExtendUInt32","_BinaryenWrapInt64","_BinaryenTruncSFloat32ToInt32","_BinaryenTruncSFloat32ToInt64","_BinaryenTruncUFloat32ToInt32","_BinaryenTruncUFloat32ToInt64","_BinaryenTruncSFloat64ToInt32","_BinaryenTruncSFloat64ToInt64","_BinaryenTruncUFloat64ToInt32","_BinaryenTruncUFloat64ToInt64","_BinaryenReinterpretFloat32","_BinaryenReinterpretFloat64","_BinaryenConvertSInt32ToFloat32","_BinaryenConvertSInt32ToFloat64","_BinaryenConvertUInt32ToFloat32","_BinaryenConvertUInt32ToFloat64","_BinaryenConvertSInt64ToFloat32","_BinaryenConvertSInt64ToFloat64","_BinaryenConvertUInt64ToFloat32","_BinaryenConvertUInt64ToFloat64","_BinaryenPromoteFloat32","_BinaryenDemoteFloat64","_BinaryenReinterpretInt32","_BinaryenReinterpretInt64","_BinaryenExtendS8Int32","_BinaryenExtendS16Int32","_BinaryenExtendS8Int64","_BinaryenExtendS16Int64","_BinaryenExtendS32Int64","_BinaryenAddInt32","_BinaryenSubInt32","_BinaryenMulInt32","_BinaryenDivSInt32","_BinaryenDivUInt32","_BinaryenRemSInt32","_BinaryenRemUInt32","_BinaryenAndInt32","_BinaryenOrInt32","_BinaryenXorInt32","_BinaryenShlInt32","_BinaryenShrUInt32","_BinaryenShrSInt32","_BinaryenRotLInt32","_BinaryenRotRInt32","_BinaryenEqInt32","_BinaryenNeInt32","_BinaryenLtSInt32","_BinaryenLtUInt32","_BinaryenLeSInt32","_BinaryenLeUInt32","_BinaryenGtSInt32","_BinaryenGtUInt32","_BinaryenGeSInt32","_BinaryenGeUInt32","_BinaryenAddInt64","_BinaryenSubInt64","_BinaryenMulInt64","_BinaryenDivSInt64","_BinaryenDivUInt64","_BinaryenRemSInt64","_BinaryenRemUInt64","_BinaryenAndInt64","_BinaryenOrInt64","_BinaryenXorInt64","_BinaryenShlInt64","_BinaryenShrUInt64","_BinaryenShrSInt64","_BinaryenRotLInt64","_BinaryenRotRInt64","_BinaryenEqInt64","_BinaryenNeInt64","_BinaryenLtSInt64","_BinaryenLtUInt64","_BinaryenLeSInt64","_BinaryenLeUInt64","_BinaryenGtSInt64","_BinaryenGtUInt64","_BinaryenGeSInt64","_BinaryenGeUInt64","_BinaryenAddFloat32","_BinaryenSubFloat32","_BinaryenMulFloat32","_BinaryenDivFloat32","_BinaryenCopySignFloat32","_BinaryenMinFloat32","_BinaryenMaxFloat32","_BinaryenEqFloat32","_BinaryenNeFloat32","_BinaryenLtFloat32","_BinaryenLeFloat32","_BinaryenGtFloat32","_BinaryenGeFloat32","_BinaryenAddFloat64","_BinaryenSubFloat64","_BinaryenMulFloat64","_BinaryenDivFloat64","_BinaryenCopySignFloat64","_BinaryenMinFloat64","_BinaryenMaxFloat64","_BinaryenEqFloat64","_BinaryenNeFloat64","_BinaryenLtFloat64","_BinaryenLeFloat64","_BinaryenGtFloat64","_BinaryenGeFloat64","HostOp","_BinaryenCurrentMemory","_BinaryenGrowMemory","AtomicRMWOp","_BinaryenAtomicRMWAdd","_BinaryenAtomicRMWSub","_BinaryenAtomicRMWAnd","_BinaryenAtomicRMWOr","_BinaryenAtomicRMWXor","_BinaryenAtomicRMWXchg","MemorySegment","buffer","offset","segment","Module","hasTemporaryFunction","cachedPrecomputeNames","cachedStrings","_BinaryenModuleCreate","cachedByValue","memory","allocate","createFrom","cArr","allocU8Array","_BinaryenModuleRead","changetype","addFunctionType","result","paramTypes","cStr","allocStringCached","allocI32Array","_BinaryenAddFunctionType","getFunctionTypeBySignature","_BinaryenGetFunctionTypeBySignature","removeFunctionType","_BinaryenRemoveFunctionType","createI32","out","_BinaryenLiteralInt32","_BinaryenConst","createI64","valueLow","valueHigh","_BinaryenLiteralInt64","createF32","_BinaryenLiteralFloat32","createF64","_BinaryenLiteralFloat64","createUnary","op","_BinaryenUnary","createBinary","_BinaryenBinary","createHost","operands","allocPtrArray","_BinaryenHost","createGetLocal","_BinaryenGetLocal","createTeeLocal","_BinaryenTeeLocal","createGetGlobal","_BinaryenGetGlobal","createLoad","bytes","signed","ptr","_BinaryenLoad","createStore","_BinaryenStore","createAtomicLoad","_BinaryenAtomicLoad","createAtomicStore","_BinaryenAtomicStore","createAtomicRMW","_BinaryenAtomicRMW","createAtomicCmpxchg","expected","replacement","_BinaryenAtomicCmpxchg","createAtomicWait","timeout","expectedType","_BinaryenAtomicWait","createAtomicWake","wakeCount","_BinaryenAtomicWake","createSetLocal","_BinaryenSetLocal","createSetGlobal","_BinaryenSetGlobal","createBlock","children","_BinaryenBlock","createBreak","_BinaryenBreak","createDrop","_BinaryenDrop","createLoop","_BinaryenLoop","createIf","_BinaryenIf","createNop","_BinaryenNop","createReturn","_BinaryenReturn","createSelect","_BinaryenSelect","createSwitch","defaultName","numNames","strs","_BinaryenSwitch","createCall","_BinaryenCall","createCallIndirect","typeName","_BinaryenCallIndirect","createUnreachable","_BinaryenUnreachable","addGlobal","mutable","_BinaryenAddGlobal","removeGlobal","_BinaryenRemoveGlobal","addFunction","varTypes","_BinaryenAddFunction","removeFunction","_BinaryenRemoveFunction","addTemporaryFunction","tempName","typeRef","removeTemporaryFunction","addFunctionExport","cStr1","cStr2","_BinaryenAddFunctionExport","addTableExport","_BinaryenAddTableExport","addMemoryExport","_BinaryenAddMemoryExport","addGlobalExport","_BinaryenAddGlobalExport","removeExport","_BinaryenRemoveExport","addFunctionImport","externalModuleName","externalBaseName","functionType","cStr3","_BinaryenAddFunctionImport","addTableImport","_BinaryenAddTableImport","addMemoryImport","shared","_BinaryenAddMemoryImport","addGlobalImport","globalType","_BinaryenAddGlobalImport","setMemory","initial","maximum","segments","segs","offs","sizs","Target","WASM64","i64_low","i64_high","cArr1","cArr2","cArr3","_BinaryenSetMemory","setFunctionTable","funcs","_BinaryenSetFunctionTable","setStart","func","_BinaryenSetStart","getOptimizeLevel","_BinaryenGetOptimizeLevel","setOptimizeLevel","level","_BinaryenSetOptimizeLevel","getShrinkLevel","_BinaryenGetShrinkLevel","setShrinkLevel","_BinaryenSetShrinkLevel","setDebugInfo","on","_BinaryenSetDebugInfo","optimize","_BinaryenFunctionOptimize","_BinaryenModuleOptimize","runPasses","passes","allocString","_BinaryenFunctionRunPasses","_BinaryenModuleRunPasses","precomputeExpression","previousOptimizeLevel","previousShrinkLevel","previousDebugInfo","_BinaryenGetDebugInfo","_BinaryenExpressionGetType","_BinaryenFunctionGetBody","validate","_BinaryenModuleValidate","interpret","_BinaryenModuleInterpret","toBinary","sourceMapUrl","binaryPtr","sourceMapPtr","_BinaryenModuleAllocateAndWrite","readInt","binaryBytes","ret","BinaryModule","output","Uint8Array","load","readBuffer","readString","toText","toAsmjs","str","dispose","_BinaryenModuleDispose","createRelooper","Relooper","cloneExpression","noSideEffects","maxDepth","nested1","nested2","_BinaryenExpressionGetId","_BinaryenConstGetValueI32","_BinaryenConstGetValueI64Low","_BinaryenConstGetValueI64High","_BinaryenConstGetValueF32","_BinaryenConstGetValueF64","_BinaryenGetLocalGetIndex","_BinaryenGetGlobalGetName","_BinaryenLoadGetPtr","_BinaryenLoadIsAtomic","_BinaryenLoadGetBytes","_BinaryenLoadGetOffset","_BinaryenLoadIsSigned","_BinaryenLoadGetAlign","_BinaryenUnaryGetValue","_BinaryenUnaryGetOp","_BinaryenBinaryGetLeft","_BinaryenBinaryGetRight","_BinaryenBinaryGetOp","addDebugInfoFile","_BinaryenModuleAddDebugInfoFileName","getDebugInfoFile","_BinaryenModuleGetDebugInfoFileName","fileIndex","lineNumber","columnNumber","_BinaryenFunctionSetDebugLocation","UNLIMITED_MEMORY","getConstValueI64High","getSetLocalIndex","_BinaryenSetLocalGetIndex","_BinaryenSetLocalGetValue","_BinaryenSetLocalIsTee","getUnaryValue","getLoadOffset","getLoadPtr","getStoreBytes","_BinaryenStoreGetBytes","getStoreOffset","_BinaryenStoreGetOffset","getStorePtr","_BinaryenStoreGetPtr","getStoreValue","_BinaryenStoreGetValue","_BinaryenBlockGetName","_BinaryenBlockGetNumChildren","_BinaryenBlockGetChild","getIfCondition","_BinaryenIfGetCondition","_BinaryenIfGetIfTrue","_BinaryenIfGetIfFalse","getLoopName","_BinaryenLoopGetName","getLoopBody","_BinaryenLoopGetBody","getBreakName","_BinaryenBreakGetName","getBreakCondition","_BinaryenBreakGetCondition","_BinaryenSelectGetIfTrue","_BinaryenSelectGetIfFalse","getSelectCondition","_BinaryenSelectGetCondition","getDropValue","_BinaryenDropGetValue","getReturnValue","_BinaryenReturnGetValue","_BinaryenCallGetTarget","getHostOp","_BinaryenHostGetOp","getHostOperandCount","_BinaryenHostGetNumOperands","getHostOperand","_BinaryenHostGetOperand","getHostName","_BinaryenHostGetNameOperand","getFunctionBody","getFunctionName","_BinaryenFunctionGetName","getFunctionParamCount","_BinaryenFunctionGetNumParams","getFunctionParamType","_BinaryenFunctionGetParam","getFunctionResultType","_BinaryenFunctionGetResult","relooper","_RelooperCreate","addBlock","_RelooperAddBlock","addBranch","from","to","_RelooperAddBranch","addBlockWithSwitch","_RelooperAddBlockWithSwitch","addBranchForSwitch","indexes","_RelooperAddBranchForSwitch","renderAndDispose","entry","labelHelper","_RelooperRenderAndDispose","u8s","numValues","idx","store","i32s","val","ptrs","u","stringLengthUTF8","cp","u1","u2","u3","u4","arr","String","fromCodePoints","needsExplicitUnreachable","Return","Break","numChildren","IdentifierHandling","tokenFromKeyword","AS","ASYNC","AWAIT","CASE","CATCH","DEBUGGER","DECLARE","DEFAULT","DELETE","ELSE","EXTENDS","FINALLY","FROM","IMPLEMENTS","IN","IS","KEYOF","LET","MODULE","OF","PACKAGE","PRIVATE","PROTECTED","PUBLIC","TYPEOF","VAR","WITH","YIELD","tokenIsAlsoIdentifier","token","operatorTokenToString","DOT_DOT_DOT","LESSTHAN","GREATERTHAN","LESSTHAN_EQUALS","GREATERTHAN_EQUALS","EQUALS_EQUALS","EXCLAMATION_EQUALS","EQUALS_EQUALS_EQUALS","EXCLAMATION_EQUALS_EQUALS","ASTERISK_ASTERISK","ASTERISK","SLASH","PERCENT","PLUS_PLUS","MINUS_MINUS","LESSTHAN_LESSTHAN","GREATERTHAN_GREATERTHAN","GREATERTHAN_GREATERTHAN_GREATERTHAN","AMPERSAND","BAR","CARET","EXCLAMATION","TILDE","AMPERSAND_AMPERSAND","BAR_BAR","EQUALS","PLUS_EQUALS","MINUS_EQUALS","ASTERISK_EQUALS","ASTERISK_ASTERISK_EQUALS","SLASH_EQUALS","PERCENT_EQUALS","LESSTHAN_LESSTHAN_EQUALS","GREATERTHAN_GREATERTHAN_EQUALS","GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS","AMPERSAND_EQUALS","BAR_EQUALS","CARET_EQUALS","a","b","Tokenizer","tokenPos","nextToken","nextTokenPos","nextTokenOnNewLine","onComment","identifierHandling","unsafeNext","maxTokenLength","STRINGLITERAL","OPENPAREN","CLOSEPAREN","isDecimalDigit","FLOATLITERAL","DOT","commentStartPos","LINE","TRIPLE","closed","_0_expected","testInteger","INTEGERLITERAL","COLON","SEMICOLON","EQUALS_GREATERTHAN","QUESTION","OPENBRACKET","CLOSEBRACKET","OPENBRACE","CLOSEBRACE","AT","isIdentifierStart","isKeywordCharacter","posBefore","isIdentifierPart","keywordToken","ALWAYS","PREFER","isWhiteSpace","Invalid_character","ENDOFFILE","peek","checkOnNewLine","maxCompoundLength","tokenBefore","tokenPosBefore","skipIdentifier","skip","mark","state","reusableState","State","discard","reset","readIdentifier","quote","Unterminated_string_literal","readEscapeSequence","Unexpected_end_of_text","readExtendedUnicodeEscape","readUnicodeEscape","fromCharCode","readRegexpPattern","escaped","Unterminated_regular_expression_literal","readRegexpFlags","Invalid_regular_expression_flags","readInteger","readHexInteger","readBinaryInteger","readOctalInteger","isOctalDigit","Octal_literals_are_not_allowed_in_strict_mode","readDecimalInteger","i64_16","sepEnd","i64_add","i64_mul","Numeric_separators_are_not_allowed_here","Multiple_consecutive_numeric_separators_are_not_permitted","Hexadecimal_digit_expected","i64_10","Digit_expected","i64_8","Octal_digit_expected","i64_2","i64_1","Binary_digit_expected","readFloat","readDecimalFloat","parseFloat","readHexFloat","remain","value32","invalid","An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive","Unterminated_Unicode_escape_sequence","finish","program_1","TypeKind","TypeFlags","cachedNullableType","ceil","classReference","nonNullableType","isize64","isize32","usize64","usize32","isManaged","computeSmallIntegerShift","targetType","classType","asNullable","signednessIsRelevant","currentClass","targetClass","targetFunction","commonCompatible","signednessIsImportant","kindOnly","toNativeZero","toNativeOne","toNativeNegOne","typesToNativeTypes","types","numTypes","typesToString","Signature","cachedFunctionTarget","parameterNames","requiredParameters","hasRest","asFunctionTarget","getDefaultParameterName","thisThisType","targetThisType","thisParameterTypes","targetParameterTypes","numParameters","thisParameterType","targetParameterType","thisReturnType","targetReturnType","makeSignatureString","includeThis","optionalStart","restIndex","cachedDefaultParameterNames","g","e","window","builtins_1","Options","WASM32","importMemory","importTable","features","feature","Feature","ConversionKind","WrapMode","mangleImportName_moduleName","mangleImportName_elementName","Compiler","currentOuterFunction","currentInlineFunctions","currentEnum","currentType","memorySegments","stringSegments","functionTable","argcVar","argcSet","needsIterateRoots","f32ModInstance","f64ModInstance","f32PowInstance","f64PowInstance","max","compile","startFunctionInstance","startFunctionBody","compileSource","funcRef","ensureFunctionType","i64_align","i64_shr_u","moduleExport","makeModuleExport","compileIterateRoots","subPrefix","_f","_g","_h","_j","Cannot_export_a_mutable_global","ensureTrampoline","ensureArgcSet","COMPILED","setter","nativeType","nativeSizeType","getterName","setterName","_k","_l","_m","_o","fullName","_p","_q","ctor","compileSourceByPath","reportNode","File_0_not_found","isGeneric","compileClassDeclaration","compileEnumDeclaration","compileFunctionDeclaration","compileNamespaceDeclaration","variableInit","compileVariableStatement","compileExportStatement","previousFunction","compileStatement","compileGlobalDeclaration","compileGlobal","initExpr","resolvedType","resolveType","Type_expected","atEnd","compileExpressionRetainType","Type_0_is_not_assignable_to_type_1","isDeclaredConstant","MODULE_IMPORT","mangleImportName","initializeInStart","compileExpression","Compiling_constant_with_non_constant_initializer_as_mutable","compileEnum","previousValue","previousValueIsMut","initInStart","valueDeclaration","In_const_enum_declarations_member_initializer_must_be_constant_expression","Enum_member_must_have_initializer","AddI32","compileFunctionUsingTypeArguments","makeMap","resolveFunctionInclTypeArguments","compileFunction","resultType","compileFunctionBody","compileStatements","An_implementation_cannot_be_declared_in_ambient_contexts","stmts","unshift","classInstance","makeAllocation","makeFieldInitialization","Constructors_for_derived_classes_must_contain_a_super_call","A_function_whose_declared_type_is_not_void_must_return_a_value","Function_implementation_is_missing_or_not_immediately_following_the_declaration","compileInterfaceDeclaration","compileNamespace","compileClassUsingTypeArguments","alternativeReportNode","resolveClassInclTypeArguments","compileClass","staticMembers","ctorInstance","_e","addMemorySegment","alignment","ensureFunctionTableEntry","TRAMPOLINE","compileBlockStatement","compileBreakStatement","compileContinueStatement","compileDoStatement","compileEmptyStatement","compileExpressionStatement","compileForStatement","compileIfStatement","compileReturnStatement","compileSwitchStatement","compileThrowStatement","compileTryStatement","compileVoidStatement","compileWhileStatement","addDebugLocation","numStatements","Nop","A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement","A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement","condExpr","makeIsTrueish","terminated","block","repeatLabel","alwaysTrue","condPre","incrExpr","bodyStatement","bodyExpr","usesContinue","breakBlock","repeatBlock","GENERIC_CONTEXT","condExprPrecomp","ifTrueFlow","ifTrueExpr","ifFalseExpr","ifFalseFlow","numCases","context","tempLocal","tempLocalIndex","breaks","breakIndex","defaultIndex","currentBlock","alwaysReturns","alwaysReturnsWrapped","alwaysThrows","alwaysAllocates","isLast","nextLabel","count","compileAbort","isKnownGlobal","numDeclarations","initializers","isInlined","_const_declarations_must_be_initialized","compileAssignmentWithValue","compileInlineConstant","contextualType","retainType","mask","conversionKind","wrapMode","compileAssertionExpression","compileBinaryExpression","compileCallExpression","compileCommaExpression","compileElementAccessExpression","compileFunctionExpression","compileIdentifierExpression","compileInstanceOfExpression","compileLiteralExpression","compileNewExpression","compileParenthesizedExpression","compilePropertyAccessExpression","compileTernaryExpression","compileUnaryPostfixExpression","compileUnaryPrefixExpression","convertExpression","ensureSmallIntegerWrap","Conversion_from_type_0_to_1_requires_an_explicit_cast","PromoteF32","DemoteF64","TruncF32ToI64","TruncF32ToI32","TruncF32ToU64","TruncF32ToU32","TruncF64ToI64","TruncF64ToI32","TruncF64ToU64","TruncF64ToU32","ConvertI64ToF32","ConvertU64ToF32","ConvertI32ToF32","ConvertU32ToF32","ConvertI64ToF64","ConvertU64ToF64","ConvertI32ToF64","ConvertU32ToF64","WrapI64","ExtendI32","ExtendU32","PREFIX","NONNULL","leftExpr","leftType","rightExpr","rightType","commonType","compound","compileBinaryOverload","Operator_0_cannot_be_applied_to_types_1_and_2","compileAssignment","AddI64","AddF32","AddF64","SubI32","SubI64","SubF32","SubF64","MulI64","MulF32","MulF64","makeCallDirect","DivI32","DivI64","DivU64","DivF32","DivF64","RemI64","RemU64","intType","ShlI64","The_0_operator_cannot_be_applied_to_type_1","ShrI64","ShrU64","AndI64","OrI32","OrI64","XorI32","XorI64","compileUnaryOverload","operatorInstance","valueExpr","argumentExpressions","thisArg","compileCallDirect","valueExpression","resolveExpression","Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property","currentElementExpression","isUnchecked","indexedSet","Index_signature_in_type_0_only_permits_reading","Index_signature_is_missing_in_type_0","valueWithCorrectType","tee","thisExpression","currentThisExpression","thisExpr","setterInstance","getterInstance","nativeReturnType","indexedGet","elementExpr","tempLocalTarget","tempLocalElement","indexArg","compileCallExpressionBuiltin","Type_0_is_not_generic","inferredTypes","numTypeParameters","numParameterTypes","numArguments","argumentExprs","typeNode","argumentExpression","inferredType","concreteType","resolvedTypeArguments","Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures","compileGetter","Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors","baseClassInstance","thisLocal","ensureConstructor","_super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class","compileCallIndirect","typeArgumentNodes","resolveTypeArguments","compileCall","checkCallSignature","hasThis","minimum","Expected_at_least_0_arguments_but_got_1","inline","includes","compileCallInlineUnchecked","Function_0_cannot_be_inlined_into_itself","numArgumentsInclThis","previousFlow","superType","paramExpr","argumentLocal","original","originalSignature","originalName","originalParameterTypes","originalParameterDeclarations","commonReturnType","commonThisType","isInstance","minArguments","minOperands","maxArguments","maxOperands","numOptional","forwardedOperands","operandIndex","trampolineSignature","trampolineName","ofN","Optional_parameter_must_have_an_initializer","ensureArgcVar","numOperands","isCallImport","parameterNodes","allOptionalsAreConstant","makeCallIndirect","numExpressions","exprs","resolveElementAccess","retainConstantType","_this_cannot_be_referenced_in_current_location","_super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class","scopedThis","_super_can_only_be_referenced_in_a_derived_class","localType","A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums","implicitNegate","compileArrayLiteral","floatValue","intValue","i64_sub","determineIntegerLiteralType","i64_to_f32","i64_to_f64","compileStringLiteral","compileObjectLiteral","ensureStaticString","stringValue","stringSegment","headerSize","totalSize","buf","writeI32","ensureGCHook","writeI16","stringOffset","i64_is_u32","ensureStaticArray","elementType","byteLength","usizeTypeSize","bufferInstance","bufferHeaderSize","bufferTotalSize","clz","writeI8","writeI64","writeF32","writeF64","bufferOffset","arrayInstance","arrayHeaderSize","arrayOffset","isConst","compiledValues","constantValues","nativeElementType","isStatic","arrayType","nativeArrayType","Constructor_of_class_0_must_not_require_any_arguments","Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration","Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration","hasErrors","Property_0_does_not_exist_on_type_1","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","compileInstantiate","baseClass","nativeDummy","propertyAccess","resolvePropertyAccess","theEnum","Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set","ifThenFlow","ifThenExpr","ifThenType","ifElseFlow","ifElseExpr","ifElseType","getValue","calcValue","setValue","NegF32","NegF64","makeIsFalseish","ExtendI8ToI32","ExtendI16ToI32","allocateInstance","fieldType","nativeFieldType","fieldDeclaration","ReportMode","reportMode","REPORT","resolveSignature","numTypeArguments","paramType","instanceKey","placeholderType","Basic_type_0_cannot_be_nullable","Expected_0_type_arguments_but_got_1","parameterTypeNodes","parameterTypeNode","REST","returnTypeNode","minParameterCount","maxParameterCount","argumentCount","ensureResolvedLazyGlobal","contextualFunction","targetExpression","propertyName","elementAccess","i64_is_i8","i64_is_u8","i64_is_i16","i64_is_u16","i64_is_i32","i64_is_bool","explicitLocal","classInstanceKey","classInstances","instance_1","numFunctionTypeArguments","signatureNode","functionTypeParameters","signatureParameters","signatureParameterCount","parameterDeclaration","resolveFunctionPartially","partialKey","partialPrototype","expectedTypeArguments","actualTypeArguments","baseClassType","Class_0_is_sealed_and_cannot_be_extended","Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa","inheritedMember","constructorPartial","baseField","fieldInstance","instanceProperty","partialGetterPrototype","partialSetterPrototype","overloadPrototype","operatorPartial","Decompiler","functionId","decompile","decompiler","decompileFunction","nativeTypeToType","decompileExpression","nested","string","Loop","Switch","CallIndirect","SetGlobal","Store","i64_to_string","AbsF32","CeilF32","FloorF32","TruncF32","NearestF32","SqrtF32","ClzI64","CtzI64","PopcntI64","AbsF64","CeilF64","FloorF64","TruncF64","NearestF64","SqrtF64","ReinterpretF32","ReinterpretF64","ReinterpretI32","ReinterpretI64","RotlI32","RotrI32","RotlI64","RotrI64","CopysignF32","MinF32","MaxF32","CopysignF64","MinF64","MaxF64","Drop","Host","CurrentMemory","GrowMemory","AtomicCmpxchg","AtomicRMW","AtomicWait","AtomicWake","ExportsWalker","includePrivate","todo","walk","visitElement","visitGlobal","visitEnum","visitFunctionInstances","visitClassInstances","visitField","prop","hasCompiledMember","visitNamespace","visitFunction","visitClass","IDLBuilder","indentLevel","build","indent","typeToString","members_1","members_1_1","visitInterface","TSDBuilder","numMembers","members_2","members_2_1","Parser","backlog","seenlog","donelog","tryParseSignatureIsSignature","parseParametersThis","parseFile","indexOf","tn","parseTopLevelStatement","startPos","parseDecorator","skipStatement","exportStart","exportEnd","contextIsAmbient","A_declare_modifier_cannot_be_used_in_an_already_ambient_context","first","parseEnum","parseVariable","parseFunction","parseStatement","parseClassOrInterface","parseNamespace","parseExportImport","parseImport","parseTypeDeclaration","parseExport","_0_modifier_cannot_be_used_here","Decorators_are_not_valid_here","nextFile","clear","parseType","acceptParenthesized","suppressErrors","isNullableSignature","tryParseSignature","Unexpected_token","innerType","Identifier_expected","nullable","parameter","bracketStart","bracketRange","isSignature","A_rest_parameter_cannot_be_optional","OPTIONAL","param","parseArguments","parseVariableDeclaration","parentFlags","parentDecorators","DEFINITE_ASSIGNMENT","Initializers_are_not_allowed_in_ambient_contexts","parseExpression","A_definite_assignment_assertion_is_not_permitted_in_this_context","parseEnumValue","parseReturn","parseTypeParameters","seenOptional","typeParameter","parseTypeParameter","Required_type_parameters_may_not_follow_optional_type_parameters","Type_parameter_list_cannot_be_empty","parseParameters","isConstructor","seenRest","reportedRest","parseParameter","A_rest_parameter_must_be_last_in_a_parameter_list","A_required_parameter_cannot_follow_an_optional_parameter","isRest","isOptional","startRange","accessFlags","A_parameter_property_cannot_be_declared_using_a_rest_parameter","A_rest_parameter_cannot_have_an_initializer","Parameter_cannot_have_question_mark_and_initializer","signatureStart","isSetter","A_set_accessor_must_have_exactly_one_parameter","A_set_accessor_parameter_cannot_have_an_initializer","A_get_accessor_cannot_have_parameters","parseBlockStatement","parseFunctionExpression","isArrow","parseFunctionExpressionCommon","Interface_declaration_cannot_have_implements_clause","parseClassMember","parseClassExpression","VIRTUAL","accessStart","accessEnd","staticStart","staticEnd","abstractStart","abstractEnd","readonlyStart","readonlyEnd","setEnd","retIndex","parseIndexSignatureDeclaration","typeParametersStart","Type_parameters_cannot_appear_on_a_constructor_declaration","An_accessor_cannot_have_type_parameters","Type_annotation_cannot_appear_on_a_constructor_declaration","A_set_accessor_cannot_have_a_return_type_annotation","Method_0_cannot_have_an_implementation_because_it_is_marked_abstract","retMethod","Constructor_implementation_is_missing","Optional_properties_are_not_supported","retField","parseExportMember","asIdentifier","skipFrom","parseImportDeclaration","topLevel","parseBreak","parseContinue","parseDoStatement","parseForStatement","parseIfStatement","A_return_statement_can_only_be_used_within_a_function_body","parseSwitchStatement","parseThrowStatement","parseTryStatement","parseVoidStatement","parseWhileStatement","parseExpressionStatement","elseStatement","case_","parseSwitchCase","_case_or_default_expected","parseExpressionStart","precedence","determinePrecedenceStart","The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access","again","startPos_1","QUOTED","_super_must_be_followed_by_an_argument_list_or_member_access","regexpPattern","Expression_expected","tryParseTypeArgumentsBeforeArguments","nextPrecedence","maybeParseCallExpression","determinePrecedence","commaExprs","isRightAssociative","joinPropertyCall","callee","inner","skipBlock","depth","Precedence","binaryen","wrapModule","emitStackIR","emitAsmjs","Binaryen","__memory_allocate","_malloc","__memory_free","_free","__memory_copy","_memmove","__store","HEAPU8","__load","globalScope","ASC_TARGET","F64","Float64Array","U64","Uint32Array","UnreachableError","captureStackTrace","stack","AssertionError","defineProperties","writable","Math","fround","EPSILON","MIN_NORMAL_VALUE","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","clz32","abs","floor","trunc","round","sqrt","x","y","sign","isTrueish","radix","parseInt","undefined","fromCodePoint","Number","isInteger","isArray","signbit","Boolean","HEAP","HEAP_OFFSET","oldHeap","fill","dest","copy","src","copyWithin","F32","Float32Array","I32","Int32Array","f32_as_i32","i32_as_f32","f64_as_i64","i64_as_f64","Long","ZERO","ONE","lo","hi","fromBits","low","high","sub","mul","i64_div","div","i64_div_u","toUnsigned","toSigned","i64_rem","mod","i64_rem_u","and","or","i64_xor","xor","shl","i64_shr","shr","shru","not","i64_eq","eq","ne","fromInt","minSafeF32","fromNumber","maxSafeF32","i64_is_f32","gte","lte","minSafeF64","maxSafeF64","i64_is_f64","toNumber","unsigned","wasm","WebAssembly","Instance","isLong","obj","__isLong__","INT_CACHE","UINT_CACHE","cachedObj","cache","isNaN","UZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_63_DBL","neg","TWO_PWR_32_DBL","lowBits","highBits","pow_dbl","pow","fromString","RangeError","radixToPower","power","fromValue","TWO_PWR_16_DBL","TWO_PWR_24","UONE","NEG_ONE","LongPrototype","toInt","isZero","isNegative","radixLong","rem1","rem","remDiv","digits","getHighBits","getHighBitsUnsigned","getLowBits","getLowBitsUnsigned","getNumBitsAbs","bit","eqz","isPositive","isOdd","isEven","equals","notEquals","neq","lessThan","comp","lt","lessThanOrEqual","le","greaterThan","gt","greaterThanOrEqual","ge","compare","thisNeg","otherNeg","negate","addend","a48","a32","a16","a00","b48","b32","b16","c48","c32","c16","c00","subtract","subtrahend","multiply","multiplier","get_high","b00","divide","divisor","approx","res","div_u","div_s","log2","log","LN2","delta","approxRes","approxRem","modulo","rem_u","rem_s","shiftLeft","numBits","shiftRight","shiftRightUnsigned","shr_u","toBytes","toBytesLE","toBytesBE","fromBytes","fromBytesLE","fromBytesBE","compiler","evaluateConstantType","SWALLOW","expr_1","tempLocal1","tempLocalIndex2","tempLocalIndex1","wasm64","tempLocal0","evaluateConstantOffset","alignLog2","Type_0_has_no_property_1","abort","operandExprs","signatureParts","nativeParamTypes","operandType","User_defined_0","expr_2","deferASM","deferASMCall","typeArgument","stringType","messageArg","filenameArg","existingIndex","gcPrototype","gcInstance","nativeSizeSize","baseInstance","funcName","CharCode","lookupInUnicodeMap","unicodeIdentifierStart","unicodeIdentifierPart","mid","makeArray","cloned","makeSet","original_1","original_1_1","v","original_2","original_2_1","separator","ipos","dirname","origin","indentX1","indentX2","indentX4","readI32","readI64","readI8","readI16","readF32","readF64","valueI64","decompiler_1","definitions_1","formatDiagnostic","parser_1","parser","nextDiagnostic","isInfo","isWarning","isError","createOptions","setTarget","setNoTreeShaking","setNoAssert","setImportMemory","setImportTable","setSourceMap","setMemoryBase","setGlobalAlias","FEATURE_SIGN_EXTENSION","FEATURE_MUTABLE_GLOBAL","enableFeature","setOptimizeLevelHints","optimizeLevel","shrinkLevel","finishParsing","compileProgram","decompileModule","buildIDL","buildTSD"],"mappings":"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AAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC1C,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAEtCC,EAA+B,CACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IACpB,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KACxB,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MA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","file":"assemblyscript.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"binaryen\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"binaryen\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"assemblyscript\"] = factory(require(\"binaryen\"));\n\telse\n\t\troot[\"assemblyscript\"] = factory(root[\"binaryen\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE__18__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 15);\n","/**\n * Common constants.\n * @module common\n *//***/\n\n/** Indicates traits of a {@link Node} or {@link Element}. */\nexport enum CommonFlags {\n /** No flags set. */\n NONE = 0,\n\n // Basic modifiers\n\n /** Has an `import` modifier. */\n IMPORT = 1 << 0,\n /** Has an `export` modifier. */\n EXPORT = 1 << 1,\n /** Has a `declare` modifier. */\n DECLARE = 1 << 2,\n /** Has a `const` modifier. */\n CONST = 1 << 3,\n /** Has a `let` modifier. */\n LET = 1 << 4,\n /** Has a `static` modifier. */\n STATIC = 1 << 5,\n /** Has a `readonly` modifier. */\n READONLY = 1 << 6,\n /** Has an `abstract` modifier. */\n ABSTRACT = 1 << 7,\n /** Has a `public` modifier. */\n PUBLIC = 1 << 8,\n /** Has a `private` modifier. */\n PRIVATE = 1 << 9,\n /** Has a `protected` modifier. */\n PROTECTED = 1 << 10,\n /** Has a `get` modifier. */\n GET = 1 << 11,\n /** Has a `set` modifier. */\n SET = 1 << 12,\n /** Has a definite assignment assertion `!` as in `x!: i32;`. */\n DEFINITE_ASSIGNMENT = 1 << 13,\n\n // Extended modifiers usually derived from basic modifiers\n\n /** Is ambient, that is either declared or nested in a declared element. */\n AMBIENT = 1 << 14,\n /** Is generic. */\n GENERIC = 1 << 15,\n /** Is part of a generic context. */\n GENERIC_CONTEXT = 1 << 16,\n /** Is an instance member. */\n INSTANCE = 1 << 17,\n /** Is a constructor. */\n CONSTRUCTOR = 1 << 18,\n /** Is an arrow function. */\n ARROW = 1 << 19,\n /** Is a module export. */\n MODULE_EXPORT = 1 << 20,\n /** Is a module import. */\n MODULE_IMPORT = 1 << 21,\n\n // Compilation states\n\n /** Is resolved. */\n RESOLVED = 1 << 22,\n /** Is compiled. */\n COMPILED = 1 << 23,\n /** Has a constant value and is therefore inlined. */\n INLINED = 1 << 24,\n /** Is scoped. */\n SCOPED = 1 << 25,\n /** Is a trampoline. */\n TRAMPOLINE = 1 << 26,\n /** Is a virtual method. */\n VIRTUAL = 1 << 27,\n /** Is the main function. */\n MAIN = 1 << 28,\n\n // Other\n\n QUOTED = 1 << 29\n}\n\n/** Path delimiter inserted between file system levels. */\nexport const PATH_DELIMITER = \"/\";\n/** Substitution used to indicate the parent directory. */\nexport const PARENT_SUBST = \"..\";\n/** Function name prefix used for getters. */\nexport const GETTER_PREFIX = \"get:\";\n/** Function name prefix used for setters. */\nexport const SETTER_PREFIX = \"set:\";\n/** Delimiter used between class names and instance members. */\nexport const INSTANCE_DELIMITER = \"#\";\n/** Delimiter used between class and namespace names and static members. */\nexport const STATIC_DELIMITER = \".\";\n/** Delimiter used between a function and its inner elements. */\nexport const INNER_DELIMITER = \"~\";\n/** Substitution used to indicate a library directory. */\nexport const LIBRARY_SUBST = \"~lib\";\n/** Library directory prefix. */\nexport const LIBRARY_PREFIX = LIBRARY_SUBST + PATH_DELIMITER;\n/** Prefix used to indicate a filespace element. */\nexport const FILESPACE_PREFIX = \"file:\";\n","/**\n * Shared diagnostic handling inherited by the parser and the compiler.\n * @module diagnostics\n * @preferred\n *//***/\n\nimport {\n Range\n} from \"./ast\";\n\nimport {\n DiagnosticCode,\n diagnosticCodeToString\n} from \"./diagnosticMessages.generated\";\n\nimport {\n isLineBreak\n} from \"./util\";\n\nexport {\n DiagnosticCode,\n diagnosticCodeToString\n} from \"./diagnosticMessages.generated\";\n\n/** Indicates the category of a {@link DiagnosticMessage}. */\nexport enum DiagnosticCategory {\n /** Informatory message. */\n INFO,\n /** Warning message. */\n WARNING,\n /** Error message. */\n ERROR\n}\n\n/** Returns the string representation of the specified diagnostic category. */\nexport function diagnosticCategoryToString(category: DiagnosticCategory): string {\n switch (category) {\n case DiagnosticCategory.INFO: return \"INFO\";\n case DiagnosticCategory.WARNING: return \"WARNING\";\n case DiagnosticCategory.ERROR: return \"ERROR\";\n default: {\n assert(false);\n return \"\";\n }\n }\n}\n\n/** ANSI escape sequence for blue foreground. */\nexport const COLOR_BLUE: string = \"\\u001b[96m\";\n/** ANSI escape sequence for yellow foreground. */\nexport const COLOR_YELLOW: string = \"\\u001b[93m\";\n/** ANSI escape sequence for red foreground. */\nexport const COLOR_RED: string = \"\\u001b[91m\";\n/** ANSI escape sequence to reset the foreground color. */\nexport const COLOR_RESET: string = \"\\u001b[0m\";\n\n/** Returns the ANSI escape sequence for the specified category. */\nexport function diagnosticCategoryToColor(category: DiagnosticCategory): string {\n switch (category) {\n case DiagnosticCategory.INFO: return COLOR_BLUE;\n case DiagnosticCategory.WARNING: return COLOR_YELLOW;\n case DiagnosticCategory.ERROR: return COLOR_RED;\n default: {\n assert(false);\n return \"\";\n }\n }\n}\n\n/** Represents a diagnostic message. */\nexport class DiagnosticMessage {\n\n /** Message code. */\n code: i32;\n /** Message category. */\n category: DiagnosticCategory;\n /** Message text. */\n message: string;\n /** Respective source range, if any. */\n range: Range | null = null;\n\n /** Constructs a new diagnostic message. */\n private constructor(code: i32, category: DiagnosticCategory, message: string) {\n this.code = code;\n this.category = category;\n this.message = message;\n }\n\n /** Creates a new diagnostic message of the specified category. */\n static create(\n code: DiagnosticCode,\n category: DiagnosticCategory,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): DiagnosticMessage {\n var message = diagnosticCodeToString(code);\n if (arg0 != null) message = message.replace(\"{0}\", arg0);\n if (arg1 != null) message = message.replace(\"{1}\", arg1);\n if (arg2 != null) message = message.replace(\"{2}\", arg2);\n return new DiagnosticMessage(code, category, message);\n }\n\n /** Creates a new informatory diagnostic message. */\n static createInfo(\n code: DiagnosticCode,\n arg0: string | null = null,\n arg1: string | null = null\n ): DiagnosticMessage {\n return DiagnosticMessage.create(code, DiagnosticCategory.INFO, arg0, arg1);\n }\n\n /** Creates a new warning diagnostic message. */\n static createWarning(\n code: DiagnosticCode,\n arg0: string | null = null,\n arg1: string | null = null\n ): DiagnosticMessage {\n return DiagnosticMessage.create(code, DiagnosticCategory.WARNING, arg0, arg1);\n }\n\n /** Creates a new error diagnostic message. */\n static createError(\n code: DiagnosticCode,\n arg0: string | null = null,\n arg1: string | null = null\n ): DiagnosticMessage {\n return DiagnosticMessage.create(code, DiagnosticCategory.ERROR, arg0, arg1);\n }\n\n /** Adds a source range to this message. */\n withRange(range: Range): this {\n this.range = range;\n return this;\n }\n\n /** Converts this message to a string. */\n toString(): string {\n if (this.range) {\n return (\n diagnosticCategoryToString(this.category) +\n \" \" +\n this.code.toString(10) +\n \": \\\"\" +\n this.message +\n \"\\\" in \" +\n this.range.source.normalizedPath +\n \":\" +\n this.range.line.toString(10) +\n \":\" +\n this.range.column.toString(10)\n );\n }\n return (\n diagnosticCategoryToString(this.category) +\n \" \" +\n this.code.toString(10) +\n \": \" +\n this.message\n );\n }\n}\n\n/** Formats a diagnostic message, optionally with terminal colors and source context. */\nexport function formatDiagnosticMessage(\n message: DiagnosticMessage,\n useColors: bool = false,\n showContext: bool = false\n): string {\n\n // general information\n var sb: string[] = [];\n if (useColors) sb.push(diagnosticCategoryToColor(message.category));\n sb.push(diagnosticCategoryToString(message.category));\n if (useColors) sb.push(COLOR_RESET);\n sb.push(message.code < 1000 ? \" AS\" : \" TS\");\n sb.push(message.code.toString(10));\n sb.push(\": \");\n sb.push(message.message);\n\n // include range information if available\n if (message.range) {\n\n // include context information if requested\n let range = message.range;\n if (showContext) {\n sb.push(\"\\n\");\n sb.push(formatDiagnosticContext(message.range, useColors));\n }\n\n sb.push(\"\\n\");\n sb.push(\" in \");\n sb.push(range.source.normalizedPath);\n sb.push(\"(\");\n sb.push(range.line.toString(10));\n sb.push(\",\");\n sb.push(range.column.toString(10));\n sb.push(\")\");\n }\n return sb.join(\"\");\n}\n\n/** Formats the diagnostic context for the specified range, optionally with terminal colors. */\nexport function formatDiagnosticContext(range: Range, useColors: bool = false): string {\n var text = range.source.text;\n var len = text.length;\n var start = range.start;\n var end = range.end;\n while (start > 0 && !isLineBreak(text.charCodeAt(start - 1))) start--;\n while (end < len && !isLineBreak(text.charCodeAt(end))) end++;\n var sb: string[] = [\n \"\\n \",\n text.substring(start, end),\n \"\\n \"\n ];\n while (start < range.start) {\n sb.push(\" \");\n start++;\n }\n if (useColors) sb.push(COLOR_RED);\n if (range.start == range.end) {\n sb.push(\"^\");\n } else {\n while (start++ < range.end) sb.push(\"~\");\n }\n if (useColors) sb.push(COLOR_RESET);\n return sb.join(\"\");\n}\n\n/** Base class of all diagnostic emitters. */\nexport abstract class DiagnosticEmitter {\n\n /** Diagnostic messages emitted so far. */\n diagnostics: DiagnosticMessage[];\n\n /** Initializes this diagnostic emitter. */\n protected constructor(diagnostics: DiagnosticMessage[] | null = null) {\n this.diagnostics = diagnostics ? diagnostics : new Array();\n }\n\n /** Emits a diagnostic message of the specified category. */\n emitDiagnostic(\n code: DiagnosticCode,\n category: DiagnosticCategory,\n range: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n var message = DiagnosticMessage.create(code, category, arg0, arg1, arg2).withRange(range);\n this.diagnostics.push(message);\n // console.log(formatDiagnosticMessage(message, true, true) + \"\\n\"); // temporary\n // console.log(new Error(\"stack\").stack);\n }\n\n /** Emits an informatory diagnostic message. */\n info(\n code: DiagnosticCode,\n range: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n this.emitDiagnostic(code, DiagnosticCategory.INFO, range, arg0, arg1, arg2);\n }\n\n /** Emits a warning diagnostic message. */\n warning(\n code: DiagnosticCode,\n range: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, arg0, arg1, arg2);\n }\n\n /** Emits an error diagnostic message. */\n error(\n code: DiagnosticCode,\n range: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, arg0, arg1, arg2);\n }\n}\n","/**\n * Various compiler utilities.\n * @module util\n * @preferred\n *//***/\n\nexport * from \"./charcode\";\nexport * from \"./collections\";\nexport * from \"./path\";\nexport * from \"./text\";\nexport * from \"./binary\";\n","/**\n * Abstract syntax tree representing a source file once parsed.\n * @module ast\n *//***/\n\nimport {\n CommonFlags,\n PATH_DELIMITER,\n STATIC_DELIMITER,\n INSTANCE_DELIMITER,\n LIBRARY_PREFIX\n} from \"./common\";\n\nimport {\n Token,\n Tokenizer,\n Range\n} from \"./tokenizer\";\n\nimport {\n normalizePath,\n resolvePath,\n CharCode\n} from \"./util\";\n\nexport { Token, Range };\n\n/** Indicates the kind of a node. */\nexport enum NodeKind {\n\n SOURCE,\n\n // types\n TYPE,\n TYPEPARAMETER,\n PARAMETER,\n SIGNATURE,\n\n // expressions\n IDENTIFIER,\n ASSERTION,\n BINARY,\n CALL,\n CLASS,\n COMMA,\n ELEMENTACCESS,\n FALSE,\n FUNCTION,\n INSTANCEOF,\n LITERAL,\n NEW,\n NULL,\n PARENTHESIZED,\n PROPERTYACCESS,\n TERNARY,\n SUPER,\n THIS,\n TRUE,\n CONSTRUCTOR,\n UNARYPOSTFIX,\n UNARYPREFIX,\n\n // statements\n BLOCK,\n BREAK,\n CONTINUE,\n DO,\n EMPTY,\n EXPORT,\n EXPORTIMPORT,\n EXPRESSION,\n FOR,\n IF,\n IMPORT,\n RETURN,\n SWITCH,\n THROW,\n TRY,\n VARIABLE,\n VOID,\n WHILE,\n\n // declaration statements\n CLASSDECLARATION,\n ENUMDECLARATION,\n ENUMVALUEDECLARATION,\n FIELDDECLARATION,\n FUNCTIONDECLARATION,\n IMPORTDECLARATION,\n INDEXSIGNATUREDECLARATION,\n INTERFACEDECLARATION,\n METHODDECLARATION,\n NAMESPACEDECLARATION,\n TYPEDECLARATION,\n VARIABLEDECLARATION,\n\n // special\n DECORATOR,\n EXPORTMEMBER,\n SWITCHCASE,\n COMMENT\n}\n\n/** Checks if a node represents a constant value. */\nexport function nodeIsConstantValue(kind: NodeKind): bool {\n switch (kind) {\n case NodeKind.LITERAL:\n case NodeKind.NULL:\n case NodeKind.TRUE:\n case NodeKind.FALSE: return true;\n }\n return false;\n}\n\n/** Checks if a node might be callable. */\nexport function nodeIsCallable(kind: NodeKind): bool {\n switch (kind) {\n case NodeKind.IDENTIFIER:\n case NodeKind.ASSERTION: // if kind=NONNULL\n case NodeKind.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PARENTHESIZED:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.SUPER: return true;\n }\n return false;\n}\n\n/** Checks if a node might be callable with generic arguments. */\nexport function nodeIsGenericCallable(kind: NodeKind): bool {\n switch (kind) {\n case NodeKind.IDENTIFIER:\n case NodeKind.PROPERTYACCESS: return true;\n }\n return false;\n}\n\n/** Base class of all nodes. */\nexport abstract class Node {\n\n /** Node kind indicator. */\n kind: NodeKind;\n /** Source range. */\n range: Range;\n /** Parent node. */\n parent: Node | null = null;\n /** Common flags indicating specific traits. */\n flags: CommonFlags = CommonFlags.NONE;\n\n /** Tests if this node has the specified flag or flags. */\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\n /** Tests if this node has one of the specified flags. */\n isAny(flag: CommonFlags): bool { return (this.flags & flag) != 0; }\n /** Sets a specific flag or flags. */\n set(flag: CommonFlags): void { this.flags |= flag; }\n\n // types\n\n static createType(\n name: IdentifierExpression,\n typeArguments: CommonTypeNode[] | null,\n isNullable: bool,\n range: Range\n ): TypeNode {\n var type = new TypeNode();\n type.range = range;\n type.name = name; name.parent = type;\n type.typeArguments = typeArguments; if (typeArguments) setParent(typeArguments, type);\n type.isNullable = isNullable;\n return type;\n }\n\n static createOmittedType(\n range: Range\n ): TypeNode {\n return Node.createType(\n Node.createIdentifierExpression(\"\", range),\n null,\n false,\n range\n );\n }\n\n static createTypeParameter(\n name: IdentifierExpression,\n extendsType: TypeNode | null,\n defaultType: TypeNode | null,\n range: Range\n ): TypeParameterNode {\n var elem = new TypeParameterNode();\n elem.range = range;\n elem.name = name; name.parent = elem;\n elem.extendsType = extendsType; if (extendsType) extendsType.parent = elem;\n elem.defaultType = defaultType; if (defaultType) defaultType.parent = elem;\n return elem;\n }\n\n static createParameter(\n name: IdentifierExpression,\n type: CommonTypeNode,\n initializer: Expression | null,\n kind: ParameterKind,\n range: Range\n ): ParameterNode {\n var elem = new ParameterNode();\n elem.range = range;\n elem.name = name; name.parent = elem;\n elem.type = type; if (type) type.parent = elem;\n elem.initializer = initializer; if (initializer) initializer.parent = elem;\n elem.parameterKind = kind;\n return elem;\n }\n\n static createSignature(\n parameters: ParameterNode[],\n returnType: CommonTypeNode,\n explicitThisType: TypeNode | null,\n isNullable: bool,\n range: Range\n ): SignatureNode {\n var sig = new SignatureNode();\n sig.range = range;\n sig.parameters = parameters; setParent(parameters, sig);\n sig.returnType = returnType; returnType.parent = sig;\n sig.explicitThisType = explicitThisType; if (explicitThisType) explicitThisType.parent = sig;\n sig.isNullable = isNullable;\n return sig;\n }\n\n // special\n\n static createDecorator(\n name: Expression,\n args: Expression[] | null,\n range: Range\n ): DecoratorNode {\n var stmt = new DecoratorNode();\n stmt.range = range;\n stmt.name = name; name.parent = stmt;\n stmt.arguments = args; if (args) setParent(args, stmt);\n stmt.decoratorKind = decoratorNameToKind(name);\n return stmt;\n }\n\n static createComment(\n text: string,\n kind: CommentKind,\n range: Range\n ): CommentNode {\n var node = new CommentNode();\n node.range = range;\n node.commentKind = kind;\n node.text = text;\n return node;\n }\n\n // expressions\n\n static createIdentifierExpression(\n name: string,\n range: Range\n ): IdentifierExpression {\n var expr = new IdentifierExpression();\n expr.range = range;\n expr.text = name;\n return expr;\n }\n\n static createEmptyIdentifierExpression(\n range: Range\n ): IdentifierExpression {\n var expr = new IdentifierExpression();\n expr.range = range;\n expr.text = \"\";\n return expr;\n }\n\n static createArrayLiteralExpression(\n elements: (Expression | null)[],\n range: Range\n ): ArrayLiteralExpression {\n var expr = new ArrayLiteralExpression();\n expr.range = range;\n expr.elementExpressions = elements; setParentIfNotNull(elements, expr);\n return expr;\n }\n\n static createAssertionExpression(\n assertionKind: AssertionKind,\n expression: Expression,\n toType: CommonTypeNode | null,\n range: Range\n ): AssertionExpression {\n var expr = new AssertionExpression();\n expr.range = range;\n expr.assertionKind = assertionKind;\n expr.expression = expression; expression.parent = expr;\n expr.toType = toType; if (toType) toType.parent = expr;\n return expr;\n }\n\n static createBinaryExpression(\n operator: Token,\n left: Expression,\n right: Expression,\n range: Range\n ): BinaryExpression {\n var expr = new BinaryExpression();\n expr.range = range;\n expr.operator = operator;\n expr.left = left; left.parent = expr;\n expr.right = right; right.parent = expr;\n return expr;\n }\n\n static createCallExpression(\n expression: Expression,\n typeArgs: CommonTypeNode[] | null,\n args: Expression[],\n range: Range\n ): CallExpression {\n var expr = new CallExpression();\n expr.range = range;\n expr.expression = expression; expression.parent = expr;\n expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\n expr.arguments = args; setParent(args, expr);\n return expr;\n }\n\n static createClassExpression(\n declaration: ClassDeclaration\n ): ClassExpression {\n var expr = new ClassExpression();\n expr.range = declaration.range;\n expr.declaration = declaration;\n return expr;\n }\n\n static createCommaExpression(\n expressions: Expression[],\n range: Range\n ): CommaExpression {\n var expr = new CommaExpression();\n expr.range = range;\n expr.expressions = expressions; setParent(expressions, expr);\n return expr;\n }\n\n static createConstructorExpression(\n range: Range\n ): ConstructorExpression {\n var expr = new ConstructorExpression();\n expr.range = range;\n return expr;\n }\n\n static createElementAccessExpression(\n expression: Expression,\n element: Expression,\n range: Range\n ): ElementAccessExpression {\n var expr = new ElementAccessExpression();\n expr.range = range;\n expr.expression = expression; expression.parent = expr;\n expr.elementExpression = element; element.parent = expr;\n return expr;\n }\n\n static createFalseExpression(\n range: Range\n ): FalseExpression {\n var expr = new FalseExpression();\n expr.range = range;\n return expr;\n }\n\n static createFloatLiteralExpression(\n value: f64,\n range: Range\n ): FloatLiteralExpression {\n var expr = new FloatLiteralExpression();\n expr.range = range;\n expr.value = value;\n return expr;\n }\n\n static createFunctionExpression(\n declaration: FunctionDeclaration\n ): FunctionExpression {\n var expr = new FunctionExpression();\n expr.flags = declaration.flags & CommonFlags.ARROW;\n expr.range = declaration.range;\n expr.declaration = declaration;\n return expr;\n }\n\n static createInstanceOfExpression(\n expression: Expression,\n isType: CommonTypeNode,\n range: Range\n ): InstanceOfExpression {\n var expr = new InstanceOfExpression();\n expr.range = range;\n expr.expression = expression; expression.parent = expr;\n expr.isType = isType; isType.parent = expr;\n return expr;\n }\n\n static createIntegerLiteralExpression(\n value: I64,\n range: Range\n ): IntegerLiteralExpression {\n var expr = new IntegerLiteralExpression();\n expr.range = range;\n expr.value = value;\n return expr;\n }\n\n static createNewExpression(\n expression: Expression,\n typeArgs: CommonTypeNode[] | null,\n args: Expression[],\n range: Range\n ): NewExpression {\n var expr = new NewExpression();\n expr.range = range;\n expr.expression = expression; expression.parent = expr;\n expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\n expr.arguments = args; setParent(args, expr);\n return expr;\n }\n\n static createNullExpression(\n range: Range\n ): NullExpression {\n var expr = new NullExpression();\n expr.range = range;\n return expr;\n }\n\n static createObjectLiteralExpression(\n names: IdentifierExpression[],\n values: Expression[],\n range: Range\n ): ObjectLiteralExpression {\n var expr = new ObjectLiteralExpression();\n expr.range = range;\n expr.names = names;\n expr.values = values;\n return expr;\n }\n\n static createParenthesizedExpression(\n expression: Expression,\n range: Range\n ): ParenthesizedExpression {\n var expr = new ParenthesizedExpression();\n expr.range = range;\n expr.expression = expression; expression.parent = expr;\n return expr;\n }\n\n static createPropertyAccessExpression(\n expression: Expression,\n property: IdentifierExpression,\n range: Range\n ): PropertyAccessExpression {\n var expr = new PropertyAccessExpression();\n expr.range = range;\n expr.expression = expression; expression.parent = expr;\n expr.property = property; property.parent = expr;\n return expr;\n }\n\n static createRegexpLiteralExpression(\n pattern: string,\n flags: string,\n range: Range\n ): RegexpLiteralExpression {\n var expr = new RegexpLiteralExpression();\n expr.range = range;\n expr.pattern = pattern;\n expr.patternFlags = flags;\n return expr;\n }\n\n static createTernaryExpression(\n condition: Expression,\n ifThen: Expression,\n ifElse: Expression,\n range: Range\n ): TernaryExpression {\n var expr = new TernaryExpression();\n expr.range = range;\n expr.condition = condition; condition.parent = expr;\n expr.ifThen = ifThen; ifThen.parent = expr;\n expr.ifElse = ifElse; ifElse.parent = expr;\n return expr;\n }\n\n static createStringLiteralExpression(\n value: string,\n range: Range\n ): StringLiteralExpression {\n var expr = new StringLiteralExpression();\n expr.range = range;\n expr.value = value;\n return expr;\n }\n\n static createSuperExpression(\n range: Range\n ): SuperExpression {\n var expr = new SuperExpression();\n expr.range = range;\n return expr;\n }\n\n static createThisExpression(\n range: Range\n ): ThisExpression {\n var expr = new ThisExpression();\n expr.range = range;\n return expr;\n }\n\n static createTrueExpression(\n range: Range\n ): TrueExpression {\n var expr = new TrueExpression();\n expr.range = range;\n return expr;\n }\n\n static createUnaryPostfixExpression(\n operator: Token,\n operand: Expression,\n range: Range\n ): UnaryPostfixExpression {\n var expr = new UnaryPostfixExpression();\n expr.range = range;\n expr.operator = operator;\n expr.operand = operand; operand.parent = expr;\n return expr;\n }\n\n static createUnaryPrefixExpression(\n operator: Token,\n operand: Expression,\n range: Range\n ): UnaryPrefixExpression {\n var expr = new UnaryPrefixExpression();\n expr.range = range;\n expr.operator = operator;\n expr.operand = operand; operand.parent = expr;\n return expr;\n }\n\n // statements\n\n static createBlockStatement(\n statements: Statement[],\n range: Range\n ): BlockStatement {\n var stmt = new BlockStatement();\n stmt.range = range;\n stmt.statements = statements; setParent(statements, stmt);\n return stmt;\n }\n\n static createBreakStatement(\n label: IdentifierExpression | null,\n range: Range\n ): BreakStatement {\n var stmt = new BreakStatement();\n stmt.range = range;\n stmt.label = label; if (label) label.parent = stmt;\n return stmt;\n }\n\n static createClassDeclaration(\n identifier: IdentifierExpression,\n typeParameters: TypeParameterNode[],\n extendsType: TypeNode | null, // can't be a function\n implementsTypes: TypeNode[] | null, // can't be functions\n members: DeclarationStatement[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): ClassDeclaration {\n var stmt = new ClassDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = identifier; identifier.parent = stmt;\n stmt.typeParameters = typeParameters; setParent(typeParameters, stmt);\n stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\n stmt.implementsTypes = implementsTypes; if (implementsTypes) setParent(implementsTypes, stmt);\n stmt.members = members; setParent(members, stmt);\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createContinueStatement(\n label: IdentifierExpression | null,\n range: Range\n ): ContinueStatement {\n var stmt = new ContinueStatement();\n stmt.range = range;\n stmt.label = label; if (label) label.parent = stmt;\n return stmt;\n }\n\n static createDoStatement(\n statement: Statement,\n condition: Expression,\n range: Range\n ): DoStatement {\n var stmt = new DoStatement();\n stmt.range = range;\n stmt.statement = statement; statement.parent = stmt;\n stmt.condition = condition; condition.parent = stmt;\n return stmt;\n }\n\n static createEmptyStatement(\n range: Range\n ): EmptyStatement {\n var stmt = new EmptyStatement();\n stmt.range = range;\n return stmt;\n }\n\n static createEnumDeclaration(\n name: IdentifierExpression,\n members: EnumValueDeclaration[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): EnumDeclaration {\n var stmt = new EnumDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.values = members; setParent(members, stmt);\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createEnumValueDeclaration(\n name: IdentifierExpression,\n value: Expression | null,\n flags: CommonFlags,\n range: Range\n ): EnumValueDeclaration {\n var stmt = new EnumValueDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.value = value; if (value) value.parent = stmt;\n return stmt;\n }\n\n static createExportStatement(\n members: ExportMember[] | null,\n path: StringLiteralExpression | null,\n flags: CommonFlags,\n range: Range\n ): ExportStatement {\n var stmt = new ExportStatement();\n stmt.range = range;\n stmt.flags = flags;\n stmt.members = members; if (members) setParent(members, stmt);\n stmt.path = path;\n if (path) {\n let normalizedPath = normalizePath(path.value);\n if (path.value.startsWith(\".\")) { // relative\n stmt.normalizedPath = resolvePath(\n normalizedPath,\n range.source.normalizedPath\n );\n } else { // absolute\n stmt.normalizedPath = normalizedPath;\n }\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\n } else {\n stmt.normalizedPath = null;\n stmt.internalPath = null;\n }\n return stmt;\n }\n\n static createExportImportStatement(\n name: IdentifierExpression,\n externalName: IdentifierExpression,\n range: Range\n ): ExportImportStatement {\n var stmt = new ExportImportStatement();\n stmt.range = range;\n stmt.name = name; name.parent = stmt;\n stmt.externalName = externalName; externalName.parent = stmt;\n return stmt;\n }\n\n static createExportMember(\n name: IdentifierExpression,\n externalName: IdentifierExpression | null,\n range: Range\n ): ExportMember {\n var elem = new ExportMember();\n elem.range = range;\n elem.name = name; name.parent = elem;\n if (!externalName) {\n externalName = name;\n } else {\n externalName.parent = elem;\n }\n elem.externalName = externalName;\n return elem;\n }\n\n static createExpressionStatement(\n expression: Expression\n ): ExpressionStatement {\n var stmt = new ExpressionStatement();\n stmt.range = expression.range;\n stmt.expression = expression; expression.parent = stmt;\n return stmt;\n }\n\n static createIfStatement(\n condition: Expression,\n ifTrue: Statement,\n ifFalse: Statement | null,\n range: Range\n ): IfStatement {\n var stmt = new IfStatement();\n stmt.range = range;\n stmt.condition = condition; condition.parent = stmt;\n stmt.ifTrue = ifTrue; ifTrue.parent = stmt;\n stmt.ifFalse = ifFalse; if (ifFalse) ifFalse.parent = stmt;\n return stmt;\n }\n\n static createImportStatement(\n decls: ImportDeclaration[] | null,\n path: StringLiteralExpression,\n range: Range\n ): ImportStatement {\n var stmt = new ImportStatement();\n stmt.range = range;\n stmt.declarations = decls; if (decls) setParent(decls, stmt);\n stmt.namespaceName = null;\n stmt.path = path;\n var normalizedPath = normalizePath(path.value);\n if (path.value.startsWith(\".\")) { // relative in project\n stmt.normalizedPath = resolvePath(\n normalizedPath,\n range.source.normalizedPath\n );\n } else { // absolute in library\n if (!normalizedPath.startsWith(LIBRARY_PREFIX)) {\n normalizedPath = LIBRARY_PREFIX + normalizedPath;\n }\n stmt.normalizedPath = normalizedPath;\n }\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\n return stmt;\n }\n\n static createImportStatementWithWildcard(\n identifier: IdentifierExpression,\n path: StringLiteralExpression,\n range: Range\n ): ImportStatement {\n var stmt = new ImportStatement();\n stmt.range = range;\n stmt.declarations = null;\n stmt.namespaceName = identifier;\n stmt.path = path;\n stmt.normalizedPath = resolvePath(\n normalizePath(path.value),\n range.source.normalizedPath\n );\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\n return stmt;\n }\n\n static createImportDeclaration(\n externalName: IdentifierExpression,\n name: IdentifierExpression | null,\n range: Range\n ): ImportDeclaration {\n var elem = new ImportDeclaration();\n elem.range = range;\n elem.externalName = externalName; externalName.parent = elem;\n if (!name) {\n name = externalName;\n } else {\n name.parent = elem;\n }\n elem.name = name;\n return elem;\n }\n\n static createInterfaceDeclaration(\n name: IdentifierExpression,\n typeParameters: TypeParameterNode[],\n extendsType: TypeNode | null, // can't be a function\n members: DeclarationStatement[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): InterfaceDeclaration {\n var stmt = new InterfaceDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\n stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\n stmt.members = members; setParent(members, stmt);\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createFieldDeclaration(\n name: IdentifierExpression,\n type: CommonTypeNode | null,\n initializer: Expression | null,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): FieldDeclaration {\n var stmt = new FieldDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.type = type; if (type) type.parent = stmt;\n stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createForStatement(\n initializer: Statement | null,\n condition: Expression | null,\n incrementor: Expression | null,\n statement: Statement,\n range: Range\n ): ForStatement {\n var stmt = new ForStatement();\n stmt.range = range;\n stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\n stmt.condition = condition; if (condition) condition.parent = stmt;\n stmt.incrementor = incrementor; if (incrementor) incrementor.parent = stmt;\n stmt.statement = statement; statement.parent = stmt;\n return stmt;\n }\n\n static createFunctionDeclaration(\n name: IdentifierExpression,\n typeParameters: TypeParameterNode[] | null,\n signature: SignatureNode,\n body: Statement | null,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): FunctionDeclaration {\n var stmt = new FunctionDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\n stmt.signature = signature; signature.parent = stmt;\n stmt.body = body; if (body) body.parent = stmt;\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createIndexSignatureDeclaration(\n keyType: TypeNode,\n valueType: CommonTypeNode,\n range: Range\n ): IndexSignatureDeclaration {\n var elem = new IndexSignatureDeclaration();\n elem.range = range;\n elem.keyType = keyType; keyType.parent = elem;\n elem.valueType = valueType; valueType.parent = elem;\n return elem;\n }\n\n static createMethodDeclaration(\n name: IdentifierExpression,\n typeParameters: TypeParameterNode[] | null,\n signature: SignatureNode,\n body: Statement | null,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): MethodDeclaration {\n var stmt = new MethodDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\n stmt.signature = signature; signature.parent = stmt;\n stmt.body = body; if (body) body.parent = stmt;\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createNamespaceDeclaration(\n name: IdentifierExpression,\n members: Statement[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): NamespaceDeclaration {\n var stmt = new NamespaceDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.members = members; setParent(members, stmt);\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createReturnStatement(\n value: Expression | null,\n range: Range\n ): ReturnStatement {\n var stmt = new ReturnStatement();\n stmt.range = range;\n stmt.value = value; if (value) value.parent = stmt;\n return stmt;\n }\n\n static createSwitchStatement(\n condition: Expression,\n cases: SwitchCase[],\n range: Range\n ): SwitchStatement {\n var stmt = new SwitchStatement();\n stmt.range = range;\n stmt.condition = condition; condition.parent = stmt;\n stmt.cases = cases; setParent(cases, stmt);\n return stmt;\n }\n\n static createSwitchCase(\n label: Expression | null,\n statements: Statement[],\n range: Range\n ): SwitchCase {\n var elem = new SwitchCase();\n elem.range = range;\n elem.label = label; if (label) label.parent = elem;\n elem.statements = statements; setParent(statements, elem);\n return elem;\n }\n\n static createThrowStatement(\n value: Expression,\n range: Range\n ): ThrowStatement {\n var stmt = new ThrowStatement();\n stmt.range = range;\n stmt.value = value; value.parent = stmt;\n return stmt;\n }\n\n static createTryStatement(\n statements: Statement[],\n catchVariable: IdentifierExpression | null,\n catchStatements: Statement[] | null,\n finallyStatements: Statement[] | null,\n range: Range\n ): TryStatement {\n var stmt = new TryStatement();\n stmt.range = range;\n stmt.statements = statements; setParent(statements, stmt);\n stmt.catchVariable = catchVariable;\n if (catchVariable) catchVariable.parent = stmt;\n stmt.catchStatements = catchStatements;\n if (catchStatements) setParent(catchStatements, stmt);\n stmt.finallyStatements = finallyStatements;\n if (finallyStatements) setParent(finallyStatements, stmt);\n return stmt;\n }\n\n static createTypeDeclaration(\n name: IdentifierExpression,\n typeParameters: TypeParameterNode[] | null,\n alias: CommonTypeNode,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): TypeDeclaration {\n var stmt = new TypeDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\n stmt.type = alias; alias.parent = stmt;\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createVariableStatement(\n declarations: VariableDeclaration[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): VariableStatement {\n var stmt = new VariableStatement();\n stmt.range = range;\n stmt.flags = flags;\n stmt.declarations = declarations; setParent(declarations, stmt);\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createVariableDeclaration(\n name: IdentifierExpression,\n type: CommonTypeNode | null,\n initializer: Expression | null,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): VariableDeclaration {\n var elem = new VariableDeclaration();\n elem.range = range;\n elem.flags = flags;\n elem.name = name; name.parent = elem;\n elem.type = type; if (type) type.parent = elem;\n elem.initializer = initializer; if (initializer) initializer.parent = elem;\n elem.decorators = decorators; // inherited\n return elem;\n }\n\n static createVoidStatement(\n expression: Expression,\n range: Range\n ): VoidStatement {\n var stmt = new VoidStatement();\n stmt.range = range;\n stmt.expression = expression;\n return stmt;\n }\n\n static createWhileStatement(\n condition: Expression,\n statement: Statement,\n range: Range\n ): WhileStatement {\n var stmt = new WhileStatement();\n stmt.range = range;\n stmt.condition = condition; condition.parent = stmt;\n stmt.statement = statement; statement.parent = stmt;\n return stmt;\n }\n}\n\n// types\n\nexport abstract class CommonTypeNode extends Node {\n // kind varies\n\n /** Whether nullable or not. */\n isNullable: bool;\n}\n\n/** Represents a type annotation. */\nexport class TypeNode extends CommonTypeNode {\n kind = NodeKind.TYPE;\n\n /** Identifier reference. */\n name: IdentifierExpression;\n /** Type argument references. */\n typeArguments: CommonTypeNode[] | null;\n}\n\n/** Represents a type parameter. */\nexport class TypeParameterNode extends Node {\n kind = NodeKind.TYPEPARAMETER;\n\n /** Identifier reference. */\n name: IdentifierExpression;\n /** Extended type reference, if any. */\n extendsType: TypeNode | null; // can't be a function\n /** Default type if omitted, if any. */\n defaultType: TypeNode | null; // can't be a function\n}\n\n/** Represents the kind of a parameter. */\nexport enum ParameterKind {\n /** No specific flags. */\n DEFAULT,\n /** Is an optional parameter. */\n OPTIONAL,\n /** Is a rest parameter. */\n REST\n}\n\n/** Represents a function parameter. */\nexport class ParameterNode extends Node {\n kind = NodeKind.PARAMETER;\n\n /** Parameter kind. */\n parameterKind: ParameterKind;\n /** Parameter name. */\n name: IdentifierExpression;\n /** Parameter type. */\n type: CommonTypeNode;\n /** Initializer expression, if present. */\n initializer: Expression | null;\n /** Implicit field declaration, if applicable. */\n implicitFieldDeclaration: FieldDeclaration | null = null;\n}\n\n/** Represents a function signature. */\nexport class SignatureNode extends CommonTypeNode {\n kind = NodeKind.SIGNATURE;\n\n /** Accepted parameters. */\n parameters: ParameterNode[];\n /** Return type. */\n returnType: CommonTypeNode;\n /** Explicitly provided this type, if any. */\n explicitThisType: TypeNode | null; // can't be a function\n}\n\n// special\n\n/** Built-in decorator kinds. */\nexport enum DecoratorKind {\n CUSTOM,\n GLOBAL,\n OPERATOR,\n OPERATOR_BINARY,\n OPERATOR_PREFIX,\n OPERATOR_POSTFIX,\n UNMANAGED,\n SEALED,\n INLINE,\n EXTERNAL,\n BUILTIN\n}\n\n/** Returns the kind of the specified decorator. Defaults to {@link DecoratorKind.CUSTOM}. */\nexport function decoratorNameToKind(name: Expression): DecoratorKind {\n // @global, @inline, @operator, @sealed, @unmanaged\n if (name.kind == NodeKind.IDENTIFIER) {\n let nameStr = (name).text;\n assert(nameStr.length);\n switch (nameStr.charCodeAt(0)) {\n case CharCode.b: {\n if (nameStr == \"builtin\") return DecoratorKind.BUILTIN;\n break;\n }\n case CharCode.e: {\n if (nameStr == \"external\") return DecoratorKind.EXTERNAL;\n break;\n }\n case CharCode.g: {\n if (nameStr == \"global\") return DecoratorKind.GLOBAL;\n break;\n }\n case CharCode.i: {\n if (nameStr == \"inline\") return DecoratorKind.INLINE;\n break;\n }\n case CharCode.o: {\n if (nameStr == \"operator\") return DecoratorKind.OPERATOR;\n break;\n }\n case CharCode.s: {\n if (nameStr == \"sealed\") return DecoratorKind.SEALED;\n break;\n }\n case CharCode.u: {\n if (nameStr == \"unmanaged\") return DecoratorKind.UNMANAGED;\n break;\n }\n }\n } else if (\n name.kind == NodeKind.PROPERTYACCESS &&\n (name).expression.kind == NodeKind.IDENTIFIER\n ) {\n let nameStr = ((name).expression).text;\n assert(nameStr.length);\n let propStr = (name).property.text;\n assert(propStr.length);\n // @operator.binary, @operator.prefix, @operator.postfix\n if (nameStr == \"operator\") {\n switch (propStr.charCodeAt(0)) {\n case CharCode.b: {\n if (propStr == \"binary\") return DecoratorKind.OPERATOR_BINARY;\n break;\n }\n case CharCode.p: {\n switch (propStr) {\n case \"prefix\": return DecoratorKind.OPERATOR_PREFIX;\n case \"postfix\": return DecoratorKind.OPERATOR_POSTFIX;\n }\n break;\n }\n }\n }\n }\n return DecoratorKind.CUSTOM;\n}\n\n/** Represents a decorator. */\nexport class DecoratorNode extends Node {\n kind = NodeKind.DECORATOR;\n\n /** Built-in kind, if applicable. */\n decoratorKind: DecoratorKind;\n /** Name expression. */\n name: Expression;\n /** Argument expressions. */\n arguments: Expression[] | null;\n}\n\n/** Comment kinds. */\nexport enum CommentKind {\n /** Line comment. */\n LINE,\n /** Triple-slash comment. */\n TRIPLE,\n /** Block comment. */\n BLOCK\n}\n\n/** Represents a comment. */\nexport class CommentNode extends Node {\n kind = NodeKind.COMMENT;\n\n /** Comment kind. */\n commentKind: CommentKind;\n /** Comment text. */\n text: string;\n}\n\n// expressions\n\n/** Base class of all expression nodes. */\nexport abstract class Expression extends Node { }\n\n/** Represents an identifier expression. */\nexport class IdentifierExpression extends Expression {\n kind = NodeKind.IDENTIFIER;\n\n /** Textual name. */\n text: string;\n}\n\n/** Indicates the kind of a literal. */\nexport enum LiteralKind {\n FLOAT,\n INTEGER,\n STRING,\n REGEXP,\n ARRAY,\n OBJECT\n}\n\n/** Base class of all literal expressions. */\nexport abstract class LiteralExpression extends Expression {\n kind = NodeKind.LITERAL;\n\n /** Specific literal kind. */\n literalKind: LiteralKind;\n}\n\n/** Represents an `[]` literal expression. */\nexport class ArrayLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.ARRAY;\n\n /** Nested element expressions. */\n elementExpressions: (Expression | null)[];\n}\n\n/** Indicates the kind of an assertion. */\nexport enum AssertionKind {\n PREFIX,\n AS,\n NONNULL\n}\n\n/** Represents an assertion expression. */\nexport class AssertionExpression extends Expression {\n kind = NodeKind.ASSERTION;\n\n /** Specific kind of this assertion. */\n assertionKind: AssertionKind;\n /** Expression being asserted. */\n expression: Expression;\n /** Target type. */\n toType: CommonTypeNode | null;\n}\n\n/** Represents a binary expression. */\nexport class BinaryExpression extends Expression {\n kind = NodeKind.BINARY;\n\n /** Operator token. */\n operator: Token;\n /** Left-hand side expression */\n left: Expression;\n /** Right-hand side expression. */\n right: Expression;\n}\n\n/** Represents a call expression. */\nexport class CallExpression extends Expression {\n kind = NodeKind.CALL;\n\n /** Called expression. Usually an identifier or property access expression. */\n expression: Expression;\n /** Provided type arguments. */\n typeArguments: CommonTypeNode[] | null;\n /** Provided arguments. */\n arguments: Expression[];\n}\n\n/** Represents a class expression using the 'class' keyword. */\nexport class ClassExpression extends Expression {\n kind = NodeKind.CLASS;\n\n /** Inline class declaration. */\n declaration: ClassDeclaration;\n}\n\n/** Represents a comma expression composed of multiple expressions. */\nexport class CommaExpression extends Expression {\n kind = NodeKind.COMMA;\n\n /** Sequential expressions. */\n expressions: Expression[];\n}\n\n/** Represents a `constructor` expression. */\nexport class ConstructorExpression extends IdentifierExpression {\n kind = NodeKind.CONSTRUCTOR;\n text = \"constructor\";\n}\n\n/** Represents an element access expression, e.g., array access. */\nexport class ElementAccessExpression extends Expression {\n kind = NodeKind.ELEMENTACCESS;\n\n /** Expression being accessed. */\n expression: Expression;\n /** Element of the expression being accessed. */\n elementExpression: Expression;\n}\n\n/** Represents a float literal expression. */\nexport class FloatLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.FLOAT;\n\n /** Float value. */\n value: f64;\n}\n\n/** Represents a function expression using the 'function' keyword. */\nexport class FunctionExpression extends Expression {\n kind = NodeKind.FUNCTION;\n\n /** Inline function declaration. */\n declaration: FunctionDeclaration;\n}\n\n/** Represents an `instanceof` expression. */\nexport class InstanceOfExpression extends Expression {\n kind = NodeKind.INSTANCEOF;\n\n /** Expression being asserted. */\n expression: Expression;\n /** Type to test for. */\n isType: CommonTypeNode;\n}\n\n/** Represents an integer literal expression. */\nexport class IntegerLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.INTEGER;\n\n /** Integer value. */\n value: I64;\n}\n\n/** Represents a `new` expression. Like a call but with its own kind. */\nexport class NewExpression extends CallExpression {\n kind = NodeKind.NEW;\n}\n\n/** Represents a `null` expression. */\nexport class NullExpression extends IdentifierExpression {\n kind = NodeKind.NULL;\n text = \"null\";\n}\n\n/** Represents an object literal expression. */\nexport class ObjectLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.OBJECT;\n\n /** Field names. */\n names: IdentifierExpression[];\n /** Field values. */\n values: Expression[];\n}\n\n/** Represents a parenthesized expression. */\nexport class ParenthesizedExpression extends Expression {\n kind = NodeKind.PARENTHESIZED;\n\n /** Expression in parenthesis. */\n expression: Expression;\n}\n\n/** Represents a property access expression. */\nexport class PropertyAccessExpression extends Expression {\n kind = NodeKind.PROPERTYACCESS;\n\n /** Expression being accessed. */\n expression: Expression;\n /** Property of the expression being accessed. */\n property: IdentifierExpression;\n}\n\n/** Represents a regular expression literal expression. */\nexport class RegexpLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.REGEXP;\n\n /** Regular expression pattern. */\n pattern: string;\n /** Regular expression flags. */\n patternFlags: string;\n}\n\n/** Represents a ternary expression, i.e., short if notation. */\nexport class TernaryExpression extends Expression {\n kind = NodeKind.TERNARY;\n\n /** Condition expression. */\n condition: Expression;\n /** Expression executed when condition is `true`. */\n ifThen: Expression;\n /** Expression executed when condition is `false`. */\n ifElse: Expression;\n}\n\n/** Represents a string literal expression. */\nexport class StringLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.STRING;\n\n /** String value without quotes. */\n value: string;\n}\n\n/** Represents a `super` expression. */\nexport class SuperExpression extends IdentifierExpression {\n kind = NodeKind.SUPER;\n text = \"super\";\n}\n\n/** Represents a `this` expression. */\nexport class ThisExpression extends IdentifierExpression {\n kind = NodeKind.THIS;\n text = \"this\";\n}\n\n/** Represents a `true` expression. */\nexport class TrueExpression extends IdentifierExpression {\n kind = NodeKind.TRUE;\n text = \"true\";\n}\n\n/** Represents a `false` expression. */\nexport class FalseExpression extends IdentifierExpression {\n kind = NodeKind.FALSE;\n text = \"false\";\n}\n\n/** Base class of all unary expressions. */\nexport abstract class UnaryExpression extends Expression {\n\n /** Operator token. */\n operator: Token;\n /** Operand expression. */\n operand: Expression;\n}\n\n/** Represents a unary postfix expression, e.g. a postfix increment. */\nexport class UnaryPostfixExpression extends UnaryExpression {\n kind = NodeKind.UNARYPOSTFIX;\n}\n\n/** Represents a unary prefix expression, e.g. a negation. */\nexport class UnaryPrefixExpression extends UnaryExpression {\n kind = NodeKind.UNARYPREFIX;\n}\n\n// statements\n\nexport function isLastStatement(statement: Statement): bool {\n var parent = assert(statement.parent);\n if (parent.kind == NodeKind.BLOCK) {\n let statements = (parent).statements;\n if (statements[statements.length - 1] === statement) {\n switch (assert(parent.parent).kind) {\n case NodeKind.FUNCTIONDECLARATION:\n case NodeKind.METHODDECLARATION: return true;\n }\n }\n }\n return false;\n}\n\n/** Base class of all statement nodes. */\nexport abstract class Statement extends Node { }\n\n/** Indicates the specific kind of a source. */\nexport enum SourceKind {\n /** Default source. Usually imported from an entry file. */\n DEFAULT,\n /** Entry file. */\n ENTRY,\n /** Library file. */\n LIBRARY\n}\n\n/** A top-level source node. */\nexport class Source extends Node {\n kind = NodeKind.SOURCE;\n parent = null;\n\n /** Source kind. */\n sourceKind: SourceKind;\n /** Normalized path. */\n normalizedPath: string;\n /** Path used internally. */\n internalPath: string;\n /** Simple path (last part without extension). */\n simplePath: string;\n /** Contained statements. */\n statements: Statement[];\n /** Full source text. */\n text: string;\n /** Tokenizer reference. */\n tokenizer: Tokenizer | null = null;\n /** Source map index. */\n debugInfoIndex: i32 = -1;\n /** Re-exported sources. */\n exportPaths: Set | null = null;\n\n /** Constructs a new source node. */\n constructor(normalizedPath: string, text: string, kind: SourceKind) {\n super();\n this.sourceKind = kind;\n this.normalizedPath = normalizedPath;\n var internalPath = mangleInternalPath(this.normalizedPath);\n this.internalPath = internalPath;\n var pos = internalPath.lastIndexOf(PATH_DELIMITER);\n this.simplePath = pos >= 0 ? internalPath.substring(pos + 1) : internalPath;\n this.statements = new Array();\n this.range = new Range(this, 0, text.length);\n this.text = text;\n }\n\n /** Tests if this source is an entry file. */\n get isEntry(): bool { return this.sourceKind == SourceKind.ENTRY; }\n /** Tests if this source is a stdlib file. */\n get isLibrary(): bool { return this.sourceKind == SourceKind.LIBRARY; }\n}\n\n/** Base class of all declaration statements. */\nexport abstract class DeclarationStatement extends Statement {\n\n /** Simple name being declared. */\n name: IdentifierExpression;\n /** Array of decorators. */\n decorators: DecoratorNode[] | null = null;\n\n protected cachedProgramLevelInternalName: string | null = null;\n protected cachedFileLevelInternalName: string | null = null;\n\n /** Gets the mangled program-level internal name of this declaration. */\n get programLevelInternalName(): string {\n if (!this.cachedProgramLevelInternalName) {\n this.cachedProgramLevelInternalName = mangleInternalName(this, true);\n }\n return this.cachedProgramLevelInternalName;\n }\n\n /** Gets the mangled file-level internal name of this declaration. */\n get fileLevelInternalName(): string {\n if (!this.cachedFileLevelInternalName) {\n this.cachedFileLevelInternalName = mangleInternalName(this, false);\n }\n return this.cachedFileLevelInternalName;\n }\n\n /** Tests if this is a top-level declaration within its source file. */\n get isTopLevel(): bool {\n var parent = this.parent;\n if (!parent) {\n return false;\n }\n if (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent)) {\n return false;\n }\n return parent.kind == NodeKind.SOURCE;\n }\n\n /** Tests if this declaration is a top-level export within its source file. */\n get isTopLevelExport(): bool {\n var parent = this.parent;\n if (!parent || (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent))) {\n return false;\n }\n if (parent.kind == NodeKind.NAMESPACEDECLARATION) {\n return this.is(CommonFlags.EXPORT) && (parent).isTopLevelExport;\n }\n if (parent.kind == NodeKind.CLASSDECLARATION) {\n return this.is(CommonFlags.STATIC) && (parent).isTopLevelExport;\n }\n return parent.kind == NodeKind.SOURCE && this.is(CommonFlags.EXPORT);\n }\n\n /** Tests if this declaration needs an explicit export. */\n needsExplicitExport(member: ExportMember): bool {\n // This is necessary because module-level exports are automatically created\n // for top level declarations of all sorts. This function essentially tests\n // that there isn't a otherwise duplicate top-level export already.\n return (\n member.name.text != member.externalName.text || // if aliased\n this.range.source != member.range.source || // if a re-export\n !this.isTopLevelExport // if not top-level\n );\n }\n}\n\n/** Represents an index signature declaration. */\nexport class IndexSignatureDeclaration extends DeclarationStatement {\n kind = NodeKind.INDEXSIGNATUREDECLARATION;\n\n /** Key type. */\n keyType: TypeNode;\n /** Value type. */\n valueType: CommonTypeNode;\n}\n\n/** Base class of all variable-like declaration statements. */\nexport abstract class VariableLikeDeclarationStatement extends DeclarationStatement {\n\n /** Variable type. */\n type: CommonTypeNode | null;\n /** Variable initializer. */\n initializer: Expression | null;\n}\n\n/** Represents a block statement. */\nexport class BlockStatement extends Statement {\n kind = NodeKind.BLOCK;\n\n /** Contained statements. */\n statements: Statement[];\n}\n\n/** Represents a `break` statement. */\nexport class BreakStatement extends Statement {\n kind = NodeKind.BREAK;\n\n /** Target label, if applicable. */\n label: IdentifierExpression | null;\n}\n\n/** Represents a `class` declaration. */\nexport class ClassDeclaration extends DeclarationStatement {\n kind = NodeKind.CLASSDECLARATION;\n\n /** Accepted type parameters. */\n typeParameters: TypeParameterNode[];\n /** Base class type being extended, if any. */\n extendsType: TypeNode | null; // can't be a function\n /** Interface types being implemented, if any. */\n implementsTypes: TypeNode[] | null; // can't be functions\n /** Class member declarations. */\n members: DeclarationStatement[];\n\n get isGeneric(): bool {\n var typeParameters = this.typeParameters;\n return typeParameters != null && typeParameters.length > 0;\n }\n}\n\n/** Represents a `continue` statement. */\nexport class ContinueStatement extends Statement {\n kind = NodeKind.CONTINUE;\n\n /** Target label, if applicable. */\n label: IdentifierExpression | null;\n}\n\n/** Represents a `do` statement. */\nexport class DoStatement extends Statement {\n kind = NodeKind.DO;\n\n /** Statement being looped over. */\n statement: Statement;\n /** Condition when to repeat. */\n condition: Expression;\n}\n\n/** Represents an empty statement, i.e., a semicolon terminating nothing. */\nexport class EmptyStatement extends Statement {\n kind = NodeKind.EMPTY;\n}\n\n/** Represents an `enum` declaration. */\nexport class EnumDeclaration extends DeclarationStatement {\n kind = NodeKind.ENUMDECLARATION;\n\n /** Enum value declarations. */\n values: EnumValueDeclaration[];\n}\n\n/** Represents a value of an `enum` declaration. */\nexport class EnumValueDeclaration extends DeclarationStatement {\n kind = NodeKind.ENUMVALUEDECLARATION;\n // name is inherited\n\n /** Value expression. */\n value: Expression | null;\n}\n\n/** Represents an `export import` statement of an interface. */\nexport class ExportImportStatement extends Node {\n kind = NodeKind.EXPORTIMPORT;\n\n /** Identifier being imported. */\n name: IdentifierExpression;\n /** Identifier being exported. */\n externalName: IdentifierExpression;\n}\n\n/** Represents a member of an `export` statement. */\nexport class ExportMember extends Node {\n kind = NodeKind.EXPORTMEMBER;\n\n /** Identifier being exported. */\n name: IdentifierExpression;\n /** Identifier seen when imported again. */\n externalName: IdentifierExpression;\n}\n\n/** Represents an `export` statement. */\nexport class ExportStatement extends Statement {\n kind = NodeKind.EXPORT;\n\n /** Array of members if a set of named exports, or `null` if a filespace export. */\n members: ExportMember[] | null;\n /** Path being exported from, if applicable. */\n path: StringLiteralExpression | null;\n /** Normalized path, if `path` is set. */\n normalizedPath: string | null;\n /** Mangled internal path being referenced, if `path` is set. */\n internalPath: string | null;\n}\n\n/** Represents an expression that is used as a statement. */\nexport class ExpressionStatement extends Statement {\n kind = NodeKind.EXPRESSION;\n\n /** Expression being used as a statement.*/\n expression: Expression;\n}\n\n/** Represents a field declaration within a `class`. */\nexport class FieldDeclaration extends VariableLikeDeclarationStatement {\n kind = NodeKind.FIELDDECLARATION;\n\n /** Parameter index within the constructor, if applicable. */\n parameterIndex: i32 = -1;\n}\n\n/** Represents a `for` statement. */\nexport class ForStatement extends Statement {\n kind = NodeKind.FOR;\n\n /**\n * Initializer statement, if present.\n * Either a {@link VariableStatement} or {@link ExpressionStatement}.\n */\n initializer: Statement | null;\n /** Condition expression, if present. */\n condition: Expression | null;\n /** Incrementor expression, if present. */\n incrementor: Expression | null;\n /** Statement being looped over. */\n statement: Statement;\n}\n\n/** Represents a `function` declaration. */\nexport class FunctionDeclaration extends DeclarationStatement {\n kind = NodeKind.FUNCTIONDECLARATION;\n\n /** Type parameters, if any. */\n typeParameters: TypeParameterNode[] | null;\n /** Function signature. */\n signature: SignatureNode;\n /** Body statement. Usually a block. */\n body: Statement | null;\n\n get isGeneric(): bool {\n var typeParameters = this.typeParameters;\n return typeParameters != null && typeParameters.length > 0;\n }\n}\n\n/** Represents an `if` statement. */\nexport class IfStatement extends Statement {\n kind = NodeKind.IF;\n\n /** Condition. */\n condition: Expression;\n /** Statement executed when condition is `true`. */\n ifTrue: Statement;\n /** Statement executed when condition is `false`. */\n ifFalse: Statement | null;\n}\n\n/** Represents an `import` declaration part of an {@link ImportStatement}. */\nexport class ImportDeclaration extends DeclarationStatement {\n kind = NodeKind.IMPORTDECLARATION;\n\n /** Identifier being imported. */\n externalName: IdentifierExpression;\n}\n\n/** Represents an `import` statement. */\nexport class ImportStatement extends Statement {\n kind = NodeKind.IMPORT;\n\n /** Array of member declarations or `null` if an asterisk import. */\n declarations: ImportDeclaration[] | null;\n /** Name of the local namespace, if an asterisk import. */\n namespaceName: IdentifierExpression | null;\n /** Path being imported from. */\n path: StringLiteralExpression;\n /** Normalized path. */\n normalizedPath: string;\n /** Mangled internal path being referenced. */\n internalPath: string;\n}\n\n/** Represents an `interfarce` declaration. */\nexport class InterfaceDeclaration extends ClassDeclaration {\n kind = NodeKind.INTERFACEDECLARATION;\n}\n\n/** Represents a method declaration within a `class`. */\nexport class MethodDeclaration extends FunctionDeclaration {\n kind = NodeKind.METHODDECLARATION;\n}\n\n/** Represents a `namespace` declaration. */\nexport class NamespaceDeclaration extends DeclarationStatement {\n kind = NodeKind.NAMESPACEDECLARATION;\n\n /** Array of namespace members. */\n members: Statement[];\n}\n\n/** Represents a `return` statement. */\nexport class ReturnStatement extends Statement {\n kind = NodeKind.RETURN;\n\n /** Value expression being returned, if present. */\n value: Expression | null;\n}\n\n/** Represents a single `case` within a `switch` statement. */\nexport class SwitchCase extends Node {\n kind = NodeKind.SWITCHCASE;\n\n /** Label expression. `null` indicates the default case. */\n label: Expression | null;\n /** Contained statements. */\n statements: Statement[];\n}\n\n/** Represents a `switch` statement. */\nexport class SwitchStatement extends Statement {\n kind = NodeKind.SWITCH;\n\n /** Condition expression. */\n condition: Expression;\n /** Contained cases. */\n cases: SwitchCase[];\n}\n\n/** Represents a `throw` statement. */\nexport class ThrowStatement extends Statement {\n kind = NodeKind.THROW;\n\n /** Value expression being thrown. */\n value: Expression;\n}\n\n/** Represents a `try` statement. */\nexport class TryStatement extends Statement {\n kind = NodeKind.TRY;\n\n /** Contained statements. */\n statements: Statement[];\n /** Exception variable name, if a `catch` clause is present. */\n catchVariable: IdentifierExpression | null;\n /** Statements being executed on catch, if a `catch` clause is present. */\n catchStatements: Statement[] | null;\n /** Statements being executed afterwards, if a `finally` clause is present. */\n finallyStatements: Statement[] | null;\n}\n\n/** Represents a `type` declaration. */\nexport class TypeDeclaration extends DeclarationStatement {\n kind = NodeKind.TYPEDECLARATION;\n\n /** Type parameters, if any. */\n typeParameters: TypeParameterNode[] | null;\n /** Type being aliased. */\n type: CommonTypeNode;\n}\n\n/** Represents a variable declaration part of a {@link VariableStatement}. */\nexport class VariableDeclaration extends VariableLikeDeclarationStatement {\n kind = NodeKind.VARIABLEDECLARATION;\n}\n\n/** Represents a variable statement wrapping {@link VariableDeclaration}s. */\nexport class VariableStatement extends Statement {\n kind = NodeKind.VARIABLE;\n\n /** Array of decorators. */\n decorators: DecoratorNode[] | null;\n /** Array of member declarations. */\n declarations: VariableDeclaration[];\n}\n\n/** Represents a void statement dropping an expression's value. */\nexport class VoidStatement extends Statement {\n kind = NodeKind.VOID;\n\n /** Expression being dropped. */\n expression: Expression;\n}\n\n/** Represents a `while` statement. */\nexport class WhileStatement extends Statement {\n kind = NodeKind.WHILE;\n\n /** Condition expression. */\n condition: Expression;\n /** Statement being looped over. */\n statement: Statement;\n}\n\n/** Finds the first decorator matching the specified kind. */\nexport function findDecorator(kind: DecoratorKind, decorators: DecoratorNode[] | null): DecoratorNode | null {\n if (decorators) {\n for (let i = 0, k = decorators.length; i < k; ++i) {\n let decorator = decorators[i];\n if (decorator.decoratorKind == kind) return decorator;\n }\n }\n return null;\n}\n\n/** Mangles a declaration's name to an internal name. */\nexport function mangleInternalName(declaration: DeclarationStatement, asGlobal: bool = false): string {\n var name = declaration.name.text;\n var parent = declaration.parent;\n if (!parent) return name;\n if (\n declaration.kind == NodeKind.VARIABLEDECLARATION &&\n parent.kind == NodeKind.VARIABLE\n ) { // skip over\n if (!(parent = parent.parent)) return name;\n }\n if (parent.kind == NodeKind.CLASSDECLARATION) {\n return mangleInternalName(parent, asGlobal) + (\n declaration.is(CommonFlags.STATIC)\n ? STATIC_DELIMITER\n : INSTANCE_DELIMITER\n ) + name;\n }\n if (\n parent.kind == NodeKind.NAMESPACEDECLARATION ||\n parent.kind == NodeKind.ENUMDECLARATION\n ) {\n return mangleInternalName(parent, asGlobal) +\n STATIC_DELIMITER + name;\n }\n return asGlobal\n ? name\n : declaration.range.source.internalPath + PATH_DELIMITER + name;\n}\n\n/** Mangles an external to an internal path. */\nexport function mangleInternalPath(path: string): string {\n if (path.endsWith(\".ts\")) path = path.substring(0, path.length - 3);\n return path;\n}\n\n// Helpers\n\n/** Sets the parent node on an array of nodes. */\nfunction setParent(nodes: Node[], parent: Node): void {\n for (let i = 0, k = nodes.length; i < k; ++i) {\n nodes[i].parent = parent;\n }\n}\n\n/** Sets the parent node on an array of nullable nodes. */\nfunction setParentIfNotNull(nodes: (Node | null)[], parent: Node): void {\n for (let i = 0, k = nodes.length; i < k; ++i) {\n let node = nodes[i];\n if (node) node.parent = parent;\n }\n}\n","/**\n * AssemblyScript's intermediate representation describing a program's elements.\n * @module program\n *//***/\n\nimport {\n CommonFlags,\n PATH_DELIMITER,\n STATIC_DELIMITER,\n INSTANCE_DELIMITER,\n LIBRARY_PREFIX,\n GETTER_PREFIX,\n SETTER_PREFIX,\n FILESPACE_PREFIX\n} from \"./common\";\n\nimport {\n Options,\n Feature\n} from \"./compiler\";\n\nimport {\n DiagnosticCode,\n DiagnosticMessage,\n DiagnosticEmitter\n} from \"./diagnostics\";\n\nimport {\n Type,\n TypeKind,\n TypeFlags,\n Signature\n} from \"./types\";\n\nimport {\n Node,\n NodeKind,\n Source,\n Range,\n CommonTypeNode,\n TypeParameterNode,\n DecoratorNode,\n DecoratorKind,\n\n Expression,\n IdentifierExpression,\n LiteralExpression,\n LiteralKind,\n StringLiteralExpression,\n\n ClassDeclaration,\n DeclarationStatement,\n EnumDeclaration,\n EnumValueDeclaration,\n ExportMember,\n ExportStatement,\n FieldDeclaration,\n FunctionDeclaration,\n ImportDeclaration,\n ImportStatement,\n InterfaceDeclaration,\n MethodDeclaration,\n NamespaceDeclaration,\n TypeDeclaration,\n VariableDeclaration,\n VariableLikeDeclarationStatement,\n VariableStatement,\n\n decoratorNameToKind,\n findDecorator\n} from \"./ast\";\n\nimport {\n Module,\n NativeType,\n FunctionRef,\n ExpressionRef,\n ExpressionId,\n BinaryOp,\n UnaryOp,\n\n getExpressionId,\n getGetLocalIndex,\n isTeeLocal,\n getSetLocalValue,\n getBinaryOp,\n getConstValueI32,\n getBinaryLeft,\n getBinaryRight,\n getUnaryOp,\n getExpressionType,\n getLoadBytes,\n isLoadSigned,\n getIfTrue,\n getIfFalse,\n getSelectThen,\n getSelectElse,\n getCallTarget,\n getBlockChildCount,\n getBlockChild,\n getBlockName,\n getConstValueF32,\n getConstValueF64,\n getConstValueI64Low,\n getGetGlobalName\n} from \"./module\";\n\nimport {\n CharCode\n} from \"./util\";\n\nimport {\n Resolver\n} from \"./resolver\";\n\n/** Represents a yet unresolved import. */\nclass QueuedImport {\n localName: string;\n externalName: string;\n externalNameAlt: string;\n declaration: ImportDeclaration | null; // not set if a filespace\n}\n\n/** Represents a yet unresolved export. */\nclass QueuedExport {\n externalName: string;\n isReExport: bool;\n member: ExportMember;\n}\n\n/** Represents a type alias. */\nclass TypeAlias {\n typeParameters: TypeParameterNode[] | null;\n type: CommonTypeNode;\n}\n\n/** Represents a module-level export. */\nclass ModuleExport {\n element: Element;\n identifier: IdentifierExpression;\n}\n\n/** Represents the kind of an operator overload. */\nexport enum OperatorKind {\n INVALID,\n\n // indexed access\n INDEXED_GET, // a[]\n INDEXED_SET, // a[]=b\n UNCHECKED_INDEXED_GET, // unchecked(a[])\n UNCHECKED_INDEXED_SET, // unchecked(a[]=b)\n\n // binary\n ADD, // a + b\n SUB, // a - b\n MUL, // a * b\n DIV, // a / b\n REM, // a % b\n POW, // a ** b\n BITWISE_AND, // a & b\n BITWISE_OR, // a | b\n BITWISE_XOR, // a ^ b\n BITWISE_SHL, // a << b\n BITWISE_SHR, // a >> b\n BITWISE_SHR_U, // a >>> b\n EQ, // a == b\n NE, // a != b\n GT, // a > b\n GE, // a >= b\n LT, // a < b\n LE, // a <= b\n\n // unary prefix\n PLUS, // +a\n MINUS, // -a\n NOT, // !a\n BITWISE_NOT, // ~a\n PREFIX_INC, // ++a\n PREFIX_DEC, // --a\n\n // unary postfix\n POSTFIX_INC, // a++\n POSTFIX_DEC // a--\n\n // not overridable:\n // IDENTITY // a === b\n // LOGICAL_AND // a && b\n // LOGICAL_OR // a || b\n}\n\n/** Returns the operator kind represented by the specified decorator and string argument. */\nfunction operatorKindFromDecorator(decoratorKind: DecoratorKind, arg: string): OperatorKind {\n assert(arg.length);\n switch (decoratorKind) {\n case DecoratorKind.OPERATOR:\n case DecoratorKind.OPERATOR_BINARY: {\n switch (arg.charCodeAt(0)) {\n case CharCode.OPENBRACKET: {\n if (arg == \"[]\") return OperatorKind.INDEXED_GET;\n if (arg == \"[]=\") return OperatorKind.INDEXED_SET;\n break;\n }\n case CharCode.OPENBRACE: {\n if (arg == \"{}\") return OperatorKind.UNCHECKED_INDEXED_GET;\n if (arg == \"{}=\") return OperatorKind.UNCHECKED_INDEXED_SET;\n break;\n }\n case CharCode.PLUS: {\n if (arg == \"+\") return OperatorKind.ADD;\n break;\n }\n case CharCode.MINUS: {\n if (arg == \"-\") return OperatorKind.SUB;\n break;\n }\n case CharCode.ASTERISK: {\n if (arg == \"*\") return OperatorKind.MUL;\n if (arg == \"**\") return OperatorKind.POW;\n break;\n }\n case CharCode.SLASH: {\n if (arg == \"/\") return OperatorKind.DIV;\n break;\n }\n case CharCode.PERCENT: {\n if (arg == \"%\") return OperatorKind.REM;\n break;\n }\n case CharCode.AMPERSAND: {\n if (arg == \"&\") return OperatorKind.BITWISE_AND;\n break;\n }\n case CharCode.BAR: {\n if (arg == \"|\") return OperatorKind.BITWISE_OR;\n break;\n }\n case CharCode.CARET: {\n if (arg == \"^\") return OperatorKind.BITWISE_XOR;\n break;\n }\n case CharCode.EQUALS: {\n if (arg == \"==\") return OperatorKind.EQ;\n break;\n }\n case CharCode.EXCLAMATION: {\n if (arg == \"!=\") return OperatorKind.NE;\n break;\n }\n case CharCode.GREATERTHAN: {\n if (arg == \">\") return OperatorKind.GT;\n if (arg == \">=\") return OperatorKind.GE;\n if (arg == \">>\") return OperatorKind.BITWISE_SHR;\n if (arg == \">>>\") return OperatorKind.BITWISE_SHR_U;\n break;\n }\n case CharCode.LESSTHAN: {\n if (arg == \"<\") return OperatorKind.LT;\n if (arg == \"<=\") return OperatorKind.LE;\n if (arg == \"<<\") return OperatorKind.BITWISE_SHL;\n break;\n }\n }\n break;\n }\n case DecoratorKind.OPERATOR_PREFIX: {\n switch (arg.charCodeAt(0)) {\n case CharCode.PLUS: {\n if (arg == \"+\") return OperatorKind.PLUS;\n if (arg == \"++\") return OperatorKind.PREFIX_INC;\n break;\n }\n case CharCode.MINUS: {\n if (arg == \"-\") return OperatorKind.MINUS;\n if (arg == \"--\") return OperatorKind.PREFIX_DEC;\n break;\n }\n case CharCode.EXCLAMATION: {\n if (arg == \"!\") return OperatorKind.NOT;\n break;\n }\n case CharCode.TILDE: {\n if (arg == \"~\") return OperatorKind.BITWISE_NOT;\n break;\n }\n }\n break;\n }\n case DecoratorKind.OPERATOR_POSTFIX: {\n switch (arg.charCodeAt(0)) {\n case CharCode.PLUS: {\n if (arg == \"++\") return OperatorKind.POSTFIX_INC;\n break;\n }\n case CharCode.MINUS: {\n if (arg == \"--\") return OperatorKind.POSTFIX_DEC;\n break;\n }\n }\n break;\n }\n }\n return OperatorKind.INVALID;\n}\n\nconst noTypesYet = new Map();\n\n/** Represents an AssemblyScript program. */\nexport class Program extends DiagnosticEmitter {\n\n /** Array of source files. */\n sources: Source[];\n /** Resolver instance. */\n resolver: Resolver;\n /** Diagnostic offset used where successively obtaining the next diagnostic. */\n diagnosticsOffset: i32 = 0;\n /** Compiler options. */\n options: Options;\n\n /** Elements by internal name. */\n elementsLookup: Map = new Map();\n /** Class and function instances by internal name. */\n instancesLookup: Map = new Map();\n /** Types by internal name. */\n typesLookup: Map = noTypesYet;\n /** Declared type aliases. */\n typeAliases: Map = new Map();\n /** File-level exports by exported name. */\n fileLevelExports: Map = new Map();\n /** Module-level exports by exported name. */\n moduleLevelExports: Map = new Map();\n /** Classes backing basic types like `i32`. */\n basicClasses: Map = new Map();\n\n /** ArrayBuffer instance reference. */\n arrayBufferInstance: Class | null = null;\n /** Array prototype reference. */\n arrayPrototype: ClassPrototype | null = null;\n /** String instance reference. */\n stringInstance: Class | null = null;\n /** Start function reference. */\n startFunction: FunctionPrototype;\n /** Main function reference, if present. */\n mainFunction: FunctionPrototype | null = null;\n /** Abort function reference, if present. */\n abortInstance: Function | null = null;\n /** Memory allocation function. */\n memoryAllocateInstance: Function | null = null;\n\n /** Whether a garbage collector is present or not. */\n hasGC: bool = false;\n /** Garbage collector allocation function. */\n gcAllocateInstance: Function | null = null;\n /** Garbage collector link function called when a managed object is referenced from a parent. */\n gcLinkInstance: Function | null = null;\n /** Garbage collector mark function called to on reachable managed objects. */\n gcMarkInstance: Function | null = null;\n /** Size of a managed object header. */\n gcHeaderSize: u32 = 0;\n /** Offset of the GC hook. */\n gcHookOffset: u32 = 0;\n\n /** Currently processing filespace. */\n currentFilespace: Filespace;\n\n /** Constructs a new program, optionally inheriting parser diagnostics. */\n constructor(diagnostics: DiagnosticMessage[] | null = null) {\n super(diagnostics);\n this.resolver = new Resolver(this);\n this.sources = [];\n }\n\n /** Gets a source by its exact path. */\n getSource(normalizedPath: string): Source | null {\n var sources = this.sources;\n for (let i = 0, k = sources.length; i < k; ++i) {\n let source = sources[i];\n if (source.normalizedPath == normalizedPath) return source;\n }\n return null;\n }\n\n /** Looks up the source for the specified possibly ambiguous path. */\n lookupSourceByPath(normalizedPathWithoutExtension: string): Source | null {\n var tmp: string;\n return (\n this.getSource(normalizedPathWithoutExtension + \".ts\") ||\n this.getSource(normalizedPathWithoutExtension + \"/index.ts\") ||\n this.getSource((tmp = LIBRARY_PREFIX + normalizedPathWithoutExtension) + \".ts\") ||\n this.getSource( tmp + \"/index.ts\")\n );\n }\n\n /** Initializes the program and its elements prior to compilation. */\n initialize(options: Options): void {\n this.options = options;\n\n // add built-in types\n this.typesLookup = new Map([\n [\"i8\", Type.i8],\n [\"i16\", Type.i16],\n [\"i32\", Type.i32],\n [\"i64\", Type.i64],\n [\"isize\", options.isizeType],\n [\"u8\", Type.u8],\n [\"u16\", Type.u16],\n [\"u32\", Type.u32],\n [\"u64\", Type.u64],\n [\"usize\", options.usizeType],\n [\"bool\", Type.bool],\n [\"f32\", Type.f32],\n [\"f64\", Type.f64],\n [\"void\", Type.void],\n [\"number\", Type.f64],\n [\"boolean\", Type.bool]\n ]);\n\n // add compiler hints\n this.setConstantInteger(\"ASC_TARGET\", Type.i32,\n i64_new(options.isWasm64 ? 2 : 1));\n this.setConstantInteger(\"ASC_NO_TREESHAKING\", Type.bool,\n i64_new(options.noTreeShaking ? 1 : 0, 0));\n this.setConstantInteger(\"ASC_NO_ASSERT\", Type.bool,\n i64_new(options.noAssert ? 1 : 0, 0));\n this.setConstantInteger(\"ASC_MEMORY_BASE\", Type.i32,\n i64_new(options.memoryBase, 0));\n this.setConstantInteger(\"ASC_OPTIMIZE_LEVEL\", Type.i32,\n i64_new(options.optimizeLevelHint, 0));\n this.setConstantInteger(\"ASC_SHRINK_LEVEL\", Type.i32,\n i64_new(options.shrinkLevelHint, 0));\n this.setConstantInteger(\"ASC_FEATURE_MUTABLE_GLOBAL\", Type.bool,\n i64_new(options.hasFeature(Feature.MUTABLE_GLOBAL) ? 1 : 0, 0));\n this.setConstantInteger(\"ASC_FEATURE_SIGN_EXTENSION\", Type.bool,\n i64_new(options.hasFeature(Feature.SIGN_EXTENSION) ? 1 : 0, 0));\n\n // remember deferred elements\n var queuedImports = new Array();\n var queuedExports = new Map();\n var queuedExtends = new Array();\n var queuedImplements = new Array();\n\n // build initial lookup maps of internal names to declarations\n for (let i = 0, k = this.sources.length; i < k; ++i) {\n let source = this.sources[i];\n\n // create one filespace per source\n let filespace = new Filespace(this, source);\n this.elementsLookup.set(filespace.internalName, filespace);\n this.currentFilespace = filespace;\n\n // process this source's statements\n let statements = source.statements;\n for (let j = 0, l = statements.length; j < l; ++j) {\n let statement = statements[j];\n switch (statement.kind) {\n case NodeKind.CLASSDECLARATION: {\n this.initializeClass(statement, queuedExtends, queuedImplements);\n break;\n }\n case NodeKind.ENUMDECLARATION: {\n this.initializeEnum(statement);\n break;\n }\n case NodeKind.EXPORT: {\n this.initializeExports(statement, queuedExports);\n break;\n }\n case NodeKind.FUNCTIONDECLARATION: {\n this.initializeFunction(statement);\n break;\n }\n case NodeKind.IMPORT: {\n this.initializeImports(statement, queuedExports, queuedImports);\n break;\n }\n case NodeKind.INTERFACEDECLARATION: {\n this.initializeInterface(statement);\n break;\n }\n case NodeKind.NAMESPACEDECLARATION: {\n this.initializeNamespace(statement, queuedExtends, queuedImplements);\n break;\n }\n case NodeKind.TYPEDECLARATION: {\n this.initializeTypeAlias(statement);\n break;\n }\n case NodeKind.VARIABLE: {\n this.initializeVariables(statement);\n break;\n }\n }\n }\n }\n\n // queued imports should be resolvable now through traversing exports and queued exports\n for (let i = 0; i < queuedImports.length;) {\n let queuedImport = queuedImports[i];\n let declaration = queuedImport.declaration;\n if (declaration) { // named\n let element = this.tryLocateImport(queuedImport.externalName, queuedExports);\n if (element) {\n this.elementsLookup.set(queuedImport.localName, element);\n queuedImports.splice(i, 1);\n } else {\n if (element = this.tryLocateImport(queuedImport.externalNameAlt, queuedExports)) {\n this.elementsLookup.set(queuedImport.localName, element);\n queuedImports.splice(i, 1);\n } else {\n this.error(\n DiagnosticCode.Module_0_has_no_exported_member_1,\n declaration.range,\n (declaration.parent).path.value,\n declaration.externalName.text\n );\n ++i;\n }\n }\n } else { // filespace\n let element = this.elementsLookup.get(queuedImport.externalName);\n if (element) {\n this.elementsLookup.set(queuedImport.localName, element);\n queuedImports.splice(i, 1);\n } else {\n if (element = this.elementsLookup.get(queuedImport.externalNameAlt)) {\n this.elementsLookup.set(queuedImport.localName, element);\n queuedImports.splice(i, 1);\n } else {\n assert(false); // already reported by the parser not finding the file\n ++i;\n }\n }\n }\n }\n\n // queued exports should be resolvable now that imports are finalized\n for (let [exportName, queuedExport] of queuedExports) {\n let currentExport: QueuedExport | null = queuedExport; // nullable below\n let element: Element | null;\n do {\n if (currentExport.isReExport) {\n if (element = this.fileLevelExports.get(currentExport.externalName)) {\n this.setExportAndCheckLibrary(\n exportName,\n element,\n queuedExport.member.externalName\n );\n break;\n }\n currentExport = queuedExports.get(currentExport.externalName);\n if (!currentExport) {\n this.error(\n DiagnosticCode.Module_0_has_no_exported_member_1,\n queuedExport.member.externalName.range,\n ((queuedExport.member.parent).path).value,\n queuedExport.member.externalName.text\n );\n }\n } else {\n if (\n // normal export\n (element = this.elementsLookup.get(currentExport.externalName)) ||\n // library re-export\n (element = this.elementsLookup.get(currentExport.member.name.text))\n ) {\n this.setExportAndCheckLibrary(\n exportName,\n element,\n queuedExport.member.externalName\n );\n } else {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n queuedExport.member.range, queuedExport.member.name.text\n );\n }\n break;\n }\n } while (currentExport);\n }\n\n // resolve base prototypes of derived classes\n var resolver = this.resolver;\n for (let i = 0, k = queuedExtends.length; i < k; ++i) {\n let derivedPrototype = queuedExtends[i];\n let derivedDeclaration = derivedPrototype.declaration;\n let derivedType = assert(derivedDeclaration.extendsType);\n let baseElement = resolver.resolveIdentifier(derivedType.name, null); // reports\n if (!baseElement) continue;\n if (baseElement.kind == ElementKind.CLASS_PROTOTYPE) {\n let basePrototype = baseElement;\n derivedPrototype.basePrototype = basePrototype;\n } else {\n this.error(\n DiagnosticCode.A_class_may_only_extend_another_class,\n derivedType.range\n );\n }\n }\n\n // set up global aliases\n {\n let globalAliases = options.globalAliases;\n if (globalAliases) {\n for (let [alias, name] of globalAliases) {\n if (!name.length) continue; // explicitly disabled\n let element = this.elementsLookup.get(name);\n if (element) this.elementsLookup.set(alias, element);\n else throw new Error(\"element not found: \" + name);\n }\n }\n }\n\n // register 'ArrayBuffer'\n if (this.elementsLookup.has(\"ArrayBuffer\")) {\n let element = assert(this.elementsLookup.get(\"ArrayBuffer\"));\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n this.arrayBufferInstance = resolver.resolveClass(element, null);\n }\n\n // register 'Array'\n if (this.elementsLookup.has(\"Array\")) {\n let element = assert(this.elementsLookup.get(\"Array\"));\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n this.arrayPrototype = element;\n }\n\n // register 'String'\n if (this.elementsLookup.has(\"String\")) {\n let element = assert(this.elementsLookup.get(\"String\"));\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n let instance = resolver.resolveClass(element, null);\n if (instance) {\n if (this.typesLookup.has(\"string\")) {\n let declaration = (element).declaration;\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, declaration.programLevelInternalName\n );\n } else {\n this.stringInstance = instance;\n this.typesLookup.set(\"string\", instance.type);\n }\n }\n }\n\n // register classes backing basic types\n this.registerBasicClass(TypeKind.I8, \"I8\");\n this.registerBasicClass(TypeKind.I16, \"I16\");\n this.registerBasicClass(TypeKind.I32, \"I32\");\n this.registerBasicClass(TypeKind.I64, \"I64\");\n this.registerBasicClass(TypeKind.ISIZE, \"Isize\");\n this.registerBasicClass(TypeKind.U8, \"U8\");\n this.registerBasicClass(TypeKind.U16, \"U16\");\n this.registerBasicClass(TypeKind.U32, \"U32\");\n this.registerBasicClass(TypeKind.U64, \"U64\");\n this.registerBasicClass(TypeKind.USIZE, \"Usize\");\n this.registerBasicClass(TypeKind.BOOL, \"Bool\");\n this.registerBasicClass(TypeKind.F32, \"F32\");\n this.registerBasicClass(TypeKind.F64, \"F64\");\n\n // register 'start'\n {\n let element = assert(this.elementsLookup.get(\"start\"));\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.startFunction = element;\n }\n\n // register 'main' if present\n if (this.moduleLevelExports.has(\"main\")) {\n let element = (this.moduleLevelExports.get(\"main\")).element;\n if (\n element.kind == ElementKind.FUNCTION_PROTOTYPE &&\n !(element).isAny(CommonFlags.GENERIC | CommonFlags.AMBIENT)\n ) {\n (element).set(CommonFlags.MAIN);\n this.mainFunction = element;\n }\n }\n\n // register 'abort' if present\n if (this.elementsLookup.has(\"abort\")) {\n let element = this.elementsLookup.get(\"abort\");\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let instance = this.resolver.resolveFunction(element, null);\n if (instance) this.abortInstance = instance;\n }\n\n // register 'memory.allocate' if present\n if (this.elementsLookup.has(\"memory\")) {\n let element = this.elementsLookup.get(\"memory\");\n let members = element.members;\n if (members) {\n if (members.has(\"allocate\")) {\n element = assert(members.get(\"allocate\"));\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let instance = this.resolver.resolveFunction(element, null);\n if (instance) this.memoryAllocateInstance = instance;\n }\n }\n }\n\n // register GC hooks if present\n if (\n this.elementsLookup.has(\"__gc_allocate\") &&\n this.elementsLookup.has(\"__gc_link\") &&\n this.elementsLookup.has(\"__gc_mark\")\n ) {\n // __gc_allocate(usize, (ref: usize) => void): usize\n let element = this.elementsLookup.get(\"__gc_allocate\");\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let gcAllocateInstance = assert(this.resolver.resolveFunction(element, null));\n let signature = gcAllocateInstance.signature;\n assert(signature.parameterTypes.length == 2);\n assert(signature.parameterTypes[0] == this.options.usizeType);\n assert(signature.parameterTypes[1].signatureReference);\n assert(signature.returnType == this.options.usizeType);\n\n // __gc_link(usize, usize): void\n element = this.elementsLookup.get(\"__gc_link\");\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let gcLinkInstance = assert(this.resolver.resolveFunction(element, null));\n signature = gcLinkInstance.signature;\n assert(signature.parameterTypes.length == 2);\n assert(signature.parameterTypes[0] == this.options.usizeType);\n assert(signature.parameterTypes[1] == this.options.usizeType);\n assert(signature.returnType == Type.void);\n\n // __gc_mark(usize): void\n element = this.elementsLookup.get(\"__gc_mark\");\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let gcMarkInstance = assert(this.resolver.resolveFunction(element, null));\n signature = gcMarkInstance.signature;\n assert(signature.parameterTypes.length == 1);\n assert(signature.parameterTypes[0] == this.options.usizeType);\n assert(signature.returnType == Type.void);\n\n this.gcAllocateInstance = gcAllocateInstance;\n this.gcLinkInstance = gcLinkInstance;\n this.gcMarkInstance = gcMarkInstance;\n let gcHookOffset = 2 * options.usizeType.byteSize; // .next + .prev\n this.gcHookOffset = gcHookOffset;\n this.gcHeaderSize = (gcHookOffset + 4 + 7) & ~7; // + .hook index + alignment\n this.hasGC = true;\n }\n }\n\n private registerBasicClass(typeKind: TypeKind, className: string): void {\n if (this.elementsLookup.has(className)) {\n let element = assert(this.elementsLookup.get(className));\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n let classElement = this.resolver.resolveClass(element, null);\n if (classElement) this.basicClasses.set(typeKind, classElement);\n }\n }\n\n /** Sets a constant integer value. */\n setConstantInteger(globalName: string, type: Type, value: I64): void {\n assert(type.is(TypeFlags.INTEGER));\n var global = new Global(this, globalName, globalName, type, null, DecoratorFlags.NONE)\n .withConstantIntegerValue(value);\n global.set(CommonFlags.RESOLVED);\n this.elementsLookup.set(globalName, global);\n }\n\n /** Sets a constant float value. */\n setConstantFloat(globalName: string, type: Type, value: f64): void {\n assert(type.is(TypeFlags.FLOAT));\n var global = new Global(this, globalName, globalName, type, null, DecoratorFlags.NONE)\n .withConstantFloatValue(value);\n global.set(CommonFlags.RESOLVED);\n this.elementsLookup.set(globalName, global);\n }\n\n /** Tries to locate an import by traversing exports and queued exports. */\n private tryLocateImport(\n externalName: string,\n queuedNamedExports: Map\n ): Element | null {\n var element: Element | null;\n var fileLevelExports = this.fileLevelExports;\n do {\n if (element = fileLevelExports.get(externalName)) return element;\n let queuedExport = queuedNamedExports.get(externalName);\n if (!queuedExport) break;\n if (queuedExport.isReExport) {\n externalName = queuedExport.externalName;\n continue;\n }\n return this.elementsLookup.get(queuedExport.externalName);\n } while (true);\n return null;\n }\n\n /** Checks that only supported decorators are present. */\n private checkDecorators(\n decorators: DecoratorNode[],\n acceptedFlags: DecoratorFlags\n ): DecoratorFlags {\n var presentFlags = DecoratorFlags.NONE;\n for (let i = 0, k = decorators.length; i < k; ++i) {\n let decorator = decorators[i];\n let kind = decoratorNameToKind(decorator.name);\n let flag = decoratorKindToFlag(kind);\n if (flag) {\n if (flag == DecoratorFlags.BUILTIN) {\n if (decorator.range.source.isLibrary) {\n presentFlags |= flag;\n } else {\n this.error(\n DiagnosticCode.Decorator_0_is_not_valid_here,\n decorator.range, decorator.name.range.toString()\n );\n }\n } else if (!(acceptedFlags & flag)) {\n this.error(\n DiagnosticCode.Decorator_0_is_not_valid_here,\n decorator.range, decorator.name.range.toString()\n );\n } else if (presentFlags & flag) {\n this.error(\n DiagnosticCode.Duplicate_decorator,\n decorator.range, decorator.name.range.toString()\n );\n } else {\n presentFlags |= flag;\n }\n }\n }\n return presentFlags;\n }\n\n /** Checks and sets up global options of an element. */\n private checkGlobal(\n element: Element,\n declaration: DeclarationStatement\n ): void {\n var parentNode = declaration.parent;\n // alias globally if explicitly annotated @global or exported from a top-level library file\n if (\n (element.hasDecorator(DecoratorFlags.GLOBAL)) ||\n (\n declaration.range.source.isLibrary &&\n element.is(CommonFlags.EXPORT) &&\n (\n assert(parentNode).kind == NodeKind.SOURCE ||\n (\n parentNode).kind == NodeKind.VARIABLE &&\n assert((parentNode).parent).kind == NodeKind.SOURCE\n )\n )\n ) {\n let globalName = declaration.programLevelInternalName;\n if (this.elementsLookup.has(globalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, element.internalName\n );\n } else {\n this.elementsLookup.set(globalName, element);\n }\n }\n // builtins use the global name directly\n if (element.hasDecorator(DecoratorFlags.BUILTIN)) {\n element.internalName = declaration.programLevelInternalName;\n }\n }\n\n /** Initializes a class declaration. */\n private initializeClass(\n declaration: ClassDeclaration,\n queuedExtends: ClassPrototype[],\n queuedImplements: ClassPrototype[],\n namespace: Element | null = null\n ): void {\n var internalName = declaration.fileLevelInternalName;\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n\n var decorators = declaration.decorators;\n var simpleName = declaration.name.text;\n var prototype = new ClassPrototype(\n this,\n simpleName,\n internalName,\n declaration,\n decorators\n ? this.checkDecorators(decorators,\n DecoratorFlags.GLOBAL |\n DecoratorFlags.SEALED |\n DecoratorFlags.UNMANAGED\n )\n : DecoratorFlags.NONE\n );\n prototype.parent = namespace;\n this.elementsLookup.set(internalName, prototype);\n\n var implementsTypes = declaration.implementsTypes;\n if (implementsTypes) {\n let numImplementsTypes = implementsTypes.length;\n if (prototype.hasDecorator(DecoratorFlags.UNMANAGED)) {\n if (numImplementsTypes) {\n this.error(\n DiagnosticCode.Unmanaged_classes_cannot_implement_interfaces,\n Range.join(\n declaration.name.range,\n implementsTypes[numImplementsTypes - 1].range\n )\n );\n }\n\n // remember classes that implement interfaces\n } else if (numImplementsTypes) {\n for (let i = 0; i < numImplementsTypes; ++i) {\n this.warning( // TODO\n DiagnosticCode.Operation_not_supported,\n implementsTypes[i].range\n );\n }\n queuedImplements.push(prototype);\n }\n }\n\n // remember classes that extend another one\n if (declaration.extendsType) queuedExtends.push(prototype);\n\n // add as namespace member if applicable\n if (namespace) {\n if (namespace.members) {\n if (namespace.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n namespace.members = new Map();\n }\n namespace.members.set(simpleName, prototype);\n if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\n prototype.set(CommonFlags.MODULE_EXPORT);\n }\n\n // otherwise add to file-level exports if exported\n } else if (prototype.is(CommonFlags.EXPORT)) {\n if (this.fileLevelExports.has(internalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n declaration.name.range, internalName\n );\n return;\n }\n this.fileLevelExports.set(internalName, prototype);\n this.currentFilespace.members.set(simpleName, prototype);\n if (prototype.is(CommonFlags.EXPORT) && declaration.range.source.isEntry) {\n if (this.moduleLevelExports.has(simpleName)) {\n let existingExport = this.moduleLevelExports.get(simpleName);\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n declaration.name.range, existingExport.element.internalName\n );\n return;\n }\n prototype.set(CommonFlags.MODULE_EXPORT);\n this.moduleLevelExports.set(simpleName, {\n element: prototype,\n identifier: declaration.name\n });\n }\n }\n\n // initialize members\n var memberDeclarations = declaration.members;\n for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\n let memberDeclaration = memberDeclarations[i];\n switch (memberDeclaration.kind) {\n case NodeKind.FIELDDECLARATION: {\n this.initializeField(memberDeclaration, prototype);\n break;\n }\n case NodeKind.METHODDECLARATION: {\n if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\n this.initializeAccessor(memberDeclaration, prototype);\n } else {\n this.initializeMethod(memberDeclaration, prototype);\n }\n break;\n }\n case NodeKind.INDEXSIGNATUREDECLARATION: break; // ignored for now\n default: {\n assert(false); // should have been reported while parsing\n return;\n }\n }\n }\n\n this.checkGlobal(prototype, declaration);\n }\n\n /** Initializes a field of a class or interface. */\n private initializeField(\n declaration: FieldDeclaration,\n classPrototype: ClassPrototype\n ): void {\n var name = declaration.name.text;\n var internalName = declaration.fileLevelInternalName;\n var decorators = declaration.decorators;\n var isInterface = classPrototype.kind == ElementKind.INTERFACE_PROTOTYPE;\n\n // static fields become global variables\n if (declaration.is(CommonFlags.STATIC)) {\n if (isInterface) {\n // should have been reported while parsing\n assert(false);\n }\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n if (classPrototype.members) {\n if (classPrototype.members.has(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n classPrototype.members = new Map();\n }\n let staticField = new Global(\n this,\n name,\n internalName,\n Type.void, // resolved later on\n declaration,\n decorators\n ? this.checkDecorators(decorators, DecoratorFlags.INLINE)\n : DecoratorFlags.NONE\n );\n staticField.parent = classPrototype;\n classPrototype.members.set(name, staticField);\n this.elementsLookup.set(internalName, staticField);\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\n staticField.set(CommonFlags.MODULE_EXPORT);\n }\n\n if (staticField.hasDecorator(DecoratorFlags.INLINE) && !staticField.is(CommonFlags.READONLY)) {\n this.error(\n DiagnosticCode.Decorator_0_is_not_valid_here,\n assert(findDecorator(DecoratorKind.INLINE, decorators)).range, \"inline\"\n );\n }\n\n // instance fields are remembered until resolved\n } else {\n if (isInterface) {\n // should have been reported while parsing\n assert(!declaration.isAny(CommonFlags.ABSTRACT | CommonFlags.GET | CommonFlags.SET));\n }\n if (classPrototype.instanceMembers) {\n if (classPrototype.instanceMembers.has(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n classPrototype.instanceMembers = new Map();\n }\n let instanceField = new FieldPrototype(\n classPrototype,\n name,\n internalName,\n declaration\n );\n if (decorators) this.checkDecorators(decorators, DecoratorFlags.NONE);\n classPrototype.instanceMembers.set(name, instanceField);\n }\n }\n\n /** Initializes a method of a class or interface. */\n private initializeMethod(\n declaration: MethodDeclaration,\n classPrototype: ClassPrototype\n ): void {\n var simpleName = declaration.name.text;\n var internalName = declaration.fileLevelInternalName;\n var prototype: FunctionPrototype | null = null;\n\n var decorators = declaration.decorators;\n var decoratorFlags = DecoratorFlags.NONE;\n if (decorators) {\n decoratorFlags = this.checkDecorators(decorators,\n DecoratorFlags.OPERATOR_BINARY |\n DecoratorFlags.OPERATOR_PREFIX |\n DecoratorFlags.OPERATOR_POSTFIX |\n DecoratorFlags.INLINE\n );\n }\n\n // static methods become global functions\n if (declaration.is(CommonFlags.STATIC)) {\n assert(declaration.name.kind != NodeKind.CONSTRUCTOR);\n\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0, declaration.name.range,\n internalName\n );\n return;\n }\n if (classPrototype.members) {\n if (classPrototype.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n classPrototype.members = new Map();\n }\n prototype = new FunctionPrototype(\n this,\n simpleName,\n internalName,\n declaration,\n classPrototype,\n decoratorFlags\n );\n classPrototype.members.set(simpleName, prototype);\n this.elementsLookup.set(internalName, prototype);\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\n prototype.set(CommonFlags.MODULE_EXPORT);\n }\n\n // instance methods are remembered until resolved\n } else {\n if (classPrototype.instanceMembers) {\n if (classPrototype.instanceMembers.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n classPrototype.instanceMembers = new Map();\n }\n prototype = new FunctionPrototype(\n this,\n simpleName,\n internalName,\n declaration,\n classPrototype,\n decoratorFlags\n );\n // if (classPrototype.isUnmanaged && instancePrototype.isAbstract) {\n // this.error( Unmanaged classes cannot declare abstract methods. );\n // }\n if (declaration.name.kind == NodeKind.CONSTRUCTOR) {\n if (classPrototype.constructorPrototype) {\n this.error(\n DiagnosticCode.Multiple_constructor_implementations_are_not_allowed,\n declaration.name.range\n );\n } else {\n prototype.set(CommonFlags.CONSTRUCTOR);\n classPrototype.constructorPrototype = prototype;\n }\n } else {\n classPrototype.instanceMembers.set(simpleName, prototype);\n }\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\n prototype.set(CommonFlags.MODULE_EXPORT);\n }\n }\n\n this.checkOperatorOverloads(declaration.decorators, prototype, classPrototype);\n }\n\n private checkOperatorOverloads(\n decorators: DecoratorNode[] | null,\n prototype: FunctionPrototype,\n classPrototype: ClassPrototype\n ): void {\n if (decorators) {\n for (let i = 0, k = decorators.length; i < k; ++i) {\n let decorator = decorators[i];\n switch (decorator.decoratorKind) {\n case DecoratorKind.OPERATOR:\n case DecoratorKind.OPERATOR_BINARY:\n case DecoratorKind.OPERATOR_PREFIX:\n case DecoratorKind.OPERATOR_POSTFIX: {\n let numArgs = decorator.arguments && decorator.arguments.length || 0;\n if (numArgs == 1) {\n let firstArg = (decorator.arguments)[0];\n if (\n firstArg.kind == NodeKind.LITERAL &&\n (firstArg).literalKind == LiteralKind.STRING\n ) {\n let kind = operatorKindFromDecorator(\n decorator.decoratorKind,\n (firstArg).value\n );\n if (kind == OperatorKind.INVALID) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n firstArg.range\n );\n } else {\n let overloads = classPrototype.overloadPrototypes;\n if (overloads.has(kind)) {\n this.error(\n DiagnosticCode.Duplicate_function_implementation,\n firstArg.range\n );\n } else {\n prototype.operatorKind = kind;\n overloads.set(kind, prototype);\n }\n }\n } else {\n this.error(\n DiagnosticCode.String_literal_expected,\n firstArg.range\n );\n }\n } else {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n decorator.range, \"1\", numArgs.toString(0)\n );\n }\n }\n }\n }\n }\n }\n\n private initializeAccessor(\n declaration: MethodDeclaration,\n classPrototype: ClassPrototype\n ): void {\n var simpleName = declaration.name.text;\n var internalPropertyName = declaration.fileLevelInternalName;\n var propertyElement = this.elementsLookup.get(internalPropertyName);\n var isGetter = declaration.is(CommonFlags.GET);\n var isNew = false;\n if (propertyElement) {\n if (\n propertyElement.kind != ElementKind.PROPERTY ||\n (isGetter\n ? (propertyElement).getterPrototype\n : (propertyElement).setterPrototype\n ) != null\n ) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalPropertyName\n );\n return;\n }\n } else {\n propertyElement = new Property(\n this,\n simpleName,\n internalPropertyName,\n classPrototype\n );\n isNew = true;\n }\n\n var decorators = declaration.decorators;\n var decoratorFlags = DecoratorFlags.NONE;\n if (decorators) {\n decoratorFlags = this.checkDecorators(decorators,\n DecoratorFlags.INLINE\n );\n }\n\n var baseName = (isGetter ? GETTER_PREFIX : SETTER_PREFIX) + simpleName;\n\n // static accessors become global functions\n if (declaration.is(CommonFlags.STATIC)) {\n let staticName = classPrototype.internalName + STATIC_DELIMITER + baseName;\n if (this.elementsLookup.has(staticName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, staticName\n );\n return;\n }\n let staticPrototype = new FunctionPrototype(\n this,\n baseName,\n staticName,\n declaration,\n null,\n decoratorFlags\n );\n if (isGetter) {\n (propertyElement).getterPrototype = staticPrototype;\n } else {\n (propertyElement).setterPrototype = staticPrototype;\n }\n if (isNew) {\n if (classPrototype.members) {\n if (classPrototype.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, staticName\n );\n return;\n }\n } else {\n classPrototype.members = new Map();\n }\n classPrototype.members.set(simpleName, propertyElement); // check above\n } else {\n assert(classPrototype.members && classPrototype.members.has(simpleName));\n }\n this.elementsLookup.set(internalPropertyName, propertyElement);\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\n propertyElement.set(CommonFlags.MODULE_EXPORT);\n }\n\n // instance accessors are remembered until resolved\n } else {\n let instanceName = classPrototype.internalName + INSTANCE_DELIMITER + baseName;\n if (classPrototype.instanceMembers) {\n if (classPrototype.instanceMembers.has(baseName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalPropertyName\n );\n return;\n }\n } else {\n classPrototype.instanceMembers = new Map();\n }\n let instancePrototype = new FunctionPrototype(\n this,\n baseName,\n instanceName,\n declaration,\n classPrototype,\n decoratorFlags\n );\n if (isGetter) {\n (propertyElement).getterPrototype = instancePrototype;\n } else {\n (propertyElement).setterPrototype = instancePrototype;\n }\n classPrototype.instanceMembers.set(baseName, propertyElement);\n this.elementsLookup.set(internalPropertyName, propertyElement);\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\n propertyElement.set(CommonFlags.MODULE_EXPORT);\n instancePrototype.set(CommonFlags.MODULE_EXPORT);\n }\n }\n }\n\n private initializeEnum(\n declaration: EnumDeclaration,\n namespace: Element | null = null\n ): void {\n var internalName = declaration.fileLevelInternalName;\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n var simpleName = declaration.name.text;\n var element = new Enum(this, simpleName, internalName, declaration);\n element.parent = namespace;\n this.elementsLookup.set(internalName, element);\n\n if (namespace) {\n if (namespace.members) {\n if (namespace.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n namespace.members = new Map();\n }\n namespace.members.set(simpleName, element);\n if (namespace.is(CommonFlags.MODULE_EXPORT) && element.is(CommonFlags.EXPORT)) {\n element.set(CommonFlags.MODULE_EXPORT);\n }\n } else if (element.is(CommonFlags.EXPORT)) { // no namespace\n if (this.fileLevelExports.has(internalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n declaration.name.range, internalName\n );\n return;\n }\n this.fileLevelExports.set(internalName, element);\n this.currentFilespace.members.set(simpleName, element);\n if (declaration.range.source.isEntry) {\n if (this.moduleLevelExports.has(simpleName)) {\n let existingExport = this.moduleLevelExports.get(simpleName);\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n declaration.name.range, existingExport.element.internalName\n );\n return;\n }\n element.set(CommonFlags.MODULE_EXPORT);\n this.moduleLevelExports.set(simpleName, {\n element,\n identifier: declaration.name\n });\n }\n }\n\n var values = declaration.values;\n for (let i = 0, k = values.length; i < k; ++i) {\n this.initializeEnumValue(values[i], element);\n }\n\n this.checkGlobal(element, declaration);\n }\n\n private initializeEnumValue(\n declaration: EnumValueDeclaration,\n enm: Enum\n ): void {\n var name = declaration.name.text;\n var internalName = declaration.fileLevelInternalName;\n if (enm.members) {\n if (enm.members.has(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n enm.members = new Map();\n }\n var value = new EnumValue(enm, this, name, internalName, declaration);\n enm.members.set(name, value);\n if (enm.is(CommonFlags.MODULE_EXPORT)) {\n value.set(CommonFlags.MODULE_EXPORT);\n }\n }\n\n private initializeExports(\n statement: ExportStatement,\n queuedExports: Map\n ): void {\n var members = statement.members;\n if (members) { // named\n for (let i = 0, k = members.length; i < k; ++i) {\n this.initializeExport(members[i], statement.internalPath, queuedExports);\n }\n } else { // TODO: filespace\n this.error(\n DiagnosticCode.Operation_not_supported,\n statement.range\n );\n }\n }\n\n private setExportAndCheckLibrary(\n internalName: string,\n element: Element,\n externalIdentifier: IdentifierExpression\n ): void {\n // add to file-level exports\n this.fileLevelExports.set(internalName, element);\n\n // add to filespace\n var internalPath = externalIdentifier.range.source.internalPath;\n var prefix = FILESPACE_PREFIX + internalPath;\n var filespace = this.elementsLookup.get(prefix);\n if (!filespace) filespace = assert(this.elementsLookup.get(prefix + PATH_DELIMITER + \"index\"));\n assert(filespace.kind == ElementKind.FILESPACE);\n var simpleName = externalIdentifier.text;\n (filespace).members.set(simpleName, element);\n\n // add global alias if a top-level export of a library file\n var source = externalIdentifier.range.source;\n if (source.isLibrary) {\n if (this.elementsLookup.has(simpleName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n externalIdentifier.range, simpleName\n );\n } else {\n element.internalName = simpleName;\n this.elementsLookup.set(simpleName, element);\n }\n\n // add module level export if a top-level export of an entry file\n } else if (source.isEntry) {\n this.moduleLevelExports.set(externalIdentifier.text, {\n element,\n identifier: externalIdentifier\n });\n }\n }\n\n private initializeExport(\n member: ExportMember,\n internalPath: string | null,\n queuedExports: Map\n ): void {\n var externalName = member.range.source.internalPath + PATH_DELIMITER + member.externalName.text;\n if (this.fileLevelExports.has(externalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n member.externalName.range, externalName\n );\n return;\n }\n var referencedName: string;\n var referencedElement: Element | null;\n var queuedExport: QueuedExport | null;\n\n // export local element\n if (internalPath == null) {\n referencedName = member.range.source.internalPath + PATH_DELIMITER + member.name.text;\n\n // resolve right away if the element exists\n if (this.elementsLookup.has(referencedName)) {\n this.setExportAndCheckLibrary(\n externalName,\n this.elementsLookup.get(referencedName),\n member.externalName\n );\n return;\n }\n\n // otherwise queue it\n if (queuedExports.has(externalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n member.externalName.range, externalName\n );\n return;\n }\n queuedExport = new QueuedExport();\n queuedExport.isReExport = false;\n queuedExport.externalName = referencedName; // -> here: local name\n queuedExport.member = member;\n queuedExports.set(externalName, queuedExport);\n\n // export external element\n } else {\n referencedName = internalPath + PATH_DELIMITER + member.name.text;\n\n // resolve right away if the export exists\n referencedElement = this.elementsLookup.get(referencedName);\n if (referencedElement) {\n this.setExportAndCheckLibrary(\n externalName,\n referencedElement,\n member.externalName\n );\n return;\n }\n\n // walk already known queued exports\n let seen = new Set();\n while (queuedExport = queuedExports.get(referencedName)) {\n if (queuedExport.isReExport) {\n referencedElement = this.fileLevelExports.get(queuedExport.externalName);\n if (referencedElement) {\n this.setExportAndCheckLibrary(\n externalName,\n referencedElement,\n member.externalName\n );\n return;\n }\n referencedName = queuedExport.externalName;\n if (seen.has(queuedExport)) break;\n seen.add(queuedExport);\n } else {\n referencedElement = this.elementsLookup.get(queuedExport.externalName);\n if (referencedElement) {\n this.setExportAndCheckLibrary(\n externalName,\n referencedElement,\n member.externalName\n );\n return;\n }\n break;\n }\n }\n\n // otherwise queue it\n if (queuedExports.has(externalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n member.externalName.range, externalName\n );\n return;\n }\n queuedExport = new QueuedExport();\n queuedExport.isReExport = true;\n queuedExport.externalName = referencedName; // -> here: external name\n queuedExport.member = member;\n queuedExports.set(externalName, queuedExport);\n }\n }\n\n private initializeFunction(\n declaration: FunctionDeclaration,\n namespace: Element | null = null\n ): void {\n var internalName = declaration.fileLevelInternalName;\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n var simpleName = declaration.name.text;\n var decorators = declaration.decorators;\n var prototype = new FunctionPrototype(\n this,\n simpleName,\n internalName,\n declaration,\n null,\n decorators\n ? this.checkDecorators(decorators,\n DecoratorFlags.GLOBAL |\n DecoratorFlags.INLINE |\n DecoratorFlags.EXTERNAL\n )\n : DecoratorFlags.NONE\n );\n prototype.parent = namespace;\n this.elementsLookup.set(internalName, prototype);\n\n if (namespace) {\n if (namespace.members) {\n if (namespace.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n namespace.members = new Map();\n }\n namespace.members.set(simpleName, prototype);\n if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\n prototype.parent = namespace;\n prototype.set(CommonFlags.MODULE_EXPORT);\n }\n } else if (prototype.is(CommonFlags.EXPORT)) { // no namespace\n if (this.fileLevelExports.has(internalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n declaration.name.range, internalName\n );\n return;\n }\n this.fileLevelExports.set(internalName, prototype);\n this.currentFilespace.members.set(simpleName, prototype);\n if (declaration.range.source.isEntry) {\n if (this.moduleLevelExports.has(simpleName)) {\n let existingExport = this.moduleLevelExports.get(simpleName);\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, existingExport.element.internalName\n );\n return;\n }\n prototype.set(CommonFlags.MODULE_EXPORT);\n this.moduleLevelExports.set(simpleName, {\n element: prototype,\n identifier: declaration.name\n });\n }\n }\n\n this.checkGlobal(prototype, declaration);\n }\n\n private initializeImports(\n statement: ImportStatement,\n queuedExports: Map,\n queuedImports: QueuedImport[]\n ): void {\n var declarations = statement.declarations;\n if (declarations) {\n for (let i = 0, k = declarations.length; i < k; ++i) {\n this.initializeImport(\n declarations[i],\n statement.internalPath,\n queuedExports, queuedImports\n );\n }\n } else if (statement.namespaceName) { // import * as simpleName from \"file\"\n let simpleName = statement.namespaceName.text;\n let internalName = (\n statement.range.source.internalPath +\n PATH_DELIMITER +\n simpleName\n );\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n statement.namespaceName.range,\n internalName\n );\n return;\n }\n\n // resolve right away if the exact filespace exists\n let filespace = this.elementsLookup.get(statement.internalPath);\n if (filespace) {\n this.elementsLookup.set(internalName, filespace);\n return;\n }\n\n // otherwise queue it\n let queuedImport = new QueuedImport();\n queuedImport.localName = internalName;\n let externalName = FILESPACE_PREFIX + statement.internalPath;\n queuedImport.externalName = externalName;\n queuedImport.externalNameAlt = externalName + PATH_DELIMITER + \"index\";\n queuedImport.declaration = null; // filespace\n queuedImports.push(queuedImport);\n }\n }\n\n private initializeImport(\n declaration: ImportDeclaration,\n internalPath: string,\n queuedNamedExports: Map,\n queuedImports: QueuedImport[]\n ): void {\n var localName = declaration.fileLevelInternalName;\n if (this.elementsLookup.has(localName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, localName\n );\n return;\n }\n\n var externalName = internalPath + PATH_DELIMITER + declaration.externalName.text;\n\n // resolve right away if the exact export exists\n var element: Element | null;\n if (element = this.fileLevelExports.get(externalName)) {\n this.elementsLookup.set(localName, element);\n return;\n }\n\n // otherwise queue it\n const indexPart = PATH_DELIMITER + \"index\";\n var queuedImport = new QueuedImport();\n queuedImport.localName = localName;\n if (internalPath.endsWith(indexPart)) {\n queuedImport.externalName = externalName; // try exact first\n queuedImport.externalNameAlt = (\n internalPath.substring(0, internalPath.length - indexPart.length + 1) +\n declaration.externalName.text\n );\n } else {\n queuedImport.externalName = externalName; // try exact first\n queuedImport.externalNameAlt = (\n internalPath +\n indexPart +\n PATH_DELIMITER +\n declaration.externalName.text\n );\n }\n queuedImport.declaration = declaration; // named\n queuedImports.push(queuedImport);\n }\n\n private initializeInterface(declaration: InterfaceDeclaration, namespace: Element | null = null): void {\n var internalName = declaration.fileLevelInternalName;\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n\n var decorators = declaration.decorators;\n var simpleName = declaration.name.text;\n var prototype = new InterfacePrototype(\n this,\n simpleName,\n internalName,\n declaration,\n decorators\n ? this.checkDecorators(decorators, DecoratorFlags.GLOBAL)\n : DecoratorFlags.NONE\n );\n prototype.parent = namespace;\n this.elementsLookup.set(internalName, prototype);\n\n if (namespace) {\n if (namespace.members) {\n if (namespace.members.has(prototype.internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n namespace.members = new Map();\n }\n namespace.members.set(prototype.internalName, prototype);\n if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\n prototype.set(CommonFlags.MODULE_EXPORT);\n }\n } else if (prototype.is(CommonFlags.EXPORT)) { // no namespace\n if (this.fileLevelExports.has(internalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n declaration.name.range, internalName\n );\n return;\n }\n this.fileLevelExports.set(internalName, prototype);\n this.currentFilespace.members.set(simpleName, prototype);\n if (declaration.range.source.isEntry) {\n if (this.moduleLevelExports.has(simpleName)) {\n let existingExport = this.moduleLevelExports.get(simpleName);\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, existingExport.element.internalName\n );\n return;\n }\n prototype.set(CommonFlags.MODULE_EXPORT);\n this.moduleLevelExports.set(simpleName, {\n element: prototype,\n identifier: declaration.name\n });\n }\n }\n\n var memberDeclarations = declaration.members;\n for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\n let memberDeclaration = memberDeclarations[i];\n switch (memberDeclaration.kind) {\n\n case NodeKind.FIELDDECLARATION: {\n this.initializeField(memberDeclaration, prototype);\n break;\n }\n case NodeKind.METHODDECLARATION: {\n if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\n this.initializeAccessor(memberDeclaration, prototype);\n } else {\n this.initializeMethod(memberDeclaration, prototype);\n }\n break;\n }\n default: {\n throw new Error(\"interface member expected\");\n }\n }\n }\n\n this.checkGlobal(prototype, declaration);\n }\n\n private initializeNamespace(\n declaration: NamespaceDeclaration,\n queuedExtends: ClassPrototype[],\n queuedImplements: ClassPrototype[],\n parentNamespace: Element | null = null\n ): void {\n var internalName = declaration.fileLevelInternalName;\n var simpleName = declaration.name.text;\n var namespace = this.elementsLookup.get(internalName);\n if (!namespace) {\n namespace = new Namespace(this, simpleName, internalName, declaration);\n namespace.parent = parentNamespace;\n this.elementsLookup.set(internalName, namespace);\n this.checkGlobal(namespace, declaration);\n }\n\n if (parentNamespace) {\n if (parentNamespace.members) {\n if (parentNamespace.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n parentNamespace.members = new Map();\n }\n parentNamespace.members.set(simpleName, namespace);\n if (parentNamespace.is(CommonFlags.MODULE_EXPORT) && namespace.is(CommonFlags.EXPORT)) {\n namespace.set(CommonFlags.MODULE_EXPORT);\n }\n } else if (namespace.is(CommonFlags.EXPORT)) { // no parent namespace\n let existingExport = this.fileLevelExports.get(internalName);\n if (existingExport) {\n if (!existingExport.is(CommonFlags.EXPORT)) {\n this.error(\n DiagnosticCode.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local,\n declaration.name.range, namespace.internalName\n ); // recoverable\n }\n namespace = existingExport; // join\n } else {\n this.fileLevelExports.set(internalName, namespace);\n }\n this.currentFilespace.members.set(simpleName, namespace);\n if (declaration.range.source.isEntry) {\n if (this.moduleLevelExports.has(simpleName)) {\n let existingExport = this.moduleLevelExports.get(simpleName);\n if (existingExport.element !== namespace) { // not merged\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, existingExport.element.internalName\n );\n return;\n }\n } else {\n this.moduleLevelExports.set(simpleName, {\n element: namespace,\n identifier: declaration.name\n });\n }\n namespace.set(CommonFlags.MODULE_EXPORT);\n }\n }\n\n var members = declaration.members;\n for (let i = 0, k = members.length; i < k; ++i) {\n switch (members[i].kind) {\n case NodeKind.CLASSDECLARATION: {\n this.initializeClass(members[i], queuedExtends, queuedImplements, namespace);\n break;\n }\n case NodeKind.ENUMDECLARATION: {\n this.initializeEnum(members[i], namespace);\n break;\n }\n case NodeKind.FUNCTIONDECLARATION: {\n this.initializeFunction(members[i], namespace);\n break;\n }\n case NodeKind.INTERFACEDECLARATION: {\n this.initializeInterface(members[i], namespace);\n break;\n }\n case NodeKind.NAMESPACEDECLARATION: {\n this.initializeNamespace(members[i], queuedExtends, queuedImplements, namespace);\n break;\n }\n case NodeKind.TYPEDECLARATION: {\n // this.initializeTypeAlias(members[i], namespace);\n // TODO: what about namespaced types?\n this.error(\n DiagnosticCode.Operation_not_supported,\n members[i].range\n );\n break;\n }\n case NodeKind.VARIABLE: {\n this.initializeVariables(members[i], namespace);\n break;\n }\n default: {\n throw new Error(\"namespace member expected\");\n }\n }\n }\n }\n\n private initializeTypeAlias(declaration: TypeDeclaration, namespace: Element | null = null): void {\n // type aliases are program globals\n // TODO: what about namespaced types?\n var name = declaration.name.text;\n if (this.typesLookup.has(name) || this.typeAliases.has(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, name\n );\n return;\n }\n var alias = new TypeAlias();\n alias.typeParameters = declaration.typeParameters;\n alias.type = declaration.type;\n this.typeAliases.set(name, alias);\n }\n\n private initializeVariables(statement: VariableStatement, namespace: Element | null = null): void {\n var declarations = statement.declarations;\n for (let i = 0, k = declarations.length; i < k; ++i) {\n let declaration = declarations[i];\n let decorators = declaration.decorators;\n let internalName = declaration.fileLevelInternalName;\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n continue;\n }\n let simpleName = declaration.name.text;\n let global = new Global(\n this,\n simpleName,\n internalName,\n Type.void, // resolved later on\n declaration,\n decorators\n ? this.checkDecorators(decorators,\n DecoratorFlags.GLOBAL |\n DecoratorFlags.INLINE |\n DecoratorFlags.EXTERNAL\n )\n : DecoratorFlags.NONE\n );\n global.parent = namespace;\n this.elementsLookup.set(internalName, global);\n\n if (global.hasDecorator(DecoratorFlags.INLINE) && !global.is(CommonFlags.CONST)) {\n this.error(\n DiagnosticCode.Decorator_0_is_not_valid_here,\n assert(findDecorator(DecoratorKind.INLINE, decorators)).range, \"inline\"\n );\n }\n\n if (namespace) {\n if (namespace.members) {\n if (namespace.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n continue;\n }\n } else {\n namespace.members = new Map();\n }\n namespace.members.set(simpleName, global);\n if (namespace.is(CommonFlags.MODULE_EXPORT) && global.is(CommonFlags.EXPORT)) {\n global.set(CommonFlags.MODULE_EXPORT);\n }\n } else if (global.is(CommonFlags.EXPORT)) { // no namespace\n if (this.fileLevelExports.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n } else {\n this.fileLevelExports.set(internalName, global);\n }\n this.currentFilespace.members.set(simpleName, global);\n if (declaration.range.source.isEntry) {\n if (this.moduleLevelExports.has(simpleName)) {\n let existingExport = this.moduleLevelExports.get(simpleName);\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, existingExport.element.internalName\n );\n continue;\n }\n global.set(CommonFlags.MODULE_EXPORT);\n this.moduleLevelExports.set(simpleName, {\n element: global,\n identifier: declaration.name\n });\n }\n }\n this.checkGlobal(global, declaration);\n }\n }\n}\n\n/** Indicates the specific kind of an {@link Element}. */\nexport enum ElementKind {\n /** A {@link Global}. */\n GLOBAL,\n /** A {@link Local}. */\n LOCAL,\n /** An {@link Enum}. */\n ENUM,\n /** An {@link EnumValue}. */\n ENUMVALUE,\n /** A {@link FunctionPrototype}. */\n FUNCTION_PROTOTYPE,\n /** A {@link Function}. */\n FUNCTION,\n /** A {@link FunctionTarget}. */\n FUNCTION_TARGET,\n /** A {@link ClassPrototype}. */\n CLASS_PROTOTYPE,\n /** A {@link Class}. */\n CLASS,\n /** An {@link InterfacePrototype}. */\n INTERFACE_PROTOTYPE,\n /** An {@link Interface}. */\n INTERFACE,\n /** A {@link FieldPrototype}. */\n FIELD_PROTOTYPE,\n /** A {@link Field}. */\n FIELD,\n /** A {@link Property}. */\n PROPERTY,\n /** A {@link Namespace}. */\n NAMESPACE,\n /** A {@link Filespace}. */\n FILESPACE,\n}\n\nexport enum DecoratorFlags {\n /** No flags set. */\n NONE = 0,\n /** Is a program global. */\n GLOBAL = 1 << 0,\n /** Is a binary operator overload. */\n OPERATOR_BINARY = 1 << 1,\n /** Is a unary prefix operator overload. */\n OPERATOR_PREFIX = 1 << 2,\n /** Is a unary postfix operator overload. */\n OPERATOR_POSTFIX = 1 << 3,\n /** Is an unmanaged class. */\n UNMANAGED = 1 << 4,\n /** Is a sealed class. */\n SEALED = 1 << 5,\n /** Is always inlined. */\n INLINE = 1 << 6,\n /** Is using a different external name. */\n EXTERNAL = 1 << 7,\n /** Is a builtin. */\n BUILTIN = 1 << 8\n}\n\nexport function decoratorKindToFlag(kind: DecoratorKind): DecoratorFlags {\n switch (kind) {\n case DecoratorKind.GLOBAL: return DecoratorFlags.GLOBAL;\n case DecoratorKind.OPERATOR:\n case DecoratorKind.OPERATOR_BINARY: return DecoratorFlags.OPERATOR_BINARY;\n case DecoratorKind.OPERATOR_PREFIX: return DecoratorFlags.OPERATOR_PREFIX;\n case DecoratorKind.OPERATOR_POSTFIX: return DecoratorFlags.OPERATOR_POSTFIX;\n case DecoratorKind.UNMANAGED: return DecoratorFlags.UNMANAGED;\n case DecoratorKind.SEALED: return DecoratorFlags.SEALED;\n case DecoratorKind.INLINE: return DecoratorFlags.INLINE;\n case DecoratorKind.EXTERNAL: return DecoratorFlags.EXTERNAL;\n case DecoratorKind.BUILTIN: return DecoratorFlags.BUILTIN;\n default: return DecoratorFlags.NONE;\n }\n}\n\n/** Base class of all program elements. */\nexport abstract class Element {\n\n /** Specific element kind. */\n kind: ElementKind;\n /** Containing {@link Program}. */\n program: Program;\n /** Simple name. */\n simpleName: string;\n /** Internal name referring to this element. */\n internalName: string;\n /** Common flags indicating specific traits. */\n flags: CommonFlags = CommonFlags.NONE;\n /** Decorator flags indicating annotated traits. */\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE;\n /** Namespaced member elements. */\n members: Map | null = null;\n /** Parent element, if applicable. */\n parent: Element | null = null;\n\n /** Constructs a new element, linking it to its containing {@link Program}. */\n protected constructor(program: Program, simpleName: string, internalName: string) {\n this.program = program;\n this.simpleName = simpleName;\n this.internalName = internalName;\n }\n\n /** Tests if this element has a specific flag or flags. */\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\n /** Tests if this element has any of the specified flags. */\n isAny(flags: CommonFlags): bool { return (this.flags & flags) != 0; }\n /** Sets a specific flag or flags. */\n set(flag: CommonFlags): void { this.flags |= flag; }\n /** Tests if this element has a specific decorator flag or flags. */\n hasDecorator(flag: DecoratorFlags): bool { return (this.decoratorFlags & flag) == flag; }\n}\n\n/** A filespace representing the implicit top-level namespace of a source. */\nexport class Filespace extends Element {\n\n kind = ElementKind.FILESPACE;\n\n /** File members (externally visible only). */\n members: Map; // more specific\n\n /** Constructs a new filespace. */\n constructor(\n program: Program,\n source: Source\n ) {\n super(program, source.internalPath, FILESPACE_PREFIX + source.internalPath);\n this.members = new Map();\n }\n}\n\n/** A namespace that differs from a filespace in being user-declared with a name. */\nexport class Namespace extends Element {\n\n // All elements have namespace semantics. This is an explicitly declared one.\n kind = ElementKind.NAMESPACE;\n\n /** Declaration reference. */\n declaration: NamespaceDeclaration; // more specific\n\n /** Constructs a new namespace. */\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n declaration: NamespaceDeclaration\n ) {\n super(program, simpleName, internalName);\n this.declaration = declaration;\n this.flags = declaration.flags;\n }\n}\n\n/** An enum. */\nexport class Enum extends Element {\n\n kind = ElementKind.ENUM;\n\n /** Declaration reference. */\n declaration: EnumDeclaration;\n\n /** Constructs a new enum. */\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n declaration: EnumDeclaration\n ) {\n super(program, simpleName, internalName);\n this.declaration = declaration;\n this.flags = declaration.flags;\n }\n}\n\n/** An enum value. */\nexport class EnumValue extends Element {\n\n kind = ElementKind.ENUMVALUE;\n\n /** Declaration reference. */\n declaration: EnumValueDeclaration;\n /** Constant value, if applicable. */\n constantValue: i32 = 0;\n\n constructor(\n enm: Enum,\n program: Program,\n simpleName: string,\n internalName: string,\n declaration: EnumValueDeclaration\n ) {\n super(program, simpleName, internalName);\n this.parent = enm;\n this.declaration = declaration;\n }\n}\n\nexport const enum ConstantValueKind {\n NONE,\n INTEGER,\n FLOAT\n}\n\nexport class VariableLikeElement extends Element {\n\n // kind varies\n\n /** Declaration reference. */\n declaration: VariableLikeDeclarationStatement | null;\n /** Variable type. Is {@link Type.void} for type-inferred {@link Global}s before compilation. */\n type: Type;\n /** Constant value kind. */\n constantValueKind: ConstantValueKind = ConstantValueKind.NONE;\n /** Constant integer value, if applicable. */\n constantIntegerValue: I64;\n /** Constant float value, if applicable. */\n constantFloatValue: f64;\n\n protected constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n type: Type,\n declaration: VariableLikeDeclarationStatement | null\n ) {\n super(program, simpleName, internalName);\n this.type = type;\n this.declaration = declaration;\n }\n\n withConstantIntegerValue(value: I64): this {\n this.constantValueKind = ConstantValueKind.INTEGER;\n this.constantIntegerValue = value;\n this.set(CommonFlags.CONST | CommonFlags.INLINED);\n return this;\n }\n\n withConstantFloatValue(value: f64): this {\n this.constantValueKind = ConstantValueKind.FLOAT;\n this.constantFloatValue = value;\n this.set(CommonFlags.CONST | CommonFlags.INLINED);\n return this;\n }\n}\n\n/** A global variable. */\nexport class Global extends VariableLikeElement {\n\n kind = ElementKind.GLOBAL;\n\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n type: Type,\n declaration: VariableLikeDeclarationStatement | null,\n decoratorFlags: DecoratorFlags\n ) {\n super(program, simpleName, internalName, type, declaration);\n this.flags = declaration ? declaration.flags : CommonFlags.NONE;\n this.decoratorFlags = decoratorFlags;\n this.type = type; // resolved later if `void`\n }\n}\n\n/** A function parameter. */\nexport class Parameter {\n\n // not an Element on its own\n\n /** Parameter name. */\n name: string;\n /** Parameter type. */\n type: Type;\n /** Parameter initializer. */\n initializer: Expression | null;\n\n /** Constructs a new function parameter. */\n constructor(name: string, type: Type, initializer: Expression | null = null) {\n this.name = name;\n this.type = type;\n this.initializer = initializer;\n }\n}\n\n/** A function local. */\nexport class Local extends VariableLikeElement {\n\n kind = ElementKind.LOCAL;\n\n /** Local index. */\n index: i32;\n /** Respective scoped global, if any. */\n scopedGlobal: Global | null = null;\n\n constructor(\n program: Program,\n simpleName: string,\n index: i32,\n type: Type,\n declaration: VariableLikeDeclarationStatement | null = null\n ) {\n super(program, simpleName, simpleName, type, declaration);\n this.index = index;\n }\n}\n\n/** A yet unresolved function prototype. */\nexport class FunctionPrototype extends Element {\n\n kind = ElementKind.FUNCTION_PROTOTYPE;\n\n /** Declaration reference. */\n declaration: FunctionDeclaration;\n /** If an instance method, the class prototype reference. */\n classPrototype: ClassPrototype | null;\n /** Resolved instances by class type arguments and function type arguments. */\n instances: Map> = new Map();\n /** Class type arguments, if a partially resolved method of a generic class. Not set otherwise. */\n classTypeArguments: Type[] | null = null;\n /** Operator kind, if an overload. */\n operatorKind: OperatorKind = OperatorKind.INVALID;\n\n /** Constructs a new function prototype. */\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n declaration: FunctionDeclaration,\n classPrototype: ClassPrototype | null = null,\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\n ) {\n super(program, simpleName, internalName);\n this.declaration = declaration;\n this.flags = declaration.flags;\n this.classPrototype = classPrototype;\n this.decoratorFlags = decoratorFlags;\n }\n\n /** Applies class type arguments to the context of a partially resolved instance method. */\n applyClassTypeArguments(contextualTypeArguments: Map): void {\n var classTypeArguments = assert(this.classTypeArguments); // set only if partial\n var classDeclaration = assert(this.classPrototype).declaration;\n var classTypeParameters = classDeclaration.typeParameters;\n var numClassTypeParameters = classTypeParameters.length;\n assert(numClassTypeParameters == classTypeArguments.length);\n for (let i = 0; i < numClassTypeParameters; ++i) {\n contextualTypeArguments.set(\n classTypeParameters[i].name.text,\n classTypeArguments[i]\n );\n }\n }\n\n toString(): string { return this.simpleName; }\n}\n\n/** A resolved function. */\nexport class Function extends Element {\n\n kind = ElementKind.FUNCTION;\n\n /** Prototype reference. */\n prototype: FunctionPrototype;\n /** Function signature. */\n signature: Signature;\n /** Map of locals by name. */\n localsByName: Map = new Map();\n /** Array of locals by index. */\n localsByIndex: Local[] = [];\n /** List of additional non-parameter locals. */\n additionalLocals: Type[] = [];\n /** Current break context label. */\n breakContext: string | null = null;\n /** Contextual type arguments. */\n contextualTypeArguments: Map | null;\n /** Current control flow. */\n flow: Flow;\n /** Remembered debug locations. */\n debugLocations: Range[] = [];\n /** Function reference, if compiled. */\n ref: FunctionRef = 0;\n /** Function table index, if any. */\n functionTableIndex: i32 = -1;\n /** Trampoline function for calling with omitted arguments. */\n trampoline: Function | null = null;\n /** The outer scope, if a function expression. */\n outerScope: Flow | null = null;\n\n private nextBreakId: i32 = 0;\n private breakStack: i32[] | null = null;\n nextInlineId: i32 = 0;\n\n /** Constructs a new concrete function. */\n constructor(\n prototype: FunctionPrototype,\n internalName: string,\n signature: Signature,\n parent: Element | null = null,\n contextualTypeArguments: Map | null = null\n ) {\n super(prototype.program, prototype.simpleName, internalName);\n this.prototype = prototype;\n this.signature = signature;\n this.parent = parent;\n this.flags = prototype.flags;\n this.decoratorFlags = prototype.decoratorFlags;\n this.contextualTypeArguments = contextualTypeArguments;\n if (prototype.internalName != \"NATIVE_CODE\") { // e.g. generated constructor without a real prototype\n if (!(prototype.is(CommonFlags.AMBIENT))) {\n let localIndex = 0;\n if (parent && parent.kind == ElementKind.CLASS) {\n assert(this.is(CommonFlags.INSTANCE));\n let local = new Local(\n prototype.program,\n \"this\",\n localIndex++,\n assert(signature.thisType)\n );\n this.localsByName.set(\"this\", local);\n this.localsByIndex[local.index] = local;\n let inheritedTypeArguments = (parent).contextualTypeArguments;\n if (inheritedTypeArguments) {\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\n for (let [inheritedName, inheritedType] of inheritedTypeArguments) {\n if (!this.contextualTypeArguments.has(inheritedName)) {\n this.contextualTypeArguments.set(inheritedName, inheritedType);\n }\n }\n }\n } else {\n assert(!this.is(CommonFlags.INSTANCE)); // internal error\n }\n let parameterTypes = signature.parameterTypes;\n for (let i = 0, k = parameterTypes.length; i < k; ++i) {\n let parameterType = parameterTypes[i];\n let parameterName = signature.getParameterName(i);\n let local = new Local(\n prototype.program,\n parameterName,\n localIndex++,\n parameterType\n // FIXME: declaration?\n );\n this.localsByName.set(parameterName, local);\n this.localsByIndex[local.index] = local;\n }\n }\n }\n this.flow = Flow.create(this);\n }\n\n /** Adds a local of the specified type, with an optional name. */\n addLocal(type: Type, name: string | null = null, declaration: VariableDeclaration | null = null): Local {\n // if it has a name, check previously as this method will throw otherwise\n var localIndex = this.signature.parameterTypes.length + this.additionalLocals.length;\n if (this.is(CommonFlags.INSTANCE)) ++localIndex;\n var local = new Local(\n this.prototype.program,\n name\n ? name\n : \"var$\" + localIndex.toString(10),\n localIndex,\n type,\n declaration\n );\n if (name) {\n if (this.localsByName.has(name)) throw new Error(\"duplicate local name\");\n this.localsByName.set(name, local);\n }\n this.localsByIndex[local.index] = local;\n this.additionalLocals.push(type);\n return local;\n }\n\n private tempI32s: Local[] | null = null;\n private tempI64s: Local[] | null = null;\n private tempF32s: Local[] | null = null;\n private tempF64s: Local[] | null = null;\n\n /** Gets a free temporary local of the specified type. */\n getTempLocal(type: Type, wrapped: bool = false): Local {\n var temps: Local[] | null;\n switch (type.toNativeType()) {\n case NativeType.I32: {\n temps = this.tempI32s;\n break;\n }\n case NativeType.I64: {\n temps = this.tempI64s;\n break;\n }\n case NativeType.F32: {\n temps = this.tempF32s;\n break;\n }\n case NativeType.F64: {\n temps = this.tempF64s;\n break;\n }\n default: throw new Error(\"concrete type expected\");\n }\n var local: Local;\n if (temps && temps.length) {\n local = temps.pop();\n local.type = type;\n local.flags = CommonFlags.NONE;\n } else {\n local = this.addLocal(type);\n }\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n this.flow.setLocalWrapped(local.index, wrapped);\n }\n return local;\n }\n\n /** Frees the temporary local for reuse. */\n freeTempLocal(local: Local): void {\n if (local.is(CommonFlags.INLINED)) return;\n assert(local.index >= 0);\n var temps: Local[];\n assert(local.type != null); // internal error\n switch ((local.type).toNativeType()) {\n case NativeType.I32: {\n temps = this.tempI32s || (this.tempI32s = []);\n break;\n }\n case NativeType.I64: {\n temps = this.tempI64s || (this.tempI64s = []);\n break;\n }\n case NativeType.F32: {\n temps = this.tempF32s || (this.tempF32s = []);\n break;\n }\n case NativeType.F64: {\n temps = this.tempF64s || (this.tempF64s = []);\n break;\n }\n default: throw new Error(\"concrete type expected\");\n }\n assert(local.index >= 0);\n temps.push(local);\n }\n\n /** Gets and immediately frees a temporary local of the specified type. */\n getAndFreeTempLocal(type: Type, wrapped: bool): Local {\n var temps: Local[];\n switch (type.toNativeType()) {\n case NativeType.I32: {\n temps = this.tempI32s || (this.tempI32s = []);\n break;\n }\n case NativeType.I64: {\n temps = this.tempI64s || (this.tempI64s = []);\n break;\n }\n case NativeType.F32: {\n temps = this.tempF32s || (this.tempF32s = []);\n break;\n }\n case NativeType.F64: {\n temps = this.tempF64s || (this.tempF64s = []);\n break;\n }\n default: throw new Error(\"concrete type expected\");\n }\n var local: Local;\n if (temps.length) {\n local = temps[temps.length - 1];\n local.type = type;\n } else {\n local = this.addLocal(type);\n temps.push(local);\n }\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n this.flow.setLocalWrapped(local.index, wrapped);\n }\n return local;\n }\n\n /** Enters a(nother) break context. */\n enterBreakContext(): string {\n var id = this.nextBreakId++;\n if (!this.breakStack) this.breakStack = [ id ];\n else this.breakStack.push(id);\n return this.breakContext = id.toString(10);\n }\n\n /** Leaves the current break context. */\n leaveBreakContext(): void {\n assert(this.breakStack != null);\n var length = (this.breakStack).length;\n assert(length > 0);\n (this.breakStack).pop();\n if (length > 1) {\n this.breakContext = (this.breakStack)[length - 2].toString(10);\n } else {\n this.breakContext = null;\n this.breakStack = null;\n }\n }\n\n /** Finalizes the function once compiled, releasing no longer needed resources. */\n finalize(module: Module, ref: FunctionRef): void {\n this.ref = ref;\n assert(!this.breakStack || !this.breakStack.length); // internal error\n this.breakStack = null;\n this.breakContext = null;\n this.tempI32s = this.tempI64s = this.tempF32s = this.tempF64s = null;\n if (this.program.options.sourceMap) {\n let debugLocations = this.debugLocations;\n for (let i = 0, k = debugLocations.length; i < k; ++i) {\n let debugLocation = debugLocations[i];\n module.setDebugLocation(\n ref,\n debugLocation.debugInfoRef,\n debugLocation.source.debugInfoIndex,\n debugLocation.line,\n debugLocation.column\n );\n }\n }\n }\n\n /** Returns the TypeScript representation of this function. */\n toString(): string { return this.prototype.simpleName; }\n}\n\n/** A resolved function target, that is a function called indirectly by an index and signature. */\nexport class FunctionTarget extends Element {\n\n kind = ElementKind.FUNCTION_TARGET;\n\n /** Underlying signature. */\n signature: Signature;\n /** Function type. */\n type: Type;\n\n /** Constructs a new function target. */\n constructor(program: Program, signature: Signature) {\n super(program, \"\", \"\");\n var simpleName = signature.toSignatureString();\n this.simpleName = simpleName;\n this.internalName = simpleName;\n this.signature = signature;\n this.type = Type.u32.asFunction(signature);\n }\n}\n\n/** A yet unresolved instance field prototype. */\nexport class FieldPrototype extends Element {\n\n kind = ElementKind.FIELD_PROTOTYPE;\n\n /** Declaration reference. */\n declaration: FieldDeclaration;\n /** Parent class prototype. */\n classPrototype: ClassPrototype;\n\n /** Constructs a new field prototype. */\n constructor(\n classPrototype: ClassPrototype,\n simpleName: string,\n internalName: string,\n declaration: FieldDeclaration\n ) {\n super(classPrototype.program, simpleName, internalName);\n this.classPrototype = classPrototype;\n this.declaration = declaration;\n this.flags = declaration.flags;\n }\n}\n\n/** A resolved instance field. */\nexport class Field extends VariableLikeElement {\n\n kind = ElementKind.FIELD;\n\n /** Field prototype reference. */\n prototype: FieldPrototype;\n /** Field memory offset, if an instance field. */\n memoryOffset: i32 = -1;\n\n /** Constructs a new field. */\n constructor(\n prototype: FieldPrototype,\n internalName: string,\n type: Type,\n declaration: FieldDeclaration,\n parent: Class\n ) {\n super(prototype.program, prototype.simpleName, internalName, type, declaration);\n this.prototype = prototype;\n this.flags = prototype.flags;\n this.type = type;\n this.parent = parent;\n }\n}\n\n/** A property comprised of a getter and a setter function. */\nexport class Property extends Element {\n\n kind = ElementKind.PROPERTY;\n\n /** Parent class prototype. */\n parent: ClassPrototype;\n /** Getter prototype. */\n getterPrototype: FunctionPrototype | null = null;\n /** Setter prototype. */\n setterPrototype: FunctionPrototype | null = null;\n\n /** Constructs a new property prototype. */\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n parent: ClassPrototype\n ) {\n super(program, simpleName, internalName);\n this.parent = parent;\n }\n}\n\n/** A yet unresolved class prototype. */\nexport class ClassPrototype extends Element {\n\n kind = ElementKind.CLASS_PROTOTYPE;\n\n /** Declaration reference. */\n declaration: ClassDeclaration;\n /** Resolved instances. */\n instances: Map = new Map();\n /** Instance member prototypes. */\n instanceMembers: Map | null = null;\n /** Base class prototype, if applicable. */\n basePrototype: ClassPrototype | null = null; // set in Program#initialize\n /** Constructor prototype. */\n constructorPrototype: FunctionPrototype | null = null;\n /** Operator overload prototypes. */\n overloadPrototypes: Map = new Map();\n\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n declaration: ClassDeclaration,\n decoratorFlags: DecoratorFlags\n ) {\n super(program, simpleName, internalName);\n this.declaration = declaration;\n this.flags = declaration.flags;\n this.decoratorFlags = decoratorFlags;\n }\n\n toString(): string {\n return this.simpleName;\n }\n}\n\n/** A resolved class. */\nexport class Class extends Element {\n\n kind = ElementKind.CLASS;\n\n /** Prototype reference. */\n prototype: ClassPrototype;\n /** Resolved type arguments. */\n typeArguments: Type[] | null;\n /** Resolved class type. */\n type: Type;\n /** Base class, if applicable. */\n base: Class | null;\n /** Contextual type arguments for fields and methods. */\n contextualTypeArguments: Map | null = null;\n /** Current member memory offset. */\n currentMemoryOffset: u32 = 0;\n /** Constructor instance. */\n constructorInstance: Function | null = null;\n /** Operator overloads. */\n overloads: Map | null = null;\n /** Function index of the GC hook. */\n gcHookIndex: u32 = -1;\n\n /** Constructs a new class. */\n constructor(\n prototype: ClassPrototype,\n simpleName: string,\n internalName: string,\n typeArguments: Type[] | null = null,\n base: Class | null = null\n ) {\n super(prototype.program, simpleName, internalName);\n this.prototype = prototype;\n this.flags = prototype.flags;\n this.decoratorFlags = prototype.decoratorFlags;\n this.typeArguments = typeArguments;\n this.type = prototype.program.options.usizeType.asClass(this);\n this.base = base;\n\n // inherit static members and contextual type arguments from base class\n if (base) {\n let inheritedTypeArguments = base.contextualTypeArguments;\n if (inheritedTypeArguments) {\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\n for (let [baseName, baseType] of inheritedTypeArguments) {\n this.contextualTypeArguments.set(baseName, baseType);\n }\n }\n }\n\n // apply instance-specific contextual type arguments\n var declaration = this.prototype.declaration;\n var i: i32, k: i32;\n if (declaration) { // irrelevant for built-ins\n let typeParameters = declaration.typeParameters;\n if (typeArguments) {\n if ((k = typeArguments.length) != typeParameters.length) {\n throw new Error(\"type argument count mismatch\");\n }\n if (k) {\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\n for (i = 0; i < k; ++i) {\n this.contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\n }\n }\n } else if (typeParameters.length) {\n throw new Error(\"type argument count mismatch\");\n }\n }\n }\n\n /** Tests if a value of this class type is assignable to a target of the specified class type. */\n isAssignableTo(target: Class): bool {\n var current: Class | null = this;\n do if (current == target) return true;\n while (current = current.base);\n return false;\n }\n\n /** Looks up the operator overload of the specified kind. */\n lookupOverload(kind: OperatorKind, unchecked: bool = false): Function | null {\n if (unchecked) {\n switch (kind) {\n case OperatorKind.INDEXED_GET: {\n let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_GET);\n if (uncheckedOverload) return uncheckedOverload;\n break;\n }\n case OperatorKind.INDEXED_SET: {\n let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_SET);\n if (uncheckedOverload) return uncheckedOverload;\n break;\n }\n default: assert(false);\n }\n }\n var instance: Class | null = this;\n do {\n let overloads = instance.overloads;\n if (overloads) {\n let overload = overloads.get(kind);\n if (overload) return overload;\n }\n } while (instance = instance.base);\n return null;\n }\n\n offsetof(fieldName: string): u32 {\n var members = assert(this.members);\n assert(members.has(fieldName));\n var field = members.get(fieldName);\n assert(field.kind == ElementKind.FIELD);\n return (field).memoryOffset;\n }\n\n toString(): string {\n return this.simpleName;\n }\n}\n\n/** A yet unresolved interface. */\nexport class InterfacePrototype extends ClassPrototype {\n\n kind = ElementKind.INTERFACE_PROTOTYPE;\n\n /** Declaration reference. */\n declaration: InterfaceDeclaration; // more specific\n\n /** Constructs a new interface prototype. */\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n declaration: InterfaceDeclaration,\n decoratorFlags: DecoratorFlags\n ) {\n super(program, simpleName, internalName, declaration, decoratorFlags);\n }\n}\n\n/** A resolved interface. */\nexport class Interface extends Class {\n\n kind = ElementKind.INTERFACE;\n\n /** Prototype reference. */\n prototype: InterfacePrototype; // more specific\n /** Base interface, if applcable. */\n base: Interface | null; // more specific\n\n /** Constructs a new interface. */\n constructor(\n prototype: InterfacePrototype,\n simpleName: string,\n internalName: string,\n typeArguments: Type[] = [],\n base: Interface | null = null\n ) {\n super(prototype, simpleName, internalName, typeArguments, base);\n }\n}\n\n/** Control flow flags indicating specific conditions. */\nexport const enum FlowFlags {\n /** No specific conditions. */\n NONE = 0,\n\n // categorical\n\n /** This branch always returns. */\n RETURNS = 1 << 0,\n /** This branch always returns a wrapped value. */\n RETURNS_WRAPPED = 1 << 1,\n /** This branch always throws. */\n THROWS = 1 << 2,\n /** This branch always breaks. */\n BREAKS = 1 << 3,\n /** This branch always continues. */\n CONTINUES = 1 << 4,\n /** This branch always allocates. Constructors only. */\n ALLOCATES = 1 << 5,\n /** This branch always calls super. Constructors only. */\n CALLS_SUPER = 1 << 6,\n\n // conditional\n\n /** This branch conditionally returns in a child branch. */\n CONDITIONALLY_RETURNS = 1 << 7,\n /** This branch conditionally throws in a child branch. */\n CONDITIONALLY_THROWS = 1 << 8,\n /** This branch conditionally breaks in a child branch. */\n CONDITIONALLY_BREAKS = 1 << 9,\n /** This branch conditionally continues in a child branch. */\n CONDITIONALLY_CONTINUES = 1 << 10,\n /** This branch conditionally allocates in a child branch. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 11,\n\n // special\n\n /** This branch is part of inlining a function. */\n INLINE_CONTEXT = 1 << 12,\n /** This branch explicitly requests no bounds checking. */\n UNCHECKED_CONTEXT = 1 << 13,\n\n // masks\n\n /** Any terminating flag. */\n ANY_TERMINATING = FlowFlags.RETURNS\n | FlowFlags.THROWS\n | FlowFlags.BREAKS\n | FlowFlags.CONTINUES,\n\n /** Any categorical flag. */\n ANY_CATEGORICAL = FlowFlags.RETURNS\n | FlowFlags.RETURNS_WRAPPED\n | FlowFlags.THROWS\n | FlowFlags.BREAKS\n | FlowFlags.CONTINUES\n | FlowFlags.ALLOCATES\n | FlowFlags.CALLS_SUPER,\n\n /** Any conditional flag. */\n ANY_CONDITIONAL = FlowFlags.CONDITIONALLY_RETURNS\n | FlowFlags.CONDITIONALLY_THROWS\n | FlowFlags.CONDITIONALLY_BREAKS\n | FlowFlags.CONDITIONALLY_CONTINUES\n | FlowFlags.CONDITIONALLY_ALLOCATES\n}\n\n/** A control flow evaluator. */\nexport class Flow {\n\n /** Parent flow. */\n parent: Flow | null;\n /** Flow flags indicating specific conditions. */\n flags: FlowFlags;\n /** Function this flow belongs to. */\n currentFunction: Function;\n /** The label we break to when encountering a continue statement. */\n continueLabel: string | null;\n /** The label we break to when encountering a break statement. */\n breakLabel: string | null;\n /** The label we break to when encountering a return statement, when inlining. */\n returnLabel: string | null;\n /** The current return type. */\n returnType: Type;\n /** The current contextual type arguments. */\n contextualTypeArguments: Map | null;\n /** Scoped local variables. */\n scopedLocals: Map | null = null;\n /** Local variable wrap states for the first 64 locals. */\n wrappedLocals: I64;\n /** Local variable wrap states for locals with index >= 64. */\n wrappedLocalsExt: I64[] | null;\n\n /** Creates the parent flow of the specified function. */\n static create(currentFunction: Function): Flow {\n var parentFlow = new Flow();\n parentFlow.parent = null;\n parentFlow.flags = FlowFlags.NONE;\n parentFlow.currentFunction = currentFunction;\n parentFlow.continueLabel = null;\n parentFlow.breakLabel = null;\n parentFlow.returnLabel = null;\n parentFlow.returnType = currentFunction.signature.returnType;\n parentFlow.contextualTypeArguments = currentFunction.contextualTypeArguments;\n parentFlow.wrappedLocals = i64_new(0);\n parentFlow.wrappedLocalsExt = null;\n return parentFlow;\n }\n\n private constructor() { }\n\n /** Tests if this flow has the specified flag or flags. */\n is(flag: FlowFlags): bool { return (this.flags & flag) == flag; }\n /** Tests if this flow has one of the specified flags. */\n isAny(flag: FlowFlags): bool { return (this.flags & flag) != 0; }\n /** Sets the specified flag or flags. */\n set(flag: FlowFlags): void { this.flags |= flag; }\n /** Unsets the specified flag or flags. */\n unset(flag: FlowFlags): void { this.flags &= ~flag; }\n\n /** Forks this flow to a child flow. */\n fork(): Flow {\n var branch = new Flow();\n branch.parent = this;\n branch.flags = this.flags;\n branch.currentFunction = this.currentFunction;\n branch.continueLabel = this.continueLabel;\n branch.breakLabel = this.breakLabel;\n branch.returnLabel = this.returnLabel;\n branch.returnType = this.returnType;\n branch.contextualTypeArguments = this.contextualTypeArguments;\n branch.wrappedLocals = this.wrappedLocals;\n branch.wrappedLocalsExt = this.wrappedLocalsExt ? this.wrappedLocalsExt.slice() : null;\n return branch;\n }\n\n /** Frees this flow's scoped variables. */\n free(): Flow {\n var parent = assert(this.parent);\n if (this.scopedLocals) { // free block-scoped locals\n for (let scopedLocal of this.scopedLocals.values()) {\n if (scopedLocal.is(CommonFlags.SCOPED)) { // otherwise an alias\n this.currentFunction.freeTempLocal(scopedLocal);\n }\n }\n this.scopedLocals = null;\n }\n return parent;\n }\n\n /** Adds a new scoped local of the specified name. */\n addScopedLocal(type: Type, name: string, wrapped: bool, declaration?: VariableDeclaration): Local {\n var scopedLocal = this.currentFunction.getTempLocal(type, false);\n if (!this.scopedLocals) this.scopedLocals = new Map();\n else {\n let existingLocal = this.scopedLocals.get(name);\n if (existingLocal) {\n if (declaration) {\n this.currentFunction.program.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range\n );\n } else assert(false);\n return existingLocal;\n }\n }\n scopedLocal.set(CommonFlags.SCOPED);\n this.scopedLocals.set(name, scopedLocal);\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n this.setLocalWrapped(scopedLocal.index, wrapped);\n }\n return scopedLocal;\n }\n\n /** Adds a new scoped alias for the specified local. */\n addScopedLocalAlias(index: i32, type: Type, name: string): Local {\n if (!this.scopedLocals) this.scopedLocals = new Map();\n else {\n let existingLocal = this.scopedLocals.get(name);\n if (existingLocal) {\n let declaration = existingLocal.declaration;\n if (declaration) {\n this.currentFunction.program.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range\n );\n } else assert(false);\n return existingLocal;\n }\n }\n assert(index < this.currentFunction.localsByIndex.length);\n var scopedAlias = new Local( // not SCOPED as an indicator that it isn't automatically free'd\n this.currentFunction.program,\n name,\n index,\n type,\n null\n );\n this.scopedLocals.set(name, scopedAlias);\n return scopedAlias;\n }\n\n /** Gets the local of the specified name in the current scope. */\n getScopedLocal(name: string): Local | null {\n var local: Local | null;\n var current: Flow | null = this;\n do {\n if (current.scopedLocals && (local = current.scopedLocals.get(name))) {\n return local;\n }\n } while (current = current.parent);\n return this.currentFunction.localsByName.get(name);\n }\n\n /** Tests if the local with the specified index is considered wrapped. */\n isLocalWrapped(index: i32): bool {\n var map: I64;\n var ext: I64[] | null;\n if (index < 64) {\n if (index < 0) return true; // inlined constant\n map = this.wrappedLocals;\n } else if (ext = this.wrappedLocalsExt) {\n let i = ((index - 64) / 64) | 0;\n if (i >= ext.length) return false;\n map = ext[i];\n index -= (i + 1) * 64;\n } else {\n return false;\n }\n return i64_ne(\n i64_and(\n map,\n i64_shl(\n i64_one,\n i64_new(index)\n )\n ),\n i64_zero\n );\n }\n\n /** Sets if the local with the specified index is considered wrapped. */\n setLocalWrapped(index: i32, wrapped: bool): void {\n var map: I64;\n var off: i32 = -1;\n if (index < 64) {\n if (index < 0) return; // inlined constant\n map = this.wrappedLocals;\n } else {\n let ext = this.wrappedLocalsExt;\n off = ((index - 64) / 64) | 0;\n if (!ext) {\n this.wrappedLocalsExt = ext = new Array(off + 1);\n ext.length = 0;\n }\n while (ext.length <= off) ext.push(i64_new(0));\n map = ext[off];\n index -= (off + 1) * 64;\n }\n map = wrapped\n ? i64_or(\n map,\n i64_shl(\n i64_one,\n i64_new(index)\n )\n )\n : i64_and(\n map,\n i64_not(\n i64_shl(\n i64_one,\n i64_new(index)\n )\n )\n );\n if (off >= 0) (this.wrappedLocalsExt)[off] = map;\n else this.wrappedLocals = map;\n }\n\n /** Inherits flags and local wrap states from the specified flow (e.g. blocks). */\n inherit(other: Flow): void {\n this.flags |= other.flags & (FlowFlags.ANY_CATEGORICAL | FlowFlags.ANY_CONDITIONAL);\n this.wrappedLocals = other.wrappedLocals;\n this.wrappedLocalsExt = other.wrappedLocalsExt; // no need to slice because other flow is finished\n }\n\n /** Inherits categorical flags as conditional flags from the specified flow (e.g. then without else). */\n inheritConditional(other: Flow): void {\n if (other.is(FlowFlags.RETURNS)) {\n this.set(FlowFlags.CONDITIONALLY_RETURNS);\n }\n if (other.is(FlowFlags.THROWS)) {\n this.set(FlowFlags.CONDITIONALLY_THROWS);\n }\n if (other.is(FlowFlags.BREAKS) && other.breakLabel == this.breakLabel) {\n this.set(FlowFlags.CONDITIONALLY_BREAKS);\n }\n if (other.is(FlowFlags.CONTINUES) && other.continueLabel == this.continueLabel) {\n this.set(FlowFlags.CONDITIONALLY_CONTINUES);\n }\n if (other.is(FlowFlags.ALLOCATES)) {\n this.set(FlowFlags.CONDITIONALLY_ALLOCATES);\n }\n }\n\n /** Inherits mutual flags and local wrap states from the specified flows (e.g. then with else). */\n inheritMutual(left: Flow, right: Flow): void {\n // categorical flags set in both arms\n this.flags |= left.flags & right.flags & FlowFlags.ANY_CATEGORICAL;\n\n // conditional flags set in at least one arm\n this.flags |= left.flags & FlowFlags.ANY_CONDITIONAL;\n this.flags |= right.flags & FlowFlags.ANY_CONDITIONAL;\n\n // locals wrapped in both arms\n this.wrappedLocals = i64_and(left.wrappedLocals, right.wrappedLocals);\n var leftExt = left.wrappedLocalsExt;\n var rightExt = right.wrappedLocalsExt;\n if (leftExt != null && rightExt != null) {\n let thisExt = this.wrappedLocalsExt;\n let minLength = min(leftExt.length, rightExt.length);\n if (minLength) {\n if (!thisExt) thisExt = new Array(minLength);\n else while (thisExt.length < minLength) thisExt.push(i64_new(0));\n for (let i = 0; i < minLength; ++i) {\n thisExt[i] = i64_and(\n leftExt[i],\n rightExt[i]\n );\n }\n }\n }\n }\n\n /**\n * Tests if an expression can possibly overflow in the context of this flow. Assumes that the\n * expression might already have overflown and returns `false` only if the operation neglects\n * any possible combination of garbage bits being present.\n */\n canOverflow(expr: ExpressionRef, type: Type): bool {\n // TODO: the following catches most common and a few uncommon cases, but there are additional\n // opportunities here, obviously.\n assert(type != Type.void);\n\n // types other than i8, u8, i16, u16 and bool do not overflow\n if (!type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) return false;\n\n var operand: ExpressionRef;\n switch (getExpressionId(expr)) {\n\n // overflows if the local isn't wrapped or the conversion does\n case ExpressionId.GetLocal: {\n let currentFunction = this.currentFunction;\n let local = currentFunction.localsByIndex[getGetLocalIndex(expr)];\n return !currentFunction.flow.isLocalWrapped(local.index)\n || canConversionOverflow(local.type, type);\n }\n\n // overflows if the value does\n case ExpressionId.SetLocal: { // tee\n assert(isTeeLocal(expr));\n return this.canOverflow(getSetLocalValue(expr), type);\n }\n\n // overflows if the conversion does (globals are wrapped on set)\n case ExpressionId.GetGlobal: {\n // TODO: this is inefficient because it has to read a string\n let global = assert(this.currentFunction.program.elementsLookup.get(assert(getGetGlobalName(expr))));\n assert(global.kind == ElementKind.GLOBAL);\n return canConversionOverflow(assert((global).type), type);\n }\n\n case ExpressionId.Binary: {\n switch (getBinaryOp(expr)) {\n\n // comparisons do not overflow (result is 0 or 1)\n case BinaryOp.EqI32:\n case BinaryOp.EqI64:\n case BinaryOp.EqF32:\n case BinaryOp.EqF64:\n case BinaryOp.NeI32:\n case BinaryOp.NeI64:\n case BinaryOp.NeF32:\n case BinaryOp.NeF64:\n case BinaryOp.LtI32:\n case BinaryOp.LtU32:\n case BinaryOp.LtI64:\n case BinaryOp.LtU64:\n case BinaryOp.LtF32:\n case BinaryOp.LtF64:\n case BinaryOp.LeI32:\n case BinaryOp.LeU32:\n case BinaryOp.LeI64:\n case BinaryOp.LeU64:\n case BinaryOp.LeF32:\n case BinaryOp.LeF64:\n case BinaryOp.GtI32:\n case BinaryOp.GtU32:\n case BinaryOp.GtI64:\n case BinaryOp.GtU64:\n case BinaryOp.GtF32:\n case BinaryOp.GtF64:\n case BinaryOp.GeI32:\n case BinaryOp.GeU32:\n case BinaryOp.GeI64:\n case BinaryOp.GeU64:\n case BinaryOp.GeF32:\n case BinaryOp.GeF64: return false;\n\n // result won't overflow if one side is 0 or if one side is 1 and the other wrapped\n case BinaryOp.MulI32: {\n return !(\n (\n getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\n (\n getConstValueI32(operand) == 0 ||\n (\n getConstValueI32(operand) == 1 &&\n !this.canOverflow(getBinaryRight(expr), type)\n )\n )\n ) || (\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\n (\n getConstValueI32(operand) == 0 ||\n (\n getConstValueI32(operand) == 1 &&\n !this.canOverflow(getBinaryLeft(expr), type)\n )\n )\n )\n );\n }\n\n // result won't overflow if one side is a constant less than this type's mask or one side\n // is wrapped\n case BinaryOp.AndI32: {\n // note that computeSmallIntegerMask returns the mask minus the MSB for signed types\n // because signed value garbage bits must be guaranteed to be equal to the MSB.\n return !(\n (\n (\n getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\n getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\n ) || !this.canOverflow(operand, type)\n ) || (\n (\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\n getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\n ) || !this.canOverflow(operand, type)\n )\n );\n }\n\n // overflows if the shift doesn't clear potential garbage bits\n case BinaryOp.ShlI32: {\n let shift = 32 - type.size;\n return getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const\n || getConstValueI32(operand) < shift;\n }\n\n // overflows if the value does and the shift doesn't clear potential garbage bits\n case BinaryOp.ShrI32: {\n let shift = 32 - type.size;\n return this.canOverflow(getBinaryLeft(expr), type) && (\n getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const ||\n getConstValueI32(operand) < shift\n );\n }\n\n // overflows if the shift does not clear potential garbage bits. if an unsigned value is\n // wrapped, it can't overflow.\n case BinaryOp.ShrU32: {\n let shift = 32 - type.size;\n return type.is(TypeFlags.SIGNED)\n ? !(\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\n getConstValueI32(operand) > shift // must clear MSB\n )\n : this.canOverflow(getBinaryLeft(expr), type) && !(\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\n getConstValueI32(operand) >= shift // can leave MSB\n );\n }\n\n // overflows if any side does\n case BinaryOp.DivU32:\n case BinaryOp.RemI32:\n case BinaryOp.RemU32: {\n return this.canOverflow(getBinaryLeft(expr), type)\n || this.canOverflow(getBinaryRight(expr), type);\n }\n }\n break;\n }\n\n case ExpressionId.Unary: {\n switch (getUnaryOp(expr)) {\n\n // comparisons do not overflow (result is 0 or 1)\n case UnaryOp.EqzI32:\n case UnaryOp.EqzI64: return false;\n\n // overflow if the maximum result (32) cannot be represented in the target type\n case UnaryOp.ClzI32:\n case UnaryOp.CtzI32:\n case UnaryOp.PopcntI32: return type.size < 7;\n }\n break;\n }\n\n // overflows if the value cannot be represented in the target type\n case ExpressionId.Const: {\n let value: i32 = 0;\n switch (getExpressionType(expr)) {\n case NativeType.I32: { value = getConstValueI32(expr); break; }\n case NativeType.I64: { value = getConstValueI64Low(expr); break; } // discards upper bits\n case NativeType.F32: { value = i32(getConstValueF32(expr)); break; }\n case NativeType.F64: { value = i32(getConstValueF64(expr)); break; }\n default: assert(false);\n }\n switch (type.kind) {\n case TypeKind.I8: return value < i8.MIN_VALUE || value > i8.MAX_VALUE;\n case TypeKind.I16: return value < i16.MIN_VALUE || value > i16.MAX_VALUE;\n case TypeKind.U8: return value < 0 || value > u8.MAX_VALUE;\n case TypeKind.U16: return value < 0 || value > u16.MAX_VALUE;\n case TypeKind.BOOL: return (value & ~1) != 0;\n }\n break;\n }\n\n // overflows if the conversion does\n case ExpressionId.Load: {\n let fromType: Type;\n switch (getLoadBytes(expr)) {\n case 1: { fromType = isLoadSigned(expr) ? Type.i8 : Type.u8; break; }\n case 2: { fromType = isLoadSigned(expr) ? Type.i16 : Type.u16; break; }\n default: { fromType = isLoadSigned(expr) ? Type.i32 : Type.u32; break; }\n }\n return canConversionOverflow(fromType, type);\n }\n\n // overflows if the result does, which is either\n // - the last expression of the block, by contract, if the block doesn't have a label\n // - the last expression or the value of an inner br if the block has a label (TODO)\n case ExpressionId.Block: {\n if (!getBlockName(expr)) {\n let size = assert(getBlockChildCount(expr));\n let last = getBlockChild(expr, size - 1);\n return this.canOverflow(last, type);\n }\n // actually, brs with a value that'd be handled here is not emitted atm\n break;\n }\n\n // overflows if either side does\n case ExpressionId.If: {\n return this.canOverflow(getIfTrue(expr), type)\n || this.canOverflow(assert(getIfFalse(expr)), type);\n }\n\n // overflows if either side does\n case ExpressionId.Select: {\n return this.canOverflow(getSelectThen(expr), type)\n || this.canOverflow(getSelectElse(expr), type);\n }\n\n // overflows if the call does not return a wrapped value or the conversion does\n case ExpressionId.Call: {\n let program = this.currentFunction.program;\n let instance = assert(program.instancesLookup.get(assert(getCallTarget(expr))));\n assert(instance.kind == ElementKind.FUNCTION);\n let returnType = (instance).signature.returnType;\n return !(instance).flow.is(FlowFlags.RETURNS_WRAPPED)\n || canConversionOverflow(returnType, type);\n }\n\n // doesn't technically overflow\n case ExpressionId.Unreachable: return false;\n }\n return true;\n }\n\n /** Finalizes this flow. Must be the topmost parent flow of the function. */\n finalize(): void {\n assert(this.parent == null); // must be the topmost parent flow\n this.continueLabel = null;\n this.breakLabel = null;\n this.returnLabel = null;\n this.contextualTypeArguments = null;\n }\n}\n\n/** Tests if a conversion from one type to another can technically overflow. */\nfunction canConversionOverflow(fromType: Type, toType: Type): bool {\n return !fromType.is(TypeFlags.INTEGER) // non-i32 locals or returns\n || fromType.size > toType.size\n || fromType.is(TypeFlags.SIGNED) != toType.is(TypeFlags.SIGNED);\n}\n","/**\n * A thin wrapper around Binaryen's C-API.\n * @module module\n *//***/\n\nimport {\n Target\n} from \"./compiler\";\n\nexport type ModuleRef = usize;\nexport type FunctionTypeRef = usize;\nexport type FunctionRef = usize;\nexport type ExpressionRef = usize;\nexport type GlobalRef = usize;\nexport type ImportRef = usize;\nexport type ExportRef = usize;\nexport type RelooperRef = usize;\nexport type RelooperBlockRef = usize;\nexport type Index = u32;\n\nexport const enum NativeType {\n None = 0, // _BinaryenTypeNone(),\n I32 = 1, // _BinaryenTypeInt32(),\n I64 = 2, // _BinaryenTypeInt64(),\n F32 = 3, // _BinaryenTypeFloat32(),\n F64 = 4, // _BinaryenTypeFloat64(),\n Unreachable = 5, // _BinaryenTypeUnreachable(),\n Auto = -1 // _BinaryenTypeAuto()\n}\n\nexport enum ExpressionId {\n Invalid = _BinaryenInvalidId(),\n Block = _BinaryenBlockId(),\n If = _BinaryenIfId(),\n Loop = _BinaryenLoopId(),\n Break = _BinaryenBreakId(),\n Switch = _BinaryenSwitchId(),\n Call = _BinaryenCallId(),\n CallIndirect = _BinaryenCallIndirectId(),\n GetLocal = _BinaryenGetLocalId(),\n SetLocal = _BinaryenSetLocalId(),\n GetGlobal = _BinaryenGetGlobalId(),\n SetGlobal = _BinaryenSetGlobalId(),\n Load = _BinaryenLoadId(),\n Store = _BinaryenStoreId(),\n Const = _BinaryenConstId(),\n Unary = _BinaryenUnaryId(),\n Binary = _BinaryenBinaryId(),\n Select = _BinaryenSelectId(),\n Drop = _BinaryenDropId(),\n Return = _BinaryenReturnId(),\n Host = _BinaryenHostId(),\n Nop = _BinaryenNopId(),\n Unreachable = _BinaryenUnreachableId(),\n AtomicCmpxchg = _BinaryenAtomicCmpxchgId(),\n AtomicRMW = _BinaryenAtomicRMWId(),\n AtomicWait = _BinaryenAtomicWaitId(),\n AtomicWake = _BinaryenAtomicWakeId()\n // SIMDExtract = _BinaryenSIMDExtractId(),\n // SIMDReplace = _BinaryenSIMDReplaceId(),\n // SIMDShuffle = _BinaryenSIMDShuffleId(),\n // SIMDBitselect = _BinaryenSIMDBitselectId(),\n // SIMDShift = _BinaryenSIMDShiftId()\n}\n\nexport enum UnaryOp {\n ClzI32 = _BinaryenClzInt32(),\n CtzI32 = _BinaryenCtzInt32(),\n PopcntI32 = _BinaryenPopcntInt32(),\n NegF32 = _BinaryenNegFloat32(),\n AbsF32 = _BinaryenAbsFloat32(),\n CeilF32 = _BinaryenCeilFloat32(),\n FloorF32 = _BinaryenFloorFloat32(),\n TruncF32 = _BinaryenTruncFloat32(),\n NearestF32 = _BinaryenNearestFloat32(),\n SqrtF32 = _BinaryenSqrtFloat32(),\n EqzI32 = _BinaryenEqZInt32(),\n ClzI64 = _BinaryenClzInt64(),\n CtzI64 = _BinaryenCtzInt64(),\n PopcntI64 = _BinaryenPopcntInt64(),\n NegF64 = _BinaryenNegFloat64(),\n AbsF64 = _BinaryenAbsFloat64(),\n CeilF64 = _BinaryenCeilFloat64(),\n FloorF64 = _BinaryenFloorFloat64(),\n TruncF64 = _BinaryenTruncFloat64(),\n NearestF64 = _BinaryenNearestFloat64(),\n SqrtF64 = _BinaryenSqrtFloat64(),\n EqzI64 = _BinaryenEqZInt64(),\n ExtendI32 = _BinaryenExtendSInt32(),\n ExtendU32 = _BinaryenExtendUInt32(),\n WrapI64 = _BinaryenWrapInt64(),\n TruncF32ToI32 = _BinaryenTruncSFloat32ToInt32(),\n TruncF32ToI64 = _BinaryenTruncSFloat32ToInt64(),\n TruncF32ToU32 = _BinaryenTruncUFloat32ToInt32(),\n TruncF32ToU64 = _BinaryenTruncUFloat32ToInt64(),\n TruncF64ToI32 = _BinaryenTruncSFloat64ToInt32(),\n TruncF64ToI64 = _BinaryenTruncSFloat64ToInt64(),\n TruncF64ToU32 = _BinaryenTruncUFloat64ToInt32(),\n TruncF64ToU64 = _BinaryenTruncUFloat64ToInt64(),\n ReinterpretF32 = _BinaryenReinterpretFloat32(),\n ReinterpretF64 = _BinaryenReinterpretFloat64(),\n ConvertI32ToF32 = _BinaryenConvertSInt32ToFloat32(),\n ConvertI32ToF64 = _BinaryenConvertSInt32ToFloat64(),\n ConvertU32ToF32 = _BinaryenConvertUInt32ToFloat32(),\n ConvertU32ToF64 = _BinaryenConvertUInt32ToFloat64(),\n ConvertI64ToF32 = _BinaryenConvertSInt64ToFloat32(),\n ConvertI64ToF64 = _BinaryenConvertSInt64ToFloat64(),\n ConvertU64ToF32 = _BinaryenConvertUInt64ToFloat32(),\n ConvertU64ToF64 = _BinaryenConvertUInt64ToFloat64(),\n PromoteF32 = _BinaryenPromoteFloat32(),\n DemoteF64 = _BinaryenDemoteFloat64(),\n ReinterpretI32 = _BinaryenReinterpretInt32(),\n ReinterpretI64 = _BinaryenReinterpretInt64(),\n\n // see: https://github.com/WebAssembly/sign-extension-ops\n ExtendI8ToI32 = _BinaryenExtendS8Int32(),\n ExtendI16ToI32 = _BinaryenExtendS16Int32(),\n ExtendI8ToI64 = _BinaryenExtendS8Int64(),\n ExtendI16ToI64 = _BinaryenExtendS16Int64(),\n ExtendI32ToI64 = _BinaryenExtendS32Int64()\n\n // see: https://github.com/WebAssembly/nontrapping-float-to-int-conversions\n // TruncF32ToI32Sat\n // TruncF32ToU32Sat\n // TruncF64ToI32Sat\n // TruncF64ToU32Sat\n // TruncF32ToI64Sat\n // TruncF32ToU64Sat\n // TruncF64ToI64Sat\n // TruncF64ToU64Sat\n}\n\nexport enum BinaryOp {\n AddI32 = _BinaryenAddInt32(),\n SubI32 = _BinaryenSubInt32(),\n MulI32 = _BinaryenMulInt32(),\n DivI32 = _BinaryenDivSInt32(),\n DivU32 = _BinaryenDivUInt32(),\n RemI32 = _BinaryenRemSInt32(),\n RemU32 = _BinaryenRemUInt32(),\n AndI32 = _BinaryenAndInt32(),\n OrI32 = _BinaryenOrInt32(),\n XorI32 = _BinaryenXorInt32(),\n ShlI32 = _BinaryenShlInt32(),\n ShrU32 = _BinaryenShrUInt32(),\n ShrI32 = _BinaryenShrSInt32(),\n RotlI32 = _BinaryenRotLInt32(),\n RotrI32 = _BinaryenRotRInt32(),\n EqI32 = _BinaryenEqInt32(),\n NeI32 = _BinaryenNeInt32(),\n LtI32 = _BinaryenLtSInt32(),\n LtU32 = _BinaryenLtUInt32(),\n LeI32 = _BinaryenLeSInt32(),\n LeU32 = _BinaryenLeUInt32(),\n GtI32 = _BinaryenGtSInt32(),\n GtU32 = _BinaryenGtUInt32(),\n GeI32 = _BinaryenGeSInt32(),\n GeU32 = _BinaryenGeUInt32(),\n AddI64 = _BinaryenAddInt64(),\n SubI64 = _BinaryenSubInt64(),\n MulI64 = _BinaryenMulInt64(),\n DivI64 = _BinaryenDivSInt64(),\n DivU64 = _BinaryenDivUInt64(),\n RemI64 = _BinaryenRemSInt64(),\n RemU64 = _BinaryenRemUInt64(),\n AndI64 = _BinaryenAndInt64(),\n OrI64 = _BinaryenOrInt64(),\n XorI64 = _BinaryenXorInt64(),\n ShlI64 = _BinaryenShlInt64(),\n ShrU64 = _BinaryenShrUInt64(),\n ShrI64 = _BinaryenShrSInt64(),\n RotlI64 = _BinaryenRotLInt64(),\n RotrI64 = _BinaryenRotRInt64(),\n EqI64 = _BinaryenEqInt64(),\n NeI64 = _BinaryenNeInt64(),\n LtI64 = _BinaryenLtSInt64(),\n LtU64 = _BinaryenLtUInt64(),\n LeI64 = _BinaryenLeSInt64(),\n LeU64 = _BinaryenLeUInt64(),\n GtI64 = _BinaryenGtSInt64(),\n GtU64 = _BinaryenGtUInt64(),\n GeI64 = _BinaryenGeSInt64(),\n GeU64 = _BinaryenGeUInt64(),\n AddF32 = _BinaryenAddFloat32(),\n SubF32 = _BinaryenSubFloat32(),\n MulF32 = _BinaryenMulFloat32(),\n DivF32 = _BinaryenDivFloat32(),\n CopysignF32 = _BinaryenCopySignFloat32(),\n MinF32 = _BinaryenMinFloat32(),\n MaxF32 = _BinaryenMaxFloat32(),\n EqF32 = _BinaryenEqFloat32(),\n NeF32 = _BinaryenNeFloat32(),\n LtF32 = _BinaryenLtFloat32(),\n LeF32 = _BinaryenLeFloat32(),\n GtF32 = _BinaryenGtFloat32(),\n GeF32 = _BinaryenGeFloat32(),\n AddF64 = _BinaryenAddFloat64(),\n SubF64 = _BinaryenSubFloat64(),\n MulF64 = _BinaryenMulFloat64(),\n DivF64 = _BinaryenDivFloat64(),\n CopysignF64 = _BinaryenCopySignFloat64(),\n MinF64 = _BinaryenMinFloat64(),\n MaxF64 = _BinaryenMaxFloat64(),\n EqF64 = _BinaryenEqFloat64(),\n NeF64 = _BinaryenNeFloat64(),\n LtF64 = _BinaryenLtFloat64(),\n LeF64 = _BinaryenLeFloat64(),\n GtF64 = _BinaryenGtFloat64(),\n GeF64 = _BinaryenGeFloat64()\n}\n\nexport enum HostOp {\n CurrentMemory = _BinaryenCurrentMemory(),\n GrowMemory = _BinaryenGrowMemory(),\n\n // see: https://github.com/WebAssembly/bulk-memory-operations\n // MoveMemory\n // SetMemory\n}\n\nexport enum AtomicRMWOp {\n Add = _BinaryenAtomicRMWAdd(),\n Sub = _BinaryenAtomicRMWSub(),\n And = _BinaryenAtomicRMWAnd(),\n Or = _BinaryenAtomicRMWOr(),\n Xor = _BinaryenAtomicRMWXor(),\n Xchg = _BinaryenAtomicRMWXchg()\n}\n\n// export enum SIMDOp {\n// SplatVecI8x16 = _BinaryenSplatVecI8x16(),\n// SplatVecI16x8 = _BinaryenSplatVecI16x8(),\n// SplatVecI32x4 = _BinaryenSplatVecI32x4(),\n// SplatVecI64x2 = _BinaryenSplatVecI64x2(),\n// SplatVecF32x4 = _BinaryenSplatVecF32x4(),\n// SplatVecF64x2 = _BinaryenSplatVecF64x2(),\n// NotVec128 = _BinaryenNotVec128(),\n// NegVecI8x16 = _BinaryenNegVecI8x16(),\n// AnyTrueVecI8x16 = _BinaryenAnyTrueVecI8x16(),\n// AllTrueVecI8x16 = _BinaryenAllTrueVecI8x16(),\n// NegVecI16x8 = _BinaryenNegVecI16x8(),\n// AnyTrueVecI16x8 = _BinaryenAnyTrueVecI16x8(),\n// AllTrueVecI16x8 = _BinaryenAllTrueVecI16x8(),\n// NegVecI32x4 = _BinaryenNegVecI32x4(),\n// AnyTrueVecI32x4 = _BinaryenAnyTrueVecI32x4(),\n// AllTrueVecI32x4 = _BinaryenAllTrueVecI32x4(),\n// NegVecI64x2 = _BinaryenNegVecI64x2(),\n// AnyTrueVecI64x2 = _BinaryenAnyTrueVecI64x2(),\n// AllTrueVecI64x2 = _BinaryenAllTrueVecI64x2(),\n// AbsVecF32x4 = _BinaryenAbsVecF32x4(),\n// NegVecF32x4 = _BinaryenNegVecF32x4(),\n// SqrtVecF32x4 = _BinaryenSqrtVecF32x4(),\n// AbsVecF64x2 = _BinaryenAbsVecF64x2(),\n// NegVecF64x2 = _BinaryenNegVecF64x2(),\n// SqrtVecF64x2 = _BinaryenSqrtVecF64x2(),\n// TruncSatSVecF32x4ToVecI32x4 = _BinaryenTruncSatSVecF32x4ToVecI32x4(),\n// TruncSatUVecF32x4ToVecI32x4 = _BinaryenTruncSatUVecF32x4ToVecI32x4(),\n// TruncSatSVecF64x2ToVecI64x2 = _BinaryenTruncSatSVecF64x2ToVecI64x2(),\n// TruncSatUVecF64x2ToVecI64x2 = _BinaryenTruncSatUVecF64x2ToVecI64x2(),\n// ConvertSVecI32x4ToVecF32x4 = _BinaryenConvertSVecI32x4ToVecF32x4(),\n// ConvertUVecI32x4ToVecF32x4 = _BinaryenConvertUVecI32x4ToVecF32x4(),\n// ConvertSVecI64x2ToVecF64x2 = _BinaryenConvertSVecI64x2ToVecF64x2(),\n// ConvertUVecI64x2ToVecF64x2 = _BinaryenConvertUVecI64x2ToVecF64x2(),\n// EqVecI8x16 = _BinaryenEqVecI8x16(),\n// NeVecI8x16 = _BinaryenNeVecI8x16(),\n// LtSVecI8x16 = _BinaryenLtSVecI8x16(),\n// LtUVecI8x16 = _BinaryenLtUVecI8x16(),\n// LeSVecI8x16 = _BinaryenLeSVecI8x16(),\n// LeUVecI8x16 = _BinaryenLeUVecI8x16(),\n// GtSVecI8x16 = _BinaryenGtSVecI8x16(),\n// GtUVecI8x16 = _BinaryenGtUVecI8x16(),\n// GeSVecI8x16 = _BinaryenGeSVecI8x16(),\n// GeUVecI8x16 = _BinaryenGeUVecI8x16(),\n// EqVecI16x8 = _BinaryenEqVecI16x8(),\n// NeVecI16x8 = _BinaryenNeVecI16x8(),\n// LtSVecI16x8 = _BinaryenLtSVecI16x8(),\n// LtUVecI16x8 = _BinaryenLtUVecI16x8(),\n// LeSVecI16x8 = _BinaryenLeSVecI16x8(),\n// LeUVecI16x8 = _BinaryenLeUVecI16x8(),\n// GtSVecI16x8 = _BinaryenGtSVecI16x8(),\n// GtUVecI16x8 = _BinaryenGtUVecI16x8(),\n// GeSVecI16x8 = _BinaryenGeSVecI16x8(),\n// GeUVecI16x8 = _BinaryenGeUVecI16x8(),\n// EqVecI32x4 = _BinaryenEqVecI32x4(),\n// NeVecI32x4 = _BinaryenNeVecI32x4(),\n// LtSVecI32x4 = _BinaryenLtSVecI32x4(),\n// LtUVecI32x4 = _BinaryenLtUVecI32x4(),\n// LeSVecI32x4 = _BinaryenLeSVecI32x4(),\n// LeUVecI32x4 = _BinaryenLeUVecI32x4(),\n// GtSVecI32x4 = _BinaryenGtSVecI32x4(),\n// GtUVecI32x4 = _BinaryenGtUVecI32x4(),\n// GeSVecI32x4 = _BinaryenGeSVecI32x4(),\n// GeUVecI32x4 = _BinaryenGeUVecI32x4(),\n// EqVecF32x4 = _BinaryenEqVecF32x4(),\n// NeVecF32x4 = _BinaryenNeVecF32x4(),\n// LtVecF32x4 = _BinaryenLtVecF32x4(),\n// LeVecF32x4 = _BinaryenLeVecF32x4(),\n// GtVecF32x4 = _BinaryenGtVecF32x4(),\n// GeVecF32x4 = _BinaryenGeVecF32x4(),\n// EqVecF64x2 = _BinaryenEqVecF64x2(),\n// NeVecF64x2 = _BinaryenNeVecF64x2(),\n// LtVecF64x2 = _BinaryenLtVecF64x2(),\n// LeVecF64x2 = _BinaryenLeVecF64x2(),\n// GtVecF64x2 = _BinaryenGtVecF64x2(),\n// GeVecF64x2 = _BinaryenGeVecF64x2(),\n// AndVec128 = _BinaryenAndVec128(),\n// OrVec128 = _BinaryenOrVec128(),\n// XorVec128 = _BinaryenXorVec128(),\n// AddVecI8x16 = _BinaryenAddVecI8x16(),\n// AddSatSVecI8x16 = _BinaryenAddSatSVecI8x16(),\n// AddSatUVecI8x16 = _BinaryenAddSatUVecI8x16(),\n// SubVecI8x16 = _BinaryenSubVecI8x16(),\n// SubSatSVecI8x16 = _BinaryenSubSatSVecI8x16(),\n// SubSatUVecI8x16 = _BinaryenSubSatUVecI8x16(),\n// MulVecI8x16 = _BinaryenMulVecI8x16(),\n// AddVecI16x8 = _BinaryenAddVecI16x8(),\n// AddSatSVecI16x8 = _BinaryenAddSatSVecI16x8(),\n// AddSatUVecI16x8 = _BinaryenAddSatUVecI16x8(),\n// SubVecI16x8 = _BinaryenSubVecI16x8(),\n// SubSatSVecI16x8 = _BinaryenSubSatSVecI16x8(),\n// SubSatUVecI16x8 = _BinaryenSubSatUVecI16x8(),\n// MulVecI16x8 = _BinaryenMulVecI16x8(),\n// AddVecI32x4 = _BinaryenAddVecI32x4(),\n// SubVecI32x4 = _BinaryenSubVecI32x4(),\n// MulVecI32x4 = _BinaryenMulVecI32x4(),\n// AddVecI64x2 = _BinaryenAddVecI64x2(),\n// SubVecI64x2 = _BinaryenSubVecI64x2(),\n// AddVecF32x4 = _BinaryenAddVecF32x4(),\n// SubVecF32x4 = _BinaryenSubVecF32x4(),\n// MulVecF32x4 = _BinaryenMulVecF32x4(),\n// DivVecF32x4 = _BinaryenDivVecF32x4(),\n// MinVecF32x4 = _BinaryenMinVecF32x4(),\n// MaxVecF32x4 = _BinaryenMaxVecF32x4(),\n// AddVecF64x2 = _BinaryenAddVecF64x2(),\n// SubVecF64x2 = _BinaryenSubVecF64x2(),\n// MulVecF64x2 = _BinaryenMulVecF64x2(),\n// DivVecF64x2 = _BinaryenDivVecF64x2(),\n// MinVecF64x2 = _BinaryenMinVecF64x2(),\n// MaxVecF64x2 = _BinaryenMaxVecF64x2()\n// }\n\nexport class MemorySegment {\n\n buffer: Uint8Array;\n offset: I64;\n\n static create(buffer: Uint8Array, offset: I64): MemorySegment {\n var segment = new MemorySegment();\n segment.buffer = buffer;\n segment.offset = offset;\n return segment;\n }\n}\n\nexport class Module {\n\n ref: ModuleRef;\n\n private cachedByValue: usize;\n\n static create(): Module {\n var module = new Module();\n module.ref = _BinaryenModuleCreate();\n module.cachedByValue = memory.allocate(16);\n return module;\n }\n\n static createFrom(buffer: Uint8Array): Module {\n var cArr = allocU8Array(buffer);\n try {\n let module = new Module();\n module.ref = _BinaryenModuleRead(cArr, buffer.length);\n module.cachedByValue = memory.allocate(3 * 8); // LLVM C-ABI, max used is 3 * usize\n return module;\n } finally {\n memory.free(changetype(cArr));\n }\n }\n\n private constructor() { }\n\n // types\n\n addFunctionType(\n name: string,\n result: NativeType,\n paramTypes: NativeType[] | null\n ): FunctionRef {\n var cStr = this.allocStringCached(name);\n var cArr = allocI32Array(paramTypes);\n try {\n return _BinaryenAddFunctionType(this.ref, cStr, result, cArr, paramTypes ? paramTypes.length : 0);\n } finally {\n memory.free(cArr);\n }\n }\n\n getFunctionTypeBySignature(\n result: NativeType,\n paramTypes: NativeType[] | null\n ): FunctionTypeRef {\n var cArr = allocI32Array(paramTypes);\n try {\n return _BinaryenGetFunctionTypeBySignature(this.ref, result, cArr, paramTypes ? paramTypes.length : 0);\n } finally {\n memory.free(cArr);\n }\n }\n\n removeFunctionType(name: string): void {\n var cStr = this.allocStringCached(name);\n _BinaryenRemoveFunctionType(this.ref, cStr);\n }\n\n // constants\n\n createI32(value: i32): ExpressionRef {\n var out = this.cachedByValue;\n _BinaryenLiteralInt32(out, value);\n return _BinaryenConst(this.ref, out);\n }\n\n createI64(valueLow: i32, valueHigh: i32 = 0): ExpressionRef {\n var out = this.cachedByValue;\n _BinaryenLiteralInt64(out, valueLow, valueHigh);\n return _BinaryenConst(this.ref, out);\n }\n\n createF32(value: f32): ExpressionRef {\n var out = this.cachedByValue;\n _BinaryenLiteralFloat32(out, value);\n return _BinaryenConst(this.ref, out);\n }\n\n createF64(value: f64): ExpressionRef {\n var out = this.cachedByValue;\n _BinaryenLiteralFloat64(out, value);\n return _BinaryenConst(this.ref, out);\n }\n\n // expressions\n\n createUnary(\n op: UnaryOp,\n expr: ExpressionRef\n ): ExpressionRef {\n return _BinaryenUnary(this.ref, op, expr);\n }\n\n createBinary(\n op: BinaryOp,\n left: ExpressionRef,\n right: ExpressionRef\n ): ExpressionRef {\n return _BinaryenBinary(this.ref, op, left, right);\n }\n\n createHost(\n op: HostOp,\n name: string | null = null,\n operands: ExpressionRef[] | null = null\n ): ExpressionRef {\n var cStr = this.allocStringCached(name);\n var cArr = allocPtrArray(operands);\n try {\n return _BinaryenHost(this.ref, op, cStr, cArr, operands ? (operands).length : 0);\n } finally {\n memory.free(cArr);\n }\n }\n\n createGetLocal(\n index: i32,\n type: NativeType\n ): ExpressionRef {\n return _BinaryenGetLocal(this.ref, index, type);\n }\n\n createTeeLocal(\n index: i32,\n value: ExpressionRef\n ): ExpressionRef {\n return _BinaryenTeeLocal(this.ref, index, value);\n }\n\n createGetGlobal(\n name: string,\n type: NativeType\n ): ExpressionRef {\n var cStr = this.allocStringCached(name);\n return _BinaryenGetGlobal(this.ref, cStr, type);\n }\n\n createLoad(\n bytes: Index,\n signed: bool,\n ptr: ExpressionRef,\n type: NativeType,\n offset: Index = 0\n ): ExpressionRef {\n return _BinaryenLoad(this.ref, bytes, signed ? 1 : 0, offset, /* always aligned */ bytes, type, ptr);\n }\n\n createStore(\n bytes: Index,\n ptr: ExpressionRef,\n value: ExpressionRef,\n type: NativeType,\n offset: Index = 0\n ): ExpressionRef {\n return _BinaryenStore(this.ref, bytes, offset, /* always aligned */ bytes, ptr, value, type);\n }\n\n createAtomicLoad(\n bytes: Index,\n ptr: ExpressionRef,\n type: NativeType,\n offset: Index = 0\n ): ExpressionRef {\n return _BinaryenAtomicLoad(this.ref, bytes, offset, type, ptr);\n }\n\n createAtomicStore(\n bytes: Index,\n ptr: ExpressionRef,\n value: ExpressionRef,\n type: NativeType,\n offset: Index = 0\n ): ExpressionRef {\n return _BinaryenAtomicStore(this.ref, bytes, offset, ptr, value, type);\n }\n\n createAtomicRMW(\n op: AtomicRMWOp,\n bytes: Index,\n offset: Index,\n ptr: ExpressionRef,\n value: ExpressionRef,\n type: NativeType\n ): ExpressionRef {\n return _BinaryenAtomicRMW(this.ref, op, bytes, offset, ptr, value, type);\n }\n\n createAtomicCmpxchg(\n bytes: Index,\n offset: Index,\n ptr: ExpressionRef,\n expected: ExpressionRef,\n replacement: ExpressionRef,\n type: NativeType\n ): ExpressionRef {\n return _BinaryenAtomicCmpxchg(this.ref, bytes, offset, ptr, expected, replacement, type);\n }\n\n createAtomicWait(\n ptr: ExpressionRef,\n expected: ExpressionRef,\n timeout: ExpressionRef,\n expectedType: NativeType\n ): ExpressionRef {\n return _BinaryenAtomicWait(this.ref, ptr, expected, timeout, expectedType);\n }\n\n createAtomicWake(\n ptr: ExpressionRef,\n wakeCount: ExpressionRef\n ): ExpressionRef {\n return _BinaryenAtomicWake(this.ref, ptr, wakeCount);\n }\n\n // statements\n\n createSetLocal(\n index: Index,\n value: ExpressionRef\n ): ExpressionRef {\n return _BinaryenSetLocal(this.ref, index, value);\n }\n\n createSetGlobal(\n name: string,\n value: ExpressionRef\n ): ExpressionRef {\n var cStr = this.allocStringCached(name);\n return _BinaryenSetGlobal(this.ref, cStr, value);\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = this.allocStringCached(label);\n var cArr = allocPtrArray(children);\n try {\n return _BinaryenBlock(this.ref, cStr, cArr, children.length, type);\n } finally {\n memory.free(cArr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = this.allocStringCached(label);\n return _BinaryenBreak(this.ref, cStr, condition, value);\n }\n\n createDrop(\n expression: ExpressionRef\n ): ExpressionRef {\n return _BinaryenDrop(this.ref, expression);\n }\n\n createLoop(\n label: string | null,\n body: ExpressionRef\n ): ExpressionRef {\n var cStr = this.allocStringCached(label);\n return _BinaryenLoop(this.ref, cStr, body);\n }\n\n createIf(\n condition: ExpressionRef,\n ifTrue: ExpressionRef,\n ifFalse: ExpressionRef = 0\n ): ExpressionRef {\n return _BinaryenIf(this.ref, condition, ifTrue, ifFalse);\n }\n\n createNop(): ExpressionRef {\n return _BinaryenNop(this.ref);\n }\n\n createReturn(\n expression: ExpressionRef = 0\n ): ExpressionRef {\n return _BinaryenReturn(this.ref, expression);\n }\n\n createSelect(\n ifTrue: ExpressionRef,\n ifFalse: ExpressionRef,\n condition: ExpressionRef\n ): ExpressionRef {\n return _BinaryenSelect(this.ref, condition, ifTrue, ifFalse);\n }\n\n createSwitch(\n names: string[],\n defaultName: string | null,\n condition: ExpressionRef,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var numNames = names.length;\n var strs = new Array(numNames);\n for (let i = 0; i < numNames; ++i) {\n strs[i] = this.allocStringCached(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = this.allocStringCached(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cArr);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = this.allocStringCached(target);\n var cArr = allocPtrArray(operands);\n try {\n return _BinaryenCall(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\n } finally {\n memory.free(cArr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cStr = this.allocStringCached(typeName);\n var cArr = allocPtrArray(operands);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cArr);\n }\n }\n\n createUnreachable(): ExpressionRef {\n return _BinaryenUnreachable(this.ref);\n }\n\n // meta\n\n addGlobal(\n name: string,\n type: NativeType,\n mutable: bool,\n initializer: ExpressionRef\n ): GlobalRef {\n var cStr = this.allocStringCached(name);\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = this.allocStringCached(name);\n _BinaryenRemoveGlobal(this.ref, cStr);\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = this.allocStringCached(name);\n var cArr = allocI32Array(varTypes);\n try {\n return _BinaryenAddFunction(this.ref, cStr, type, cArr, varTypes ? varTypes.length : 0, body);\n } finally {\n memory.free(cArr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = this.allocStringCached(name);\n _BinaryenRemoveFunction(this.ref, cStr);\n }\n\n private hasTemporaryFunction: bool = false;\n\n addTemporaryFunction(result: NativeType, paramTypes: NativeType[] | null, body: ExpressionRef): FunctionRef {\n this.hasTemporaryFunction = assert(!this.hasTemporaryFunction);\n var tempName = this.allocStringCached(\"\");\n var cArr = allocI32Array(paramTypes);\n try {\n let typeRef = _BinaryenAddFunctionType(this.ref, tempName, result, cArr, paramTypes ? paramTypes.length : 0);\n return _BinaryenAddFunction(this.ref, tempName, typeRef, 0, 0, body);\n } finally {\n memory.free(cArr);\n }\n }\n\n removeTemporaryFunction(): void {\n this.hasTemporaryFunction = !assert(this.hasTemporaryFunction);\n var tempName = this.allocStringCached(\"\");\n _BinaryenRemoveFunction(this.ref, tempName);\n _BinaryenRemoveFunctionType(this.ref, tempName);\n }\n\n addFunctionExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalName);\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalName);\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalName);\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalName);\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n }\n\n removeExport(externalName: string): void {\n var cStr = this.allocStringCached(externalName);\n _BinaryenRemoveExport(this.ref, cStr);\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalModuleName);\n var cStr3 = this.allocStringCached(externalBaseName);\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalModuleName);\n var cStr3 = this.allocStringCached(externalBaseName);\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n shared: bool = false,\n ): ImportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalModuleName);\n var cStr3 = this.allocStringCached(externalBaseName);\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3, shared);\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalModuleName);\n var cStr3 = this.allocStringCached(externalBaseName);\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n }\n\n /** Unlimited memory constant. */\n static readonly UNLIMITED_MEMORY: Index = -1;\n\n setMemory(\n initial: Index,\n maximum: Index,\n segments: MemorySegment[],\n target: Target,\n exportName: string | null = null,\n shared: bool = false\n ): void {\n var cStr = this.allocStringCached(exportName);\n var k = segments.length;\n var segs = new Array(k);\n var offs = new Array(k);\n var sizs = new Array(k);\n for (let i = 0; i < k; ++i) {\n let buffer = segments[i].buffer;\n let offset = segments[i].offset;\n segs[i] = allocU8Array(buffer);\n offs[i] = target == Target.WASM64\n ? this.createI64(i64_low(offset), i64_high(offset))\n : this.createI32(i64_low(offset));\n sizs[i] = buffer.length;\n }\n var cArr1 = allocI32Array(segs);\n var cArr2 = allocI32Array(offs);\n var cArr3 = allocI32Array(sizs);\n try {\n _BinaryenSetMemory(this.ref, initial, maximum, cStr, cArr1, cArr2, cArr3, k, shared);\n } finally {\n memory.free(cArr3);\n memory.free(cArr2);\n memory.free(cArr1);\n for (let i = k - 1; i >= 0; --i) memory.free(segs[i]);\n }\n }\n\n setFunctionTable(\n initial: Index,\n maximum: Index,\n funcs: string[]\n ): void {\n var numNames = funcs.length;\n var names = new Array(numNames);\n for (let i = 0; i < numNames; ++i) {\n names[i] = this.allocStringCached(funcs[i]);\n }\n var cArr = allocI32Array(names);\n try {\n _BinaryenSetFunctionTable(this.ref, initial, maximum, cArr, numNames);\n } finally {\n memory.free(cArr);\n }\n }\n\n setStart(func: FunctionRef): void {\n _BinaryenSetStart(this.ref, func);\n }\n\n getOptimizeLevel(): i32 {\n return _BinaryenGetOptimizeLevel();\n }\n\n setOptimizeLevel(level: i32 = 2): void {\n _BinaryenSetOptimizeLevel(level);\n }\n\n getShrinkLevel(): i32 {\n return _BinaryenGetShrinkLevel();\n }\n\n setShrinkLevel(level: i32 = 1): void {\n _BinaryenSetShrinkLevel(level);\n }\n\n setDebugInfo(on: bool = false): void {\n _BinaryenSetDebugInfo(on);\n }\n\n optimize(func: FunctionRef = 0): void {\n if (func) {\n _BinaryenFunctionOptimize(func, this.ref);\n } else {\n _BinaryenModuleOptimize(this.ref);\n }\n }\n\n runPasses(passes: string[], func: FunctionRef = 0): void {\n var numNames = passes.length;\n var names = new Array(numNames);\n for (let i = 0; i < numNames; ++i) {\n names[i] = allocString(passes[i]);\n }\n var cArr = allocI32Array(names);\n try {\n if (func) {\n _BinaryenFunctionRunPasses(func, this.ref, cArr, numNames);\n } else {\n _BinaryenModuleRunPasses(this.ref, cArr, numNames);\n }\n } finally {\n memory.free(cArr);\n for (let i = numNames; i >= 0; --i) memory.free(names[i]);\n }\n }\n\n private cachedPrecomputeNames: usize = 0;\n\n precomputeExpression(expr: ExpressionRef): ExpressionRef {\n // remember the previous optimize levels and set to max instead, to be sure\n var previousOptimizeLevel = _BinaryenGetOptimizeLevel();\n var previousShrinkLevel = _BinaryenGetShrinkLevel();\n var previousDebugInfo = _BinaryenGetDebugInfo();\n _BinaryenSetOptimizeLevel(4);\n _BinaryenSetShrinkLevel(0);\n _BinaryenSetDebugInfo(false);\n\n // wrap the expression in a temp. function and run the precompute pass on it\n var type = _BinaryenExpressionGetType(expr);\n var func = this.addTemporaryFunction(type, null, expr);\n var names = this.cachedPrecomputeNames;\n if (!names) {\n this.cachedPrecomputeNames = names = allocI32Array([ this.allocStringCached(\"precompute\") ]);\n }\n _BinaryenFunctionRunPasses(func, this.ref, names, 1);\n expr = _BinaryenFunctionGetBody(func);\n this.removeTemporaryFunction();\n\n // reset optimize levels to previous\n _BinaryenSetOptimizeLevel(previousOptimizeLevel);\n _BinaryenSetShrinkLevel(previousShrinkLevel);\n _BinaryenSetDebugInfo(previousDebugInfo);\n return expr;\n }\n\n validate(): bool {\n return _BinaryenModuleValidate(this.ref) == 1;\n }\n\n interpret(): void {\n _BinaryenModuleInterpret(this.ref);\n }\n\n toBinary(sourceMapUrl: string | null): BinaryModule {\n var out = this.cachedByValue;\n var cStr = allocString(sourceMapUrl);\n var binaryPtr: usize = 0;\n var sourceMapPtr: usize = 0;\n try {\n _BinaryenModuleAllocateAndWrite(out, this.ref, cStr);\n binaryPtr = readInt(out);\n let binaryBytes = readInt(out + 4);\n sourceMapPtr = readInt(out + 4 * 2);\n let ret = new BinaryModule();\n ret.output = readBuffer(binaryPtr, binaryBytes);\n ret.sourceMap = readString(sourceMapPtr);\n return ret;\n } finally {\n if (cStr) memory.free(cStr);\n if (binaryPtr) memory.free(binaryPtr);\n if (sourceMapPtr) memory.free(sourceMapPtr);\n }\n }\n\n toText(): string {\n throw new Error(\"not implemented\"); // JS glue overrides this\n }\n\n toAsmjs(): string {\n throw new Error(\"not implemented\"); // JS glue overrides this\n }\n\n private cachedStrings: Map = new Map();\n\n private allocStringCached(str: string | null): usize {\n if (str == null) return 0;\n if (cachedStrings.has(str)) return cachedStrings.get(str);\n var ptr = allocString(str);\n cachedStrings.set(str, ptr);\n return ptr;\n }\n\n dispose(): void {\n assert(this.ref);\n for (let ptr of this.cachedStrings.values()) memory.free(ptr);\n this.cachedStrings = new Map();\n memory.free(this.cachedByValue);\n memory.free(this.cachedPrecomputeNames);\n this.cachedPrecomputeNames = 0;\n _BinaryenModuleDispose(this.ref);\n this.ref = 0;\n }\n\n createRelooper(): Relooper {\n return Relooper.create(this);\n }\n\n cloneExpression(\n expr: ExpressionRef,\n noSideEffects: bool = false,\n maxDepth: i32 = i32.MAX_VALUE\n ): ExpressionRef { // currently supports side effect free expressions only\n if (maxDepth < 0) return 0;\n maxDepth -= 1;\n\n var nested1: ExpressionRef,\n nested2: ExpressionRef;\n\n switch (_BinaryenExpressionGetId(expr)) {\n case ExpressionId.Const: {\n switch (_BinaryenExpressionGetType(expr)) {\n case NativeType.I32: {\n return this.createI32(_BinaryenConstGetValueI32(expr));\n }\n case NativeType.I64: {\n return this.createI64(\n _BinaryenConstGetValueI64Low(expr),\n _BinaryenConstGetValueI64High(expr)\n );\n }\n case NativeType.F32: {\n return this.createF32(_BinaryenConstGetValueF32(expr));\n }\n case NativeType.F64: {\n return this.createF64(_BinaryenConstGetValueF64(expr));\n }\n default: {\n throw new Error(\"concrete type expected\");\n }\n }\n }\n case ExpressionId.GetLocal: {\n return _BinaryenGetLocal(this.ref,\n _BinaryenGetLocalGetIndex(expr),\n _BinaryenExpressionGetType(expr)\n );\n }\n case ExpressionId.GetGlobal: {\n let globalName = _BinaryenGetGlobalGetName(expr);\n if (!globalName) break;\n return _BinaryenGetGlobal(this.ref, globalName, _BinaryenExpressionGetType(expr));\n }\n case ExpressionId.Load: {\n if (!(nested1 = this.cloneExpression(_BinaryenLoadGetPtr(expr), noSideEffects, maxDepth))) {\n break;\n }\n return (\n _BinaryenLoadIsAtomic(expr)\n ? _BinaryenAtomicLoad(this.ref,\n _BinaryenLoadGetBytes(expr),\n _BinaryenLoadGetOffset(expr),\n _BinaryenExpressionGetType(expr),\n nested1\n )\n : _BinaryenLoad(this.ref,\n _BinaryenLoadGetBytes(expr),\n _BinaryenLoadIsSigned(expr) ? 1 : 0,\n _BinaryenLoadGetOffset(expr),\n _BinaryenLoadGetAlign(expr),\n _BinaryenExpressionGetType(expr),\n nested1\n )\n );\n }\n case ExpressionId.Unary: {\n if (!(nested1 = this.cloneExpression(_BinaryenUnaryGetValue(expr), noSideEffects, maxDepth))) {\n break;\n }\n return _BinaryenUnary(this.ref, _BinaryenUnaryGetOp(expr), nested1);\n }\n case ExpressionId.Binary: {\n if (!(nested1 = this.cloneExpression(_BinaryenBinaryGetLeft(expr), noSideEffects, maxDepth))) {\n break;\n }\n if (!(nested2 = this.cloneExpression(_BinaryenBinaryGetRight(expr), noSideEffects, maxDepth))) {\n break;\n }\n return _BinaryenBinary(this.ref, _BinaryenBinaryGetOp(expr), nested1, nested2);\n }\n }\n return 0;\n }\n\n // source map generation\n\n addDebugInfoFile(name: string): Index {\n var cStr = allocString(name);\n try {\n return _BinaryenModuleAddDebugInfoFileName(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n getDebugInfoFile(index: Index): string | null {\n return readString(_BinaryenModuleGetDebugInfoFileName(this.ref, index));\n }\n\n setDebugLocation(\n func: FunctionRef,\n expr: ExpressionRef,\n fileIndex: Index,\n lineNumber: Index,\n columnNumber: Index\n ): void {\n _BinaryenFunctionSetDebugLocation(func, expr, fileIndex, lineNumber, columnNumber);\n }\n}\n\n// expressions\n\nexport function getExpressionId(expr: ExpressionRef): ExpressionId {\n return _BinaryenExpressionGetId(expr);\n}\n\nexport function getExpressionType(expr: ExpressionRef): NativeType {\n return _BinaryenExpressionGetType(expr);\n}\n\nexport function getConstValueI32(expr: ExpressionRef): i32 {\n return _BinaryenConstGetValueI32(expr);\n}\n\nexport function getConstValueI64Low(expr: ExpressionRef): i32 {\n return _BinaryenConstGetValueI64Low(expr);\n}\n\nexport function getConstValueI64High(expr: ExpressionRef): i32 {\n return _BinaryenConstGetValueI64High(expr);\n}\n\nexport function getConstValueF32(expr: ExpressionRef): f32 {\n return _BinaryenConstGetValueF32(expr);\n}\n\nexport function getConstValueF64(expr: ExpressionRef): f32 {\n return _BinaryenConstGetValueF64(expr);\n}\n\nexport function getGetLocalIndex(expr: ExpressionRef): Index {\n return _BinaryenGetLocalGetIndex(expr);\n}\n\nexport function getSetLocalIndex(expr: ExpressionRef): Index {\n return _BinaryenSetLocalGetIndex(expr);\n}\n\nexport function getSetLocalValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenSetLocalGetValue(expr);\n}\n\nexport function isTeeLocal(expr: ExpressionRef): bool {\n return _BinaryenSetLocalIsTee(expr);\n}\n\nexport function getGetGlobalName(expr: ExpressionRef): string | null {\n return readString(_BinaryenGetGlobalGetName(expr));\n}\n\nexport function getBinaryOp(expr: ExpressionRef): BinaryOp {\n return _BinaryenBinaryGetOp(expr);\n}\n\nexport function getBinaryLeft(expr: ExpressionRef): ExpressionRef {\n return _BinaryenBinaryGetLeft(expr);\n}\n\nexport function getBinaryRight(expr: ExpressionRef): ExpressionRef {\n return _BinaryenBinaryGetRight(expr);\n}\n\nexport function getUnaryOp(expr: ExpressionRef): UnaryOp {\n return _BinaryenUnaryGetOp(expr);\n}\n\nexport function getUnaryValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenUnaryGetValue(expr);\n}\n\nexport function getLoadBytes(expr: ExpressionRef): u32 {\n return _BinaryenLoadGetBytes(expr);\n}\n\nexport function getLoadOffset(expr: ExpressionRef): u32 {\n return _BinaryenLoadGetOffset(expr);\n}\n\nexport function getLoadPtr(expr: ExpressionRef): ExpressionRef {\n return _BinaryenLoadGetPtr(expr);\n}\n\nexport function isLoadSigned(expr: ExpressionRef): bool {\n return _BinaryenLoadIsSigned(expr);\n}\n\nexport function getStoreBytes(expr: ExpressionRef): u32 {\n return _BinaryenStoreGetBytes(expr);\n}\n\nexport function getStoreOffset(expr: ExpressionRef): u32 {\n return _BinaryenStoreGetOffset(expr);\n}\n\nexport function getStorePtr(expr: ExpressionRef): ExpressionRef {\n return _BinaryenStoreGetPtr(expr);\n}\n\nexport function getStoreValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenStoreGetValue(expr);\n}\n\nexport function getBlockName(expr: ExpressionRef): string | null {\n return readString(_BinaryenBlockGetName(expr));\n}\n\nexport function getBlockChildCount(expr: ExpressionRef): Index {\n return _BinaryenBlockGetNumChildren(expr);\n}\n\nexport function getBlockChild(expr: ExpressionRef, index: Index): ExpressionRef {\n return _BinaryenBlockGetChild(expr, index);\n}\n\nexport function getIfCondition(expr: ExpressionRef): ExpressionRef {\n return _BinaryenIfGetCondition(expr);\n}\n\nexport function getIfTrue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenIfGetIfTrue(expr);\n}\n\nexport function getIfFalse(expr: ExpressionRef): ExpressionRef {\n return _BinaryenIfGetIfFalse(expr);\n}\n\nexport function getLoopName(expr: ExpressionRef): string | null {\n return readString(_BinaryenLoopGetName(expr));\n}\n\nexport function getLoopBody(expr: ExpressionRef): ExpressionRef {\n return _BinaryenLoopGetBody(expr);\n}\n\nexport function getBreakName(expr: ExpressionRef): string | null {\n return readString(_BinaryenBreakGetName(expr));\n}\n\nexport function getBreakCondition(expr: ExpressionRef): ExpressionRef {\n return _BinaryenBreakGetCondition(expr);\n}\n\nexport function getSelectThen(expr: ExpressionRef): ExpressionRef {\n return _BinaryenSelectGetIfTrue(expr);\n}\n\nexport function getSelectElse(expr: ExpressionRef): ExpressionRef {\n return _BinaryenSelectGetIfFalse(expr);\n}\n\nexport function getSelectCondition(expr: ExpressionRef): ExpressionRef {\n return _BinaryenSelectGetCondition(expr);\n}\n\nexport function getDropValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenDropGetValue(expr);\n}\n\nexport function getReturnValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenReturnGetValue(expr);\n}\n\nexport function getCallTarget(expr: ExpressionRef): string | null {\n return readString(_BinaryenCallGetTarget(expr));\n}\n\nexport function getHostOp(expr: ExpressionRef): ExpressionRef {\n return _BinaryenHostGetOp(expr);\n}\n\nexport function getHostOperandCount(expr: ExpressionRef): Index {\n return _BinaryenHostGetNumOperands(expr);\n}\n\nexport function getHostOperand(expr: ExpressionRef, index: Index): ExpressionRef {\n return _BinaryenHostGetOperand(expr, index);\n}\n\nexport function getHostName(expr: ExpressionRef): string | null {\n return readString(_BinaryenHostGetNameOperand(expr));\n}\n\n// functions\n\nexport function getFunctionBody(func: FunctionRef): ExpressionRef {\n return _BinaryenFunctionGetBody(func);\n}\n\nexport function getFunctionName(func: FunctionRef): string | null {\n return readString(_BinaryenFunctionGetName(func));\n}\n\nexport function getFunctionParamCount(func: FunctionRef): Index {\n return _BinaryenFunctionGetNumParams(func);\n}\n\nexport function getFunctionParamType(func: FunctionRef, index: Index): NativeType {\n return _BinaryenFunctionGetParam(func, index);\n}\n\nexport function getFunctionResultType(func: FunctionRef): NativeType {\n return _BinaryenFunctionGetResult(func);\n}\n\nexport class Relooper {\n\n module: Module;\n ref: RelooperRef;\n\n static create(module: Module): Relooper {\n var relooper = new Relooper();\n relooper.module = module;\n relooper.ref = _RelooperCreate(module.ref);\n return relooper;\n }\n\n private constructor() {}\n\n addBlock(code: ExpressionRef): RelooperBlockRef {\n return _RelooperAddBlock(this.ref, code);\n }\n\n addBranch(\n from: RelooperBlockRef,\n to: RelooperBlockRef,\n condition: ExpressionRef = 0,\n code: ExpressionRef = 0\n ): void {\n _RelooperAddBranch(from, to, condition, code);\n }\n\n addBlockWithSwitch(code: ExpressionRef, condition: ExpressionRef): RelooperBlockRef {\n return _RelooperAddBlockWithSwitch(this.ref, code, condition);\n }\n\n addBranchForSwitch(\n from: RelooperBlockRef,\n to: RelooperBlockRef,\n indexes: i32[],\n code: ExpressionRef = 0\n ): void {\n var cArr = allocI32Array(indexes);\n try {\n _RelooperAddBranchForSwitch(from, to, cArr, indexes.length, code);\n } finally {\n memory.free(cArr);\n }\n }\n\n renderAndDispose(entry: RelooperBlockRef, labelHelper: Index): ExpressionRef {\n return _RelooperRenderAndDispose(this.ref, entry, labelHelper);\n }\n}\n\n// export function hasSideEffects(expr: ExpressionRef): bool {\n// switch (_BinaryenExpressionGetId(expr = getPtr(expr))) {\n// case ExpressionId.GetLocal:\n// case ExpressionId.GetGlobal:\n// case ExpressionId.Const:\n// case ExpressionId.Nop:\n// case ExpressionId.Unreachable: {\n// return false;\n// }\n// case ExpressionId.Block: {\n// for (let i = 0, k = _BinaryenBlockGetNumChildren(expr); i < k; ++i) {\n// if (hasSideEffects(_BinaryenBlockGetChild(expr, i))) return true;\n// }\n// return false;\n// }\n// case ExpressionId.If: {\n// return hasSideEffects(_BinaryenIfGetCondition(expr))\n// || hasSideEffects(_BinaryenIfGetIfTrue(expr))\n// || hasSideEffects(_BinaryenIfGetIfFalse(expr));\n// }\n// case ExpressionId.Unary: {\n// return hasSideEffects(_BinaryenUnaryGetValue(expr));\n// }\n// case ExpressionId.Binary: {\n// return hasSideEffects(_BinaryenBinaryGetLeft(expr))\n// || hasSideEffects(_BinaryenBinaryGetRight(expr));\n// }\n// case ExpressionId.Drop: {\n// return hasSideEffects(_BinaryenDropGetValue(expr));\n// }\n// case ExpressionId.Select: {\n// return hasSideEffects(_BinaryenSelectGetIfTrue(expr))\n// || hasSideEffects(_BinaryenSelectGetIfFalse(expr))\n// || hasSideEffects(_BinaryenSelectGetCondition(expr));\n// }\n// }\n// return true;\n// }\n\n// helpers\n// can't do stack allocation here: STACKTOP is a global in WASM but a hidden variable in asm.js\n\nfunction allocU8Array(u8s: Uint8Array | null): usize {\n if (!u8s) return 0;\n var numValues = u8s.length;\n var ptr = memory.allocate(numValues);\n var idx = ptr;\n for (let i = 0; i < numValues; ++i) {\n store(idx++, u8s[i]);\n }\n return ptr;\n}\n\nfunction allocI32Array(i32s: i32[] | null): usize {\n if (!i32s) return 0;\n var ptr = memory.allocate(i32s.length << 2);\n var idx = ptr;\n for (let i = 0, k = i32s.length; i < k; ++i) {\n let val = i32s[i];\n // store(idx, val) is not portable\n store(idx , ( val & 0xff) as u8);\n store(idx + 1, ((val >> 8) & 0xff) as u8);\n store(idx + 2, ((val >> 16) & 0xff) as u8);\n store(idx + 3, ( val >>> 24 ) as u8);\n idx += 4;\n }\n return ptr;\n}\n\nfunction allocPtrArray(ptrs: usize[] | null): usize {\n return allocI32Array(ptrs); // TODO: WASM64 one day\n}\n\nfunction stringLengthUTF8(str: string): usize {\n var len = 0;\n for (let i = 0, k = str.length; i < k; ++i) {\n let u = str.charCodeAt(i);\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\n }\n if (u <= 0x7F) {\n ++len;\n } else if (u <= 0x7FF) {\n len += 2;\n } else if (u <= 0xFFFF) {\n len += 3;\n } else if (u <= 0x1FFFFF) {\n len += 4;\n } else if (u <= 0x3FFFFFF) {\n len += 5;\n } else {\n len += 6;\n }\n }\n return len;\n}\n\nvar cachedStrings = new Map();\n\nfunction allocString(str: string | null): usize {\n if (str == null) return 0;\n if (cachedStrings.has(str)) return cachedStrings.get(str);\n var ptr = memory.allocate(stringLengthUTF8(str) + 1);\n // the following is based on Emscripten's stringToUTF8Array\n var idx = ptr;\n for (let i = 0, k = str.length; i < k; ++i) {\n let u = str.charCodeAt(i);\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\n }\n if (u <= 0x7F) {\n store(idx++, u as u8);\n } else if (u <= 0x7FF) {\n store(idx++, (0xC0 | (u >>> 6) ) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n } else if (u <= 0xFFFF) {\n store(idx++, (0xE0 | (u >>> 12) ) as u8);\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n } else if (u <= 0x1FFFFF) {\n store(idx++, (0xF0 | (u >>> 18) ) as u8);\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n } else if (u <= 0x3FFFFFF) {\n store(idx++, (0xF8 | (u >>> 24) ) as u8);\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n } else {\n store(idx++, (0xFC | (u >>> 30) ) as u8);\n store(idx++, (0x80 | ((u >>> 24) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n }\n }\n store(idx, 0);\n cachedStrings.set(str, ptr);\n return ptr;\n}\n\nfunction readInt(ptr: usize): i32 {\n return (\n load(ptr ) |\n (load(ptr + 1) << 8) |\n (load(ptr + 2) << 16) |\n (load(ptr + 3) << 24)\n );\n}\n\nfunction readBuffer(ptr: usize, length: usize): Uint8Array {\n var ret = new Uint8Array(length);\n for (let i: usize = 0; i < length; ++i) {\n ret[i] = load(ptr + i);\n }\n return ret;\n}\n\nexport function readString(ptr: usize): string | null {\n if (!ptr) return null;\n var arr = new Array();\n // the following is based on Emscripten's UTF8ArrayToString\n var cp: u32;\n var u1: u32, u2: u32, u3: u32, u4: u32, u5: u32;\n while (cp = load(ptr++)) {\n if (!(cp & 0x80)) {\n arr.push(cp);\n continue;\n }\n u1 = load(ptr++) & 63;\n if ((cp & 0xE0) == 0xC0) {\n arr.push(((cp & 31) << 6) | u1);\n continue;\n }\n u2 = load(ptr++) & 63;\n if ((cp & 0xF0) == 0xE0) {\n cp = ((cp & 15) << 12) | (u1 << 6) | u2;\n } else {\n u3 = load(ptr++) & 63;\n if ((cp & 0xF8) == 0xF0) {\n cp = ((cp & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;\n } else {\n u4 = load(ptr++) & 63;\n if ((cp & 0xFC) == 0xF8) {\n cp = ((cp & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;\n } else {\n u5 = load(ptr++) & 63;\n cp = ((cp & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;\n }\n }\n }\n arr.push(cp);\n // if (cp < 0x10000) {\n // arr.push(cp);\n // } else {\n // var ch = cp - 0x10000;\n // arr.push(0xD800 | (ch >> 10));\n // arr.push(0xDC00 | (ch & 0x3FF));\n // }\n }\n // return String.fromCharCodes(arr);\n return String.fromCodePoints(arr);\n}\n\n/** Result structure of {@link Module#toBinary}. */\nexport class BinaryModule {\n /** WebAssembly binary. */\n output: Uint8Array;\n /** Source map, if generated. */\n sourceMap: string | null;\n}\n\n/** Tests if an expression needs an explicit 'unreachable' when it is the terminating statement. */\nexport function needsExplicitUnreachable(expr: ExpressionRef): bool {\n // not applicable if pushing a value to the stack\n switch (_BinaryenExpressionGetType(expr)) {\n case NativeType.I32:\n case NativeType.I64:\n case NativeType.F32:\n case NativeType.F64: return false;\n }\n switch (_BinaryenExpressionGetId(expr)) {\n case ExpressionId.Unreachable:\n case ExpressionId.Return: return false;\n case ExpressionId.Break: return _BinaryenBreakGetCondition(expr) != 0;\n case ExpressionId.Block: {\n if (!_BinaryenBlockGetName(expr)) { // can't break out of it\n let numChildren = _BinaryenBlockGetNumChildren(expr); // last child needs unreachable\n return numChildren > 0 && needsExplicitUnreachable(_BinaryenBlockGetChild(expr, numChildren - 1));\n }\n }\n }\n return true;\n}\n","/**\n * A TypeScript tokenizer modified for AssemblyScript.\n *\n * Skips over trivia and provides a general mark/reset mechanism for the parser to utilize on\n * ambiguous tokens.\n *\n * @module tokenizer\n *//***/\n\nimport {\n DiagnosticCode,\n DiagnosticMessage,\n DiagnosticEmitter\n} from \"./diagnostics\";\n\nimport {\n Source,\n CommentKind\n} from \"./ast\";\n\nimport {\n CharCode,\n isLineBreak,\n isWhiteSpace,\n isIdentifierStart,\n isIdentifierPart,\n isDecimalDigit,\n isOctalDigit,\n isKeywordCharacter\n} from \"./util\";\n\n/** Named token types. */\nexport enum Token {\n\n // keywords\n // discarded: ANY, BOOLEAN, NEVER, NUMBER, STRING, SYMBOL, UNDEFINED, LESSTHAN_SLASH\n\n ABSTRACT,\n AS,\n ASYNC,\n AWAIT, // ES2017\n BREAK, // ES2017\n CASE, // ES2017\n CATCH, // ES2017\n CLASS, // ES2017\n CONST, // ES2017\n CONTINUE, // ES2017\n CONSTRUCTOR,\n DEBUGGER, // ES2017\n DECLARE,\n DEFAULT, // ES2017\n DELETE, // ES2017\n DO, // ES2017\n ELSE, // ES2017\n ENUM, // ES2017 future\n EXPORT, // ES2017\n EXTENDS, // ES2017\n FALSE, // ES\n FINALLY, // ES2017\n FOR, // ES2017\n FROM, // AS possible identifier\n FUNCTION, // ES2017\n GET,\n IF, // ES2017\n IMPLEMENTS, // ES2017 non-lexical\n IMPORT, // ES2017\n IN, // ES2017\n INSTANCEOF, // ES2017\n INTERFACE, // ES2017 non-lexical\n IS,\n KEYOF,\n LET, // ES2017 non-lexical\n MODULE, // AS possible identifier\n NAMESPACE, // AS possible identifier\n NEW, // ES2017\n NULL, // ES\n OF,\n PACKAGE, // ES2017 non-lexical\n PRIVATE, // ES2017 non-lexical\n PROTECTED, // ES2017 non-lexical\n PUBLIC, // ES2017 non-lexical\n READONLY,\n RETURN, // ES2017\n SET,\n STATIC, // ES2017 non-lexical\n SUPER, // ES2017\n SWITCH, // ES2017\n THIS, // ES2017\n THROW, // ES2017\n TRUE, // ES\n TRY, // ES2017\n TYPE, // AS possible identifier\n TYPEOF, // ES2017\n VAR, // ES2017\n VOID, // ES2017\n WHILE, // ES2017\n WITH, // ES2017\n YIELD, // ES2017\n\n // punctuation\n\n OPENBRACE,\n CLOSEBRACE,\n OPENPAREN,\n CLOSEPAREN,\n OPENBRACKET,\n CLOSEBRACKET,\n DOT,\n DOT_DOT_DOT,\n SEMICOLON,\n COMMA,\n LESSTHAN,\n GREATERTHAN,\n LESSTHAN_EQUALS,\n GREATERTHAN_EQUALS,\n EQUALS_EQUALS,\n EXCLAMATION_EQUALS,\n EQUALS_EQUALS_EQUALS,\n EXCLAMATION_EQUALS_EQUALS,\n EQUALS_GREATERTHAN,\n PLUS,\n MINUS,\n ASTERISK_ASTERISK,\n ASTERISK,\n SLASH,\n PERCENT,\n PLUS_PLUS,\n MINUS_MINUS,\n LESSTHAN_LESSTHAN,\n GREATERTHAN_GREATERTHAN,\n GREATERTHAN_GREATERTHAN_GREATERTHAN,\n AMPERSAND,\n BAR,\n CARET,\n EXCLAMATION,\n TILDE,\n AMPERSAND_AMPERSAND,\n BAR_BAR,\n QUESTION,\n COLON,\n EQUALS,\n PLUS_EQUALS,\n MINUS_EQUALS,\n ASTERISK_EQUALS,\n ASTERISK_ASTERISK_EQUALS,\n SLASH_EQUALS,\n PERCENT_EQUALS,\n LESSTHAN_LESSTHAN_EQUALS,\n GREATERTHAN_GREATERTHAN_EQUALS,\n GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS,\n AMPERSAND_EQUALS,\n BAR_EQUALS,\n CARET_EQUALS,\n AT,\n\n // literals\n\n IDENTIFIER,\n STRINGLITERAL,\n INTEGERLITERAL,\n FLOATLITERAL,\n\n // meta\n\n INVALID,\n ENDOFFILE\n}\n\nexport enum IdentifierHandling {\n DEFAULT,\n PREFER,\n ALWAYS\n}\n\nexport function tokenFromKeyword(text: string): Token {\n assert(text.length);\n switch (text.charCodeAt(0)) {\n case CharCode.a: {\n switch (text) {\n case \"abstract\": return Token.ABSTRACT;\n case \"as\": return Token.AS;\n case \"async\": return Token.ASYNC;\n case \"await\": return Token.AWAIT;\n }\n break;\n }\n case CharCode.b: {\n switch (text) {\n case \"break\": return Token.BREAK;\n }\n break;\n }\n case CharCode.c: {\n switch (text) {\n case \"case\": return Token.CASE;\n case \"catch\": return Token.CATCH;\n case \"class\": return Token.CLASS;\n case \"continue\": return Token.CONTINUE;\n case \"const\": return Token.CONST;\n case \"constructor\": return Token.CONSTRUCTOR;\n }\n break;\n }\n case CharCode.d: {\n switch (text) {\n case \"debugger\": return Token.DEBUGGER;\n case \"declare\": return Token.DECLARE;\n case \"default\": return Token.DEFAULT;\n case \"delete\": return Token.DELETE;\n case \"do\": return Token.DO;\n }\n break;\n }\n case CharCode.e: {\n switch (text) {\n case \"else\": return Token.ELSE;\n case \"enum\": return Token.ENUM;\n case \"export\": return Token.EXPORT;\n case \"extends\": return Token.EXTENDS;\n }\n break;\n }\n case CharCode.f: {\n switch (text) {\n case \"false\": return Token.FALSE;\n case \"finally\": return Token.FINALLY;\n case \"for\": return Token.FOR;\n case \"from\": return Token.FROM;\n case \"function\": return Token.FUNCTION;\n }\n break;\n }\n case CharCode.g: {\n switch (text) {\n case \"get\": return Token.GET;\n }\n break;\n }\n case CharCode.i: {\n switch (text) {\n case \"if\": return Token.IF;\n case \"implements\": return Token.IMPLEMENTS;\n case \"import\": return Token.IMPORT;\n case \"in\": return Token.IN;\n case \"instanceof\": return Token.INSTANCEOF;\n case \"interface\": return Token.INTERFACE;\n case \"is\": return Token.IS;\n }\n break;\n }\n case CharCode.k: {\n switch (text) {\n case \"keyof\": return Token.KEYOF;\n }\n break;\n }\n case CharCode.l: {\n switch (text) {\n case \"let\": return Token.LET;\n }\n break;\n }\n case CharCode.m: {\n switch (text) {\n case \"module\": return Token.MODULE;\n }\n break;\n }\n case CharCode.n: {\n switch (text) {\n case \"namespace\": return Token.NAMESPACE;\n case \"new\": return Token.NEW;\n case \"null\": return Token.NULL;\n }\n break;\n }\n case CharCode.o: {\n switch (text) {\n case \"of\": return Token.OF;\n }\n break;\n }\n case CharCode.p: {\n switch (text) {\n case \"package\": return Token.PACKAGE;\n case \"private\": return Token.PRIVATE;\n case \"protected\": return Token.PROTECTED;\n case \"public\": return Token.PUBLIC;\n }\n break;\n }\n case CharCode.r: {\n switch (text) {\n case \"readonly\": return Token.READONLY;\n case \"return\": return Token.RETURN;\n }\n break;\n }\n case CharCode.s: {\n switch (text) {\n case \"set\": return Token.SET;\n case \"static\": return Token.STATIC;\n case \"super\": return Token.SUPER;\n case \"switch\": return Token.SWITCH;\n }\n break;\n }\n case CharCode.t: {\n switch (text) {\n case \"this\": return Token.THIS;\n case \"throw\": return Token.THROW;\n case \"true\": return Token.TRUE;\n case \"try\": return Token.TRY;\n case \"type\": return Token.TYPE;\n case \"typeof\": return Token.TYPEOF;\n }\n break;\n }\n case CharCode.v: {\n switch (text) {\n case \"var\": return Token.VAR;\n case \"void\": return Token.VOID;\n }\n break;\n }\n case CharCode.w: {\n switch (text) {\n case \"while\": return Token.WHILE;\n case \"with\": return Token.WITH;\n }\n break;\n }\n case CharCode.y: {\n switch (text) {\n case \"yield\": return Token.YIELD;\n }\n break;\n }\n }\n return Token.INVALID;\n}\n\nexport function tokenIsAlsoIdentifier(token: Token): bool {\n switch (token) {\n case Token.ABSTRACT:\n case Token.AS:\n case Token.CONSTRUCTOR:\n case Token.DECLARE:\n case Token.DELETE:\n case Token.FROM:\n case Token.FOR:\n case Token.GET:\n case Token.IS:\n case Token.KEYOF:\n case Token.MODULE:\n case Token.NAMESPACE:\n case Token.READONLY:\n case Token.SET:\n case Token.TYPE:\n case Token.VOID: return true;\n default: return false;\n }\n}\n\nexport function operatorTokenToString(token: Token): string {\n switch (token) {\n case Token.DELETE: return \"delete\";\n case Token.IN: return \"in\";\n case Token.INSTANCEOF: return \"instanceof\";\n case Token.NEW: return \"new\";\n case Token.TYPEOF: return \"typeof\";\n case Token.VOID: return \"void\";\n case Token.YIELD: return \"yield\";\n case Token.DOT_DOT_DOT: return \"...\";\n case Token.COMMA: return \",\";\n case Token.LESSTHAN: return \"<\";\n case Token.GREATERTHAN: return \">\";\n case Token.LESSTHAN_EQUALS: return \"<=\";\n case Token.GREATERTHAN_EQUALS: return \">=\";\n case Token.EQUALS_EQUALS: return \"==\";\n case Token.EXCLAMATION_EQUALS: return \"!=\";\n case Token.EQUALS_EQUALS_EQUALS: return \"===\";\n case Token.EXCLAMATION_EQUALS_EQUALS: return \"!==\";\n case Token.PLUS: return \"+\";\n case Token.MINUS: return \"-\";\n case Token.ASTERISK_ASTERISK: return \"**\";\n case Token.ASTERISK: return \"*\";\n case Token.SLASH: return \"/\";\n case Token.PERCENT: return \"%\";\n case Token.PLUS_PLUS: return \"++\";\n case Token.MINUS_MINUS: return \"--\";\n case Token.LESSTHAN_LESSTHAN: return \"<<\";\n case Token.GREATERTHAN_GREATERTHAN: return \">>\";\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return \">>>\";\n case Token.AMPERSAND: return \"&\";\n case Token.BAR: return \"|\";\n case Token.CARET: return \"^\";\n case Token.EXCLAMATION: return \"!\";\n case Token.TILDE: return \"~\";\n case Token.AMPERSAND_AMPERSAND: return \"&&\";\n case Token.BAR_BAR: return \"||\";\n case Token.EQUALS: return \"=\";\n case Token.PLUS_EQUALS: return \"+=\";\n case Token.MINUS_EQUALS: return \"-=\";\n case Token.ASTERISK_EQUALS: return \"*=\";\n case Token.ASTERISK_ASTERISK_EQUALS: return \"**=\";\n case Token.SLASH_EQUALS: return \"/=\";\n case Token.PERCENT_EQUALS: return \"%=\";\n case Token.LESSTHAN_LESSTHAN_EQUALS: return \"<<=\";\n case Token.GREATERTHAN_GREATERTHAN_EQUALS: return \">>=\";\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: return \">>>=\";\n case Token.AMPERSAND_EQUALS: return \"&=\";\n case Token.BAR_EQUALS: return \"|=\";\n case Token.CARET_EQUALS: return \"^=\";\n default: {\n assert(false);\n return \"\";\n }\n }\n}\n\nexport class Range {\n\n source: Source;\n start: i32;\n end: i32;\n\n // TODO: set these while tokenizing\n // line: i32;\n // column: i32;\n\n constructor(source: Source, start: i32, end: i32) {\n this.source = source;\n this.start = start;\n this.end = end;\n }\n\n static join(a: Range, b: Range): Range {\n if (a.source != b.source) throw new Error(\"source mismatch\");\n return new Range(a.source,\n a.start < b.start ? a.start : b.start,\n a.end > b.end ? a.end : b.end\n );\n }\n\n get atStart(): Range {\n return new Range(this.source, this.start, this.start);\n }\n get atEnd(): Range {\n return new Range(this.source, this.end, this.end);\n }\n\n get line(): i32 {\n var text = this.source.text;\n var line = 1;\n for (let pos = this.start; pos >= 0; --pos) {\n if (text.charCodeAt(pos) == CharCode.LINEFEED) line++;\n }\n return line;\n }\n\n get column(): i32 {\n var text = this.source.text;\n var column = 0;\n for (let pos = this.start - 1; pos >= 0; --pos) {\n if (text.charCodeAt(pos) == CharCode.LINEFEED) break;\n ++column;\n }\n return column;\n }\n\n toString(): string {\n return this.source.text.substring(this.start, this.end);\n }\n\n debugInfoRef: usize = 0;\n}\n\ndeclare function parseFloat(str: string): f64;\n\n/** Handler for intercepting comments while tokenizing. */\nexport type CommentHandler = (kind: CommentKind, text: string, range: Range) => void;\n\n/** Tokenizes a source to individual {@link Token}s. */\nexport class Tokenizer extends DiagnosticEmitter {\n\n source: Source;\n end: i32 = 0;\n\n pos: i32 = 0;\n token: Token = -1;\n tokenPos: i32 = 0;\n\n nextToken: Token = -1;\n nextTokenPos: i32 = 0;\n nextTokenOnNewLine: bool = false;\n\n onComment: CommentHandler | null = null;\n\n /** Constructs a new tokenizer. */\n constructor(source: Source, diagnostics: DiagnosticMessage[] | null = null) {\n super(diagnostics);\n this.source = source;\n this.pos = 0;\n this.end = source.text.length;\n this.diagnostics = diagnostics ? diagnostics : new Array();\n\n var text = source.text;\n\n // skip bom\n if (\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.BYTEORDERMARK\n ) {\n ++this.pos;\n }\n\n // skip shebang\n if (\n this.pos + 1 < this.end &&\n text.charCodeAt(this.pos) == CharCode.HASH &&\n text.charCodeAt(this.pos + 1) == CharCode.EXCLAMATION\n ) {\n this.pos += 2;\n while (\n this.pos < this.end &&\n text.charCodeAt(this.pos) != CharCode.LINEFEED\n ) {\n ++this.pos;\n }\n // 'next' now starts at lf or eof\n }\n }\n\n next(identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): Token {\n this.nextToken = -1;\n return this.token = this.unsafeNext(identifierHandling);\n }\n\n private unsafeNext(\n identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\n maxTokenLength: i32 = i32.MAX_VALUE\n ): Token {\n var text = this.source.text;\n while (this.pos < this.end) {\n this.tokenPos = this.pos;\n let c = text.charCodeAt(this.pos);\n switch (c) {\n case CharCode.CARRIAGERETURN: {\n if (!(\n ++this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.LINEFEED\n )) break;\n // otherwise fall-through\n }\n case CharCode.LINEFEED:\n case CharCode.TAB:\n case CharCode.VERTICALTAB:\n case CharCode.FORMFEED:\n case CharCode.SPACE: {\n ++this.pos;\n break;\n }\n case CharCode.EXCLAMATION: {\n ++this.pos;\n if (\n maxTokenLength > 1 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n if (\n maxTokenLength > 2 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.EXCLAMATION_EQUALS_EQUALS;\n }\n return Token.EXCLAMATION_EQUALS;\n }\n return Token.EXCLAMATION;\n }\n case CharCode.DOUBLEQUOTE:\n case CharCode.SINGLEQUOTE:\n case CharCode.BACKTICK: { // TODO\n return Token.STRINGLITERAL; // expects a call to readString\n }\n case CharCode.PERCENT: {\n ++this.pos;\n if (\n maxTokenLength > 1 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.PERCENT_EQUALS;\n }\n return Token.PERCENT;\n }\n case CharCode.AMPERSAND: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.AMPERSAND) {\n ++this.pos;\n return Token.AMPERSAND_AMPERSAND;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.AMPERSAND_EQUALS;\n }\n }\n return Token.AMPERSAND;\n }\n case CharCode.OPENPAREN: {\n ++this.pos;\n return Token.OPENPAREN;\n }\n case CharCode.CLOSEPAREN: {\n ++this.pos;\n return Token.CLOSEPAREN;\n }\n case CharCode.ASTERISK: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.ASTERISK_EQUALS;\n }\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) {\n ++this.pos;\n if (\n maxTokenLength > 2 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.ASTERISK_ASTERISK_EQUALS;\n }\n return Token.ASTERISK_ASTERISK;\n }\n }\n return Token.ASTERISK;\n }\n case CharCode.PLUS: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.PLUS) {\n ++this.pos;\n return Token.PLUS_PLUS;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.PLUS_EQUALS;\n }\n }\n return Token.PLUS;\n }\n case CharCode.COMMA: {\n ++this.pos;\n return Token.COMMA;\n }\n case CharCode.MINUS: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.MINUS) {\n ++this.pos;\n return Token.MINUS_MINUS;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.MINUS_EQUALS;\n }\n }\n return Token.MINUS;\n }\n case CharCode.DOT: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (isDecimalDigit(text.charCodeAt(this.pos))) {\n --this.pos;\n return Token.FLOATLITERAL; // expects a call to readFloat\n }\n if (\n maxTokenLength > 2 && this.pos + 1 < this.end &&\n text.charCodeAt(this.pos) == CharCode.DOT &&\n text.charCodeAt(this.pos + 1) == CharCode.DOT\n ) {\n this.pos += 2;\n return Token.DOT_DOT_DOT;\n }\n }\n return Token.DOT;\n }\n case CharCode.SLASH: {\n let commentStartPos = this.pos;\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.SLASH) { // single-line\n let commentKind = CommentKind.LINE;\n if (\n this.pos + 1 < this.end &&\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\n ) {\n ++this.pos;\n commentKind = CommentKind.TRIPLE;\n }\n while (++this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.LINEFEED) {\n ++this.pos;\n break;\n }\n }\n if (this.onComment) {\n this.onComment(\n commentKind,\n text.substring(commentStartPos, this.pos),\n this.range(commentStartPos, this.pos)\n );\n }\n break;\n }\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) { // multi-line\n let closed = false;\n while (++this.pos < this.end) {\n c = text.charCodeAt(this.pos);\n if (\n c == CharCode.ASTERISK &&\n this.pos + 1 < this.end &&\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\n ) {\n this.pos += 2;\n closed = true;\n break;\n }\n }\n if (!closed) {\n this.error(\n DiagnosticCode._0_expected,\n this.range(this.pos), \"*/\"\n );\n } else if (this.onComment) {\n this.onComment(\n CommentKind.BLOCK,\n text.substring(commentStartPos, this.pos),\n this.range(commentStartPos, this.pos)\n );\n }\n break;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.SLASH_EQUALS;\n }\n }\n return Token.SLASH;\n }\n case CharCode._0:\n case CharCode._1:\n case CharCode._2:\n case CharCode._3:\n case CharCode._4:\n case CharCode._5:\n case CharCode._6:\n case CharCode._7:\n case CharCode._8:\n case CharCode._9: {\n return this.testInteger()\n ? Token.INTEGERLITERAL // expects a call to readInteger\n : Token.FLOATLITERAL; // expects a call to readFloat\n }\n case CharCode.COLON: {\n ++this.pos;\n return Token.COLON;\n }\n case CharCode.SEMICOLON: {\n ++this.pos;\n return Token.SEMICOLON;\n }\n case CharCode.LESSTHAN: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.LESSTHAN) {\n ++this.pos;\n if (\n maxTokenLength > 2 &&\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.LESSTHAN_LESSTHAN_EQUALS;\n }\n return Token.LESSTHAN_LESSTHAN;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.LESSTHAN_EQUALS;\n }\n }\n return Token.LESSTHAN;\n }\n case CharCode.EQUALS: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n if (\n maxTokenLength > 2 &&\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.EQUALS_EQUALS_EQUALS;\n }\n return Token.EQUALS_EQUALS;\n }\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\n ++this.pos;\n return Token.EQUALS_GREATERTHAN;\n }\n }\n return Token.EQUALS;\n }\n case CharCode.GREATERTHAN: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\n ++this.pos;\n if (maxTokenLength > 2 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\n ++this.pos;\n if (\n maxTokenLength > 3 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS;\n }\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.GREATERTHAN_GREATERTHAN_EQUALS;\n }\n }\n return Token.GREATERTHAN_GREATERTHAN;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.GREATERTHAN_EQUALS;\n }\n }\n return Token.GREATERTHAN;\n }\n case CharCode.QUESTION: {\n ++this.pos;\n return Token.QUESTION;\n }\n case CharCode.OPENBRACKET: {\n ++this.pos;\n return Token.OPENBRACKET;\n }\n case CharCode.CLOSEBRACKET: {\n ++this.pos;\n return Token.CLOSEBRACKET;\n }\n case CharCode.CARET: {\n ++this.pos;\n if (\n maxTokenLength > 1 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.CARET_EQUALS;\n }\n return Token.CARET;\n }\n case CharCode.OPENBRACE: {\n ++this.pos;\n return Token.OPENBRACE;\n }\n case CharCode.BAR: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.BAR) {\n ++this.pos;\n return Token.BAR_BAR;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.BAR_EQUALS;\n }\n }\n return Token.BAR;\n }\n case CharCode.CLOSEBRACE: {\n ++this.pos;\n return Token.CLOSEBRACE;\n }\n case CharCode.TILDE: {\n ++this.pos;\n return Token.TILDE;\n }\n case CharCode.AT: {\n ++this.pos;\n return Token.AT;\n }\n default: {\n if (isIdentifierStart(c)) {\n if (isKeywordCharacter(c)) {\n let posBefore = this.pos;\n while (\n ++this.pos < this.end &&\n isIdentifierPart(c = text.charCodeAt(this.pos))\n ) {\n if (!isKeywordCharacter(c)) {\n this.pos = posBefore;\n return Token.IDENTIFIER;\n }\n }\n let keywordText = text.substring(posBefore, this.pos);\n let keywordToken = tokenFromKeyword(keywordText);\n if (\n keywordToken != Token.INVALID &&\n identifierHandling !== IdentifierHandling.ALWAYS &&\n !(\n identifierHandling === IdentifierHandling.PREFER &&\n tokenIsAlsoIdentifier(keywordToken)\n )\n ) {\n return keywordToken;\n }\n this.pos = posBefore;\n }\n return Token.IDENTIFIER; // expects a call to readIdentifier\n } else if (isWhiteSpace(c)) {\n ++this.pos;\n break;\n }\n this.error(\n DiagnosticCode.Invalid_character,\n this.range(this.pos, this.pos + 1)\n );\n ++this.pos;\n return Token.INVALID;\n }\n }\n }\n return Token.ENDOFFILE;\n }\n\n peek(\n checkOnNewLine: bool = false,\n identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\n maxCompoundLength: i32 = i32.MAX_VALUE\n ): Token {\n var text = this.source.text;\n if (this.nextToken < 0) {\n let posBefore = this.pos;\n let tokenBefore = this.token;\n let tokenPosBefore = this.tokenPos;\n this.nextToken = this.unsafeNext(identifierHandling, maxCompoundLength);\n this.nextTokenPos = this.tokenPos;\n if (checkOnNewLine) {\n this.nextTokenOnNewLine = false;\n for (let pos = posBefore, end = this.nextTokenPos; pos < end; ++pos) {\n if (isLineBreak(text.charCodeAt(pos))) {\n this.nextTokenOnNewLine = true;\n break;\n }\n }\n }\n this.pos = posBefore;\n this.token = tokenBefore;\n this.tokenPos = tokenPosBefore;\n }\n return this.nextToken;\n }\n\n skipIdentifier(identifierHandling: IdentifierHandling = IdentifierHandling.PREFER): bool {\n return this.skip(Token.IDENTIFIER, identifierHandling);\n }\n\n skip(token: Token, identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): bool {\n var posBefore = this.pos;\n var tokenBefore = this.token;\n var tokenPosBefore = this.tokenPos;\n var maxCompoundLength = i32.MAX_VALUE;\n switch (token) {\n case Token.GREATERTHAN: { // where parsing type arguments\n maxCompoundLength = 1;\n break;\n }\n }\n this.token = this.unsafeNext(identifierHandling, maxCompoundLength);\n if (this.token == token) {\n this.nextToken = -1;\n return true;\n } else {\n this.pos = posBefore;\n this.token = tokenBefore;\n this.tokenPos = tokenPosBefore;\n return false;\n }\n }\n\n mark(): State {\n var state: State;\n if (reusableState) {\n state = reusableState;\n reusableState = null;\n } else {\n state = new State();\n }\n state.pos = this.pos;\n state.token = this.token;\n state.tokenPos = this.tokenPos;\n return state;\n }\n\n discard(state: State): void {\n reusableState = state;\n }\n\n reset(state: State): void {\n this.pos = state.pos;\n this.token = state.token;\n this.tokenPos = state.tokenPos;\n this.nextToken = -1;\n }\n\n range(start: i32 = -1, end: i32 = -1): Range {\n if (start < 0) {\n start = this.tokenPos;\n end = this.pos;\n } else if (end < 0) {\n end = start;\n }\n return new Range(this.source, start, end);\n }\n\n readIdentifier(): string {\n var text = this.source.text;\n var start = this.pos;\n while (\n ++this.pos < this.end &&\n isIdentifierPart(text.charCodeAt(this.pos))\n );\n return text.substring(start, this.pos);\n }\n\n readString(): string {\n var text = this.source.text;\n var quote = text.charCodeAt(this.pos++);\n var start = this.pos;\n var result = \"\";\n while (true) {\n if (this.pos >= this.end) {\n result += text.substring(start, this.pos);\n this.error(\n DiagnosticCode.Unterminated_string_literal,\n this.range(start - 1, this.end)\n );\n break;\n }\n let c = text.charCodeAt(this.pos);\n if (c == quote) {\n result += text.substring(start, this.pos++);\n break;\n }\n if (c == CharCode.BACKSLASH) {\n result += text.substring(start, this.pos);\n result += this.readEscapeSequence();\n start = this.pos;\n continue;\n }\n if (isLineBreak(c)) {\n result += text.substring(start, this.pos);\n this.error(\n DiagnosticCode.Unterminated_string_literal,\n this.range(start - 1, this.pos)\n );\n break;\n }\n ++this.pos;\n }\n return result;\n }\n\n readEscapeSequence(): string {\n if (++this.pos >= this.end) {\n this.error(\n DiagnosticCode.Unexpected_end_of_text,\n this.range(this.end)\n );\n return \"\";\n }\n\n var text = this.source.text;\n var c = text.charCodeAt(this.pos++);\n switch (c) {\n case CharCode._0: return \"\\0\";\n case CharCode.b: return \"\\b\";\n case CharCode.t: return \"\\t\";\n case CharCode.n: return \"\\n\";\n case CharCode.v: return \"\\v\";\n case CharCode.f: return \"\\f\";\n case CharCode.r: return \"\\r\";\n case CharCode.SINGLEQUOTE: return \"'\";\n case CharCode.DOUBLEQUOTE: return \"\\\"\";\n case CharCode.u: {\n if (\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.OPENBRACE\n ) {\n ++this.pos;\n return this.readExtendedUnicodeEscape(); // \\u{DDDDDDDD}\n }\n return this.readUnicodeEscape(); // \\uDDDD\n }\n case CharCode.CARRIAGERETURN: {\n if (\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.LINEFEED\n ) {\n ++this.pos;\n }\n // fall through\n }\n case CharCode.LINEFEED:\n case CharCode.LINESEPARATOR:\n case CharCode.PARAGRAPHSEPARATOR: return \"\";\n default: return String.fromCharCode(c);\n }\n }\n\n readRegexpPattern(): string {\n var text = this.source.text;\n var start = this.pos;\n var escaped = false;\n while (true) {\n if (this.pos >= this.end) {\n this.error(\n DiagnosticCode.Unterminated_regular_expression_literal,\n this.range(start, this.end)\n );\n break;\n }\n if (text.charCodeAt(this.pos) == CharCode.BACKSLASH) {\n ++this.pos;\n escaped = true;\n continue;\n }\n let c = text.charCodeAt(this.pos);\n if (c == CharCode.SLASH && !escaped) break;\n if (isLineBreak(c)) {\n this.error(\n DiagnosticCode.Unterminated_regular_expression_literal,\n this.range(start, this.pos)\n );\n break;\n }\n ++this.pos;\n escaped = false;\n }\n return text.substring(start, this.pos);\n }\n\n readRegexpFlags(): string {\n var text = this.source.text;\n var start = this.pos;\n var flags = 0;\n while (this.pos < this.end) {\n let c: i32 = text.charCodeAt(this.pos);\n if (!isIdentifierPart(c)) break;\n ++this.pos;\n\n // make sure each supported flag is unique\n switch (c) {\n case CharCode.g: {\n flags |= flags & 1 ? -1 : 1;\n break;\n }\n case CharCode.i: {\n flags |= flags & 2 ? -1 : 2;\n break;\n }\n case CharCode.m: {\n flags |= flags & 4 ? -1 : 4;\n break;\n }\n default: {\n flags = -1;\n break;\n }\n }\n }\n if (flags == -1) {\n this.error(\n DiagnosticCode.Invalid_regular_expression_flags,\n this.range(start, this.pos)\n );\n }\n return text.substring(start, this.pos);\n }\n\n testInteger(): bool {\n var text = this.source.text;\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 1 < this.end) {\n switch (text.charCodeAt(this.pos + 2)) {\n case CharCode.X:\n case CharCode.x:\n case CharCode.B:\n case CharCode.b:\n case CharCode.O:\n case CharCode.o: return true;\n }\n }\n var pos = this.pos;\n while (pos < this.end) {\n let c = text.charCodeAt(pos);\n if (c == CharCode.DOT || c == CharCode.E || c == CharCode.e) {\n return false;\n }\n if ((c < CharCode._0 || c > CharCode._9) && c != CharCode._) break;\n // does not validate separator placement (this is done in readXYInteger)\n pos++;\n }\n return true;\n }\n\n readInteger(): I64 {\n var text = this.source.text;\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\n switch (text.charCodeAt(this.pos + 1)) {\n case CharCode.X:\n case CharCode.x: {\n this.pos += 2;\n return this.readHexInteger();\n }\n case CharCode.B:\n case CharCode.b: {\n this.pos += 2;\n return this.readBinaryInteger();\n }\n case CharCode.O:\n case CharCode.o: {\n this.pos += 2;\n return this.readOctalInteger();\n }\n }\n if (isOctalDigit(text.charCodeAt(this.pos + 1))) {\n let start = this.pos;\n ++this.pos;\n let value = this.readOctalInteger();\n this.error(\n DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode,\n this.range(start, this.pos)\n );\n return value;\n }\n }\n return this.readDecimalInteger();\n }\n\n readHexInteger(): I64 {\n var text = this.source.text;\n var start = this.pos;\n var value = i64_new(0, 0);\n var i64_16 = i64_new(16, 0);\n var sepEnd = start;\n while (this.pos < this.end) {\n let pos = this.pos;\n let c = text.charCodeAt(pos);\n if (c >= CharCode._0 && c <= CharCode._9) {\n // value = value * 16 + c - CharCode._0;\n value = i64_add(\n i64_mul(value, i64_16),\n i64_new(c - CharCode._0, 0)\n );\n } else if (c >= CharCode.A && c <= CharCode.F) {\n // value = value * 16 + 10 + c - CharCode.A;\n value = i64_add(\n i64_mul(value, i64_16),\n i64_new(10 + c - CharCode.A, 0)\n );\n } else if (c >= CharCode.a && c <= CharCode.f) {\n // value = value * 16 + 10 + c - CharCode.a;\n value = i64_add(\n i64_mul(value, i64_16),\n i64_new(10 + c - CharCode.a, 0)\n );\n } else if (c == CharCode._) {\n if (sepEnd == pos) {\n this.error(\n sepEnd == start\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\n this.range(pos)\n );\n }\n sepEnd = pos + 1;\n } else {\n break;\n }\n this.pos = pos + 1;\n }\n if (this.pos == start) {\n this.error(\n DiagnosticCode.Hexadecimal_digit_expected,\n this.range(start)\n );\n } else if (sepEnd == this.pos) {\n this.error(\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\n this.range(sepEnd - 1)\n );\n }\n return value;\n }\n\n readDecimalInteger(): I64 {\n var text = this.source.text;\n var start = this.pos;\n var value = i64_new(0, 0);\n var i64_10 = i64_new(10, 0);\n var sepEnd = start;\n while (this.pos < this.end) {\n let pos = this.pos;\n let c = text.charCodeAt(pos);\n if (c >= CharCode._0 && c <= CharCode._9) {\n // value = value * 10 + c - CharCode._0;\n value = i64_add(\n i64_mul(value, i64_10),\n i64_new(c - CharCode._0, 0)\n );\n } else if (c == CharCode._) {\n if (sepEnd == pos) {\n this.error(\n sepEnd == start\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\n this.range(pos)\n );\n }\n sepEnd = pos + 1;\n } else {\n break;\n }\n this.pos = pos + 1;\n }\n if (this.pos == start) {\n this.error(\n DiagnosticCode.Digit_expected,\n this.range(start)\n );\n } else if (sepEnd == this.pos) {\n this.error(\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\n this.range(sepEnd - 1)\n );\n }\n return value;\n }\n\n readOctalInteger(): I64 {\n var text = this.source.text;\n var start = this.pos;\n var value = i64_new(0, 0);\n var i64_8 = i64_new(8, 0);\n var sepEnd = start;\n while (this.pos < this.end) {\n let pos = this.pos;\n let c = text.charCodeAt(pos);\n if (c >= CharCode._0 && c <= CharCode._7) {\n // value = value * 8 + c - CharCode._0;\n value = i64_add(\n i64_mul(value, i64_8),\n i64_new(c - CharCode._0, 0)\n );\n } else if (c == CharCode._) {\n if (sepEnd == pos) {\n this.error(\n sepEnd == start\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\n this.range(pos)\n );\n }\n sepEnd = pos + 1;\n } else {\n break;\n }\n ++this.pos;\n }\n if (this.pos == start) {\n this.error(\n DiagnosticCode.Octal_digit_expected,\n this.range(start)\n );\n } else if (sepEnd == this.pos) {\n this.error(\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\n this.range(sepEnd - 1)\n );\n }\n return value;\n }\n\n readBinaryInteger(): I64 {\n var text = this.source.text;\n var start = this.pos;\n var value = i64_new(0, 0);\n var i64_2 = i64_new(2, 0);\n var i64_1 = i64_new(1, 0);\n var sepEnd = start;\n while (this.pos < this.end) {\n let pos = this.pos;\n let c = text.charCodeAt(pos);\n if (c == CharCode._0) {\n // value = value * 2;\n value = i64_mul(\n value,\n i64_2\n );\n } else if (c == CharCode._1) {\n // value = value * 2 + 1;\n value = i64_add(\n i64_mul(value, i64_2),\n i64_1\n );\n } else if (c == CharCode._) {\n if (sepEnd == pos) {\n this.error(\n sepEnd == start\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\n this.range(pos)\n );\n }\n sepEnd = pos + 1;\n } else {\n break;\n }\n this.pos = pos + 1;\n }\n if (this.pos == start) {\n this.error(\n DiagnosticCode.Binary_digit_expected,\n this.range(start)\n );\n } else if (sepEnd == this.pos) {\n this.error(\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\n this.range(sepEnd - 1)\n );\n }\n return value;\n }\n\n readFloat(): f64 {\n // var text = this.source.text;\n // if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\n // switch (text.charCodeAt(this.pos + 1)) {\n // case CharCode.X:\n // case CharCode.x: {\n // this.pos += 2;\n // return this.readHexFloat();\n // }\n // }\n // }\n return this.readDecimalFloat();\n }\n\n readDecimalFloat(): f64 {\n // TODO: numeric separators (parseFloat can't handle these)\n var start = this.pos;\n var text = this.source.text;\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\n ++this.pos;\n }\n if (this.pos < this.end && text.charCodeAt(this.pos) == CharCode.DOT) {\n ++this.pos;\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\n ++this.pos;\n }\n }\n if (this.pos < this.end) {\n let c = text.charCodeAt(this.pos);\n if (c == CharCode.E || c == CharCode.e) {\n if (\n ++this.pos < this.end && (\n text.charCodeAt(this.pos) == CharCode.MINUS ||\n text.charCodeAt(this.pos) == CharCode.PLUS\n ) &&\n isDecimalDigit(text.charCodeAt(this.pos + 1))\n ) {\n ++this.pos;\n }\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\n ++this.pos;\n }\n }\n }\n return parseFloat(text.substring(start, this.pos));\n }\n\n readHexFloat(): f64 {\n throw new Error(\"not implemented\"); // TBD\n }\n\n readUnicodeEscape(): string {\n var remain = 4;\n var value = 0;\n var text = this.source.text;\n while (this.pos < this.end) {\n let c = text.charCodeAt(this.pos++);\n if (c >= CharCode._0 && c <= CharCode._9) {\n value = value * 16 + c - CharCode._0;\n } else if (c >= CharCode.A && c <= CharCode.F) {\n value = value * 16 + 10 + c - CharCode.A;\n } else if (c >= CharCode.a && c <= CharCode.f) {\n value = value * 16 + 10 + c - CharCode.a;\n } else {\n this.error(\n DiagnosticCode.Hexadecimal_digit_expected,\n this.range(this.pos - 1, this.pos)\n );\n return \"\";\n }\n if (--remain == 0) break;\n }\n if (remain) {\n this.error(\n DiagnosticCode.Unexpected_end_of_text,\n this.range(this.pos)\n );\n return \"\";\n }\n return String.fromCharCode(value);\n }\n\n private readExtendedUnicodeEscape(): string {\n var start = this.pos;\n var value = this.readHexInteger();\n var value32 = i64_low(value);\n var invalid = false;\n\n assert(!i64_high(value));\n if (value32 > 0x10FFFF) {\n this.error(\n DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,\n this.range(start, this.pos)\n );\n invalid = true;\n }\n\n var text = this.source.text;\n if (this.pos >= this.end) {\n this.error(\n DiagnosticCode.Unexpected_end_of_text,\n this.range(start, this.end)\n );\n invalid = true;\n } else if (text.charCodeAt(this.pos) == CharCode.CLOSEBRACE) {\n ++this.pos;\n } else {\n this.error(\n DiagnosticCode.Unterminated_Unicode_escape_sequence,\n this.range(start, this.pos)\n );\n invalid = true;\n }\n\n if (invalid) return \"\";\n return value32 < 65536\n ? String.fromCharCode(value32)\n : String.fromCharCode(\n (((value32 - 65536) / 1024 | 0) + 0xD800) as i32,\n ( (value32 - 65536) % 1024 + 0xDC00) as i32\n );\n }\n\n finish(): void {\n }\n}\n\n/** Tokenizer state as returned by {@link Tokenizer#mark} and consumed by {@link Tokenizer#reset}. */\nexport class State {\n /** Current position. */\n pos: i32;\n /** Current token. */\n token: Token;\n /** Current token's position. */\n tokenPos: i32;\n}\n\n// Reusable state object to reduce allocations\nvar reusableState: State | null = null;\n","/**\n * Mappings from AssemblyScript types to WebAssembly types.\n * @module types\n *//***/\n\nimport {\n Class,\n FunctionTarget,\n Program,\n DecoratorFlags\n} from \"./program\";\n\nimport {\n NativeType,\n ExpressionRef,\n Module\n} from \"./module\";\n\n/** Indicates the kind of a type. */\nexport const enum TypeKind {\n\n // signed integers\n\n /** An 8-bit signed integer. */\n I8,\n /** A 16-bit signed integer. */\n I16,\n /** A 32-bit signed integer. */\n I32,\n /** A 64-bit signed integer. */\n I64,\n /** A 32-bit/64-bit signed integer, depending on the target. */\n ISIZE,\n\n // unsigned integers\n\n /** An 8-bit unsigned integer. */\n U8,\n /** A 16-bit unsigned integer. */\n U16,\n /** A 32-bit unsigned integer. Also the base of function types. */\n U32,\n /** A 64-bit unsigned integer. */\n U64,\n /** A 32-bit/64-bit unsigned integer, depending on the target. Also the base of class types. */\n USIZE,\n /** A 1-bit unsigned integer. */\n BOOL, // sic\n\n // floats\n\n /** A 32-bit float. */\n F32,\n /** A 64-bit double. */\n F64,\n\n // other\n\n /** No return type. */\n VOID\n}\n\n/** Indicates capabilities of a type. */\nexport const enum TypeFlags {\n NONE = 0,\n /** Is a signed type that can represent negative values. */\n SIGNED = 1 << 0,\n /** Is an unsigned type that cannot represent negative values. */\n UNSIGNED = 1 << 1,\n /** Is an integer type. */\n INTEGER = 1 << 2,\n /** Is a floating point type. */\n FLOAT = 1 << 3,\n /** Is a pointer type. */\n POINTER = 1 << 4,\n /** Is smaller than 32-bits. */\n SHORT = 1 << 5,\n /** Is larger than 32-bits. */\n LONG = 1 << 6,\n /** Is a value type. */\n VALUE = 1 << 7,\n /** Is a reference type. */\n REFERENCE = 1 << 8,\n /** Is a nullable type. */\n NULLABLE = 1 << 9\n}\n\n/** Represents a resolved type. */\nexport class Type {\n\n /** Type kind. */\n kind: TypeKind;\n /** Type flags. */\n flags: TypeFlags;\n /** Size in bits. */\n size: u32;\n /** Size in bytes. */\n byteSize: i32;\n /** Underlying class reference, if a class type. */\n classReference: Class | null;\n /** Underlying signature reference, if a function type. */\n signatureReference: Signature | null;\n /** Respective non-nullable type, if nullable. */\n nonNullableType: Type;\n /** Cached nullable type, if non-nullable. */\n private cachedNullableType: Type | null = null;\n\n /** Constructs a new resolved type. */\n constructor(kind: TypeKind, flags: TypeFlags, size: u32) {\n this.kind = kind;\n this.flags = flags;\n this.size = size;\n this.byteSize = ceil(size / 8);\n this.classReference = null;\n this.signatureReference = null;\n this.nonNullableType = this;\n }\n\n /** Returns the closest int type representing this type. */\n get intType(): Type {\n switch (this.kind) {\n case TypeKind.I8: return Type.i8;\n case TypeKind.I16: return Type.i16;\n case TypeKind.F32:\n case TypeKind.I32: return Type.i32;\n case TypeKind.F64:\n case TypeKind.I64: return Type.i64;\n case TypeKind.ISIZE: return this.size == 64 ? Type.isize64 : Type.isize32;\n case TypeKind.U8: return Type.u8;\n case TypeKind.U16: return Type.u16;\n case TypeKind.U32: return Type.u32;\n case TypeKind.U64: return Type.u64;\n case TypeKind.USIZE: return this.size == 64 ? Type.usize64 : Type.usize32;\n case TypeKind.BOOL:\n default: return Type.i32;\n }\n }\n\n /** Tests if this is a managed type that needs GC hooks. */\n isManaged(program: Program): bool {\n if (program.hasGC) {\n let classReference = this.classReference;\n return classReference !== null && !classReference.hasDecorator(DecoratorFlags.UNMANAGED);\n }\n return false;\n }\n\n /** Computes the sign-extending shift in the target type. */\n computeSmallIntegerShift(targetType: Type): u32 {\n return targetType.size - this.size;\n }\n\n /** Computes the truncating mask in the target type. */\n computeSmallIntegerMask(targetType: Type): u32 {\n var size = this.is(TypeFlags.UNSIGNED) ? this.size : this.size - 1;\n return ~0 >>> (targetType.size - size);\n }\n\n /** Tests if this type has (all of) the specified flags. */\n is(flags: TypeFlags): bool { return (this.flags & flags) == flags; }\n /** Tests if this type has any of the specified flags. */\n isAny(flags: TypeFlags): bool { return (this.flags & flags) != 0; }\n\n /** Composes a class type from this type and a class. */\n asClass(classType: Class): Type {\n assert(this.kind == TypeKind.USIZE && !this.classReference);\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\n ret.classReference = classType;\n return ret;\n }\n\n /** Composes a function type from this type and a function. */\n asFunction(signature: Signature): Type {\n assert(this.kind == TypeKind.U32 && !this.signatureReference);\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\n ret.signatureReference = signature;\n return ret;\n }\n\n /** Composes the respective nullable type of this type. */\n asNullable(): Type {\n assert(this.is(TypeFlags.REFERENCE));\n if (!this.cachedNullableType) {\n assert(!this.is(TypeFlags.NULLABLE));\n this.cachedNullableType = new Type(this.kind, this.flags | TypeFlags.NULLABLE, this.size);\n this.cachedNullableType.nonNullableType = this;\n this.cachedNullableType.classReference = this.classReference; // either a class reference\n this.cachedNullableType.signatureReference = this.signatureReference; // or a function reference\n }\n return this.cachedNullableType;\n }\n\n /** Tests if a value of this type is assignable to a target of the specified type. */\n isAssignableTo(target: Type, signednessIsRelevant: bool = false): bool {\n var currentClass: Class | null;\n var targetClass: Class | null;\n var currentFunction: Signature | null;\n var targetFunction: Signature | null;\n if (this.is(TypeFlags.REFERENCE)) {\n if (target.is(TypeFlags.REFERENCE)) {\n if (!this.is(TypeFlags.NULLABLE) || target.is(TypeFlags.NULLABLE)) {\n if (currentClass = this.classReference) {\n if (targetClass = target.classReference) {\n return currentClass.isAssignableTo(targetClass);\n }\n } else if (currentFunction = this.signatureReference) {\n if (targetFunction = target.signatureReference) {\n return currentFunction.isAssignableTo(targetFunction);\n }\n }\n }\n }\n } else if (!target.is(TypeFlags.REFERENCE)) {\n if (this.is(TypeFlags.INTEGER)) {\n if (target.is(TypeFlags.INTEGER)) {\n if (\n !signednessIsRelevant ||\n this == Type.bool || // a bool (0 or 1) can be safely assigned to all sorts of integers\n this.is(TypeFlags.SIGNED) == target.is(TypeFlags.SIGNED)\n ) {\n return this.size <= target.size;\n }\n } else if (target.kind == TypeKind.F32) {\n return this.size <= 23; // mantissa bits\n } else if (target.kind == TypeKind.F64) {\n return this.size <= 52; // ^\n }\n } else if (this.is(TypeFlags.FLOAT)) {\n if (target.is(TypeFlags.FLOAT)) {\n return this.size <= target.size;\n }\n }\n }\n return false;\n }\n\n /** Determines the common compatible type of two types, if any. */\n static commonCompatible(left: Type, right: Type, signednessIsImportant: bool): Type | null {\n if (right.isAssignableTo(left, signednessIsImportant)) return left;\n else if (left.isAssignableTo(right, signednessIsImportant)) return right;\n return null;\n }\n\n /** Converts this type to its TypeScript representation. */\n toString(kindOnly: bool = false): string {\n if (!kindOnly && this.is(TypeFlags.REFERENCE)) {\n let classReference = this.classReference;\n if (classReference) {\n return this.is(TypeFlags.NULLABLE)\n ? classReference.toString() + \" | null\"\n : classReference.toString();\n }\n let signatureReference = this.signatureReference;\n if (signatureReference) {\n return this.is(TypeFlags.NULLABLE)\n ? \"(\" + signatureReference.toString(true) + \") | null\"\n : signatureReference.toString(true);\n }\n assert(false);\n }\n switch (this.kind) {\n case TypeKind.I8: return \"i8\";\n case TypeKind.I16: return \"i16\";\n case TypeKind.I32: return \"i32\";\n case TypeKind.I64: return \"i64\";\n case TypeKind.ISIZE: return \"isize\";\n case TypeKind.U8: return \"u8\";\n case TypeKind.U16: return \"u16\";\n case TypeKind.U32: return \"u32\";\n case TypeKind.U64: return \"u64\";\n case TypeKind.USIZE: return \"usize\";\n case TypeKind.BOOL: return \"bool\";\n case TypeKind.F32: return \"f32\";\n case TypeKind.F64: return \"f64\";\n default: assert(false);\n case TypeKind.VOID: return \"void\";\n }\n }\n\n // Binaryen specific\n\n /** Converts this type to its respective native type. */\n toNativeType(): NativeType {\n switch (this.kind) {\n default: return NativeType.I32;\n case TypeKind.I64:\n case TypeKind.U64: return NativeType.I64;\n case TypeKind.ISIZE:\n case TypeKind.USIZE: return this.size == 64 ? NativeType.I64 : NativeType.I32;\n case TypeKind.F32: return NativeType.F32;\n case TypeKind.F64: return NativeType.F64;\n case TypeKind.VOID: return NativeType.None;\n }\n }\n\n /** Converts this type to its native `0` value. */\n toNativeZero(module: Module): ExpressionRef {\n switch (this.kind) {\n case TypeKind.VOID: assert(false);\n default: return module.createI32(0);\n case TypeKind.ISIZE:\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(0);\n case TypeKind.I64:\n case TypeKind.U64: return module.createI64(0);\n case TypeKind.F32: return module.createF32(0);\n case TypeKind.F64: return module.createF64(0);\n }\n }\n\n /** Converts this type to its native `1` value. */\n toNativeOne(module: Module): ExpressionRef {\n switch (this.kind) {\n case TypeKind.VOID: assert(false);\n default: return module.createI32(1);\n case TypeKind.ISIZE:\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(1);\n case TypeKind.I64:\n case TypeKind.U64: return module.createI64(1);\n case TypeKind.F32: return module.createF32(1);\n case TypeKind.F64: return module.createF64(1);\n }\n }\n\n /** Converts this type to its native `-1` value. */\n toNativeNegOne(module: Module): ExpressionRef {\n switch (this.kind) {\n case TypeKind.VOID: assert(false);\n default: return module.createI32(-1);\n case TypeKind.ISIZE:\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(-1);\n case TypeKind.I64:\n case TypeKind.U64: return module.createI64(-1, -1);\n case TypeKind.F32: return module.createF32(-1);\n case TypeKind.F64: return module.createF64(-1);\n }\n }\n\n /** Converts this type to its signature string. */\n toSignatureString(): string {\n switch (this.kind) {\n default: return \"i\";\n case TypeKind.I64:\n case TypeKind.U64: return \"I\";\n case TypeKind.ISIZE:\n case TypeKind.USIZE: return this.size == 64 ? \"I\" : \"i\";\n case TypeKind.F32: return \"f\";\n case TypeKind.F64: return \"F\";\n case TypeKind.VOID: return \"v\";\n }\n }\n\n // Types\n\n /** An 8-bit signed integer. */\n static readonly i8: Type = new Type(TypeKind.I8,\n TypeFlags.SIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 8\n );\n\n /** A 16-bit signed integer. */\n static readonly i16: Type = new Type(TypeKind.I16,\n TypeFlags.SIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 16\n );\n\n /** A 32-bit signed integer. */\n static readonly i32: Type = new Type(TypeKind.I32,\n TypeFlags.SIGNED |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit signed integer. */\n static readonly i64: Type = new Type(TypeKind.I64,\n TypeFlags.SIGNED |\n TypeFlags.LONG |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 64\n );\n\n /** A 32-bit signed size. WASM32 only. */\n static readonly isize32: Type = new Type(TypeKind.ISIZE,\n TypeFlags.SIGNED |\n TypeFlags.INTEGER |\n TypeFlags.POINTER |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit signed size. WASM64 only. */\n static readonly isize64: Type = new Type(TypeKind.ISIZE,\n TypeFlags.SIGNED |\n TypeFlags.LONG |\n TypeFlags.INTEGER |\n TypeFlags.POINTER |\n TypeFlags.VALUE, 64\n );\n\n /** An 8-bit unsigned integer. */\n static readonly u8: Type = new Type(TypeKind.U8,\n TypeFlags.UNSIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 8\n );\n\n /** A 16-bit unsigned integer. */\n static readonly u16: Type = new Type(TypeKind.U16,\n TypeFlags.UNSIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 16\n );\n\n /** A 32-bit unsigned integer. */\n static readonly u32: Type = new Type(TypeKind.U32,\n TypeFlags.UNSIGNED |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit unsigned integer. */\n static readonly u64: Type = new Type(TypeKind.U64,\n TypeFlags.UNSIGNED |\n TypeFlags.LONG |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 64\n );\n\n /** A 32-bit unsigned size. WASM32 only. */\n static readonly usize32: Type = new Type(TypeKind.USIZE,\n TypeFlags.UNSIGNED |\n TypeFlags.INTEGER |\n TypeFlags.POINTER |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit unsigned size. WASM64 only. */\n static readonly usize64: Type = new Type(TypeKind.USIZE,\n TypeFlags.UNSIGNED |\n TypeFlags.LONG |\n TypeFlags.INTEGER |\n TypeFlags.POINTER |\n TypeFlags.VALUE, 64\n );\n\n /** A 1-bit unsigned integer. */\n static readonly bool: Type = new Type(TypeKind.BOOL,\n TypeFlags.UNSIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 1\n );\n\n /** A 32-bit float. */\n static readonly f32: Type = new Type(TypeKind.F32,\n TypeFlags.SIGNED |\n TypeFlags.FLOAT |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit float. */\n static readonly f64: Type = new Type(TypeKind.F64,\n TypeFlags.SIGNED |\n TypeFlags.LONG |\n TypeFlags.FLOAT |\n TypeFlags.VALUE, 64\n );\n\n /** No return type. */\n static readonly void: Type = new Type(TypeKind.VOID, TypeFlags.NONE, 0);\n}\n\n/** Converts an array of types to an array of native types. */\nexport function typesToNativeTypes(types: Type[]): NativeType[] {\n var numTypes = types.length;\n var ret = new Array(numTypes);\n for (let i = 0; i < numTypes; ++i) ret[i] = types[i].toNativeType();\n return ret;\n}\n\n/** Converts an array of types to its combined string representation. */\nexport function typesToString(types: Type[]): string {\n var numTypes = types.length;\n if (!numTypes) return \"\";\n var sb = new Array(numTypes);\n for (let i = 0; i < numTypes; ++i) sb[i] = types[i].toString();\n return sb.join(\",\");\n}\n\n/** Represents a fully resolved function signature. */\nexport class Signature {\n\n /** Parameter types, if any, excluding `this`. */\n parameterTypes: Type[];\n /** Parameter names, if known, excluding `this`. */\n parameterNames: string[] | null;\n /** Number of required parameters excluding `this`. Other parameters are considered optional. */\n requiredParameters: i32;\n /** Return type. */\n returnType: Type;\n /** This type, if an instance signature. */\n thisType: Type | null;\n /** Whether the last parameter is a rest parameter. */\n hasRest: bool;\n /** Cached {@link FunctionTarget}. */\n cachedFunctionTarget: FunctionTarget | null = null;\n /** Respective function type. */\n type: Type;\n\n /** Constructs a new signature. */\n constructor(\n parameterTypes: Type[] | null = null,\n returnType: Type | null = null,\n thisType: Type | null = null\n ) {\n this.parameterTypes = parameterTypes ? parameterTypes : [];\n this.parameterNames = null;\n this.requiredParameters = 0;\n this.returnType = returnType ? returnType : Type.void;\n this.thisType = thisType;\n this.hasRest = false;\n this.type = Type.u32.asFunction(this);\n }\n\n asFunctionTarget(program: Program): FunctionTarget {\n var target = this.cachedFunctionTarget;\n if (!target) this.cachedFunctionTarget = target = new FunctionTarget(program, this);\n else assert(target.program == program);\n return target;\n }\n\n /** Gets the known or, alternatively, generic parameter name at the specified index. */\n getParameterName(index: i32): string {\n var parameterNames = this.parameterNames;\n return parameterNames && parameterNames.length > index\n ? parameterNames[index]\n : getDefaultParameterName(index);\n }\n\n /** Tests if a value of this function type is assignable to a target of the specified function type. */\n isAssignableTo(target: Signature): bool {\n // TODO: maybe cache results?\n\n // check `this` type\n var thisThisType = this.thisType;\n var targetThisType = target.thisType;\n if (thisThisType) {\n if (!(targetThisType && thisThisType.isAssignableTo(targetThisType))) return false;\n } else if (targetThisType) {\n return false;\n }\n\n // check rest parameter\n if (this.hasRest != target.hasRest) return false; // TODO\n\n // check parameter types\n var thisParameterTypes = this.parameterTypes;\n var targetParameterTypes = target.parameterTypes;\n var numParameters = thisParameterTypes.length;\n if (numParameters != targetParameterTypes.length) return false;\n for (let i = 0; i < numParameters; ++i) {\n let thisParameterType = thisParameterTypes[i];\n let targetParameterType = targetParameterTypes[i];\n if (!thisParameterType.isAssignableTo(targetParameterType)) return false;\n }\n\n // check return type\n var thisReturnType = this.returnType;\n var targetReturnType = target.returnType;\n return thisReturnType == targetReturnType || thisReturnType.isAssignableTo(targetReturnType);\n }\n\n /** Converts a signature to a function type string. */\n static makeSignatureString(parameterTypes: Type[] | null, returnType: Type, thisType: Type | null = null): string {\n var sb = [];\n if (thisType) sb.push(thisType.toSignatureString());\n if (parameterTypes) {\n for (let i = 0, k = parameterTypes.length; i < k; ++i) sb.push(parameterTypes[i].toSignatureString());\n }\n sb.push(returnType.toSignatureString());\n return sb.join(\"\");\n }\n\n /** Converts this signature to a function type string. */\n toSignatureString(): string {\n return Signature.makeSignatureString(this.parameterTypes, this.returnType, this.thisType);\n }\n\n /** Converts this signature to a string. */\n toString(includeThis: bool = false): string {\n var sb = new Array();\n sb.push(\"(\");\n var index = 0;\n var thisType = this.thisType;\n if (thisType) {\n if (includeThis) {\n sb.push(\"this: \");\n sb.push(thisType.toString());\n index = 1;\n }\n }\n var parameters = this.parameterTypes;\n var numParameters = parameters.length;\n if (numParameters) {\n let names = this.parameterNames;\n let numNames = names ? names.length : 0;\n let optionalStart = this.requiredParameters;\n let restIndex = this.hasRest ? numParameters - 1 : -1;\n for (let i = 0; i < numParameters; ++i, ++index) {\n if (index) sb.push(\", \");\n if (i == restIndex) sb.push(\"...\");\n if (i < numNames) sb.push((names)[i]);\n else sb.push(getDefaultParameterName(i));\n if (i >= optionalStart && i != restIndex) sb.push(\"?: \");\n else sb.push(\": \");\n sb.push(parameters[i].toString());\n }\n }\n sb.push(\") => \");\n sb.push(this.returnType.toString());\n return sb.join(\"\");\n }\n}\n\n// helpers\n\n// Cached default parameter names used where names are unknown.\nvar cachedDefaultParameterNames: string[] | null = null;\n\n/** Gets the cached default parameter name for the specified index. */\nexport function getDefaultParameterName(index: i32): string {\n if (!cachedDefaultParameterNames) cachedDefaultParameterNames = [];\n for (let i = cachedDefaultParameterNames.length; i <= index; ++i) {\n cachedDefaultParameterNames.push(\"arg$\" + i.toString(10));\n }\n return cachedDefaultParameterNames[index - 1];\n}\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\n * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAbort,\n compileIterateRoots,\n ensureGCHook\n} from \"./builtins\";\n\nimport {\n DiagnosticCode,\n DiagnosticEmitter\n} from \"./diagnostics\";\n\nimport {\n Module,\n MemorySegment,\n ExpressionRef,\n UnaryOp,\n BinaryOp,\n NativeType,\n FunctionRef,\n ExpressionId,\n FunctionTypeRef,\n GlobalRef,\n getExpressionId,\n getExpressionType,\n getConstValueI32,\n getConstValueI64Low,\n getConstValueI64High,\n getConstValueF32,\n getConstValueF64,\n getGetLocalIndex,\n getBlockChildCount,\n getBlockChild,\n getBlockName,\n needsExplicitUnreachable\n} from \"./module\";\n\nimport {\n CommonFlags,\n PATH_DELIMITER,\n INNER_DELIMITER,\n INSTANCE_DELIMITER,\n STATIC_DELIMITER,\n GETTER_PREFIX,\n SETTER_PREFIX\n} from \"./common\";\n\nimport {\n Program,\n ClassPrototype,\n Class,\n Element,\n ElementKind,\n Enum,\n Field,\n FunctionPrototype,\n Function,\n FunctionTarget,\n Global,\n Local,\n Namespace,\n EnumValue,\n Property,\n VariableLikeElement,\n FlowFlags,\n ConstantValueKind,\n Flow,\n OperatorKind,\n DecoratorFlags\n} from \"./program\";\n\nimport {\n Resolver, ReportMode\n} from \"./resolver\";\n\nimport {\n Token,\n operatorTokenToString\n} from \"./tokenizer\";\n\nimport {\n Node,\n NodeKind,\n TypeNode,\n Source,\n Range,\n DecoratorKind,\n AssertionKind,\n\n Statement,\n BlockStatement,\n BreakStatement,\n ClassDeclaration,\n ContinueStatement,\n DeclarationStatement,\n DoStatement,\n EmptyStatement,\n EnumDeclaration,\n ExportStatement,\n ExpressionStatement,\n FunctionDeclaration,\n ForStatement,\n IfStatement,\n ImportStatement,\n InstanceOfExpression,\n InterfaceDeclaration,\n NamespaceDeclaration,\n ReturnStatement,\n SwitchStatement,\n ThrowStatement,\n TryStatement,\n VariableDeclaration,\n VariableStatement,\n VoidStatement,\n WhileStatement,\n\n Expression,\n AssertionExpression,\n BinaryExpression,\n CallExpression,\n CommaExpression,\n ElementAccessExpression,\n FloatLiteralExpression,\n FunctionExpression,\n IdentifierExpression,\n IntegerLiteralExpression,\n LiteralExpression,\n LiteralKind,\n NewExpression,\n ObjectLiteralExpression,\n ParenthesizedExpression,\n PropertyAccessExpression,\n TernaryExpression,\n ArrayLiteralExpression,\n StringLiteralExpression,\n UnaryPostfixExpression,\n UnaryPrefixExpression,\n FieldDeclaration,\n\n nodeIsConstantValue,\n isLastStatement,\n findDecorator\n} from \"./ast\";\n\nimport {\n Type,\n TypeKind,\n TypeFlags,\n Signature,\n\n typesToNativeTypes\n} from \"./types\";\n\nimport {\n writeI8,\n writeI16,\n writeI32,\n writeI64,\n writeF32,\n writeF64,\n makeMap\n} from \"./util\";\n\n/** Compilation target. */\nexport enum Target {\n /** WebAssembly with 32-bit pointers. */\n WASM32,\n /** WebAssembly with 64-bit pointers. Experimental and not supported by any runtime yet. */\n WASM64\n}\n\n/** Compiler options. */\nexport class Options {\n\n /** WebAssembly target. Defaults to {@link Target.WASM32}. */\n target: Target = Target.WASM32;\n /** If true, compiles everything instead of just reachable code. */\n noTreeShaking: bool = false;\n /** If true, replaces assertions with nops. */\n noAssert: bool = false;\n /** If true, imports the memory provided by the embedder. */\n importMemory: bool = false;\n /** If true, imports the function table provided by the embedder. */\n importTable: bool = false;\n /** If true, generates information necessary for source maps. */\n sourceMap: bool = false;\n /** Static memory start offset. */\n memoryBase: i32 = 0;\n /** Global aliases. */\n globalAliases: Map | null = null;\n /** Additional features to activate. */\n features: Feature = Feature.NONE;\n\n /** Hinted optimize level. Not applied by the compiler itself. */\n optimizeLevelHint: i32 = 0;\n /** Hinted shrink level. Not applied by the compiler itself. */\n shrinkLevelHint: i32 = 0;\n\n /** Tests if the target is WASM64 or, otherwise, WASM32. */\n get isWasm64(): bool {\n return this.target == Target.WASM64;\n }\n\n /** Gets the unsigned size type matching the target. */\n get usizeType(): Type {\n return this.target == Target.WASM64 ? Type.usize64 : Type.usize32;\n }\n\n /** Gets the signed size type matching the target. */\n get isizeType(): Type {\n return this.target == Target.WASM64 ? Type.isize64 : Type.isize32;\n }\n\n /** Gets the native size type matching the target. */\n get nativeSizeType(): NativeType {\n return this.target == Target.WASM64 ? NativeType.I64 : NativeType.I32;\n }\n\n /** Tests if a specific feature is activated. */\n hasFeature(feature: Feature): bool {\n return (this.features & feature) != 0;\n }\n}\n\n/** Indicates specific features to activate. */\nexport const enum Feature {\n /** No additional features. */\n NONE = 0,\n /** Sign extension operations. */\n SIGN_EXTENSION = 1 << 0, // see: https://github.com/WebAssembly/sign-extension-ops\n /** Mutable global imports and exports. */\n MUTABLE_GLOBAL = 1 << 1 // see: https://github.com/WebAssembly/mutable-global\n}\n\n/** Indicates the desired kind of a conversion. */\nexport const enum ConversionKind {\n /** No conversion. */\n NONE,\n /** Implicit conversion. */\n IMPLICIT,\n /** Explicit conversion. */\n EXPLICIT\n}\n\n/** Indicates the desired wrap mode of a conversion. */\nexport const enum WrapMode {\n /** No wrapping. */\n NONE,\n /** Wrap small integer values. */\n WRAP\n}\n\n/** Compiler interface. */\nexport class Compiler extends DiagnosticEmitter {\n\n /** Program reference. */\n program: Program;\n /** Resolver reference. */\n resolver: Resolver;\n /** Provided options. */\n options: Options;\n /** Module instance being compiled. */\n module: Module;\n /** Current function in compilation. */\n currentFunction: Function;\n /** Current outer function in compilation, if compiling a function expression. */\n currentOuterFunction: Function | null = null;\n /** Current inline functions stack. */\n currentInlineFunctions: Function[] = [];\n /** Current enum in compilation. */\n currentEnum: Enum | null = null;\n /** Current type in compilation. */\n currentType: Type = Type.void;\n /** Start function being compiled. */\n startFunctionInstance: Function;\n /** Start function statements. */\n startFunctionBody: ExpressionRef[];\n /** Counting memory offset. */\n memoryOffset: I64;\n /** Memory segments being compiled. */\n memorySegments: MemorySegment[] = [];\n /** Map of already compiled static string segments. */\n stringSegments: Map = new Map();\n /** Function table being compiled. */\n functionTable: string[] = [ \"null\" ];\n /** Argument count helper global. */\n argcVar: GlobalRef = 0;\n /** Argument count helper setter. */\n argcSet: FunctionRef = 0;\n /** Indicates whether the iterateRoots function must be generated. */\n needsIterateRoots: bool = false;\n\n /** Compiles a {@link Program} to a {@link Module} using the specified options. */\n static compile(program: Program, options: Options | null = null): Module {\n return new Compiler(program, options).compile();\n }\n\n /** Constructs a new compiler for a {@link Program} using the specified options. */\n constructor(program: Program, options: Options | null = null) {\n super(program.diagnostics);\n this.program = program;\n this.resolver = program.resolver;\n if (!options) options = new Options();\n this.options = options;\n this.memoryOffset = i64_new(\n // leave space for `null`. also functions as a sentinel for erroneous stores at offset 0.\n // note that Binaryen's asm.js output utilizes the first 8 bytes for reinterpretations (#1547)\n max(options.memoryBase, 8)\n );\n this.module = Module.create();\n }\n\n /** Performs compilation of the underlying {@link Program} to a {@link Module}. */\n compile(): Module {\n var options = this.options;\n var module = this.module;\n var program = this.program;\n\n // initialize lookup maps, built-ins, imports, exports, etc.\n program.initialize(options);\n\n // set up the start function\n var startFunctionInstance = new Function(program.startFunction, \"start\", new Signature([], Type.void));\n this.startFunctionInstance = startFunctionInstance;\n var startFunctionBody = new Array();\n this.startFunctionBody = startFunctionBody;\n this.currentFunction = startFunctionInstance;\n\n // add a mutable heap base dummy\n if (options.isWasm64) {\n module.addGlobal(\n \"HEAP_BASE\",\n NativeType.I64,\n true,\n module.createI64(0, 0)\n );\n } else {\n module.addGlobal(\n \"HEAP_BASE\",\n NativeType.I32,\n false,\n module.createI32(0)\n );\n }\n\n // compile entry file(s) while traversing reachable elements\n var sources = program.sources;\n for (let i = 0, k = sources.length; i < k; ++i) {\n if (sources[i].isEntry) this.compileSource(sources[i]);\n }\n\n // compile the start function if not empty or called by main\n if (startFunctionBody.length || program.mainFunction !== null) {\n let signature = startFunctionInstance.signature;\n let funcRef = module.addFunction(\n startFunctionInstance.internalName,\n this.ensureFunctionType(\n signature.parameterTypes,\n signature.returnType,\n signature.thisType\n ),\n typesToNativeTypes(startFunctionInstance.additionalLocals),\n module.createBlock(null, startFunctionBody)\n );\n startFunctionInstance.finalize(module, funcRef);\n if (!program.mainFunction) module.setStart(funcRef);\n }\n\n // update the heap base pointer\n var memoryOffset = this.memoryOffset;\n memoryOffset = i64_align(memoryOffset, options.usizeType.byteSize);\n this.memoryOffset = memoryOffset;\n module.removeGlobal(\"HEAP_BASE\");\n if (options.isWasm64) {\n module.addGlobal(\n \"HEAP_BASE\",\n NativeType.I64,\n false,\n module.createI64(i64_low(memoryOffset), i64_high(memoryOffset))\n );\n } else {\n module.addGlobal(\n \"HEAP_BASE\",\n NativeType.I32,\n false,\n module.createI32(i64_low(memoryOffset))\n );\n }\n\n // set up memory\n module.setMemory(\n this.options.memoryBase /* is specified */ || this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0,\n Module.UNLIMITED_MEMORY,\n this.memorySegments,\n options.target,\n \"memory\"\n );\n\n // import memory if requested (default memory is named '0' by Binaryen)\n if (options.importMemory) module.addMemoryImport(\"0\", \"env\", \"memory\");\n\n // set up function table\n var functionTable = this.functionTable;\n module.setFunctionTable(functionTable.length, 0xffffffff, functionTable);\n module.addTableExport(\"0\", \"table\");\n module.addFunction(\"null\", this.ensureFunctionType(null, Type.void), null, module.createBlock(null, []));\n\n // import table if requested (default table is named '0' by Binaryen)\n if (options.importTable) module.addTableImport(\"0\", \"env\", \"table\");\n\n // set up module exports\n for (let [name, moduleExport] of program.moduleLevelExports) {\n this.makeModuleExport(name, moduleExport.element);\n }\n\n // set up gc\n if (this.needsIterateRoots) compileIterateRoots(this);\n\n return module;\n }\n\n /** Applies the respective module export(s) for the specified element. */\n private makeModuleExport(name: string, element: Element, prefix: string = \"\"): void {\n\n // traverse members\n var members = element.members;\n if (members) {\n let subPrefix = prefix + name + (element.kind == ElementKind.CLASS\n ? INSTANCE_DELIMITER\n : STATIC_DELIMITER\n );\n if (element.kind == ElementKind.NAMESPACE) {\n for (let member of members.values()) {\n if (!member.is(CommonFlags.EXPORT)) continue;\n this.makeModuleExport(member.simpleName, member, subPrefix);\n }\n } else {\n for (let member of members.values()) {\n if (member.is(CommonFlags.PRIVATE)) continue;\n this.makeModuleExport(member.simpleName, member, subPrefix);\n }\n }\n }\n\n switch (element.kind) {\n\n // export global\n case ElementKind.GLOBAL: {\n let isConst = element.is(CommonFlags.CONST) || element.is(CommonFlags.STATIC | CommonFlags.READONLY);\n if (!isConst && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\n let declaration = (element).declaration;\n if (declaration) {\n this.error(\n DiagnosticCode.Cannot_export_a_mutable_global,\n declaration.name.range\n );\n }\n } else {\n this.module.addGlobalExport(element.internalName, prefix + name);\n }\n break;\n }\n case ElementKind.ENUMVALUE: {\n if (!assert(element.parent).is(CommonFlags.CONST) && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\n let declaration = (element).declaration;\n if (declaration) {\n this.error(\n DiagnosticCode.Cannot_export_a_mutable_global,\n declaration.name.range\n );\n }\n } else {\n this.module.addGlobalExport(element.internalName, prefix + name);\n }\n break;\n }\n\n // export function\n case ElementKind.FUNCTION: {\n let instance = element;\n let signature = instance.signature;\n if (signature.requiredParameters < signature.parameterTypes.length) {\n // utilize trampoline to fill in omitted arguments\n instance = this.ensureTrampoline(instance);\n this.ensureArgcSet();\n }\n if (instance.is(CommonFlags.COMPILED)) this.module.addFunctionExport(instance.internalName, prefix + name);\n break;\n }\n\n // export getter and setter\n case ElementKind.PROPERTY: {\n let getter = assert((element).getterPrototype);\n this.makeModuleExport(GETTER_PREFIX + name, getter, prefix);\n let setter = (element).setterPrototype;\n if (setter) this.makeModuleExport(SETTER_PREFIX + name, setter, prefix);\n break;\n }\n\n // export a getter and a setter\n case ElementKind.FIELD: {\n let module = this.module;\n let type = (element).type;\n let nativeType = type.toNativeType();\n let offset = (element).memoryOffset;\n let usizeType = this.options.usizeType;\n let nativeSizeType = this.options.nativeSizeType;\n\n // make a getter\n let getterName = prefix + GETTER_PREFIX + name;\n module.addFunction(\n getterName,\n this.ensureFunctionType(null, type, usizeType),\n null,\n module.createLoad(\n type.byteSize,\n type.is(TypeFlags.SIGNED),\n module.createGetLocal(0, nativeSizeType),\n nativeType,\n offset\n )\n );\n module.addFunctionExport(getterName, getterName);\n\n // make a setter\n if (!element.is(CommonFlags.READONLY)) {\n let setterName = prefix + SETTER_PREFIX + name;\n module.addFunction(\n setterName,\n this.ensureFunctionType([ type ], Type.void, usizeType),\n null,\n module.createStore(\n type.byteSize,\n module.createGetLocal(0, nativeSizeType),\n module.createGetLocal(1, nativeType),\n nativeType,\n offset\n )\n );\n module.addFunctionExport(setterName, setterName);\n }\n break;\n }\n\n // skip prototype and export instances\n case ElementKind.FUNCTION_PROTOTYPE: {\n for (let instances of (element).instances.values()) {\n for (let instance of instances.values()) {\n let instanceName = name;\n if (instance.is(CommonFlags.GENERIC)) {\n let fullName = instance.internalName;\n instanceName += fullName.substring(fullName.lastIndexOf(\"<\"));\n }\n this.makeModuleExport(instanceName, instance, prefix);\n }\n }\n break;\n }\n case ElementKind.CLASS_PROTOTYPE: {\n for (let instance of (element).instances.values()) {\n let instanceName = name;\n if (instance.is(CommonFlags.GENERIC)) {\n let fullName = instance.internalName;\n instanceName += fullName.substring(fullName.lastIndexOf(\"<\"));\n }\n let ctor = instance.constructorInstance;\n if (ctor) this.makeModuleExport(instanceName + INSTANCE_DELIMITER + ctor.simpleName, ctor, prefix);\n this.makeModuleExport(instanceName, instance, prefix);\n }\n break;\n }\n\n // all possible members already handled above\n case ElementKind.ENUM:\n case ElementKind.CLASS:\n case ElementKind.NAMESPACE: break;\n\n default: assert(false);\n }\n }\n\n // sources\n\n /** Compiles a source by looking it up by path first. */\n compileSourceByPath(normalizedPathWithoutExtension: string, reportNode: Node): void {\n var source = this.program.lookupSourceByPath(normalizedPathWithoutExtension);\n if (source) this.compileSource(source);\n else {\n this.error(\n DiagnosticCode.File_0_not_found,\n reportNode.range, normalizedPathWithoutExtension\n );\n }\n }\n\n /** Compiles a source. */\n compileSource(source: Source): void {\n if (source.is(CommonFlags.COMPILED)) return;\n source.set(CommonFlags.COMPILED);\n\n // compile top-level statements\n var noTreeShaking = this.options.noTreeShaking;\n var isEntry = source.isEntry;\n var startFunctionInstance = this.startFunctionInstance;\n var startFunctionBody = this.startFunctionBody;\n var statements = source.statements;\n for (let i = 0, k = statements.length; i < k; ++i) {\n let statement = statements[i];\n switch (statement.kind) {\n case NodeKind.CLASSDECLARATION: {\n if (\n (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&\n !(statement).isGeneric\n ) {\n this.compileClassDeclaration(statement, []);\n }\n break;\n }\n case NodeKind.INTERFACEDECLARATION: break;\n case NodeKind.ENUMDECLARATION: {\n if (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) {\n this.compileEnumDeclaration(statement);\n }\n break;\n }\n case NodeKind.FUNCTIONDECLARATION: {\n if (\n (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&\n !(statement).isGeneric\n ) {\n this.compileFunctionDeclaration(statement, []);\n }\n break;\n }\n case NodeKind.IMPORT: {\n this.compileSourceByPath(\n (statement).normalizedPath,\n (statement).path\n );\n break;\n }\n case NodeKind.NAMESPACEDECLARATION: {\n if (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) {\n this.compileNamespaceDeclaration(statement);\n }\n break;\n }\n case NodeKind.VARIABLE: { // global, always compiled as initializers might have side effects\n let variableInit = this.compileVariableStatement(statement);\n if (variableInit) startFunctionBody.push(variableInit);\n break;\n }\n case NodeKind.EXPORT: {\n if ((statement).normalizedPath != null) {\n this.compileSourceByPath(\n (statement).normalizedPath,\n (statement).path\n );\n }\n if (noTreeShaking || isEntry) {\n this.compileExportStatement(statement);\n }\n break;\n }\n default: { // otherwise a top-level statement that is part of the start function's body\n let previousFunction = this.currentFunction;\n this.currentFunction = startFunctionInstance;\n startFunctionBody.push(this.compileStatement(statement));\n this.currentFunction = previousFunction;\n break;\n }\n }\n }\n }\n\n // globals\n\n compileGlobalDeclaration(declaration: VariableDeclaration): Global | null {\n // look up the initialized program element\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\n assert(element.kind == ElementKind.GLOBAL);\n if (!this.compileGlobal(element)) return null; // reports\n return element;\n }\n\n compileGlobal(global: Global): bool {\n if (global.is(CommonFlags.COMPILED)) return true;\n global.set(CommonFlags.COMPILED);\n\n var module = this.module;\n var declaration = global.declaration;\n var initExpr: ExpressionRef = 0;\n\n if (!global.is(CommonFlags.RESOLVED)) {\n if (declaration) {\n\n // resolve now if annotated\n if (declaration.type) {\n let resolvedType = this.resolver.resolveType(declaration.type); // reports\n if (!resolvedType) return false;\n if (resolvedType == Type.void) {\n this.error(\n DiagnosticCode.Type_expected,\n declaration.type.range\n );\n return false;\n }\n global.type = resolvedType;\n global.set(CommonFlags.RESOLVED);\n\n // infer from initializer if not annotated\n } else if (declaration.initializer) { // infer type using void/NONE for literal inference\n initExpr = this.compileExpressionRetainType( // reports\n declaration.initializer,\n Type.void,\n WrapMode.WRAP\n );\n if (this.currentType == Type.void) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n declaration.initializer.range, this.currentType.toString(), \"\"\n );\n return false;\n }\n global.type = this.currentType;\n global.set(CommonFlags.RESOLVED);\n\n // must either be annotated or have an initializer\n } else {\n this.error(\n DiagnosticCode.Type_expected,\n declaration.name.range.atEnd\n );\n return false;\n }\n } else {\n assert(false); // must have a declaration if resolved lazily\n }\n }\n\n // ambient builtins like 'HEAP_BASE' need to be resolved but are added explicitly\n if (global.is(CommonFlags.AMBIENT) && global.hasDecorator(DecoratorFlags.BUILTIN)) return true;\n\n var nativeType = global.type.toNativeType();\n var isDeclaredConstant = global.is(CommonFlags.CONST) || global.is(CommonFlags.STATIC | CommonFlags.READONLY);\n\n // handle imports\n if (global.is(CommonFlags.AMBIENT)) {\n\n // constant global\n if (isDeclaredConstant || this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\n global.set(CommonFlags.MODULE_IMPORT);\n if (declaration) {\n mangleImportName(global, declaration);\n } else {\n mangleImportName_moduleName = \"env\";\n mangleImportName_elementName = global.simpleName;\n }\n module.addGlobalImport(\n global.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n nativeType\n );\n global.set(CommonFlags.COMPILED);\n return true;\n\n // importing mutable globals is not supported in the MVP\n } else {\n this.error(\n DiagnosticCode.Operation_not_supported,\n assert(declaration).range\n );\n }\n return false;\n }\n\n // the MVP does not yet support initializer expressions other than constant values (and constant\n // get_globals), hence such initializations must be performed in the start function for now.\n var initializeInStart = false;\n\n // evaluate initializer if present\n if (declaration !== null && declaration.initializer !== null) {\n if (!initExpr) {\n initExpr = this.compileExpression(\n declaration.initializer,\n global.type,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP\n );\n }\n\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n if (isDeclaredConstant) {\n initExpr = module.precomputeExpression(initExpr);\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n this.warning(\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\n declaration.range\n );\n initializeInStart = true;\n }\n } else {\n initializeInStart = true;\n }\n }\n\n // explicitly inline if annotated\n if (global.hasDecorator(DecoratorFlags.INLINE)) {\n if (!initializeInStart) { // reported above\n assert(getExpressionId(initExpr) == ExpressionId.Const);\n let exprType = getExpressionType(initExpr);\n switch (exprType) {\n case NativeType.I32: {\n global.constantValueKind = ConstantValueKind.INTEGER;\n global.constantIntegerValue = i64_new(getConstValueI32(initExpr), 0);\n break;\n }\n case NativeType.I64: {\n global.constantValueKind = ConstantValueKind.INTEGER;\n global.constantIntegerValue = i64_new(\n getConstValueI64Low(initExpr),\n getConstValueI64High(initExpr)\n );\n break;\n }\n case NativeType.F32: {\n global.constantValueKind = ConstantValueKind.FLOAT;\n global.constantFloatValue = getConstValueF32(initExpr);\n break;\n }\n case NativeType.F64: {\n global.constantValueKind = ConstantValueKind.FLOAT;\n global.constantFloatValue = getConstValueF64(initExpr);\n break;\n }\n default: {\n assert(false);\n return false;\n }\n }\n global.set(CommonFlags.INLINED); // inline the value from now on\n }\n }\n\n // initialize to zero if there's no initializer\n } else {\n initExpr = global.type.toNativeZero(module);\n }\n\n var internalName = global.internalName;\n\n if (initializeInStart) { // initialize to mutable zero and set the actual value in start\n module.addGlobal(internalName, nativeType, true, global.type.toNativeZero(module));\n this.startFunctionBody.push(module.createSetGlobal(internalName, initExpr));\n\n } else { // compile normally\n module.addGlobal(internalName, nativeType, !isDeclaredConstant, initExpr);\n }\n return true;\n }\n\n // enums\n\n compileEnumDeclaration(declaration: EnumDeclaration): Enum | null {\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\n assert(element.kind == ElementKind.ENUM);\n if (!this.compileEnum(element)) return null;\n return element;\n }\n\n compileEnum(element: Enum): bool {\n if (element.is(CommonFlags.COMPILED)) return true;\n element.set(CommonFlags.COMPILED);\n\n var module = this.module;\n this.currentEnum = element;\n var previousValue: EnumValue | null = null;\n var previousValueIsMut = false;\n\n if (element.members) {\n for (let member of element.members.values()) {\n if (member.kind != ElementKind.ENUMVALUE) continue; // happens if an enum is also a namespace\n let initInStart = false;\n let val = member;\n let valueDeclaration = val.declaration;\n val.set(CommonFlags.COMPILED);\n let initExpr: ExpressionRef;\n if (valueDeclaration.value) {\n initExpr = this.compileExpression(\n valueDeclaration.value,\n Type.i32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n if (element.is(CommonFlags.CONST)) {\n initExpr = module.precomputeExpression(initExpr);\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n this.error(\n DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,\n valueDeclaration.value.range\n );\n initInStart = true;\n }\n } else {\n initInStart = true;\n }\n }\n } else if (previousValue == null) {\n initExpr = module.createI32(0);\n } else {\n if (previousValueIsMut) {\n this.error(\n DiagnosticCode.Enum_member_must_have_initializer,\n valueDeclaration.range\n );\n }\n initExpr = module.createBinary(BinaryOp.AddI32,\n module.createGetGlobal(previousValue.internalName, NativeType.I32),\n module.createI32(1)\n );\n initExpr = module.precomputeExpression(initExpr);\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n if (element.is(CommonFlags.CONST)) {\n this.error(\n DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,\n valueDeclaration.range\n );\n }\n initInStart = true;\n }\n }\n if (initInStart) {\n module.addGlobal(val.internalName, NativeType.I32, true, module.createI32(0));\n this.startFunctionBody.push(module.createSetGlobal(val.internalName, initExpr));\n previousValueIsMut = true;\n } else {\n module.addGlobal(val.internalName, NativeType.I32, !element.is(CommonFlags.CONST), initExpr);\n previousValueIsMut = false;\n }\n previousValue = val;\n }\n }\n this.currentEnum = null;\n return true;\n }\n\n // functions\n\n /** Compiles a top-level function given its declaration. */\n compileFunctionDeclaration(\n declaration: FunctionDeclaration,\n typeArguments: TypeNode[]\n ): Function | null {\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n return this.compileFunctionUsingTypeArguments( // reports\n element,\n typeArguments,\n makeMap(),\n null,\n (element).declaration.name\n );\n }\n\n /** Resolves the specified type arguments prior to compiling the resulting function instance. */\n compileFunctionUsingTypeArguments(\n prototype: FunctionPrototype,\n typeArguments: TypeNode[],\n contextualTypeArguments: Map,\n outerScope: Flow | null,\n reportNode: Node\n ): Function | null {\n var instance = this.resolver.resolveFunctionInclTypeArguments(\n prototype,\n typeArguments,\n contextualTypeArguments,\n reportNode\n );\n if (!instance) return null;\n instance.outerScope = outerScope;\n if (!this.compileFunction(instance)) return null; // reports\n return instance;\n }\n\n /** Either reuses or creates the function type matching the specified signature. */\n ensureFunctionType(\n parameterTypes: Type[] | null,\n returnType: Type,\n thisType: Type | null = null\n ): FunctionTypeRef {\n var numParameters = parameterTypes ? parameterTypes.length : 0;\n var paramTypes: NativeType[];\n var index = 0;\n if (thisType) {\n paramTypes = new Array(1 + numParameters);\n paramTypes[0] = thisType.toNativeType();\n index = 1;\n } else {\n paramTypes = new Array(numParameters);\n }\n if (parameterTypes) {\n for (let i = 0; i < numParameters; ++i, ++index) {\n paramTypes[index] = parameterTypes[i].toNativeType();\n }\n }\n var resultType = returnType.toNativeType();\n var module = this.module;\n var typeRef = module.getFunctionTypeBySignature(resultType, paramTypes);\n if (!typeRef) {\n let name = Signature.makeSignatureString(parameterTypes, returnType, thisType);\n typeRef = module.addFunctionType(name, resultType, paramTypes);\n }\n return typeRef;\n }\n\n /** Compiles just the body of a function in whatever is the current context. */\n private compileFunctionBody(instance: Function): ExpressionRef[] {\n var declaration = instance.prototype.declaration;\n var body = assert(declaration.body);\n if (body.kind == NodeKind.BLOCK) {\n return this.compileStatements((body).statements);\n } else {\n assert(body.kind == NodeKind.EXPRESSION);\n assert(instance.is(CommonFlags.ARROW));\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n let returnType = instance.signature.returnType;\n let flow = instance.flow;\n let stmt = this.compileExpression(\n (body).expression,\n returnType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n flow.set(FlowFlags.RETURNS);\n if (!flow.canOverflow(stmt, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\n return [ stmt ];\n }\n }\n\n /** Compiles a readily resolved function instance. */\n compileFunction(instance: Function): bool {\n if (instance.is(CommonFlags.COMPILED)) return true;\n assert(!(instance.is(CommonFlags.AMBIENT) && instance.hasDecorator(DecoratorFlags.BUILTIN)));\n instance.set(CommonFlags.COMPILED);\n\n var module = this.module;\n var signature = instance.signature;\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var funcRef: FunctionRef;\n\n // concrete function\n if (body) {\n\n // must not be ambient\n if (instance.is(CommonFlags.AMBIENT)) {\n this.error(\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\n declaration.name.range\n );\n }\n\n // cannot have an annotated external name\n if (instance.hasDecorator(DecoratorFlags.EXTERNAL)) {\n let decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\n this.error(\n DiagnosticCode.Operation_not_supported,\n decorator.range\n );\n }\n\n // compile body in this function's context\n let previousFunction = this.currentFunction;\n this.currentFunction = instance;\n let flow = instance.flow;\n let returnType = instance.signature.returnType;\n let stmts = this.compileFunctionBody(instance);\n flow.finalize();\n\n // make the main function call `start` implicitly once\n if (instance.is(CommonFlags.MAIN)) {\n module.addGlobal(\"~started\", NativeType.I32, true, module.createI32(0));\n stmts.unshift(\n module.createIf(\n module.createUnary(\n UnaryOp.EqzI32,\n module.createGetGlobal(\"~started\", NativeType.I32)\n ),\n module.createBlock(null, [\n module.createCall(\"start\", null, NativeType.None),\n module.createSetGlobal(\"~started\", module.createI32(1))\n ])\n )\n );\n }\n\n // make constructors return their instance pointer\n if (instance.is(CommonFlags.CONSTRUCTOR)) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\n\n if (!flow.isAny(FlowFlags.ANY_TERMINATING)) {\n\n // if `this` wasn't accessed before, allocate if necessary and initialize `this`\n if (!flow.is(FlowFlags.ALLOCATES)) {\n // {\n // if (!this) this = \n // this.a = X\n // this.b = Y\n // }\n stmts.push(\n module.createIf(\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\n module.createGetLocal(0, nativeSizeType)\n ),\n module.createSetLocal(0,\n this.makeAllocation(classInstance)\n )\n )\n );\n this.makeFieldInitialization(classInstance, stmts);\n }\n\n // implicitly return `this`\n stmts.push(\n module.createGetLocal(0, nativeSizeType)\n );\n }\n\n // check that super has been called if this is a derived class\n if ((classInstance).base && !flow.is(FlowFlags.CALLS_SUPER)) {\n this.error(\n DiagnosticCode.Constructors_for_derived_classes_must_contain_a_super_call,\n instance.prototype.declaration.range\n );\n }\n\n // if this is a normal function, make sure that all branches return\n } else if (returnType != Type.void && !flow.is(FlowFlags.RETURNS)) {\n this.error(\n DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\n declaration.signature.returnType.range\n );\n }\n\n this.currentFunction = previousFunction;\n\n // create the function\n funcRef = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmts.length\n ? stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, returnType.toNativeType())\n : module.createNop()\n );\n\n // imported function\n } else {\n if (!instance.is(CommonFlags.AMBIENT)) {\n this.error(\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\n declaration.name.range\n );\n }\n\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the import\n funcRef = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, funcRef);\n return true;\n }\n\n // namespaces\n\n compileNamespaceDeclaration(declaration: NamespaceDeclaration): void {\n var members = declaration.members;\n var noTreeShaking = this.options.noTreeShaking;\n for (let i = 0, k = members.length; i < k; ++i) {\n let member = members[i];\n switch (member.kind) {\n case NodeKind.CLASSDECLARATION: {\n if (\n (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\n !(member).isGeneric\n ) {\n this.compileClassDeclaration(member, []);\n }\n break;\n }\n case NodeKind.INTERFACEDECLARATION: {\n if (\n (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\n !(member).isGeneric\n ) {\n this.compileInterfaceDeclaration(member, []);\n }\n break;\n }\n case NodeKind.ENUMDECLARATION: {\n if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\n this.compileEnumDeclaration(member);\n }\n break;\n }\n case NodeKind.FUNCTIONDECLARATION: {\n if (\n (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\n !(member).isGeneric\n ) {\n this.compileFunctionDeclaration(member, []);\n }\n break;\n }\n case NodeKind.NAMESPACEDECLARATION: {\n if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\n this.compileNamespaceDeclaration(member);\n }\n break;\n }\n case NodeKind.VARIABLE: {\n if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\n let variableInit = this.compileVariableStatement(member, true);\n if (variableInit) this.startFunctionBody.push(variableInit);\n }\n break;\n }\n default: assert(false);\n }\n }\n }\n\n compileNamespace(ns: Namespace): void {\n if (!ns.members) return;\n\n var noTreeShaking = this.options.noTreeShaking;\n for (let element of ns.members.values()) {\n switch (element.kind) {\n case ElementKind.CLASS_PROTOTYPE: {\n if (\n (\n noTreeShaking ||\n (element).is(CommonFlags.EXPORT)\n ) && !(element).is(CommonFlags.GENERIC)\n ) {\n this.compileClassUsingTypeArguments(\n element,\n [],\n makeMap()\n );\n }\n break;\n }\n case ElementKind.ENUM: {\n this.compileEnum(element);\n break;\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (\n (\n noTreeShaking || (element).is(CommonFlags.EXPORT)\n ) && !(element).is(CommonFlags.GENERIC)\n ) {\n if (element.hasDecorator(DecoratorFlags.BUILTIN)) break;\n this.compileFunctionUsingTypeArguments(\n element,\n [],\n makeMap(),\n null,\n (element).declaration.name\n );\n }\n break;\n }\n case ElementKind.GLOBAL: {\n this.compileGlobal(element);\n break;\n }\n case ElementKind.NAMESPACE: {\n this.compileNamespace(element);\n break;\n }\n }\n }\n }\n\n // exports\n\n compileExportStatement(statement: ExportStatement): void {\n var fileLevelExports = this.program.fileLevelExports;\n var members = statement.members;\n if (!members) return; // filespace\n for (let i = 0, k = members.length; i < k; ++i) {\n let member = members[i];\n let element = fileLevelExports.get(\n statement.range.source.internalPath + PATH_DELIMITER + member.externalName.text\n );\n if (!element) continue; // reported in Program#initialize\n switch (element.kind) {\n case ElementKind.CLASS_PROTOTYPE: {\n if (!(element).is(CommonFlags.GENERIC)) {\n this.compileClassUsingTypeArguments(\n element,\n [],\n makeMap()\n );\n }\n break;\n }\n case ElementKind.ENUM: {\n this.compileEnum(element);\n break;\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (\n !(element).is(CommonFlags.GENERIC) &&\n statement.range.source.isEntry\n ) {\n this.compileFunctionUsingTypeArguments(\n element,\n [],\n makeMap(),\n null,\n (element).declaration.name\n );\n }\n break;\n }\n case ElementKind.GLOBAL: {\n this.compileGlobal(element);\n break;\n }\n case ElementKind.NAMESPACE: {\n this.compileNamespace(element);\n break;\n }\n }\n }\n }\n\n // classes\n\n compileClassDeclaration(\n declaration: ClassDeclaration,\n typeArguments: TypeNode[]\n ): void {\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n this.compileClassUsingTypeArguments(\n element,\n typeArguments,\n makeMap(),\n declaration\n );\n }\n\n compileClassUsingTypeArguments(\n prototype: ClassPrototype,\n typeArguments: TypeNode[],\n contextualTypeArguments: Map,\n alternativeReportNode: Node | null = null\n ): void {\n var instance = this.resolver.resolveClassInclTypeArguments(\n prototype,\n typeArguments,\n contextualTypeArguments,\n alternativeReportNode || prototype.declaration\n );\n if (!instance) return;\n this.compileClass(instance);\n }\n\n compileClass(instance: Class): bool {\n if (instance.is(CommonFlags.COMPILED)) return true;\n instance.set(CommonFlags.COMPILED);\n\n var staticMembers = instance.prototype.members;\n if (staticMembers) {\n for (let element of staticMembers.values()) {\n switch (element.kind) {\n case ElementKind.GLOBAL: {\n this.compileGlobal(element);\n break;\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (\n !(element).is(CommonFlags.GENERIC)\n ) {\n this.compileFunctionUsingTypeArguments(\n element,\n [],\n makeMap(),\n null,\n (element).declaration.name\n );\n }\n break;\n }\n case ElementKind.PROPERTY: {\n let getter = (element).getterPrototype;\n if (getter) {\n this.compileFunctionUsingTypeArguments(\n getter,\n [],\n makeMap(),\n null,\n getter.declaration.name\n );\n }\n let setter = (element).setterPrototype;\n if (setter) {\n this.compileFunctionUsingTypeArguments(\n setter,\n [],\n makeMap(),\n null,\n setter.declaration.name\n );\n }\n break;\n }\n }\n }\n }\n var ctorInstance = instance.constructorInstance;\n if (ctorInstance) this.compileFunction(ctorInstance);\n var instanceMembers = instance.members;\n if (instanceMembers) {\n for (let element of instanceMembers.values()) {\n switch (element.kind) {\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (\n !(element).is(CommonFlags.GENERIC)\n ) {\n this.compileFunctionUsingTypeArguments(\n element,\n [],\n makeMap(instance.contextualTypeArguments),\n null,\n (element).declaration.name\n );\n }\n break;\n }\n case ElementKind.FIELD: {\n element.set(CommonFlags.COMPILED);\n break;\n }\n case ElementKind.PROPERTY: {\n let getter = (element).getterPrototype;\n if (getter) {\n this.compileFunctionUsingTypeArguments(\n getter,\n [],\n makeMap(instance.contextualTypeArguments),\n null,\n getter.declaration.name\n );\n }\n let setter = (element).setterPrototype;\n if (setter) {\n this.compileFunctionUsingTypeArguments(\n setter,\n [],\n makeMap(instance.contextualTypeArguments),\n null,\n setter.declaration.name\n );\n }\n break;\n }\n }\n }\n }\n return true;\n }\n\n compileInterfaceDeclaration(\n declaration: InterfaceDeclaration,\n typeArguments: TypeNode[],\n contextualTypeArguments: Map | null = null,\n alternativeReportNode: Node | null = null\n ): void {\n // TODO\n this.error(\n DiagnosticCode.Operation_not_supported,\n declaration.range\n );\n }\n\n // memory\n\n /** Adds a static memory segment with the specified data. */\n addMemorySegment(buffer: Uint8Array, alignment: i32 = 8): MemorySegment {\n var memoryOffset = i64_align(this.memoryOffset, alignment);\n var segment = MemorySegment.create(buffer, memoryOffset);\n this.memorySegments.push(segment);\n this.memoryOffset = i64_add(memoryOffset, i64_new(buffer.length, 0));\n return segment;\n }\n\n // function table\n\n /** Ensures that a table entry exists for the specified function and returns its index. */\n ensureFunctionTableEntry(func: Function): i32 {\n assert(func.is(CommonFlags.COMPILED));\n if (func.functionTableIndex >= 0) {\n return func.functionTableIndex;\n }\n var functionTable = this.functionTable;\n var index = functionTable.length;\n if (!func.is(CommonFlags.TRAMPOLINE) && func.signature.requiredParameters < func.signature.parameterTypes.length) {\n // insert the trampoline if the function has optional parameters\n func = this.ensureTrampoline(func);\n }\n functionTable.push(func.internalName);\n func.functionTableIndex = index;\n return index;\n }\n\n // statements\n\n compileStatement(statement: Statement): ExpressionRef {\n var module = this.module;\n var stmt: ExpressionRef;\n switch (statement.kind) {\n case NodeKind.BLOCK: {\n stmt = this.compileBlockStatement(statement);\n break;\n }\n case NodeKind.BREAK: {\n stmt = this.compileBreakStatement(statement);\n break;\n }\n case NodeKind.CONTINUE: {\n stmt = this.compileContinueStatement(statement);\n break;\n }\n case NodeKind.DO: {\n stmt = this.compileDoStatement(statement);\n break;\n }\n case NodeKind.EMPTY: {\n stmt = this.compileEmptyStatement(statement);\n break;\n }\n case NodeKind.EXPRESSION: {\n stmt = this.compileExpressionStatement(statement);\n break;\n }\n case NodeKind.FOR: {\n stmt = this.compileForStatement(statement);\n break;\n }\n case NodeKind.IF: {\n stmt = this.compileIfStatement(statement);\n break;\n }\n case NodeKind.RETURN: {\n stmt = this.compileReturnStatement(statement);\n break;\n }\n case NodeKind.SWITCH: {\n stmt = this.compileSwitchStatement(statement);\n break;\n }\n case NodeKind.THROW: {\n stmt = this.compileThrowStatement(statement);\n break;\n }\n case NodeKind.TRY: {\n stmt = this.compileTryStatement(statement);\n break;\n }\n case NodeKind.VARIABLE: {\n stmt = this.compileVariableStatement(statement);\n if (!stmt) stmt = module.createNop();\n break;\n }\n case NodeKind.VOID: {\n stmt = this.compileVoidStatement(statement);\n break;\n }\n case NodeKind.WHILE: {\n stmt = this.compileWhileStatement(statement);\n break;\n }\n case NodeKind.TYPEDECLARATION: {\n // type declarations must be top-level because function bodies are evaluated when\n // reachaable only.\n if (this.currentFunction == this.startFunctionInstance) {\n return module.createNop();\n }\n // otherwise fall-through\n }\n default: {\n assert(false);\n stmt = module.createUnreachable();\n }\n }\n if (this.options.sourceMap) this.addDebugLocation(stmt, statement.range);\n return stmt;\n }\n\n compileStatements(statements: Statement[]): ExpressionRef[] {\n var numStatements = statements.length;\n var stmts = new Array(numStatements);\n stmts.length = 0;\n var flow = this.currentFunction.flow;\n for (let i = 0; i < numStatements; ++i) {\n let stmt = this.compileStatement(statements[i]);\n switch (getExpressionId(stmt)) {\n case ExpressionId.Block: {\n if (!getBlockName(stmt)) {\n for (let j = 0, k = getBlockChildCount(stmt); j < k; ++j) stmts.push(getBlockChild(stmt, j));\n break;\n }\n // fall-through\n }\n default: stmts.push(stmt);\n case ExpressionId.Nop:\n }\n if (flow.isAny(FlowFlags.ANY_TERMINATING)) {\n if (needsExplicitUnreachable(stmt)) stmts.push(this.module.createUnreachable());\n break;\n }\n }\n return stmts;\n }\n\n compileBlockStatement(statement: BlockStatement): ExpressionRef {\n var statements = statement.statements;\n var parentFlow = this.currentFunction.flow;\n var flow = parentFlow.fork();\n this.currentFunction.flow = flow;\n\n var stmts = this.compileStatements(statements);\n var stmt = stmts.length == 0\n ? this.module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : this.module.createBlock(null, stmts,getExpressionType(stmts[stmts.length - 1]));\n\n this.currentFunction.flow = flow.free();\n parentFlow.inherit(flow);\n return stmt;\n }\n\n compileBreakStatement(statement: BreakStatement): ExpressionRef {\n var module = this.module;\n if (statement.label) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n statement.label.range\n );\n return module.createUnreachable();\n }\n var flow = this.currentFunction.flow;\n var breakLabel = flow.breakLabel;\n if (breakLabel == null) {\n this.error(\n DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement,\n statement.range\n );\n return module.createUnreachable();\n }\n flow.set(FlowFlags.BREAKS);\n return module.createBreak(breakLabel);\n }\n\n compileContinueStatement(statement: ContinueStatement): ExpressionRef {\n var module = this.module;\n var label = statement.label;\n if (label) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n label.range\n );\n return module.createUnreachable();\n }\n // Check if 'continue' is allowed here\n var flow = this.currentFunction.flow;\n var continueLabel = flow.continueLabel;\n if (continueLabel == null) {\n this.error(\n DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement,\n statement.range\n );\n return module.createUnreachable();\n }\n flow.set(FlowFlags.CONTINUES);\n return module.createBreak(continueLabel);\n }\n\n compileDoStatement(statement: DoStatement): ExpressionRef {\n var currentFunction = this.currentFunction;\n var module = this.module;\n\n var label = currentFunction.enterBreakContext();\n var parentFlow = currentFunction.flow;\n var flow = parentFlow.fork();\n currentFunction.flow = flow;\n var breakLabel = \"break|\" + label;\n flow.breakLabel = breakLabel;\n var continueLabel = \"continue|\" + label;\n flow.continueLabel = continueLabel;\n\n var body = this.compileStatement(statement.statement);\n var condExpr = this.makeIsTrueish(\n this.compileExpression(statement.condition, Type.i32, ConversionKind.NONE, WrapMode.NONE),\n this.currentType\n );\n // TODO: check if condition is always false and if so, omit it (just a block)\n\n // Switch back to the parent flow\n currentFunction.flow = flow.free();\n currentFunction.leaveBreakContext();\n var terminated = flow.isAny(FlowFlags.ANY_TERMINATING);\n flow.unset(\n FlowFlags.BREAKS |\n FlowFlags.CONDITIONALLY_BREAKS |\n FlowFlags.CONTINUES |\n FlowFlags.CONDITIONALLY_CONTINUES\n );\n parentFlow.inherit(flow);\n\n var block: ExpressionRef[] = [\n module.createLoop(continueLabel,\n terminated\n ? body // skip trailing continue if unnecessary\n : module.createBlock(null, [\n body,\n module.createBreak(continueLabel, condExpr)\n ], NativeType.None)\n )\n ];\n if (terminated) block.push(module.createUnreachable());\n return module.createBlock(breakLabel, block);\n }\n\n compileEmptyStatement(statement: EmptyStatement): ExpressionRef {\n return this.module.createNop();\n }\n\n compileExpressionStatement(statement: ExpressionStatement): ExpressionRef {\n var expr = this.compileExpression(statement.expression, Type.void, ConversionKind.NONE, WrapMode.NONE);\n if (this.currentType != Type.void) {\n expr = this.module.createDrop(expr);\n this.currentType = Type.void;\n }\n return expr;\n }\n\n compileForStatement(statement: ForStatement): ExpressionRef {\n // A for statement initiates a new branch with its own scoped variables\n // possibly declared in its initializer, and break context.\n var currentFunction = this.currentFunction;\n var label = currentFunction.enterBreakContext();\n var parentFlow = currentFunction.flow;\n var flow = parentFlow.fork();\n currentFunction.flow = flow;\n var breakLabel = flow.breakLabel = \"break|\" + label;\n flow.breakLabel = breakLabel;\n var continueLabel = \"continue|\" + label;\n flow.continueLabel = continueLabel;\n var repeatLabel = \"repeat|\" + label;\n\n // Compile in correct order\n var module = this.module;\n var initExpr = statement.initializer\n ? this.compileStatement(statement.initializer)\n : 0;\n var condExpr: ExpressionRef = 0;\n var alwaysTrue = false;\n if (statement.condition) {\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n // check if the condition is always true\n let condPre = module.precomputeExpression(condExpr);\n if (getExpressionId(condPre) == ExpressionId.Const) {\n assert(getExpressionType(condPre) == NativeType.I32);\n if (getConstValueI32(condPre) != 0) alwaysTrue = true;\n // TODO: could skip compilation if the condition is always false here, but beware that the\n // initializer could still declare new 'var's that are used later on.\n }\n // recompile to original\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n } else {\n // omitted condition is always true\n condExpr = module.createI32(1);\n alwaysTrue = true;\n }\n var incrExpr = statement.incrementor\n ? this.compileExpression(statement.incrementor, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE)\n : 0;\n var bodyStatement = statement.statement;\n var bodyExpr = bodyStatement.kind == NodeKind.BLOCK && (bodyStatement).statements.length == 1\n ? this.compileStatement((bodyStatement).statements[0])\n : this.compileStatement(bodyStatement);\n\n // Switch back to the parent flow\n currentFunction.flow = flow.free();\n currentFunction.leaveBreakContext();\n var usesContinue = flow.isAny(FlowFlags.CONTINUES | FlowFlags.CONDITIONALLY_CONTINUES);\n flow.unset(\n FlowFlags.BREAKS |\n FlowFlags.CONDITIONALLY_BREAKS |\n FlowFlags.CONTINUES |\n FlowFlags.CONDITIONALLY_CONTINUES\n );\n if (alwaysTrue) parentFlow.inherit(flow);\n else parentFlow.inheritConditional(flow);\n\n var breakBlock = new Array(); // outer 'break' block\n if (initExpr) breakBlock.push(initExpr);\n\n var repeatBlock = new Array(); // block repeating the loop\n if (usesContinue) {\n repeatBlock.push(\n module.createBlock(continueLabel, [ // inner 'continue' block\n module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr)),\n bodyExpr\n ], NativeType.None)\n );\n } else { // can omit the 'continue' block\n repeatBlock.push(\n module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr))\n );\n repeatBlock.push(bodyExpr);\n }\n if (incrExpr) repeatBlock.push(incrExpr);\n repeatBlock.push(\n module.createBreak(repeatLabel)\n );\n\n breakBlock.push(\n module.createLoop(repeatLabel, module.createBlock(null, repeatBlock, NativeType.None))\n );\n\n return module.createBlock(breakLabel, breakBlock);\n }\n\n compileIfStatement(statement: IfStatement): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var ifTrue = statement.ifTrue;\n var ifFalse = statement.ifFalse;\n\n // The condition doesn't initiate a branch yet\n var condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n\n if (\n !this.options.noTreeShaking ||\n this.currentFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\n ) {\n // Try to eliminate unnecesssary branches if the condition is constant\n let condExprPrecomp = module.precomputeExpression(condExpr);\n if (\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\n getExpressionType(condExprPrecomp) == NativeType.I32\n ) {\n return getConstValueI32(condExprPrecomp)\n ? this.compileStatement(ifTrue)\n : ifFalse\n ? this.compileStatement(ifFalse)\n : module.createNop();\n\n // Otherwise recompile to the original and let the optimizer decide\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n }\n }\n\n // Each arm initiates a branch\n var parentFlow = currentFunction.flow;\n var ifTrueFlow = parentFlow.fork();\n currentFunction.flow = ifTrueFlow;\n var ifTrueExpr = this.compileStatement(ifTrue);\n currentFunction.flow = ifTrueFlow.free();\n\n var ifFalseExpr: ExpressionRef = 0;\n if (ifFalse) {\n let ifFalseFlow = parentFlow.fork();\n currentFunction.flow = ifFalseFlow;\n ifFalseExpr = this.compileStatement(ifFalse);\n currentFunction.flow = ifFalseFlow.free();\n parentFlow.inheritMutual(ifTrueFlow, ifFalseFlow);\n } else {\n parentFlow.inheritConditional(ifTrueFlow);\n }\n return module.createIf(condExpr, ifTrueExpr, ifFalseExpr);\n }\n\n compileReturnStatement(statement: ReturnStatement): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var expr: ExpressionRef = 0;\n var flow = currentFunction.flow;\n\n // Remember that this flow returns\n flow.set(FlowFlags.RETURNS);\n\n if (statement.value) {\n let returnType = flow.returnType;\n if (returnType == Type.void) {\n this.compileExpressionRetainType(statement.value, returnType, WrapMode.NONE);\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n statement.value.range, this.currentType.toString(), returnType.toString()\n );\n this.currentType = Type.void;\n return module.createUnreachable();\n }\n expr = this.compileExpression(\n statement.value,\n returnType,\n ConversionKind.IMPLICIT,\n currentFunction.is(CommonFlags.MODULE_EXPORT)\n ? WrapMode.WRAP\n : WrapMode.NONE\n );\n\n // Remember whether returning a properly wrapped value\n if (!flow.canOverflow(expr, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\n }\n\n // If the last statement anyway, make it the block's return value\n if (isLastStatement(statement)) return expr ? expr : module.createNop();\n\n // When inlining, break to the end of the inlined function's block (no need to wrap)\n return flow.is(FlowFlags.INLINE_CONTEXT)\n ? module.createBreak(assert(flow.returnLabel), 0, expr)\n : module.createReturn(expr);\n }\n\n compileSwitchStatement(statement: SwitchStatement): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n\n var cases = statement.cases;\n var numCases = cases.length;\n if (!numCases) {\n return this.compileExpression(statement.condition, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE);\n }\n\n // Everything within a switch uses the same break context\n var context = currentFunction.enterBreakContext();\n var parentFlow = currentFunction.flow;\n\n // introduce a local for evaluating the condition (exactly once)\n var tempLocal = currentFunction.getTempLocal(Type.u32, false);\n var tempLocalIndex = tempLocal.index;\n\n // Prepend initializer to inner block. Does not initiate a new branch, yet.\n var breaks = new Array(1 + numCases);\n breaks[0] = module.createSetLocal( // initializer\n tempLocalIndex,\n this.compileExpression(statement.condition, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\n );\n\n // make one br_if per (possibly dynamic) labeled case (binaryen optimizes to br_table where possible)\n var breakIndex = 1;\n var defaultIndex = -1;\n for (let i = 0; i < numCases; ++i) {\n let case_ = cases[i];\n let label = case_.label;\n if (label) {\n breaks[breakIndex++] = module.createBreak(\"case\" + i.toString(10) + \"|\" + context,\n module.createBinary(BinaryOp.EqI32,\n module.createGetLocal(tempLocalIndex, NativeType.I32),\n this.compileExpression(label, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\n )\n );\n } else {\n defaultIndex = i;\n }\n }\n\n currentFunction.freeTempLocal(tempLocal);\n\n // otherwise br to default respectively out of the switch if there is no default case\n breaks[breakIndex] = module.createBreak((defaultIndex >= 0\n ? \"case\" + defaultIndex.toString(10)\n : \"break\"\n ) + \"|\" + context);\n\n // nest blocks in order\n var currentBlock = module.createBlock(\"case0|\" + context, breaks, NativeType.None);\n var alwaysReturns = true;\n var alwaysReturnsWrapped = true;\n var alwaysThrows = true;\n var alwaysAllocates = true;\n for (let i = 0; i < numCases; ++i) {\n let case_ = cases[i];\n let statements = case_.statements;\n let numStatements = statements.length;\n\n // Each switch case initiates a new branch\n let flow = parentFlow.fork();\n currentFunction.flow = flow;\n let breakLabel = \"break|\" + context;\n flow.breakLabel = breakLabel;\n\n let isLast = i == numCases - 1;\n let nextLabel = isLast ? breakLabel : \"case\" + (i + 1).toString(10) + \"|\" + context;\n let stmts = new Array(1 + numStatements);\n stmts[0] = currentBlock;\n let count = 1;\n let terminated = false;\n for (let j = 0; j < numStatements; ++j) {\n let stmt = this.compileStatement(statements[j]);\n if (getExpressionId(stmt) != ExpressionId.Nop) {\n stmts[count++] = stmt;\n if (flow.isAny(FlowFlags.ANY_TERMINATING)) {\n terminated = true;\n break;\n }\n }\n }\n stmts.length = count;\n if (terminated || isLast) {\n if (!flow.is(FlowFlags.RETURNS)) alwaysReturns = false;\n if (!flow.is(FlowFlags.RETURNS_WRAPPED)) alwaysReturnsWrapped = false;\n if (!flow.is(FlowFlags.THROWS)) alwaysThrows = false;\n if (!flow.is(FlowFlags.ALLOCATES)) alwaysAllocates = false;\n }\n\n // Switch back to the parent flow\n flow.unset(\n FlowFlags.BREAKS |\n FlowFlags.CONDITIONALLY_BREAKS\n );\n currentFunction.flow = flow.free();\n currentBlock = module.createBlock(nextLabel, stmts, NativeType.None); // must be a labeled block\n }\n currentFunction.leaveBreakContext();\n\n // If the switch has a default (guaranteed to handle any value), propagate common flags\n if (defaultIndex >= 0) {\n if (alwaysReturns) parentFlow.set(FlowFlags.RETURNS);\n if (alwaysReturnsWrapped) parentFlow.set(FlowFlags.RETURNS_WRAPPED);\n if (alwaysThrows) parentFlow.set(FlowFlags.THROWS);\n if (alwaysAllocates) parentFlow.set(FlowFlags.ALLOCATES);\n }\n return currentBlock;\n }\n\n compileThrowStatement(statement: ThrowStatement): ExpressionRef {\n var flow = this.currentFunction.flow;\n\n // Remember that this branch throws\n flow.set(FlowFlags.THROWS);\n\n // FIXME: without try-catch it is safe to assume RETURNS as well for now\n flow.set(FlowFlags.RETURNS);\n\n // TODO: requires exception-handling spec.\n return compileAbort(this, null, statement);\n }\n\n compileTryStatement(statement: TryStatement): ExpressionRef {\n // TODO\n // can't yet support something like: try { return ... } finally { ... }\n // worthwhile to investigate lowering returns to block results (here)?\n this.error(\n DiagnosticCode.Operation_not_supported,\n statement.range\n );\n return this.module.createUnreachable();\n }\n\n /**\n * Compiles a variable statement. Returns `0` if an initializer is not\n * necessary.\n */\n compileVariableStatement(statement: VariableStatement, isKnownGlobal: bool = false): ExpressionRef {\n var program = this.program;\n var currentFunction = this.currentFunction;\n var declarations = statement.declarations;\n var numDeclarations = declarations.length;\n\n // top-level variables and constants become globals\n if (isKnownGlobal || (\n currentFunction == this.startFunctionInstance &&\n statement.parent && statement.parent.kind == NodeKind.SOURCE\n )) {\n // NOTE that the above condition also covers top-level variables declared with 'let', even\n // though such variables could also become start function locals if, and only if, not used\n // within any function declared in the same source, which is unknown at this point. the only\n // efficient way to deal with this would be to keep track of all occasions it is used and\n // replace these instructions afterwards, dynamically. (TOOD: what about a Binaryen pass?)\n for (let i = 0; i < numDeclarations; ++i) {\n this.compileGlobalDeclaration(declarations[i]);\n }\n return 0;\n }\n\n // other variables become locals\n var initializers = new Array();\n var flow = this.currentFunction.flow;\n var resolver = this.resolver;\n for (let i = 0; i < numDeclarations; ++i) {\n let declaration = declarations[i];\n let name = declaration.name.text;\n let type: Type | null = null;\n let initExpr: ExpressionRef = 0;\n if (declaration.type) {\n type = resolver.resolveType( // reports\n declaration.type,\n flow.contextualTypeArguments\n );\n if (!type) continue;\n if (declaration.initializer) {\n initExpr = this.compileExpression( // reports\n declaration.initializer,\n type,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n }\n } else if (declaration.initializer) { // infer type using void/NONE for proper literal inference\n initExpr = this.compileExpressionRetainType( // reports\n declaration.initializer,\n Type.void,\n WrapMode.NONE\n );\n if (this.currentType == Type.void) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n declaration.range, this.currentType.toString(), \"\"\n );\n continue;\n }\n type = this.currentType;\n } else {\n this.error(\n DiagnosticCode.Type_expected,\n declaration.name.range.atEnd\n );\n continue;\n }\n let isInlined = false;\n if (declaration.is(CommonFlags.CONST)) {\n if (initExpr) {\n initExpr = this.module.precomputeExpression(initExpr);\n if (getExpressionId(initExpr) == ExpressionId.Const) {\n let local = new Local(program, name, -1, type);\n switch (getExpressionType(initExpr)) {\n case NativeType.I32: {\n local = local.withConstantIntegerValue(\n i64_new(\n getConstValueI32(initExpr),\n 0\n )\n );\n break;\n }\n case NativeType.I64: {\n local = local.withConstantIntegerValue(\n i64_new(\n getConstValueI64Low(initExpr),\n getConstValueI64High(initExpr)\n )\n );\n break;\n }\n case NativeType.F32: {\n local = local.withConstantFloatValue(getConstValueF32(initExpr));\n break;\n }\n case NativeType.F64: {\n local = local.withConstantFloatValue(getConstValueF64(initExpr));\n break;\n }\n default: {\n assert(false);\n return this.module.createUnreachable();\n }\n }\n // Create a virtual local that doesn't actually exist in WebAssembly\n let scopedLocals = currentFunction.flow.scopedLocals;\n if (!scopedLocals) currentFunction.flow.scopedLocals = scopedLocals = new Map();\n else if (scopedLocals.has(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, name\n );\n return this.module.createUnreachable();\n }\n scopedLocals.set(name, local);\n isInlined = true;\n } else {\n this.warning(\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\n declaration.range\n );\n }\n } else {\n this.error(\n DiagnosticCode._const_declarations_must_be_initialized,\n declaration.range\n );\n }\n }\n if (!isInlined) {\n let local: Local;\n if (\n declaration.isAny(CommonFlags.LET | CommonFlags.CONST) ||\n flow.is(FlowFlags.INLINE_CONTEXT)\n ) { // here: not top-level\n local = flow.addScopedLocal(type, name, false, declaration); // reports\n } else {\n local = currentFunction.addLocal(type, name, declaration); // reports\n }\n if (initExpr) {\n initializers.push(this.compileAssignmentWithValue(declaration.name, initExpr));\n if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n flow.setLocalWrapped(local.index, !flow.canOverflow(initExpr, type));\n }\n } else if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n flow.setLocalWrapped(local.index, true); // zero\n }\n }\n }\n return initializers.length // we can unwrap these here because the\n ? initializers.length == 1 // source didn't tell us exactly what to do\n ? initializers[0]\n : this.module.createBlock(null, initializers, NativeType.None)\n : 0;\n }\n\n compileVoidStatement(statement: VoidStatement): ExpressionRef {\n return this.compileExpression(statement.expression, Type.void, ConversionKind.EXPLICIT, WrapMode.NONE);\n }\n\n compileWhileStatement(statement: WhileStatement): ExpressionRef {\n var module = this.module;\n\n // The condition does not yet initialize a branch\n var condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n\n if (\n !this.options.noTreeShaking ||\n this.currentFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\n ) {\n // Try to eliminate unnecesssary loops if the condition is constant\n let condExprPrecomp = module.precomputeExpression(condExpr);\n if (\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\n getExpressionType(condExprPrecomp) == NativeType.I32\n ) {\n if (!getConstValueI32(condExprPrecomp)) return module.createNop();\n\n // Otherwise recompile to the original and let the optimizer decide\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n }\n }\n\n // Statements initiate a new branch with its own break context\n var currentFunction = this.currentFunction;\n var label = currentFunction.enterBreakContext();\n var parentFlow = currentFunction.flow;\n var flow = parentFlow.fork();\n currentFunction.flow = flow;\n var breakLabel = \"break|\" + label;\n flow.breakLabel = breakLabel;\n var continueLabel = \"continue|\" + label;\n flow.continueLabel = continueLabel;\n\n var body = this.compileStatement(statement.statement);\n var alwaysTrue = false; // TODO\n var terminated = flow.isAny(FlowFlags.ANY_TERMINATING);\n\n // Switch back to the parent flow\n currentFunction.flow = flow.free();\n currentFunction.leaveBreakContext();\n flow.unset(\n FlowFlags.BREAKS |\n FlowFlags.CONDITIONALLY_BREAKS |\n FlowFlags.CONTINUES |\n FlowFlags.CONDITIONALLY_CONTINUES\n );\n if (alwaysTrue) parentFlow.inherit(flow);\n else parentFlow.inheritConditional(flow);\n\n return module.createBlock(breakLabel, [\n module.createLoop(continueLabel,\n module.createIf(condExpr,\n terminated\n ? body // skip trailing continue if unnecessary\n : module.createBlock(null, [\n body,\n module.createBreak(continueLabel)\n ], NativeType.None)\n )\n )\n ]);\n }\n\n // expressions\n\n /**\n * Compiles the value of an inlined constant element.\n * @param retainType If true, the annotated type of the constant is retained. Otherwise, the value\n * is precomputed according to context.\n */\n compileInlineConstant(\n element: VariableLikeElement,\n contextualType: Type,\n retainType: bool\n ): ExpressionRef {\n assert(element.is(CommonFlags.INLINED));\n var type = element.type;\n switch (\n !retainType &&\n type.is(TypeFlags.INTEGER) &&\n contextualType.is(TypeFlags.INTEGER) &&\n type.size < contextualType.size\n ? (this.currentType = contextualType).kind // essentially precomputes a (sign-)extension\n : (this.currentType = type).kind\n ) {\n case TypeKind.I8:\n case TypeKind.I16: {\n let shift = type.computeSmallIntegerShift(Type.i32);\n return this.module.createI32(\n element.constantValueKind == ConstantValueKind.INTEGER\n ? i64_low(element.constantIntegerValue) << shift >> shift\n : 0\n ); // recognized by canOverflow\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n let mask = element.type.computeSmallIntegerMask(Type.i32);\n return this.module.createI32(\n element.constantValueKind == ConstantValueKind.INTEGER\n ? i64_low(element.constantIntegerValue) & mask\n : 0\n ); // recognized by canOverflow\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n return this.module.createI32(\n element.constantValueKind == ConstantValueKind.INTEGER\n ? i64_low(element.constantIntegerValue)\n : 0\n );\n }\n case TypeKind.ISIZE:\n case TypeKind.USIZE: {\n if (!element.program.options.isWasm64) {\n return this.module.createI32(\n element.constantValueKind == ConstantValueKind.INTEGER\n ? i64_low(element.constantIntegerValue)\n : 0\n );\n }\n // fall-through\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return element.constantValueKind == ConstantValueKind.INTEGER\n ? this.module.createI64(\n i64_low(element.constantIntegerValue),\n i64_high(element.constantIntegerValue)\n )\n : this.module.createI64(0);\n }\n case TypeKind.F64: {\n // monkey-patch for converting built-in floats to f32 implicitly\n if (!(element.hasDecorator(DecoratorFlags.BUILTIN) && contextualType == Type.f32)) {\n return this.module.createF64((element).constantFloatValue);\n }\n // otherwise fall-through: basically precomputes f32.demote/f64 of NaN / Infinity\n this.currentType = Type.f32;\n }\n case TypeKind.F32: {\n return this.module.createF32((element).constantFloatValue);\n }\n default: {\n assert(false);\n return this.module.createUnreachable();\n }\n }\n }\n\n compileExpression(\n expression: Expression,\n contextualType: Type,\n conversionKind: ConversionKind,\n wrapMode: WrapMode\n ): ExpressionRef {\n this.currentType = contextualType;\n\n var expr: ExpressionRef;\n switch (expression.kind) {\n case NodeKind.ASSERTION: {\n expr = this.compileAssertionExpression(expression, contextualType);\n break;\n }\n case NodeKind.BINARY: {\n expr = this.compileBinaryExpression(expression, contextualType);\n break;\n }\n case NodeKind.CALL: {\n expr = this.compileCallExpression(expression, contextualType);\n break;\n }\n case NodeKind.COMMA: {\n expr = this.compileCommaExpression(expression, contextualType);\n break;\n }\n case NodeKind.ELEMENTACCESS: {\n expr = this.compileElementAccessExpression(expression, contextualType);\n break;\n }\n case NodeKind.FUNCTION: {\n expr = this.compileFunctionExpression(expression, contextualType);\n break;\n }\n case NodeKind.IDENTIFIER:\n case NodeKind.FALSE:\n case NodeKind.NULL:\n case NodeKind.THIS:\n case NodeKind.SUPER:\n case NodeKind.TRUE: {\n expr = this.compileIdentifierExpression(\n expression,\n contextualType,\n conversionKind == ConversionKind.NONE // retain type of inlined constants\n );\n break;\n }\n case NodeKind.INSTANCEOF: {\n expr = this.compileInstanceOfExpression(expression, contextualType);\n break;\n }\n case NodeKind.LITERAL: {\n expr = this.compileLiteralExpression(expression, contextualType);\n break;\n }\n case NodeKind.NEW: {\n expr = this.compileNewExpression(expression, contextualType);\n break;\n }\n case NodeKind.PARENTHESIZED: {\n expr = this.compileParenthesizedExpression(expression, contextualType);\n break;\n }\n case NodeKind.PROPERTYACCESS: {\n expr = this.compilePropertyAccessExpression(\n expression,\n contextualType,\n conversionKind == ConversionKind.NONE // retain type of inlined constants\n );\n break;\n }\n case NodeKind.TERNARY: {\n expr = this.compileTernaryExpression(expression, contextualType);\n break;\n }\n case NodeKind.UNARYPOSTFIX: {\n expr = this.compileUnaryPostfixExpression(expression, contextualType);\n break;\n }\n case NodeKind.UNARYPREFIX: {\n expr = this.compileUnaryPrefixExpression(expression, contextualType);\n break;\n }\n default: {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n expr = this.module.createUnreachable();\n }\n }\n\n var currentType = this.currentType;\n if (conversionKind != ConversionKind.NONE && currentType != contextualType) {\n expr = this.convertExpression(expr, currentType, contextualType, conversionKind, wrapMode, expression);\n this.currentType = contextualType;\n } else if (wrapMode == WrapMode.WRAP) {\n expr = this.ensureSmallIntegerWrap(expr, currentType);\n }\n\n if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\n return expr;\n }\n\n compileExpressionRetainType(\n expression: Expression,\n contextualType: Type,\n wrapMode: WrapMode\n ): ExpressionRef {\n return this.compileExpression(\n expression,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n wrapMode\n );\n }\n\n precomputeExpression(\n expression: Expression,\n contextualType: Type,\n conversionKind: ConversionKind,\n wrapMode: WrapMode\n ): ExpressionRef {\n return this.module.precomputeExpression(\n this.compileExpression(expression, contextualType, conversionKind, wrapMode)\n );\n }\n\n convertExpression(\n expr: ExpressionRef,\n fromType: Type,\n toType: Type,\n conversionKind: ConversionKind,\n wrapMode: WrapMode,\n reportNode: Node\n ): ExpressionRef {\n assert(conversionKind != ConversionKind.NONE);\n var module = this.module;\n\n // void to any\n if (fromType.kind == TypeKind.VOID) {\n assert(toType.kind != TypeKind.VOID); // convertExpression should not be called with void -> void\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n reportNode.range, fromType.toString(), toType.toString()\n );\n return module.createUnreachable();\n }\n\n // any to void\n if (toType.kind == TypeKind.VOID) return module.createDrop(expr);\n\n if (!fromType.isAssignableTo(toType)) {\n if (conversionKind == ConversionKind.IMPLICIT) {\n this.error(\n DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,\n reportNode.range, fromType.toString(), toType.toString()\n ); // recoverable\n }\n }\n\n if (fromType.is(TypeFlags.FLOAT)) {\n\n // float to float\n if (toType.is(TypeFlags.FLOAT)) {\n if (fromType.kind == TypeKind.F32) {\n\n // f32 to f64\n if (toType.kind == TypeKind.F64) {\n expr = module.createUnary(UnaryOp.PromoteF32, expr);\n }\n\n // otherwise f32 to f32\n\n // f64 to f32\n } else if (toType.kind == TypeKind.F32) {\n expr = module.createUnary(UnaryOp.DemoteF64, expr);\n }\n\n // otherwise f64 to f64\n\n // float to int\n } else if (toType.is(TypeFlags.INTEGER)) {\n\n // f32 to int\n if (fromType.kind == TypeKind.F32) {\n if (toType == Type.bool) {\n expr = module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\n wrapMode = WrapMode.NONE;\n } else if (toType.is(TypeFlags.SIGNED)) {\n if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.TruncF32ToI64, expr);\n } else {\n expr = module.createUnary(UnaryOp.TruncF32ToI32, expr);\n }\n } else {\n if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.TruncF32ToU64, expr);\n } else {\n expr = module.createUnary(UnaryOp.TruncF32ToU32, expr);\n }\n }\n\n // f64 to int\n } else {\n if (toType == Type.bool) {\n expr = module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\n wrapMode = WrapMode.NONE;\n } else if (toType.is(TypeFlags.SIGNED)) {\n if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.TruncF64ToI64, expr);\n } else {\n expr = module.createUnary(UnaryOp.TruncF64ToI32, expr);\n }\n } else {\n if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.TruncF64ToU64, expr);\n } else {\n expr = module.createUnary(UnaryOp.TruncF64ToU32, expr);\n }\n }\n }\n\n // float to void\n } else {\n assert(toType.flags == TypeFlags.NONE, \"void type expected\");\n expr = module.createDrop(expr);\n }\n\n // int to float\n } else if (fromType.is(TypeFlags.INTEGER) && toType.is(TypeFlags.FLOAT)) {\n\n // int to f32\n if (toType.kind == TypeKind.F32) {\n if (fromType.is(TypeFlags.LONG)) {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED)\n ? UnaryOp.ConvertI64ToF32\n : UnaryOp.ConvertU64ToF32,\n expr\n );\n } else {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED)\n ? UnaryOp.ConvertI32ToF32\n : UnaryOp.ConvertU32ToF32,\n expr\n );\n }\n\n // int to f64\n } else {\n if (fromType.is(TypeFlags.LONG)) {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED)\n ? UnaryOp.ConvertI64ToF64\n : UnaryOp.ConvertU64ToF64,\n expr\n );\n } else {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED)\n ? UnaryOp.ConvertI32ToF64\n : UnaryOp.ConvertU32ToF64,\n expr\n );\n }\n }\n\n // int to int\n } else {\n // i64 to ...\n if (fromType.is(TypeFlags.LONG)) {\n\n // i64 to i32 or smaller\n if (toType == Type.bool) {\n expr = module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\n wrapMode = WrapMode.NONE;\n } else if (!toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.WrapI64, expr); // discards upper bits\n }\n\n // i32 or smaller to i64\n } else if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED) ? UnaryOp.ExtendI32 : UnaryOp.ExtendU32,\n this.ensureSmallIntegerWrap(expr, fromType) // must clear garbage bits\n );\n wrapMode = WrapMode.NONE;\n\n // i32 to i32\n } else {\n // small i32 to ...\n if (fromType.is(TypeFlags.SHORT)) {\n // small i32 to larger i32\n if (fromType.size < toType.size) {\n expr = this.ensureSmallIntegerWrap(expr, fromType); // must clear garbage bits\n wrapMode = WrapMode.NONE;\n }\n }\n }\n }\n\n this.currentType = toType;\n return wrapMode == WrapMode.WRAP\n ? this.ensureSmallIntegerWrap(expr, toType)\n : expr;\n }\n\n compileAssertionExpression(expression: AssertionExpression, contextualType: Type): ExpressionRef {\n switch (expression.assertionKind) {\n case AssertionKind.PREFIX:\n case AssertionKind.AS: {\n let toType = this.resolver.resolveType( // reports\n assert(expression.toType),\n this.currentFunction.flow.contextualTypeArguments\n );\n if (!toType) return this.module.createUnreachable();\n return this.compileExpression(expression.expression, toType, ConversionKind.EXPLICIT, WrapMode.NONE);\n }\n case AssertionKind.NONNULL: {\n assert(!expression.toType);\n let expr = this.compileExpressionRetainType(expression.expression, contextualType, WrapMode.NONE);\n this.currentType = this.currentType.nonNullableType;\n return expr;\n }\n default: assert(false);\n }\n return this.module.createUnreachable();\n }\n\n private f32ModInstance: Function | null = null;\n private f64ModInstance: Function | null = null;\n private f32PowInstance: Function | null = null;\n private f64PowInstance: Function | null = null;\n\n compileBinaryExpression(\n expression: BinaryExpression,\n contextualType: Type\n ): ExpressionRef {\n var module = this.module;\n var left = expression.left;\n var right = expression.right;\n\n var leftExpr: ExpressionRef;\n var leftType: Type;\n var rightExpr: ExpressionRef;\n var rightType: Type;\n var commonType: Type | null;\n\n var expr: ExpressionRef;\n var compound = false;\n\n var operator = expression.operator;\n switch (operator) {\n case Token.LESSTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.LT);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"<\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.LtI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.LtI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.LtI64\n : BinaryOp.LtI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.LtU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.LtU64\n : BinaryOp.LtU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.LtU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.LtF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.LtF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.GREATERTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.GT);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \">\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.GtI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.GtI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.GtU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.GtU64\n : BinaryOp.GtU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.GtU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.GtF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.GtF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.LESSTHAN_EQUALS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.LE);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"<=\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.LeI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.LeI64\n : BinaryOp.LeI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.LeI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.LeU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.LeU64\n : BinaryOp.LeU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.LeU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.LeF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.LeF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.GREATERTHAN_EQUALS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.GE);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \">=\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.GeI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.GeI64\n : BinaryOp.GeI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.GeI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.GeU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.GeU64\n : BinaryOp.GeU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.GeU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.GeF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.GeF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n\n case Token.EQUALS_EQUALS_EQUALS:\n case Token.EQUALS_EQUALS: {\n\n // NOTE that this favors correctness, in terms of emitting a binary expression, over\n // checking for a possible use of unary EQZ. while the most classic of all optimizations,\n // that's not what the source told us to do. for reference, `!left` emits unary EQZ.\n\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (operator == Token.EQUALS_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.EQ);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n // still allow '==' with references\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.EqI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.EqI64\n : BinaryOp.EqI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.EqI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.EqF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.EqF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.EXCLAMATION_EQUALS_EQUALS:\n case Token.EXCLAMATION_EQUALS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (operator == Token.EXCLAMATION_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.NE);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n // still allow '!=' with references\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.NeI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.NeI64\n : BinaryOp.NeI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.NeI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.NeF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.NeF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.EQUALS: {\n return this.compileAssignment(left, right, contextualType);\n }\n case Token.PLUS_EQUALS: compound = true;\n case Token.PLUS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.ADD);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"+\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8: // addition might overflow\n case TypeKind.I16: // ^\n case TypeKind.U8: // ^\n case TypeKind.U16: // ^\n case TypeKind.BOOL: // ^\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.AddI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.AddI64\n : BinaryOp.AddI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.AddI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.AddF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.AddF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.MINUS_EQUALS: compound = true;\n case Token.MINUS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.SUB);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"-\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8: // subtraction might overflow\n case TypeKind.I16: // ^\n case TypeKind.U8: // ^\n case TypeKind.U16: // ^\n case TypeKind.BOOL: // ^\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.SubI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.SubI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.SubF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.SubF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.ASTERISK_EQUALS: compound = true;\n case Token.ASTERISK: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.MUL);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"*\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL:\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.MulI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.MulI64\n : BinaryOp.MulI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.MulI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.MulF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.MulF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.ASTERISK_ASTERISK_EQUALS: compound = true;\n case Token.ASTERISK_ASTERISK: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.POW);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n let instance: Function | null;\n\n // Mathf.pow if lhs is f32 (result is f32)\n if (this.currentType.kind == TypeKind.F32) {\n rightExpr = this.compileExpression(right, Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n if (!(instance = this.f32PowInstance)) {\n let namespace = this.program.elementsLookup.get(\"Mathf\");\n if (!namespace) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Mathf\"\n );\n expr = module.createUnreachable();\n break;\n }\n let prototype = namespace.members ? namespace.members.get(\"pow\") : null;\n if (!prototype) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Mathf.pow\"\n );\n expr = module.createUnreachable();\n break;\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.f32PowInstance = instance = this.resolver.resolveFunction(prototype, null);\n }\n\n // Math.pow otherwise (result is f64)\n // TODO: should the result be converted back?\n } else {\n leftExpr = this.convertExpression(\n leftExpr,\n this.currentType,\n Type.f64,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n leftType = this.currentType;\n rightExpr = this.compileExpression(\n right,\n Type.f64,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n rightType = this.currentType;\n if (!(instance = this.f64PowInstance)) {\n let namespace = this.program.elementsLookup.get(\"Math\");\n if (!namespace) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Math\"\n );\n expr = module.createUnreachable();\n break;\n }\n let prototype = namespace.members ? namespace.members.get(\"pow\") : null;\n if (!prototype) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Math.pow\"\n );\n expr = module.createUnreachable();\n break;\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.f64PowInstance = instance = this.resolver.resolveFunction(prototype, null);\n }\n }\n if (!(instance && this.compileFunction(instance))) {\n expr = module.createUnreachable();\n } else {\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\n }\n break;\n }\n case Token.SLASH_EQUALS: compound = true;\n case Token.SLASH: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.DIV);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP, // !\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP, // !\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"/\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8: // signed div on signed small integers might overflow, e.g. -128/-1\n case TypeKind.I16: // ^\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.DivI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.DivI64\n : BinaryOp.DivI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.DivI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.DivU64\n : BinaryOp.DivU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.DivU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.DivF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.DivF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.PERCENT_EQUALS: compound = true;\n case Token.PERCENT: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.REM);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP, // !\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP, // !\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"%\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16: {\n expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.RemI64\n : BinaryOp.RemI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.RemI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.RemU64\n : BinaryOp.RemU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.RemU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n let instance = this.f32ModInstance;\n if (!instance) {\n let namespace = this.program.elementsLookup.get(\"Mathf\");\n if (!namespace) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Mathf\"\n );\n expr = module.createUnreachable();\n break;\n }\n let prototype = namespace.members ? namespace.members.get(\"mod\") : null;\n if (!prototype) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Mathf.mod\"\n );\n expr = module.createUnreachable();\n break;\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.f32ModInstance = instance = this.resolver.resolveFunction(prototype, null);\n }\n if (!(instance && this.compileFunction(instance))) {\n expr = module.createUnreachable();\n } else {\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\n }\n break;\n }\n case TypeKind.F64: {\n let instance = this.f64ModInstance;\n if (!instance) {\n let namespace = this.program.elementsLookup.get(\"Math\");\n if (!namespace) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Math\"\n );\n expr = module.createUnreachable();\n break;\n }\n let prototype = namespace.members ? namespace.members.get(\"mod\") : null;\n if (!prototype) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Math.mod\"\n );\n expr = module.createUnreachable();\n break;\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.f64ModInstance = instance = this.resolver.resolveFunction(prototype, null);\n }\n if (!(instance && this.compileFunction(instance))) {\n expr = module.createUnreachable();\n } else {\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\n }\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.LESSTHAN_LESSTHAN_EQUALS: compound = true;\n case Token.LESSTHAN_LESSTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHL);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL:\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.ShlI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.ShlI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.ShlI64\n : BinaryOp.ShlI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\n case Token.GREATERTHAN_GREATERTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n rightType = this.currentType;\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16: {\n expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.ShrI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.ShrI64\n : BinaryOp.ShrI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.ShrU64\n : BinaryOp.ShrU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR_U);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n switch (this.currentType.kind) {\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: { // assumes that unsigned shr on unsigned small integers does not overflow\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\n }\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.ShrU64\n : BinaryOp.ShrU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.AMPERSAND_EQUALS: compound = true;\n case Token.AMPERSAND: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overloadd\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_AND);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"&\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.AndI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.AndI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.AndI64\n : BinaryOp.AndI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.BAR_EQUALS: compound = true;\n case Token.BAR: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_OR);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"|\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.OrI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.OrI64\n : BinaryOp.OrI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.CARET_EQUALS: compound = true;\n case Token.CARET: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_XOR);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"^\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.XorI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.XorI64\n : BinaryOp.XorI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n\n // logical (no overloading)\n\n case Token.AMPERSAND_AMPERSAND: { // left && right\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n\n // simplify if cloning left without side effects is possible\n if (expr = module.cloneExpression(leftExpr, true, 0)) {\n this.makeIsTrueish(leftExpr, this.currentType);\n expr = module.createIf(\n this.makeIsTrueish(leftExpr, this.currentType),\n rightExpr,\n expr\n );\n\n // if not possible, tee left to a temp. local\n } else {\n let flow = this.currentFunction.flow;\n let tempLocal = this.currentFunction.getAndFreeTempLocal(\n this.currentType,\n !flow.canOverflow(leftExpr, this.currentType)\n );\n expr = module.createIf(\n this.makeIsTrueish(\n module.createTeeLocal(tempLocal.index, leftExpr),\n this.currentType\n ),\n rightExpr,\n module.createGetLocal(\n assert(tempLocal).index, // to be sure\n this.currentType.toNativeType()\n )\n );\n }\n break;\n }\n case Token.BAR_BAR: { // left || right\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n\n // simplify if cloning left without side effects is possible\n if (expr = this.module.cloneExpression(leftExpr, true, 0)) {\n expr = this.module.createIf(\n this.makeIsTrueish(leftExpr, this.currentType),\n expr,\n rightExpr\n );\n\n // if not possible, tee left to a temp. local\n } else {\n let flow = this.currentFunction.flow;\n let tempLocal = this.currentFunction.getAndFreeTempLocal(\n this.currentType,\n !flow.canOverflow(leftExpr, this.currentType)\n );\n expr = module.createIf(\n this.makeIsTrueish(\n module.createTeeLocal(tempLocal.index, leftExpr),\n this.currentType\n ),\n module.createGetLocal(\n assert(tempLocal).index, // to be sure\n this.currentType.toNativeType()\n ),\n rightExpr\n );\n }\n break;\n }\n default: {\n assert(false);\n expr = this.module.createUnreachable();\n }\n }\n return compound\n ? this.compileAssignmentWithValue(left, expr, contextualType != Type.void)\n : expr;\n }\n\n compileUnaryOverload(\n operatorInstance: Function,\n value: Expression,\n valueExpr: ExpressionRef,\n reportNode: Node\n ): ExpressionRef {\n var argumentExpressions: Expression[];\n var thisArg: ExpressionRef = 0;\n if (operatorInstance.is(CommonFlags.INSTANCE)) {\n thisArg = valueExpr; // can reuse the previously evaluated expr as the this value here\n argumentExpressions = [];\n } else {\n argumentExpressions = [ value ]; // annotated type might differ -> recompile\n }\n return this.compileCallDirect(\n operatorInstance,\n argumentExpressions,\n reportNode,\n thisArg,\n operatorInstance.hasDecorator(DecoratorFlags.INLINE)\n );\n }\n\n compileBinaryOverload(\n operatorInstance: Function,\n left: Expression,\n leftExpr: ExpressionRef,\n right: Expression,\n reportNode: Node\n ): ExpressionRef {\n var argumentExpressions: Expression[];\n var thisArg: ExpressionRef = 0;\n if (operatorInstance.is(CommonFlags.INSTANCE)) {\n let classInstance = assert(operatorInstance.parent); assert(classInstance.kind == ElementKind.CLASS);\n thisArg = leftExpr; // can reuse the previously evaluated leftExpr as the this value here\n argumentExpressions = [ right ];\n } else {\n argumentExpressions = [ left, right ]; // annotated type of LHS might differ -> recompile\n }\n var ret = this.compileCallDirect(\n operatorInstance,\n argumentExpressions,\n reportNode,\n thisArg,\n operatorInstance.hasDecorator(DecoratorFlags.INLINE)\n );\n return ret;\n }\n\n compileAssignment(expression: Expression, valueExpression: Expression, contextualType: Type): ExpressionRef {\n var program = this.program;\n var resolver = program.resolver;\n var currentFunction = this.currentFunction;\n var target = resolver.resolveExpression(expression, currentFunction); // reports\n if (!target) return this.module.createUnreachable();\n\n // to compile just the value, we need to know the target's type\n var targetType: Type;\n switch (target.kind) {\n case ElementKind.GLOBAL: {\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field compiled as a global\n return this.module.createUnreachable();\n }\n assert((target).type != Type.void); // compileGlobal must guarantee this\n // fall-through\n }\n case ElementKind.LOCAL:\n case ElementKind.FIELD: {\n targetType = (target).type;\n break;\n }\n case ElementKind.PROPERTY: {\n let setterPrototype = (target).setterPrototype;\n if (setterPrototype) {\n let instance = this.resolver.resolveFunction(setterPrototype, null);\n if (!instance) return this.module.createUnreachable();\n assert(instance.signature.parameterTypes.length == 1); // parser must guarantee this\n targetType = instance.signature.parameterTypes[0];\n break;\n }\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, (target).internalName\n );\n return this.module.createUnreachable();\n }\n case ElementKind.CLASS: {\n if (resolver.currentElementExpression) { // indexed access\n let isUnchecked = currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);\n let indexedSet = (target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\n if (!indexedSet) {\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\n if (!indexedGet) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n expression.range, (target).internalName\n );\n } else {\n this.error(\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\n expression.range, (target).internalName\n );\n }\n return this.module.createUnreachable();\n }\n assert(indexedSet.signature.parameterTypes.length == 2); // parser must guarantee this\n targetType = indexedSet.signature.parameterTypes[1]; // 2nd parameter is the element\n break;\n }\n // fall-through\n }\n default: {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n }\n\n // compile the value and do the assignment\n assert(targetType != Type.void);\n var valueExpr = this.compileExpression(valueExpression, targetType, ConversionKind.IMPLICIT, WrapMode.NONE);\n return this.compileAssignmentWithValue(\n expression,\n valueExpr,\n contextualType != Type.void\n );\n }\n\n compileAssignmentWithValue(\n expression: Expression,\n valueWithCorrectType: ExpressionRef,\n tee: bool = false\n ): ExpressionRef {\n var module = this.module;\n var target = this.resolver.resolveExpression(expression, this.currentFunction); // reports\n if (!target) return module.createUnreachable();\n\n switch (target.kind) {\n case ElementKind.LOCAL: {\n let type = (target).type;\n assert(type != Type.void);\n this.currentType = tee ? type : Type.void;\n if ((target).is(CommonFlags.CONST)) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, target.internalName\n );\n return module.createUnreachable();\n }\n let flow = this.currentFunction.flow;\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n flow.setLocalWrapped((target).index, !flow.canOverflow(valueWithCorrectType, type));\n }\n return tee\n ? module.createTeeLocal((target).index, valueWithCorrectType)\n : module.createSetLocal((target).index, valueWithCorrectType);\n }\n case ElementKind.GLOBAL: {\n if (!this.compileGlobal(target)) return module.createUnreachable();\n let type = (target).type;\n assert(type != Type.void);\n this.currentType = tee ? type : Type.void;\n if ((target).is(CommonFlags.CONST)) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range,\n target.internalName\n );\n return module.createUnreachable();\n }\n valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type); // guaranteed\n if (tee) {\n let nativeType = type.toNativeType();\n let internalName = target.internalName;\n return module.createBlock(null, [ // emulated teeGlobal\n module.createSetGlobal(internalName, valueWithCorrectType),\n module.createGetGlobal(internalName, nativeType)\n ], nativeType);\n } else {\n return module.createSetGlobal(target.internalName, valueWithCorrectType);\n }\n }\n case ElementKind.FIELD: {\n const declaration = (target).declaration;\n if (\n (target).is(CommonFlags.READONLY) &&\n !(\n this.currentFunction.is(CommonFlags.CONSTRUCTOR) ||\n declaration == null ||\n declaration.initializer != null\n )\n ) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, (target).internalName\n );\n return module.createUnreachable();\n }\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n let type = (target).type;\n this.currentType = tee ? type : Type.void;\n let nativeType = type.toNativeType();\n if (type.kind == TypeKind.BOOL) {\n // make sure bools are wrapped (usually are) when storing as 8 bits\n valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type);\n }\n if (tee) {\n let currentFunction = this.currentFunction;\n let flow = currentFunction.flow;\n let tempLocal = currentFunction.getAndFreeTempLocal(\n type,\n !flow.canOverflow(valueWithCorrectType, type)\n );\n let tempLocalIndex = tempLocal.index;\n // TODO: simplify if valueWithCorrectType has no side effects\n // TODO: call __gc_link here if a GC is present\n return module.createBlock(null, [\n module.createSetLocal(tempLocalIndex, valueWithCorrectType),\n module.createStore(\n type.byteSize,\n thisExpr,\n module.createGetLocal(tempLocalIndex, nativeType),\n nativeType,\n (target).memoryOffset\n ),\n module.createGetLocal(tempLocalIndex, nativeType)\n ], nativeType);\n } else {\n // TODO: call __gc_link here if a GC is present\n return module.createStore(\n type.byteSize,\n thisExpr,\n valueWithCorrectType,\n nativeType,\n (target).memoryOffset\n );\n }\n }\n case ElementKind.PROPERTY: {\n let setterPrototype = (target).setterPrototype;\n if (setterPrototype) {\n let setterInstance = this.resolver.resolveFunction(setterPrototype, null);\n if (!setterInstance) return module.createUnreachable();\n\n // call just the setter if the return value isn't of interest\n if (!tee) {\n if (setterInstance.is(CommonFlags.INSTANCE)) {\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n return this.makeCallDirect(setterInstance, [ thisExpr, valueWithCorrectType ]);\n } else {\n return this.makeCallDirect(setterInstance, [ valueWithCorrectType ]);\n }\n }\n\n // otherwise call the setter first, then the getter\n let getterPrototype = (target).getterPrototype;\n assert(getterPrototype != null); // must have one if there is a setter\n let getterInstance = this.resolver.resolveFunction(getterPrototype, null);\n if (!getterInstance) return module.createUnreachable();\n let returnType = getterInstance.signature.returnType;\n let nativeReturnType = returnType.toNativeType();\n if (setterInstance.is(CommonFlags.INSTANCE)) {\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n let tempLocal = this.currentFunction.getAndFreeTempLocal(returnType, false);\n let tempLocalIndex = tempLocal.index;\n return module.createBlock(null, [\n this.makeCallDirect(setterInstance, [ // set and remember the target\n module.createTeeLocal(tempLocalIndex, thisExpr),\n valueWithCorrectType\n ]),\n this.makeCallDirect(getterInstance, [ // get from remembered target\n module.createGetLocal(tempLocalIndex, nativeReturnType)\n ])\n ], nativeReturnType);\n } else {\n // note that this must be performed here because `resolved` is shared\n return module.createBlock(null, [\n this.makeCallDirect(setterInstance, [ valueWithCorrectType ]),\n this.makeCallDirect(getterInstance)\n ], nativeReturnType);\n }\n } else {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, target.internalName\n );\n }\n return module.createUnreachable();\n }\n case ElementKind.CLASS: {\n let elementExpression = this.resolver.currentElementExpression;\n if (elementExpression) {\n let isUnchecked = this.currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\n if (!indexedGet) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n expression.range, target.internalName\n );\n return module.createUnreachable();\n }\n let indexedSet = (target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\n if (!indexedSet) {\n this.error(\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\n expression.range, target.internalName\n );\n this.currentType = tee ? indexedGet.signature.returnType : Type.void;\n return module.createUnreachable();\n }\n let targetType = (target).type;\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n let elementExpr = this.compileExpression(\n elementExpression,\n Type.i32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n if (tee) {\n let currentFunction = this.currentFunction;\n let tempLocalTarget = currentFunction.getTempLocal(targetType, false);\n let tempLocalElement = currentFunction.getAndFreeTempLocal(this.currentType, false);\n let returnType = indexedGet.signature.returnType;\n this.currentFunction.freeTempLocal(tempLocalTarget);\n return module.createBlock(null, [\n this.makeCallDirect(indexedSet, [\n module.createTeeLocal(tempLocalTarget.index, thisExpr),\n module.createTeeLocal(tempLocalElement.index, elementExpr),\n valueWithCorrectType\n ]),\n this.makeCallDirect(indexedGet, [\n module.createGetLocal(tempLocalTarget.index, tempLocalTarget.type.toNativeType()),\n module.createGetLocal(tempLocalElement.index, tempLocalElement.type.toNativeType())\n ])\n ], returnType.toNativeType());\n } else {\n return this.makeCallDirect(indexedSet, [\n thisExpr,\n elementExpr,\n valueWithCorrectType\n ]);\n }\n }\n // fall-through\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n compileCallExpression(expression: CallExpression, contextualType: Type): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n var target = this.resolver.resolveExpression(expression.expression, currentFunction); // reports\n if (!target) return module.createUnreachable();\n\n var signature: Signature | null;\n var indexArg: ExpressionRef;\n switch (target.kind) {\n\n // direct call: concrete function\n case ElementKind.FUNCTION_PROTOTYPE: {\n let prototype = target;\n let typeArguments = expression.typeArguments;\n\n // builtins handle present respectively omitted type arguments on their own\n if (prototype.hasDecorator(DecoratorFlags.BUILTIN)) {\n return this.compileCallExpressionBuiltin(prototype, expression, contextualType);\n }\n\n let instance: Function | null = null;\n\n // resolve generic call if type arguments have been provided\n if (typeArguments) {\n if (!prototype.is(CommonFlags.GENERIC)) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n expression.expression.range, prototype.internalName\n );\n return module.createUnreachable();\n }\n instance = this.resolver.resolveFunctionInclTypeArguments(\n prototype,\n typeArguments,\n makeMap(this.currentFunction.flow.contextualTypeArguments),\n expression\n );\n\n // infer generic call if type arguments have been omitted\n } else if (prototype.is(CommonFlags.GENERIC)) {\n let inferredTypes = new Map();\n let typeParameters = assert(prototype.declaration.typeParameters);\n let numTypeParameters = typeParameters.length;\n for (let i = 0; i < numTypeParameters; ++i) {\n inferredTypes.set(typeParameters[i].name.text, null);\n }\n // let numInferred = 0;\n let parameterTypes = prototype.declaration.signature.parameters;\n let numParameterTypes = parameterTypes.length;\n let argumentExpressions = expression.arguments;\n let numArguments = argumentExpressions.length;\n let argumentExprs = new Array(numArguments);\n for (let i = 0; i < numParameterTypes; ++i) {\n let typeNode = parameterTypes[i].type;\n let name = typeNode.kind == NodeKind.TYPE ? (typeNode).name.text : null;\n let argumentExpression = i < numArguments\n ? argumentExpressions[i]\n : prototype.declaration.signature.parameters[i].initializer;\n if (!argumentExpression) { // missing initializer -> too few arguments\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n expression.range, numParameterTypes.toString(10), numArguments.toString(10)\n );\n return module.createUnreachable();\n }\n if (name !== null && inferredTypes.has(name)) {\n let inferredType = inferredTypes.get(name);\n if (inferredType) {\n argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, inferredType, WrapMode.NONE);\n let commonType: Type | null;\n if (!(commonType = Type.commonCompatible(inferredType, this.currentType, true))) {\n if (!(commonType = Type.commonCompatible(inferredType, this.currentType, false))) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n parameterTypes[i].type.range, this.currentType.toString(), inferredType.toString()\n );\n return module.createUnreachable();\n }\n }\n inferredType = commonType;\n } else {\n argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, Type.i32, WrapMode.NONE);\n inferredType = this.currentType;\n // ++numInferred;\n }\n inferredTypes.set(name, inferredType);\n } else {\n let concreteType = this.resolver.resolveType(\n parameterTypes[i].type,\n this.currentFunction.flow.contextualTypeArguments\n );\n if (!concreteType) return module.createUnreachable();\n argumentExprs[i] = this.compileExpression(\n argumentExpression,\n concreteType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n }\n }\n let resolvedTypeArguments = new Array(numTypeParameters);\n for (let i = 0; i < numTypeParameters; ++i) {\n let inferredType = assert(inferredTypes.get(typeParameters[i].name.text)); // TODO\n resolvedTypeArguments[i] = inferredType;\n }\n instance = this.resolver.resolveFunction(\n prototype,\n resolvedTypeArguments,\n makeMap(this.currentFunction.flow.contextualTypeArguments)\n );\n if (!instance) return this.module.createUnreachable();\n return this.makeCallDirect(instance, argumentExprs);\n // TODO: this skips inlining because inlining requires compiling its temporary locals in\n // the scope of the inlined flow. might need another mechanism to lock temp. locals early,\n // so inlining can be performed in `makeCallDirect` instead?\n\n // otherwise resolve the non-generic call as usual\n } else {\n instance = this.resolver.resolveFunction(prototype, null);\n }\n if (!instance) return this.module.createUnreachable();\n\n // compile 'this' expression if an instance method\n let thisExpr: ExpressionRef = 0;\n if (instance.is(CommonFlags.INSTANCE)) {\n thisExpr = this.compileExpressionRetainType(\n assert(this.resolver.currentThisExpression),\n this.options.usizeType,\n WrapMode.NONE\n );\n }\n\n return this.compileCallDirect(\n instance,\n expression.arguments,\n expression,\n thisExpr,\n instance.hasDecorator(DecoratorFlags.INLINE)\n );\n }\n\n // indirect call: index argument with signature (non-generic, can't be inlined)\n case ElementKind.LOCAL: {\n if (signature = (target).type.signatureReference) {\n if ((target).is(CommonFlags.INLINED)) {\n indexArg = module.createI32(i64_low((target).constantIntegerValue));\n } else {\n indexArg = module.createGetLocal((target).index, NativeType.I32);\n }\n break;\n } else {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, (target).type.toString()\n );\n return module.createUnreachable();\n }\n }\n case ElementKind.GLOBAL: {\n if (signature = (target).type.signatureReference) {\n indexArg = module.createGetGlobal((target).internalName, (target).type.toNativeType());\n break;\n } else {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, (target).type.toString()\n );\n return module.createUnreachable();\n }\n }\n case ElementKind.FIELD: {\n let type = (target).type;\n if (signature = type.signatureReference) {\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n indexArg = module.createLoad(\n 4,\n false,\n thisExpr,\n NativeType.I32,\n (target).memoryOffset\n );\n break;\n } else {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, type.toString()\n );\n return module.createUnreachable();\n }\n }\n case ElementKind.FUNCTION_TARGET: {\n signature = (target).signature;\n indexArg = this.compileExpression(\n expression.expression,\n (target).type,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n break;\n }\n\n case ElementKind.PROPERTY: {\n indexArg = this.compileGetter(target, expression.expression);\n let type = this.currentType;\n signature = type.signatureReference;\n if (!signature) {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, type.toString()\n );\n return module.createUnreachable();\n }\n break;\n }\n\n case ElementKind.CLASS: {\n\n // call to `super()`\n if (expression.expression.kind == NodeKind.SUPER) {\n if (!currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n this.error(\n DiagnosticCode.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors,\n expression.range\n );\n return module.createUnreachable();\n }\n\n let classInstance = assert(currentFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\n let baseClassInstance = assert((classInstance).base);\n let thisLocal = assert(currentFunction.flow.getScopedLocal(\"this\"));\n let nativeSizeType = this.options.nativeSizeType;\n\n // {\n // this = super(this || , ...args)\n // this.a = X\n // this.b = Y\n // }\n let stmts: ExpressionRef[] = [\n module.createSetLocal(thisLocal.index,\n this.compileCallDirect(\n this.ensureConstructor(baseClassInstance, expression),\n expression.arguments,\n expression,\n module.createIf(\n module.createGetLocal(thisLocal.index, nativeSizeType),\n module.createGetLocal(thisLocal.index, nativeSizeType),\n this.makeAllocation(classInstance)\n )\n )\n )\n ];\n this.makeFieldInitialization(classInstance, stmts);\n\n // check that super had been called before accessing allocating `this`\n let flow = currentFunction.flow;\n if (flow.isAny(\n FlowFlags.ALLOCATES |\n FlowFlags.CONDITIONALLY_ALLOCATES\n )) {\n this.error(\n DiagnosticCode._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class,\n expression.range\n );\n return module.createUnreachable();\n }\n flow.set(FlowFlags.ALLOCATES | FlowFlags.CALLS_SUPER);\n this.currentType = Type.void;\n return module.createBlock(null, stmts);\n }\n // otherwise fall-through\n }\n\n // not supported\n default: {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n }\n return this.compileCallIndirect(\n signature,\n indexArg,\n expression.arguments,\n expression\n );\n }\n\n private compileCallExpressionBuiltin(\n prototype: FunctionPrototype,\n expression: CallExpression,\n contextualType: Type\n ): ExpressionRef {\n var typeArguments: Type[] | null = null;\n\n // builtins handle omitted type arguments on their own. if present, however, resolve them here\n // and pass them to the builtin, even if it's still up to the builtin how to handle them.\n var typeArgumentNodes = expression.typeArguments;\n if (expression.typeArguments) {\n if (!prototype.is(CommonFlags.GENERIC)) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n expression.range, prototype.internalName\n );\n }\n typeArguments = this.resolver.resolveTypeArguments(\n assert(prototype.declaration.typeParameters),\n typeArgumentNodes,\n makeMap(this.currentFunction.flow.contextualTypeArguments),\n expression\n );\n }\n\n // now compile the builtin, which usually returns a block of code that replaces the call.\n var expr = compileBuiltinCall(\n this,\n prototype,\n typeArguments,\n expression.arguments,\n contextualType,\n expression\n );\n if (!expr) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n return expr;\n }\n\n /**\n * Checks that a call with the given number as arguments can be performed according to the\n * specified signature.\n */\n checkCallSignature(\n signature: Signature,\n numArguments: i32,\n hasThis: bool,\n reportNode: Node\n ): bool {\n\n // cannot call an instance method without a `this` argument (TODO: `.call`?)\n var thisType = signature.thisType;\n if (hasThis != (thisType != null)) {\n this.error(\n DiagnosticCode.Operation_not_supported, // TODO: better message?\n reportNode.range\n );\n return false;\n }\n\n // not yet implemented (TODO: maybe some sort of an unmanaged/lightweight array?)\n var hasRest = signature.hasRest;\n if (hasRest) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return false;\n }\n\n var minimum = signature.requiredParameters;\n var maximum = signature.parameterTypes.length;\n\n // must at least be called with required arguments\n if (numArguments < minimum) {\n this.error(\n minimum < maximum\n ? DiagnosticCode.Expected_at_least_0_arguments_but_got_1\n : DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, minimum.toString(), numArguments.toString()\n );\n return false;\n }\n\n // must not be called with more than the maximum arguments\n if (numArguments > maximum && !hasRest) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, maximum.toString(), numArguments.toString()\n );\n return false;\n }\n\n return true;\n }\n\n /** Compiles a direct call to a concrete function. */\n compileCallDirect(\n instance: Function,\n argumentExpressions: Expression[],\n reportNode: Node,\n thisArg: ExpressionRef = 0,\n inline: bool = false\n ): ExpressionRef {\n var numArguments = argumentExpressions.length;\n var signature = instance.signature;\n\n if (!this.checkCallSignature( // reports\n signature,\n numArguments,\n thisArg != 0,\n reportNode\n )) {\n return this.module.createUnreachable();\n }\n\n // Inline if explicitly requested\n if (inline) {\n assert(!instance.is(CommonFlags.TRAMPOLINE)); // doesn't make sense\n if (this.currentInlineFunctions.includes(instance)) {\n this.warning(\n DiagnosticCode.Function_0_cannot_be_inlined_into_itself,\n reportNode.range, instance.internalName\n );\n } else {\n this.currentInlineFunctions.push(instance);\n let expr = this.compileCallInlineUnchecked(instance, argumentExpressions, reportNode, thisArg);\n this.currentInlineFunctions.pop();\n return expr;\n }\n }\n\n // Otherwise compile to just a call\n var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\n var operands = new Array(numArgumentsInclThis);\n var index = 0;\n if (thisArg) {\n operands[0] = thisArg;\n index = 1;\n }\n var parameterTypes = signature.parameterTypes;\n for (let i = 0; i < numArguments; ++i, ++index) {\n operands[index] = this.compileExpression(\n argumentExpressions[i],\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n }\n assert(index == numArgumentsInclThis);\n return this.makeCallDirect(instance, operands);\n }\n\n // Depends on being pre-checked in compileCallDirect\n private compileCallInlineUnchecked(\n instance: Function,\n argumentExpressions: Expression[],\n reportNode: Node,\n thisArg: ExpressionRef = 0\n ): ExpressionRef {\n var numArguments = argumentExpressions.length;\n var signature = instance.signature;\n var currentFunction = this.currentFunction;\n var module = this.module;\n var declaration = instance.prototype.declaration;\n\n // Create an empty child flow with its own scope and mark it for inlining\n var previousFlow = currentFunction.flow;\n var returnLabel = instance.internalName + \"|inlined.\" + (instance.nextInlineId++).toString(10);\n var returnType = instance.signature.returnType;\n var flow = Flow.create(currentFunction);\n flow.set(FlowFlags.INLINE_CONTEXT);\n flow.returnLabel = returnLabel;\n flow.returnType = returnType;\n flow.contextualTypeArguments = instance.contextualTypeArguments;\n\n // Convert provided call arguments to temporary locals. It is important that these are compiled\n // here, with their respective locals being blocked. There is no 'makeCallInline'.\n var body = [];\n if (thisArg) {\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\n let thisType = assert(instance.signature.thisType);\n let classType = thisType.classReference;\n let superType = classType\n ? classType.base\n ? classType.base.type\n : null\n : null;\n if (getExpressionId(thisArg) == ExpressionId.GetLocal) { // reuse this var\n flow.addScopedLocalAlias(getGetLocalIndex(thisArg), thisType, \"this\");\n if (superType) flow.addScopedLocalAlias(getGetLocalIndex(thisArg), superType, \"super\");\n } else { // use a temp var\n let thisLocal = flow.addScopedLocal(thisType, \"this\", false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n if (superType) flow.addScopedLocalAlias(thisLocal.index, superType, \"super\");\n }\n }\n var parameterTypes = signature.parameterTypes;\n for (let i = 0; i < numArguments; ++i) {\n let paramExpr = this.compileExpression(\n argumentExpressions[i],\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n if (getExpressionId(paramExpr) == ExpressionId.GetLocal) {\n flow.addScopedLocalAlias(\n getGetLocalIndex(paramExpr),\n parameterTypes[i],\n signature.getParameterName(i)\n );\n // inherits wrap status\n } else {\n let argumentLocal = flow.addScopedLocal(\n parameterTypes[i],\n signature.getParameterName(i),\n !flow.canOverflow(paramExpr, parameterTypes[i])\n );\n body.push(\n module.createSetLocal(argumentLocal.index, paramExpr)\n );\n }\n }\n\n // Compile optional parameter initializers in the scope of the inlined flow\n currentFunction.flow = flow;\n var numParameters = signature.parameterTypes.length;\n for (let i = numArguments; i < numParameters; ++i) {\n let initExpr = this.compileExpression(\n assert(declaration.signature.parameters[i].initializer),\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.WRAP\n );\n let argumentLocal = flow.addScopedLocal(\n parameterTypes[i],\n signature.getParameterName(i),\n !flow.canOverflow(initExpr, parameterTypes[i])\n );\n body.push(\n module.createSetLocal(argumentLocal.index, initExpr)\n );\n }\n\n // Compile the called function's body in the scope of the inlined flow\n var bodyStatement = assert(declaration.body);\n if (bodyStatement.kind == NodeKind.BLOCK) {\n let statements = (bodyStatement).statements;\n for (let i = 0, k = statements.length; i < k; ++i) {\n let stmt = this.compileStatement(statements[i]);\n if (getExpressionId(stmt) != ExpressionId.Nop) {\n body.push(stmt);\n if (flow.isAny(FlowFlags.ANY_TERMINATING)) break;\n }\n }\n } else {\n body.push(this.compileStatement(bodyStatement));\n }\n\n // Free any new scoped locals and reset to the original flow\n var scopedLocals = flow.scopedLocals;\n if (scopedLocals) {\n for (let scopedLocal of scopedLocals.values()) {\n if (scopedLocal.is(CommonFlags.SCOPED)) { // otherwise an alias\n currentFunction.freeTempLocal(scopedLocal);\n }\n }\n flow.scopedLocals = null;\n }\n flow.finalize();\n this.currentFunction.flow = previousFlow;\n this.currentType = returnType;\n\n // Check that all branches are terminated\n if (returnType != Type.void && !flow.isAny(FlowFlags.ANY_TERMINATING)) {\n this.error(\n DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\n declaration.signature.returnType.range\n );\n return module.createUnreachable();\n }\n return flow.is(FlowFlags.RETURNS)\n ? module.createBlock(returnLabel, body, returnType.toNativeType())\n : body.length > 1\n ? module.createBlock(null, body, returnType.toNativeType())\n : body.length\n ? body[0]\n : module.createNop();\n }\n\n /** Gets the trampoline for the specified function. */\n ensureTrampoline(original: Function): Function {\n // A trampoline is a function that takes a fixed amount of operands with some of them possibly\n // being zeroed. It takes one additional argument denoting the number of actual operands\n // provided to the call, and takes appropriate steps to initialize zeroed operands to their\n // default values using the optional parameter initializers of the original function. Doing so\n // allows calls to functions with optional parameters to circumvent the trampoline when all\n // parameters are provided as a fast route, respectively setting up omitted operands in a proper\n // context otherwise.\n var trampoline = original.trampoline;\n if (trampoline) return trampoline;\n\n var originalSignature = original.signature;\n var originalName = original.internalName;\n var originalParameterTypes = originalSignature.parameterTypes;\n var originalParameterDeclarations = original.prototype.declaration.signature.parameters;\n var commonReturnType = originalSignature.returnType;\n var commonThisType = originalSignature.thisType;\n var isInstance = original.is(CommonFlags.INSTANCE);\n\n // arguments excl. `this`, operands incl. `this`\n var minArguments = originalSignature.requiredParameters;\n var minOperands = minArguments;\n var maxArguments = originalParameterTypes.length;\n var maxOperands = maxArguments;\n if (isInstance) {\n ++minOperands;\n ++maxOperands;\n }\n var numOptional = assert(maxOperands - minOperands);\n\n var forwardedOperands = new Array(minOperands);\n var operandIndex = 0;\n\n // forward `this` if applicable\n var module = this.module;\n if (isInstance) {\n forwardedOperands[0] = module.createGetLocal(0, this.options.nativeSizeType);\n operandIndex = 1;\n }\n\n // forward required arguments\n for (let i = 0; i < minArguments; ++i, ++operandIndex) {\n forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, originalParameterTypes[i].toNativeType());\n }\n assert(operandIndex == minOperands);\n\n // create the trampoline element\n var trampolineSignature = new Signature(originalParameterTypes, commonReturnType, commonThisType);\n var trampolineName = originalName + \"|trampoline\";\n trampolineSignature.requiredParameters = maxArguments;\n trampoline = new Function(\n original.prototype,\n trampolineName,\n trampolineSignature,\n original.parent,\n original.contextualTypeArguments\n );\n trampoline.set(original.flags | CommonFlags.TRAMPOLINE | CommonFlags.COMPILED);\n original.trampoline = trampoline;\n\n // compile initializers of omitted arguments in scope of the trampoline function\n // this is necessary because initializers might need additional locals and a proper this context\n var previousFunction = this.currentFunction;\n this.currentFunction = trampoline;\n\n // create a br_table switching over the number of optional parameters provided\n var numNames = numOptional + 1; // incl. outer block\n var names = new Array(numNames);\n var ofN = \"of\" + numOptional.toString(10);\n for (let i = 0; i < numNames; ++i) {\n let label = i.toString(10) + ofN;\n names[i] = label;\n }\n var body = module.createBlock(names[0], [\n module.createBlock(\"outOfRange\", [\n module.createSwitch(names, \"outOfRange\",\n // condition is number of provided optional arguments, so subtract required arguments\n minArguments\n ? module.createBinary(\n BinaryOp.SubI32,\n module.createGetGlobal(\"~argc\", NativeType.I32),\n module.createI32(minArguments)\n )\n : module.createGetGlobal(\"~argc\", NativeType.I32)\n )\n ]),\n module.createUnreachable()\n ]);\n for (let i = 0; i < numOptional; ++i, ++operandIndex) {\n let type = originalParameterTypes[minArguments + i];\n let declaration = originalParameterDeclarations[minArguments + i];\n let initializer = declaration.initializer;\n let initExpr: ExpressionRef;\n if (initializer) {\n initExpr = module.createSetLocal(operandIndex,\n this.compileExpression(\n initializer,\n type,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP\n )\n );\n } else {\n this.error(\n DiagnosticCode.Optional_parameter_must_have_an_initializer,\n declaration.range\n );\n initExpr = module.createUnreachable();\n }\n body = module.createBlock(names[i + 1], [\n body,\n initExpr,\n ]);\n forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, type.toNativeType());\n }\n this.currentFunction = previousFunction;\n assert(operandIndex == maxOperands);\n\n var funcRef = module.addFunction(\n trampolineName,\n this.ensureFunctionType(\n trampolineSignature.parameterTypes,\n trampolineSignature.returnType,\n trampolineSignature.thisType\n ),\n typesToNativeTypes(trampoline.additionalLocals),\n module.createBlock(null, [\n body,\n module.createCall(\n originalName,\n forwardedOperands,\n commonReturnType.toNativeType()\n )\n ], commonReturnType.toNativeType())\n );\n trampoline.finalize(module, funcRef);\n return trampoline;\n }\n\n /** Makes sure that the argument count helper global is present and returns its name. */\n private ensureArgcVar(): string {\n var internalName = \"~argc\";\n if (!this.argcVar) {\n let module = this.module;\n this.argcVar = module.addGlobal(\n internalName,\n NativeType.I32,\n true,\n module.createI32(0)\n );\n }\n return internalName;\n }\n\n /** Makes sure that the argument count helper setter is present and returns its name. */\n private ensureArgcSet(): string {\n var internalName = \"~setargc\";\n if (!this.argcSet) {\n let module = this.module;\n this.argcSet = module.addFunction(internalName,\n this.ensureFunctionType([ Type.u32 ], Type.void),\n null,\n module.createSetGlobal(this.ensureArgcVar(),\n module.createGetLocal(0, NativeType.I32)\n )\n );\n module.addFunctionExport(internalName, \"_setargc\");\n }\n return internalName;\n }\n\n /** Creates a direct call to the specified function. */\n makeCallDirect(\n instance: Function,\n operands: ExpressionRef[] | null = null\n ): ExpressionRef {\n var numOperands = operands ? operands.length : 0;\n var numArguments = numOperands;\n var minArguments = instance.signature.requiredParameters;\n var minOperands = minArguments;\n var maxArguments = instance.signature.parameterTypes.length;\n var maxOperands = maxArguments;\n if (instance.is(CommonFlags.INSTANCE)) {\n ++minOperands;\n ++maxOperands;\n --numArguments;\n }\n assert(numOperands >= minOperands);\n\n var module = this.module;\n if (!this.compileFunction(instance)) return module.createUnreachable();\n var returnType = instance.signature.returnType;\n var isCallImport = instance.is(CommonFlags.MODULE_IMPORT);\n\n // fill up omitted arguments with their initializers, if constant, otherwise with zeroes.\n if (numOperands < maxOperands) {\n if (!operands) {\n operands = new Array(maxOperands);\n operands.length = 0;\n }\n let parameterTypes = instance.signature.parameterTypes;\n let parameterNodes = instance.prototype.declaration.signature.parameters;\n let allOptionalsAreConstant = true;\n for (let i = numArguments; i < maxArguments; ++i) {\n let initializer = parameterNodes[i].initializer;\n if (!(initializer !== null && nodeIsConstantValue(initializer.kind))) {\n allOptionalsAreConstant = false;\n break;\n }\n }\n if (allOptionalsAreConstant) { // inline into the call\n for (let i = numArguments; i < maxArguments; ++i) {\n operands.push(\n this.compileExpression(\n parameterNodes[i].initializer,\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n )\n );\n }\n } else { // otherwise fill up with zeroes and call the trampoline\n for (let i = numArguments; i < maxArguments; ++i) {\n operands.push(parameterTypes[i].toNativeZero(module));\n }\n if (!isCallImport) {\n let original = instance;\n instance = this.ensureTrampoline(instance);\n if (!this.compileFunction(instance)) return module.createUnreachable();\n instance.flow.flags = original.flow.flags;\n this.program.instancesLookup.set(instance.internalName, instance); // so canOverflow can find it\n let nativeReturnType = returnType.toNativeType();\n this.currentType = returnType;\n return module.createBlock(null, [\n module.createSetGlobal(this.ensureArgcVar(), module.createI32(numArguments)),\n module.createCall(instance.internalName, operands, nativeReturnType)\n ], nativeReturnType);\n }\n }\n }\n\n // otherwise just call through\n this.currentType = returnType;\n return module.createCall(instance.internalName, operands, returnType.toNativeType());\n }\n\n /** Compiles an indirect call using an index argument and a signature. */\n compileCallIndirect(\n signature: Signature,\n indexArg: ExpressionRef,\n argumentExpressions: Expression[],\n reportNode: Node,\n thisArg: ExpressionRef = 0\n ): ExpressionRef {\n var numArguments = argumentExpressions.length;\n\n if (!this.checkCallSignature( // reports\n signature,\n numArguments,\n thisArg != 0,\n reportNode\n )) {\n return this.module.createUnreachable();\n }\n\n var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\n var operands = new Array(numArgumentsInclThis);\n var index = 0;\n if (thisArg) {\n operands[0] = thisArg;\n index = 1;\n }\n var parameterTypes = signature.parameterTypes;\n for (let i = 0; i < numArguments; ++i, ++index) {\n operands[index] = this.compileExpression(\n argumentExpressions[i],\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n }\n assert(index == numArgumentsInclThis);\n return this.makeCallIndirect(signature, indexArg, operands);\n }\n\n /** Creates an indirect call to the function at `indexArg` in the function table. */\n makeCallIndirect(\n signature: Signature,\n indexArg: ExpressionRef,\n operands: ExpressionRef[] | null = null\n ): ExpressionRef {\n var numOperands = operands ? operands.length : 0;\n var numArguments = numOperands;\n var minArguments = signature.requiredParameters;\n var minOperands = minArguments;\n var maxArguments = signature.parameterTypes.length;\n var maxOperands = maxArguments;\n if (signature.thisType) {\n ++minOperands;\n ++maxOperands;\n --numArguments;\n }\n assert(numOperands >= minOperands);\n\n this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n\n // fill up omitted arguments with zeroes\n if (numOperands < maxOperands) {\n if (!operands) {\n operands = new Array(maxOperands);\n operands.length = 0;\n }\n let parameterTypes = signature.parameterTypes;\n for (let i = numArguments; i < maxArguments; ++i) {\n operands.push(parameterTypes[i].toNativeZero(module));\n }\n }\n\n var returnType = signature.returnType;\n this.currentType = returnType;\n return module.createBlock(null, [\n module.createSetGlobal(this.ensureArgcVar(), // might still be calling a trampoline\n module.createI32(numArguments)\n ),\n module.createCallIndirect(indexArg, operands, signature.toSignatureString())\n ], returnType.toNativeType()); // not necessarily wrapped\n }\n\n compileCommaExpression(expression: CommaExpression, contextualType: Type): ExpressionRef {\n var expressions = expression.expressions;\n var numExpressions = expressions.length;\n var exprs = new Array(numExpressions--);\n for (let i = 0; i < numExpressions; ++i) {\n exprs[i] = this.compileExpression(\n expressions[i],\n Type.void, // drop all\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n exprs[numExpressions] = this.compileExpression(\n expressions[numExpressions],\n contextualType, // except last\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n return this.module.createBlock(null, exprs, this.currentType.toNativeType());\n }\n\n compileElementAccessExpression(expression: ElementAccessExpression, contextualType: Type): ExpressionRef {\n var target = this.resolver.resolveElementAccess(expression, this.currentFunction, contextualType); // reports\n if (!target) return this.module.createUnreachable();\n switch (target.kind) {\n case ElementKind.CLASS: {\n let isUnchecked = this.currentFunction.flow.is(FlowFlags.UNCHECKED_CONTEXT);\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\n if (!indexedGet) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n expression.expression.range, (target).internalName\n );\n return this.module.createUnreachable();\n }\n let thisArg = this.compileExpression(\n expression.expression,\n (target).type,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n return this.compileCallDirect(indexedGet, [\n expression.elementExpression\n ], expression, thisArg);\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n compileFunctionExpression(expression: FunctionExpression, contextualType: Type): ExpressionRef {\n var declaration = expression.declaration;\n var name = declaration.name;\n var simpleName = (name.text.length\n ? name.text\n : \"anonymous\") + \"|\" + this.functionTable.length.toString(10);\n var currentFunction = this.currentFunction;\n var prototype = new FunctionPrototype(\n this.program,\n simpleName,\n currentFunction.internalName + INNER_DELIMITER + simpleName,\n declaration,\n null,\n DecoratorFlags.NONE\n );\n var flow = currentFunction.flow;\n var instance = this.compileFunctionUsingTypeArguments(\n prototype,\n [],\n makeMap(flow.contextualTypeArguments),\n flow,\n declaration\n );\n if (!instance) return this.module.createUnreachable();\n this.currentType = instance.signature.type; // TODO: get cached type?\n // NOTE that, in order to make this work in every case, the function must be represented by a\n // value, so we add it and rely on the optimizer to figure out where it can be called directly.\n var index = this.ensureFunctionTableEntry(instance); // reports\n return index < 0\n ? this.module.createUnreachable()\n : this.module.createI32(index);\n }\n\n /**\n * Compiles an identifier in the specified context.\n * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\n * precomputes them according to context.\n */\n compileIdentifierExpression(\n expression: IdentifierExpression,\n contextualType: Type,\n retainConstantType: bool\n ): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n\n // check special keywords first\n switch (expression.kind) {\n case NodeKind.NULL: {\n let options = this.options;\n if (!contextualType.classReference) {\n this.currentType = options.usizeType;\n }\n return options.isWasm64\n ? module.createI64(0)\n : module.createI32(0);\n }\n case NodeKind.TRUE: {\n this.currentType = Type.bool;\n return module.createI32(1);\n }\n case NodeKind.FALSE: {\n this.currentType = Type.bool;\n return module.createI32(0);\n }\n case NodeKind.THIS: {\n let flow = currentFunction.flow;\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\n let thisLocal = assert(flow.getScopedLocal(\"this\"));\n if (thisLocal) {\n this.currentType = thisLocal.type;\n return module.createGetLocal(thisLocal.index, thisLocal.type.toNativeType());\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let thisLocal = assert(flow.getScopedLocal(\"this\"));\n let classInstance = assert(currentFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\n let nativeSizeType = this.options.nativeSizeType;\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // {\n // if (!this) this = \n // this.a = X\n // this.b = Y\n // return this\n // }\n let stmts: ExpressionRef[] = [\n module.createIf(\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\n module.createGetLocal(thisLocal.index, nativeSizeType)\n ),\n module.createSetLocal(thisLocal.index,\n this.makeAllocation(classInstance)\n )\n )\n ];\n this.makeFieldInitialization(classInstance, stmts);\n stmts.push(\n module.createGetLocal(thisLocal.index, nativeSizeType)\n );\n this.currentType = thisLocal.type;\n return module.createBlock(null, stmts, nativeSizeType);\n }\n }\n // if not a constructor, `this` type can differ\n let thisType = assert(currentFunction.signature.thisType);\n this.currentType = thisType;\n return module.createGetLocal(0, thisType.toNativeType());\n }\n this.error(\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\n expression.range\n );\n this.currentType = this.options.usizeType;\n return module.createUnreachable();\n }\n case NodeKind.SUPER: {\n if (currentFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!currentFunction.flow.is(FlowFlags.CALLS_SUPER)) {\n // TS1034 in the parser effectively limits this to property accesses\n this.error(\n DiagnosticCode._super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class,\n expression.range\n );\n }\n }\n let flow = currentFunction.flow;\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\n let scopedThis = flow.getScopedLocal(\"this\");\n if (scopedThis) {\n let scopedThisClass = assert(scopedThis.type.classReference);\n let base = scopedThisClass.base;\n if (base) {\n this.currentType = base.type;\n return module.createGetLocal(scopedThis.index, base.type.toNativeType());\n }\n }\n }\n if (currentFunction.is(CommonFlags.INSTANCE)) {\n let classInstance = assert(currentFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\n let baseClassInstance = (classInstance).base;\n if (baseClassInstance) {\n let superType = baseClassInstance.type;\n this.currentType = superType;\n return module.createGetLocal(0, superType.toNativeType());\n }\n }\n this.error(\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\n expression.range\n );\n this.currentType = this.options.usizeType;\n return module.createUnreachable();\n }\n }\n\n // otherwise resolve\n var target = this.resolver.resolveIdentifier( // reports\n expression,\n this.currentEnum || currentFunction\n );\n if (!target) return module.createUnreachable();\n\n switch (target.kind) {\n case ElementKind.LOCAL: {\n let localType = (target).type;\n assert(localType != Type.void);\n if ((target).is(CommonFlags.INLINED)) {\n return this.compileInlineConstant(target, contextualType, retainConstantType);\n }\n let localIndex = (target).index;\n assert(localIndex >= 0);\n this.currentType = localType;\n return this.module.createGetLocal(localIndex, localType.toNativeType());\n }\n case ElementKind.GLOBAL: {\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field\n return this.module.createUnreachable();\n }\n let globalType = (target).type;\n assert(globalType != Type.void);\n if ((target).is(CommonFlags.INLINED)) {\n return this.compileInlineConstant(target, contextualType, retainConstantType);\n }\n this.currentType = globalType;\n return this.module.createGetGlobal((target).internalName, globalType.toNativeType());\n }\n case ElementKind.ENUMVALUE: { // here: if referenced from within the same enum\n if (!target.is(CommonFlags.COMPILED)) {\n this.error(\n DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,\n expression.range\n );\n this.currentType = Type.i32;\n return this.module.createUnreachable();\n }\n this.currentType = Type.i32;\n if ((target).is(CommonFlags.INLINED)) {\n return this.module.createI32((target).constantValue);\n }\n return this.module.createGetGlobal((target).internalName, NativeType.I32);\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n let instance = this.resolver.resolveFunction(\n target,\n null,\n makeMap(currentFunction.flow.contextualTypeArguments)\n );\n if (!(instance && this.compileFunction(instance))) return module.createUnreachable();\n let index = this.ensureFunctionTableEntry(instance);\n this.currentType = instance.signature.type;\n return this.module.createI32(index);\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n compileInstanceOfExpression(\n expression: InstanceOfExpression,\n contextualType: Type\n ): ExpressionRef {\n var module = this.module;\n // NOTE that this differs from TypeScript in that the rhs is a type, not an expression. at the\n // time of implementation, this seemed more useful because dynamic rhs expressions are not\n // possible in AS anyway.\n var expr = this.compileExpressionRetainType(expression.expression, this.options.usizeType, WrapMode.NONE);\n var type = this.currentType;\n var isType = this.resolver.resolveType(expression.isType);\n this.currentType = Type.bool;\n if (!isType) return module.createUnreachable();\n return type.is(TypeFlags.NULLABLE) && !isType.is(TypeFlags.NULLABLE)\n ? type.nonNullableType.isAssignableTo(isType)\n ? module.createBinary( // not precomputeable\n type.is(TypeFlags.LONG)\n ? BinaryOp.NeI64\n : BinaryOp.NeI32,\n expr,\n type.toNativeZero(module)\n )\n : module.createI32(0)\n : module.createI32(type.isAssignableTo(isType, true) ? 1 : 0);\n }\n\n compileLiteralExpression(\n expression: LiteralExpression,\n contextualType: Type,\n implicitNegate: bool = false\n ): ExpressionRef {\n var module = this.module;\n\n switch (expression.literalKind) {\n case LiteralKind.ARRAY: {\n assert(!implicitNegate);\n let classType = contextualType.classReference;\n if (\n classType &&\n classType.prototype == this.program.arrayPrototype\n ) {\n return this.compileArrayLiteral(\n assert(classType.typeArguments)[0],\n (expression).elementExpressions,\n false, // TODO: isConst?\n expression\n );\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n case LiteralKind.FLOAT: {\n let floatValue = (expression).value;\n if (implicitNegate) {\n floatValue = -floatValue;\n }\n if (contextualType == Type.f32) {\n return module.createF32(floatValue);\n }\n this.currentType = Type.f64;\n return module.createF64(floatValue);\n }\n case LiteralKind.INTEGER: {\n let intValue = (expression).value;\n if (implicitNegate) {\n intValue = i64_sub(\n i64_new(0),\n intValue\n );\n }\n let type = this.resolver.determineIntegerLiteralType(intValue, contextualType);\n this.currentType = type;\n switch (type.kind) {\n case TypeKind.ISIZE: if (!this.options.isWasm64) return module.createI32(i64_low(intValue));\n case TypeKind.I64: return module.createI64(i64_low(intValue), i64_high(intValue));\n case TypeKind.USIZE: if (!this.options.isWasm64) return module.createI32(i64_low(intValue));\n case TypeKind.U64: return module.createI64(i64_low(intValue), i64_high(intValue));\n case TypeKind.F32: return module.createF32(i64_to_f32(intValue));\n case TypeKind.F64: return module.createF64(i64_to_f64(intValue));\n default: return module.createI32(i64_low(intValue));\n }\n }\n case LiteralKind.STRING: {\n assert(!implicitNegate);\n return this.compileStringLiteral(expression);\n }\n case LiteralKind.OBJECT: {\n assert(!implicitNegate);\n return this.compileObjectLiteral(expression, contextualType);\n }\n // case LiteralKind.REGEXP:\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n\n /** Ensures that the specified string exists in static memory and returns a pointer to it. */\n ensureStaticString(stringValue: string): ExpressionRef {\n var program = this.program;\n var hasGC = program.hasGC;\n var gcHeaderSize = program.gcHeaderSize;\n\n var stringInstance = assert(program.stringInstance);\n var stringSegment: MemorySegment;\n\n // if the string already exists, reuse it\n var segments = this.stringSegments;\n if (segments.has(stringValue)) {\n stringSegment = segments.get(stringValue);\n\n // otherwise create it\n } else {\n let length = stringValue.length;\n let headerSize = (stringInstance.currentMemoryOffset + 1) & ~1;\n let totalSize = headerSize + length * 2;\n\n let buf: Uint8Array;\n let pos: u32;\n\n if (hasGC) {\n buf = new Uint8Array(gcHeaderSize + totalSize);\n pos = gcHeaderSize;\n writeI32(ensureGCHook(this, stringInstance), buf, program.gcHookOffset);\n } else {\n buf = new Uint8Array(totalSize);\n pos = 0;\n }\n writeI32(length, buf, pos + stringInstance.offsetof(\"length\"));\n pos += headerSize;\n for (let i = 0; i < length; ++i) {\n writeI16(stringValue.charCodeAt(i), buf, pos + (i << 1));\n }\n stringSegment = this.addMemorySegment(buf);\n segments.set(stringValue, stringSegment);\n }\n var stringOffset = stringSegment.offset;\n if (hasGC) stringOffset = i64_add(stringOffset, i64_new(gcHeaderSize));\n\n this.currentType = stringInstance.type;\n if (this.options.isWasm64) {\n return this.module.createI64(i64_low(stringOffset), i64_high(stringOffset));\n } else {\n assert(i64_is_u32(stringOffset));\n return this.module.createI32(i64_low(stringOffset));\n }\n }\n\n compileStringLiteral(expression: StringLiteralExpression): ExpressionRef {\n return this.ensureStaticString(expression.value);\n }\n\n /** Ensures that the specified array exists in static memory and returns a pointer to it. */\n ensureStaticArray(elementType: Type, values: ExpressionRef[]): ExpressionRef {\n var program = this.program;\n var hasGC = program.hasGC;\n var gcHeaderSize = program.gcHeaderSize;\n\n var length = values.length;\n var byteSize = elementType.byteSize;\n var byteLength = length * byteSize;\n var usizeTypeSize = this.options.usizeType.byteSize;\n\n var buf: Uint8Array;\n var pos: u32;\n\n // create the backing ArrayBuffer segment\n var bufferInstance = assert(program.arrayBufferInstance);\n var bufferHeaderSize = (bufferInstance.currentMemoryOffset + 7) & ~7;\n var bufferTotalSize = 1 << (32 - clz(bufferHeaderSize + byteLength - 1));\n if (hasGC) {\n buf = new Uint8Array(gcHeaderSize + bufferTotalSize);\n pos = gcHeaderSize;\n writeI32(ensureGCHook(this, bufferInstance), buf, program.gcHookOffset);\n } else {\n buf = new Uint8Array(bufferTotalSize);\n pos = 0;\n }\n writeI32(byteLength, buf, pos + bufferInstance.offsetof(\"byteLength\"));\n pos += bufferHeaderSize;\n var nativeType = elementType.toNativeType();\n switch (nativeType) {\n case NativeType.I32: {\n switch (byteSize) {\n case 1: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeI8(getConstValueI32(value), buf, pos);\n pos += 1;\n }\n break;\n }\n case 2: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeI16(getConstValueI32(value), buf, pos);\n pos += 2;\n }\n break;\n }\n case 4: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeI32(getConstValueI32(value), buf, pos);\n pos += 4;\n }\n break;\n }\n default: assert(false);\n }\n break;\n }\n case NativeType.I64: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeI64(i64_new(getConstValueI64Low(value), getConstValueI64High(value)), buf, pos);\n pos += 8;\n }\n break;\n }\n case NativeType.F32: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeF32(getConstValueF32(value), buf, pos);\n pos += 4;\n }\n break;\n }\n case NativeType.F64: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeF64(getConstValueF64(value), buf, pos);\n pos += 8;\n }\n break;\n }\n default: assert(false);\n }\n var bufferSegment = this.addMemorySegment(buf);\n var bufferOffset = bufferSegment.offset;\n if (hasGC) bufferOffset = i64_add(bufferOffset, i64_new(gcHeaderSize));\n\n // create the Array segment and return a pointer to it\n var arrayPrototype = assert(program.arrayPrototype);\n var arrayInstance = assert(this.resolver.resolveClass(\n arrayPrototype,\n [ elementType ],\n makeMap()\n ));\n var arrayHeaderSize = (arrayInstance.currentMemoryOffset + 7) & ~7;\n if (hasGC) {\n buf = new Uint8Array(gcHeaderSize + arrayHeaderSize);\n pos = gcHeaderSize;\n writeI32(ensureGCHook(this, arrayInstance), buf, program.gcHookOffset);\n } else {\n buf = new Uint8Array(arrayHeaderSize);\n pos = 0;\n }\n var arraySegment = this.addMemorySegment(buf);\n var arrayOffset = arraySegment.offset;\n if (hasGC) arrayOffset = i64_add(arrayOffset, i64_new(gcHeaderSize));\n this.currentType = arrayInstance.type;\n if (usizeTypeSize == 8) {\n writeI64(bufferOffset, buf, pos + arrayInstance.offsetof(\"buffer_\"));\n writeI32(length, buf, pos + arrayInstance.offsetof(\"length_\"));\n return this.module.createI64(i64_low(arrayOffset), i64_high(arrayOffset));\n } else {\n assert(i64_is_u32(bufferOffset));\n writeI32(i64_low(bufferOffset), buf, pos + arrayInstance.offsetof(\"buffer_\"));\n writeI32(length, buf, pos + arrayInstance.offsetof(\"length_\"));\n assert(i64_is_u32(arrayOffset));\n return this.module.createI32(i64_low(arrayOffset));\n }\n }\n\n compileArrayLiteral(\n elementType: Type,\n expressions: (Expression | null)[],\n isConst: bool,\n reportNode: Node\n ): ExpressionRef {\n var module = this.module;\n\n // find out whether all elements are constant (array is static)\n var length = expressions.length;\n var compiledValues = new Array(length);\n var constantValues = new Array(length);\n var nativeElementType = elementType.toNativeType();\n var isStatic = true;\n for (let i = 0; i < length; ++i) {\n let expr = expressions[i]\n ? this.compileExpression(expressions[i], elementType, ConversionKind.IMPLICIT, WrapMode.NONE)\n : elementType.toNativeZero(module);\n compiledValues[i] = expr;\n if (isStatic) {\n expr = module.precomputeExpression(compiledValues[i]);\n if (getExpressionId(expr) == ExpressionId.Const) {\n assert(getExpressionType(expr) == nativeElementType);\n constantValues[i] = expr;\n } else {\n if (isConst) {\n this.warning(\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\n reportNode.range\n );\n }\n isStatic = false;\n }\n }\n }\n\n // make a static array if possible\n if (isStatic) return this.ensureStaticArray(elementType, constantValues);\n\n // otherwise obtain the array type\n var arrayPrototype = assert(this.program.arrayPrototype);\n var arrayInstance = assert(this.resolver.resolveClass(\n arrayPrototype,\n [ elementType ],\n makeMap()\n ));\n var arrayType = arrayInstance.type;\n\n // and compile an explicit instantiation\n this.currentType = arrayType;\n var setter = arrayInstance.lookupOverload(OperatorKind.INDEXED_SET, true);\n if (!setter) {\n this.error(\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\n reportNode.range, arrayInstance.internalName\n );\n return module.createUnreachable();\n }\n var nativeArrayType = arrayType.toNativeType();\n var currentFunction = this.currentFunction;\n var tempLocal = currentFunction.addLocal(arrayType); // can't reuse a temp (used in compiledValues)\n var stmts = new Array(2 + length);\n var index = 0;\n stmts[index++] = module.createSetLocal(tempLocal.index,\n this.makeCallDirect(assert(arrayInstance.constructorInstance), [\n module.createI32(0), // this\n module.createI32(length)\n ])\n );\n for (let i = 0; i < length; ++i) {\n stmts[index++] = this.makeCallDirect(setter, [\n module.createGetLocal(tempLocal.index, nativeArrayType), // this\n module.createI32(i),\n compiledValues[i]\n ]);\n }\n assert(index + 1 == stmts.length);\n stmts[index] = module.createGetLocal(tempLocal.index, nativeArrayType);\n currentFunction.freeTempLocal(tempLocal); // but can be reused now\n this.currentType = arrayType;\n return module.createBlock(null, stmts, nativeArrayType);\n }\n\n compileObjectLiteral(expression: ObjectLiteralExpression, contextualType: Type): ExpressionRef {\n var module = this.module;\n\n // contextual type must be a class\n var classReference = contextualType.classReference;\n if (!classReference || classReference.is(CommonFlags.ABSTRACT)) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n expression.range, \"\", contextualType.toString()\n );\n return module.createUnreachable();\n }\n\n // if present, check that the constructor is compatible with object literals\n var ctor = classReference.constructorInstance;\n if (ctor) {\n // TODO: if the constructor requires parameters, check whether these are given as part of the\n // object literal and use them to call the ctor while not generating a store.\n if (ctor.signature.requiredParameters) {\n this.error(\n DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,\n expression.range, classReference.toString()\n );\n return module.createUnreachable();\n }\n if (ctor.is(CommonFlags.PRIVATE)) {\n this.error(\n DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,\n expression.range, classReference.toString()\n );\n return module.createUnreachable();\n }\n if (ctor.is(CommonFlags.PROTECTED)) {\n this.error(\n DiagnosticCode.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration,\n expression.range, classReference.toString()\n );\n return module.createUnreachable();\n }\n }\n\n // check and compile field values\n var names = expression.names;\n var numNames = names.length;\n var values = expression.values;\n var members = classReference.members;\n var hasErrors = false;\n var exprs = new Array(numNames + 2);\n var tempLocal = this.currentFunction.getTempLocal(this.options.usizeType);\n assert(numNames == values.length);\n for (let i = 0, k = numNames; i < k; ++i) {\n let member = members ? members.get(names[i].text) : null;\n if (!member || member.kind != ElementKind.FIELD) {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n names[i].range, names[i].text, classReference.toString()\n );\n hasErrors = true;\n continue;\n }\n let type = (member).type;\n exprs[i + 1] = this.module.createStore( // TODO: handle setters as well\n type.byteSize,\n this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType),\n this.compileExpression(values[i], (member).type, ConversionKind.IMPLICIT, WrapMode.NONE),\n type.toNativeType(),\n (member).memoryOffset\n );\n }\n this.currentType = classReference.type.nonNullableType;\n if (hasErrors) return module.createUnreachable();\n\n // allocate a new instance first and assign 'this' to the temp. local\n exprs[0] = module.createSetLocal(\n tempLocal.index,\n this.makeAllocation(classReference)\n );\n\n // once all field values have been set, return 'this'\n exprs[exprs.length - 1] = module.createGetLocal(tempLocal.index, this.options.nativeSizeType);\n\n return module.createBlock(null, exprs, this.options.nativeSizeType);\n }\n\n compileNewExpression(expression: NewExpression, contextualType: Type): ExpressionRef {\n var module = this.module;\n var options = this.options;\n var currentFunction = this.currentFunction;\n\n // obtain the class being instantiated\n var target = this.resolver.resolveExpression( // reports\n expression.expression,\n currentFunction\n );\n if (!target) return module.createUnreachable();\n if (target.kind != ElementKind.CLASS_PROTOTYPE) {\n this.error(\n DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature,\n expression.expression.range\n );\n return this.module.createUnreachable();\n }\n var classPrototype = target;\n var classInstance: Class | null = null;\n var typeArguments = expression.typeArguments;\n var classReference: Class | null;\n if (\n !typeArguments &&\n (classReference = contextualType.classReference) !== null &&\n classReference.is(CommonFlags.GENERIC)\n ) {\n classInstance = this.resolver.resolveClass(\n classPrototype,\n classReference.typeArguments,\n makeMap(currentFunction.flow.contextualTypeArguments)\n );\n } else {\n classInstance = this.resolver.resolveClassInclTypeArguments(\n classPrototype,\n typeArguments,\n makeMap(currentFunction.flow.contextualTypeArguments),\n expression\n );\n }\n if (!classInstance) return module.createUnreachable();\n return this.compileInstantiate(classInstance, expression.arguments, expression);\n }\n\n /** Gets the compiled constructor of the specified class or generates one if none is present. */\n ensureConstructor(classInstance: Class, reportNode: Node): Function {\n var ctorInstance = classInstance.constructorInstance;\n if (ctorInstance) {\n this.compileFunction(ctorInstance);\n return ctorInstance;\n }\n\n // use the signature of the parent constructor if a derived class\n var baseClass = classInstance.base;\n var signature = baseClass\n ? this.ensureConstructor(baseClass, reportNode).signature\n : new Signature(null, classInstance.type, classInstance.type);\n\n var internalName = classInstance.internalName + INSTANCE_DELIMITER + \"constructor\";\n\n var nativeDummy = assert(this.program.elementsLookup.get(\"NATIVE_CODE\"));\n assert(nativeDummy.kind == ElementKind.FUNCTION_PROTOTYPE);\n\n ctorInstance = new Function(\n nativeDummy,\n internalName,\n signature,\n classInstance,\n null\n );\n ctorInstance.set(CommonFlags.INSTANCE | CommonFlags.CONSTRUCTOR | CommonFlags.COMPILED);\n classInstance.constructorInstance = ctorInstance;\n var previousFunction = this.currentFunction;\n this.currentFunction = ctorInstance;\n\n // generate body\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n var stmts = new Array();\n\n // {\n // if (!this) this = \n // IF_DERIVED: this = super(this, ...args)\n // this.a = X\n // this.b = Y\n // return this\n // }\n stmts.push(\n module.createIf(\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\n module.createGetLocal(0, nativeSizeType)\n ),\n module.createSetLocal(0,\n this.makeAllocation(classInstance)\n )\n )\n );\n if (baseClass) {\n let parameterTypes = signature.parameterTypes;\n let numParameters = parameterTypes.length;\n let operands = new Array(1 + numParameters);\n operands[0] = module.createGetLocal(0, nativeSizeType);\n for (let i = 0; i < numParameters; ++i) {\n operands[i + 1] = module.createGetLocal(i + 1, parameterTypes[i].toNativeType());\n }\n // TODO: base constructor might be inlined, but makeCallDirect can't do this\n stmts.push(\n module.createSetLocal(0,\n this.makeCallDirect(assert(baseClass.constructorInstance), operands)\n )\n );\n }\n this.makeFieldInitialization(classInstance, stmts);\n stmts.push(\n module.createGetLocal(0, nativeSizeType)\n );\n\n // make the function\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var funcRef = module.addFunction(ctorInstance.internalName, typeRef, null,\n stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, nativeSizeType)\n );\n ctorInstance.finalize(module, funcRef);\n this.currentFunction = previousFunction;\n return ctorInstance;\n }\n\n compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n var ctor = this.ensureConstructor(classInstance, reportNode);\n var expr = this.compileCallDirect(\n ctor,\n argumentExpressions,\n reportNode,\n this.options.usizeType.toNativeZero(this.module),\n ctor.hasDecorator(DecoratorFlags.INLINE)\n // FIXME: trying to inline a constructor that doesn't return a custom value doesn't work\n );\n this.currentType = classInstance.type;\n return expr;\n }\n\n compileParenthesizedExpression(\n expression: ParenthesizedExpression,\n contextualType: Type\n ): ExpressionRef {\n // does not change types, just order\n return this.compileExpression(\n expression.expression,\n contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n }\n\n /**\n * Compiles a property access in the specified context.\n * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\n * precomputes them according to context.\n */\n compilePropertyAccessExpression(\n propertyAccess: PropertyAccessExpression,\n contextualType: Type,\n retainConstantType: bool\n ): ExpressionRef {\n var module = this.module;\n\n var target = this.resolver.resolvePropertyAccess(propertyAccess, this.currentFunction, contextualType); // reports\n if (!target) return module.createUnreachable();\n\n switch (target.kind) {\n case ElementKind.GLOBAL: { // static property\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field\n return module.createUnreachable();\n }\n let globalType = (target).type;\n assert(globalType != Type.void);\n if ((target).is(CommonFlags.INLINED)) {\n return this.compileInlineConstant(target, contextualType, retainConstantType);\n }\n this.currentType = globalType;\n return module.createGetGlobal((target).internalName, globalType.toNativeType());\n }\n case ElementKind.ENUMVALUE: { // enum value\n let theEnum = assert((target).parent); assert(theEnum.kind == ElementKind.ENUM);\n if (!this.compileEnum(theEnum)) {\n this.currentType = Type.i32;\n return this.module.createUnreachable();\n }\n this.currentType = Type.i32;\n if ((target).is(CommonFlags.INLINED)) {\n return module.createI32((target).constantValue);\n }\n return module.createGetGlobal((target).internalName, NativeType.I32);\n }\n case ElementKind.FIELD: { // instance field\n let thisExpression = assert(this.resolver.currentThisExpression);\n assert((target).memoryOffset >= 0);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n this.currentType = (target).type;\n return module.createLoad(\n (target).type.byteSize,\n (target).type.is(TypeFlags.SIGNED | TypeFlags.INTEGER),\n thisExpr,\n (target).type.toNativeType(),\n (target).memoryOffset\n );\n }\n case ElementKind.PROPERTY: {// instance property (here: getter)\n return this.compileGetter(target, propertyAccess);\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n this.error(\n DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,\n propertyAccess.range, (target).simpleName\n );\n return module.createUnreachable();\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n propertyAccess.range\n );\n return module.createUnreachable();\n }\n\n private compileGetter(target: Property, reportNode: Node): ExpressionRef {\n var prototype = target.getterPrototype;\n if (prototype) {\n let instance = this.resolver.resolveFunction(prototype, null);\n if (!instance) return this.module.createUnreachable();\n let signature = instance.signature;\n if (!this.checkCallSignature( // reports\n signature,\n 0,\n instance.is(CommonFlags.INSTANCE),\n reportNode\n )) {\n return this.module.createUnreachable();\n }\n let inline = (instance.decoratorFlags & DecoratorFlags.INLINE) != 0;\n if (instance.is(CommonFlags.INSTANCE)) {\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\n let thisExpression = assert(this.resolver.currentThisExpression); //!!!\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n this.currentType = signature.returnType;\n return this.compileCallDirect(instance, [], reportNode, thisExpr, inline);\n } else {\n this.currentType = signature.returnType;\n return this.compileCallDirect(instance, [], reportNode, 0, inline);\n }\n } else {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n reportNode.range, (target).simpleName, (target).parent.toString()\n );\n return this.module.createUnreachable();\n }\n }\n\n compileTernaryExpression(expression: TernaryExpression, contextualType: Type): ExpressionRef {\n var ifThen = expression.ifThen;\n var ifElse = expression.ifElse;\n var currentFunction = this.currentFunction;\n var parentFlow = currentFunction.flow;\n\n var condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n\n if (\n !this.options.noTreeShaking ||\n this.currentFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\n ) {\n // Try to eliminate unnecesssary branches if the condition is constant\n let condExprPrecomp = this.module.precomputeExpression(condExpr);\n if (\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\n getExpressionType(condExprPrecomp) == NativeType.I32\n ) {\n return getConstValueI32(condExprPrecomp)\n ? this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE)\n : this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\n\n // Otherwise recompile to the original and let the optimizer decide\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n }\n }\n\n var ifThenFlow = parentFlow.fork();\n currentFunction.flow = ifThenFlow;\n var ifThenExpr = this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE);\n var ifThenType = this.currentType;\n ifThenFlow.free();\n\n var ifElseFlow = parentFlow.fork();\n currentFunction.flow = ifElseFlow;\n var ifElseExpr = this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\n var ifElseType = this.currentType;\n currentFunction.flow = ifElseFlow.free();\n\n parentFlow.inheritMutual(ifThenFlow, ifElseFlow);\n\n var commonType = Type.commonCompatible(ifThenType, ifElseType, false);\n if (!commonType) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n expression.range, ifThenType.toString(), ifElseType.toString()\n );\n this.currentType = contextualType;\n return this.module.createUnreachable();\n }\n ifThenExpr = this.convertExpression(\n ifThenExpr,\n ifThenType,\n commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n ifThen\n );\n ifElseExpr = this.convertExpression(\n ifElseExpr,\n ifElseType,\n commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n ifElse\n );\n this.currentType = commonType;\n return this.module.createIf(condExpr, ifThenExpr, ifElseExpr);\n }\n\n compileUnaryPostfixExpression(expression: UnaryPostfixExpression, contextualType: Type): ExpressionRef {\n var module = this.module;\n var currentFunction = this.currentFunction;\n\n // make a getter for the expression (also obtains the type)\n var getValue = this.compileExpression( // reports\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // shortcut if compiling the getter already failed\n if (getExpressionId(getValue) == ExpressionId.Unreachable) return getValue;\n\n var currentType = this.currentType;\n\n // if the value isn't dropped, a temp. local is required to remember the original value\n var tempLocal: Local | null = null;\n if (contextualType != Type.void) {\n tempLocal = currentFunction.getTempLocal(currentType, false);\n getValue = module.createTeeLocal(\n tempLocal.index,\n getValue\n );\n }\n\n var calcValue: ExpressionRef;\n\n switch (expression.operator) {\n case Token.PLUS_PLUS: {\n switch (currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n calcValue = module.createBinary(\n BinaryOp.AddI32,\n getValue,\n module.createI32(1)\n );\n break;\n }\n case TypeKind.USIZE: {\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.POSTFIX_INC);\n if (overload) {\n calcValue = this.compileUnaryOverload(overload, expression.operand, getValue, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n }\n case TypeKind.ISIZE: {\n let options = this.options;\n calcValue = module.createBinary(\n options.isWasm64\n ? BinaryOp.AddI64\n : BinaryOp.AddI32,\n getValue,\n currentType.toNativeOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n calcValue = module.createBinary(\n BinaryOp.AddI64,\n getValue,\n module.createI64(1)\n );\n break;\n }\n case TypeKind.F32: {\n calcValue = module.createBinary(\n BinaryOp.AddF32,\n getValue,\n module.createF32(1)\n );\n break;\n }\n case TypeKind.F64: {\n calcValue = module.createBinary(\n BinaryOp.AddF64,\n getValue,\n module.createF64(1)\n );\n break;\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n break;\n }\n case Token.MINUS_MINUS: {\n switch (currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n calcValue = module.createBinary(\n BinaryOp.SubI32,\n getValue,\n module.createI32(1)\n );\n break;\n }\n case TypeKind.USIZE: {\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.POSTFIX_DEC);\n if (overload) {\n calcValue = this.compileUnaryOverload(overload, expression.operand, getValue, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n }\n case TypeKind.ISIZE: {\n let options = this.options;\n calcValue = module.createBinary(\n options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n getValue,\n currentType.toNativeOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n calcValue = module.createBinary(\n BinaryOp.SubI64,\n getValue,\n module.createI64(1)\n );\n break;\n }\n case TypeKind.F32: {\n calcValue = module.createBinary(\n BinaryOp.SubF32,\n getValue,\n module.createF32(1)\n );\n break;\n }\n case TypeKind.F64: {\n calcValue = module.createBinary(\n BinaryOp.SubF64,\n getValue,\n module.createF64(1)\n );\n break;\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n break;\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // simplify if dropped anyway\n if (!tempLocal) {\n this.currentType = Type.void;\n return this.compileAssignmentWithValue(expression.operand,\n calcValue,\n false\n );\n }\n\n // otherwise use the temp. local for the intermediate value (always possibly overflows)\n var setValue = this.compileAssignmentWithValue(expression.operand,\n calcValue, // also tees getValue to tempLocal\n false\n );\n\n this.currentType = tempLocal.type;\n currentFunction.freeTempLocal(tempLocal);\n var nativeType = tempLocal.type.toNativeType();\n\n return module.createBlock(null, [\n setValue,\n module.createGetLocal(tempLocal.index, nativeType)\n ], nativeType); // result of 'x++' / 'x--' might overflow\n }\n\n compileUnaryPrefixExpression(\n expression: UnaryPrefixExpression,\n contextualType: Type\n ): ExpressionRef {\n var module = this.module;\n var compound = false;\n var expr: ExpressionRef;\n\n switch (expression.operator) {\n case Token.PLUS: {\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.PLUS);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n // nop\n break;\n }\n case Token.MINUS: {\n if (expression.operand.kind == NodeKind.LITERAL && (\n (expression.operand).literalKind == LiteralKind.INTEGER ||\n (expression.operand).literalKind == LiteralKind.FLOAT\n )) {\n // implicitly negate integer and float literals. also enables proper checking of literal ranges.\n expr = this.compileLiteralExpression(expression.operand, contextualType, true);\n // compileExpression normally does this:\n if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\n break;\n }\n\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.MINUS);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.SubI32, module.createI32(0), expr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n this.currentType.toNativeZero(module),\n expr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.SubI64, module.createI64(0), expr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createUnary(UnaryOp.NegF32, expr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createUnary(UnaryOp.NegF64, expr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.PLUS_PLUS: {\n compound = true;\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.PREFIX_INC);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.AddI32, expr, this.module.createI32(1));\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.AddI64\n : BinaryOp.AddI32,\n expr,\n this.currentType.toNativeOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.AddI64, expr, module.createI64(1));\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.AddF32, expr, module.createF32(1));\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.AddF64, expr, module.createF64(1));\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.MINUS_MINUS: {\n compound = true;\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.PREFIX_DEC);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.SubI32, expr, module.createI32(1));\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n expr,\n this.currentType.toNativeOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.SubI64, expr, module.createI64(1));\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.SubF32, expr, module.createF32(1));\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.SubF64, expr, module.createF64(1));\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.EXCLAMATION: {\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.NOT);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n // allow '!' for references even without an overload\n }\n\n expr = this.makeIsFalseish(expr, this.currentType);\n this.currentType = Type.bool;\n break;\n }\n case Token.TILDE: {\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType.is(TypeFlags.FLOAT)\n ? Type.i64\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_NOT);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n } else {\n expr = this.convertExpression(\n expr,\n this.currentType, this.currentType.intType,\n ConversionKind.IMPLICIT, WrapMode.NONE,\n expression.operand\n );\n }\n\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.XorI32, expr, module.createI32(-1));\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.XorI64\n : BinaryOp.XorI32,\n expr,\n this.currentType.toNativeNegOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.XorI64, expr, module.createI64(-1, -1));\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.TYPEOF: {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n return compound\n ? this.compileAssignmentWithValue(expression.operand, expr, contextualType != Type.void)\n : expr;\n }\n\n /** Makes sure that a 32-bit integer value is wrapped to a valid value of the specified type. */\n ensureSmallIntegerWrap(expr: ExpressionRef, type: Type): ExpressionRef {\n var module = this.module;\n var flow = this.currentFunction.flow;\n switch (type.kind) {\n case TypeKind.I8: {\n if (flow.canOverflow(expr, type)) {\n expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\n ? module.createUnary(UnaryOp.ExtendI8ToI32, expr)\n : module.createBinary(BinaryOp.ShrI32,\n module.createBinary(BinaryOp.ShlI32,\n expr,\n module.createI32(24)\n ),\n module.createI32(24)\n );\n }\n break;\n }\n case TypeKind.I16: {\n if (flow.canOverflow(expr, type)) {\n expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\n ? module.createUnary(UnaryOp.ExtendI16ToI32, expr)\n : module.createBinary(BinaryOp.ShrI32,\n module.createBinary(BinaryOp.ShlI32,\n expr,\n module.createI32(16)\n ),\n module.createI32(16)\n );\n }\n break;\n }\n case TypeKind.U8: {\n if (flow.canOverflow(expr, type)) {\n expr = module.createBinary(BinaryOp.AndI32,\n expr,\n module.createI32(0xff)\n );\n }\n break;\n }\n case TypeKind.U16: {\n if (flow.canOverflow(expr, type)) {\n expr = module.createBinary(BinaryOp.AndI32,\n expr,\n module.createI32(0xffff)\n );\n }\n break;\n }\n case TypeKind.BOOL: {\n if (flow.canOverflow(expr, type)) {\n // bool is special in that it compares to 0 instead of masking with 0x1\n expr = module.createBinary(BinaryOp.NeI32,\n expr,\n module.createI32(0)\n );\n }\n break;\n }\n }\n return expr;\n }\n\n /** Creates a comparison whether an expression is 'false' in a broader sense. */\n makeIsFalseish(expr: ExpressionRef, type: Type): ExpressionRef {\n var module = this.module;\n switch (type.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = this.ensureSmallIntegerWrap(expr, type);\n // fall-through\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n return module.createUnary(UnaryOp.EqzI32, expr);\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createUnary(UnaryOp.EqzI64, expr);\n }\n case TypeKind.USIZE: // TODO: strings?\n case TypeKind.ISIZE: {\n return module.createUnary(type.size == 64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32, expr);\n }\n case TypeKind.F32: {\n return module.createBinary(BinaryOp.EqF32, expr, module.createF32(0));\n }\n case TypeKind.F64: {\n return module.createBinary(BinaryOp.EqF64, expr, module.createF64(0));\n }\n default: {\n assert(false);\n return module.createI32(1);\n }\n }\n }\n\n /** Creates a comparison whether an expression is 'true' in a broader sense. */\n makeIsTrueish(expr: ExpressionRef, type: Type): ExpressionRef {\n var module = this.module;\n switch (type.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = this.ensureSmallIntegerWrap(expr, type);\n // fall-through\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n return expr;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\n }\n case TypeKind.USIZE: // TODO: strings?\n case TypeKind.ISIZE: {\n return type.size == 64\n ? module.createBinary(BinaryOp.NeI64, expr, module.createI64(0))\n : expr;\n }\n case TypeKind.F32: {\n return module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\n }\n case TypeKind.F64: {\n return module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\n }\n default: {\n assert(false);\n return module.createI32(0);\n }\n }\n }\n\n /** Makes an allocation suitable to hold the data of an instance of the given class. */\n makeAllocation(classInstance: Class): ExpressionRef {\n var program = this.program;\n assert(classInstance.program == program);\n var module = this.module;\n var options = this.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!this.compileFunction(allocateInstance)) return module.createUnreachable();\n this.currentType = classInstance.type;\n return module.createCall(\n allocateInstance.internalName, [\n options.isWasm64\n ? module.createI64(classInstance.currentMemoryOffset)\n : module.createI32(classInstance.currentMemoryOffset),\n module.createI32(\n ensureGCHook(this, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance || !this.compileFunction(allocateInstance)) return module.createUnreachable();\n this.currentType = classInstance.type;\n return module.createCall(\n allocateInstance.internalName, [\n options.isWasm64\n ? module.createI64(classInstance.currentMemoryOffset)\n : module.createI32(classInstance.currentMemoryOffset)\n ],\n options.nativeSizeType\n );\n }\n }\n\n /** Makes the initializers for a class's fields. */\n makeFieldInitialization(classInstance: Class, stmts: ExpressionRef[] = []): ExpressionRef[] {\n\n // must not be used in an inline context as it makes assumptions about local indexes\n assert(!this.currentFunction.flow.is(FlowFlags.INLINE_CONTEXT));\n\n if (classInstance.members) {\n let module = this.module;\n let nativeSizeType = this.options.nativeSizeType;\n for (let member of classInstance.members.values()) {\n if (member.parent != classInstance) continue;\n if (member.kind == ElementKind.FIELD) {\n let field = member;\n let fieldType = field.type;\n let nativeFieldType = fieldType.toNativeType();\n let fieldDeclaration = field.prototype.declaration;\n assert(!field.isAny(CommonFlags.CONST));\n if (fieldDeclaration.initializer) { // use initializer\n stmts.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(0, nativeSizeType),\n this.compileExpression( // reports\n fieldDeclaration.initializer,\n fieldType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n ),\n nativeFieldType,\n field.memoryOffset\n ));\n } else {\n // NOTE: if all fields have initializers then this way is best, but if they don't,\n // it would be more efficient to categorically zero memory on allocation.\n let parameterIndex = (field.prototype.declaration).parameterIndex;\n stmts.push(module.createStore(fieldType.byteSize,\n module.createGetLocal(0, nativeSizeType),\n parameterIndex >= 0 // initialized via parameter\n ? module.createGetLocal(1 + parameterIndex, nativeFieldType)\n : fieldType.toNativeZero(module),\n nativeFieldType,\n field.memoryOffset\n ));\n }\n }\n }\n }\n return stmts;\n }\n\n /** Adds the debug location of the specified expression at the specified range to the source map. */\n addDebugLocation(expr: ExpressionRef, range: Range): void {\n var currentFunction = this.currentFunction;\n var source = range.source;\n if (source.debugInfoIndex < 0) source.debugInfoIndex = this.module.addDebugInfoFile(source.normalizedPath);\n range.debugInfoRef = expr;\n currentFunction.debugLocations.push(range);\n }\n}\n\n// helpers\n\nfunction mangleImportName(\n element: Element,\n declaration: DeclarationStatement\n): void {\n // by default, use the file name as the module name\n mangleImportName_moduleName = declaration.range.source.simplePath;\n // and the internal name of the element within that file as the element name\n mangleImportName_elementName = declaration.programLevelInternalName;\n\n if (!element.hasDecorator(DecoratorFlags.EXTERNAL)) return;\n\n var program = element.program;\n var decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\n var args = decorator.arguments;\n if (args && args.length) {\n let arg = args[0];\n // if one argument is given, override just the element name\n // if two arguments are given, override both module and element name\n if (arg.kind == NodeKind.LITERAL && (arg).literalKind == LiteralKind.STRING) {\n mangleImportName_elementName = (arg).value;\n if (args.length >= 2) {\n arg = args[1];\n if (arg.kind == NodeKind.LITERAL && (arg).literalKind == LiteralKind.STRING) {\n mangleImportName_moduleName = mangleImportName_elementName;\n mangleImportName_elementName = (arg).value;\n if (args.length > 2) {\n program.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n decorator.range, \"2\", args.length.toString()\n );\n }\n } else {\n program.error(\n DiagnosticCode.String_literal_expected,\n arg.range\n );\n }\n }\n } else {\n program.error(\n DiagnosticCode.String_literal_expected,\n arg.range\n );\n }\n } else {\n program.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n decorator.range, \"1\", \"0\"\n );\n }\n}\n\nvar mangleImportName_moduleName: string;\nvar mangleImportName_elementName: string;\n","/**\n * Generated from diagnosticsMessages.json. Do not edit.\n * @module diagnostics\n *//***/\n\n/* tslint:disable:max-line-length */\n\n/** Enum of available diagnostic codes. */\nexport enum DiagnosticCode {\n Operation_not_supported = 100,\n Operation_is_unsafe = 101,\n User_defined_0 = 102,\n Conversion_from_type_0_to_1_requires_an_explicit_cast = 200,\n Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit = 201,\n Type_0_cannot_be_changed_to_type_1 = 202,\n Type_0_cannot_be_reinterpreted_as_type_1 = 203,\n Basic_type_0_cannot_be_nullable = 204,\n Cannot_export_a_mutable_global = 205,\n Compiling_constant_with_non_constant_initializer_as_mutable = 206,\n Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa = 207,\n Unmanaged_classes_cannot_implement_interfaces = 208,\n Invalid_regular_expression_flags = 209,\n Implementation_0_must_match_the_signature_1 = 210,\n Class_0_is_sealed_and_cannot_be_extended = 211,\n Decorator_0_is_not_valid_here = 212,\n Duplicate_decorator = 213,\n An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf = 214,\n Optional_parameter_must_have_an_initializer = 215,\n Constructor_of_class_0_must_not_require_any_arguments = 216,\n Function_0_cannot_be_inlined_into_itself = 217,\n Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set = 218,\n Optional_properties_are_not_supported = 219,\n Unterminated_string_literal = 1002,\n Identifier_expected = 1003,\n _0_expected = 1005,\n A_file_cannot_have_a_reference_to_itself = 1006,\n Trailing_comma_not_allowed = 1009,\n Unexpected_token = 1012,\n A_rest_parameter_must_be_last_in_a_parameter_list = 1014,\n Parameter_cannot_have_question_mark_and_initializer = 1015,\n A_required_parameter_cannot_follow_an_optional_parameter = 1016,\n Statements_are_not_allowed_in_ambient_contexts = 1036,\n Initializers_are_not_allowed_in_ambient_contexts = 1039,\n _0_modifier_cannot_be_used_here = 1042,\n A_rest_parameter_cannot_be_optional = 1047,\n A_rest_parameter_cannot_have_an_initializer = 1048,\n A_set_accessor_must_have_exactly_one_parameter = 1049,\n A_set_accessor_parameter_cannot_have_an_initializer = 1052,\n A_get_accessor_cannot_have_parameters = 1054,\n Enum_member_must_have_initializer = 1061,\n Type_parameters_cannot_appear_on_a_constructor_declaration = 1092,\n Type_annotation_cannot_appear_on_a_constructor_declaration = 1093,\n An_accessor_cannot_have_type_parameters = 1094,\n A_set_accessor_cannot_have_a_return_type_annotation = 1095,\n Type_parameter_list_cannot_be_empty = 1098,\n A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement = 1104,\n A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement = 1105,\n A_return_statement_can_only_be_used_within_a_function_body = 1108,\n Expression_expected = 1109,\n Type_expected = 1110,\n A_default_clause_cannot_appear_more_than_once_in_a_switch_statement = 1113,\n Duplicate_label_0 = 1114,\n Octal_literals_are_not_allowed_in_strict_mode = 1121,\n Digit_expected = 1124,\n Hexadecimal_digit_expected = 1125,\n Unexpected_end_of_text = 1126,\n Invalid_character = 1127,\n _case_or_default_expected = 1130,\n _super_must_be_followed_by_an_argument_list_or_member_access = 1034,\n A_declare_modifier_cannot_be_used_in_an_already_ambient_context = 1038,\n Type_argument_expected = 1140,\n String_literal_expected = 1141,\n Line_break_not_permitted_here = 1142,\n Declaration_expected = 1146,\n _const_declarations_must_be_initialized = 1155,\n Unterminated_regular_expression_literal = 1161,\n Interface_declaration_cannot_have_implements_clause = 1176,\n Binary_digit_expected = 1177,\n Octal_digit_expected = 1178,\n An_implementation_cannot_be_declared_in_ambient_contexts = 1183,\n An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive = 1198,\n Unterminated_Unicode_escape_sequence = 1199,\n Decorators_are_not_valid_here = 1206,\n _abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration = 1242,\n Method_0_cannot_have_an_implementation_because_it_is_marked_abstract = 1245,\n A_definite_assignment_assertion_is_not_permitted_in_this_context = 1255,\n A_class_may_only_extend_another_class = 1311,\n A_parameter_property_cannot_be_declared_using_a_rest_parameter = 1317,\n Duplicate_identifier_0 = 2300,\n Cannot_find_name_0 = 2304,\n Module_0_has_no_exported_member_1 = 2305,\n Generic_type_0_requires_1_type_argument_s = 2314,\n Type_0_is_not_generic = 2315,\n Type_0_is_not_assignable_to_type_1 = 2322,\n Index_signature_is_missing_in_type_0 = 2329,\n _this_cannot_be_referenced_in_current_location = 2332,\n _super_can_only_be_referenced_in_a_derived_class = 2335,\n Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors = 2337,\n Property_0_does_not_exist_on_type_1 = 2339,\n Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures = 2349,\n Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature = 2351,\n A_function_whose_declared_type_is_not_void_must_return_a_value = 2355,\n The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access = 2357,\n The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access = 2364,\n Operator_0_cannot_be_applied_to_types_1_and_2 = 2365,\n A_super_call_must_be_the_first_statement_in_the_constructor = 2376,\n Constructors_for_derived_classes_must_contain_a_super_call = 2377,\n _get_and_set_accessor_must_have_the_same_type = 2380,\n Constructor_implementation_is_missing = 2390,\n Function_implementation_is_missing_or_not_immediately_following_the_declaration = 2391,\n Multiple_constructor_implementations_are_not_allowed = 2392,\n Duplicate_function_implementation = 2393,\n Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local = 2395,\n Type_0_has_no_property_1 = 2460,\n The_0_operator_cannot_be_applied_to_type_1 = 2469,\n In_const_enum_declarations_member_initializer_must_be_constant_expression = 2474,\n Export_declaration_conflicts_with_exported_declaration_of_0 = 2484,\n Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property = 2540,\n The_target_of_an_assignment_must_be_a_variable_or_a_property_access = 2541,\n Index_signature_in_type_0_only_permits_reading = 2542,\n Expected_0_arguments_but_got_1 = 2554,\n Expected_at_least_0_arguments_but_got_1 = 2555,\n Expected_0_type_arguments_but_got_1 = 2558,\n A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums = 2651,\n Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration = 2673,\n Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration = 2674,\n Namespace_0_has_no_exported_member_1 = 2694,\n Required_type_parameters_may_not_follow_optional_type_parameters = 2706,\n File_0_not_found = 6054,\n Numeric_separators_are_not_allowed_here = 6188,\n Multiple_consecutive_numeric_separators_are_not_permitted = 6189,\n _super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class = 17009,\n _super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class = 17011\n}\n\n/** Translates a diagnostic code to its respective string. */\nexport function diagnosticCodeToString(code: DiagnosticCode): string {\n switch (code) {\n case 100: return \"Operation not supported.\";\n case 101: return \"Operation is unsafe.\";\n case 102: return \"User-defined: {0}\";\n case 200: return \"Conversion from type '{0}' to '{1}' requires an explicit cast.\";\n case 201: return \"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.\";\n case 202: return \"Type '{0}' cannot be changed to type '{1}'.\";\n case 203: return \"Type '{0}' cannot be reinterpreted as type '{1}'.\";\n case 204: return \"Basic type '{0}' cannot be nullable.\";\n case 205: return \"Cannot export a mutable global.\";\n case 206: return \"Compiling constant with non-constant initializer as mutable.\";\n case 207: return \"Unmanaged classes cannot extend managed classes and vice-versa.\";\n case 208: return \"Unmanaged classes cannot implement interfaces.\";\n case 209: return \"Invalid regular expression flags.\";\n case 210: return \"Implementation '{0}' must match the signature '{1}'.\";\n case 211: return \"Class '{0}' is sealed and cannot be extended.\";\n case 212: return \"Decorator '{0}' is not valid here.\";\n case 213: return \"Duplicate decorator.\";\n case 214: return \"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.\";\n case 215: return \"Optional parameter must have an initializer.\";\n case 216: return \"Constructor of class '{0}' must not require any arguments.\";\n case 217: return \"Function '{0}' cannot be inlined into itself.\";\n case 218: return \"Cannot access method '{0}' without calling it as it requires 'this' to be set.\";\n case 219: return \"Optional properties are not supported.\";\n case 1002: return \"Unterminated string literal.\";\n case 1003: return \"Identifier expected.\";\n case 1005: return \"'{0}' expected.\";\n case 1006: return \"A file cannot have a reference to itself.\";\n case 1009: return \"Trailing comma not allowed.\";\n case 1012: return \"Unexpected token.\";\n case 1014: return \"A rest parameter must be last in a parameter list.\";\n case 1015: return \"Parameter cannot have question mark and initializer.\";\n case 1016: return \"A required parameter cannot follow an optional parameter.\";\n case 1036: return \"Statements are not allowed in ambient contexts.\";\n case 1039: return \"Initializers are not allowed in ambient contexts.\";\n case 1042: return \"'{0}' modifier cannot be used here.\";\n case 1047: return \"A rest parameter cannot be optional.\";\n case 1048: return \"A rest parameter cannot have an initializer.\";\n case 1049: return \"A 'set' accessor must have exactly one parameter.\";\n case 1052: return \"A 'set' accessor parameter cannot have an initializer.\";\n case 1054: return \"A 'get' accessor cannot have parameters.\";\n case 1061: return \"Enum member must have initializer.\";\n case 1092: return \"Type parameters cannot appear on a constructor declaration.\";\n case 1093: return \"Type annotation cannot appear on a constructor declaration.\";\n case 1094: return \"An accessor cannot have type parameters.\";\n case 1095: return \"A 'set' accessor cannot have a return type annotation.\";\n case 1098: return \"Type parameter list cannot be empty.\";\n case 1104: return \"A 'continue' statement can only be used within an enclosing iteration statement.\";\n case 1105: return \"A 'break' statement can only be used within an enclosing iteration or switch statement.\";\n case 1108: return \"A 'return' statement can only be used within a function body.\";\n case 1109: return \"Expression expected.\";\n case 1110: return \"Type expected.\";\n case 1113: return \"A 'default' clause cannot appear more than once in a 'switch' statement.\";\n case 1114: return \"Duplicate label '{0}'.\";\n case 1121: return \"Octal literals are not allowed in strict mode.\";\n case 1124: return \"Digit expected.\";\n case 1125: return \"Hexadecimal digit expected.\";\n case 1126: return \"Unexpected end of text.\";\n case 1127: return \"Invalid character.\";\n case 1130: return \"'case' or 'default' expected.\";\n case 1034: return \"'super' must be followed by an argument list or member access.\";\n case 1038: return \"A 'declare' modifier cannot be used in an already ambient context.\";\n case 1140: return \"Type argument expected.\";\n case 1141: return \"String literal expected.\";\n case 1142: return \"Line break not permitted here.\";\n case 1146: return \"Declaration expected.\";\n case 1155: return \"'const' declarations must be initialized.\";\n case 1161: return \"Unterminated regular expression literal.\";\n case 1176: return \"Interface declaration cannot have 'implements' clause.\";\n case 1177: return \"Binary digit expected.\";\n case 1178: return \"Octal digit expected.\";\n case 1183: return \"An implementation cannot be declared in ambient contexts.\";\n case 1198: return \"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.\";\n case 1199: return \"Unterminated Unicode escape sequence.\";\n case 1206: return \"Decorators are not valid here.\";\n case 1242: return \"'abstract' modifier can only appear on a class, method, or property declaration.\";\n case 1245: return \"Method '{0}' cannot have an implementation because it is marked abstract.\";\n case 1255: return \"A definite assignment assertion '!' is not permitted in this context.\";\n case 1311: return \"A class may only extend another class.\";\n case 1317: return \"A parameter property cannot be declared using a rest parameter.\";\n case 2300: return \"Duplicate identifier '{0}'.\";\n case 2304: return \"Cannot find name '{0}'.\";\n case 2305: return \"Module '{0}' has no exported member '{1}'.\";\n case 2314: return \"Generic type '{0}' requires {1} type argument(s).\";\n case 2315: return \"Type '{0}' is not generic.\";\n case 2322: return \"Type '{0}' is not assignable to type '{1}'.\";\n case 2329: return \"Index signature is missing in type '{0}'.\";\n case 2332: return \"'this' cannot be referenced in current location.\";\n case 2335: return \"'super' can only be referenced in a derived class.\";\n case 2337: return \"Super calls are not permitted outside constructors or in nested functions inside constructors.\";\n case 2339: return \"Property '{0}' does not exist on type '{1}'.\";\n case 2349: return \"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.\";\n case 2351: return \"Cannot use 'new' with an expression whose type lacks a construct signature.\";\n case 2355: return \"A function whose declared type is not 'void' must return a value.\";\n case 2357: return \"The operand of an increment or decrement operator must be a variable or a property access.\";\n case 2364: return \"The left-hand side of an assignment expression must be a variable or a property access.\";\n case 2365: return \"Operator '{0}' cannot be applied to types '{1}' and '{2}'.\";\n case 2376: return \"A 'super' call must be the first statement in the constructor.\";\n case 2377: return \"Constructors for derived classes must contain a 'super' call.\";\n case 2380: return \"'get' and 'set' accessor must have the same type.\";\n case 2390: return \"Constructor implementation is missing.\";\n case 2391: return \"Function implementation is missing or not immediately following the declaration.\";\n case 2392: return \"Multiple constructor implementations are not allowed.\";\n case 2393: return \"Duplicate function implementation.\";\n case 2395: return \"Individual declarations in merged declaration '{0}' must be all exported or all local.\";\n case 2460: return \"Type '{0}' has no property '{1}'.\";\n case 2469: return \"The '{0}' operator cannot be applied to type '{1}'.\";\n case 2474: return \"In 'const' enum declarations member initializer must be constant expression.\";\n case 2484: return \"Export declaration conflicts with exported declaration of '{0}'.\";\n case 2540: return \"Cannot assign to '{0}' because it is a constant or a read-only property.\";\n case 2541: return \"The target of an assignment must be a variable or a property access.\";\n case 2542: return \"Index signature in type '{0}' only permits reading.\";\n case 2554: return \"Expected {0} arguments, but got {1}.\";\n case 2555: return \"Expected at least {0} arguments, but got {1}.\";\n case 2558: return \"Expected {0} type arguments, but got {1}.\";\n case 2651: return \"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.\";\n case 2673: return \"Constructor of class '{0}' is private and only accessible within the class declaration.\";\n case 2674: return \"Constructor of class '{0}' is protected and only accessible within the class declaration.\";\n case 2694: return \"Namespace '{0}' has no exported member '{1}'.\";\n case 2706: return \"Required type parameters may not follow optional type parameters.\";\n case 6054: return \"File '{0}' not found.\";\n case 6188: return \"Numeric separators are not allowed here.\";\n case 6189: return \"Multiple consecutive numeric separators are not permitted.\";\n case 17009: return \"'super' must be called before accessing 'this' in the constructor of a derived class.\";\n case 17011: return \"'super' must be called before accessing a property of 'super' in the constructor of a derived class.\";\n default: return \"\";\n }\n}\n","/**\n * Resolve infrastructure to obtain types and elements.\n * @module resolver\n *//***/\n\nimport {\n DiagnosticEmitter,\n DiagnosticCode\n} from \"./diagnostics\";\n\nimport {\n Program,\n ElementKind,\n OperatorKind,\n FlowFlags,\n\n Element,\n Class,\n ClassPrototype,\n Function,\n FunctionTarget,\n FunctionPrototype,\n VariableLikeElement,\n Property,\n DecoratorFlags,\n FieldPrototype,\n Field,\n Global\n} from \"./program\";\n\nimport {\n SignatureNode,\n ParameterKind,\n CommonTypeNode,\n NodeKind,\n TypeNode,\n TypeParameterNode,\n Node,\n Range,\n IdentifierExpression,\n CallExpression,\n ElementAccessExpression,\n PropertyAccessExpression,\n LiteralExpression,\n LiteralKind,\n ParenthesizedExpression,\n AssertionExpression,\n Expression,\n IntegerLiteralExpression,\n UnaryPrefixExpression,\n UnaryPostfixExpression,\n AssertionKind\n} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind,\n TypeFlags\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\n\nimport {\n Token\n} from \"./tokenizer\";\n\n/** Indicates whether errors are reported or not. */\nexport enum ReportMode {\n /** Report errors. */\n REPORT,\n /** Swallow errors. */\n SWALLOW\n}\n\n/** Provides tools to resolve types and expressions. */\nexport class Resolver extends DiagnosticEmitter {\n\n /** The program this resolver belongs to. */\n program: Program;\n\n /** Target expression of the previously resolved property or element access. */\n currentThisExpression: Expression | null = null;\n /** Element expression of the previously resolved element access. */\n currentElementExpression : Expression | null = null;\n\n /** Constructs the resolver for the specified program. */\n constructor(program: Program) {\n super(program.diagnostics);\n this.program = program;\n }\n\n /** Resolves a {@link CommonTypeNode} to a concrete {@link Type}. */\n resolveType(\n node: CommonTypeNode,\n contextualTypeArguments: Map | null = null,\n reportMode = ReportMode.REPORT\n ): Type | null {\n\n // handle signatures specifically\n if (node.kind == NodeKind.SIGNATURE) {\n let signature = this.resolveSignature(node, contextualTypeArguments, reportMode);\n if (!signature) return null;\n return node.isNullable ? signature.type.asNullable() : signature.type;\n }\n\n // now dealing with TypeNode\n assert(node.kind == NodeKind.TYPE);\n var typeNode = node;\n var simpleName = typeNode.name.text;\n var globalName = simpleName;\n var localName = typeNode.range.source.internalPath + PATH_DELIMITER + simpleName; // TODO cache\n\n // check file-global / program-global enum or class\n {\n let elementsLookup = this.program.elementsLookup;\n let element: Element | null;\n if (\n (element = elementsLookup.get(localName)) || // file-global\n (element = elementsLookup.get(globalName)) // program-global\n ) {\n switch (element.kind) {\n case ElementKind.ENUM: {\n if (typeNode.typeArguments !== null && typeNode.typeArguments.length) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n node.range, element.internalName\n );\n }\n return null;\n }\n return Type.i32;\n }\n case ElementKind.CLASS_PROTOTYPE: {\n let instance = this.resolveClassInclTypeArguments(\n element,\n typeNode.typeArguments,\n makeMap(contextualTypeArguments),\n node\n ); // reports\n if (!instance) return null;\n return node.isNullable ? instance.type.asNullable() : instance.type;\n }\n }\n }\n }\n\n // check (global) type alias\n {\n let alias = this.program.typeAliases.get(simpleName);\n if (alias) return this.resolveType(alias.type, contextualTypeArguments, reportMode);\n }\n\n // resolve parameters\n var typeArgumentNodes = typeNode.typeArguments;\n var typeArguments: Type[] | null = null;\n if (typeArgumentNodes) {\n let numTypeArguments = typeArgumentNodes.length;\n typeArguments = new Array(numTypeArguments);\n for (let i = 0; i < numTypeArguments; ++i) {\n let paramType = this.resolveType( // reports\n typeArgumentNodes[i],\n contextualTypeArguments,\n reportMode\n );\n if (!paramType) return null;\n typeArguments[i] = paramType;\n }\n if (numTypeArguments) { // can't be a placeholder if it has parameters\n let instanceKey = typesToString(typeArguments);\n if (instanceKey.length) {\n localName += \"<\" + instanceKey + \">\";\n globalName += \"<\" + instanceKey + \">\";\n }\n } else if (contextualTypeArguments) {\n let placeholderType = contextualTypeArguments.get(globalName);\n if (placeholderType) return placeholderType;\n }\n }\n\n // check file-global / program-global type\n {\n let typesLookup = this.program.typesLookup;\n let type: Type | null;\n if (\n (type = typesLookup.get(localName)) ||\n (type = typesLookup.get(globalName))\n ) {\n if (!type.is(TypeFlags.REFERENCE) && node.isNullable) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Basic_type_0_cannot_be_nullable,\n node.range, type.toString()\n );\n }\n }\n return type;\n }\n }\n\n // check built-in macro types\n if (simpleName == \"NATIVE\") {\n if (!(typeArguments && typeArguments.length == 1)) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n typeNode.range, \"1\", (typeArgumentNodes ? typeArgumentNodes.length : 1).toString(10)\n );\n }\n return null;\n }\n switch (typeArguments[0].kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: return Type.i32;\n case TypeKind.ISIZE: if (!this.program.options.isWasm64) return Type.i32;\n case TypeKind.I64: return Type.i64;\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: return Type.u32;\n case TypeKind.USIZE: if (!this.program.options.isWasm64) return Type.u32;\n case TypeKind.U64: return Type.u64;\n case TypeKind.F32: return Type.f32;\n case TypeKind.F64: return Type.f64;\n case TypeKind.VOID: return Type.void;\n default: assert(false);\n }\n }\n\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n typeNode.name.range, globalName\n );\n }\n return null;\n }\n\n /** Resolves a {@link SignatureNode} to a concrete {@link Signature}. */\n resolveSignature(\n node: SignatureNode,\n contextualTypeArguments: Map | null = null,\n reportMode: ReportMode = ReportMode.REPORT\n ): Signature | null {\n var explicitThisType = node.explicitThisType;\n var thisType: Type | null = null;\n if (explicitThisType) {\n thisType = this.resolveType(explicitThisType, contextualTypeArguments, reportMode);\n if (!thisType) return null;\n }\n var parameterTypeNodes = node.parameters;\n var numParameters = parameterTypeNodes.length;\n var parameterTypes = new Array(numParameters);\n var parameterNames = new Array(numParameters);\n var requiredParameters = 0;\n var hasRest = false;\n for (let i = 0; i < numParameters; ++i) {\n let parameterTypeNode = parameterTypeNodes[i];\n switch (parameterTypeNode.parameterKind) {\n case ParameterKind.DEFAULT: {\n requiredParameters = i + 1;\n break;\n }\n case ParameterKind.REST: {\n assert(i == numParameters);\n hasRest = true;\n break;\n }\n }\n let parameterType = this.resolveType(\n assert(parameterTypeNode.type),\n contextualTypeArguments,\n reportMode\n );\n if (!parameterType) return null;\n parameterTypes[i] = parameterType;\n parameterNames[i] = parameterTypeNode.name.text;\n }\n var returnTypeNode = node.returnType;\n var returnType: Type | null;\n if (returnTypeNode) {\n returnType = this.resolveType(returnTypeNode, contextualTypeArguments, reportMode);\n if (!returnType) return null;\n } else {\n returnType = Type.void;\n }\n var signature = new Signature(parameterTypes, returnType, thisType);\n signature.parameterNames = parameterNames;\n signature.requiredParameters = requiredParameters;\n signature.hasRest = hasRest;\n return signature;\n }\n\n /** Resolves an array of type arguments to concrete types. */\n resolveTypeArguments(\n typeParameters: TypeParameterNode[],\n typeArgumentNodes: CommonTypeNode[] | null,\n contextualTypeArguments: Map,\n alternativeReportNode: Node | null = null,\n reportMode: ReportMode = ReportMode.REPORT\n ): Type[] | null {\n var minParameterCount = 0;\n var maxParameterCount = 0;\n for (let i = 0; i < typeParameters.length; ++i) {\n if (!typeParameters[i].defaultType) ++minParameterCount;\n ++maxParameterCount;\n }\n var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;\n if (argumentCount < minParameterCount || argumentCount > maxParameterCount) {\n this.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n argumentCount\n ? Range.join(\n (typeArgumentNodes)[0].range,\n (typeArgumentNodes)[argumentCount - 1].range\n )\n : assert(alternativeReportNode).range.atEnd,\n (argumentCount < minParameterCount ? minParameterCount : maxParameterCount).toString(10),\n argumentCount.toString(10)\n );\n return null;\n }\n var typeArguments = new Array(maxParameterCount);\n for (let i = 0; i < maxParameterCount; ++i) {\n let type = i < argumentCount\n ? this.resolveType( // reports\n (typeArgumentNodes)[i],\n contextualTypeArguments,\n reportMode\n )\n : this.resolveType( // reports\n assert(typeParameters[i].defaultType),\n contextualTypeArguments,\n reportMode\n );\n if (!type) return null;\n // TODO: check extendsType\n contextualTypeArguments.set(typeParameters[i].name.text, type);\n typeArguments[i] = type;\n }\n return typeArguments;\n }\n\n /** Resolves an identifier to the element it refers to. */\n resolveIdentifier(\n identifier: IdentifierExpression,\n context: Element | null,\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var name = identifier.text;\n var element: Element | null;\n\n if (context) {\n\n switch (context.kind) {\n case ElementKind.FUNCTION: { // search locals, use prototype\n element = (context).flow.getScopedLocal(name);\n if (element) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element;\n }\n context = (context).prototype.parent;\n break;\n }\n case ElementKind.CLASS: { // use prototype\n context = (context).prototype.parent;\n break;\n }\n }\n\n // search context\n while (context) {\n let members = context.members;\n if (members) {\n if (element = members.get(name)) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element;\n }\n }\n context = context.parent;\n }\n }\n\n // search current file\n var elementsLookup = this.program.elementsLookup;\n if (element = elementsLookup.get(identifier.range.source.internalPath + PATH_DELIMITER + name)) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE\n }\n\n // search global scope\n if (element = elementsLookup.get(name)) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE\n }\n\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n identifier.range, name\n );\n }\n return null;\n }\n\n /** Resolves a lazily compiled global, i.e. a static class field. */\n ensureResolvedLazyGlobal(global: Global, reportMode: ReportMode = ReportMode.REPORT): bool {\n if (global.is(CommonFlags.RESOLVED)) return true;\n var resolveType = assert(global.declaration).type;\n if (!resolveType) return false;\n var resolvedType = this.resolveType(resolveType, null, reportMode);\n if (!resolvedType) return false;\n global.type = resolvedType;\n global.set(CommonFlags.RESOLVED);\n return true;\n }\n\n /** Resolves a property access to the element it refers to. */\n resolvePropertyAccess(\n propertyAccess: PropertyAccessExpression,\n contextualFunction: Function,\n contextualType: Type,\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n // start by resolving the lhs target (expression before the last dot)\n var targetExpression = propertyAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, contextualType, reportMode); // reports\n if (!target) return null;\n\n // at this point we know exactly what the target is, so look up the element within\n var propertyName = propertyAccess.property.text;\n\n // Resolve variable-likes to the class type they reference first\n switch (target.kind) {\n case ElementKind.GLOBAL: if (!this.ensureResolvedLazyGlobal(target, reportMode)) return null;\n case ElementKind.LOCAL:\n case ElementKind.FIELD: {\n let type = (target).type;\n assert(type != Type.void);\n let classReference = type.classReference;\n if (!classReference) {\n let basicClasses = this.program.basicClasses;\n if (!type.is(TypeFlags.REFERENCE) && basicClasses.has(type.kind)) {\n classReference = assert(basicClasses.get(type.kind));\n } else {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, (target).type.toString()\n );\n return null;\n }\n }\n target = classReference;\n break;\n }\n case ElementKind.PROPERTY: {\n let getter = this.resolveFunction(\n assert((target).getterPrototype),\n null,\n makeMap(),\n reportMode\n );\n if (!getter) return null;\n let classReference = getter.signature.returnType.classReference;\n if (!classReference) {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, getter.signature.returnType.toString()\n );\n return null;\n }\n target = classReference;\n break;\n }\n case ElementKind.CLASS: {\n let elementExpression = this.currentElementExpression;\n if (elementExpression) {\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET);\n if (!indexedGet) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n elementExpression.range, (target).internalName\n );\n return null;\n }\n let returnType = indexedGet.signature.returnType;\n if (!(target = returnType.classReference)) {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, returnType.toString()\n );\n return null;\n }\n }\n break;\n }\n }\n\n // Look up the member within\n switch (target.kind) {\n case ElementKind.CLASS_PROTOTYPE:\n case ElementKind.CLASS: {\n do {\n let members = target.members;\n let member: Element | null;\n if (members && (member = members.get(propertyName))) {\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = null;\n return member; // instance FIELD, static GLOBAL, FUNCTION_PROTOTYPE...\n }\n // traverse inherited static members on the base prototype if target is a class prototype\n if (target.kind == ElementKind.CLASS_PROTOTYPE) {\n if ((target).basePrototype) {\n target = (target).basePrototype;\n } else {\n break;\n }\n // traverse inherited instance members on the base class if target is a class instance\n } else if (target.kind == ElementKind.CLASS) {\n if ((target).base) {\n target = (target).base;\n } else {\n break;\n }\n } else {\n break;\n }\n } while (true);\n break;\n }\n default: { // enums or other namespace-like elements\n let members = target.members;\n if (members) {\n let member = members.get(propertyName);\n if (member) {\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = null;\n return member; // static ENUMVALUE, static GLOBAL, static FUNCTION_PROTOTYPE...\n }\n }\n break;\n }\n }\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, target.internalName\n );\n return null;\n }\n\n resolveElementAccess(\n elementAccess: ElementAccessExpression,\n contextualFunction: Function,\n contextualType: Type,\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, contextualFunction, contextualType, reportMode);\n if (!target) return null;\n switch (target.kind) {\n case ElementKind.GLOBAL: if (!this.ensureResolvedLazyGlobal(target, reportMode)) return null;\n case ElementKind.LOCAL:\n case ElementKind.FIELD: {\n let type = (target).type;\n if (target = type.classReference) {\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = elementAccess.elementExpression;\n return target;\n }\n break;\n }\n case ElementKind.CLASS: {\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET);\n if (!indexedGet) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n elementAccess.range, (target).internalName\n );\n }\n return null;\n }\n if (targetExpression.kind == NodeKind.ELEMENTACCESS) { // nested element access\n let returnType = indexedGet.signature.returnType;\n if (target = returnType.classReference) {\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = elementAccess.elementExpression;\n return target;\n }\n return null;\n }\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = elementAccess.elementExpression;\n return target;\n }\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n targetExpression.range\n );\n }\n return null;\n }\n\n determineIntegerLiteralType(\n intValue: I64,\n contextualType: Type\n ): Type {\n\n if (!contextualType.is(TypeFlags.REFERENCE)) {\n // compile to contextualType if matching\n switch (contextualType.kind) {\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return Type.i8;\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return Type.u8;\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return Type.i16;\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return Type.u16;\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return Type.i32;\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return Type.u32;\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return Type.bool;\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.program.options.isWasm64) {\n if (i64_is_i32(intValue)) return Type.isize32;\n break;\n }\n return Type.isize64;\n }\n case TypeKind.USIZE: {\n if (!this.program.options.isWasm64) {\n if (i64_is_u32(intValue)) return Type.usize32;\n break;\n }\n return Type.usize64;\n }\n case TypeKind.I64: return Type.i64;\n case TypeKind.U64: return Type.u64;\n case TypeKind.F32: return Type.f32;\n case TypeKind.F64: return Type.f64;\n case TypeKind.VOID: break; // best fitting below\n default: assert(false);\n }\n }\n\n // otherwise compile to best fitting native type\n if (i64_is_i32(intValue)) return Type.i32;\n if (i64_is_u32(intValue)) return Type.u32;\n return Type.i64;\n }\n\n resolveExpression(\n expression: Expression,\n contextualFunction: Function,\n contextualType: Type = Type.void,\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n while (expression.kind == NodeKind.PARENTHESIZED) {\n expression = (expression).expression;\n }\n switch (expression.kind) {\n case NodeKind.ASSERTION: {\n if ((expression).assertionKind == AssertionKind.NONNULL) {\n return this.resolveExpression(\n (expression).expression,\n contextualFunction,\n contextualType,\n reportMode\n );\n }\n let type = this.resolveType(\n assert((expression).toType),\n contextualFunction.flow.contextualTypeArguments,\n reportMode\n );\n if (!type) return null;\n let element: Element | null = type.classReference;\n if (!element) {\n let signature = type.signatureReference;\n if (!signature) return null;\n element = signature.asFunctionTarget(this.program);\n }\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element;\n }\n case NodeKind.UNARYPREFIX: {\n // TODO: overloads\n switch ((expression).operator) {\n case Token.MINUS: {\n let operand = (expression).operand;\n // implicitly negate if an integer literal to distinguish between i32/u32/i64\n if (operand.kind == NodeKind.LITERAL && (operand).literalKind == LiteralKind.INTEGER) {\n let type = this.determineIntegerLiteralType(\n i64_sub(i64_zero, (operand).value),\n contextualType\n );\n return assert(this.program.basicClasses.get(type.kind));\n }\n return this.resolveExpression(\n operand,\n contextualFunction,\n contextualType,\n reportMode\n );\n }\n case Token.PLUS:\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS: {\n return this.resolveExpression(\n (expression).operand,\n contextualFunction,\n contextualType,\n reportMode\n );\n }\n case Token.EXCLAMATION: {\n return assert(this.program.basicClasses.get(TypeKind.BOOL));\n }\n case Token.TILDE: {\n let resolvedOperand = this.resolveExpression(\n (expression).operand,\n contextualFunction,\n contextualType,\n reportMode\n );\n if (!resolvedOperand) return null;\n throw new Error(\"not implemented\"); // TODO: should all elements have a corresponding type right away?\n }\n default: assert(false);\n }\n return null;\n }\n case NodeKind.UNARYPOSTFIX: {\n // TODO: overloads\n switch ((expression).operator) {\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS: {\n return this.resolveExpression(\n (expression).operand,\n contextualFunction,\n contextualType,\n reportMode\n );\n }\n default: assert(false);\n }\n return null;\n }\n case NodeKind.BINARY: {\n // TODO: all sorts of unary and binary expressions, which means looking up overloads and\n // evaluating their return types, knowing the semantics of different operators etc.\n // should probably share that code with the compiler somehow, as it also does exactly this.\n throw new Error(\"not implemented\");\n }\n case NodeKind.THIS: { // -> Class / ClassPrototype\n if (contextualFunction.flow.is(FlowFlags.INLINE_CONTEXT)) {\n let explicitLocal = contextualFunction.flow.getScopedLocal(\"this\");\n if (explicitLocal) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return explicitLocal;\n }\n }\n let parent = contextualFunction.parent;\n if (parent) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return parent;\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\n expression.range\n );\n }\n return null;\n }\n case NodeKind.SUPER: { // -> Class\n if (contextualFunction.flow.is(FlowFlags.INLINE_CONTEXT)) {\n let explicitLocal = contextualFunction.flow.getScopedLocal(\"super\");\n if (explicitLocal) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return explicitLocal;\n }\n }\n let parent = contextualFunction.parent;\n if (parent && parent.kind == ElementKind.CLASS && (parent = (parent).base)) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return parent;\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\n expression.range\n );\n }\n return null;\n }\n case NodeKind.IDENTIFIER: {\n return this.resolveIdentifier(expression, contextualFunction, reportMode);\n }\n case NodeKind.LITERAL: {\n switch ((expression).literalKind) {\n case LiteralKind.INTEGER: {\n return assert(\n this.program.basicClasses.get(\n this.determineIntegerLiteralType(\n (expression).value,\n contextualType\n ).kind\n )\n );\n }\n case LiteralKind.FLOAT: {\n this.currentThisExpression = expression;\n this.currentElementExpression = null;\n return assert(\n this.program.basicClasses.get(\n contextualType == Type.f32\n ? TypeKind.F32\n : TypeKind.F64\n )\n );\n }\n case LiteralKind.STRING: {\n this.currentThisExpression = expression;\n this.currentElementExpression = null;\n return this.program.stringInstance;\n }\n // case LiteralKind.ARRAY: // TODO\n }\n break;\n }\n case NodeKind.PROPERTYACCESS: {\n return this.resolvePropertyAccess(\n expression,\n contextualFunction,\n contextualType,\n reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n contextualFunction,\n contextualType,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, contextualFunction, contextualType, reportMode);\n if (!target) return null;\n if (target.kind == ElementKind.FUNCTION_PROTOTYPE) {\n let instance = this.resolveFunctionInclTypeArguments(\n target,\n (expression).typeArguments,\n makeMap(contextualFunction.flow.contextualTypeArguments),\n expression,\n reportMode\n );\n if (!instance) return null;\n let returnType = instance.signature.returnType;\n let classType = returnType.classReference;\n if (classType) {\n // reuse resolvedThisExpression (might be property access)\n // reuse resolvedElementExpression (might be element access)\n return classType;\n } else {\n let signature = returnType.signatureReference;\n if (signature) {\n let functionTarget = signature.asFunctionTarget(this.program);\n // reuse resolvedThisExpression (might be property access)\n // reuse resolvedElementExpression (might be element access)\n return functionTarget;\n }\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n targetExpression.range, target.internalName\n );\n }\n return null;\n }\n break;\n }\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n }\n return null;\n }\n\n /** Resolves a function prototype to an instance using the specified concrete type arguments. */\n resolveFunction(\n prototype: FunctionPrototype,\n typeArguments: Type[] | null,\n contextualTypeArguments: Map = makeMap(),\n reportMode: ReportMode = ReportMode.REPORT\n ): Function | null {\n var classTypeArguments = prototype.classTypeArguments; // set only if partially resolved\n var classInstanceKey = classTypeArguments ? typesToString(classTypeArguments) : \"\";\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\n var classInstances = prototype.instances.get(classInstanceKey);\n if (classInstances) {\n let instance = classInstances.get(instanceKey);\n if (instance) return instance;\n }\n\n var declaration = prototype.declaration;\n var isInstance = prototype.is(CommonFlags.INSTANCE);\n var classPrototype = prototype.classPrototype;\n\n // apply class type arguments if a partially resolved instance method\n if (classTypeArguments) prototype.applyClassTypeArguments(contextualTypeArguments);\n\n // override with function specific type arguments\n var signatureNode = declaration.signature;\n var functionTypeParameters = declaration.typeParameters;\n var numFunctionTypeArguments: i32;\n if (typeArguments && (numFunctionTypeArguments = typeArguments.length)) {\n assert(functionTypeParameters && numFunctionTypeArguments == functionTypeParameters.length);\n for (let i = 0; i < numFunctionTypeArguments; ++i) {\n contextualTypeArguments.set(\n (functionTypeParameters)[i].name.text,\n typeArguments[i]\n );\n }\n } else {\n assert(!functionTypeParameters || functionTypeParameters.length == 0);\n }\n\n // resolve class if an instance method\n var classInstance: Class | null = null;\n var thisType: Type | null = null;\n if (isInstance) {\n classInstance = this.resolveClass(\n assert(classPrototype),\n classTypeArguments,\n contextualTypeArguments,\n reportMode\n );\n if (!classInstance) return null;\n let explicitThisType = signatureNode.explicitThisType;\n if (explicitThisType) {\n thisType = this.resolveType(explicitThisType, contextualTypeArguments, reportMode);\n if (!thisType) return null;\n } else {\n thisType = classInstance.type;\n }\n contextualTypeArguments.set(\"this\", thisType);\n } else {\n if (signatureNode.explicitThisType) {\n this.error(\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\n signatureNode.explicitThisType.range\n ); // recoverable\n }\n }\n\n // resolve signature node\n var signatureParameters = signatureNode.parameters;\n var signatureParameterCount = signatureParameters.length;\n var parameterTypes = new Array(signatureParameterCount);\n var parameterNames = new Array(signatureParameterCount);\n var requiredParameters = 0;\n for (let i = 0; i < signatureParameterCount; ++i) {\n let parameterDeclaration = signatureParameters[i];\n if (parameterDeclaration.parameterKind == ParameterKind.DEFAULT) {\n requiredParameters = i + 1;\n }\n let typeNode = assert(parameterDeclaration.type);\n let parameterType = this.resolveType(typeNode, contextualTypeArguments, reportMode);\n if (!parameterType) return null;\n parameterTypes[i] = parameterType;\n parameterNames[i] = parameterDeclaration.name.text;\n }\n\n var returnType: Type;\n if (prototype.is(CommonFlags.SET)) {\n returnType = Type.void; // not annotated\n } else if (prototype.is(CommonFlags.CONSTRUCTOR)) {\n returnType = assert(classInstance).type; // not annotated\n } else {\n let typeNode = assert(signatureNode.returnType);\n let type = this.resolveType(typeNode, contextualTypeArguments, reportMode);\n if (!type) return null;\n returnType = type;\n }\n\n var signature = new Signature(parameterTypes, returnType, thisType);\n signature.parameterNames = parameterNames;\n signature.requiredParameters = requiredParameters;\n\n var internalName = prototype.internalName;\n if (instanceKey.length) internalName += \"<\" + instanceKey + \">\";\n var instance = new Function(\n prototype,\n internalName,\n signature,\n classInstance\n ? classInstance\n : classPrototype,\n contextualTypeArguments\n );\n if (!classInstances) prototype.instances.set(classInstanceKey, classInstances = new Map());\n classInstances.set(instanceKey, instance);\n this.program.instancesLookup.set(internalName, instance);\n return instance;\n }\n\n /** Resolves a function prototype partially by applying the specified type arguments. */\n resolveFunctionPartially(\n prototype: FunctionPrototype,\n typeArguments: Type[] | null,\n reportMode: ReportMode = ReportMode.REPORT\n ): FunctionPrototype | null {\n assert(prototype.is(CommonFlags.INSTANCE));\n var classPrototype = assert(prototype.classPrototype);\n\n if (!(typeArguments && typeArguments.length)) return prototype; // no need to clone\n\n var simpleName = prototype.simpleName;\n var partialKey = typesToString(typeArguments);\n var partialPrototype = new FunctionPrototype(\n this.program,\n simpleName,\n classPrototype.internalName + \"<\" + partialKey + \">\" + INSTANCE_DELIMITER + simpleName,\n prototype.declaration,\n classPrototype,\n prototype.decoratorFlags\n );\n partialPrototype.flags = prototype.flags;\n partialPrototype.operatorKind = prototype.operatorKind;\n partialPrototype.classTypeArguments = typeArguments;\n partialPrototype.instances = prototype.instances;\n return partialPrototype;\n }\n\n /** Resolves a function prototype to an instance by first resolving the specified type arguments. */\n resolveFunctionInclTypeArguments(\n prototype: FunctionPrototype,\n typeArgumentNodes: CommonTypeNode[] | null,\n contextualTypeArguments: Map,\n reportNode: Node,\n reportMode: ReportMode = ReportMode.REPORT\n ): Function | null {\n var resolvedTypeArguments: Type[] | null = null;\n\n // Resolve type arguments if generic\n if (prototype.is(CommonFlags.GENERIC)) {\n\n // apply class type arguments if a partially resolved instance method\n // FIXME: this is done once more in resolveFunction. required here for resolveTypeArguments,\n // required there for just resolving a function no matter if a partial or not.\n let classTypeArguments = prototype.classTypeArguments;\n if (classTypeArguments) prototype.applyClassTypeArguments(contextualTypeArguments);\n\n resolvedTypeArguments = this.resolveTypeArguments( // reports\n assert(prototype.declaration.typeParameters),\n typeArgumentNodes,\n contextualTypeArguments,\n reportNode,\n reportMode\n );\n if (!resolvedTypeArguments) return null;\n\n // Otherwise make sure that no type arguments have been specified\n } else {\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return null;\n }\n }\n\n // Continue with concrete types\n return this.resolveFunction(\n prototype,\n resolvedTypeArguments,\n contextualTypeArguments,\n reportMode\n );\n }\n\n /** Resolves a class prototype using the specified concrete type arguments. */\n resolveClass(\n prototype: ClassPrototype,\n typeArguments: Type[] | null,\n contextualTypeArguments: Map = makeMap(),\n reportMode: ReportMode = ReportMode.REPORT\n ): Class | null {\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\n\n // Check if this exact instance has already been resolved\n var instance = prototype.instances.get(instanceKey);\n if (instance) return instance;\n\n // Insert contextual type arguments for this operation. Internally, this method is always\n // called with matching type parameter / argument counts.\n var declaration = prototype.declaration;\n if (typeArguments) {\n let typeParameters = declaration.typeParameters;\n let expectedTypeArguments = typeParameters.length;\n let actualTypeArguments = typeArguments.length;\n assert(actualTypeArguments == expectedTypeArguments);\n for (let i = 0; i < actualTypeArguments; ++i) {\n contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\n }\n } else {\n assert(declaration.typeParameters.length == 0);\n }\n\n // Resolve base class if applicable\n var baseClass: Class | null = null;\n if (declaration.extendsType) {\n let baseClassType = this.resolveType(\n declaration.extendsType,\n contextualTypeArguments,\n reportMode\n );\n if (!baseClassType) return null;\n if (!(baseClass = baseClassType.classReference)) {\n if (reportMode == ReportMode.REPORT) {\n this.program.error(\n DiagnosticCode.A_class_may_only_extend_another_class,\n declaration.extendsType.range\n );\n }\n return null;\n }\n if (baseClass.hasDecorator(DecoratorFlags.SEALED)) {\n if (reportMode == ReportMode.REPORT) {\n this.program.error(\n DiagnosticCode.Class_0_is_sealed_and_cannot_be_extended,\n declaration.extendsType.range, baseClass.internalName\n );\n }\n return null;\n }\n if (baseClass.hasDecorator(DecoratorFlags.UNMANAGED) != prototype.hasDecorator(DecoratorFlags.UNMANAGED)) {\n if (reportMode == ReportMode.REPORT) {\n this.program.error(\n DiagnosticCode.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa,\n Range.join(declaration.name.range, declaration.extendsType.range)\n );\n }\n return null;\n }\n }\n\n // Construct the instance and remember that it has been resolved already\n var simpleName = prototype.simpleName;\n var internalName = prototype.internalName;\n if (instanceKey.length) {\n simpleName += \"<\" + instanceKey + \">\";\n internalName += \"<\" + instanceKey + \">\";\n }\n instance = new Class(prototype, simpleName, internalName, typeArguments, baseClass);\n instance.contextualTypeArguments = contextualTypeArguments;\n prototype.instances.set(instanceKey, instance);\n this.program.instancesLookup.set(internalName, instance);\n\n // Inherit base class members and set up the initial memory offset for own fields\n var memoryOffset: u32 = 0;\n if (baseClass) {\n if (baseClass.members) {\n if (!instance.members) instance.members = new Map();\n for (let inheritedMember of baseClass.members.values()) {\n instance.members.set(inheritedMember.simpleName, inheritedMember);\n }\n }\n memoryOffset = baseClass.currentMemoryOffset;\n }\n\n // Resolve constructor by first applying the class type arguments\n var constructorPrototype = prototype.constructorPrototype;\n if (constructorPrototype) {\n let constructorPartial = this.resolveFunctionPartially(\n constructorPrototype,\n typeArguments,\n reportMode\n );\n if (!constructorPartial) return null;\n instance.constructorInstance = this.resolveFunction(\n constructorPartial,\n null,\n makeMap(),\n reportMode\n );\n }\n\n // Resolve instance members\n if (prototype.instanceMembers) {\n for (let member of prototype.instanceMembers.values()) {\n switch (member.kind) {\n\n // Lay out fields in advance\n case ElementKind.FIELD_PROTOTYPE: {\n let fieldDeclaration = (member).declaration;\n if (!instance.members) instance.members = new Map();\n else if (instance.members.has(member.simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n fieldDeclaration.name.range,\n member.simpleName\n );\n break;\n }\n let fieldType: Type | null = null;\n // TODO: handle duplicate non-private fields\n if (!fieldDeclaration.type) {\n if (baseClass !== null && baseClass.members !== null) {\n let baseField = baseClass.members.get((member).simpleName);\n if (baseField && !baseField.is(CommonFlags.PRIVATE)) {\n assert(baseField.kind == ElementKind.FIELD);\n fieldType = (baseField).type;\n }\n }\n if (!fieldType) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_expected,\n fieldDeclaration.name.range.atEnd\n );\n }\n }\n } else {\n fieldType = this.resolveType(\n fieldDeclaration.type,\n instance.contextualTypeArguments,\n reportMode\n );\n }\n if (!fieldType) break;\n let fieldInstance = new Field(\n member,\n internalName + INSTANCE_DELIMITER + (member).simpleName,\n fieldType,\n fieldDeclaration,\n instance\n );\n switch (fieldType.byteSize) { // align\n case 1: break;\n case 2: { if (memoryOffset & 1) ++memoryOffset; break; }\n case 4: { if (memoryOffset & 3) memoryOffset = (memoryOffset | 3) + 1; break; }\n case 8: { if (memoryOffset & 7) memoryOffset = (memoryOffset | 7) + 1; break; }\n default: assert(false);\n }\n fieldInstance.memoryOffset = memoryOffset;\n memoryOffset += fieldType.byteSize;\n instance.members.set(member.simpleName, fieldInstance);\n break;\n }\n\n // Partially resolve methods as these might have type arguments on their own\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (!instance.members) instance.members = new Map();\n let partialPrototype = this.resolveFunctionPartially(\n member,\n typeArguments,\n reportMode\n );\n if (!partialPrototype) return null;\n partialPrototype.internalName = internalName + INSTANCE_DELIMITER + partialPrototype.simpleName;\n instance.members.set(member.simpleName, partialPrototype);\n break;\n }\n\n // Clone properties and partially resolve the wrapped accessors for consistence with other methods\n case ElementKind.PROPERTY: {\n if (!instance.members) instance.members = new Map();\n let getterPrototype = assert((member).getterPrototype); // must be present\n let setterPrototype = (member).setterPrototype; // might be present\n let instanceProperty = new Property(\n this.program,\n member.simpleName,\n internalName + INSTANCE_DELIMITER + member.simpleName,\n prototype\n );\n let partialGetterPrototype = this.resolveFunctionPartially(\n getterPrototype,\n typeArguments,\n reportMode\n );\n if (!partialGetterPrototype) return null;\n partialGetterPrototype\n .internalName = internalName + INSTANCE_DELIMITER + partialGetterPrototype.simpleName;\n instanceProperty.getterPrototype = partialGetterPrototype;\n if (setterPrototype) {\n let partialSetterPrototype = this.resolveFunctionPartially(\n setterPrototype,\n typeArguments,\n reportMode\n );\n if (!partialSetterPrototype) return null;\n partialSetterPrototype\n .internalName = internalName + INSTANCE_DELIMITER + partialSetterPrototype.simpleName;\n instanceProperty.setterPrototype = partialSetterPrototype;\n }\n instance.members.set(member.simpleName, instanceProperty);\n break;\n }\n default: assert(false);\n }\n }\n }\n\n // Finalize memory offset\n instance.currentMemoryOffset = memoryOffset;\n\n // Fully resolve operator overloads (don't have type parameters on their own)\n for (let [kind, overloadPrototype] of prototype.overloadPrototypes) {\n assert(kind != OperatorKind.INVALID);\n let operatorInstance: Function | null;\n if (overloadPrototype.is(CommonFlags.INSTANCE)) {\n let operatorPartial = this.resolveFunctionPartially(\n overloadPrototype,\n typeArguments,\n reportMode\n );\n if (!operatorPartial) continue;\n operatorInstance = this.resolveFunction(\n operatorPartial,\n null,\n makeMap(),\n reportMode\n );\n } else {\n operatorInstance = this.resolveFunction(\n overloadPrototype,\n null,\n makeMap(),\n reportMode\n );\n }\n if (!operatorInstance) continue;\n let overloads = instance.overloads;\n if (!overloads) instance.overloads = overloads = new Map();\n overloads.set(kind, operatorInstance);\n }\n return instance;\n }\n\n /** Resolves a class prototype by first resolving the specified type arguments. */\n resolveClassInclTypeArguments(\n prototype: ClassPrototype,\n typeArgumentNodes: CommonTypeNode[] | null,\n contextualTypeArguments: Map,\n reportNode: Node,\n reportMode: ReportMode = ReportMode.REPORT\n ): Class | null {\n var resolvedTypeArguments: Type[] | null = null;\n\n // Resolve type arguments if generic\n if (prototype.is(CommonFlags.GENERIC)) {\n resolvedTypeArguments = this.resolveTypeArguments(\n assert(prototype.declaration.typeParameters),\n typeArgumentNodes,\n contextualTypeArguments,\n reportNode,\n reportMode\n );\n if (!resolvedTypeArguments) return null;\n\n // Otherwise make sure that no type arguments have been specified\n } else {\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return null;\n }\n }\n\n // Continue with concrete types\n return this.resolveClass(\n prototype,\n resolvedTypeArguments,\n contextualTypeArguments,\n reportMode\n );\n }\n}\n","/**\n * A decompiler that generates low-level AssemblyScript from WebAssembly binaries.\n * @module decompiler\n *//***/\n\nimport {\n Module,\n NativeType,\n ExpressionId,\n UnaryOp,\n BinaryOp,\n HostOp,\n FunctionRef,\n ExpressionRef,\n Index,\n getFunctionName,\n getFunctionBody,\n getFunctionParamCount,\n getFunctionParamType,\n getFunctionResultType,\n getExpressionId,\n getExpressionType,\n getBlockName,\n getBlockChildCount,\n getBlockChild,\n getIfCondition,\n getIfTrue,\n getIfFalse,\n getLoopName,\n getLoopBody,\n getBreakName,\n getBreakCondition,\n getGetLocalIndex,\n getSetLocalIndex,\n getSetLocalValue,\n getLoadOffset,\n getLoadPtr,\n getStoreOffset,\n getStorePtr,\n getStoreValue,\n getConstValueI32,\n getConstValueI64Low,\n getConstValueI64High,\n getConstValueF32,\n getConstValueF64,\n getUnaryOp,\n getUnaryValue,\n getBinaryOp,\n getBinaryLeft,\n getBinaryRight,\n getSelectThen,\n getSelectElse,\n getSelectCondition,\n getDropValue,\n getReturnValue,\n getHostOp,\n getHostOperand\n} from \"./module\";\n\n// TODO :-)\n\nexport class Decompiler {\n\n static decompile(module: Module): string {\n var decompiler = new Decompiler();\n decompiler.decompile(module);\n return decompiler.finish();\n }\n\n text: string[] = [];\n functionId: i32 = 0;\n\n constructor() { }\n\n /** Decompiles a module to an AST that can then be serialized. */\n decompile(module: Module): void {\n throw new Error(\"not implemented\");\n }\n\n decompileFunction(func: FunctionRef): void {\n var name = getFunctionName(func) || \"$\" + this.functionId.toString(10);\n var body = getFunctionBody(func);\n this.push(\"function \");\n this.push(name);\n this.push(\"(\");\n for (let i: Index = 0, k: Index = getFunctionParamCount(func); i < k; ++i) {\n if (i > 0) this.push(\", \");\n this.push(\"$\");\n this.push(i.toString(10));\n this.push(\": \");\n this.push(nativeTypeToType(getFunctionParamType(func, i)));\n }\n this.push(\"): \");\n this.push(nativeTypeToType(getFunctionResultType(func)));\n this.push(\" \");\n if (getExpressionId(body) != ExpressionId.Block) {\n this.push(\"{\\n\");\n }\n this.decompileExpression(body);\n if (getExpressionId(body) != ExpressionId.Block) {\n this.push(\"\\n}\\n\");\n }\n ++this.functionId;\n }\n\n decompileExpression(expr: ExpressionRef): void {\n var id = getExpressionId(expr);\n var type = getExpressionType(expr);\n\n var nested: ExpressionRef;\n var string: string | null;\n var i: Index, k: Index;\n\n switch (id) {\n case ExpressionId.Block: { // TODO: magic\n if ((string = getBlockName(expr)) != null) {\n this.push(string);\n this.push(\": \");\n }\n this.push(\"{\\n\");\n k = getBlockChildCount(expr);\n for (i = 0; i < k; ++i) {\n this.decompileExpression(getBlockChild(expr, i));\n }\n this.push(\"}\\n\");\n return;\n }\n case ExpressionId.If: {\n if (type == NativeType.None) {\n this.push(\"if (\");\n this.decompileExpression(getIfCondition(expr));\n this.push(\") \");\n this.decompileExpression(getIfTrue(expr));\n if (nested = getIfFalse(expr)) {\n this.push(\" else \");\n this.decompileExpression(nested);\n }\n } else {\n this.decompileExpression(getIfCondition(expr));\n this.push(\" ? \");\n this.decompileExpression(getIfTrue(expr));\n this.push(\" : \");\n this.decompileExpression(getIfFalse(expr));\n }\n return;\n }\n case ExpressionId.Loop: {\n if ((string = getLoopName(expr)) != null) {\n this.push(string);\n this.push(\": \");\n }\n this.push(\"do \");\n this.decompileExpression(getLoopBody(expr));\n this.push(\"while (0);\\n\");\n }\n case ExpressionId.Break: {\n if (nested = getBreakCondition(expr)) {\n this.push(\"if (\");\n this.decompileExpression(nested);\n this.push(\") \");\n }\n if ((string = getBreakName(expr)) != null) {\n this.push(\"break \");\n this.push(string);\n this.push(\";\\n\");\n } else {\n this.push(\"break;\\n\");\n }\n return;\n }\n case ExpressionId.Switch:\n case ExpressionId.Call:\n case ExpressionId.CallIndirect: {\n throw new Error(\"not implemented\");\n }\n case ExpressionId.GetLocal: {\n this.push(\"$\");\n this.push(getGetLocalIndex(expr).toString(10));\n return;\n }\n case ExpressionId.SetLocal: {\n this.push(\"$\");\n this.push(getSetLocalIndex(expr).toString(10));\n this.push(\" = \");\n this.decompileExpression(getSetLocalValue(expr));\n return;\n }\n case ExpressionId.GetGlobal:\n case ExpressionId.SetGlobal: {\n throw new Error(\"not implemented\");\n }\n case ExpressionId.Load: {\n this.push(\"load<\");\n this.push(nativeTypeToType(type));\n this.push(\">(\");\n this.push(getLoadOffset(expr).toString(10));\n this.push(\" + \");\n this.decompileExpression(getLoadPtr(expr));\n this.push(\")\");\n return;\n }\n case ExpressionId.Store: {\n this.push(\"store<\");\n this.push(nativeTypeToType(type));\n this.push(\">(\");\n this.push(getStoreOffset(expr).toString(10));\n this.push(\" + \");\n this.decompileExpression(getStorePtr(expr));\n this.push(\", \");\n this.decompileExpression(getStoreValue(expr));\n this.push(\")\");\n return;\n }\n case ExpressionId.Const: {\n switch (type) {\n case NativeType.I32: {\n this.push(getConstValueI32(expr).toString(10));\n return;\n }\n case NativeType.I64: {\n this.push(\n i64_to_string(\n i64_new(\n getConstValueI64Low(expr),\n getConstValueI64High(expr)\n )\n )\n );\n return;\n }\n case NativeType.F32: {\n this.push(getConstValueF32(expr).toString(10));\n return;\n }\n case NativeType.F64: {\n this.push(getConstValueF64(expr).toString(10));\n return;\n }\n }\n break;\n }\n case ExpressionId.Unary: {\n switch (getUnaryOp(expr)) {\n case UnaryOp.ClzI32: {\n this.push(\"clz(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.CtzI32: {\n this.push(\"ctz(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.PopcntI32: {\n this.push(\"popcnt(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.NegF32:\n case UnaryOp.NegF64: {\n this.push(\"-\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.AbsF32: {\n this.push(\"abs(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.CeilF32: {\n this.push(\"ceil(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.FloorF32: {\n this.push(\"floor(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.TruncF32: {\n this.push(\"trunc(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.NearestF32: {\n this.push(\"nearest(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.SqrtF32: {\n this.push(\"sqrt(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.EqzI32:\n case UnaryOp.EqzI64: {\n this.push(\"!\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ClzI64: {\n this.push(\"clz(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.CtzI64: {\n this.push(\"ctz(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.PopcntI64: {\n this.push(\"popcnt(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.AbsF64: {\n this.push(\"abs(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.CeilF64: {\n this.push(\"ceil(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.FloorF64: {\n this.push(\"floor(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.TruncF64: {\n this.push(\"trunc(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.NearestF64: {\n this.push(\"nearest(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.SqrtF64: {\n this.push(\"sqrt(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.ExtendI32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ExtendU32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.WrapI64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF32ToI32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF32ToI64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF32ToU32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF32ToU64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF64ToI32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF64ToI64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF64ToU32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF64ToU64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ReinterpretF32: {\n this.push(\"reinterpret(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.ReinterpretF64: {\n this.push(\"reinterpret(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.ConvertI32ToF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertI32ToF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertU32ToF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertU32ToF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertI64ToF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertI64ToF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertU64ToF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertU64ToF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.PromoteF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.DemoteF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ReinterpretI32: {\n this.push(\"reinterpret(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.ReinterpretI64: {\n this.push(\"reinterpret(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n }\n break;\n }\n case ExpressionId.Binary: { // TODO: precedence\n switch (getBinaryOp(expr)) {\n case BinaryOp.AddI32:\n case BinaryOp.AddI64:\n case BinaryOp.AddF32:\n case BinaryOp.AddF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" + \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.SubI32:\n case BinaryOp.SubI64:\n case BinaryOp.SubF32:\n case BinaryOp.SubF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" - \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.MulI32:\n case BinaryOp.MulI64:\n case BinaryOp.MulF32:\n case BinaryOp.MulF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" * \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.DivI32:\n case BinaryOp.DivI64:\n case BinaryOp.DivF32:\n case BinaryOp.DivF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" / \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.DivU32: {\n this.push(\"(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" / \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.RemI32:\n case BinaryOp.RemI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" % \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.RemU32: {\n this.push(\"(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" / \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.AndI32:\n case BinaryOp.AndI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" & \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.OrI32:\n case BinaryOp.OrI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" | \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.XorI32:\n case BinaryOp.XorI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" ^ \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.ShlI32:\n case BinaryOp.ShlI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" << \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.ShrU32:\n case BinaryOp.ShrU64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >>> \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.ShrI32:\n case BinaryOp.ShrI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >> \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.RotlI32: {\n this.push(\"rotl(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.RotrI32: {\n this.push(\"rotr(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.EqI32:\n case BinaryOp.EqI64:\n case BinaryOp.EqF32:\n case BinaryOp.EqF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" == \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.NeI32:\n case BinaryOp.NeI64:\n case BinaryOp.NeF32:\n case BinaryOp.NeF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" != \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LtI32:\n case BinaryOp.LtI64:\n case BinaryOp.LtF32:\n case BinaryOp.LtF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" < \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LtU32: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" < \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LeI32:\n case BinaryOp.LeI64:\n case BinaryOp.LeF32:\n case BinaryOp.LeF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" <= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LeU32: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" <= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GtI32:\n case BinaryOp.GtI64:\n case BinaryOp.GtF32:\n case BinaryOp.GtF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" > \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GtU32: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" > \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GeI32:\n case BinaryOp.GeI64:\n case BinaryOp.GeF32:\n case BinaryOp.GeF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GeU32: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.DivU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" / \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.RemU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" % \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.RotlI64: {\n this.push(\"rotl(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.RotrI64: {\n this.push(\"rotr(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.LtU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" < \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LeU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" <= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GtU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" > \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GeU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.CopysignF32: {\n this.push(\"copysign(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.MinF32: {\n this.push(\"min(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.MaxF32: {\n this.push(\"max(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.CopysignF64: {\n this.push(\"copysign(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.MinF64: {\n this.push(\"min(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.MaxF64: {\n this.push(\"max(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n }\n return;\n }\n case ExpressionId.Select: {\n this.push(\"select<\");\n this.push(nativeTypeToType(type));\n this.push(\">(\");\n this.decompileExpression(getSelectThen(expr));\n this.push(\", \");\n this.decompileExpression(getSelectElse(expr));\n this.push(\", \");\n this.decompileExpression(getSelectCondition(expr));\n this.push(\")\");\n return;\n }\n case ExpressionId.Drop: {\n this.decompileExpression(getDropValue(expr));\n this.push(\";\\n\");\n return;\n }\n case ExpressionId.Return: {\n if (nested = getReturnValue(expr)) {\n this.push(\"return \");\n this.decompileExpression(nested);\n this.push(\";\\n\");\n } else {\n this.push(\"return;\\n\");\n }\n return;\n }\n case ExpressionId.Host: {\n switch (getHostOp(expr)) {\n case HostOp.CurrentMemory: {\n this.push(\"memory.size()\");\n return;\n }\n case HostOp.GrowMemory: {\n this.push(\"memory.grow(\");\n this.decompileExpression(getHostOperand(expr, 0));\n this.push(\")\");\n return;\n }\n }\n break;\n }\n case ExpressionId.Nop: {\n this.push(\";\\n\");\n return;\n }\n case ExpressionId.Unreachable: {\n this.push(\"unreachable()\");\n return;\n }\n case ExpressionId.AtomicCmpxchg:\n case ExpressionId.AtomicRMW:\n case ExpressionId.AtomicWait:\n case ExpressionId.AtomicWake:\n }\n throw new Error(\"not implemented\");\n }\n\n private push(text: string): void {\n // mostly here so we can add debugging if necessary\n this.text.push(text);\n }\n\n finish(): string {\n var ret = this.text.join(\"\");\n this.text = [];\n return ret;\n }\n}\n\nfunction nativeTypeToType(type: NativeType): string {\n switch (type) {\n case NativeType.None: return \"void\";\n case NativeType.I32: return \"i32\";\n case NativeType.I64: return \"i64\";\n case NativeType.F32: return \"f32\";\n case NativeType.F64: return \"f64\";\n case NativeType.Unreachable: throw new Error(\"unreachable type\");\n case NativeType.Auto: throw new Error(\"auto type\");\n default: throw new Error(\"unexpected type\");\n }\n}\n","/**\n * Definition builders for WebIDL and TypeScript.\n * @module definitions\n *//***/\n\nimport {\n CommonFlags\n} from \"./common\";\n\nimport {\n Program,\n Element,\n ElementKind,\n Global,\n Enum,\n EnumValue,\n Field,\n Function,\n FunctionPrototype,\n Class,\n ClassPrototype,\n Namespace,\n ConstantValueKind,\n Interface,\n Property\n} from \"./program\";\n\nimport {\n Type,\n TypeKind\n} from \"./types\";\n\nimport {\n indent\n} from \"./util\";\n\n/** Walker base class. */\nabstract class ExportsWalker {\n\n /** Program reference. */\n program: Program;\n /** Whether to include private members */\n includePrivate: bool;\n /** Elements still to do. */\n todo: Element[] = [];\n /** Already seen elements. */\n seen: Set = new Set();\n\n /** Constructs a new Element walker. */\n constructor(program: Program, includePrivate: bool = false) {\n this.program = program;\n this.includePrivate;\n }\n\n /** Walks all exports and calls the respective handlers. */\n walk(): void {\n for (let moduleExport of this.program.moduleLevelExports.values()) {\n // FIXME: doesn't honor the actual externally visible name\n this.visitElement(moduleExport.element);\n }\n var todo = this.todo;\n for (let i = 0; i < todo.length; ) this.visitElement(todo[i]);\n }\n\n /** Visits an element.*/\n visitElement(element: Element): void {\n if (element.is(CommonFlags.PRIVATE) && !this.includePrivate) return;\n if (this.seen.has(element)) return;\n this.seen.add(element);\n switch (element.kind) {\n case ElementKind.GLOBAL: {\n if (element.is(CommonFlags.COMPILED)) this.visitGlobal(element);\n break;\n }\n case ElementKind.ENUM: {\n if (element.is(CommonFlags.COMPILED)) this.visitEnum(element);\n break;\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n this.visitFunctionInstances(element);\n break;\n }\n case ElementKind.CLASS_PROTOTYPE: {\n this.visitClassInstances(element);\n break;\n }\n case ElementKind.FIELD: {\n if ((element).is(CommonFlags.COMPILED)) this.visitField(element);\n break;\n }\n case ElementKind.PROPERTY: {\n let prop = element;\n let getter = prop.getterPrototype;\n if (getter) this.visitFunctionInstances(getter);\n let setter = prop.setterPrototype;\n if (setter) this.visitFunctionInstances(setter);\n break;\n }\n case ElementKind.NAMESPACE: {\n if (hasCompiledMember(element)) this.visitNamespace(element);\n break;\n }\n default: assert(false);\n }\n }\n\n private visitFunctionInstances(element: FunctionPrototype): void {\n for (let instances of element.instances.values()) {\n for (let instance of instances.values()) {\n if (instance.is(CommonFlags.COMPILED)) this.visitFunction(instance);\n }\n }\n }\n\n private visitClassInstances(element: ClassPrototype): void {\n for (let instance of element.instances.values()) {\n if (instance.is(CommonFlags.COMPILED)) this.visitClass(instance);\n }\n }\n\n abstract visitGlobal(element: Global): void;\n abstract visitEnum(element: Enum): void;\n abstract visitFunction(element: Function): void;\n abstract visitClass(element: Class): void;\n abstract visitInterface(element: Interface): void;\n abstract visitField(element: Field): void;\n abstract visitNamespace(element: Element): void;\n}\n\n/** A WebIDL definitions builder. */\nexport class IDLBuilder extends ExportsWalker {\n\n /** Builds WebIDL definitions for the specified program. */\n static build(program: Program): string {\n return new IDLBuilder(program).build();\n }\n\n private sb: string[] = [];\n private indentLevel: i32 = 0;\n\n /** Constructs a new WebIDL builder. */\n constructor(program: Program, includePrivate: bool = false) {\n super(program, includePrivate);\n }\n\n visitGlobal(element: Global): void {\n var sb = this.sb;\n var isConst = element.is(CommonFlags.INLINED);\n indent(sb, this.indentLevel);\n if (isConst) sb.push(\"const \");\n sb.push(this.typeToString(element.type));\n sb.push(\" \");\n sb.push(element.simpleName);\n if (isConst) {\n switch (element.constantValueKind) {\n case ConstantValueKind.INTEGER: {\n sb.push(\" = \");\n sb.push(i64_to_string(element.constantIntegerValue));\n break;\n }\n case ConstantValueKind.FLOAT: {\n sb.push(\" = \");\n sb.push(element.constantFloatValue.toString());\n break;\n }\n default: assert(false);\n }\n }\n sb.push(\";\\n\");\n }\n\n visitEnum(element: Enum): void {\n var sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"interface \");\n sb.push(element.simpleName);\n sb.push(\" {\\n\");\n var members = element.members;\n if (members) {\n for (let [name, member] of members) {\n if (member.kind == ElementKind.ENUMVALUE) {\n let isConst = (member).is(CommonFlags.INLINED);\n indent(sb, this.indentLevel);\n if (isConst) sb.push(\"const \");\n else sb.push(\"readonly \");\n sb.push(\"unsigned long \");\n sb.push(name);\n if (isConst) {\n sb.push(\" = \");\n sb.push((member).constantValue.toString(10));\n }\n sb.push(\";\\n\");\n }\n }\n for (let member of members.values()) {\n if (member.kind != ElementKind.ENUMVALUE) this.visitElement(member);\n }\n }\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n visitFunction(element: Function): void {\n var sb = this.sb;\n var signature = element.signature;\n indent(sb, this.indentLevel);\n sb.push(this.typeToString(signature.returnType));\n sb.push(\" \");\n sb.push(element.simpleName);\n sb.push(\"(\");\n var parameters = signature.parameterTypes;\n var numParameters = parameters.length;\n // var requiredParameters = signature.requiredParameters;\n for (let i = 0; i < numParameters; ++i) {\n if (i) sb.push(\", \");\n // if (i >= requiredParameters) sb.push(\"optional \");\n sb.push(this.typeToString(parameters[i]));\n sb.push(\" \");\n sb.push(signature.getParameterName(i));\n }\n sb.push(\");\\n\");\n var members = element.members;\n if (members && members.size) {\n indent(sb, this.indentLevel);\n sb.push(\"interface \");\n sb.push(element.simpleName);\n sb.push(\" {\\n\");\n for (let member of members.values()) this.visitElement(member);\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n }\n\n visitClass(element: Class): void {\n var sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"interface \");\n sb.push(element.simpleName);\n sb.push(\" {\\n\");\n // TODO\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n visitInterface(element: Interface): void {\n this.visitClass(element);\n }\n\n visitField(element: Field): void {\n // TODO\n }\n\n visitNamespace(element: Namespace): void {\n var sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"interface \");\n sb.push(element.simpleName);\n sb.push(\" {\\n\");\n var members = element.members;\n if (members) {\n for (let member of members.values()) this.visitElement(member);\n }\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n typeToString(type: Type): string {\n switch (type.kind) {\n case TypeKind.I8: return \"byte\";\n case TypeKind.I16: return \"short\";\n case TypeKind.I32: return \"long\";\n case TypeKind.I64: return \"long long\";\n case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"long long\" : \"long\";\n case TypeKind.U8: return \"octet\";\n case TypeKind.U16: return \"unsigned short\";\n case TypeKind.U32: return \"unsigned long\";\n // ^ TODO: function types\n case TypeKind.U64: return \"unsigned long long\";\n case TypeKind.USIZE: return this.program.options.isWasm64 ? \"unsigned long long\" : \"unsigned long\";\n // ^ TODO: class types\n case TypeKind.BOOL: return \"boolean\";\n case TypeKind.F32: return \"unrestricted float\";\n case TypeKind.F64: return \"unrestricted double\";\n case TypeKind.VOID: return \"void\";\n default: {\n assert(false);\n return \"\";\n }\n }\n }\n\n build(): string {\n var sb = this.sb;\n sb.push(\"interface ASModule {\\n\");\n ++this.indentLevel;\n this.walk();\n --this.indentLevel;\n sb.push(\"}\\n\");\n return sb.join(\"\");\n }\n}\n\n/** A TypeScript definitions builder. */\nexport class TSDBuilder extends ExportsWalker {\n\n /** Builds TypeScript definitions for the specified program. */\n static build(program: Program): string {\n return new TSDBuilder(program).build();\n }\n\n private sb: string[] = [];\n private indentLevel: i32 = 0;\n\n /** Constructs a new WebIDL builder. */\n constructor(program: Program, includePrivate: bool = false) {\n super(program, includePrivate);\n }\n\n visitGlobal(element: Global): void {\n var sb = this.sb;\n var isConst = element.is(CommonFlags.INLINED);\n indent(sb, this.indentLevel);\n if (element.is(CommonFlags.STATIC)) {\n if (isConst) sb.push(\"static readonly \");\n else sb.push(\"static \");\n } else {\n if (isConst) sb.push(\"const \");\n else sb.push(\"var \");\n }\n sb.push(element.simpleName);\n sb.push(\": \");\n sb.push(this.typeToString(element.type));\n sb.push(\";\\n\");\n this.visitNamespace(element);\n }\n\n visitEnum(element: Enum): void {\n var sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"enum \");\n sb.push(element.simpleName);\n sb.push(\" {\\n\");\n var members = element.members;\n if (members) {\n let numMembers = members.size;\n for (let [name, member] of members) {\n if (member.kind == ElementKind.ENUMVALUE) {\n indent(sb, this.indentLevel);\n sb.push(name);\n if (member.is(CommonFlags.INLINED)) {\n sb.push(\" = \");\n sb.push((member).constantValue.toString(10));\n }\n sb.push(\",\\n\");\n --numMembers;\n }\n }\n if (numMembers) this.visitNamespace(element);\n }\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n visitFunction(element: Function): void {\n if (element.isAny(CommonFlags.PRIVATE | CommonFlags.SET)) return;\n var sb = this.sb;\n var signature = element.signature;\n indent(sb, this.indentLevel);\n if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\n if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\n if (element.is(CommonFlags.GET)) {\n sb.push(element.prototype.declaration.name.text); // 'get:funcName' internally\n sb.push(\": \");\n sb.push(this.typeToString(signature.returnType));\n sb.push(\";\\n\");\n return;\n } else {\n if (!element.isAny(CommonFlags.STATIC | CommonFlags.INSTANCE)) sb.push(\"function \");\n sb.push(element.simpleName);\n }\n sb.push(\"(\");\n var parameters = signature.parameterTypes;\n var numParameters = parameters.length;\n // var requiredParameters = signature.requiredParameters;\n for (let i = 0; i < numParameters; ++i) {\n if (i) sb.push(\", \");\n // if (i >= requiredParameters) sb.push(\"optional \");\n sb.push(signature.getParameterName(i));\n sb.push(\": \");\n sb.push(this.typeToString(parameters[i]));\n }\n if (element.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.SET)) {\n sb.push(\")\");\n } else {\n sb.push(\"): \");\n sb.push(this.typeToString(signature.returnType));\n }\n sb.push(\";\\n\");\n this.visitNamespace(element);\n }\n\n visitClass(element: Class): void {\n var sb = this.sb;\n var isInterface = element.kind == ElementKind.INTERFACE;\n indent(sb, this.indentLevel++);\n if (isInterface) {\n sb.push(\"interface \");\n } else {\n if (element.is(CommonFlags.ABSTRACT)) sb.push(\"abstract \");\n sb.push(\"class \");\n }\n sb.push(element.simpleName);\n var base = element.base;\n if (base && base.is(CommonFlags.COMPILED | CommonFlags.MODULE_EXPORT)) {\n sb.push(\" extends \");\n sb.push(base.simpleName); // TODO: fqn\n }\n sb.push(\" {\\n\");\n var members = element.prototype.members; // static\n if (members) {\n for (let member of members.values()) {\n this.visitElement(member);\n }\n }\n var ctor = element.constructorInstance;\n if (ctor) this.visitFunction(ctor);\n members = element.members; // instance\n if (members) {\n for (let member of members.values()) this.visitElement(member);\n }\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n visitInterface(element: Interface): void {\n this.visitClass(element);\n }\n\n visitField(element: Field): void {\n if (element.is(CommonFlags.PRIVATE)) return;\n var sb = this.sb;\n indent(sb, this.indentLevel);\n if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\n if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\n if (element.is(CommonFlags.READONLY)) sb.push(\"readonly \");\n sb.push(element.simpleName);\n sb.push(\": \");\n sb.push(this.typeToString(element.type));\n sb.push(\";\\n\");\n }\n\n visitNamespace(element: Element): void {\n var members = element.members;\n if (members && members.size) {\n let sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"namespace \");\n sb.push(element.simpleName);\n sb.push(\" {\\n\");\n for (let member of members.values()) this.visitElement(member);\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n }\n\n typeToString(type: Type): string {\n switch (type.kind) {\n case TypeKind.I8: return \"i8\";\n case TypeKind.I16: return \"i16\";\n case TypeKind.I32: return \"i32\";\n case TypeKind.I64: return \"I64\";\n case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"I64\" : \"i32\";\n case TypeKind.U8: return \"u8\";\n case TypeKind.U16: return \"u16\";\n case TypeKind.U32: return \"u32\";\n // ^ TODO: function types\n case TypeKind.U64: return \"U64\";\n case TypeKind.USIZE: return this.program.options.isWasm64 ? \"U64\" : \"u32\";\n // ^ TODO: class types\n case TypeKind.BOOL: return \"bool\";\n case TypeKind.F32: return \"f32\";\n case TypeKind.F64: return \"f64\";\n case TypeKind.VOID: return \"void\";\n default: {\n assert(false);\n return \"\";\n }\n }\n }\n\n build(): string {\n var sb = this.sb;\n sb.push(\"declare module ASModule {\\n\");\n sb.push(\" type i8 = number;\\n\");\n sb.push(\" type i16 = number;\\n\");\n sb.push(\" type i32 = number;\\n\");\n sb.push(\" type u8 = number;\\n\");\n sb.push(\" type u16 = number;\\n\");\n sb.push(\" type u32 = number;\\n\");\n sb.push(\" type f32 = number;\\n\");\n sb.push(\" type f64 = number;\\n\");\n sb.push(\" type bool = any;\\n\");\n ++this.indentLevel;\n this.walk();\n --this.indentLevel;\n sb.push(\"}\\n\");\n sb.push(\"export default ASModule;\\n\");\n return this.sb.join(\"\");\n }\n}\n\n// helpers\n\n/** Tests if a namespace-like element has at least one compiled member. */\nfunction hasCompiledMember(element: Element): bool {\n var members = element.members;\n if (members) {\n for (let member of members.values()) {\n switch (member.kind) {\n case ElementKind.FUNCTION_PROTOTYPE: {\n for (let instances of (member).instances.values()) {\n for (let instance of instances.values()) {\n if (instance.is(CommonFlags.COMPILED)) return true;\n }\n }\n break;\n }\n case ElementKind.CLASS_PROTOTYPE: {\n for (let instance of (member).instances.values()) {\n if (instance.is(CommonFlags.COMPILED)) return true;\n }\n break;\n }\n default: {\n if (member.is(CommonFlags.COMPILED) || hasCompiledMember(member)) return true;\n break;\n }\n }\n }\n }\n return false;\n}\n","/**\n * A TypeScript parser for the AssemblyScript subset.\n * @module parser\n *//***/\n\nimport {\n CommonFlags,\n LIBRARY_PREFIX,\n PATH_DELIMITER\n} from \"./common\";\n\nimport {\n Program\n} from \"./program\";\n\nimport {\n Tokenizer,\n Token,\n Range,\n CommentHandler,\n IdentifierHandling\n} from \"./tokenizer\";\n\nimport {\n DiagnosticCode,\n DiagnosticEmitter\n} from \"./diagnostics\";\n\nimport {\n normalizePath\n} from \"./util\";\n\nimport {\n Node,\n NodeKind,\n Source,\n SourceKind,\n CommonTypeNode,\n TypeNode,\n SignatureNode,\n\n Expression,\n AssertionKind,\n CallExpression,\n ClassExpression,\n FunctionExpression,\n IdentifierExpression,\n StringLiteralExpression,\n\n Statement,\n BlockStatement,\n BreakStatement,\n ClassDeclaration,\n ContinueStatement,\n DeclarationStatement,\n DecoratorNode,\n DoStatement,\n EnumDeclaration,\n EnumValueDeclaration,\n ExportImportStatement,\n ExportMember,\n ExportStatement,\n ExpressionStatement,\n ForStatement,\n FunctionDeclaration,\n IfStatement,\n ImportDeclaration,\n ImportStatement,\n NamespaceDeclaration,\n ParameterNode,\n ParameterKind,\n ReturnStatement,\n SwitchCase,\n SwitchStatement,\n ThrowStatement,\n TryStatement,\n TypeDeclaration,\n TypeParameterNode,\n VariableStatement,\n VariableDeclaration,\n VoidStatement,\n WhileStatement,\n\n mangleInternalPath,\n nodeIsCallable,\n nodeIsGenericCallable,\n IndexSignatureDeclaration\n} from \"./ast\";\n\n/** Parser interface. */\nexport class Parser extends DiagnosticEmitter {\n\n /** Program being created. */\n program: Program;\n /** Source file names to be requested next. */\n backlog: string[] = new Array();\n /** Source file names already seen, that is processed or backlogged. */\n seenlog: Set = new Set();\n /** Source file names already completely processed. */\n donelog: Set = new Set();\n /** Optional handler to intercept comments while tokenizing. */\n onComment: CommentHandler | null = null;\n\n /** Constructs a new parser. */\n constructor() {\n super();\n this.program = new Program(this.diagnostics);\n }\n\n /** Parses a file and adds its definitions to the program. */\n parseFile(\n text: string,\n path: string,\n isEntry: bool\n ): void {\n var normalizedPath = normalizePath(path);\n var internalPath = mangleInternalPath(normalizedPath);\n\n // check if already processed\n if (this.donelog.has(internalPath)) return;\n this.donelog.add(internalPath); // do not parse again\n this.seenlog.add(internalPath); // do not request again\n\n // create the source element\n var source = new Source(\n normalizedPath,\n text,\n isEntry\n ? SourceKind.ENTRY\n : path.startsWith(LIBRARY_PREFIX) && path.indexOf(PATH_DELIMITER, LIBRARY_PREFIX.length) < 0\n ? SourceKind.LIBRARY\n : SourceKind.DEFAULT\n );\n var program = this.program;\n program.sources.push(source);\n\n // tokenize and parse\n var tn = new Tokenizer(source, program.diagnostics);\n tn.onComment = this.onComment;\n source.tokenizer = tn;\n var statements = source.statements;\n while (!tn.skip(Token.ENDOFFILE)) {\n let statement = this.parseTopLevelStatement(tn);\n if (statement) {\n statement.parent = source;\n statements.push(statement);\n }\n }\n tn.finish();\n }\n\n /** Parses a top-level statement. */\n parseTopLevelStatement(\n tn: Tokenizer,\n namespace: Node | null = null\n ): Statement | null {\n var flags = CommonFlags.NONE;\n var startPos: i32 = -1;\n\n // check decorators\n var decorators: DecoratorNode[] | null = null;\n while (tn.skip(Token.AT)) {\n if (startPos < 0) startPos = tn.tokenPos;\n let decorator = this.parseDecorator(tn);\n if (!decorator) {\n this.skipStatement(tn);\n continue;\n }\n if (!decorators) decorators = [];\n decorators.push(decorator);\n }\n\n // check modifiers\n var exportStart: i32 = 0;\n var exportEnd: i32 = 0;\n if (tn.skip(Token.EXPORT)) {\n if (tn.skip(Token.DEFAULT)) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n tn.range()\n );\n }\n if (startPos < 0) startPos = tn.tokenPos;\n flags |= CommonFlags.EXPORT;\n exportStart = tn.tokenPos;\n exportEnd = tn.pos;\n }\n\n var declareStart: i32 = 0;\n var declareEnd: i32 = 0;\n var contextIsAmbient = namespace != null && namespace.is(CommonFlags.AMBIENT);\n if (tn.skip(Token.DECLARE)) {\n if (startPos < 0) startPos = tn.tokenPos;\n if (contextIsAmbient) {\n this.error(\n DiagnosticCode.A_declare_modifier_cannot_be_used_in_an_already_ambient_context,\n tn.range()\n ); // recoverable\n }\n flags |= CommonFlags.DECLARE | CommonFlags.AMBIENT;\n } else if (contextIsAmbient) {\n flags |= CommonFlags.AMBIENT;\n }\n\n // parse the statement\n var statement: Statement | null = null;\n\n // handle declarations\n var first = tn.peek();\n if (startPos < 0) startPos = tn.nextTokenPos;\n switch (first) {\n case Token.CONST: {\n tn.next();\n flags |= CommonFlags.CONST;\n if (tn.skip(Token.ENUM)) {\n statement = this.parseEnum(tn, flags, decorators, startPos);\n break;\n } else {\n statement = this.parseVariable(tn, flags, decorators, startPos);\n decorators = null;\n }\n break;\n }\n case Token.LET: flags |= CommonFlags.LET;\n case Token.VAR: {\n tn.next();\n statement = this.parseVariable(tn, flags, decorators, startPos);\n decorators = null;\n break;\n }\n case Token.ENUM: {\n tn.next();\n statement = this.parseEnum(tn, flags, decorators, startPos);\n decorators = null;\n break;\n }\n case Token.FUNCTION: {\n tn.next();\n statement = this.parseFunction(tn, flags, decorators, startPos);\n decorators = null;\n break;\n }\n case Token.ABSTRACT: {\n let state = tn.mark();\n tn.next();\n if (!tn.skip(Token.CLASS)) {\n tn.reset(state);\n statement = this.parseStatement(tn, true);\n break;\n } else {\n tn.discard(state);\n }\n flags |= CommonFlags.ABSTRACT;\n // fall through\n }\n case Token.CLASS:\n case Token.INTERFACE: {\n tn.next();\n statement = this.parseClassOrInterface(tn, flags, decorators, startPos);\n decorators = null;\n break;\n }\n case Token.NAMESPACE: {\n let state = tn.mark();\n tn.next();\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\n tn.discard(state);\n statement = this.parseNamespace(tn, flags, decorators, startPos);\n decorators = null;\n } else {\n tn.reset(state);\n statement = this.parseStatement(tn, true);\n }\n break;\n }\n case Token.IMPORT: {\n tn.next();\n flags |= CommonFlags.IMPORT;\n if (flags & CommonFlags.EXPORT) {\n statement = this.parseExportImport(tn, startPos);\n } else {\n statement = this.parseImport(tn);\n }\n break;\n }\n case Token.TYPE: { // also identifier\n let state = tn.mark();\n tn.next();\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\n tn.discard(state);\n statement = this.parseTypeDeclaration(tn, flags, decorators, startPos);\n decorators = null;\n } else {\n tn.reset(state);\n statement = this.parseStatement(tn, true);\n }\n break;\n }\n default: {\n\n // handle plain exports\n if (flags & CommonFlags.EXPORT) {\n statement = this.parseExport(tn, flags, startPos);\n\n // handle non-declaration statements\n } else {\n if (exportEnd) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(exportStart, exportEnd), \"export\"\n ); // recoverable\n }\n if (declareEnd) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(declareStart, declareEnd), \"declare\"\n ); // recoverable\n }\n if (!namespace) {\n statement = this.parseStatement(tn, true);\n } // TODO: else?\n }\n break;\n }\n }\n\n // check for decorators that weren't consumed\n if (decorators) {\n for (let i = 0, k = decorators.length; i < k; ++i) {\n this.error(\n DiagnosticCode.Decorators_are_not_valid_here,\n decorators[i].range\n );\n }\n }\n return statement;\n }\n\n /** Obtains the next file to parse. */\n nextFile(): string | null {\n var backlog = this.backlog;\n return backlog.length ? backlog.shift() : null;\n }\n\n /** Finishes parsing and returns the program. */\n finish(): Program {\n if (this.backlog.length) throw new Error(\"backlog is not empty\");\n this.backlog = [];\n this.seenlog.clear();\n this.donelog.clear();\n return this.program;\n }\n\n /** Parses a type. */\n parseType(\n tn: Tokenizer,\n acceptParenthesized: bool = true,\n suppressErrors: bool = false\n ): CommonTypeNode | null {\n\n // NOTE: this parses our limited subset\n var token = tn.next();\n var startPos = tn.tokenPos;\n\n var type: CommonTypeNode;\n\n // '(' ...\n if (token == Token.OPENPAREN) {\n\n // '(' FunctionSignature ')' '|' 'null'?\n let isNullableSignature = tn.skip(Token.OPENPAREN);\n // FunctionSignature?\n let signature = this.tryParseSignature(tn);\n if (signature) {\n if (isNullableSignature) {\n if (!tn.skip(Token.CLOSEPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n if (!tn.skip(Token.BAR)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"|\"\n );\n return null;\n }\n if (!tn.skip(Token.NULL)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"null\"\n );\n }\n signature.isNullable = true;\n }\n return signature;\n } else if (isNullableSignature || this.tryParseSignatureIsSignature) {\n this.error(\n DiagnosticCode.Unexpected_token,\n tn.range()\n );\n return null;\n }\n\n // Type (',' Type)* ')'\n if (acceptParenthesized) {\n let innerType = this.parseType(tn, false, suppressErrors);\n if (!innerType) return null;\n if (!tn.skip(Token.CLOSEPAREN)) {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"}\"\n );\n }\n return null;\n }\n type = innerType;\n type.range.start = startPos;\n type.range.end = tn.pos;\n } else {\n this.error(\n DiagnosticCode.Unexpected_token,\n tn.range()\n );\n return null;\n }\n\n // 'void'\n } else if (token == Token.VOID) {\n type = Node.createType(\n Node.createIdentifierExpression(\"void\", tn.range()), [], false, tn.range(startPos, tn.pos)\n );\n\n // 'this'\n } else if (token == Token.THIS) {\n type = Node.createType(\n Node.createThisExpression(tn.range()), [], false, tn.range(startPos, tn.pos)\n );\n\n // 'true'\n } else if (token == Token.TRUE || token == Token.FALSE) {\n type = Node.createType(\n Node.createIdentifierExpression(\"bool\", tn.range()), [], false, tn.range(startPos, tn.pos)\n );\n\n // StringLiteral\n } else if (token == Token.STRINGLITERAL) {\n tn.readString();\n type = Node.createType(\n Node.createIdentifierExpression(\"string\", tn.range()), [], false, tn.range(startPos, tn.pos)\n );\n\n // Identifier\n } else if (token == Token.IDENTIFIER) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let parameters = new Array();\n let nullable = false;\n\n // Identifier ('.' Identifier)+\n while (tn.skip(Token.DOT)) {\n if (tn.skip(Token.IDENTIFIER)) {\n // TODO: this works for now, but the representation isn't great\n identifier = Node.createIdentifierExpression(\n identifier.text + \".\" + tn.readIdentifier(),\n tn.range(identifier.range.start, tn.pos)\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range(tn.pos)\n );\n return null;\n }\n }\n\n // Name\n if (tn.skip(Token.LESSTHAN)) {\n do {\n let parameter = this.parseType(tn, true, suppressErrors);\n if (!parameter) return null;\n parameters.push(parameter);\n } while (tn.skip(Token.COMMA));\n if (!tn.skip(Token.GREATERTHAN)) {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \">\"\n );\n }\n return null;\n }\n }\n // ... | null\n while (tn.skip(Token.BAR)) {\n if (tn.skip(Token.NULL)) {\n nullable = true;\n } else {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"null\"\n );\n }\n return null;\n }\n }\n type = Node.createType(identifier, parameters, nullable, tn.range(startPos, tn.pos));\n\n } else {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n // ... [][]\n while (tn.skip(Token.OPENBRACKET)) {\n let bracketStart = tn.tokenPos;\n if (!tn.skip(Token.CLOSEBRACKET)) {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"]\"\n );\n }\n return null;\n }\n let bracketRange = tn.range(bracketStart, tn.pos);\n\n // ...[] | null\n let nullable = false;\n if (tn.skip(Token.BAR)) {\n if (tn.skip(Token.NULL)) {\n nullable = true;\n } else {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"null\"\n );\n }\n return null;\n }\n }\n type = Node.createType(\n Node.createIdentifierExpression(\"Array\", bracketRange),\n [ type ],\n nullable,\n tn.range(startPos, tn.pos)\n );\n if (nullable) break;\n }\n\n return type;\n }\n\n // Indicates whether tryParseSignature determined that it is handling a Signature\n private tryParseSignatureIsSignature: bool = false;\n\n /** Parses a function signature, as used in type declarations. */\n tryParseSignature(\n tn: Tokenizer\n ): SignatureNode | null {\n\n // at '(': ('...'? Identifier '?'? ':' Type (',' '...'? Identifier '?'? ':' Type)* )? ')' '=>' Type\n\n var state = tn.mark();\n var startPos = tn.tokenPos;\n var parameters: ParameterNode[] | null = null;\n var thisType: TypeNode | null = null;\n var isSignature: bool = false;\n\n if (tn.skip(Token.CLOSEPAREN)) {\n isSignature = true;\n tn.discard(state);\n parameters = [];\n\n } else {\n isSignature = false; // not yet known\n do {\n let kind = ParameterKind.DEFAULT;\n if (tn.skip(Token.DOT_DOT_DOT)) {\n isSignature = true;\n tn.discard(state);\n kind = ParameterKind.REST;\n }\n if (tn.skip(Token.THIS)) {\n if (tn.skip(Token.COLON)) {\n isSignature = true;\n tn.discard(state);\n let t = this.parseType(tn, false);\n if (!t) return null;\n if (t.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n t.range\n );\n this.tryParseSignatureIsSignature = true;\n return null;\n }\n thisType = t;\n } else {\n tn.reset(state);\n this.tryParseSignatureIsSignature = false;\n return null;\n }\n } else if (tn.skipIdentifier()) {\n let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range(tn.tokenPos, tn.pos));\n if (tn.skip(Token.QUESTION)) {\n isSignature = true;\n tn.discard(state);\n if (kind == ParameterKind.REST) {\n this.error(\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\n tn.range()\n ); // recoverable\n } else {\n kind = ParameterKind.OPTIONAL;\n }\n }\n if (tn.skip(Token.COLON)) {\n isSignature = true;\n tn.discard(state);\n let type = this.parseType(tn); // not suppressing errors because known\n if (!type) {\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n let param = new ParameterNode();\n param.parameterKind = kind;\n param.name = name;\n param.type = type;\n if (!parameters) parameters = [ param ];\n else parameters.push(param);\n } else {\n if (isSignature) {\n this.error(\n DiagnosticCode.Type_expected,\n tn.range()\n ); // recoverable\n }\n }\n } else {\n if (isSignature) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n } else {\n tn.reset(state);\n }\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n } while (tn.skip(Token.COMMA));\n if (!tn.skip(Token.CLOSEPAREN)) {\n if (isSignature) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n } else {\n tn.reset(state);\n }\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n }\n\n var returnType: CommonTypeNode | null;\n if (tn.skip(Token.EQUALS_GREATERTHAN)) {\n isSignature = true;\n tn.discard(state);\n returnType = this.parseType(tn);\n if (!returnType) {\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n } else {\n if (isSignature) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"=>\"\n );\n } else {\n tn.reset(state);\n }\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n this.tryParseSignatureIsSignature = true;\n return Node.createSignature(\n parameters || [],\n returnType,\n thisType,\n false,\n tn.range(startPos, tn.pos)\n );\n }\n\n // statements\n\n parseDecorator(\n tn: Tokenizer\n ): DecoratorNode | null {\n\n // at '@': Identifier ('.' Identifier)* '(' Arguments\n\n var startPos = tn.tokenPos;\n if (tn.skipIdentifier()) {\n let name = tn.readIdentifier();\n let expression: Expression = Node.createIdentifierExpression(name, tn.range(startPos, tn.pos));\n while (tn.skip(Token.DOT)) {\n if (tn.skipIdentifier()) {\n name = tn.readIdentifier();\n expression = Node.createPropertyAccessExpression(\n expression,\n Node.createIdentifierExpression(name, tn.range()),\n tn.range(startPos, tn.pos)\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n }\n let args: Expression[] | null;\n if (tn.skip(Token.OPENPAREN)) {\n args = this.parseArguments(tn);\n if (args) {\n return Node.createDecorator(expression, args, tn.range(startPos, tn.pos));\n }\n } else {\n return Node.createDecorator(expression, null, tn.range(startPos, tn.pos));\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseVariable(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): VariableStatement | null {\n\n // at ('const' | 'let' | 'var'): VariableDeclaration (',' VariableDeclaration)* ';'?\n\n var members = new Array();\n do {\n let member = this.parseVariableDeclaration(tn, flags, decorators);\n if (!member) return null;\n members.push(member);\n } while (tn.skip(Token.COMMA));\n\n var ret = Node.createVariableStatement(members, decorators, flags, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseVariableDeclaration(\n tn: Tokenizer,\n parentFlags: CommonFlags,\n parentDecorators: DecoratorNode[] | null\n ): VariableDeclaration | null {\n\n // before: Identifier (':' Type)? ('=' Expression)?\n\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n var flags = parentFlags;\n if (tn.skip(Token.EXCLAMATION)) {\n flags |= CommonFlags.DEFINITE_ASSIGNMENT;\n }\n\n var type: CommonTypeNode | null = null;\n if (tn.skip(Token.COLON)) {\n type = this.parseType(tn);\n }\n\n var initializer: Expression | null = null;\n if (tn.skip(Token.EQUALS)) {\n if (flags & CommonFlags.AMBIENT) {\n this.error(\n DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,\n tn.range()\n ); // recoverable\n }\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!initializer) return null;\n } else {\n if (flags & CommonFlags.CONST) {\n if (!(flags & CommonFlags.AMBIENT)) {\n this.error(\n DiagnosticCode._const_declarations_must_be_initialized,\n identifier.range\n ); // recoverable\n }\n } else if (!type) { // neither type nor initializer\n this.error(\n DiagnosticCode.Type_expected,\n tn.range(tn.pos)\n ); // recoverable\n }\n }\n var range = Range.join(identifier.range, tn.range());\n if ((flags & CommonFlags.DEFINITE_ASSIGNMENT) && initializer) {\n this.error(\n DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,\n range);\n }\n return Node.createVariableDeclaration(\n identifier,\n type,\n initializer,\n parentDecorators,\n flags,\n range\n );\n }\n\n parseEnum(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): EnumDeclaration | null {\n\n // at 'enum': Identifier '{' (EnumValueDeclaration (',' EnumValueDeclaration )*)? '}' ';'?\n\n if (tn.next() != Token.IDENTIFIER) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n if (tn.next() != Token.OPENBRACE) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n return null;\n }\n var members = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let member = this.parseEnumValue(tn, CommonFlags.NONE);\n if (!member) return null;\n members.push(member);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACE)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n return null;\n }\n }\n }\n var ret = Node.createEnumDeclaration(\n identifier,\n members,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseEnumValue(\n tn: Tokenizer,\n parentFlags: CommonFlags\n ): EnumValueDeclaration | null {\n\n // before: Identifier ('=' Expression)?\n\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n var value: Expression | null = null;\n if (tn.skip(Token.EQUALS)) {\n value = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!value) return null;\n }\n return Node.createEnumValueDeclaration(\n identifier,\n value,\n parentFlags,\n Range.join(identifier.range, tn.range())\n );\n }\n\n parseReturn(\n tn: Tokenizer\n ): ReturnStatement | null {\n\n // at 'return': Expression | (';' | '}' | ...'\\n')\n\n var expr: Expression | null = null;\n if (\n tn.peek(true) != Token.SEMICOLON &&\n tn.nextToken != Token.CLOSEBRACE &&\n !tn.nextTokenOnNewLine\n ) {\n if (!(expr = this.parseExpression(tn))) return null;\n }\n\n var ret = Node.createReturnStatement(expr, tn.range());\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseTypeParameters(\n tn: Tokenizer\n ): TypeParameterNode[] | null {\n\n // at '<': TypeParameter (',' TypeParameter)* '>'\n\n var typeParameters = new Array();\n var seenOptional = false;\n while (!tn.skip(Token.GREATERTHAN)) {\n let typeParameter = this.parseTypeParameter(tn);\n if (!typeParameter) return null;\n if (typeParameter.defaultType !== null) {\n seenOptional = true;\n } else if (seenOptional) {\n this.error(\n DiagnosticCode.Required_type_parameters_may_not_follow_optional_type_parameters,\n typeParameter.range\n );\n typeParameter.defaultType = null;\n }\n typeParameters.push(typeParameter);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.GREATERTHAN)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \">\"\n );\n return null;\n }\n }\n }\n if (typeParameters.length === 0) {\n this.error(\n DiagnosticCode.Type_parameter_list_cannot_be_empty,\n tn.range()\n ); // recoverable\n }\n return typeParameters;\n }\n\n parseTypeParameter(\n tn: Tokenizer\n ): TypeParameterNode | null {\n\n // before: Identifier ('extends' Type)? ('=' Type)?\n\n if (tn.next() == Token.IDENTIFIER) {\n let identifier = Node.createIdentifierExpression(\n tn.readIdentifier(),\n tn.range()\n );\n let extendsType: TypeNode | null = null;\n if (tn.skip(Token.EXTENDS)) {\n let t = this.parseType(tn);\n if (!t) return null;\n if (t.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n t.range\n );\n return null;\n }\n extendsType = t;\n }\n let defaultType: TypeNode | null = null;\n if (tn.skip(Token.EQUALS)) {\n let t = this.parseType(tn);\n if (!t) return null;\n if (t.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n t.range\n );\n return null;\n }\n defaultType = t;\n }\n return Node.createTypeParameter(\n identifier,\n extendsType,\n defaultType,\n Range.join(identifier.range, tn.range())\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n private parseParametersThis: TypeNode | null = null;\n\n parseParameters(\n tn: Tokenizer,\n isConstructor: bool = false\n ): ParameterNode[] | null {\n\n // at '(': (Parameter (',' Parameter)*)? ')'\n\n var parameters = new Array();\n var seenRest: ParameterNode | null = null;\n var seenOptional = false;\n var reportedRest = false;\n var thisType: CommonTypeNode | null = null;\n\n // check if there is a leading `this` parameter\n this.parseParametersThis = null;\n if (tn.skip(Token.THIS)) {\n if (tn.skip(Token.COLON)) {\n thisType = this.parseType(tn); // reports\n if (!thisType) return null;\n if (thisType.kind == NodeKind.TYPE) {\n this.parseParametersThis = thisType;\n } else {\n this.error(\n DiagnosticCode.Operation_not_supported,\n thisType.range\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n return null;\n }\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEPAREN)) {\n return parameters;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n }\n }\n\n while (!tn.skip(Token.CLOSEPAREN)) {\n let param = this.parseParameter(tn, isConstructor); // reports\n if (!param) return null;\n if (seenRest && !reportedRest) {\n this.error(\n DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,\n seenRest.name.range\n );\n reportedRest = true;\n }\n switch (param.parameterKind) {\n default: {\n if (seenOptional) {\n this.error(\n DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,\n param.name.range\n );\n }\n break;\n }\n case ParameterKind.OPTIONAL: {\n seenOptional = true;\n break;\n }\n case ParameterKind.REST: {\n seenRest = param;\n break;\n }\n }\n parameters.push(param);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEPAREN)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n }\n }\n return parameters;\n }\n\n parseParameter(\n tn: Tokenizer,\n isConstructor: bool = false\n ): ParameterNode | null {\n\n // before: ('public' | 'private' | 'protected' | '...')? Identifier '?'? (':' Type)? ('=' Expression)?\n\n var isRest = false;\n var isOptional = false;\n var startRange: Range | null = null;\n var accessFlags: CommonFlags = CommonFlags.NONE;\n if (isConstructor) {\n if (tn.skip(Token.PUBLIC)) {\n startRange = tn.range();\n accessFlags |= CommonFlags.PUBLIC;\n } else if (tn.skip(Token.PROTECTED)) {\n startRange = tn.range();\n accessFlags |= CommonFlags.PROTECTED;\n } else if (tn.skip(Token.PRIVATE)) {\n startRange = tn.range();\n accessFlags |= CommonFlags.PRIVATE;\n }\n if (tn.peek() == Token.READONLY) {\n let state = tn.mark();\n tn.next();\n if (tn.peek() != Token.COLON) { // modifier\n tn.discard(state);\n if (!startRange) startRange = tn.range();\n accessFlags |= CommonFlags.READONLY;\n } else { // identifier\n tn.reset(state);\n }\n }\n }\n if (tn.skip(Token.DOT_DOT_DOT)) {\n if (accessFlags) {\n this.error(\n DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,\n tn.range()\n );\n } else {\n startRange = tn.range();\n }\n isRest = true;\n }\n if (tn.skipIdentifier()) {\n if (!isRest) startRange = tn.range();\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let type: CommonTypeNode | null = null;\n if (isOptional = tn.skip(Token.QUESTION)) {\n if (isRest) {\n this.error(\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\n identifier.range\n );\n }\n }\n if (tn.skip(Token.COLON)) {\n type = this.parseType(tn);\n if (!type) return null;\n } else {\n type = Node.createOmittedType(tn.range(tn.pos));\n }\n let initializer: Expression | null = null;\n if (tn.skip(Token.EQUALS)) {\n if (isRest) {\n this.error(\n DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,\n identifier.range\n );\n }\n if (isOptional) {\n this.error(\n DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,\n identifier.range\n );\n } else {\n isOptional = true;\n }\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!initializer) return null;\n }\n let param = Node.createParameter(\n identifier,\n type,\n initializer,\n isRest\n ? ParameterKind.REST\n : isOptional\n ? ParameterKind.OPTIONAL\n : ParameterKind.DEFAULT,\n Range.join(startRange, tn.range())\n );\n param.flags |= accessFlags;\n return param;\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseFunction(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): FunctionDeclaration | null {\n\n // at 'function':\n // Identifier\n // ('<' TypeParameters)?\n // '(' Parameters (':' Type)?\n // '{' Statement* '}'\n // ';'?\n\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range(tn.pos)\n );\n return null;\n }\n\n var name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n var signatureStart: i32 = -1;\n\n var typeParameters: TypeParameterNode[] | null = null;\n if (tn.skip(Token.LESSTHAN)) {\n signatureStart = tn.tokenPos;\n typeParameters = this.parseTypeParameters(tn);\n if (!typeParameters) return null;\n flags |= CommonFlags.GENERIC;\n }\n\n if (!tn.skip(Token.OPENPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"(\"\n );\n return null;\n }\n\n if (signatureStart < 0) {\n signatureStart = tn.tokenPos;\n }\n\n var parameters = this.parseParameters(tn);\n if (!parameters) return null;\n var thisType = this.parseParametersThis;\n\n var isSetter = (flags & CommonFlags.SET) != 0;\n if (isSetter) {\n if (parameters.length != 1) {\n this.error(\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\n name.range\n ); // recoverable\n }\n if (parameters.length && parameters[0].initializer) {\n this.error(\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\n name.range\n ); // recoverable\n }\n }\n\n if (flags & CommonFlags.GET) {\n if (parameters.length) {\n this.error(\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\n name.range\n ); // recoverable\n }\n }\n\n var returnType: CommonTypeNode | null = null;\n if (tn.skip(Token.COLON)) {\n returnType = this.parseType(tn, true, isSetter);\n if (!returnType) return null;\n }\n\n if (!returnType) {\n returnType = Node.createOmittedType(\n tn.range(tn.pos)\n );\n if (!isSetter) {\n this.error(\n DiagnosticCode.Type_expected,\n returnType.range\n ); // recoverable\n }\n }\n\n var signature = Node.createSignature(\n parameters,\n returnType,\n thisType,\n false,\n tn.range(signatureStart, tn.pos)\n );\n\n var body: Statement | null = null;\n if (tn.skip(Token.OPENBRACE)) {\n if (flags & CommonFlags.AMBIENT) {\n this.error(\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\n tn.range()\n ); // recoverable\n }\n\n body = this.parseBlockStatement(tn, false);\n if (!body) return null;\n } else if (!(flags & CommonFlags.AMBIENT)) {\n this.error(\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\n tn.range(tn.pos)\n );\n }\n\n var ret = Node.createFunctionDeclaration(\n name,\n typeParameters,\n signature,\n body,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseFunctionExpression(tn: Tokenizer): FunctionExpression | null {\n var startPos = tn.tokenPos;\n var name: IdentifierExpression;\n var isArrow = false;\n\n // either at 'function':\n // Identifier?\n // '(' Parameters (':' Type)?\n // Statement\n\n if (tn.token == Token.FUNCTION) {\n if (tn.skipIdentifier()) {\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else { // empty name\n name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\n }\n if (!tn.skip(Token.OPENPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"(\"\n );\n return null;\n }\n\n // or at '(' of arrow function:\n // Parameters (':' Type)?\n // Statement\n\n } else {\n isArrow = true;\n assert(tn.token == Token.OPENPAREN);\n name = Node.createEmptyIdentifierExpression(tn.range(tn.tokenPos));\n }\n\n // TODO: type parameters? doesn't seem worth it.\n\n var signatureStart = tn.pos;\n var parameters = this.parseParameters(tn);\n if (!parameters) return null;\n\n return this.parseFunctionExpressionCommon(tn, name, parameters, isArrow, startPos, signatureStart);\n }\n\n private parseFunctionExpressionCommon(\n tn: Tokenizer,\n name: IdentifierExpression,\n parameters: ParameterNode[],\n isArrow: bool,\n startPos: i32 = -1,\n signatureStart: i32 = -1\n ): FunctionExpression | null {\n if (startPos < 0) startPos = name.range.start;\n if (signatureStart < 0) signatureStart = startPos;\n\n var returnType: CommonTypeNode | null = null;\n if (tn.skip(Token.COLON)) {\n returnType = this.parseType(tn);\n if (!returnType) return null;\n } else {\n returnType = Node.createOmittedType(tn.range(tn.pos));\n this.error(\n DiagnosticCode.Type_expected,\n returnType.range\n ); // recoverable\n }\n\n if (isArrow) {\n if (!tn.skip(Token.EQUALS_GREATERTHAN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"=>\"\n );\n return null;\n }\n }\n\n var signature = Node.createSignature(\n parameters,\n returnType,\n null, // TODO?\n false,\n tn.range(signatureStart, tn.pos)\n );\n\n var body: Statement | null;\n if (isArrow) {\n body = this.parseStatement(tn, false);\n } else {\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"{\"\n );\n return null;\n }\n body = this.parseBlockStatement(tn, false);\n }\n if (!body) return null;\n\n var declaration = Node.createFunctionDeclaration(\n name,\n null,\n signature,\n body,\n null,\n isArrow ? CommonFlags.ARROW : CommonFlags.NONE,\n tn.range(startPos, tn.pos)\n );\n return Node.createFunctionExpression(declaration);\n }\n\n parseClassOrInterface(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): ClassDeclaration | null {\n\n // at ('class' | 'interface'):\n // Identifier\n // ('<' TypeParameters)?\n // ('extends' Type)?\n // ('implements' Type (',' Type)*)?\n // '{' ClassMember* '}'\n\n var isInterface = tn.token == Token.INTERFACE;\n\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n\n var identifier = Node.createIdentifierExpression(\n tn.readIdentifier(),\n tn.range()\n );\n\n var typeParameters: TypeParameterNode[] | null;\n if (tn.skip(Token.LESSTHAN)) {\n typeParameters = this.parseTypeParameters(tn);\n if (!typeParameters) return null;\n flags |= CommonFlags.GENERIC;\n } else {\n typeParameters = [];\n }\n\n var extendsType: TypeNode | null = null;\n if (tn.skip(Token.EXTENDS)) {\n let t = this.parseType(tn);\n if (!t) return null;\n if (t.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n t.range\n );\n return null;\n }\n extendsType = t;\n }\n\n var implementsTypes: TypeNode[] | null = null;\n if (tn.skip(Token.IMPLEMENTS)) {\n if (isInterface) {\n this.error(\n DiagnosticCode.Interface_declaration_cannot_have_implements_clause,\n tn.range()\n ); // recoverable\n }\n do {\n let type = this.parseType(tn);\n if (!type) return null;\n if (!isInterface) {\n if (!implementsTypes) implementsTypes = [];\n implementsTypes.push(type);\n }\n } while (tn.skip(Token.COMMA));\n }\n\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n return null;\n }\n\n var members = new Array();\n var declaration: ClassDeclaration;\n if (isInterface) {\n assert(!implementsTypes);\n declaration = Node.createInterfaceDeclaration(\n identifier,\n typeParameters,\n extendsType,\n members,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n } else {\n declaration = Node.createClassDeclaration(\n identifier,\n typeParameters,\n extendsType,\n implementsTypes,\n members,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n }\n if (!tn.skip(Token.CLOSEBRACE)) {\n do {\n let member = this.parseClassMember(tn, declaration);\n if (!member) return null;\n member.parent = declaration;\n members.push(member);\n } while (!tn.skip(Token.CLOSEBRACE));\n }\n return declaration;\n }\n\n parseClassExpression(tn: Tokenizer): ClassExpression | null {\n\n // at 'class': Identifier? '{' ... '}'\n\n var startPos = tn.tokenPos;\n var name: IdentifierExpression;\n\n if (tn.skipIdentifier()) {\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\n }\n\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"{\"\n );\n return null;\n }\n\n var members = new Array();\n var declaration = Node.createClassDeclaration(\n name,\n [],\n null,\n null,\n members,\n null,\n CommonFlags.NONE,\n tn.range(startPos, tn.pos)\n );\n if (!tn.skip(Token.CLOSEBRACE)) {\n do {\n let member = this.parseClassMember(tn, declaration);\n if (!member) return null;\n member.parent = declaration;\n members.push(member);\n } while (!tn.skip(Token.CLOSEBRACE));\n }\n return Node.createClassExpression(declaration);\n }\n\n parseClassMember(\n tn: Tokenizer,\n parent: ClassDeclaration\n ): DeclarationStatement | null {\n\n // before:\n // ('public' | 'private' | 'protected')?\n // ('static' | 'abstract')?\n // 'readonly'?\n // ('get' | 'set')?\n // Identifier ...\n\n var startPos = tn.pos;\n var isInterface = parent.kind == NodeKind.INTERFACEDECLARATION;\n\n var decorators = new Array();\n if (tn.skip(Token.AT)) {\n do {\n let decorator = this.parseDecorator(tn);\n if (!decorator) break;\n decorators.push(decorator);\n } while (tn.skip(Token.AT));\n if (isInterface) {\n this.error(\n DiagnosticCode.Decorators_are_not_valid_here,\n Range.join(decorators[0].range, decorators[decorators.length - 1].range)\n );\n }\n }\n\n // inherit ambient status\n var flags = parent.flags & CommonFlags.AMBIENT;\n\n // implemented methods are virtual\n if (isInterface) flags |= CommonFlags.VIRTUAL;\n\n var accessStart = 0;\n var accessEnd = 0;\n if (tn.skip(Token.PUBLIC)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"public\"\n );\n }\n flags |= CommonFlags.PUBLIC;\n accessStart = tn.tokenPos;\n accessEnd = tn.pos;\n } else if (tn.skip(Token.PRIVATE)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"private\"\n );\n }\n flags |= CommonFlags.PRIVATE;\n accessStart = tn.tokenPos;\n accessEnd = tn.pos;\n } else if (tn.skip(Token.PROTECTED)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"protected\"\n );\n }\n flags |= CommonFlags.PROTECTED;\n accessStart = tn.tokenPos;\n accessEnd = tn.pos;\n }\n\n var staticStart = 0;\n var staticEnd = 0;\n var abstractStart = 0;\n var abstractEnd = 0;\n if (tn.skip(Token.STATIC)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"static\"\n );\n }\n flags |= CommonFlags.STATIC;\n staticStart = tn.tokenPos;\n staticEnd = tn.pos;\n } else {\n flags |= CommonFlags.INSTANCE;\n if (tn.skip(Token.ABSTRACT)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"abstract\"\n );\n }\n flags |= CommonFlags.ABSTRACT;\n abstractStart = tn.tokenPos;\n abstractEnd = tn.pos;\n }\n if (parent.flags & CommonFlags.GENERIC) flags |= CommonFlags.GENERIC_CONTEXT;\n }\n\n var readonlyStart: i32 = 0;\n var readonlyEnd: i32 = 0;\n if (tn.skip(Token.READONLY)) {\n flags |= CommonFlags.READONLY;\n readonlyStart = tn.tokenPos;\n readonlyEnd = tn.pos;\n }\n\n // check if accessor: ('get' | 'set') ^\\n Identifier\n var state = tn.mark();\n var isConstructor = false;\n var isGetter = false;\n var getStart: i32 = 0;\n var getEnd: i32 = 0;\n var isSetter = false;\n var setStart: i32 = 0;\n var setEnd: i32 = 0;\n if (!isInterface) {\n if (tn.skip(Token.GET)) {\n if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\n flags |= CommonFlags.GET;\n isGetter = true;\n setStart = tn.tokenPos;\n setEnd = tn.pos;\n if (flags & CommonFlags.READONLY) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\n ); // recoverable\n }\n } else {\n tn.reset(state);\n }\n } else if (tn.skip(Token.SET)) {\n if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\n flags |= CommonFlags.SET;\n isSetter = true;\n setStart = tn.tokenPos;\n setEnd = tn.pos;\n if (flags & CommonFlags.READONLY) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\n ); // recoverable\n }\n } else {\n tn.reset(state);\n }\n } else if (tn.skip(Token.CONSTRUCTOR)) {\n flags |= CommonFlags.CONSTRUCTOR;\n isConstructor = true;\n if (flags & CommonFlags.STATIC) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(staticStart, staticEnd), \"static\"\n ); // recoverable\n }\n if (flags & CommonFlags.ABSTRACT) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(abstractStart, abstractEnd), \"abstract\"\n ); // recoverable\n }\n if (flags & CommonFlags.READONLY) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\n ); // recoverable\n }\n }\n }\n\n var name: IdentifierExpression;\n if (isConstructor) {\n name = Node.createConstructorExpression(tn.range());\n } else {\n if (!(isGetter || isSetter) && tn.skip(Token.OPENBRACKET)) {\n // TODO: also handle symbols, which might have some of these modifiers\n if (flags & CommonFlags.PUBLIC) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(accessStart, accessEnd), \"public\"\n ); // recoverable\n } else if (flags & CommonFlags.PROTECTED) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(accessStart, accessEnd), \"protected\"\n ); // recoverable\n } else if (flags & CommonFlags.PRIVATE) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(accessStart, accessEnd), \"protected\"\n ); // recoverable\n }\n if (flags & CommonFlags.STATIC) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(staticStart, staticEnd), \"static\"\n ); // recoverable\n }\n if (flags & CommonFlags.ABSTRACT) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(abstractStart, abstractEnd), \"abstract\"\n ); // recoverable\n }\n if (flags & CommonFlags.READONLY) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\n ); // recoverable\n }\n let retIndex = this.parseIndexSignatureDeclaration(tn, decorators);\n if (!retIndex) return null;\n tn.skip(Token.SEMICOLON);\n return retIndex;\n }\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n }\n var typeParameters: TypeParameterNode[] | null = null;\n if (tn.skip(Token.LESSTHAN)) {\n let typeParametersStart = tn.tokenPos;\n typeParameters = this.parseTypeParameters(tn);\n if (!typeParameters) return null;\n if (isConstructor) {\n this.error(\n DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,\n tn.range(typeParametersStart, tn.pos)\n ); // recoverable\n } else if (isGetter || isSetter) {\n this.error(\n DiagnosticCode.An_accessor_cannot_have_type_parameters,\n tn.range(typeParametersStart, tn.pos)\n ); // recoverable\n } else {\n flags |= CommonFlags.GENERIC;\n }\n }\n\n // method: '(' Parameters (':' Type)? '{' Statement* '}' ';'?\n if (tn.skip(Token.OPENPAREN)) {\n let signatureStart = tn.tokenPos;\n let parameters = this.parseParameters(tn, isConstructor);\n if (!parameters) return null;\n let thisType = this.parseParametersThis;\n if (isConstructor) {\n for (let i = 0, k = parameters.length; i < k; ++i) {\n let parameter = parameters[i];\n if (parameter.isAny(\n CommonFlags.PUBLIC |\n CommonFlags.PROTECTED |\n CommonFlags.PRIVATE |\n CommonFlags.READONLY\n )) {\n let implicitFieldDeclaration = Node.createFieldDeclaration(\n parameter.name,\n parameter.type,\n null, // initialized via parameter\n null,\n parameter.flags | CommonFlags.INSTANCE,\n parameter.range\n );\n implicitFieldDeclaration.parameterIndex = i;\n implicitFieldDeclaration.parent = parent;\n parameter.implicitFieldDeclaration = implicitFieldDeclaration;\n parent.members.push(implicitFieldDeclaration);\n }\n }\n } else if (isGetter) {\n if (parameters.length) {\n this.error(\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\n name.range\n );\n }\n } else if (isSetter) {\n if (parameters.length != 1) {\n this.error(\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\n name.range\n );\n }\n if (parameters.length && parameters[0].initializer) {\n this.error(\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\n name.range\n );\n }\n }\n\n let returnType: CommonTypeNode | null = null;\n if (tn.skip(Token.COLON)) {\n if (name.kind == NodeKind.CONSTRUCTOR) {\n this.error(\n DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration,\n tn.range()\n );\n } else if (isSetter) {\n this.error(\n DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation,\n tn.range()\n );\n }\n returnType = this.parseType(tn, name.kind == NodeKind.CONSTRUCTOR || isSetter);\n if (!returnType) return null;\n } else {\n returnType = Node.createOmittedType(tn.range(tn.pos));\n if (!isSetter && name.kind != NodeKind.CONSTRUCTOR) {\n this.error(\n DiagnosticCode.Type_expected,\n returnType.range\n ); // recoverable\n }\n }\n\n let signature = Node.createSignature(\n parameters,\n returnType,\n thisType,\n false,\n tn.range(signatureStart, tn.pos)\n );\n\n let body: Statement | null = null;\n if (tn.skip(Token.OPENBRACE)) {\n if (flags & CommonFlags.AMBIENT) {\n this.error(\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\n tn.range()\n ); // recoverable\n } else if (flags & CommonFlags.ABSTRACT) {\n this.error(\n DiagnosticCode.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract,\n tn.range(), name.text\n ); // recoverable\n }\n body = this.parseBlockStatement(tn, false);\n if (!body) return null;\n } else if (!(flags & CommonFlags.AMBIENT) && !isInterface) {\n this.error(\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\n tn.range()\n ); // recoverable\n }\n\n let retMethod = Node.createMethodDeclaration(\n name,\n typeParameters,\n signature,\n body,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return retMethod;\n\n } else if (isConstructor) {\n this.error(\n DiagnosticCode.Constructor_implementation_is_missing,\n name.range\n );\n\n } else if (isGetter || isSetter) {\n this.error(\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\n name.range\n );\n\n // field: (':' Type)? ('=' Expression)? ';'?\n } else {\n if (flags & CommonFlags.ABSTRACT) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(abstractStart, abstractEnd), \"abstract\"\n ); // recoverable\n }\n\n if (flags & CommonFlags.GET) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(getStart, getEnd), \"get\"\n ); // recoverable\n }\n\n if (flags & CommonFlags.SET) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(setStart, setEnd), \"set\"\n ); // recoverable\n }\n\n let type: CommonTypeNode | null = null;\n if (tn.skip(Token.QUESTION)) {\n this.error(\n DiagnosticCode.Optional_properties_are_not_supported,\n tn.range(startPos, tn.pos)\n );\n }\n if (tn.skip(Token.EXCLAMATION)) {\n flags |= CommonFlags.DEFINITE_ASSIGNMENT;\n }\n if (tn.skip(Token.COLON)) {\n type = this.parseType(tn);\n if (!type) return null;\n } else {\n this.error(\n DiagnosticCode.Type_expected,\n tn.range()\n ); // recoverable\n }\n let initializer: Expression | null = null;\n if (tn.skip(Token.EQUALS)) {\n initializer = this.parseExpression(tn);\n if (!initializer) return null;\n }\n let range = tn.range(startPos, tn.pos);\n if ((flags & CommonFlags.DEFINITE_ASSIGNMENT) && ((flags & CommonFlags.STATIC) || isInterface || initializer)) {\n this.error(\n DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,\n range\n );\n }\n let retField = Node.createFieldDeclaration(\n name,\n type,\n initializer,\n decorators,\n flags,\n range\n );\n tn.skip(Token.SEMICOLON);\n return retField;\n }\n return null;\n }\n\n parseIndexSignatureDeclaration(tn: Tokenizer, decorators: DecoratorNode[]): IndexSignatureDeclaration | null {\n\n // at: '[': 'key' ':' Type ']' ':' Type\n\n if (decorators.length) {\n this.error(\n DiagnosticCode.Decorators_are_not_valid_here,\n Range.join(decorators[0].range, decorators[decorators.length - 1].range)\n ); // recoverable\n }\n\n var start = tn.tokenPos;\n if (tn.skipIdentifier()) {\n let id = tn.readIdentifier();\n if (id == \"key\") {\n if (tn.skip(Token.COLON)) {\n let keyType = this.parseType(tn);\n if (!keyType) return null;\n if (keyType.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Type_expected,\n tn.range()\n );\n return null;\n }\n if (tn.skip(Token.CLOSEBRACKET)) {\n if (tn.skip(Token.COLON)) {\n let valueType = this.parseType(tn);\n if (!valueType) return null;\n return Node.createIndexSignatureDeclaration(keyType, valueType, tn.range(start, tn.pos));\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"]\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"key\"\n );\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseNamespace(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): NamespaceDeclaration | null {\n\n // at 'namespace': Identifier '{' (Variable | Function)* '}'\n\n if (tn.skipIdentifier()) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n if (tn.skip(Token.OPENBRACE)) {\n let members = new Array();\n let ns = Node.createNamespaceDeclaration(\n identifier,\n members,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n while (!tn.skip(Token.CLOSEBRACE)) {\n let member = this.parseTopLevelStatement(tn, ns);\n if (!member) return null;\n member.parent = ns;\n members.push(member);\n }\n tn.skip(Token.SEMICOLON);\n return ns;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseExport(\n tn: Tokenizer,\n flags: CommonFlags,\n startPos: i32\n ): ExportStatement | null {\n\n // at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?\n\n var path: StringLiteralExpression | null = null;\n if (tn.skip(Token.OPENBRACE)) {\n let members = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let member = this.parseExportMember(tn);\n if (!member) return null;\n members.push(member);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACE)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n return null;\n }\n }\n }\n if (tn.skip(Token.FROM)) {\n if (tn.skip(Token.STRINGLITERAL)) {\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\n } else {\n this.error(\n DiagnosticCode.String_literal_expected,\n tn.range()\n );\n return null;\n }\n }\n let ret = Node.createExportStatement(members, path, flags, tn.range(startPos, tn.pos));\n let internalPath = ret.internalPath;\n if (internalPath !== null && !this.seenlog.has(internalPath)) {\n this.backlog.push(internalPath);\n this.seenlog.add(internalPath);\n }\n tn.skip(Token.SEMICOLON);\n return ret;\n } else if (tn.skip(Token.ASTERISK)) {\n if (tn.skip(Token.FROM)) {\n if (tn.skip(Token.STRINGLITERAL)) {\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\n let ret = Node.createExportStatement(null, path, flags, tn.range(startPos, tn.pos));\n let internalPath = assert(ret.internalPath);\n let source = tn.source;\n if (!source.exportPaths) source.exportPaths = new Set();\n source.exportPaths.add(internalPath);\n if (!this.seenlog.has(internalPath)) {\n this.backlog.push(internalPath);\n this.seenlog.add(internalPath);\n }\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode.String_literal_expected,\n tn.range()\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"from\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n }\n return null;\n }\n\n parseExportMember(\n tn: Tokenizer\n ): ExportMember | null {\n\n // before: Identifier ('as' Identifier)?\n\n if (tn.skipIdentifier()) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let asIdentifier: IdentifierExpression | null = null;\n if (tn.skip(Token.AS)) {\n if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n }\n return Node.createExportMember(\n identifier,\n asIdentifier,\n asIdentifier\n ? Range.join(identifier.range, asIdentifier.range)\n : identifier.range\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseImport(\n tn: Tokenizer\n ): ImportStatement | null {\n\n // at 'import':\n // ('{' (ImportMember (',' ImportMember)* '}') | ('*' 'as' Identifier)?\n // 'from' StringLiteral ';'?\n\n var startPos = tn.tokenPos;\n var members: ImportDeclaration[] | null = null;\n var namespaceName: IdentifierExpression | null = null;\n var skipFrom = false;\n if (tn.skip(Token.OPENBRACE)) {\n members = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let member = this.parseImportDeclaration(tn);\n if (!member) return null;\n members.push(member);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACE)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n return null;\n }\n }\n }\n } else if (tn.skip(Token.ASTERISK)) {\n if (tn.skip(Token.AS)) {\n if (tn.skipIdentifier()) {\n namespaceName = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"as\"\n );\n return null;\n }\n } else {\n skipFrom = true;\n }\n\n if (skipFrom || tn.skip(Token.FROM)) {\n if (tn.skip(Token.STRINGLITERAL)) {\n let path = Node.createStringLiteralExpression(tn.readString(), tn.range());\n let ret: ImportStatement;\n if (namespaceName) {\n assert(!members);\n ret = Node.createImportStatementWithWildcard(namespaceName, path, tn.range(startPos, tn.pos));\n } else {\n ret = Node.createImportStatement(members, path, tn.range(startPos, tn.pos));\n }\n let internalPath = ret.internalPath;\n if (!this.seenlog.has(internalPath)) {\n this.backlog.push(internalPath);\n this.seenlog.add(internalPath);\n }\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode.String_literal_expected,\n tn.range()\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"from\"\n );\n }\n return null;\n }\n\n parseImportDeclaration(\n tn: Tokenizer\n ): ImportDeclaration | null {\n\n // before: Identifier ('as' Identifier)?\n\n if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let asIdentifier: IdentifierExpression | null = null;\n if (tn.skip(Token.AS)) {\n if (tn.skipIdentifier()) {\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n }\n return Node.createImportDeclaration(\n identifier,\n asIdentifier,\n asIdentifier\n ? Range.join(identifier.range, asIdentifier.range)\n : identifier.range\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseExportImport(\n tn: Tokenizer,\n startPos: i32\n ): ExportImportStatement | null {\n\n // at 'export' 'import': Identifier ('=' Identifier)? ';'?\n\n if (tn.skipIdentifier()) {\n let asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n if (tn.skip(Token.EQUALS)) {\n if (tn.skipIdentifier()) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let ret = Node.createExportImportStatement(identifier, asIdentifier, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"=\"\n );\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseStatement(\n tn: Tokenizer,\n topLevel: bool = false\n ): Statement | null {\n\n // at previous token\n\n var state = tn.mark();\n var token = tn.next();\n var statement: Statement | null = null;\n switch (token) {\n case Token.BREAK: {\n statement = this.parseBreak(tn);\n break;\n }\n case Token.CONST: {\n statement = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\n break;\n }\n case Token.CONTINUE: {\n statement = this.parseContinue(tn);\n break;\n }\n case Token.DO: {\n statement = this.parseDoStatement(tn);\n break;\n }\n case Token.FOR: {\n statement = this.parseForStatement(tn);\n break;\n }\n case Token.IF: {\n statement = this.parseIfStatement(tn);\n break;\n }\n case Token.LET: {\n statement = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\n break;\n }\n case Token.VAR: {\n statement = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\n break;\n }\n case Token.OPENBRACE: {\n statement = this.parseBlockStatement(tn, topLevel);\n break;\n }\n case Token.RETURN: {\n if (topLevel) {\n this.error(\n DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body,\n tn.range()\n ); // recoverable\n }\n statement = this.parseReturn(tn);\n break;\n }\n case Token.SEMICOLON: {\n return Node.createEmptyStatement(tn.range(tn.tokenPos));\n }\n case Token.SWITCH: {\n statement = this.parseSwitchStatement(tn);\n break;\n }\n case Token.THROW: {\n statement = this.parseThrowStatement(tn);\n break;\n }\n case Token.TRY: {\n statement = this.parseTryStatement(tn);\n break;\n }\n case Token.VOID: {\n statement = this.parseVoidStatement(tn);\n break;\n }\n case Token.WHILE: {\n statement = this.parseWhileStatement(tn);\n break;\n }\n case Token.TYPE: { // also identifier\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\n statement = this.parseTypeDeclaration(tn, CommonFlags.NONE, null, tn.tokenPos);\n break;\n }\n // fall-through\n }\n default: {\n tn.reset(state);\n statement = this.parseExpressionStatement(tn);\n break;\n }\n }\n if (!statement) { // has been reported\n tn.reset(state);\n this.skipStatement(tn);\n } else {\n tn.discard(state);\n }\n return statement;\n }\n\n parseBlockStatement(\n tn: Tokenizer,\n topLevel: bool\n ): BlockStatement | null {\n\n // at '{': Statement* '}' ';'?\n\n var startPos = tn.tokenPos;\n var statements = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let state = tn.mark();\n let statement = this.parseStatement(tn, topLevel);\n if (!statement) {\n if (tn.token == Token.ENDOFFILE) return null;\n tn.reset(state);\n this.skipStatement(tn);\n } else {\n tn.discard(state);\n statements.push(statement);\n }\n }\n var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseBreak(\n tn: Tokenizer\n ): BreakStatement | null {\n\n // at 'break': Identifier? ';'?\n\n var identifier: IdentifierExpression | null = null;\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\n tn.next(IdentifierHandling.PREFER);\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n }\n var ret = Node.createBreakStatement(identifier, tn.range());\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseContinue(\n tn: Tokenizer\n ): ContinueStatement | null {\n\n // at 'continue': Identifier? ';'?\n\n var identifier: IdentifierExpression | null = null;\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\n tn.next(IdentifierHandling.PREFER);\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n }\n var ret = Node.createContinueStatement(identifier, tn.range());\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseDoStatement(\n tn: Tokenizer\n ): DoStatement | null {\n\n // at 'do': Statement 'while' '(' Expression ')' ';'?\n\n var startPos = tn.tokenPos;\n var statement = this.parseStatement(tn);\n if (!statement) return null;\n\n if (tn.skip(Token.WHILE)) {\n\n if (tn.skip(Token.OPENPAREN)) {\n let condition = this.parseExpression(tn);\n if (!condition) return null;\n\n if (tn.skip(Token.CLOSEPAREN)) {\n let ret = Node.createDoStatement(statement, condition, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"while\"\n );\n }\n return null;\n }\n\n parseExpressionStatement(\n tn: Tokenizer\n ): ExpressionStatement | null {\n\n // at previous token\n\n var expr = this.parseExpression(tn);\n if (!expr) return null;\n\n var ret = Node.createExpressionStatement(expr);\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseForStatement(\n tn: Tokenizer\n ): ForStatement | null {\n\n // at 'for': '(' Statement? Expression? ';' Expression? ')' Statement\n\n var startPos = tn.tokenPos;\n\n if (tn.skip(Token.OPENPAREN)) {\n let initializer: Statement | null = null;\n\n if (tn.skip(Token.CONST)) {\n initializer = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\n } else if (tn.skip(Token.LET)) {\n initializer = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\n } else if (tn.skip(Token.VAR)) {\n initializer = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\n\n } else if (!tn.skip(Token.SEMICOLON)) {\n initializer = this.parseExpressionStatement(tn);\n if (!initializer) return null;\n }\n\n if (tn.token == Token.SEMICOLON) {\n let condition: ExpressionStatement | null = null;\n if (!tn.skip(Token.SEMICOLON)) {\n condition = this.parseExpressionStatement(tn);\n if (!condition) return null;\n }\n\n if (tn.token == Token.SEMICOLON) {\n let incrementor: Expression | null = null;\n if (!tn.skip(Token.CLOSEPAREN)) {\n incrementor = this.parseExpression(tn);\n if (!incrementor) return null;\n\n if (!tn.skip(Token.CLOSEPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n }\n\n let statement = this.parseStatement(tn);\n if (!statement) return null;\n\n return Node.createForStatement(\n initializer,\n condition\n ? condition.expression\n : null,\n incrementor,\n statement,\n tn.range(startPos, tn.pos)\n );\n\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \";\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \";\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n return null;\n }\n\n parseIfStatement(\n tn: Tokenizer\n ): IfStatement | null {\n\n // at 'if': '(' Expression ')' Statement ('else' Statement)?\n\n var startPos = tn.tokenPos;\n if (tn.skip(Token.OPENPAREN)) {\n let condition = this.parseExpression(tn);\n if (!condition) return null;\n if (tn.skip(Token.CLOSEPAREN)) {\n let statement = this.parseStatement(tn);\n if (!statement) return null;\n let elseStatement: Statement | null = null;\n if (tn.skip(Token.ELSE)) {\n elseStatement = this.parseStatement(tn);\n if (!elseStatement) return null;\n }\n return Node.createIfStatement(\n condition,\n statement,\n elseStatement,\n tn.range(startPos, tn.pos)\n );\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n return null;\n }\n\n parseSwitchStatement(\n tn: Tokenizer\n ): SwitchStatement | null {\n\n // at 'switch': '(' Expression ')' '{' SwitchCase* '}' ';'?\n\n var startPos = tn.tokenPos;\n if (tn.skip(Token.OPENPAREN)) {\n let condition = this.parseExpression(tn);\n if (!condition) return null;\n if (tn.skip(Token.CLOSEPAREN)) {\n if (tn.skip(Token.OPENBRACE)) {\n let cases = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let case_ = this.parseSwitchCase(tn);\n if (!case_) return null;\n cases.push(case_);\n }\n let ret = Node.createSwitchStatement(condition, cases, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n return null;\n }\n\n parseSwitchCase(\n tn: Tokenizer\n ): SwitchCase | null {\n\n var startPos = tn.tokenPos;\n var statements: Statement[],\n statement: Statement | null;\n\n // 'case' Expression ':' Statement*\n\n if (tn.skip(Token.CASE)) {\n let label = this.parseExpression(tn);\n if (!label) return null;\n if (tn.skip(Token.COLON)) {\n statements = new Array();\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\n statement = this.parseStatement(tn);\n if (!statement) return null;\n statements.push(statement);\n }\n return Node.createSwitchCase(label, statements, tn.range(startPos, tn.pos));\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n }\n\n // 'default' ':' Statement*\n\n } else if (tn.skip(Token.DEFAULT)) {\n if (tn.skip(Token.COLON)) {\n statements = new Array();\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\n statement = this.parseStatement(tn);\n if (!statement) return null;\n statements.push(statement);\n }\n return Node.createSwitchCase(null, statements, tn.range(startPos, tn.pos));\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._case_or_default_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseThrowStatement(\n tn: Tokenizer\n ): ThrowStatement | null {\n\n // at 'throw': Expression ';'?\n\n var startPos = tn.tokenPos;\n var expression = this.parseExpression(tn);\n if (!expression) return null;\n var ret = Node.createThrowStatement(expression, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseTryStatement(\n tn: Tokenizer\n ): TryStatement | null {\n\n // at 'try':\n // '{' Statement* '}'\n // ('catch' '(' VariableMember ')' '{' Statement* '}')?\n // ('finally' '{' Statement* '}'? ';'?\n\n var startPos = tn.tokenPos;\n var stmt: Statement | null;\n if (tn.skip(Token.OPENBRACE)) {\n let statements = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n stmt = this.parseStatement(tn);\n if (!stmt) return null;\n statements.push(stmt);\n }\n let catchVariable: IdentifierExpression | null = null;\n let catchStatements: Statement[] | null = null;\n let finallyStatements: Statement[] | null = null;\n if (tn.skip(Token.CATCH)) {\n if (!tn.skip(Token.OPENPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n return null;\n }\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n catchVariable = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n if (!tn.skip(Token.CLOSEPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n return null;\n }\n catchStatements = [];\n while (!tn.skip(Token.CLOSEBRACE)) {\n stmt = this.parseStatement(tn);\n if (!stmt) return null;\n catchStatements.push(stmt);\n }\n }\n if (tn.skip(Token.FINALLY)) {\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n return null;\n }\n finallyStatements = [];\n while (!tn.skip(Token.CLOSEBRACE)) {\n stmt = this.parseStatement(tn);\n if (!stmt) return null;\n finallyStatements.push(stmt);\n }\n }\n if (!(catchStatements || finallyStatements)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"catch\"\n );\n return null;\n }\n let ret = Node.createTryStatement(\n statements,\n catchVariable,\n catchStatements,\n finallyStatements,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n }\n return null;\n }\n\n parseTypeDeclaration(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): TypeDeclaration | null {\n\n // at 'type': Identifier ('<' TypeParameters '>')? '=' Type ';'?\n\n if (tn.skipIdentifier()) {\n let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let typeParameters: TypeParameterNode[] | null = null;\n if (tn.skip(Token.LESSTHAN)) {\n typeParameters = this.parseTypeParameters(tn);\n if (!typeParameters) return null;\n flags |= CommonFlags.GENERIC;\n }\n if (tn.skip(Token.EQUALS)) {\n let type = this.parseType(tn);\n if (!type) return null;\n let ret = Node.createTypeDeclaration(\n name,\n typeParameters,\n type,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"=\"\n );\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseVoidStatement(\n tn: Tokenizer\n ): VoidStatement | null {\n\n // at 'void': Expression ';'?\n\n var startPos = tn.tokenPos;\n var expression = this.parseExpression(tn, Precedence.GROUPING);\n if (!expression) return null;\n var ret = Node.createVoidStatement(expression, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseWhileStatement(\n tn: Tokenizer\n ): WhileStatement | null {\n\n // at 'while': '(' Expression ')' Statement ';'?\n\n var startPos = tn.tokenPos;\n if (tn.skip(Token.OPENPAREN)) {\n let expression = this.parseExpression(tn);\n if (!expression) return null;\n if (tn.skip(Token.CLOSEPAREN)) {\n let statement = this.parseStatement(tn);\n if (!statement) return null;\n let ret = Node.createWhileStatement(expression, statement, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n return null;\n }\n\n // expressions\n // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing\n\n parseExpressionStart(\n tn: Tokenizer\n ): Expression | null {\n\n var token = tn.next(IdentifierHandling.PREFER);\n var startPos = tn.tokenPos;\n var precedence = determinePrecedenceStart(token);\n if (precedence != Precedence.NONE) {\n let operand: Expression | null;\n\n // TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)\n\n // NewExpression\n if (token == Token.NEW) {\n operand = this.parseExpression(tn, Precedence.CALL);\n if (!operand) return null;\n if (operand.kind == NodeKind.CALL) {\n return Node.createNewExpression(\n (operand).expression,\n (operand).typeArguments,\n (operand).arguments,\n tn.range(startPos, tn.pos)\n );\n } else {\n this.error(\n DiagnosticCode.Operation_not_supported,\n tn.range()\n );\n }\n return null;\n } else {\n operand = this.parseExpression(tn, precedence);\n if (!operand) return null;\n }\n\n // UnaryPrefixExpression\n if (token == Token.PLUS_PLUS || token == Token.MINUS_MINUS) {\n if (\n operand.kind != NodeKind.IDENTIFIER &&\n operand.kind != NodeKind.ELEMENTACCESS &&\n operand.kind != NodeKind.PROPERTYACCESS\n ) {\n this.error(\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\n operand.range\n );\n }\n }\n return Node.createUnaryPrefixExpression(token, operand, tn.range(startPos, tn.pos));\n }\n\n var expr: Expression | null = null;\n switch (token) {\n\n case Token.NULL: return Node.createNullExpression(tn.range());\n case Token.TRUE: return Node.createTrueExpression(tn.range());\n case Token.FALSE: return Node.createFalseExpression(tn.range());\n\n // ParenthesizedExpression\n // FunctionExpression\n case Token.OPENPAREN: {\n\n // determine whether this is a function expression\n if (tn.skip(Token.CLOSEPAREN)) { // must be a function expression (fast route)\n return this.parseFunctionExpressionCommon(\n tn,\n Node.createEmptyIdentifierExpression(tn.range(startPos)),\n [],\n true\n );\n }\n let state = tn.mark();\n let again = true;\n do {\n switch (tn.next(IdentifierHandling.PREFER)) {\n\n // function expression\n case Token.DOT_DOT_DOT: {\n tn.reset(state);\n return this.parseFunctionExpression(tn);\n }\n // can be both\n case Token.IDENTIFIER: {\n tn.readIdentifier();\n switch (tn.next()) {\n\n // if we got here, check for arrow\n case Token.CLOSEPAREN: {\n if (\n !tn.skip(Token.COLON) &&\n !tn.skip(Token.EQUALS_GREATERTHAN)\n ) {\n again = false;\n break;\n }\n // fall-through\n }\n // function expression\n case Token.COLON: { // type annotation\n tn.reset(state);\n return this.parseFunctionExpression(tn);\n }\n // optional parameter or parenthesized\n case Token.QUESTION: {\n if (\n tn.skip(Token.COLON) || // optional parameter with type\n tn.skip(Token.COMMA) || // optional parameter without type\n tn.skip(Token.CLOSEPAREN) // last optional parameter without type\n ) {\n tn.reset(state);\n return this.parseFunctionExpression(tn);\n }\n again = false; // parenthesized\n break;\n }\n case Token.COMMA: {\n break; // continue\n }\n // parenthesized expression\n // case Token.EQUALS: // missing type annotation for simplicity\n default: {\n again = false;\n break;\n }\n }\n break;\n }\n // parenthesized expression\n default: {\n again = false;\n break;\n }\n }\n } while (again);\n tn.reset(state);\n\n // parse parenthesized\n expr = this.parseExpression(tn);\n if (!expr) return null;\n if (!tn.skip(Token.CLOSEPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n return Node.createParenthesizedExpression(expr, tn.range(startPos, tn.pos));\n }\n // ArrayLiteralExpression\n case Token.OPENBRACKET: {\n let elementExpressions = new Array();\n while (!tn.skip(Token.CLOSEBRACKET)) {\n if (tn.peek() == Token.COMMA) {\n expr = null; // omitted\n } else {\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!expr) return null;\n }\n elementExpressions.push(expr);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACKET)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"]\"\n );\n return null;\n }\n }\n }\n return Node.createArrayLiteralExpression(elementExpressions, tn.range(startPos, tn.pos));\n }\n // ObjectLiteralExpression\n case Token.OPENBRACE: {\n let startPos = tn.tokenPos;\n let names = new Array();\n let values = new Array();\n let name: IdentifierExpression;\n while (!tn.skip(Token.CLOSEBRACE)) {\n if (!tn.skipIdentifier()) {\n if (!tn.skip(Token.STRINGLITERAL)) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range(),\n );\n return null;\n }\n name = Node.createIdentifierExpression(tn.readString(), tn.range());\n name.set(CommonFlags.QUOTED);\n } else {\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n }\n names.push(name);\n if (tn.skip(Token.COLON)) {\n let value = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!value) return null;\n values.push(value);\n } else if (!name.is(CommonFlags.QUOTED)) {\n values.push(name);\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n return null;\n }\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACE)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n return null;\n }\n }\n }\n return Node.createObjectLiteralExpression(names, values, tn.range(startPos, tn.pos));\n }\n // AssertionExpression (unary prefix)\n case Token.LESSTHAN: {\n let toType = this.parseType(tn);\n if (!toType) return null;\n if (!tn.skip(Token.GREATERTHAN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \">\"\n );\n return null;\n }\n expr = this.parseExpression(tn, Precedence.CALL);\n if (!expr) return null;\n return Node.createAssertionExpression(\n AssertionKind.PREFIX,\n expr,\n toType,\n tn.range(startPos, tn.pos)\n );\n }\n case Token.IDENTIFIER: {\n return Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));\n }\n case Token.THIS: {\n return Node.createThisExpression(tn.range(startPos, tn.pos));\n }\n case Token.CONSTRUCTOR: {\n return Node.createConstructorExpression(tn.range(startPos, tn.pos));\n }\n case Token.SUPER: {\n if (tn.peek() != Token.DOT && tn.nextToken != Token.OPENPAREN) {\n this.error(\n DiagnosticCode._super_must_be_followed_by_an_argument_list_or_member_access,\n tn.range()\n );\n }\n return Node.createSuperExpression(tn.range(startPos, tn.pos));\n }\n case Token.STRINGLITERAL: {\n return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos));\n }\n case Token.INTEGERLITERAL: {\n return Node.createIntegerLiteralExpression(tn.readInteger(), tn.range(startPos, tn.pos));\n }\n case Token.FLOATLITERAL: {\n return Node.createFloatLiteralExpression(tn.readFloat(), tn.range(startPos, tn.pos));\n }\n // RegexpLiteralExpression\n // note that this also continues on invalid ones so the surrounding AST remains intact\n case Token.SLASH: {\n let regexpPattern = tn.readRegexpPattern(); // also reports\n if (!tn.skip(Token.SLASH)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"/\"\n );\n return null;\n }\n return Node.createRegexpLiteralExpression(\n regexpPattern,\n tn.readRegexpFlags(), // also reports\n tn.range(startPos, tn.pos)\n );\n }\n case Token.FUNCTION: {\n return this.parseFunctionExpression(tn);\n }\n case Token.CLASS: {\n return this.parseClassExpression(tn);\n }\n default: {\n if (token == Token.ENDOFFILE) {\n this.error(\n DiagnosticCode.Unexpected_end_of_text,\n tn.range(startPos)\n );\n } else {\n this.error(\n DiagnosticCode.Expression_expected,\n tn.range()\n );\n }\n return null;\n }\n }\n }\n\n tryParseTypeArgumentsBeforeArguments(\n tn: Tokenizer\n ): CommonTypeNode[] | null {\n\n // at '<': Type (',' Type)* '>' '('\n\n var state = tn.mark();\n if (!tn.skip(Token.LESSTHAN)) return null;\n var typeArguments = new Array();\n do {\n if (tn.peek() === Token.GREATERTHAN) {\n break;\n }\n let type = this.parseType(tn, true, true);\n if (!type) {\n tn.reset(state);\n return null;\n }\n typeArguments.push(type);\n } while (tn.skip(Token.COMMA));\n if (tn.skip(Token.GREATERTHAN) && tn.skip(Token.OPENPAREN)) {\n return typeArguments;\n }\n tn.reset(state);\n return null;\n }\n\n parseArguments(\n tn: Tokenizer\n ): Expression[] | null {\n\n // at '(': (Expression (',' Expression)*)? ')'\n\n var args = new Array();\n while (!tn.skip(Token.CLOSEPAREN)) {\n let expr = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!expr) return null;\n args.push(expr);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEPAREN)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n }\n }\n return args;\n }\n\n parseExpression(\n tn: Tokenizer,\n precedence: Precedence = Precedence.COMMA\n ): Expression | null {\n assert(precedence != Precedence.NONE);\n\n var expr = this.parseExpressionStart(tn);\n if (!expr) return null;\n expr = this.maybeParseCallExpression(tn, expr); // simple call like on an Identifier\n\n var startPos = expr.range.start;\n var token: Token;\n var next: Expression | null = null;\n var nextPrecedence: Precedence;\n while (\n (nextPrecedence = determinePrecedence(token = tn.peek())) >= precedence\n ) { // precedence climbing\n tn.next();\n switch (token) {\n // AssertionExpression\n case Token.AS: {\n let toType = this.parseType(tn); // reports\n if (!toType) return null;\n expr = Node.createAssertionExpression(\n AssertionKind.AS,\n expr,\n toType,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n case Token.EXCLAMATION: {\n expr = Node.createAssertionExpression(\n AssertionKind.NONNULL,\n expr,\n null,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // InstanceOfExpression\n case Token.INSTANCEOF: {\n let isType = this.parseType(tn); // reports\n if (!isType) return null;\n expr = Node.createInstanceOfExpression(\n expr,\n isType,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // ElementAccessExpression\n case Token.OPENBRACKET: {\n next = this.parseExpression(tn); // reports\n if (!next) return null;\n if (!tn.skip(Token.CLOSEBRACKET)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"]\"\n );\n return null;\n }\n expr = Node.createElementAccessExpression(\n expr,\n next,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // UnaryPostfixExpression\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS: {\n if (\n expr.kind != NodeKind.IDENTIFIER &&\n expr.kind != NodeKind.ELEMENTACCESS &&\n expr.kind != NodeKind.PROPERTYACCESS\n ) {\n this.error(\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\n expr.range\n );\n }\n expr = Node.createUnaryPostfixExpression(\n token,\n expr,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // TernaryExpression\n case Token.QUESTION: {\n let ifThen = this.parseExpression(tn);\n if (!ifThen) return null;\n if (!tn.skip(Token.COLON)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n return null;\n }\n let ifElse = this.parseExpression(tn, precedence > Precedence.COMMA\n ? Precedence.COMMA + 1\n : Precedence.COMMA\n );\n if (!ifElse) return null;\n expr = Node.createTernaryExpression(\n expr,\n ifThen,\n ifElse,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // CommaExpression\n case Token.COMMA: {\n let commaExprs: Expression[] = [ expr ];\n do {\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!expr) return null;\n commaExprs.push(expr);\n } while (tn.skip(Token.COMMA));\n expr = Node.createCommaExpression(commaExprs, tn.range(startPos, tn.pos));\n break;\n }\n default: {\n\n // PropertyAccessExpression\n if (token == Token.DOT) {\n if (tn.skipIdentifier()) {\n next = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n next = this.parseExpression(tn,\n isRightAssociative(token)\n ? nextPrecedence\n : nextPrecedence + 1\n );\n if (!next) return null;\n }\n if (next.kind == NodeKind.IDENTIFIER) { // expr '.' Identifier\n expr = Node.createPropertyAccessExpression(\n expr,\n next,\n tn.range(startPos, tn.pos)\n );\n } else if (next.kind == NodeKind.CALL) { // expr '.' CallExpression\n expr = this.joinPropertyCall(tn, startPos, expr, next);\n if (!expr) return null;\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n next.range\n );\n return null;\n }\n\n // BinaryExpression\n } else {\n next = this.parseExpression(tn,\n isRightAssociative(token)\n ? nextPrecedence\n : nextPrecedence + 1\n );\n if (!next) return null;\n expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));\n }\n break;\n }\n }\n expr = this.maybeParseCallExpression(tn, expr); // compound call like on an ElementAccess\n }\n return expr;\n }\n\n private joinPropertyCall(\n tn: Tokenizer,\n startPos: i32,\n expr: Expression,\n call: CallExpression\n ): Expression | null {\n var callee = call.expression;\n switch (callee.kind) {\n case NodeKind.IDENTIFIER: { // join property access and use as call target\n call.expression = Node.createPropertyAccessExpression(\n expr,\n callee,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n case NodeKind.CALL: { // join call target und wrap the original call around it\n let inner = this.joinPropertyCall(tn, startPos, expr, callee);\n if (!inner) return null;\n call.expression = inner;\n call.range = tn.range(startPos, tn.pos);\n break;\n }\n default: {\n this.error(\n DiagnosticCode.Identifier_expected,\n call.range\n );\n return null;\n }\n }\n return call;\n }\n\n private maybeParseCallExpression(\n tn: Tokenizer,\n expr: Expression\n ): Expression {\n if (nodeIsCallable(expr.kind)) {\n let typeArguments: CommonTypeNode[] | null = null;\n while (\n tn.skip(Token.OPENPAREN)\n ||\n nodeIsGenericCallable(expr.kind) && (typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null\n ) {\n let args = this.parseArguments(tn);\n if (!args) break;\n expr = Node.createCallExpression( // is again callable\n expr,\n typeArguments,\n args,\n tn.range(expr.range.start, tn.pos)\n );\n }\n }\n return expr;\n }\n\n /** Skips over a statement on errors in an attempt to reduce unnecessary diagnostic noise. */\n skipStatement(tn: Tokenizer): void {\n tn.peek(true);\n if (tn.nextTokenOnNewLine) tn.next(); // if reset() to the previous line\n do {\n let nextToken = tn.peek(true);\n if (\n nextToken == Token.ENDOFFILE || // next step should handle this\n nextToken == Token.SEMICOLON // end of the statement for sure\n ) {\n tn.next();\n break;\n }\n if (tn.nextTokenOnNewLine) break; // end of the statement maybe\n switch (tn.next()) {\n case Token.IDENTIFIER: {\n tn.readIdentifier();\n break;\n }\n case Token.STRINGLITERAL: {\n tn.readString();\n break;\n }\n case Token.INTEGERLITERAL: {\n tn.readInteger();\n break;\n }\n case Token.FLOATLITERAL: {\n tn.readFloat();\n break;\n }\n }\n } while (true);\n }\n\n /** Skips over a block on errors in an attempt to reduce unnecessary diagnostic noise. */\n skipBlock(tn: Tokenizer): void {\n // at '{': ... '}'\n var depth = 1;\n var again = true;\n do {\n switch (tn.next()) {\n case Token.ENDOFFILE: {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n again = false;\n break;\n }\n case Token.OPENBRACE: {\n ++depth;\n break;\n }\n case Token.CLOSEBRACE: {\n --depth;\n if (!depth) again = false;\n break;\n }\n case Token.IDENTIFIER: {\n tn.readIdentifier();\n break;\n }\n case Token.STRINGLITERAL: {\n tn.readString();\n break;\n }\n case Token.INTEGERLITERAL: {\n tn.readInteger();\n break;\n }\n case Token.FLOATLITERAL: {\n tn.readFloat();\n break;\n }\n }\n } while (again);\n }\n}\n\n/** Operator precedence from least to largest. */\nexport const enum Precedence {\n NONE,\n COMMA,\n SPREAD,\n YIELD,\n ASSIGNMENT,\n CONDITIONAL,\n LOGICAL_OR,\n LOGICAL_AND,\n BITWISE_OR,\n BITWISE_XOR,\n BITWISE_AND,\n EQUALITY,\n RELATIONAL,\n SHIFT,\n ADDITIVE,\n MULTIPLICATIVE,\n EXPONENTIATED,\n UNARY_PREFIX,\n UNARY_POSTFIX,\n CALL,\n MEMBERACCESS,\n GROUPING\n}\n\n/** Determines the precedence of a starting token. */\nfunction determinePrecedenceStart(kind: Token): Precedence {\n switch (kind) {\n case Token.DOT_DOT_DOT: return Precedence.SPREAD;\n case Token.YIELD: return Precedence.YIELD;\n case Token.EXCLAMATION:\n case Token.TILDE:\n case Token.PLUS:\n case Token.MINUS:\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS:\n case Token.TYPEOF:\n case Token.VOID:\n case Token.DELETE: return Precedence.UNARY_PREFIX;\n case Token.NEW: return Precedence.MEMBERACCESS;\n }\n return Precedence.NONE;\n}\n\n/** Determines the precende of a non-starting token. */\nfunction determinePrecedence(kind: Token): Precedence {\n switch (kind) {\n case Token.COMMA: return Precedence.COMMA;\n case Token.EQUALS:\n case Token.PLUS_EQUALS:\n case Token.MINUS_EQUALS:\n case Token.ASTERISK_ASTERISK_EQUALS:\n case Token.ASTERISK_EQUALS:\n case Token.SLASH_EQUALS:\n case Token.PERCENT_EQUALS:\n case Token.LESSTHAN_LESSTHAN_EQUALS:\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\n case Token.AMPERSAND_EQUALS:\n case Token.CARET_EQUALS:\n case Token.BAR_EQUALS: return Precedence.ASSIGNMENT;\n case Token.QUESTION: return Precedence.CONDITIONAL;\n case Token.BAR_BAR: return Precedence.LOGICAL_OR;\n case Token.AMPERSAND_AMPERSAND: return Precedence.LOGICAL_AND;\n case Token.BAR: return Precedence.BITWISE_OR;\n case Token.CARET: return Precedence.BITWISE_XOR;\n case Token.AMPERSAND: return Precedence.BITWISE_AND;\n case Token.EQUALS_EQUALS:\n case Token.EXCLAMATION_EQUALS:\n case Token.EQUALS_EQUALS_EQUALS:\n case Token.EXCLAMATION_EQUALS_EQUALS: return Precedence.EQUALITY;\n case Token.AS:\n case Token.IN:\n case Token.INSTANCEOF:\n case Token.LESSTHAN:\n case Token.GREATERTHAN:\n case Token.LESSTHAN_EQUALS:\n case Token.GREATERTHAN_EQUALS: return Precedence.RELATIONAL;\n case Token.LESSTHAN_LESSTHAN:\n case Token.GREATERTHAN_GREATERTHAN:\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return Precedence.SHIFT;\n case Token.PLUS:\n case Token.MINUS: return Precedence.ADDITIVE;\n case Token.ASTERISK:\n case Token.SLASH:\n case Token.PERCENT: return Precedence.MULTIPLICATIVE;\n case Token.ASTERISK_ASTERISK: return Precedence.EXPONENTIATED;\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS: return Precedence.UNARY_POSTFIX;\n case Token.DOT:\n case Token.NEW:\n case Token.OPENBRACKET:\n case Token.EXCLAMATION: return Precedence.MEMBERACCESS;\n }\n return Precedence.NONE;\n}\n\n/** Determines whether a non-starting token is right associative. */\nfunction isRightAssociative(kind: Token): bool {\n switch (kind) {\n case Token.EQUALS:\n case Token.PLUS_EQUALS:\n case Token.MINUS_EQUALS:\n case Token.ASTERISK_ASTERISK_EQUALS:\n case Token.ASTERISK_EQUALS:\n case Token.SLASH_EQUALS:\n case Token.PERCENT_EQUALS:\n case Token.LESSTHAN_LESSTHAN_EQUALS:\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\n case Token.AMPERSAND_EQUALS:\n case Token.CARET_EQUALS:\n case Token.BAR_EQUALS:\n case Token.QUESTION:\n case Token.ASTERISK_ASTERISK: return true;\n default: return false;\n }\n}\n","/**\n * JavaScript glue code.\n * @module glue/js\n * @preferred\n *//***/\n\n/// \n\nimport \"./binaryen\"; // must be first so portable can pick up the memory implementation\nimport \"../../../std/portable/index\";\nimport \"./float\";\nimport \"./i64\";\n\nimport { Module } from \"../../module\";\n\nModule.prototype.toText = function(this: Module) {\n return binaryen.wrapModule(this.ref).emitStackIR();\n};\n\nModule.prototype.toAsmjs = function(this: Module) {\n return binaryen.wrapModule(this.ref).emitAsmjs();\n};\n","// Copy Binaryen exports to global scope\n\nconst binaryen = global.Binaryen || require(\"binaryen\");\nglobal.binaryen = binaryen;\n\nfor (var key in binaryen) {\n if (key.startsWith(\"_Binaryen\") || key.startsWith(\"_Relooper\")) global[key] = binaryen[key];\n}\n\n// Utilize Binaryen's heap\n\nglobal.__memory_allocate = binaryen._malloc;\nglobal.__memory_free = binaryen._free;\nglobal.__memory_copy = binaryen._memmove;\nglobal.__store = function(ptr, val) { binaryen.HEAPU8[ptr] = val; };\nglobal.__load = function(ptr) { return binaryen.HEAPU8[ptr]; };\n","module.exports = __WEBPACK_EXTERNAL_MODULE__18__;","/** @module std/portable *//***/\n\nvar globalScope = typeof window !== \"undefined\" && window || typeof global !== \"undefined\" && global || self;\n\nglobalScope.ASC_TARGET = 0;\n\nvar F64 = new Float64Array(1);\nvar U64 = new Uint32Array(F64.buffer);\n\nObject.defineProperties(\n globalScope[\"i8\"] = function i8(value) { return value << 24 >> 24; }\n, {\n \"MIN_VALUE\": { value: -128, writable: false },\n \"MAX_VALUE\": { value: 127, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"i16\"] = function i16(value) { return value << 16 >> 16; }\n, {\n \"MIN_VALUE\": { value: -32768, writable: false },\n \"MAX_VALUE\": { value: 32767, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"i32\"] = globalScope[\"isize\"] = function i32(value) { return value | 0; }\n, {\n \"MIN_VALUE\": { value: -2147483648, writable: false },\n \"MAX_VALUE\": { value: 2147483647, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"u8\"] = function u8(value) { return value & 0xff; }\n, {\n \"MIN_VALUE\": { value: 0, writable: false },\n \"MAX_VALUE\": { value: 255, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"u16\"] = function u16(value) { return value & 0xffff; }\n, {\n \"MIN_VALUE\": { value: 0, writable: false },\n \"MAX_VALUE\": { value: 65535, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"u32\"] = globalScope[\"usize\"] = function u32(value) { return value >>> 0; }\n, {\n \"MIN_VALUE\": { value: 0, writable: false },\n \"MAX_VALUE\": { value: 4294967295, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"bool\"] = function bool(value) { return !!value; }\n, {\n \"MIN_VALUE\": { value: false, writable: false },\n \"MAX_VALUE\": { value: true, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"f32\"] = function f32(value) { return Math.fround(value); }\n, {\n \"EPSILON\": { value: Math.fround(1.1920929e-07), writable: false },\n \"MIN_VALUE\": { value: Math.fround(1.4012985e-45), writable: false },\n \"MAX_VALUE\": { value: Math.fround(3.4028235e+38), writable: false },\n \"MIN_NORMAL_VALUE\": { value: Math.fround(1.17549435e-38), writable: false },\n \"MIN_SAFE_INTEGER\": { value: -16777215, writable: false },\n \"MAX_SAFE_INTEGER\": { value: 16777215, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"f64\"] = function f64(value) { return +value; }\n, {\n \"EPSILON\": { value: 2.2204460492503131e-16, writable: false },\n \"MIN_VALUE\": { value: 5e-324, writable: false },\n \"MAX_VALUE\": { value: 1.7976931348623157e+308, writable: false },\n \"MIN_NORMAL_VALUE\": { value: 2.2250738585072014e-308 , writable: false },\n \"MIN_SAFE_INTEGER\": { value: -9007199254740991, writable: false },\n \"MAX_SAFE_INTEGER\": { value: 9007199254740991, writable: false }\n});\n\nglobalScope[\"clz\"] = Math.clz32;\n\nglobalScope[\"ctz\"] = function ctz(value) {\n var c = Math.clz32(value & -value);\n return value ? 31 - c : c;\n};\n\nglobalScope[\"popcnt\"] = function popcnt(value) {\n value -= value >>> 1 & 0x55555555;\n value = (value & 0x33333333) + (value >>> 2 & 0x33333333);\n return (((value + (value >>> 4)) & 0x0F0F0F0F) * 0x01010101) >>> 24;\n};\n\nglobalScope[\"rotl\"] = function rotl(value, shift) {\n shift &= 31;\n return (value << shift) | (value >>> (32 - shift));\n};\n\nglobalScope[\"rotr\"] = function rotr(value, shift) {\n shift &= 31;\n return (value >>> shift) | (value << (32 - shift));\n};\n\nglobalScope[\"abs\"] = Math.abs;\n\nglobalScope[\"max\"] = Math.max;\n\nglobalScope[\"min\"] = Math.min;\n\nglobalScope[\"ceil\"] = Math.ceil;\n\nglobalScope[\"floor\"] = Math.floor;\n\n// Adopt code from https://github.com/rfk/wasm-polyfill\nglobalScope[\"nearest\"] = function nearest(value) {\n if (Math.abs(value - Math.trunc(value)) === 0.5) {\n return 2.0 * Math.round(value * 0.5);\n }\n return Math.round(value);\n};\n\nglobalScope[\"select\"] = function select(ifTrue, ifFalse, condition) {\n return condition ? ifTrue : ifFalse;\n};\n\nglobalScope[\"sqrt\"] = Math.sqrt;\n\nglobalScope[\"trunc\"] = Math.trunc;\n\nglobalScope[\"copysign\"] = function copysign(x, y) {\n return Math.abs(x) * Math.sign(y);\n};\n\nglobalScope[\"bswap\"] = function bswap(value) {\n var a = value >> 8 & 0x00FF00FF;\n var b = (value & 0x00FF00FF) << 8;\n value = a | b;\n a = value >> 16 & 0x0000FFFF;\n b = (value & 0x0000FFFF) << 16;\n return a | b;\n};\n\nglobalScope[\"bswap16\"] = function bswap16(value) {\n return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);\n};\n\nfunction UnreachableError() {\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, UnreachableError);\n } else {\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\n }\n}\nUnreachableError.prototype = Object.create(Error.prototype);\nUnreachableError.prototype.name = \"UnreachableError\";\nUnreachableError.prototype.message = \"unreachable\";\n\nglobalScope[\"unreachable\"] = function unreachable() {\n throw new UnreachableError();\n};\n\nfunction AssertionError(message) {\n this.message = message || \"assertion failed\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AssertionError);\n } else {\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\n }\n}\nAssertionError.prototype = Object.create(Error.prototype);\nAssertionError.prototype.name = \"AssertionError\";\n\nglobalScope[\"assert\"] = function assert(isTrueish, message) {\n if (isTrueish) return isTrueish;\n throw new AssertionError(message);\n};\n\nglobalScope[\"changetype\"] = function changetype(value) {\n return value;\n};\n\nglobalScope[\"parseI32\"] = function parseI32(str, radix) {\n return parseInt(str, undefined) | 0;\n};\n\nString[\"fromCharCodes\"] = function fromCharCodes(arr) {\n return String.fromCharCode.apply(String, arr);\n};\n\nString[\"fromCodePoints\"] = function fromCodePoints(arr) {\n return String.fromCodePoint.apply(String, arr);\n};\n\nglobalScope[\"isInteger\"] = Number.isInteger;\n\nglobalScope[\"isFloat\"] = function isFloat(arg) {\n return typeof arg === \"number\";\n};\n\nglobalScope[\"isReference\"] = function isClass(arg) {\n return typeof arg === \"object\" || typeof arg === \"string\";\n};\n\nglobalScope[\"isString\"] = function isString(arg) {\n return typeof arg === \"string\" || arg instanceof String;\n};\n\nglobalScope[\"isArray\"] = Array.isArray;\n\nglobalScope[\"isDefined\"] = function isDefined(expr) {\n return typeof expr !== \"undefined\";\n}\n\nglobalScope[\"isConstant\"] = function isConstant(expr) {\n return false;\n};\n\nglobalScope[\"unchecked\"] = function unchecked(expr) {\n return expr;\n};\n\nglobalScope[\"fmod\"] = function fmod(x, y) {\n return x % y;\n};\n\nglobalScope[\"fmodf\"] = function fmodf(x, y) {\n return Math.fround(x % y);\n};\n\nglobalScope[\"JSMath\"] = Math;\nglobalScope[\"JSMath\"].signbit = function signbit(x) {\n F64[0] = x; return Boolean((U64[1] >>> 31) & (x == x));\n}\n\nglobalScope[\"memory\"] = (() => {\n var HEAP = new Uint8Array(0);\n var HEAP_OFFSET = 0;\n return {\n allocate: globalScope[\"__memory_allocate\"] || function allocate(size) {\n if (!(size >>>= 0)) return 0;\n if (HEAP_OFFSET + size > HEAP.length) {\n var oldHeap = HEAP;\n HEAP = new Uint8Array(Math.max(65536, HEAP.length + size, HEAP.length * 2));\n HEAP.set(oldHeap);\n }\n var ptr = HEAP_OFFSET;\n if ((HEAP_OFFSET += size) & 7) HEAP_OFFSET = (HEAP_OFFSET | 7) + 1;\n return ptr;\n },\n fill: globalScope[\"__memory_fill\"] || function fill(dest, value, size) {\n HEAP.fill(value, dest, dest + size);\n },\n free: globalScope[\"__memory_free\"] || function free(ptr) { },\n copy: globalScope[\"__memory_copy\"] || function copy(dest, src, size) {\n HEAP.copyWithin(dest, src, src + size);\n },\n reset: globalScope[\"__memory_reset\"] || function reset() {\n HEAP = new Uint8Array(0);\n HEAP_OFFSET = 0;\n }\n };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[(ptr | 0) + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[(ptr | 0) + (offset | 0)];\n};\n","const F64 = new Float64Array(1);\nconst F32 = new Float32Array(F64.buffer);\nconst I32 = new Int32Array(F64.buffer);\n\nglobal.f32_as_i32 = function(value) {\n F32[0] = value;\n return I32[0];\n};\n\nglobal.i32_as_f32 = function(value) {\n I32[0] = value;\n return F32[0];\n};\n\nglobal.f64_as_i64 = function(value) {\n F64[0] = value;\n return i64_new(I32[0], I32[1]);\n};\n\nglobal.i64_as_f64 = function(value) {\n I32[0] = i64_low(value);\n I32[1] = i64_high(value);\n return F64[0];\n};\n","const Long = global.Long || require(\"long\");\n\nglobal.i64_zero = Long.ZERO;\n\nglobal.i64_one = Long.ONE;\n\nglobal.i64_new = function(lo, hi) {\n return Long.fromBits(lo, hi);\n};\n\nglobal.i64_low = function(value) {\n return value.low;\n};\n\nglobal.i64_high = function(value) {\n return value.high;\n};\n\nglobal.i64_add = function(left, right) {\n return left.add(right);\n};\n\nglobal.i64_sub = function(left, right) {\n return left.sub(right);\n};\n\nglobal.i64_mul = function(left, right) {\n return left.mul(right);\n};\n\nglobal.i64_div = function(left, right) {\n return left.div(right);\n};\n\nglobal.i64_div_u = function(left, right) {\n return left.toUnsigned().div(right.toUnsigned()).toSigned();\n};\n\nglobal.i64_rem = function(left, right) {\n return left.mod(right);\n};\n\nglobal.i64_rem_u = function(left, right) {\n return left.toUnsigned().mod(right.toUnsigned()).toSigned();\n};\n\nglobal.i64_and = function(left, right) {\n return left.and(right);\n};\n\nglobal.i64_or = function(left, right) {\n return left.or(right);\n};\n\nglobal.i64_xor = function(left, right) {\n return left.xor(right);\n};\n\nglobal.i64_shl = function(left, right) {\n return left.shl(right);\n};\n\nglobal.i64_shr = function(left, right) {\n return left.shr(right);\n};\n\nglobal.i64_shr_u = function(left, right) {\n return left.shru(right);\n};\n\nglobal.i64_not = function(value) {\n return value.not();\n};\n\nglobal.i64_eq = function(left, right) {\n return left.eq(right);\n};\n\nglobal.i64_ne = function(left, right) {\n return left.ne(right);\n};\n\nglobal.i64_align = function(value, alignment) {\n assert(alignment && (alignment & (alignment - 1)) == 0);\n var mask = Long.fromInt(alignment - 1);\n return value.add(mask).and(mask.not());\n};\n\nglobal.i64_is_i8 = function(value) {\n return value.high === 0 && (value.low >= 0 && value.low <= i8.MAX_VALUE)\n || value.high === -1 && (value.low >= i8.MIN_VALUE && value.low < 0);\n};\n\nglobal.i64_is_i16 = function(value) {\n return value.high === 0 && (value.low >= 0 && value.low <= i16.MAX_VALUE)\n || value.high === -1 && (value.low >= i16.MIN_VALUE && value.low < 0);\n};\n\nglobal.i64_is_i32 = function(value) {\n return (value.high === 0 && value.low >= 0)\n || (value.high === -1 && value.low < 0);\n};\n\nglobal.i64_is_u8 = function(value) {\n return value.high === 0 && value.low >= 0 && value.low <= u8.MAX_VALUE;\n};\n\nglobal.i64_is_u16 = function(value) {\n return value.high === 0 && value.low >= 0 && value.low <= u16.MAX_VALUE;\n};\n\nglobal.i64_is_u32 = function(value) {\n return value.high === 0;\n};\n\nglobal.i64_is_bool = function(value) {\n return value.high === 0 && (value.low === 0 || value.low === 1);\n};\n\nconst minSafeF32 = Long.fromNumber(f32.MIN_SAFE_INTEGER);\nconst maxSafeF32 = Long.fromNumber(f32.MAX_SAFE_INTEGER);\n\nglobal.i64_is_f32 = function(value) {\n return value.gte(minSafeF32) && value.lte(maxSafeF32);\n};\n\nconst minSafeF64 = Long.fromNumber(f64.MIN_SAFE_INTEGER);\nconst maxSafeF64 = Long.fromNumber(f64.MAX_SAFE_INTEGER);\n\nglobal.i64_is_f64 = function(value) {\n return value.gte(minSafeF64) && value.lte(maxSafeF64);\n};\n\nglobal.i64_to_f32 = function(value) {\n return global.Math.fround(value.toNumber());\n};\n\nglobal.i64_to_f64 = function(value) {\n return value.toNumber();\n};\n\nglobal.i64_to_string = function(value, unsigned) {\n return (unsigned ? value.toUnsigned() : value).toString(10);\n};\n","module.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n ])), {}).exports;\r\n} catch (e) {\r\n // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n * See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n /**\r\n * The low 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.low = low | 0;\r\n\r\n /**\r\n * The high 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.high = high | 0;\r\n\r\n /**\r\n * Whether unsigned or not.\r\n * @type {boolean}\r\n */\r\n this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations. For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative). Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n var obj, cachedObj, cache;\r\n if (unsigned) {\r\n value >>>= 0;\r\n if (cache = (0 <= value && value < 256)) {\r\n cachedObj = UINT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n if (cache)\r\n UINT_CACHE[value] = obj;\r\n return obj;\r\n } else {\r\n value |= 0;\r\n if (cache = (-128 <= value && value < 128)) {\r\n cachedObj = INT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n if (cache)\r\n INT_CACHE[value] = obj;\r\n return obj;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n if (isNaN(value))\r\n return unsigned ? UZERO : ZERO;\r\n if (unsigned) {\r\n if (value < 0)\r\n return UZERO;\r\n if (value >= TWO_PWR_64_DBL)\r\n return MAX_UNSIGNED_VALUE;\r\n } else {\r\n if (value <= -TWO_PWR_63_DBL)\r\n return MIN_VALUE;\r\n if (value + 1 >= TWO_PWR_63_DBL)\r\n return MAX_VALUE;\r\n }\r\n if (value < 0)\r\n return fromNumber(-value, unsigned).neg();\r\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n * assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n if (str.length === 0)\r\n throw Error('empty string');\r\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n return ZERO;\r\n if (typeof unsigned === 'number') {\r\n // For goog.math.long compatibility\r\n radix = unsigned,\r\n unsigned = false;\r\n } else {\r\n unsigned = !! unsigned;\r\n }\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n\r\n var p;\r\n if ((p = str.indexOf('-')) > 0)\r\n throw Error('interior hyphen');\r\n else if (p === 0) {\r\n return fromString(str.substring(1), unsigned, radix).neg();\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n var result = ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i),\r\n value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = fromNumber(pow_dbl(radix, size));\r\n result = result.mul(power).add(fromNumber(value));\r\n } else {\r\n result = result.mul(radixToPower);\r\n result = result.add(fromNumber(value));\r\n }\r\n }\r\n result.unsigned = unsigned;\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n if (typeof val === 'number')\r\n return fromNumber(val, unsigned);\r\n if (typeof val === 'string')\r\n return fromString(val, unsigned);\r\n // Throws for non-objects, converts non-instanceof Long:\r\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n if (this.unsigned)\r\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n if (this.isZero())\r\n return '0';\r\n if (this.isNegative()) { // Unsigned Longs are never negative\r\n if (this.eq(MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = fromNumber(radix),\r\n div = this.div(radixLong),\r\n rem1 = div.mul(radixLong).sub(this);\r\n return div.toString(radix) + rem1.toInt().toString(radix);\r\n } else\r\n return '-' + this.neg().toString(radix);\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower),\r\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n digits = intval.toString(radix);\r\n rem = remDiv;\r\n if (rem.isZero())\r\n return digits + result;\r\n else {\r\n while (digits.length < 6)\r\n digits = '0' + digits;\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n if (this.isNegative()) // Unsigned Longs are never negative\r\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n var val = this.high != 0 ? this.high : this.low;\r\n for (var bit = 31; bit > 0; bit--)\r\n if ((val & (1 << bit)) != 0)\r\n break;\r\n return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n return false;\r\n return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.eq(other))\r\n return 0;\r\n var thisNeg = this.isNegative(),\r\n otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg)\r\n return -1;\r\n if (!thisNeg && otherNeg)\r\n return 1;\r\n // At this point the sign bits are the same\r\n if (!this.unsigned)\r\n return this.sub(other).isNegative() ? -1 : 1;\r\n // Both are positive if at least one is unsigned\r\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n if (!this.unsigned && this.eq(MIN_VALUE))\r\n return MIN_VALUE;\r\n return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n if (!isLong(addend))\r\n addend = fromValue(addend);\r\n\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = addend.high >>> 16;\r\n var b32 = addend.high & 0xFFFF;\r\n var b16 = addend.low >>> 16;\r\n var b00 = addend.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n if (!isLong(subtrahend))\r\n subtrahend = fromValue(subtrahend);\r\n return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n if (this.isZero())\r\n return ZERO;\r\n if (!isLong(multiplier))\r\n multiplier = fromValue(multiplier);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = wasm.mul(this.low,\r\n this.high,\r\n multiplier.low,\r\n multiplier.high);\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (multiplier.isZero())\r\n return ZERO;\r\n if (this.eq(MIN_VALUE))\r\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n if (multiplier.eq(MIN_VALUE))\r\n return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n if (this.isNegative()) {\r\n if (multiplier.isNegative())\r\n return this.neg().mul(multiplier.neg());\r\n else\r\n return this.neg().mul(multiplier).neg();\r\n } else if (multiplier.isNegative())\r\n return this.mul(multiplier.neg()).neg();\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = multiplier.high >>> 16;\r\n var b32 = multiplier.high & 0xFFFF;\r\n var b16 = multiplier.low >>> 16;\r\n var b00 = multiplier.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n * unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n if (divisor.isZero())\r\n throw Error('division by zero');\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n // guard against signed division overflow: the largest\r\n // negative number / -1 would be 1 larger than the largest\r\n // positive number, due to two's complement.\r\n if (!this.unsigned &&\r\n this.high === -0x80000000 &&\r\n divisor.low === -1 && divisor.high === -1) {\r\n // be consistent with non-wasm code path\r\n return this;\r\n }\r\n var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (this.isZero())\r\n return this.unsigned ? UZERO : ZERO;\r\n var approx, rem, res;\r\n if (!this.unsigned) {\r\n // This section is only relevant for signed longs and is derived from the\r\n // closure library as a whole.\r\n if (this.eq(MIN_VALUE)) {\r\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n else if (divisor.eq(MIN_VALUE))\r\n return ONE;\r\n else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shr(1);\r\n approx = halfThis.div(divisor).shl(1);\r\n if (approx.eq(ZERO)) {\r\n return divisor.isNegative() ? ONE : NEG_ONE;\r\n } else {\r\n rem = this.sub(divisor.mul(approx));\r\n res = approx.add(rem.div(divisor));\r\n return res;\r\n }\r\n }\r\n } else if (divisor.eq(MIN_VALUE))\r\n return this.unsigned ? UZERO : ZERO;\r\n if (this.isNegative()) {\r\n if (divisor.isNegative())\r\n return this.neg().div(divisor.neg());\r\n return this.neg().div(divisor).neg();\r\n } else if (divisor.isNegative())\r\n return this.div(divisor.neg()).neg();\r\n res = ZERO;\r\n } else {\r\n // The algorithm below has not been made for unsigned longs. It's therefore\r\n // required to take special care of the MSB prior to running it.\r\n if (!divisor.unsigned)\r\n divisor = divisor.toUnsigned();\r\n if (divisor.gt(this))\r\n return UZERO;\r\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n return UONE;\r\n res = UZERO;\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n rem = this;\r\n while (rem.gte(divisor)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n approxRes = fromNumber(approx),\r\n approxRem = approxRes.mul(divisor);\r\n while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n approx -= delta;\r\n approxRes = fromNumber(approx, this.unsigned);\r\n approxRem = approxRes.mul(divisor);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero())\r\n approxRes = ONE;\r\n\r\n res = res.add(approxRes);\r\n rem = rem.sub(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n else\r\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n else\r\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n numBits &= 63;\r\n if (numBits === 0)\r\n return this;\r\n else {\r\n var high = this.high;\r\n if (numBits < 32) {\r\n var low = this.low;\r\n return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n } else if (numBits === 32)\r\n return fromBits(high, 0, this.unsigned);\r\n else\r\n return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n if (!this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n if (this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n lo & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo >>> 16 & 0xff,\r\n lo >>> 24 ,\r\n hi & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi >>> 16 & 0xff,\r\n hi >>> 24\r\n ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n hi >>> 24 ,\r\n hi >>> 16 & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi & 0xff,\r\n lo >>> 24 ,\r\n lo >>> 16 & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo & 0xff\r\n ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n return new Long(\r\n bytes[0] |\r\n bytes[1] << 8 |\r\n bytes[2] << 16 |\r\n bytes[3] << 24,\r\n bytes[4] |\r\n bytes[5] << 8 |\r\n bytes[6] << 16 |\r\n bytes[7] << 24,\r\n unsigned\r\n );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n return new Long(\r\n bytes[4] << 24 |\r\n bytes[5] << 16 |\r\n bytes[6] << 8 |\r\n bytes[7],\r\n bytes[0] << 24 |\r\n bytes[1] << 16 |\r\n bytes[2] << 8 |\r\n bytes[3],\r\n unsigned\r\n );\r\n};\r\n","/**\n * Built-in elements providing WebAssembly core functionality.\n * @module builtins\n *//***/\n\n import {\n Compiler,\n ConversionKind,\n WrapMode\n} from \"./compiler\";\n\nimport {\n DiagnosticCode\n} from \"./diagnostics\";\n\nimport {\n Node,\n NodeKind,\n Expression,\n LiteralKind,\n LiteralExpression,\n StringLiteralExpression\n} from \"./ast\";\n\nimport {\n Type,\n TypeKind,\n TypeFlags\n} from \"./types\";\n\nimport {\n BinaryOp,\n UnaryOp,\n HostOp,\n NativeType,\n ExpressionRef,\n ExpressionId,\n getExpressionId,\n getExpressionType,\n getConstValueI64High,\n getConstValueI64Low,\n getConstValueI32\n} from \"./module\";\n\nimport {\n ElementKind,\n FunctionPrototype,\n Class,\n Field,\n OperatorKind,\n FlowFlags,\n Global,\n DecoratorFlags\n} from \"./program\";\n\nimport {\n ReportMode\n} from \"./resolver\";\n\nimport {\n CommonFlags\n} from \"./common\";\n\n/** Compiles a call to a built-in function. */\nexport function compileCall(\n compiler: Compiler,\n prototype: FunctionPrototype,\n typeArguments: Type[] | null,\n operands: Expression[],\n contextualType: Type,\n reportNode: Node\n): ExpressionRef {\n var module = compiler.module;\n\n var arg0: ExpressionRef,\n arg1: ExpressionRef,\n arg2: ExpressionRef,\n ret: ExpressionRef;\n\n // NOTE that some implementations below make use of the select expression where straight-forward.\n // whether worth or not should probably be tested once it's known if/how embedders handle it.\n // search: createSelect\n\n switch (prototype.internalName) {\n\n // types\n\n case \"isInteger\": { // isInteger() / isInteger(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return type.is(TypeFlags.INTEGER) && !type.is(TypeFlags.REFERENCE)\n ? module.createI32(1)\n : module.createI32(0);\n }\n case \"isFloat\": { // isFloat() / isFloat(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return type.is(TypeFlags.FLOAT)\n ? module.createI32(1)\n : module.createI32(0);\n }\n case \"isSigned\": { // isSigned() / isSigned(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return type.is(TypeFlags.SIGNED)\n ? module.createI32(1)\n : module.createI32(0);\n }\n case \"isReference\": { // isReference() / isReference(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n compiler.currentType = Type.bool;\n return type.is(TypeFlags.REFERENCE)\n ? module.createI32(1)\n : module.createI32(0);\n }\n case \"isString\": { // isString() / isString(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n let classType = type.classReference;\n if (classType) {\n let stringInstance = compiler.program.stringInstance;\n if (stringInstance && classType.isAssignableTo(stringInstance)) return module.createI32(1);\n }\n return module.createI32(0);\n }\n case \"isArray\": { // isArray() / isArray(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n let classType = type.classReference;\n return classType !== null && classType.lookupOverload(OperatorKind.INDEXED_GET) !== null\n ? module.createI32(1)\n : module.createI32(0);\n }\n case \"isDefined\": { // isDefined(expression) -> bool\n compiler.currentType = Type.bool;\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n let element = compiler.resolver.resolveExpression(\n operands[0],\n compiler.currentFunction,\n Type.void,\n ReportMode.SWALLOW\n );\n return module.createI32(element ? 1 : 0);\n }\n case \"isConstant\": { // isConstant(expression) -> bool\n compiler.currentType = Type.bool;\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n let expr = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\n compiler.currentType = Type.bool;\n return module.createI32(getExpressionId(expr) == ExpressionId.Const ? 1 : 0);\n }\n case \"isManaged\": { // isManaged() -> bool\n if (!compiler.program.hasGC) {\n compiler.currentType = Type.bool;\n return module.createI32(0);\n }\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n let classType = type.classReference;\n return classType !== null && !classType.hasDecorator(DecoratorFlags.UNMANAGED)\n ? module.createI32(1)\n : module.createI32(0);\n }\n\n // math\n\n case \"clz\": { // clz(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16: {\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\n break;\n }\n case TypeKind.BOOL: // usually overflows\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.ClzI64\n : UnaryOp.ClzI32,\n arg0\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createUnary(UnaryOp.ClzI64, arg0);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"ctz\": { // ctz(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.NONE, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16: {\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\n break;\n }\n case TypeKind.BOOL: // usually overflows\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.CtzI64\n : UnaryOp.CtzI32,\n arg0\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createUnary(UnaryOp.CtzI64, arg0);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"popcnt\": { // popcnt(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16: {\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\n break;\n }\n case TypeKind.BOOL: // usually overflows\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.PopcntI64\n : UnaryOp.PopcntI32,\n arg0\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createUnary(UnaryOp.PopcntI64, arg0);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"rotl\": { // rotl(value: T, shift: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n ret = compiler.ensureSmallIntegerWrap(\n module.createBinary(BinaryOp.RotlI32, arg0, arg1),\n compiler.currentType\n );\n // fall-through\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createBinary(BinaryOp.RotlI32, arg0, arg1);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.RotlI64\n : BinaryOp.RotlI32,\n arg0,\n arg1\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createBinary(BinaryOp.RotlI64, arg0, arg1);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret; // possibly overflows\n }\n case \"rotr\": { // rotr(value: T, shift: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n ret = compiler.ensureSmallIntegerWrap(\n module.createBinary(BinaryOp.RotrI32, arg0, arg1),\n compiler.currentType\n );\n break;\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createBinary(BinaryOp.RotrI32, arg0, arg1);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.RotrI64\n : BinaryOp.RotrI32,\n arg0,\n arg1\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createBinary(BinaryOp.RotrI64, arg0, arg1);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret; // possibly overflowws\n }\n case \"abs\": { // abs(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n let currentFunction = compiler.currentFunction;\n\n // possibly overflows, e.g. abs(-128) == 128\n let tempLocal1 = currentFunction.getTempLocal(Type.i32, false);\n let tempLocalIndex2 = currentFunction.getAndFreeTempLocal(Type.i32, false).index;\n let tempLocalIndex1 = tempLocal1.index;\n\n // (x + (x >> 31)) ^ (x >> 31)\n ret = module.createBinary(BinaryOp.XorI32,\n module.createBinary(BinaryOp.AddI32,\n module.createTeeLocal(\n tempLocalIndex2,\n module.createBinary(BinaryOp.ShrI32,\n module.createTeeLocal(tempLocalIndex1, arg0),\n module.createI32(31)\n )\n ),\n module.createGetLocal(tempLocalIndex1, NativeType.I32)\n ),\n module.createGetLocal(tempLocalIndex2, NativeType.I32)\n );\n\n currentFunction.freeTempLocal(tempLocal1);\n break;\n }\n case TypeKind.ISIZE: {\n let options = compiler.options;\n let currentFunction = compiler.currentFunction;\n let wasm64 = options.isWasm64;\n\n let tempLocal1 = currentFunction.getTempLocal(options.usizeType, false);\n let tempLocalIndex2 = currentFunction.getAndFreeTempLocal(options.usizeType, false).index;\n let tempLocalIndex1 = tempLocal1.index;\n\n ret = module.createBinary(wasm64 ? BinaryOp.XorI64 : BinaryOp.XorI32,\n module.createBinary(wasm64 ? BinaryOp.AddI64 : BinaryOp.AddI32,\n module.createTeeLocal(\n tempLocalIndex2,\n module.createBinary(wasm64 ? BinaryOp.ShrI64 : BinaryOp.ShrI32,\n module.createTeeLocal(tempLocalIndex1, arg0),\n wasm64 ? module.createI64(63) : module.createI32(31)\n )\n ),\n module.createGetLocal(tempLocalIndex1, options.nativeSizeType)\n ),\n module.createGetLocal(tempLocalIndex2, options.nativeSizeType)\n );\n\n currentFunction.freeTempLocal(tempLocal1);\n break;\n }\n case TypeKind.I64: {\n let currentFunction = compiler.currentFunction;\n\n let tempLocal1 = currentFunction.getTempLocal(Type.i64, false);\n let tempLocalIndex2 = currentFunction.getAndFreeTempLocal(Type.i64, false).index;\n let tempLocalIndex1 = tempLocal1.index;\n\n // (x + (x >> 63)) ^ (x >> 63)\n ret = module.createBinary(BinaryOp.XorI64,\n module.createBinary(BinaryOp.AddI64,\n module.createTeeLocal(\n tempLocalIndex2,\n module.createBinary(BinaryOp.ShrI64,\n module.createTeeLocal(tempLocalIndex1, arg0),\n module.createI64(63)\n )\n ),\n module.createGetLocal(tempLocalIndex1, NativeType.I64)\n ),\n module.createGetLocal(tempLocalIndex2, NativeType.I64)\n );\n\n currentFunction.freeTempLocal(tempLocal1);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.U64:\n case TypeKind.BOOL: {\n ret = arg0;\n break;\n }\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.AbsF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.AbsF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n ret = module.createUnreachable();\n break;\n }\n default: { // void\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"max\": { // max(left: T, right: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n let flow = compiler.currentFunction.flow;\n let tempLocal0 = compiler.currentFunction.getTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg1, compiler.currentType)\n );\n compiler.currentFunction.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal0.index, NativeType.I32),\n module.createGetLocal(tempLocal1.index, NativeType.I32)\n )\n );\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n let flow = compiler.currentFunction.flow;\n let tempLocal0 = compiler.currentFunction.getTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg1, compiler.currentType)\n );\n compiler.currentFunction.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.GtU32,\n module.createGetLocal(tempLocal0.index, NativeType.I32),\n module.createGetLocal(tempLocal1.index, NativeType.I32)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n compiler.currentFunction.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal0.index, NativeType.I64),\n module.createGetLocal(tempLocal1.index, NativeType.I64)\n )\n );\n break;\n }\n case TypeKind.U64: {\n let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n compiler.currentFunction.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.GtU64,\n module.createGetLocal(tempLocal0.index, NativeType.I64),\n module.createGetLocal(tempLocal1.index, NativeType.I64)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n compiler.currentFunction.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\n )\n );\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n compiler.currentFunction.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtU64\n : BinaryOp.GtU32,\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\n )\n );\n break;\n }\n case TypeKind.F32: {\n ret = module.createBinary(BinaryOp.MaxF32, arg0, arg1);\n break;\n }\n case TypeKind.F64: {\n ret = module.createBinary(BinaryOp.MaxF64, arg0, arg1);\n break;\n }\n default: { // void\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"min\": { // min(left: T, right: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n let flow = compiler.currentFunction.flow;\n let tempLocal0 = compiler.currentFunction.getTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg1, compiler.currentType)\n );\n compiler.currentFunction.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.LtI32,\n module.createGetLocal(tempLocal0.index, NativeType.I32),\n module.createGetLocal(tempLocal1.index, NativeType.I32)\n )\n );\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n let flow = compiler.currentFunction.flow;\n let tempLocal0 = compiler.currentFunction.getTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg1, compiler.currentType)\n );\n compiler.currentFunction.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.LtU32,\n module.createGetLocal(tempLocal0.index, NativeType.I32),\n module.createGetLocal(tempLocal1.index, NativeType.I32)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n compiler.currentFunction.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.LtI64,\n module.createGetLocal(tempLocal0.index, NativeType.I64),\n module.createGetLocal(tempLocal1.index, NativeType.I64)\n )\n );\n break;\n }\n case TypeKind.U64: {\n let tempLocal0 = compiler.currentFunction.getTempLocal(Type.i64, false);\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n compiler.currentFunction.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.LtU64,\n module.createGetLocal(tempLocal0.index, NativeType.I64),\n module.createGetLocal(tempLocal1.index, NativeType.I64)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n compiler.currentFunction.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.LtI64\n : BinaryOp.LtI32,\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\n )\n );\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n let tempLocal0 = compiler.currentFunction.getTempLocal(compiler.options.usizeType, false);\n let tempLocal1 = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n compiler.currentFunction.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.LtU64\n : BinaryOp.LtU32,\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\n )\n );\n break;\n }\n case TypeKind.F32: {\n ret = module.createBinary(BinaryOp.MinF32, arg0, arg1);\n break;\n }\n case TypeKind.F64: {\n ret = module.createBinary(BinaryOp.MinF64, arg0, arg1);\n break;\n }\n default: { // void\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"ceil\": { // ceil(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n default: { // any integer\n ret = arg0;\n break;\n }\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.CeilF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.CeilF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"floor\": { // floor(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n default: { // any integer\n ret = arg0;\n break;\n }\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.FloorF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.FloorF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"copysign\": { // copysign(left: T, right: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\n switch (compiler.currentType.kind) { // TODO: does an integer version make sense?\n case TypeKind.F32: {\n ret = module.createBinary(BinaryOp.CopysignF32, arg0, arg1);\n break;\n }\n case TypeKind.F64: {\n ret = module.createBinary(BinaryOp.CopysignF64, arg0, arg1);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"nearest\": { // nearest(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n default: { // any integer\n ret = arg0;\n break;\n }\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.NearestF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.NearestF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"reinterpret\": { // reinterpret(value: *) -> T\n if (operands.length != 1) {\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n switch (typeArguments[0].kind) {\n case TypeKind.I32:\n case TypeKind.U32: {\n arg0 = compiler.compileExpression(operands[0], Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\n ret = module.createUnary(UnaryOp.ReinterpretF32, arg0);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.IMPLICIT, WrapMode.NONE);\n ret = module.createUnary(UnaryOp.ReinterpretF64, arg0);\n break;\n }\n case TypeKind.USIZE: {\n if (typeArguments[0].is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n compiler.currentType = typeArguments[0];\n return module.createUnreachable();\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.isWasm64\n ? Type.f64\n : Type.f32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n ret = module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.ReinterpretF64\n : UnaryOp.ReinterpretF32,\n arg0\n );\n break;\n }\n case TypeKind.F32: {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\n ret = module.createUnary(UnaryOp.ReinterpretI32, arg0);\n break;\n }\n case TypeKind.F64: {\n arg0 = compiler.compileExpression(operands[0], Type.i64, ConversionKind.IMPLICIT, WrapMode.NONE);\n ret = module.createUnary(UnaryOp.ReinterpretI64, arg0);\n break;\n }\n default: { // small integers and void\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n compiler.currentType = typeArguments[0];\n return ret;\n }\n case \"sqrt\": { // sqrt(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) { // TODO: integer versions (that return f64 or convert)?\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.SqrtF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.SqrtF64, arg0);\n break;\n }\n // case TypeKind.VOID:\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"trunc\": { // trunc(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments && typeArguments.length) {\n compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n default: { // any integer\n ret = arg0;\n break;\n }\n // TODO: truncate to contextual type directly (if not void etc.)?\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.TruncF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.TruncF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n\n // memory access\n\n case \"load\": { // load(offset: usize, constantOffset?: usize) -> *\n if (operands.length < 1 || operands.length > 2) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 1) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n let offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n compiler.currentType = typeArguments[0];\n return module.createLoad(\n typeArguments[0].byteSize,\n typeArguments[0].is(TypeFlags.SIGNED | TypeFlags.INTEGER),\n arg0,\n typeArguments[0].is(TypeFlags.INTEGER) &&\n contextualType.is(TypeFlags.INTEGER) &&\n contextualType.size > typeArguments[0].size\n ? (compiler.currentType = contextualType).toNativeType()\n : (compiler.currentType = typeArguments[0]).toNativeType(),\n offset\n );\n }\n case \"store\": { // store(offset: usize, value: *, constantOffset?: usize) -> void\n compiler.currentType = Type.void;\n if (operands.length < 2 || operands.length > 3) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 2) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n let type: Type;\n if (\n typeArguments[0].is(TypeFlags.INTEGER) &&\n (\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\n )\n ) {\n arg1 = compiler.convertExpression(\n arg1,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[1]\n );\n type = typeArguments[0];\n } else {\n type = compiler.currentType;\n }\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n compiler.currentType = Type.void;\n return module.createStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\n }\n case \"sizeof\": { // sizeof() -> usize\n compiler.currentType = compiler.options.usizeType;\n if (operands.length != 0) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n let byteSize = (typeArguments)[0].byteSize;\n if (compiler.options.isWasm64) {\n // implicitly wrap if contextual type is a 32-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\n compiler.currentType = Type.u32;\n ret = module.createI32(byteSize);\n } else {\n ret = module.createI64(byteSize, 0);\n }\n } else {\n // implicitly extend if contextual type is a 64-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\n compiler.currentType = Type.u64;\n ret = module.createI64(byteSize, 0);\n } else {\n ret = module.createI32(byteSize);\n }\n }\n return ret;\n }\n case \"alignof\": { // alignof() -> usize\n compiler.currentType = compiler.options.usizeType;\n if (operands.length != 0) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n let byteSize = (typeArguments)[0].byteSize;\n let alignLog2: i32;\n switch (byteSize) {\n case 1: { alignLog2 = 0; break; }\n case 2: { alignLog2 = 1; break; }\n case 4: { alignLog2 = 2; break; }\n case 8: { alignLog2 = 3; break; }\n default: { assert(false); return module.createUnreachable(); }\n }\n if (compiler.options.isWasm64) {\n // implicitly wrap if contextual type is a 32-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\n compiler.currentType = Type.u32;\n ret = module.createI32(alignLog2);\n } else {\n ret = module.createI64(alignLog2, 0);\n }\n } else {\n // implicitly extend if contextual type is a 64-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\n compiler.currentType = Type.u64;\n ret = module.createI64(alignLog2, 0);\n } else {\n ret = module.createI32(alignLog2);\n }\n }\n return ret;\n }\n case \"offsetof\": { // offsetof(fieldName?: string) -> usize\n compiler.currentType = compiler.options.usizeType;\n if (operands.length > 1) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n let classType = typeArguments[0].classReference;\n if (!classType) {\n compiler.error( // TODO: better error\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return module.createUnreachable();\n }\n let offset: i32;\n if (operands.length) {\n if (\n operands[0].kind != NodeKind.LITERAL ||\n (operands[0]).literalKind != LiteralKind.STRING\n ) {\n compiler.error(\n DiagnosticCode.String_literal_expected,\n operands[0].range\n );\n return module.createUnreachable();\n }\n let fieldName = (operands[0]).value;\n let field = classType.members ? classType.members.get(fieldName) : null;\n if (!(field && field.kind == ElementKind.FIELD)) {\n compiler.error(\n DiagnosticCode.Type_0_has_no_property_1,\n operands[0].range, classType.internalName, fieldName\n );\n return module.createUnreachable();\n }\n offset = (field).memoryOffset;\n } else {\n offset = classType.currentMemoryOffset;\n }\n if (compiler.options.isWasm64) {\n // implicitly wrap if contextual type is a 32-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\n compiler.currentType = Type.u32;\n return module.createI32(offset);\n } else {\n return module.createI64(offset);\n }\n } else {\n // implicitly extend if contextual type is a 64-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\n compiler.currentType = Type.u64;\n return module.createI64(offset);\n } else {\n return module.createI32(offset);\n }\n }\n }\n\n // control flow\n\n case \"select\": { // select(ifTrue: T, ifFalse: T, condition: bool) -> T\n if (operands.length != 3) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\n }\n let type = compiler.currentType;\n arg1 = compiler.compileExpression(operands[1], type, ConversionKind.IMPLICIT, WrapMode.NONE);\n arg2 = compiler.makeIsTrueish(\n compiler.compileExpressionRetainType(operands[2], Type.bool, WrapMode.NONE),\n compiler.currentType\n );\n compiler.currentType = type;\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n ret = module.createSelect(arg0, arg1, arg2);\n break;\n }\n default: { // any other value type\n ret = module.createSelect(arg0, arg1, arg2);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"unreachable\": { // unreachable() -> *\n if (operands.length != 0) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return module.createUnreachable();\n }\n\n // host operations\n\n case \"memory.size\": { // memory.size() -> i32\n compiler.currentType = Type.i32;\n if (operands.length != 0) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return module.createHost(HostOp.CurrentMemory);\n }\n case \"memory.grow\": { // memory.grow(pages: i32) -> i32\n compiler.currentType = Type.i32;\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n arg0 = module.createUnreachable();\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return module.createHost(HostOp.GrowMemory, null, [ arg0 ]);\n }\n // see: https://github.com/WebAssembly/bulk-memory-operations\n case \"memory.copy\": { // memory.copy(dest: usize, src: usize: n: usize) -> void\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 3) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n compiler.currentType = Type.void;\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg2 = compiler.compileExpression(\n operands[2],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n compiler.currentType = Type.void;\n throw new Error(\"not implemented\");\n // return module.createHost(HostOp.MoveMemory, null, [ arg0, arg1, arg2 ]);\n }\n case \"memory.fill\": { // memory.fill(dest: usize, value: u8, n: usize) -> void\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 3) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n compiler.currentType = Type.void;\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n Type.u32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg2 = compiler.compileExpression(\n operands[2],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n compiler.currentType = Type.void;\n throw new Error(\"not implemented\");\n // return module.createHost(HostOp.SetMemory, null, [ arg0, arg1, arg2 ]);\n }\n\n // other\n\n case \"changetype\": { // changetype(value: *) -> T\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = typeArguments[0];\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpressionRetainType(\n operands[0],\n typeArguments[0],\n WrapMode.NONE\n );\n compiler.currentType = typeArguments[0];\n if (compiler.currentType.size != typeArguments[0].size) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return module.createUnreachable();\n }\n // if (reportNode.range.source.sourceKind != SourceKind.STDLIB)\n // compiler.warning(DiagnosticCode.Operation_is_unsafe, reportNode.range);\n return arg0; // any usize to any usize\n }\n case \"assert\": { // assert(isTrueish: T, message?: string) -> T with T != null\n if (operands.length < 1 || operands.length > 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n if (operands.length < 1) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n } else if (operands.length > 2) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.bool, WrapMode.WRAP);\n }\n\n let type = compiler.currentType;\n compiler.currentType = type.nonNullableType;\n\n // just return ifTrueish if assertions are disabled, or simplify if dropped anyway\n if (compiler.options.noAssert) {\n if (contextualType == Type.void) {\n compiler.currentType = Type.void;\n return module.createNop();\n }\n return arg0;\n }\n\n let abort = compileAbort(compiler, operands.length == 2 ? operands[1] : null, reportNode);\n\n compiler.currentType = type.nonNullableType;\n\n if (contextualType == Type.void) { // simplify if dropped anyway\n switch (compiler.currentType.kind) {\n default: { // any integer up to 32-bits incl. bool\n ret = module.createIf(\n module.createUnary(UnaryOp.EqzI32,\n arg0\n ),\n abort\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createIf(\n module.createUnary(UnaryOp.EqzI64,\n arg0\n ),\n abort\n );\n break;\n }\n case TypeKind.ISIZE:\n case TypeKind.USIZE: {\n ret = module.createIf(\n module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.EqzI64\n : UnaryOp.EqzI32,\n arg0\n ),\n abort\n );\n break;\n }\n // TODO: also check for NaN in float assertions, as in `Boolean(NaN) -> false`?\n case TypeKind.F32: {\n ret = module.createIf(\n module.createBinary(BinaryOp.EqF32,\n arg0,\n module.createF32(0)\n ),\n abort\n );\n break;\n }\n case TypeKind.F64: {\n ret = module.createIf(\n module.createBinary(BinaryOp.EqF64,\n arg0,\n module.createF64(0)\n ),\n abort\n );\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = abort;\n break;\n }\n }\n compiler.currentType = Type.void;\n } else {\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n let flow = compiler.currentFunction.flow;\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n ret = module.createIf(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createGetLocal(tempLocal.index, NativeType.I32),\n abort\n );\n break;\n }\n case TypeKind.I32:\n case TypeKind.U32:\n default: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i32, false);\n ret = module.createIf(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createGetLocal(tempLocal.index, NativeType.I32),\n abort\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.i64, false);\n ret = module.createIf(\n module.createUnary(UnaryOp.EqzI64,\n module.createTeeLocal(tempLocal.index, arg0)\n ),\n abort,\n module.createGetLocal(tempLocal.index, NativeType.I64)\n );\n break;\n }\n case TypeKind.ISIZE:\n case TypeKind.USIZE: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createIf(\n module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.EqzI64\n : UnaryOp.EqzI32,\n module.createTeeLocal(tempLocal.index, arg0)\n ),\n abort,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n );\n break;\n }\n case TypeKind.F32: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f32, false);\n ret = module.createIf(\n module.createBinary(BinaryOp.EqF32,\n module.createTeeLocal(tempLocal.index, arg0),\n module.createF32(0)\n ),\n abort,\n module.createGetLocal(tempLocal.index, NativeType.F32)\n );\n break;\n }\n case TypeKind.F64: {\n let tempLocal = compiler.currentFunction.getAndFreeTempLocal(Type.f64, false);\n ret = module.createIf(\n module.createBinary(BinaryOp.EqF64,\n module.createTeeLocal(tempLocal.index, arg0),\n module.createF64(0)\n ),\n abort,\n module.createGetLocal(tempLocal.index, NativeType.F64)\n );\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = abort;\n break;\n }\n }\n }\n return ret;\n }\n case \"unchecked\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n let flow = compiler.currentFunction.flow;\n flow.set(FlowFlags.UNCHECKED_CONTEXT);\n ret = compiler.compileExpressionRetainType(operands[0], contextualType, WrapMode.NONE);\n flow.unset(FlowFlags.UNCHECKED_CONTEXT);\n return ret;\n }\n case \"call_indirect\": { // call_indirect(target: Function | u32, ...args: *[]) -> T\n if (operands.length < 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n let returnType: Type;\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n returnType = typeArguments[0];\n } else {\n returnType = contextualType;\n }\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\n if (compiler.currentType.kind != TypeKind.U32) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n operands[0].range\n );\n return module.createUnreachable();\n }\n let numOperands = operands.length - 1;\n let operandExprs = new Array(numOperands);\n let signatureParts = new Array(numOperands + 1);\n let nativeReturnType = returnType.toNativeType();\n let nativeParamTypes = new Array(numOperands);\n for (let i = 0; i < numOperands; ++i) {\n operandExprs[i] = compiler.compileExpressionRetainType(operands[1 + i], Type.i32, WrapMode.NONE);\n let operandType = compiler.currentType;\n signatureParts[i] = operandType.toSignatureString();\n nativeParamTypes[i] = operandType.toNativeType();\n }\n signatureParts[numOperands] = returnType.toSignatureString();\n let typeName = signatureParts.join(\"\");\n let typeRef = module.getFunctionTypeBySignature(nativeReturnType, nativeParamTypes);\n if (!typeRef) typeRef = module.addFunctionType(typeName, nativeReturnType, nativeParamTypes);\n compiler.currentType = returnType;\n // of course this can easily result in a 'RuntimeError: function signature mismatch' trap and\n // thus must be used with care. it exists because it *might* be useful in specific scenarios.\n return module.createCallIndirect(arg0, operandExprs, typeName);\n }\n case \"instantiate\": {\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n let classInstance = typeArguments[0].classReference;\n if (!classInstance) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return module.createUnreachable();\n }\n return compiler.compileInstantiate(classInstance, operands, reportNode);\n }\n\n // user-defined diagnostic macros\n\n case \"ERROR\": {\n compiler.error(\n DiagnosticCode.User_defined_0,\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\n );\n return module.createUnreachable();\n }\n case \"WARNING\": {\n compiler.warning(\n DiagnosticCode.User_defined_0,\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\n );\n return module.createNop();\n }\n case \"INFO\": {\n compiler.info(\n DiagnosticCode.User_defined_0,\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\n );\n return module.createNop();\n }\n\n // conversions\n\n case \"i8\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.i8;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.i8,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"i16\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.i16;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.i16,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"i32\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.i32;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.i32,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"i64\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.i64;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.i64,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"isize\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = compiler.options.isWasm64\n ? Type.isize64\n : Type.isize32;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n compiler.options.isWasm64\n ? Type.isize64\n : Type.isize32,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"u8\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.u8;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.u8,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"u16\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.u16;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.u16,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"u32\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.u32;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.u32,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"u64\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.u64;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.u64,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"usize\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = compiler.options.usizeType;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"bool\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.bool;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.bool,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"f32\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.f32;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.f32,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"f64\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.f64;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.f64,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n\n // gc\n\n case \"iterateRoots\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.void;\n return module.createUnreachable();\n }\n let expr = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\n let type = compiler.currentType;\n let signatureReference = type.signatureReference;\n compiler.currentType = Type.void;\n if (\n !type.is(TypeFlags.REFERENCE) ||\n !signatureReference ||\n signatureReference.parameterTypes.length != 1 ||\n signatureReference.parameterTypes[0] != compiler.options.usizeType\n ) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n reportNode.range, type.toString(), \"(ref: usize) => void\"\n );\n return module.createUnreachable();\n }\n compiler.currentType = Type.void;\n // just emit a call even if the function doesn't yet exist\n compiler.needsIterateRoots = true;\n return module.createCall(\"~iterateRoots\", [ expr ], NativeType.None);\n }\n }\n var expr = deferASMCall(compiler, prototype, operands, contextualType, reportNode);\n if (expr) {\n if (typeArguments && typeArguments.length) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return expr;\n }\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return module.createUnreachable();\n}\n\n/** Defers an inline-assembler-like call to a built-in function. */\nfunction deferASMCall(\n compiler: Compiler,\n prototype: FunctionPrototype,\n operands: Expression[],\n contextualType: Type,\n reportNode: Node\n): ExpressionRef {\n switch (prototype.internalName) {\n\n // TODO: Operators can't be just deferred (don't have a corresponding generic built-in)\n // add, sub, mul, div_s, div_u, rem_s, rem_u\n // and, or, xor, shl, shr_u, shr_s\n // eq, eqz, ne, lt_s, lt_u, le_s, le_u, gt_s, gt_u, ge_s, ge_u\n\n case \"i32.clz\": return deferASM(\"clz\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.clz\": return deferASM(\"clz\", compiler, Type.i64, operands, Type.i64, reportNode);\n\n case \"i32.ctz\": return deferASM(\"ctz\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.ctz\": return deferASM(\"ctz\", compiler, Type.i64, operands, Type.i64, reportNode);\n\n case \"i32.popcnt\": return deferASM(\"popcnt\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.popcnt\": return deferASM(\"popcnt\", compiler, Type.i64, operands, Type.i64, reportNode);\n\n case \"i32.rotl\": return deferASM(\"rotl\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.rotl\": return deferASM(\"rotl\", compiler, Type.i64, operands, Type.i64, reportNode);\n\n case \"i32.rotr\": return deferASM(\"rotr\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.rotr\": return deferASM(\"rotr\", compiler, Type.i64, operands, Type.i64, reportNode);\n\n case \"f32.abs\": return deferASM(\"abs\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.abs\": return deferASM(\"abs\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.max\": return deferASM(\"max\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.max\": return deferASM(\"max\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.min\": return deferASM(\"min\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.min\": return deferASM(\"min\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.ceil\": return deferASM(\"ceil\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.ceil\": return deferASM(\"ceil\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.floor\": return deferASM(\"floor\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.floor\": return deferASM(\"floor\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.copysign\": return deferASM(\"copysign\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.copysign\": return deferASM(\"copysign\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.nearest\": return deferASM(\"nearest\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.nearest\": return deferASM(\"nearest\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"i32.reinterpret_f32\": return deferASM(\"reinterpret\", compiler, Type.i32, operands, Type.f32, reportNode);\n case \"i64.reinterpret_f64\": return deferASM(\"reinterpret\", compiler, Type.i64, operands, Type.f64, reportNode);\n case \"f32.reinterpret_i32\": return deferASM(\"reinterpret\", compiler, Type.f32, operands, Type.i32, reportNode);\n case \"f64.reinterpret_i64\": return deferASM(\"reinterpret\", compiler, Type.f64, operands, Type.i64, reportNode);\n\n case \"f32.sqrt\": return deferASM(\"sqrt\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.sqrt\": return deferASM(\"sqrt\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.trunc\": return deferASM(\"trunc\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.trunc\": return deferASM(\"trunc\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"i32.load8_s\": return deferASM(\"load\", compiler, Type.i8, operands, Type.i32, reportNode);\n case \"i32.load8_u\": return deferASM(\"load\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.load16_s\": return deferASM(\"load\", compiler, Type.i16, operands, Type.i32, reportNode);\n case \"i32.load16_u\": return deferASM(\"load\", compiler, Type.u16, operands, Type.u32, reportNode);\n case \"i32.load\": return deferASM(\"load\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.load8_s\": return deferASM(\"load\", compiler, Type.i8, operands, Type.i64, reportNode);\n case \"i64.load8_u\": return deferASM(\"load\", compiler, Type.u8, operands, Type.u64, reportNode);\n case \"i64.load16_s\": return deferASM(\"load\", compiler, Type.i16, operands, Type.i64, reportNode);\n case \"i64.load16_u\": return deferASM(\"load\", compiler, Type.u16, operands, Type.u64, reportNode);\n case \"i64.load32_s\": return deferASM(\"load\", compiler, Type.i32, operands, Type.i64, reportNode);\n case \"i64.load32_u\": return deferASM(\"load\", compiler, Type.u32, operands, Type.u64, reportNode);\n case \"i64.load\": return deferASM(\"load\", compiler, Type.i64, operands, Type.i64, reportNode);\n case \"f32.load\": return deferASM(\"load\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.load\": return deferASM(\"load\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"i32.store8\": return deferASM(\"store\", compiler, Type.i8, operands, Type.i32, reportNode);\n case \"i32.store16\": return deferASM(\"store\", compiler, Type.i16, operands, Type.i32, reportNode);\n case \"i32.store\": return deferASM(\"store\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.store8\": return deferASM(\"store\", compiler, Type.i8, operands, Type.i64, reportNode);\n case \"i64.store16\": return deferASM(\"store\", compiler, Type.i16, operands, Type.i64, reportNode);\n case \"i64.store32\": return deferASM(\"store\", compiler, Type.i32, operands, Type.i64, reportNode);\n case \"i64.store\": return deferASM(\"store\", compiler, Type.i64, operands, Type.i64, reportNode);\n case \"f32.store\": return deferASM(\"store\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.store\": return deferASM(\"store\", compiler, Type.f64, operands, Type.f64, reportNode);\n }\n return 0;\n}\n\n/** A helper for deferring inline-assembler-like calls to built-in functions. */\nfunction deferASM(\n name: string,\n compiler: Compiler,\n typeArgument: Type,\n operands: Expression[],\n valueType: Type,\n reportNode: Node\n): ExpressionRef {\n var prototype = assert(compiler.program.elementsLookup.get(name));\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n return compileCall(compiler, prototype, [ typeArgument ], operands, valueType, reportNode);\n}\n\n/** Evaluates the constant type of a type argument *or* expression. */\nfunction evaluateConstantType(\n compiler: Compiler,\n typeArguments: Type[] | null,\n operands: Expression[],\n reportNode: Node\n): Type | null {\n if (operands.length == 0) { // requires type argument\n if (!typeArguments || typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return null;\n }\n return typeArguments[0];\n }\n if (operands.length == 1) { // optional type argument\n if (typeArguments) {\n if (typeArguments.length == 1) {\n compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n if (typeArguments.length) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return null;\n }\n compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\n }\n } else {\n compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\n }\n return compiler.currentType;\n }\n if (typeArguments && typeArguments.length > 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return null;\n}\n\n/** Evaluates a `constantOffset` argument.*/\nfunction evaluateConstantOffset(compiler: Compiler, expression: Expression): i32 {\n var expr: ExpressionRef;\n var value: i32;\n if (compiler.options.isWasm64) {\n expr = compiler.precomputeExpression(expression, Type.usize64, ConversionKind.IMPLICIT, WrapMode.NONE);\n if (\n getExpressionId(expr) != ExpressionId.Const ||\n getExpressionType(expr) != NativeType.I64 ||\n getConstValueI64High(expr) != 0 ||\n (value = getConstValueI64Low(expr)) < 0\n ) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n value = -1;\n }\n } else {\n expr = compiler.precomputeExpression(expression, Type.usize32, ConversionKind.IMPLICIT, WrapMode.NONE);\n if (\n getExpressionId(expr) != ExpressionId.Const ||\n getExpressionType(expr) != NativeType.I32 ||\n (value = getConstValueI32(expr)) < 0\n ) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n value = -1;\n }\n }\n return value;\n}\n\n/** Compiles an abort wired to the conditionally imported 'abort' function. */\nexport function compileAbort(\n compiler: Compiler,\n message: Expression | null,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n var module = compiler.module;\n\n var stringType = program.typesLookup.get(\"string\");\n if (!stringType) return module.createUnreachable();\n\n var abortInstance = program.abortInstance;\n if (!(abortInstance && compiler.compileFunction(abortInstance))) return module.createUnreachable();\n\n var messageArg = message != null\n ? compiler.compileExpression(message, stringType, ConversionKind.IMPLICIT, WrapMode.NONE)\n : stringType.toNativeZero(module);\n\n var filenameArg = compiler.ensureStaticString(reportNode.range.source.normalizedPath);\n\n compiler.currentType = Type.void;\n return module.createBlock(null, [\n module.createCall(\n abortInstance.internalName, [\n messageArg,\n filenameArg,\n module.createI32(reportNode.range.line),\n module.createI32(reportNode.range.column)\n ],\n NativeType.None\n ),\n module.createUnreachable()\n ]);\n}\n\n/** Compiles the iterateRoots function if requires. */\nexport function compileIterateRoots(compiler: Compiler): void {\n var module = compiler.module;\n var exprs = new Array();\n\n for (let element of compiler.program.elementsLookup.values()) {\n if (element.kind != ElementKind.GLOBAL) continue;\n let global = element;\n let classReference = global.type.classReference;\n if (\n global.is(CommonFlags.COMPILED) &&\n classReference !== null &&\n !classReference.hasDecorator(DecoratorFlags.UNMANAGED)\n ) {\n if (global.is(CommonFlags.INLINED)) {\n let value = global.constantIntegerValue;\n exprs.push(\n module.createCallIndirect(\n module.createGetLocal(0, NativeType.I32),\n [\n compiler.options.isWasm64\n ? module.createI64(i64_low(value), i64_high(value))\n : module.createI32(i64_low(value))\n ],\n \"iv\"\n )\n );\n } else {\n exprs.push(\n module.createCallIndirect(\n module.createGetLocal(0, NativeType.I32),\n [\n module.createGetGlobal(\n global.internalName,\n compiler.options.nativeSizeType\n )\n ],\n \"iv\"\n )\n );\n }\n }\n }\n var typeRef = compiler.ensureFunctionType([ Type.i32 ], Type.void);\n module.addFunction(\"~iterateRoots\", typeRef, [],\n exprs.length\n ? module.createBlock(null, exprs)\n : module.createNop()\n );\n}\n\n/** Ensures that the specified class's GC hook exists and returns its function table index. */\nexport function ensureGCHook(\n compiler: Compiler,\n classInstance: Class\n): u32 {\n var program = compiler.program;\n assert(classInstance.type.isManaged(program));\n\n // check if the GC hook has already been created\n {\n let existingIndex = classInstance.gcHookIndex;\n if (existingIndex != -1) return existingIndex;\n }\n\n // check if the class implements a custom GC function (only valid for internals)\n var members = classInstance.members;\n if (classInstance.prototype.declaration.range.source.isLibrary) {\n if (members !== null && members.has(\"__gc\")) {\n let gcPrototype = assert(members.get(\"__gc\"));\n assert(gcPrototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n let gcInstance = assert(program.resolver.resolveFunction(gcPrototype, null));\n assert(gcInstance.is(CommonFlags.PRIVATE | CommonFlags.INSTANCE));\n assert(!gcInstance.isAny(CommonFlags.AMBIENT | CommonFlags.VIRTUAL));\n assert(gcInstance.signature.parameterTypes.length == 0);\n assert(gcInstance.signature.returnType == Type.void);\n gcInstance.internalName = classInstance.internalName + \"~gc\";\n assert(compiler.compileFunction(gcInstance));\n let index = compiler.ensureFunctionTableEntry(gcInstance);\n classInstance.gcHookIndex = index;\n return index;\n }\n }\n\n var module = compiler.module;\n var options = compiler.options;\n var nativeSizeType = options.nativeSizeType;\n var nativeSizeSize = options.usizeType.byteSize;\n var body = new Array();\n\n // nothing to mark if 'this' is null\n body.push(\n module.createIf(\n module.createUnary(\n options.isWasm64\n ? UnaryOp.EqzI64\n : UnaryOp.EqzI32,\n module.createGetLocal(0, nativeSizeType)\n ),\n module.createReturn()\n )\n );\n\n // remember the function index so we don't recurse infinitely\n var functionTable = compiler.functionTable;\n var gcHookIndex = functionTable.length;\n functionTable.push(\"\");\n classInstance.gcHookIndex = gcHookIndex;\n\n // if the class extends a base class, call its hook first (calls mark)\n var baseInstance = classInstance.base;\n if (baseInstance) {\n assert(baseInstance.type.isManaged(program));\n body.push(\n module.createCallIndirect(\n module.createI32(\n ensureGCHook(compiler, baseInstance.type.classReference)\n ),\n [\n module.createGetLocal(0, nativeSizeType)\n ],\n nativeSizeType == NativeType.I64 ? \"Iv\" : \"iv\"\n )\n );\n\n // if this class is the top-most base class, mark the instance\n } else {\n body.push(\n module.createCall(assert(program.gcMarkInstance).internalName, [\n module.createGetLocal(0, nativeSizeType)\n ], NativeType.None)\n );\n }\n\n // mark instances assigned to own fields that are again references\n if (members) {\n for (let member of members.values()) {\n if (member.kind == ElementKind.FIELD) {\n if ((member).parent === classInstance) {\n let type = (member).type;\n if (type.isManaged(program)) {\n let offset = (member).memoryOffset;\n assert(offset >= 0);\n body.push(\n module.createCall(assert(program.gcMarkInstance).internalName, [\n module.createLoad(\n nativeSizeSize,\n false,\n module.createGetLocal(0, nativeSizeType),\n nativeSizeType,\n offset\n )\n ], NativeType.None)\n );\n }\n }\n }\n }\n }\n\n // add the function to the module and return its table index\n var funcName = classInstance.internalName + \"~gc\";\n module.addFunction(\n funcName,\n compiler.ensureFunctionType(null, Type.void, options.usizeType),\n null,\n module.createBlock(null, body)\n );\n functionTable[gcHookIndex] = funcName;\n return gcHookIndex;\n}\n","/** @module util *//***/\n\n/** An enum of named character codes. */\nexport const enum CharCode {\n\n NULL = 0,\n LINEFEED = 0x0A,\n CARRIAGERETURN = 0x0D,\n LINESEPARATOR = 0x2028,\n PARAGRAPHSEPARATOR = 0x2029,\n NEXTLINE = 0x0085,\n\n SPACE = 0x20,\n NONBREAKINGSPACE = 0xA0,\n ENQUAD = 0x2000,\n EMQUAD = 0x2001,\n ENSPACE = 0x2002,\n EMSPACE = 0x2003,\n THREEPEREMSPACE = 0x2004,\n FOURPEREMSPACE = 0x2005,\n SIXPEREMSPACE = 0x2006,\n FIGURESPACE = 0x2007,\n PUNCTUATIONSPACE = 0x2008,\n THINSPACE = 0x2009,\n HAIRSPACE = 0x200A,\n ZEROWIDTHSPACE = 0x200B,\n NARROWNOBREAKSPACE = 0x202F,\n IDEOGRAPHICSPACE = 0x3000,\n MATHEMATICALSPACE = 0x205F,\n OGHAM = 0x1680,\n\n _ = 0x5F,\n\n _0 = 0x30,\n _1 = 0x31,\n _2 = 0x32,\n _3 = 0x33,\n _4 = 0x34,\n _5 = 0x35,\n _6 = 0x36,\n _7 = 0x37,\n _8 = 0x38,\n _9 = 0x39,\n\n a = 0x61,\n b = 0x62,\n c = 0x63,\n d = 0x64,\n e = 0x65,\n f = 0x66,\n g = 0x67,\n h = 0x68,\n i = 0x69,\n j = 0x6A,\n k = 0x6B,\n l = 0x6C,\n m = 0x6D,\n n = 0x6E,\n o = 0x6F,\n p = 0x70,\n q = 0x71,\n r = 0x72,\n s = 0x73,\n t = 0x74,\n u = 0x75,\n v = 0x76,\n w = 0x77,\n x = 0x78,\n y = 0x79,\n z = 0x7A,\n\n A = 0x41,\n B = 0x42,\n C = 0x43,\n D = 0x44,\n E = 0x45,\n F = 0x46,\n G = 0x47,\n H = 0x48,\n I = 0x49,\n J = 0x4A,\n K = 0x4B,\n L = 0x4C,\n M = 0x4D,\n N = 0x4E,\n O = 0x4F,\n P = 0x50,\n Q = 0x51,\n R = 0x52,\n S = 0x53,\n T = 0x54,\n U = 0x55,\n V = 0x56,\n W = 0x57,\n X = 0x58,\n Y = 0x59,\n Z = 0x5a,\n\n AMPERSAND = 0x26,\n ASTERISK = 0x2A,\n AT = 0x40,\n BACKSLASH = 0x5C,\n BACKTICK = 0x60,\n BAR = 0x7C,\n CARET = 0x5E,\n CLOSEBRACE = 0x7D,\n CLOSEBRACKET = 0x5D,\n CLOSEPAREN = 0x29,\n COLON = 0x3A,\n COMMA = 0x2C,\n DOLLAR = 0x24,\n DOT = 0x2E,\n DOUBLEQUOTE = 0x22,\n EQUALS = 0x3D,\n EXCLAMATION = 0x21,\n GREATERTHAN = 0x3E,\n HASH = 0x23,\n LESSTHAN = 0x3C,\n MINUS = 0x2D,\n OPENBRACE = 0x7B,\n OPENBRACKET = 0x5B,\n OPENPAREN = 0x28,\n PERCENT = 0x25,\n PLUS = 0x2B,\n QUESTION = 0x3F,\n SEMICOLON = 0x3B,\n SINGLEQUOTE = 0x27,\n SLASH = 0x2F,\n TILDE = 0x7E,\n\n BACKSPACE = 0x08,\n FORMFEED = 0x0C,\n BYTEORDERMARK = 0xFEFF,\n TAB = 0x09,\n VERTICALTAB = 0x0B\n}\n\n/** Tests if the specified character code is some sort of line break. */\nexport function isLineBreak(c: CharCode): bool {\n switch (c) {\n case CharCode.LINEFEED:\n case CharCode.CARRIAGERETURN:\n case CharCode.LINESEPARATOR:\n case CharCode.PARAGRAPHSEPARATOR: {\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\n/** Tests if the specified character code is some sort of white space. */\nexport function isWhiteSpace(c: i32): bool {\n switch (c) {\n case CharCode.SPACE:\n case CharCode.TAB:\n case CharCode.VERTICALTAB:\n case CharCode.FORMFEED:\n case CharCode.NONBREAKINGSPACE:\n case CharCode.NEXTLINE:\n case CharCode.OGHAM:\n case CharCode.NARROWNOBREAKSPACE:\n case CharCode.MATHEMATICALSPACE:\n case CharCode.IDEOGRAPHICSPACE:\n case CharCode.BYTEORDERMARK: {\n return true;\n }\n default: {\n return c >= CharCode.ENQUAD && c <= CharCode.ZEROWIDTHSPACE;\n }\n }\n}\n\n/** Tests if the specified character code is a valid decimal digit. */\nexport function isDecimalDigit(c: i32): bool {\n return c >= CharCode._0 && c <= CharCode._9;\n}\n\n/** Tests if the specified character code is a valid octal digit. */\nexport function isOctalDigit(c: i32): bool {\n return c >= CharCode._0 && c <= CharCode._7;\n}\n\n/** Tests if the specified character code is a valid start of an identifier. */\nexport function isIdentifierStart(c: i32): bool {\n return c >= CharCode.A && c <= CharCode.Z\n || c >= CharCode.a && c <= CharCode.z\n || c == CharCode.DOLLAR\n || c == CharCode._\n || c > 0x7f && isUnicodeIdentifierStart(c);\n}\n\n/** Tests if the specified character code is a valid keyword character. */\nexport function isKeywordCharacter(c: i32): bool {\n return c >= CharCode.a && c <= CharCode.z;\n}\n\n/** Tests if the specified character code is a valid part of an identifier. */\nexport function isIdentifierPart(c: i32): bool {\n return c >= CharCode.A && c <= CharCode.Z\n || c >= CharCode.a && c <= CharCode.z\n || c >= CharCode._0 && c <= CharCode._9\n || c == CharCode.DOLLAR\n || c == CharCode._\n || c > 0x7f && isUnicodeIdentifierPart(c);\n}\n\n// storing as u16 to save memory\nconst unicodeIdentifierStart: u16[] = [\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\n 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906,\n 908, 908, 910, 929, 931,\n 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514,\n 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774,\n 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969,\n 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088,\n 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384,\n 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474,\n 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\n 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\n 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705,\n 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784,\n 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873,\n 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958,\n 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986,\n 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125,\n 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240,\n 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333,\n 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\n 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634,\n 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725,\n 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\n 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840,\n 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186,\n 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293,\n 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798,\n 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\n 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872,\n 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016,\n 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389,\n 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688,\n 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141,\n 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424,\n 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025,\n 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130,\n 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\n 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505,\n 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584,\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520,\n 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670,\n 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720,\n 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329,\n 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540,\n 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893,\n 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538,\n 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888,\n 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015,\n 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\n 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520,\n 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695,\n 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739,\n 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798,\n 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243,\n 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285,\n 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323,\n 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\n 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\n 65479, 65482, 65487, 65490, 65495, 65498, 65500,\n];\nconst unicodeIdentifierPart: u16[] = [\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\n 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906,\n 908, 908, 910, 929, 931,\n 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415,\n 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520,\n 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788,\n 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112,\n 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423,\n 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482,\n 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525,\n 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602,\n 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632,\n 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693,\n 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757,\n 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821,\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884,\n 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929,\n 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972,\n 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018,\n 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088,\n 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157,\n 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216,\n 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\n 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340,\n 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424,\n 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515,\n 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570,\n 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720,\n 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751,\n 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789,\n 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895,\n 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028,\n 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304,\n 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744,\n 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808,\n 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108,\n 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902,\n 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099,\n 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272,\n 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516,\n 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783,\n 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155,\n 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676,\n 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027,\n 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134,\n 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205,\n 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417,\n 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477,\n 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\n 8521, 8526, 8526, 8544, 8584,\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559,\n 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686,\n 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728,\n 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335,\n 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\n 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799,\n 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512,\n 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783,\n 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072,\n 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309,\n 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584,\n 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741,\n 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808,\n 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203,\n 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275,\n 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321,\n 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008,\n 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140,\n 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382,\n 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,\n];\n\nfunction lookupInUnicodeMap(code: u16, map: u16[]): bool {\n if (code < map[0]) return false;\n\n var lo = 0;\n var hi = map.length;\n var mid: i32;\n\n while (lo + 1 < hi) {\n mid = lo + (hi - lo) / 2;\n mid -= mid % 2;\n if (map[mid] <= code && code <= map[mid + 1]) {\n return true;\n }\n if (code < map[mid]) {\n hi = mid;\n } else {\n lo = mid + 2;\n }\n }\n return false;\n}\n\nfunction isUnicodeIdentifierStart(code: i32): bool {\n return code < 0 || code > 0xffff ? false\n : lookupInUnicodeMap(code as u16, unicodeIdentifierStart);\n}\n\nfunction isUnicodeIdentifierPart(code: i32): bool {\n return code < 0 || code > 0xffff ? false\n : lookupInUnicodeMap(code as u16, unicodeIdentifierPart);\n}\n","export function makeArray(original: Array | null = null): Array {\n if (original) {\n let cloned = new Array(original.length);\n for (let i = 0, k = original.length; i < k; ++i) unchecked(cloned[i] = original[i]);\n return cloned;\n }\n return new Array();\n}\n\nexport function makeSet(original: Set | null = null): Set {\n if (original) {\n let cloned = new Set();\n for (let v of original) cloned.add(v);\n return cloned;\n }\n return new Set();\n}\n\nexport function makeMap(original: Map | null = null): Map {\n if (original) {\n let cloned = new Map();\n for (let [k, v] of original) cloned.set(k, v);\n return cloned;\n }\n return new Map();\n}\n","/** @module util *//***/\n\nimport {\n CharCode\n} from \"./charcode\";\n\nconst separator = CharCode.SLASH;\n\n/**\n * Normalizes the specified path, removing interior placeholders.\n * Expects a posix-compatible relative path (not Windows compatible).\n */\nexport function normalizePath(path: string): string {\n var pos = 0;\n var len = path.length;\n\n // trim leading './'\n while (pos + 1 < len &&\n path.charCodeAt(pos) == CharCode.DOT &&\n path.charCodeAt(pos + 1) == separator\n ) {\n pos += 2;\n }\n\n if (pos > 0 || len < path.length) {\n path = path.substring(pos, len);\n len -= pos;\n pos = 0;\n }\n\n var atEnd: bool;\n while (pos + 1 < len) {\n atEnd = false;\n\n // we are only interested in '/.' sequences ...\n if (\n path.charCodeAt(pos) == separator &&\n path.charCodeAt(pos + 1) == CharCode.DOT\n ) {\n // '/.' ( '/' | $ )\n atEnd = pos + 2 == len;\n if (atEnd ||\n pos + 2 < len &&\n path.charCodeAt(pos + 2) == separator\n ) {\n path = atEnd\n ? path.substring(0, pos)\n : path.substring(0, pos) + path.substring(pos + 2);\n len -= 2;\n continue;\n }\n\n // '/.' ( './' | '.' $ )\n atEnd = pos + 3 == len;\n if (atEnd && path.charCodeAt(pos + 2) == CharCode.DOT ||\n pos + 3 < len &&\n path.charCodeAt(pos + 2) == CharCode.DOT &&\n path.charCodeAt(pos + 3) == separator\n ) {\n // find preceeding '/'\n let ipos = pos;\n while (--ipos >= 0) {\n if (path.charCodeAt(ipos) == separator) {\n if (pos - ipos != 3 ||\n path.charCodeAt(ipos + 1) != CharCode.DOT ||\n path.charCodeAt(ipos + 2) != CharCode.DOT\n ) { // exclude '..' itself\n path = atEnd\n ? path.substring(0, ipos)\n : path.substring(0, ipos) + path.substring(pos + 3);\n len -= pos + 3 - ipos;\n pos = ipos - 1; // incremented again at end of loop\n }\n break;\n }\n }\n\n // if there's no preceeding '/', trim start if non-empty\n if (ipos < 0 && pos > 0) {\n if (pos != 2 ||\n path.charCodeAt(0) != CharCode.DOT ||\n path.charCodeAt(1) != CharCode.DOT\n ) { // exclude '..' itself\n path = path.substring(pos + 4);\n len = path.length;\n continue;\n }\n }\n }\n }\n pos++;\n }\n return len > 0 ? path : \".\";\n}\n\n/** Resolves the specified path relative to the specified origin. */\nexport function resolvePath(normalizedPath: string, origin: string): string {\n if (normalizedPath.startsWith(\"std/\")) {\n return normalizedPath;\n }\n return normalizePath(\n dirname(origin) + String.fromCharCode(separator) + normalizedPath\n );\n}\n\n/** Obtains the directory portion of a normalized path. */\nexport function dirname(normalizedPath: string): string {\n var pos = normalizedPath.length;\n while (--pos > 0) {\n if (normalizedPath.charCodeAt(pos) == separator) {\n return normalizedPath.substring(0, pos);\n }\n }\n return \".\";\n}\n","/** @module util *//***/\n\nconst indentX1 = \" \";\nconst indentX2 = \" \";\nconst indentX4 = \" \";\n\n/** Creates an indentation matching the number of specified levels. */\nexport function indent(sb: string[], level: i32): void {\n while (level >= 4) {\n sb.push(indentX4);\n level -= 4;\n }\n if (level >= 2) {\n sb.push(indentX2);\n level -= 2;\n }\n if (level) {\n sb.push(indentX1);\n }\n}\n","/** @module util *//***/\n\n/** Reads an 8-bit integer from the specified buffer. */\nexport function readI8(buffer: Uint8Array, offset: i32): i32 {\n return buffer[offset];\n}\n\n/** Writes an 8-bit integer to the specified buffer. */\nexport function writeI8(value: i32, buffer: Uint8Array, offset: i32): void {\n buffer[offset] = value;\n}\n\n/** Reads a 16-bit integer from the specified buffer. */\nexport function readI16(buffer: Uint8Array, offset: i32): i32 {\n return buffer[offset ]\n | buffer[offset + 1] << 8;\n}\n\n/** Writes a 16-bit integer to the specified buffer. */\nexport function writeI16(value: i32, buffer: Uint8Array, offset: i32): void {\n buffer[offset ] = value;\n buffer[offset + 1] = value >>> 8;\n}\n\n/** Reads a 32-bit integer from the specified buffer. */\nexport function readI32(buffer: Uint8Array, offset: i32): i32 {\n return buffer[offset ]\n | buffer[offset + 1] << 8\n | buffer[offset + 2] << 16\n | buffer[offset + 3] << 24;\n}\n\n/** Writes a 32-bit integer to the specified buffer. */\nexport function writeI32(value: i32, buffer: Uint8Array, offset: i32): void {\n buffer[offset ] = value;\n buffer[offset + 1] = value >>> 8;\n buffer[offset + 2] = value >>> 16;\n buffer[offset + 3] = value >>> 24;\n}\n\n/** Reads a 64-bit integer from the specified buffer. */\nexport function readI64(buffer: Uint8Array, offset: i32): I64 {\n var lo = readI32(buffer, offset);\n var hi = readI32(buffer, offset + 4);\n return i64_new(lo, hi);\n}\n\n/** Writes a 64-bit integer to the specified buffer. */\nexport function writeI64(value: I64, buffer: Uint8Array, offset: i32): void {\n writeI32(i64_low(value), buffer, offset);\n writeI32(i64_high(value), buffer, offset + 4);\n}\n\n/** Reads a 32-bit float from the specified buffer. */\nexport function readF32(buffer: Uint8Array, offset: i32): f32 {\n return i32_as_f32(readI32(buffer, offset));\n}\n\n/** Writes a 32-bit float to the specified buffer. */\nexport function writeF32(value: f32, buffer: Uint8Array, offset: i32): void {\n writeI32(f32_as_i32(value), buffer, offset);\n}\n\n/** Reads a 64-bit float from the specified buffer. */\nexport function readF64(buffer: Uint8Array, offset: i32): f64 {\n return i64_as_f64(readI64(buffer, offset));\n}\n\n/** Writes a 64-bit float to the specified buffer. */\nexport function writeF64(value: f64, buffer: Uint8Array, offset: i32): void {\n var valueI64 = f64_as_i64(value);\n writeI32(i64_low(valueI64), buffer, offset);\n writeI32(i64_high(valueI64), buffer, offset + 4);\n}\n","/**\n * Low-level C-like compiler API.\n * @module index\n *//***/\n\nimport {\n Compiler,\n Options,\n Target,\n Feature\n} from \"./compiler\";\n\nimport {\n Decompiler\n} from \"./decompiler\";\n\nimport {\n IDLBuilder,\n TSDBuilder\n} from \"./definitions\";\n\nimport {\n DiagnosticMessage,\n DiagnosticCategory,\n formatDiagnosticMessage\n} from \"./diagnostics\";\n\nimport {\n Module\n} from \"./module\";\n\nimport {\n Parser\n} from \"./parser\";\n\nimport {\n Program\n} from \"./program\";\n\n/** Parses a source file. If `parser` has been omitted a new one is created. */\nexport function parseFile(text: string, path: string, isEntry: bool = false,\n parser: Parser | null = null\n): Parser {\n if (!parser) parser = new Parser();\n parser.parseFile(text, path, isEntry);\n return parser;\n}\n\n/** Obtains the next required file's path. Returns `null` once complete. */\nexport function nextFile(parser: Parser): string | null {\n return parser.nextFile();\n}\n\n/** Obtains the next diagnostic message. Returns `null` once complete. */\nexport function nextDiagnostic(parser: Parser): DiagnosticMessage | null {\n var program = parser.program;\n return program.diagnosticsOffset < program.diagnostics.length\n ? program.diagnostics[program.diagnosticsOffset++]\n : null;\n}\n\n/** Formats a diagnostic message to a string. */\nexport { formatDiagnosticMessage as formatDiagnostic };\n\n/** Tests whether a diagnostic is informatory. */\nexport function isInfo(message: DiagnosticMessage): bool {\n return message.category == DiagnosticCategory.INFO;\n}\n\n/** Tests whether a diagnostic is a warning. */\nexport function isWarning(message: DiagnosticMessage): bool {\n return message.category == DiagnosticCategory.WARNING;\n}\n\n/** Tests whether a diagnostic is an error. */\nexport function isError(message: DiagnosticMessage): bool {\n return message.category == DiagnosticCategory.ERROR;\n}\n\n/** Creates a new set of compiler options. */\nexport function createOptions(): Options {\n return new Options();\n}\n\n/** Sets the `target` option. */\nexport function setTarget(options: Options, target: Target): void {\n options.target = target;\n}\n\n/** Sets the `noTreeShaking` option. */\nexport function setNoTreeShaking(options: Options, noTreeShaking: bool): void {\n options.noTreeShaking = noTreeShaking;\n}\n\n/** Sets the `noAssert` option. */\nexport function setNoAssert(options: Options, noAssert: bool): void {\n options.noAssert = noAssert;\n}\n\n/** Sets the `importMemory` option. */\nexport function setImportMemory(options: Options, importMemory: bool): void {\n options.importMemory = importMemory;\n}\n\n/** Sets the `importTable` option. */\nexport function setImportTable(options: Options, importTable: bool): void {\n options.importTable = importTable;\n}\n\n/** Sets the `sourceMap` option. */\nexport function setSourceMap(options: Options, sourceMap: bool): void {\n options.sourceMap = sourceMap;\n}\n\n/** Sets the `memoryBase` option. */\nexport function setMemoryBase(options: Options, memoryBase: u32): void {\n options.memoryBase = memoryBase;\n}\n\n/** Sets a 'globalAliases' value. */\nexport function setGlobalAlias(options: Options, name: string, alias: string): void {\n var globalAliases = options.globalAliases;\n if (!globalAliases) options.globalAliases = globalAliases = new Map();\n globalAliases.set(name, alias);\n}\n\n/** Sign extension operations. */\nexport const FEATURE_SIGN_EXTENSION = Feature.SIGN_EXTENSION;\n/** Mutable global imports and exports. */\nexport const FEATURE_MUTABLE_GLOBAL = Feature.MUTABLE_GLOBAL;\n\n/** Enables a specific feature. */\nexport function enableFeature(options: Options, feature: Feature): void {\n options.features |= feature;\n}\n\n/** Gives the compiler a hint at the optimize levels that will be used later on. */\nexport function setOptimizeLevelHints(options: Options, optimizeLevel: i32, shrinkLevel: i32): void {\n options.optimizeLevelHint = optimizeLevel;\n options.shrinkLevelHint = shrinkLevel;\n}\n\n/** Finishes parsing. */\nexport function finishParsing(parser: Parser): Program {\n return parser.finish();\n}\n\n/** Compiles the sources computed by the parser to a module. */\nexport function compileProgram(program: Program, options: Options | null = null): Module {\n return new Compiler(program, options).compile();\n}\n\n/** Decompiles a module to its (low level) source. */\nexport function decompileModule(module: Module): string {\n var decompiler = new Decompiler();\n decompiler.decompile(module);\n return decompiler.finish();\n}\n\n/** Builds WebIDL definitions for the specified program. */\nexport function buildIDL(program: Program): string {\n return IDLBuilder.build(program);\n}\n\n/** Builds TypeScript definitions for the specified program. */\nexport function buildTSD(program: Program): string {\n return TSDBuilder.build(program);\n}\n\n/** Prefix indicating a library file. */\nexport { LIBRARY_PREFIX } from \"./common\";\n\n// Full API\nexport * from \"./ast\";\n// export * from \"./binary\";\nexport * from \"./common\";\nexport * from \"./compiler\";\nexport * from \"./decompiler\";\nexport * from \"./definitions\";\nexport * from \"./diagnosticMessages.generated\";\nexport * from \"./diagnostics\";\nexport * from \"./module\";\nexport * from \"./parser\";\nexport * from \"./program\";\nexport * from \"./resolver\";\nexport * from \"./tokenizer\";\nexport * from \"./types\";\nexport * from \"./util\";\n"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/parse/README.md b/lib/parse/README.md index f4e8ed1f1c..0207f90fd0 100644 --- a/lib/parse/README.md +++ b/lib/parse/README.md @@ -2,68 +2,12 @@ A WebAssembly binary parser in WebAssembly. Super small, super fast, with TypeScript support. -API ---- +### To test +``` +npm run asbuild:test +npm run test +``` -* **parse**(binary: `Uint8Array`, options?: `ParseOptions`): `void`
- Parses the contents of a WebAssembly binary according to the specified options. - -* **ParseOptions**
- Options specified to the parser. The `onSection` callback determines the sections being evaluated in detail. - - * **onSection**?(id: `SectionId`, payloadOff: `number`, payloadLen: `number`, nameOff: `number`, nameLen: `number`): `boolean`
- Called with each section in the binary. Returning `true` evaluates the section. - - * **onType**?(index: `number`, form: `number`): `void`
- Called with each function type if the type section is evaluated. - - * **onTypeParam**?(index: `number`, paramIndex: `number`, paramType: `Type`): `void`
- Called with each function parameter if the type section is evaluated. - - * **onTypeReturn**?(index: `number`, returnIndex: `number`, returnType: `Type`): `void`
- Called with each function return type if the type section is evaluated. - - * **onImport**?(index: `number`, kind: `ExternalKind`, moduleOff: `number`, moduleLen: `number`, fieldOff: `number`, fieldLen: `number`): `void`
- Called with each import if the import section is evaluated. - - * **onFunctionImport**?(index: `number`, type: `number`): `void`
- Called with each function import if the import section is evaluated. - - * **onTableImport**?(index: `number`, type: `Type`, initial: `number`, maximum: `number`, flags: `number`): `void`
- Called with each table import if the import section is evaluated. - - * **onMemoryImport**?(index: `number`, initial: `number`, maximum: `number`, flags: `number`): `void`
- Called with each memory import if the import section is evaluated. - - * **onGlobalImport**?(index: `number`, type: `Type`, mutability: `number`): `void`
- Called with each global import if the import section is evaluated. - - * **onMemory**?(index: `number`, initial: `number`, maximum: `number`, flags: `number`): `void`
- Called with each memory if the memory section is evaluated. - - * **onFunction**?(index: `number`, typeIndex: `number`): `void`
- Called with each function if the function section is evaluated. - - * **onGlobal**?(index: `number`, type: `Type`, mutability: `number`): `void`
- Called with each global if the global section is evaluated. - - * **onStart**?(index: `number`): `void`
- Called with the start function index if the start section is evaluated. - - * **onExport**?(index: `number`, kind: `ExternalKind`, kindIndex: `number`, nameOff: `number`, nameLen: `number`): `void`
- Called with each export if the export section is evaluated. - - * **onSourceMappingURL**?(offset: `number`, length: `number`): `void`
- Called with the source map URL if the 'sourceMappingURL' section is evaluated. - - * **onModuleName**?(offset: `number`, length: `number`): `void`
- Called with the module name if present and the 'name' section is evaluated. - - * **onFunctionName**?(index: `number`, offset: `number`, length: `number`): `void`
- Called with each function name if present and the 'name' section is evaluated. - - * **onLocalName**?(funcIndex: `number`, index: `number`, offset: `number`, length: `number`): `void`
- Called with each local name if present and the 'name' section is evaluated. * **Type**
A value or element type, depending on context. diff --git a/lib/parse/assembly/index.ts b/lib/parse/assembly/index.ts index 5026e079d2..8b58945edc 100644 --- a/lib/parse/assembly/index.ts +++ b/lib/parse/assembly/index.ts @@ -18,51 +18,11 @@ import { TypeSection, Module } from "./module"; -import { log } from "./host"; - -// log("in the start function!"); -// type FunctionName = string | symbol; -// type Instance = [Function, Object]; -// -// let instance: Object; -// let methods: Map = new Map(); - -// function registerClass(name:string): any { -// type Ctor = new (...args: any[]) => T; -// return (target: T): Ctor => { -// // Save a reference to the original constructor -// const Original = target; -// let self:T = this; -// debugger; -// // the new constructor behaviour -// let decoratedConstructor: any = function(...args: any[]): void { -// // log("Before construction:"); -// // -// Original.apply(this, args); -// instance = this; -// // console.log("After construction: ", self.instance !== undefined); -// }; -// -// // Copy prototype so intanceof operator still works -// decoratedConstructor.prototype = Original.prototype; -// // Copy static members too -// Object.keys(Original).forEach((name: string) => -// { decoratedConstructor[name] = (Original)[name]; }); -// -// // Return new constructor (will override original) -// return decoratedConstructor; -// }; -// -// } - - -export function printModule(m: Module): void { - m.print(); -} + export function getType(m: Module): string { var type = m.getType(); - if (type == null){ + if (type == null) { return "No Type Section" } return type.toString(); @@ -119,14 +79,11 @@ export function removeStartFunction (mod: Module): Uint8Array { export function exportDataSection(mod: Module): Uint8Array | null { var header = mod.getID(SectionId.Data); var mem = mod.getID(SectionId.Memory); - log((header).offset); - log((mem).offset); - log(header == null); - log(mem ==null) - if (header == null){ + + if (header == null) { return null; } - if (mem == null){ + if (mem == null) { return null; } var len = header.len + mem.len; @@ -139,13 +96,12 @@ export function exportDataSection(mod: Module): Uint8Array | null { res[3] = 0x6D; //Version number res[4] = 0x01; - log(res) - for (let i = mem.offset; i < mem.offset + mem.len - 1; i++){ + + for (let i = mem.offset; i < mem.offset + mem.len - 1; i++) { res[i - mem.offset + 8] = mod.buf.buffer[i]; } - log(res[8]) - log(mod.buf.buffer[mem.offset]); - for (let i = header.offset; i < header.offset + header.len - 1; i++){ + + for (let i = header.offset; i < header.offset + header.len - 1; i++) { let offset = i - header.offset + 8 + mem.len; res[offset] = mod.buf.buffer[i]; } @@ -214,16 +170,4 @@ export class Parser { } -export function newParser(buf: Uint8Array): Parser { - return new Parser(buf); -} -export function parse(p: Parser): Module { - p.parse(); - return p.module; -} - -export function hasSection(mod: Module, id: SectionId): boolean { - return mod.getID(id) != null; -} - export {TypeSection, Module} diff --git a/lib/parse/assembly/module/index.ts b/lib/parse/assembly/module/index.ts index 65d1dfc186..90f3abd788 100644 --- a/lib/parse/assembly/module/index.ts +++ b/lib/parse/assembly/module/index.ts @@ -61,6 +61,10 @@ export class Module { return null; } + hasSection(id: SectionId): boolean { + return this.getID(id) != null; + } + getType(): TypeSection | null { let header = this.getID(SectionId.Type); if (header == null){ diff --git a/lib/parse/build/index.d.ts b/lib/parse/build/index.d.ts index 03a5063a11..7966198e73 100644 --- a/lib/parse/build/index.d.ts +++ b/lib/parse/build/index.d.ts @@ -8,7 +8,6 @@ declare module ASModule { type f32 = number; type f64 = number; type bool = any; - function printModule(m: u32): void; function getType(m: u32): u32; function getImports(m: u32): void; function removeSection(mod: u32, id: i32): u32; @@ -25,9 +24,6 @@ declare module ASModule { off: u32; parse(): void; } - function newParser(buf: u32): u32; - function parse(p: u32): u32; - function hasSection(mod: u32, id: i32): bool; namespace memory { function fill(dest: u32, c: u8, n: u32): void; function copy(dest: u32, src: u32, n: u32): void; @@ -37,6 +33,7 @@ declare module ASModule { function reset(): void; } class TypeSection { + NATIVE_CODE(header: u32); header: u32; funcs: u32; parse(buf: u32): u32; @@ -51,6 +48,7 @@ declare module ASModule { start: u32; parseSection(header: u32): void; getID(id: i32): u32; + hasSection(id: i32): bool; getType(): u32; getImports(): u32; print(): void; diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index 58a90f0958..c15f272794 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -6,81 +6,133 @@ (type $v (func)) (type $iii (func (param i32 i32) (result i32))) (type $iiiiv (func (param i32 i32 i32 i32))) + (type $iiiiiv (func (param i32 i32 i32 i32 i32))) + (type $iiiii (func (param i32 i32 i32 i32) (result i32))) (type $iiv (func (param i32 i32))) - (type $FUNCSIG$viiii (func (param i32 i32 i32 i32))) - (type $FUNCSIG$ii (func (param i32) (result i32))) - (type $FUNCSIG$iii (func (param i32 i32) (result i32))) - (type $FUNCSIG$i (func (result i32))) (import "env" "memory" (memory $0 1)) - (data (i32.const 8) "\01\00\00\000") - (data (i32.const 16) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") - (data (i32.const 72) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009") - (data (i32.const 584) "H\00\00\00d") - (data (i32.const 592) "\06\00\00\00n\00a\00m\00e\00:\00 ") - (data (i32.const 608) "\04\00\00\00n\00u\00l\00l") - (data (i32.const 624) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s") - (data (i32.const 664) "\01\00\00\00\n") - (data (i32.const 672) "\05\00\00\00r\00e\00f\00:\00 ") - (data (i32.const 688) "\04\00\00\00i\00d\00:\00 ") - (data (i32.const 704) "\0d\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00o\00f\00f\00:\00 ") - (data (i32.const 736) "\10\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00l\00e\00n\00g\00t\00h\00:\00 ") - (data (i32.const 776) "\05\00\00\00e\00n\00d\00:\00 ") - (data (i32.const 792) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s") - (data (i32.const 824) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s") - (data (i32.const 888) "\03\00\00\00i\003\002") - (data (i32.const 904) "\03\00\00\00i\006\004") - (data (i32.const 920) "\03\00\00\00f\003\002") - (data (i32.const 936) "\03\00\00\00f\006\004") - (data (i32.const 952) "\07\00\00\00a\00n\00y\00f\00u\00n\00c") - (data (i32.const 976) "\04\00\00\00f\00u\00n\00c") - (data (i32.const 992) "\04\00\00\00n\00o\00n\00e") - (data (i32.const 1008) "\0e\00\00\00I\00n\00c\00o\00r\00r\00e\00c\00t\00 \00T\00y\00p\00e") - (data (i32.const 1040) "\07\00\00\00E\00r\00r\00o\00r\00:\00 ") - (data (i32.const 1064) "\02\00\00\00,\00 ") - (data (i32.const 1072) "\04\00\00\00v\00o\00i\00d") - (data (i32.const 1088) "\07\00\00\00i\00n\00d\00e\00x\00:\00 ") - (data (i32.const 1112) "\06\00\00\00f\00o\00r\00m\00:\00 ") - (data (i32.const 1128) "\03\00\00\00,\00 \00(") - (data (i32.const 1144) "\05\00\00\00)\00 \00=\00>\00 ") - (data (i32.const 1160) "\0f\00\00\00N\00o\00 \00T\00y\00p\00e\00 \00S\00e\00c\00t\00i\00o\00n") - (data (i32.const 1208) "\b0\04") - (data (i32.const 1216) "\1b\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00t\00y\00p\00e\00d\00a\00r\00r\00a\00y\00.\00t\00s") - (data (i32.const 1289) "\05") - (data (i32.const 1296) "\01\00\00\00\'") - (data (i32.const 1304) "\06\00\00\00C\00u\00s\00t\00o\00m") - (data (i32.const 1320) "\04\00\00\00T\00y\00p\00e") - (data (i32.const 1336) "\06\00\00\00I\00m\00p\00o\00r\00t") - (data (i32.const 1352) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n") - (data (i32.const 1376) "\05\00\00\00T\00a\00b\00l\00e") - (data (i32.const 1392) "\06\00\00\00M\00e\00m\00o\00r\00y") - (data (i32.const 1408) "\06\00\00\00G\00l\00o\00b\00a\00l") - (data (i32.const 1424) "\06\00\00\00E\00x\00p\00o\00r\00t") - (data (i32.const 1440) "\05\00\00\00S\00t\00a\00r\00t") - (data (i32.const 1456) "\07\00\00\00E\00l\00e\00m\00e\00n\00t") - (data (i32.const 1480) "\04\00\00\00C\00o\00d\00e") - (data (i32.const 1496) "\04\00\00\00D\00a\00t\00a") - (data (i32.const 1512) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 ") + (data (i32.const 8) "\0d\00\00\00~\00l\00i\00b\00/\00a\00r\00r\00a\00y\00.\00t\00s\00") + (data (i32.const 40) "\1c\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00a\00r\00r\00a\00y\00b\00u\00f\00f\00e\00r\00.\00t\00s\00") + (data (i32.const 104) "\01\00\00\000\00") + (data (i32.const 112) "\17\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 168) "\90\01\00\00\00\00\00\000\000\000\001\000\002\000\003\000\004\000\005\000\006\000\007\000\008\000\009\001\000\001\001\001\002\001\003\001\004\001\005\001\006\001\007\001\008\001\009\002\000\002\001\002\002\002\003\002\004\002\005\002\006\002\007\002\008\002\009\003\000\003\001\003\002\003\003\003\004\003\005\003\006\003\007\003\008\003\009\004\000\004\001\004\002\004\003\004\004\004\005\004\006\004\007\004\008\004\009\005\000\005\001\005\002\005\003\005\004\005\005\005\006\005\007\005\008\005\009\006\000\006\001\006\002\006\003\006\004\006\005\006\006\006\007\006\008\006\009\007\000\007\001\007\002\007\003\007\004\007\005\007\006\007\007\007\008\007\009\008\000\008\001\008\002\008\003\008\004\008\005\008\006\008\007\008\008\008\009\009\000\009\001\009\002\009\003\009\004\009\005\009\006\009\007\009\008\009\009\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\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 680) "\a8\00\00\00d\00\00\00") + (data (i32.const 688) "\03\00\00\00i\003\002\00") + (data (i32.const 704) "\03\00\00\00i\006\004\00") + (data (i32.const 720) "\03\00\00\00f\003\002\00") + (data (i32.const 736) "\03\00\00\00f\006\004\00") + (data (i32.const 752) "\07\00\00\00a\00n\00y\00f\00u\00n\00c\00") + (data (i32.const 776) "\04\00\00\00f\00u\00n\00c\00") + (data (i32.const 792) "\04\00\00\00n\00o\00n\00e\00") + (data (i32.const 808) "\0e\00\00\00I\00n\00c\00o\00r\00r\00e\00c\00t\00 \00T\00y\00p\00e\00") + (data (i32.const 840) "\07\00\00\00E\00r\00r\00o\00r\00:\00 \00") + (data (i32.const 864) "\04\00\00\00n\00u\00l\00l\00") + (data (i32.const 880) "\0e\00\00\00~\00l\00i\00b\00/\00s\00t\00r\00i\00n\00g\00.\00t\00s\00") + (data (i32.const 912) "\00\00\00\00") + (data (i32.const 920) "\02\00\00\00,\00 \00") + (data (i32.const 928) "\04\00\00\00v\00o\00i\00d\00") + (data (i32.const 944) "\07\00\00\00i\00n\00d\00e\00x\00:\00 \00") + (data (i32.const 968) "\06\00\00\00f\00o\00r\00m\00:\00 \00") + (data (i32.const 984) "\03\00\00\00,\00 \00(\00") + (data (i32.const 1000) "\05\00\00\00)\00 \00=\00>\00 \00") + (data (i32.const 1016) "\0f\00\00\00N\00o\00 \00T\00y\00p\00e\00 \00S\00e\00c\00t\00i\00o\00n\00") + (data (i32.const 1056) "\00\00\00\00\00\00\00\00") + (data (i32.const 1064) " \04\00\00\00\00\00\00") + (data (i32.const 1072) "\01\00\00\00\n\00") + (data (i32.const 1080) "\1b\00\00\00~\00l\00i\00b\00/\00i\00n\00t\00e\00r\00n\00a\00l\00/\00t\00y\00p\00e\00d\00a\00r\00r\00a\00y\00.\00t\00s\00") + (data (i32.const 1144) "\00\00\00\00\00\00\00\00") + (data (i32.const 1152) "x\04\00\00\00\00\00\00") + (data (i32.const 1160) "\01\00\00\00\'\00") + (data (i32.const 1168) "\06\00\00\00C\00u\00s\00t\00o\00m\00") + (data (i32.const 1184) "\04\00\00\00T\00y\00p\00e\00") + (data (i32.const 1200) "\06\00\00\00I\00m\00p\00o\00r\00t\00") + (data (i32.const 1216) "\08\00\00\00F\00u\00n\00c\00t\00i\00o\00n\00") + (data (i32.const 1240) "\05\00\00\00T\00a\00b\00l\00e\00") + (data (i32.const 1256) "\06\00\00\00M\00e\00m\00o\00r\00y\00") + (data (i32.const 1272) "\06\00\00\00G\00l\00o\00b\00a\00l\00") + (data (i32.const 1288) "\06\00\00\00E\00x\00p\00o\00r\00t\00") + (data (i32.const 1304) "\05\00\00\00S\00t\00a\00r\00t\00") + (data (i32.const 1320) "\07\00\00\00E\00l\00e\00m\00e\00n\00t\00") + (data (i32.const 1344) "\04\00\00\00C\00o\00d\00e\00") + (data (i32.const 1360) "\04\00\00\00D\00a\00t\00a\00") + (data (i32.const 1376) "\0c\00\00\00n\00o\00 \00s\00u\00c\00h\00 \00I\00D\00:\00 \00") + (data (i32.const 1408) "\06\00\00\00n\00a\00m\00e\00:\00 \00") + (data (i32.const 1424) "\05\00\00\00r\00e\00f\00:\00 \00") + (data (i32.const 1440) "\04\00\00\00i\00d\00:\00 \00") + (data (i32.const 1456) "\0d\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00o\00f\00f\00:\00 \00") + (data (i32.const 1488) "\10\00\00\00p\00a\00y\00l\00o\00a\00d\00 \00l\00e\00n\00g\00t\00h\00:\00 \00") + (data (i32.const 1528) "\05\00\00\00e\00n\00d\00:\00 \00") (import "env" "abort" (func $~lib/env/abort (param i32 i32 i32 i32))) (import "index" "_log_str" (func $assembly/host/index/_log_str (param i32))) (import "index" "_logi" (func $assembly/host/index/_logi (param i32))) - (import "index" "_log" (func $assembly/host/index/_log (param i32 i32))) (table $0 1 anyfunc) (elem (i32.const 0) $null) + (global $src/common/MAX_PAGES i32 (i32.const 65535)) + (global $src/common/MAX_ELEMS i32 (i32.const -1)) + (global $~lib/internal/allocator/MAX_SIZE_32 i32 (i32.const 1073741824)) + (global $~lib/internal/allocator/AL_BITS i32 (i32.const 3)) + (global $~lib/internal/allocator/AL_SIZE i32 (i32.const 8)) + (global $~lib/internal/allocator/AL_MASK i32 (i32.const 7)) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) + (global $~lib/internal/arraybuffer/HEADER_SIZE i32 (i32.const 8)) + (global $~lib/internal/arraybuffer/MAX_BLENGTH i32 (i32.const 1073741816)) + (global $~lib/internal/string/HEADER_SIZE i32 (i32.const 4)) + (global $~lib/internal/string/MAX_LENGTH i32 (i32.const 536870910)) + (global $~lib/internal/number/MAX_DOUBLE_LENGTH i32 (i32.const 28)) + (global $~lib/internal/number/_K (mut i32) (i32.const 0)) + (global $~lib/internal/number/_frc (mut i64) (i64.const 0)) + (global $~lib/internal/number/_exp (mut i32) (i32.const 0)) + (global $~lib/internal/number/_frc_minus (mut i64) (i64.const 0)) + (global $~lib/internal/number/_frc_plus (mut i64) (i64.const 0)) + (global $~lib/internal/number/_frc_pow (mut i64) (i64.const 0)) + (global $~lib/internal/number/_exp_pow (mut i32) (i32.const 0)) (global $src/common/SectionId.Custom (mut i32) (i32.const 0)) (global $src/common/SectionId.Type (mut i32) (i32.const 1)) (global $src/common/SectionId.Import (mut i32) (i32.const 2)) + (global $src/common/SectionId.Function (mut i32) (i32.const 3)) + (global $src/common/SectionId.Table (mut i32) (i32.const 4)) (global $src/common/SectionId.Memory (mut i32) (i32.const 5)) + (global $src/common/SectionId.Global (mut i32) (i32.const 6)) + (global $src/common/SectionId.Export (mut i32) (i32.const 7)) (global $src/common/SectionId.Start (mut i32) (i32.const 8)) + (global $src/common/SectionId.Element (mut i32) (i32.const 9)) + (global $src/common/SectionId.Code (mut i32) (i32.const 10)) (global $src/common/SectionId.Data (mut i32) (i32.const 11)) + (global $ASC_SHRINK_LEVEL i32 (i32.const 0)) + (global $~lib/internal/string/CharCode.PLUS i32 (i32.const 43)) + (global $~lib/internal/string/CharCode.MINUS i32 (i32.const 45)) + (global $~lib/internal/string/CharCode.DOT i32 (i32.const 46)) + (global $~lib/internal/string/CharCode._0 i32 (i32.const 48)) + (global $~lib/internal/string/CharCode._1 i32 (i32.const 49)) + (global $~lib/internal/string/CharCode._2 i32 (i32.const 50)) + (global $~lib/internal/string/CharCode._3 i32 (i32.const 51)) + (global $~lib/internal/string/CharCode._4 i32 (i32.const 52)) + (global $~lib/internal/string/CharCode._5 i32 (i32.const 53)) + (global $~lib/internal/string/CharCode._6 i32 (i32.const 54)) + (global $~lib/internal/string/CharCode._7 i32 (i32.const 55)) + (global $~lib/internal/string/CharCode._8 i32 (i32.const 56)) + (global $~lib/internal/string/CharCode._9 i32 (i32.const 57)) + (global $~lib/internal/string/CharCode.A i32 (i32.const 65)) + (global $~lib/internal/string/CharCode.B i32 (i32.const 66)) + (global $~lib/internal/string/CharCode.E i32 (i32.const 69)) + (global $~lib/internal/string/CharCode.N i32 (i32.const 78)) + (global $~lib/internal/string/CharCode.O i32 (i32.const 79)) + (global $~lib/internal/string/CharCode.X i32 (i32.const 88)) + (global $~lib/internal/string/CharCode.Z i32 (i32.const 90)) + (global $~lib/internal/string/CharCode.a i32 (i32.const 97)) + (global $~lib/internal/string/CharCode.b i32 (i32.const 98)) + (global $~lib/internal/string/CharCode.e i32 (i32.const 101)) + (global $~lib/internal/string/CharCode.n i32 (i32.const 110)) + (global $~lib/internal/string/CharCode.o i32 (i32.const 111)) + (global $~lib/internal/string/CharCode.x i32 (i32.const 120)) + (global $~lib/internal/string/CharCode.z i32 (i32.const 122)) (global $src/common/ExternalKind.Function (mut i32) (i32.const 0)) (global $src/common/ExternalKind.Table (mut i32) (i32.const 1)) (global $src/common/ExternalKind.Memory (mut i32) (i32.const 2)) (global $src/common/ExternalKind.Global (mut i32) (i32.const 3)) + (global $HEAP_BASE i32 (i32.const 1544)) (export "memory" (memory $0)) (export "table" (table $0)) - (export "printModule" (func $assembly/index/printModule)) (export "getType" (func $assembly/index/getType)) (export "getImports" (func $assembly/index/getImports)) (export "removeSection" (func $assembly/index/removeSection)) @@ -98,38 +150,38 @@ (export "Parser#get:off" (func $assembly/index/Parser#get:off)) (export "Parser#set:off" (func $assembly/index/Parser#set:off)) (export "Parser#parse" (func $assembly/index/Parser#parse)) - (export "newParser" (func $assembly/index/newParser)) - (export "parse" (func $assembly/index/parse)) - (export "hasSection" (func $assembly/index/hasSection)) (export "memory.fill" (func $~lib/memory/memory.fill)) (export "memory.copy" (func $~lib/memory/memory.copy)) (export "memory.compare" (func $~lib/memory/memory.compare)) (export "memory.allocate" (func $~lib/memory/memory.allocate)) (export "memory.free" (func $~lib/memory/memory.free)) (export "memory.reset" (func $~lib/memory/memory.reset)) - (export "TypeSection#get:header" (func $Parser#get:buf)) - (export "TypeSection#set:header" (func $Parser#set:buf)) - (export "TypeSection#get:funcs" (func $Parser#get:module)) - (export "TypeSection#set:funcs" (func $Parser#set:module)) + (export "TypeSection#NATIVE_CODE" (func $assembly/module/index/TypeSection#constructor)) + (export "TypeSection#get:header" (func $TypeSection#get:header)) + (export "TypeSection#set:header" (func $TypeSection#set:header)) + (export "TypeSection#get:funcs" (func $TypeSection#get:funcs)) + (export "TypeSection#set:funcs" (func $TypeSection#set:funcs)) (export "TypeSection#parse" (func $assembly/module/index/TypeSection#parse)) (export "TypeSection#toString" (func $assembly/module/index/TypeSection#toString)) (export "Module#constructor" (func $assembly/module/index/Module#constructor)) - (export "Module#get:headers" (func $Parser#get:buf)) - (export "Module#set:headers" (func $Parser#set:buf)) - (export "Module#get:buf" (func $Parser#get:module)) - (export "Module#set:buf" (func $Parser#set:module)) + (export "Module#get:headers" (func $Module#get:headers)) + (export "Module#set:headers" (func $Module#set:headers)) + (export "Module#get:buf" (func $Module#get:buf)) + (export "Module#set:buf" (func $Module#set:buf)) (export "Module#get:Type" (func $assembly/module/index/Module#get:Type)) (export "Module#get:hasStart" (func $assembly/module/index/Module#get:hasStart)) (export "Module#get:start" (func $assembly/module/index/Module#get:start)) (export "Module#parseSection" (func $assembly/module/index/Module#parseSection)) (export "Module#getID" (func $assembly/module/index/Module#getID)) + (export "Module#hasSection" (func $assembly/module/index/Module#hasSection)) (export "Module#getType" (func $assembly/module/index/Module#getType)) (export "Module#getImports" (func $assembly/module/index/Module#getImports)) (export "Module#print" (func $assembly/module/index/Module#print)) (start $start) - (func $~lib/internal/memory/memset (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memset (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) - (local $4 i64) + (local $4 i32) + (local $5 i64) get_local $2 i32.eqz if @@ -164,12 +216,13 @@ get_local $0 get_local $2 i32.add - tee_local $3 i32.const 2 i32.sub get_local $1 i32.store8 - get_local $3 + get_local $0 + get_local $2 + i32.add i32.const 3 i32.sub get_local $1 @@ -198,35 +251,41 @@ if return end - get_local $2 i32.const 0 get_local $0 i32.sub i32.const 3 i32.and - tee_local $3 - i32.sub - set_local $2 + set_local $3 get_local $0 get_local $3 i32.add - tee_local $0 + set_local $0 + get_local $2 + get_local $3 + i32.sub + set_local $2 + get_local $2 + i32.const -4 + i32.and + set_local $2 + i32.const -1 + i32.const 255 + i32.div_u get_local $1 i32.const 255 i32.and - i32.const 16843009 i32.mul - tee_local $1 + set_local $4 + get_local $0 + get_local $4 i32.store - get_local $2 - i32.const -4 - i32.and - tee_local $2 get_local $0 + get_local $2 i32.add i32.const 4 i32.sub - get_local $1 + get_local $4 i32.store get_local $2 i32.const 8 @@ -237,25 +296,26 @@ get_local $0 i32.const 4 i32.add - get_local $1 + get_local $4 i32.store get_local $0 i32.const 8 i32.add - get_local $1 + get_local $4 i32.store get_local $0 get_local $2 i32.add - tee_local $3 i32.const 12 i32.sub - get_local $1 + get_local $4 i32.store - get_local $3 + get_local $0 + get_local $2 + i32.add i32.const 8 i32.sub - get_local $1 + get_local $4 i32.store get_local $2 i32.const 24 @@ -266,216 +326,238 @@ get_local $0 i32.const 12 i32.add - get_local $1 + get_local $4 i32.store get_local $0 i32.const 16 i32.add - get_local $1 + get_local $4 i32.store get_local $0 i32.const 20 i32.add - get_local $1 + get_local $4 i32.store get_local $0 i32.const 24 i32.add - get_local $1 + get_local $4 i32.store get_local $0 get_local $2 i32.add - tee_local $3 i32.const 28 i32.sub - get_local $1 + get_local $4 i32.store - get_local $3 + get_local $0 + get_local $2 + i32.add i32.const 24 i32.sub - get_local $1 + get_local $4 i32.store - get_local $3 + get_local $0 + get_local $2 + i32.add i32.const 20 i32.sub - get_local $1 + get_local $4 i32.store - get_local $3 + get_local $0 + get_local $2 + i32.add i32.const 16 i32.sub - get_local $1 + get_local $4 i32.store + i32.const 24 get_local $0 i32.const 4 i32.and - i32.const 24 i32.add - tee_local $3 + set_local $3 get_local $0 + get_local $3 i32.add set_local $0 get_local $2 get_local $3 i32.sub set_local $2 - get_local $1 + get_local $4 i64.extend_u/i32 - tee_local $4 get_local $4 + i64.extend_u/i32 i64.const 32 i64.shl i64.or - set_local $4 - loop $continue|0 - get_local $2 - i32.const 32 - i32.ge_u - if - get_local $0 - get_local $4 - i64.store - get_local $0 - i32.const 8 - i32.add - get_local $4 - i64.store - get_local $0 - i32.const 16 - i32.add - get_local $4 - i64.store - get_local $0 - i32.const 24 - i32.add - get_local $4 - i64.store + set_local $5 + block $break|0 + loop $continue|0 get_local $2 i32.const 32 - i32.sub - set_local $2 - get_local $0 - i32.const 32 - i32.add - set_local $0 - br $continue|0 + i32.ge_u + if + block + get_local $0 + get_local $5 + i64.store + get_local $0 + i32.const 8 + i32.add + get_local $5 + i64.store + get_local $0 + i32.const 16 + i32.add + get_local $5 + i64.store + get_local $0 + i32.const 24 + i32.add + get_local $5 + i64.store + get_local $2 + i32.const 32 + i32.sub + set_local $2 + get_local $0 + i32.const 32 + i32.add + set_local $0 + end + br $continue|0 + end end end ) - (func $~lib/memory/memory.fill (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/memory/memory.fill (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 get_local $1 get_local $2 call $~lib/internal/memory/memset ) - (func $~lib/internal/memory/memcpy (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memcpy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) - loop $continue|0 - get_local $2 - if (result i32) - get_local $1 - i32.const 3 - i32.and - else - get_local $2 - end - tee_local $3 - if - get_local $0 - tee_local $4 - i32.const 1 - i32.add - set_local $0 - get_local $1 - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $4 - get_local $3 - i32.load8_u - i32.store8 + block $break|0 + loop $continue|0 get_local $2 - i32.const 1 - i32.sub - set_local $2 - br $continue|0 + if (result i32) + get_local $1 + i32.const 3 + i32.and + else + get_local $2 + end + if + block + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + end + br $continue|0 + end end end get_local $0 i32.const 3 i32.and - i32.eqz + i32.const 0 + i32.eq if - loop $continue|1 - get_local $2 - i32.const 16 - i32.ge_u - if - get_local $0 - get_local $1 - i32.load - i32.store - get_local $0 - i32.const 4 - i32.add - get_local $1 - i32.const 4 - i32.add - i32.load - i32.store - get_local $0 - i32.const 8 - i32.add - get_local $1 - i32.const 8 - i32.add - i32.load - i32.store - get_local $0 - i32.const 12 - i32.add - get_local $1 - i32.const 12 - i32.add - i32.load - i32.store - get_local $1 - i32.const 16 - i32.add - set_local $1 - get_local $0 - i32.const 16 - i32.add - set_local $0 + block $break|1 + loop $continue|1 get_local $2 i32.const 16 - i32.sub - set_local $2 - br $continue|1 - end - end - get_local $2 - i32.const 8 - i32.and - if - get_local $0 - get_local $1 - i32.load - i32.store - get_local $0 - i32.const 4 - i32.add - get_local $1 - i32.const 4 - i32.add - i32.load - i32.store - get_local $0 - i32.const 8 - i32.add + i32.ge_u + if + block + get_local $0 + get_local $1 + i32.load + i32.store + get_local $0 + i32.const 4 + i32.add + get_local $1 + i32.const 4 + i32.add + i32.load + i32.store + get_local $0 + i32.const 8 + i32.add + get_local $1 + i32.const 8 + i32.add + i32.load + i32.store + get_local $0 + i32.const 12 + i32.add + get_local $1 + i32.const 12 + i32.add + i32.load + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|1 + end + end + end + get_local $2 + i32.const 8 + i32.and + if + get_local $0 + get_local $1 + i32.load + i32.store + get_local $0 + i32.const 4 + i32.add + get_local $1 + i32.const 4 + i32.add + i32.load + i32.store + get_local $0 + i32.const 8 + i32.add set_local $0 get_local $1 i32.const 8 @@ -520,10 +602,22 @@ i32.const 1 i32.and if - get_local $1 - set_local $3 - get_local $0 - get_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 end @@ -536,548 +630,721 @@ block $break|2 block $case2|2 block $case1|2 - get_local $0 - i32.const 3 - i32.and - tee_local $3 - i32.const 1 - i32.ne - if - get_local $3 + block $case0|2 + get_local $0 + i32.const 3 + i32.and + set_local $5 + get_local $5 + i32.const 1 + i32.eq + br_if $case0|2 + get_local $5 i32.const 2 i32.eq br_if $case1|2 - get_local $3 + get_local $5 i32.const 3 i32.eq br_if $case2|2 br $break|2 end - get_local $1 - i32.load - set_local $5 - get_local $0 - get_local $1 - tee_local $3 - i32.load8_u - i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $1 - set_local $0 - get_local $1 - get_local $3 - i32.const 1 - i32.add - tee_local $1 - i32.load8_u - i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $4 - i32.const 1 - i32.add - set_local $0 - get_local $1 - i32.const 1 - i32.add - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $4 - get_local $3 - i32.load8_u - i32.store8 - get_local $2 - i32.const 3 - i32.sub - set_local $2 - loop $continue|3 - get_local $2 - i32.const 17 - i32.ge_u - if + block + get_local $1 + i32.load + set_local $3 + block (result i32) get_local $0 - get_local $1 + tee_local $5 i32.const 1 i32.add - i32.load - tee_local $3 - i32.const 8 - i32.shl + set_local $0 get_local $5 - i32.const 24 - i32.shr_u - i32.or - i32.store - get_local $0 - i32.const 4 - i32.add + end + block (result i32) get_local $1 - i32.const 5 - i32.add - i32.load tee_local $5 - i32.const 8 - i32.shl - get_local $3 - i32.const 24 - i32.shr_u - i32.or - i32.store - get_local $0 - i32.const 8 - i32.add - get_local $1 - i32.const 9 + i32.const 1 i32.add - i32.load - tee_local $3 - i32.const 8 - i32.shl + set_local $1 get_local $5 - i32.const 24 - i32.shr_u - i32.or - i32.store + end + i32.load8_u + i32.store8 + block (result i32) get_local $0 - i32.const 12 + tee_local $5 + i32.const 1 i32.add + set_local $0 + get_local $5 + end + block (result i32) get_local $1 - i32.const 13 - i32.add - i32.load tee_local $5 - i32.const 8 - i32.shl - get_local $3 - i32.const 24 - i32.shr_u - i32.or - i32.store - get_local $1 - i32.const 16 + i32.const 1 i32.add set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) get_local $0 - i32.const 16 + tee_local $5 + i32.const 1 i32.add set_local $0 - get_local $2 - i32.const 16 - i32.sub - set_local $2 - br $continue|3 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 3 + i32.sub + set_local $2 + block $break|3 + loop $continue|3 + get_local $2 + i32.const 17 + i32.ge_u + if + block + get_local $1 + i32.const 1 + i32.add + i32.load + set_local $4 + get_local $0 + get_local $3 + i32.const 24 + i32.shr_u + get_local $4 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 5 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.const 24 + i32.shr_u + get_local $3 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 9 + i32.add + i32.load + set_local $4 + get_local $0 + i32.const 8 + i32.add + get_local $3 + i32.const 24 + i32.shr_u + get_local $4 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 13 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.const 24 + i32.shr_u + get_local $3 + i32.const 8 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|3 + end + end end + br $break|2 + unreachable end - br $break|2 + unreachable end - get_local $1 - i32.load - set_local $5 - get_local $0 - get_local $1 - i32.load8_u - i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $4 - i32.const 1 - i32.add - set_local $0 - get_local $1 - i32.const 1 - i32.add - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $4 - get_local $3 - i32.load8_u - i32.store8 - get_local $2 - i32.const 2 - i32.sub - set_local $2 - loop $continue|4 - get_local $2 - i32.const 18 - i32.ge_u - if + block + get_local $1 + i32.load + set_local $3 + block (result i32) get_local $0 - get_local $1 - i32.const 2 + tee_local $5 + i32.const 1 i32.add - i32.load - tee_local $3 - i32.const 16 - i32.shl + set_local $0 get_local $5 - i32.const 16 - i32.shr_u - i32.or - i32.store - get_local $0 - i32.const 4 - i32.add + end + block (result i32) get_local $1 - i32.const 6 - i32.add - i32.load tee_local $5 - i32.const 16 - i32.shl - get_local $3 - i32.const 16 - i32.shr_u - i32.or - i32.store - get_local $0 - i32.const 8 - i32.add - get_local $1 - i32.const 10 + i32.const 1 i32.add - i32.load - tee_local $3 - i32.const 16 - i32.shl + set_local $1 get_local $5 - i32.const 16 - i32.shr_u - i32.or - i32.store + end + i32.load8_u + i32.store8 + block (result i32) get_local $0 - i32.const 12 + tee_local $5 + i32.const 1 i32.add + set_local $0 + get_local $5 + end + block (result i32) get_local $1 - i32.const 14 - i32.add - i32.load tee_local $5 - i32.const 16 - i32.shl - get_local $3 - i32.const 16 - i32.shr_u - i32.or - i32.store - get_local $1 - i32.const 16 + i32.const 1 i32.add set_local $1 - get_local $0 - i32.const 16 - i32.add - set_local $0 - get_local $2 - i32.const 16 - i32.sub - set_local $2 - br $continue|4 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 2 + i32.sub + set_local $2 + block $break|4 + loop $continue|4 + get_local $2 + i32.const 18 + i32.ge_u + if + block + get_local $1 + i32.const 2 + i32.add + i32.load + set_local $4 + get_local $0 + get_local $3 + i32.const 16 + i32.shr_u + get_local $4 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 6 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.const 16 + i32.shr_u + get_local $3 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 10 + i32.add + i32.load + set_local $4 + get_local $0 + i32.const 8 + i32.add + get_local $3 + i32.const 16 + i32.shr_u + get_local $4 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 14 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.const 16 + i32.shr_u + get_local $3 + i32.const 16 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|4 + end + end end + br $break|2 + unreachable end - br $break|2 + unreachable end - get_local $1 - i32.load - set_local $5 - get_local $0 - tee_local $4 - i32.const 1 - i32.add - set_local $0 - get_local $1 - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $4 - get_local $3 - i32.load8_u - i32.store8 - get_local $2 - i32.const 1 - i32.sub - set_local $2 - loop $continue|5 - get_local $2 - i32.const 19 - i32.ge_u - if - get_local $0 - get_local $1 - i32.const 3 - i32.add - i32.load - tee_local $3 - i32.const 24 - i32.shl - get_local $5 - i32.const 8 - i32.shr_u - i32.or - i32.store + block + get_local $1 + i32.load + set_local $3 + block (result i32) get_local $0 - i32.const 4 - i32.add - get_local $1 - i32.const 7 - i32.add - i32.load tee_local $5 - i32.const 24 - i32.shl - get_local $3 - i32.const 8 - i32.shr_u - i32.or - i32.store - get_local $0 - i32.const 8 - i32.add - get_local $1 - i32.const 11 + i32.const 1 i32.add - i32.load - tee_local $3 - i32.const 24 - i32.shl + set_local $0 get_local $5 - i32.const 8 - i32.shr_u - i32.or - i32.store - get_local $0 - i32.const 12 - i32.add + end + block (result i32) get_local $1 - i32.const 15 - i32.add - i32.load tee_local $5 - i32.const 24 - i32.shl - get_local $3 - i32.const 8 - i32.shr_u - i32.or - i32.store - get_local $1 - i32.const 16 + i32.const 1 i32.add set_local $1 - get_local $0 - i32.const 16 - i32.add - set_local $0 - get_local $2 - i32.const 16 - i32.sub - set_local $2 - br $continue|5 + get_local $5 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + block $break|5 + loop $continue|5 + get_local $2 + i32.const 19 + i32.ge_u + if + block + get_local $1 + i32.const 3 + i32.add + i32.load + set_local $4 + get_local $0 + get_local $3 + i32.const 8 + i32.shr_u + get_local $4 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 7 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 4 + i32.add + get_local $4 + i32.const 8 + i32.shr_u + get_local $3 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 11 + i32.add + i32.load + set_local $4 + get_local $0 + i32.const 8 + i32.add + get_local $3 + i32.const 8 + i32.shr_u + get_local $4 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 15 + i32.add + i32.load + set_local $3 + get_local $0 + i32.const 12 + i32.add + get_local $4 + i32.const 8 + i32.shr_u + get_local $3 + i32.const 24 + i32.shl + i32.or + i32.store + get_local $1 + i32.const 16 + i32.add + set_local $1 + get_local $0 + i32.const 16 + i32.add + set_local $0 + get_local $2 + i32.const 16 + i32.sub + set_local $2 + end + br $continue|5 + end + end end + br $break|2 + unreachable end + unreachable end end get_local $2 i32.const 16 i32.and if - get_local $0 - get_local $1 - tee_local $3 - i32.load8_u - i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $1 - set_local $0 - get_local $1 - get_local $3 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $4 - i32.const 1 - i32.add - set_local $0 - get_local $1 - i32.const 1 - i32.add - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $4 - get_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 end @@ -1085,99 +1352,148 @@ i32.const 8 i32.and if - get_local $0 - get_local $1 - tee_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $1 - set_local $0 - get_local $1 - get_local $3 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $4 - i32.const 1 - i32.add - set_local $0 - get_local $1 - i32.const 1 - i32.add - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $4 - get_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 end @@ -1185,51 +1501,76 @@ i32.const 4 i32.and if - get_local $0 - get_local $1 - tee_local $3 - i32.load8_u - i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $1 - set_local $0 - get_local $1 - get_local $3 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $3 - set_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $4 - i32.const 1 - i32.add - set_local $0 - get_local $1 - i32.const 1 - i32.add - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $4 - get_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end + i32.load8_u + i32.store8 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 end @@ -1237,26 +1578,40 @@ i32.const 2 i32.and if - get_local $0 - get_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 - get_local $0 - i32.const 1 - i32.add - tee_local $4 - i32.const 1 - i32.add - set_local $0 - get_local $1 - i32.const 1 - i32.add - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $4 - get_local $3 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 end @@ -1264,17 +1619,28 @@ i32.const 1 i32.and if - get_local $1 - set_local $3 - get_local $0 - get_local $1 + block (result i32) + get_local $0 + tee_local $5 + i32.const 1 + i32.add + set_local $0 + get_local $5 + end + block (result i32) + get_local $1 + tee_local $5 + i32.const 1 + i32.add + set_local $1 + get_local $5 + end i32.load8_u i32.store8 end ) - (func $~lib/internal/memory/memmove (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memmove (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) - (local $4 i32) get_local $0 get_local $1 i32.eq @@ -1287,16 +1653,15 @@ get_local $0 i32.le_u tee_local $3 - i32.eqz - if + if (result i32) + get_local $3 + else get_local $0 get_local $2 i32.add get_local $1 i32.le_u - set_local $3 end - get_local $3 if get_local $0 get_local $1 @@ -1316,86 +1681,104 @@ i32.and i32.eq if - loop $continue|0 - get_local $0 - i32.const 7 - i32.and - if - get_local $2 - i32.eqz + block $break|0 + loop $continue|0 + get_local $0 + i32.const 7 + i32.and if - return + block + get_local $2 + i32.eqz + if + return + end + get_local $2 + i32.const 1 + i32.sub + set_local $2 + block (result i32) + get_local $0 + tee_local $3 + i32.const 1 + i32.add + set_local $0 + get_local $3 + end + block (result i32) + get_local $1 + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $3 + end + i32.load8_u + i32.store8 + end + br $continue|0 end - get_local $2 - i32.const 1 - i32.sub - set_local $2 - get_local $0 - tee_local $4 - tee_local $3 - i32.const 1 - i32.add - set_local $0 - get_local $1 - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $4 - get_local $3 - i32.load8_u - i32.store8 - br $continue|0 end end - loop $continue|1 - get_local $2 - i32.const 8 - i32.ge_u - if - get_local $0 - get_local $1 - i64.load - i64.store + block $break|1 + loop $continue|1 get_local $2 i32.const 8 - i32.sub - set_local $2 - get_local $0 - i32.const 8 - i32.add - set_local $0 - get_local $1 - i32.const 8 - i32.add - set_local $1 - br $continue|1 + i32.ge_u + if + block + get_local $0 + get_local $1 + i64.load + i64.store + get_local $2 + i32.const 8 + i32.sub + set_local $2 + get_local $0 + i32.const 8 + i32.add + set_local $0 + get_local $1 + i32.const 8 + i32.add + set_local $1 + end + br $continue|1 + end end end end - loop $continue|2 - get_local $2 - if - get_local $0 - tee_local $4 - tee_local $3 - i32.const 1 - i32.add - set_local $0 - get_local $1 - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $4 - get_local $3 - i32.load8_u - i32.store8 + block $break|2 + loop $continue|2 get_local $2 - i32.const 1 - i32.sub - set_local $2 - br $continue|2 + if + block + block (result i32) + get_local $0 + tee_local $3 + i32.const 1 + i32.add + set_local $0 + get_local $3 + end + block (result i32) + get_local $1 + tee_local $3 + i32.const 1 + i32.add + set_local $1 + get_local $3 + end + i32.load8_u + i32.store8 + get_local $2 + i32.const 1 + i32.sub + set_local $2 + end + br $continue|2 + end end end else @@ -1407,1087 +1790,1408 @@ i32.and i32.eq if - loop $continue|3 - get_local $0 - get_local $2 - i32.add - i32.const 7 - i32.and - if + block $break|3 + loop $continue|3 + get_local $0 get_local $2 - i32.eqz + i32.add + i32.const 7 + i32.and if - return + block + get_local $2 + i32.eqz + if + return + end + get_local $0 + get_local $2 + i32.const 1 + i32.sub + tee_local $2 + i32.add + get_local $1 + get_local $2 + i32.add + i32.load8_u + i32.store8 + end + br $continue|3 + end + end + end + block $break|4 + loop $continue|4 + get_local $2 + i32.const 8 + i32.ge_u + if + block + get_local $2 + i32.const 8 + i32.sub + set_local $2 + get_local $0 + get_local $2 + i32.add + get_local $1 + get_local $2 + i32.add + i64.load + i64.store + end + br $continue|4 end + end + end + end + block $break|5 + loop $continue|5 + get_local $2 + if + get_local $0 get_local $2 i32.const 1 i32.sub tee_local $2 - get_local $0 i32.add get_local $1 get_local $2 i32.add i32.load8_u i32.store8 - br $continue|3 + br $continue|5 end end - loop $continue|4 - get_local $2 - i32.const 8 - i32.ge_u - if + end + end + ) + (func $~lib/memory/memory.copy (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memmove + ) + (func $~lib/internal/memory/memcmp (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) + get_local $0 + get_local $1 + i32.eq + if + i32.const 0 + return + end + block $break|0 + loop $continue|0 + get_local $2 + i32.const 0 + i32.ne + tee_local $3 + if (result i32) + get_local $0 + i32.load8_u + get_local $1 + i32.load8_u + i32.eq + else + get_local $3 + end + if + block get_local $2 - i32.const 8 + i32.const 1 i32.sub - tee_local $2 + set_local $2 get_local $0 + i32.const 1 i32.add + set_local $0 get_local $1 - get_local $2 + i32.const 1 i32.add - i64.load - i64.store - br $continue|4 + set_local $1 end + br $continue|0 end end - loop $continue|5 + end + get_local $2 + if (result i32) + get_local $0 + i32.load8_u + get_local $1 + i32.load8_u + i32.sub + else + i32.const 0 + end + ) + (func $~lib/memory/memory.compare (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + get_local $0 + get_local $1 + get_local $2 + call $~lib/internal/memory/memcmp + ) + (func $~lib/allocator/arena/__memory_allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + get_global $~lib/internal/allocator/MAX_SIZE_32 + i32.gt_u + if + unreachable + end + get_global $~lib/allocator/arena/offset + set_local $1 + get_local $1 + get_local $0 + tee_local $2 + i32.const 1 + tee_local $3 + get_local $2 + get_local $3 + i32.gt_u + select + i32.add + get_global $~lib/internal/allocator/AL_MASK + i32.add + get_global $~lib/internal/allocator/AL_MASK + i32.const -1 + i32.xor + i32.and + set_local $4 + current_memory + set_local $5 + get_local $4 + get_local $5 + i32.const 16 + i32.shl + i32.gt_u + if + get_local $4 + get_local $1 + i32.sub + i32.const 65535 + i32.add + i32.const 65535 + i32.const -1 + i32.xor + i32.and + i32.const 16 + i32.shr_u + set_local $2 + get_local $5 + tee_local $3 + get_local $2 + tee_local $6 + get_local $3 + get_local $6 + i32.gt_s + select + set_local $3 + get_local $3 + grow_memory + i32.const 0 + i32.lt_s + if get_local $2 + grow_memory + i32.const 0 + i32.lt_s + if + unreachable + end + end + end + get_local $4 + set_global $~lib/allocator/arena/offset + get_local $1 + ) + (func $~lib/memory/memory.allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + call $~lib/allocator/arena/__memory_allocate + return + ) + (func $~lib/allocator/arena/__memory_free (; 12 ;) (type $iv) (param $0 i32) + nop + ) + (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) + get_local $0 + call $~lib/allocator/arena/__memory_free + return + ) + (func $~lib/allocator/arena/__memory_reset (; 14 ;) (type $v) + get_global $~lib/allocator/arena/startOffset + set_global $~lib/allocator/arena/offset + ) + (func $~lib/memory/memory.reset (; 15 ;) (type $v) + call $~lib/allocator/arena/__memory_reset + return + ) + (func $~lib/array/Array#__get (; 16 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + get_local $0 + i32.load + set_local $2 + get_local $1 + get_local $2 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + i32.const 0 + set_local $3 + get_local $2 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $3 + i32.add + i32.load offset=8 + else + unreachable + end + ) + (func $assembly/module/index/Module#getID (; 17 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + block $~lib/array/Array#get:length|inlined.0 (result i32) + get_local $0 + i32.load + set_local $2 + get_local $2 + i32.load offset=4 + end + set_local $3 + block $break|0 + i32.const 0 + set_local $2 + loop $repeat|0 + get_local $2 + get_local $3 + i32.lt_s + i32.eqz + br_if $break|0 + get_local $0 + i32.load + get_local $2 + call $~lib/array/Array#__get + i32.load offset=4 + get_local $1 + i32.eq if - get_local $2 - i32.const 1 - i32.sub - tee_local $2 get_local $0 - i32.add - get_local $1 + i32.load + get_local $2 + call $~lib/array/Array#__get + return + end + get_local $2 + i32.const 1 + i32.add + set_local $2 + br $repeat|0 + unreachable + end + unreachable + end + i32.const 0 + ) + (func $assembly/module/index/Section#constructor (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 4 + call $~lib/memory/memory.allocate + set_local $0 + end + get_local $0 + get_local $1 + i32.store + get_local $0 + ) + (func $assembly/module/index/TypeSection#constructor (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 8 + call $~lib/memory/memory.allocate + set_local $0 + end + get_local $0 + get_local $1 + call $assembly/module/index/Section#constructor + set_local $0 + get_local $0 + i32.const 0 + i32.store offset=4 + get_local $0 + ) + (func $assembly/buffer/index/Buffer#readVaruint (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + i32.const 0 + set_local $2 + i32.const 0 + set_local $3 + get_local $0 + i32.load offset=8 + set_local $5 + block $break|0 + loop $continue|0 + block + block (result i32) + get_local $5 + tee_local $6 + i32.const 1 + i32.add + set_local $5 + get_local $6 + end + i32.load8_u + set_local $4 get_local $2 + get_local $4 + i32.const 127 + i32.and + get_local $3 + i32.shl + i32.or + set_local $2 + get_local $4 + i32.const 128 + i32.and + i32.eqz + if + br $break|0 + end + get_local $3 + i32.const 7 i32.add - i32.load8_u - i32.store8 - br $continue|5 + set_local $3 end + i32.const 1 + br_if $continue|0 end end - ) - (func $~lib/memory/memory.copy (; 8 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) get_local $0 - get_local $1 + get_local $5 + i32.store offset=8 get_local $2 - call $~lib/internal/memory/memmove ) - (func $~lib/internal/memory/memcmp (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) - (local $3 i32) + (func $~lib/internal/arraybuffer/computeSize (; 21 ;) (type $ii) (param $0 i32) (result i32) + i32.const 1 + i32.const 32 get_local $0 - get_local $1 - i32.eq + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + i32.const 1 + i32.sub + i32.clz + i32.sub + i32.shl + ) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 22 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + get_local $0 + get_global $~lib/internal/arraybuffer/MAX_BLENGTH + i32.le_u + i32.eqz if i32.const 0 - return - end - loop $continue|0 - get_local $2 - i32.const 0 - i32.ne - tee_local $3 - if - get_local $0 - i32.load8_u - get_local $1 - i32.load8_u - i32.eq - set_local $3 - end - get_local $3 - if - get_local $2 - i32.const 1 - i32.sub - set_local $2 - get_local $0 - i32.const 1 - i32.add - set_local $0 - get_local $1 - i32.const 1 - i32.add - set_local $1 - br $continue|0 - end + i32.const 40 + i32.const 26 + i32.const 2 + call $~lib/env/abort + unreachable end - get_local $2 - if (result i32) + block $~lib/memory/memory.allocate|inlined.0 (result i32) get_local $0 - i32.load8_u - get_local $1 - i32.load8_u - i32.sub - else - i32.const 0 + call $~lib/internal/arraybuffer/computeSize + set_local $2 + get_local $2 + call $~lib/allocator/arena/__memory_allocate + br $~lib/memory/memory.allocate|inlined.0 end - tee_local $0 - ) - (func $~lib/memory/memory.compare (; 10 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + set_local $1 + get_local $1 get_local $0 + i32.store get_local $1 - get_local $2 - call $~lib/internal/memory/memcmp ) - (func $~lib/allocator/arena/__memory_allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) + (func $~lib/array/Array#constructor (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) - get_local $0 - i32.const 1073741824 + (local $4 i32) + (local $5 i32) + get_local $1 + i32.const 268435454 i32.gt_u if + i32.const 0 + i32.const 8 + i32.const 45 + i32.const 39 + call $~lib/env/abort unreachable end - get_global $~lib/allocator/arena/offset - tee_local $1 - get_local $0 - i32.const 1 - get_local $0 - i32.const 1 - i32.gt_u - select - i32.add - i32.const 7 - i32.add - i32.const -8 - i32.and - tee_local $2 - current_memory - tee_local $3 - i32.const 16 + get_local $1 + i32.const 2 i32.shl - i32.gt_u - if - get_local $3 - get_local $2 - get_local $1 - i32.sub - i32.const 65535 - i32.add - i32.const -65536 - i32.and - i32.const 16 - i32.shr_u - tee_local $0 - get_local $3 + set_local $2 + get_local $2 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 + block (result i32) get_local $0 - i32.gt_s - select - grow_memory - i32.const 0 - i32.lt_s + i32.eqz if - get_local $0 - grow_memory - i32.const 0 - i32.lt_s - if - unreachable - end + i32.const 8 + call $~lib/memory/memory.allocate + set_local $0 end + get_local $0 + i32.const 0 + i32.store + get_local $0 + i32.const 0 + i32.store offset=4 + get_local $0 end - get_local $2 - set_global $~lib/allocator/arena/offset + get_local $3 + i32.store + get_local $0 get_local $1 - ) - (func $~lib/memory/memory.allocate (; 12 ;) (type $ii) (param $0 i32) (result i32) + i32.store offset=4 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $4 + i32.const 0 + set_local $5 + get_local $4 + get_local $5 + get_local $2 + call $~lib/internal/memory/memset get_local $0 - call $~lib/allocator/arena/__memory_allocate - ) - (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) - nop - ) - (func $~lib/memory/memory.reset (; 14 ;) (type $v) - get_global $~lib/allocator/arena/startOffset - set_global $~lib/allocator/arena/offset ) - (func $~lib/internal/number/decimalCount32 (; 15 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + i32.const 0 + set_local $2 + i32.const 0 + set_local $3 get_local $0 - i32.const 100000 - i32.lt_u - if (result i32) - get_local $0 - i32.const 100 - i32.lt_u - if (result i32) - i32.const 1 - i32.const 2 - get_local $0 - i32.const 10 - i32.lt_u - select - else - i32.const 3 - i32.const 4 - i32.const 5 - get_local $0 - i32.const 10000 - i32.lt_u - select - get_local $0 - i32.const 1000 - i32.lt_u - select - end - else - get_local $0 - i32.const 10000000 - i32.lt_u - if (result i32) - i32.const 6 - i32.const 7 - get_local $0 - i32.const 1000000 - i32.lt_u - select - else - i32.const 8 - i32.const 9 - i32.const 10 - get_local $0 - i32.const 1000000000 - i32.lt_u - select - get_local $0 - i32.const 100000000 - i32.lt_u - select + i32.load offset=8 + set_local $5 + block $break|0 + loop $continue|0 + block + block (result i32) + get_local $5 + tee_local $6 + i32.const 1 + i32.add + set_local $5 + get_local $6 + end + i32.load8_u + set_local $4 + get_local $2 + get_local $4 + i32.const 127 + i32.and + get_local $3 + i32.shl + i32.or + set_local $2 + get_local $3 + i32.const 7 + i32.add + set_local $3 + end + get_local $4 + i32.const 128 + i32.and + br_if $continue|0 end end - ) - (func $~lib/internal/string/allocateUnsafe (; 16 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) get_local $0 + get_local $5 + i32.store offset=8 + get_local $2 i32.const 0 - i32.gt_s - tee_local $1 - if - get_local $0 - i32.const 536870910 - i32.le_s - set_local $1 + i32.const -1 + i32.xor + get_local $3 + i32.shl + i32.or + get_local $2 + get_local $3 + get_local $1 + i32.lt_u + tee_local $6 + if (result i32) + get_local $4 + i32.const 64 + i32.and + i32.const 0 + i32.ne + else + get_local $6 end + select + ) + (func $assembly/buffer/index/Buffer#readVarint8 (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 get_local $1 + call $assembly/buffer/index/Buffer#readVarint + ) + (func $assembly/module/index/FuncType#constructor (; 26 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + get_local $0 i32.eqz if - i32.const 0 - i32.const 16 - i32.const 14 - i32.const 2 - call $~lib/env/abort - unreachable + i32.const 13 + call $~lib/memory/memory.allocate + set_local $0 end get_local $0 - i32.const 1 - i32.shl - i32.const 4 - i32.add - call $~lib/allocator/arena/__memory_allocate - tee_local $1 - get_local $0 + i32.const 0 i32.store + get_local $0 + i32.const 0 + i32.store offset=4 + get_local $0 get_local $1 + i32.store offset=8 + get_local $0 + get_local $2 + i32.store8 offset=12 + get_local $0 ) - (func $~lib/internal/number/utoa32_lut (; 17 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) (local $3 i32) (local $4 i32) - i32.const 584 + (local $5 i32) + get_local $0 i32.load - set_local $3 - loop $continue|0 + set_local $2 + get_local $1 + get_local $2 + i32.gt_s + if get_local $1 - i32.const 10000 - i32.ge_u + get_global $~lib/internal/arraybuffer/MAX_BLENGTH + i32.le_s + i32.eqz + if + i32.const 0 + i32.const 40 + i32.const 40 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $1 + get_local $2 + call $~lib/internal/arraybuffer/computeSize + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.sub + i32.le_s if + get_local $0 get_local $1 - i32.const 10000 - i32.rem_u - set_local $4 + i32.store + else get_local $1 - i32.const 10000 - i32.div_u - set_local $1 - get_local $2 - i32.const 4 - i32.sub - tee_local $2 - i32.const 1 - i32.shl + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $4 get_local $0 + get_global $~lib/internal/arraybuffer/HEADER_SIZE i32.add - get_local $3 + set_local $5 get_local $4 - i32.const 100 - i32.div_u - i32.const 2 - i32.shl - i32.add - i64.load32_u offset=8 + get_local $5 + get_local $2 + call $~lib/internal/memory/memmove + block $~lib/memory/memory.free|inlined.0 + block + get_local $0 + call $~lib/allocator/arena/__memory_free + br $~lib/memory/memory.free|inlined.0 + unreachable + end + unreachable + end get_local $3 - get_local $4 - i32.const 100 - i32.rem_u - i32.const 2 - i32.shl - i32.add - i64.load32_u offset=8 - i64.const 32 - i64.shl - i64.or - i64.store offset=4 - br $continue|0 + set_local $0 end - end - get_local $1 - i32.const 100 - i32.ge_u - if - get_local $1 - i32.const 100 - i32.rem_u - set_local $4 + get_local $0 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + get_local $2 + i32.add + set_local $3 + i32.const 0 + set_local $5 get_local $1 - i32.const 100 - i32.div_u - set_local $1 get_local $2 - i32.const 2 i32.sub - tee_local $2 - i32.const 1 - i32.shl - get_local $0 - i32.add + set_local $4 get_local $3 + get_local $5 get_local $4 - i32.const 2 - i32.shl - i32.add - i32.load offset=8 - i32.store offset=4 + call $~lib/internal/memory/memset + else + get_local $1 + get_local $2 + i32.lt_s + if + get_local $1 + i32.const 0 + i32.ge_s + i32.eqz + if + i32.const 0 + i32.const 40 + i32.const 62 + i32.const 4 + call $~lib/env/abort + unreachable + end + get_local $0 + get_local $1 + i32.store + end end + get_local $0 + ) + (func $~lib/array/Array#__set (; 28 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.load + set_local $3 + get_local $3 + i32.load + i32.const 2 + i32.shr_u + set_local $4 get_local $1 - i32.const 10 + get_local $4 i32.ge_u if - get_local $2 - i32.const 2 - i32.sub - i32.const 1 - i32.shl - get_local $0 - i32.add + get_local $1 + i32.const 268435454 + i32.ge_u + if + i32.const 0 + i32.const 8 + i32.const 107 + i32.const 41 + call $~lib/env/abort + unreachable + end get_local $3 get_local $1 - i32.const 2 - i32.shl - i32.add - i32.load offset=8 - i32.store offset=4 - else - get_local $2 - i32.const 1 - i32.sub i32.const 1 + i32.add + i32.const 2 i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + set_local $3 get_local $0 - i32.add - get_local $1 - i32.const 48 - i32.add - i32.store16 offset=4 - end - ) - (func $~lib/internal/number/itoa (; 18 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - block $__inlined_func$~lib/internal/number/utoa32 + get_local $3 + i32.store get_local $0 - tee_local $1 - i32.eqz - if - i32.const 8 - set_local $0 - br $__inlined_func$~lib/internal/number/utoa32 - end - get_local $1 - call $~lib/internal/number/decimalCount32 - tee_local $2 - call $~lib/internal/string/allocateUnsafe - tee_local $0 get_local $1 - get_local $2 - call $~lib/internal/number/utoa32_lut + i32.const 1 + i32.add + i32.store offset=4 end - get_local $0 - ) - (func $~lib/internal/string/copyUnsafe (; 19 ;) (type $FUNCSIG$viiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) + i32.const 0 + set_local $5 + get_local $3 get_local $1 - i32.const 1 + i32.const 2 i32.shl - get_local $0 i32.add - i32.const 4 + get_local $5 i32.add get_local $2 - i32.const 4 - i32.add - get_local $3 - i32.const 1 - i32.shl - call $~lib/internal/memory/memmove + i32.store offset=8 ) - (func $~lib/string/String#concat (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) - get_local $0 - i32.eqz + (local $5 i32) + get_local $1 + i32.const 268435454 + i32.gt_u if i32.const 0 - i32.const 624 - i32.const 110 - i32.const 4 + i32.const 8 + i32.const 45 + i32.const 39 call $~lib/env/abort unreachable end get_local $1 - i32.eqz - if - i32.const 608 - set_local $1 + i32.const 2 + i32.shl + set_local $2 + get_local $2 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 + block (result i32) + get_local $0 + i32.eqz + if + i32.const 8 + call $~lib/memory/memory.allocate + set_local $0 + end + get_local $0 + i32.const 0 + i32.store + get_local $0 + i32.const 0 + i32.store offset=4 + get_local $0 end + get_local $3 + i32.store get_local $0 - i32.load - tee_local $3 get_local $1 - i32.load - tee_local $4 + i32.store offset=4 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE i32.add - tee_local $2 - i32.eqz - if - i32.const 656 - return - end - get_local $2 - call $~lib/internal/string/allocateUnsafe - tee_local $2 + set_local $4 i32.const 0 - get_local $0 - get_local $3 - call $~lib/internal/string/copyUnsafe - get_local $2 - get_local $3 - get_local $1 + set_local $5 get_local $4 - call $~lib/internal/string/copyUnsafe + get_local $5 get_local $2 - ) - (func $~lib/string/String.__concat (; 21 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.eqz - if - i32.const 608 - set_local $0 - end + call $~lib/internal/memory/memset get_local $0 - get_local $1 - call $~lib/string/String#concat ) - (func $assembly/module/index/SectionHeader#toString (; 22 ;) (type $ii) (param $0 i32) (result i32) - (local $1 i32) + (func $~lib/array/Array#__get (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) - (local $4 i32) - (local $5 i32) get_local $0 i32.load - call $~lib/internal/number/itoa - set_local $1 - get_local $0 - i32.load offset=4 - call $~lib/internal/number/itoa set_local $2 - get_local $0 - i32.load offset=8 - call $~lib/internal/number/itoa - set_local $3 - get_local $0 - i32.load offset=12 - call $~lib/internal/number/itoa - set_local $4 - get_local $0 - i32.load offset=20 - set_local $5 - get_local $0 - i32.load offset=12 - get_local $0 - i32.load offset=8 - i32.add - call $~lib/internal/number/itoa - set_local $0 - i32.const 592 - get_local $5 - call $~lib/string/String.__concat - i32.const 664 - call $~lib/string/String.__concat - i32.const 672 - call $~lib/string/String.__concat get_local $1 - call $~lib/string/String.__concat - i32.const 664 - call $~lib/string/String.__concat - i32.const 688 - call $~lib/string/String.__concat get_local $2 - call $~lib/string/String.__concat - i32.const 664 - call $~lib/string/String.__concat - i32.const 704 - call $~lib/string/String.__concat - get_local $4 - call $~lib/string/String.__concat - i32.const 664 - call $~lib/string/String.__concat - i32.const 736 - call $~lib/string/String.__concat - get_local $3 - call $~lib/string/String.__concat - i32.const 664 - call $~lib/string/String.__concat - i32.const 776 - call $~lib/string/String.__concat - get_local $0 - call $~lib/string/String.__concat - ) - (func $assembly/module/index/Module#print (; 23 ;) (type $iv) (param $0 i32) - (local $1 i32) - (local $2 i32) - loop $repeat|0 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + i32.const 0 + set_local $3 + get_local $2 get_local $1 - get_local $0 - i32.load - i32.load offset=4 - i32.lt_s - if - get_local $1 - get_local $0 - i32.load - i32.load - tee_local $2 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $1 - i32.const 2 - i32.shl - get_local $2 - i32.add - i32.load offset=8 - else - unreachable - end - tee_local $2 - call $assembly/module/index/SectionHeader#toString - call $assembly/host/index/_log_str - i32.const 656 - call $assembly/host/index/_log_str - get_local $1 - i32.const 1 - i32.add - set_local $1 - br $repeat|0 - end + i32.const 2 + i32.shl + i32.add + get_local $3 + i32.add + i32.load offset=8 + else + unreachable end ) - (func $assembly/index/printModule (; 24 ;) (type $iv) (param $0 i32) - get_local $0 - call $assembly/module/index/Module#print - ) - (func $assembly/module/index/Module#getID (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + (func $~lib/array/Array#__set (; 31 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) get_local $0 i32.load - i32.load offset=4 + set_local $3 + get_local $3 + i32.load + i32.const 2 + i32.shr_u set_local $4 - loop $repeat|0 - get_local $2 - get_local $4 - i32.lt_s + get_local $1 + get_local $4 + i32.ge_u + if + get_local $1 + i32.const 268435454 + i32.ge_u if - get_local $2 - get_local $0 - i32.load - i32.load - tee_local $3 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $2 - i32.const 2 - i32.shl - get_local $3 - i32.add - i32.load offset=8 - else - unreachable - end - tee_local $3 - i32.load offset=4 - get_local $1 - i32.eq - if - get_local $2 - get_local $0 - i32.load - i32.load - tee_local $0 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $2 - i32.const 2 - i32.shl - get_local $0 - i32.add - i32.load offset=8 - else - unreachable - end - tee_local $0 - return - else - get_local $2 - i32.const 1 - i32.add - set_local $2 - br $repeat|0 - end + i32.const 0 + i32.const 8 + i32.const 107 + i32.const 41 + call $~lib/env/abort unreachable end - end - i32.const 0 - ) - (func $assembly/module/index/Section#constructor (; 26 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - (local $1 i32) - i32.const 4 - call $~lib/allocator/arena/__memory_allocate - tee_local $1 - get_local $0 - i32.store - get_local $1 - ) - (func $assembly/buffer/index/Buffer#readVaruint (; 27 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) - (local $4 i32) - get_local $0 - i32.load offset=8 - set_local $1 - loop $continue|0 + get_local $3 + get_local $1 + i32.const 1 + i32.add + i32.const 2 + i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + set_local $3 + get_local $0 + get_local $3 + i32.store + get_local $0 get_local $1 - tee_local $2 i32.const 1 i32.add - set_local $1 - get_local $2 - i32.load8_u - tee_local $2 - i32.const 127 - i32.and - get_local $4 - i32.shl - get_local $3 - i32.or - set_local $3 - get_local $2 - i32.const 128 - i32.and - if - get_local $4 - i32.const 7 - i32.add - set_local $4 - br $continue|0 - end + i32.store offset=4 end - get_local $0 + i32.const 0 + set_local $5 + get_local $3 get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $5 + i32.add + get_local $2 i32.store offset=8 - get_local $3 ) - (func $~lib/internal/arraybuffer/allocateUnsafe (; 28 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/decimalCount32 (; 32 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 - i32.const 1073741816 - i32.gt_u + i32.const 100000 + i32.lt_u if - i32.const 0 - i32.const 824 - i32.const 26 - i32.const 2 - call $~lib/env/abort + get_local $0 + i32.const 100 + i32.lt_u + if + i32.const 1 + i32.const 2 + get_local $0 + i32.const 10 + i32.lt_u + select + return + else + i32.const 4 + i32.const 5 + get_local $0 + i32.const 10000 + i32.lt_u + select + set_local $1 + i32.const 3 + get_local $1 + get_local $0 + i32.const 1000 + i32.lt_u + select + return + end + unreachable + unreachable + else + get_local $0 + i32.const 10000000 + i32.lt_u + if + i32.const 6 + i32.const 7 + get_local $0 + i32.const 1000000 + i32.lt_u + select + return + else + i32.const 9 + i32.const 10 + get_local $0 + i32.const 1000000000 + i32.lt_u + select + set_local $1 + i32.const 8 + get_local $1 + get_local $0 + i32.const 100000000 + i32.lt_u + select + return + end + unreachable unreachable end - i32.const 1 - i32.const 32 - get_local $0 - i32.const 7 - i32.add - i32.clz - i32.sub - i32.shl - call $~lib/allocator/arena/__memory_allocate - tee_local $1 - get_local $0 - i32.store - get_local $1 + unreachable + unreachable ) - (func $~lib/array/Array#constructor (; 29 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocateUnsafe (; 33 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) - (local $3 i32) get_local $0 - i32.const 268435454 - i32.gt_u + i32.const 0 + i32.gt_s + tee_local $1 + if (result i32) + get_local $0 + get_global $~lib/internal/string/MAX_LENGTH + i32.le_s + else + get_local $1 + end + i32.eqz if i32.const 0 - i32.const 792 - i32.const 45 - i32.const 39 + i32.const 112 + i32.const 14 + i32.const 2 call $~lib/env/abort unreachable end - get_local $0 - i32.const 2 - i32.shl - tee_local $3 - call $~lib/internal/arraybuffer/allocateUnsafe + block $~lib/memory/memory.allocate|inlined.1 (result i32) + get_global $~lib/internal/string/HEADER_SIZE + get_local $0 + i32.const 1 + i32.shl + i32.add + set_local $1 + get_local $1 + call $~lib/allocator/arena/__memory_allocate + br $~lib/memory/memory.allocate|inlined.1 + end set_local $2 - i32.const 8 - call $~lib/allocator/arena/__memory_allocate - tee_local $1 - i32.const 0 - i32.store - get_local $1 - i32.const 0 - i32.store offset=4 - get_local $1 get_local $2 - i32.store - get_local $1 get_local $0 - i32.store offset=4 + i32.store get_local $2 - i32.const 8 - i32.add - i32.const 0 - get_local $3 - call $~lib/internal/memory/memset - get_local $1 ) - (func $assembly/buffer/index/Buffer#readVarint (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) + (func $~lib/internal/number/utoa32_lut (; 34 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) - get_local $0 - i32.load offset=8 - set_local $5 - loop $continue|0 + (local $7 i32) + (local $8 i32) + (local $9 i64) + (local $10 i64) + block $~lib/internal/number/DIGITS|inlined.0 (result i32) + i32.const 680 + end + i32.load + set_local $3 + block $break|0 + loop $continue|0 + get_local $1 + i32.const 10000 + i32.ge_u + if + block + get_local $1 + i32.const 10000 + i32.div_u + set_local $4 + get_local $1 + i32.const 10000 + i32.rem_u + set_local $5 + get_local $4 + set_local $1 + get_local $5 + i32.const 100 + i32.div_u + set_local $6 + get_local $5 + i32.const 100 + i32.rem_u + set_local $7 + block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i64) + i32.const 0 + set_local $8 + get_local $3 + get_local $6 + i32.const 2 + i32.shl + i32.add + get_local $8 + i32.add + i64.load32_u offset=8 + end + set_local $9 + block $~lib/internal/arraybuffer/LOAD|inlined.1 (result i64) + i32.const 0 + set_local $8 + get_local $3 + get_local $7 + i32.const 2 + i32.shl + i32.add + get_local $8 + i32.add + i64.load32_u offset=8 + end + set_local $10 + get_local $2 + i32.const 4 + i32.sub + set_local $2 + get_local $0 + get_local $2 + i32.const 1 + i32.shl + i32.add + get_local $9 + get_local $10 + i64.const 32 + i64.shl + i64.or + i64.store offset=4 + end + br $continue|0 + end + end + end + get_local $1 + i32.const 100 + i32.ge_u + if + get_local $1 + i32.const 100 + i32.div_u + set_local $7 + get_local $1 + i32.const 100 + i32.rem_u + set_local $6 + get_local $7 + set_local $1 + get_local $2 + i32.const 2 + i32.sub + set_local $2 + block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) + i32.const 0 + set_local $5 + get_local $3 + get_local $6 + i32.const 2 + i32.shl + i32.add + get_local $5 + i32.add + i32.load offset=8 + end + set_local $5 + get_local $0 + get_local $2 + i32.const 1 + i32.shl + i32.add + get_local $5 + i32.store offset=4 + end + get_local $1 + i32.const 10 + i32.ge_u + if + get_local $2 + i32.const 2 + i32.sub + set_local $2 + block $~lib/internal/arraybuffer/LOAD|inlined.1 (result i32) + i32.const 0 + set_local $5 + get_local $3 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $5 + i32.add + i32.load offset=8 + end + set_local $5 + get_local $0 + get_local $2 + i32.const 1 + i32.shl + i32.add get_local $5 - tee_local $4 + i32.store offset=4 + else + get_local $2 i32.const 1 + i32.sub + set_local $2 + get_global $~lib/internal/string/CharCode._0 + get_local $1 i32.add set_local $5 - get_local $4 - i32.load8_u - tee_local $6 - i32.const 127 - i32.and + get_local $0 get_local $2 + i32.const 1 i32.shl - get_local $3 - i32.or - set_local $3 - get_local $2 - i32.const 7 i32.add - set_local $2 - get_local $6 - i32.const 128 - i32.and - br_if $continue|0 + get_local $5 + i32.store16 offset=4 end + ) + (func $~lib/internal/number/utoa32 (; 35 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) get_local $0 - get_local $5 - i32.store offset=8 - i32.const -1 - get_local $2 - i32.shl - get_local $3 - i32.or - set_local $0 - get_local $2 - get_local $1 - i32.lt_u - tee_local $4 + i32.eqz if - get_local $6 - i32.const 64 - i32.and - i32.const 0 - i32.ne - set_local $4 + i32.const 104 + return end get_local $0 - get_local $3 - get_local $4 - select + call $~lib/internal/number/decimalCount32 + set_local $1 + get_local $1 + call $~lib/internal/string/allocateUnsafe + set_local $2 + get_local $2 + get_local $0 + get_local $1 + call $~lib/internal/number/utoa32_lut + get_local $2 ) - (func $assembly/buffer/index/Buffer#readVarint8 (; 31 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa (; 36 ;) (type $ii) (param $0 i32) (result i32) get_local $0 - i32.const 7 - call $assembly/buffer/index/Buffer#readVarint + call $~lib/internal/number/utoa32 + return ) - (func $assembly/module/index/FuncType#constructor (; 32 ;) (type $FUNCSIG$iii) (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - i32.const 13 - call $~lib/allocator/arena/__memory_allocate - tee_local $2 - i32.const 0 - i32.store - get_local $2 - i32.const 0 - i32.store offset=4 - get_local $2 + (func $~lib/internal/string/copyUnsafe (; 37 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) + (local $5 i32) + (local $6 i32) + (local $7 i32) get_local $0 - i32.store offset=8 - get_local $2 get_local $1 - i32.store8 offset=12 + i32.const 1 + i32.shl + i32.add + get_global $~lib/internal/string/HEADER_SIZE + i32.add + set_local $5 get_local $2 + get_local $3 + i32.const 1 + i32.shl + i32.add + get_global $~lib/internal/string/HEADER_SIZE + i32.add + set_local $6 + get_local $4 + i32.const 1 + i32.shl + set_local $7 + get_local $5 + get_local $6 + get_local $7 + call $~lib/internal/memory/memmove ) - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 33 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 38 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) - get_local $1 + (local $4 i32) + (local $5 i32) get_local $0 - i32.load - tee_local $2 - i32.gt_s + i32.const 0 + i32.ne + i32.eqz if - get_local $1 - i32.const 1073741816 - i32.gt_s - if - i32.const 0 - i32.const 824 - i32.const 40 - i32.const 4 - call $~lib/env/abort - unreachable - end - get_local $1 - i32.const 1 - i32.const 32 - get_local $2 - i32.const 7 - i32.add - i32.clz - i32.sub - i32.shl - i32.const 8 - i32.sub - i32.le_s - if - get_local $0 - get_local $1 - i32.store - else - get_local $1 - call $~lib/internal/arraybuffer/allocateUnsafe - tee_local $3 - i32.const 8 - i32.add - get_local $0 - i32.const 8 - i32.add - get_local $2 - call $~lib/internal/memory/memmove - get_local $3 - set_local $0 - end - get_local $0 - i32.const 8 - i32.add - get_local $2 - i32.add i32.const 0 - get_local $1 - get_local $2 - i32.sub - call $~lib/internal/memory/memset - else - get_local $1 - get_local $2 - i32.lt_s - if - get_local $1 - i32.const 0 - i32.lt_s - if - i32.const 0 - i32.const 824 - i32.const 62 - i32.const 4 - call $~lib/env/abort - unreachable - end - get_local $0 - get_local $1 - i32.store - end + i32.const 880 + i32.const 110 + i32.const 4 + call $~lib/env/abort + unreachable end - get_local $0 - ) - (func $~lib/array/Array#__set (; 34 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local $4 i32) get_local $1 + i32.const 0 + i32.eq + if + i32.const 864 + set_local $1 + end get_local $0 i32.load - tee_local $3 + set_local $2 + get_local $1 i32.load - i32.const 2 - i32.shr_u - i32.ge_u - if - get_local $1 - i32.const 268435454 - i32.ge_u - if - i32.const 0 - i32.const 792 - i32.const 109 - i32.const 41 - call $~lib/env/abort - unreachable - end - get_local $0 - get_local $3 - get_local $1 - i32.const 1 - i32.add - tee_local $4 - i32.const 2 - i32.shl - call $~lib/internal/arraybuffer/reallocateUnsafe - tee_local $3 - i32.store - get_local $0 - get_local $4 - i32.store offset=4 - end + set_local $3 + get_local $2 get_local $3 - get_local $1 - i32.const 2 - i32.shl i32.add + set_local $4 + get_local $4 + i32.const 0 + i32.eq + if + i32.const 912 + return + end + get_local $4 + call $~lib/internal/string/allocateUnsafe + set_local $5 + get_local $5 + i32.const 0 + get_local $0 + i32.const 0 get_local $2 - i32.store offset=8 + call $~lib/internal/string/copyUnsafe + get_local $5 + get_local $2 + get_local $1 + i32.const 0 + get_local $3 + call $~lib/internal/string/copyUnsafe + get_local $5 + ) + (func $~lib/string/String.__concat (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 864 + set_local $0 + end + get_local $0 + get_local $1 + call $~lib/string/String#concat ) - (func $assembly/host/index/err (; 35 ;) (type $iv) (param $0 i32) - i32.const 1040 + (func $assembly/host/index/log (; 40 ;) (type $iv) (param $0 i32) get_local $0 - call $~lib/string/String.__concat call $assembly/host/index/_log_str + ) + (func $assembly/host/index/err (; 41 ;) (type $iv) (param $0 i32) + i32.const 840 + get_local $0 + call $~lib/string/String.__concat + call $assembly/host/index/log unreachable ) - (func $assembly/module/index/typeName (; 36 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/typeName (; 42 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) - block $case7|0 - block $case6|0 - block $case5|0 - block $case4|0 - block $case3|0 - block $case2|0 - block $case1|0 - get_local $0 - i32.const 127 - i32.ne - if - get_local $0 - tee_local $1 - i32.const 126 - i32.eq - br_if $case1|0 - get_local $1 - i32.const 125 - i32.eq - br_if $case2|0 - get_local $1 - i32.const 124 - i32.eq - br_if $case3|0 - get_local $1 - i32.const 112 - i32.eq - br_if $case4|0 - get_local $1 - i32.const 96 - i32.eq - br_if $case5|0 - get_local $1 - i32.const 64 - i32.eq - br_if $case6|0 - br $case7|0 + block $break|0 + block $case7|0 + block $case6|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + block $case0|0 + get_local $0 + set_local $1 + get_local $1 + i32.const 127 + i32.eq + br_if $case0|0 + get_local $1 + i32.const 126 + i32.eq + br_if $case1|0 + get_local $1 + i32.const 125 + i32.eq + br_if $case2|0 + get_local $1 + i32.const 124 + i32.eq + br_if $case3|0 + get_local $1 + i32.const 112 + i32.eq + br_if $case4|0 + get_local $1 + i32.const 96 + i32.eq + br_if $case5|0 + get_local $1 + i32.const 64 + i32.eq + br_if $case6|0 + br $case7|0 + end + i32.const 688 + return end - i32.const 888 + i32.const 704 return end - i32.const 904 + i32.const 720 return end - i32.const 920 + i32.const 736 return end - i32.const 936 + i32.const 752 return end - i32.const 952 + i32.const 776 return end - i32.const 976 + i32.const 792 return end - i32.const 992 - return + i32.const 808 + call $assembly/host/index/err + end + i32.const 912 + ) + (func $~lib/array/Array#__get (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + get_local $0 + i32.load + set_local $2 + get_local $1 + get_local $2 + i32.load + i32.const 2 + i32.shr_u + i32.lt_u + if (result i32) + i32.const 0 + set_local $3 + get_local $2 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $3 + i32.add + i32.load offset=8 + else + unreachable end - i32.const 1008 - call $assembly/host/index/err - i32.const 656 ) - (func $assembly/module/index/FuncType#toString (; 37 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/FuncType#toString (; 44 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -2496,110 +3200,105 @@ get_local $0 i32.load offset=8 call $~lib/internal/number/itoa - set_local $4 + set_local $1 get_local $0 i32.load8_s offset=12 call $assembly/module/index/typeName - set_local $5 - i32.const 656 - set_local $1 - loop $repeat|0 - get_local $2 - get_local $0 - i32.load - i32.load offset=4 - i32.lt_s - if - get_local $1 - get_local $2 - get_local $0 - i32.load - i32.load - tee_local $3 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $2 - i32.const 2 - i32.shl - get_local $3 - i32.add - i32.load offset=8 - else - unreachable + set_local $2 + i32.const 912 + set_local $3 + block $break|0 + i32.const 0 + set_local $4 + loop $repeat|0 + get_local $4 + block $~lib/array/Array#get:length|inlined.1 (result i32) + get_local $0 + i32.load + set_local $5 + get_local $5 + i32.load offset=4 end - tee_local $3 - call $assembly/module/index/typeName - call $~lib/string/String.__concat - set_local $1 - get_local $2 - get_local $0 - i32.load - i32.load offset=4 - i32.const 1 - i32.sub i32.lt_s - if - get_local $1 - i32.const 1064 + i32.eqz + br_if $break|0 + block + get_local $3 + get_local $0 + i32.load + get_local $4 + call $~lib/array/Array#__get + call $assembly/module/index/typeName call $~lib/string/String.__concat - set_local $1 + set_local $3 + get_local $4 + block $~lib/array/Array#get:length|inlined.3 (result i32) + get_local $0 + i32.load + set_local $5 + get_local $5 + i32.load offset=4 + end + i32.const 1 + i32.sub + i32.lt_s + if (result i32) + get_local $3 + i32.const 920 + call $~lib/string/String.__concat + tee_local $3 + else + get_local $3 + end + set_local $3 end - get_local $2 + get_local $4 i32.const 1 i32.add - set_local $2 + set_local $4 br $repeat|0 + unreachable end + unreachable + end + block $~lib/array/Array#get:length|inlined.5 (result i32) + get_local $0 + i32.load offset=4 + set_local $4 + get_local $4 + i32.load offset=4 end - get_local $0 - i32.load offset=4 - i32.load offset=4 i32.const 1 i32.eq if (result i32) - i32.const 0 get_local $0 i32.load offset=4 - i32.load - tee_local $0 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $0 - i32.load offset=8 - else - unreachable - end - tee_local $0 + i32.const 0 + call $~lib/array/Array#__get call $assembly/module/index/typeName else - i32.const 1072 + i32.const 928 end - set_local $0 - i32.const 1088 - get_local $4 + set_local $4 + i32.const 944 + get_local $1 call $~lib/string/String.__concat - i32.const 1064 + i32.const 920 call $~lib/string/String.__concat - i32.const 1112 + i32.const 968 call $~lib/string/String.__concat - get_local $5 + get_local $2 call $~lib/string/String.__concat - i32.const 1128 + i32.const 984 call $~lib/string/String.__concat - get_local $1 + get_local $3 call $~lib/string/String.__concat - i32.const 1144 + i32.const 1000 call $~lib/string/String.__concat - get_local $0 + get_local $4 call $~lib/string/String.__concat ) - (func $assembly/module/index/TypeSection#parse (; 38 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/TypeSection#parse (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2607,210 +3306,199 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) + (local $10 i32) get_local $1 get_local $0 i32.load i32.load offset=12 i32.store offset=8 get_local $1 + i32.const 32 call $assembly/buffer/index/Buffer#readVaruint - tee_local $8 + set_local $2 + i32.const 0 + get_local $2 call $~lib/array/Array#constructor - set_local $6 - loop $repeat|0 - get_local $2 - get_local $8 - i32.lt_u - if - get_local $6 - get_local $2 - get_local $2 - get_local $1 - call $assembly/buffer/index/Buffer#readVarint8 - i32.const 127 - i32.and - call $assembly/module/index/FuncType#constructor - tee_local $4 - call $~lib/array/Array#__set + set_local $3 + block $break|0 + i32.const 0 + set_local $4 + loop $repeat|0 get_local $4 - get_local $1 - call $assembly/buffer/index/Buffer#readVaruint - tee_local $7 - call $~lib/array/Array#constructor - i32.store - i32.const 0 - set_local $4 - loop $repeat|1 - get_local $4 - get_local $7 - i32.lt_u - if - get_local $1 - call $assembly/buffer/index/Buffer#readVarint8 - i32.const 127 - i32.and - set_local $5 - get_local $2 - get_local $6 - i32.load - tee_local $3 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $2 - i32.const 2 - i32.shl - get_local $3 - i32.add - i32.load offset=8 - else - unreachable - end - tee_local $3 - i32.load - get_local $4 - get_local $5 - call $~lib/array/Array#__set - get_local $4 - i32.const 1 - i32.add - set_local $4 - br $repeat|1 - end - end - get_local $1 - call $assembly/buffer/index/Buffer#readVaruint - set_local $4 get_local $2 - get_local $6 - i32.load - tee_local $3 - i32.load - i32.const 2 - i32.shr_u i32.lt_u - if (result i32) - get_local $2 - i32.const 2 - i32.shl - get_local $3 - i32.add - i32.load offset=8 - else - unreachable - end - tee_local $3 - get_local $4 - call $~lib/array/Array#constructor - i32.store offset=4 - i32.const 0 - set_local $5 - loop $repeat|2 + i32.eqz + br_if $break|0 + block + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint8 + i32.const 127 + i32.and + set_local $5 + i32.const 0 + get_local $4 get_local $5 + call $assembly/module/index/FuncType#constructor + set_local $6 + get_local $3 + get_local $4 + get_local $6 + call $~lib/array/Array#__set + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $7 + get_local $6 + i32.const 0 + get_local $7 + call $~lib/array/Array#constructor + i32.store + block $break|1 + i32.const 0 + set_local $8 + loop $repeat|1 + get_local $8 + get_local $7 + i32.lt_u + i32.eqz + br_if $break|1 + block + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint8 + i32.const 127 + i32.and + set_local $9 + get_local $3 + get_local $4 + call $~lib/array/Array#__get + i32.load + get_local $8 + get_local $9 + call $~lib/array/Array#__set + end + get_local $8 + i32.const 1 + i32.add + set_local $8 + br $repeat|1 + unreachable + end + unreachable + end + get_local $1 + i32.const 1 + call $assembly/buffer/index/Buffer#readVaruint + set_local $8 + get_local $3 get_local $4 - i32.lt_u - if - get_local $1 - call $assembly/buffer/index/Buffer#readVarint8 - i32.const 127 - i32.and - set_local $7 - get_local $2 - get_local $6 - i32.load - tee_local $3 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $2 - i32.const 2 - i32.shl - get_local $3 + call $~lib/array/Array#__get + i32.const 0 + get_local $8 + call $~lib/array/Array#constructor + i32.store offset=4 + block $break|2 + i32.const 0 + set_local $9 + loop $repeat|2 + get_local $9 + get_local $8 + i32.lt_u + i32.eqz + br_if $break|2 + block + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint8 + i32.const 127 + i32.and + set_local $10 + get_local $3 + get_local $4 + call $~lib/array/Array#__get + i32.load offset=4 + get_local $9 + get_local $10 + call $~lib/array/Array#__set + end + get_local $9 + i32.const 1 i32.add - i32.load offset=8 - else + set_local $9 + br $repeat|2 unreachable end - tee_local $3 - i32.load offset=4 - get_local $5 - get_local $7 - call $~lib/array/Array#__set - get_local $5 - i32.const 1 - i32.add - set_local $5 - br $repeat|2 + unreachable end - end - get_local $2 - tee_local $3 - get_local $6 - i32.load - tee_local $2 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) get_local $3 - i32.const 2 - i32.shl - get_local $2 - i32.add - i32.load offset=8 - else - unreachable + get_local $4 + call $~lib/array/Array#__get + call $assembly/module/index/FuncType#toString + call $assembly/host/index/log end - tee_local $2 - call $assembly/module/index/FuncType#toString - call $assembly/host/index/_log_str - get_local $3 + get_local $4 i32.const 1 i32.add - set_local $2 + set_local $4 br $repeat|0 + unreachable end + unreachable end get_local $0 ) - (func $assembly/module/index/Module#getType (; 39 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#getType (; 46 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) + (local $2 i32) get_local $0 get_global $src/common/SectionId.Type call $assembly/module/index/Module#getID - tee_local $1 - if (result i32) + set_local $1 + get_local $1 + i32.const 0 + i32.eq + if + i32.const 0 + return + else + i32.const 0 get_local $1 - call $assembly/module/index/Section#constructor + call $assembly/module/index/TypeSection#constructor + set_local $2 + get_local $2 get_local $0 i32.load offset=4 call $assembly/module/index/TypeSection#parse - else - i32.const 0 + return end + unreachable + unreachable ) - (func $~lib/array/Array#push (; 40 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#push (; 47 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) get_local $0 i32.load offset=4 - tee_local $2 - i32.const 1 - i32.add - set_local $3 - get_local $2 + set_local $2 get_local $0 i32.load - tee_local $4 + set_local $3 + get_local $3 i32.load i32.const 2 i32.shr_u + set_local $4 + get_local $2 + i32.const 1 + i32.add + set_local $5 + get_local $2 + get_local $4 i32.ge_u if get_local $2 @@ -2818,483 +3506,779 @@ i32.ge_u if i32.const 0 - i32.const 792 - i32.const 184 + i32.const 8 + i32.const 182 i32.const 42 call $~lib/env/abort unreachable end - get_local $0 - get_local $4 get_local $3 + get_local $5 i32.const 2 i32.shl call $~lib/internal/arraybuffer/reallocateUnsafe - tee_local $4 + set_local $3 + get_local $0 + get_local $3 i32.store end get_local $0 - get_local $3 + get_local $5 i32.store offset=4 - get_local $4 + i32.const 0 + set_local $6 + get_local $3 get_local $2 i32.const 2 i32.shl i32.add + get_local $6 + i32.add get_local $1 i32.store offset=8 - get_local $3 + get_local $5 ) - (func $~lib/array/Array#join (; 41 ;) (type $FUNCSIG$i) (result i32) - (local $0 i32) - (local $1 i32) + (func $~lib/array/Array#join (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) - i32.const 1212 - i32.load + (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + get_local $0 + i32.load offset=4 i32.const 1 i32.sub - tee_local $4 + set_local $2 + get_local $2 i32.const 0 i32.lt_s if - i32.const 656 + i32.const 912 return end - i32.const 1208 + i32.const 912 + set_local $3 + get_local $0 i32.load set_local $5 - i32.const 664 + get_local $1 i32.load - tee_local $6 + set_local $6 + get_local $6 i32.const 0 i32.ne set_local $7 - get_local $4 + get_local $2 i32.eqz if - get_local $5 - i32.load offset=8 - return - end - get_local $4 - i32.const 1 - i32.add - set_local $1 - loop $repeat|0 - get_local $0 - get_local $1 - i32.lt_s - if - get_local $0 + block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) + i32.const 0 + set_local $8 + i32.const 0 + set_local $9 + get_local $5 + get_local $8 i32.const 2 i32.shl - get_local $5 + i32.add + get_local $9 i32.add i32.load offset=8 - i32.load + end + return + end + i32.const 0 + set_local $9 + block $break|0 + block + i32.const 0 + set_local $8 get_local $2 + i32.const 1 i32.add - set_local $2 - get_local $0 + set_local $10 + end + loop $repeat|0 + get_local $8 + get_local $10 + i32.lt_s + i32.eqz + br_if $break|0 + get_local $9 + block $~lib/internal/arraybuffer/LOAD|inlined.1 (result i32) + i32.const 0 + set_local $11 + get_local $5 + get_local $8 + i32.const 2 + i32.shl + i32.add + get_local $11 + i32.add + i32.load offset=8 + end + i32.load + i32.add + set_local $9 + get_local $8 i32.const 1 i32.add - set_local $0 + set_local $8 br $repeat|0 + unreachable end + unreachable end i32.const 0 - set_local $1 - get_local $4 + set_local $10 + get_local $9 get_local $6 - i32.mul get_local $2 + i32.mul i32.add call $~lib/internal/string/allocateUnsafe - set_local $0 - i32.const 0 - set_local $2 - loop $repeat|1 - get_local $2 - get_local $4 - i32.lt_s - if + set_local $8 + block $break|1 + i32.const 0 + set_local $11 + loop $repeat|1 + get_local $11 get_local $2 - i32.const 2 - i32.shl - get_local $5 - i32.add - i32.load offset=8 - tee_local $3 - if - get_local $0 - get_local $1 - get_local $3 - get_local $3 - i32.load - tee_local $3 - call $~lib/internal/string/copyUnsafe - get_local $1 - get_local $3 - i32.add - set_local $1 - end - get_local $7 - if - get_local $0 - get_local $1 - i32.const 664 - get_local $6 - call $~lib/internal/string/copyUnsafe - get_local $1 - get_local $6 - i32.add - set_local $1 + i32.lt_s + i32.eqz + br_if $break|1 + block + block $~lib/internal/arraybuffer/LOAD|inlined.2 (result i32) + i32.const 0 + set_local $12 + get_local $5 + get_local $11 + i32.const 2 + i32.shl + i32.add + get_local $12 + i32.add + i32.load offset=8 + end + set_local $4 + get_local $4 + if + get_local $4 + i32.load + set_local $12 + get_local $8 + get_local $10 + get_local $4 + i32.const 0 + get_local $12 + call $~lib/internal/string/copyUnsafe + get_local $10 + get_local $12 + i32.add + set_local $10 + end + get_local $7 + if + get_local $8 + get_local $10 + get_local $1 + i32.const 0 + get_local $6 + call $~lib/internal/string/copyUnsafe + get_local $10 + get_local $6 + i32.add + set_local $10 + end end - get_local $2 + get_local $11 i32.const 1 i32.add - set_local $2 + set_local $11 br $repeat|1 + unreachable end + unreachable + end + block $~lib/internal/arraybuffer/LOAD|inlined.3 (result i32) + i32.const 0 + set_local $11 + get_local $5 + get_local $2 + i32.const 2 + i32.shl + i32.add + get_local $11 + i32.add + i32.load offset=8 end + set_local $4 get_local $4 - i32.const 2 - i32.shl - get_local $5 - i32.add - i32.load offset=8 - tee_local $3 if - get_local $0 - get_local $1 - get_local $3 - get_local $3 + get_local $4 i32.load + set_local $11 + get_local $8 + get_local $10 + get_local $4 + i32.const 0 + get_local $11 call $~lib/internal/string/copyUnsafe end - get_local $0 + get_local $8 + return ) - (func $assembly/module/index/TypeSection#toString (; 42 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/TypeSection#toString (; 49 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) - loop $repeat|0 - get_local $1 - get_local $0 - i32.load offset=4 - i32.load offset=4 - i32.lt_s - if - i32.const 1208 + (local $3 i32) + i32.const 1064 + set_local $1 + block $break|0 + i32.const 0 + set_local $2 + loop $repeat|0 + get_local $2 + block $~lib/array/Array#get:length|inlined.1 (result i32) + get_local $0 + i32.load offset=4 + set_local $3 + get_local $3 + i32.load offset=4 + end + i32.lt_s + i32.eqz + br_if $break|0 get_local $1 get_local $0 i32.load offset=4 - i32.load - tee_local $2 - i32.load - i32.const 2 - i32.shr_u - i32.lt_u - if (result i32) - get_local $1 - i32.const 2 - i32.shl - get_local $2 - i32.add - i32.load offset=8 - else - unreachable - end - tee_local $2 + get_local $2 + call $~lib/array/Array#__get call $assembly/module/index/FuncType#toString call $~lib/array/Array#push drop - get_local $1 + get_local $2 i32.const 1 i32.add - set_local $1 + set_local $2 br $repeat|0 + unreachable end + unreachable end + get_local $1 + i32.const 1072 call $~lib/array/Array#join ) - (func $assembly/index/getType (; 43 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/getType (; 50 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 call $assembly/module/index/Module#getType - tee_local $1 - i32.eqz + set_local $1 + get_local $1 + i32.const 0 + i32.eq if - i32.const 1160 + i32.const 1016 return end get_local $1 call $assembly/module/index/TypeSection#toString ) - (func $~lib/string/String.fromUTF8 (; 44 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/imports/Imports#constructor (; 51 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 8 + call $~lib/memory/memory.allocate + set_local $0 + end + get_local $0 + get_local $1 + call $assembly/module/index/Section#constructor + set_local $0 + get_local $0 + i32.const 0 + i32.store offset=4 + get_local $0 + ) + (func $~lib/array/Array#constructor (; 52 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $1 + i32.const 268435454 + i32.gt_u + if + i32.const 0 + i32.const 8 + i32.const 45 + i32.const 39 + call $~lib/env/abort + unreachable + end + get_local $1 + i32.const 2 + i32.shl + set_local $2 + get_local $2 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 + block (result i32) + get_local $0 + i32.eqz + if + i32.const 8 + call $~lib/memory/memory.allocate + set_local $0 + end + get_local $0 + i32.const 0 + i32.store + get_local $0 + i32.const 0 + i32.store offset=4 + get_local $0 + end + get_local $3 + i32.store + get_local $0 + get_local $1 + i32.store offset=4 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $4 + i32.const 0 + set_local $5 + get_local $4 + get_local $5 + get_local $2 + call $~lib/internal/memory/memset + get_local $0 + ) + (func $~lib/string/String.fromUTF8 (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) + (local $7 i32) get_local $1 i32.const 1 i32.lt_u if - i32.const 656 + i32.const 912 return end - get_local $1 - i32.const 1 - i32.shl - call $~lib/allocator/arena/__memory_allocate - set_local $6 - loop $continue|0 - get_local $2 + i32.const 0 + set_local $2 + block $~lib/memory/memory.allocate|inlined.2 (result i32) get_local $1 - i32.lt_u - if + i32.const 1 + i32.shl + set_local $3 + get_local $3 + call $~lib/allocator/arena/__memory_allocate + br $~lib/memory/memory.allocate|inlined.2 + end + set_local $4 + i32.const 0 + set_local $5 + block $break|0 + loop $continue|0 get_local $2 - tee_local $3 - i32.const 1 - i32.add - set_local $2 - get_local $0 - get_local $3 - i32.add - i32.load8_u - tee_local $3 - i32.const 128 + get_local $1 i32.lt_u - if (result i32) - get_local $4 - get_local $6 - i32.add - get_local $3 - i32.store16 - get_local $4 - i32.const 2 - i32.add - else - get_local $3 - i32.const 191 - i32.gt_u - tee_local $5 - if - get_local $3 - i32.const 224 - i32.lt_u - set_local $5 - end - get_local $5 - if - get_local $2 - i32.const 1 - i32.add - get_local $1 - i32.gt_u - if - i32.const 0 - i32.const 624 - i32.const 510 - i32.const 8 - call $~lib/env/abort - unreachable - end - get_local $2 - tee_local $5 - i32.const 1 - i32.add - set_local $2 - get_local $4 - get_local $6 - i32.add + if + block get_local $0 - get_local $5 - i32.add - i32.load8_u - i32.const 63 - i32.and - get_local $3 - i32.const 31 - i32.and - i32.const 6 - i32.shl - i32.or - i32.store16 - else - get_local $3 - i32.const 239 - i32.gt_u - tee_local $5 - if - get_local $3 - i32.const 365 - i32.lt_u - set_local $5 - end - get_local $5 - if - get_local $2 - i32.const 3 - i32.add - get_local $1 - i32.gt_u - if - i32.const 0 - i32.const 624 - i32.const 514 - i32.const 8 - call $~lib/env/abort - unreachable - end - get_local $4 - get_local $6 - i32.add - get_local $3 - i32.const 7 - i32.and - i32.const 18 - i32.shl - get_local $2 - tee_local $5 - get_local $0 - i32.add - i32.load8_u - i32.const 63 - i32.and - i32.const 12 - i32.shl - i32.or + block (result i32) get_local $2 - i32.const 1 - i32.add - tee_local $2 - get_local $0 - i32.add - i32.load8_u - i32.const 63 - i32.and - i32.const 6 - i32.shl - i32.or tee_local $3 - get_local $2 i32.const 1 i32.add - tee_local $2 - get_local $0 - i32.add - i32.load8_u - i32.const 63 - i32.and - i32.or - i32.const 65536 - i32.sub - tee_local $3 - i32.const 10 - i32.shr_u - i32.const 55296 - i32.add - i32.store16 - get_local $6 + set_local $2 + get_local $3 + end + i32.add + i32.load8_u + set_local $3 + get_local $3 + i32.const 128 + i32.lt_u + if get_local $4 - i32.const 2 - i32.add - tee_local $4 + get_local $5 i32.add get_local $3 - i32.const 1023 - i32.and - i32.const 56320 - i32.add i32.store16 - else - get_local $2 + get_local $5 i32.const 2 i32.add - get_local $1 + set_local $5 + else + get_local $3 + i32.const 191 i32.gt_u + tee_local $6 + if (result i32) + get_local $3 + i32.const 224 + i32.lt_u + else + get_local $6 + end if - i32.const 0 - i32.const 624 - i32.const 526 - i32.const 8 - call $~lib/env/abort - unreachable + get_local $2 + i32.const 1 + i32.add + get_local $1 + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 880 + i32.const 527 + i32.const 8 + call $~lib/env/abort + unreachable + end + get_local $4 + get_local $5 + i32.add + get_local $3 + i32.const 31 + i32.and + i32.const 6 + i32.shl + get_local $0 + block (result i32) + get_local $2 + tee_local $6 + i32.const 1 + i32.add + set_local $2 + get_local $6 + end + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.or + i32.store16 + get_local $5 + i32.const 2 + i32.add + set_local $5 + else + get_local $3 + i32.const 239 + i32.gt_u + tee_local $6 + if (result i32) + get_local $3 + i32.const 365 + i32.lt_u + else + get_local $6 + end + if + get_local $2 + i32.const 3 + i32.add + get_local $1 + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 880 + i32.const 531 + i32.const 8 + call $~lib/env/abort + unreachable + end + get_local $3 + i32.const 7 + i32.and + i32.const 18 + i32.shl + get_local $0 + block (result i32) + get_local $2 + tee_local $6 + i32.const 1 + i32.add + set_local $2 + get_local $6 + end + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.const 12 + i32.shl + i32.or + get_local $0 + block (result i32) + get_local $2 + tee_local $6 + i32.const 1 + i32.add + set_local $2 + get_local $6 + end + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.const 6 + i32.shl + i32.or + get_local $0 + block (result i32) + get_local $2 + tee_local $6 + i32.const 1 + i32.add + set_local $2 + get_local $6 + end + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.or + i32.const 65536 + i32.sub + set_local $3 + get_local $4 + get_local $5 + i32.add + i32.const 55296 + get_local $3 + i32.const 10 + i32.shr_u + i32.add + i32.store16 + get_local $5 + i32.const 2 + i32.add + set_local $5 + get_local $4 + get_local $5 + i32.add + i32.const 56320 + get_local $3 + i32.const 1023 + i32.and + i32.add + i32.store16 + get_local $5 + i32.const 2 + i32.add + set_local $5 + else + get_local $2 + i32.const 2 + i32.add + get_local $1 + i32.le_u + i32.eqz + if + i32.const 0 + i32.const 880 + i32.const 543 + i32.const 8 + call $~lib/env/abort + unreachable + end + get_local $4 + get_local $5 + i32.add + get_local $3 + i32.const 15 + i32.and + i32.const 12 + i32.shl + get_local $0 + block (result i32) + get_local $2 + tee_local $6 + i32.const 1 + i32.add + set_local $2 + get_local $6 + end + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.const 6 + i32.shl + i32.or + get_local $0 + block (result i32) + get_local $2 + tee_local $6 + i32.const 1 + i32.add + set_local $2 + get_local $6 + end + i32.add + i32.load8_u + i32.const 63 + i32.and + i32.or + i32.store16 + get_local $5 + i32.const 2 + i32.add + set_local $5 + end end - get_local $4 - get_local $6 - i32.add - get_local $3 - i32.const 15 - i32.and - i32.const 12 - i32.shl - get_local $2 - tee_local $5 - get_local $0 - i32.add - i32.load8_u - i32.const 63 - i32.and - i32.const 6 - i32.shl - i32.or - tee_local $3 - get_local $2 - i32.const 1 - i32.add - tee_local $2 - get_local $0 - i32.add - i32.load8_u - i32.const 63 - i32.and - i32.or - i32.store16 end - get_local $2 - i32.const 1 - i32.add - set_local $2 end - get_local $4 - i32.const 2 - i32.add + br $continue|0 end - set_local $4 - br $continue|0 end end - get_local $1 get_local $2 - i32.ne + get_local $1 + i32.eq + i32.eqz if i32.const 0 - i32.const 624 - i32.const 535 + i32.const 880 + i32.const 552 i32.const 4 call $~lib/env/abort unreachable end - get_local $4 + get_local $5 i32.const 1 i32.shr_u call $~lib/internal/string/allocateUnsafe - tee_local $0 - i32.const 4 + set_local $7 + get_local $7 + get_global $~lib/internal/string/HEADER_SIZE i32.add - get_local $6 + set_local $3 + get_local $3 get_local $4 + get_local $5 call $~lib/internal/memory/memmove + block $~lib/memory/memory.free|inlined.1 + block + get_local $4 + call $~lib/allocator/arena/__memory_free + br $~lib/memory/memory.free|inlined.1 + unreachable + end + unreachable + end + get_local $7 + ) + (func $assembly/buffer/index/Buffer#readUint (; 54 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) get_local $0 + i32.load offset=8 + set_local $1 + get_local $1 + i32.load8_u + set_local $2 + get_local $0 + get_local $1 + i32.const 1 + i32.add + i32.store offset=8 + get_local $2 + ) + (func $assembly/module/imports/Import#constructor (; 55 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 12 + call $~lib/memory/memory.allocate + set_local $0 + end + get_local $0 + get_local $1 + i32.store + get_local $0 + get_local $2 + i32.store offset=4 + get_local $0 + get_local $3 + i32.store offset=8 + get_local $0 + ) + (func $~lib/array/Array#__set (; 56 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $0 + i32.load + set_local $3 + get_local $3 + i32.load + i32.const 2 + i32.shr_u + set_local $4 + get_local $1 + get_local $4 + i32.ge_u + if + get_local $1 + i32.const 268435454 + i32.ge_u + if + i32.const 0 + i32.const 8 + i32.const 107 + i32.const 41 + call $~lib/env/abort + unreachable + end + get_local $3 + get_local $1 + i32.const 1 + i32.add + i32.const 2 + i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + set_local $3 + get_local $0 + get_local $3 + i32.store + get_local $0 + get_local $1 + i32.const 1 + i32.add + i32.store offset=4 + end + i32.const 0 + set_local $5 + get_local $3 + get_local $1 + i32.const 2 + i32.shl + i32.add + get_local $5 + i32.add + get_local $2 + i32.store offset=8 ) - (func $assembly/module/imports/Imports#parse (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/imports/Imports#parse (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3302,484 +4286,639 @@ (local $6 i32) (local $7 i32) (local $8 i32) + (local $9 i32) + (local $10 i32) + (local $11 i32) + (local $12 i32) + (local $13 i32) + (local $14 i32) get_local $1 get_local $0 i32.load i32.load offset=12 i32.store offset=8 - get_local $0 get_local $1 + i32.const 32 call $assembly/buffer/index/Buffer#readVaruint - tee_local $5 - call $~lib/array/Array#constructor + set_local $2 + get_local $0 + i32.const 0 + get_local $2 + call $~lib/array/Array#constructor i32.store offset=4 - loop $repeat|0 - get_local $4 - get_local $5 - i32.lt_u - if - get_local $1 - call $assembly/buffer/index/Buffer#readVaruint - set_local $2 - get_local $1 - i32.load offset=8 - get_local $2 - call $~lib/string/String.fromUTF8 - set_local $6 - get_local $1 - get_local $1 - i32.load offset=8 - get_local $2 - i32.add - i32.store offset=8 - get_local $1 - call $assembly/buffer/index/Buffer#readVaruint - set_local $2 - get_local $1 - i32.load offset=8 - get_local $2 - call $~lib/string/String.fromUTF8 - set_local $7 - get_local $1 - get_local $1 - i32.load offset=8 - get_local $2 - i32.add - i32.store offset=8 - get_local $1 - i32.load offset=8 - tee_local $3 - i32.load8_u - set_local $2 - get_local $1 - get_local $3 - i32.const 1 - i32.add - i32.store offset=8 - get_local $0 - i32.load offset=4 - set_local $8 - i32.const 12 - call $~lib/allocator/arena/__memory_allocate - tee_local $3 - get_local $6 - i32.store - get_local $3 - get_local $7 - i32.store offset=4 + block $break|0 + i32.const 0 + set_local $3 + loop $repeat|0 get_local $3 get_local $2 - i32.store offset=8 - get_local $8 - get_local $4 - get_local $3 - call $~lib/array/Array#__set - block $break|1 - block $case4|1 - block $case3|1 - block $case2|1 - block $case1|1 - get_global $src/common/ExternalKind.Function - get_local $2 - i32.ne - if - get_global $src/common/ExternalKind.Table - get_local $2 - i32.eq - br_if $case1|1 - get_global $src/common/ExternalKind.Memory - get_local $2 - i32.eq - br_if $case2|1 - get_global $src/common/ExternalKind.Global - get_local $2 - i32.eq - br_if $case3|1 - br $case4|1 + i32.lt_u + i32.eqz + br_if $break|0 + block + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $4 + get_local $1 + i32.load offset=8 + set_local $5 + get_local $5 + get_local $4 + call $~lib/string/String.fromUTF8 + set_local $6 + get_local $1 + get_local $1 + i32.load offset=8 + get_local $4 + i32.add + i32.store offset=8 + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $7 + get_local $1 + i32.load offset=8 + set_local $8 + get_local $8 + get_local $7 + call $~lib/string/String.fromUTF8 + set_local $9 + get_local $1 + get_local $1 + i32.load offset=8 + get_local $7 + i32.add + i32.store offset=8 + get_local $1 + call $assembly/buffer/index/Buffer#readUint + set_local $10 + get_local $0 + i32.load offset=4 + get_local $3 + i32.const 0 + get_local $6 + get_local $9 + get_local $10 + call $assembly/module/imports/Import#constructor + call $~lib/array/Array#__set + block $break|1 + block $case4|1 + block $case3|1 + block $case2|1 + block $case1|1 + block $case0|1 + get_local $10 + set_local $11 + get_local $11 + get_global $src/common/ExternalKind.Function + i32.eq + br_if $case0|1 + get_local $11 + get_global $src/common/ExternalKind.Table + i32.eq + br_if $case1|1 + get_local $11 + get_global $src/common/ExternalKind.Memory + i32.eq + br_if $case2|1 + get_local $11 + get_global $src/common/ExternalKind.Global + i32.eq + br_if $case3|1 + br $case4|1 + end + block + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $11 + br $break|1 + unreachable + end + unreachable + end + block + get_local $1 + i32.const 7 + call $assembly/buffer/index/Buffer#readVarint + i32.const 127 + i32.and + set_local $11 + get_local $1 + i32.const 1 + call $assembly/buffer/index/Buffer#readVaruint + set_local $12 + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $13 + get_local $12 + i32.const 1 + i32.and + if (result i32) + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + else + get_global $src/common/MAX_ELEMS + end + set_local $14 + br $break|1 + unreachable end + unreachable + end + block get_local $1 + i32.const 1 call $assembly/buffer/index/Buffer#readVaruint - drop + set_local $14 + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + set_local $13 + get_local $14 + i32.const 1 + i32.and + if (result i32) + get_local $1 + i32.const 32 + call $assembly/buffer/index/Buffer#readVaruint + else + get_global $src/common/MAX_PAGES + end + set_local $12 br $break|1 + unreachable end + unreachable + end + block get_local $1 i32.const 7 call $assembly/buffer/index/Buffer#readVarint - drop - get_local $1 - call $assembly/buffer/index/Buffer#readVaruint - set_local $2 - get_local $1 - call $assembly/buffer/index/Buffer#readVaruint - drop - get_local $2 - i32.const 1 + i32.const 127 i32.and - if (result i32) - get_local $1 - call $assembly/buffer/index/Buffer#readVaruint - else - i32.const -1 - end - set_local $2 - br $break|1 - end - get_local $1 - call $assembly/buffer/index/Buffer#readVaruint - set_local $2 - get_local $1 - call $assembly/buffer/index/Buffer#readVaruint - drop - get_local $2 - i32.const 1 - i32.and - if (result i32) + set_local $12 get_local $1 + i32.const 1 call $assembly/buffer/index/Buffer#readVaruint - else - i32.const 65535 + set_local $13 + br $break|1 + unreachable end - set_local $2 - br $break|1 + unreachable end - get_local $1 - i32.const 7 - call $assembly/buffer/index/Buffer#readVarint - drop - get_local $1 - call $assembly/buffer/index/Buffer#readVaruint - drop - br $break|1 + unreachable end - unreachable end - get_local $4 + get_local $3 i32.const 1 i32.add - set_local $4 + set_local $3 br $repeat|0 + unreachable end + unreachable end get_local $0 ) - (func $assembly/module/index/Module#getImports (; 46 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#getImports (; 58 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) + (local $2 i32) get_local $0 get_global $src/common/SectionId.Import call $assembly/module/index/Module#getID - tee_local $1 + set_local $1 + get_local $1 i32.eqz if i32.const 0 return end + i32.const 0 get_local $1 - call $assembly/module/index/Section#constructor + call $assembly/module/imports/Imports#constructor + set_local $2 + get_local $2 get_local $0 i32.load offset=4 call $assembly/module/imports/Imports#parse ) - (func $assembly/index/getImports (; 47 ;) (type $iv) (param $0 i32) + (func $assembly/index/getImports (; 59 ;) (type $iv) (param $0 i32) + (local $1 i32) get_local $0 call $assembly/module/index/Module#getImports - drop + set_local $1 + get_local $1 + i32.const 0 + i32.ne + if + nop + end ) - (func $~lib/internal/typedarray/TypedArray#constructor (; 48 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) + (func $assembly/module/index/SectionHeader#get:end (; 60 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load offset=12 get_local $0 + i32.load offset=8 + i32.add + ) + (func $~lib/internal/typedarray/TypedArray#constructor (; 61 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + get_local $1 i32.const 1073741816 i32.gt_u if i32.const 0 - i32.const 1216 + i32.const 1080 i32.const 23 i32.const 34 call $~lib/env/abort unreachable end - get_local $0 - call $~lib/internal/arraybuffer/allocateUnsafe - tee_local $2 - i32.const 8 - i32.add - i32.const 0 - get_local $0 - call $~lib/internal/memory/memset - i32.const 12 - call $~lib/allocator/arena/__memory_allocate - tee_local $1 - i32.const 0 - i32.store get_local $1 i32.const 0 - i32.store offset=4 - get_local $1 + i32.shl + set_local $2 + get_local $2 + call $~lib/internal/arraybuffer/allocateUnsafe + set_local $3 + get_local $3 + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + set_local $4 i32.const 0 - i32.store offset=8 - get_local $1 + set_local $5 + get_local $4 + get_local $5 get_local $2 + call $~lib/internal/memory/memset + block (result i32) + get_local $0 + i32.eqz + if + i32.const 12 + call $~lib/memory/memory.allocate + set_local $0 + end + get_local $0 + i32.const 0 + i32.store + get_local $0 + i32.const 0 + i32.store offset=4 + get_local $0 + i32.const 0 + i32.store offset=8 + get_local $0 + end + get_local $3 i32.store - get_local $1 + get_local $0 i32.const 0 i32.store offset=4 - get_local $1 get_local $0 + get_local $2 i32.store offset=8 + get_local $0 + ) + (func $~lib/typedarray/Uint8Array#constructor (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + i32.eqz + if + i32.const 12 + call $~lib/memory/memory.allocate + set_local $0 + end + get_local $0 get_local $1 + call $~lib/internal/typedarray/TypedArray#constructor + set_local $0 + get_local $0 ) - (func $~lib/internal/typedarray/TypedArray#__get (; 49 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#__get (; 63 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) get_local $1 get_local $0 i32.load offset=8 + i32.const 0 + i32.shr_u i32.ge_u if i32.const 0 - i32.const 1216 + i32.const 1080 i32.const 39 i32.const 63 call $~lib/env/abort unreachable end - get_local $0 - i32.load offset=4 - get_local $1 - get_local $0 - i32.load - i32.add - i32.add - i32.load8_u offset=8 + block $~lib/internal/arraybuffer/LOAD|inlined.0 (result i32) + get_local $0 + i32.load + set_local $2 + get_local $0 + i32.load offset=4 + set_local $3 + get_local $2 + get_local $1 + i32.const 0 + i32.shl + i32.add + get_local $3 + i32.add + i32.load8_u offset=8 + end ) - (func $~lib/internal/typedarray/TypedArray#__set (; 50 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/typedarray/TypedArray#__set (; 64 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local $4 i32) get_local $1 get_local $0 i32.load offset=8 + i32.const 0 + i32.shr_u i32.ge_u if i32.const 0 - i32.const 1216 + i32.const 1080 i32.const 50 i32.const 63 call $~lib/env/abort unreachable end get_local $0 + i32.load + set_local $3 + get_local $0 i32.load offset=4 + set_local $4 + get_local $3 get_local $1 - get_local $0 - i32.load + i32.const 0 + i32.shl i32.add + get_local $4 i32.add get_local $2 i32.store8 offset=8 ) - (func $assembly/index/removeSection (; 51 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/removeSection (; 65 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) get_local $0 get_local $1 call $assembly/module/index/Module#getID - tee_local $2 + set_local $2 + get_local $2 + i32.const 0 + i32.ne if - get_local $0 - i32.load offset=4 - i32.load offset=4 - get_local $2 - i32.load offset=12 get_local $2 - i32.load offset=8 - i32.add + call $assembly/module/index/SectionHeader#get:end get_local $2 i32.load i32.sub - tee_local $4 - i32.sub - call $~lib/internal/typedarray/TypedArray#constructor set_local $3 i32.const 0 - set_local $1 - loop $repeat|0 - get_local $1 - get_local $2 - i32.load offset=16 - i32.lt_u - if - get_local $3 - get_local $1 + get_local $0 + i32.load offset=4 + i32.load offset=4 + get_local $3 + i32.sub + call $~lib/typedarray/Uint8Array#constructor + set_local $4 + block $break|0 + i32.const 0 + set_local $5 + loop $repeat|0 + get_local $5 + get_local $2 + i32.load offset=16 + i32.lt_u + i32.eqz + br_if $break|0 + get_local $4 + get_local $5 get_local $0 i32.load offset=4 i32.load - get_local $1 + get_local $5 call $~lib/internal/typedarray/TypedArray#__get i32.const 255 i32.and call $~lib/internal/typedarray/TypedArray#__set - get_local $1 + get_local $5 i32.const 1 i32.add - set_local $1 + set_local $5 br $repeat|0 + unreachable end + unreachable end - get_local $2 - i32.load offset=16 - get_local $4 - i32.add - set_local $1 - loop $repeat|1 - get_local $1 - get_local $0 - i32.load offset=4 - i32.load offset=4 - i32.lt_u - if - get_local $3 - get_local $1 + block $break|1 + get_local $2 + i32.load offset=16 + get_local $3 + i32.add + set_local $5 + loop $repeat|1 + get_local $5 + get_local $0 + i32.load offset=4 + i32.load offset=4 + i32.lt_u + i32.eqz + br_if $break|1 get_local $4 + get_local $5 + get_local $3 i32.sub get_local $0 i32.load offset=4 i32.load - get_local $1 + get_local $5 call $~lib/internal/typedarray/TypedArray#__get i32.const 255 i32.and call $~lib/internal/typedarray/TypedArray#__set - get_local $1 + get_local $5 i32.const 1 i32.add - set_local $1 + set_local $5 br $repeat|1 + unreachable end + unreachable end + get_local $4 + return else get_local $0 i32.load offset=4 i32.load - set_local $3 + return end - get_local $3 + unreachable + unreachable ) - (func $assembly/index/removeStartFunction (; 52 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/removeStartFunction (; 66 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Start call $assembly/index/removeSection ) - (func $assembly/host/index/log (; 53 ;) (type $iv) (param $0 i32) + (func $assembly/module/index/SectionHeader#get:len (; 67 ;) (type $ii) (param $0 i32) (result i32) get_local $0 - i32.const 0 - i32.ne - call $assembly/host/index/_logi + call $assembly/module/index/SectionHeader#get:end + get_local $0 + i32.load + i32.sub ) - (func $~lib/typedarray/Uint8Array#fill (; 54 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - (local $1 i32) - (local $2 i32) - (local $3 i32) + (func $~lib/typedarray/Uint8Array#fill (; 68 ;) (type $iiiii) (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) get_local $0 i32.load - set_local $3 - get_local $0 - i32.load offset=4 set_local $4 - i32.const 0 get_local $0 - i32.load offset=8 - tee_local $1 + i32.load offset=4 + set_local $5 + block $~lib/internal/typedarray/TypedArray#get:length|inlined.0 (result i32) + get_local $0 + i32.load offset=8 + i32.const 0 + i32.shr_u + end + set_local $6 + get_local $2 i32.const 0 - get_local $1 i32.lt_s - select - tee_local $2 - i32.const 8 - get_local $1 - i32.const 8 - get_local $1 + if (result i32) + get_local $6 + get_local $2 + i32.add + tee_local $7 + i32.const 0 + tee_local $8 + get_local $7 + get_local $8 + i32.gt_s + select + else + get_local $2 + tee_local $7 + get_local $6 + tee_local $8 + get_local $7 + get_local $8 + i32.lt_s + select + end + set_local $2 + get_local $3 + i32.const 0 i32.lt_s - select - tee_local $1 + if (result i32) + get_local $6 + get_local $3 + i32.add + tee_local $7 + i32.const 0 + tee_local $8 + get_local $7 + get_local $8 + i32.gt_s + select + else + get_local $3 + tee_local $7 + get_local $6 + tee_local $8 + get_local $7 + get_local $8 + i32.lt_s + select + end + set_local $3 + get_local $2 + get_local $3 i32.lt_s if + get_local $4 get_local $2 - get_local $3 i32.add - get_local $4 + get_local $5 i32.add - i32.const 8 + get_global $~lib/internal/arraybuffer/HEADER_SIZE i32.add - i32.const 0 - get_local $1 + set_local $7 + get_local $3 get_local $2 i32.sub + set_local $8 + get_local $7 + get_local $1 + get_local $8 call $~lib/internal/memory/memset end get_local $0 ) - (func $assembly/host/index/log (; 55 ;) (type $iv) (param $0 i32) - get_local $0 - i32.const 255 - i32.and - call $assembly/host/index/_logi - ) - (func $assembly/index/exportDataSection (; 56 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/exportDataSection (; 69 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) + (local $5 i32) + (local $6 i32) get_local $0 get_global $src/common/SectionId.Data call $assembly/module/index/Module#getID - set_local $3 + set_local $1 get_local $0 get_global $src/common/SectionId.Memory call $assembly/module/index/Module#getID - set_local $1 - get_local $3 - i32.load offset=16 - call $assembly/host/index/_logi - get_local $1 - i32.load offset=16 - call $assembly/host/index/_logi - get_local $3 - i32.eqz - tee_local $2 - call $assembly/host/index/log + set_local $2 get_local $1 - i32.eqz - call $assembly/host/index/log - get_local $2 + i32.const 0 + i32.eq if i32.const 0 return end - get_local $1 - i32.eqz + get_local $2 + i32.const 0 + i32.eq if i32.const 0 return end - get_local $3 - i32.load offset=12 - get_local $3 - i32.load offset=8 - i32.add - get_local $3 - i32.load - i32.sub - get_local $1 - i32.load offset=12 - get_local $1 - i32.load offset=8 - i32.add get_local $1 - i32.load - i32.sub + call $assembly/module/index/SectionHeader#get:len + get_local $2 + call $assembly/module/index/SectionHeader#get:len i32.add + set_local $3 + i32.const 0 + get_local $3 i32.const 8 i32.add - call $~lib/internal/typedarray/TypedArray#constructor - tee_local $4 + call $~lib/typedarray/Uint8Array#constructor + set_local $4 + get_local $4 + i32.const 0 + i32.const 0 + i32.const 8 call $~lib/typedarray/Uint8Array#fill drop get_local $4 @@ -3802,32 +4941,25 @@ i32.const 4 i32.const 1 call $~lib/internal/typedarray/TypedArray#__set - get_local $4 - i32.const 12 - call $assembly/host/index/_log - get_local $1 - i32.load offset=16 - set_local $2 - loop $repeat|0 + block $break|0 get_local $2 - get_local $1 i32.load offset=16 - get_local $1 - i32.load offset=12 - get_local $1 - i32.load offset=8 - i32.add - get_local $1 - i32.load - i32.sub - i32.add - i32.const 1 - i32.sub - i32.lt_u - if + set_local $5 + loop $repeat|0 + get_local $5 + get_local $2 + i32.load offset=16 + get_local $2 + call $assembly/module/index/SectionHeader#get:len + i32.add + i32.const 1 + i32.sub + i32.lt_u + i32.eqz + br_if $break|0 get_local $4 + get_local $5 get_local $2 - get_local $1 i32.load offset=16 i32.sub i32.const 8 @@ -3835,181 +4967,185 @@ get_local $0 i32.load offset=4 i32.load - get_local $2 + get_local $5 call $~lib/internal/typedarray/TypedArray#__get i32.const 255 i32.and call $~lib/internal/typedarray/TypedArray#__set - get_local $2 + get_local $5 i32.const 1 i32.add - set_local $2 + set_local $5 br $repeat|0 + unreachable end + unreachable end - get_local $4 - i32.const 8 - call $~lib/internal/typedarray/TypedArray#__get - call $assembly/host/index/log - get_local $0 - i32.load offset=4 - i32.load - get_local $1 - i32.load offset=16 - call $~lib/internal/typedarray/TypedArray#__get - call $assembly/host/index/log - get_local $3 - i32.load offset=16 - set_local $2 - loop $repeat|1 - get_local $2 - get_local $3 + block $break|1 + get_local $1 i32.load offset=16 - get_local $3 - i32.load offset=12 - get_local $3 - i32.load offset=8 - i32.add - get_local $3 - i32.load - i32.sub - i32.add - i32.const 1 - i32.sub - i32.lt_u - if - get_local $4 - get_local $2 - get_local $3 - i32.load offset=16 - i32.sub - i32.const 8 - i32.add + set_local $5 + loop $repeat|1 + get_local $5 get_local $1 - i32.load offset=12 + i32.load offset=16 get_local $1 - i32.load offset=8 + call $assembly/module/index/SectionHeader#get:len i32.add - get_local $1 - i32.load + i32.const 1 i32.sub - i32.add - get_local $0 - i32.load offset=4 - i32.load - get_local $2 - call $~lib/internal/typedarray/TypedArray#__get - i32.const 255 - i32.and - call $~lib/internal/typedarray/TypedArray#__set - get_local $2 + i32.lt_u + i32.eqz + br_if $break|1 + block + get_local $5 + get_local $1 + i32.load offset=16 + i32.sub + i32.const 8 + i32.add + get_local $2 + call $assembly/module/index/SectionHeader#get:len + i32.add + set_local $6 + get_local $4 + get_local $6 + get_local $0 + i32.load offset=4 + i32.load + get_local $5 + call $~lib/internal/typedarray/TypedArray#__get + i32.const 255 + i32.and + call $~lib/internal/typedarray/TypedArray#__set + end + get_local $5 i32.const 1 i32.add - set_local $2 + set_local $5 br $repeat|1 + unreachable end + unreachable end get_local $4 ) - (func $assembly/index/toString (; 57 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/toString (; 70 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/TypeSection#toString ) - (func $assembly/module/index/Module#get:start (; 58 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:start (; 71 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Start call $assembly/module/index/Module#getID ) - (func $assembly/module/index/Module#get:hasStart (; 59 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:hasStart (; 72 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/Module#get:start i32.const 0 i32.ne ) - (func $assembly/index/hasStart (; 60 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/hasStart (; 73 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/Module#get:hasStart ) - (func $assembly/buffer/index/Buffer#constructor (; 61 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - (local $1 i32) - i32.const 20 - call $~lib/allocator/arena/__memory_allocate - tee_local $1 - i32.const 0 - i32.store - get_local $1 - i32.const 0 - i32.store offset=4 - get_local $1 - i32.const 0 - i32.store offset=8 - get_local $1 - i32.const 0 - i32.store offset=12 - get_local $1 - i32.const 0 - i32.store offset=16 - get_local $1 + (func $~lib/arraybuffer/ArrayBuffer#get:data (; 74 ;) (type $ii) (param $0 i32) (result i32) get_local $0 - i32.store + get_global $~lib/internal/arraybuffer/HEADER_SIZE + i32.add + ) + (func $assembly/buffer/index/Buffer#constructor (; 75 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + block (result i32) + get_local $0 + i32.eqz + if + i32.const 20 + call $~lib/memory/memory.allocate + set_local $0 + end + get_local $0 + i32.const 0 + i32.store + get_local $0 + i32.const 0 + i32.store offset=4 + get_local $0 + i32.const 0 + i32.store offset=8 + get_local $0 + i32.const 0 + i32.store offset=12 + get_local $0 + i32.const 0 + i32.store offset=16 + get_local $0 + end get_local $1 + i32.store get_local $0 + get_local $1 i32.load - i32.const 8 - i32.add + call $~lib/arraybuffer/ArrayBuffer#get:data i32.store offset=8 - get_local $1 get_local $0 + get_local $1 i32.load offset=8 i32.store offset=4 - get_local $1 - get_local $1 + get_local $0 + get_local $0 i32.load offset=8 i32.store offset=12 - get_local $1 - get_local $1 + get_local $0 + get_local $0 i32.load offset=8 - get_local $1 + get_local $0 i32.load offset=4 i32.add i32.store offset=16 - get_local $1 - ) - (func $assembly/module/index/Module#constructor (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 - i32.eqz - if - i32.const 8 - call $~lib/allocator/arena/__memory_allocate - tee_local $0 + ) + (func $assembly/module/index/Module#constructor (; 76 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + block (result i32) + get_local $0 + i32.eqz + if + i32.const 8 + call $~lib/memory/memory.allocate + set_local $0 + end + get_local $0 i32.const 0 i32.store get_local $0 i32.const 0 i32.store offset=4 + get_local $0 end - get_local $0 get_local $1 i32.store offset=4 get_local $0 - i32.const 1288 + i32.const 1152 i32.store get_local $0 ) - (func $assembly/index/Parser#constructor (; 63 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.eqz - if - i32.const 8 - call $~lib/allocator/arena/__memory_allocate - tee_local $0 + (func $assembly/index/Parser#constructor (; 77 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + block (result i32) + get_local $0 + i32.eqz + if + i32.const 8 + call $~lib/memory/memory.allocate + set_local $0 + end + get_local $0 i32.const 0 i32.store get_local $0 i32.const 0 i32.store offset=4 + get_local $0 end - get_local $0 + i32.const 0 get_local $1 call $assembly/buffer/index/Buffer#constructor i32.store @@ -4021,242 +5157,385 @@ i32.store offset=4 get_local $0 ) - (func $assembly/index/Parser#parseString (; 64 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#parseString (; 78 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 get_local $0 i32.load + i32.const 32 call $assembly/buffer/index/Buffer#readVaruint call $~lib/string/String.fromUTF8 ) - (func $assembly/index/Parser#readVaruint (; 65 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/Parser#readVaruint (; 79 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.load + get_local $1 call $assembly/buffer/index/Buffer#readVaruint ) - (func $assembly/index/Parser#get:off (; 66 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#get:off (; 80 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 ) - (func $assembly/index/Parser#set:off (; 67 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/index/Parser#set:off (; 81 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + i32.load + get_local $1 + i32.store offset=8 + ) + (func $assembly/buffer/index/Buffer#readUint (; 82 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) get_local $0 + i32.load offset=8 + set_local $1 + get_local $1 i32.load + set_local $2 + get_local $0 get_local $1 + i32.const 4 + i32.add i32.store offset=8 + get_local $2 ) - (func $assembly/module/index/sectionName (; 68 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/sectionName (; 83 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) - block $case12|0 - block $case11|0 - block $case10|0 - block $case9|0 - block $case8|0 - block $case7|0 - block $case6|0 - block $case5|0 - block $case4|0 - block $case3|0 - block $case2|0 - block $case1|0 - get_local $0 - if - get_local $0 - tee_local $1 - i32.const 1 - i32.eq - br_if $case1|0 - block $tablify|0 + block $break|0 + block $case12|0 + block $case11|0 + block $case10|0 + block $case9|0 + block $case8|0 + block $case7|0 + block $case6|0 + block $case5|0 + block $case4|0 + block $case3|0 + block $case2|0 + block $case1|0 + block $case0|0 + get_local $0 + set_local $1 + get_local $1 + i32.const 0 + i32.eq + br_if $case0|0 + get_local $1 + i32.const 1 + i32.eq + br_if $case1|0 get_local $1 i32.const 2 - i32.sub - br_table $case2|0 $case3|0 $case4|0 $case5|0 $case6|0 $case7|0 $case8|0 $case9|0 $case10|0 $case11|0 $tablify|0 + i32.eq + br_if $case2|0 + get_local $1 + i32.const 3 + i32.eq + br_if $case3|0 + get_local $1 + i32.const 4 + i32.eq + br_if $case4|0 + get_local $1 + i32.const 5 + i32.eq + br_if $case5|0 + get_local $1 + i32.const 6 + i32.eq + br_if $case6|0 + get_local $1 + i32.const 7 + i32.eq + br_if $case7|0 + get_local $1 + i32.const 8 + i32.eq + br_if $case8|0 + get_local $1 + i32.const 9 + i32.eq + br_if $case9|0 + get_local $1 + i32.const 10 + i32.eq + br_if $case10|0 + get_local $1 + i32.const 11 + i32.eq + br_if $case11|0 + br $case12|0 end - br $case12|0 + i32.const 1168 + return end - i32.const 1304 + i32.const 1184 return end - i32.const 1320 + i32.const 1200 return end - i32.const 1336 + i32.const 1216 return end - i32.const 1352 + i32.const 1240 return end - i32.const 1376 + i32.const 1256 return end - i32.const 1392 + i32.const 1272 return end - i32.const 1408 + i32.const 1288 return end - i32.const 1424 + i32.const 1304 return end - i32.const 1440 + i32.const 1320 return end - i32.const 1456 + i32.const 1344 return end - i32.const 1480 + i32.const 1360 return end - i32.const 1496 - return + unreachable + unreachable end unreachable + i32.const 912 ) - (func $assembly/module/index/SectionHeader#constructor (; 69 ;) (type $FUNCSIG$ii) (param $0 i32) (result i32) - (local $1 i32) + (func $assembly/host/index/log (; 84 ;) (type $iv) (param $0 i32) + get_local $0 + call $assembly/host/index/_logi + ) + (func $assembly/module/index/SectionHeader#constructor (; 85 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) - i32.const 24 - call $~lib/allocator/arena/__memory_allocate - tee_local $2 - i32.const 0 - i32.store - get_local $2 - i32.const 0 - i32.store offset=4 - get_local $2 - i32.const 0 - i32.store offset=8 - get_local $2 - i32.const 0 - i32.store offset=12 - get_local $2 - i32.const 0 - i32.store offset=16 - get_local $2 - i32.const 656 - i32.store offset=20 - get_local $2 - tee_local $1 - get_local $0 + (local $4 i32) + block (result i32) + get_local $0 + i32.eqz + if + i32.const 24 + call $~lib/memory/memory.allocate + set_local $0 + end + get_local $0 + i32.const 0 + i32.store + get_local $0 + i32.const 0 + i32.store offset=4 + get_local $0 + i32.const 0 + i32.store offset=8 + get_local $0 + i32.const 0 + i32.store offset=12 + get_local $0 + i32.const 0 + i32.store offset=16 + get_local $0 + i32.const 912 + i32.store offset=20 + get_local $0 + end + get_local $1 i32.load offset=8 i32.store - get_local $1 - get_local $1 - i32.load get_local $0 + get_local $0 + i32.load + get_local $1 i32.load offset=12 i32.sub i32.store offset=16 - get_local $1 get_local $0 + get_local $1 + i32.const 7 call $assembly/buffer/index/Buffer#readVaruint i32.store offset=4 - get_local $1 get_local $0 + get_local $1 + i32.const 32 call $assembly/buffer/index/Buffer#readVaruint i32.store offset=8 - get_global $src/common/SectionId.Custom - get_local $1 + get_local $0 i32.load offset=4 + get_global $src/common/SectionId.Custom i32.eq if - get_local $0 + get_local $1 i32.load offset=8 set_local $2 - get_local $0 + get_local $1 + i32.const 32 call $assembly/buffer/index/Buffer#readVaruint set_local $3 get_local $1 - i32.const 1296 - get_local $0 i32.load offset=8 + set_local $4 + get_local $0 + i32.const 1160 + get_local $4 get_local $3 call $~lib/string/String.fromUTF8 call $~lib/string/String.__concat - i32.const 1296 + i32.const 1160 call $~lib/string/String.__concat i32.store offset=20 - get_local $0 - get_local $0 + get_local $1 + get_local $1 i32.load offset=8 get_local $3 i32.add i32.store offset=8 - get_local $1 - get_local $1 - i32.load offset=8 get_local $0 + get_local $0 + i32.load offset=8 + get_local $1 i32.load offset=8 get_local $2 i32.sub i32.sub i32.store offset=8 else - get_local $1 + get_local $0 i32.load offset=4 get_global $src/common/SectionId.Data i32.le_u if - get_local $1 - get_local $1 + get_local $0 + get_local $0 i32.load offset=4 call $assembly/module/index/sectionName i32.store offset=20 else - get_local $1 + get_local $0 i32.load - call $assembly/host/index/_logi - i32.const 1512 - get_local $1 + call $assembly/host/index/log + i32.const 1376 + get_local $0 i32.load offset=4 call $~lib/internal/number/itoa call $~lib/string/String.__concat call $assembly/host/index/err end end - get_local $1 get_local $0 + get_local $1 i32.load offset=8 i32.store offset=12 + get_local $0 + ) + (func $~lib/array/Array#push (; 86 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + i32.load offset=4 + set_local $2 + get_local $0 + i32.load + set_local $3 + get_local $3 + i32.load + i32.const 2 + i32.shr_u + set_local $4 + get_local $2 + i32.const 1 + i32.add + set_local $5 + get_local $2 + get_local $4 + i32.ge_u + if + get_local $2 + i32.const 268435454 + i32.ge_u + if + i32.const 0 + i32.const 8 + i32.const 182 + i32.const 42 + call $~lib/env/abort + unreachable + end + get_local $3 + get_local $5 + i32.const 2 + i32.shl + call $~lib/internal/arraybuffer/reallocateUnsafe + set_local $3 + get_local $0 + get_local $3 + i32.store + end + get_local $0 + get_local $5 + i32.store offset=4 + i32.const 0 + set_local $6 + get_local $3 + get_local $2 + i32.const 2 + i32.shl + i32.add + get_local $6 + i32.add get_local $1 + i32.store offset=8 + get_local $5 ) - (func $assembly/module/index/Module#parseSection (; 70 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/module/index/Module#parseSection (; 87 ;) (type $iiv) (param $0 i32) (param $1 i32) + (local $2 i32) get_local $0 i32.load get_local $1 - call $~lib/array/Array#push + call $~lib/array/Array#push drop block $break|0 - get_global $src/common/SectionId.Type - get_local $1 - i32.load offset=4 - i32.eq - br_if $break|0 + block $case1|0 + block $case0|0 + get_local $1 + i32.load offset=4 + set_local $2 + get_local $2 + get_global $src/common/SectionId.Type + i32.eq + br_if $case0|0 + br $case1|0 + end + br $break|0 + end end ) - (func $assembly/index/Parser#parse (; 71 ;) (type $iv) (param $0 i32) + (func $assembly/index/Parser#parse (; 88 ;) (type $iv) (param $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) get_local $0 - i32.load - i32.load offset=8 - drop + call $assembly/index/Parser#get:off + set_local $1 get_local $0 i32.load - tee_local $1 - i32.load offset=8 - tee_local $2 - i32.load - set_local $3 - get_local $1 + call $assembly/buffer/index/Buffer#readUint + set_local $2 get_local $2 - i32.const 4 - i32.add - i32.store offset=8 - get_local $3 i32.const 1836278016 i32.ne if @@ -4264,97 +5543,231 @@ end get_local $0 i32.load - tee_local $1 - i32.load offset=8 - tee_local $2 - i32.load + call $assembly/buffer/index/Buffer#readUint set_local $3 - get_local $1 - get_local $2 - i32.const 4 - i32.add - i32.store offset=8 get_local $3 i32.const 1 i32.ne if unreachable end - loop $continue|0 - get_local $0 - i32.load - i32.load offset=8 - get_local $0 - i32.load - i32.load offset=16 - i32.lt_u - if + i32.const 0 + set_local $4 + i32.const 0 + set_local $5 + i32.const 0 + set_local $6 + i32.const 0 + set_local $7 + block $break|0 + loop $continue|0 get_local $0 i32.load - call $assembly/module/index/SectionHeader#constructor - set_local $1 - get_local $0 - i32.load offset=4 - get_local $1 - call $assembly/module/index/Module#parseSection + i32.load offset=8 get_local $0 i32.load + i32.load offset=16 + i32.lt_u + if + block + i32.const 0 + get_local $0 + i32.load + call $assembly/module/index/SectionHeader#constructor + set_local $8 + get_local $0 + i32.load offset=4 + get_local $8 + call $assembly/module/index/Module#parseSection + get_local $0 + get_local $8 + call $assembly/module/index/SectionHeader#get:end + call $assembly/index/Parser#set:off + end + br $continue|0 + end + end + end + ) + (func $assembly/module/index/Module#get:Type (; 89 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + get_global $src/common/SectionId.Type + call $assembly/module/index/Module#getID + ) + (func $assembly/module/index/Module#hasSection (; 90 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + get_local $0 + get_local $1 + call $assembly/module/index/Module#getID + i32.const 0 + i32.ne + ) + (func $assembly/module/index/SectionHeader#toString (; 91 ;) (type $ii) (param $0 i32) (result i32) + (local $1 i32) + (local $2 i32) + (local $3 i32) + (local $4 i32) + (local $5 i32) + (local $6 i32) + get_local $0 + i32.load + call $~lib/internal/number/itoa + set_local $1 + get_local $0 + i32.load offset=4 + call $~lib/internal/number/itoa + set_local $2 + get_local $0 + i32.load offset=8 + call $~lib/internal/number/itoa + set_local $3 + get_local $0 + i32.load offset=12 + call $~lib/internal/number/itoa + set_local $4 + get_local $0 + i32.load offset=20 + set_local $5 + get_local $0 + call $assembly/module/index/SectionHeader#get:end + call $~lib/internal/number/itoa + set_local $6 + i32.const 1408 + get_local $5 + call $~lib/string/String.__concat + i32.const 1072 + call $~lib/string/String.__concat + i32.const 1424 + call $~lib/string/String.__concat + get_local $1 + call $~lib/string/String.__concat + i32.const 1072 + call $~lib/string/String.__concat + i32.const 1440 + call $~lib/string/String.__concat + get_local $2 + call $~lib/string/String.__concat + i32.const 1072 + call $~lib/string/String.__concat + i32.const 1456 + call $~lib/string/String.__concat + get_local $4 + call $~lib/string/String.__concat + i32.const 1072 + call $~lib/string/String.__concat + i32.const 1488 + call $~lib/string/String.__concat + get_local $3 + call $~lib/string/String.__concat + i32.const 1072 + call $~lib/string/String.__concat + i32.const 1528 + call $~lib/string/String.__concat + get_local $6 + call $~lib/string/String.__concat + ) + (func $assembly/module/index/Module#print (; 92 ;) (type $iv) (param $0 i32) + (local $1 i32) + (local $2 i32) + block $break|0 + i32.const 0 + set_local $1 + loop $repeat|0 get_local $1 - i32.load offset=12 + block $~lib/array/Array#get:length|inlined.2 (result i32) + get_local $0 + i32.load + set_local $2 + get_local $2 + i32.load offset=4 + end + i32.lt_s + i32.eqz + br_if $break|0 + block + get_local $0 + i32.load + get_local $1 + call $~lib/array/Array#__get + call $assembly/module/index/SectionHeader#toString + call $assembly/host/index/log + i32.const 912 + call $assembly/host/index/log + end get_local $1 - i32.load offset=8 + i32.const 1 i32.add - i32.store offset=8 - br $continue|0 + set_local $1 + br $repeat|0 + unreachable end + unreachable end ) - (func $assembly/index/newParser (; 72 ;) (type $ii) (param $0 i32) (result i32) - i32.const 0 + (func $start (; 93 ;) (type $v) + get_global $HEAP_BASE + get_global $~lib/internal/allocator/AL_MASK + i32.add + get_global $~lib/internal/allocator/AL_MASK + i32.const -1 + i32.xor + i32.and + set_global $~lib/allocator/arena/startOffset + get_global $~lib/allocator/arena/startOffset + set_global $~lib/allocator/arena/offset + nop + ) + (func $null (; 94 ;) (type $v) + ) + (func $Parser#get:buf (; 95 ;) (type $ii) (param $0 i32) (result i32) get_local $0 - call $assembly/index/Parser#constructor + i32.load ) - (func $assembly/index/parse (; 73 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#set:buf (; 96 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 - call $assembly/index/Parser#parse + get_local $1 + i32.store + ) + (func $Parser#get:module (; 97 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) - (func $assembly/index/hasSection (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $Parser#set:module (; 98 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 - call $assembly/module/index/Module#getID - i32.const 0 - i32.ne + i32.store offset=4 ) - (func $assembly/module/index/Module#get:Type (; 75 ;) (type $ii) (param $0 i32) (result i32) + (func $TypeSection#get:header (; 99 ;) (type $ii) (param $0 i32) (result i32) get_local $0 - get_global $src/common/SectionId.Type - call $assembly/module/index/Module#getID + i32.load ) - (func $start (; 76 ;) (type $v) - i32.const 1544 - set_global $~lib/allocator/arena/startOffset - get_global $~lib/allocator/arena/startOffset - set_global $~lib/allocator/arena/offset + (func $TypeSection#set:header (; 100 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + get_local $1 + i32.store ) - (func $null (; 77 ;) (type $v) - nop + (func $TypeSection#get:funcs (; 101 ;) (type $ii) (param $0 i32) (result i32) + get_local $0 + i32.load offset=4 + ) + (func $TypeSection#set:funcs (; 102 ;) (type $iiv) (param $0 i32) (param $1 i32) + get_local $0 + get_local $1 + i32.store offset=4 ) - (func $Parser#get:buf (; 78 ;) (type $ii) (param $0 i32) (result i32) + (func $Module#get:headers (; 103 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) - (func $Parser#set:buf (; 79 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Module#set:headers (; 104 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store ) - (func $Parser#get:module (; 80 ;) (type $ii) (param $0 i32) (result i32) + (func $Module#get:buf (; 105 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) - (func $Parser#set:module (; 81 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Module#set:buf (; 106 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store offset=4 diff --git a/lib/parse/package-lock.json b/lib/parse/package-lock.json index 17f6b73845..23958bb490 100644 --- a/lib/parse/package-lock.json +++ b/lib/parse/package-lock.json @@ -4,12 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", - "dev": true - }, "@types/webassembly-js-api": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@types/webassembly-js-api/-/webassembly-js-api-0.0.1.tgz", @@ -90,7 +84,7 @@ "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", "dev": true, "requires": { - "@xtuc/ieee754": "1.2.0" + "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { @@ -212,7 +206,7 @@ "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", "dev": true, "requires": { - "acorn": "5.7.3" + "acorn": "^5.0.0" } }, "ajv": { @@ -221,10 +215,10 @@ "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ajv-errors": { @@ -251,7 +245,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "anymatch": { @@ -260,8 +254,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "aproba": { @@ -306,19 +300,3175 @@ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assemblyscript": { - "version": "github:AssemblyScript/assemblyscript#d5f72e32d7e99cec3f8c37e6bb2916864706f4f0", + "version": "file:../..", "dev": true, "requires": { - "@protobufjs/utf8": "1.1.0", - "binaryen": "55.0.0-nightly.20181130", - "glob": "7.1.3", - "long": "4.0.0" + "@protobufjs/utf8": "^1.1.0", + "binaryen": "63.0.0-nightly.20190107", + "glob": "^7.1.3", + "long": "^4.0.0" + }, + "dependencies": { + "@protobufjs/utf8": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "@types/events": { + "version": "1.2.0", + "bundled": true + }, + "@types/fs-extra": { + "version": "5.0.4", + "bundled": true, + "requires": { + "@types/node": "*" + } + }, + "@types/glob": { + "version": "7.1.1", + "bundled": true, + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/handlebars": { + "version": "4.0.39", + "bundled": true + }, + "@types/highlight.js": { + "version": "9.12.3", + "bundled": true + }, + "@types/lodash": { + "version": "4.14.118", + "bundled": true + }, + "@types/marked": { + "version": "0.4.2", + "bundled": true + }, + "@types/minimatch": { + "version": "3.0.3", + "bundled": true + }, + "@types/node": { + "version": "10.12.18", + "bundled": true + }, + "@types/shelljs": { + "version": "0.8.0", + "bundled": true, + "requires": { + "@types/glob": "*", + "@types/node": "*" + } + }, + "@webassemblyjs/ast": { + "version": "1.7.11", + "bundled": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.7.11", + "bundled": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.7.11", + "bundled": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.7.11", + "bundled": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.7.11", + "bundled": true, + "requires": { + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.7.11", + "bundled": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.7.11", + "bundled": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.7.11", + "bundled": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.7.11", + "bundled": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.7.11", + "bundled": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.7.11", + "bundled": true, + "requires": { + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/utf8": { + "version": "1.7.11", + "bundled": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.7.11", + "bundled": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/helper-wasm-section": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-opt": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/wast-printer": "1.7.11" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.7.11", + "bundled": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.7.11", + "bundled": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-buffer": "1.7.11", + "@webassemblyjs/wasm-gen": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.7.11", + "bundled": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-wasm-bytecode": "1.7.11", + "@webassemblyjs/ieee754": "1.7.11", + "@webassemblyjs/leb128": "1.7.11", + "@webassemblyjs/utf8": "1.7.11" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.7.11", + "bundled": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/floating-point-hex-parser": "1.7.11", + "@webassemblyjs/helper-api-error": "1.7.11", + "@webassemblyjs/helper-code-frame": "1.7.11", + "@webassemblyjs/helper-fsm": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.7.11", + "bundled": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/wast-parser": "1.7.11", + "@xtuc/long": "4.2.1" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "bundled": true + }, + "@xtuc/long": { + "version": "4.2.1", + "bundled": true + }, + "acorn": { + "version": "5.7.3", + "bundled": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "bundled": true, + "requires": { + "acorn": "^5.0.0" + } + }, + "ajv": { + "version": "6.6.2", + "bundled": true, + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "bundled": true + }, + "ajv-keywords": { + "version": "3.2.0", + "bundled": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "ansi-styles": { + "version": "3.2.1", + "bundled": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "2.0.0", + "bundled": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "bundled": true + }, + "argparse": { + "version": "1.0.10", + "bundled": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "bundled": true + }, + "arr-flatten": { + "version": "1.1.0", + "bundled": true + }, + "arr-union": { + "version": "3.1.0", + "bundled": true + }, + "array-unique": { + "version": "0.3.2", + "bundled": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true + }, + "asn1.js": { + "version": "4.10.1", + "bundled": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "bundled": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "bundled": true + }, + "util": { + "version": "0.10.3", + "bundled": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "bundled": true + }, + "async": { + "version": "2.6.1", + "bundled": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "async-each": { + "version": "1.0.1", + "bundled": true + }, + "atob": { + "version": "2.1.2", + "bundled": true + }, + "babel-code-frame": { + "version": "6.26.0", + "bundled": true, + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "bundled": true + }, + "chalk": { + "version": "1.1.3", + "bundled": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "bundled": true + } + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "base": { + "version": "0.11.2", + "bundled": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "bundled": true + }, + "big.js": { + "version": "5.2.2", + "bundled": true + }, + "binary-extensions": { + "version": "1.12.0", + "bundled": true + }, + "binaryen": { + "version": "63.0.0-nightly.20190107", + "bundled": true, + "dev": true + }, + "bluebird": { + "version": "3.5.3", + "bundled": true + }, + "bn.js": { + "version": "4.11.8", + "bundled": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "bundled": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "bundled": true + }, + "browser-process-hrtime": { + "version": "1.0.0", + "bundled": true + }, + "browserify-aes": { + "version": "1.2.0", + "bundled": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "bundled": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "bundled": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "bundled": true, + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "bundled": true, + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "bundled": true, + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "4.9.1", + "bundled": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "bundled": true + }, + "buffer-xor": { + "version": "1.0.3", + "bundled": true + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "bundled": true + }, + "cacache": { + "version": "11.3.2", + "bundled": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "bundled": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "camelcase": { + "version": "5.0.0", + "bundled": true + }, + "chalk": { + "version": "2.4.2", + "bundled": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chokidar": { + "version": "2.0.4", + "bundled": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "bundled": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "bundled": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cliui": { + "version": "4.1.0", + "bundled": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "collection-visit": { + "version": "1.0.0", + "bundled": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "1.9.3", + "bundled": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "bundled": true + }, + "commander": { + "version": "2.19.0", + "bundled": true + }, + "commondir": { + "version": "1.0.1", + "bundled": true + }, + "component-emitter": { + "version": "1.2.1", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "concat-stream": { + "version": "1.6.2", + "bundled": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "bundled": true, + "requires": { + "date-now": "^0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "bundled": true + }, + "copy-concurrently": { + "version": "1.0.5", + "bundled": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "create-ecdh": { + "version": "4.0.3", + "bundled": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "bundled": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "bundled": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "bundled": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "bundled": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "cyclist": { + "version": "0.2.2", + "bundled": true + }, + "date-now": { + "version": "0.1.4", + "bundled": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "bundled": true + }, + "decode-uri-component": { + "version": "0.2.0", + "bundled": true + }, + "define-property": { + "version": "2.0.2", + "bundled": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "des.js": { + "version": "1.0.0", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detect-file": { + "version": "1.0.0", + "bundled": true + }, + "diff": { + "version": "4.0.1", + "bundled": true + }, + "diffie-hellman": { + "version": "5.0.3", + "bundled": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "bundled": true + }, + "duplexify": { + "version": "3.6.1", + "bundled": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "elliptic": { + "version": "6.4.1", + "bundled": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "emojis-list": { + "version": "2.1.0", + "bundled": true + }, + "end-of-stream": { + "version": "1.4.1", + "bundled": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "bundled": true, + "requires": { + "prr": "~1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true + }, + "eslint-scope": { + "version": "4.0.0", + "bundled": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "bundled": true + }, + "esrecurse": { + "version": "4.2.1", + "bundled": true, + "requires": { + "estraverse": "^4.1.0" + } + }, + "estraverse": { + "version": "4.2.0", + "bundled": true + }, + "esutils": { + "version": "2.0.2", + "bundled": true + }, + "events": { + "version": "1.1.1", + "bundled": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "bundled": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "bundled": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "bundled": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "bundled": true, + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "bundled": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "bundled": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "bundled": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "bundled": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "bundled": true + }, + "figgy-pudding": { + "version": "3.5.1", + "bundled": true + }, + "fill-range": { + "version": "4.0.0", + "bundled": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.0.0", + "bundled": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "bundled": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "findup-sync": { + "version": "2.0.0", + "bundled": true, + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "bundled": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "flush-write-stream": { + "version": "1.0.3", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "for-in": { + "version": "1.0.2", + "bundled": true + }, + "fragment-cache": { + "version": "0.2.1", + "bundled": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "get-caller-file": { + "version": "1.0.3", + "bundled": true + }, + "get-stream": { + "version": "4.1.0", + "bundled": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "bundled": true + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "bundled": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "bundled": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "global-modules": { + "version": "1.0.0", + "bundled": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-modules-path": { + "version": "2.3.1", + "bundled": true + }, + "global-prefix": { + "version": "1.0.2", + "bundled": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "graceful-fs": { + "version": "4.1.15", + "bundled": true + }, + "handlebars": { + "version": "4.0.12", + "bundled": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true + } + } + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "bundled": true + }, + "has-value": { + "version": "1.0.0", + "bundled": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "bundled": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "bundled": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "bundled": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "highlight.js": { + "version": "9.13.1", + "bundled": true + }, + "hmac-drbg": { + "version": "1.0.1", + "bundled": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.1", + "bundled": true, + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "bundled": true + }, + "ieee754": { + "version": "1.1.12", + "bundled": true + }, + "iferr": { + "version": "0.1.5", + "bundled": true + }, + "import-local": { + "version": "2.0.0", + "bundled": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "indexof": { + "version": "0.0.1", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.5", + "bundled": true + }, + "interpret": { + "version": "1.1.0", + "bundled": true + }, + "invert-kv": { + "version": "2.0.0", + "bundled": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "bundled": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "bundled": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "bundled": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "bundled": true + }, + "is-extglob": { + "version": "2.1.1", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + }, + "is-glob": { + "version": "4.0.0", + "bundled": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "bundled": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "bundled": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "is-windows": { + "version": "1.0.2", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true + }, + "isobject": { + "version": "3.0.1", + "bundled": true + }, + "js-tokens": { + "version": "3.0.2", + "bundled": true + }, + "js-yaml": { + "version": "3.12.1", + "bundled": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "bundled": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "bundled": true + }, + "json5": { + "version": "1.0.1", + "bundled": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "kind-of": { + "version": "6.0.2", + "bundled": true + }, + "lcid": { + "version": "2.0.0", + "bundled": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "lightercollective": { + "version": "0.1.0", + "bundled": true + }, + "loader-runner": { + "version": "2.3.1", + "bundled": true + }, + "loader-utils": { + "version": "1.2.3", + "bundled": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "bundled": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.11", + "bundled": true + }, + "lodash.debounce": { + "version": "4.0.8", + "bundled": true + }, + "long": { + "version": "4.0.0", + "bundled": true, + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "bundled": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "1.3.0", + "bundled": true, + "requires": { + "pify": "^3.0.0" + } + }, + "make-error": { + "version": "1.3.5", + "bundled": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "bundled": true, + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "bundled": true + }, + "map-visit": { + "version": "1.0.0", + "bundled": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "marked": { + "version": "0.4.0", + "bundled": true + }, + "md5.js": { + "version": "1.3.5", + "bundled": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mem": { + "version": "4.0.0", + "bundled": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "bundled": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "3.1.10", + "bundled": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "bundled": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "bundled": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "bundled": true + }, + "mississippi": { + "version": "3.0.0", + "bundled": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "bundled": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "bundled": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "bundled": true + } + } + }, + "move-concurrently": { + "version": "1.0.1", + "bundled": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true + }, + "nanomatch": { + "version": "1.2.13", + "bundled": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "neo-async": { + "version": "2.6.0", + "bundled": true + }, + "nice-try": { + "version": "1.0.5", + "bundled": true + }, + "node-libs-browser": { + "version": "2.1.0", + "bundled": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "bundled": true + } + } + }, + "normalize-path": { + "version": "2.1.1", + "bundled": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-copy": { + "version": "0.1.0", + "bundled": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "bundled": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "bundled": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "bundled": true + } + } + }, + "os-browserify": { + "version": "0.3.0", + "bundled": true + }, + "os-locale": { + "version": "3.1.0", + "bundled": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "bundled": true + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "p-is-promise": { + "version": "1.1.0", + "bundled": true + }, + "p-limit": { + "version": "2.1.0", + "bundled": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "bundled": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "bundled": true + }, + "pako": { + "version": "1.0.7", + "bundled": true + }, + "parallel-transform": { + "version": "1.1.0", + "bundled": true, + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.1", + "bundled": true, + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" + } + }, + "parse-passwd": { + "version": "1.0.0", + "bundled": true + }, + "pascalcase": { + "version": "0.1.1", + "bundled": true + }, + "path-browserify": { + "version": "0.0.0", + "bundled": true + }, + "path-dirname": { + "version": "1.0.2", + "bundled": true + }, + "path-exists": { + "version": "3.0.0", + "bundled": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true + }, + "path-parse": { + "version": "1.0.6", + "bundled": true + }, + "pbkdf2": { + "version": "3.0.17", + "bundled": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pify": { + "version": "3.0.0", + "bundled": true + }, + "pkg-dir": { + "version": "3.0.0", + "bundled": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "bundled": true + }, + "process": { + "version": "0.11.10", + "bundled": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true + }, + "progress": { + "version": "2.0.1", + "bundled": true + }, + "promise-inflight": { + "version": "1.0.1", + "bundled": true + }, + "prr": { + "version": "1.0.1", + "bundled": true + }, + "public-encrypt": { + "version": "4.0.3", + "bundled": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "bundled": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "bundled": true + }, + "querystring": { + "version": "0.2.0", + "bundled": true + }, + "querystring-es3": { + "version": "0.2.1", + "bundled": true + }, + "randombytes": { + "version": "2.0.6", + "bundled": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "bundled": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "bundled": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rechoir": { + "version": "0.6.2", + "bundled": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "regex-not": { + "version": "1.0.2", + "bundled": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "bundled": true + }, + "repeat-element": { + "version": "1.1.3", + "bundled": true + }, + "repeat-string": { + "version": "1.6.1", + "bundled": true + }, + "require-directory": { + "version": "2.1.1", + "bundled": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true + }, + "resolve": { + "version": "1.8.1", + "bundled": true, + "requires": { + "path-parse": "^1.0.5" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "bundled": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "bundled": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "bundled": true + }, + "resolve-url": { + "version": "0.2.1", + "bundled": true + }, + "ret": { + "version": "0.1.15", + "bundled": true + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "bundled": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "bundled": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true + }, + "safe-regex": { + "version": "1.1.0", + "bundled": true, + "requires": { + "ret": "~0.1.10" + } + }, + "schema-utils": { + "version": "0.4.7", + "bundled": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.6.0", + "bundled": true + }, + "serialize-javascript": { + "version": "1.6.1", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "set-value": { + "version": "2.0.0", + "bundled": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "bundled": true + }, + "sha.js": { + "version": "2.4.11", + "bundled": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true + }, + "shelljs": { + "version": "0.8.2", + "bundled": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "snapdragon": { + "version": "0.8.2", + "bundled": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "bundled": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "bundled": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-list-map": { + "version": "2.0.1", + "bundled": true + }, + "source-map": { + "version": "0.5.7", + "bundled": true + }, + "source-map-resolve": { + "version": "0.5.2", + "bundled": true, + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.9", + "bundled": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "bundled": true + }, + "split-string": { + "version": "3.1.0", + "bundled": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "bundled": true + }, + "ssri": { + "version": "6.0.1", + "bundled": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "bundled": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-browserify": { + "version": "2.0.1", + "bundled": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "bundled": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "bundled": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "bundled": true + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + }, + "supports-color": { + "version": "5.5.0", + "bundled": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "tapable": { + "version": "1.1.1", + "bundled": true + }, + "terser": { + "version": "3.14.1", + "bundled": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.6" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "bundled": true + }, + "source-map": { + "version": "0.6.1", + "bundled": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.2.1", + "bundled": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.8.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "bundled": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "bundled": true + } + } + }, + "through2": { + "version": "2.0.5", + "bundled": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.10", + "bundled": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "bundled": true + }, + "to-object-path": { + "version": "0.3.0", + "bundled": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "bundled": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "ts-loader": { + "version": "5.3.3", + "bundled": true, + "requires": { + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" + } + }, + "ts-node": { + "version": "6.2.0", + "bundled": true, + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "bundled": true + } + } + }, + "tslib": { + "version": "1.9.3", + "bundled": true + }, + "tslint": { + "version": "5.12.0", + "bundled": true, + "requires": { + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" + }, + "dependencies": { + "diff": { + "version": "3.5.0", + "bundled": true + } + } + }, + "tsutils": { + "version": "2.29.0", + "bundled": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "bundled": true + }, + "typedarray": { + "version": "0.0.6", + "bundled": true + }, + "typedoc": { + "version": "0.13.0", + "bundled": true, + "requires": { + "@types/fs-extra": "^5.0.3", + "@types/handlebars": "^4.0.38", + "@types/highlight.js": "^9.12.3", + "@types/lodash": "^4.14.110", + "@types/marked": "^0.4.0", + "@types/minimatch": "3.0.3", + "@types/shelljs": "^0.8.0", + "fs-extra": "^7.0.0", + "handlebars": "^4.0.6", + "highlight.js": "^9.0.0", + "lodash": "^4.17.10", + "marked": "^0.4.0", + "minimatch": "^3.0.0", + "progress": "^2.0.0", + "shelljs": "^0.8.2", + "typedoc-default-themes": "^0.5.0", + "typescript": "3.1.x" + }, + "dependencies": { + "typescript": { + "version": "3.1.6", + "bundled": true + } + } + }, + "typedoc-default-themes": { + "version": "0.5.0", + "bundled": true + }, + "typedoc-plugin-external-module-name": { + "version": "1.1.3", + "bundled": true + }, + "typescript": { + "version": "3.2.2", + "bundled": true + }, + "uglify-js": { + "version": "3.4.9", + "bundled": true, + "optional": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "bundled": true, + "optional": true + }, + "source-map": { + "version": "0.6.1", + "bundled": true, + "optional": true + } + } + }, + "union-value": { + "version": "1.0.0", + "bundled": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "bundled": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.1", + "bundled": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.1", + "bundled": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "bundled": true + }, + "unset-value": { + "version": "1.0.0", + "bundled": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "bundled": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "bundled": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "bundled": true + } + } + }, + "upath": { + "version": "1.1.0", + "bundled": true + }, + "uri-js": { + "version": "4.2.2", + "bundled": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "bundled": true + }, + "url": { + "version": "0.11.0", + "bundled": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "bundled": true + } + } + }, + "use": { + "version": "3.1.1", + "bundled": true + }, + "util": { + "version": "0.10.4", + "bundled": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "v8-compile-cache": { + "version": "2.0.2", + "bundled": true + }, + "vm-browserify": { + "version": "0.0.4", + "bundled": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.6.0", + "bundled": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webpack": { + "version": "4.28.1", + "bundled": true, + "requires": { + "@webassemblyjs/ast": "1.7.11", + "@webassemblyjs/helper-module-context": "1.7.11", + "@webassemblyjs/wasm-edit": "1.7.11", + "@webassemblyjs/wasm-parser": "1.7.11", + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + }, + "webpack-cli": { + "version": "3.2.1", + "bundled": true, + "requires": { + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.0", + "findup-sync": "^2.0.0", + "global-modules": "^1.0.0", + "global-modules-path": "^2.3.0", + "import-local": "^2.0.0", + "interpret": "^1.1.0", + "lightercollective": "^0.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.5.0", + "v8-compile-cache": "^2.0.2", + "yargs": "^12.0.4" + } + }, + "webpack-sources": { + "version": "1.3.0", + "bundled": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true + } + } + }, + "which": { + "version": "1.3.1", + "bundled": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true + }, + "worker-farm": { + "version": "1.6.0", + "bundled": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "xtend": { + "version": "4.0.1", + "bundled": true + }, + "y18n": { + "version": "4.0.0", + "bundled": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true + }, + "yargs": { + "version": "12.0.5", + "bundled": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "bundled": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yn": { + "version": "2.0.0", + "bundled": true + } } }, "assert": { @@ -377,13 +3527,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -392,7 +3542,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -401,7 +3551,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -410,7 +3560,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -419,9 +3569,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -444,12 +3594,6 @@ "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", "dev": true }, - "binaryen": { - "version": "55.0.0-nightly.20181130", - "resolved": "https://registry.npmjs.org/binaryen/-/binaryen-55.0.0-nightly.20181130.tgz", - "integrity": "sha512-RfMiI0vavw7Sy7KX8h1xOs4D3zp9nehmtE87DSfY6nXyd2EAdMwJ97tWdepuhOc6JWZsntOfzUA2fqu/sYTTLg==", - "dev": true - }, "bluebird": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", @@ -468,7 +3612,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -478,16 +3622,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -496,7 +3640,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -509,16 +3653,16 @@ }, "browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { @@ -527,9 +3671,9 @@ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.2", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -538,20 +3682,20 @@ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -560,13 +3704,13 @@ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.1", - "inherits": "2.0.3", - "parse-asn1": "5.1.1" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -575,18 +3719,18 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.7" + "pako": "~1.0.5" } }, "buffer": { "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "resolved": "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.12", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, "buffer-from": { @@ -613,20 +3757,20 @@ "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", "dev": true, "requires": { - "bluebird": "3.5.3", - "chownr": "1.1.1", - "figgy-pudding": "3.5.1", - "glob": "7.1.3", - "graceful-fs": "4.1.15", - "lru-cache": "5.1.1", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "6.0.1", - "unique-filename": "1.1.1", - "y18n": "4.0.0" + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" } }, "cache-base": { @@ -635,15 +3779,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "camelcase": { @@ -658,9 +3802,9 @@ "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "chokidar": { @@ -669,19 +3813,19 @@ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "fsevents": "1.2.4", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" } }, "chownr": { @@ -696,7 +3840,7 @@ "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.9.0" } }, "cipher-base": { @@ -705,8 +3849,8 @@ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "class-utils": { @@ -715,10 +3859,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -727,7 +3871,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -738,9 +3882,9 @@ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" } }, "code-point-at": { @@ -755,8 +3899,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { @@ -804,10 +3948,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "console-browserify": { @@ -816,7 +3960,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -831,12 +3975,12 @@ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" } }, "copy-descriptor": { @@ -857,35 +4001,35 @@ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.1" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.5", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { @@ -894,11 +4038,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.6.0", - "shebang-command": "1.2.0", - "which": "1.3.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-browserify": { @@ -907,17 +4051,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.17", - "public-encrypt": "4.0.3", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "cyclist": { @@ -959,8 +4103,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -969,7 +4113,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -978,7 +4122,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -987,9 +4131,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -1000,8 +4144,8 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "diff": { @@ -1016,9 +4160,9 @@ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "domain-browser": { @@ -1033,10 +4177,10 @@ "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, "elliptic": { @@ -1045,13 +4189,13 @@ "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.7", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emojis-list": { @@ -1066,7 +4210,7 @@ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "enhanced-resolve": { @@ -1075,9 +4219,9 @@ "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", "dev": true, "requires": { - "graceful-fs": "4.1.15", - "memory-fs": "0.4.1", - "tapable": "1.1.1" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" } }, "errno": { @@ -1086,7 +4230,7 @@ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "escape-string-regexp": { @@ -1101,8 +4245,8 @@ "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "esrecurse": { @@ -1111,7 +4255,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -1132,8 +4276,8 @@ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "md5.js": "1.3.5", - "safe-buffer": "5.1.2" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { @@ -1142,13 +4286,13 @@ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "cross-spawn": "6.0.5", - "get-stream": "4.1.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "expand-brackets": { @@ -1157,13 +4301,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -1172,7 +4316,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -1181,7 +4325,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1192,8 +4336,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -1202,7 +4346,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -1213,14 +4357,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -1229,7 +4373,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -1238,7 +4382,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -1247,7 +4391,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1256,7 +4400,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1265,9 +4409,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -1296,10 +4440,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -1308,7 +4452,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1319,9 +4463,9 @@ "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "3.0.0" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" } }, "find-up": { @@ -1330,7 +4474,7 @@ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "3.0.0" + "locate-path": "^3.0.0" } }, "flush-write-stream": { @@ -1339,8 +4483,8 @@ "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" } }, "for-in": { @@ -1355,7 +4499,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "from2": { @@ -1364,8 +4508,8 @@ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, "fs-write-stream-atomic": { @@ -1374,10 +4518,10 @@ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { - "graceful-fs": "4.1.15", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" } }, "fs.realpath": { @@ -1393,8 +4537,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.12.1", - "node-pre-gyp": "0.10.0" + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" }, "dependencies": { "abbrev": { @@ -1406,7 +4550,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -1420,21 +4565,23 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1447,17 +4594,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1498,7 +4648,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "fs.realpath": { @@ -1513,14 +4663,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { @@ -1529,12 +4679,12 @@ "dev": true, "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-unicode": { @@ -1549,7 +4699,7 @@ "dev": true, "optional": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": "^2.1.0" } }, "ignore-walk": { @@ -1558,7 +4708,7 @@ "dev": true, "optional": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "inflight": { @@ -1567,14 +4717,15 @@ "dev": true, "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1586,8 +4737,9 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "isarray": { @@ -1600,22 +4752,25 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "safe-buffer": "^5.1.1", + "yallist": "^3.0.0" } }, "minizlib": { @@ -1624,13 +4779,14 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.2.4" + "minipass": "^2.2.1" } }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -1647,9 +4803,9 @@ "dev": true, "optional": true, "requires": { - "debug": "2.6.9", - "iconv-lite": "0.4.21", - "sax": "1.2.4" + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, "node-pre-gyp": { @@ -1658,16 +4814,16 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.2.0", - "nopt": "4.0.1", - "npm-packlist": "1.1.10", - "npmlog": "4.1.2", - "rc": "1.2.7", - "rimraf": "2.6.2", - "semver": "5.5.0", - "tar": "4.4.1" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, "nopt": { @@ -1676,8 +4832,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npm-bundled": { @@ -1692,8 +4848,8 @@ "dev": true, "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.3" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npmlog": { @@ -1702,16 +4858,17 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -1723,8 +4880,9 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -1745,8 +4903,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -1767,10 +4925,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.5.1", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.5.1", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -1787,13 +4945,13 @@ "dev": true, "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { @@ -1802,13 +4960,14 @@ "dev": true, "optional": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -1844,10 +5003,11 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -1856,15 +5016,16 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -1879,13 +5040,13 @@ "dev": true, "optional": true, "requires": { - "chownr": "1.0.1", - "fs-minipass": "1.2.5", - "minipass": "2.2.4", - "minizlib": "1.1.0", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.1", - "yallist": "3.0.2" + "chownr": "^1.0.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.2.4", + "minizlib": "^1.1.0", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.1", + "yallist": "^3.0.2" } }, "util-deprecate": { @@ -1900,18 +5061,20 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -1927,7 +5090,7 @@ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "pump": "3.0.0" + "pump": "^3.0.0" } }, "get-value": { @@ -1942,12 +5105,12 @@ "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-parent": { @@ -1956,8 +5119,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -1966,7 +5129,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -1995,9 +5158,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -2006,8 +5169,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { @@ -2016,7 +5179,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -2027,8 +5190,8 @@ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { @@ -2037,8 +5200,8 @@ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, "hmac-drbg": { @@ -2047,9 +5210,9 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.7", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "https-browserify": { @@ -2076,8 +5239,8 @@ "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dev": true, "requires": { - "pkg-dir": "3.0.0", - "resolve-cwd": "2.0.0" + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" } }, "imurmurhash": { @@ -2098,8 +5261,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -2122,11 +5285,11 @@ }, "is-accessor-descriptor": { "version": "0.1.6", - "resolved": "http://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -2135,7 +5298,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -2146,7 +5309,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.12.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -2157,11 +5320,11 @@ }, "is-data-descriptor": { "version": "0.1.4", - "resolved": "http://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -2170,7 +5333,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -2181,9 +5344,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -2218,7 +5381,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -2227,7 +5390,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -2236,7 +5399,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -2247,7 +5410,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "is-stream": { @@ -2298,7 +5461,7 @@ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "minimist": "1.2.0" + "minimist": "^1.2.0" } }, "kind-of": { @@ -2313,7 +5476,7 @@ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "2.0.0" + "invert-kv": "^2.0.0" } }, "loader-runner": { @@ -2328,9 +5491,9 @@ "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "dev": true, "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" } }, "locate-path": { @@ -2339,8 +5502,8 @@ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "lodash.debounce": { @@ -2349,19 +5512,13 @@ "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", "dev": true }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "dev": true - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "yallist": "3.0.3" + "yallist": "^3.0.2" } }, "make-dir": { @@ -2370,7 +5527,7 @@ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "make-error": { @@ -2385,7 +5542,7 @@ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { - "p-defer": "1.0.0" + "p-defer": "^1.0.0" } }, "map-cache": { @@ -2400,7 +5557,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "md5.js": { @@ -2409,9 +5566,9 @@ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "mem": { @@ -2420,9 +5577,9 @@ "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", "dev": true, "requires": { - "map-age-cleaner": "0.1.3", - "mimic-fn": "1.2.0", - "p-is-promise": "1.1.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^1.1.0" } }, "memory-fs": { @@ -2431,8 +5588,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "micromatch": { @@ -2441,19 +5598,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "miller-rabin": { @@ -2462,8 +5619,8 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mimic-fn": { @@ -2490,7 +5647,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -2505,16 +5662,16 @@ "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.6.1", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.3", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "3.0.0", - "pumpify": "1.5.1", - "stream-each": "1.2.3", - "through2": "2.0.5" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } }, "mixin-deep": { @@ -2523,8 +5680,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -2533,7 +5690,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -2561,12 +5718,12 @@ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" } }, "ms": { @@ -2588,17 +5745,17 @@ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, "neo-async": { @@ -2619,28 +5776,28 @@ "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "dev": true, "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.1", - "stream-http": "2.8.3", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.10", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.4", + "url": "^0.11.0", + "util": "^0.10.3", "vm-browserify": "0.0.4" }, "dependencies": { @@ -2658,7 +5815,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "npm-run-path": { @@ -2667,7 +5824,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { @@ -2682,9 +5839,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -2693,7 +5850,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "kind-of": { @@ -2702,7 +5859,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -2713,7 +5870,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.pick": { @@ -2722,7 +5879,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "once": { @@ -2731,7 +5888,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-browserify": { @@ -2746,9 +5903,9 @@ "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "1.0.0", - "lcid": "2.0.0", - "mem": "4.0.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "p-defer": { @@ -2775,7 +5932,7 @@ "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { - "p-try": "2.0.0" + "p-try": "^2.0.0" } }, "p-locate": { @@ -2784,7 +5941,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "2.1.0" + "p-limit": "^2.0.0" } }, "p-try": { @@ -2805,9 +5962,9 @@ "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "dev": true, "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, "parse-asn1": { @@ -2816,11 +5973,11 @@ "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "dev": true, "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.17" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, "pascalcase": { @@ -2831,7 +5988,7 @@ }, "path-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, @@ -2865,11 +6022,11 @@ "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "pify": { @@ -2884,7 +6041,7 @@ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "3.0.0" + "find-up": "^3.0.0" } }, "posix-character-classes": { @@ -2923,12 +6080,12 @@ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.1", - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "pump": { @@ -2937,8 +6094,8 @@ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { @@ -2947,9 +6104,9 @@ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "3.6.1", - "inherits": "2.0.3", - "pump": "2.0.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" }, "dependencies": { "pump": { @@ -2958,8 +6115,8 @@ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } @@ -2988,7 +6145,7 @@ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -2997,8 +6154,8 @@ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "readable-stream": { @@ -3007,13 +6164,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -3022,9 +6179,9 @@ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "graceful-fs": "4.1.15", - "micromatch": "3.1.10", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" } }, "regex-not": { @@ -3033,8 +6190,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "remove-trailing-separator": { @@ -3073,7 +6230,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" } }, "resolve-from": { @@ -3100,7 +6257,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.3" + "glob": "^7.0.5" } }, "ripemd160": { @@ -3109,8 +6266,8 @@ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "run-queue": { @@ -3119,7 +6276,7 @@ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "aproba": "1.2.0" + "aproba": "^1.1.1" } }, "safe-buffer": { @@ -3134,7 +6291,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "schema-utils": { @@ -3143,8 +6300,8 @@ "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { - "ajv": "6.6.2", - "ajv-keywords": "3.2.0" + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" } }, "semver": { @@ -3171,10 +6328,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -3183,7 +6340,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -3200,8 +6357,8 @@ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shebang-command": { @@ -3210,7 +6367,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -3231,14 +6388,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "define-property": { @@ -3247,7 +6404,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -3256,7 +6413,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -3267,9 +6424,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -3278,7 +6435,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -3287,7 +6444,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -3296,7 +6453,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -3305,9 +6462,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -3318,7 +6475,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { @@ -3327,7 +6484,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3350,11 +6507,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "2.1.2", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -3363,8 +6520,8 @@ "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "dev": true, "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { "source-map": { @@ -3387,7 +6544,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "ssri": { @@ -3396,7 +6553,7 @@ "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "figgy-pudding": "3.5.1" + "figgy-pudding": "^3.5.1" } }, "static-extend": { @@ -3405,8 +6562,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -3415,19 +6572,19 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } }, "stream-browserify": { "version": "2.0.1", - "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-each": { @@ -3436,8 +6593,8 @@ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, "stream-http": { @@ -3446,11 +6603,11 @@ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "stream-shift": { @@ -3465,17 +6622,17 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "string_decoder": { "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -3484,7 +6641,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "strip-eof": { @@ -3499,7 +6656,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "tapable": { @@ -3514,9 +6671,9 @@ "integrity": "sha512-KQC1QNKbC/K1ZUjLIWsezW7wkTJuB4v9ptQQUNOzAPVHuVf2LrwEcB0I9t2HTEYUwAFVGiiS6wc+P4ClLDc5FQ==", "dev": true, "requires": { - "commander": "2.17.1", - "source-map": "0.6.1", - "source-map-support": "0.5.9" + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.6" }, "dependencies": { "source-map": { @@ -3533,14 +6690,14 @@ "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==", "dev": true, "requires": { - "cacache": "11.3.2", - "find-cache-dir": "2.0.0", - "schema-utils": "1.0.0", - "serialize-javascript": "1.6.1", - "source-map": "0.6.1", - "terser": "3.14.0", - "webpack-sources": "1.3.0", - "worker-farm": "1.6.0" + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.8.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" }, "dependencies": { "schema-utils": { @@ -3549,9 +6706,9 @@ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "ajv": "6.6.2", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.2.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, "source-map": { @@ -3568,8 +6725,8 @@ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, "timers-browserify": { @@ -3578,7 +6735,7 @@ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "to-arraybuffer": { @@ -3593,7 +6750,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3602,7 +6759,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3613,10 +6770,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -3625,8 +6782,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "ts-loader": { @@ -3635,11 +6792,11 @@ "integrity": "sha512-TPeXFkdPjOrVEawY4xUgRnzlHEmKQF1DclJghPGq67jKnroVvs6mEGHWYtbUczgeWTvTaqUjSSaMmp1k5do4vw==", "dev": true, "requires": { - "chalk": "2.4.1", - "enhanced-resolve": "4.1.0", - "loader-utils": "1.2.3", - "micromatch": "3.1.10", - "semver": "5.6.0" + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" } }, "ts-node": { @@ -3648,14 +6805,14 @@ "integrity": "sha512-ZNT+OEGfUNVMGkpIaDJJ44Zq3Yr0bkU/ugN1PHbU+/01Z7UV1fsELRiTx1KuQNvQ1A3pGh3y25iYF6jXgxV21A==", "dev": true, "requires": { - "arrify": "1.0.1", - "buffer-from": "1.1.1", - "diff": "3.5.0", - "make-error": "1.3.5", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map-support": "0.5.9", - "yn": "2.0.0" + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" } }, "tslib": { @@ -3666,7 +6823,7 @@ }, "tty-browserify": { "version": "0.0.0", - "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, @@ -3677,9 +6834,9 @@ "dev": true }, "typescript": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", - "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.1.tgz", + "integrity": "sha512-cTmIDFW7O0IHbn1DPYjkiebHxwtCMU+eTy30ZtJNBPF9j2O1ITu5XH2YnBeVRKWHqF+3JQwWJv0Q0aUgX8W7IA==", "dev": true }, "union-value": { @@ -3688,10 +6845,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -3700,7 +6857,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -3709,10 +6866,10 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } @@ -3723,7 +6880,7 @@ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { - "unique-slug": "2.0.1" + "unique-slug": "^2.0.0" } }, "unique-slug": { @@ -3732,7 +6889,7 @@ "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", "dev": true, "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" } }, "unset-value": { @@ -3741,8 +6898,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -3751,9 +6908,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -3787,7 +6944,7 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" } }, "urix": { @@ -3843,7 +7000,7 @@ }, "vm-browserify": { "version": "0.0.4", - "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", "dev": true, "requires": { @@ -3856,9 +7013,9 @@ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "chokidar": "2.0.4", - "graceful-fs": "4.1.15", - "neo-async": "2.6.0" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "webpack": { @@ -3871,26 +7028,26 @@ "@webassemblyjs/helper-module-context": "1.7.11", "@webassemblyjs/wasm-edit": "1.7.11", "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "5.7.3", - "acorn-dynamic-import": "3.0.0", - "ajv": "6.6.2", - "ajv-keywords": "3.2.0", - "chrome-trace-event": "1.0.0", - "enhanced-resolve": "4.1.0", - "eslint-scope": "4.0.0", - "json-parse-better-errors": "1.0.2", - "loader-runner": "2.3.1", - "loader-utils": "1.2.3", - "memory-fs": "0.4.1", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "neo-async": "2.6.0", - "node-libs-browser": "2.1.0", - "schema-utils": "0.4.7", - "tapable": "1.1.1", - "terser-webpack-plugin": "1.2.1", - "watchpack": "1.6.0", - "webpack-sources": "1.3.0" + "acorn": "^5.6.2", + "acorn-dynamic-import": "^3.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" } }, "webpack-cli": { @@ -3899,16 +7056,16 @@ "integrity": "sha512-Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==", "dev": true, "requires": { - "chalk": "2.4.1", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "global-modules-path": "2.3.1", - "import-local": "2.0.0", - "interpret": "1.2.0", - "loader-utils": "1.2.3", - "supports-color": "5.5.0", - "v8-compile-cache": "2.0.2", - "yargs": "12.0.5" + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.0", + "global-modules-path": "^2.3.0", + "import-local": "^2.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.5.0", + "v8-compile-cache": "^2.0.2", + "yargs": "^12.0.2" } }, "webpack-sources": { @@ -3917,8 +7074,8 @@ "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", "dev": true, "requires": { - "source-list-map": "2.0.1", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -3935,7 +7092,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -3950,7 +7107,7 @@ "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "dev": true, "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "wrap-ansi": { @@ -3959,8 +7116,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { @@ -3975,18 +7132,18 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "string-width": { "version": "1.0.2", - "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-ansi": { @@ -3995,7 +7152,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -4030,18 +7187,18 @@ "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "3.0.0", - "get-caller-file": "1.0.3", - "os-locale": "3.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "11.1.1" + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" } }, "yargs-parser": { @@ -4050,8 +7207,8 @@ "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { - "camelcase": "5.0.0", - "decamelize": "1.2.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, "yn": { diff --git a/lib/parse/package.json b/lib/parse/package.json index b11701cc54..1eae8ce015 100644 --- a/lib/parse/package.json +++ b/lib/parse/package.json @@ -6,9 +6,9 @@ "types": "index.d.ts", "scripts": { "asbuild": "asc assembly/index.ts -O3 -b build/index.wasm -t build/index.wat --importMemory --sourceMap --validate -d build/index.d.ts", - "asbuild:untouched": "asc assembly/index.ts -b build/index.wasm -t build/index.wat --debug --importMemory --sourceMap --validate", + "asbuild:untouched": "asc assembly/index.ts -b build/index.wasm -t build/index.wat --debug --importMemory --sourceMap --validate -d build/index.d.ts", "build": "npm run asbuild && webpack --mode production --display-modules", - "asbuild:test": "asc tests/assembly/index.ts -b build/test.wasm -t build/test.wat --debug --sourceMap --validate", + "asbuild:test": "npm run asbuild:untouched && asc tests/assembly/index.ts -b build/test.wasm -t build/test.wat --debug --sourceMap --validate", "test": "ts-node tests/" }, "files": [ @@ -22,10 +22,10 @@ "dependencies": {}, "devDependencies": { "@types/webassembly-js-api": "0.0.1", - "assemblyscript": "AssemblyScript/assemblyscript", + "assemblyscript": "file:../..", "ts-loader": "^5.2.1", "ts-node": "^6.2.0", - "typescript": "^3.1.2", + "typescript": "^3.3.1", "webpack": "^4.20.2", "webpack-cli": "^3.1.2" } diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index dcc3da9793..41c442f15c 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -1,5 +1,5 @@ import { Type, SectionId, ExternalKind, newParser } from "./common"; -import assert = require("assert"); +import * as assert from "assert"; export { Type, SectionId, ExternalKind }; import * as loader from "../../../dist/assemblyscript-loader"; import ASModule from "../build"; @@ -16,9 +16,10 @@ if (typeof WASM_DATA !== "string") WASM_DATA = require("fs").readFileSync(__dirn export class WasmParser { instance: Instance & loader.ASInstance & loader.ASExport; - mod: number; + mod: ASModule.Module; + parser: ASModule.Parser; - get memory(): loader.ASMemory{ + get memory(): loader.ASMemory { return this.instance.memory; } @@ -71,39 +72,39 @@ export class WasmParser { this.instance = loader.instantiate(compiled, imports); var array = this.memory.newArray(binary); var parser = new this.instance.Parser(array) - parser.parse() - this.mod = parser.module; + this.parser = parser; + parser.parse(); + this.mod = (this.instance.Module).wrap(parser.module); } get Type(): string { - return this.memory.getString(this.instance.getType(this.mod)) + return this.memory.getString(this.mod.getType()); } printModule(): void { - this.instance.printModule(this.mod); + this.mod.print(); } removeStartFunction(): Uint8Array { - var binary = this.memory.getArray(Uint8Array, this.instance.removeStartFunction(this.mod)); + var binary = this.memory.getArray(Uint8Array, this.instance.removeStartFunction(this.parser.module)); return binary; } hasSection(id: SectionId): boolean { - return this.instance.hasSection(this.mod, id) != 0; + return this.mod.hasSection(id); } - removeDataSection(): Uint8Array { - return this.getByteArray(this.instance.removeSection(this.mod, SectionId.Data)); + return this.getByteArray(this.instance.removeSection(this.parser.module, SectionId.Data)); } exportDataSection(): Uint8Array { - return this.memory.getArray(Uint8Array, this.instance.exportDataSection(this.mod)); + return this.memory.getArray(Uint8Array, this.instance.exportDataSection(this.parser.module)); } hasStart(): boolean { - return this.instance.hasStart(this.mod) != 0; + return this.mod.hasStart; } } diff --git a/lib/parse/src/tsconfig.json b/lib/parse/src/tsconfig.json index f591a7986b..0071dc50fd 100644 --- a/lib/parse/src/tsconfig.json +++ b/lib/parse/src/tsconfig.json @@ -1,7 +1,8 @@ { "compilerOptions": { "module": "commonjs", - "target": "es2015" + "lib":["es2017", "esnext", "esnext.bigint", "es2017.typedarrays"], + "target": "es2016" }, "include": [ "./**/*.ts" diff --git a/lib/parse/tests/index.ts b/lib/parse/tests/index.ts index 21c3296bde..cb192e058f 100644 --- a/lib/parse/tests/index.ts +++ b/lib/parse/tests/index.ts @@ -17,7 +17,6 @@ type CompileError = WebAssembly.CompileError; ].forEach((filename: string): void => { const binary: Uint8Array = fs.readFileSync(__dirname + "/" + filename); console.log("Testing '" + filename + "' ..."); - debugger; var parser = new WasmParser(binary); assert(parser.hasStart()); console.log("Test binary has start section"); diff --git a/lib/parse/tests/tsconfig.json b/lib/parse/tests/tsconfig.json new file mode 100644 index 0000000000..cb33944c8f --- /dev/null +++ b/lib/parse/tests/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "module": "commonjs", + "lib":["es2017", "esnext"], + "target": "es6" + }, + "include": [ + "./**/*.ts" + ] +} From 77f04488745ea7fe31d3659aa1dde0afc2aafc4b Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Sun, 10 Feb 2019 14:13:24 -0500 Subject: [PATCH 30/46] Added ASImports class for handling imports --- lib/parse/assembly/host/index.ts | 3 - lib/parse/assembly/module/index.ts | 5 - lib/parse/build/index.d.ts | 1 - lib/parse/build/index.wat | 598 ++++++++++++++--------------- lib/parse/src/asImport.ts | 69 ++++ lib/parse/src/index.ts | 67 ++-- lib/parse/src/tsconfig.json | 3 +- 7 files changed, 408 insertions(+), 338 deletions(-) create mode 100644 lib/parse/src/asImport.ts diff --git a/lib/parse/assembly/host/index.ts b/lib/parse/assembly/host/index.ts index 1fa69c307d..00a12bcd2e 100644 --- a/lib/parse/assembly/host/index.ts +++ b/lib/parse/assembly/host/index.ts @@ -21,9 +21,6 @@ export function log(item: T):void { } } -export function log_str(item: string): void { - log(item); -} export function err(message: string): void{ log("Error: " + message); diff --git a/lib/parse/assembly/module/index.ts b/lib/parse/assembly/module/index.ts index 90f3abd788..eff25d03fd 100644 --- a/lib/parse/assembly/module/index.ts +++ b/lib/parse/assembly/module/index.ts @@ -48,7 +48,6 @@ export class Module { break; default: } - // log_str(header.name); } getID(id: SectionId): SectionHeader | null { @@ -61,10 +60,6 @@ export class Module { return null; } - hasSection(id: SectionId): boolean { - return this.getID(id) != null; - } - getType(): TypeSection | null { let header = this.getID(SectionId.Type); if (header == null){ diff --git a/lib/parse/build/index.d.ts b/lib/parse/build/index.d.ts index 7966198e73..7d50881cea 100644 --- a/lib/parse/build/index.d.ts +++ b/lib/parse/build/index.d.ts @@ -33,7 +33,6 @@ declare module ASModule { function reset(): void; } class TypeSection { - NATIVE_CODE(header: u32); header: u32; funcs: u32; parse(buf: u32): u32; diff --git a/lib/parse/build/index.wat b/lib/parse/build/index.wat index c15f272794..df80fd1d93 100644 --- a/lib/parse/build/index.wat +++ b/lib/parse/build/index.wat @@ -156,7 +156,6 @@ (export "memory.allocate" (func $~lib/memory/memory.allocate)) (export "memory.free" (func $~lib/memory/memory.free)) (export "memory.reset" (func $~lib/memory/memory.reset)) - (export "TypeSection#NATIVE_CODE" (func $assembly/module/index/TypeSection#constructor)) (export "TypeSection#get:header" (func $TypeSection#get:header)) (export "TypeSection#set:header" (func $TypeSection#set:header)) (export "TypeSection#get:funcs" (func $TypeSection#get:funcs)) @@ -2105,36 +2104,25 @@ i32.const 0 ) (func $assembly/module/index/Section#constructor (; 18 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) get_local $0 - i32.eqz - if - i32.const 4 - call $~lib/memory/memory.allocate - set_local $0 - end - get_local $0 - get_local $1 - i32.store - get_local $0 - ) - (func $assembly/module/index/TypeSection#constructor (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.eqz - if - i32.const 8 - call $~lib/memory/memory.allocate - set_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 4 + call $~lib/memory/memory.allocate + set_local $2 + get_local $2 + get_local $1 + i32.store + get_local $2 + end + tee_local $0 end - get_local $0 - get_local $1 - call $assembly/module/index/Section#constructor - set_local $0 - get_local $0 - i32.const 0 - i32.store offset=4 - get_local $0 + tee_local $0 ) - (func $assembly/buffer/index/Buffer#readVaruint (; 20 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVaruint (; 19 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2189,7 +2177,7 @@ i32.store offset=8 get_local $2 ) - (func $~lib/internal/arraybuffer/computeSize (; 21 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/arraybuffer/computeSize (; 20 ;) (type $ii) (param $0 i32) (result i32) i32.const 1 i32.const 32 get_local $0 @@ -2201,7 +2189,7 @@ i32.sub i32.shl ) - (func $~lib/internal/arraybuffer/allocateUnsafe (; 22 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/arraybuffer/allocateUnsafe (; 21 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -2230,7 +2218,7 @@ i32.store get_local $1 ) - (func $~lib/array/Array#constructor (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 22 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2253,22 +2241,25 @@ get_local $2 call $~lib/internal/arraybuffer/allocateUnsafe set_local $3 - block (result i32) + get_local $0 + if (result i32) get_local $0 - i32.eqz - if + else + block (result i32) i32.const 8 call $~lib/memory/memory.allocate - set_local $0 + set_local $4 + get_local $4 + i32.const 0 + i32.store + get_local $4 + i32.const 0 + i32.store offset=4 + get_local $4 end - get_local $0 - i32.const 0 - i32.store - get_local $0 - i32.const 0 - i32.store offset=4 - get_local $0 + tee_local $0 end + tee_local $0 get_local $3 i32.store get_local $0 @@ -2286,7 +2277,7 @@ call $~lib/internal/memory/memset get_local $0 ) - (func $assembly/buffer/index/Buffer#readVarint (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint (; 23 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2357,34 +2348,40 @@ end select ) - (func $assembly/buffer/index/Buffer#readVarint8 (; 25 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/buffer/index/Buffer#readVarint8 (; 24 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 get_local $1 call $assembly/buffer/index/Buffer#readVarint ) - (func $assembly/module/index/FuncType#constructor (; 26 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (func $assembly/module/index/FuncType#constructor (; 25 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + (local $3 i32) get_local $0 - i32.eqz - if - i32.const 13 - call $~lib/memory/memory.allocate - set_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 13 + call $~lib/memory/memory.allocate + set_local $3 + get_local $3 + i32.const 0 + i32.store + get_local $3 + i32.const 0 + i32.store offset=4 + get_local $3 + get_local $1 + i32.store offset=8 + get_local $3 + get_local $2 + i32.store8 offset=12 + get_local $3 + end + tee_local $0 end - get_local $0 - i32.const 0 - i32.store - get_local $0 - i32.const 0 - i32.store offset=4 - get_local $0 - get_local $1 - i32.store offset=8 - get_local $0 - get_local $2 - i32.store8 offset=12 - get_local $0 + tee_local $0 ) - (func $~lib/internal/arraybuffer/reallocateUnsafe (; 27 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/arraybuffer/reallocateUnsafe (; 26 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2486,7 +2483,7 @@ end get_local $0 ) - (func $~lib/array/Array#__set (; 28 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 27 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -2508,7 +2505,7 @@ if i32.const 0 i32.const 8 - i32.const 107 + i32.const 109 i32.const 41 call $~lib/env/abort unreachable @@ -2542,7 +2539,7 @@ get_local $2 i32.store offset=8 ) - (func $~lib/array/Array#constructor (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 28 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -2565,22 +2562,25 @@ get_local $2 call $~lib/internal/arraybuffer/allocateUnsafe set_local $3 - block (result i32) + get_local $0 + if (result i32) get_local $0 - i32.eqz - if + else + block (result i32) i32.const 8 call $~lib/memory/memory.allocate - set_local $0 + set_local $4 + get_local $4 + i32.const 0 + i32.store + get_local $4 + i32.const 0 + i32.store offset=4 + get_local $4 end - get_local $0 - i32.const 0 - i32.store - get_local $0 - i32.const 0 - i32.store offset=4 - get_local $0 + tee_local $0 end + tee_local $0 get_local $3 i32.store get_local $0 @@ -2598,7 +2598,7 @@ call $~lib/internal/memory/memset get_local $0 ) - (func $~lib/array/Array#__get (; 30 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#__get (; 29 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) get_local $0 @@ -2625,7 +2625,7 @@ unreachable end ) - (func $~lib/array/Array#__set (; 31 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 30 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -2647,7 +2647,7 @@ if i32.const 0 i32.const 8 - i32.const 107 + i32.const 109 i32.const 41 call $~lib/env/abort unreachable @@ -2681,7 +2681,7 @@ get_local $2 i32.store offset=8 ) - (func $~lib/internal/number/decimalCount32 (; 32 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/decimalCount32 (; 31 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 i32.const 100000 @@ -2750,7 +2750,7 @@ unreachable unreachable ) - (func $~lib/internal/string/allocateUnsafe (; 33 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/string/allocateUnsafe (; 32 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -2790,7 +2790,7 @@ i32.store get_local $2 ) - (func $~lib/internal/number/utoa32_lut (; 34 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/number/utoa32_lut (; 33 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -2960,7 +2960,7 @@ i32.store16 offset=4 end ) - (func $~lib/internal/number/utoa32 (; 35 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/utoa32 (; 34 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -2981,12 +2981,12 @@ call $~lib/internal/number/utoa32_lut get_local $2 ) - (func $~lib/internal/number/itoa (; 36 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/internal/number/itoa (; 35 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $~lib/internal/number/utoa32 return ) - (func $~lib/internal/string/copyUnsafe (; 37 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) + (func $~lib/internal/string/copyUnsafe (; 36 ;) (type $iiiiiv) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (param $4 i32) (local $5 i32) (local $6 i32) (local $7 i32) @@ -3015,7 +3015,7 @@ get_local $7 call $~lib/internal/memory/memmove ) - (func $~lib/string/String#concat (; 38 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String#concat (; 37 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3073,7 +3073,7 @@ call $~lib/internal/string/copyUnsafe get_local $5 ) - (func $~lib/string/String.__concat (; 39 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.__concat (; 38 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.eqz if @@ -3084,18 +3084,18 @@ get_local $1 call $~lib/string/String#concat ) - (func $assembly/host/index/log (; 40 ;) (type $iv) (param $0 i32) + (func $assembly/host/index/log (; 39 ;) (type $iv) (param $0 i32) get_local $0 call $assembly/host/index/_log_str ) - (func $assembly/host/index/err (; 41 ;) (type $iv) (param $0 i32) + (func $assembly/host/index/err (; 40 ;) (type $iv) (param $0 i32) i32.const 840 get_local $0 call $~lib/string/String.__concat call $assembly/host/index/log unreachable ) - (func $assembly/module/index/typeName (; 42 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/typeName (; 41 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $break|0 block $case7|0 @@ -3164,7 +3164,7 @@ end i32.const 912 ) - (func $~lib/array/Array#__get (; 43 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#__get (; 42 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) get_local $0 @@ -3191,7 +3191,7 @@ unreachable end ) - (func $assembly/module/index/FuncType#toString (; 44 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/FuncType#toString (; 43 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -3298,7 +3298,7 @@ get_local $4 call $~lib/string/String.__concat ) - (func $assembly/module/index/TypeSection#parse (; 45 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/TypeSection#parse (; 44 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3449,7 +3449,7 @@ end get_local $0 ) - (func $assembly/module/index/Module#getType (; 46 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#getType (; 45 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -3465,7 +3465,7 @@ else i32.const 0 get_local $1 - call $assembly/module/index/TypeSection#constructor + call $assembly/module/index/Section#constructor set_local $2 get_local $2 get_local $0 @@ -3476,7 +3476,7 @@ unreachable unreachable ) - (func $~lib/array/Array#push (; 47 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#push (; 46 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3507,7 +3507,7 @@ if i32.const 0 i32.const 8 - i32.const 182 + i32.const 184 i32.const 42 call $~lib/env/abort unreachable @@ -3538,7 +3538,7 @@ i32.store offset=8 get_local $5 ) - (func $~lib/array/Array#join (; 48 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#join (; 47 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3734,7 +3734,7 @@ get_local $8 return ) - (func $assembly/module/index/TypeSection#toString (; 49 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/TypeSection#toString (; 48 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -3776,7 +3776,7 @@ i32.const 1072 call $~lib/array/Array#join ) - (func $assembly/index/getType (; 50 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/getType (; 49 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) get_local $0 call $assembly/module/index/Module#getType @@ -3791,24 +3791,7 @@ get_local $1 call $assembly/module/index/TypeSection#toString ) - (func $assembly/module/imports/Imports#constructor (; 51 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.eqz - if - i32.const 8 - call $~lib/memory/memory.allocate - set_local $0 - end - get_local $0 - get_local $1 - call $assembly/module/index/Section#constructor - set_local $0 - get_local $0 - i32.const 0 - i32.store offset=4 - get_local $0 - ) - (func $~lib/array/Array#constructor (; 52 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#constructor (; 50 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3831,22 +3814,25 @@ get_local $2 call $~lib/internal/arraybuffer/allocateUnsafe set_local $3 - block (result i32) + get_local $0 + if (result i32) get_local $0 - i32.eqz - if + else + block (result i32) i32.const 8 call $~lib/memory/memory.allocate - set_local $0 + set_local $4 + get_local $4 + i32.const 0 + i32.store + get_local $4 + i32.const 0 + i32.store offset=4 + get_local $4 end - get_local $0 - i32.const 0 - i32.store - get_local $0 - i32.const 0 - i32.store offset=4 - get_local $0 + tee_local $0 end + tee_local $0 get_local $3 i32.store get_local $0 @@ -3864,7 +3850,7 @@ call $~lib/internal/memory/memset get_local $0 ) - (func $~lib/string/String.fromUTF8 (; 53 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/string/String.fromUTF8 (; 51 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -3946,7 +3932,7 @@ if i32.const 0 i32.const 880 - i32.const 527 + i32.const 510 i32.const 8 call $~lib/env/abort unreachable @@ -4000,7 +3986,7 @@ if i32.const 0 i32.const 880 - i32.const 531 + i32.const 514 i32.const 8 call $~lib/env/abort unreachable @@ -4095,7 +4081,7 @@ if i32.const 0 i32.const 880 - i32.const 543 + i32.const 526 i32.const 8 call $~lib/env/abort unreachable @@ -4158,7 +4144,7 @@ if i32.const 0 i32.const 880 - i32.const 552 + i32.const 535 i32.const 4 call $~lib/env/abort unreachable @@ -4187,7 +4173,7 @@ end get_local $7 ) - (func $assembly/buffer/index/Buffer#readUint (; 54 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readUint (; 52 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -4203,26 +4189,32 @@ i32.store offset=8 get_local $2 ) - (func $assembly/module/imports/Import#constructor (; 55 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (func $assembly/module/imports/Import#constructor (; 53 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (local $4 i32) get_local $0 - i32.eqz - if - i32.const 12 - call $~lib/memory/memory.allocate - set_local $0 + if (result i32) + get_local $0 + else + block (result i32) + i32.const 12 + call $~lib/memory/memory.allocate + set_local $4 + get_local $4 + get_local $1 + i32.store + get_local $4 + get_local $2 + i32.store offset=4 + get_local $4 + get_local $3 + i32.store offset=8 + get_local $4 + end + tee_local $0 end - get_local $0 - get_local $1 - i32.store - get_local $0 - get_local $2 - i32.store offset=4 - get_local $0 - get_local $3 - i32.store offset=8 - get_local $0 + tee_local $0 ) - (func $~lib/array/Array#__set (; 56 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/array/Array#__set (; 54 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) @@ -4244,7 +4236,7 @@ if i32.const 0 i32.const 8 - i32.const 107 + i32.const 109 i32.const 41 call $~lib/env/abort unreachable @@ -4278,7 +4270,7 @@ get_local $2 i32.store offset=8 ) - (func $assembly/module/imports/Imports#parse (; 57 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/imports/Imports#parse (; 55 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4484,7 +4476,7 @@ end get_local $0 ) - (func $assembly/module/index/Module#getImports (; 58 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#getImports (; 56 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -4499,14 +4491,14 @@ end i32.const 0 get_local $1 - call $assembly/module/imports/Imports#constructor + call $assembly/module/index/Section#constructor set_local $2 get_local $2 get_local $0 i32.load offset=4 call $assembly/module/imports/Imports#parse ) - (func $assembly/index/getImports (; 59 ;) (type $iv) (param $0 i32) + (func $assembly/index/getImports (; 57 ;) (type $iv) (param $0 i32) (local $1 i32) get_local $0 call $assembly/module/index/Module#getImports @@ -4518,14 +4510,14 @@ nop end ) - (func $assembly/module/index/SectionHeader#get:end (; 60 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/SectionHeader#get:end (; 58 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=12 get_local $0 i32.load offset=8 i32.add ) - (func $~lib/internal/typedarray/TypedArray#constructor (; 61 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#constructor (; 59 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4558,25 +4550,28 @@ get_local $5 get_local $2 call $~lib/internal/memory/memset - block (result i32) + get_local $0 + if (result i32) get_local $0 - i32.eqz - if + else + block (result i32) i32.const 12 call $~lib/memory/memory.allocate - set_local $0 + set_local $5 + get_local $5 + i32.const 0 + i32.store + get_local $5 + i32.const 0 + i32.store offset=4 + get_local $5 + i32.const 0 + i32.store offset=8 + get_local $5 end - get_local $0 - i32.const 0 - i32.store - get_local $0 - i32.const 0 - i32.store offset=4 - get_local $0 - i32.const 0 - i32.store offset=8 - get_local $0 + tee_local $0 end + tee_local $0 get_local $3 i32.store get_local $0 @@ -4587,21 +4582,7 @@ i32.store offset=8 get_local $0 ) - (func $~lib/typedarray/Uint8Array#constructor (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - get_local $0 - i32.eqz - if - i32.const 12 - call $~lib/memory/memory.allocate - set_local $0 - end - get_local $0 - get_local $1 - call $~lib/internal/typedarray/TypedArray#constructor - set_local $0 - get_local $0 - ) - (func $~lib/internal/typedarray/TypedArray#__get (; 63 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/internal/typedarray/TypedArray#__get (; 60 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) get_local $1 @@ -4635,7 +4616,7 @@ i32.load8_u offset=8 end ) - (func $~lib/internal/typedarray/TypedArray#__set (; 64 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/typedarray/TypedArray#__set (; 61 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local $4 i32) get_local $1 @@ -4668,7 +4649,7 @@ get_local $2 i32.store8 offset=8 ) - (func $assembly/index/removeSection (; 65 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/removeSection (; 62 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -4693,7 +4674,7 @@ i32.load offset=4 get_local $3 i32.sub - call $~lib/typedarray/Uint8Array#constructor + call $~lib/internal/typedarray/TypedArray#constructor set_local $4 block $break|0 i32.const 0 @@ -4770,19 +4751,19 @@ unreachable unreachable ) - (func $assembly/index/removeStartFunction (; 66 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/removeStartFunction (; 63 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Start call $assembly/index/removeSection ) - (func $assembly/module/index/SectionHeader#get:len (; 67 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/SectionHeader#get:len (; 64 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/SectionHeader#get:end get_local $0 i32.load i32.sub ) - (func $~lib/typedarray/Uint8Array#fill (; 68 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) + (func $~lib/typedarray/Uint8Array#fill (; 65 ;) (type $iiiii) (param $0 i32) (param $1 i32) (param $2 i32) (param $3 i32) (result i32) (local $4 i32) (local $5 i32) (local $6 i32) @@ -4874,7 +4855,7 @@ end get_local $0 ) - (func $assembly/index/exportDataSection (; 69 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/exportDataSection (; 66 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -4913,7 +4894,7 @@ get_local $3 i32.const 8 i32.add - call $~lib/typedarray/Uint8Array#constructor + call $~lib/internal/typedarray/TypedArray#constructor set_local $4 get_local $4 i32.const 0 @@ -5030,56 +5011,60 @@ end get_local $4 ) - (func $assembly/index/toString (; 70 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/toString (; 67 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/TypeSection#toString ) - (func $assembly/module/index/Module#get:start (; 71 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:start (; 68 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Start call $assembly/module/index/Module#getID ) - (func $assembly/module/index/Module#get:hasStart (; 72 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:hasStart (; 69 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/Module#get:start i32.const 0 i32.ne ) - (func $assembly/index/hasStart (; 73 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/hasStart (; 70 ;) (type $ii) (param $0 i32) (result i32) get_local $0 call $assembly/module/index/Module#get:hasStart ) - (func $~lib/arraybuffer/ArrayBuffer#get:data (; 74 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/arraybuffer/ArrayBuffer#get:data (; 71 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $~lib/internal/arraybuffer/HEADER_SIZE i32.add ) - (func $assembly/buffer/index/Buffer#constructor (; 75 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - block (result i32) + (func $assembly/buffer/index/Buffer#constructor (; 72 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $0 + if (result i32) get_local $0 - i32.eqz - if + else + block (result i32) i32.const 20 call $~lib/memory/memory.allocate - set_local $0 + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + i32.const 0 + i32.store offset=8 + get_local $2 + i32.const 0 + i32.store offset=12 + get_local $2 + i32.const 0 + i32.store offset=16 + get_local $2 end - get_local $0 - i32.const 0 - i32.store - get_local $0 - i32.const 0 - i32.store offset=4 - get_local $0 - i32.const 0 - i32.store offset=8 - get_local $0 - i32.const 0 - i32.store offset=12 - get_local $0 - i32.const 0 - i32.store offset=16 - get_local $0 + tee_local $0 end + tee_local $0 get_local $1 i32.store get_local $0 @@ -5104,23 +5089,27 @@ i32.store offset=16 get_local $0 ) - (func $assembly/module/index/Module#constructor (; 76 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - block (result i32) + (func $assembly/module/index/Module#constructor (; 73 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $0 + if (result i32) get_local $0 - i32.eqz - if + else + block (result i32) i32.const 8 call $~lib/memory/memory.allocate - set_local $0 + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 end - get_local $0 - i32.const 0 - i32.store - get_local $0 - i32.const 0 - i32.store offset=4 - get_local $0 + tee_local $0 end + tee_local $0 get_local $1 i32.store offset=4 get_local $0 @@ -5128,23 +5117,27 @@ i32.store get_local $0 ) - (func $assembly/index/Parser#constructor (; 77 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) - block (result i32) + (func $assembly/index/Parser#constructor (; 74 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + get_local $0 + if (result i32) get_local $0 - i32.eqz - if + else + block (result i32) i32.const 8 call $~lib/memory/memory.allocate - set_local $0 + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 end - get_local $0 - i32.const 0 - i32.store - get_local $0 - i32.const 0 - i32.store offset=4 - get_local $0 + tee_local $0 end + tee_local $0 i32.const 0 get_local $1 call $assembly/buffer/index/Buffer#constructor @@ -5157,7 +5150,7 @@ i32.store offset=4 get_local $0 ) - (func $assembly/index/Parser#parseString (; 78 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#parseString (; 75 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 @@ -5167,24 +5160,24 @@ call $assembly/buffer/index/Buffer#readVaruint call $~lib/string/String.fromUTF8 ) - (func $assembly/index/Parser#readVaruint (; 79 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/index/Parser#readVaruint (; 76 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 i32.load get_local $1 call $assembly/buffer/index/Buffer#readVaruint ) - (func $assembly/index/Parser#get:off (; 80 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/index/Parser#get:off (; 77 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load i32.load offset=8 ) - (func $assembly/index/Parser#set:off (; 81 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/index/Parser#set:off (; 78 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 i32.load get_local $1 i32.store offset=8 ) - (func $assembly/buffer/index/Buffer#readUint (; 82 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/buffer/index/Buffer#readUint (; 79 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) get_local $0 @@ -5200,7 +5193,7 @@ i32.store offset=8 get_local $2 ) - (func $assembly/module/index/sectionName (; 83 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/sectionName (; 80 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) block $break|0 block $case12|0 @@ -5310,42 +5303,45 @@ unreachable i32.const 912 ) - (func $assembly/host/index/log (; 84 ;) (type $iv) (param $0 i32) + (func $assembly/host/index/log (; 81 ;) (type $iv) (param $0 i32) get_local $0 call $assembly/host/index/_logi ) - (func $assembly/module/index/SectionHeader#constructor (; 85 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/SectionHeader#constructor (; 82 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) - block (result i32) + get_local $0 + if (result i32) get_local $0 - i32.eqz - if + else + block (result i32) i32.const 24 call $~lib/memory/memory.allocate - set_local $0 + set_local $2 + get_local $2 + i32.const 0 + i32.store + get_local $2 + i32.const 0 + i32.store offset=4 + get_local $2 + i32.const 0 + i32.store offset=8 + get_local $2 + i32.const 0 + i32.store offset=12 + get_local $2 + i32.const 0 + i32.store offset=16 + get_local $2 + i32.const 912 + i32.store offset=20 + get_local $2 end - get_local $0 - i32.const 0 - i32.store - get_local $0 - i32.const 0 - i32.store offset=4 - get_local $0 - i32.const 0 - i32.store offset=8 - get_local $0 - i32.const 0 - i32.store offset=12 - get_local $0 - i32.const 0 - i32.store offset=16 - get_local $0 - i32.const 912 - i32.store offset=20 - get_local $0 + tee_local $0 end + tee_local $0 get_local $1 i32.load offset=8 i32.store @@ -5434,7 +5430,7 @@ i32.store offset=12 get_local $0 ) - (func $~lib/array/Array#push (; 86 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $~lib/array/Array#push (; 83 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local $3 i32) (local $4 i32) @@ -5465,7 +5461,7 @@ if i32.const 0 i32.const 8 - i32.const 182 + i32.const 184 i32.const 42 call $~lib/env/abort unreachable @@ -5496,7 +5492,7 @@ i32.store offset=8 get_local $5 ) - (func $assembly/module/index/Module#parseSection (; 87 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $assembly/module/index/Module#parseSection (; 84 ;) (type $iiv) (param $0 i32) (param $1 i32) (local $2 i32) get_local $0 i32.load @@ -5519,7 +5515,7 @@ end end ) - (func $assembly/index/Parser#parse (; 88 ;) (type $iv) (param $0 i32) + (func $assembly/index/Parser#parse (; 85 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -5589,19 +5585,19 @@ end end ) - (func $assembly/module/index/Module#get:Type (; 89 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/Module#get:Type (; 86 ;) (type $ii) (param $0 i32) (result i32) get_local $0 get_global $src/common/SectionId.Type call $assembly/module/index/Module#getID ) - (func $assembly/module/index/Module#hasSection (; 90 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $assembly/module/index/Module#hasSection (; 87 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) get_local $0 get_local $1 call $assembly/module/index/Module#getID i32.const 0 i32.ne ) - (func $assembly/module/index/SectionHeader#toString (; 91 ;) (type $ii) (param $0 i32) (result i32) + (func $assembly/module/index/SectionHeader#toString (; 88 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) @@ -5665,7 +5661,7 @@ get_local $6 call $~lib/string/String.__concat ) - (func $assembly/module/index/Module#print (; 92 ;) (type $iv) (param $0 i32) + (func $assembly/module/index/Module#print (; 89 ;) (type $iv) (param $0 i32) (local $1 i32) (local $2 i32) block $break|0 @@ -5703,7 +5699,7 @@ unreachable end ) - (func $start (; 93 ;) (type $v) + (func $start (; 90 ;) (type $v) get_global $HEAP_BASE get_global $~lib/internal/allocator/AL_MASK i32.add @@ -5716,58 +5712,58 @@ set_global $~lib/allocator/arena/offset nop ) - (func $null (; 94 ;) (type $v) + (func $null (; 91 ;) (type $v) ) - (func $Parser#get:buf (; 95 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:buf (; 92 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) - (func $Parser#set:buf (; 96 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:buf (; 93 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store ) - (func $Parser#get:module (; 97 ;) (type $ii) (param $0 i32) (result i32) + (func $Parser#get:module (; 94 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) - (func $Parser#set:module (; 98 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Parser#set:module (; 95 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store offset=4 ) - (func $TypeSection#get:header (; 99 ;) (type $ii) (param $0 i32) (result i32) + (func $TypeSection#get:header (; 96 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) - (func $TypeSection#set:header (; 100 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $TypeSection#set:header (; 97 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store ) - (func $TypeSection#get:funcs (; 101 ;) (type $ii) (param $0 i32) (result i32) + (func $TypeSection#get:funcs (; 98 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) - (func $TypeSection#set:funcs (; 102 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $TypeSection#set:funcs (; 99 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store offset=4 ) - (func $Module#get:headers (; 103 ;) (type $ii) (param $0 i32) (result i32) + (func $Module#get:headers (; 100 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load ) - (func $Module#set:headers (; 104 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Module#set:headers (; 101 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store ) - (func $Module#get:buf (; 105 ;) (type $ii) (param $0 i32) (result i32) + (func $Module#get:buf (; 102 ;) (type $ii) (param $0 i32) (result i32) get_local $0 i32.load offset=4 ) - (func $Module#set:buf (; 106 ;) (type $iiv) (param $0 i32) (param $1 i32) + (func $Module#set:buf (; 103 ;) (type $iiv) (param $0 i32) (param $1 i32) get_local $0 get_local $1 i32.store offset=4 diff --git a/lib/parse/src/asImport.ts b/lib/parse/src/asImport.ts new file mode 100644 index 0000000000..1e8156aaa0 --- /dev/null +++ b/lib/parse/src/asImport.ts @@ -0,0 +1,69 @@ +import * as loader from "../../../dist/assemblyscript-loader"; + +export abstract class ASImport { + public instance: loader.ASInstance; + + get __imports__(): object { + let constructor = (this).constructor; + let className: string = constructor.name; + let __imports__ = {}; + __imports__[className] = {}; + for (let name of Object.getOwnPropertyNames(constructor.prototype)){ + if (name !== "constructor" && !name.startsWith("__")){ + console.log(name); + __imports__[className][name] = this[name].bind(this); + } + } + return __imports__; + } + get __memory__(): loader.ASMemory { + return this.instance.memory; + } + +} + + class Fee extends ASImport { + getT(): number { + console.log(this.instance); + return 42; + } + } + class index extends ASImport { + debug():void {debugger; } + _log(start: number, sizeof: number):void { + var begin = start >> 2; + var size = sizeof >> 2; + if (size == 1 ) { + console.log(start); + } else { + let str = [] + let len = 0; + for (let i = begin; i < begin + size; i++){ + let line = `| ${i} | ${this.__memory__.I32[i] >> 2}`; + len = Math.max(len, line.length); + str.push(line); + } + let space = " "; + let output = str.map((v: string): string => v + (space as any).repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = (dash as any).repeat(len + 2); + console.log([line,output.join("\n" + line + "\n"),line].join("\n")); + } + } + + _log_str(x: number): void { + console.log(loader.utils.readString(this.__memory__.U32, this.__memory__.U16, x)) + } + _logi(x: number): void { + console.log(x); + } + _logf(x: number): void { + console.log(x); + } + } + + let fee = new Fee(); + let Index = new index(); + console.log(Index.__imports__); + console.log(fee.__imports__); + fee.getT(); diff --git a/lib/parse/src/index.ts b/lib/parse/src/index.ts index 41c442f15c..7d6867ff78 100644 --- a/lib/parse/src/index.ts +++ b/lib/parse/src/index.ts @@ -3,10 +3,45 @@ import * as assert from "assert"; export { Type, SectionId, ExternalKind }; import * as loader from "../../../dist/assemblyscript-loader"; import ASModule from "../build"; +import {ASImport} from "./asImport"; type Instance = typeof ASModule; +class index extends ASImport { + debug():void {debugger; } + _log(start: number, sizeof: number):void { + var begin = start >> 2; + var size = sizeof >> 2; + if (size == 1 ) { + console.log(start); + } else { + let str = [] + let len = 0; + for (let i = begin; i < begin + size; i++){ + let line = `| ${i} | ${this.__memory__.I32[i] >> 2}`; + len = Math.max(len, line.length); + str.push(line); + } + let space = " "; + let output = str.map((v: string): string => v + (space as any).repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = (dash as any).repeat(len + 2); + console.log([line,output.join("\n" + line + "\n"),line].join("\n")); + } + } + + _log_str(x: number): void { + console.log(loader.utils.readString(this.__memory__.U32, this.__memory__.U16, x)) + } + _logi(x: number): void { + console.log(x); + } + _logf(x: number): void { + console.log(x); + } +} + // type Parser = {parse: (any)=> any, newParser: (any)=>any}; /** Cached compiled parser. */ var compiled: WebAssembly.Module | null = null; @@ -35,46 +70,24 @@ export class WasmParser { var nBytes = binary.length; var nPages = ((nBytes + 0xffff) & ~0xffff) >> 16; var memory = loader.createMemory({ initial: nPages }); + let Index = new index(); + console.log((Index.__imports__)) var imports = { + ...(Index.__imports__), env: { abort: console.error, memory }, - index: { - //tslint:disable-next-line - debug: ():void => {debugger; }, - _log: (start: number, sizeof: number):void => { - var begin = start >> 2; - var size = sizeof >> 2; - if (size == 1 ) { - console.log(start); - } else { - let str = [] - let len = 0; - for (let i = begin; i < begin + size; i++){ - let line = `| ${i} | ${memory.I32[i] >> 2}`; - len = Math.max(len, line.length); - str.push(line); - } - let space = " "; - let output = str.map((v: string): string => v + (space as any).repeat(len - v.length + 1) + "|"); - let dash = "-"; - let line = (dash as any).repeat(len + 2); - console.log([line,output.join("\n" + line + "\n"),line].join("\n")); - } - }, - _log_str: (x: number): void => console.log(loader.utils.readString(memory.U32, memory.U16, x)), - _logi: console.log, - _logf: console.log - }, options: {}, } this.instance = loader.instantiate(compiled, imports); + Index.instance = this.instance; var array = this.memory.newArray(binary); var parser = new this.instance.Parser(array) this.parser = parser; parser.parse(); this.mod = (this.instance.Module).wrap(parser.module); + console.log(this.mod['self']); } get Type(): string { diff --git a/lib/parse/src/tsconfig.json b/lib/parse/src/tsconfig.json index 0071dc50fd..296c02597a 100644 --- a/lib/parse/src/tsconfig.json +++ b/lib/parse/src/tsconfig.json @@ -2,7 +2,8 @@ "compilerOptions": { "module": "commonjs", "lib":["es2017", "esnext", "esnext.bigint", "es2017.typedarrays"], - "target": "es2016" + "target": "es2017", + "experimentalDecorators": true }, "include": [ "./**/*.ts" From 823d8c9529eaf934bae701ca9d1a807f988941a5 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Mon, 11 Feb 2019 12:18:07 -0500 Subject: [PATCH 31/46] Added ASImport Now an abstract class makes creating an import object much easier. --- lib/host/README.md | 69 + lib/host/assembly/index.ts | 4 - lib/host/lib/ASImport.d.ts | 9 + lib/host/lib/ASImport.js | 34 + lib/host/lib/index.d.ts | 22 +- lib/host/lib/index.js | 78 +- lib/host/package-lock.json | 107 ++ lib/host/package.json | 7 +- lib/host/src/ASImport.ts | 56 + lib/host/src/env.ts | 18 + lib/host/src/host.ts | 37 + lib/host/src/index.ts | 56 +- lib/host/tests/assembly/index.ts | 15 +- lib/host/tests/build/index.d.ts | 9 +- lib/host/tests/build/untouched.wat | 1932 ++-------------------------- lib/host/tests/index.ts | 11 +- lib/host/tests/tsconfig.json | 19 + lib/host/tsconfig.json | 5 +- lib/loader/lib/index.d.ts | 14 +- lib/loader/lib/index.js | 23 +- lib/loader/src/index.ts | 33 +- 21 files changed, 613 insertions(+), 1945 deletions(-) create mode 100644 lib/host/lib/ASImport.d.ts create mode 100644 lib/host/lib/ASImport.js create mode 100644 lib/host/src/ASImport.ts create mode 100644 lib/host/src/env.ts create mode 100644 lib/host/src/host.ts create mode 100644 lib/host/tests/tsconfig.json diff --git a/lib/host/README.md b/lib/host/README.md index 6b5c6b36f5..0e21100798 100644 --- a/lib/host/README.md +++ b/lib/host/README.md @@ -1,3 +1,72 @@ # Host Bindings Library Each Webassembly module with any declared inputs requires an imports object. Currently this must be handled by the each project, however, there should be a core set of host functions that a WebAssembly module can expect to be present. + + +## ASImport + +The other issue that this library tries to solve is making it easier to construct an imports object. The import object currently passed to WebAssembly can't be a class. However, imports such as logging need to have access to the instance's memory. The solution is an abstract class, which will handle creating an object made up of each of the class's instance methods and most importantly will bind each function to the instance. + +Classes that extend `ASImport` gain access to the instance including memory and the table. The loader was also updated so that it will bind the memory and instance to the each of the imports. + +```ts + +let env = new Env({initial:50}) // Create new memory in env namespace +let imports = ASImport.createImport(Host, env); // can pass constructors or objects and get back imports object +var instance = loader.instantiateBuffer(wasm, imports); + +``` +For example, +```ts +export class Host extends ASImport { + debug (): void { + // tslint:disable-next-line + debugger; + } + + _log(start: number, sizeof: number): void { + let begin = start >> 2; + let size = sizeof >> 2; + if (size == 1 ){ + console.log(start); + } else { + let str = [] + let len = 0; + for (let i = begin; i < begin+size; i++){ + let line = `| ${i} | ${this.memory.I32[i] >> 2}`; + len = Math.max(len, line.length); + str.push(line); + } + let space = " "; + let output = str.map((v: any, i:number, a: any[]): string => v + (space as any).repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = (dash as any).repeat(len+2); + console.log([line,output.join('\n'+line+'\n'),line].join("\n")); + } + } + + _log_str(x: number): void { + return console.log(this.memory.getString(x)) + } + + _logi(x: number): void { console.log(x) } + + _logf(x:number): void { console.log(x) } +} +``` + +becomes + +```ts +{ host: + { _bindMemory: [Function: _bindMemory], + _bindInstance: [Function: _bindInstance], + debug: [Function: bound debug], + _log: [Function: bound _log], + _log_str: [Function: bound _log_str], + _logi: [Function: bound _logi], + _logf: [Function: bound _logf] } +} +``` + +The loader then will call the `_bindMemory` before the the module is instantiated and then call `_bindInstance` after. diff --git a/lib/host/assembly/index.ts b/lib/host/assembly/index.ts index fb50dbfefb..d8b5fb4f53 100644 --- a/lib/host/assembly/index.ts +++ b/lib/host/assembly/index.ts @@ -20,10 +20,6 @@ export function log(item: T):void { } } -export function log_str(item: string): void { - log(item); -} - export function err(message: string): void { log("Error: " + message); unreachable(); diff --git a/lib/host/lib/ASImport.d.ts b/lib/host/lib/ASImport.d.ts new file mode 100644 index 0000000000..1941de83c0 --- /dev/null +++ b/lib/host/lib/ASImport.d.ts @@ -0,0 +1,9 @@ +import { ASInstance, ASMemory, ASTable } from "../../loader"; +export declare abstract class ASImport { + instance: ASInstance; + readonly __imports__: object; + readonly __memory__: ASMemory; + readonly __table__: ASTable; + _bindInstance(instance: ASInstance): void; + static __createImportObject(...args: any[]): any; +} diff --git a/lib/host/lib/ASImport.js b/lib/host/lib/ASImport.js new file mode 100644 index 0000000000..a1a76ba947 --- /dev/null +++ b/lib/host/lib/ASImport.js @@ -0,0 +1,34 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class ASImport { + get __imports__() { + let constructor = this.constructor; + let className = constructor.name.toLowerCase(); + let __imports__ = {}; + __imports__[className] = {}; + for (let name of Object.getOwnPropertyNames(constructor.prototype)) { + if (name !== "constructor" && !name.startsWith("__")) { + __imports__[className][name] = this[name].bind(this); + } + } + return __imports__; + } + get __memory__() { + return this.instance.memory; + } + get __table__() { + return this.instance.table; + } + _bindInstance(instance) { + this.instance = instance; + } + static __createImportObject(...args) { + let imports = {}; + for (let arg of args) { + let obj = new arg(); + imports = Object.assign({}, imports, obj.__imports__); + } + return imports; + } +} +exports.ASImport = ASImport; diff --git a/lib/host/lib/index.d.ts b/lib/host/lib/index.d.ts index a2e65f9a43..2990fc76c9 100644 --- a/lib/host/lib/index.d.ts +++ b/lib/host/lib/index.d.ts @@ -1,16 +1,8 @@ -import * as loader from "../../loader"; -export declare class Host { - instance: loader.ASInstance; - getImports(): { - host: { - debug(): void; - _log(start: number, sizeof: number): void; - _log_str(x: number): void; - _logi(x: number): void; - _logf(x: number): void; - }; - post: postFunc[]; - }; +import { ASImport } from "./ASImport"; +export declare class Host extends ASImport { + debug(): void; + _log(start: number, sizeof: number): void; + _log_str(x: number): void; + _logi(x: number): void; + _logf(x: number): void; } -declare type postFunc = (instance: loader.ASInstance & T) => loader.ASInstance & T; -export {}; diff --git a/lib/host/lib/index.js b/lib/host/lib/index.js index 1f372b77a2..d447b51cde 100644 --- a/lib/host/lib/index.js +++ b/lib/host/lib/index.js @@ -1,54 +1,36 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -//tslint:disable -var instance; -class Host { - constructor() { - this.instance = instance; +const ASImport_1 = require("./ASImport"); +class Host extends ASImport_1.ASImport { + debug() { + // tslint:disable-next-line + debugger; } - getImports() { - var _this = this; - return { - host: { - debug() { - // tslint:disable-next-line - debugger; - }, - _log(start, sizeof) { - let begin = start >> 2; - let size = sizeof >> 2; - if (size == 1) { - console.log(start); - } - else { - let str = []; - let len = 0; - for (let i = begin; i < begin + size; i++) { - let line = `| ${i} | ${_this.instance.memory.I32[i] >> 2}`; - len = Math.max(len, line.length); - str.push(line); - } - let space = " "; - let output = str.map((v, i, a) => v + space.repeat(len - v.length + 1) + "|"); - let dash = "-"; - let line = dash.repeat(len + 2); - console.log([line, output.join('\n' + line + '\n'), line].join("\n")); - } - }, - _log_str(x) { - return console.log(_this.instance.memory.getString(x)); - }, - _logi(x) { console.log(x); }, - _logf(x) { console.log(x); }, - }, - post: [bootstrap(_this)] - }; + _log(start, sizeof) { + let begin = start >> 2; + let size = sizeof >> 2; + if (size == 1) { + console.log(start); + } + else { + let str = []; + let len = 0; + for (let i = begin; i < begin + size; i++) { + let line = `| ${i} | ${this.__memory__.I32[i] >> 2}`; + len = Math.max(len, line.length); + str.push(line); + } + let space = " "; + let output = str.map((v, i, a) => v + space.repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = dash.repeat(len + 2); + console.log([line, output.join('\n' + line + '\n'), line].join("\n")); + } } + _log_str(x) { + return console.log(this.__memory__.getString(x)); + } + _logi(x) { console.log(x); } + _logf(x) { console.log(x); } } exports.Host = Host; -function bootstrap(h) { - return (_instance) => { - h.instance = _instance; - return _instance; - }; -} diff --git a/lib/host/package-lock.json b/lib/host/package-lock.json index 647716f2fb..86e8d35457 100644 --- a/lib/host/package-lock.json +++ b/lib/host/package-lock.json @@ -4,17 +4,124 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/node": { + "version": "10.12.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.24.tgz", + "integrity": "sha512-GWWbvt+z9G5otRBW8rssOFgRY87J9N/qbhqfjMZ+gUuL6zoL+Hm6gP/8qQBG4jjimqdaNLCehcVapZ/Fs2WjCQ==", + "dev": true + }, "@types/webassembly-js-api": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@types/webassembly-js-api/-/webassembly-js-api-0.0.1.tgz", "integrity": "sha1-YtULIBB319TMEJuxytoi/f1FI/s=", "dev": true }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-support": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "ts-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", + "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", + "requires": { + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" + } + }, + "ts-transformer-keys": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/ts-transformer-keys/-/ts-transformer-keys-0.3.4.tgz", + "integrity": "sha512-Or2lLODKfg5n03MzC9RfSAeg+l0LrT8r6p8z5JuH0AcCoPVht6+SFCZcKgoN5O/4d9bL6RTqC2lGNTBujUMUaA==" + }, + "ttypescript": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/ttypescript/-/ttypescript-1.5.6.tgz", + "integrity": "sha512-+JbeQt3W+VJMsnvDMVX2/LojRJqLBQzQWE1hI5ZTR2+9EoWXnQ4fUD+tMWCCda1LY2Z5EtwWWrWYmNziw4CYZA==", + "requires": { + "resolve": "^1.9.0", + "ts-node": "^7.0.1" + } + }, "typescript": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", "dev": true + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" } } } diff --git a/lib/host/package.json b/lib/host/package.json index f3f3b53a61..0e9d752202 100644 --- a/lib/host/package.json +++ b/lib/host/package.json @@ -7,14 +7,19 @@ "scripts": { "build": "tsc", "prepublishOnly": "tsc", - "test:build": "../../bin/asc tests/assembly/index.ts -b tests/build/untouched.wasm -t tests/build/untouched.wat -d tests/build/index.d.ts --debug", + "test:build": "../../bin/asc tests/assembly/index.ts --importMemory -b tests/build/untouched.wasm -t tests/build/untouched.wat -d tests/build/index.d.ts --debug", "test": "ts-node tests" }, "files": [ "lib/*" ], "devDependencies": { + "@types/node": "^10.12.24", "@types/webassembly-js-api": "0.0.1", "typescript": "^3.2.2" + }, + "dependencies": { + "ts-transformer-keys": "^0.3.4", + "ttypescript": "^1.5.6" } } diff --git a/lib/host/src/ASImport.ts b/lib/host/src/ASImport.ts new file mode 100644 index 0000000000..0efcfa7dca --- /dev/null +++ b/lib/host/src/ASImport.ts @@ -0,0 +1,56 @@ +import {ASInstance, ASMemory, ASTable} from "../../loader" + +export abstract class ASImport { + public instance!: ASInstance; + private _memory!: ASMemory; + + get __imports__(): object { + let constructor = (this).constructor; + let className: string = constructor.name.toLowerCase(); + let __imports__: {[key:string]: any} = {}; + let _this = this; + __imports__[className] = { + _bindMemory(memory: ASMemory): void { + _this.__bindMemory(memory); + }, + _bindInstance(instance: ASInstance): void { + _this.instance = instance; + } + }; + for (let name of Object.getOwnPropertyNames(constructor.prototype)){ + if (name !== "constructor" && !name.startsWith("__")){ + __imports__[className][name] = (this)[name].bind(this); + } + } + return __imports__; + } + get memory(): ASMemory { + return (this.instance && this.instance.memory) || this._memory; + } + get table(): ASTable { + return this.instance.table; + } + + __bindInstance(instance: ASInstance): void { + this.instance = instance; + } + + __bindMemory(memory: ASMemory): void { + this._memory = memory; + } + + static createImport(...args: any[]): any { + let imports = {}; + for (let arg of args){ + let obj; + if (typeof arg == "function"){ + obj = new arg(); + }else { + obj = arg; + } + imports = {...imports, ...obj.__imports__} + } + return imports; + } + +} diff --git a/lib/host/src/env.ts b/lib/host/src/env.ts new file mode 100644 index 0000000000..1af8efeba6 --- /dev/null +++ b/lib/host/src/env.ts @@ -0,0 +1,18 @@ + + +export class Env { + public memory: WebAssembly.Memory; + constructor(memory: WebAssembly.MemoryDescriptor = {initial: 10000}){ + this.memory = new WebAssembly.Memory(memory); + } + + get __imports__(): any { + let memory = this.memory; + return { + "env":{ + memory + } + } + } + +} diff --git a/lib/host/src/host.ts b/lib/host/src/host.ts new file mode 100644 index 0000000000..918e51322a --- /dev/null +++ b/lib/host/src/host.ts @@ -0,0 +1,37 @@ +import {ASImport} from "./ASImport"; + +export class Host extends ASImport { + debug (): void { + // tslint:disable-next-line + debugger; + } + + _log(start: number, sizeof: number): void { + let begin = start >> 2; + let size = sizeof >> 2; + if (size == 1 ){ + console.log(start); + } else { + let str = [] + let len = 0; + for (let i = begin; i < begin+size; i++){ + let line = `| ${i} | ${this.memory.I32[i] >> 2}`; + len = Math.max(len, line.length); + str.push(line); + } + let space = " "; + let output = str.map((v: any, i:number, a: any[]): string => v + (space as any).repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = (dash as any).repeat(len+2); + console.log([line,output.join('\n'+line+'\n'),line].join("\n")); + } + } + + _log_str(x: number): void { + return console.log(this.memory.getString(x)) + } + + _logi(x: number): void { console.log(x) } + + _logf(x:number): void { console.log(x) } +} diff --git a/lib/host/src/index.ts b/lib/host/src/index.ts index ce5d9f800f..c748fde93c 100644 --- a/lib/host/src/index.ts +++ b/lib/host/src/index.ts @@ -1,55 +1,5 @@ -import * as loader from "../../loader"; -//tslint:disable -var instance: loader.ASInstance; -export class Host { - instance: loader.ASInstance = instance; - getImports(){ - var _this = this; - return { - host: { - debug (): void { - // tslint:disable-next-line - debugger; - }, - _log(start: number, sizeof: number): void { - let begin = start >> 2; - let size = sizeof >> 2; - if (size == 1 ){ - console.log(start); - } else { - let str = [] - let len = 0; - for (let i = begin; i < begin+size; i++){ - let line = `| ${i} | ${_this.instance.memory.I32[i]>>2}`; - len = Math.max(len, line.length); - str.push(line); - } - let space = " "; - let output = str.map((v: any,i:number,a: any[]):string => v + (space as any).repeat(len - v.length + 1) + "|"); - let dash = "-"; - let line = (dash as any).repeat(len+2); - console.log([line,output.join('\n'+line+'\n'),line].join("\n")); - } - }, - - _log_str(x: number): void { - return console.log(_this.instance.memory.getString(x)) - }, - _logi(x: number): void {console.log(x)}, - _logf(x:number):void { console.log(x)}, - }, - post:[bootstrap(_this)] - } -} -} - -type postFunc = (instance:loader.ASInstance & T) => loader.ASInstance & T; - -function bootstrap(h: Host): postFunc { - return (_instance: loader.ASInstance & T)=> { - h.instance = _instance - return _instance - } -} +export * from "./ASImport"; +export * from "./host"; +export * from "./env"; diff --git a/lib/host/tests/assembly/index.ts b/lib/host/tests/assembly/index.ts index 6f305e3613..ef85aab4f1 100644 --- a/lib/host/tests/assembly/index.ts +++ b/lib/host/tests/assembly/index.ts @@ -3,13 +3,22 @@ import {log} from "../../assembly/index"; import "allocator/arena"; export { memory }; -class Car { +export class Car { weight: i32 = 10121; - length: i64 = 200002; + length: i32 = 200002; + constructor(){}; + + private static _i: i32 = 10; + + createAnother(): Car { + return new Car(); + } + + static i(): i32 { return Car._i;} } export function runTest(): void{ - log("Does the string printing work?"); + log("Does the string printing work??"); log(42); log(new Car()); } diff --git a/lib/host/tests/build/index.d.ts b/lib/host/tests/build/index.d.ts index 631084ccc9..1cc2362215 100644 --- a/lib/host/tests/build/index.d.ts +++ b/lib/host/tests/build/index.d.ts @@ -8,10 +8,15 @@ declare module ASModule { type f32 = number; type f64 = number; type bool = any; + class Car { + static i(): i32; + constructor(); + weight: i32; + length: i32; + createAnother(): u32; + } function runTest(): void; namespace memory { - function fill(dest: u32, c: u8, n: u32): void; - function copy(dest: u32, src: u32, n: u32): void; function compare(vl: u32, vr: u32, n: u32): i32; function allocate(size: u32): u32; function free(ptr: u32): void; diff --git a/lib/host/tests/build/untouched.wat b/lib/host/tests/build/untouched.wat index 975b38096b..e13a3f7fe3 100644 --- a/lib/host/tests/build/untouched.wat +++ b/lib/host/tests/build/untouched.wat @@ -1,16 +1,16 @@ (module - (type $iiiv (func (param i32 i32 i32))) (type $iiii (func (param i32 i32 i32) (result i32))) (type $ii (func (param i32) (result i32))) - (type $iv (func (param i32))) - (type $v (func)) - (type $iiv (func (param i32 i32))) + (type $i_ (func (param i32))) + (type $_ (func)) + (type $i (func (result i32))) + (type $ii_ (func (param i32 i32))) + (import "env" "memory" (memory $0 1)) + (data (i32.const 8) "\1f\00\00\00D\00o\00e\00s\00 \00t\00h\00e\00 \00s\00t\00r\00i\00n\00g\00 \00p\00r\00i\00n\00t\00i\00n\00g\00 \00w\00o\00r\00k\00?\00?\00") (import "host" "_log_str" (func $assembly/host/_log_str (param i32))) (import "host" "_logi" (func $assembly/host/_logi (param i32))) (import "host" "_log" (func $assembly/host/_log (param i32 i32))) - (memory $0 1) - (data (i32.const 8) "\1e\00\00\00D\00o\00e\00s\00 \00t\00h\00e\00 \00s\00t\00r\00i\00n\00g\00 \00p\00r\00i\00n\00t\00i\00n\00g\00 \00w\00o\00r\00k\00?\00") - (table $0 1 anyfunc) + (table $0 1 funcref) (elem (i32.const 0) $null) (global $~lib/internal/allocator/AL_BITS i32 (i32.const 3)) (global $~lib/internal/allocator/AL_SIZE i32 (i32.const 8)) @@ -18,1715 +18,27 @@ (global $~lib/internal/allocator/MAX_SIZE_32 i32 (i32.const 1073741824)) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) - (global $HEAP_BASE i32 (i32.const 72)) + (global $tests/assembly/index/Car._i (mut i32) (i32.const 10)) + (global $HEAP_BASE i32 (i32.const 76)) (export "memory" (memory $0)) (export "table" (table $0)) + (export "Car.i" (func $tests/assembly/index/Car.i)) + (export "Car#constructor" (func $tests/assembly/index/Car#constructor)) + (export "Car#get:weight" (func $Car#get:weight)) + (export "Car#set:weight" (func $Car#set:weight)) + (export "Car#get:length" (func $Car#get:length)) + (export "Car#set:length" (func $Car#set:length)) + (export "Car#createAnother" (func $tests/assembly/index/Car#createAnother)) (export "runTest" (func $tests/assembly/index/runTest)) - (export "memory.fill" (func $~lib/memory/memory.fill)) - (export "memory.copy" (func $~lib/memory/memory.copy)) (export "memory.compare" (func $~lib/memory/memory.compare)) (export "memory.allocate" (func $~lib/memory/memory.allocate)) (export "memory.free" (func $~lib/memory/memory.free)) (export "memory.reset" (func $~lib/memory/memory.reset)) (start $start) - (func $~lib/internal/memory/memset (; 3 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) + (func $~lib/internal/memory/memcmp (; 3 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) (local $3 i32) - (local $4 i32) - (local $5 i64) - get_local $2 - i32.eqz - if - return - end - get_local $0 - get_local $1 - i32.store8 - get_local $0 - get_local $2 - i32.add - i32.const 1 - i32.sub - get_local $1 - i32.store8 - get_local $2 - i32.const 2 - i32.le_u - if - return - end - get_local $0 - i32.const 1 - i32.add - get_local $1 - i32.store8 - get_local $0 - i32.const 2 - i32.add - get_local $1 - i32.store8 - get_local $0 - get_local $2 - i32.add - i32.const 2 - i32.sub - get_local $1 - i32.store8 - get_local $0 - get_local $2 - i32.add - i32.const 3 - i32.sub - get_local $1 - i32.store8 - get_local $2 - i32.const 6 - i32.le_u - if - return - end - get_local $0 - i32.const 3 - i32.add - get_local $1 - i32.store8 - get_local $0 - get_local $2 - i32.add - i32.const 4 - i32.sub - get_local $1 - i32.store8 - get_local $2 - i32.const 8 - i32.le_u - if - return - end - i32.const 0 - get_local $0 - i32.sub - i32.const 3 - i32.and - set_local $3 - get_local $0 - get_local $3 - i32.add - set_local $0 - get_local $2 - get_local $3 - i32.sub - set_local $2 - get_local $2 - i32.const -4 - i32.and - set_local $2 - i32.const -1 - i32.const 255 - i32.div_u - get_local $1 - i32.const 255 - i32.and - i32.mul - set_local $4 - get_local $0 - get_local $4 - i32.store - get_local $0 - get_local $2 - i32.add - i32.const 4 - i32.sub - get_local $4 - i32.store - get_local $2 - i32.const 8 - i32.le_u - if - return - end - get_local $0 - i32.const 4 - i32.add - get_local $4 - i32.store - get_local $0 - i32.const 8 - i32.add - get_local $4 - i32.store - get_local $0 - get_local $2 - i32.add - i32.const 12 - i32.sub - get_local $4 - i32.store - get_local $0 - get_local $2 - i32.add - i32.const 8 - i32.sub - get_local $4 - i32.store - get_local $2 - i32.const 24 - i32.le_u - if - return - end - get_local $0 - i32.const 12 - i32.add - get_local $4 - i32.store - get_local $0 - i32.const 16 - i32.add - get_local $4 - i32.store - get_local $0 - i32.const 20 - i32.add - get_local $4 - i32.store - get_local $0 - i32.const 24 - i32.add - get_local $4 - i32.store - get_local $0 - get_local $2 - i32.add - i32.const 28 - i32.sub - get_local $4 - i32.store - get_local $0 - get_local $2 - i32.add - i32.const 24 - i32.sub - get_local $4 - i32.store - get_local $0 - get_local $2 - i32.add - i32.const 20 - i32.sub - get_local $4 - i32.store - get_local $0 - get_local $2 - i32.add - i32.const 16 - i32.sub - get_local $4 - i32.store - i32.const 24 - get_local $0 - i32.const 4 - i32.and - i32.add - set_local $3 - get_local $0 - get_local $3 - i32.add - set_local $0 - get_local $2 - get_local $3 - i32.sub - set_local $2 - get_local $4 - i64.extend_u/i32 - get_local $4 - i64.extend_u/i32 - i64.const 32 - i64.shl - i64.or - set_local $5 - block $break|0 - loop $continue|0 - get_local $2 - i32.const 32 - i32.ge_u - if - block - get_local $0 - get_local $5 - i64.store - get_local $0 - i32.const 8 - i32.add - get_local $5 - i64.store - get_local $0 - i32.const 16 - i32.add - get_local $5 - i64.store - get_local $0 - i32.const 24 - i32.add - get_local $5 - i64.store - get_local $2 - i32.const 32 - i32.sub - set_local $2 - get_local $0 - i32.const 32 - i32.add - set_local $0 - end - br $continue|0 - end - end - end - ) - (func $~lib/memory/memory.fill (; 4 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - get_local $0 - get_local $1 - get_local $2 - call $~lib/internal/memory/memset - ) - (func $~lib/internal/memory/memcpy (; 5 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local $4 i32) - (local $5 i32) - block $break|0 - loop $continue|0 - get_local $2 - if (result i32) - get_local $1 - i32.const 3 - i32.and - else - get_local $2 - end - if - block - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - get_local $2 - i32.const 1 - i32.sub - set_local $2 - end - br $continue|0 - end - end - end - get_local $0 - i32.const 3 - i32.and - i32.const 0 - i32.eq - if - block $break|1 - loop $continue|1 - get_local $2 - i32.const 16 - i32.ge_u - if - block - get_local $0 - get_local $1 - i32.load - i32.store - get_local $0 - i32.const 4 - i32.add - get_local $1 - i32.const 4 - i32.add - i32.load - i32.store - get_local $0 - i32.const 8 - i32.add - get_local $1 - i32.const 8 - i32.add - i32.load - i32.store - get_local $0 - i32.const 12 - i32.add - get_local $1 - i32.const 12 - i32.add - i32.load - i32.store - get_local $1 - i32.const 16 - i32.add - set_local $1 - get_local $0 - i32.const 16 - i32.add - set_local $0 - get_local $2 - i32.const 16 - i32.sub - set_local $2 - end - br $continue|1 - end - end - end - get_local $2 - i32.const 8 - i32.and - if - get_local $0 - get_local $1 - i32.load - i32.store - get_local $0 - i32.const 4 - i32.add - get_local $1 - i32.const 4 - i32.add - i32.load - i32.store - get_local $0 - i32.const 8 - i32.add - set_local $0 - get_local $1 - i32.const 8 - i32.add - set_local $1 - end - get_local $2 - i32.const 4 - i32.and - if - get_local $0 - get_local $1 - i32.load - i32.store - get_local $0 - i32.const 4 - i32.add - set_local $0 - get_local $1 - i32.const 4 - i32.add - set_local $1 - end - get_local $2 - i32.const 2 - i32.and - if - get_local $0 - get_local $1 - i32.load16_u - i32.store16 - get_local $0 - i32.const 2 - i32.add - set_local $0 - get_local $1 - i32.const 2 - i32.add - set_local $1 - end - get_local $2 - i32.const 1 - i32.and - if - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - end - return - end - get_local $2 - i32.const 32 - i32.ge_u - if - block $break|2 - block $case2|2 - block $case1|2 - block $case0|2 - get_local $0 - i32.const 3 - i32.and - set_local $5 - get_local $5 - i32.const 1 - i32.eq - br_if $case0|2 - get_local $5 - i32.const 2 - i32.eq - br_if $case1|2 - get_local $5 - i32.const 3 - i32.eq - br_if $case2|2 - br $break|2 - end - block - get_local $1 - i32.load - set_local $3 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - get_local $2 - i32.const 3 - i32.sub - set_local $2 - block $break|3 - loop $continue|3 - get_local $2 - i32.const 17 - i32.ge_u - if - block - get_local $1 - i32.const 1 - i32.add - i32.load - set_local $4 - get_local $0 - get_local $3 - i32.const 24 - i32.shr_u - get_local $4 - i32.const 8 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 5 - i32.add - i32.load - set_local $3 - get_local $0 - i32.const 4 - i32.add - get_local $4 - i32.const 24 - i32.shr_u - get_local $3 - i32.const 8 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 9 - i32.add - i32.load - set_local $4 - get_local $0 - i32.const 8 - i32.add - get_local $3 - i32.const 24 - i32.shr_u - get_local $4 - i32.const 8 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 13 - i32.add - i32.load - set_local $3 - get_local $0 - i32.const 12 - i32.add - get_local $4 - i32.const 24 - i32.shr_u - get_local $3 - i32.const 8 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 16 - i32.add - set_local $1 - get_local $0 - i32.const 16 - i32.add - set_local $0 - get_local $2 - i32.const 16 - i32.sub - set_local $2 - end - br $continue|3 - end - end - end - br $break|2 - unreachable - end - unreachable - end - block - get_local $1 - i32.load - set_local $3 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - get_local $2 - i32.const 2 - i32.sub - set_local $2 - block $break|4 - loop $continue|4 - get_local $2 - i32.const 18 - i32.ge_u - if - block - get_local $1 - i32.const 2 - i32.add - i32.load - set_local $4 - get_local $0 - get_local $3 - i32.const 16 - i32.shr_u - get_local $4 - i32.const 16 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 6 - i32.add - i32.load - set_local $3 - get_local $0 - i32.const 4 - i32.add - get_local $4 - i32.const 16 - i32.shr_u - get_local $3 - i32.const 16 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 10 - i32.add - i32.load - set_local $4 - get_local $0 - i32.const 8 - i32.add - get_local $3 - i32.const 16 - i32.shr_u - get_local $4 - i32.const 16 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 14 - i32.add - i32.load - set_local $3 - get_local $0 - i32.const 12 - i32.add - get_local $4 - i32.const 16 - i32.shr_u - get_local $3 - i32.const 16 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 16 - i32.add - set_local $1 - get_local $0 - i32.const 16 - i32.add - set_local $0 - get_local $2 - i32.const 16 - i32.sub - set_local $2 - end - br $continue|4 - end - end - end - br $break|2 - unreachable - end - unreachable - end - block - get_local $1 - i32.load - set_local $3 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - get_local $2 - i32.const 1 - i32.sub - set_local $2 - block $break|5 - loop $continue|5 - get_local $2 - i32.const 19 - i32.ge_u - if - block - get_local $1 - i32.const 3 - i32.add - i32.load - set_local $4 - get_local $0 - get_local $3 - i32.const 8 - i32.shr_u - get_local $4 - i32.const 24 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 7 - i32.add - i32.load - set_local $3 - get_local $0 - i32.const 4 - i32.add - get_local $4 - i32.const 8 - i32.shr_u - get_local $3 - i32.const 24 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 11 - i32.add - i32.load - set_local $4 - get_local $0 - i32.const 8 - i32.add - get_local $3 - i32.const 8 - i32.shr_u - get_local $4 - i32.const 24 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 15 - i32.add - i32.load - set_local $3 - get_local $0 - i32.const 12 - i32.add - get_local $4 - i32.const 8 - i32.shr_u - get_local $3 - i32.const 24 - i32.shl - i32.or - i32.store - get_local $1 - i32.const 16 - i32.add - set_local $1 - get_local $0 - i32.const 16 - i32.add - set_local $0 - get_local $2 - i32.const 16 - i32.sub - set_local $2 - end - br $continue|5 - end - end - end - br $break|2 - unreachable - end - unreachable - end - end - get_local $2 - i32.const 16 - i32.and - if - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - end - get_local $2 - i32.const 8 - i32.and - if - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - end - get_local $2 - i32.const 4 - i32.and - if - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - end - get_local $2 - i32.const 2 - i32.and - if - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - end - get_local $2 - i32.const 1 - i32.and - if - block (result i32) - get_local $0 - tee_local $5 - i32.const 1 - i32.add - set_local $0 - get_local $5 - end - block (result i32) - get_local $1 - tee_local $5 - i32.const 1 - i32.add - set_local $1 - get_local $5 - end - i32.load8_u - i32.store8 - end - ) - (func $~lib/internal/memory/memmove (; 6 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - get_local $0 - get_local $1 - i32.eq - if - return - end - get_local $1 - get_local $2 - i32.add - get_local $0 - i32.le_u - tee_local $3 - if (result i32) - get_local $3 - else - get_local $0 - get_local $2 - i32.add - get_local $1 - i32.le_u - end - if - get_local $0 - get_local $1 - get_local $2 - call $~lib/internal/memory/memcpy - return - end - get_local $0 - get_local $1 - i32.lt_u - if - get_local $1 - i32.const 7 - i32.and - get_local $0 - i32.const 7 - i32.and - i32.eq - if - block $break|0 - loop $continue|0 - get_local $0 - i32.const 7 - i32.and - if - block - get_local $2 - i32.eqz - if - return - end - get_local $2 - i32.const 1 - i32.sub - set_local $2 - block (result i32) - get_local $0 - tee_local $3 - i32.const 1 - i32.add - set_local $0 - get_local $3 - end - block (result i32) - get_local $1 - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $3 - end - i32.load8_u - i32.store8 - end - br $continue|0 - end - end - end - block $break|1 - loop $continue|1 - get_local $2 - i32.const 8 - i32.ge_u - if - block - get_local $0 - get_local $1 - i64.load - i64.store - get_local $2 - i32.const 8 - i32.sub - set_local $2 - get_local $0 - i32.const 8 - i32.add - set_local $0 - get_local $1 - i32.const 8 - i32.add - set_local $1 - end - br $continue|1 - end - end - end - end - block $break|2 - loop $continue|2 - get_local $2 - if - block - block (result i32) - get_local $0 - tee_local $3 - i32.const 1 - i32.add - set_local $0 - get_local $3 - end - block (result i32) - get_local $1 - tee_local $3 - i32.const 1 - i32.add - set_local $1 - get_local $3 - end - i32.load8_u - i32.store8 - get_local $2 - i32.const 1 - i32.sub - set_local $2 - end - br $continue|2 - end - end - end - else - get_local $1 - i32.const 7 - i32.and - get_local $0 - i32.const 7 - i32.and - i32.eq - if - block $break|3 - loop $continue|3 - get_local $0 - get_local $2 - i32.add - i32.const 7 - i32.and - if - block - get_local $2 - i32.eqz - if - return - end - get_local $0 - get_local $2 - i32.const 1 - i32.sub - tee_local $2 - i32.add - get_local $1 - get_local $2 - i32.add - i32.load8_u - i32.store8 - end - br $continue|3 - end - end - end - block $break|4 - loop $continue|4 - get_local $2 - i32.const 8 - i32.ge_u - if - block - get_local $2 - i32.const 8 - i32.sub - set_local $2 - get_local $0 - get_local $2 - i32.add - get_local $1 - get_local $2 - i32.add - i64.load - i64.store - end - br $continue|4 - end - end - end - end - block $break|5 - loop $continue|5 - get_local $2 - if - get_local $0 - get_local $2 - i32.const 1 - i32.sub - tee_local $2 - i32.add - get_local $1 - get_local $2 - i32.add - i32.load8_u - i32.store8 - br $continue|5 - end - end - end - end - ) - (func $~lib/memory/memory.copy (; 7 ;) (type $iiiv) (param $0 i32) (param $1 i32) (param $2 i32) - get_local $0 - get_local $1 - get_local $2 - call $~lib/internal/memory/memmove - ) - (func $~lib/internal/memory/memcmp (; 8 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) - (local $3 i32) - get_local $0 - get_local $1 + local.get $0 + local.get $1 i32.eq if i32.const 0 @@ -1734,97 +46,97 @@ end block $break|0 loop $continue|0 - get_local $2 + local.get $2 i32.const 0 i32.ne - tee_local $3 + local.tee $3 if (result i32) - get_local $0 + local.get $0 i32.load8_u - get_local $1 + local.get $1 i32.load8_u i32.eq else - get_local $3 + local.get $3 end if block - get_local $2 + local.get $2 i32.const 1 i32.sub - set_local $2 - get_local $0 + local.set $2 + local.get $0 i32.const 1 i32.add - set_local $0 - get_local $1 + local.set $0 + local.get $1 i32.const 1 i32.add - set_local $1 + local.set $1 end br $continue|0 end end end - get_local $2 + local.get $2 if (result i32) - get_local $0 + local.get $0 i32.load8_u - get_local $1 + local.get $1 i32.load8_u i32.sub else i32.const 0 end ) - (func $~lib/memory/memory.compare (; 9 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) - get_local $0 - get_local $1 - get_local $2 + (func $~lib/memory/memory.compare (; 4 ;) (type $iiii) (param $0 i32) (param $1 i32) (param $2 i32) (result i32) + local.get $0 + local.get $1 + local.get $2 call $~lib/internal/memory/memcmp ) - (func $~lib/allocator/arena/__memory_allocate (; 10 ;) (type $ii) (param $0 i32) (result i32) + (func $~lib/allocator/arena/__memory_allocate (; 5 ;) (type $ii) (param $0 i32) (result i32) (local $1 i32) (local $2 i32) (local $3 i32) (local $4 i32) (local $5 i32) (local $6 i32) - get_local $0 - get_global $~lib/internal/allocator/MAX_SIZE_32 + local.get $0 + global.get $~lib/internal/allocator/MAX_SIZE_32 i32.gt_u if unreachable end - get_global $~lib/allocator/arena/offset - set_local $1 - get_local $1 - get_local $0 - tee_local $2 + global.get $~lib/allocator/arena/offset + local.set $1 + local.get $1 + local.get $0 + local.tee $2 i32.const 1 - tee_local $3 - get_local $2 - get_local $3 + local.tee $3 + local.get $2 + local.get $3 i32.gt_u select i32.add - get_global $~lib/internal/allocator/AL_MASK + global.get $~lib/internal/allocator/AL_MASK i32.add - get_global $~lib/internal/allocator/AL_MASK + global.get $~lib/internal/allocator/AL_MASK i32.const -1 i32.xor i32.and - set_local $4 + local.set $4 current_memory - set_local $5 - get_local $4 - get_local $5 + local.set $5 + local.get $4 + local.get $5 i32.const 16 i32.shl i32.gt_u if - get_local $4 - get_local $1 + local.get $4 + local.get $1 i32.sub i32.const 65535 i32.add @@ -1834,22 +146,22 @@ i32.and i32.const 16 i32.shr_u - set_local $2 - get_local $5 - tee_local $3 - get_local $2 - tee_local $6 - get_local $3 - get_local $6 + local.set $2 + local.get $5 + local.tee $3 + local.get $2 + local.tee $6 + local.get $3 + local.get $6 i32.gt_s select - set_local $3 - get_local $3 + local.set $3 + local.get $3 grow_memory i32.const 0 i32.lt_s if - get_local $2 + local.get $2 grow_memory i32.const 0 i32.lt_s @@ -1858,76 +170,106 @@ end end end - get_local $4 - set_global $~lib/allocator/arena/offset - get_local $1 + local.get $4 + global.set $~lib/allocator/arena/offset + local.get $1 ) - (func $~lib/memory/memory.allocate (; 11 ;) (type $ii) (param $0 i32) (result i32) - get_local $0 + (func $~lib/memory/memory.allocate (; 6 ;) (type $ii) (param $0 i32) (result i32) + local.get $0 call $~lib/allocator/arena/__memory_allocate return ) - (func $~lib/allocator/arena/__memory_free (; 12 ;) (type $iv) (param $0 i32) + (func $~lib/allocator/arena/__memory_free (; 7 ;) (type $i_) (param $0 i32) nop ) - (func $~lib/memory/memory.free (; 13 ;) (type $iv) (param $0 i32) - get_local $0 + (func $~lib/memory/memory.free (; 8 ;) (type $i_) (param $0 i32) + local.get $0 call $~lib/allocator/arena/__memory_free return ) - (func $~lib/allocator/arena/__memory_reset (; 14 ;) (type $v) - get_global $~lib/allocator/arena/startOffset - set_global $~lib/allocator/arena/offset + (func $~lib/allocator/arena/__memory_reset (; 9 ;) (type $_) + global.get $~lib/allocator/arena/startOffset + global.set $~lib/allocator/arena/offset ) - (func $~lib/memory/memory.reset (; 15 ;) (type $v) + (func $~lib/memory/memory.reset (; 10 ;) (type $_) call $~lib/allocator/arena/__memory_reset return ) - (func $assembly/index/log (; 16 ;) (type $iv) (param $0 i32) - get_local $0 + (func $tests/assembly/index/Car.i (; 11 ;) (type $i) (result i32) + global.get $tests/assembly/index/Car._i + ) + (func $tests/assembly/index/Car#constructor (; 12 ;) (type $ii) (param $0 i32) (result i32) + local.get $0 + i32.eqz + if + i32.const 8 + call $~lib/memory/memory.allocate + local.set $0 + end + local.get $0 + i32.const 10121 + i32.store + local.get $0 + i32.const 200002 + i32.store offset=4 + local.get $0 + ) + (func $tests/assembly/index/Car#createAnother (; 13 ;) (type $ii) (param $0 i32) (result i32) + i32.const 0 + call $tests/assembly/index/Car#constructor + ) + (func $assembly/index/log (; 14 ;) (type $i_) (param $0 i32) + local.get $0 call $assembly/host/_log_str ) - (func $assembly/index/log (; 17 ;) (type $iv) (param $0 i32) - get_local $0 + (func $assembly/index/log (; 15 ;) (type $i_) (param $0 i32) + local.get $0 call $assembly/host/_logi ) - (func $assembly/index/log (; 18 ;) (type $iv) (param $0 i32) - get_local $0 - i32.const 16 + (func $assembly/index/log (; 16 ;) (type $i_) (param $0 i32) + local.get $0 + i32.const 8 call $assembly/host/_log ) - (func $tests/assembly/index/runTest (; 19 ;) (type $v) - (local $0 i32) + (func $tests/assembly/index/runTest (; 17 ;) (type $_) i32.const 8 call $assembly/index/log i32.const 42 call $assembly/index/log - block (result i32) - i32.const 16 - call $~lib/memory/memory.allocate - set_local $0 - get_local $0 - i32.const 10121 - i32.store - get_local $0 - i64.const 200002 - i64.store offset=8 - get_local $0 - end + i32.const 0 + call $tests/assembly/index/Car#constructor call $assembly/index/log ) - (func $start (; 20 ;) (type $v) - get_global $HEAP_BASE - get_global $~lib/internal/allocator/AL_MASK + (func $start (; 18 ;) (type $_) + global.get $HEAP_BASE + global.get $~lib/internal/allocator/AL_MASK i32.add - get_global $~lib/internal/allocator/AL_MASK + global.get $~lib/internal/allocator/AL_MASK i32.const -1 i32.xor i32.and - set_global $~lib/allocator/arena/startOffset - get_global $~lib/allocator/arena/startOffset - set_global $~lib/allocator/arena/offset + global.set $~lib/allocator/arena/startOffset + global.get $~lib/allocator/arena/startOffset + global.set $~lib/allocator/arena/offset + ) + (func $null (; 19 ;) (type $_) + ) + (func $Car#get:weight (; 20 ;) (type $ii) (param $0 i32) (result i32) + local.get $0 + i32.load + ) + (func $Car#set:weight (; 21 ;) (type $ii_) (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store + ) + (func $Car#get:length (; 22 ;) (type $ii) (param $0 i32) (result i32) + local.get $0 + i32.load offset=4 ) - (func $null (; 21 ;) (type $v) + (func $Car#set:length (; 23 ;) (type $ii_) (param $0 i32) (param $1 i32) + local.get $0 + local.get $1 + i32.store offset=4 ) ) diff --git a/lib/host/tests/index.ts b/lib/host/tests/index.ts index 1533f58149..6be60e032f 100644 --- a/lib/host/tests/index.ts +++ b/lib/host/tests/index.ts @@ -1,12 +1,15 @@ -import {Host} from "../src"; +import {Host,ASImport, Env} from "../src"; import * as loader from "../../loader/src"; import * as fs from "fs"; import ASModule from "./build"; -import * as asc from "../../../cli/asc" type testMod = typeof ASModule; var wasm = fs.readFileSync(`${__dirname}/build/untouched.wasm`); -let imports = (new Host()).getImports(); -var instance = loader.instantiateBuffer(wasm.buffer, imports); + +let env = new Env({initial:50}) +let imports = ASImport.createImport(Host, env); +console.log(imports); + +var instance = loader.instantiateBuffer(wasm, imports); instance.runTest(); diff --git a/lib/host/tests/tsconfig.json b/lib/host/tests/tsconfig.json new file mode 100644 index 0000000000..a98079d5d1 --- /dev/null +++ b/lib/host/tests/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "declaration": true, + "lib": ["dom", "es2015", "esnext.bigint", "es2017.typedarrays"], + "module": "commonjs", + "moduleResolution": "node", + "target": "es6", + "strict": true, + "plugins": [ + { "transform": "ts-transformer-keys/transformer" } + ] + }, + "include": [ + "**/*.ts" + ], + "exclude": [ + "assembly/**/*.ts" + ] +} diff --git a/lib/host/tsconfig.json b/lib/host/tsconfig.json index d94961912a..74f2abaf14 100644 --- a/lib/host/tsconfig.json +++ b/lib/host/tsconfig.json @@ -6,7 +6,10 @@ "moduleResolution": "node", "outDir": "lib", "target": "es6", - "strict": true + "strict": true, + "plugins": [ + { "transform": "ts-transformer-keys/transformer" } + ] }, "include": [ "src/**/*.ts" diff --git a/lib/loader/lib/index.d.ts b/lib/loader/lib/index.d.ts index f4622fffb7..de94087f9b 100644 --- a/lib/loader/lib/index.d.ts +++ b/lib/loader/lib/index.d.ts @@ -64,11 +64,21 @@ export declare namespace utils { function computeBufferSize(byteLength: number): number; function hasOwnProperty(obj: any, key: any): boolean; } +declare type idFunc = (t: T) => T; +declare type postResolve = idFunc; +declare type preResolve = idFunc; +declare type postArr = Array>; /** Instantiates an AssemblyScript module using the specified imports. */ -export declare function instantiate(module: WebAssembly.Module, imports?: any): ASInstance & T; +export declare function instantiate(module: WebAssembly.Module, imports?: { + post?: postArr; +}): ASInstance & T; /** Instantiates an AssemblyScript module from a buffer using the specified imports. */ -export declare function instantiateBuffer(buffer: any, imports?: any): ASInstance & T; +export declare function instantiateBuffer(buffer: any, imports?: { + pre?: Array; + post?: postArr; +}): ASInstance & T; /** Creates a wrapped memory instance. */ export declare function createMemory(descriptor: WebAssembly.MemoryDescriptor): ASMemory; /** Demangles an AssemblyScript module's exports to a friendly object structure. */ export declare function demangle(instance: WebAssembly.Instance): ASInstance & ASExport; +export {}; diff --git a/lib/loader/lib/index.js b/lib/loader/lib/index.js index 6e0e4c1d04..66f0645888 100644 --- a/lib/loader/lib/index.js +++ b/lib/loader/lib/index.js @@ -305,6 +305,11 @@ function createContext(imports = {}) { if (env.memory instanceof MemoryWrapper) { env.memory = env.memory.raw; } + for (let _import in ctx.imports) { + if (ctx.imports[_import]._bindMemory) { + ctx.imports[_import]._bindMemory(ctx.memory); + } + } return ctx; } function resolveContext(instance, ctx) { @@ -312,7 +317,7 @@ function resolveContext(instance, ctx) { table.setExports(instance.exports); ctx.memory = MemoryWrapper.resolve(instance.exports.memory); ctx.memory.setExports(instance.exports); - const resolved = {}; + let resolved = {}; for (const internalName in instance.exports) { if (!utils.hasOwnProperty(instance.exports, internalName)) { continue; @@ -403,17 +408,29 @@ function resolveContext(instance, ctx) { } } } - return Object.assign({ memory: ctx.memory, table }, resolved); + resolved = Object.assign({ memory: ctx.memory, table }, resolved); + for (let _import in ctx.imports) { + if (ctx.imports[_import]._bindInstance) { + ctx.imports[_import]._bindInstance(resolved); + } + } + return resolved; } /** Instantiates an AssemblyScript module using the specified imports. */ function instantiate(module, imports = {}) { const ctx = createContext(imports); const instance = new WebAssembly.Instance(module, ctx.imports); - return resolveContext(instance, ctx); + var res = resolveContext(instance, ctx); + return res; } exports.instantiate = instantiate; /** Instantiates an AssemblyScript module from a buffer using the specified imports. */ function instantiateBuffer(buffer, imports = {}) { + // if (imports.pre){ + // imports.pre.map((fn)=>{ + // _buffer = fn(_buffer); + // }) + // } return instantiate(new WebAssembly.Module(buffer), imports); } exports.instantiateBuffer = instantiateBuffer; diff --git a/lib/loader/src/index.ts b/lib/loader/src/index.ts index e8368f8dcd..057034b1bd 100644 --- a/lib/loader/src/index.ts +++ b/lib/loader/src/index.ts @@ -427,6 +427,11 @@ function createContext(imports: any = {}) { if (env.memory instanceof MemoryWrapper) { env.memory = env.memory.raw; } + for (let _import in ctx.imports){ + if (ctx.imports[_import]._bindMemory) { + ctx.imports[_import]._bindMemory(ctx.memory) + } + } return ctx; } @@ -437,7 +442,7 @@ function resolveContext(instance: WebAssembly.Instance, ctx: Insta ctx.memory = MemoryWrapper.resolve(instance.exports.memory); ctx.memory.setExports(instance.exports); - const resolved: any = {}; + let resolved: any = {}; for (const internalName in instance.exports) { if (!utils.hasOwnProperty(instance.exports, internalName)) { continue; } // resolve nested objects @@ -519,11 +524,17 @@ function resolveContext(instance: WebAssembly.Instance, ctx: Insta } } } - return { + resolved = { memory: ctx.memory, table, ...resolved, }; + for (let _import in ctx.imports){ + if (ctx.imports[_import]._bindInstance){ + ctx.imports[_import]._bindInstance(resolved); + } + } + return resolved; } type idFunc = (t: T) => T @@ -539,23 +550,17 @@ export function instantiate(module: WebAssembly.Module, imports: { const ctx = createContext(imports); const instance = new WebAssembly.Instance(module, ctx.imports); var res = resolveContext(instance, ctx); - if (imports.post){ - imports.post.map((fn)=>{ - res = fn(res); - }) - } return res; } /** Instantiates an AssemblyScript module from a buffer using the specified imports. */ export function instantiateBuffer(buffer: any, imports: {pre?:Array, post?:postArr} = {}): ASInstance & T { - var _buffer = buffer; - if (imports.pre){ - imports.pre.map((fn)=>{ - _buffer = fn(_buffer); - }) - } - return instantiate(new WebAssembly.Module(_buffer), imports); + // if (imports.pre){ + // imports.pre.map((fn)=>{ + // _buffer = fn(_buffer); + // }) + // } + return instantiate(new WebAssembly.Module(buffer), imports); } /** Instantiates an AssemblyScript module from a response using the specified imports. */ From 089f6ae803f0d8ec7635eabe1a1bec5f2a33c222 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Mon, 11 Feb 2019 20:29:36 -0500 Subject: [PATCH 32/46] Added auto wrap/unwrap compiler adds RefType returned to end of function names. Loader uses this to wrap returned value. *.d.ts generated also now uses ref types --- lib/host/lib/ASImport.d.ts | 10 ++++--- lib/host/lib/ASImport.js | 31 +++++++++++++++----- lib/host/lib/env.d.ts | 6 ++++ lib/host/lib/env.js | 16 ++++++++++ lib/host/lib/host.d.ts | 8 +++++ lib/host/lib/host.js | 36 +++++++++++++++++++++++ lib/host/lib/index.d.ts | 11 ++----- lib/host/lib/index.js | 40 ++++--------------------- lib/host/package.json | 3 +- lib/host/tests/assembly/index.ts | 13 +++++---- lib/host/tests/build/index.d.ts | 9 +++--- lib/host/tests/build/untouched.wat | 47 +++++++++++++++++++----------- lib/host/tests/index.ts | 10 ++++--- lib/loader/src/index.ts | 21 ++++++++++--- src/compiler.ts | 7 ++++- src/definitions.ts | 8 +++-- 16 files changed, 185 insertions(+), 91 deletions(-) create mode 100644 lib/host/lib/env.d.ts create mode 100644 lib/host/lib/env.js create mode 100644 lib/host/lib/host.d.ts create mode 100644 lib/host/lib/host.js diff --git a/lib/host/lib/ASImport.d.ts b/lib/host/lib/ASImport.d.ts index 1941de83c0..b0ef0bb29f 100644 --- a/lib/host/lib/ASImport.d.ts +++ b/lib/host/lib/ASImport.d.ts @@ -1,9 +1,11 @@ import { ASInstance, ASMemory, ASTable } from "../../loader"; export declare abstract class ASImport { instance: ASInstance; + private _memory; readonly __imports__: object; - readonly __memory__: ASMemory; - readonly __table__: ASTable; - _bindInstance(instance: ASInstance): void; - static __createImportObject(...args: any[]): any; + readonly memory: ASMemory; + readonly table: ASTable; + __bindInstance(instance: ASInstance): void; + __bindMemory(memory: ASMemory): void; + static createImport(...args: any[]): any; } diff --git a/lib/host/lib/ASImport.js b/lib/host/lib/ASImport.js index a1a76ba947..f84e47b3ed 100644 --- a/lib/host/lib/ASImport.js +++ b/lib/host/lib/ASImport.js @@ -5,7 +5,15 @@ class ASImport { let constructor = this.constructor; let className = constructor.name.toLowerCase(); let __imports__ = {}; - __imports__[className] = {}; + let _this = this; + __imports__[className] = { + _bindMemory(memory) { + _this.__bindMemory(memory); + }, + _bindInstance(instance) { + _this.instance = instance; + } + }; for (let name of Object.getOwnPropertyNames(constructor.prototype)) { if (name !== "constructor" && !name.startsWith("__")) { __imports__[className][name] = this[name].bind(this); @@ -13,19 +21,28 @@ class ASImport { } return __imports__; } - get __memory__() { - return this.instance.memory; + get memory() { + return (this.instance && this.instance.memory) || this._memory; } - get __table__() { + get table() { return this.instance.table; } - _bindInstance(instance) { + __bindInstance(instance) { this.instance = instance; } - static __createImportObject(...args) { + __bindMemory(memory) { + this._memory = memory; + } + static createImport(...args) { let imports = {}; for (let arg of args) { - let obj = new arg(); + let obj; + if (typeof arg == "function") { + obj = new arg(); + } + else { + obj = arg; + } imports = Object.assign({}, imports, obj.__imports__); } return imports; diff --git a/lib/host/lib/env.d.ts b/lib/host/lib/env.d.ts new file mode 100644 index 0000000000..7d23217eef --- /dev/null +++ b/lib/host/lib/env.d.ts @@ -0,0 +1,6 @@ +/// +export declare class Env { + memory: WebAssembly.Memory; + constructor(memory?: WebAssembly.MemoryDescriptor); + readonly __imports__: any; +} diff --git a/lib/host/lib/env.js b/lib/host/lib/env.js new file mode 100644 index 0000000000..a538c1039f --- /dev/null +++ b/lib/host/lib/env.js @@ -0,0 +1,16 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Env { + constructor(memory = { initial: 10000 }) { + this.memory = new WebAssembly.Memory(memory); + } + get __imports__() { + let memory = this.memory; + return { + "env": { + memory + } + }; + } +} +exports.Env = Env; diff --git a/lib/host/lib/host.d.ts b/lib/host/lib/host.d.ts new file mode 100644 index 0000000000..2990fc76c9 --- /dev/null +++ b/lib/host/lib/host.d.ts @@ -0,0 +1,8 @@ +import { ASImport } from "./ASImport"; +export declare class Host extends ASImport { + debug(): void; + _log(start: number, sizeof: number): void; + _log_str(x: number): void; + _logi(x: number): void; + _logf(x: number): void; +} diff --git a/lib/host/lib/host.js b/lib/host/lib/host.js new file mode 100644 index 0000000000..8d52038c9a --- /dev/null +++ b/lib/host/lib/host.js @@ -0,0 +1,36 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const ASImport_1 = require("./ASImport"); +class Host extends ASImport_1.ASImport { + debug() { + // tslint:disable-next-line + debugger; + } + _log(start, sizeof) { + let begin = start >> 2; + let size = sizeof >> 2; + if (size == 1) { + console.log(start); + } + else { + let str = []; + let len = 0; + for (let i = begin; i < begin + size; i++) { + let line = `| ${i} | ${this.memory.I32[i] >> 2}`; + len = Math.max(len, line.length); + str.push(line); + } + let space = " "; + let output = str.map((v, i, a) => v + space.repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = dash.repeat(len + 2); + console.log([line, output.join('\n' + line + '\n'), line].join("\n")); + } + } + _log_str(x) { + return console.log(this.memory.getString(x)); + } + _logi(x) { console.log(x); } + _logf(x) { console.log(x); } +} +exports.Host = Host; diff --git a/lib/host/lib/index.d.ts b/lib/host/lib/index.d.ts index 2990fc76c9..a34d9cf8d1 100644 --- a/lib/host/lib/index.d.ts +++ b/lib/host/lib/index.d.ts @@ -1,8 +1,3 @@ -import { ASImport } from "./ASImport"; -export declare class Host extends ASImport { - debug(): void; - _log(start: number, sizeof: number): void; - _log_str(x: number): void; - _logi(x: number): void; - _logf(x: number): void; -} +export * from "./ASImport"; +export * from "./host"; +export * from "./env"; diff --git a/lib/host/lib/index.js b/lib/host/lib/index.js index d447b51cde..7d6ae20547 100644 --- a/lib/host/lib/index.js +++ b/lib/host/lib/index.js @@ -1,36 +1,8 @@ "use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const ASImport_1 = require("./ASImport"); -class Host extends ASImport_1.ASImport { - debug() { - // tslint:disable-next-line - debugger; - } - _log(start, sizeof) { - let begin = start >> 2; - let size = sizeof >> 2; - if (size == 1) { - console.log(start); - } - else { - let str = []; - let len = 0; - for (let i = begin; i < begin + size; i++) { - let line = `| ${i} | ${this.__memory__.I32[i] >> 2}`; - len = Math.max(len, line.length); - str.push(line); - } - let space = " "; - let output = str.map((v, i, a) => v + space.repeat(len - v.length + 1) + "|"); - let dash = "-"; - let line = dash.repeat(len + 2); - console.log([line, output.join('\n' + line + '\n'), line].join("\n")); - } - } - _log_str(x) { - return console.log(this.__memory__.getString(x)); - } - _logi(x) { console.log(x); } - _logf(x) { console.log(x); } +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } -exports.Host = Host; +Object.defineProperty(exports, "__esModule", { value: true }); +__export(require("./ASImport")); +__export(require("./host")); +__export(require("./env")); diff --git a/lib/host/package.json b/lib/host/package.json index 0e9d752202..d7e044938b 100644 --- a/lib/host/package.json +++ b/lib/host/package.json @@ -8,7 +8,8 @@ "build": "tsc", "prepublishOnly": "tsc", "test:build": "../../bin/asc tests/assembly/index.ts --importMemory -b tests/build/untouched.wasm -t tests/build/untouched.wat -d tests/build/index.d.ts --debug", - "test": "ts-node tests" + "test": "ts-node tests", + "debug": "node -r ts-node/register --inspect-brk=5858 tests/index.ts" }, "files": [ "lib/*" diff --git a/lib/host/tests/assembly/index.ts b/lib/host/tests/assembly/index.ts index ef85aab4f1..293d555736 100644 --- a/lib/host/tests/assembly/index.ts +++ b/lib/host/tests/assembly/index.ts @@ -4,14 +4,17 @@ import "allocator/arena"; export { memory }; export class Car { - weight: i32 = 10121; length: i32 = 200002; - constructor(){}; + constructor(public weight: i32){}; private static _i: i32 = 10; - createAnother(): Car { - return new Car(); + createAnother(weight: i32): Car { + return new Car(weight); + } + + combine(c: Car): Car { + return new Car(this.weight + c.weight); } static i(): i32 { return Car._i;} @@ -20,5 +23,5 @@ export class Car { export function runTest(): void{ log("Does the string printing work??"); log(42); - log(new Car()); + log(new Car(42)); } diff --git a/lib/host/tests/build/index.d.ts b/lib/host/tests/build/index.d.ts index 1cc2362215..c3a792fdc9 100644 --- a/lib/host/tests/build/index.d.ts +++ b/lib/host/tests/build/index.d.ts @@ -1,4 +1,4 @@ -declare module ASModule { +declare namespace ASModule { type i8 = number; type i16 = number; type i32 = number; @@ -10,10 +10,11 @@ declare module ASModule { type bool = any; class Car { static i(): i32; - constructor(); - weight: i32; + constructor(weight: i32); length: i32; - createAnother(): u32; + weight: i32; + createAnother(weight: i32): Car; + combine(c: Car): Car; } function runTest(): void; namespace memory { diff --git a/lib/host/tests/build/untouched.wat b/lib/host/tests/build/untouched.wat index e13a3f7fe3..e86651bce5 100644 --- a/lib/host/tests/build/untouched.wat +++ b/lib/host/tests/build/untouched.wat @@ -4,6 +4,7 @@ (type $i_ (func (param i32))) (type $_ (func)) (type $i (func (result i32))) + (type $iii (func (param i32 i32) (result i32))) (type $ii_ (func (param i32 i32))) (import "env" "memory" (memory $0 1)) (data (i32.const 8) "\1f\00\00\00D\00o\00e\00s\00 \00t\00h\00e\00 \00s\00t\00r\00i\00n\00g\00 \00p\00r\00i\00n\00t\00i\00n\00g\00 \00w\00o\00r\00k\00?\00?\00") @@ -24,11 +25,12 @@ (export "table" (table $0)) (export "Car.i" (func $tests/assembly/index/Car.i)) (export "Car#constructor" (func $tests/assembly/index/Car#constructor)) - (export "Car#get:weight" (func $Car#get:weight)) - (export "Car#set:weight" (func $Car#set:weight)) (export "Car#get:length" (func $Car#get:length)) (export "Car#set:length" (func $Car#set:length)) - (export "Car#createAnother" (func $tests/assembly/index/Car#createAnother)) + (export "Car#get:weight" (func $Car#get:weight)) + (export "Car#set:weight" (func $Car#set:weight)) + (export "Car#createAnother!Car" (func $tests/assembly/index/Car#createAnother)) + (export "Car#combine!Car" (func $tests/assembly/index/Car#combine)) (export "runTest" (func $tests/assembly/index/runTest)) (export "memory.compare" (func $~lib/memory/memory.compare)) (export "memory.allocate" (func $~lib/memory/memory.allocate)) @@ -198,7 +200,7 @@ (func $tests/assembly/index/Car.i (; 11 ;) (type $i) (result i32) global.get $tests/assembly/index/Car._i ) - (func $tests/assembly/index/Car#constructor (; 12 ;) (type $ii) (param $0 i32) (result i32) + (func $tests/assembly/index/Car#constructor (; 12 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) local.get $0 i32.eqz if @@ -207,40 +209,51 @@ local.set $0 end local.get $0 - i32.const 10121 + i32.const 200002 i32.store local.get $0 - i32.const 200002 + local.get $1 i32.store offset=4 local.get $0 ) - (func $tests/assembly/index/Car#createAnother (; 13 ;) (type $ii) (param $0 i32) (result i32) + (func $tests/assembly/index/Car#createAnother (; 13 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) i32.const 0 + local.get $1 call $tests/assembly/index/Car#constructor ) - (func $assembly/index/log (; 14 ;) (type $i_) (param $0 i32) + (func $tests/assembly/index/Car#combine (; 14 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + i32.const 0 + local.get $0 + i32.load offset=4 + local.get $1 + i32.load offset=4 + i32.add + call $tests/assembly/index/Car#constructor + ) + (func $assembly/index/log (; 15 ;) (type $i_) (param $0 i32) local.get $0 call $assembly/host/_log_str ) - (func $assembly/index/log (; 15 ;) (type $i_) (param $0 i32) + (func $assembly/index/log (; 16 ;) (type $i_) (param $0 i32) local.get $0 call $assembly/host/_logi ) - (func $assembly/index/log (; 16 ;) (type $i_) (param $0 i32) + (func $assembly/index/log (; 17 ;) (type $i_) (param $0 i32) local.get $0 i32.const 8 call $assembly/host/_log ) - (func $tests/assembly/index/runTest (; 17 ;) (type $_) + (func $tests/assembly/index/runTest (; 18 ;) (type $_) i32.const 8 call $assembly/index/log i32.const 42 call $assembly/index/log i32.const 0 + i32.const 42 call $tests/assembly/index/Car#constructor call $assembly/index/log ) - (func $start (; 18 ;) (type $_) + (func $start (; 19 ;) (type $_) global.get $HEAP_BASE global.get $~lib/internal/allocator/AL_MASK i32.add @@ -252,22 +265,22 @@ global.get $~lib/allocator/arena/startOffset global.set $~lib/allocator/arena/offset ) - (func $null (; 19 ;) (type $_) + (func $null (; 20 ;) (type $_) ) - (func $Car#get:weight (; 20 ;) (type $ii) (param $0 i32) (result i32) + (func $Car#get:length (; 21 ;) (type $ii) (param $0 i32) (result i32) local.get $0 i32.load ) - (func $Car#set:weight (; 21 ;) (type $ii_) (param $0 i32) (param $1 i32) + (func $Car#set:length (; 22 ;) (type $ii_) (param $0 i32) (param $1 i32) local.get $0 local.get $1 i32.store ) - (func $Car#get:length (; 22 ;) (type $ii) (param $0 i32) (result i32) + (func $Car#get:weight (; 23 ;) (type $ii) (param $0 i32) (result i32) local.get $0 i32.load offset=4 ) - (func $Car#set:length (; 23 ;) (type $ii_) (param $0 i32) (param $1 i32) + (func $Car#set:weight (; 24 ;) (type $ii_) (param $0 i32) (param $1 i32) local.get $0 local.get $1 i32.store offset=4 diff --git a/lib/host/tests/index.ts b/lib/host/tests/index.ts index 6be60e032f..b6a6622ea9 100644 --- a/lib/host/tests/index.ts +++ b/lib/host/tests/index.ts @@ -7,9 +7,11 @@ type testMod = typeof ASModule; var wasm = fs.readFileSync(`${__dirname}/build/untouched.wasm`); -let env = new Env({initial:50}) -let imports = ASImport.createImport(Host, env); -console.log(imports); - +// let env = new Env({initial:50}) +let imports = ASImport.createImport(Host, Env); var instance = loader.instantiateBuffer(wasm, imports); instance.runTest(); +let car: ASModule.Car = new instance.Car(10); +let car2 = car.createAnother(32); +let car3 = car.combine(car2); +console.log(`1:${car.weight} 2:${car2.weight} 3:${car3.weight}`); diff --git a/lib/loader/src/index.ts b/lib/loader/src/index.ts index 057034b1bd..5cad0dbf85 100644 --- a/lib/loader/src/index.ts +++ b/lib/loader/src/index.ts @@ -460,13 +460,20 @@ function resolveContext(instance: WebAssembly.Instance, ctx: Insta } const elem = instance.exports[internalName]; const hash = name.indexOf('#'); + let bang = name.indexOf('!'); + let refType = bang > 0 ? name.substring(bang + 1): null; + if (refType){ + name = name.substring(0, bang); + } if (hash >= 0) { // resolve classes const className = name.substring(0, hash); const classElem = curr[className]; if (typeof classElem === 'undefined' || !classElem.prototype) { const ctor: any = function(...args: any[]) { - return ctor.wrap(ctor.prototype.constructor(0, ...args)); + let _args = args.map(e => e[SELF_REF] | e); + debugger; + return ctor.wrap(ctor.prototype.constructor(0, ..._args)); }; ctor.prototype = {}; ctor.wrap = function(thisValue: any) { @@ -476,6 +483,7 @@ function resolveContext(instance: WebAssembly.Instance, ctx: Insta }; if (classElem) { Object.getOwnPropertyNames(classElem).forEach((propName) => { + console.log(classElem.constructor.name + " " + propName) Object.defineProperty(ctor, propName, Object.getOwnPropertyDescriptor(classElem, propName)!); }); } @@ -489,8 +497,11 @@ function resolveContext(instance: WebAssembly.Instance, ctx: Insta const getter = instance.exports[internalName.replace('set:', 'get:')]; const setter = instance.exports[internalName.replace('get:', 'set:')]; Object.defineProperty(curr, name, { - get() { return getter(this[SELF_REF]); }, - set(value) { setter(this[SELF_REF], value); }, + get() { + let ptr = getter(this[SELF_REF]); + return refType ? resolved[refType].wrap(ptr) : ptr; + }, + set(value) { setter(this[SELF_REF], value[SELF_REF] | value); }, enumerable: true, }); } @@ -501,7 +512,9 @@ function resolveContext(instance: WebAssembly.Instance, ctx: Insta Object.defineProperty(curr, name, { value(...args: any[]) { table.setargc(args.length); - return elem(this[SELF_REF], ...args); + let _args = args.map(e => e[SELF_REF] | e); + let ptr = elem(this[SELF_REF], ..._args); + return refType ? resolved[refType].wrap(ptr) : ptr; }, }); } diff --git a/src/compiler.ts b/src/compiler.ts index 763a979337..056f44e9f9 100644 --- a/src/compiler.ts +++ b/src/compiler.ts @@ -494,7 +494,12 @@ export class Compiler extends DiagnosticEmitter { instance = this.ensureTrampoline(instance); this.ensureArgcSet(); } - if (instance.is(CommonFlags.COMPILED)) this.module.addFunctionExport(instance.internalName, prefix + name); + let returnTypePostFix = (!name.endsWith("constructor") && signature.returnType.is(TypeFlags.REFERENCE)) + ? "!" + signature.returnType.toString() + : ""; + if (instance.is(CommonFlags.COMPILED)) { + this.module.addFunctionExport(instance.internalName, prefix + name + returnTypePostFix); + } break; } diff --git a/src/definitions.ts b/src/definitions.ts index 8a899e0f19..3fdf6ee490 100644 --- a/src/definitions.ts +++ b/src/definitions.ts @@ -27,7 +27,8 @@ import { import { Type, - TypeKind + TypeKind, + TypeFlags } from "./types"; import { @@ -464,6 +465,9 @@ export class TSDBuilder extends ExportsWalker { } typeToString(type: Type): string { + if (type.is(TypeFlags.REFERENCE)){ + return type.toString(); + } switch (type.kind) { case TypeKind.I8: return "i8"; case TypeKind.I16: return "i16"; @@ -491,7 +495,7 @@ export class TSDBuilder extends ExportsWalker { build(): string { var sb = this.sb; - sb.push("declare module ASModule {\n"); + sb.push("declare namespace ASModule {\n"); sb.push(" type i8 = number;\n"); sb.push(" type i16 = number;\n"); sb.push(" type i32 = number;\n"); From 1d4d0bf21c8b7991a9d55f6a5058e6ad695481b2 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Tue, 12 Feb 2019 09:05:22 -0500 Subject: [PATCH 33/46] Simplified example and updated README --- lib/host/README.md | 90 ++ lib/host/package-lock.json | 101 -- lib/host/package.json | 10 +- lib/host/src/host.ts | 26 +- lib/host/tests/assembly/index.ts | 4 - lib/host/tests/build/index.d.ts | 2 - lib/host/tests/build/untouched.wat | 52 +- lib/host/tests/index.ts | 2 +- lib/host/tsconfig.json | 5 +- package-lock.json | 1903 ++++++++++++++++++---------- package.json | 3 + 11 files changed, 1346 insertions(+), 852 deletions(-) diff --git a/lib/host/README.md b/lib/host/README.md index 0e21100798..17d7560aa4 100644 --- a/lib/host/README.md +++ b/lib/host/README.md @@ -2,6 +2,8 @@ Each Webassembly module with any declared inputs requires an imports object. Currently this must be handled by the each project, however, there should be a core set of host functions that a WebAssembly module can expect to be present. +## NOTE +Since this package currently modifiers the compiler you must first run `npm run build` at the root of the project to rebuild the compiler. ## ASImport @@ -70,3 +72,91 @@ becomes ``` The loader then will call the `_bindMemory` before the the module is instantiated and then call `_bindInstance` after. + +## Improved loader + +The recently improved loader allows you to demangle the names of functions like `Car#function` into methods on a `Car` object. This makes it easy to interact with the Wasm instance. Most notably you could use a constructor to construct objects, returning the wrapped AssemblyScript object. However, values returned from methods would remain unwrapped integers. This is because only integers and floats can be returned. To solve this problem the complier was edited to add a suffix to functions that returned a reference type, the loader then uses this information to call the correct wrap function. Furthermore, the loader now unwraps objects passed to wrapped AssemblyScript methods. + +For example, consider the following AssemblyScript class: + +```ts +export class Car { + constructor(public weight: i32){}; + + createAnother(weight: i32): Car { + return new Car(weight); + } + + combine(c: Car): Car { + return new Car(this.weight + c.weight); + } +} +``` +This then generates the following WebAssembly: +``` +(export "Car#constructor" (func $tests/assembly/index/Car#constructor)) +(export "Car#get:length" (func $Car#get:length)) +(export "Car#set:length" (func $Car#set:length)) +(export "Car#get:weight" (func $Car#get:weight)) +(export "Car#set:weight" (func $Car#set:weight)) +(export "Car#createAnother!Car" (func $tests/assembly/index/Car#createAnother)) +(export "Car#combine!Car" (func $tests/assembly/index/Car#combine)) +``` +Note that methods that return `Car` now have the suffix `!Car`, which the loader can use to know that the returned value should be wrapped. + +Furthermore, the compiler can generate a type declaration file for the exported class. Previously it would resolve reference types to their underlying integer references. Now, however, it returns the reference types, which allows you to use provide the loader with the proper types. + +To generate a declaration file you use the compiler option `-d ./build/index.d.ts`, which is the case of the `Car` class would generate: + +```ts +declare namespace ASModule { + type i8 = number; + type i16 = number; + type i32 = number; + type u8 = number; + type u16 = number; + type u32 = number; + type f32 = number; + type f64 = number; + type bool = any; + class Car { + constructor(weight: i32); + weight: i32; + createAnother(weight: i32): Car; + combine(c: Car): Car; + } + function runTest(): void; + namespace memory { + function compare(vl: u32, vr: u32, n: u32): i32; + function allocate(size: u32): u32; + function free(ptr: u32): void; + function reset(): void; + } +} +export default ASModule; +``` + +Lastly, this all means that the TypeScript needed to run the compiled AS is: +```ts +import {Host, ASImport, Env} from "../src"; +import * as loader from "../../loader/src"; +import * as fs from "fs"; +import ASModule from "./build"; +type testMod = typeof ASModule; //namespace is a value + + +var wasm = fs.readFileSync(`${__dirname}/build/untouched.wasm`); +let env = new Env({initial:50}) +let imports = ASImport.createImport(Host, env); +var instance = loader.instantiateBuffer(wasm, imports); +//Using imports from above and providing the type `testMod` to the loader. + +let car: ASModule.Car = new instance.Car(10); +//Constructor wraps newly allocated Car. +let car2 = car.createAnother(32); +//Wraps return Car +let car3 = car.combine(car2); +//Unwraps car2 and wraps result. +console.log(`1:${car.weight} 2:${car2.weight} 3:${car3.weight}`); + +``` diff --git a/lib/host/package-lock.json b/lib/host/package-lock.json index 86e8d35457..983a70420d 100644 --- a/lib/host/package-lock.json +++ b/lib/host/package-lock.json @@ -16,112 +16,11 @@ "integrity": "sha1-YtULIBB319TMEJuxytoi/f1FI/s=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" - }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "requires": { - "path-parse": "^1.0.6" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - }, - "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "ts-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", - "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "requires": { - "arrify": "^1.0.0", - "buffer-from": "^1.1.0", - "diff": "^3.1.0", - "make-error": "^1.1.1", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map-support": "^0.5.6", - "yn": "^2.0.0" - } - }, - "ts-transformer-keys": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/ts-transformer-keys/-/ts-transformer-keys-0.3.4.tgz", - "integrity": "sha512-Or2lLODKfg5n03MzC9RfSAeg+l0LrT8r6p8z5JuH0AcCoPVht6+SFCZcKgoN5O/4d9bL6RTqC2lGNTBujUMUaA==" - }, - "ttypescript": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/ttypescript/-/ttypescript-1.5.6.tgz", - "integrity": "sha512-+JbeQt3W+VJMsnvDMVX2/LojRJqLBQzQWE1hI5ZTR2+9EoWXnQ4fUD+tMWCCda1LY2Z5EtwWWrWYmNziw4CYZA==", - "requires": { - "resolve": "^1.9.0", - "ts-node": "^7.0.1" - } - }, "typescript": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", "dev": true - }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" } } } diff --git a/lib/host/package.json b/lib/host/package.json index d7e044938b..21aa09bfe0 100644 --- a/lib/host/package.json +++ b/lib/host/package.json @@ -7,20 +7,18 @@ "scripts": { "build": "tsc", "prepublishOnly": "tsc", - "test:build": "../../bin/asc tests/assembly/index.ts --importMemory -b tests/build/untouched.wasm -t tests/build/untouched.wat -d tests/build/index.d.ts --debug", + "asbuild:test": "../../bin/asc tests/assembly/index.ts --importMemory -b tests/build/untouched.wasm -t tests/build/untouched.wat -d tests/build/index.d.ts --debug", "test": "ts-node tests", "debug": "node -r ts-node/register --inspect-brk=5858 tests/index.ts" }, "files": [ - "lib/*" + "lib/*", + "assembly/*" ], "devDependencies": { "@types/node": "^10.12.24", "@types/webassembly-js-api": "0.0.1", "typescript": "^3.2.2" }, - "dependencies": { - "ts-transformer-keys": "^0.3.4", - "ttypescript": "^1.5.6" - } + "dependencies": {} } diff --git a/lib/host/src/host.ts b/lib/host/src/host.ts index 918e51322a..df514e1767 100644 --- a/lib/host/src/host.ts +++ b/lib/host/src/host.ts @@ -9,22 +9,18 @@ export class Host extends ASImport { _log(start: number, sizeof: number): void { let begin = start >> 2; let size = sizeof >> 2; - if (size == 1 ){ - console.log(start); - } else { - let str = [] - let len = 0; - for (let i = begin; i < begin+size; i++){ - let line = `| ${i} | ${this.memory.I32[i] >> 2}`; - len = Math.max(len, line.length); - str.push(line); - } - let space = " "; - let output = str.map((v: any, i:number, a: any[]): string => v + (space as any).repeat(len - v.length + 1) + "|"); - let dash = "-"; - let line = (dash as any).repeat(len+2); - console.log([line,output.join('\n'+line+'\n'),line].join("\n")); + let str = [] + let len = 0; + for (let i = begin; i < begin+size; i++){ + let line = `| ${i} | ${this.memory.I32[i] >> 2}`; + len = Math.max(len, line.length); + str.push(line); } + let space = " "; + let output = str.map((v: any, i:number, a: any[]): string => v + (space as any).repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = (dash as any).repeat(len+2); + console.log([line,output.join('\n'+line+'\n'),line].join("\n")); } _log_str(x: number): void { diff --git a/lib/host/tests/assembly/index.ts b/lib/host/tests/assembly/index.ts index 293d555736..ae2bd510e0 100644 --- a/lib/host/tests/assembly/index.ts +++ b/lib/host/tests/assembly/index.ts @@ -4,11 +4,8 @@ import "allocator/arena"; export { memory }; export class Car { - length: i32 = 200002; constructor(public weight: i32){}; - private static _i: i32 = 10; - createAnother(weight: i32): Car { return new Car(weight); } @@ -17,7 +14,6 @@ export class Car { return new Car(this.weight + c.weight); } - static i(): i32 { return Car._i;} } export function runTest(): void{ diff --git a/lib/host/tests/build/index.d.ts b/lib/host/tests/build/index.d.ts index c3a792fdc9..705e0c681a 100644 --- a/lib/host/tests/build/index.d.ts +++ b/lib/host/tests/build/index.d.ts @@ -9,9 +9,7 @@ declare namespace ASModule { type f64 = number; type bool = any; class Car { - static i(): i32; constructor(weight: i32); - length: i32; weight: i32; createAnother(weight: i32): Car; combine(c: Car): Car; diff --git a/lib/host/tests/build/untouched.wat b/lib/host/tests/build/untouched.wat index e86651bce5..b14a927aef 100644 --- a/lib/host/tests/build/untouched.wat +++ b/lib/host/tests/build/untouched.wat @@ -3,7 +3,6 @@ (type $ii (func (param i32) (result i32))) (type $i_ (func (param i32))) (type $_ (func)) - (type $i (func (result i32))) (type $iii (func (param i32 i32) (result i32))) (type $ii_ (func (param i32 i32))) (import "env" "memory" (memory $0 1)) @@ -19,14 +18,10 @@ (global $~lib/internal/allocator/MAX_SIZE_32 i32 (i32.const 1073741824)) (global $~lib/allocator/arena/startOffset (mut i32) (i32.const 0)) (global $~lib/allocator/arena/offset (mut i32) (i32.const 0)) - (global $tests/assembly/index/Car._i (mut i32) (i32.const 10)) (global $HEAP_BASE i32 (i32.const 76)) (export "memory" (memory $0)) (export "table" (table $0)) - (export "Car.i" (func $tests/assembly/index/Car.i)) (export "Car#constructor" (func $tests/assembly/index/Car#constructor)) - (export "Car#get:length" (func $Car#get:length)) - (export "Car#set:length" (func $Car#set:length)) (export "Car#get:weight" (func $Car#get:weight)) (export "Car#set:weight" (func $Car#set:weight)) (export "Car#createAnother!Car" (func $tests/assembly/index/Car#createAnother)) @@ -197,53 +192,47 @@ call $~lib/allocator/arena/__memory_reset return ) - (func $tests/assembly/index/Car.i (; 11 ;) (type $i) (result i32) - global.get $tests/assembly/index/Car._i - ) - (func $tests/assembly/index/Car#constructor (; 12 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $tests/assembly/index/Car#constructor (; 11 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) local.get $0 i32.eqz if - i32.const 8 + i32.const 4 call $~lib/memory/memory.allocate local.set $0 end local.get $0 - i32.const 200002 - i32.store - local.get $0 local.get $1 - i32.store offset=4 + i32.store local.get $0 ) - (func $tests/assembly/index/Car#createAnother (; 13 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $tests/assembly/index/Car#createAnother (; 12 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) i32.const 0 local.get $1 call $tests/assembly/index/Car#constructor ) - (func $tests/assembly/index/Car#combine (; 14 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) + (func $tests/assembly/index/Car#combine (; 13 ;) (type $iii) (param $0 i32) (param $1 i32) (result i32) i32.const 0 local.get $0 - i32.load offset=4 + i32.load local.get $1 - i32.load offset=4 + i32.load i32.add call $tests/assembly/index/Car#constructor ) - (func $assembly/index/log (; 15 ;) (type $i_) (param $0 i32) + (func $assembly/index/log (; 14 ;) (type $i_) (param $0 i32) local.get $0 call $assembly/host/_log_str ) - (func $assembly/index/log (; 16 ;) (type $i_) (param $0 i32) + (func $assembly/index/log (; 15 ;) (type $i_) (param $0 i32) local.get $0 call $assembly/host/_logi ) - (func $assembly/index/log (; 17 ;) (type $i_) (param $0 i32) + (func $assembly/index/log (; 16 ;) (type $i_) (param $0 i32) local.get $0 - i32.const 8 + i32.const 4 call $assembly/host/_log ) - (func $tests/assembly/index/runTest (; 18 ;) (type $_) + (func $tests/assembly/index/runTest (; 17 ;) (type $_) i32.const 8 call $assembly/index/log i32.const 42 @@ -253,7 +242,7 @@ call $tests/assembly/index/Car#constructor call $assembly/index/log ) - (func $start (; 19 ;) (type $_) + (func $start (; 18 ;) (type $_) global.get $HEAP_BASE global.get $~lib/internal/allocator/AL_MASK i32.add @@ -265,24 +254,15 @@ global.get $~lib/allocator/arena/startOffset global.set $~lib/allocator/arena/offset ) - (func $null (; 20 ;) (type $_) + (func $null (; 19 ;) (type $_) ) - (func $Car#get:length (; 21 ;) (type $ii) (param $0 i32) (result i32) + (func $Car#get:weight (; 20 ;) (type $ii) (param $0 i32) (result i32) local.get $0 i32.load ) - (func $Car#set:length (; 22 ;) (type $ii_) (param $0 i32) (param $1 i32) + (func $Car#set:weight (; 21 ;) (type $ii_) (param $0 i32) (param $1 i32) local.get $0 local.get $1 i32.store ) - (func $Car#get:weight (; 23 ;) (type $ii) (param $0 i32) (result i32) - local.get $0 - i32.load offset=4 - ) - (func $Car#set:weight (; 24 ;) (type $ii_) (param $0 i32) (param $1 i32) - local.get $0 - local.get $1 - i32.store offset=4 - ) ) diff --git a/lib/host/tests/index.ts b/lib/host/tests/index.ts index b6a6622ea9..41807d405f 100644 --- a/lib/host/tests/index.ts +++ b/lib/host/tests/index.ts @@ -1,4 +1,4 @@ -import {Host,ASImport, Env} from "../src"; +import {Host, ASImport, Env} from "../src"; import * as loader from "../../loader/src"; import * as fs from "fs"; import ASModule from "./build"; diff --git a/lib/host/tsconfig.json b/lib/host/tsconfig.json index 74f2abaf14..d94961912a 100644 --- a/lib/host/tsconfig.json +++ b/lib/host/tsconfig.json @@ -6,10 +6,7 @@ "moduleResolution": "node", "outDir": "lib", "target": "es6", - "strict": true, - "plugins": [ - { "transform": "ts-transformer-keys/transformer" } - ] + "strict": true }, "include": [ "src/**/*.ts" diff --git a/package-lock.json b/package-lock.json index 9042f4e19f..167da0bbd5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "integrity": "sha512-DsknoBvD8s+RFfSGjmERJ7ZOP1HI0UZRA3FSI+Zakhrc/Gy26YQsLI+m5V5DHxroHRJqCDLKJp7Hixn8zyaF7g==", "dev": true, "requires": { - "@types/node": "10.12.21" + "@types/node": "*" } }, "@types/glob": { @@ -30,9 +30,9 @@ "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", "dev": true, "requires": { - "@types/events": "1.2.0", - "@types/minimatch": "3.0.3", - "@types/node": "10.12.21" + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" } }, "@types/handlebars": { @@ -77,8 +77,8 @@ "integrity": "sha512-vs1hCC8RxLHRu2bwumNyYRNrU3o8BtZhLysH5A4I98iYmA2APl6R3uNQb5ihl+WiwH0xdC9LLO+vRrXLs/Kyxg==", "dev": true, "requires": { - "@types/glob": "7.1.1", - "@types/node": "10.12.21" + "@types/glob": "*", + "@types/node": "*" } }, "@webassemblyjs/ast": { @@ -155,7 +155,7 @@ "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", "dev": true, "requires": { - "@xtuc/ieee754": "1.2.0" + "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { @@ -283,10 +283,10 @@ "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ajv-errors": { @@ -313,7 +313,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "anymatch": { @@ -322,8 +322,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "aproba": { @@ -338,7 +338,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -377,9 +377,9 @@ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -420,7 +420,7 @@ "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { - "lodash": "4.17.11" + "lodash": "^4.17.10" } }, "async-each": { @@ -441,9 +441,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "ansi-styles": { @@ -458,11 +458,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "supports-color": { @@ -484,13 +484,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -499,7 +499,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -508,7 +508,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -517,7 +517,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -526,9 +526,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -573,7 +573,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -583,16 +583,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -601,7 +601,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -624,12 +624,12 @@ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { @@ -638,9 +638,9 @@ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.2", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -649,10 +649,10 @@ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { @@ -661,8 +661,8 @@ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -671,13 +671,13 @@ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.4.1", - "inherits": "2.0.3", - "parse-asn1": "5.1.3" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -686,7 +686,7 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.8" + "pako": "~1.0.5" } }, "buffer": { @@ -695,9 +695,9 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.3.0", - "ieee754": "1.1.12", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, "buffer-from": { @@ -730,20 +730,20 @@ "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", "dev": true, "requires": { - "bluebird": "3.5.3", - "chownr": "1.1.1", - "figgy-pudding": "3.5.1", - "glob": "7.1.3", - "graceful-fs": "4.1.15", - "lru-cache": "5.1.1", - "mississippi": "3.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.3", - "ssri": "6.0.1", - "unique-filename": "1.1.1", - "y18n": "4.0.0" + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" } }, "cache-base": { @@ -752,15 +752,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "camelcase": { @@ -775,9 +775,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "chokidar": { @@ -786,18 +786,19 @@ "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.2", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "lodash.debounce": "4.0.8", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.1.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" } }, "chownr": { @@ -812,7 +813,7 @@ "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.9.0" } }, "cipher-base": { @@ -821,8 +822,8 @@ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "class-utils": { @@ -831,10 +832,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -843,7 +844,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -854,9 +855,9 @@ "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -871,7 +872,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -888,8 +889,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { @@ -936,10 +937,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, "console-browserify": { @@ -948,7 +949,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -963,12 +964,12 @@ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.3", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" } }, "copy-descriptor": { @@ -989,8 +990,8 @@ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.1" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { @@ -999,11 +1000,11 @@ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "md5.js": "1.3.5", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -1012,12 +1013,12 @@ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.3", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { @@ -1026,11 +1027,11 @@ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "nice-try": "1.0.5", - "path-key": "2.0.1", - "semver": "5.6.0", - "shebang-command": "1.2.0", - "which": "1.3.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-browserify": { @@ -1039,17 +1040,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.3", - "pbkdf2": "3.0.17", - "public-encrypt": "4.0.3", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "cyclist": { @@ -1091,8 +1092,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1101,7 +1102,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1110,7 +1111,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1119,9 +1120,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -1132,8 +1133,8 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "detect-file": { @@ -1154,9 +1155,9 @@ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "domain-browser": { @@ -1171,10 +1172,10 @@ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, "elliptic": { @@ -1183,13 +1184,13 @@ "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.7", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emojis-list": { @@ -1204,7 +1205,7 @@ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "enhanced-resolve": { @@ -1213,9 +1214,9 @@ "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", "dev": true, "requires": { - "graceful-fs": "4.1.15", - "memory-fs": "0.4.1", - "tapable": "1.1.1" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" } }, "errno": { @@ -1224,7 +1225,7 @@ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "escape-string-regexp": { @@ -1239,8 +1240,8 @@ "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", "dev": true, "requires": { - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "esprima": { @@ -1255,7 +1256,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -1282,8 +1283,8 @@ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "md5.js": "1.3.5", - "safe-buffer": "5.1.2" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { @@ -1292,13 +1293,13 @@ "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "cross-spawn": "6.0.5", - "get-stream": "4.1.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "expand-brackets": { @@ -1307,13 +1308,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -1322,7 +1323,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -1331,7 +1332,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1342,7 +1343,7 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" } }, "extend-shallow": { @@ -1351,8 +1352,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -1361,7 +1362,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -1372,14 +1373,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -1388,7 +1389,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -1397,7 +1398,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -1406,7 +1407,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1415,7 +1416,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1424,9 +1425,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -1455,10 +1456,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -1467,7 +1468,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -1478,9 +1479,9 @@ "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "3.0.0" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^3.0.0" } }, "find-up": { @@ -1489,7 +1490,7 @@ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "locate-path": "3.0.0" + "locate-path": "^3.0.0" } }, "findup-sync": { @@ -1498,10 +1499,10 @@ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", "dev": true, "requires": { - "detect-file": "1.0.0", - "is-glob": "3.1.0", - "micromatch": "3.1.10", - "resolve-dir": "1.0.1" + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" }, "dependencies": { "is-glob": { @@ -1510,7 +1511,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -1521,8 +1522,8 @@ "integrity": "sha512-6MHED/cmsyux1G4/Cek2Z776y9t7WCNd3h2h/HW91vFeU7pzMhA8XvAlDhHcanG5IWuIh/xcC7JASY4WQpG6xg==", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "3.1.1" + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, "dependencies": { "readable-stream": { @@ -1531,9 +1532,9 @@ "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", "dev": true, "requires": { - "inherits": "2.0.3", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } @@ -1550,7 +1551,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "from2": { @@ -1559,8 +1560,8 @@ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" } }, "fs-extra": { @@ -1569,9 +1570,9 @@ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "requires": { - "graceful-fs": "4.1.15", - "jsonfile": "4.0.0", - "universalify": "0.1.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "fs-write-stream-atomic": { @@ -1580,10 +1581,10 @@ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { - "graceful-fs": "4.1.15", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" } }, "fs.realpath": { @@ -1591,6 +1592,535 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fsevents": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.9.2", + "node-pre-gyp": "^0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "glob": { + "version": "7.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.24", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.3.5", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.6.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.3", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.3", + "bundled": true, + "dev": true + } + } + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -1603,7 +2133,7 @@ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "pump": "3.0.0" + "pump": "^3.0.0" } }, "get-value": { @@ -1617,12 +2147,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-parent": { @@ -1631,8 +2161,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -1641,7 +2171,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -1652,9 +2182,9 @@ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "global-prefix": "1.0.2", - "is-windows": "1.0.2", - "resolve-dir": "1.0.1" + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" } }, "global-prefix": { @@ -1663,11 +2193,11 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "homedir-polyfill": "1.0.1", - "ini": "1.3.5", - "is-windows": "1.0.2", - "which": "1.3.1" + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" } }, "graceful-fs": { @@ -1682,10 +2212,10 @@ "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", "dev": true, "requires": { - "async": "2.6.1", - "optimist": "0.6.1", - "source-map": "0.6.1", - "uglify-js": "3.4.9" + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" }, "dependencies": { "source-map": { @@ -1702,7 +2232,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -1717,9 +2247,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -1728,8 +2258,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { @@ -1738,7 +2268,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1749,8 +2279,8 @@ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { @@ -1759,8 +2289,8 @@ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, "highlight.js": { @@ -1775,9 +2305,9 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.7", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "homedir-polyfill": { @@ -1786,7 +2316,7 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "https-browserify": { @@ -1813,8 +2343,8 @@ "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dev": true, "requires": { - "pkg-dir": "3.0.0", - "resolve-cwd": "2.0.0" + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" } }, "imurmurhash": { @@ -1834,8 +2364,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -1867,7 +2397,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1876,7 +2406,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1887,7 +2417,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.13.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -1902,7 +2432,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1911,7 +2441,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1922,9 +2452,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -1959,7 +2489,7 @@ "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -1968,7 +2498,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1977,7 +2507,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1988,7 +2518,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "is-stream": { @@ -2033,8 +2563,8 @@ "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "json-parse-better-errors": { @@ -2055,7 +2585,7 @@ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "minimist": "1.2.0" + "minimist": "^1.2.0" } }, "jsonfile": { @@ -2064,7 +2594,7 @@ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "graceful-fs": "4.1.15" + "graceful-fs": "^4.1.6" } }, "kind-of": { @@ -2079,7 +2609,7 @@ "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "2.0.0" + "invert-kv": "^2.0.0" } }, "loader-runner": { @@ -2094,9 +2624,9 @@ "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "dev": true, "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" } }, "locate-path": { @@ -2105,8 +2635,8 @@ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "3.0.0", - "path-exists": "3.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -2132,7 +2662,7 @@ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "yallist": "3.0.3" + "yallist": "^3.0.2" } }, "make-dir": { @@ -2141,7 +2671,7 @@ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "make-error": { @@ -2156,7 +2686,7 @@ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { - "p-defer": "1.0.0" + "p-defer": "^1.0.0" } }, "map-cache": { @@ -2171,7 +2701,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "marked": { @@ -2186,9 +2716,9 @@ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "mem": { @@ -2197,9 +2727,9 @@ "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", "dev": true, "requires": { - "map-age-cleaner": "0.1.3", - "mimic-fn": "1.2.0", - "p-is-promise": "2.0.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^1.0.0", + "p-is-promise": "^2.0.0" } }, "memory-fs": { @@ -2208,8 +2738,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "micromatch": { @@ -2218,19 +2748,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, "miller-rabin": { @@ -2239,8 +2769,8 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mimic-fn": { @@ -2266,7 +2796,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -2281,16 +2811,16 @@ "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.7.1", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.1.0", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "3.0.0", - "pumpify": "1.5.1", - "stream-each": "1.2.3", - "through2": "2.0.5" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } }, "mixin-deep": { @@ -2299,8 +2829,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -2309,7 +2839,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -2337,12 +2867,12 @@ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.3", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" } }, "ms": { @@ -2351,23 +2881,30 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "nan": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", + "dev": true, + "optional": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, "neo-async": { @@ -2388,28 +2925,28 @@ "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", "dev": true, "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "3.0.0", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.2", - "stream-http": "2.8.3", - "string_decoder": "1.1.1", - "timers-browserify": "2.0.10", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.11.1", + "url": "^0.11.0", + "util": "^0.11.0", "vm-browserify": "0.0.4" }, "dependencies": { @@ -2427,7 +2964,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "npm-run-path": { @@ -2436,7 +2973,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { @@ -2451,9 +2988,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -2462,7 +2999,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "kind-of": { @@ -2471,7 +3008,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -2482,7 +3019,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.pick": { @@ -2491,7 +3028,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "once": { @@ -2499,7 +3036,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "optimist": { @@ -2508,8 +3045,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.10", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "minimist": { @@ -2532,9 +3069,9 @@ "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "1.0.0", - "lcid": "2.0.0", - "mem": "4.1.0" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "p-defer": { @@ -2561,7 +3098,7 @@ "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { - "p-try": "2.0.0" + "p-try": "^2.0.0" } }, "p-locate": { @@ -2570,7 +3107,7 @@ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "2.1.0" + "p-limit": "^2.0.0" } }, "p-try": { @@ -2591,9 +3128,9 @@ "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "dev": true, "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, "parse-asn1": { @@ -2602,12 +3139,12 @@ "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", "dev": true, "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.17", - "safe-buffer": "5.1.2" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-passwd": { @@ -2663,11 +3200,11 @@ "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.1.2", - "sha.js": "2.4.11" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "pify": { @@ -2682,7 +3219,7 @@ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "3.0.0" + "find-up": "^3.0.0" } }, "posix-character-classes": { @@ -2727,12 +3264,12 @@ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.3", - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "pump": { @@ -2741,8 +3278,8 @@ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { @@ -2751,9 +3288,9 @@ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "3.7.1", - "inherits": "2.0.3", - "pump": "2.0.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" }, "dependencies": { "pump": { @@ -2762,8 +3299,8 @@ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } } } @@ -2792,7 +3329,7 @@ "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -2801,8 +3338,8 @@ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.2" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "readable-stream": { @@ -2811,13 +3348,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -2826,9 +3363,9 @@ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "graceful-fs": "4.1.15", - "micromatch": "3.1.10", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" } }, "rechoir": { @@ -2837,7 +3374,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.8.1" + "resolve": "^1.1.6" } }, "regex-not": { @@ -2846,8 +3383,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "remove-trailing-separator": { @@ -2886,7 +3423,7 @@ "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", "dev": true, "requires": { - "path-parse": "1.0.6" + "path-parse": "^1.0.5" } }, "resolve-cwd": { @@ -2895,7 +3432,7 @@ "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "resolve-from": "3.0.0" + "resolve-from": "^3.0.0" } }, "resolve-dir": { @@ -2904,8 +3441,8 @@ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "2.0.2", - "global-modules": "1.0.0" + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" } }, "resolve-from": { @@ -2932,7 +3469,7 @@ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "7.1.3" + "glob": "^7.1.3" } }, "ripemd160": { @@ -2941,8 +3478,8 @@ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "run-queue": { @@ -2951,7 +3488,7 @@ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "aproba": "1.2.0" + "aproba": "^1.1.1" } }, "safe-buffer": { @@ -2966,7 +3503,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "schema-utils": { @@ -2975,8 +3512,8 @@ "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { - "ajv": "6.8.1", - "ajv-keywords": "3.3.0" + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" } }, "semver": { @@ -3003,10 +3540,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -3015,7 +3552,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -3032,8 +3569,8 @@ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.2" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shebang-command": { @@ -3042,7 +3579,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -3057,9 +3594,9 @@ "integrity": "sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ==", "dev": true, "requires": { - "glob": "7.1.3", - "interpret": "1.1.0", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } }, "signal-exit": { @@ -3074,14 +3611,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "define-property": { @@ -3090,7 +3627,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -3099,7 +3636,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -3110,9 +3647,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -3121,7 +3658,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -3130,7 +3667,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -3139,7 +3676,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -3148,9 +3685,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } @@ -3161,7 +3698,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" }, "dependencies": { "kind-of": { @@ -3170,7 +3707,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3193,11 +3730,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "2.1.2", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { @@ -3206,8 +3743,8 @@ "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "dev": true, "requires": { - "buffer-from": "1.1.1", - "source-map": "0.6.1" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { "source-map": { @@ -3230,7 +3767,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -3245,7 +3782,7 @@ "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "figgy-pudding": "3.5.1" + "figgy-pudding": "^3.5.1" } }, "static-extend": { @@ -3254,8 +3791,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -3264,7 +3801,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -3275,8 +3812,8 @@ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.6" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-each": { @@ -3285,8 +3822,8 @@ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, "stream-http": { @@ -3295,11 +3832,11 @@ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "stream-shift": { @@ -3314,8 +3851,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -3330,7 +3867,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -3341,7 +3878,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { @@ -3350,7 +3887,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-eof": { @@ -3365,7 +3902,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "tapable": { @@ -3380,9 +3917,9 @@ "integrity": "sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==", "dev": true, "requires": { - "commander": "2.17.1", - "source-map": "0.6.1", - "source-map-support": "0.5.9" + "commander": "~2.17.1", + "source-map": "~0.6.1", + "source-map-support": "~0.5.9" }, "dependencies": { "commander": { @@ -3405,14 +3942,14 @@ "integrity": "sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg==", "dev": true, "requires": { - "cacache": "11.3.2", - "find-cache-dir": "2.0.0", - "schema-utils": "1.0.0", - "serialize-javascript": "1.6.1", - "source-map": "0.6.1", - "terser": "3.16.1", - "webpack-sources": "1.3.0", - "worker-farm": "1.6.0" + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.16.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" }, "dependencies": { "schema-utils": { @@ -3421,9 +3958,9 @@ "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "ajv": "6.8.1", - "ajv-errors": "1.0.1", - "ajv-keywords": "3.3.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, "source-map": { @@ -3440,8 +3977,8 @@ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, "timers-browserify": { @@ -3450,7 +3987,7 @@ "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "to-arraybuffer": { @@ -3465,7 +4002,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -3474,7 +4011,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3485,10 +4022,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -3497,8 +4034,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "ts-loader": { @@ -3507,11 +4044,11 @@ "integrity": "sha512-KwF1SplmOJepnoZ4eRIloH/zXL195F51skt7reEsS6jvDqzgc/YSbz9b8E07GxIUwLXdcD4ssrJu6v8CwaTafA==", "dev": true, "requires": { - "chalk": "2.4.2", - "enhanced-resolve": "4.1.0", - "loader-utils": "1.2.3", - "micromatch": "3.1.10", - "semver": "5.6.0" + "chalk": "^2.3.0", + "enhanced-resolve": "^4.0.0", + "loader-utils": "^1.0.2", + "micromatch": "^3.1.4", + "semver": "^5.0.1" } }, "ts-node": { @@ -3520,14 +4057,14 @@ "integrity": "sha512-ZNT+OEGfUNVMGkpIaDJJ44Zq3Yr0bkU/ugN1PHbU+/01Z7UV1fsELRiTx1KuQNvQ1A3pGh3y25iYF6jXgxV21A==", "dev": true, "requires": { - "arrify": "1.0.1", - "buffer-from": "1.1.1", - "diff": "3.5.0", - "make-error": "1.3.5", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map-support": "0.5.9", - "yn": "2.0.0" + "arrify": "^1.0.0", + "buffer-from": "^1.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.5.6", + "yn": "^2.0.0" }, "dependencies": { "diff": { @@ -3550,18 +4087,18 @@ "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "builtin-modules": "1.1.1", - "chalk": "2.4.2", - "commander": "2.19.0", - "diff": "3.5.0", - "glob": "7.1.3", - "js-yaml": "3.12.1", - "minimatch": "3.0.4", - "resolve": "1.8.1", - "semver": "5.6.0", - "tslib": "1.9.3", - "tsutils": "2.29.0" + "babel-code-frame": "^6.22.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^3.2.0", + "glob": "^7.1.1", + "js-yaml": "^3.7.0", + "minimatch": "^3.0.4", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.27.2" }, "dependencies": { "diff": { @@ -3578,7 +4115,7 @@ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", "dev": true, "requires": { - "tslib": "1.9.3" + "tslib": "^1.8.1" } }, "tty-browserify": { @@ -3599,23 +4136,23 @@ "integrity": "sha512-jQWtvPcV+0fiLZAXFEe70v5gqjDO6pJYJz4mlTtmGJeW2KRoIU/BEfktma6Uj8Xii7UakuZjbxFewl3UYOkU/w==", "dev": true, "requires": { - "@types/fs-extra": "5.0.4", - "@types/handlebars": "4.0.39", - "@types/highlight.js": "9.12.3", - "@types/lodash": "4.14.118", - "@types/marked": "0.4.2", + "@types/fs-extra": "^5.0.3", + "@types/handlebars": "^4.0.38", + "@types/highlight.js": "^9.12.3", + "@types/lodash": "^4.14.110", + "@types/marked": "^0.4.0", "@types/minimatch": "3.0.3", - "@types/shelljs": "0.8.0", - "fs-extra": "7.0.1", - "handlebars": "4.0.12", - "highlight.js": "9.13.1", - "lodash": "4.17.11", - "marked": "0.4.0", - "minimatch": "3.0.4", - "progress": "2.0.1", - "shelljs": "0.8.2", - "typedoc-default-themes": "0.5.0", - "typescript": "3.1.6" + "@types/shelljs": "^0.8.0", + "fs-extra": "^7.0.0", + "handlebars": "^4.0.6", + "highlight.js": "^9.0.0", + "lodash": "^4.17.10", + "marked": "^0.4.0", + "minimatch": "^3.0.0", + "progress": "^2.0.0", + "shelljs": "^0.8.2", + "typedoc-default-themes": "^0.5.0", + "typescript": "3.1.x" }, "dependencies": { "typescript": { @@ -3651,8 +4188,8 @@ "dev": true, "optional": true, "requires": { - "commander": "2.17.1", - "source-map": "0.6.1" + "commander": "~2.17.1", + "source-map": "~0.6.1" }, "dependencies": { "commander": { @@ -3677,10 +4214,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -3689,7 +4226,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -3698,10 +4235,10 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } @@ -3712,7 +4249,7 @@ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { - "unique-slug": "2.0.1" + "unique-slug": "^2.0.0" } }, "unique-slug": { @@ -3721,7 +4258,7 @@ "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", "dev": true, "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" } }, "universalify": { @@ -3736,8 +4273,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -3746,9 +4283,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -3782,7 +4319,7 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" } }, "urix": { @@ -3851,9 +4388,9 @@ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "chokidar": "2.0.4", - "graceful-fs": "4.1.15", - "neo-async": "2.6.0" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "webpack": { @@ -3866,26 +4403,26 @@ "@webassemblyjs/helper-module-context": "1.7.11", "@webassemblyjs/wasm-edit": "1.7.11", "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "6.0.7", - "acorn-dynamic-import": "4.0.0", - "ajv": "6.8.1", - "ajv-keywords": "3.3.0", - "chrome-trace-event": "1.0.0", - "enhanced-resolve": "4.1.0", - "eslint-scope": "4.0.0", - "json-parse-better-errors": "1.0.2", - "loader-runner": "2.4.0", - "loader-utils": "1.2.3", - "memory-fs": "0.4.1", - "micromatch": "3.1.10", - "mkdirp": "0.5.1", - "neo-async": "2.6.0", - "node-libs-browser": "2.2.0", - "schema-utils": "0.4.7", - "tapable": "1.1.1", - "terser-webpack-plugin": "1.2.2", - "watchpack": "1.6.0", - "webpack-sources": "1.3.0" + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^0.4.4", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" } }, "webpack-cli": { @@ -3894,17 +4431,17 @@ "integrity": "sha512-Ik3SjV6uJtWIAN5jp5ZuBMWEAaP5E4V78XJ2nI+paFPh8v4HPSwo/myN0r29Xc/6ZKnd2IdrAlpSgNOu2CDQ6Q==", "dev": true, "requires": { - "chalk": "2.4.2", - "cross-spawn": "6.0.5", - "enhanced-resolve": "4.1.0", - "findup-sync": "2.0.0", - "global-modules": "1.0.0", - "import-local": "2.0.0", - "interpret": "1.1.0", - "loader-utils": "1.2.3", - "supports-color": "5.5.0", - "v8-compile-cache": "2.0.2", - "yargs": "12.0.5" + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.0", + "findup-sync": "^2.0.0", + "global-modules": "^1.0.0", + "import-local": "^2.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.5.0", + "v8-compile-cache": "^2.0.2", + "yargs": "^12.0.4" } }, "webpack-sources": { @@ -3913,8 +4450,8 @@ "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", "dev": true, "requires": { - "source-list-map": "2.0.1", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -3931,7 +4468,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -3952,7 +4489,7 @@ "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "dev": true, "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "wrap-ansi": { @@ -3961,8 +4498,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "is-fullwidth-code-point": { @@ -3971,7 +4508,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "string-width": { @@ -3980,9 +4517,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -4016,18 +4553,18 @@ "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { - "cliui": "4.1.0", - "decamelize": "1.2.0", - "find-up": "3.0.0", - "get-caller-file": "1.0.3", - "os-locale": "3.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "4.0.0", - "yargs-parser": "11.1.1" + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" } }, "yargs-parser": { @@ -4036,8 +4573,8 @@ "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { - "camelcase": "5.0.0", - "decamelize": "1.2.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, "yn": { diff --git a/package.json b/package.json index 930d3e2768..3d6724c7d4 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,9 @@ "lib/loader/index.d.ts", "lib/loader/index.js", "lib/loader/README.md", + "lib/host/assembly/index.ts", + "lib/host/lib/index.js", + "lib/host/lib/index.d.ts", "bin/", "cli/", "dist/", From ae45083032617c496105cb7e4013790cacf6eb1b Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Tue, 12 Feb 2019 09:07:25 -0500 Subject: [PATCH 34/46] Updated compiler for RefType suffix --- dist/asc.js.map | 2 +- dist/assemblyscript.js | 4 ++-- dist/assemblyscript.js.map | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/asc.js.map b/dist/asc.js.map index 82f43fab99..10097c0830 100644 --- a/dist/asc.js.map +++ b/dist/asc.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://asc/webpack/universalModuleDefinition","webpack://asc/webpack/bootstrap","webpack://asc/../node_modules/node-libs-browser/mock/process.js","webpack://asc/../node_modules/path-browserify/index.js","webpack://asc/../node_modules/webpack/buildin/global.js","webpack://asc/./asc.js","webpack://asc/../node_modules/@protobufjs/utf8/index.js","webpack://asc/./util/colors.js","webpack://asc/./util/options.js","webpack://asc/./util/mkdirp.js","webpack://asc/external \"assemblyscript\"","webpack://asc/. sync","webpack://asc/../node_modules/browser-process-hrtime/index.js"],"names":["root","factory","exports","module","require","e","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE__10__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","path","cwd","nextTick","fn","setTimeout","platform","arch","execPath","title","pid","browser","env","argv","binding","Error","chdir","dir","resolve","exit","kill","umask","dlopen","uptime","memoryUsage","uvCounters","features","process","normalizeArray","parts","allowAboveRoot","up","length","last","splice","unshift","splitPathRe","splitPath","filename","exec","slice","filter","xs","f","res","push","resolvedPath","resolvedAbsolute","arguments","TypeError","charAt","split","join","normalize","isAbsolute","trailingSlash","substr","paths","Array","index","relative","from","to","trim","arr","start","end","fromParts","toParts","Math","min","samePartsLength","outputParts","concat","sep","delimiter","dirname","result","basename","ext","extname","str","len","g","Function","window","global","fs","utf8","colorsUtil","optionsUtil","mkdirp","EOL","removeAllListeners","assemblyscript","isDev","code","register","project","e_ts","eval","stack","isBundle","version","options","sourceMapRoot","libraryPrefix","LIBRARY_PREFIX","defaultOptimizeLevel","defaultShrinkLevel","libraryFiles","allocator/arena","allocator/buddy","allocator/emscripten","allocator/system","allocator/tlsf","array","arraybuffer","bindings/Date","bindings/Math","builtins","collector/itcm","dataview","date","diagnostics","error","gc","internal/allocator","internal/arraybuffer","internal/hash","internal/memory","internal/number","internal/sort","internal/string","internal/typedarray","iterator","map","math","memory","number","polyfills","regexp","set","string","symbol","table","typedarray","vector","libDir","libFiles","sync","bundled","forEach","file","replace","readFileSync","definitionFiles","assembly","portable","stdDir","compileString","sources","input.ts","output","stdout","createMemoryStream","stderr","keys","val","isArray","String","main","readFile","writeFile","contents","listFiles","callback","readFileNode","writeFileNode","listFilesNode","stats","createStats","opts","parse","args","noColors","supported","unknown","arg","write","yellow","trailing","err","red","help","out","color","white","cyan","baseDir","transforms","transform","parser","noLib","parseCount","parseTime","measure","parseFile","libPath","indexOf","customLibDirs","lib","apply","k","endsWith","j","libText","parseBacklog","sourcePath","sourceText","nextFile","startsWith","plainName","substring","indexName","checkDiagnostics","applyTransform","program","finishParsing","optimizeLevel","shrinkLevel","optimize","max","compilerOptions","createOptions","setTarget","setNoTreeShaking","noTreeShaking","setNoAssert","noAssert","setImportMemory","importMemory","setImportTable","importTable","setMemoryBase","memoryBase","setSourceMap","sourceMap","setOptimizeLevelHints","setGlobalAlias","use","aliases","part","alias","enable","flag","toUpperCase","enableFeature","compileCount","compileTime","compileProgram","dispose","validate","validateCount","validateTime","trapMode","optimizeCount","optimizeTime","runPasses","setOptimizeLevel","setShrinkLevel","setDebugInfo","debug","pass","noEmit","hasStdout","hasOutput","outFile","test","textFile","asmjsFile","binaryFile","wasm","sourceMapURL","emitCount","emitTime","toBinary","writeStdout","JSON","sourceRoot","text","stdName","sourceContents","stringify","asm","toAsmjs","idlFile","idl","buildIDL","tsdFile","tsd","buildTSD","wat","toText","printStats","readCount","readTime","encoding","writeCount","writeTime","writeFileSync","files","readdirSync","used","argumentSubstitutions","-O","-Os","-Oz","-O0","-O0s","-O0z","-O1","-O1s","-O1z","-O2","-O2s","-O2z","-O3","-O3s","-O3z","emitter","diagnostic","hasErrors","nextDiagnostic","formatDiagnostic","isTTY","isError","hrtime","times","formatTime","time","toFixed","format","count","allocBuffer","Buffer","allocUnsafe","Uint8Array","stream","chunk","buffer","reset","toBuffer","offset","toString","read","tscOptions","alwaysStrict","noImplicitAny","noImplicitReturns","noImplicitThis","noEmitOnError","strictNullChecks","experimentalDecorators","target","types","allowJs","charCodeAt","fromCharCode","c1","c2","proc","isCI","base","colors","gray","GRAY","RESET","RED","green","GREEN","YELLOW","blue","BLUE","magenta","MAGENTA","CYAN","WHITE","config","option","default","match","type","parseInt","parseFloat","indent","padding","eol","sb","description","line","_0777","made","undefined","mkdirSync","err0","stat","statSync","err1","isDirectory","webpackEmptyContext","req","id","previousTimestamp","clocktime","performanceNow","performance","seconds","floor","nanoseconds","now","mozNow","msNow","oNow","webkitNow","Date","getTime"],"mappings":"CAAA,SAAAA,EAAAC,GACA,iBAAAC,SAAA,iBAAAC,OACAA,OAAAD,QAAAD,EAAA,WAA0E,IAAM,OAAAG,QAAA,kBAAoC,MAAAC,KAApH,IACA,mBAAAC,eAAAC,IACAD,OAAA,mBAAAL,GACA,iBAAAC,QACAA,QAAA,IAAAD,EAAA,WAA0E,IAAM,OAAAG,QAAA,kBAAoC,MAAAC,KAApH,IAEAL,EAAA,IAAAC,EAAAD,EAAA,gBARA,CASC,oBAAAQ,UAAAC,KAAA,SAAAC,iCACD,mBCTA,IAAAC,EAAA,GAGA,SAAAC,EAAAC,GAGA,GAAAF,EAAAE,GACA,OAAAF,EAAAE,GAAAX,QAGA,IAAAC,EAAAQ,EAAAE,GAAA,CACAC,EAAAD,EACAE,GAAA,EACAb,QAAA,IAUA,OANAc,EAAAH,GAAAI,KAAAd,EAAAD,QAAAC,IAAAD,QAAAU,GAGAT,EAAAY,GAAA,EAGAZ,EAAAD,QA0DA,OArDAU,EAAAM,EAAAF,EAGAJ,EAAAO,EAAAR,EAGAC,EAAAQ,EAAA,SAAAlB,EAAAmB,EAAAC,GACAV,EAAAW,EAAArB,EAAAmB,IACAG,OAAAC,eAAAvB,EAAAmB,EAAA,CAA0CK,YAAA,EAAAC,IAAAL,KAK1CV,EAAAgB,EAAA,SAAA1B,GACA,oBAAA2B,eAAAC,aACAN,OAAAC,eAAAvB,EAAA2B,OAAAC,YAAA,CAAwDC,MAAA,WAExDP,OAAAC,eAAAvB,EAAA,cAAiD6B,OAAA,KAQjDnB,EAAAoB,EAAA,SAAAD,EAAAE,GAEA,GADA,EAAAA,IAAAF,EAAAnB,EAAAmB,IACA,EAAAE,EAAA,OAAAF,EACA,KAAAE,GAAA,iBAAAF,QAAAG,WAAA,OAAAH,EACA,IAAAI,EAAAX,OAAAY,OAAA,MAGA,GAFAxB,EAAAgB,EAAAO,GACAX,OAAAC,eAAAU,EAAA,WAAyCT,YAAA,EAAAK,UACzC,EAAAE,GAAA,iBAAAF,EAAA,QAAAM,KAAAN,EAAAnB,EAAAQ,EAAAe,EAAAE,EAAA,SAAAA,GAAgH,OAAAN,EAAAM,IAAqBC,KAAA,KAAAD,IACrI,OAAAF,GAIAvB,EAAA2B,EAAA,SAAApC,GACA,IAAAmB,EAAAnB,KAAA+B,WACA,WAA2B,OAAA/B,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAS,EAAAQ,EAAAE,EAAA,IAAAA,GACAA,GAIAV,EAAAW,EAAA,SAAAiB,EAAAC,GAAsD,OAAAjB,OAAAkB,UAAAC,eAAA1B,KAAAuB,EAAAC,IAGtD7B,EAAAgC,EAAA,GAIAhC,IAAAiC,EAAA,qBCnEA,IAEAC,EADAC,EAhBA7C,EAAA8C,SAAA,SAAAC,GACAC,WAAAD,EAAA,IAGA/C,EAAAiD,SAAAjD,EAAAkD,KACAlD,EAAAmD,SAAAnD,EAAAoD,MAAA,UACApD,EAAAqD,IAAA,EACArD,EAAAsD,SAAA,EACAtD,EAAAuD,IAAA,GACAvD,EAAAwD,KAAA,GAEAxD,EAAAyD,QAAA,SAAAtC,GACA,UAAAuC,MAAA,8CAIAb,EAAA,IAEA7C,EAAA6C,IAAA,WAA+B,OAAAA,GAC/B7C,EAAA2D,MAAA,SAAAC,GACAhB,MAA0BlC,EAAQ,IAClCmC,EAAAD,EAAAiB,QAAAD,EAAAf,IAIA7C,EAAA8D,KAAA9D,EAAA+D,KACA/D,EAAAgE,MAAAhE,EAAAiE,OACAjE,EAAAkE,OAAAlE,EAAAmE,YACAnE,EAAAoE,WAAA,aACApE,EAAAqE,SAAA,qBC7BA,SAAAC,GAyBA,SAAAC,EAAAC,EAAAC,GAGA,IADA,IAAAC,EAAA,EACA9D,EAAA4D,EAAAG,OAAA,EAAgC/D,GAAA,EAAQA,IAAA,CACxC,IAAAgE,EAAAJ,EAAA5D,GACA,MAAAgE,EACAJ,EAAAK,OAAAjE,EAAA,GACK,OAAAgE,GACLJ,EAAAK,OAAAjE,EAAA,GACA8D,KACKA,IACLF,EAAAK,OAAAjE,EAAA,GACA8D,KAKA,GAAAD,EACA,KAAUC,IAAMA,EAChBF,EAAAM,QAAA,MAIA,OAAAN,EAKA,IAAAO,EACA,gEACAC,EAAA,SAAAC,GACA,OAAAF,EAAAG,KAAAD,GAAAE,MAAA,IAuJA,SAAAC,EAAAC,EAAAC,GACA,GAAAD,EAAAD,OAAA,OAAAC,EAAAD,OAAAE,GAEA,IADA,IAAAC,EAAA,GACA3E,EAAA,EAAmBA,EAAAyE,EAAAV,OAAe/D,IAClC0E,EAAAD,EAAAzE,KAAAyE,IAAAE,EAAAC,KAAAH,EAAAzE,IAEA,OAAA2E,EAxJAvF,EAAA6D,QAAA,WAIA,IAHA,IAAA4B,EAAA,GACAC,GAAA,EAEA9E,EAAA+E,UAAAhB,OAAA,EAAoC/D,IAAA,IAAA8E,EAA8B9E,IAAA,CAClE,IAAAgC,EAAAhC,GAAA,EAAA+E,UAAA/E,GAAA0D,EAAAzB,MAGA,oBAAAD,EACA,UAAAgD,UAAA,6CACKhD,IAIL6C,EAAA7C,EAAA,IAAA6C,EACAC,EAAA,MAAA9C,EAAAiD,OAAA,IAWA,OAAAH,EAAA,SAJAD,EAAAlB,EAAAa,EAAAK,EAAAK,MAAA,cAAApD,GACA,QAAAA,KACGgD,GAAAK,KAAA,OAEH,KAKA/F,EAAAgG,UAAA,SAAApD,GACA,IAAAqD,EAAAjG,EAAAiG,WAAArD,GACAsD,EAAA,MAAAC,EAAAvD,GAAA,GAcA,OAXAA,EAAA2B,EAAAa,EAAAxC,EAAAkD,MAAA,cAAApD,GACA,QAAAA,KACGuD,GAAAF,KAAA,OAEHE,IACArD,EAAA,KAEAA,GAAAsD,IACAtD,GAAA,MAGAqD,EAAA,QAAArD,GAIA5C,EAAAiG,WAAA,SAAArD,GACA,YAAAA,EAAAiD,OAAA,IAIA7F,EAAA+F,KAAA,WACA,IAAAK,EAAAC,MAAA7D,UAAA2C,MAAApE,KAAA4E,UAAA,GACA,OAAA3F,EAAAgG,UAAAZ,EAAAgB,EAAA,SAAA1D,EAAA4D,GACA,oBAAA5D,EACA,UAAAkD,UAAA,0CAEA,OAAAlD,IACGqD,KAAA,OAMH/F,EAAAuG,SAAA,SAAAC,EAAAC,GAIA,SAAAC,EAAAC,GAEA,IADA,IAAAC,EAAA,EACUA,EAAAD,EAAAhC,QACV,KAAAgC,EAAAC,GAD8BA,KAK9B,IADA,IAAAC,EAAAF,EAAAhC,OAAA,EACUkC,GAAA,GACV,KAAAF,EAAAE,GADoBA,KAIpB,OAAAD,EAAAC,EAAA,GACAF,EAAAxB,MAAAyB,EAAAC,EAAAD,EAAA,GAfAJ,EAAAxG,EAAA6D,QAAA2C,GAAAL,OAAA,GACAM,EAAAzG,EAAA6D,QAAA4C,GAAAN,OAAA,GAsBA,IALA,IAAAW,EAAAJ,EAAAF,EAAAV,MAAA,MACAiB,EAAAL,EAAAD,EAAAX,MAAA,MAEAnB,EAAAqC,KAAAC,IAAAH,EAAAnC,OAAAoC,EAAApC,QACAuC,EAAAvC,EACA/D,EAAA,EAAiBA,EAAA+D,EAAY/D,IAC7B,GAAAkG,EAAAlG,KAAAmG,EAAAnG,GAAA,CACAsG,EAAAtG,EACA,MAIA,IAAAuG,EAAA,GACA,IAAAvG,EAAAsG,EAA+BtG,EAAAkG,EAAAnC,OAAsB/D,IACrDuG,EAAA3B,KAAA,MAKA,OAFA2B,IAAAC,OAAAL,EAAA5B,MAAA+B,KAEAnB,KAAA,MAGA/F,EAAAqH,IAAA,IACArH,EAAAsH,UAAA,IAEAtH,EAAAuH,QAAA,SAAA3E,GACA,IAAA4E,EAAAxC,EAAApC,GACA9C,EAAA0H,EAAA,GACA5D,EAAA4D,EAAA,GAEA,OAAA1H,GAAA8D,GAKAA,IAEAA,IAAAuC,OAAA,EAAAvC,EAAAe,OAAA,IAGA7E,EAAA8D,GARA,KAYA5D,EAAAyH,SAAA,SAAA7E,EAAA8E,GACA,IAAApC,EAAAN,EAAApC,GAAA,GAKA,OAHA8E,GAAApC,EAAAa,QAAA,EAAAuB,EAAA/C,UAAA+C,IACApC,IAAAa,OAAA,EAAAb,EAAAX,OAAA+C,EAAA/C,SAEAW,GAIAtF,EAAA2H,QAAA,SAAA/E,GACA,OAAAoC,EAAApC,GAAA,IAaA,IAAAuD,EAAA,WAAAA,QAAA,GACA,SAAAyB,EAAAhB,EAAAiB,GAAkC,OAAAD,EAAAzB,OAAAS,EAAAiB,IAClC,SAAAD,EAAAhB,EAAAiB,GAEA,OADAjB,EAAA,IAAAA,EAAAgB,EAAAjD,OAAAiC,GACAgB,EAAAzB,OAAAS,EAAAiB,qCC7NA,IAAAC,EAGAA,EAAA,WACA,OAAAvH,KADA,GAIA,IAEAuH,KAAA,IAAAC,SAAA,iBACC,MAAA5H,GAED,iBAAA6H,SAAAF,EAAAE,QAOA/H,EAAAD,QAAA8H,iGCnBA,SAAAxD,QAAA2D,QAcA3D,QAAAhB,UAAAgB,QAAAzB,IAAA,WAA+C,YAE/C,MAAAqF,GAAWxH,oBAAQ,GACnBkC,KAAalC,oBAAQ,GACrByH,KAAazH,oBAAQ,GACrB0H,WAAmB1H,oBAAQ,GAC3B2H,YAAoB3H,oBAAQ,GAC5B4H,OAAe5H,oBAAQ,GACvB6H,IAAA,UAAAjE,QAAArB,SAAA,YAIAqB,QAAAkE,oBAAAlE,QAAAkE,mBAAA,qBAGA,IAAAC,eAAAC,OAAA,EACA,MACA,IACAD,eAAqB/H,oBAAQ,IAC1B,MAAAP,GACH,IACMO,qBAAQ,eAAAP,EAAA,IAAAuD,MAAA,sCAAAvD,EAAAwI,KAAA,mBAAAxI,EAAA,IAASyI,SAAA,CAAYC,QAAAjG,KAAAmD,KAAoB,IAAS,8BAC1DrF,qBAAQ,eAAAP,EAAA,IAAAuD,MAAA,6CAAAvD,EAAAwI,KAAA,mBAAAxI,EAAA,IACdsI,eAAuB/H,qBAAQ,eAAAP,EAAA,IAAAuD,MAAA,qCAAAvD,EAAAwI,KAAA,mBAAAxI,EAAA,IAC/BuI,OAAA,EACK,MAAAI,MACL,IACAL,eAAAM,KAAA,+BACO,MAAA5I,GAGP,MADAA,EAAA6I,MAAAF,KAAAE,MAAA,UAAA7I,EAAA6I,MACA7I,MAfA,GAsBAH,QAAAiJ,UAAmB,EAGnBjJ,QAAA0I,YAGA1I,QAAAkJ,QAAAlJ,QAAAiJ,SAAqC,QAAiBvI,qBAAQ,eAAAP,EAAA,IAAAuD,MAAA,8CAAAvD,EAAAwI,KAAA,mBAAAxI,EAAA,IAAiB+I,QAG/ElJ,QAAAmJ,QAAkBzI,oBAAQ,IAG1BV,QAAAoJ,cAAA,qBAGApJ,QAAAqJ,cAAAZ,eAAAa,eAGAtJ,QAAAuJ,qBAAA,EAGAvJ,QAAAwJ,mBAAA,EAGAxJ,QAAAyJ,aAAAzJ,QAAAiJ,SAA0C3H,OAAA,CAAAoI,kBAAA,otCAAAC,kBAAA,+ymBAAAC,uBAAA,0nBAAAC,mBAAA,khBAAAC,iBAAA,mujBAAAC,MAAA,mnnBAAAC,YAAA,28DAAAC,gBAAA,iVAAAC,gBAAA,q5DAAAC,SAAA,gnkBAAAC,iBAAA,8hPAAAC,SAAA,s5NAAAC,KAAA,upBAAAC,YAAA,yNAAAhH,IAAA,+QAAAiH,MAAA,itBAAAC,GAAA,yVAAAC,qBAAA,6VAAAC,uBAAA,u7GAAAC,gBAAA,yrEAAAC,kBAAA,u3OAAAC,kBAAA,ovrBAAAC,gBAAA,knJAAAC,kBAAA,ytMAAAC,sBAAA,g8MAAAC,SAAA,ukCAAAC,IAAA,wqNAAAC,KAAA,2zgFAAAC,OAAA,8uDAAAC,OAAA,ojMAAAC,UAAA,4jCAAAC,OAAA,2YAAAC,IAAA,miMAAAC,OAAA,ymmBAAAC,OAAA,+hFAAAC,MAAA,8aAAAC,WAAA,2xhBAAAC,OAAA,+CAAc,MACxD,MAAAC,EAAAnJ,KAAAmD,KAA2B,IAAS,uBACpCiG,EAAmBtL,qBAAQ,eAAAP,EAAA,IAAAuD,MAAA,mCAAAvD,EAAAwI,KAAA,mBAAAxI,EAAA,IAAM8L,KAAA,gBAAwBpJ,IAAAkJ,IACzDG,EAAA,GAEA,OADAF,EAAAG,QAAAC,GAAAF,EAAAE,EAAAC,QAAA,aAAAnE,GAAAoE,aAAA1J,KAAAmD,KAAAgG,EAAAK,GAAA,SACAF,GALwD,GASxDlM,QAAAuM,gBAAAvM,QAAAiJ,SAA6C3H,OAAA,CAAAkL,SAAA,m0gDAAAC,SAAA,u33BAAkB,MAC/D,MAAAC,EAAA9J,KAAAmD,KAA2B,IAAS,YACpC,OACAyG,SAAAtE,GAAAoE,aAAA1J,KAAAmD,KAAA2G,EAAA,iCACAD,SAAAvE,GAAAoE,aAAA1J,KAAAmD,KAAA2G,EAAA,mCAJ+D,GAS/D1M,QAAA2M,cAAA,EAAAC,EAAAzD,KACA,iBAAAyD,MAAA,CAA8CC,WAAAD,IAC9C,MAAAE,EAAAxL,OAAAY,OAAA,CACA6K,OAAAC,qBACAC,OAAAD,uBAEA,IAAAxJ,EAAA,CACA,wBACA,qBAcA,OAZAlC,OAAA4L,KAAA/D,GAAA,IAA2BgD,QAAAhK,IAC3B,IAAAgL,EAAAhE,EAAAhH,GACAkE,MAAA+G,QAAAD,KAAAhB,QAAAgB,GAAA3J,EAAAgC,KAAA,KAAArD,EAAAkL,OAAAF,KACA3J,EAAAgC,KAAA,KAAArD,EAAAkL,OAAAF,MAEAnN,QAAAsN,KAAA9J,EAAA4D,OAAA9F,OAAA4L,KAAAN,IAAA,CACAG,OAAAD,EAAAC,OACAE,OAAAH,EAAAG,OACAM,SAAApM,GAAAyL,EAAAnK,eAAAtB,GAAAyL,EAAAzL,GAAA,KACAqM,UAAA,CAAArM,EAAAsM,IAAAX,EAAA3L,GAAAsM,EACAC,UAAA,SAEAZ,IAIA9M,QAAAsN,KAAA,SAAA9J,EAAA2F,EAAAwE,GACA,mBAAAxE,GACAwE,EAAAxE,EACAA,EAAA,IACGA,IACHA,EAAA,IAGA,MAAA4D,EAAA5D,EAAA4D,QAAAzI,QAAAyI,OACAE,EAAA9D,EAAA8D,QAAA3I,QAAA2I,OACAM,EAAApE,EAAAoE,UAAAK,EACAJ,EAAArE,EAAAqE,WAAAK,EACAH,EAAAvE,EAAAuE,WAAAI,EACAC,EAAA5E,EAAA4E,OAAAC,cAGA,IAAAjB,EAAA,MAAArJ,MAAA,sCACA,IAAAuJ,EAAA,MAAAvJ,MAAA,sCAEA,MAAAuK,EAAA5F,YAAA6F,MAAA1K,EAAAxD,QAAAmJ,SACAgF,EAAAF,EAAA9E,QAiCA,GAhCA3F,EAAAyK,EAAAtI,UACAwI,EAAAC,SACAhG,WAAA2E,OAAAsB,UACAjG,WAAA6E,OAAAoB,WAAA,GAEAjG,WAAA2E,OAAA3E,WAAA5B,KAAAuG,GACA3E,WAAA6E,OAAA7E,WAAA5B,KAAAyG,IAIAgB,EAAAK,QAAA3J,QACAsJ,EAAAK,QAAAnC,QAAAoC,IACAtB,EAAAuB,MAAApG,WAAA6E,OAAAwB,OAAA,6BAAAF,EAAA,IAAAhG,OAKA0F,EAAAS,SAAA/J,QACAsI,EAAAuB,MAAApG,WAAA6E,OAAAwB,OAAA,6CAAAR,EAAAS,SAAA3I,KAAA,KAAAwC,KAIAoF,MAAA,SAAAgB,GACA,IAAAhG,EAAA,EAKA,OAJAgG,IACA1B,EAAAuB,MAAApG,WAAA6E,OAAA2B,IAAA,WAAAD,EAAA3F,MAAAqD,QAAA,gBAAA9D,KACAI,EAAA,GAEAA,IAIAwF,EAAAjF,QAEA,OADA6D,EAAAyB,MAAA,WAAAxO,QAAAkJ,SAAAR,MAAA,WAAAH,KACAoF,EAAA,MAGA,GAAAQ,EAAAU,OAAArL,EAAAmB,OAAA,CACA,IAAAmK,EAAAX,EAAAU,KAAA9B,EAAAE,EACA8B,EAAAZ,EAAAU,KAAAzG,WAAA2E,OAAA3E,WAAA6E,OAcA,OAbA6B,EAAAN,MAAA,CACAO,EAAAC,MAAA,UACA,KAAAD,EAAAE,KAAA,oCACA,GACAF,EAAAC,MAAA,YACA,KAAAD,EAAAE,KAAA,mBACA,KAAAF,EAAAE,KAAA,8CACA,KAAAF,EAAAE,KAAA,iDACA,GACAF,EAAAC,MAAA,YACA5H,OACAiB,YAAAwG,KAAA7O,QAAAmJ,QAAA,GAAAZ,MACAxC,KAAAwC,UACAoF,EAAA,MAIA,IAAAzF,GAAAoE,aAAA,CACA,GAAAiB,IAAAK,EAAA,MAAAlK,MAAA,wCACA,GAAA8J,IAAAK,EAAA,MAAAnK,MAAA,yCACA,GAAAgK,IAAAI,EAAA,MAAApK,MAAA,yCAIA,MAAAwL,EAAAf,EAAAe,QAAAtM,KAAAiB,QAAAsK,EAAAe,SAAA,IAGAC,EAAA,GACAhB,EAAAiB,WACAjB,EAAAiB,UAAAjD,QAAAiD,GACAD,EAAA3J,KACQ9E,oBAAA,GAAAA,CACEkC,KAAAqD,WAAAmJ,IAAA1I,QACV0I,EACAxM,KAAAmD,KAAAzB,QAAAzB,MAAAuM,MAYA,IAAAC,EAAA,KAGAlB,EAAAmB,OAcAvB,EAAAwB,aACAxB,EAAAyB,WAAAC,QAAA,KACAJ,EAAA5G,eAAAiH,UACA1P,QAAAyJ,aAAA,SACAzJ,QAAAqJ,cAAA,eACA,EACAgG,MAnBA/N,OAAA4L,KAAAlN,QAAAyJ,cAAA0C,QAAAwD,IACAA,EAAAC,QAAA,UACA7B,EAAAwB,aACAxB,EAAAyB,WAAAC,QAAA,KACAJ,EAAA5G,eAAAiH,UACA1P,QAAAyJ,aAAAkG,GACA3P,QAAAqJ,cAAAsG,EAAA,OACA,EACAN,QAeA,MAAAQ,EAAA,GACA,GAAA1B,EAAA2B,IAAA,CACA,IAAAA,EAAA3B,EAAA2B,IACA,iBAAAA,QAAAhK,MAAA,MACAO,MAAA7D,UAAAgD,KAAAuK,MAAAF,EAAAC,EAAA3E,IAAA2E,KAAApJ,SACA,QAAA9F,EAAA,EAAAoP,EAAAH,EAAAlL,OAA6C/D,EAAAoP,IAAOpP,EAAA,CACpD,IACAoL,EADAD,EAAA8D,EAAAjP,GAEAmL,EAAAkE,SAAA,QACAjE,EAAA,CAAApJ,KAAA6E,SAAAsE,IACAA,EAAAnJ,KAAA2E,QAAAwE,IAEAC,EAAA0B,EAAA3B,GAEA,QAAAmE,EAAA,EAAArP,EAAAmL,EAAArH,OAA0CuL,EAAArP,IAAOqP,EAAA,CACjD,IAAAP,EAAA3D,EAAAkE,GACAC,EAAA5C,EAAAoC,EAAA5D,GACA,UAAAoE,EAAA,OAAAxC,EAAAjK,MAAA,iBAAAiM,EAAA,iBACA5B,EAAAwB,aACAxB,EAAAyB,WAAAC,QAAA,KACAJ,EAAA5G,eAAAiH,UACAS,EACAnQ,QAAAqJ,cAAAsG,GACA,EACAN,OAQA,SAAAe,IAEA,IADA,IAAAC,EAAAC,EACA,OAAAD,EAAAhB,EAAAkB,aAAA,CAGA,GAAAF,EAAAG,WAAAxQ,QAAAqJ,eAAA,CACA,MAAAoH,EAAAJ,EAAAK,UAAA1Q,QAAAqJ,cAAA1E,QACAgM,EAAAN,EAAAK,UAAA1Q,QAAAqJ,cAAA1E,QAAA,SACA,GAAA3E,QAAAyJ,aAAAhH,eAAAgO,GACAH,EAAAtQ,QAAAyJ,aAAAgH,GACAJ,EAAArQ,QAAAqJ,cAAAoH,EAAA,WACS,GAAAzQ,QAAAyJ,aAAAhH,eAAAkO,GACTL,EAAAtQ,QAAAyJ,aAAAkH,GACAN,EAAArQ,QAAAqJ,cAAAsH,EAAA,WAEA,QAAA/P,EAAA,EAAAoP,EAAAH,EAAAlL,OAAmD/D,EAAAoP,IAAOpP,EAAA,CAE1D,WADA0P,EAAA/C,EAAAkD,EAAA,MAAAZ,EAAAjP,KACA,CACAyP,EAAArQ,QAAAqJ,cAAAoH,EAAA,MACA,MAGA,WADAH,EAAA/C,EAAAoD,EAAA,MAAAd,EAAAjP,KACA,CACAyP,EAAArQ,QAAAqJ,cAAAsH,EAAA,MACA,YAOO,CACP,MAAAF,EAAAJ,EACAM,EAAAN,EAAA,SAEA,WADAC,EAAA/C,EAAAkD,EAAA,MAAAvB,IAEAmB,EAAAI,EAAA,WAGA,WADAH,EAAA/C,EAAAoD,EAAA,MAAAzB,IAEAmB,EAAAM,EAAA,WACW,IAAAF,EAAAD,WAAA,KACX,GAAAxQ,QAAAyJ,aAAAhH,eAAAgO,GACAH,EAAAtQ,QAAAyJ,aAAAgH,GACAJ,EAAArQ,QAAAqJ,cAAAoH,EAAA,WACa,GAAAzQ,QAAAyJ,aAAAhH,eAAAkO,GACbL,EAAAtQ,QAAAyJ,aAAAkH,GACAN,EAAArQ,QAAAqJ,cAAAsH,EAAA,WAEA,QAAA/P,EAAA,EAAAoP,EAAAH,EAAAlL,OAAuD/D,EAAAoP,IAAOpP,EAAA,CAC9DiP,EAAAjP,GAEA,WADA0P,EAAA/C,EAAAkD,EAAA,MAAAZ,EAAAjP,KACA,CACAyP,EAAArQ,QAAAqJ,cAAAoH,EAAA,MACA,MAGA,WADAH,EAAA/C,EAAAoD,EAAA,MAAAd,EAAAjP,KACA,CACAyP,EAAArQ,QAAAqJ,cAAAsH,EAAA,MACA,QAQA,SAAAL,EACA,OAAA3C,EAAAjK,MAAA,gBAAA2M,EAAA,oBAEAtC,EAAAwB,aACAxB,EAAAyB,WAAAC,QAAA,KACAhH,eAAAiH,UAAAY,EAAAD,GAAA,EAAAhB,KAGA,GAAAuB,iBAAAvB,EAAApC,GACA,OAAAU,EAAAjK,MAAA,gBAKA,QAAA9C,EAAA,EAAAoP,EAAAxM,EAAAmB,OAAkC/D,EAAAoP,IAAOpP,EAAA,CACzC,MAAAqE,EAAAzB,EAAA5C,GAEA,IAAAyP,EAAAhD,OAAApI,GAAAoH,QAAA,WAAAA,QAAA,iBAGAiE,EAAA/C,EAAA8C,EAAA,MAAAnB,GACA,UAAAoB,EAAA,CAEA,WADAA,EAAA/C,EAAA8C,EAAA,YAAAnB,IAEA,OAAAvB,EAAAjK,MAAA,eAAA2M,EAAA,oBAEAA,GAAA,iBAGAA,GAAA,MAGAtC,EAAAwB,aACAxB,EAAAyB,WAAAC,QAAA,KACAJ,EAAA5G,eAAAiH,UAAAY,EAAAD,GAAA,EAAAhB,KAEA,IAAA1G,EAAAyH,IACA,GAAAzH,EAAA,OAAAA,GA1KA,SAAAxH,KAAAgN,GACAgB,EAAAhD,QAAAiD,IACA,mBAAAA,EAAAjO,IAAAiO,EAAAjO,MAAAgN,KA2KA0C,CAAA,aAAAxB,GACA,CACA,IAAA1G,EAAAyH,IACA,GAAAzH,EAAA,OAAAA,EAIA,MAAAmI,EAAArI,eAAAsI,cAAA1B,GAGA,IAAA2B,EAAA,EACAC,EAAA,EACA9C,EAAA+C,WACAF,EAAAhR,QAAAuJ,qBACA0H,EAAAjR,QAAAwJ,oBAEA,iBAAA2E,EAAA6C,gBACAA,EAAA7C,EAAA6C,eAEA,iBAAA7C,EAAA8C,cACAA,EAAA9C,EAAA8C,aAEAD,EAAAhK,KAAAC,IAAAD,KAAAmK,IAAAH,EAAA,MACAC,EAAAjK,KAAAC,IAAAD,KAAAmK,IAAAF,EAAA,MAGA,MAAAG,EAAA3I,eAAA4I,gBAmBA,GAlBA5I,eAAA6I,UAAAF,EAAA,GACA3I,eAAA8I,iBAAAH,EAAAjD,EAAAqD,eACA/I,eAAAgJ,YAAAL,EAAAjD,EAAAuD,UACAjJ,eAAAkJ,gBAAAP,EAAAjD,EAAAyD,cACAnJ,eAAAoJ,eAAAT,EAAAjD,EAAA2D,aACArJ,eAAAsJ,cAAAX,EAAAjD,EAAA6D,aAAA,GACAvJ,eAAAwJ,aAAAb,EAAA,MAAAjD,EAAA+D,WACAzJ,eAAA0J,sBAAAf,EAAAJ,EAAAC,GAEA9C,EAAAmB,QAEA7G,eAAA2J,eAAAhB,EAAA,qBACA3I,eAAA2J,eAAAhB,EAAA,uBACA3I,eAAA2J,eAAAhB,EAAA,0BACA3I,eAAA2J,eAAAhB,EAAA,2BAIAjD,EAAAkE,IAAA,CACA,IAAAC,EAAAnE,EAAAkE,IACA,QAAAzR,EAAA,EAAAoP,EAAAsC,EAAA3N,OAAuC/D,EAAAoP,IAAOpP,EAAA,CAC9C,IAAA2R,EAAAD,EAAA1R,GACA8B,EAAA6P,EAAA3C,QAAA,KACA,GAAAlN,EAAA,SAAAiL,EAAAjK,MAAA,iBAAA6O,EAAA,kBACA,IAAApR,EAAAoR,EAAA7B,UAAA,EAAAhO,GAAAgE,OACA8L,EAAAD,EAAA7B,UAAAhO,EAAA,GAAAgE,OACA,IAAAvF,EAAAwD,OAAA,OAAAgJ,EAAAjK,MAAA,iBAAA6O,EAAA,kBACA9J,eAAA2J,eAAAhB,EAAAjQ,EAAAqR,IAKA,IAWAvS,EAXAoE,EAAA8J,EAAAsE,OACA,SAAApO,EAAA,CACA,iBAAAA,QAAAyB,MAAA,MACA,QAAAlF,EAAA,EAAAoP,EAAA3L,EAAAM,OAAwC/D,EAAAoP,IAAOpP,EAAA,CAC/C,IAAAO,EAAAkD,EAAAzD,GAAA8F,OACAgM,EAAAjK,eAAA,WAAAtH,EAAAkL,QAAA,WAAAsG,eACA,IAAAD,EAAA,OAAA/E,EAAAjK,MAAA,YAAAvC,EAAA,kBACAsH,eAAAmK,cAAAxB,EAAAsB,IAeA,GAVA3E,EAAA8E,eACA,MACA,IACA9E,EAAA+E,aAAArD,QAAA,KACAxP,EAAAwI,eAAAsK,eAAAjC,EAAAM,KAEK,MAAAjR,GACL,OAAAwN,EAAAxN,KANA,GASAyQ,iBAAAvB,EAAApC,GAEA,OADAhN,KAAA+S,UACArF,EAAAjK,MAAA,kBAeA,GAXAyK,EAAA8E,WACAlF,EAAAmF,gBACAnF,EAAAoF,cAAA1D,QAAA,KACA,IAAAxP,EAAAgT,WAEA,OADAhT,EAAA+S,UACArF,EAAAjK,MAAA,sBAMA,UAAAyK,EAAAiF,SACArF,EAAAsF,gBACAtF,EAAAuF,cAAA7D,QAAA,KACAxP,EAAAsT,UAAA,4BAEG,UAAApF,EAAAiF,SACHrF,EAAAsF,gBACAtF,EAAAuF,cAAA7D,QAAA,KACAxP,EAAAsT,UAAA,yBAEG,aAAApF,EAAAiF,SAEH,OADAnT,EAAA+S,UACArF,EAAAjK,MAAA,2BAKAsN,GAAA,GAAAC,GAAA,KAAAD,EAAA,GAEA/Q,EAAAuT,iBAAAxC,GACA/Q,EAAAwT,eAAAxC,GACAhR,EAAAyT,aAAAvF,EAAAwF,OAEA,IAAAJ,EAAA,GA8BA,GA7BApF,EAAAoF,YACA,iBAAApF,EAAAoF,YACApF,EAAAoF,UAAApF,EAAAoF,UAAAzN,MAAA,MAEAqI,EAAAoF,UAAA5O,QACAwJ,EAAAoF,UAAApH,QAAAyH,IACAL,EAAA3D,QAAAgE,GAAA,GACAL,EAAA/N,KAAAoO,OAMA5C,EAAA,GAAAC,EAAA,KACAlD,EAAAsF,gBACAtF,EAAAuF,cAAA7D,QAAA,KACAxP,EAAAiR,cAKAqC,EAAA5O,SACAoJ,EAAAsF,gBACAtF,EAAAuF,cAAA7D,QAAA,KACAxP,EAAAsT,YAAApI,IAAAyI,KAAAlN,aAKAyH,EAAA0F,OAAA,CACA,IAAAC,GAAA,EACAC,GAAA,EAaA,GAXA,MAAA5F,EAAA6F,UACA,WAAAC,KAAA9F,EAAA6F,UAAA,MAAA7F,EAAA+F,SACA/F,EAAA+F,SAAA/F,EAAA6F,QACO,QAAAC,KAAA9F,EAAA6F,UAAA,MAAA7F,EAAAgG,UACPhG,EAAAgG,UAAAhG,EAAA6F,QACO,MAAA7F,EAAAiG,aACPjG,EAAAiG,WAAAjG,EAAA6F,UAKA,MAAA7F,EAAAiG,WAAA,CACA,IAMAC,EANAC,EAAA,MAAAnG,EAAA+D,UACA/D,EAAA+D,UAAAvN,OACAwJ,EAAA+D,UACAtP,KAAA6E,SAAA0G,EAAAiG,YAAA,OACA,KAiBA,GAdArG,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACA4E,EAAApU,EAAAwU,SAAAH,KAGAnG,EAAAiG,WAAAzP,OACA6I,EAAAW,EAAAiG,WAAAC,EAAAvH,OAAAoC,IAEAwF,EAAAL,EAAAvH,QACAgH,GAAA,GAEAC,GAAA,EAGA,MAAAM,EAAAnC,UACA,GAAA/D,EAAAiG,WAAAzP,OAAA,CACA,IAAAuN,EAAAyC,KAAAzG,MAAAmG,EAAAnC,WACAA,EAAA0C,WAAA5U,QAAAoJ,cACA8I,EAAAtF,QAAAT,QAAA,CAAAhL,EAAAmF,KACA,IAAAuO,EAAA,KACA,GAAA1T,EAAAqP,WAAAxQ,QAAAqJ,eAAA,CACA,IAAAyL,EAAA3T,EAAAuP,UAAA1Q,QAAAqJ,cAAA1E,QAAA0H,QAAA,YACA,GAAArM,QAAAyJ,aAAAhH,eAAAqS,GACAD,EAAA7U,QAAAyJ,aAAAqL,QAEA,QAAAlU,EAAA,EAAAoP,EAAAH,EAAAlL,OAAyD/D,EAAAoP,GAEzD,QADA6E,EAAAtH,EAAApM,EAAAuP,UAAA1Q,QAAAqJ,cAAA1E,QAAAkL,EAAAjP,OADgEA,SAMhEiU,EAAAtH,EAAApM,EAAA+N,GAEA,UAAA2F,EACA,OAAAlH,EAAAjK,MAAA,gBAAAvC,EAAA,iBAEA+Q,EAAA6C,iBAAA7C,EAAA6C,eAAA,IACA7C,EAAA6C,eAAAzO,GAAAuO,IAEArH,EAAA5K,KAAAmD,KACAnD,KAAA2E,QAAA4G,EAAAiG,YACAxR,KAAA6E,SAAA6M,IACAjI,QAAA,YAAAsI,KAAAK,UAAA9C,GAAAhD,QAEAjC,EAAAuB,MAAA,+CAAAjG,KAMA,SAAA4F,EAAAgG,UAAA,CACA,IAAAc,EACA9G,EAAAgG,UAAAxP,QACAoJ,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACAwF,EAAAhV,EAAAiV,YAEA1H,EAAAW,EAAAgG,UAAAc,EAAA/F,IACO4E,IACP/F,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACAwF,EAAAhV,EAAAiV,YAEAR,EAAAO,GACAnB,GAAA,GAEAC,GAAA,EAIA,SAAA5F,EAAAgH,QAAA,CACA,IAAAC,EACAjH,EAAAgH,QAAAxQ,QACAoJ,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACA2F,EAAA3M,eAAA4M,SAAAvE,KAEAtD,EAAAW,EAAAgH,QAAAC,EAAAlG,IACO4E,IACP/F,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACA2F,EAAA3M,eAAA4M,SAAAvE,KAEA4D,EAAAU,GACAtB,GAAA,GAEAC,GAAA,EAIA,SAAA5F,EAAAmH,QAAA,CACA,IAAAC,EACApH,EAAAmH,QAAA3Q,QACAoJ,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACA8F,EAAA9M,eAAA+M,SAAA1E,KAEAtD,EAAAW,EAAAmH,QAAAC,EAAArG,IACO4E,IACP/F,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACA8F,EAAA9M,eAAA+M,SAAA1E,KAEA4D,EAAAa,GACAzB,GAAA,GAEAC,GAAA,EAIA,SAAA5F,EAAA+F,WAAAH,EAAA,CACA,IAAA0B,EACAtH,EAAA+F,UAAA/F,EAAA+F,SAAAvP,QACAoJ,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACAgG,EAAAxV,EAAAyV,WAEAlI,EAAAW,EAAA+F,SAAAuB,EAAAvG,IACO4E,IACP/F,EAAAwG,YACAxG,EAAAyG,UAAA/E,QAAA,KACAgG,EAAAxV,EAAAyV,WAEAhB,EAAAe,KASA,OAJAxV,EAAA+S,UACA7E,EAAAsB,SACAkG,WAAA5H,EAAAd,GAEAU,EAAA,MAEA,SAAAC,EAAA3I,EAAAiK,GACA,IACA,IAAA2F,EAKA,OAJA9G,EAAA6H,YACA7H,EAAA8H,UAAApG,QAAA,KACAoF,EAAA3M,GAAAoE,aAAA1J,KAAAmD,KAAAmJ,EAAAjK,GAAA,CAA8D6Q,SAAA,WAE9DjB,EACK,MAAA1U,GACL,aAIA,SAAA0N,EAAA5I,EAAAwI,EAAAyB,GACA,IAUA,OATAnB,EAAAgI,aACAhI,EAAAiI,WAAAvG,QAAA,KACAnH,OAAA1F,KAAAmD,KAAAmJ,EAAAtM,KAAA2E,QAAAtC,KACA,iBAAAwI,EACAvF,GAAA+N,cAAArT,KAAAmD,KAAAmJ,EAAAjK,GAAAwI,EAAA,CAAoEqI,SAAA,SAEpE5N,GAAA+N,cAAArT,KAAAmD,KAAAmJ,EAAAjK,GAAAwI,MAGA,EACK,MAAAtN,GACL,UAIA,SAAA2N,EAAAvG,EAAA2H,GACA,IAAAgH,EACA,IAIA,OAHAnI,EAAA8H,UAAApG,QAAA,KACAyG,EAAAhO,GAAAiO,YAAAvT,KAAAmD,KAAAmJ,EAAA3H,IAAAnC,OAAAgH,GAAA,yBAAA6H,KAAA7H,MAEA8J,EACK,MAAA/V,GACL,UAIA,SAAAuU,EAAAjH,GACAiH,EAAA0B,OACArI,EAAAgI,aACArB,EAAA0B,MAAA,GAEArI,EAAAiI,WAAAvG,QAAA,KACA,iBAAAhC,EACAV,EAAAyB,MAAAf,EAAA,CAAgCqI,SAAA,SAEhC/I,EAAAyB,MAAAf,OAMA,IAAA4I,sBAAA,CACAC,KAAA,eACAC,MAAA,mCACAC,MAAA,mCACAC,MAAA,4CACAC,OAAA,4CACAC,OAAA,4CACAC,MAAA,4CACAC,OAAA,4CACAC,OAAA,4CACAC,MAAA,4CACAC,OAAA,4CACAC,OAAA,4CACAC,MAAA,4CACAC,OAAA,4CACAC,OAAA,6CAIA,SAAAxG,iBAAAyG,EAAApK,GAGA,IAFA,IAAAqK,EACAC,GAAA,EACA,OAAAD,EAAA7O,eAAA+O,eAAAH,KACApK,GACAA,EAAAuB,MACA/F,eAAAgP,iBAAAH,EAAArK,EAAAyK,OAAA,GACAnP,SAGAE,eAAAkP,QAAAL,KAAAC,GAAA,GAEA,OAAAA,EAMA,SAAAvJ,cACA,OACA6H,SAAA,EACAD,UAAA,EACAI,UAAA,EACAD,WAAA,EACAvG,UAAA,EACAD,WAAA,EACAuD,YAAA,EACAD,aAAA,EACA2B,SAAA,EACAD,UAAA,EACApB,aAAA,EACAD,cAAA,EACAI,aAAA,EACAD,cAAA,GASA,SAAA5D,QAAA1M,GACA,MAAA6D,EAAAtC,QAAAsT,SACA7U,IACA,MAAA8U,EAAAvT,QAAAsT,OAAAhR,GACA,WAAAiR,EAAA,GAAAA,EAAA,GAMA,SAAAC,WAAAC,GACA,OAAAA,KAAA,KAAAC,QAAA,eAMA,SAAArC,WAAA5H,EAAAjB,GACA,SAAAmL,EAAAF,EAAAG,GACA,OAAAJ,WAAAC,IAEAjL,GAAAxI,QAAAyI,QAAAyB,MAAA,CACA,eAAAyJ,EAAAlK,EAAA8H,SAAA9H,EAAA6H,WACA,eAAAqC,EAAAlK,EAAAiI,UAAAjI,EAAAgI,YACA,eAAAkC,EAAAlK,EAAAyB,UAAAzB,EAAAwB,YACA,eAAA0I,EAAAlK,EAAA+E,YAAA/E,EAAA8E,cACA,eAAAoF,EAAAlK,EAAAyG,SAAAzG,EAAAwG,WACA,eAAA0D,EAAAlK,EAAAoF,aAAApF,EAAAmF,eACA,eAAA+E,EAAAlK,EAAAuF,aAAAvF,EAAAsF,gBACAtN,KAAAwC,UAxDAvI,QAAA4Q,kCAsBA5Q,QAAAgO,wBAEA1J,QAAAsT,SAAAtT,QAAAsT,OAAsClX,oBAAQ,KAU9CV,QAAAyP,gBAOAzP,QAAA8X,sBAkBA9X,QAAA2V,sBAEA,IAAAwC,iBAAA,IAAAlQ,eAAAmQ,OACAnQ,OAAAmQ,OAAAC,aAAA,SAAAxQ,GAAgD,WAAAI,OAAAmQ,OAAAvQ,IAChD,SAAAA,GAAmB,WAAAyQ,WAAAzQ,IAGnB,SAAAmF,mBAAAjK,GACA,IAAAwV,EAAA,GA6BA,OA5BAA,EAAA/J,MAAA,SAAAgK,GAEA,GADAzV,KAAAyV,GACA,iBAAAA,EAAA,CACA,IAAAC,EAAAN,YAAAhQ,KAAAxD,OAAA6T,IACArQ,KAAAqG,MAAAgK,EAAAC,EAAA,GACAD,EAAAC,EAEAlY,KAAAiF,KAAAgT,IAEAD,EAAAG,MAAA,WACAH,EAAA5T,OAAA,GAEA4T,EAAAI,SAAA,WAEA,IADA,IAAAC,EAAA,EAAAhY,EAAA,EAAAoP,EAAAzP,KAAAoE,OACA/D,EAAAoP,GAAA4I,GAAArY,KAAAK,KAAA+D,OACA,IAAA8T,EAAAN,YAAAS,GAEA,IADAA,EAAAhY,EAAA,EACAA,EAAAoP,GACAyI,EAAAhN,IAAAlL,KAAAK,GAAAgY,GACAA,GAAArY,KAAAK,GAAA+D,SACA/D,EAEA,OAAA6X,GAEAF,EAAAM,SAAA,WACA,IAAAJ,EAAAlY,KAAAoY,WACA,OAAAxQ,KAAA2Q,KAAAL,EAAA,EAAAA,EAAA9T,SAEA4T,EAGAvY,QAAAgN,sCAGAhN,QAAA+Y,WAAA,CACAC,cAAA,EACAC,eAAA,EACAC,mBAAA,EACAC,gBAAA,EACAC,eAAA,EACAC,kBAAA,EACAC,wBAAA,EACAC,OAAA,SACAtZ,OAAA,WACAqP,OAAA,EACAkK,MAAA,GACAC,SAAA,4FCn4BA,IAAAtR,EAAAnI,EAOAmI,EAAAxD,OAAA,SAAA+G,GAGA,IAFA,IAAA7D,EAAA,EACA5G,EAAA,EACAL,EAAA,EAAmBA,EAAA8K,EAAA/G,SAAmB/D,GACtCK,EAAAyK,EAAAgO,WAAA9Y,IACA,IACAiH,GAAA,EACA5G,EAAA,KACA4G,GAAA,EACA,cAAA5G,IAAA,cAAAyK,EAAAgO,WAAA9Y,EAAA,OACAA,EACAiH,GAAA,GAEAA,GAAA,EAEA,OAAAA,GAUAM,EAAA2Q,KAAA,SAAAL,EAAA7R,EAAAC,GAEA,GADAA,EAAAD,EACA,EACA,SAKA,IAJA,IAGA9E,EAHA0C,EAAA,KACAgU,EAAA,GACA5X,EAAA,EAEAgG,EAAAC,IACA/E,EAAA2W,EAAA7R,MACA,IACA4R,EAAA5X,KAAAkB,EACAA,EAAA,KAAAA,EAAA,IACA0W,EAAA5X,MAAA,GAAAkB,IAAA,KAAA2W,EAAA7R,KACA9E,EAAA,KAAAA,EAAA,KACAA,IAAA,EAAAA,IAAA,OAAA2W,EAAA7R,OAAA,OAAA6R,EAAA7R,OAAA,KAAA6R,EAAA7R,MAAA,MACA4R,EAAA5X,KAAA,OAAAkB,GAAA,IACA0W,EAAA5X,KAAA,YAAAkB,IAEA0W,EAAA5X,MAAA,GAAAkB,IAAA,OAAA2W,EAAA7R,OAAA,KAAA6R,EAAA7R,KACAhG,EAAA,QACA4D,MAAA,KAAAgB,KAAA6H,OAAAsM,aAAA5J,MAAA1C,OAAAmL,IACA5X,EAAA,GAGA,OAAA4D,GACA5D,GACA4D,EAAAgB,KAAA6H,OAAAsM,aAAA5J,MAAA1C,OAAAmL,EAAArT,MAAA,EAAAvE,KACA4D,EAAAuB,KAAA,KAEAsH,OAAAsM,aAAA5J,MAAA1C,OAAAmL,EAAArT,MAAA,EAAAvE,KAUAuH,EAAAqG,MAAA,SAAA9C,EAAA+M,EAAAG,GAIA,IAHA,IACAgB,EACAC,EAFAjT,EAAAgS,EAGAhY,EAAA,EAAmBA,EAAA8K,EAAA/G,SAAmB/D,GACtCgZ,EAAAlO,EAAAgO,WAAA9Y,IACA,IACA6X,EAAAG,KAAAgB,EACSA,EAAA,MACTnB,EAAAG,KAAAgB,GAAA,MACAnB,EAAAG,KAAA,GAAAgB,EAAA,KACS,cAAAA,IAAA,eAAAC,EAAAnO,EAAAgO,WAAA9Y,EAAA,MACTgZ,EAAA,aAAAA,IAAA,UAAAC,KACAjZ,EACA6X,EAAAG,KAAAgB,GAAA,OACAnB,EAAAG,KAAAgB,GAAA,UACAnB,EAAAG,KAAAgB,GAAA,SACAnB,EAAAG,KAAA,GAAAgB,EAAA,MAEAnB,EAAAG,KAAAgB,GAAA,OACAnB,EAAAG,KAAAgB,GAAA,SACAnB,EAAAG,KAAA,GAAAgB,EAAA,KAGA,OAAAhB,EAAAhS,qBCvGA,SAAAtC,GAAA,IAAAwV,OAAA,IAAAxV,MAAA,GACAyV,EAAAD,EAAAvW,KAAA,OAAAuW,EAAAvW,IAEA,SAAAiD,EAAA+R,EAAAyB,GACA,IAAAC,EAAAD,GAAA,GAUA,OATAC,EAAA5L,UAAAkK,OAAAb,OAAAqC,EACAE,EAAAC,KAAArF,IAAAoF,EAAA5L,UAAArO,EAAAma,KAAAtF,EAAA7U,EAAAoa,MAAAvF,GACAoF,EAAArL,IAAAiG,IAAAoF,EAAA5L,UAAArO,EAAAqa,IAAAxF,EAAA7U,EAAAoa,MAAAvF,GACAoF,EAAAK,MAAAzF,IAAAoF,EAAA5L,UAAArO,EAAAua,MAAA1F,EAAA7U,EAAAoa,MAAAvF,GACAoF,EAAAxL,OAAAoG,IAAAoF,EAAA5L,UAAArO,EAAAwa,OAAA3F,EAAA7U,EAAAoa,MAAAvF,GACAoF,EAAAQ,KAAA5F,IAAAoF,EAAA5L,UAAArO,EAAA0a,KAAA7F,EAAA7U,EAAAoa,MAAAvF,GACAoF,EAAAU,QAAA9F,IAAAoF,EAAA5L,UAAArO,EAAA4a,QAAA/F,EAAA7U,EAAAoa,MAAAvF,GACAoF,EAAAhL,KAAA4F,IAAAoF,EAAA5L,UAAArO,EAAA6a,KAAAhG,EAAA7U,EAAAoa,MAAAvF,GACAoF,EAAAjL,MAAA6F,IAAAoF,EAAA5L,UAAArO,EAAA8a,MAAAjG,EAAA7U,EAAAoa,MAAAvF,GACAoF,EAGAja,EAAA+M,OAAAvG,EAAAsT,EAAA/M,OAAA/M,GACAA,EAAAiN,OAAAzG,EAAAsT,EAAA7M,QACAjN,EAAAwG,OAEAxG,EAAAma,KAAA,QACAna,EAAAqa,IAAA,QACAra,EAAAua,MAAA,QACAva,EAAAwa,OAAA,QACAxa,EAAA0a,KAAA,QACA1a,EAAA4a,QAAA,QACA5a,EAAA6a,KAAA,QACA7a,EAAA8a,MAAA,QACA9a,EAAAoa,MAAA,wCCkDApa,EAAAkO,MApEA,SAAA1K,EAAAuX,GACA,IAAA5R,EAAA,GACAmF,EAAA,GACA3I,UAAA,GACA+I,EAAA,GAGA4D,EAAA,GACAhR,OAAA4L,KAAA6N,GAAA5O,QAAAhK,IACA,IAAA6Y,EAAAD,EAAA5Y,GACA,MAAA6Y,EAAAxI,QACA,iBAAAwI,EAAAxI,MAAAF,EAAA0I,EAAAxI,OAAArQ,EACAkE,MAAA+G,QAAA4N,EAAAxI,QAAAwI,EAAAxI,MAAArG,QAAAqG,GAAAF,EAAAE,GAAArQ,IAEA,MAAA6Y,EAAAC,UAAA9R,EAAAhH,GAAA6Y,EAAAC,WAIA,QAAAra,EAAA,EAAAoP,GAAAxM,IAAA2B,SAAAR,OAAmD/D,EAAAoP,IAAOpP,EAAA,CAC1D,IAAA2N,EAAA/K,EAAA5C,GACA,SAAA2N,EAAA,GAAsB3N,EAAK,MAC3B,IAAiDoa,EAAA7Y,EAAjD+Y,EAAA,gDAAiDhW,KAAAqJ,GACjD,GAAA2M,EACAH,EAAAxM,GAAAyM,EAAAD,EAAA5Y,EAAAoM,GACA,MAAA2M,EAAA,IACAF,EAAAD,EAAA5Y,EAAAmQ,EAAA4I,EAAA,GAAAxK,UAAA,OACA,MAAAwK,EAAA,KAAA1X,EAAA5C,KAAAsa,EAAA,IACO,MAAAA,EAAA,KACPF,EAAAD,EAAA5Y,EAAA+Y,EAAA,GAAAxK,UAAA,MACA,MAAAwK,EAAA,KAAA1X,EAAA5C,KAAAsa,EAAA,QAEK,CACL,OAAA3M,EAAAmL,WAAA,GACA,CAAY/T,UAAAH,KAAA+I,GAAqB,SADjCyM,EAAAD,EAAA5Y,EAAAoM,GAGA,GAAAyM,EAAA,CACA,SAAAA,EAAAG,MAAA,MAAAH,EAAAG,KAAAhS,EAAAhH,IAAA,OAEA,GAAAvB,EAAA,EAAA4C,EAAAmB,QAAA,IAAAnB,EAAA5C,EAAA,GAAA8Y,WAAA,GACA,OAAAsB,EAAAG,MACA,QAAAhS,EAAAhH,GAAAiZ,SAAA5X,IAAA5C,GAAA,IAA6D,MAC7D,QAAAuI,EAAAhH,IAAAgH,EAAAhH,IAAA,IAAAiF,OAAAgU,SAAA5X,IAAA5C,GAAA,KAA0F,MAC1F,QAAAuI,EAAAhH,GAAAkZ,WAAA7X,IAAA5C,IAA2D,MAC3D,QAAAuI,EAAAhH,IAAAgH,EAAAhH,IAAA,IAAAiF,OAAAiU,WAAA7X,IAAA5C,KAAwF,MACxF,QAAAuI,EAAAhH,GAAAkL,OAAA7J,IAAA5C,IAAuD,MACvD,QAAAuI,EAAAhH,IAAAgH,EAAAhH,IAAA,IAAAiF,OAAA5D,IAAA5C,GAAAkF,MAAA,MAAuF,MACvF,QAAAwI,EAAA9I,KAAA+I,KAAuC3N,OAGvC,OAAAoa,EAAAG,MACA,QACA,QAAAhS,EAAAhH,GAAA6Y,EAAAC,SAAA,EAAyD,MACzD,QAAA9R,EAAAhH,GAAA6Y,EAAAC,SAAA,GAA0D,MAC1D,QACA,QACA,QAAA9R,EAAAhH,GAAAgH,EAAA8R,SAAA,GAA2D,MAC3D,QAAA3M,EAAA9I,KAAA+I,GAIAyM,EAAAnZ,OAAAP,OAAA4L,KAAA8N,EAAAnZ,OAAAsK,QAAA6D,GAAA7G,EAAA6G,GAAAgL,EAAAnZ,MAAAmO,SACK1B,EAAA9I,KAAA+I,GAEL,KAAA3N,EAAAoP,GAAAtB,EAAAlJ,KAAAhC,EAAA5C,MAEA,OAAUuI,UAAAmF,UAAA3I,oBAAA+I,aA8BV1O,EAAA6O,KAxBA,SAAAkM,EAAA5R,GACAA,MAAA,IACA,IAAAmS,EAAAnS,EAAAmS,QAAA,EACAC,EAAApS,EAAAoS,SAAA,GACAC,EAAArS,EAAAqS,KAAA,KACAC,EAAA,GAgBA,OAfAna,OAAA4L,KAAA6N,GAAA5O,QAAAhK,IACA,IAAA6Y,EAAAD,EAAA5Y,GACA,SAAA6Y,EAAAU,YAAA,CAEA,IADA,IAAA7G,EAAA,GACAA,EAAAlQ,OAAA2W,GAAAzG,GAAA,IAGA,IAFAA,GAAA,KAAA1S,EACA6Y,EAAAxI,QAAAqC,GAAA,MAAAmG,EAAAxI,OACAqC,EAAAlQ,OAAA4W,GAAA1G,GAAA,IACAxO,MAAA+G,QAAA4N,EAAAU,aACAD,EAAAjW,KAAAqP,EAAAmG,EAAAU,YAAA,GAAAV,EAAAU,YAAAvW,MAAA,GAAAgG,IAAAwQ,IACA,QAAA/a,EAAA,EAAuBA,EAAA2a,IAAa3a,EAAA+a,EAAA,IAAAA,EACpC,OAAAH,EAAAG,IACO5V,KAAA,KACF0V,EAAAjW,KAAAqP,EAAAmG,EAAAU,gBAELD,EAAA1V,KAAAyV,sBCvGA,SAAAlX,GAwBA,IAAA1B,EAAWlC,EAAQ,GACnBwH,EAASxH,EAAQ,GACjBkb,EAAAR,SAAA,UAEAnb,EAAAD,QAAA,SAAAsI,EAAA5F,EAAAuL,EAAA4N,GACA5N,GAAA,iBAAAA,IACAA,EAAA,CAAYlM,KAAAkM,IAEZ,IAAAlM,EAAAkM,EAAAlM,UACA+Z,IAAA/Z,IACAA,EAAA6Z,GAAAtX,EAAAN,SAEA6X,MAAA,MACAnZ,EAAAE,EAAAiB,QAAAnB,GACA,IACAwF,EAAA6T,UAAArZ,EAAAX,GACA8Z,KAAAnZ,EACG,MAAAsZ,GACH,OAAAA,EAAArT,MACA,aACAkT,EAAAvT,EAAA1F,EAAA2E,QAAA7E,GAAAuL,EAAA4N,GACAvT,EAAA5F,EAAAuL,EAAA4N,GACA,MACA,QACA,IAAAI,EACA,IACAA,EAAA/T,EAAAgU,SAAAxZ,GACS,MAAAyZ,GACT,MAAAH,EAEA,IAAAC,EAAAG,cAAA,MAAAJ,GAIA,OAAAH,oCC1DA,YAAArb,gCAAA,CAA4D,IAAAL,EAAA,IAAAuD,MAAA,uCAAsF,MAA7BvD,EAAAwI,KAAA,mBAA6BxI,EAClJF,EAAAD,QAAAQ,68ICDA,SAAA6b,EAAAC,GACA,IAAAnc,EAAA,IAAAuD,MAAA,uBAAA4Y,EAAA,KAEA,MADAnc,EAAAwI,KAAA,mBACAxI,EAEAkc,EAAAnP,KAAA,WAAuC,UACvCmP,EAAAxY,QAAAwY,EACApc,EAAAD,QAAAqc,EACAA,EAAAE,GAAA,qBCRA,SAAAjY,EAAA2D,GAAAhI,EAAAD,QAAAsE,EAAAsT,QAcA,SAAA4E,GACA,IAAAC,EAAA,KAAAC,EAAA3b,KAAA4b,GACAC,EAAA5V,KAAA6V,MAAAJ,GACAK,EAAA9V,KAAA6V,MAAAJ,EAAA,OACAD,IACAI,GAAAJ,EAAA,IACAM,GAAAN,EAAA,IACA,IACAI,IACAE,GAAA,MAGA,OAAAF,EAAAE,IAvBA,IAAAH,EAAA1U,EAAA0U,aAAA,GACAD,EACAC,EAAAI,KACAJ,EAAAK,QACAL,EAAAM,OACAN,EAAAO,MACAP,EAAAQ,WACA,WAAa,WAAAC,MAAAC","file":"asc.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory((function webpackLoadOptionalExternalModule() { try { return require(\"assemblyscript\"); } catch(e) {} }()));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"assemblyscript\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"asc\"] = factory((function webpackLoadOptionalExternalModule() { try { return require(\"assemblyscript\"); } catch(e) {} }()));\n\telse\n\t\troot[\"asc\"] = factory(root[\"assemblyscript\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE__10__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n","exports.nextTick = function nextTick(fn) {\n\tsetTimeout(fn, 0);\n};\n\nexports.platform = exports.arch = \nexports.execPath = exports.title = 'browser';\nexports.pid = 1;\nexports.browser = true;\nexports.env = {};\nexports.argv = [];\n\nexports.binding = function (name) {\n\tthrow new Error('No such module. (Possibly not yet loaded)')\n};\n\n(function () {\n var cwd = '/';\n var path;\n exports.cwd = function () { return cwd };\n exports.chdir = function (dir) {\n if (!path) path = require('path');\n cwd = path.resolve(dir, cwd);\n };\n})();\n\nexports.exit = exports.kill = \nexports.umask = exports.dlopen = \nexports.uptime = exports.memoryUsage = \nexports.uvCounters = function() {};\nexports.features = {};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\r\n * Compiler frontend for node.js\r\n *\r\n * Uses the low-level API exported from src/index.ts so it works with the compiler compiled to\r\n * JavaScript as well as the compiler compiled to WebAssembly (eventually). Runs the sources\r\n * directly through ts-node if distribution files are not present (indicated by a `-dev` version).\r\n *\r\n * Can also be packaged as a bundle suitable for in-browser use with the standard library injected\r\n * in the build step. See dist/asc.js for the bundle and webpack.config.js for building details.\r\n *\r\n * @module cli/asc\r\n */\r\n\r\n// Use \".\" instead of \"/\" as cwd in browsers\r\nif (process.browser) process.cwd = function() { return \".\"; };\r\n\r\nconst fs = require(\"fs\");\r\nconst path = require(\"path\");\r\nconst utf8 = require(\"@protobufjs/utf8\");\r\nconst colorsUtil = require(\"./util/colors\");\r\nconst optionsUtil = require(\"./util/options\");\r\nconst mkdirp = require(\"./util/mkdirp\");\r\nconst EOL = process.platform === \"win32\" ? \"\\r\\n\" : \"\\n\";\r\n\r\n// Emscripten adds an `uncaughtException` listener to Binaryen that results in an additional\r\n// useless code fragment on top of an actual error. suppress this:\r\nif (process.removeAllListeners) process.removeAllListeners(\"uncaughtException\");\r\n\r\n// Use distribution files if present, otherwise run the sources directly\r\nvar assemblyscript, isDev = false;\r\n(() => {\r\n try { // `asc` on the command line\r\n assemblyscript = require(\"../dist/assemblyscript.js\");\r\n } catch (e) {\r\n try { // `asc` on the command line without dist files\r\n require(\"ts-node\").register({ project: path.join(__dirname, \"..\", \"src\", \"tsconfig.json\") });\r\n require(\"../src/glue/js\");\r\n assemblyscript = require(\"../src\");\r\n isDev = true;\r\n } catch (e_ts) {\r\n try { // `require(\"dist/asc.js\")` in explicit browser tests\r\n assemblyscript = eval(\"require('./assemblyscript')\");\r\n } catch (e) {\r\n // combine both errors that lead us here\r\n e.stack = e_ts.stack + \"\\n---\\n\" + e.stack;\r\n throw e;\r\n }\r\n }\r\n }\r\n})();\r\n\r\n/** Whether this is a webpack bundle or not. */\r\nexports.isBundle = typeof BUNDLE_VERSION === \"string\";\r\n\r\n/** Whether asc runs the sources directly or not. */\r\nexports.isDev = isDev;\r\n\r\n/** AssemblyScript version. */\r\nexports.version = exports.isBundle ? BUNDLE_VERSION : require(\"../package.json\").version;\r\n\r\n/** Available CLI options. */\r\nexports.options = require(\"./asc.json\");\r\n\r\n/** Common root used in source maps. */\r\nexports.sourceMapRoot = \"assemblyscript:///\";\r\n\r\n/** Prefix used for library files. */\r\nexports.libraryPrefix = assemblyscript.LIBRARY_PREFIX;\r\n\r\n/** Default Binaryen optimization level. */\r\nexports.defaultOptimizeLevel = 2;\r\n\r\n/** Default Binaryen shrink level. */\r\nexports.defaultShrinkLevel = 1;\r\n\r\n/** Bundled library files. */\r\nexports.libraryFiles = exports.isBundle ? BUNDLE_LIBRARY : (() => { // set up if not a bundle\r\n const libDir = path.join(__dirname, \"..\", \"std\", \"assembly\");\r\n const libFiles = require(\"glob\").sync(\"**/!(*.d).ts\", { cwd: libDir });\r\n const bundled = {};\r\n libFiles.forEach(file => bundled[file.replace(/\\.ts$/, \"\")] = fs.readFileSync(path.join(libDir, file), \"utf8\" ));\r\n return bundled;\r\n})();\r\n\r\n/** Bundled definition files. */\r\nexports.definitionFiles = exports.isBundle ? BUNDLE_DEFINITIONS : (() => { // set up if not a bundle\r\n const stdDir = path.join(__dirname, \"..\", \"std\");\r\n return {\r\n \"assembly\": fs.readFileSync(path.join(stdDir, \"assembly\", \"index.d.ts\"), \"utf8\"),\r\n \"portable\": fs.readFileSync(path.join(stdDir, \"portable\", \"index.d.ts\"), \"utf8\")\r\n };\r\n})();\r\n\r\n/** Convenience function that parses and compiles source strings directly. */\r\nexports.compileString = (sources, options) => {\r\n if (typeof sources === \"string\") sources = { \"input.ts\": sources };\r\n const output = Object.create({\r\n stdout: createMemoryStream(),\r\n stderr: createMemoryStream()\r\n });\r\n var argv = [\r\n \"--binaryFile\", \"binary\",\r\n \"--textFile\", \"text\",\r\n ];\r\n Object.keys(options || {}).forEach(key => {\r\n var val = options[key];\r\n if (Array.isArray(val)) val.forEach(val => argv.push(\"--\" + key, String(val)));\r\n else argv.push(\"--\" + key, String(val));\r\n });\r\n exports.main(argv.concat(Object.keys(sources)), {\r\n stdout: output.stdout,\r\n stderr: output.stderr,\r\n readFile: name => sources.hasOwnProperty(name) ? sources[name] : null,\r\n writeFile: (name, contents) => output[name] = contents,\r\n listFiles: () => []\r\n });\r\n return output;\r\n}\r\n\r\n/** Runs the command line utility using the specified arguments array. */\r\nexports.main = function main(argv, options, callback) {\r\n if (typeof options === \"function\") {\r\n callback = options;\r\n options = {};\r\n } else if (!options) {\r\n options = {};\r\n }\r\n\r\n const stdout = options.stdout || process.stdout;\r\n const stderr = options.stderr || process.stderr;\r\n const readFile = options.readFile || readFileNode;\r\n const writeFile = options.writeFile || writeFileNode;\r\n const listFiles = options.listFiles || listFilesNode;\r\n const stats = options.stats || createStats();\r\n\r\n // Output must be specified if not present in the environment\r\n if (!stdout) throw Error(\"'options.stdout' must be specified\");\r\n if (!stderr) throw Error(\"'options.stderr' must be specified\");\r\n\r\n const opts = optionsUtil.parse(argv, exports.options);\r\n const args = opts.options;\r\n argv = opts.arguments;\r\n if (args.noColors) {\r\n colorsUtil.stdout.supported =\r\n colorsUtil.stderr.supported = false;\r\n } else {\r\n colorsUtil.stdout = colorsUtil.from(stdout);\r\n colorsUtil.stderr = colorsUtil.from(stderr);\r\n }\r\n\r\n // Check for unknown arguments\r\n if (opts.unknown.length) {\r\n opts.unknown.forEach(arg => {\r\n stderr.write(colorsUtil.stderr.yellow(\"WARN: \") + \"Unknown option '\" + arg + \"'\" + EOL);\r\n });\r\n }\r\n\r\n // Check for trailing arguments\r\n if (opts.trailing.length) {\r\n stderr.write(colorsUtil.stderr.yellow(\"WARN: \") + \"Unsupported trailing arguments: \" + opts.trailing.join(\" \") + EOL);\r\n }\r\n\r\n // Use default callback if none is provided\r\n if (!callback) callback = function defaultCallback(err) {\r\n var code = 0;\r\n if (err) {\r\n stderr.write(colorsUtil.stderr.red(\"ERROR: \") + err.stack.replace(/^ERROR: /i, \"\") + EOL);\r\n code = 1;\r\n }\r\n return code;\r\n };\r\n\r\n // Just print the version if requested\r\n if (args.version) {\r\n stdout.write(\"Version \" + exports.version + (isDev ? \"-dev\" : \"\") + EOL);\r\n return callback(null);\r\n }\r\n // Print the help message if requested or no source files are provided\r\n if (args.help || !argv.length) {\r\n var out = args.help ? stdout : stderr;\r\n var color = args.help ? colorsUtil.stdout : colorsUtil.stderr;\r\n out.write([\r\n color.white(\"SYNTAX\"),\r\n \" \" + color.cyan(\"asc\") + \" [entryFile ...] [options]\",\r\n \"\",\r\n color.white(\"EXAMPLES\"),\r\n \" \" + color.cyan(\"asc\") + \" hello.ts\",\r\n \" \" + color.cyan(\"asc\") + \" hello.ts -b hello.wasm -t hello.wat\",\r\n \" \" + color.cyan(\"asc\") + \" hello1.ts hello2.ts -b -O > hello.wasm\",\r\n \"\",\r\n color.white(\"OPTIONS\"),\r\n ].concat(\r\n optionsUtil.help(exports.options, 24, EOL)\r\n ).join(EOL) + EOL);\r\n return callback(null);\r\n }\r\n\r\n // I/O must be specified if not present in the environment\r\n if (!fs.readFileSync) {\r\n if (readFile === readFileNode) throw Error(\"'options.readFile' must be specified\");\r\n if (writeFile === writeFileNode) throw Error(\"'options.writeFile' must be specified\");\r\n if (listFiles === listFilesNode) throw Error(\"'options.listFiles' must be specified\");\r\n }\r\n\r\n // Set up base directory\r\n const baseDir = args.baseDir ? path.resolve(args.baseDir) : \".\";\r\n\r\n // Set up transforms\r\n const transforms = [];\r\n if (args.transform) {\r\n args.transform.forEach(transform =>\r\n transforms.push(\r\n require(\r\n path.isAbsolute(transform = transform.trim())\r\n ? transform\r\n : path.join(process.cwd(), transform)\r\n )\r\n )\r\n );\r\n }\r\n function applyTransform(name, ...args) {\r\n transforms.forEach(transform => {\r\n if (typeof transform[name] === \"function\") transform[name](...args);\r\n });\r\n }\r\n\r\n // Begin parsing\r\n var parser = null;\r\n\r\n // Include library files\r\n if (!args.noLib) {\r\n Object.keys(exports.libraryFiles).forEach(libPath => {\r\n if (libPath.indexOf(\"/\") >= 0) return; // in sub-directory: imported on demand\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n parser = assemblyscript.parseFile(\r\n exports.libraryFiles[libPath],\r\n exports.libraryPrefix + libPath + \".ts\",\r\n false,\r\n parser\r\n );\r\n });\r\n });\r\n } else { // always include builtins\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n parser = assemblyscript.parseFile(\r\n exports.libraryFiles[\"builtins\"],\r\n exports.libraryPrefix + \"builtins.ts\",\r\n false,\r\n parser\r\n );\r\n });\r\n }\r\n const customLibDirs = [];\r\n if (args.lib) {\r\n let lib = args.lib;\r\n if (typeof lib === \"string\") lib = lib.split(\",\");\r\n Array.prototype.push.apply(customLibDirs, lib.map(lib => lib.trim()));\r\n for (let i = 0, k = customLibDirs.length; i < k; ++i) { // custom\r\n let libDir = customLibDirs[i];\r\n let libFiles;\r\n if (libDir.endsWith(\".ts\")) {\r\n libFiles = [ path.basename(libDir) ];\r\n libDir = path.dirname(libDir);\r\n } else {\r\n libFiles = listFiles(libDir);\r\n }\r\n for (let j = 0, l = libFiles.length; j < l; ++j) {\r\n let libPath = libFiles[j];\r\n let libText = readFile(libPath, libDir);\r\n if (libText === null) return callback(Error(\"Library file '\" + libPath + \"' not found.\"));\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n parser = assemblyscript.parseFile(\r\n libText,\r\n exports.libraryPrefix + libPath,\r\n false,\r\n parser\r\n );\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Parses the backlog of imported files after including entry files\r\n function parseBacklog() {\r\n var sourcePath, sourceText;\r\n while ((sourcePath = parser.nextFile()) != null) {\r\n\r\n // Load library file if explicitly requested\r\n if (sourcePath.startsWith(exports.libraryPrefix)) {\r\n const plainName = sourcePath.substring(exports.libraryPrefix.length);\r\n const indexName = sourcePath.substring(exports.libraryPrefix.length) + \"/index\";\r\n if (exports.libraryFiles.hasOwnProperty(plainName)) {\r\n sourceText = exports.libraryFiles[plainName];\r\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\r\n } else if (exports.libraryFiles.hasOwnProperty(indexName)) {\r\n sourceText = exports.libraryFiles[indexName];\r\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\r\n } else {\r\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\r\n sourceText = readFile(plainName + \".ts\", customLibDirs[i]);\r\n if (sourceText !== null) {\r\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\r\n break;\r\n } else {\r\n sourceText = readFile(indexName + \".ts\", customLibDirs[i]);\r\n if (sourceText !== null) {\r\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Otherwise try nextFile.ts, nextFile/index.ts, ~lib/nextFile.ts, ~lib/nextFile/index.ts\r\n } else {\r\n const plainName = sourcePath;\r\n const indexName = sourcePath + \"/index\";\r\n sourceText = readFile(plainName + \".ts\", baseDir);\r\n if (sourceText !== null) {\r\n sourcePath = plainName + \".ts\";\r\n } else {\r\n sourceText = readFile(indexName + \".ts\", baseDir);\r\n if (sourceText !== null) {\r\n sourcePath = indexName + \".ts\";\r\n } else if (!plainName.startsWith(\".\")) {\r\n if (exports.libraryFiles.hasOwnProperty(plainName)) {\r\n sourceText = exports.libraryFiles[plainName];\r\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\r\n } else if (exports.libraryFiles.hasOwnProperty(indexName)) {\r\n sourceText = exports.libraryFiles[indexName];\r\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\r\n } else {\r\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\r\n const dir = customLibDirs[i];\r\n sourceText = readFile(plainName + \".ts\", customLibDirs[i]);\r\n if (sourceText !== null) {\r\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\r\n break;\r\n } else {\r\n sourceText = readFile(indexName + \".ts\", customLibDirs[i]);\r\n if (sourceText !== null) {\r\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (sourceText == null) {\r\n return callback(Error(\"Import file '\" + sourcePath + \".ts' not found.\"));\r\n }\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n assemblyscript.parseFile(sourceText, sourcePath, false, parser);\r\n });\r\n }\r\n if (checkDiagnostics(parser, stderr)) {\r\n return callback(Error(\"Parse error\"));\r\n }\r\n }\r\n\r\n // Include entry files\r\n for (let i = 0, k = argv.length; i < k; ++i) {\r\n const filename = argv[i];\r\n\r\n let sourcePath = String(filename).replace(/\\\\/g, \"/\").replace(/(\\.ts|\\/)$/, \"\");\r\n\r\n // Try entryPath.ts, then entryPath/index.ts\r\n let sourceText = readFile(sourcePath + \".ts\", baseDir);\r\n if (sourceText === null) {\r\n sourceText = readFile(sourcePath + \"/index.ts\", baseDir);\r\n if (sourceText === null) {\r\n return callback(Error(\"Entry file '\" + sourcePath + \".ts' not found.\"));\r\n } else {\r\n sourcePath += \"/index.ts\";\r\n }\r\n } else {\r\n sourcePath += \".ts\";\r\n }\r\n\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n parser = assemblyscript.parseFile(sourceText, sourcePath, true, parser);\r\n });\r\n let code = parseBacklog();\r\n if (code) return code;\r\n }\r\n\r\n applyTransform(\"afterParse\", parser);\r\n {\r\n let code = parseBacklog();\r\n if (code) return code;\r\n }\r\n\r\n // Finish parsing\r\n const program = assemblyscript.finishParsing(parser);\r\n\r\n // Set up optimization levels\r\n var optimizeLevel = 0;\r\n var shrinkLevel = 0;\r\n if (args.optimize) {\r\n optimizeLevel = exports.defaultOptimizeLevel;\r\n shrinkLevel = exports.defaultShrinkLevel;\r\n }\r\n if (typeof args.optimizeLevel === \"number\") {\r\n optimizeLevel = args.optimizeLevel;\r\n }\r\n if (typeof args.shrinkLevel === \"number\") {\r\n shrinkLevel = args.shrinkLevel;\r\n }\r\n optimizeLevel = Math.min(Math.max(optimizeLevel, 0), 3);\r\n shrinkLevel = Math.min(Math.max(shrinkLevel, 0), 2);\r\n\r\n // Begin compilation\r\n const compilerOptions = assemblyscript.createOptions();\r\n assemblyscript.setTarget(compilerOptions, 0);\r\n assemblyscript.setNoTreeShaking(compilerOptions, args.noTreeShaking);\r\n assemblyscript.setNoAssert(compilerOptions, args.noAssert);\r\n assemblyscript.setImportMemory(compilerOptions, args.importMemory);\r\n assemblyscript.setImportTable(compilerOptions, args.importTable);\r\n assemblyscript.setMemoryBase(compilerOptions, args.memoryBase >>> 0);\r\n assemblyscript.setSourceMap(compilerOptions, args.sourceMap != null);\r\n assemblyscript.setOptimizeLevelHints(compilerOptions, optimizeLevel, shrinkLevel);\r\n\r\n if (!args.noLib) {\r\n // Initialize default aliases\r\n assemblyscript.setGlobalAlias(compilerOptions, \"Math\", \"NativeMath\");\r\n assemblyscript.setGlobalAlias(compilerOptions, \"Mathf\", \"NativeMathf\");\r\n assemblyscript.setGlobalAlias(compilerOptions, \"abort\", \"~lib/env/abort\");\r\n assemblyscript.setGlobalAlias(compilerOptions, \"trace\", \"~lib/env/trace\");\r\n }\r\n\r\n // Add or override aliases if specified\r\n if (args.use) {\r\n let aliases = args.use;\r\n for (let i = 0, k = aliases.length; i < k; ++i) {\r\n let part = aliases[i];\r\n let p = part.indexOf(\"=\");\r\n if (p < 0) return callback(Error(\"Global alias '\" + part + \"' is invalid.\"));\r\n let name = part.substring(0, p).trim();\r\n let alias = part.substring(p + 1).trim();\r\n if (!name.length) return callback(Error(\"Global alias '\" + part + \"' is invalid.\"));\r\n assemblyscript.setGlobalAlias(compilerOptions, name, alias);\r\n }\r\n }\r\n\r\n // Enable additional features if specified\r\n var features = args.enable;\r\n if (features != null) {\r\n if (typeof features === \"string\") features = features.split(\",\");\r\n for (let i = 0, k = features.length; i < k; ++i) {\r\n let name = features[i].trim();\r\n let flag = assemblyscript[\"FEATURE_\" + name.replace(/\\-/g, \"_\").toUpperCase()];\r\n if (!flag) return callback(Error(\"Feature '\" + name + \"' is unknown.\"));\r\n assemblyscript.enableFeature(compilerOptions, flag);\r\n }\r\n }\r\n\r\n var module;\r\n stats.compileCount++;\r\n (() => {\r\n try {\r\n stats.compileTime += measure(() => {\r\n module = assemblyscript.compileProgram(program, compilerOptions);\r\n });\r\n } catch (e) {\r\n return callback(e);\r\n }\r\n })();\r\n if (checkDiagnostics(parser, stderr)) {\r\n if (module) module.dispose();\r\n return callback(Error(\"Compile error\"));\r\n }\r\n\r\n // Validate the module if requested\r\n if (args.validate) {\r\n stats.validateCount++;\r\n stats.validateTime += measure(() => {\r\n if (!module.validate()) {\r\n module.dispose();\r\n return callback(Error(\"Validate error\"));\r\n }\r\n });\r\n }\r\n\r\n // Set Binaryen-specific options\r\n if (args.trapMode === \"clamp\") {\r\n stats.optimizeCount++;\r\n stats.optimizeTime += measure(() => {\r\n module.runPasses([ \"trap-mode-clamp\" ]);\r\n });\r\n } else if (args.trapMode === \"js\") {\r\n stats.optimizeCount++;\r\n stats.optimizeTime += measure(() => {\r\n module.runPasses([ \"trap-mode-js\" ]);\r\n });\r\n } else if (args.trapMode !== \"allow\") {\r\n module.dispose();\r\n return callback(Error(\"Unsupported trap mode\"));\r\n }\r\n\r\n // Implicitly run costly non-LLVM optimizations on -O3 or -Oz\r\n // see: https://github.com/WebAssembly/binaryen/pull/1596\r\n if (optimizeLevel >= 3 || shrinkLevel >= 2) optimizeLevel = 4;\r\n\r\n module.setOptimizeLevel(optimizeLevel);\r\n module.setShrinkLevel(shrinkLevel);\r\n module.setDebugInfo(args.debug);\r\n\r\n var runPasses = [];\r\n if (args.runPasses) {\r\n if (typeof args.runPasses === \"string\") {\r\n args.runPasses = args.runPasses.split(\",\");\r\n }\r\n if (args.runPasses.length) {\r\n args.runPasses.forEach(pass => {\r\n if (runPasses.indexOf(pass) < 0)\r\n runPasses.push(pass);\r\n });\r\n }\r\n }\r\n\r\n // Optimize the module if requested\r\n if (optimizeLevel > 0 || shrinkLevel > 0) {\r\n stats.optimizeCount++;\r\n stats.optimizeTime += measure(() => {\r\n module.optimize();\r\n });\r\n }\r\n\r\n // Run additional passes if requested\r\n if (runPasses.length) {\r\n stats.optimizeCount++;\r\n stats.optimizeTime += measure(() => {\r\n module.runPasses(runPasses.map(pass => pass.trim()));\r\n });\r\n }\r\n\r\n // Prepare output\r\n if (!args.noEmit) {\r\n let hasStdout = false;\r\n let hasOutput = false;\r\n\r\n if (args.outFile != null) {\r\n if (/\\.was?t$/.test(args.outFile) && args.textFile == null) {\r\n args.textFile = args.outFile;\r\n } else if (/\\.js$/.test(args.outFile) && args.asmjsFile == null) {\r\n args.asmjsFile = args.outFile;\r\n } else if (args.binaryFile == null) {\r\n args.binaryFile = args.outFile;\r\n }\r\n }\r\n\r\n // Write binary\r\n if (args.binaryFile != null) {\r\n let sourceMapURL = args.sourceMap != null\r\n ? args.sourceMap.length\r\n ? args.sourceMap\r\n : path.basename(args.binaryFile) + \".map\"\r\n : null;\r\n\r\n let wasm;\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n wasm = module.toBinary(sourceMapURL)\r\n });\r\n\r\n if (args.binaryFile.length) {\r\n writeFile(args.binaryFile, wasm.output, baseDir);\r\n } else {\r\n writeStdout(wasm.output);\r\n hasStdout = true;\r\n }\r\n hasOutput = true;\r\n\r\n // Post-process source map\r\n if (wasm.sourceMap != null) {\r\n if (args.binaryFile.length) {\r\n let sourceMap = JSON.parse(wasm.sourceMap);\r\n sourceMap.sourceRoot = exports.sourceMapRoot;\r\n sourceMap.sources.forEach((name, index) => {\r\n let text = null;\r\n if (name.startsWith(exports.libraryPrefix)) {\r\n let stdName = name.substring(exports.libraryPrefix.length).replace(/\\.ts$/, \"\");\r\n if (exports.libraryFiles.hasOwnProperty(stdName)) {\r\n text = exports.libraryFiles[stdName];\r\n } else {\r\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\r\n text = readFile(name.substring(exports.libraryPrefix.length), customLibDirs[i]);\r\n if (text !== null) break;\r\n }\r\n }\r\n } else {\r\n text = readFile(name, baseDir);\r\n }\r\n if (text === null) {\r\n return callback(Error(\"Source file '\" + name + \"' not found.\"));\r\n }\r\n if (!sourceMap.sourceContents) sourceMap.sourceContents = [];\r\n sourceMap.sourceContents[index] = text;\r\n });\r\n writeFile(path.join(\r\n path.dirname(args.binaryFile),\r\n path.basename(sourceMapURL)\r\n ).replace(/^\\.\\//, \"\"), JSON.stringify(sourceMap), baseDir);\r\n } else {\r\n stderr.write(\"Skipped source map (stdout already occupied)\" + EOL);\r\n }\r\n }\r\n }\r\n\r\n // Write asm.js\r\n if (args.asmjsFile != null) {\r\n let asm;\r\n if (args.asmjsFile.length) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n asm = module.toAsmjs();\r\n });\r\n writeFile(args.asmjsFile, asm, baseDir);\r\n } else if (!hasStdout) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n asm = module.toAsmjs();\r\n });\r\n writeStdout(asm);\r\n hasStdout = true;\r\n }\r\n hasOutput = true;\r\n }\r\n\r\n // Write WebIDL\r\n if (args.idlFile != null) {\r\n let idl;\r\n if (args.idlFile.length) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n idl = assemblyscript.buildIDL(program);\r\n });\r\n writeFile(args.idlFile, idl, baseDir);\r\n } else if (!hasStdout) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n idl = assemblyscript.buildIDL(program);\r\n });\r\n writeStdout(idl);\r\n hasStdout = true;\r\n }\r\n hasOutput = true;\r\n }\r\n\r\n // Write TypeScript definition\r\n if (args.tsdFile != null) {\r\n let tsd;\r\n if (args.tsdFile.length) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n tsd = assemblyscript.buildTSD(program);\r\n });\r\n writeFile(args.tsdFile, tsd, baseDir);\r\n } else if (!hasStdout) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n tsd = assemblyscript.buildTSD(program);\r\n });\r\n writeStdout(tsd);\r\n hasStdout = true;\r\n }\r\n hasOutput = true;\r\n }\r\n\r\n // Write text (must be last)\r\n if (args.textFile != null || !hasOutput) {\r\n let wat;\r\n if (args.textFile && args.textFile.length) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n wat = module.toText();\r\n });\r\n writeFile(args.textFile, wat, baseDir);\r\n } else if (!hasStdout) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n wat = module.toText()\r\n });\r\n writeStdout(wat);\r\n }\r\n }\r\n }\r\n\r\n module.dispose();\r\n if (args.measure) {\r\n printStats(stats, stderr);\r\n }\r\n return callback(null);\r\n\r\n function readFileNode(filename, baseDir) {\r\n try {\r\n let text;\r\n stats.readCount++;\r\n stats.readTime += measure(() => {\r\n text = fs.readFileSync(path.join(baseDir, filename), { encoding: \"utf8\" });\r\n });\r\n return text;\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n function writeFileNode(filename, contents, baseDir) {\r\n try {\r\n stats.writeCount++;\r\n stats.writeTime += measure(() => {\r\n mkdirp(path.join(baseDir, path.dirname(filename)));\r\n if (typeof contents === \"string\") {\r\n fs.writeFileSync(path.join(baseDir, filename), contents, { encoding: \"utf8\" } );\r\n } else {\r\n fs.writeFileSync(path.join(baseDir, filename), contents);\r\n }\r\n });\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n function listFilesNode(dirname, baseDir) {\r\n var files;\r\n try {\r\n stats.readTime += measure(() => {\r\n files = fs.readdirSync(path.join(baseDir, dirname)).filter(file => /^(?!.*\\.d\\.ts$).*\\.ts$/.test(file));\r\n });\r\n return files;\r\n } catch (e) {\r\n return [];\r\n }\r\n }\r\n\r\n function writeStdout(contents) {\r\n if (!writeStdout.used) {\r\n stats.writeCount++;\r\n writeStdout.used = true;\r\n }\r\n stats.writeTime += measure(() => {\r\n if (typeof contents === \"string\") {\r\n stdout.write(contents, { encoding: \"utf8\" });\r\n } else {\r\n stdout.write(contents);\r\n }\r\n });\r\n }\r\n}\r\n\r\nvar argumentSubstitutions = {\r\n \"-O\" : [ \"--optimize\" ],\r\n \"-Os\" : [ \"--optimize\", \"--shrinkLevel\", \"1\" ],\r\n \"-Oz\" : [ \"--optimize\", \"--shrinkLevel\", \"2\" ],\r\n \"-O0\" : [ \"--optimizeLevel\", \"0\", \"--shrinkLevel\", \"0\" ],\r\n \"-O0s\": [ \"--optimizeLevel\", \"0\", \"--shrinkLevel\", \"1\" ],\r\n \"-O0z\": [ \"--optimizeLevel\", \"0\", \"--shrinkLevel\", \"2\" ],\r\n \"-O1\" : [ \"--optimizeLevel\", \"1\", \"--shrinkLevel\", \"0\" ],\r\n \"-O1s\": [ \"--optimizeLevel\", \"1\", \"--shrinkLevel\", \"1\" ],\r\n \"-O1z\": [ \"--optimizeLevel\", \"1\", \"--shrinkLevel\", \"2\" ],\r\n \"-O2\" : [ \"--optimizeLevel\", \"2\", \"--shrinkLevel\", \"0\" ],\r\n \"-O2s\": [ \"--optimizeLevel\", \"2\", \"--shrinkLevel\", \"1\" ],\r\n \"-O2z\": [ \"--optimizeLevel\", \"2\", \"--shrinkLevel\", \"2\" ],\r\n \"-O3\" : [ \"--optimizeLevel\", \"3\", \"--shrinkLevel\", \"0\" ],\r\n \"-O3s\": [ \"--optimizeLevel\", \"3\", \"--shrinkLevel\", \"1\" ],\r\n \"-O3z\": [ \"--optimizeLevel\", \"3\", \"--shrinkLevel\", \"2\" ],\r\n};\r\n\r\n/** Checks diagnostics emitted so far for errors. */\r\nfunction checkDiagnostics(emitter, stderr) {\r\n var diagnostic;\r\n var hasErrors = false;\r\n while ((diagnostic = assemblyscript.nextDiagnostic(emitter)) != null) {\r\n if (stderr) {\r\n stderr.write(\r\n assemblyscript.formatDiagnostic(diagnostic, stderr.isTTY, true) +\r\n EOL + EOL\r\n );\r\n }\r\n if (assemblyscript.isError(diagnostic)) hasErrors = true;\r\n }\r\n return hasErrors;\r\n}\r\n\r\nexports.checkDiagnostics = checkDiagnostics;\r\n\r\n/** Creates an empty set of stats. */\r\nfunction createStats() {\r\n return {\r\n readTime: 0,\r\n readCount: 0,\r\n writeTime: 0,\r\n writeCount: 0,\r\n parseTime: 0,\r\n parseCount: 0,\r\n compileTime: 0,\r\n compileCount: 0,\r\n emitTime: 0,\r\n emitCount: 0,\r\n validateTime: 0,\r\n validateCount: 0,\r\n optimizeTime: 0,\r\n optimizeCount: 0\r\n };\r\n}\r\n\r\nexports.createStats = createStats;\r\n\r\nif (!process.hrtime) process.hrtime = require(\"browser-process-hrtime\");\r\n\r\n/** Measures the execution time of the specified function. */\r\nfunction measure(fn) {\r\n const start = process.hrtime();\r\n fn();\r\n const times = process.hrtime(start);\r\n return times[0] * 1e9 + times[1];\r\n}\r\n\r\nexports.measure = measure;\r\n\r\n/** Formats a high resolution time to a human readable string. */\r\nfunction formatTime(time) {\r\n return time ? (time / 1e6).toFixed(3) + \" ms\" : \"N/A\";\r\n}\r\n\r\nexports.formatTime = formatTime;\r\n\r\n/** Formats and prints out the contents of a set of stats. */\r\nfunction printStats(stats, output) {\r\n function format(time, count) {\r\n return formatTime(time);\r\n }\r\n (output || process.stdout).write([\r\n \"I/O Read : \" + format(stats.readTime, stats.readCount),\r\n \"I/O Write : \" + format(stats.writeTime, stats.writeCount),\r\n \"Parse : \" + format(stats.parseTime, stats.parseCount),\r\n \"Compile : \" + format(stats.compileTime, stats.compileCount),\r\n \"Emit : \" + format(stats.emitTime, stats.emitCount),\r\n \"Validate : \" + format(stats.validateTime, stats.validateCount),\r\n \"Optimize : \" + format(stats.optimizeTime, stats.optimizeCount)\r\n ].join(EOL) + EOL);\r\n}\r\n\r\nexports.printStats = printStats;\r\n\r\nvar allocBuffer = typeof global !== \"undefined\" && global.Buffer\r\n ? global.Buffer.allocUnsafe || function(len) { return new global.Buffer(len); }\r\n : function(len) { return new Uint8Array(len) };\r\n\r\n/** Creates a memory stream that can be used in place of stdout/stderr. */\r\nfunction createMemoryStream(fn) {\r\n var stream = [];\r\n stream.write = function(chunk) {\r\n if (fn) fn(chunk);\r\n if (typeof chunk === \"string\") {\r\n let buffer = allocBuffer(utf8.length(chunk));\r\n utf8.write(chunk, buffer, 0);\r\n chunk = buffer;\r\n }\r\n this.push(chunk);\r\n };\r\n stream.reset = function() {\r\n stream.length = 0;\r\n };\r\n stream.toBuffer = function() {\r\n var offset = 0, i = 0, k = this.length;\r\n while (i < k) offset += this[i++].length;\r\n var buffer = allocBuffer(offset);\r\n offset = i = 0;\r\n while (i < k) {\r\n buffer.set(this[i], offset);\r\n offset += this[i].length;\r\n ++i;\r\n }\r\n return buffer;\r\n };\r\n stream.toString = function() {\r\n var buffer = this.toBuffer();\r\n return utf8.read(buffer, 0, buffer.length);\r\n };\r\n return stream;\r\n}\r\n\r\nexports.createMemoryStream = createMemoryStream;\r\n\r\n/** Compatible TypeScript compiler options for syntax highlighting etc. */\r\nexports.tscOptions = {\r\n alwaysStrict: true,\r\n noImplicitAny: true,\r\n noImplicitReturns: true,\r\n noImplicitThis: true,\r\n noEmitOnError: true,\r\n strictNullChecks: true,\r\n experimentalDecorators: true,\r\n target: \"esnext\",\r\n module: \"commonjs\",\r\n noLib: true,\r\n types: [],\r\n allowJs: false\r\n};\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n var len = 0,\r\n c = 0;\r\n for (var i = 0; i < string.length; ++i) {\r\n c = string.charCodeAt(i);\r\n if (c < 128)\r\n len += 1;\r\n else if (c < 2048)\r\n len += 2;\r\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n ++i;\r\n len += 4;\r\n } else\r\n len += 3;\r\n }\r\n return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null,\r\n chunk = [],\r\n i = 0, // char offset\r\n t; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128)\r\n chunk[i++] = t;\r\n else if (t > 191 && t < 224)\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n } else\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n var start = offset,\r\n c1, // character 1\r\n c2; // character 2\r\n for (var i = 0; i < string.length; ++i) {\r\n c1 = string.charCodeAt(i);\r\n if (c1 < 128) {\r\n buffer[offset++] = c1;\r\n } else if (c1 < 2048) {\r\n buffer[offset++] = c1 >> 6 | 192;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n ++i;\r\n buffer[offset++] = c1 >> 18 | 240;\r\n buffer[offset++] = c1 >> 12 & 63 | 128;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else {\r\n buffer[offset++] = c1 >> 12 | 224;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n }\r\n }\r\n return offset - start;\r\n};\r\n","var proc = typeof process !== \"undefined\" && process || {};\r\nvar isCI = proc.env && \"CI\" in proc.env; // doesn't work when bundled because 'process' is a mock\r\n\r\nfunction from(stream, base) {\r\n var colors = base || {};\r\n colors.supported = (stream && !!stream.isTTY) || isCI;\r\n colors.gray = text => colors.supported ? exports.GRAY + text + exports.RESET : text;\r\n colors.red = text => colors.supported ? exports.RED + text + exports.RESET : text;\r\n colors.green = text => colors.supported ? exports.GREEN + text + exports.RESET : text;\r\n colors.yellow = text => colors.supported ? exports.YELLOW + text + exports.RESET : text;\r\n colors.blue = text => colors.supported ? exports.BLUE + text + exports.RESET : text;\r\n colors.magenta = text => colors.supported ? exports.MAGENTA + text + exports.RESET : text;\r\n colors.cyan = text => colors.supported ? exports.CYAN + text + exports.RESET : text;\r\n colors.white = text => colors.supported ? exports.WHITE + text + exports.RESET : text;\r\n return colors;\r\n}\r\n\r\nexports.stdout = from(proc.stdout, exports);\r\nexports.stderr = from(proc.stderr);\r\nexports.from = from;\r\n\r\nexports.GRAY = \"\\u001b[90m\";\r\nexports.RED = \"\\u001b[91m\";\r\nexports.GREEN = \"\\u001b[92m\";\r\nexports.YELLOW = \"\\u001b[93m\";\r\nexports.BLUE = \"\\u001b[94m\";\r\nexports.MAGENTA = \"\\u001b[95m\";\r\nexports.CYAN = \"\\u001b[96m\";\r\nexports.WHITE = \"\\u001b[97m\";\r\nexports.RESET = \"\\u001b[0m\";\r\n","// type | meaning\r\n// -----|---------------\r\n// b | boolean\r\n// i | integer\r\n// f | float\r\n// s | string\r\n// I | integer array\r\n// F | float array\r\n// S | string array\r\n\r\n/** Parses the specified command line arguments according to the given configuration. */\r\nfunction parse(argv, config) {\r\n var options = {};\r\n var unknown = [];\r\n var arguments = [];\r\n var trailing = [];\r\n\r\n // make an alias map and initialize defaults\r\n var aliases = {};\r\n Object.keys(config).forEach(key => {\r\n var option = config[key];\r\n if (option.alias != null) {\r\n if (typeof option.alias === \"string\") aliases[option.alias] = key;\r\n else if (Array.isArray(option.alias)) option.alias.forEach(alias => aliases[alias] = key);\r\n }\r\n if (option.default != null) options[key] = option.default;\r\n });\r\n\r\n // iterate over argv\r\n for (var i = 0, k = (argv = argv.slice()).length; i < k; ++i) {\r\n let arg = argv[i];\r\n if (arg == \"--\") { ++i; break; }\r\n let match = /^(?:(\\-\\w)(?:=(.*))?|(\\-\\-\\w{2,})(?:=(.*))?)$/.exec(arg), option, key;\r\n if (match) {\r\n if (config[arg]) option = config[key = arg]; // exact\r\n else if (match[1] != null) { // alias\r\n option = config[key = aliases[match[1].substring(1)]];\r\n if (option && match[2] != null) argv[i--] = match[2];\r\n } else if (match[3] != null) { // full\r\n option = config[key = match[3].substring(2)];\r\n if (option && match[4] != null) argv[i--] = match[4];\r\n }\r\n } else {\r\n if (arg.charCodeAt(0) == 45) option = config[key = arg]; // exact\r\n else { arguments.push(arg); continue; } // argument\r\n }\r\n if (option) {\r\n if (option.type == null || option.type === \"b\") options[key] = true; // flag\r\n else {\r\n if (i + 1 < argv.length && argv[i + 1].charCodeAt(0) != 45) { // present\r\n switch (option.type) {\r\n case \"i\": options[key] = parseInt(argv[++i], 10); break;\r\n case \"I\": options[key] = (options[key] || []).concat(parseInt(argv[++i], 10)); break;\r\n case \"f\": options[key] = parseFloat(argv[++i]); break;\r\n case \"F\": options[key] = (options[key] || []).concat(parseFloat(argv[++i])); break;\r\n case \"s\": options[key] = String(argv[++i]); break;\r\n case \"S\": options[key] = (options[key] || []).concat(argv[++i].split(\",\")); break;\r\n default: unknown.push(arg); --i;\r\n }\r\n } else { // omitted\r\n switch (option.type) {\r\n case \"i\":\r\n case \"f\": options[key] = option.default || 0; break;\r\n case \"s\": options[key] = option.default || \"\"; break;\r\n case \"I\":\r\n case \"F\":\r\n case \"S\": options[key] = options.default || []; break;\r\n default: unknown.push(arg);\r\n }\r\n }\r\n }\r\n if (option.value) Object.keys(option.value).forEach(k => options[k] = option.value[k]);\r\n } else unknown.push(arg);\r\n }\r\n while (i < k) trailing.push(argv[i++]); // trailing\r\n\r\n return { options, unknown, arguments, trailing };\r\n}\r\n\r\nexports.parse = parse;\r\n\r\n/** Generates the help text for the specified configuration. */\r\nfunction help(config, options) {\r\n if (!options) options = {};\r\n var indent = options.indent || 2;\r\n var padding = options.padding || 24;\r\n var eol = options.eol || \"\\n\";\r\n var sb = [];\r\n Object.keys(config).forEach(key => {\r\n var option = config[key];\r\n if (option.description == null) return;\r\n var text = \"\";\r\n while (text.length < indent) text += \" \";\r\n text += \"--\" + key;\r\n if (option.alias) text += \", -\" + option.alias;\r\n while (text.length < padding) text += \" \";\r\n if (Array.isArray(option.description)) {\r\n sb.push(text + option.description[0] + option.description.slice(1).map(line => {\r\n for (let i = 0; i < padding; ++i) line = \" \" + line;\r\n return eol + line;\r\n }).join(\"\"));\r\n } else sb.push(text + option.description);\r\n });\r\n return sb.join(eol);\r\n}\r\n\r\nexports.help = help;\r\n","/*\r\nCopyright 2010 James Halliday (mail@substack.net)\r\n\r\nThis project is free software released under the MIT/X11 license:\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nvar path = require(\"path\");\r\nvar fs = require(\"fs\");\r\nvar _0777 = parseInt(\"0777\", 8);\r\n\r\nmodule.exports = function mkdirp(p, opts, made) {\r\n if (!opts || typeof opts !== \"object\") {\r\n opts = { mode: opts };\r\n }\r\n var mode = opts.mode;\r\n if (mode === undefined) {\r\n mode = _0777 & (~process.umask());\r\n }\r\n if (!made) made = null;\r\n p = path.resolve(p);\r\n try {\r\n fs.mkdirSync(p, mode);\r\n made = made || p;\r\n } catch (err0) {\r\n switch (err0.code) {\r\n case \"ENOENT\":\r\n made = mkdirp(path.dirname(p), opts, made);\r\n mkdirp(p, opts, made);\r\n break;\r\n default:\r\n var stat;\r\n try {\r\n stat = fs.statSync(p);\r\n } catch (err1) {\r\n throw err0;\r\n }\r\n if (!stat.isDirectory()) throw err0;\r\n break;\r\n }\r\n }\r\n return made;\r\n};\r\n","if(typeof __WEBPACK_EXTERNAL_MODULE__10__ === 'undefined') {var e = new Error(\"Cannot find module 'assemblyscript'\"); e.code = 'MODULE_NOT_FOUND'; throw e;}\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__10__;","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 12;","module.exports = process.hrtime || hrtime\n\n// polyfil for window.performance.now\nvar performance = global.performance || {}\nvar performanceNow =\n performance.now ||\n performance.mozNow ||\n performance.msNow ||\n performance.oNow ||\n performance.webkitNow ||\n function(){ return (new Date()).getTime() }\n\n// generate timestamp or delta\n// see http://nodejs.org/api/process.html#process_process_hrtime\nfunction hrtime(previousTimestamp){\n var clocktime = performanceNow.call(performance)*1e-3\n var seconds = Math.floor(clocktime)\n var nanoseconds = Math.floor((clocktime%1)*1e9)\n if (previousTimestamp) {\n seconds = seconds - previousTimestamp[0]\n nanoseconds = nanoseconds - previousTimestamp[1]\n if (nanoseconds<0) {\n seconds--\n nanoseconds += 1e9\n }\n }\n return [seconds,nanoseconds]\n}"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://asc/webpack/universalModuleDefinition","webpack://asc/webpack/bootstrap","webpack://asc/../node_modules/node-libs-browser/mock/process.js","webpack://asc/../node_modules/path-browserify/index.js","webpack://asc/../node_modules/webpack/buildin/global.js","webpack://asc/./asc.js","webpack://asc/../node_modules/@protobufjs/utf8/index.js","webpack://asc/./util/colors.js","webpack://asc/./util/options.js","webpack://asc/./util/mkdirp.js","webpack://asc/external \"assemblyscript\"","webpack://asc/. sync","webpack://asc/../node_modules/browser-process-hrtime/index.js"],"names":["root","factory","exports","module","require","e","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE__10__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","path","cwd","nextTick","fn","setTimeout","platform","arch","execPath","title","pid","browser","env","argv","binding","Error","chdir","dir","resolve","exit","kill","umask","dlopen","uptime","memoryUsage","uvCounters","features","process","normalizeArray","parts","allowAboveRoot","up","length","last","splice","unshift","splitPathRe","splitPath","filename","exec","slice","filter","xs","f","res","push","resolvedPath","resolvedAbsolute","arguments","TypeError","charAt","split","join","normalize","isAbsolute","trailingSlash","substr","paths","Array","index","relative","from","to","trim","arr","start","end","fromParts","toParts","Math","min","samePartsLength","outputParts","concat","sep","delimiter","dirname","result","basename","ext","extname","str","len","g","Function","window","global","fs","utf8","colorsUtil","optionsUtil","mkdirp","EOL","removeAllListeners","assemblyscript","isDev","code","register","project","e_ts","eval","stack","isBundle","version","options","sourceMapRoot","libraryPrefix","LIBRARY_PREFIX","defaultOptimizeLevel","defaultShrinkLevel","libraryFiles","allocator/arena","allocator/buddy","allocator/emscripten","allocator/system","allocator/tlsf","array","arraybuffer","bindings/Date","bindings/Math","builtins","collector/itcm","dataview","date","diagnostics","error","gc","internal/allocator","internal/arraybuffer","internal/hash","internal/memory","internal/number","internal/sort","internal/string","internal/typedarray","iterator","map","math","memory","number","polyfills","regexp","set","string","symbol","table","typedarray","vector","libDir","libFiles","sync","bundled","forEach","file","replace","readFileSync","definitionFiles","assembly","portable","stdDir","compileString","sources","input.ts","output","stdout","createMemoryStream","stderr","keys","val","isArray","String","main","readFile","writeFile","contents","listFiles","callback","readFileNode","writeFileNode","listFilesNode","stats","createStats","opts","parse","args","noColors","supported","unknown","arg","write","yellow","trailing","err","red","help","out","color","white","cyan","baseDir","transforms","transform","parser","noLib","parseCount","parseTime","measure","parseFile","libPath","indexOf","customLibDirs","lib","apply","k","endsWith","j","libText","parseBacklog","sourcePath","sourceText","nextFile","startsWith","plainName","substring","indexName","checkDiagnostics","applyTransform","program","finishParsing","optimizeLevel","shrinkLevel","optimize","max","compilerOptions","createOptions","setTarget","setNoTreeShaking","noTreeShaking","setNoAssert","noAssert","setImportMemory","importMemory","setImportTable","importTable","setMemoryBase","memoryBase","setSourceMap","sourceMap","setOptimizeLevelHints","setGlobalAlias","use","aliases","part","alias","enable","flag","toUpperCase","enableFeature","compileCount","compileTime","compileProgram","dispose","validate","validateCount","validateTime","trapMode","optimizeCount","optimizeTime","runPasses","setOptimizeLevel","setShrinkLevel","setDebugInfo","debug","pass","noEmit","hasStdout","hasOutput","outFile","test","textFile","asmjsFile","binaryFile","wasm","sourceMapURL","emitCount","emitTime","toBinary","writeStdout","JSON","sourceRoot","text","stdName","sourceContents","stringify","asm","toAsmjs","idlFile","idl","buildIDL","tsdFile","tsd","buildTSD","wat","toText","printStats","readCount","readTime","encoding","writeCount","writeTime","writeFileSync","files","readdirSync","used","argumentSubstitutions","-O","-Os","-Oz","-O0","-O0s","-O0z","-O1","-O1s","-O1z","-O2","-O2s","-O2z","-O3","-O3s","-O3z","emitter","diagnostic","hasErrors","nextDiagnostic","formatDiagnostic","isTTY","isError","hrtime","times","formatTime","time","toFixed","format","count","allocBuffer","Buffer","allocUnsafe","Uint8Array","stream","chunk","buffer","reset","toBuffer","offset","toString","read","tscOptions","alwaysStrict","noImplicitAny","noImplicitReturns","noImplicitThis","noEmitOnError","strictNullChecks","experimentalDecorators","target","types","allowJs","charCodeAt","fromCharCode","c1","c2","proc","isCI","base","colors","gray","GRAY","RESET","RED","green","GREEN","YELLOW","blue","BLUE","magenta","MAGENTA","CYAN","WHITE","config","option","default","match","type","parseInt","parseFloat","indent","padding","eol","sb","description","line","_0777","made","undefined","mkdirSync","err0","stat","statSync","err1","isDirectory","webpackEmptyContext","req","id","previousTimestamp","clocktime","performanceNow","performance","seconds","floor","nanoseconds","now","mozNow","msNow","oNow","webkitNow","Date","getTime"],"mappings":"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","file":"asc.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory((function webpackLoadOptionalExternalModule() { try { return require(\"assemblyscript\"); } catch(e) {} }()));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"assemblyscript\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"asc\"] = factory((function webpackLoadOptionalExternalModule() { try { return require(\"assemblyscript\"); } catch(e) {} }()));\n\telse\n\t\troot[\"asc\"] = factory(root[\"assemblyscript\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE__10__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n","exports.nextTick = function nextTick(fn) {\n\tsetTimeout(fn, 0);\n};\n\nexports.platform = exports.arch = \nexports.execPath = exports.title = 'browser';\nexports.pid = 1;\nexports.browser = true;\nexports.env = {};\nexports.argv = [];\n\nexports.binding = function (name) {\n\tthrow new Error('No such module. (Possibly not yet loaded)')\n};\n\n(function () {\n var cwd = '/';\n var path;\n exports.cwd = function () { return cwd };\n exports.chdir = function (dir) {\n if (!path) path = require('path');\n cwd = path.resolve(dir, cwd);\n };\n})();\n\nexports.exit = exports.kill = \nexports.umask = exports.dlopen = \nexports.uptime = exports.memoryUsage = \nexports.uvCounters = function() {};\nexports.features = {};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\n * Compiler frontend for node.js\n *\n * Uses the low-level API exported from src/index.ts so it works with the compiler compiled to\n * JavaScript as well as the compiler compiled to WebAssembly (eventually). Runs the sources\n * directly through ts-node if distribution files are not present (indicated by a `-dev` version).\n *\n * Can also be packaged as a bundle suitable for in-browser use with the standard library injected\n * in the build step. See dist/asc.js for the bundle and webpack.config.js for building details.\n *\n * @module cli/asc\n */\n\n// Use \".\" instead of \"/\" as cwd in browsers\nif (process.browser) process.cwd = function() { return \".\"; };\n\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst utf8 = require(\"@protobufjs/utf8\");\nconst colorsUtil = require(\"./util/colors\");\nconst optionsUtil = require(\"./util/options\");\nconst mkdirp = require(\"./util/mkdirp\");\nconst EOL = process.platform === \"win32\" ? \"\\r\\n\" : \"\\n\";\n\n// Emscripten adds an `uncaughtException` listener to Binaryen that results in an additional\n// useless code fragment on top of an actual error. suppress this:\nif (process.removeAllListeners) process.removeAllListeners(\"uncaughtException\");\n\n// Use distribution files if present, otherwise run the sources directly\nvar assemblyscript, isDev = false;\n(() => {\n try { // `asc` on the command line\n assemblyscript = require(\"../dist/assemblyscript.js\");\n } catch (e) {\n try { // `asc` on the command line without dist files\n require(\"ts-node\").register({ project: path.join(__dirname, \"..\", \"src\", \"tsconfig.json\") });\n require(\"../src/glue/js\");\n assemblyscript = require(\"../src\");\n isDev = true;\n } catch (e_ts) {\n try { // `require(\"dist/asc.js\")` in explicit browser tests\n assemblyscript = eval(\"require('./assemblyscript')\");\n } catch (e) {\n // combine both errors that lead us here\n e.stack = e_ts.stack + \"\\n---\\n\" + e.stack;\n throw e;\n }\n }\n }\n})();\n\n/** Whether this is a webpack bundle or not. */\nexports.isBundle = typeof BUNDLE_VERSION === \"string\";\n\n/** Whether asc runs the sources directly or not. */\nexports.isDev = isDev;\n\n/** AssemblyScript version. */\nexports.version = exports.isBundle ? BUNDLE_VERSION : require(\"../package.json\").version;\n\n/** Available CLI options. */\nexports.options = require(\"./asc.json\");\n\n/** Common root used in source maps. */\nexports.sourceMapRoot = \"assemblyscript:///\";\n\n/** Prefix used for library files. */\nexports.libraryPrefix = assemblyscript.LIBRARY_PREFIX;\n\n/** Default Binaryen optimization level. */\nexports.defaultOptimizeLevel = 2;\n\n/** Default Binaryen shrink level. */\nexports.defaultShrinkLevel = 1;\n\n/** Bundled library files. */\nexports.libraryFiles = exports.isBundle ? BUNDLE_LIBRARY : (() => { // set up if not a bundle\n const libDir = path.join(__dirname, \"..\", \"std\", \"assembly\");\n const libFiles = require(\"glob\").sync(\"**/!(*.d).ts\", { cwd: libDir });\n const bundled = {};\n libFiles.forEach(file => bundled[file.replace(/\\.ts$/, \"\")] = fs.readFileSync(path.join(libDir, file), \"utf8\" ));\n return bundled;\n})();\n\n/** Bundled definition files. */\nexports.definitionFiles = exports.isBundle ? BUNDLE_DEFINITIONS : (() => { // set up if not a bundle\n const stdDir = path.join(__dirname, \"..\", \"std\");\n return {\n \"assembly\": fs.readFileSync(path.join(stdDir, \"assembly\", \"index.d.ts\"), \"utf8\"),\n \"portable\": fs.readFileSync(path.join(stdDir, \"portable\", \"index.d.ts\"), \"utf8\")\n };\n})();\n\n/** Convenience function that parses and compiles source strings directly. */\nexports.compileString = (sources, options) => {\n if (typeof sources === \"string\") sources = { \"input.ts\": sources };\n const output = Object.create({\n stdout: createMemoryStream(),\n stderr: createMemoryStream()\n });\n var argv = [\n \"--binaryFile\", \"binary\",\n \"--textFile\", \"text\",\n ];\n Object.keys(options || {}).forEach(key => {\n var val = options[key];\n if (Array.isArray(val)) val.forEach(val => argv.push(\"--\" + key, String(val)));\n else argv.push(\"--\" + key, String(val));\n });\n exports.main(argv.concat(Object.keys(sources)), {\n stdout: output.stdout,\n stderr: output.stderr,\n readFile: name => sources.hasOwnProperty(name) ? sources[name] : null,\n writeFile: (name, contents) => output[name] = contents,\n listFiles: () => []\n });\n return output;\n}\n\n/** Runs the command line utility using the specified arguments array. */\nexports.main = function main(argv, options, callback) {\n if (typeof options === \"function\") {\n callback = options;\n options = {};\n } else if (!options) {\n options = {};\n }\n\n const stdout = options.stdout || process.stdout;\n const stderr = options.stderr || process.stderr;\n const readFile = options.readFile || readFileNode;\n const writeFile = options.writeFile || writeFileNode;\n const listFiles = options.listFiles || listFilesNode;\n const stats = options.stats || createStats();\n\n // Output must be specified if not present in the environment\n if (!stdout) throw Error(\"'options.stdout' must be specified\");\n if (!stderr) throw Error(\"'options.stderr' must be specified\");\n\n const opts = optionsUtil.parse(argv, exports.options);\n const args = opts.options;\n argv = opts.arguments;\n if (args.noColors) {\n colorsUtil.stdout.supported =\n colorsUtil.stderr.supported = false;\n } else {\n colorsUtil.stdout = colorsUtil.from(stdout);\n colorsUtil.stderr = colorsUtil.from(stderr);\n }\n\n // Check for unknown arguments\n if (opts.unknown.length) {\n opts.unknown.forEach(arg => {\n stderr.write(colorsUtil.stderr.yellow(\"WARN: \") + \"Unknown option '\" + arg + \"'\" + EOL);\n });\n }\n\n // Check for trailing arguments\n if (opts.trailing.length) {\n stderr.write(colorsUtil.stderr.yellow(\"WARN: \") + \"Unsupported trailing arguments: \" + opts.trailing.join(\" \") + EOL);\n }\n\n // Use default callback if none is provided\n if (!callback) callback = function defaultCallback(err) {\n var code = 0;\n if (err) {\n stderr.write(colorsUtil.stderr.red(\"ERROR: \") + err.stack.replace(/^ERROR: /i, \"\") + EOL);\n code = 1;\n }\n return code;\n };\n\n // Just print the version if requested\n if (args.version) {\n stdout.write(\"Version \" + exports.version + (isDev ? \"-dev\" : \"\") + EOL);\n return callback(null);\n }\n // Print the help message if requested or no source files are provided\n if (args.help || !argv.length) {\n var out = args.help ? stdout : stderr;\n var color = args.help ? colorsUtil.stdout : colorsUtil.stderr;\n out.write([\n color.white(\"SYNTAX\"),\n \" \" + color.cyan(\"asc\") + \" [entryFile ...] [options]\",\n \"\",\n color.white(\"EXAMPLES\"),\n \" \" + color.cyan(\"asc\") + \" hello.ts\",\n \" \" + color.cyan(\"asc\") + \" hello.ts -b hello.wasm -t hello.wat\",\n \" \" + color.cyan(\"asc\") + \" hello1.ts hello2.ts -b -O > hello.wasm\",\n \"\",\n color.white(\"OPTIONS\"),\n ].concat(\n optionsUtil.help(exports.options, 24, EOL)\n ).join(EOL) + EOL);\n return callback(null);\n }\n\n // I/O must be specified if not present in the environment\n if (!fs.readFileSync) {\n if (readFile === readFileNode) throw Error(\"'options.readFile' must be specified\");\n if (writeFile === writeFileNode) throw Error(\"'options.writeFile' must be specified\");\n if (listFiles === listFilesNode) throw Error(\"'options.listFiles' must be specified\");\n }\n\n // Set up base directory\n const baseDir = args.baseDir ? path.resolve(args.baseDir) : \".\";\n\n // Set up transforms\n const transforms = [];\n if (args.transform) {\n args.transform.forEach(transform =>\n transforms.push(\n require(\n path.isAbsolute(transform = transform.trim())\n ? transform\n : path.join(process.cwd(), transform)\n )\n )\n );\n }\n function applyTransform(name, ...args) {\n transforms.forEach(transform => {\n if (typeof transform[name] === \"function\") transform[name](...args);\n });\n }\n\n // Begin parsing\n var parser = null;\n\n // Include library files\n if (!args.noLib) {\n Object.keys(exports.libraryFiles).forEach(libPath => {\n if (libPath.indexOf(\"/\") >= 0) return; // in sub-directory: imported on demand\n stats.parseCount++;\n stats.parseTime += measure(() => {\n parser = assemblyscript.parseFile(\n exports.libraryFiles[libPath],\n exports.libraryPrefix + libPath + \".ts\",\n false,\n parser\n );\n });\n });\n } else { // always include builtins\n stats.parseCount++;\n stats.parseTime += measure(() => {\n parser = assemblyscript.parseFile(\n exports.libraryFiles[\"builtins\"],\n exports.libraryPrefix + \"builtins.ts\",\n false,\n parser\n );\n });\n }\n const customLibDirs = [];\n if (args.lib) {\n let lib = args.lib;\n if (typeof lib === \"string\") lib = lib.split(\",\");\n Array.prototype.push.apply(customLibDirs, lib.map(lib => lib.trim()));\n for (let i = 0, k = customLibDirs.length; i < k; ++i) { // custom\n let libDir = customLibDirs[i];\n let libFiles;\n if (libDir.endsWith(\".ts\")) {\n libFiles = [ path.basename(libDir) ];\n libDir = path.dirname(libDir);\n } else {\n libFiles = listFiles(libDir);\n }\n for (let j = 0, l = libFiles.length; j < l; ++j) {\n let libPath = libFiles[j];\n let libText = readFile(libPath, libDir);\n if (libText === null) return callback(Error(\"Library file '\" + libPath + \"' not found.\"));\n stats.parseCount++;\n stats.parseTime += measure(() => {\n parser = assemblyscript.parseFile(\n libText,\n exports.libraryPrefix + libPath,\n false,\n parser\n );\n });\n }\n }\n }\n\n // Parses the backlog of imported files after including entry files\n function parseBacklog() {\n var sourcePath, sourceText;\n while ((sourcePath = parser.nextFile()) != null) {\n\n // Load library file if explicitly requested\n if (sourcePath.startsWith(exports.libraryPrefix)) {\n const plainName = sourcePath.substring(exports.libraryPrefix.length);\n const indexName = sourcePath.substring(exports.libraryPrefix.length) + \"/index\";\n if (exports.libraryFiles.hasOwnProperty(plainName)) {\n sourceText = exports.libraryFiles[plainName];\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\n } else if (exports.libraryFiles.hasOwnProperty(indexName)) {\n sourceText = exports.libraryFiles[indexName];\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\n } else {\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\n sourceText = readFile(plainName + \".ts\", customLibDirs[i]);\n if (sourceText !== null) {\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\n break;\n } else {\n sourceText = readFile(indexName + \".ts\", customLibDirs[i]);\n if (sourceText !== null) {\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\n break;\n }\n }\n }\n }\n\n // Otherwise try nextFile.ts, nextFile/index.ts, ~lib/nextFile.ts, ~lib/nextFile/index.ts\n } else {\n const plainName = sourcePath;\n const indexName = sourcePath + \"/index\";\n sourceText = readFile(plainName + \".ts\", baseDir);\n if (sourceText !== null) {\n sourcePath = plainName + \".ts\";\n } else {\n sourceText = readFile(indexName + \".ts\", baseDir);\n if (sourceText !== null) {\n sourcePath = indexName + \".ts\";\n } else if (!plainName.startsWith(\".\")) {\n if (exports.libraryFiles.hasOwnProperty(plainName)) {\n sourceText = exports.libraryFiles[plainName];\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\n } else if (exports.libraryFiles.hasOwnProperty(indexName)) {\n sourceText = exports.libraryFiles[indexName];\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\n } else {\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\n const dir = customLibDirs[i];\n sourceText = readFile(plainName + \".ts\", customLibDirs[i]);\n if (sourceText !== null) {\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\n break;\n } else {\n sourceText = readFile(indexName + \".ts\", customLibDirs[i]);\n if (sourceText !== null) {\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\n break;\n }\n }\n }\n }\n }\n }\n }\n if (sourceText == null) {\n return callback(Error(\"Import file '\" + sourcePath + \".ts' not found.\"));\n }\n stats.parseCount++;\n stats.parseTime += measure(() => {\n assemblyscript.parseFile(sourceText, sourcePath, false, parser);\n });\n }\n if (checkDiagnostics(parser, stderr)) {\n return callback(Error(\"Parse error\"));\n }\n }\n\n // Include entry files\n for (let i = 0, k = argv.length; i < k; ++i) {\n const filename = argv[i];\n\n let sourcePath = String(filename).replace(/\\\\/g, \"/\").replace(/(\\.ts|\\/)$/, \"\");\n\n // Try entryPath.ts, then entryPath/index.ts\n let sourceText = readFile(sourcePath + \".ts\", baseDir);\n if (sourceText === null) {\n sourceText = readFile(sourcePath + \"/index.ts\", baseDir);\n if (sourceText === null) {\n return callback(Error(\"Entry file '\" + sourcePath + \".ts' not found.\"));\n } else {\n sourcePath += \"/index.ts\";\n }\n } else {\n sourcePath += \".ts\";\n }\n\n stats.parseCount++;\n stats.parseTime += measure(() => {\n parser = assemblyscript.parseFile(sourceText, sourcePath, true, parser);\n });\n let code = parseBacklog();\n if (code) return code;\n }\n\n applyTransform(\"afterParse\", parser);\n {\n let code = parseBacklog();\n if (code) return code;\n }\n\n // Finish parsing\n const program = assemblyscript.finishParsing(parser);\n\n // Set up optimization levels\n var optimizeLevel = 0;\n var shrinkLevel = 0;\n if (args.optimize) {\n optimizeLevel = exports.defaultOptimizeLevel;\n shrinkLevel = exports.defaultShrinkLevel;\n }\n if (typeof args.optimizeLevel === \"number\") {\n optimizeLevel = args.optimizeLevel;\n }\n if (typeof args.shrinkLevel === \"number\") {\n shrinkLevel = args.shrinkLevel;\n }\n optimizeLevel = Math.min(Math.max(optimizeLevel, 0), 3);\n shrinkLevel = Math.min(Math.max(shrinkLevel, 0), 2);\n\n // Begin compilation\n const compilerOptions = assemblyscript.createOptions();\n assemblyscript.setTarget(compilerOptions, 0);\n assemblyscript.setNoTreeShaking(compilerOptions, args.noTreeShaking);\n assemblyscript.setNoAssert(compilerOptions, args.noAssert);\n assemblyscript.setImportMemory(compilerOptions, args.importMemory);\n assemblyscript.setImportTable(compilerOptions, args.importTable);\n assemblyscript.setMemoryBase(compilerOptions, args.memoryBase >>> 0);\n assemblyscript.setSourceMap(compilerOptions, args.sourceMap != null);\n assemblyscript.setOptimizeLevelHints(compilerOptions, optimizeLevel, shrinkLevel);\n\n if (!args.noLib) {\n // Initialize default aliases\n assemblyscript.setGlobalAlias(compilerOptions, \"Math\", \"NativeMath\");\n assemblyscript.setGlobalAlias(compilerOptions, \"Mathf\", \"NativeMathf\");\n assemblyscript.setGlobalAlias(compilerOptions, \"abort\", \"~lib/env/abort\");\n assemblyscript.setGlobalAlias(compilerOptions, \"trace\", \"~lib/env/trace\");\n }\n\n // Add or override aliases if specified\n if (args.use) {\n let aliases = args.use;\n for (let i = 0, k = aliases.length; i < k; ++i) {\n let part = aliases[i];\n let p = part.indexOf(\"=\");\n if (p < 0) return callback(Error(\"Global alias '\" + part + \"' is invalid.\"));\n let name = part.substring(0, p).trim();\n let alias = part.substring(p + 1).trim();\n if (!name.length) return callback(Error(\"Global alias '\" + part + \"' is invalid.\"));\n assemblyscript.setGlobalAlias(compilerOptions, name, alias);\n }\n }\n\n // Enable additional features if specified\n var features = args.enable;\n if (features != null) {\n if (typeof features === \"string\") features = features.split(\",\");\n for (let i = 0, k = features.length; i < k; ++i) {\n let name = features[i].trim();\n let flag = assemblyscript[\"FEATURE_\" + name.replace(/\\-/g, \"_\").toUpperCase()];\n if (!flag) return callback(Error(\"Feature '\" + name + \"' is unknown.\"));\n assemblyscript.enableFeature(compilerOptions, flag);\n }\n }\n\n var module;\n stats.compileCount++;\n (() => {\n try {\n stats.compileTime += measure(() => {\n module = assemblyscript.compileProgram(program, compilerOptions);\n });\n } catch (e) {\n return callback(e);\n }\n })();\n if (checkDiagnostics(parser, stderr)) {\n if (module) module.dispose();\n return callback(Error(\"Compile error\"));\n }\n\n // Validate the module if requested\n if (args.validate) {\n stats.validateCount++;\n stats.validateTime += measure(() => {\n if (!module.validate()) {\n module.dispose();\n return callback(Error(\"Validate error\"));\n }\n });\n }\n\n // Set Binaryen-specific options\n if (args.trapMode === \"clamp\") {\n stats.optimizeCount++;\n stats.optimizeTime += measure(() => {\n module.runPasses([ \"trap-mode-clamp\" ]);\n });\n } else if (args.trapMode === \"js\") {\n stats.optimizeCount++;\n stats.optimizeTime += measure(() => {\n module.runPasses([ \"trap-mode-js\" ]);\n });\n } else if (args.trapMode !== \"allow\") {\n module.dispose();\n return callback(Error(\"Unsupported trap mode\"));\n }\n\n // Implicitly run costly non-LLVM optimizations on -O3 or -Oz\n // see: https://github.com/WebAssembly/binaryen/pull/1596\n if (optimizeLevel >= 3 || shrinkLevel >= 2) optimizeLevel = 4;\n\n module.setOptimizeLevel(optimizeLevel);\n module.setShrinkLevel(shrinkLevel);\n module.setDebugInfo(args.debug);\n\n var runPasses = [];\n if (args.runPasses) {\n if (typeof args.runPasses === \"string\") {\n args.runPasses = args.runPasses.split(\",\");\n }\n if (args.runPasses.length) {\n args.runPasses.forEach(pass => {\n if (runPasses.indexOf(pass) < 0)\n runPasses.push(pass);\n });\n }\n }\n\n // Optimize the module if requested\n if (optimizeLevel > 0 || shrinkLevel > 0) {\n stats.optimizeCount++;\n stats.optimizeTime += measure(() => {\n module.optimize();\n });\n }\n\n // Run additional passes if requested\n if (runPasses.length) {\n stats.optimizeCount++;\n stats.optimizeTime += measure(() => {\n module.runPasses(runPasses.map(pass => pass.trim()));\n });\n }\n\n // Prepare output\n if (!args.noEmit) {\n let hasStdout = false;\n let hasOutput = false;\n\n if (args.outFile != null) {\n if (/\\.was?t$/.test(args.outFile) && args.textFile == null) {\n args.textFile = args.outFile;\n } else if (/\\.js$/.test(args.outFile) && args.asmjsFile == null) {\n args.asmjsFile = args.outFile;\n } else if (args.binaryFile == null) {\n args.binaryFile = args.outFile;\n }\n }\n\n // Write binary\n if (args.binaryFile != null) {\n let sourceMapURL = args.sourceMap != null\n ? args.sourceMap.length\n ? args.sourceMap\n : path.basename(args.binaryFile) + \".map\"\n : null;\n\n let wasm;\n stats.emitCount++;\n stats.emitTime += measure(() => {\n wasm = module.toBinary(sourceMapURL)\n });\n\n if (args.binaryFile.length) {\n writeFile(args.binaryFile, wasm.output, baseDir);\n } else {\n writeStdout(wasm.output);\n hasStdout = true;\n }\n hasOutput = true;\n\n // Post-process source map\n if (wasm.sourceMap != null) {\n if (args.binaryFile.length) {\n let sourceMap = JSON.parse(wasm.sourceMap);\n sourceMap.sourceRoot = exports.sourceMapRoot;\n sourceMap.sources.forEach((name, index) => {\n let text = null;\n if (name.startsWith(exports.libraryPrefix)) {\n let stdName = name.substring(exports.libraryPrefix.length).replace(/\\.ts$/, \"\");\n if (exports.libraryFiles.hasOwnProperty(stdName)) {\n text = exports.libraryFiles[stdName];\n } else {\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\n text = readFile(name.substring(exports.libraryPrefix.length), customLibDirs[i]);\n if (text !== null) break;\n }\n }\n } else {\n text = readFile(name, baseDir);\n }\n if (text === null) {\n return callback(Error(\"Source file '\" + name + \"' not found.\"));\n }\n if (!sourceMap.sourceContents) sourceMap.sourceContents = [];\n sourceMap.sourceContents[index] = text;\n });\n writeFile(path.join(\n path.dirname(args.binaryFile),\n path.basename(sourceMapURL)\n ).replace(/^\\.\\//, \"\"), JSON.stringify(sourceMap), baseDir);\n } else {\n stderr.write(\"Skipped source map (stdout already occupied)\" + EOL);\n }\n }\n }\n\n // Write asm.js\n if (args.asmjsFile != null) {\n let asm;\n if (args.asmjsFile.length) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n asm = module.toAsmjs();\n });\n writeFile(args.asmjsFile, asm, baseDir);\n } else if (!hasStdout) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n asm = module.toAsmjs();\n });\n writeStdout(asm);\n hasStdout = true;\n }\n hasOutput = true;\n }\n\n // Write WebIDL\n if (args.idlFile != null) {\n let idl;\n if (args.idlFile.length) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n idl = assemblyscript.buildIDL(program);\n });\n writeFile(args.idlFile, idl, baseDir);\n } else if (!hasStdout) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n idl = assemblyscript.buildIDL(program);\n });\n writeStdout(idl);\n hasStdout = true;\n }\n hasOutput = true;\n }\n\n // Write TypeScript definition\n if (args.tsdFile != null) {\n let tsd;\n if (args.tsdFile.length) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n tsd = assemblyscript.buildTSD(program);\n });\n writeFile(args.tsdFile, tsd, baseDir);\n } else if (!hasStdout) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n tsd = assemblyscript.buildTSD(program);\n });\n writeStdout(tsd);\n hasStdout = true;\n }\n hasOutput = true;\n }\n\n // Write text (must be last)\n if (args.textFile != null || !hasOutput) {\n let wat;\n if (args.textFile && args.textFile.length) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n wat = module.toText();\n });\n writeFile(args.textFile, wat, baseDir);\n } else if (!hasStdout) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n wat = module.toText()\n });\n writeStdout(wat);\n }\n }\n }\n\n module.dispose();\n if (args.measure) {\n printStats(stats, stderr);\n }\n return callback(null);\n\n function readFileNode(filename, baseDir) {\n try {\n let text;\n stats.readCount++;\n stats.readTime += measure(() => {\n text = fs.readFileSync(path.join(baseDir, filename), { encoding: \"utf8\" });\n });\n return text;\n } catch (e) {\n return null;\n }\n }\n\n function writeFileNode(filename, contents, baseDir) {\n try {\n stats.writeCount++;\n stats.writeTime += measure(() => {\n mkdirp(path.join(baseDir, path.dirname(filename)));\n if (typeof contents === \"string\") {\n fs.writeFileSync(path.join(baseDir, filename), contents, { encoding: \"utf8\" } );\n } else {\n fs.writeFileSync(path.join(baseDir, filename), contents);\n }\n });\n return true;\n } catch (e) {\n return false;\n }\n }\n\n function listFilesNode(dirname, baseDir) {\n var files;\n try {\n stats.readTime += measure(() => {\n files = fs.readdirSync(path.join(baseDir, dirname)).filter(file => /^(?!.*\\.d\\.ts$).*\\.ts$/.test(file));\n });\n return files;\n } catch (e) {\n return [];\n }\n }\n\n function writeStdout(contents) {\n if (!writeStdout.used) {\n stats.writeCount++;\n writeStdout.used = true;\n }\n stats.writeTime += measure(() => {\n if (typeof contents === \"string\") {\n stdout.write(contents, { encoding: \"utf8\" });\n } else {\n stdout.write(contents);\n }\n });\n }\n}\n\nvar argumentSubstitutions = {\n \"-O\" : [ \"--optimize\" ],\n \"-Os\" : [ \"--optimize\", \"--shrinkLevel\", \"1\" ],\n \"-Oz\" : [ \"--optimize\", \"--shrinkLevel\", \"2\" ],\n \"-O0\" : [ \"--optimizeLevel\", \"0\", \"--shrinkLevel\", \"0\" ],\n \"-O0s\": [ \"--optimizeLevel\", \"0\", \"--shrinkLevel\", \"1\" ],\n \"-O0z\": [ \"--optimizeLevel\", \"0\", \"--shrinkLevel\", \"2\" ],\n \"-O1\" : [ \"--optimizeLevel\", \"1\", \"--shrinkLevel\", \"0\" ],\n \"-O1s\": [ \"--optimizeLevel\", \"1\", \"--shrinkLevel\", \"1\" ],\n \"-O1z\": [ \"--optimizeLevel\", \"1\", \"--shrinkLevel\", \"2\" ],\n \"-O2\" : [ \"--optimizeLevel\", \"2\", \"--shrinkLevel\", \"0\" ],\n \"-O2s\": [ \"--optimizeLevel\", \"2\", \"--shrinkLevel\", \"1\" ],\n \"-O2z\": [ \"--optimizeLevel\", \"2\", \"--shrinkLevel\", \"2\" ],\n \"-O3\" : [ \"--optimizeLevel\", \"3\", \"--shrinkLevel\", \"0\" ],\n \"-O3s\": [ \"--optimizeLevel\", \"3\", \"--shrinkLevel\", \"1\" ],\n \"-O3z\": [ \"--optimizeLevel\", \"3\", \"--shrinkLevel\", \"2\" ],\n};\n\n/** Checks diagnostics emitted so far for errors. */\nfunction checkDiagnostics(emitter, stderr) {\n var diagnostic;\n var hasErrors = false;\n while ((diagnostic = assemblyscript.nextDiagnostic(emitter)) != null) {\n if (stderr) {\n stderr.write(\n assemblyscript.formatDiagnostic(diagnostic, stderr.isTTY, true) +\n EOL + EOL\n );\n }\n if (assemblyscript.isError(diagnostic)) hasErrors = true;\n }\n return hasErrors;\n}\n\nexports.checkDiagnostics = checkDiagnostics;\n\n/** Creates an empty set of stats. */\nfunction createStats() {\n return {\n readTime: 0,\n readCount: 0,\n writeTime: 0,\n writeCount: 0,\n parseTime: 0,\n parseCount: 0,\n compileTime: 0,\n compileCount: 0,\n emitTime: 0,\n emitCount: 0,\n validateTime: 0,\n validateCount: 0,\n optimizeTime: 0,\n optimizeCount: 0\n };\n}\n\nexports.createStats = createStats;\n\nif (!process.hrtime) process.hrtime = require(\"browser-process-hrtime\");\n\n/** Measures the execution time of the specified function. */\nfunction measure(fn) {\n const start = process.hrtime();\n fn();\n const times = process.hrtime(start);\n return times[0] * 1e9 + times[1];\n}\n\nexports.measure = measure;\n\n/** Formats a high resolution time to a human readable string. */\nfunction formatTime(time) {\n return time ? (time / 1e6).toFixed(3) + \" ms\" : \"N/A\";\n}\n\nexports.formatTime = formatTime;\n\n/** Formats and prints out the contents of a set of stats. */\nfunction printStats(stats, output) {\n function format(time, count) {\n return formatTime(time);\n }\n (output || process.stdout).write([\n \"I/O Read : \" + format(stats.readTime, stats.readCount),\n \"I/O Write : \" + format(stats.writeTime, stats.writeCount),\n \"Parse : \" + format(stats.parseTime, stats.parseCount),\n \"Compile : \" + format(stats.compileTime, stats.compileCount),\n \"Emit : \" + format(stats.emitTime, stats.emitCount),\n \"Validate : \" + format(stats.validateTime, stats.validateCount),\n \"Optimize : \" + format(stats.optimizeTime, stats.optimizeCount)\n ].join(EOL) + EOL);\n}\n\nexports.printStats = printStats;\n\nvar allocBuffer = typeof global !== \"undefined\" && global.Buffer\n ? global.Buffer.allocUnsafe || function(len) { return new global.Buffer(len); }\n : function(len) { return new Uint8Array(len) };\n\n/** Creates a memory stream that can be used in place of stdout/stderr. */\nfunction createMemoryStream(fn) {\n var stream = [];\n stream.write = function(chunk) {\n if (fn) fn(chunk);\n if (typeof chunk === \"string\") {\n let buffer = allocBuffer(utf8.length(chunk));\n utf8.write(chunk, buffer, 0);\n chunk = buffer;\n }\n this.push(chunk);\n };\n stream.reset = function() {\n stream.length = 0;\n };\n stream.toBuffer = function() {\n var offset = 0, i = 0, k = this.length;\n while (i < k) offset += this[i++].length;\n var buffer = allocBuffer(offset);\n offset = i = 0;\n while (i < k) {\n buffer.set(this[i], offset);\n offset += this[i].length;\n ++i;\n }\n return buffer;\n };\n stream.toString = function() {\n var buffer = this.toBuffer();\n return utf8.read(buffer, 0, buffer.length);\n };\n return stream;\n}\n\nexports.createMemoryStream = createMemoryStream;\n\n/** Compatible TypeScript compiler options for syntax highlighting etc. */\nexports.tscOptions = {\n alwaysStrict: true,\n noImplicitAny: true,\n noImplicitReturns: true,\n noImplicitThis: true,\n noEmitOnError: true,\n strictNullChecks: true,\n experimentalDecorators: true,\n target: \"esnext\",\n module: \"commonjs\",\n noLib: true,\n types: [],\n allowJs: false\n};\n","\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n var len = 0,\r\n c = 0;\r\n for (var i = 0; i < string.length; ++i) {\r\n c = string.charCodeAt(i);\r\n if (c < 128)\r\n len += 1;\r\n else if (c < 2048)\r\n len += 2;\r\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n ++i;\r\n len += 4;\r\n } else\r\n len += 3;\r\n }\r\n return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null,\r\n chunk = [],\r\n i = 0, // char offset\r\n t; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128)\r\n chunk[i++] = t;\r\n else if (t > 191 && t < 224)\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n } else\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n var start = offset,\r\n c1, // character 1\r\n c2; // character 2\r\n for (var i = 0; i < string.length; ++i) {\r\n c1 = string.charCodeAt(i);\r\n if (c1 < 128) {\r\n buffer[offset++] = c1;\r\n } else if (c1 < 2048) {\r\n buffer[offset++] = c1 >> 6 | 192;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n ++i;\r\n buffer[offset++] = c1 >> 18 | 240;\r\n buffer[offset++] = c1 >> 12 & 63 | 128;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else {\r\n buffer[offset++] = c1 >> 12 | 224;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n }\r\n }\r\n return offset - start;\r\n};\r\n","var proc = typeof process !== \"undefined\" && process || {};\nvar isCI = proc.env && \"CI\" in proc.env; // doesn't work when bundled because 'process' is a mock\n\nfunction from(stream, base) {\n var colors = base || {};\n colors.supported = (stream && !!stream.isTTY) || isCI;\n colors.gray = text => colors.supported ? exports.GRAY + text + exports.RESET : text;\n colors.red = text => colors.supported ? exports.RED + text + exports.RESET : text;\n colors.green = text => colors.supported ? exports.GREEN + text + exports.RESET : text;\n colors.yellow = text => colors.supported ? exports.YELLOW + text + exports.RESET : text;\n colors.blue = text => colors.supported ? exports.BLUE + text + exports.RESET : text;\n colors.magenta = text => colors.supported ? exports.MAGENTA + text + exports.RESET : text;\n colors.cyan = text => colors.supported ? exports.CYAN + text + exports.RESET : text;\n colors.white = text => colors.supported ? exports.WHITE + text + exports.RESET : text;\n return colors;\n}\n\nexports.stdout = from(proc.stdout, exports);\nexports.stderr = from(proc.stderr);\nexports.from = from;\n\nexports.GRAY = \"\\u001b[90m\";\nexports.RED = \"\\u001b[91m\";\nexports.GREEN = \"\\u001b[92m\";\nexports.YELLOW = \"\\u001b[93m\";\nexports.BLUE = \"\\u001b[94m\";\nexports.MAGENTA = \"\\u001b[95m\";\nexports.CYAN = \"\\u001b[96m\";\nexports.WHITE = \"\\u001b[97m\";\nexports.RESET = \"\\u001b[0m\";\n","// type | meaning\n// -----|---------------\n// b | boolean\n// i | integer\n// f | float\n// s | string\n// I | integer array\n// F | float array\n// S | string array\n\n/** Parses the specified command line arguments according to the given configuration. */\nfunction parse(argv, config) {\n var options = {};\n var unknown = [];\n var arguments = [];\n var trailing = [];\n\n // make an alias map and initialize defaults\n var aliases = {};\n Object.keys(config).forEach(key => {\n var option = config[key];\n if (option.alias != null) {\n if (typeof option.alias === \"string\") aliases[option.alias] = key;\n else if (Array.isArray(option.alias)) option.alias.forEach(alias => aliases[alias] = key);\n }\n if (option.default != null) options[key] = option.default;\n });\n\n // iterate over argv\n for (var i = 0, k = (argv = argv.slice()).length; i < k; ++i) {\n let arg = argv[i];\n if (arg == \"--\") { ++i; break; }\n let match = /^(?:(\\-\\w)(?:=(.*))?|(\\-\\-\\w{2,})(?:=(.*))?)$/.exec(arg), option, key;\n if (match) {\n if (config[arg]) option = config[key = arg]; // exact\n else if (match[1] != null) { // alias\n option = config[key = aliases[match[1].substring(1)]];\n if (option && match[2] != null) argv[i--] = match[2];\n } else if (match[3] != null) { // full\n option = config[key = match[3].substring(2)];\n if (option && match[4] != null) argv[i--] = match[4];\n }\n } else {\n if (arg.charCodeAt(0) == 45) option = config[key = arg]; // exact\n else { arguments.push(arg); continue; } // argument\n }\n if (option) {\n if (option.type == null || option.type === \"b\") options[key] = true; // flag\n else {\n if (i + 1 < argv.length && argv[i + 1].charCodeAt(0) != 45) { // present\n switch (option.type) {\n case \"i\": options[key] = parseInt(argv[++i], 10); break;\n case \"I\": options[key] = (options[key] || []).concat(parseInt(argv[++i], 10)); break;\n case \"f\": options[key] = parseFloat(argv[++i]); break;\n case \"F\": options[key] = (options[key] || []).concat(parseFloat(argv[++i])); break;\n case \"s\": options[key] = String(argv[++i]); break;\n case \"S\": options[key] = (options[key] || []).concat(argv[++i].split(\",\")); break;\n default: unknown.push(arg); --i;\n }\n } else { // omitted\n switch (option.type) {\n case \"i\":\n case \"f\": options[key] = option.default || 0; break;\n case \"s\": options[key] = option.default || \"\"; break;\n case \"I\":\n case \"F\":\n case \"S\": options[key] = options.default || []; break;\n default: unknown.push(arg);\n }\n }\n }\n if (option.value) Object.keys(option.value).forEach(k => options[k] = option.value[k]);\n } else unknown.push(arg);\n }\n while (i < k) trailing.push(argv[i++]); // trailing\n\n return { options, unknown, arguments, trailing };\n}\n\nexports.parse = parse;\n\n/** Generates the help text for the specified configuration. */\nfunction help(config, options) {\n if (!options) options = {};\n var indent = options.indent || 2;\n var padding = options.padding || 24;\n var eol = options.eol || \"\\n\";\n var sb = [];\n Object.keys(config).forEach(key => {\n var option = config[key];\n if (option.description == null) return;\n var text = \"\";\n while (text.length < indent) text += \" \";\n text += \"--\" + key;\n if (option.alias) text += \", -\" + option.alias;\n while (text.length < padding) text += \" \";\n if (Array.isArray(option.description)) {\n sb.push(text + option.description[0] + option.description.slice(1).map(line => {\n for (let i = 0; i < padding; ++i) line = \" \" + line;\n return eol + line;\n }).join(\"\"));\n } else sb.push(text + option.description);\n });\n return sb.join(eol);\n}\n\nexports.help = help;\n","/*\nCopyright 2010 James Halliday (mail@substack.net)\n\nThis project is free software released under the MIT/X11 license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\nvar path = require(\"path\");\nvar fs = require(\"fs\");\nvar _0777 = parseInt(\"0777\", 8);\n\nmodule.exports = function mkdirp(p, opts, made) {\n if (!opts || typeof opts !== \"object\") {\n opts = { mode: opts };\n }\n var mode = opts.mode;\n if (mode === undefined) {\n mode = _0777 & (~process.umask());\n }\n if (!made) made = null;\n p = path.resolve(p);\n try {\n fs.mkdirSync(p, mode);\n made = made || p;\n } catch (err0) {\n switch (err0.code) {\n case \"ENOENT\":\n made = mkdirp(path.dirname(p), opts, made);\n mkdirp(p, opts, made);\n break;\n default:\n var stat;\n try {\n stat = fs.statSync(p);\n } catch (err1) {\n throw err0;\n }\n if (!stat.isDirectory()) throw err0;\n break;\n }\n }\n return made;\n};\n","if(typeof __WEBPACK_EXTERNAL_MODULE__10__ === 'undefined') {var e = new Error(\"Cannot find module 'assemblyscript'\"); e.code = 'MODULE_NOT_FOUND'; throw e;}\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__10__;","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 12;","module.exports = process.hrtime || hrtime\n\n// polyfil for window.performance.now\nvar performance = global.performance || {}\nvar performanceNow =\n performance.now ||\n performance.mozNow ||\n performance.msNow ||\n performance.oNow ||\n performance.webkitNow ||\n function(){ return (new Date()).getTime() }\n\n// generate timestamp or delta\n// see http://nodejs.org/api/process.html#process_process_hrtime\nfunction hrtime(previousTimestamp){\n var clocktime = performanceNow.call(performance)*1e-3\n var seconds = Math.floor(clocktime)\n var nanoseconds = Math.floor((clocktime%1)*1e9)\n if (previousTimestamp) {\n seconds = seconds - previousTimestamp[0]\n nanoseconds = nanoseconds - previousTimestamp[1]\n if (nanoseconds<0) {\n seconds--\n nanoseconds += 1e9\n }\n }\n return [seconds,nanoseconds]\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/assemblyscript.js b/dist/assemblyscript.js index b5ff9f16d3..bd6959758a 100644 --- a/dist/assemblyscript.js +++ b/dist/assemblyscript.js @@ -1,3 +1,3 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("binaryen")):"function"==typeof define&&define.amd?define(["binaryen"],t):"object"==typeof exports?exports.assemblyscript=t(require("binaryen")):e.assemblyscript=t(e.binaryen)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=15)}([function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0}),n(r(24)),n(r(25)),n(r(26)),n(r(27)),n(r(28)),n(r(29))},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NONE=0]="NONE",e[e.IMPORT=1]="IMPORT",e[e.EXPORT=2]="EXPORT",e[e.DECLARE=4]="DECLARE",e[e.CONST=8]="CONST",e[e.LET=16]="LET",e[e.STATIC=32]="STATIC",e[e.READONLY=64]="READONLY",e[e.ABSTRACT=128]="ABSTRACT",e[e.PUBLIC=256]="PUBLIC",e[e.PRIVATE=512]="PRIVATE",e[e.PROTECTED=1024]="PROTECTED",e[e.GET=2048]="GET",e[e.SET=4096]="SET",e[e.DEFINITE_ASSIGNMENT=8192]="DEFINITE_ASSIGNMENT",e[e.AMBIENT=16384]="AMBIENT",e[e.GENERIC=32768]="GENERIC",e[e.GENERIC_CONTEXT=65536]="GENERIC_CONTEXT",e[e.INSTANCE=131072]="INSTANCE",e[e.CONSTRUCTOR=262144]="CONSTRUCTOR",e[e.ARROW=524288]="ARROW",e[e.MODULE_EXPORT=1048576]="MODULE_EXPORT",e[e.MODULE_IMPORT=2097152]="MODULE_IMPORT",e[e.RESOLVED=4194304]="RESOLVED",e[e.COMPILED=8388608]="COMPILED",e[e.INLINED=16777216]="INLINED",e[e.SCOPED=33554432]="SCOPED",e[e.TRAMPOLINE=67108864]="TRAMPOLINE",e[e.VIRTUAL=134217728]="VIRTUAL",e[e.MAIN=268435456]="MAIN",e[e.QUOTED=536870912]="QUOTED"}(t.CommonFlags||(t.CommonFlags={})),t.PATH_DELIMITER="/",t.PARENT_SUBST="..",t.GETTER_PREFIX="get:",t.SETTER_PREFIX="set:",t.INSTANCE_DELIMITER="#",t.STATIC_DELIMITER=".",t.INNER_DELIMITER="~",t.LIBRARY_SUBST="~lib",t.LIBRARY_PREFIX=t.LIBRARY_SUBST+t.PATH_DELIMITER,t.FILESPACE_PREFIX="file:"},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=r(10),a=r(0),s=r(10);function o(e){switch(e){case n.INFO:return"INFO";case n.WARNING:return"WARNING";case n.ERROR:return"ERROR";default:return assert(!1),""}}function c(e){switch(e){case n.INFO:return t.COLOR_BLUE;case n.WARNING:return t.COLOR_YELLOW;case n.ERROR:return t.COLOR_RED;default:return assert(!1),""}}t.DiagnosticCode=s.DiagnosticCode,t.diagnosticCodeToString=s.diagnosticCodeToString,function(e){e[e.INFO=0]="INFO",e[e.WARNING=1]="WARNING",e[e.ERROR=2]="ERROR"}(n=t.DiagnosticCategory||(t.DiagnosticCategory={})),t.diagnosticCategoryToString=o,t.COLOR_BLUE="",t.COLOR_YELLOW="",t.COLOR_RED="",t.COLOR_RESET="",t.diagnosticCategoryToColor=c;var l=function(){function e(e,t,r){this.range=null,this.code=e,this.category=t,this.message=r}return e.create=function(t,r,n,a,s){void 0===n&&(n=null),void 0===a&&(a=null),void 0===s&&(s=null);var o=i.diagnosticCodeToString(t);return null!=n&&(o=o.replace("{0}",n)),null!=a&&(o=o.replace("{1}",a)),null!=s&&(o=o.replace("{2}",s)),new e(t,r,o)},e.createInfo=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.INFO,r,i)},e.createWarning=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.WARNING,r,i)},e.createError=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.ERROR,r,i)},e.prototype.withRange=function(e){return this.range=e,this},e.prototype.toString=function(){return this.range?o(this.category)+" "+this.code.toString(10)+': "'+this.message+'" in '+this.range.source.normalizedPath+":"+this.range.line.toString(10)+":"+this.range.column.toString(10):o(this.category)+" "+this.code.toString(10)+": "+this.message},e}();function p(e,r){void 0===r&&(r=!1);for(var n=e.source.text,i=n.length,s=e.start,o=e.end;s>0&&!a.isLineBreak(n.charCodeAt(s-1));)s--;for(;o=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i,a,s=r(9);!function(e){e[e.None=_BinaryenTypeNone()]="None",e[e.I32=_BinaryenTypeInt32()]="I32",e[e.I64=_BinaryenTypeInt64()]="I64",e[e.F32=_BinaryenTypeFloat32()]="F32",e[e.F64=_BinaryenTypeFloat64()]="F64",e[e.V128=_BinaryenTypeVec128()]="V128",e[e.Unreachable=_BinaryenTypeUnreachable()]="Unreachable",e[e.Auto=_BinaryenTypeAuto()]="Auto"}(i=t.NativeType||(t.NativeType={})),function(e){e[e.Invalid=_BinaryenInvalidId()]="Invalid",e[e.Block=_BinaryenBlockId()]="Block",e[e.If=_BinaryenIfId()]="If",e[e.Loop=_BinaryenLoopId()]="Loop",e[e.Break=_BinaryenBreakId()]="Break",e[e.Switch=_BinaryenSwitchId()]="Switch",e[e.Call=_BinaryenCallId()]="Call",e[e.CallIndirect=_BinaryenCallIndirectId()]="CallIndirect",e[e.GetLocal=_BinaryenGetLocalId()]="GetLocal",e[e.SetLocal=_BinaryenSetLocalId()]="SetLocal",e[e.GetGlobal=_BinaryenGetGlobalId()]="GetGlobal",e[e.SetGlobal=_BinaryenSetGlobalId()]="SetGlobal",e[e.Load=_BinaryenLoadId()]="Load",e[e.Store=_BinaryenStoreId()]="Store",e[e.Const=_BinaryenConstId()]="Const",e[e.Unary=_BinaryenUnaryId()]="Unary",e[e.Binary=_BinaryenBinaryId()]="Binary",e[e.Select=_BinaryenSelectId()]="Select",e[e.Drop=_BinaryenDropId()]="Drop",e[e.Return=_BinaryenReturnId()]="Return",e[e.Host=_BinaryenHostId()]="Host",e[e.Nop=_BinaryenNopId()]="Nop",e[e.Unreachable=_BinaryenUnreachableId()]="Unreachable",e[e.AtomicCmpxchg=_BinaryenAtomicCmpxchgId()]="AtomicCmpxchg",e[e.AtomicRMW=_BinaryenAtomicRMWId()]="AtomicRMW",e[e.AtomicWait=_BinaryenAtomicWaitId()]="AtomicWait",e[e.AtomicWake=_BinaryenAtomicWakeId()]="AtomicWake",e[e.SIMDExtract=_BinaryenSIMDExtractId()]="SIMDExtract",e[e.SIMDReplace=_BinaryenSIMDReplaceId()]="SIMDReplace",e[e.SIMDShuffle=_BinaryenSIMDShuffleId()]="SIMDShuffle",e[e.SIMDBitselect=_BinaryenSIMDBitselectId()]="SIMDBitselect",e[e.SIMDShift=_BinaryenSIMDShiftId()]="SIMDShift",e[e.MemoryInit=_BinaryenMemoryInitId()]="MemoryInit",e[e.DataDrop=_BinaryenDataDropId()]="DataDrop",e[e.MemoryCopy=_BinaryenMemoryCopyId()]="MemoryCopy",e[e.MemoryFill=_BinaryenMemoryFillId()]="MemoryFill"}(a=t.ExpressionId||(t.ExpressionId={})),function(e){e[e.ClzI32=_BinaryenClzInt32()]="ClzI32",e[e.CtzI32=_BinaryenCtzInt32()]="CtzI32",e[e.PopcntI32=_BinaryenPopcntInt32()]="PopcntI32",e[e.NegF32=_BinaryenNegFloat32()]="NegF32",e[e.AbsF32=_BinaryenAbsFloat32()]="AbsF32",e[e.CeilF32=_BinaryenCeilFloat32()]="CeilF32",e[e.FloorF32=_BinaryenFloorFloat32()]="FloorF32",e[e.TruncF32=_BinaryenTruncFloat32()]="TruncF32",e[e.NearestF32=_BinaryenNearestFloat32()]="NearestF32",e[e.SqrtF32=_BinaryenSqrtFloat32()]="SqrtF32",e[e.EqzI32=_BinaryenEqZInt32()]="EqzI32",e[e.ClzI64=_BinaryenClzInt64()]="ClzI64",e[e.CtzI64=_BinaryenCtzInt64()]="CtzI64",e[e.PopcntI64=_BinaryenPopcntInt64()]="PopcntI64",e[e.NegF64=_BinaryenNegFloat64()]="NegF64",e[e.AbsF64=_BinaryenAbsFloat64()]="AbsF64",e[e.CeilF64=_BinaryenCeilFloat64()]="CeilF64",e[e.FloorF64=_BinaryenFloorFloat64()]="FloorF64",e[e.TruncF64=_BinaryenTruncFloat64()]="TruncF64",e[e.NearestF64=_BinaryenNearestFloat64()]="NearestF64",e[e.SqrtF64=_BinaryenSqrtFloat64()]="SqrtF64",e[e.EqzI64=_BinaryenEqZInt64()]="EqzI64",e[e.ExtendI32=_BinaryenExtendSInt32()]="ExtendI32",e[e.ExtendU32=_BinaryenExtendUInt32()]="ExtendU32",e[e.WrapI64=_BinaryenWrapInt64()]="WrapI64",e[e.TruncF32ToI32=_BinaryenTruncSFloat32ToInt32()]="TruncF32ToI32",e[e.TruncF32ToI64=_BinaryenTruncSFloat32ToInt64()]="TruncF32ToI64",e[e.TruncF32ToU32=_BinaryenTruncUFloat32ToInt32()]="TruncF32ToU32",e[e.TruncF32ToU64=_BinaryenTruncUFloat32ToInt64()]="TruncF32ToU64",e[e.TruncF64ToI32=_BinaryenTruncSFloat64ToInt32()]="TruncF64ToI32",e[e.TruncF64ToI64=_BinaryenTruncSFloat64ToInt64()]="TruncF64ToI64",e[e.TruncF64ToU32=_BinaryenTruncUFloat64ToInt32()]="TruncF64ToU32",e[e.TruncF64ToU64=_BinaryenTruncUFloat64ToInt64()]="TruncF64ToU64",e[e.ReinterpretF32=_BinaryenReinterpretFloat32()]="ReinterpretF32",e[e.ReinterpretF64=_BinaryenReinterpretFloat64()]="ReinterpretF64",e[e.ConvertI32ToF32=_BinaryenConvertSInt32ToFloat32()]="ConvertI32ToF32",e[e.ConvertI32ToF64=_BinaryenConvertSInt32ToFloat64()]="ConvertI32ToF64",e[e.ConvertU32ToF32=_BinaryenConvertUInt32ToFloat32()]="ConvertU32ToF32",e[e.ConvertU32ToF64=_BinaryenConvertUInt32ToFloat64()]="ConvertU32ToF64",e[e.ConvertI64ToF32=_BinaryenConvertSInt64ToFloat32()]="ConvertI64ToF32",e[e.ConvertI64ToF64=_BinaryenConvertSInt64ToFloat64()]="ConvertI64ToF64",e[e.ConvertU64ToF32=_BinaryenConvertUInt64ToFloat32()]="ConvertU64ToF32",e[e.ConvertU64ToF64=_BinaryenConvertUInt64ToFloat64()]="ConvertU64ToF64",e[e.PromoteF32=_BinaryenPromoteFloat32()]="PromoteF32",e[e.DemoteF64=_BinaryenDemoteFloat64()]="DemoteF64",e[e.ReinterpretI32=_BinaryenReinterpretInt32()]="ReinterpretI32",e[e.ReinterpretI64=_BinaryenReinterpretInt64()]="ReinterpretI64",e[e.ExtendI8ToI32=_BinaryenExtendS8Int32()]="ExtendI8ToI32",e[e.ExtendI16ToI32=_BinaryenExtendS16Int32()]="ExtendI16ToI32",e[e.ExtendI8ToI64=_BinaryenExtendS8Int64()]="ExtendI8ToI64",e[e.ExtendI16ToI64=_BinaryenExtendS16Int64()]="ExtendI16ToI64",e[e.ExtendI32ToI64=_BinaryenExtendS32Int64()]="ExtendI32ToI64"}(t.UnaryOp||(t.UnaryOp={})),function(e){e[e.AddI32=_BinaryenAddInt32()]="AddI32",e[e.SubI32=_BinaryenSubInt32()]="SubI32",e[e.MulI32=_BinaryenMulInt32()]="MulI32",e[e.DivI32=_BinaryenDivSInt32()]="DivI32",e[e.DivU32=_BinaryenDivUInt32()]="DivU32",e[e.RemI32=_BinaryenRemSInt32()]="RemI32",e[e.RemU32=_BinaryenRemUInt32()]="RemU32",e[e.AndI32=_BinaryenAndInt32()]="AndI32",e[e.OrI32=_BinaryenOrInt32()]="OrI32",e[e.XorI32=_BinaryenXorInt32()]="XorI32",e[e.ShlI32=_BinaryenShlInt32()]="ShlI32",e[e.ShrU32=_BinaryenShrUInt32()]="ShrU32",e[e.ShrI32=_BinaryenShrSInt32()]="ShrI32",e[e.RotlI32=_BinaryenRotLInt32()]="RotlI32",e[e.RotrI32=_BinaryenRotRInt32()]="RotrI32",e[e.EqI32=_BinaryenEqInt32()]="EqI32",e[e.NeI32=_BinaryenNeInt32()]="NeI32",e[e.LtI32=_BinaryenLtSInt32()]="LtI32",e[e.LtU32=_BinaryenLtUInt32()]="LtU32",e[e.LeI32=_BinaryenLeSInt32()]="LeI32",e[e.LeU32=_BinaryenLeUInt32()]="LeU32",e[e.GtI32=_BinaryenGtSInt32()]="GtI32",e[e.GtU32=_BinaryenGtUInt32()]="GtU32",e[e.GeI32=_BinaryenGeSInt32()]="GeI32",e[e.GeU32=_BinaryenGeUInt32()]="GeU32",e[e.AddI64=_BinaryenAddInt64()]="AddI64",e[e.SubI64=_BinaryenSubInt64()]="SubI64",e[e.MulI64=_BinaryenMulInt64()]="MulI64",e[e.DivI64=_BinaryenDivSInt64()]="DivI64",e[e.DivU64=_BinaryenDivUInt64()]="DivU64",e[e.RemI64=_BinaryenRemSInt64()]="RemI64",e[e.RemU64=_BinaryenRemUInt64()]="RemU64",e[e.AndI64=_BinaryenAndInt64()]="AndI64",e[e.OrI64=_BinaryenOrInt64()]="OrI64",e[e.XorI64=_BinaryenXorInt64()]="XorI64",e[e.ShlI64=_BinaryenShlInt64()]="ShlI64",e[e.ShrU64=_BinaryenShrUInt64()]="ShrU64",e[e.ShrI64=_BinaryenShrSInt64()]="ShrI64",e[e.RotlI64=_BinaryenRotLInt64()]="RotlI64",e[e.RotrI64=_BinaryenRotRInt64()]="RotrI64",e[e.EqI64=_BinaryenEqInt64()]="EqI64",e[e.NeI64=_BinaryenNeInt64()]="NeI64",e[e.LtI64=_BinaryenLtSInt64()]="LtI64",e[e.LtU64=_BinaryenLtUInt64()]="LtU64",e[e.LeI64=_BinaryenLeSInt64()]="LeI64",e[e.LeU64=_BinaryenLeUInt64()]="LeU64",e[e.GtI64=_BinaryenGtSInt64()]="GtI64",e[e.GtU64=_BinaryenGtUInt64()]="GtU64",e[e.GeI64=_BinaryenGeSInt64()]="GeI64",e[e.GeU64=_BinaryenGeUInt64()]="GeU64",e[e.AddF32=_BinaryenAddFloat32()]="AddF32",e[e.SubF32=_BinaryenSubFloat32()]="SubF32",e[e.MulF32=_BinaryenMulFloat32()]="MulF32",e[e.DivF32=_BinaryenDivFloat32()]="DivF32",e[e.CopysignF32=_BinaryenCopySignFloat32()]="CopysignF32",e[e.MinF32=_BinaryenMinFloat32()]="MinF32",e[e.MaxF32=_BinaryenMaxFloat32()]="MaxF32",e[e.EqF32=_BinaryenEqFloat32()]="EqF32",e[e.NeF32=_BinaryenNeFloat32()]="NeF32",e[e.LtF32=_BinaryenLtFloat32()]="LtF32",e[e.LeF32=_BinaryenLeFloat32()]="LeF32",e[e.GtF32=_BinaryenGtFloat32()]="GtF32",e[e.GeF32=_BinaryenGeFloat32()]="GeF32",e[e.AddF64=_BinaryenAddFloat64()]="AddF64",e[e.SubF64=_BinaryenSubFloat64()]="SubF64",e[e.MulF64=_BinaryenMulFloat64()]="MulF64",e[e.DivF64=_BinaryenDivFloat64()]="DivF64",e[e.CopysignF64=_BinaryenCopySignFloat64()]="CopysignF64",e[e.MinF64=_BinaryenMinFloat64()]="MinF64",e[e.MaxF64=_BinaryenMaxFloat64()]="MaxF64",e[e.EqF64=_BinaryenEqFloat64()]="EqF64",e[e.NeF64=_BinaryenNeFloat64()]="NeF64",e[e.LtF64=_BinaryenLtFloat64()]="LtF64",e[e.LeF64=_BinaryenLeFloat64()]="LeF64",e[e.GtF64=_BinaryenGtFloat64()]="GtF64",e[e.GeF64=_BinaryenGeFloat64()]="GeF64"}(t.BinaryOp||(t.BinaryOp={})),function(e){e[e.CurrentMemory=_BinaryenCurrentMemory()]="CurrentMemory",e[e.GrowMemory=_BinaryenGrowMemory()]="GrowMemory"}(t.HostOp||(t.HostOp={})),function(e){e[e.Add=_BinaryenAtomicRMWAdd()]="Add",e[e.Sub=_BinaryenAtomicRMWSub()]="Sub",e[e.And=_BinaryenAtomicRMWAnd()]="And",e[e.Or=_BinaryenAtomicRMWOr()]="Or",e[e.Xor=_BinaryenAtomicRMWXor()]="Xor",e[e.Xchg=_BinaryenAtomicRMWXchg()]="Xchg"}(t.AtomicRMWOp||(t.AtomicRMWOp={})),function(e){e[e.SplatVecI8x16=_BinaryenSplatVecI8x16()]="SplatVecI8x16",e[e.SplatVecI16x8=_BinaryenSplatVecI16x8()]="SplatVecI16x8",e[e.SplatVecI32x4=_BinaryenSplatVecI32x4()]="SplatVecI32x4",e[e.SplatVecI64x2=_BinaryenSplatVecI64x2()]="SplatVecI64x2",e[e.SplatVecF32x4=_BinaryenSplatVecF32x4()]="SplatVecF32x4",e[e.SplatVecF64x2=_BinaryenSplatVecF64x2()]="SplatVecF64x2",e[e.NotVec128=_BinaryenNotVec128()]="NotVec128",e[e.NegVecI8x16=_BinaryenNegVecI8x16()]="NegVecI8x16",e[e.AnyTrueVecI8x16=_BinaryenAnyTrueVecI8x16()]="AnyTrueVecI8x16",e[e.AllTrueVecI8x16=_BinaryenAllTrueVecI8x16()]="AllTrueVecI8x16",e[e.NegVecI16x8=_BinaryenNegVecI16x8()]="NegVecI16x8",e[e.AnyTrueVecI16x8=_BinaryenAnyTrueVecI16x8()]="AnyTrueVecI16x8",e[e.AllTrueVecI16x8=_BinaryenAllTrueVecI16x8()]="AllTrueVecI16x8",e[e.NegVecI32x4=_BinaryenNegVecI32x4()]="NegVecI32x4",e[e.AnyTrueVecI32x4=_BinaryenAnyTrueVecI32x4()]="AnyTrueVecI32x4",e[e.AllTrueVecI32x4=_BinaryenAllTrueVecI32x4()]="AllTrueVecI32x4",e[e.NegVecI64x2=_BinaryenNegVecI64x2()]="NegVecI64x2",e[e.AnyTrueVecI64x2=_BinaryenAnyTrueVecI64x2()]="AnyTrueVecI64x2",e[e.AllTrueVecI64x2=_BinaryenAllTrueVecI64x2()]="AllTrueVecI64x2",e[e.AbsVecF32x4=_BinaryenAbsVecF32x4()]="AbsVecF32x4",e[e.NegVecF32x4=_BinaryenNegVecF32x4()]="NegVecF32x4",e[e.SqrtVecF32x4=_BinaryenSqrtVecF32x4()]="SqrtVecF32x4",e[e.AbsVecF64x2=_BinaryenAbsVecF64x2()]="AbsVecF64x2",e[e.NegVecF64x2=_BinaryenNegVecF64x2()]="NegVecF64x2",e[e.SqrtVecF64x2=_BinaryenSqrtVecF64x2()]="SqrtVecF64x2",e[e.TruncSatSVecF32x4ToVecI32x4=_BinaryenTruncSatSVecF32x4ToVecI32x4()]="TruncSatSVecF32x4ToVecI32x4",e[e.TruncSatUVecF32x4ToVecI32x4=_BinaryenTruncSatUVecF32x4ToVecI32x4()]="TruncSatUVecF32x4ToVecI32x4",e[e.TruncSatSVecF64x2ToVecI64x2=_BinaryenTruncSatSVecF64x2ToVecI64x2()]="TruncSatSVecF64x2ToVecI64x2",e[e.TruncSatUVecF64x2ToVecI64x2=_BinaryenTruncSatUVecF64x2ToVecI64x2()]="TruncSatUVecF64x2ToVecI64x2",e[e.ConvertSVecI32x4ToVecF32x4=_BinaryenConvertSVecI32x4ToVecF32x4()]="ConvertSVecI32x4ToVecF32x4",e[e.ConvertUVecI32x4ToVecF32x4=_BinaryenConvertUVecI32x4ToVecF32x4()]="ConvertUVecI32x4ToVecF32x4",e[e.ConvertSVecI64x2ToVecF64x2=_BinaryenConvertSVecI64x2ToVecF64x2()]="ConvertSVecI64x2ToVecF64x2",e[e.ConvertUVecI64x2ToVecF64x2=_BinaryenConvertUVecI64x2ToVecF64x2()]="ConvertUVecI64x2ToVecF64x2",e[e.EqVecI8x16=_BinaryenEqVecI8x16()]="EqVecI8x16",e[e.NeVecI8x16=_BinaryenNeVecI8x16()]="NeVecI8x16",e[e.LtSVecI8x16=_BinaryenLtSVecI8x16()]="LtSVecI8x16",e[e.LtUVecI8x16=_BinaryenLtUVecI8x16()]="LtUVecI8x16",e[e.LeSVecI8x16=_BinaryenLeSVecI8x16()]="LeSVecI8x16",e[e.LeUVecI8x16=_BinaryenLeUVecI8x16()]="LeUVecI8x16",e[e.GtSVecI8x16=_BinaryenGtSVecI8x16()]="GtSVecI8x16",e[e.GtUVecI8x16=_BinaryenGtUVecI8x16()]="GtUVecI8x16",e[e.GeSVecI8x16=_BinaryenGeSVecI8x16()]="GeSVecI8x16",e[e.GeUVecI8x16=_BinaryenGeUVecI8x16()]="GeUVecI8x16",e[e.EqVecI16x8=_BinaryenEqVecI16x8()]="EqVecI16x8",e[e.NeVecI16x8=_BinaryenNeVecI16x8()]="NeVecI16x8",e[e.LtSVecI16x8=_BinaryenLtSVecI16x8()]="LtSVecI16x8",e[e.LtUVecI16x8=_BinaryenLtUVecI16x8()]="LtUVecI16x8",e[e.LeSVecI16x8=_BinaryenLeSVecI16x8()]="LeSVecI16x8",e[e.LeUVecI16x8=_BinaryenLeUVecI16x8()]="LeUVecI16x8",e[e.GtSVecI16x8=_BinaryenGtSVecI16x8()]="GtSVecI16x8",e[e.GtUVecI16x8=_BinaryenGtUVecI16x8()]="GtUVecI16x8",e[e.GeSVecI16x8=_BinaryenGeSVecI16x8()]="GeSVecI16x8",e[e.GeUVecI16x8=_BinaryenGeUVecI16x8()]="GeUVecI16x8",e[e.EqVecI32x4=_BinaryenEqVecI32x4()]="EqVecI32x4",e[e.NeVecI32x4=_BinaryenNeVecI32x4()]="NeVecI32x4",e[e.LtSVecI32x4=_BinaryenLtSVecI32x4()]="LtSVecI32x4",e[e.LtUVecI32x4=_BinaryenLtUVecI32x4()]="LtUVecI32x4",e[e.LeSVecI32x4=_BinaryenLeSVecI32x4()]="LeSVecI32x4",e[e.LeUVecI32x4=_BinaryenLeUVecI32x4()]="LeUVecI32x4",e[e.GtSVecI32x4=_BinaryenGtSVecI32x4()]="GtSVecI32x4",e[e.GtUVecI32x4=_BinaryenGtUVecI32x4()]="GtUVecI32x4",e[e.GeSVecI32x4=_BinaryenGeSVecI32x4()]="GeSVecI32x4",e[e.GeUVecI32x4=_BinaryenGeUVecI32x4()]="GeUVecI32x4",e[e.EqVecF32x4=_BinaryenEqVecF32x4()]="EqVecF32x4",e[e.NeVecF32x4=_BinaryenNeVecF32x4()]="NeVecF32x4",e[e.LtVecF32x4=_BinaryenLtVecF32x4()]="LtVecF32x4",e[e.LeVecF32x4=_BinaryenLeVecF32x4()]="LeVecF32x4",e[e.GtVecF32x4=_BinaryenGtVecF32x4()]="GtVecF32x4",e[e.GeVecF32x4=_BinaryenGeVecF32x4()]="GeVecF32x4",e[e.EqVecF64x2=_BinaryenEqVecF64x2()]="EqVecF64x2",e[e.NeVecF64x2=_BinaryenNeVecF64x2()]="NeVecF64x2",e[e.LtVecF64x2=_BinaryenLtVecF64x2()]="LtVecF64x2",e[e.LeVecF64x2=_BinaryenLeVecF64x2()]="LeVecF64x2",e[e.GtVecF64x2=_BinaryenGtVecF64x2()]="GtVecF64x2",e[e.GeVecF64x2=_BinaryenGeVecF64x2()]="GeVecF64x2",e[e.AndVec128=_BinaryenAndVec128()]="AndVec128",e[e.OrVec128=_BinaryenOrVec128()]="OrVec128",e[e.XorVec128=_BinaryenXorVec128()]="XorVec128",e[e.AddVecI8x16=_BinaryenAddVecI8x16()]="AddVecI8x16",e[e.AddSatSVecI8x16=_BinaryenAddSatSVecI8x16()]="AddSatSVecI8x16",e[e.AddSatUVecI8x16=_BinaryenAddSatUVecI8x16()]="AddSatUVecI8x16",e[e.SubVecI8x16=_BinaryenSubVecI8x16()]="SubVecI8x16",e[e.SubSatSVecI8x16=_BinaryenSubSatSVecI8x16()]="SubSatSVecI8x16",e[e.SubSatUVecI8x16=_BinaryenSubSatUVecI8x16()]="SubSatUVecI8x16",e[e.MulVecI8x16=_BinaryenMulVecI8x16()]="MulVecI8x16",e[e.AddVecI16x8=_BinaryenAddVecI16x8()]="AddVecI16x8",e[e.AddSatSVecI16x8=_BinaryenAddSatSVecI16x8()]="AddSatSVecI16x8",e[e.AddSatUVecI16x8=_BinaryenAddSatUVecI16x8()]="AddSatUVecI16x8",e[e.SubVecI16x8=_BinaryenSubVecI16x8()]="SubVecI16x8",e[e.SubSatSVecI16x8=_BinaryenSubSatSVecI16x8()]="SubSatSVecI16x8",e[e.SubSatUVecI16x8=_BinaryenSubSatUVecI16x8()]="SubSatUVecI16x8",e[e.MulVecI16x8=_BinaryenMulVecI16x8()]="MulVecI16x8",e[e.AddVecI32x4=_BinaryenAddVecI32x4()]="AddVecI32x4",e[e.SubVecI32x4=_BinaryenSubVecI32x4()]="SubVecI32x4",e[e.MulVecI32x4=_BinaryenMulVecI32x4()]="MulVecI32x4",e[e.AddVecI64x2=_BinaryenAddVecI64x2()]="AddVecI64x2",e[e.SubVecI64x2=_BinaryenSubVecI64x2()]="SubVecI64x2",e[e.AddVecF32x4=_BinaryenAddVecF32x4()]="AddVecF32x4",e[e.SubVecF32x4=_BinaryenSubVecF32x4()]="SubVecF32x4",e[e.MulVecF32x4=_BinaryenMulVecF32x4()]="MulVecF32x4",e[e.DivVecF32x4=_BinaryenDivVecF32x4()]="DivVecF32x4",e[e.MinVecF32x4=_BinaryenMinVecF32x4()]="MinVecF32x4",e[e.MaxVecF32x4=_BinaryenMaxVecF32x4()]="MaxVecF32x4",e[e.AddVecF64x2=_BinaryenAddVecF64x2()]="AddVecF64x2",e[e.SubVecF64x2=_BinaryenSubVecF64x2()]="SubVecF64x2",e[e.MulVecF64x2=_BinaryenMulVecF64x2()]="MulVecF64x2",e[e.DivVecF64x2=_BinaryenDivVecF64x2()]="DivVecF64x2",e[e.MinVecF64x2=_BinaryenMinVecF64x2()]="MinVecF64x2",e[e.MaxVecF64x2=_BinaryenMaxVecF64x2()]="MaxVecF64x2"}(t.SIMDOp||(t.SIMDOp={}));var o=function(){function e(){}return e.create=function(t,r){var n=new e;return n.buffer=t,n.offset=r,n},e}();t.MemorySegment=o;var c=function(){function e(){this.hasTemporaryFunction=!1,this.cachedPrecomputeNames=0,this.cachedStrings=new Map}return e.create=function(){var t=new e;return t.ref=_BinaryenModuleCreate(),t.lit=memory.allocate(_BinaryenSizeofLiteral()),t},e.createFrom=function(t){var r=p(t);try{var n=new e;return n.ref=_BinaryenModuleRead(r,t.length),n.lit=memory.allocate(_BinaryenSizeofLiteral()),n}finally{memory.free(changetype(r))}},e.prototype.addFunctionType=function(e,t,r){var n=this.allocStringCached(e),i=u(r);try{return _BinaryenAddFunctionType(this.ref,n,t,i,r?r.length:0)}finally{memory.free(i)}},e.prototype.getFunctionTypeBySignature=function(e,t){var r=u(t);try{return _BinaryenGetFunctionTypeBySignature(this.ref,e,r,t?t.length:0)}finally{memory.free(r)}},e.prototype.removeFunctionType=function(e){var t=this.allocStringCached(e);_BinaryenRemoveFunctionType(this.ref,t)},e.prototype.createI32=function(e){var t=this.lit;return _BinaryenLiteralInt32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createI64=function(e,t){void 0===t&&(t=0);var r=this.lit;return _BinaryenLiteralInt64(r,e,t),_BinaryenConst(this.ref,r)},e.prototype.createF32=function(e){var t=this.lit;return _BinaryenLiteralFloat32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createF64=function(e){var t=this.lit;return _BinaryenLiteralFloat64(t,e),_BinaryenConst(this.ref,t)},e.prototype.createV128=function(e){assert(16==e.length);for(var t=this.lit,r=0;r<16;++r)store(t+r,e[r]);return _BinaryenLiteralVec128(t,t),_BinaryenConst(this.ref,t)},e.prototype.createUnary=function(e,t){return _BinaryenUnary(this.ref,e,t)},e.prototype.createBinary=function(e,t,r){return _BinaryenBinary(this.ref,e,t,r)},e.prototype.createHost=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=null);var n=this.allocStringCached(t),i=h(r);try{return _BinaryenHost(this.ref,e,n,i,r?r.length:0)}finally{memory.free(i)}},e.prototype.createGetLocal=function(e,t){return _BinaryenGetLocal(this.ref,e,t)},e.prototype.createTeeLocal=function(e,t){return _BinaryenTeeLocal(this.ref,e,t)},e.prototype.createGetGlobal=function(e,t){var r=this.allocStringCached(e);return _BinaryenGetGlobal(this.ref,r,t)},e.prototype.createLoad=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenLoad(this.ref,e,t?1:0,i,e,n,r)},e.prototype.createStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenStore(this.ref,e,i,e,t,r,n)},e.prototype.createAtomicLoad=function(e,t,r,n){return void 0===n&&(n=0),_BinaryenAtomicLoad(this.ref,e,n,r,t)},e.prototype.createAtomicStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenAtomicStore(this.ref,e,i,t,r,n)},e.prototype.createAtomicRMW=function(e,t,r,n,i,a){return _BinaryenAtomicRMW(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicCmpxchg=function(e,t,r,n,i,a){return _BinaryenAtomicCmpxchg(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicWait=function(e,t,r,n){return _BinaryenAtomicWait(this.ref,e,t,r,n)},e.prototype.createAtomicWake=function(e,t){return _BinaryenAtomicWake(this.ref,e,t)},e.prototype.createSetLocal=function(e,t){return _BinaryenSetLocal(this.ref,e,t)},e.prototype.createSetGlobal=function(e,t){var r=this.allocStringCached(e);return _BinaryenSetGlobal(this.ref,r,t)},e.prototype.createBlock=function(e,t,r){void 0===r&&(r=i.None);var n=this.allocStringCached(e),a=h(t);try{return _BinaryenBlock(this.ref,n,a,t.length,r)}finally{memory.free(a)}},e.prototype.createBreak=function(e,t,r){void 0===t&&(t=0),void 0===r&&(r=0);var n=this.allocStringCached(e);return _BinaryenBreak(this.ref,n,t,r)},e.prototype.createDrop=function(e){return _BinaryenDrop(this.ref,e)},e.prototype.createLoop=function(e,t){var r=this.allocStringCached(e);return _BinaryenLoop(this.ref,r,t)},e.prototype.createIf=function(e,t,r){return void 0===r&&(r=0),_BinaryenIf(this.ref,e,t,r)},e.prototype.createNop=function(){return _BinaryenNop(this.ref)},e.prototype.createReturn=function(e){return void 0===e&&(e=0),_BinaryenReturn(this.ref,e)},e.prototype.createSelect=function(e,t,r){return _BinaryenSelect(this.ref,r,e,t)},e.prototype.createSwitch=function(e,t,r,n){void 0===n&&(n=0);for(var i=e.length,a=new Array(i),s=0;s=0;--d)memory.free(l[d])}},e.prototype.setFunctionTable=function(e,t,r){for(var n=r.length,i=new Array(n),a=0;a=0;--i)memory.free(n[i])}},e.prototype.precomputeExpression=function(e){var t=_BinaryenGetOptimizeLevel(),r=_BinaryenGetShrinkLevel(),n=_BinaryenGetDebugInfo();_BinaryenSetOptimizeLevel(4),_BinaryenSetShrinkLevel(0),_BinaryenSetDebugInfo(!1);var i=_BinaryenExpressionGetType(e),a=this.addTemporaryFunction(i,null,e),s=this.cachedPrecomputeNames;return s||(this.cachedPrecomputeNames=s=u([this.allocStringCached("precompute")])),_BinaryenFunctionRunPasses(a,this.ref,s,1),e=_BinaryenFunctionGetBody(a),this.removeTemporaryFunction(),_BinaryenSetOptimizeLevel(t),_BinaryenSetShrinkLevel(r),_BinaryenSetDebugInfo(n),e},e.prototype.validate=function(){return 1==_BinaryenModuleValidate(this.ref)},e.prototype.interpret=function(){_BinaryenModuleInterpret(this.ref)},e.prototype.toBinary=function(e){var t=this.lit;assert(_BinaryenSizeofLiteral()>=12);var r=d(e),n=0,i=0;try{_BinaryenModuleAllocateAndWrite(t,this.ref,r),n=y(t);var a=y(t+4);i=y(t+8);var s=new g;return s.output=function(e,t){for(var r=new Uint8Array(t),n=0;n>8&255),store(r+2,a>>16&255),store(r+3,a>>>24),r+=4}return t}function h(e){return u(e)}t.Relooper=l;var _=new Map;function d(e){if(null==e)return 0;if(_.has(e))return _.get(e);for(var t=memory.allocate(function(e){for(var t=0,r=0,n=e.length;r=55296&&i<=57343&&r+1=55296&&a<=57343&&n+1>>6),store(r++,128|63&a)):a<=65535?(store(r++,224|a>>>12),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=2097151?(store(r++,240|a>>>18),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=67108863?(store(r++,248|a>>>24),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):(store(r++,252|a>>>30),store(r++,128|a>>>24&63),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a))}return store(r,0),_.set(e,t),t}function y(e){return load(e)|load(e+1)<<8|load(e+2)<<16|load(e+3)<<24}function m(e){if(!e)return null;for(var t,r,n,i,a,s=new Array;t=load(e++);)128&t?(r=63&load(e++),192!=(224&t)?(n=63&load(e++),224==(240&t)?t=(15&t)<<12|r<<6|n:(i=63&load(e++),240==(248&t)?t=(7&t)<<18|r<<12|n<<6|i:(a=63&load(e++),t=248==(252&t)?(3&t)<<24|r<<18|n<<12|i<<6|a:(1&t)<<30|r<<24|n<<18|i<<12|a<<6|63&load(e++))),s.push(t)):s.push((31&t)<<6|r)):s.push(t);return String.fromCodePoints(s)}t.readString=m;var g=function(){return function(){}}();t.BinaryModule=g,t.needsExplicitUnreachable=function e(t){switch(_BinaryenExpressionGetType(t)){case i.I32:case i.I64:case i.F32:case i.F64:return!1}switch(_BinaryenExpressionGetId(t)){case a.Unreachable:case a.Return:return!1;case a.Break:return 0!=_BinaryenBreakGetCondition(t);case a.Block:if(!_BinaryenBlockGetName(t)){var r=_BinaryenBlockGetNumChildren(t);return r>0&&e(_BinaryenBlockGetChild(t,r-1))}}return!0}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var a=r(1),s=r(6);t.Token=s.Token,t.Range=s.Range;var o,c=r(0);!function(e){e[e.SOURCE=0]="SOURCE",e[e.TYPE=1]="TYPE",e[e.TYPEPARAMETER=2]="TYPEPARAMETER",e[e.PARAMETER=3]="PARAMETER",e[e.SIGNATURE=4]="SIGNATURE",e[e.IDENTIFIER=5]="IDENTIFIER",e[e.ASSERTION=6]="ASSERTION",e[e.BINARY=7]="BINARY",e[e.CALL=8]="CALL",e[e.CLASS=9]="CLASS",e[e.COMMA=10]="COMMA",e[e.ELEMENTACCESS=11]="ELEMENTACCESS",e[e.FALSE=12]="FALSE",e[e.FUNCTION=13]="FUNCTION",e[e.INSTANCEOF=14]="INSTANCEOF",e[e.LITERAL=15]="LITERAL",e[e.NEW=16]="NEW",e[e.NULL=17]="NULL",e[e.PARENTHESIZED=18]="PARENTHESIZED",e[e.PROPERTYACCESS=19]="PROPERTYACCESS",e[e.TERNARY=20]="TERNARY",e[e.SUPER=21]="SUPER",e[e.THIS=22]="THIS",e[e.TRUE=23]="TRUE",e[e.CONSTRUCTOR=24]="CONSTRUCTOR",e[e.UNARYPOSTFIX=25]="UNARYPOSTFIX",e[e.UNARYPREFIX=26]="UNARYPREFIX",e[e.BLOCK=27]="BLOCK",e[e.BREAK=28]="BREAK",e[e.CONTINUE=29]="CONTINUE",e[e.DO=30]="DO",e[e.EMPTY=31]="EMPTY",e[e.EXPORT=32]="EXPORT",e[e.EXPORTIMPORT=33]="EXPORTIMPORT",e[e.EXPRESSION=34]="EXPRESSION",e[e.FOR=35]="FOR",e[e.IF=36]="IF",e[e.IMPORT=37]="IMPORT",e[e.RETURN=38]="RETURN",e[e.SWITCH=39]="SWITCH",e[e.THROW=40]="THROW",e[e.TRY=41]="TRY",e[e.VARIABLE=42]="VARIABLE",e[e.VOID=43]="VOID",e[e.WHILE=44]="WHILE",e[e.CLASSDECLARATION=45]="CLASSDECLARATION",e[e.ENUMDECLARATION=46]="ENUMDECLARATION",e[e.ENUMVALUEDECLARATION=47]="ENUMVALUEDECLARATION",e[e.FIELDDECLARATION=48]="FIELDDECLARATION",e[e.FUNCTIONDECLARATION=49]="FUNCTIONDECLARATION",e[e.IMPORTDECLARATION=50]="IMPORTDECLARATION",e[e.INDEXSIGNATUREDECLARATION=51]="INDEXSIGNATUREDECLARATION",e[e.INTERFACEDECLARATION=52]="INTERFACEDECLARATION",e[e.METHODDECLARATION=53]="METHODDECLARATION",e[e.NAMESPACEDECLARATION=54]="NAMESPACEDECLARATION",e[e.TYPEDECLARATION=55]="TYPEDECLARATION",e[e.VARIABLEDECLARATION=56]="VARIABLEDECLARATION",e[e.DECORATOR=57]="DECORATOR",e[e.EXPORTMEMBER=58]="EXPORTMEMBER",e[e.SWITCHCASE=59]="SWITCHCASE",e[e.COMMENT=60]="COMMENT"}(o=t.NodeKind||(t.NodeKind={})),t.nodeIsConstantValue=function(e){switch(e){case o.LITERAL:case o.NULL:case o.TRUE:case o.FALSE:return!0}return!1},t.nodeIsCallable=function(e){switch(e){case o.IDENTIFIER:case o.ASSERTION:case o.CALL:case o.ELEMENTACCESS:case o.PARENTHESIZED:case o.PROPERTYACCESS:case o.SUPER:return!0}return!1},t.nodeIsGenericCallable=function(e){switch(e){case o.IDENTIFIER:case o.PROPERTYACCESS:return!0}return!1};var l=function(){function e(){this.parent=null,this.flags=a.CommonFlags.NONE}return e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.set=function(e){this.flags|=e},e.createType=function(e,t,r,n){var i=new u;return i.range=n,i.name=e,e.parent=i,i.typeArguments=t,t&&De(t,i),i.isNullable=r,i},e.createOmittedType=function(t){return e.createType(e.createIdentifierExpression("",t),null,!1,t)},e.createTypeParameter=function(e,t,r,n){var i=new h;return i.range=n,i.name=e,e.parent=i,i.extendsType=t,t&&(t.parent=i),i.defaultType=r,r&&(r.parent=i),i},e.createParameter=function(e,t,r,n,i){var a=new _;return a.range=i,a.name=e,e.parent=a,a.type=t,t&&(t.parent=a),a.initializer=r,r&&(r.parent=a),a.parameterKind=n,a},e.createSignature=function(e,t,r,n,i){var a=new y;return a.range=i,a.parameters=e,De(e,a),a.returnType=t,t.parent=a,a.explicitThisType=r,r&&(r.parent=a),a.isNullable=n,a},e.createDecorator=function(e,t,r){var n=new g;return n.range=r,n.name=e,e.parent=n,n.arguments=t,t&&De(t,n),n.decoratorKind=m(e),n},e.createComment=function(e,t,r){var n=new T;return n.range=r,n.commentKind=t,n.text=e,n},e.createIdentifierExpression=function(e,t){var r=new I;return r.range=t,r.text=e,r},e.createEmptyIdentifierExpression=function(e){var t=new I;return t.range=e,t.text="",t},e.createArrayLiteralExpression=function(e,t){var r=new A;return r.range=t,r.elementExpressions=e,function(e,t){for(var r=0,n=e.length;r=0?c.substring(l+1):c,i.statements=new Array,i.range=new s.Range(i,0,r.length),i.text=r,i}return i(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==j.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==j.LIBRARY},enumerable:!0,configurable:!0}),t}(l);t.Source=J;var $=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.decorators=null,t.cachedProgramLevelInternalName=null,t.cachedFileLevelInternalName=null,t}return i(t,e),Object.defineProperty(t.prototype,"programLevelInternalName",{get:function(){return this.cachedProgramLevelInternalName||(this.cachedProgramLevelInternalName=Fe(this,!0)),this.cachedProgramLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fileLevelInternalName",{get:function(){return this.cachedFileLevelInternalName||(this.cachedFileLevelInternalName=Fe(this,!1)),this.cachedFileLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevel",{get:function(){var e=this.parent;return!!e&&(!(e.kind==o.VARIABLE&&!(e=e.parent))&&e.kind==o.SOURCE)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevelExport",{get:function(){var e=this.parent;return!(!e||e.kind==o.VARIABLE&&!(e=e.parent))&&(e.kind==o.NAMESPACEDECLARATION?this.is(a.CommonFlags.EXPORT)&&e.isTopLevelExport:e.kind==o.CLASSDECLARATION?this.is(a.CommonFlags.STATIC)&&e.isTopLevelExport:e.kind==o.SOURCE&&this.is(a.CommonFlags.EXPORT))},enumerable:!0,configurable:!0}),t.prototype.needsExplicitExport=function(e){return e.name.text!=e.externalName.text||this.range.source!=e.range.source||!this.isTopLevelExport},t}(Z);t.DeclarationStatement=$;var ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.INDEXSIGNATUREDECLARATION,t}return i(t,e),t}($);t.IndexSignatureDeclaration=ee;var te=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}($);t.VariableLikeDeclarationStatement=te;var re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.BLOCK,t}return i(t,e),t}(Z);t.BlockStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.BREAK,t}return i(t,e),t}(Z);t.BreakStatement=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.CLASSDECLARATION,t}return i(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}($);t.ClassDeclaration=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.CONTINUE,t}return i(t,e),t}(Z);t.ContinueStatement=ae;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.DO,t}return i(t,e),t}(Z);t.DoStatement=se;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EMPTY,t}return i(t,e),t}(Z);t.EmptyStatement=oe;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.ENUMDECLARATION,t}return i(t,e),t}($);t.EnumDeclaration=ce;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.ENUMVALUEDECLARATION,t}return i(t,e),t}($);t.EnumValueDeclaration=le;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPORTIMPORT,t}return i(t,e),t}(l);t.ExportImportStatement=pe;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPORTMEMBER,t}return i(t,e),t}(l);t.ExportMember=ue;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPORT,t}return i(t,e),t}(Z);t.ExportStatement=he;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPRESSION,t}return i(t,e),t}(Z);t.ExpressionStatement=_e;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.FIELDDECLARATION,t.parameterIndex=-1,t}return i(t,e),t}(te);t.FieldDeclaration=de;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.FOR,t}return i(t,e),t}(Z);t.ForStatement=ye;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.FUNCTIONDECLARATION,t}return i(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}($);t.FunctionDeclaration=me;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.IF,t}return i(t,e),t}(Z);t.IfStatement=ge;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.IMPORTDECLARATION,t}return i(t,e),t}($);t.ImportDeclaration=Te;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.IMPORT,t}return i(t,e),t}(Z);t.ImportStatement=Ee;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.INTERFACEDECLARATION,t}return i(t,e),t}(ie);t.InterfaceDeclaration=fe;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.METHODDECLARATION,t}return i(t,e),t}(me);t.MethodDeclaration=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.NAMESPACEDECLARATION,t}return i(t,e),t}($);t.NamespaceDeclaration=ve;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.RETURN,t}return i(t,e),t}(Z);t.ReturnStatement=Ae;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.SWITCHCASE,t}return i(t,e),t}(l);t.SwitchCase=Ce;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.SWITCH,t}return i(t,e),t}(Z);t.SwitchStatement=Se;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.THROW,t}return i(t,e),t}(Z);t.ThrowStatement=Ne;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.TRY,t}return i(t,e),t}(Z);t.TryStatement=Oe;var xe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.TYPEDECLARATION,t}return i(t,e),t}($);t.TypeDeclaration=xe;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.VARIABLEDECLARATION,t}return i(t,e),t}(te);t.VariableDeclaration=be;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.VARIABLE,t}return i(t,e),t}(Z);t.VariableStatement=Le;var ke=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.VOID,t}return i(t,e),t}(Z);t.VoidStatement=ke;var Re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.WHILE,t}return i(t,e),t}(Z);function Fe(e,t){void 0===t&&(t=!1);var r=e.name.text,n=e.parent;return n&&(e.kind!=o.VARIABLEDECLARATION||n.kind!=o.VARIABLE||(n=n.parent))?n.kind==o.CLASSDECLARATION?Fe(n,t)+(e.is(a.CommonFlags.STATIC)?a.STATIC_DELIMITER:a.INSTANCE_DELIMITER)+r:n.kind==o.NAMESPACEDECLARATION||n.kind==o.ENUMDECLARATION?Fe(n,t)+a.STATIC_DELIMITER+r:t?r:e.range.source.internalPath+a.PATH_DELIMITER+r:r}function Be(e){return e.endsWith(".ts")&&(e=e.substring(0,e.length-3)),e}function De(e,t){for(var r=0,n=e.length;r=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o,c=r(1),l=r(2),p=r(7),u=r(4),h=r(3),_=r(0),d=r(11),y=function(){return function(){}}(),m=function(){return function(){}}(),g=function(){return function(){}}();function T(e,t){switch(assert(t.length),e){case u.DecoratorKind.OPERATOR:case u.DecoratorKind.OPERATOR_BINARY:switch(t.charCodeAt(0)){case 91:if("[]"==t)return o.INDEXED_GET;if("[]="==t)return o.INDEXED_SET;break;case 123:if("{}"==t)return o.UNCHECKED_INDEXED_GET;if("{}="==t)return o.UNCHECKED_INDEXED_SET;break;case 43:if("+"==t)return o.ADD;break;case 45:if("-"==t)return o.SUB;break;case 42:if("*"==t)return o.MUL;if("**"==t)return o.POW;break;case 47:if("/"==t)return o.DIV;break;case 37:if("%"==t)return o.REM;break;case 38:if("&"==t)return o.BITWISE_AND;break;case 124:if("|"==t)return o.BITWISE_OR;break;case 94:if("^"==t)return o.BITWISE_XOR;break;case 61:if("=="==t)return o.EQ;break;case 33:if("!="==t)return o.NE;break;case 62:if(">"==t)return o.GT;if(">="==t)return o.GE;if(">>"==t)return o.BITWISE_SHR;if(">>>"==t)return o.BITWISE_SHR_U;break;case 60:if("<"==t)return o.LT;if("<="==t)return o.LE;if("<<"==t)return o.BITWISE_SHL}break;case u.DecoratorKind.OPERATOR_PREFIX:switch(t.charCodeAt(0)){case 43:if("+"==t)return o.PLUS;if("++"==t)return o.PREFIX_INC;break;case 45:if("-"==t)return o.MINUS;if("--"==t)return o.PREFIX_DEC;break;case 33:if("!"==t)return o.NOT;break;case 126:if("~"==t)return o.BITWISE_NOT}break;case u.DecoratorKind.OPERATOR_POSTFIX:switch(t.charCodeAt(0)){case 43:if("++"==t)return o.POSTFIX_INC;break;case 45:if("--"==t)return o.POSTFIX_DEC}}return o.INVALID}!function(e){e[e.INVALID=0]="INVALID",e[e.INDEXED_GET=1]="INDEXED_GET",e[e.INDEXED_SET=2]="INDEXED_SET",e[e.UNCHECKED_INDEXED_GET=3]="UNCHECKED_INDEXED_GET",e[e.UNCHECKED_INDEXED_SET=4]="UNCHECKED_INDEXED_SET",e[e.ADD=5]="ADD",e[e.SUB=6]="SUB",e[e.MUL=7]="MUL",e[e.DIV=8]="DIV",e[e.REM=9]="REM",e[e.POW=10]="POW",e[e.BITWISE_AND=11]="BITWISE_AND",e[e.BITWISE_OR=12]="BITWISE_OR",e[e.BITWISE_XOR=13]="BITWISE_XOR",e[e.BITWISE_SHL=14]="BITWISE_SHL",e[e.BITWISE_SHR=15]="BITWISE_SHR",e[e.BITWISE_SHR_U=16]="BITWISE_SHR_U",e[e.EQ=17]="EQ",e[e.NE=18]="NE",e[e.GT=19]="GT",e[e.GE=20]="GE",e[e.LT=21]="LT",e[e.LE=22]="LE",e[e.PLUS=23]="PLUS",e[e.MINUS=24]="MINUS",e[e.NOT=25]="NOT",e[e.BITWISE_NOT=26]="BITWISE_NOT",e[e.PREFIX_INC=27]="PREFIX_INC",e[e.PREFIX_DEC=28]="PREFIX_DEC",e[e.POSTFIX_INC=29]="POSTFIX_INC",e[e.POSTFIX_DEC=30]="POSTFIX_DEC"}(o=t.OperatorKind||(t.OperatorKind={}));var E,f,I=new Map,v=function(e){function t(t){void 0===t&&(t=null);var r=e.call(this,t)||this;return r.diagnosticsOffset=0,r.elementsLookup=new Map,r.instancesLookup=new Map,r.typesLookup=I,r.typeAliases=new Map,r.fileLevelExports=new Map,r.moduleLevelExports=new Map,r.basicClasses=new Map,r.arrayBufferInstance=null,r.arrayPrototype=null,r.stringInstance=null,r.mainFunction=null,r.abortInstance=null,r.memoryAllocateInstance=null,r.hasGC=!1,r.gcAllocateInstance=null,r.gcLinkInstance=null,r.gcMarkInstance=null,r.gcHeaderSize=0,r.gcHookOffset=0,r.resolver=new d.Resolver(r),r.sources=[],r}return i(t,e),t.prototype.getSource=function(e){for(var t=this.sources,r=0,n=t.length;r=0);var t,r=this.parentFunction;switch(assert(null!=e.type),e.type.toNativeType()){case h.NativeType.I32:t=r.tempI32s||(r.tempI32s=[]);break;case h.NativeType.I64:t=r.tempI64s||(r.tempI64s=[]);break;case h.NativeType.F32:t=r.tempF32s||(r.tempF32s=[]);break;case h.NativeType.F64:t=r.tempF64s||(r.tempF64s=[]);break;default:throw new Error("concrete type expected")}assert(e.index>=0),t.push(e)}},e.prototype.getAndFreeTempLocal=function(e,t){var r,n,i=this.parentFunction;switch(e.toNativeType()){case h.NativeType.I32:r=i.tempI32s||(i.tempI32s=[]);break;case h.NativeType.I64:r=i.tempI64s||(i.tempI64s=[]);break;case h.NativeType.F32:r=i.tempF32s||(i.tempF32s=[]);break;case h.NativeType.F64:r=i.tempF64s||(i.tempF64s=[]);break;default:throw new Error("concrete type expected")}return r.length?(n=r[r.length-1]).type=e:(n=i.addLocal(e),r.push(n)),e.is(36)&&this.setLocalWrapped(n.index,t),n},e.prototype.addScopedLocal=function(e,t,r,n){void 0===n&&(n=null);var i=this.getTempLocal(t,!1);if(this.scopedLocals){var a=this.scopedLocals.get(e);if(a)return n&&this.parentFunction.program.error(l.DiagnosticCode.Duplicate_identifier_0,n.range),a}else this.scopedLocals=new Map;return i.set(c.CommonFlags.SCOPED),this.scopedLocals.set(e,i),t.is(36)&&this.setLocalWrapped(i.index,r),i},e.prototype.addScopedAlias=function(e,t,r,n){if(void 0===n&&(n=null),this.scopedLocals){var i=this.scopedLocals.get(e);if(i)return n&&this.parentFunction.program.error(l.DiagnosticCode.Duplicate_identifier_0,n.range),i}else this.scopedLocals=new Map;assert(r1?e.breakLabel=t[r-2].toString(10):(e.breakLabel=null,e.breakStack=null)},e.prototype.inherit=function(e){this.flags|=4095&e.flags,this.wrappedLocals=e.wrappedLocals,this.wrappedLocalsExt=e.wrappedLocalsExt},e.prototype.inheritConditional=function(e){e.is(1)&&this.set(128),e.is(4)&&this.set(256),e.is(8)&&e.breakLabel==this.breakLabel&&this.set(512),e.is(16)&&e.continueLabel==this.continueLabel&&this.set(1024),e.is(32)&&this.set(2048)},e.prototype.inheritMutual=function(e,t){this.flags|=e.flags&t.flags&127,this.flags|=3968&e.flags,this.flags|=3968&t.flags,this.wrappedLocals=i64_and(e.wrappedLocals,t.wrappedLocals);var r=e.wrappedLocalsExt,n=t.wrappedLocalsExt;if(null!=r&&null!=n){var i=this.wrappedLocalsExt,a=min(r.length,n.length);if(a){if(i)for(;i.lengtha):this.canOverflow(h.getBinaryLeft(e),t)&&!(h.getExpressionId(r=h.getBinaryRight(e))==h.ExpressionId.Const&&h.getConstValueI32(r)>=a);case h.BinaryOp.DivU32:case h.BinaryOp.RemI32:case h.BinaryOp.RemU32:return this.canOverflow(h.getBinaryLeft(e),t)||this.canOverflow(h.getBinaryRight(e),t)}break;case h.ExpressionId.Unary:switch(h.getUnaryOp(e)){case h.UnaryOp.EqzI32:case h.UnaryOp.EqzI64:return!1;case h.UnaryOp.ClzI32:case h.UnaryOp.CtzI32:case h.UnaryOp.PopcntI32:return t.size<7}break;case h.ExpressionId.Const:var s=0;switch(h.getExpressionType(e)){case h.NativeType.I32:s=h.getConstValueI32(e);break;case h.NativeType.I64:s=h.getConstValueI64Low(e);break;case h.NativeType.F32:s=i32(h.getConstValueF32(e));break;case h.NativeType.F64:s=i32(h.getConstValueF64(e));break;default:assert(!1)}switch(t.kind){case 0:return si8.MAX_VALUE;case 1:return si16.MAX_VALUE;case 5:return s<0||s>u8.MAX_VALUE;case 6:return s<0||s>u16.MAX_VALUE;case 10:return 0!=(-2&s)}break;case h.ExpressionId.Load:var o=void 0;switch(h.getLoadBytes(e)){case 1:o=h.isLoadSigned(e)?p.Type.i8:p.Type.u8;break;case 2:o=h.isLoadSigned(e)?p.Type.i16:p.Type.u16;break;default:o=h.isLoadSigned(e)?p.Type.i32:p.Type.u32}return H(o,t);case h.ExpressionId.Block:if(!h.getBlockName(e)){var c=assert(h.getBlockChildCount(e)),l=h.getBlockChild(e,c-1);return this.canOverflow(l,t)}break;case h.ExpressionId.If:return this.canOverflow(h.getIfTrue(e),t)||this.canOverflow(assert(h.getIfFalse(e)),t);case h.ExpressionId.Select:return this.canOverflow(h.getSelectThen(e),t)||this.canOverflow(h.getSelectElse(e),t);case h.ExpressionId.Call:var u=this.parentFunction.program,_=assert(u.instancesLookup.get(assert(h.getCallTarget(e))));assert(_.kind==E.FUNCTION);var d=_.signature.returnType;return!_.flow.is(2)||H(d,t);case h.ExpressionId.Unreachable:return!1}return!0},e}();function H(e,t){return!e.is(4)||e.size>t.size||e.is(1)!=t.is(1)}t.Flow=z},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var a,s,o=r(2),c=r(4),l=r(0);function p(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return a.ABSTRACT;case"as":return a.AS;case"async":return a.ASYNC;case"await":return a.AWAIT}break;case 98:switch(e){case"break":return a.BREAK}break;case 99:switch(e){case"case":return a.CASE;case"catch":return a.CATCH;case"class":return a.CLASS;case"continue":return a.CONTINUE;case"const":return a.CONST;case"constructor":return a.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return a.DEBUGGER;case"declare":return a.DECLARE;case"default":return a.DEFAULT;case"delete":return a.DELETE;case"do":return a.DO}break;case 101:switch(e){case"else":return a.ELSE;case"enum":return a.ENUM;case"export":return a.EXPORT;case"extends":return a.EXTENDS}break;case 102:switch(e){case"false":return a.FALSE;case"finally":return a.FINALLY;case"for":return a.FOR;case"from":return a.FROM;case"function":return a.FUNCTION}break;case 103:switch(e){case"get":return a.GET}break;case 105:switch(e){case"if":return a.IF;case"implements":return a.IMPLEMENTS;case"import":return a.IMPORT;case"in":return a.IN;case"instanceof":return a.INSTANCEOF;case"interface":return a.INTERFACE;case"is":return a.IS}break;case 107:switch(e){case"keyof":return a.KEYOF}break;case 108:switch(e){case"let":return a.LET}break;case 109:switch(e){case"module":return a.MODULE}break;case 110:switch(e){case"namespace":return a.NAMESPACE;case"new":return a.NEW;case"null":return a.NULL}break;case 111:switch(e){case"of":return a.OF}break;case 112:switch(e){case"package":return a.PACKAGE;case"private":return a.PRIVATE;case"protected":return a.PROTECTED;case"public":return a.PUBLIC}break;case 114:switch(e){case"readonly":return a.READONLY;case"return":return a.RETURN}break;case 115:switch(e){case"set":return a.SET;case"static":return a.STATIC;case"super":return a.SUPER;case"switch":return a.SWITCH}break;case 116:switch(e){case"this":return a.THIS;case"throw":return a.THROW;case"true":return a.TRUE;case"try":return a.TRY;case"type":return a.TYPE;case"typeof":return a.TYPEOF}break;case 118:switch(e){case"var":return a.VAR;case"void":return a.VOID}break;case 119:switch(e){case"while":return a.WHILE;case"with":return a.WITH}break;case 121:switch(e){case"yield":return a.YIELD}}return a.INVALID}function u(e){switch(e){case a.ABSTRACT:case a.AS:case a.CONSTRUCTOR:case a.DECLARE:case a.DELETE:case a.FROM:case a.FOR:case a.GET:case a.IS:case a.KEYOF:case a.MODULE:case a.NAMESPACE:case a.READONLY:case a.SET:case a.TYPE:case a.VOID:return!0;default:return!1}}!function(e){e[e.ABSTRACT=0]="ABSTRACT",e[e.AS=1]="AS",e[e.ASYNC=2]="ASYNC",e[e.AWAIT=3]="AWAIT",e[e.BREAK=4]="BREAK",e[e.CASE=5]="CASE",e[e.CATCH=6]="CATCH",e[e.CLASS=7]="CLASS",e[e.CONST=8]="CONST",e[e.CONTINUE=9]="CONTINUE",e[e.CONSTRUCTOR=10]="CONSTRUCTOR",e[e.DEBUGGER=11]="DEBUGGER",e[e.DECLARE=12]="DECLARE",e[e.DEFAULT=13]="DEFAULT",e[e.DELETE=14]="DELETE",e[e.DO=15]="DO",e[e.ELSE=16]="ELSE",e[e.ENUM=17]="ENUM",e[e.EXPORT=18]="EXPORT",e[e.EXTENDS=19]="EXTENDS",e[e.FALSE=20]="FALSE",e[e.FINALLY=21]="FINALLY",e[e.FOR=22]="FOR",e[e.FROM=23]="FROM",e[e.FUNCTION=24]="FUNCTION",e[e.GET=25]="GET",e[e.IF=26]="IF",e[e.IMPLEMENTS=27]="IMPLEMENTS",e[e.IMPORT=28]="IMPORT",e[e.IN=29]="IN",e[e.INSTANCEOF=30]="INSTANCEOF",e[e.INTERFACE=31]="INTERFACE",e[e.IS=32]="IS",e[e.KEYOF=33]="KEYOF",e[e.LET=34]="LET",e[e.MODULE=35]="MODULE",e[e.NAMESPACE=36]="NAMESPACE",e[e.NEW=37]="NEW",e[e.NULL=38]="NULL",e[e.OF=39]="OF",e[e.PACKAGE=40]="PACKAGE",e[e.PRIVATE=41]="PRIVATE",e[e.PROTECTED=42]="PROTECTED",e[e.PUBLIC=43]="PUBLIC",e[e.READONLY=44]="READONLY",e[e.RETURN=45]="RETURN",e[e.SET=46]="SET",e[e.STATIC=47]="STATIC",e[e.SUPER=48]="SUPER",e[e.SWITCH=49]="SWITCH",e[e.THIS=50]="THIS",e[e.THROW=51]="THROW",e[e.TRUE=52]="TRUE",e[e.TRY=53]="TRY",e[e.TYPE=54]="TYPE",e[e.TYPEOF=55]="TYPEOF",e[e.VAR=56]="VAR",e[e.VOID=57]="VOID",e[e.WHILE=58]="WHILE",e[e.WITH=59]="WITH",e[e.YIELD=60]="YIELD",e[e.OPENBRACE=61]="OPENBRACE",e[e.CLOSEBRACE=62]="CLOSEBRACE",e[e.OPENPAREN=63]="OPENPAREN",e[e.CLOSEPAREN=64]="CLOSEPAREN",e[e.OPENBRACKET=65]="OPENBRACKET",e[e.CLOSEBRACKET=66]="CLOSEBRACKET",e[e.DOT=67]="DOT",e[e.DOT_DOT_DOT=68]="DOT_DOT_DOT",e[e.SEMICOLON=69]="SEMICOLON",e[e.COMMA=70]="COMMA",e[e.LESSTHAN=71]="LESSTHAN",e[e.GREATERTHAN=72]="GREATERTHAN",e[e.LESSTHAN_EQUALS=73]="LESSTHAN_EQUALS",e[e.GREATERTHAN_EQUALS=74]="GREATERTHAN_EQUALS",e[e.EQUALS_EQUALS=75]="EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS=76]="EXCLAMATION_EQUALS",e[e.EQUALS_EQUALS_EQUALS=77]="EQUALS_EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS_EQUALS=78]="EXCLAMATION_EQUALS_EQUALS",e[e.EQUALS_GREATERTHAN=79]="EQUALS_GREATERTHAN",e[e.PLUS=80]="PLUS",e[e.MINUS=81]="MINUS",e[e.ASTERISK_ASTERISK=82]="ASTERISK_ASTERISK",e[e.ASTERISK=83]="ASTERISK",e[e.SLASH=84]="SLASH",e[e.PERCENT=85]="PERCENT",e[e.PLUS_PLUS=86]="PLUS_PLUS",e[e.MINUS_MINUS=87]="MINUS_MINUS",e[e.LESSTHAN_LESSTHAN=88]="LESSTHAN_LESSTHAN",e[e.GREATERTHAN_GREATERTHAN=89]="GREATERTHAN_GREATERTHAN",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN=90]="GREATERTHAN_GREATERTHAN_GREATERTHAN",e[e.AMPERSAND=91]="AMPERSAND",e[e.BAR=92]="BAR",e[e.CARET=93]="CARET",e[e.EXCLAMATION=94]="EXCLAMATION",e[e.TILDE=95]="TILDE",e[e.AMPERSAND_AMPERSAND=96]="AMPERSAND_AMPERSAND",e[e.BAR_BAR=97]="BAR_BAR",e[e.QUESTION=98]="QUESTION",e[e.COLON=99]="COLON",e[e.EQUALS=100]="EQUALS",e[e.PLUS_EQUALS=101]="PLUS_EQUALS",e[e.MINUS_EQUALS=102]="MINUS_EQUALS",e[e.ASTERISK_EQUALS=103]="ASTERISK_EQUALS",e[e.ASTERISK_ASTERISK_EQUALS=104]="ASTERISK_ASTERISK_EQUALS",e[e.SLASH_EQUALS=105]="SLASH_EQUALS",e[e.PERCENT_EQUALS=106]="PERCENT_EQUALS",e[e.LESSTHAN_LESSTHAN_EQUALS=107]="LESSTHAN_LESSTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_EQUALS=108]="GREATERTHAN_GREATERTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS=109]="GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS",e[e.AMPERSAND_EQUALS=110]="AMPERSAND_EQUALS",e[e.BAR_EQUALS=111]="BAR_EQUALS",e[e.CARET_EQUALS=112]="CARET_EQUALS",e[e.AT=113]="AT",e[e.IDENTIFIER=114]="IDENTIFIER",e[e.STRINGLITERAL=115]="STRINGLITERAL",e[e.INTEGERLITERAL=116]="INTEGERLITERAL",e[e.FLOATLITERAL=117]="FLOATLITERAL",e[e.INVALID=118]="INVALID",e[e.ENDOFFILE=119]="ENDOFFILE"}(a=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(s=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=p,t.tokenIsAlsoIdentifier=u,t.operatorTokenToString=function(e){switch(e){case a.DELETE:return"delete";case a.IN:return"in";case a.INSTANCEOF:return"instanceof";case a.NEW:return"new";case a.TYPEOF:return"typeof";case a.VOID:return"void";case a.YIELD:return"yield";case a.DOT_DOT_DOT:return"...";case a.COMMA:return",";case a.LESSTHAN:return"<";case a.GREATERTHAN:return">";case a.LESSTHAN_EQUALS:return"<=";case a.GREATERTHAN_EQUALS:return">=";case a.EQUALS_EQUALS:return"==";case a.EXCLAMATION_EQUALS:return"!=";case a.EQUALS_EQUALS_EQUALS:return"===";case a.EXCLAMATION_EQUALS_EQUALS:return"!==";case a.PLUS:return"+";case a.MINUS:return"-";case a.ASTERISK_ASTERISK:return"**";case a.ASTERISK:return"*";case a.SLASH:return"/";case a.PERCENT:return"%";case a.PLUS_PLUS:return"++";case a.MINUS_MINUS:return"--";case a.LESSTHAN_LESSTHAN:return"<<";case a.GREATERTHAN_GREATERTHAN:return">>";case a.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case a.AMPERSAND:return"&";case a.BAR:return"|";case a.CARET:return"^";case a.EXCLAMATION:return"!";case a.TILDE:return"~";case a.AMPERSAND_AMPERSAND:return"&&";case a.BAR_BAR:return"||";case a.EQUALS:return"=";case a.PLUS_EQUALS:return"+=";case a.MINUS_EQUALS:return"-=";case a.ASTERISK_EQUALS:return"*=";case a.ASTERISK_ASTERISK_EQUALS:return"**=";case a.SLASH_EQUALS:return"/=";case a.PERCENT_EQUALS:return"%=";case a.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case a.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case a.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case a.AMPERSAND_EQUALS:return"&=";case a.BAR_EQUALS:return"|=";case a.CARET_EQUALS:return"^=";default:return assert(!1),""}};var h=function(){function e(e,t,r){this.debugInfoRef=0,this.source=e,this.start=t,this.end=r}return e.join=function(t,r){if(t.source!=r.source)throw new Error("source mismatch");return new e(t.source,t.startr.end?t.end:r.end)},Object.defineProperty(e.prototype,"atStart",{get:function(){return new e(this.source,this.start,this.start)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"atEnd",{get:function(){return new e(this.source,this.end,this.end)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"line",{get:function(){for(var e=this.source.text,t=1,r=this.start;r>=0;--r)10==e.charCodeAt(r)&&t++;return t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"column",{get:function(){for(var e=this.source.text,t=0,r=this.start-1;r>=0&&10!=e.charCodeAt(r);--r)++t;return t},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return this.source.text.substring(this.start,this.end)},e}();t.Range=h;var _=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,r)||this;n.end=0,n.pos=0,n.token=-1,n.tokenPos=0,n.nextToken=-1,n.nextTokenPos=0,n.nextTokenOnNewLine=!1,n.onComment=null,n.source=t,n.pos=0,n.end=t.text.length,n.diagnostics=r||new Array;var i=t.text;if(n.pos1&&this.pos2&&this.pos1&&this.pos1&&this.pos1&&this.pos2&&this.pos1&&this.pos1&&this.pos1&&this.pos2&&this.pos+11&&this.pos1&&this.pos2&&this.pos1&&this.pos2&&this.pos1&&this.pos2&&this.pos3&&this.pos1&&this.pos1&&this.pos=this.end){n+=e.substring(r,this.pos),this.error(o.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.end));break}var i=e.charCodeAt(this.pos);if(i==t){n+=e.substring(r,this.pos++);break}if(92!=i){if(l.isLineBreak(i)){n+=e.substring(r,this.pos),this.error(o.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.pos));break}++this.pos}else n+=e.substring(r,this.pos),n+=this.readEscapeSequence(),r=this.pos}return n},t.prototype.readEscapeSequence=function(){if(++this.pos>=this.end)return this.error(o.DiagnosticCode.Unexpected_end_of_text,this.range(this.end)),"";var e=this.source.text,t=e.charCodeAt(this.pos++);switch(t){case 48:return"\0";case 98:return"\b";case 116:return"\t";case 110:return"\n";case 118:return"\v";case 102:return"\f";case 114:return"\r";case 39:return"'";case 34:return'"';case 117:return this.pos=this.end){this.error(o.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.end));break}if(92!=e.charCodeAt(this.pos)){var n=e.charCodeAt(this.pos);if(47==n&&!r)break;if(l.isLineBreak(n)){this.error(o.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.pos));break}++this.pos,r=!1}else++this.pos,r=!0}return e.substring(t,this.pos)},t.prototype.readRegexpFlags=function(){for(var e=this.source.text,t=this.pos,r=0;this.pos57)&&95!=r)break;t++}return!0},t.prototype.readInteger=function(){var e=this.source.text;if(48==e.charCodeAt(this.pos)&&this.pos+2=48&&s<=57)r=i64_add(i64_mul(r,n),i64_new(s-48,0));else if(s>=65&&s<=70)r=i64_add(i64_mul(r,n),i64_new(10+s-65,0));else if(s>=97&&s<=102)r=i64_add(i64_mul(r,n),i64_new(10+s-97,0));else{if(95!=s)break;i==a&&this.error(i==t?o.DiagnosticCode.Numeric_separators_are_not_allowed_here:o.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(o.DiagnosticCode.Hexadecimal_digit_expected,this.range(t)):i==this.pos&&this.error(o.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readDecimalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(10,0),i=t;this.pos=48&&s<=57)r=i64_add(i64_mul(r,n),i64_new(s-48,0));else{if(95!=s)break;i==a&&this.error(i==t?o.DiagnosticCode.Numeric_separators_are_not_allowed_here:o.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(o.DiagnosticCode.Digit_expected,this.range(t)):i==this.pos&&this.error(o.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readOctalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(8,0),i=t;this.pos=48&&s<=55)r=i64_add(i64_mul(r,n),i64_new(s-48,0));else{if(95!=s)break;i==a&&this.error(i==t?o.DiagnosticCode.Numeric_separators_are_not_allowed_here:o.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}++this.pos}return this.pos==t?this.error(o.DiagnosticCode.Octal_digit_expected,this.range(t)):i==this.pos&&this.error(o.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readBinaryInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(2,0),i=i64_new(1,0),a=t;this.pos=48&&n<=57)t=16*t+n-48;else if(n>=65&&n<=70)t=16*t+10+n-65;else{if(!(n>=97&&n<=102))return this.error(o.DiagnosticCode.Hexadecimal_digit_expected,this.range(this.pos-1,this.pos)),"";t=16*t+10+n-97}if(0==--e)break}return e?(this.error(o.DiagnosticCode.Unexpected_end_of_text,this.range(this.pos)),""):String.fromCharCode(t)},t.prototype.readExtendedUnicodeEscape=function(){var e=this.pos,t=this.readHexInteger(),r=i64_low(t),n=!1;assert(!i64_high(t)),r>1114111&&(this.error(o.DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,this.range(e,this.pos)),n=!0);var i=this.source.text;return this.pos>=this.end?(this.error(o.DiagnosticCode.Unexpected_end_of_text,this.range(e,this.end)),n=!0):125==i.charCodeAt(this.pos)?++this.pos:(this.error(o.DiagnosticCode.Unterminated_Unicode_escape_sequence,this.range(e,this.pos)),n=!0),n?"":r<65536?String.fromCharCode(r):String.fromCharCode(55296+((r-65536)/1024|0),(r-65536)%1024+56320)},t.prototype.finish=function(){},t}(o.DiagnosticEmitter);t.Tokenizer=_;var d=function(){return function(){}}();t.State=d;var y=null},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5),i=r(3);!function(e){e[e.I8=0]="I8",e[e.I16=1]="I16",e[e.I32=2]="I32",e[e.I64=3]="I64",e[e.ISIZE=4]="ISIZE",e[e.U8=5]="U8",e[e.U16=6]="U16",e[e.U32=7]="U32",e[e.U64=8]="U64",e[e.USIZE=9]="USIZE",e[e.BOOL=10]="BOOL",e[e.F32=11]="F32",e[e.F64=12]="F64",e[e.V128=13]="V128",e[e.VOID=14]="VOID"}(t.TypeKind||(t.TypeKind={})),function(e){e[e.NONE=0]="NONE",e[e.SIGNED=1]="SIGNED",e[e.UNSIGNED=2]="UNSIGNED",e[e.INTEGER=4]="INTEGER",e[e.FLOAT=8]="FLOAT",e[e.POINTER=16]="POINTER",e[e.SHORT=32]="SHORT",e[e.LONG=64]="LONG",e[e.VALUE=128]="VALUE",e[e.REFERENCE=256]="REFERENCE",e[e.NULLABLE=512]="NULLABLE",e[e.VECTOR=1024]="VECTOR"}(t.TypeFlags||(t.TypeFlags={}));var a=new Uint8Array(16),s=function(){function e(e,t,r){this.cachedNullableType=null,this.kind=e,this.flags=t,this.size=r,this.byteSize=ceil(r/8),this.classReference=null,this.signatureReference=null,this.nonNullableType=this}return Object.defineProperty(e.prototype,"intType",{get:function(){switch(this.kind){case 0:return e.i8;case 1:return e.i16;case 11:case 2:return e.i32;case 12:case 3:return e.i64;case 4:return 64==this.size?e.isize64:e.isize32;case 5:return e.u8;case 6:return e.u16;case 7:return e.u32;case 8:return e.u64;case 9:return 64==this.size?e.usize64:e.usize32;case 10:default:return e.i32}},enumerable:!0,configurable:!0}),e.prototype.isManaged=function(e){if(e.hasGC){var t=this.classReference;return null!==t&&!t.hasDecorator(n.DecoratorFlags.UNMANAGED)}return!1},e.prototype.computeSmallIntegerShift=function(e){return e.size-this.size},e.prototype.computeSmallIntegerMask=function(e){var t=this.is(2)?this.size:this.size-1;return-1>>>e.size-t},e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.asClass=function(t){assert(9==this.kind&&!this.classReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.classReference=t,r},e.prototype.asFunction=function(t){assert(7==this.kind&&!this.signatureReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.signatureReference=t,r},e.prototype.asNullable=function(){return assert(this.is(256)),this.cachedNullableType||(assert(!this.is(512)),this.cachedNullableType=new e(this.kind,512|this.flags,this.size),this.cachedNullableType.nonNullableType=this,this.cachedNullableType.classReference=this.classReference,this.cachedNullableType.signatureReference=this.signatureReference),this.cachedNullableType},e.prototype.isAssignableTo=function(t,r){var n,i,a,s;if(void 0===r&&(r=!1),this.is(256)){if(t.is(256)&&(!this.is(512)||t.is(512)))if(n=this.classReference){if(i=t.classReference)return n.isAssignableTo(i)}else if((a=this.signatureReference)&&(s=t.signatureReference))return a.isAssignableTo(s)}else if(!t.is(256))if(this.is(4))if(t.is(4)){if(!r||this==e.bool||this.is(1)==t.is(1))return this.size<=t.size}else{if(11==t.kind)return this.size<=23;if(12==t.kind)return this.size<=52}else if(this.is(8)){if(t.is(8))return this.size<=t.size}else if(this.is(1024)&&t.is(1024))return this.size==t.size;return!1},e.commonCompatible=function(e,t,r){return t.isAssignableTo(e,r)?e:e.isAssignableTo(t,r)?t:null},e.prototype.toString=function(e){if(void 0===e&&(e=!1),!e&&this.is(256)){var t=this.classReference;if(t)return this.is(512)?t.toString()+" | null":t.toString();var r=this.signatureReference;if(r)return this.is(512)?"("+r.toString(!0)+") | null":r.toString(!0);assert(!1)}switch(this.kind){case 0:return"i8";case 1:return"i16";case 2:return"i32";case 3:return"i64";case 4:return"isize";case 5:return"u8";case 6:return"u16";case 7:return"u32";case 8:return"u64";case 9:return"usize";case 10:return"bool";case 11:return"f32";case 12:return"f64";case 13:return"v128";default:assert(!1);case 14:return"void"}},e.prototype.toNativeType=function(){switch(this.kind){default:return i.NativeType.I32;case 3:case 8:return i.NativeType.I64;case 4:case 9:return 64==this.size?i.NativeType.I64:i.NativeType.I32;case 11:return i.NativeType.F32;case 12:return i.NativeType.F64;case 13:return i.NativeType.V128;case 14:return i.NativeType.None}},e.prototype.toNativeZero=function(e){switch(this.kind){case 14:assert(!1);default:return e.createI32(0);case 4:case 9:if(64!=this.size)return e.createI32(0);case 3:case 8:return e.createI64(0);case 11:return e.createF32(0);case 12:return e.createF64(0);case 13:return e.createV128(a)}},e.prototype.toNativeOne=function(e){switch(this.kind){case 13:case 14:assert(!1);default:return e.createI32(1);case 4:case 9:if(64!=this.size)return e.createI32(1);case 3:case 8:return e.createI64(1);case 11:return e.createF32(1);case 12:return e.createF64(1)}},e.prototype.toNativeNegOne=function(e){switch(this.kind){case 13:case 14:assert(!1);default:return e.createI32(-1);case 4:case 9:if(64!=this.size)return e.createI32(-1);case 3:case 8:return e.createI64(-1,-1);case 11:return e.createF32(-1);case 12:return e.createF64(-1)}},e.prototype.toSignatureString=function(){switch(this.kind){default:return"i";case 3:case 8:return"I";case 4:case 9:return 64==this.size?"I":"i";case 11:return"f";case 12:return"F";case 13:return"v";case 14:return"_"}},e.i8=new e(0,165,8),e.i16=new e(1,165,16),e.i32=new e(2,133,32),e.i64=new e(3,197,64),e.isize32=new e(4,149,32),e.isize64=new e(4,213,64),e.u8=new e(5,166,8),e.u16=new e(6,166,16),e.u32=new e(7,134,32),e.u64=new e(8,198,64),e.usize32=new e(9,150,32),e.usize64=new e(9,214,64),e.bool=new e(10,166,1),e.f32=new e(11,137,32),e.f64=new e(12,201,64),e.v128=new e(13,1152,128),e.void=new e(14,0,0),e}();t.Type=s,t.typesToNativeTypes=function(e){for(var t=e.length,r=new Array(t),n=0;ne?t[e]:l(e)},e.prototype.isAssignableTo=function(e){var t=this.thisType,r=e.thisType;if(t){if(!r||!t.isAssignableTo(r))return!1}else if(r)return!1;if(this.hasRest!=e.hasRest)return!1;var n=this.parameterTypes,i=e.parameterTypes,a=n.length;if(a!=i.length)return!1;for(var s=0;s=c&&u!=p?t.push("?: "):t.push(": "),t.push(i[u].toString());return t.push(") => "),t.push(this.returnType.toString()),t.join("")},e}();t.Signature=o;var c=null;function l(e){c||(c=[]);for(var t=c.length;t<=e;++t)c.push("arg$"+t.toString(10));return c[e-1]}t.getDefaultParameterName=l},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o,c=r(23),l=r(2),p=r(3),u=r(1),h=r(5),_=r(6),d=r(4),y=r(7),m=r(0);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(o=t.Target||(t.Target={}));var g=function(){function e(){this.target=o.WASM32,this.noTreeShaking=!1,this.noAssert=!1,this.importMemory=!1,this.importTable=!1,this.sourceMap=!1,this.memoryBase=0,this.globalAliases=null,this.features=0,this.optimizeLevelHint=0,this.shrinkLevelHint=0}return Object.defineProperty(e.prototype,"isWasm64",{get:function(){return this.target==o.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==o.WASM64?y.Type.usize64:y.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==o.WASM64?y.Type.isize64:y.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==o.WASM64?p.NativeType.I64:p.NativeType.I32},enumerable:!0,configurable:!0}),e.prototype.hasFeature=function(e){return 0!=(this.features&e)},e}();t.Options=g,function(e){e[e.NONE=0]="NONE",e[e.SIGN_EXTENSION=1]="SIGN_EXTENSION",e[e.MUTABLE_GLOBAL=2]="MUTABLE_GLOBAL",e[e.BULK_MEMORY=4]="BULK_MEMORY",e[e.SIMD=8]="SIMD",e[e.THREADS=16]="THREADS"}(t.Feature||(t.Feature={})),function(e){e[e.NONE=0]="NONE",e[e.IMPLICIT=1]="IMPLICIT",e[e.EXPLICIT=2]="EXPLICIT"}(t.ConversionKind||(t.ConversionKind={})),function(e){e[e.NONE=0]="NONE",e[e.WRAP=1]="WRAP"}(t.WrapMode||(t.WrapMode={}));var T,E,f=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,t.diagnostics)||this;return n.currentInlineFunctions=[],n.currentEnum=null,n.currentType=y.Type.void,n.memorySegments=[],n.stringSegments=new Map,n.functionTable=["null"],n.argcVar=0,n.argcSet=0,n.needsIterateRoots=!1,n.f32ModInstance=null,n.f64ModInstance=null,n.f32PowInstance=null,n.f64PowInstance=null,n.program=t,n.resolver=t.resolver,r||(r=new g),n.options=r,n.memoryOffset=i64_new(max(r.memoryBase,8)),n.module=p.Module.create(),n}return i(t,e),t.compile=function(e,r){return void 0===r&&(r=null),new t(e,r).compile()},t.prototype.compile=function(){var e,t,r=this.options,n=this.module,i=this.program;i.initialize(r);var o=new h.Function(i.startFunction,"start",new y.Signature([],y.Type.void));this.startFunctionInstance=o;var l=new Array;this.startFunctionBody=l,this.currentFlow=o.flow,r.isWasm64?n.addGlobal("HEAP_BASE",p.NativeType.I64,!0,n.createI64(0,0)):n.addGlobal("HEAP_BASE",p.NativeType.I32,!1,n.createI32(0));for(var u=i.sources,_=0,d=u.length;_"),!1;e.type=this.currentType,e.set(u.CommonFlags.RESOLVED)}else assert(!1);if(e.is(u.CommonFlags.AMBIENT)&&e.hasDecorator(h.DecoratorFlags.BUILTIN))return!0;var a=e.type.toNativeType(),s=e.is(u.CommonFlags.CONST)||e.is(u.CommonFlags.STATIC|u.CommonFlags.READONLY);if(e.is(u.CommonFlags.AMBIENT))return s||this.options.hasFeature(2)?(e.set(u.CommonFlags.MODULE_IMPORT),r?I(e,r):(T="env",E=e.simpleName),t.addGlobalImport(e.internalName,T,E,a),e.set(u.CommonFlags.COMPILED),!0):(this.error(l.DiagnosticCode.Operation_not_supported,assert(r).range),!1);var o=!1;if(null!==r&&null!==r.initializer){if(n||(n=this.compileExpression(r.initializer,e.type,1,1)),p.getExpressionId(n)!=p.ExpressionId.Const&&(s?(n=t.precomputeExpression(n),p.getExpressionId(n)!=p.ExpressionId.Const&&(this.warning(l.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,r.range),o=!0)):o=!0),e.hasDecorator(h.DecoratorFlags.INLINE)&&!o){switch(assert(p.getExpressionId(n)==p.ExpressionId.Const),p.getExpressionType(n)){case p.NativeType.I32:e.constantValueKind=1,e.constantIntegerValue=i64_new(p.getConstValueI32(n),0);break;case p.NativeType.I64:e.constantValueKind=1,e.constantIntegerValue=i64_new(p.getConstValueI64Low(n),p.getConstValueI64High(n));break;case p.NativeType.F32:e.constantValueKind=2,e.constantFloatValue=p.getConstValueF32(n);break;case p.NativeType.F64:e.constantValueKind=2,e.constantFloatValue=p.getConstValueF64(n);break;default:return assert(!1),!1}e.set(u.CommonFlags.INLINED)}}else n=e.type.toNativeZero(t);var c=e.internalName;return o?(t.addGlobal(c,a,!0,e.type.toNativeZero(t)),this.startFunctionBody.push(t.createSetGlobal(c,n))):t.addGlobal(c,a,!s,n),!0},t.prototype.compileEnumDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==h.ElementKind.ENUM),this.compileEnum(t)?t:null},t.prototype.compileEnum=function(e){var t,r;if(e.is(u.CommonFlags.COMPILED))return!0;e.set(u.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var i=null,s=!1;if(e.members)try{for(var o=a(e.members.values()),c=o.next();!c.done;c=o.next()){var _=c.value;if(_.kind==h.ElementKind.ENUMVALUE){var d=!1,m=_,g=m.declaration;m.set(u.CommonFlags.COMPILED);var T=void 0;g.value?(T=this.compileExpression(g.value,y.Type.i32,1,0),p.getExpressionId(T)!=p.ExpressionId.Const&&(e.is(u.CommonFlags.CONST)?(T=n.precomputeExpression(T),p.getExpressionId(T)!=p.ExpressionId.Const&&(this.error(l.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,g.value.range),d=!0)):d=!0)):null==i?T=n.createI32(0):(s&&this.error(l.DiagnosticCode.Enum_member_must_have_initializer,g.range),T=n.createBinary(p.BinaryOp.AddI32,n.createGetGlobal(i.internalName,p.NativeType.I32),n.createI32(1)),T=n.precomputeExpression(T),p.getExpressionId(T)!=p.ExpressionId.Const&&(e.is(u.CommonFlags.CONST)&&this.error(l.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,g.range),d=!0)),d?(n.addGlobal(m.internalName,p.NativeType.I32,!0,n.createI32(0)),this.startFunctionBody.push(n.createSetGlobal(m.internalName,T)),s=!0):(n.addGlobal(m.internalName,p.NativeType.I32,!e.is(u.CommonFlags.CONST),T),s=!1),i=m}}}catch(e){t={error:e}}finally{try{c&&!c.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}return this.currentEnum=null,!0},t.prototype.compileFunctionDeclaration=function(e,t){var r=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(r.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.compileFunctionUsingTypeArguments(r,t,m.makeMap(),null,r.declaration.name)},t.prototype.compileFunctionUsingTypeArguments=function(e,t,r,n,i){var a=this.resolver.resolveFunctionInclTypeArguments(e,t,r,i);return a?(a.outerScope=n,this.compileFunction(a)?a:null):null},t.prototype.ensureFunctionType=function(e,t,r){void 0===r&&(r=null);var n,i=e?e.length:0,a=0;if(r?((n=new Array(1+i))[0]=r.toNativeType(),a=1):n=new Array(i),e)for(var s=0;s=0)return e.functionTableIndex;var t=this.functionTable,r=t.length;return!e.is(u.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters=0?"case"+u.toString(10):"break")+"|"+a);var d=t.createBlock("case0|"+a,c,p.NativeType.None),m=!0,g=!0,T=!0,E=!0;for(h=0;h=0&&(m&&i.set(1),g&&i.set(2),T&&i.set(4),E&&i.set(32)),d},t.prototype.compileThrowStatement=function(e){var t=this.currentFlow;return t.set(4),t.set(1),c.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileVariableStatement=function(e,t){void 0===t&&(t=!1);var r=this.program,n=e.declarations,i=n.length,a=this.currentFlow;if(t||a.parentFunction==this.startFunctionInstance&&e.parent&&e.parent.kind==d.NodeKind.SOURCE){for(var s=0;s");continue}g=this.currentType}var E=!1;if(_.is(u.CommonFlags.CONST))if(T)if(T=this.module.precomputeExpression(T),p.getExpressionId(T)==p.ExpressionId.Const){var f=new h.Local(r,m,-1,g);switch(p.getExpressionType(T)){case p.NativeType.I32:f=f.withConstantIntegerValue(i64_new(p.getConstValueI32(T),0));break;case p.NativeType.I64:f=f.withConstantIntegerValue(i64_new(p.getConstValueI64Low(T),p.getConstValueI64High(T)));break;case p.NativeType.F32:f=f.withConstantFloatValue(p.getConstValueF32(T));break;case p.NativeType.F64:f=f.withConstantFloatValue(p.getConstValueF64(T));break;default:return assert(!1),this.module.createUnreachable()}var I=a.scopedLocals;if(I){if(I.has(m))return this.error(l.DiagnosticCode.Duplicate_identifier_0,_.name.range,m),this.module.createUnreachable()}else a.scopedLocals=I=new Map;I.set(m,f),E=!0}else this.warning(l.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,_.range);else this.error(l.DiagnosticCode._const_declarations_must_be_initialized,_.range);if(!E){f=void 0;if(_.isAny(u.CommonFlags.LET|u.CommonFlags.CONST)||a.is(4096))f=a.addScopedLocal(m,g,!1,_.name);else{if(a.lookupLocal(m)){this.error(l.DiagnosticCode.Duplicate_identifier_0,_.name.range,m);continue}f=a.parentFunction.addLocal(g,m,_)}T?(o.push(this.compileAssignmentWithValue(_.name,T)),f.type.is(36)&&a.setLocalWrapped(f.index,!a.canOverflow(T,g))):f.type.is(36)&&a.setLocalWrapped(f.index,!0)}}return o.length?1==o.length?o[0]:this.module.createBlock(null,o,p.NativeType.None):0},t.prototype.compileVoidStatement=function(e){return this.compileExpression(e.expression,y.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.currentFlow,n=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,y.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||r.actualFunction.isAny(u.CommonFlags.GENERIC|u.CommonFlags.GENERIC_CONTEXT)){var i=t.precomputeExpression(n);if(p.getExpressionId(i)==p.ExpressionId.Const&&p.getExpressionType(i)==p.NativeType.I32){if(!p.getConstValueI32(i))return t.createNop()}else n=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,y.Type.bool,0),this.currentType)}var a=r.pushBreakLabel(),s=r.fork();this.currentFlow=s;var o="break|"+a;s.breakLabel=o;var c="continue|"+a;s.continueLabel=c;var l=this.compileStatement(e.statement),h=s.isAny(29);return s.freeScopedLocals(),r.popBreakLabel(),this.currentFlow=r,s.unset(1560),r.inheritConditional(s),t.createBlock(o,[t.createLoop(c,t.createIf(n,h?l:t.createBlock(null,[l,t.createBreak(c)],p.NativeType.None)))])},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(u.CommonFlags.INLINED));var n=e.type;switch(!r&&n.is(4)&&t.is(4)&&n.size>i:0);case 5:case 6:case 10:var a=e.type.computeSmallIntegerMask(y.Type.i32);return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue)&a:0);case 2:case 7:return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 4:case 9:if(!e.program.options.isWasm64)return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 3:case 8:return 1==e.constantValueKind?this.module.createI64(i64_low(e.constantIntegerValue),i64_high(e.constantIntegerValue)):this.module.createI64(0);case 12:if(!e.hasDecorator(h.DecoratorFlags.BUILTIN)||t!=y.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=y.Type.f32;case 11:return this.module.createF32(e.constantFloatValue);default:return assert(!1),this.module.createUnreachable()}},t.prototype.compileExpression=function(e,t,r,n){var i;switch(this.currentType=t,e.kind){case d.NodeKind.ASSERTION:i=this.compileAssertionExpression(e,t);break;case d.NodeKind.BINARY:i=this.compileBinaryExpression(e,t);break;case d.NodeKind.CALL:i=this.compileCallExpression(e,t);break;case d.NodeKind.COMMA:i=this.compileCommaExpression(e,t);break;case d.NodeKind.ELEMENTACCESS:i=this.compileElementAccessExpression(e,t);break;case d.NodeKind.FUNCTION:i=this.compileFunctionExpression(e,t);break;case d.NodeKind.IDENTIFIER:case d.NodeKind.FALSE:case d.NodeKind.NULL:case d.NodeKind.THIS:case d.NodeKind.SUPER:case d.NodeKind.TRUE:i=this.compileIdentifierExpression(e,t,0==r);break;case d.NodeKind.INSTANCEOF:i=this.compileInstanceOfExpression(e,t);break;case d.NodeKind.LITERAL:i=this.compileLiteralExpression(e,t);break;case d.NodeKind.NEW:i=this.compileNewExpression(e,t);break;case d.NodeKind.PARENTHESIZED:i=this.compileParenthesizedExpression(e,t);break;case d.NodeKind.PROPERTYACCESS:i=this.compilePropertyAccessExpression(e,t,0==r);break;case d.NodeKind.TERNARY:i=this.compileTernaryExpression(e,t);break;case d.NodeKind.UNARYPOSTFIX:i=this.compileUnaryPostfixExpression(e,t);break;case d.NodeKind.UNARYPREFIX:i=this.compileUnaryPrefixExpression(e,t);break;default:this.error(l.DiagnosticCode.Operation_not_supported,e.range),i=this.module.createUnreachable()}var a=this.currentType;return 0!=r&&a!=t?(i=this.convertExpression(i,a,t,r,n,e),this.currentType=t):1==n&&(i=this.ensureSmallIntegerWrap(i,a)),this.options.sourceMap&&this.addDebugLocation(i,e.range),i},t.prototype.compileExpressionRetainType=function(e,t,r){return this.compileExpression(e,t==y.Type.void?y.Type.i32:t,0,r)},t.prototype.precomputeExpression=function(e,t,r,n){return this.module.precomputeExpression(this.compileExpression(e,t,r,n))},t.prototype.convertExpression=function(e,t,r,n,i,a){assert(0!=n);var s=this.module;return 14==t.kind?(assert(14!=r.kind),this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,a.range,t.toString(),r.toString()),s.createUnreachable()):14==r.kind?s.createDrop(e):(t.isAssignableTo(r)||1==n&&this.error(l.DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,a.range,t.toString(),r.toString()),t.is(8)?r.is(8)?11==t.kind?12==r.kind&&(e=s.createUnary(p.UnaryOp.PromoteF32,e)):11==r.kind&&(e=s.createUnary(p.UnaryOp.DemoteF64,e)):r.is(4)?11==t.kind?r==y.Type.bool?(e=s.createBinary(p.BinaryOp.NeF32,e,s.createF32(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(p.UnaryOp.TruncF32ToI64,e):s.createUnary(p.UnaryOp.TruncF32ToI32,e):r.is(64)?s.createUnary(p.UnaryOp.TruncF32ToU64,e):s.createUnary(p.UnaryOp.TruncF32ToU32,e):r==y.Type.bool?(e=s.createBinary(p.BinaryOp.NeF64,e,s.createF64(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(p.UnaryOp.TruncF64ToI64,e):s.createUnary(p.UnaryOp.TruncF64ToI32,e):r.is(64)?s.createUnary(p.UnaryOp.TruncF64ToU64,e):s.createUnary(p.UnaryOp.TruncF64ToU32,e):(assert(0==r.flags,"void type expected"),e=s.createDrop(e)):t.is(4)&&r.is(8)?e=11==r.kind?t.is(64)?s.createUnary(t.is(1)?p.UnaryOp.ConvertI64ToF32:p.UnaryOp.ConvertU64ToF32,e):s.createUnary(t.is(1)?p.UnaryOp.ConvertI32ToF32:p.UnaryOp.ConvertU32ToF32,e):t.is(64)?s.createUnary(t.is(1)?p.UnaryOp.ConvertI64ToF64:p.UnaryOp.ConvertU64ToF64,e):s.createUnary(t.is(1)?p.UnaryOp.ConvertI32ToF64:p.UnaryOp.ConvertU32ToF64,e):t.is(64)?r==y.Type.bool?(e=s.createBinary(p.BinaryOp.NeI64,e,s.createI64(0)),i=0):r.is(64)||(e=s.createUnary(p.UnaryOp.WrapI64,e)):r.is(64)?(e=s.createUnary(t.is(1)?p.UnaryOp.ExtendI32:p.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d),s.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.GtI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GtI64:p.BinaryOp.GtI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.GtU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GtU64:p.BinaryOp.GtU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.GtU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.GtF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.GtF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=y.Type.bool;break;case _.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.LE)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!0)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d),s.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.LeI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.LeI64:p.BinaryOp.LeI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.LeU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.LeU64:p.BinaryOp.LeU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.LeU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.LeF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.LeF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=y.Type.bool;break;case _.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.GE)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!0)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d),s.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.GeI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GeI64:p.BinaryOp.GeI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.GeU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GeU64:p.BinaryOp.GeU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.GeU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.GeF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.GeF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=y.Type.bool;break;case _.Token.EQUALS_EQUALS_EQUALS:case _.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,g==_.Token.EQUALS_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.EQ)){o=this.compileBinaryOverload(v,u,r,d,e);break}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,_.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.EqI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.EqI64:p.BinaryOp.EqI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.EqI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.EqF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.EqF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=y.Type.bool;break;case _.Token.EXCLAMATION_EQUALS_EQUALS:case _.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,g==_.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.NE)){o=this.compileBinaryOverload(v,u,r,d,e);break}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,_.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.NeI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.NeI64:p.BinaryOp.NeI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.NeI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.NeF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.NeF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=y.Type.bool;break;case _.Token.EQUALS:return this.compileAssignment(u,d,t);case _.Token.PLUS_EQUALS:m=!0;case _.Token.PLUS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.ADD)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0);else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.AddI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.AddI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.AddF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.AddF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case _.Token.MINUS_EQUALS:m=!0;case _.Token.MINUS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.SUB)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.SubI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.SubI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.SubF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.SubF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case _.Token.ASTERISK_EQUALS:m=!0;case _.Token.ASTERISK:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.MUL)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1);else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.MulI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.MulI64:p.BinaryOp.MulI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.MulI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.MulF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.MulF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case _.Token.ASTERISK_ASTERISK_EQUALS:m=!0;case _.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.POW)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}var T=void 0;if(11==this.currentType.kind){if(i=this.compileExpression(d,y.Type.f32,1,0),a=this.currentType,!(T=this.f32PowInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=c.createUnreachable();break}if(!(f=E.members?E.members.get("pow"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),o=c.createUnreachable();break}assert(f.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=T=this.resolver.resolveFunction(f,null)}}else if(r=this.convertExpression(r,this.currentType,y.Type.f64,1,0,u),n=this.currentType,i=this.compileExpression(d,y.Type.f64,1,0),a=this.currentType,!(T=this.f64PowInstance)){if(!(E=this.program.elementsLookup.get("Math"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=c.createUnreachable();break}if(!(f=E.members?E.members.get("pow"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),o=c.createUnreachable();break}assert(f.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=T=this.resolver.resolveFunction(f,null)}o=T&&this.compileFunction(T)?this.makeCallDirect(T,[r,i]):c.createUnreachable();break;case _.Token.SLASH_EQUALS:m=!0;case _.Token.SLASH:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.DIV)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d)}switch(this.currentType.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.DivI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.DivI64:p.BinaryOp.DivI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.DivU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.DivU64:p.BinaryOp.DivU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.DivU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.DivF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.DivF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case _.Token.PERCENT_EQUALS:m=!0;case _.Token.PERCENT:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.REM)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d)}switch(this.currentType.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.RemI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.RemI64:p.BinaryOp.RemI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.RemU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.RemU64:p.BinaryOp.RemU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.RemU64,r,i);break;case 11:if(!(T=this.f32ModInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=c.createUnreachable();break}if(!(f=E.members?E.members.get("mod"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),o=c.createUnreachable();break}assert(f.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=T=this.resolver.resolveFunction(f,null)}o=T&&this.compileFunction(T)?this.makeCallDirect(T,[r,i]):c.createUnreachable();break;case 12:if(!(T=this.f64ModInstance)){var E,f;if(!(E=this.program.elementsLookup.get("Math"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=c.createUnreachable();break}if(!(f=E.members?E.members.get("mod"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),o=c.createUnreachable();break}assert(f.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=T=this.resolver.resolveFunction(f,null)}o=T&&this.compileFunction(T)?this.makeCallDirect(T,[r,i]):c.createUnreachable();break;default:assert(!1),o=c.createUnreachable()}break;case _.Token.LESSTHAN_LESSTHAN_EQUALS:m=!0;case _.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_SHL)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(d,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.ShlI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.ShlI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShlI64:p.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,_.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case _.Token.GREATERTHAN_GREATERTHAN_EQUALS:m=!0;case _.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_SHR)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.ShrI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.ShrI64,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrI64:p.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.ShrU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.ShrU64,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrU64:p.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,_.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case _.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:m=!0;case _.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_SHR_U)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:o=c.createBinary(p.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:o=c.createBinary(p.BinaryOp.ShrU32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.ShrU64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrU64:p.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,_.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case _.Token.AMPERSAND_EQUALS:m=!0;case _.Token.AMPERSAND:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_AND)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.AndI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.AndI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.AndI64:p.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,_.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case _.Token.BAR_EQUALS:m=!0;case _.Token.BAR:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_OR)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=c.createBinary(p.BinaryOp.OrI32,r,i);break;case 2:case 7:o=c.createBinary(p.BinaryOp.OrI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.OrI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.OrI64:p.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,_.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case _.Token.CARET_EQUALS:m=!0;case _.Token.CARET:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){var I,v;if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_XOR)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=c.createBinary(p.BinaryOp.XorI32,r,i);break;case 2:case 7:o=c.createBinary(p.BinaryOp.XorI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.XorI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.XorI64:p.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,_.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case _.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,i=this.compileExpression(d,n,1,0),a=this.currentType,o=c.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),o=c.createIf(this.makeIsTrueish(r,this.currentType),i,o);else{var A=(C=this.currentFlow).getAndFreeTempLocal(this.currentType,!C.canOverflow(r,this.currentType));o=c.createIf(this.makeIsTrueish(c.createTeeLocal(A.index,r),this.currentType),i,c.createGetLocal(assert(A).index,this.currentType.toNativeType()))}break;case _.Token.BAR_BAR:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,i=this.compileExpression(d,n,1,0),a=this.currentType,o=this.module.cloneExpression(r,!0,0))o=this.module.createIf(this.makeIsTrueish(r,this.currentType),o,i);else{var C;A=(C=this.currentFlow).getAndFreeTempLocal(this.currentType,!C.canOverflow(r,this.currentType));o=c.createIf(this.makeIsTrueish(c.createTeeLocal(A.index,r),this.currentType),c.createGetLocal(assert(A).index,this.currentType.toNativeType()),i)}break;default:assert(!1),o=this.module.createUnreachable()}return m?this.compileAssignmentWithValue(u,o,t!=y.Type.void):o},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(u.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a)},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,s=0;if(e.is(u.CommonFlags.INSTANCE)){var o=assert(e.parent);assert(o.kind==h.ElementKind.CLASS),s=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,s)},t.prototype.compileAssignment=function(e,t,r){var n,i=this.program.resolver,a=this.currentFlow,s=i.resolveExpression(e,a);if(!s)return this.module.createUnreachable();switch(s.kind){case h.ElementKind.GLOBAL:if(!this.compileGlobal(s))return this.module.createUnreachable();assert(s.type!=y.Type.void);case h.ElementKind.LOCAL:case h.ElementKind.FIELD:n=s.type;break;case h.ElementKind.PROPERTY:var o=s.setterPrototype;if(o){var c=this.resolver.resolveFunction(o,null);if(!c)return this.module.createUnreachable();assert(1==c.signature.parameterTypes.length),n=c.signature.parameterTypes[0];break}return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,s.internalName),this.module.createUnreachable();case h.ElementKind.CLASS:if(i.currentElementExpression){var p=a.is(8192),u=s.lookupOverload(h.OperatorKind.INDEXED_SET,p);if(!u)return s.lookupOverload(h.OperatorKind.INDEXED_GET,p)?this.error(l.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,s.internalName):this.error(l.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,s.internalName),this.module.createUnreachable();assert(2==u.signature.parameterTypes.length),n=u.signature.parameterTypes[1];break}default:return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=y.Type.void);var _=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,_,r!=y.Type.void)},t.prototype.compileAssignmentWithValue=function(e,t,r){void 0===r&&(r=!1);var n=this.module,i=this.currentFlow,a=this.resolver.resolveExpression(e,i);if(!a)return n.createUnreachable();switch(a.kind){case h.ElementKind.LOCAL:var s=a.type;return assert(s!=y.Type.void),this.currentType=r?s:y.Type.void,a.is(u.CommonFlags.CONST)?(this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable()):(s.is(36)&&i.setLocalWrapped(a.index,!i.canOverflow(t,s)),r?n.createTeeLocal(a.index,t):n.createSetLocal(a.index,t));case h.ElementKind.GLOBAL:if(!this.compileGlobal(a))return n.createUnreachable();s=a.type;if(assert(s!=y.Type.void),this.currentType=r?s:y.Type.void,a.is(u.CommonFlags.CONST))return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();if(t=this.ensureSmallIntegerWrap(t,s),r){var o=s.toNativeType(),c=a.internalName;return n.createBlock(null,[n.createSetGlobal(c,t),n.createGetGlobal(c,o)],o)}return n.createSetGlobal(a.internalName,t);case h.ElementKind.FIELD:var p=a.declaration;if(a.is(u.CommonFlags.READONLY)&&!i.actualFunction.is(u.CommonFlags.CONSTRUCTOR)&&null!=p&&null==p.initializer)return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();var _=assert(this.resolver.currentThisExpression),d=this.compileExpressionRetainType(_,this.options.usizeType,0);s=a.type;this.currentType=r?s:y.Type.void;o=s.toNativeType();if(10==s.kind&&(t=this.ensureSmallIntegerWrap(t,s)),r){var m=this.currentFlow,g=m.getAndFreeTempLocal(s,!m.canOverflow(t,s)).index;return n.createBlock(null,[n.createSetLocal(g,t),n.createStore(s.byteSize,d,n.createGetLocal(g,o),o,a.memoryOffset),n.createGetLocal(g,o)],o)}return n.createStore(s.byteSize,d,t,o,a.memoryOffset);case h.ElementKind.PROPERTY:var T=a.setterPrototype;if(T){var E=this.resolver.resolveFunction(T,null);if(!E)return n.createUnreachable();if(!r){if(E.is(u.CommonFlags.INSTANCE)){_=assert(this.resolver.currentThisExpression),d=this.compileExpressionRetainType(_,this.options.usizeType,0);return this.makeCallDirect(E,[d,t])}return this.makeCallDirect(E,[t])}var f=a.getterPrototype;assert(null!=f);var I=this.resolver.resolveFunction(f,null);if(!I)return n.createUnreachable();var v=(k=I.signature.returnType).toNativeType();if(E.is(u.CommonFlags.INSTANCE)){_=assert(this.resolver.currentThisExpression),d=this.compileExpressionRetainType(_,this.options.usizeType,0),g=i.getAndFreeTempLocal(k,!1).index;return n.createBlock(null,[this.makeCallDirect(E,[n.createTeeLocal(g,d),t]),this.makeCallDirect(I,[n.createGetLocal(g,v)])],v)}return n.createBlock(null,[this.makeCallDirect(E,[t]),this.makeCallDirect(I)],v)}return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();case h.ElementKind.CLASS:var A=this.resolver.currentElementExpression;if(A){var C=i.is(8192),S=a.lookupOverload(h.OperatorKind.INDEXED_GET,C);if(!S)return this.error(l.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,a.internalName),n.createUnreachable();var N=a.lookupOverload(h.OperatorKind.INDEXED_SET,C);if(!N)return this.error(l.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,a.internalName),this.currentType=r?S.signature.returnType:y.Type.void,n.createUnreachable();var O=a.type,x=(_=assert(this.resolver.currentThisExpression),d=this.compileExpressionRetainType(_,this.options.usizeType,0),this.compileExpression(A,y.Type.i32,1,0));if(r){var b=i.getTempLocal(O,!1),L=i.getAndFreeTempLocal(this.currentType,!1),k=S.signature.returnType;return i.freeTempLocal(b),n.createBlock(null,[this.makeCallDirect(N,[n.createTeeLocal(b.index,d),n.createTeeLocal(L.index,x),t]),this.makeCallDirect(S,[n.createGetLocal(b.index,b.type.toNativeType()),n.createGetLocal(L.index,L.type.toNativeType())])],k.toNativeType())}return this.makeCallDirect(N,[d,x,t])}}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileCallExpression=function(e,t){var r=this.module,n=this.currentFlow;if(e.expression.kind==d.NodeKind.SUPER){var i=this.currentFlow,a=i.actualFunction;if(!a.is(u.CommonFlags.CONSTRUCTOR))return this.error(l.DiagnosticCode.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors,e.range),r.createUnreachable();var s=assert(a.parent);assert(s.kind==h.ElementKind.CLASS);var o=assert(s.base),c=assert(i.lookupLocal("this")),_=this.options.nativeSizeType,g=[r.createSetLocal(c.index,this.compileCallDirect(this.ensureConstructor(o,e),e.arguments,e,r.createIf(r.createGetLocal(c.index,_),r.createGetLocal(c.index,_),this.makeAllocation(s))))];return this.makeFieldInitialization(s,g),i.isAny(2080)?(this.error(l.DiagnosticCode._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class,e.range),r.createUnreachable()):(i.set(96),this.currentType=y.Type.void,r.createBlock(null,g))}var T,E,f=this.resolver.resolveExpression(e.expression,n);if(!f)return r.createUnreachable();switch(f.kind){case h.ElementKind.FUNCTION_PROTOTYPE:var I=f,v=e.typeArguments;if(I.hasDecorator(h.DecoratorFlags.BUILTIN))return this.compileCallExpressionBuiltin(I,e,t);var A=null;if(v){if(!I.is(u.CommonFlags.GENERIC))return this.error(l.DiagnosticCode.Type_0_is_not_generic,e.expression.range,I.internalName),r.createUnreachable();A=this.resolver.resolveFunctionInclTypeArguments(I,v,m.makeMap(n.contextualTypeArguments),e)}else{if(I.is(u.CommonFlags.GENERIC)){for(var C=new Map,S=assert(I.declaration.typeParameters),N=S.length,O=0;Os&&!i)||(this.error(l.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,s.toString(),t.toString()),!1)},t.prototype.compileCallDirect=function(e,t,r,n){void 0===n&&(n=0);var i=t.length,a=e.signature;if(!this.checkCallSignature(a,i,0!=n,r))return this.module.createUnreachable();if(e.hasDecorator(h.DecoratorFlags.INLINE)){if(assert(!e.is(u.CommonFlags.TRAMPOLINE)),!this.currentInlineFunctions.includes(e)){this.currentInlineFunctions.push(e);var s=this.compileCallInlinePrechecked(e,t,n);return this.currentInlineFunctions.pop(),s}this.warning(l.DiagnosticCode.Function_0_cannot_be_inlined_into_itself,r.range,e.internalName)}var o=n?i+1:i,c=new Array(o),p=0;n&&(c[0]=n,p=1);for(var _=a.parameterTypes,d=0;d=i);var o=this.module;if(!this.compileFunction(e))return o.createUnreachable();var c=e.signature.returnType,l=e.is(u.CommonFlags.MODULE_IMPORT);if(r=a),this.ensureFunctionType(e.parameterTypes,e.returnType,e.thisType);var c=this.module;if(n=0),this.currentType=N,this.module.createGetLocal(O,N.toNativeType());case h.ElementKind.GLOBAL:if(!this.compileGlobal(S))return this.module.createUnreachable();var x=S.type;return assert(x!=y.Type.void),S.is(u.CommonFlags.INLINED)?this.compileInlineConstant(S,t,r):(this.currentType=x,this.module.createGetGlobal(S.internalName,x.toNativeType()));case h.ElementKind.ENUMVALUE:return S.is(u.CommonFlags.COMPILED)?(this.currentType=y.Type.i32,S.is(u.CommonFlags.INLINED)?this.module.createI32(S.constantValue):this.module.createGetGlobal(S.internalName,p.NativeType.I32)):(this.error(l.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=y.Type.i32,this.module.createUnreachable());case h.ElementKind.FUNCTION_PROTOTYPE:var b=this.resolver.resolveFunction(S,null,m.makeMap(i.contextualTypeArguments));if(!b||!this.compileFunction(b))return n.createUnreachable();var L=this.ensureFunctionTableEntry(b);return this.currentType=b.signature.type,this.module.createI32(L)}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileInstanceOfExpression=function(e,t){var r=this.module,n=this.compileExpressionRetainType(e.expression,this.options.usizeType,0),i=this.currentType,a=this.resolver.resolveType(e.isType);return this.currentType=y.Type.bool,a?i.is(512)&&!a.is(512)?i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?p.BinaryOp.NeI64:p.BinaryOp.NeI32,n,i.toNativeZero(r)):r.createI32(0):r.createI32(i.isAssignableTo(a,!0)?1:0):r.createUnreachable()},t.prototype.compileLiteralExpression=function(e,t,r){void 0===r&&(r=!1);var n=this.module;switch(e.literalKind){case d.LiteralKind.ARRAY:assert(!r);var i=t.classReference;return i&&i.prototype==this.program.arrayPrototype?this.compileArrayLiteral(assert(i.typeArguments)[0],e.elementExpressions,!1,e):(this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case d.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==y.Type.f32?n.createF32(a):(this.currentType=y.Type.f64,n.createF64(a));case d.LiteralKind.INTEGER:var s=e.value;r&&(s=i64_sub(i64_new(0),s));var o=this.resolver.determineIntegerLiteralType(s,t);switch(this.currentType=o,o.kind){case 4:if(!this.options.isWasm64)return n.createI32(i64_low(s));case 3:return n.createI64(i64_low(s),i64_high(s));case 9:if(!this.options.isWasm64)return n.createI32(i64_low(s));case 8:return n.createI64(i64_low(s),i64_high(s));case 11:return n.createF32(i64_to_f32(s));case 12:return n.createF64(i64_to_f64(s));default:return n.createI32(i64_low(s))}case d.LiteralKind.STRING:return assert(!r),this.compileStringLiteral(e);case d.LiteralKind.OBJECT:return assert(!r),this.compileObjectLiteral(e,t)}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.currentType=t,n.createUnreachable()},t.prototype.ensureStaticString=function(e){var t,r=this.program,n=r.hasGC,i=r.gcHeaderSize,a=assert(r.stringInstance),s=this.stringSegments;if(s.has(e))t=s.get(e);else{var o=e.length,l=a.currentMemoryOffset+1&-2,p=l+2*o,u=void 0,h=void 0;n?(u=new Uint8Array(i+p),h=i,m.writeI32(c.ensureGCHook(this,a),u,r.gcHookOffset)):(u=new Uint8Array(p),h=0),m.writeI32(o,u,h+a.offsetof("length")),h+=l;for(var _=0;_",t.toString()),r.createUnreachable();var i=n.constructorInstance;if(i){if(i.signature.requiredParameters)return this.error(l.DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,e.range,n.toString()),r.createUnreachable();if(i.is(u.CommonFlags.PRIVATE))return this.error(l.DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable();if(i.is(u.CommonFlags.PROTECTED))return this.error(l.DiagnosticCode.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable()}var a=e.names,s=a.length,o=e.values,c=n.members,p=!1,_=new Array(s+2),d=this.currentFlow.getTempLocal(this.options.usizeType);assert(s==o.length);for(var y=0,m=s;yv)for(T=v;T=0);var _=this.compileExpressionRetainType(c,this.options.usizeType,0);return this.currentType=a.type,n.createLoad(a.type.byteSize,a.type.is(5),_,a.type.toNativeType(),a.memoryOffset);case h.ElementKind.PROPERTY:return this.compileGetter(a,e);case h.ElementKind.FUNCTION_PROTOTYPE:return this.error(l.DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,e.range,a.simpleName),n.createUnreachable()}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileGetter=function(e,t){var r=e.getterPrototype;if(r){var n=this.resolver.resolveFunction(r,null);if(!n)return this.module.createUnreachable();var i=n.signature;if(!this.checkCallSignature(i,0,n.is(u.CommonFlags.INSTANCE),t))return this.module.createUnreachable();if(n.is(u.CommonFlags.INSTANCE)){var a=assert(n.parent);assert(a.kind==h.ElementKind.CLASS);var s=assert(this.resolver.currentThisExpression),o=this.compileExpressionRetainType(s,this.options.usizeType,0);//!!! -return this.currentType=i.returnType,this.compileCallDirect(n,[],t,o)}return this.currentType=i.returnType,this.compileCallDirect(n,[],t,0)}return this.error(l.DiagnosticCode.Property_0_does_not_exist_on_type_1,t.range,e.simpleName,e.parent.toString()),this.module.createUnreachable()},t.prototype.compileTernaryExpression=function(e,t){var r=e.ifThen,n=e.ifElse,i=this.currentFlow,a=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,y.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||i.actualFunction.isAny(u.CommonFlags.GENERIC|u.CommonFlags.GENERIC_CONTEXT)){var s=this.module.precomputeExpression(a);if(p.getExpressionId(s)==p.ExpressionId.Const&&p.getExpressionType(s)==p.NativeType.I32)return p.getConstValueI32(s)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);a=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,y.Type.bool,0),this.currentType)}var o=i.fork();this.currentFlow=o;var c=this.compileExpressionRetainType(r,t,0),h=this.currentType;o.freeScopedLocals();var _=i.fork();this.currentFlow=_;var d=this.compileExpressionRetainType(n,t,0),m=this.currentType;_.freeScopedLocals(),this.currentFlow=i,i.inheritMutual(o,_);var g=y.Type.commonCompatible(h,m,!1);return g?(c=this.convertExpression(c,h,g,1,0,r),d=this.convertExpression(d,m,g,1,0,n),this.currentType=g,this.module.createIf(a,c,d)):(this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,e.range,h.toString(),m.toString()),this.currentType=t,this.module.createUnreachable())},t.prototype.compileUnaryPostfixExpression=function(e,t){var r=this.module,n=this.currentFlow,i=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t,0,0);if(p.getExpressionId(i)==p.ExpressionId.Unreachable)return i;var a,s=this.currentType,o=null;switch(t!=y.Type.void&&(o=n.getTempLocal(s,!1),i=r.createTeeLocal(o.index,i)),e.operator){case _.Token.PLUS_PLUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(p.BinaryOp.AddI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){if(u=this.currentType.classReference)if(d=u.lookupOverload(h.OperatorKind.POSTFIX_INC)){a=this.compileUnaryOverload(d,e.operand,i,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:var c=this.options;a=r.createBinary(c.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(p.BinaryOp.AddI64,i,r.createI64(1));break;case 11:a=r.createBinary(p.BinaryOp.AddF32,i,r.createF32(1));break;case 12:a=r.createBinary(p.BinaryOp.AddF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;case _.Token.MINUS_MINUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(p.BinaryOp.SubI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){var u,d;if(u=this.currentType.classReference)if(d=u.lookupOverload(h.OperatorKind.POSTFIX_DEC)){a=this.compileUnaryOverload(d,e.operand,i,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:c=this.options;a=r.createBinary(c.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(p.BinaryOp.SubI64,i,r.createI64(1));break;case 11:a=r.createBinary(p.BinaryOp.SubF32,i,r.createF32(1));break;case 12:a=r.createBinary(p.BinaryOp.SubF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;default:return assert(!1),r.createUnreachable()}if(!o)return this.currentType=y.Type.void,this.compileAssignmentWithValue(e.operand,a,!1);var m=this.compileAssignmentWithValue(e.operand,a,!1);this.currentType=o.type,n.freeTempLocal(o);var g=o.type.toNativeType();return r.createBlock(null,[m,r.createGetLocal(o.index,g)],g)},t.prototype.compileUnaryPrefixExpression=function(e,t){var r,n=this.module,i=!1;switch(e.operator){case _.Token.PLUS:if(r=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.PLUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case _.Token.MINUS:if(e.operand.kind==d.NodeKind.LITERAL&&(e.operand.literalKind==d.LiteralKind.INTEGER||e.operand.literalKind==d.LiteralKind.FLOAT)){r=this.compileLiteralExpression(e.operand,t,!0),this.options.sourceMap&&this.addDebugLocation(r,e.range);break}if(r=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.MINUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(p.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(p.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(p.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case _.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(p.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(p.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case _.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(p.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(p.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case _.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=y.Type.bool;break;case _.Token.TILDE:if(r=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t.is(8)?y.Type.i64:t,0,0),this.currentType.is(256)){var a,s;if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(r=this.convertExpression(r,this.currentType,this.currentType.intType,1,0,e.operand),this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.XorI64:p.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case _.Token.TYPEOF:return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=y.Type.void):r},t.prototype.ensureSmallIntegerWrap=function(e,t){var r=this.module,n=this.currentFlow;switch(t.kind){case 0:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(p.UnaryOp.ExtendI8ToI32,e):r.createBinary(p.BinaryOp.ShrI32,r.createBinary(p.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(p.UnaryOp.ExtendI16ToI32,e):r.createBinary(p.BinaryOp.ShrI32,r.createBinary(p.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.NeI32,e,r.createI32(0)))}return e},t.prototype.makeIsFalseish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return r.createUnary(p.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(p.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?p.UnaryOp.EqzI64:p.UnaryOp.EqzI32,e);case 11:return r.createBinary(p.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(p.BinaryOp.EqF64,e,r.createF64(0));default:return assert(!1),r.createI32(1)}},t.prototype.makeIsTrueish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return e;case 3:case 8:return r.createBinary(p.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(p.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(p.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(p.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocation=function(e){var t=this.program;assert(e.program==t);var r=this.module,n=this.options;if(t.hasGC&&e.type.isManaged(t)){var i=assert(t.gcAllocateInstance);return this.compileFunction(i)?(this.currentType=e.type,r.createCall(i.internalName,[n.isWasm64?r.createI64(e.currentMemoryOffset):r.createI32(e.currentMemoryOffset),r.createI32(c.ensureGCHook(this,e))],n.nativeSizeType)):r.createUnreachable()}return(i=t.memoryAllocateInstance)&&this.compileFunction(i)?(this.currentType=e.type,r.createCall(i.internalName,[n.isWasm64?r.createI64(e.currentMemoryOffset):r.createI32(e.currentMemoryOffset)],n.nativeSizeType)):r.createUnreachable()},t.prototype.makeFieldInitialization=function(e,t){var r,n;void 0===t&&(t=[]);var i=e.members;if(!i)return[];var s=this.module,o=this.currentFlow,c=o.is(4096),l=c?assert(o.lookupLocal("this")).index:0,p=this.options.nativeSizeType;try{for(var _=a(i.values()),d=_.next();!d.done;d=_.next()){var y=d.value;if(y.kind==h.ElementKind.FIELD&&y.parent==e){var m=y;assert(!m.isAny(u.CommonFlags.CONST));var g=m.type,T=g.toNativeType(),E=m.prototype.declaration,f=E.initializer;if(f)t.push(s.createStore(g.byteSize,s.createGetLocal(l,p),this.compileExpression(f,g,1,0),T,m.memoryOffset));else{var I=E.parameterIndex;t.push(s.createStore(g.byteSize,s.createGetLocal(l,p),I>=0?s.createGetLocal(c?assert(o.lookupLocal(m.simpleName)).index:1+I,T):g.toNativeZero(s),T,m.memoryOffset))}}}}catch(e){r={error:e}}finally{try{d&&!d.done&&(n=_.return)&&n.call(_)}finally{if(r)throw r.error}}return t},t.prototype.addDebugLocation=function(e,t){var r=this.currentFlow.parentFunction,n=t.source;n.debugInfoIndex<0&&(n.debugInfoIndex=this.module.addDebugInfoFile(n.normalizedPath)),t.debugInfoRef=e,r.debugLocations.push(t)},t}(l.DiagnosticEmitter);function I(e,t){if(T=t.range.source.simplePath,E=t.programLevelInternalName,e.hasDecorator(h.DecoratorFlags.EXTERNAL)){var r=e.program,n=assert(d.findDecorator(d.DecoratorKind.EXTERNAL,t.decorators)),i=n.arguments;if(i&&i.length){var a=i[0];a.kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(E=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(T=E,E=a.value,i.length>2&&r.error(l.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(l.DiagnosticCode.String_literal_expected,a.range))):r.error(l.DiagnosticCode.String_literal_expected,a.range)}else r.error(l.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=f},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.Operation_not_supported=100]="Operation_not_supported",e[e.Operation_is_unsafe=101]="Operation_is_unsafe",e[e.User_defined_0=102]="User_defined_0",e[e.Conversion_from_type_0_to_1_requires_an_explicit_cast=200]="Conversion_from_type_0_to_1_requires_an_explicit_cast",e[e.Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit=201]="Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit",e[e.Type_0_cannot_be_changed_to_type_1=202]="Type_0_cannot_be_changed_to_type_1",e[e.Type_0_cannot_be_reinterpreted_as_type_1=203]="Type_0_cannot_be_reinterpreted_as_type_1",e[e.Basic_type_0_cannot_be_nullable=204]="Basic_type_0_cannot_be_nullable",e[e.Cannot_export_a_mutable_global=205]="Cannot_export_a_mutable_global",e[e.Compiling_constant_with_non_constant_initializer_as_mutable=206]="Compiling_constant_with_non_constant_initializer_as_mutable",e[e.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa=207]="Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa",e[e.Unmanaged_classes_cannot_implement_interfaces=208]="Unmanaged_classes_cannot_implement_interfaces",e[e.Invalid_regular_expression_flags=209]="Invalid_regular_expression_flags",e[e.Implementation_0_must_match_the_signature_1=210]="Implementation_0_must_match_the_signature_1",e[e.Class_0_is_sealed_and_cannot_be_extended=211]="Class_0_is_sealed_and_cannot_be_extended",e[e.Decorator_0_is_not_valid_here=212]="Decorator_0_is_not_valid_here",e[e.Duplicate_decorator=213]="Duplicate_decorator",e[e.An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf=214]="An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf",e[e.Optional_parameter_must_have_an_initializer=215]="Optional_parameter_must_have_an_initializer",e[e.Constructor_of_class_0_must_not_require_any_arguments=216]="Constructor_of_class_0_must_not_require_any_arguments",e[e.Function_0_cannot_be_inlined_into_itself=217]="Function_0_cannot_be_inlined_into_itself",e[e.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set=218]="Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set",e[e.Optional_properties_are_not_supported=219]="Optional_properties_are_not_supported",e[e.Unterminated_string_literal=1002]="Unterminated_string_literal",e[e.Identifier_expected=1003]="Identifier_expected",e[e._0_expected=1005]="_0_expected",e[e.A_file_cannot_have_a_reference_to_itself=1006]="A_file_cannot_have_a_reference_to_itself",e[e.Trailing_comma_not_allowed=1009]="Trailing_comma_not_allowed",e[e.Unexpected_token=1012]="Unexpected_token",e[e.A_rest_parameter_must_be_last_in_a_parameter_list=1014]="A_rest_parameter_must_be_last_in_a_parameter_list",e[e.Parameter_cannot_have_question_mark_and_initializer=1015]="Parameter_cannot_have_question_mark_and_initializer",e[e.A_required_parameter_cannot_follow_an_optional_parameter=1016]="A_required_parameter_cannot_follow_an_optional_parameter",e[e.Statements_are_not_allowed_in_ambient_contexts=1036]="Statements_are_not_allowed_in_ambient_contexts",e[e.Initializers_are_not_allowed_in_ambient_contexts=1039]="Initializers_are_not_allowed_in_ambient_contexts",e[e._0_modifier_cannot_be_used_here=1042]="_0_modifier_cannot_be_used_here",e[e.A_rest_parameter_cannot_be_optional=1047]="A_rest_parameter_cannot_be_optional",e[e.A_rest_parameter_cannot_have_an_initializer=1048]="A_rest_parameter_cannot_have_an_initializer",e[e.A_set_accessor_must_have_exactly_one_parameter=1049]="A_set_accessor_must_have_exactly_one_parameter",e[e.A_set_accessor_parameter_cannot_have_an_initializer=1052]="A_set_accessor_parameter_cannot_have_an_initializer",e[e.A_get_accessor_cannot_have_parameters=1054]="A_get_accessor_cannot_have_parameters",e[e.Enum_member_must_have_initializer=1061]="Enum_member_must_have_initializer",e[e.Type_parameters_cannot_appear_on_a_constructor_declaration=1092]="Type_parameters_cannot_appear_on_a_constructor_declaration",e[e.Type_annotation_cannot_appear_on_a_constructor_declaration=1093]="Type_annotation_cannot_appear_on_a_constructor_declaration",e[e.An_accessor_cannot_have_type_parameters=1094]="An_accessor_cannot_have_type_parameters",e[e.A_set_accessor_cannot_have_a_return_type_annotation=1095]="A_set_accessor_cannot_have_a_return_type_annotation",e[e.Type_parameter_list_cannot_be_empty=1098]="Type_parameter_list_cannot_be_empty",e[e.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement=1104]="A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement",e[e.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement=1105]="A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement",e[e.A_return_statement_can_only_be_used_within_a_function_body=1108]="A_return_statement_can_only_be_used_within_a_function_body",e[e.Expression_expected=1109]="Expression_expected",e[e.Type_expected=1110]="Type_expected",e[e.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement=1113]="A_default_clause_cannot_appear_more_than_once_in_a_switch_statement",e[e.Duplicate_label_0=1114]="Duplicate_label_0",e[e.Octal_literals_are_not_allowed_in_strict_mode=1121]="Octal_literals_are_not_allowed_in_strict_mode",e[e.Digit_expected=1124]="Digit_expected",e[e.Hexadecimal_digit_expected=1125]="Hexadecimal_digit_expected",e[e.Unexpected_end_of_text=1126]="Unexpected_end_of_text",e[e.Invalid_character=1127]="Invalid_character",e[e._case_or_default_expected=1130]="_case_or_default_expected",e[e._super_must_be_followed_by_an_argument_list_or_member_access=1034]="_super_must_be_followed_by_an_argument_list_or_member_access",e[e.A_declare_modifier_cannot_be_used_in_an_already_ambient_context=1038]="A_declare_modifier_cannot_be_used_in_an_already_ambient_context",e[e.Type_argument_expected=1140]="Type_argument_expected",e[e.String_literal_expected=1141]="String_literal_expected",e[e.Line_break_not_permitted_here=1142]="Line_break_not_permitted_here",e[e.Declaration_expected=1146]="Declaration_expected",e[e._const_declarations_must_be_initialized=1155]="_const_declarations_must_be_initialized",e[e.Unterminated_regular_expression_literal=1161]="Unterminated_regular_expression_literal",e[e.Interface_declaration_cannot_have_implements_clause=1176]="Interface_declaration_cannot_have_implements_clause",e[e.Binary_digit_expected=1177]="Binary_digit_expected",e[e.Octal_digit_expected=1178]="Octal_digit_expected",e[e.An_implementation_cannot_be_declared_in_ambient_contexts=1183]="An_implementation_cannot_be_declared_in_ambient_contexts",e[e.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive=1198]="An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive",e[e.Unterminated_Unicode_escape_sequence=1199]="Unterminated_Unicode_escape_sequence",e[e.Decorators_are_not_valid_here=1206]="Decorators_are_not_valid_here",e[e._abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration=1242]="_abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration",e[e.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract=1245]="Method_0_cannot_have_an_implementation_because_it_is_marked_abstract",e[e.A_definite_assignment_assertion_is_not_permitted_in_this_context=1255]="A_definite_assignment_assertion_is_not_permitted_in_this_context",e[e.A_class_may_only_extend_another_class=1311]="A_class_may_only_extend_another_class",e[e.A_parameter_property_cannot_be_declared_using_a_rest_parameter=1317]="A_parameter_property_cannot_be_declared_using_a_rest_parameter",e[e.Duplicate_identifier_0=2300]="Duplicate_identifier_0",e[e.Cannot_find_name_0=2304]="Cannot_find_name_0",e[e.Module_0_has_no_exported_member_1=2305]="Module_0_has_no_exported_member_1",e[e.Generic_type_0_requires_1_type_argument_s=2314]="Generic_type_0_requires_1_type_argument_s",e[e.Type_0_is_not_generic=2315]="Type_0_is_not_generic",e[e.Type_0_is_not_assignable_to_type_1=2322]="Type_0_is_not_assignable_to_type_1",e[e.Index_signature_is_missing_in_type_0=2329]="Index_signature_is_missing_in_type_0",e[e._this_cannot_be_referenced_in_current_location=2332]="_this_cannot_be_referenced_in_current_location",e[e._super_can_only_be_referenced_in_a_derived_class=2335]="_super_can_only_be_referenced_in_a_derived_class",e[e.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors=2337]="Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors",e[e.Property_0_does_not_exist_on_type_1=2339]="Property_0_does_not_exist_on_type_1",e[e.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures=2349]="Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures",e[e.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature=2351]="Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature",e[e.A_function_whose_declared_type_is_not_void_must_return_a_value=2355]="A_function_whose_declared_type_is_not_void_must_return_a_value",e[e.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access=2357]="The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access",e[e.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access=2364]="The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access",e[e.Operator_0_cannot_be_applied_to_types_1_and_2=2365]="Operator_0_cannot_be_applied_to_types_1_and_2",e[e.A_super_call_must_be_the_first_statement_in_the_constructor=2376]="A_super_call_must_be_the_first_statement_in_the_constructor",e[e.Constructors_for_derived_classes_must_contain_a_super_call=2377]="Constructors_for_derived_classes_must_contain_a_super_call",e[e._get_and_set_accessor_must_have_the_same_type=2380]="_get_and_set_accessor_must_have_the_same_type",e[e.Constructor_implementation_is_missing=2390]="Constructor_implementation_is_missing",e[e.Function_implementation_is_missing_or_not_immediately_following_the_declaration=2391]="Function_implementation_is_missing_or_not_immediately_following_the_declaration",e[e.Multiple_constructor_implementations_are_not_allowed=2392]="Multiple_constructor_implementations_are_not_allowed",e[e.Duplicate_function_implementation=2393]="Duplicate_function_implementation",e[e.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local=2395]="Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local",e[e.Type_0_has_no_property_1=2460]="Type_0_has_no_property_1",e[e.The_0_operator_cannot_be_applied_to_type_1=2469]="The_0_operator_cannot_be_applied_to_type_1",e[e.In_const_enum_declarations_member_initializer_must_be_constant_expression=2474]="In_const_enum_declarations_member_initializer_must_be_constant_expression",e[e.Export_declaration_conflicts_with_exported_declaration_of_0=2484]="Export_declaration_conflicts_with_exported_declaration_of_0",e[e.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property=2540]="Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property",e[e.The_target_of_an_assignment_must_be_a_variable_or_a_property_access=2541]="The_target_of_an_assignment_must_be_a_variable_or_a_property_access",e[e.Index_signature_in_type_0_only_permits_reading=2542]="Index_signature_in_type_0_only_permits_reading",e[e.Expected_0_arguments_but_got_1=2554]="Expected_0_arguments_but_got_1",e[e.Expected_at_least_0_arguments_but_got_1=2555]="Expected_at_least_0_arguments_but_got_1",e[e.Expected_0_type_arguments_but_got_1=2558]="Expected_0_type_arguments_but_got_1",e[e.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums=2651]="A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums",e[e.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration=2673]="Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration",e[e.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration=2674]="Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration",e[e.Namespace_0_has_no_exported_member_1=2694]="Namespace_0_has_no_exported_member_1",e[e.Required_type_parameters_may_not_follow_optional_type_parameters=2706]="Required_type_parameters_may_not_follow_optional_type_parameters",e[e.File_0_not_found=6054]="File_0_not_found",e[e.Numeric_separators_are_not_allowed_here=6188]="Numeric_separators_are_not_allowed_here",e[e.Multiple_consecutive_numeric_separators_are_not_permitted=6189]="Multiple_consecutive_numeric_separators_are_not_permitted",e[e._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class=17009]="_super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class",e[e._super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class=17011]="_super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class"}(t.DiagnosticCode||(t.DiagnosticCode={})),t.diagnosticCodeToString=function(e){switch(e){case 100:return"Operation not supported.";case 101:return"Operation is unsafe.";case 102:return"User-defined: {0}";case 200:return"Conversion from type '{0}' to '{1}' requires an explicit cast.";case 201:return"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.";case 202:return"Type '{0}' cannot be changed to type '{1}'.";case 203:return"Type '{0}' cannot be reinterpreted as type '{1}'.";case 204:return"Basic type '{0}' cannot be nullable.";case 205:return"Cannot export a mutable global.";case 206:return"Compiling constant with non-constant initializer as mutable.";case 207:return"Unmanaged classes cannot extend managed classes and vice-versa.";case 208:return"Unmanaged classes cannot implement interfaces.";case 209:return"Invalid regular expression flags.";case 210:return"Implementation '{0}' must match the signature '{1}'.";case 211:return"Class '{0}' is sealed and cannot be extended.";case 212:return"Decorator '{0}' is not valid here.";case 213:return"Duplicate decorator.";case 214:return"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.";case 215:return"Optional parameter must have an initializer.";case 216:return"Constructor of class '{0}' must not require any arguments.";case 217:return"Function '{0}' cannot be inlined into itself.";case 218:return"Cannot access method '{0}' without calling it as it requires 'this' to be set.";case 219:return"Optional properties are not supported.";case 1002:return"Unterminated string literal.";case 1003:return"Identifier expected.";case 1005:return"'{0}' expected.";case 1006:return"A file cannot have a reference to itself.";case 1009:return"Trailing comma not allowed.";case 1012:return"Unexpected token.";case 1014:return"A rest parameter must be last in a parameter list.";case 1015:return"Parameter cannot have question mark and initializer.";case 1016:return"A required parameter cannot follow an optional parameter.";case 1036:return"Statements are not allowed in ambient contexts.";case 1039:return"Initializers are not allowed in ambient contexts.";case 1042:return"'{0}' modifier cannot be used here.";case 1047:return"A rest parameter cannot be optional.";case 1048:return"A rest parameter cannot have an initializer.";case 1049:return"A 'set' accessor must have exactly one parameter.";case 1052:return"A 'set' accessor parameter cannot have an initializer.";case 1054:return"A 'get' accessor cannot have parameters.";case 1061:return"Enum member must have initializer.";case 1092:return"Type parameters cannot appear on a constructor declaration.";case 1093:return"Type annotation cannot appear on a constructor declaration.";case 1094:return"An accessor cannot have type parameters.";case 1095:return"A 'set' accessor cannot have a return type annotation.";case 1098:return"Type parameter list cannot be empty.";case 1104:return"A 'continue' statement can only be used within an enclosing iteration statement.";case 1105:return"A 'break' statement can only be used within an enclosing iteration or switch statement.";case 1108:return"A 'return' statement can only be used within a function body.";case 1109:return"Expression expected.";case 1110:return"Type expected.";case 1113:return"A 'default' clause cannot appear more than once in a 'switch' statement.";case 1114:return"Duplicate label '{0}'.";case 1121:return"Octal literals are not allowed in strict mode.";case 1124:return"Digit expected.";case 1125:return"Hexadecimal digit expected.";case 1126:return"Unexpected end of text.";case 1127:return"Invalid character.";case 1130:return"'case' or 'default' expected.";case 1034:return"'super' must be followed by an argument list or member access.";case 1038:return"A 'declare' modifier cannot be used in an already ambient context.";case 1140:return"Type argument expected.";case 1141:return"String literal expected.";case 1142:return"Line break not permitted here.";case 1146:return"Declaration expected.";case 1155:return"'const' declarations must be initialized.";case 1161:return"Unterminated regular expression literal.";case 1176:return"Interface declaration cannot have 'implements' clause.";case 1177:return"Binary digit expected.";case 1178:return"Octal digit expected.";case 1183:return"An implementation cannot be declared in ambient contexts.";case 1198:return"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.";case 1199:return"Unterminated Unicode escape sequence.";case 1206:return"Decorators are not valid here.";case 1242:return"'abstract' modifier can only appear on a class, method, or property declaration.";case 1245:return"Method '{0}' cannot have an implementation because it is marked abstract.";case 1255:return"A definite assignment assertion '!' is not permitted in this context.";case 1311:return"A class may only extend another class.";case 1317:return"A parameter property cannot be declared using a rest parameter.";case 2300:return"Duplicate identifier '{0}'.";case 2304:return"Cannot find name '{0}'.";case 2305:return"Module '{0}' has no exported member '{1}'.";case 2314:return"Generic type '{0}' requires {1} type argument(s).";case 2315:return"Type '{0}' is not generic.";case 2322:return"Type '{0}' is not assignable to type '{1}'.";case 2329:return"Index signature is missing in type '{0}'.";case 2332:return"'this' cannot be referenced in current location.";case 2335:return"'super' can only be referenced in a derived class.";case 2337:return"Super calls are not permitted outside constructors or in nested functions inside constructors.";case 2339:return"Property '{0}' does not exist on type '{1}'.";case 2349:return"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.";case 2351:return"Cannot use 'new' with an expression whose type lacks a construct signature.";case 2355:return"A function whose declared type is not 'void' must return a value.";case 2357:return"The operand of an increment or decrement operator must be a variable or a property access.";case 2364:return"The left-hand side of an assignment expression must be a variable or a property access.";case 2365:return"Operator '{0}' cannot be applied to types '{1}' and '{2}'.";case 2376:return"A 'super' call must be the first statement in the constructor.";case 2377:return"Constructors for derived classes must contain a 'super' call.";case 2380:return"'get' and 'set' accessor must have the same type.";case 2390:return"Constructor implementation is missing.";case 2391:return"Function implementation is missing or not immediately following the declaration.";case 2392:return"Multiple constructor implementations are not allowed.";case 2393:return"Duplicate function implementation.";case 2395:return"Individual declarations in merged declaration '{0}' must be all exported or all local.";case 2460:return"Type '{0}' has no property '{1}'.";case 2469:return"The '{0}' operator cannot be applied to type '{1}'.";case 2474:return"In 'const' enum declarations member initializer must be constant expression.";case 2484:return"Export declaration conflicts with exported declaration of '{0}'.";case 2540:return"Cannot assign to '{0}' because it is a constant or a read-only property.";case 2541:return"The target of an assignment must be a variable or a property access.";case 2542:return"Index signature in type '{0}' only permits reading.";case 2554:return"Expected {0} arguments, but got {1}.";case 2555:return"Expected at least {0} arguments, but got {1}.";case 2558:return"Expected {0} type arguments, but got {1}.";case 2651:return"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.";case 2673:return"Constructor of class '{0}' is private and only accessible within the class declaration.";case 2674:return"Constructor of class '{0}' is protected and only accessible within the class declaration.";case 2694:return"Namespace '{0}' has no exported member '{1}'.";case 2706:return"Required type parameters may not follow optional type parameters.";case 6054:return"File '{0}' not found.";case 6188:return"Numeric separators are not allowed here.";case 6189:return"Multiple consecutive numeric separators are not permitted.";case 17009:return"'super' must be called before accessing 'this' in the constructor of a derived class.";case 17011:return"'super' must be called before accessing a property of 'super' in the constructor of a derived class.";default:return""}}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o,c=r(2),l=r(5),p=r(4),u=r(7),h=r(1),_=r(0),d=r(6);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(o=t.ReportMode||(t.ReportMode={}));var y=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.program=t,r}return i(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=o.REPORT),e.kind==p.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==p.NodeKind.TYPE);var i=e,a=i.name.text,s=a,d=i.range.source.internalPath+h.PATH_DELIMITER+a,y=this.program.elementsLookup,m=void 0;if((m=y.get(d))||(m=y.get(s)))switch(m.kind){case l.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==o.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,e.range,m.internalName),null):u.Type.i32;case l.ElementKind.CLASS_PROTOTYPE:var g=this.resolveClassInclTypeArguments(m,i.typeArguments,_.makeMap(t),e);return g?e.isNullable?g.type.asNullable():g.type:null}var T=this.program.typeAliases.get(a);if(T)return this.resolveType(T.type,t,r);var E=i.typeArguments,f=null;if(E){var I=E.length;f=new Array(I);for(var v=0;v",s+="<"+C+">")}else if(t){var S=t.get(s);if(S)return S}}var N=this.program.typesLookup,O=void 0;if((O=N.get(d))||(O=N.get(s)))return!O.is(256)&&e.isNullable&&r==o.REPORT&&this.error(c.DiagnosticCode.Basic_type_0_cannot_be_nullable,e.range,O.toString()),O;if("NATIVE"==a){if(!f||1!=f.length)return r==o.REPORT&&this.error(c.DiagnosticCode.Expected_0_type_arguments_but_got_1,i.range,"1",(E?E.length:1).toString(10)),null;switch(f[0].kind){case 0:case 1:case 2:return u.Type.i32;case 4:if(!this.program.options.isWasm64)return u.Type.i32;case 3:return u.Type.i64;case 5:case 6:case 7:case 10:return u.Type.u32;case 9:if(!this.program.options.isWasm64)return u.Type.u32;case 8:return u.Type.u64;case 11:return u.Type.f32;case 12:return u.Type.f64;case 13:return u.Type.v128;case 14:return u.Type.void;default:assert(!1)}}return r==o.REPORT&&this.error(c.DiagnosticCode.Cannot_find_name_0,i.name.range,s),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=o.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,s=a.length,c=new Array(s),l=new Array(s),h=0,_=!1,d=0;ds)return this.error(c.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?p.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var w=new l.Function(e,P,U,A||T,r);return d||e.instances.set(a,d=new Map),d.set(s,w),this.program.instancesLookup.set(P,w),w},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=o.REPORT),assert(e.is(h.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=u.typesToString(t),s=new l.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+h.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return s.flags=e.flags,s.operatorKind=e.operatorKind,s.classTypeArguments=t,s.instances=e.instances,s},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=o.REPORT);var a=null;if(e.is(h.CommonFlags.GENERIC)){if(e.classTypeArguments&&e.applyClassTypeArguments(r),!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==o.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveFunction(e,a,r,i)},t.prototype.resolveClass=function(e,t,r,n){var i,d,y,m,g,T;void 0===r&&(r=_.makeMap()),void 0===n&&(n=o.REPORT);var E=t?u.typesToString(t):"",f=e.instances.get(E);if(f)return f;var I=e.declaration;if(t){var v=I.typeParameters,A=v.length,C=t.length;assert(C==A);for(var S=0;S",b+="<"+E+">"),(f=new l.Class(e,x,b,t,N)).contextualTypeArguments=r,e.instances.set(E,f),this.program.instancesLookup.set(b,f);var L=0;if(N){if(N.members){f.members||(f.members=new Map);try{for(var k=a(N.members.values()),R=k.next();!R.done;R=k.next()){var F=R.value;f.members.set(F.simpleName,F)}}catch(e){i={error:e}}finally{try{R&&!R.done&&(d=k.return)&&d.call(k)}finally{if(i)throw i.error}}}L=N.currentMemoryOffset}var B=e.constructorPrototype;if(B){var D=this.resolveFunctionPartially(B,t,n);if(!D)return null;f.constructorInstance=this.resolveFunction(D,null,_.makeMap(),n)}if(e.instanceMembers)try{for(var U=a(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case l.ElementKind.FIELD_PROTOTYPE:var M=w.declaration;if(f.members){if(f.members.has(w.simpleName)){this.error(c.DiagnosticCode.Duplicate_identifier_0,M.name.range,w.simpleName);break}}else f.members=new Map;var G=null;if(M.type)G=this.resolveType(M.type,f.contextualTypeArguments,n);else{if(null!==N&&null!==N.members){var V=N.members.get(w.simpleName);V&&!V.is(h.CommonFlags.PRIVATE)&&(assert(V.kind==l.ElementKind.FIELD),G=V.type)}G||n==o.REPORT&&this.error(c.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var K=new l.Field(w,b+h.INSTANCE_DELIMITER+w.simpleName,G,M,f);switch(G.byteSize){case 1:break;case 2:1&L&&++L;break;case 4:3&L&&(L=1+(3|L));break;case 8:7&L&&(L=1+(7|L));break;default:assert(!1)}K.memoryOffset=L,L+=G.byteSize,f.members.set(w.simpleName,K);break;case l.ElementKind.FUNCTION_PROTOTYPE:f.members||(f.members=new Map);var z=this.resolveFunctionPartially(w,t,n);if(!z)return null;z.internalName=b+h.INSTANCE_DELIMITER+z.simpleName,f.members.set(w.simpleName,z);break;case l.ElementKind.PROPERTY:f.members||(f.members=new Map);var H=assert(w.getterPrototype),X=w.setterPrototype,W=new l.Property(this.program,w.simpleName,b+h.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(H,t,n);if(!Y)return null;if(Y.internalName=b+h.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=b+h.INSTANCE_DELIMITER+Q.simpleName,W.setterPrototype=Q}f.members.set(w.simpleName,W);break;default:assert(!1)}}}catch(e){y={error:e}}finally{try{P&&!P.done&&(m=U.return)&&m.call(U)}finally{if(y)throw y.error}}f.currentMemoryOffset=L;try{for(var q=a(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=s(j.value,2),J=Z[0],$=Z[1];assert(J!=l.OperatorKind.INVALID);var ee=void 0;if($.is(h.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,_.makeMap(),n)}else ee=this.resolveFunction($,null,_.makeMap(),n);if(ee){var re=f.overloads;re||(f.overloads=re=new Map),re.set(J,ee)}}}catch(e){g={error:e}}finally{try{j&&!j.done&&(T=q.return)&&T.call(q)}finally{if(g)throw g.error}}return f},t.prototype.resolveClassInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=o.REPORT);var a=null;if(e.is(h.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==o.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(c.DiagnosticEmitter);t.Resolver=y},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3),i=function(){function e(){this.text=[],this.functionId=0}return e.decompile=function(t){var r=new e;return r.decompile(t),r.finish()},e.prototype.decompile=function(e){throw new Error("not implemented")},e.prototype.decompileFunction=function(e){var t=n.getFunctionName(e)||"$"+this.functionId.toString(10),r=n.getFunctionBody(e);this.push("function "),this.push(t),this.push("(");for(var i=0,s=n.getFunctionParamCount(e);i0&&this.push(", "),this.push("$"),this.push(i.toString(10)),this.push(": "),this.push(a(n.getFunctionParamType(e,i)));this.push("): "),this.push(a(n.getFunctionResultType(e))),this.push(" "),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("{\n"),this.decompileExpression(r),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("\n}\n"),++this.functionId},e.prototype.decompileExpression=function(e){var t,r,i,s,o=n.getExpressionId(e),c=n.getExpressionType(e);switch(o){case n.ExpressionId.Block:for(null!=(r=n.getBlockName(e))&&(this.push(r),this.push(": ")),this.push("{\n"),s=n.getBlockChildCount(e),i=0;i("),this.push(n.getLoadOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getLoadPtr(e)),void this.push(")");case n.ExpressionId.Store:return this.push("store<"),this.push(a(c)),this.push(">("),this.push(n.getStoreOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getStorePtr(e)),this.push(", "),this.decompileExpression(n.getStoreValue(e)),void this.push(")");case n.ExpressionId.Const:switch(c){case n.NativeType.I32:return void this.push(n.getConstValueI32(e).toString(10));case n.NativeType.I64:return void this.push(i64_to_string(i64_new(n.getConstValueI64Low(e),n.getConstValueI64High(e))));case n.NativeType.F32:return void this.push(n.getConstValueF32(e).toString(10));case n.NativeType.F64:return void this.push(n.getConstValueF64(e).toString(10))}break;case n.ExpressionId.Unary:switch(n.getUnaryOp(e)){case n.UnaryOp.ClzI32:return this.push("clz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI32:return this.push("ctz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI32:return this.push("popcnt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NegF32:case n.UnaryOp.NegF64:return this.push("-"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.AbsF32:return this.push("abs("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF32:return this.push("ceil("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF32:return this.push("floor("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF32:return this.push("trunc("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF32:return this.push("nearest("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF32:return this.push("sqrt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.EqzI32:case n.UnaryOp.EqzI64:return this.push("!"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ClzI64:return this.push("clz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI64:return this.push("ctz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI64:return this.push("popcnt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.AbsF64:return this.push("abs("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF64:return this.push("ceil("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF64:return this.push("floor("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF64:return this.push("trunc("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF64:return this.push("nearest("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF64:return this.push("sqrt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ExtendI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ExtendU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.WrapI64:case n.UnaryOp.TruncF32ToI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToI64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretF32:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretF64:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ConvertI32ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI32ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.PromoteF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.DemoteF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretI32:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretI64:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")")}break;case n.ExpressionId.Binary:switch(n.getBinaryOp(e)){case n.BinaryOp.AddI32:case n.BinaryOp.AddI64:case n.BinaryOp.AddF32:case n.BinaryOp.AddF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" + "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.SubI32:case n.BinaryOp.SubI64:case n.BinaryOp.SubF32:case n.BinaryOp.SubF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" - "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.MulI32:case n.BinaryOp.MulI64:case n.BinaryOp.MulF32:case n.BinaryOp.MulF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" * "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivI32:case n.BinaryOp.DivI64:case n.BinaryOp.DivF32:case n.BinaryOp.DivF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU32:return this.push("("),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RemI32:case n.BinaryOp.RemI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU32:return this.push("("),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.AndI32:case n.BinaryOp.AndI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" & "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.OrI32:case n.BinaryOp.OrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" | "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.XorI32:case n.BinaryOp.XorI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" ^ "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShlI32:case n.BinaryOp.ShlI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" << "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrU32:case n.BinaryOp.ShrU64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >>> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrI32:case n.BinaryOp.ShrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI32:return this.push("rotl("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI32:return this.push("rotr("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.EqI32:case n.BinaryOp.EqI64:case n.BinaryOp.EqF32:case n.BinaryOp.EqF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" == "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.NeI32:case n.BinaryOp.NeI64:case n.BinaryOp.NeF32:case n.BinaryOp.NeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" != "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtI32:case n.BinaryOp.LtI64:case n.BinaryOp.LtF32:case n.BinaryOp.LtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeI32:case n.BinaryOp.LeI64:case n.BinaryOp.LeF32:case n.BinaryOp.LeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtI32:case n.BinaryOp.GtI64:case n.BinaryOp.GtF32:case n.BinaryOp.GtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeI32:case n.BinaryOp.GeI64:case n.BinaryOp.GeF32:case n.BinaryOp.GeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI64:return this.push("rotl("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI64:return this.push("rotr("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.LtU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.CopysignF32:return this.push("copysign("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF32:return this.push("min("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF32:return this.push("max("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.CopysignF64:return this.push("copysign("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF64:return this.push("min("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF64:return this.push("max("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")")}return;case n.ExpressionId.Select:return this.push("select<"),this.push(a(c)),this.push(">("),this.decompileExpression(n.getSelectThen(e)),this.push(", "),this.decompileExpression(n.getSelectElse(e)),this.push(", "),this.decompileExpression(n.getSelectCondition(e)),void this.push(")");case n.ExpressionId.Drop:return this.decompileExpression(n.getDropValue(e)),void this.push(";\n");case n.ExpressionId.Return:return void((t=n.getReturnValue(e))?(this.push("return "),this.decompileExpression(t),this.push(";\n")):this.push("return;\n"));case n.ExpressionId.Host:switch(n.getHostOp(e)){case n.HostOp.CurrentMemory:return void this.push("memory.size()");case n.HostOp.GrowMemory:return this.push("memory.grow("),this.decompileExpression(n.getHostOperand(e,0)),void this.push(")")}break;case n.ExpressionId.Nop:return void this.push(";\n");case n.ExpressionId.Unreachable:return void this.push("unreachable()");case n.ExpressionId.AtomicCmpxchg:case n.ExpressionId.AtomicRMW:case n.ExpressionId.AtomicWait:case n.ExpressionId.AtomicWake:}throw new Error("not implemented")},e.prototype.push=function(e){this.text.push(e)},e.prototype.finish=function(){var e=this.text.join("");return this.text=[],e},e}();function a(e){switch(e){case n.NativeType.None:return"void";case n.NativeType.I32:return"i32";case n.NativeType.I64:return"i64";case n.NativeType.F32:return"f32";case n.NativeType.F64:return"f64";case n.NativeType.V128:return"v128";case n.NativeType.Unreachable:throw new Error("unreachable type");case n.NativeType.Auto:throw new Error("auto type");default:throw new Error("unexpected type")}}t.Decompiler=i},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o=r(1),c=r(5),l=r(0),p=function(){function e(e,t){void 0===t&&(t=!1),this.todo=[],this.seen=new Set,this.program=e,this.includePrivate}return e.prototype.walk=function(){var e,t;try{for(var r=a(this.program.moduleLevelExports.values()),n=r.next();!n.done;n=r.next()){var i=n.value;this.visitElement(i.element)}}catch(t){e={error:t}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(e)throw e.error}}for(var s=this.todo;0"),null}for(;e.skip(o.Token.BAR);){if(!e.skip(o.Token.NULL))return r||this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;d=!0}n=p.Node.createType(h,_,d,e.range(a,e.pos))}for(;e.skip(o.Token.OPENBRACKET);){var m=e.tokenPos;if(!e.skip(o.Token.CLOSEBRACKET))return r||this.error(c.DiagnosticCode._0_expected,e.range(),"]"),null;var g=e.range(m,e.pos);d=!1;if(e.skip(o.Token.BAR)){if(!e.skip(o.Token.NULL))return r||this.error(c.DiagnosticCode._0_expected,e.range(),"null"),null;d=!0}if(n=p.Node.createType(p.Node.createIdentifierExpression("Array",g),[n],d,e.range(a,e.pos)),d)break}return n},t.prototype.tryParseSignature=function(e){var t,r=e.mark(),n=e.tokenPos,i=null,a=null,s=!1;if(e.skip(o.Token.CLOSEPAREN))s=!0,e.discard(r),i=[];else{s=!1;do{var l=p.ParameterKind.DEFAULT;if(e.skip(o.Token.DOT_DOT_DOT)&&(s=!0,e.discard(r),l=p.ParameterKind.REST),e.skip(o.Token.THIS)){if(!e.skip(o.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;s=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return s?this.error(c.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=s,null;var h=p.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(o.Token.QUESTION)&&(s=!0,e.discard(r),l==p.ParameterKind.REST?this.error(c.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):l=p.ParameterKind.OPTIONAL),e.skip(o.Token.COLON)){s=!0,e.discard(r);var _=this.parseType(e);if(!_)return this.tryParseSignatureIsSignature=s,null;var d=new p.ParameterNode;d.parameterKind=l,d.name=h,d.type=_,i?i.push(d):i=[d]}else s&&this.error(c.DiagnosticCode.Type_expected,e.range())}}while(e.skip(o.Token.COMMA));if(!e.skip(o.Token.CLOSEPAREN))return s?this.error(c.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=s,null}return e.skip(o.Token.EQUALS_GREATERTHAN)?(s=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,p.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=s,null)):(s?this.error(c.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=s,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=p.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(o.Token.DOT);){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=p.Node.createPropertyAccessExpression(n,p.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(o.Token.OPENPAREN))return p.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return p.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(c.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseVariable=function(e,t,r,n){var i=new Array;do{var a=this.parseVariableDeclaration(e,t,r);if(!a)return null;i.push(a)}while(e.skip(o.Token.COMMA));var s=p.Node.createVariableStatement(i,r,t,e.range(n,e.pos));return e.skip(o.Token.SEMICOLON),s},t.prototype.parseVariableDeclaration=function(e,t,r){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var n=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),i=t;e.skip(o.Token.EXCLAMATION)&&(i|=a.CommonFlags.DEFINITE_ASSIGNMENT);var s=null;e.skip(o.Token.COLON)&&(s=this.parseType(e));var l=null;if(e.skip(o.Token.EQUALS)){if(i&a.CommonFlags.AMBIENT&&this.error(c.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(l=this.parseExpression(e,2)))return null}else i&a.CommonFlags.CONST?i&a.CommonFlags.AMBIENT||this.error(c.DiagnosticCode._const_declarations_must_be_initialized,n.range):s||this.error(c.DiagnosticCode.Type_expected,e.range(e.pos));var u=o.Range.join(n.range,e.range());return i&a.CommonFlags.DEFINITE_ASSIGNMENT&&l&&this.error(c.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),p.Node.createVariableDeclaration(n,s,l,r,i,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=o.Token.IDENTIFIER)return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=o.Token.OPENBRACE)return this.error(c.DiagnosticCode._0_expected,e.range(),"{"),null;for(var s=new Array;!e.skip(o.Token.CLOSEBRACE);){var l=this.parseEnumValue(e,a.CommonFlags.NONE);if(!l)return null;if(s.push(l),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.CLOSEBRACE))break;return this.error(c.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=p.Node.createEnumDeclaration(i,s,r,t,e.range(n,e.pos));return e.skip(o.Token.SEMICOLON),u},t.prototype.parseEnumValue=function(e,t){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(o.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:p.Node.createEnumValueDeclaration(r,n,t,o.Range.join(r.range,e.range()))},t.prototype.parseReturn=function(e){var t=null;if(e.peek(!0)!=o.Token.SEMICOLON&&e.nextToken!=o.Token.CLOSEBRACE&&!e.nextTokenOnNewLine&&!(t=this.parseExpression(e)))return null;var r=p.Node.createReturnStatement(t,e.range());return e.skip(o.Token.SEMICOLON),r},t.prototype.parseTypeParameters=function(e){for(var t=new Array,r=!1;!e.skip(o.Token.GREATERTHAN);){var n=this.parseTypeParameter(e);if(!n)return null;if(null!==n.defaultType?r=!0:r&&(this.error(c.DiagnosticCode.Required_type_parameters_may_not_follow_optional_type_parameters,n.range),n.defaultType=null),t.push(n),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.GREATERTHAN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(c.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==o.Token.IDENTIFIER){var t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(o.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,i.range),null;r=i}var n=null;if(e.skip(o.Token.EQUALS)){var i;if(!(i=this.parseType(e)))return null;if(i.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return p.Node.createTypeParameter(t,r,n,o.Range.join(t.range,e.range()))}return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseParameters=function(e,t){void 0===t&&(t=!1);var r=new Array,n=null,i=!1,a=!1,s=null;if(this.parseParametersThis=null,e.skip(o.Token.THIS)){if(!e.skip(o.Token.COLON))return this.error(c.DiagnosticCode._0_expected,e.range(),":"),null;if(!(s=this.parseType(e)))return null;if(s.kind==p.NodeKind.TYPE?this.parseParametersThis=s:this.error(c.DiagnosticCode.Operation_not_supported,s.range),!e.skip(o.Token.COMMA))return e.skip(o.Token.CLOSEPAREN)?r:(this.error(c.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(o.Token.CLOSEPAREN);){var l=this.parseParameter(e,t);if(!l)return null;switch(n&&!a&&(this.error(c.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),l.parameterKind){default:i&&this.error(c.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,l.name.range);break;case p.ParameterKind.OPTIONAL:i=!0;break;case p.ParameterKind.REST:n=l}if(r.push(l),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.CLOSEPAREN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,i=null,s=a.CommonFlags.NONE;if(t&&(e.skip(o.Token.PUBLIC)?(i=e.range(),s|=a.CommonFlags.PUBLIC):e.skip(o.Token.PROTECTED)?(i=e.range(),s|=a.CommonFlags.PROTECTED):e.skip(o.Token.PRIVATE)&&(i=e.range(),s|=a.CommonFlags.PRIVATE),e.peek()==o.Token.READONLY)){var l=e.mark();e.next(),e.peek()!=o.Token.COLON?(e.discard(l),i||(i=e.range()),s|=a.CommonFlags.READONLY):e.reset(l)}if(e.skip(o.Token.DOT_DOT_DOT)&&(s?this.error(c.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):i=e.range(),r=!0),e.skipIdentifier()){r||(i=e.range());var u=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(o.Token.QUESTION))&&r&&this.error(c.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(o.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=p.Node.createOmittedType(e.range(e.pos));var _=null;if(e.skip(o.Token.EQUALS)&&(r&&this.error(c.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(c.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(_=this.parseExpression(e,2))))return null;var d=p.Node.createParameter(u,h,_,r?p.ParameterKind.REST:n?p.ParameterKind.OPTIONAL:p.ParameterKind.DEFAULT,o.Range.join(i,e.range()));return d.flags|=s,d}return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),s=-1,l=null;if(e.skip(o.Token.LESSTHAN)){if(s=e.tokenPos,!(l=this.parseTypeParameters(e)))return null;t|=a.CommonFlags.GENERIC}if(!e.skip(o.Token.OPENPAREN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"("),null;s<0&&(s=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,_=0!=(t&a.CommonFlags.SET);_&&(1!=u.length&&this.error(c.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,i.range),u.length&&u[0].initializer&&this.error(c.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,i.range)),t&a.CommonFlags.GET&&u.length&&this.error(c.DiagnosticCode.A_get_accessor_cannot_have_parameters,i.range);var d=null;if(e.skip(o.Token.COLON)&&!(d=this.parseType(e,!0,_)))return null;d||(d=p.Node.createOmittedType(e.range(e.pos)),_||this.error(c.DiagnosticCode.Type_expected,d.range));var y=p.Node.createSignature(u,d,h,!1,e.range(s,e.pos)),m=null;if(e.skip(o.Token.OPENBRACE)){if(t&a.CommonFlags.AMBIENT&&this.error(c.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(m=this.parseBlockStatement(e,!1)))return null}else t&a.CommonFlags.AMBIENT||this.error(c.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var g=p.Node.createFunctionDeclaration(i,l,y,m,r,t,e.range(n,e.pos));return e.skip(o.Token.SEMICOLON),g},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==o.Token.FUNCTION){if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(o.Token.OPENPAREN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==o.Token.OPENPAREN),t=p.Node.createEmptyIdentifierExpression(e.range(e.tokenPos));var i=e.pos,a=this.parseParameters(e);return a?this.parseFunctionExpressionCommon(e,t,a,n,r,i):null},t.prototype.parseFunctionExpressionCommon=function(e,t,r,n,i,s){void 0===i&&(i=-1),void 0===s&&(s=-1),i<0&&(i=t.range.start),s<0&&(s=i);var l=null;if(e.skip(o.Token.COLON)){if(!(l=this.parseType(e)))return null}else l=p.Node.createOmittedType(e.range(e.pos)),this.error(c.DiagnosticCode.Type_expected,l.range);if(n&&!e.skip(o.Token.EQUALS_GREATERTHAN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=p.Node.createSignature(r,l,null,!1,e.range(s,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(o.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var _=p.Node.createFunctionDeclaration(t,null,h,u,null,n?a.CommonFlags.ARROW:a.CommonFlags.NONE,e.range(i,e.pos));return p.Node.createFunctionExpression(_)},t.prototype.parseClassOrInterface=function(e,t,r,n){var i=e.token==o.Token.INTERFACE;if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var s,l=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(o.Token.LESSTHAN)){if(!(s=this.parseTypeParameters(e)))return null;t|=a.CommonFlags.GENERIC}else s=[];var u=null;if(e.skip(o.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var _=null;if(e.skip(o.Token.IMPLEMENTS)){i&&this.error(c.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var d=this.parseType(e);if(!d)return null;i||(_||(_=[]),_.push(d))}while(e.skip(o.Token.COMMA))}if(!e.skip(o.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(),"{"),null;var y,m=new Array;if(i?(assert(!_),y=p.Node.createInterfaceDeclaration(l,s,u,m,r,t,e.range(n,e.pos))):y=p.Node.createClassDeclaration(l,s,u,_,m,r,t,e.range(n,e.pos)),!e.skip(o.Token.CLOSEBRACE))do{var g=this.parseClassMember(e,y);if(!g)return null;g.parent=y,m.push(g)}while(!e.skip(o.Token.CLOSEBRACE));return y},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(o.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,i=p.Node.createClassDeclaration(t,[],null,null,n,null,a.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(o.Token.CLOSEBRACE))do{var s=this.parseClassMember(e,i);if(!s)return null;s.parent=i,n.push(s)}while(!e.skip(o.Token.CLOSEBRACE));return p.Node.createClassExpression(i)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==p.NodeKind.INTERFACEDECLARATION,i=new Array;if(e.skip(o.Token.AT)){do{var s=this.parseDecorator(e);if(!s)break;i.push(s)}while(e.skip(o.Token.AT));n&&this.error(c.DiagnosticCode.Decorators_are_not_valid_here,o.Range.join(i[0].range,i[i.length-1].range))}var l=t.flags&a.CommonFlags.AMBIENT;n&&(l|=a.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(o.Token.PUBLIC)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),l|=a.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(o.Token.PRIVATE)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),l|=a.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(o.Token.PROTECTED)&&(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),l|=a.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var _=0,d=0,y=0,m=0;e.skip(o.Token.STATIC)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),l|=a.CommonFlags.STATIC,_=e.tokenPos,d=e.pos):(l|=a.CommonFlags.INSTANCE,e.skip(o.Token.ABSTRACT)&&(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),l|=a.CommonFlags.ABSTRACT,y=e.tokenPos,m=e.pos),t.flags&a.CommonFlags.GENERIC&&(l|=a.CommonFlags.GENERIC_CONTEXT));var g=0,T=0;e.skip(o.Token.READONLY)&&(l|=a.CommonFlags.READONLY,g=e.tokenPos,T=e.pos);var E,f=e.mark(),I=!1,v=!1,A=!1,C=0,S=0;if(n||(e.skip(o.Token.GET)?e.peek(!0,o.IdentifierHandling.PREFER)!=o.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(f):(l|=a.CommonFlags.GET,v=!0,C=e.tokenPos,S=e.pos,l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly")):e.skip(o.Token.SET)?e.peek(!0,o.IdentifierHandling.PREFER)!=o.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(f):(l|=a.CommonFlags.SET,A=!0,C=e.tokenPos,S=e.pos,l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly")):e.skip(o.Token.CONSTRUCTOR)&&(I=!0,(l|=a.CommonFlags.CONSTRUCTOR)&a.CommonFlags.STATIC&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(_,d),"static"),l&a.CommonFlags.ABSTRACT&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,m),"abstract"),l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly"))),I)E=p.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(o.Token.OPENBRACKET)){l&a.CommonFlags.PUBLIC?this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):l&a.CommonFlags.PROTECTED?this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):l&a.CommonFlags.PRIVATE&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),l&a.CommonFlags.STATIC&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(_,d),"static"),l&a.CommonFlags.ABSTRACT&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,m),"abstract"),l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly");var N=this.parseIndexSignatureDeclaration(e,i);return N?(e.skip(o.Token.SEMICOLON),N):null}if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;E=p.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var O=null;if(e.skip(o.Token.LESSTHAN)){var x=e.tokenPos;if(!(O=this.parseTypeParameters(e)))return null;I?this.error(c.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(x,e.pos)):v||A?this.error(c.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(x,e.pos)):l|=a.CommonFlags.GENERIC}if(e.skip(o.Token.OPENPAREN)){var b=e.tokenPos,L=this.parseParameters(e,I);if(!L)return null;var k=this.parseParametersThis;if(I)for(var R=0,F=L.length;R"),null):null;case o.Token.IDENTIFIER:return p.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case o.Token.THIS:return p.Node.createThisExpression(e.range(r,e.pos));case o.Token.CONSTRUCTOR:return p.Node.createConstructorExpression(e.range(r,e.pos));case o.Token.SUPER:return e.peek()!=o.Token.DOT&&e.nextToken!=o.Token.OPENPAREN&&this.error(c.DiagnosticCode._super_must_be_followed_by_an_argument_list_or_member_access,e.range()),p.Node.createSuperExpression(e.range(r,e.pos));case o.Token.STRINGLITERAL:return p.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case o.Token.INTEGERLITERAL:return p.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case o.Token.FLOATLITERAL:return p.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case o.Token.SLASH:var E=e.readRegexpPattern();return e.skip(o.Token.SLASH)?p.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(c.DiagnosticCode._0_expected,e.range(),"/"),null);case o.Token.FUNCTION:return this.parseFunctionExpression(e);case o.Token.CLASS:return this.parseClassExpression(e);default:return t==o.Token.ENDOFFILE?this.error(c.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(c.DiagnosticCode.Expression_expected,e.range()),null}},t.prototype.tryParseTypeArgumentsBeforeArguments=function(e){var t=e.mark();if(!e.skip(o.Token.LESSTHAN))return null;var r=new Array;do{if(e.peek()===o.Token.GREATERTHAN)break;var n=this.parseType(e,!0,!0);if(!n)return e.reset(t),null;r.push(n)}while(e.skip(o.Token.COMMA));return e.skip(o.Token.GREATERTHAN)&&e.skip(o.Token.OPENPAREN)?r:(e.reset(t),null)},t.prototype.parseArguments=function(e){for(var t=new Array;!e.skip(o.Token.CLOSEPAREN);){var r=this.parseExpression(e,2);if(!r)return null;if(t.push(r),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.CLOSEPAREN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),")"),null}}return t},t.prototype.parseExpression=function(e,t){void 0===t&&(t=1),assert(0!=t);var r=this.parseExpressionStart(e);if(!r)return null;for(var n,i,a=(r=this.maybeParseCallExpression(e,r)).range.start,s=null;(i=h(n=e.peek()))>=t;){switch(e.next(),n){case o.Token.AS:var l=this.parseType(e);if(!l)return null;r=p.Node.createAssertionExpression(p.AssertionKind.AS,r,l,e.range(a,e.pos));break;case o.Token.EXCLAMATION:r=p.Node.createAssertionExpression(p.AssertionKind.NONNULL,r,null,e.range(a,e.pos));break;case o.Token.INSTANCEOF:var u=this.parseType(e);if(!u)return null;r=p.Node.createInstanceOfExpression(r,u,e.range(a,e.pos));break;case o.Token.OPENBRACKET:if(!(s=this.parseExpression(e)))return null;if(!e.skip(o.Token.CLOSEBRACKET))return this.error(c.DiagnosticCode._0_expected,e.range(),"]"),null;r=p.Node.createElementAccessExpression(r,s,e.range(a,e.pos));break;case o.Token.PLUS_PLUS:case o.Token.MINUS_MINUS:r.kind!=p.NodeKind.IDENTIFIER&&r.kind!=p.NodeKind.ELEMENTACCESS&&r.kind!=p.NodeKind.PROPERTYACCESS&&this.error(c.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=p.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case o.Token.QUESTION:var d=this.parseExpression(e);if(!d)return null;if(!e.skip(o.Token.COLON))return this.error(c.DiagnosticCode._0_expected,e.range(),":"),null;var y=this.parseExpression(e,t>1?2:1);if(!y)return null;r=p.Node.createTernaryExpression(r,d,y,e.range(a,e.pos));break;case o.Token.COMMA:var m=[r];do{if(!(r=this.parseExpression(e,2)))return null;m.push(r)}while(e.skip(o.Token.COMMA));r=p.Node.createCommaExpression(m,e.range(a,e.pos));break;default:if(n==o.Token.DOT){if(e.skipIdentifier())s=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(s=this.parseExpression(e,_(n)?i:i+1)))return null;if(s.kind==p.NodeKind.IDENTIFIER)r=p.Node.createPropertyAccessExpression(r,s,e.range(a,e.pos));else{if(s.kind!=p.NodeKind.CALL)return this.error(c.DiagnosticCode.Identifier_expected,s.range),null;if(!(r=this.joinPropertyCall(e,a,r,s)))return null}}else{if(!(s=this.parseExpression(e,_(n)?i:i+1)))return null;r=p.Node.createBinaryExpression(n,r,s,e.range(a,e.pos))}}r=this.maybeParseCallExpression(e,r)}return r},t.prototype.joinPropertyCall=function(e,t,r,n){var i=n.expression;switch(i.kind){case p.NodeKind.IDENTIFIER:n.expression=p.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case p.NodeKind.CALL:var a=this.joinPropertyCall(e,t,r,i);if(!a)return null;n.expression=a,n.range=e.range(t,e.pos);break;default:return this.error(c.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(p.nodeIsCallable(t.kind))for(var r=null;e.skip(o.Token.OPENPAREN)||p.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=p.Node.createCallExpression(t,r,n,e.range(t.range.start,e.pos))}return t},t.prototype.skipStatement=function(e){for(e.peek(!0),e.nextTokenOnNewLine&&e.next();;){var t=e.peek(!0);if(t==o.Token.ENDOFFILE||t==o.Token.SEMICOLON){e.next();break}if(e.nextTokenOnNewLine)break;switch(e.next()){case o.Token.IDENTIFIER:e.readIdentifier();break;case o.Token.STRINGLITERAL:e.readString();break;case o.Token.INTEGERLITERAL:e.readInteger();break;case o.Token.FLOATLITERAL:e.readFloat()}}},t.prototype.skipBlock=function(e){var t=1,r=!0;do{switch(e.next()){case o.Token.ENDOFFILE:this.error(c.DiagnosticCode._0_expected,e.range(),"}"),r=!1;break;case o.Token.OPENBRACE:++t;break;case o.Token.CLOSEBRACE:--t||(r=!1);break;case o.Token.IDENTIFIER:e.readIdentifier();break;case o.Token.STRINGLITERAL:e.readString();break;case o.Token.INTEGERLITERAL:e.readInteger();break;case o.Token.FLOATLITERAL:e.readFloat()}}while(r)},t}(c.DiagnosticEmitter);function h(e){switch(e){case o.Token.COMMA:return 1;case o.Token.EQUALS:case o.Token.PLUS_EQUALS:case o.Token.MINUS_EQUALS:case o.Token.ASTERISK_ASTERISK_EQUALS:case o.Token.ASTERISK_EQUALS:case o.Token.SLASH_EQUALS:case o.Token.PERCENT_EQUALS:case o.Token.LESSTHAN_LESSTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.AMPERSAND_EQUALS:case o.Token.CARET_EQUALS:case o.Token.BAR_EQUALS:return 4;case o.Token.QUESTION:return 5;case o.Token.BAR_BAR:return 6;case o.Token.AMPERSAND_AMPERSAND:return 7;case o.Token.BAR:return 8;case o.Token.CARET:return 9;case o.Token.AMPERSAND:return 10;case o.Token.EQUALS_EQUALS:case o.Token.EXCLAMATION_EQUALS:case o.Token.EQUALS_EQUALS_EQUALS:case o.Token.EXCLAMATION_EQUALS_EQUALS:return 11;case o.Token.AS:case o.Token.IN:case o.Token.INSTANCEOF:case o.Token.LESSTHAN:case o.Token.GREATERTHAN:case o.Token.LESSTHAN_EQUALS:case o.Token.GREATERTHAN_EQUALS:return 12;case o.Token.LESSTHAN_LESSTHAN:case o.Token.GREATERTHAN_GREATERTHAN:case o.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:return 13;case o.Token.PLUS:case o.Token.MINUS:return 14;case o.Token.ASTERISK:case o.Token.SLASH:case o.Token.PERCENT:return 15;case o.Token.ASTERISK_ASTERISK:return 16;case o.Token.PLUS_PLUS:case o.Token.MINUS_MINUS:return 18;case o.Token.DOT:case o.Token.NEW:case o.Token.OPENBRACKET:case o.Token.EXCLAMATION:return 20}return 0}function _(e){switch(e){case o.Token.EQUALS:case o.Token.PLUS_EQUALS:case o.Token.MINUS_EQUALS:case o.Token.ASTERISK_ASTERISK_EQUALS:case o.Token.ASTERISK_EQUALS:case o.Token.SLASH_EQUALS:case o.Token.PERCENT_EQUALS:case o.Token.LESSTHAN_LESSTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.AMPERSAND_EQUALS:case o.Token.CARET_EQUALS:case o.Token.BAR_EQUALS:case o.Token.QUESTION:case o.Token.ASTERISK_ASTERISK:return!0;default:return!1}}t.Parser=u,function(e){e[e.NONE=0]="NONE",e[e.COMMA=1]="COMMA",e[e.SPREAD=2]="SPREAD",e[e.YIELD=3]="YIELD",e[e.ASSIGNMENT=4]="ASSIGNMENT",e[e.CONDITIONAL=5]="CONDITIONAL",e[e.LOGICAL_OR=6]="LOGICAL_OR",e[e.LOGICAL_AND=7]="LOGICAL_AND",e[e.BITWISE_OR=8]="BITWISE_OR",e[e.BITWISE_XOR=9]="BITWISE_XOR",e[e.BITWISE_AND=10]="BITWISE_AND",e[e.EQUALITY=11]="EQUALITY",e[e.RELATIONAL=12]="RELATIONAL",e[e.SHIFT=13]="SHIFT",e[e.ADDITIVE=14]="ADDITIVE",e[e.MULTIPLICATIVE=15]="MULTIPLICATIVE",e[e.EXPONENTIATED=16]="EXPONENTIATED",e[e.UNARY_PREFIX=17]="UNARY_PREFIX",e[e.UNARY_POSTFIX=18]="UNARY_POSTFIX",e[e.CALL=19]="CALL",e[e.MEMBERACCESS=20]="MEMBERACCESS",e[e.GROUPING=21]="GROUPING"}(t.Precedence||(t.Precedence={}))},function(e,t,r){r(16),e.exports=r(30)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),r(17),r(19),r(20),r(21);var n=r(3);n.Module.prototype.toText=function(){return binaryen.wrapModule(this.ref).emitStackIR()},n.Module.prototype.toAsmjs=function(){return binaryen.wrapModule(this.ref).emitAsmjs()}},function(e,t,r){(function(e){const t=e.Binaryen||r(18);for(var n in e.binaryen=t,t)(n.startsWith("_Binaryen")||n.startsWith("_Relooper"))&&(e[n]=t[n]);e.__memory_allocate=t._malloc,e.__memory_free=t._free,e.__memory_copy=t._memmove,e.__store=function(e,r){t.HEAPU8[e]=r},e.__load=function(e){return t.HEAPU8[e]}}).call(this,r(8))},function(t,r){t.exports=e},function(e,t,r){(function(e){var t="undefined"!=typeof window&&window||void 0!==e&&e||self;t.ASC_TARGET=0,t.ASC_NO_TREESHAKING=!1,t.ASC_NO_ASSERT=!1,t.ASC_MEMORY_BASE=0,t.ASC_OPTIMIZE_LEVEL=3,t.ASC_SHRINK_LEVEL=0,t.ASC_FEATURE_MUTABLE_GLOBAL=!1,t.ASC_FEATURE_SIGN_EXTENSION=!1,t.ASC_FEATURE_BULK_MEMORY=!1,t.ASC_FEATURE_SIMD=!1,t.ASC_FEATURE_THREADS=!1;var r=new Float64Array(1),n=new Uint32Array(r.buffer);function i(){Error.captureStackTrace?Error.captureStackTrace(this,i):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}function a(e){this.message=e||"assertion failed",Error.captureStackTrace?Error.captureStackTrace(this,a):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}Object.defineProperties(t.i8=function(e){return e<<24>>24},{MIN_VALUE:{value:-128,writable:!1},MAX_VALUE:{value:127,writable:!1}}),Object.defineProperties(t.i16=function(e){return e<<16>>16},{MIN_VALUE:{value:-32768,writable:!1},MAX_VALUE:{value:32767,writable:!1}}),Object.defineProperties(t.i32=t.isize=function(e){return 0|e},{MIN_VALUE:{value:-2147483648,writable:!1},MAX_VALUE:{value:2147483647,writable:!1}}),Object.defineProperties(t.u8=function(e){return 255&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:255,writable:!1}}),Object.defineProperties(t.u16=function(e){return 65535&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:65535,writable:!1}}),Object.defineProperties(t.u32=t.usize=function(e){return e>>>0},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:4294967295,writable:!1}}),Object.defineProperties(t.bool=function(e){return!!e},{MIN_VALUE:{value:!1,writable:!1},MAX_VALUE:{value:!0,writable:!1}}),Object.defineProperties(t.f32=function(e){return Math.fround(e)},{EPSILON:{value:Math.fround(1.1920929e-7),writable:!1},MIN_VALUE:{value:Math.fround(1.4012985e-45),writable:!1},MAX_VALUE:{value:Math.fround(3.4028235e38),writable:!1},MIN_NORMAL_VALUE:{value:Math.fround(1.17549435e-38),writable:!1},MIN_SAFE_INTEGER:{value:-16777215,writable:!1},MAX_SAFE_INTEGER:{value:16777215,writable:!1}}),Object.defineProperties(t.f64=function(e){return+e},{EPSILON:{value:2.220446049250313e-16,writable:!1},MIN_VALUE:{value:5e-324,writable:!1},MAX_VALUE:{value:1.7976931348623157e308,writable:!1},MIN_NORMAL_VALUE:{value:2.2250738585072014e-308,writable:!1},MIN_SAFE_INTEGER:{value:-9007199254740991,writable:!1},MAX_SAFE_INTEGER:{value:9007199254740991,writable:!1}}),t.clz=Math.clz32,t.ctz=function(e){var t=Math.clz32(e&-e);return e?31-t:t},t.popcnt=function(e){return 16843009*((e=(858993459&(e-=e>>>1&1431655765))+(e>>>2&858993459))+(e>>>4)&252645135)>>>24},t.rotl=function(e,t){return e<<(t&=31)|e>>>32-t},t.rotr=function(e,t){return e>>>(t&=31)|e<<32-t},t.abs=Math.abs,t.max=Math.max,t.min=Math.min,t.ceil=Math.ceil,t.floor=Math.floor,t.nearest=function(e){return.5===Math.abs(e-Math.trunc(e))?2*Math.round(.5*e):Math.round(e)},t.select=function(e,t,r){return r?e:t},t.sqrt=Math.sqrt,t.trunc=Math.trunc,t.copysign=function(e,t){return Math.abs(e)*Math.sign(t)},t.bswap=function(e){var t=e>>8&16711935,r=(16711935&e)<<8;return(t=(e=t|r)>>16&65535)|(r=(65535&e)<<16)},t.bswap16=function(e){return e<<8&65280|e>>8&255|4294901760&e},i.prototype=Object.create(Error.prototype),i.prototype.name="UnreachableError",i.prototype.message="unreachable",t.unreachable=function(){throw new i},a.prototype=Object.create(Error.prototype),a.prototype.name="AssertionError",t.assert=function(e,t){if(e)return e;throw new a(t)},t.changetype=function(e){return e},t.parseI32=function(e,t){return 0|parseInt(e,void 0)},String.fromCharCodes=function(e){return String.fromCharCode.apply(String,e)},String.fromCodePoints=function(e){return String.fromCodePoint.apply(String,e)},t.isInteger=Number.isInteger,t.isFloat=function(e){return"number"==typeof e},t.isReference=function(e){return"object"==typeof e||"string"==typeof e},t.isString=function(e){return"string"==typeof e||e instanceof String},t.isArray=Array.isArray,t.isDefined=function(e){return void 0!==e},t.isConstant=function(e){return!1},t.unchecked=function(e){return e},t.fmod=function(e,t){return e%t},t.fmodf=function(e,t){return Math.fround(e%t)},t.JSMath=Math,t.JSMath.signbit=function(e){return r[0]=e,Boolean(n[1]>>>31&e==e)},t.memory=(()=>{var e=new Uint8Array(0),r=0;return{allocate:t.__memory_allocate||function(t){if(!(t>>>=0))return 0;if(r+t>e.length){var n=e;(e=new Uint8Array(Math.max(65536,e.length+t,2*e.length))).set(n)}var i=r;return 7&(r+=t)&&(r=1+(7|r)),i},fill:t.__memory_fill||function(t,r,n){e.fill(r,t,t+n)},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)},reset:t.__memory_reset||function(){e=new Uint8Array(0),r=0}}})(),t.store=t.__store||function(e,t,r){HEAP[(0|e)+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[(0|e)+(0|t)]}}).call(this,r(8))},function(e,t,r){(function(e){const t=new Float64Array(1),r=new Float32Array(t.buffer),n=new Int32Array(t.buffer);e.f32_as_i32=function(e){return r[0]=e,n[0]},e.i32_as_f32=function(e){return n[0]=e,r[0]},e.f64_as_i64=function(e){return t[0]=e,i64_new(n[0],n[1])},e.i64_as_f64=function(e){return n[0]=i64_low(e),n[1]=i64_high(e),t[0]}}).call(this,r(8))},function(e,t,r){(function(e){const t=e.Long||r(22);e.i64_zero=t.ZERO,e.i64_one=t.ONE,e.i64_new=function(e,r){return t.fromBits(e,r)},e.i64_low=function(e){return e.low},e.i64_high=function(e){return e.high},e.i64_add=function(e,t){return e.add(t)},e.i64_sub=function(e,t){return e.sub(t)},e.i64_mul=function(e,t){return e.mul(t)},e.i64_div=function(e,t){return e.div(t)},e.i64_div_u=function(e,t){return e.toUnsigned().div(t.toUnsigned()).toSigned()},e.i64_rem=function(e,t){return e.mod(t)},e.i64_rem_u=function(e,t){return e.toUnsigned().mod(t.toUnsigned()).toSigned()},e.i64_and=function(e,t){return e.and(t)},e.i64_or=function(e,t){return e.or(t)},e.i64_xor=function(e,t){return e.xor(t)},e.i64_shl=function(e,t){return e.shl(t)},e.i64_shr=function(e,t){return e.shr(t)},e.i64_shr_u=function(e,t){return e.shru(t)},e.i64_not=function(e){return e.not()},e.i64_eq=function(e,t){return e.eq(t)},e.i64_ne=function(e,t){return e.ne(t)},e.i64_align=function(e,r){assert(r&&0==(r&r-1));var n=t.fromInt(r-1);return e.add(n).and(n.not())},e.i64_is_i8=function(e){return 0===e.high&&e.low>=0&&e.low<=i8.MAX_VALUE||-1===e.high&&e.low>=i8.MIN_VALUE&&e.low<0},e.i64_is_i16=function(e){return 0===e.high&&e.low>=0&&e.low<=i16.MAX_VALUE||-1===e.high&&e.low>=i16.MIN_VALUE&&e.low<0},e.i64_is_i32=function(e){return 0===e.high&&e.low>=0||-1===e.high&&e.low<0},e.i64_is_u8=function(e){return 0===e.high&&e.low>=0&&e.low<=u8.MAX_VALUE},e.i64_is_u16=function(e){return 0===e.high&&e.low>=0&&e.low<=u16.MAX_VALUE},e.i64_is_u32=function(e){return 0===e.high},e.i64_is_bool=function(e){return 0===e.high&&(0===e.low||1===e.low)};const n=t.fromNumber(f32.MIN_SAFE_INTEGER),i=t.fromNumber(f32.MAX_SAFE_INTEGER);e.i64_is_f32=function(e){return e.gte(n)&&e.lte(i)};const a=t.fromNumber(f64.MIN_SAFE_INTEGER),s=t.fromNumber(f64.MAX_SAFE_INTEGER);e.i64_is_f64=function(e){return e.gte(a)&&e.lte(s)},e.i64_to_f32=function(t){return e.Math.fround(t.toNumber())},e.i64_to_f64=function(e){return e.toNumber()},e.i64_to_string=function(e,t){return(t?e.toUnsigned():e).toString(10)}}).call(this,r(8))},function(e,t){e.exports=n;var r=null;try{r=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function n(e,t,r){this.low=0|e,this.high=0|t,this.unsigned=!!r}function i(e){return!0===(e&&e.__isLong__)}n.prototype.__isLong__,Object.defineProperty(n.prototype,"__isLong__",{value:!0}),n.isLong=i;var a={},s={};function o(e,t){var r,n,i;return t?(i=0<=(e>>>=0)&&e<256)&&(n=s[e])?n:(r=l(e,(0|e)<0?-1:0,!0),i&&(s[e]=r),r):(i=-128<=(e|=0)&&e<128)&&(n=a[e])?n:(r=l(e,e<0?-1:0,!1),i&&(a[e]=r),r)}function c(e,t){if(isNaN(e))return t?T:g;if(t){if(e<0)return T;if(e>=d)return A}else{if(e<=-y)return C;if(e+1>=y)return v}return e<0?c(-e,t).neg():l(e%_|0,e/_|0,t)}function l(e,t,r){return new n(e,t,r)}n.fromInt=o,n.fromNumber=c,n.fromBits=l;var p=Math.pow;function u(e,t,r){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return g;if("number"==typeof t?(r=t,t=!1):t=!!t,(r=r||10)<2||360)throw Error("interior hyphen");if(0===n)return u(e.substring(1),t,r).neg();for(var i=c(p(r,8)),a=g,s=0;s>>0:this.low},S.toNumber=function(){return this.unsigned?(this.high>>>0)*_+(this.low>>>0):this.high*_+(this.low>>>0)},S.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((a=o).isZero())return l+s;for(;l.length<6;)l="0"+l;s=""+l+s}},S.getHighBits=function(){return this.high},S.getHighBitsUnsigned=function(){return this.high>>>0},S.getLowBits=function(){return this.low},S.getLowBitsUnsigned=function(){return this.low>>>0},S.getNumBitsAbs=function(){if(this.isNegative())return this.eq(C)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<=0},S.isOdd=function(){return 1==(1&this.low)},S.isEven=function(){return 0==(1&this.low)},S.equals=function(e){return i(e)||(e=h(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},S.eq=S.equals,S.notEquals=function(e){return!this.eq(e)},S.neq=S.notEquals,S.ne=S.notEquals,S.lessThan=function(e){return this.comp(e)<0},S.lt=S.lessThan,S.lessThanOrEqual=function(e){return this.comp(e)<=0},S.lte=S.lessThanOrEqual,S.le=S.lessThanOrEqual,S.greaterThan=function(e){return this.comp(e)>0},S.gt=S.greaterThan,S.greaterThanOrEqual=function(e){return this.comp(e)>=0},S.gte=S.greaterThanOrEqual,S.ge=S.greaterThanOrEqual,S.compare=function(e){if(i(e)||(e=h(e)),this.eq(e))return 0;var t=this.isNegative(),r=e.isNegative();return t&&!r?-1:!t&&r?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},S.comp=S.compare,S.negate=function(){return!this.unsigned&&this.eq(C)?C:this.not().add(E)},S.neg=S.negate,S.add=function(e){i(e)||(e=h(e));var t=this.high>>>16,r=65535&this.high,n=this.low>>>16,a=65535&this.low,s=e.high>>>16,o=65535&e.high,c=e.low>>>16,p=0,u=0,_=0,d=0;return _+=(d+=a+(65535&e.low))>>>16,u+=(_+=n+c)>>>16,p+=(u+=r+o)>>>16,p+=t+s,l((_&=65535)<<16|(d&=65535),(p&=65535)<<16|(u&=65535),this.unsigned)},S.subtract=function(e){return i(e)||(e=h(e)),this.add(e.neg())},S.sub=S.subtract,S.multiply=function(e){if(this.isZero())return g;if(i(e)||(e=h(e)),r)return l(r.mul(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned);if(e.isZero())return g;if(this.eq(C))return e.isOdd()?C:g;if(e.eq(C))return this.isOdd()?C:g;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(m)&&e.lt(m))return c(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,n=65535&this.high,a=this.low>>>16,s=65535&this.low,o=e.high>>>16,p=65535&e.high,u=e.low>>>16,_=65535&e.low,d=0,y=0,T=0,E=0;return T+=(E+=s*_)>>>16,y+=(T+=a*_)>>>16,T&=65535,y+=(T+=s*u)>>>16,d+=(y+=n*_)>>>16,y&=65535,d+=(y+=a*u)>>>16,y&=65535,d+=(y+=s*p)>>>16,d+=t*_+n*u+a*p+s*o,l((T&=65535)<<16|(E&=65535),(d&=65535)<<16|(y&=65535),this.unsigned)},S.mul=S.multiply,S.divide=function(e){if(i(e)||(e=h(e)),e.isZero())throw Error("division by zero");var t,n,a;if(r)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?l((this.unsigned?r.div_u:r.div_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?T:g;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return T;if(e.gt(this.shru(1)))return f;a=T}else{if(this.eq(C))return e.eq(E)||e.eq(I)?C:e.eq(C)?E:(t=this.shr(1).div(e).shl(1)).eq(g)?e.isNegative()?E:I:(n=this.sub(e.mul(t)),a=t.add(n.div(e)));if(e.eq(C))return this.unsigned?T:g;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();a=g}for(n=this;n.gte(e);){t=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var s=Math.ceil(Math.log(t)/Math.LN2),o=s<=48?1:p(2,s-48),u=c(t),_=u.mul(e);_.isNegative()||_.gt(n);)_=(u=c(t-=o,this.unsigned)).mul(e);u.isZero()&&(u=E),a=a.add(u),n=n.sub(_)}return a},S.div=S.divide,S.modulo=function(e){return i(e)||(e=h(e)),r?l((this.unsigned?r.rem_u:r.rem_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},S.mod=S.modulo,S.rem=S.modulo,S.not=function(){return l(~this.low,~this.high,this.unsigned)},S.and=function(e){return i(e)||(e=h(e)),l(this.low&e.low,this.high&e.high,this.unsigned)},S.or=function(e){return i(e)||(e=h(e)),l(this.low|e.low,this.high|e.high,this.unsigned)},S.xor=function(e){return i(e)||(e=h(e)),l(this.low^e.low,this.high^e.high,this.unsigned)},S.shiftLeft=function(e){return i(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?l(this.low<>>32-e,this.unsigned):l(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):l(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},S.shr=S.shiftRight,S.shiftRightUnsigned=function(e){if(i(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?l(this.low>>>e|t<<32-e,t>>>e,this.unsigned):l(32===e?t:t>>>e-32,0,this.unsigned)},S.shru=S.shiftRightUnsigned,S.shr_u=S.shiftRightUnsigned,S.toSigned=function(){return this.unsigned?l(this.low,this.high,!1):this},S.toUnsigned=function(){return this.unsigned?this:l(this.low,this.high,!0)},S.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},S.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},S.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},n.fromBytes=function(e,t,r){return r?n.fromBytesLE(e,t):n.fromBytesBE(e,t)},n.fromBytesLE=function(e,t){return new n(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},n.fromBytesBE=function(e,t){return new n(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},function(e,t,r){"use strict";var n=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i=r(2),a=r(4),s=r(7),o=r(3),c=r(5),l=r(11),p=r(1);function u(e,t,r,n,p,u){var m,g,T,E,f=e.module;switch(t.internalName){case"isInteger":var I=_(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(4)&&!I.is(256)?f.createI32(1):f.createI32(0):f.createUnreachable();case"isFloat":I=_(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(8)?f.createI32(1):f.createI32(0):f.createUnreachable();case"isSigned":I=_(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(1)?f.createI32(1):f.createI32(0):f.createUnreachable();case"isReference":I=_(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(256)?f.createI32(1):f.createI32(0):f.createUnreachable();case"isString":I=_(e,r,n,u);if(e.currentType=s.Type.bool,!I)return f.createUnreachable();if(U=I.classReference){var v=e.program.stringInstance;if(v&&U.isAssignableTo(v))return f.createI32(1)}return f.createI32(0);case"isArray":I=_(e,r,n,u);return e.currentType=s.Type.bool,I?null!==(U=I.classReference)&&U.prototype.extends(e.program.arrayPrototype)?f.createI32(1):f.createI32(0):f.createUnreachable();case"isDefined":if(e.currentType=s.Type.bool,r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),1!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();var A=e.resolver.resolveExpression(n[0],e.currentFlow,s.Type.void,l.ReportMode.SWALLOW);return f.createI32(A?1:0);case"isConstant":if(e.currentType=s.Type.bool,r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),1!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();var C=e.compileExpressionRetainType(n[0],s.Type.i32,0);return e.currentType=s.Type.bool,f.createI32(o.getExpressionId(C)==o.ExpressionId.Const?1:0);case"isManaged":if(!e.program.hasGC)return e.currentType=s.Type.bool,f.createI32(0);I=_(e,r,n,u);return e.currentType=s.Type.bool,I?null===(U=I.classReference)||U.hasDecorator(c.DecoratorFlags.UNMANAGED)?f.createI32(0):f.createI32(1):f.createUnreachable();case"clz":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=f.createUnary(o.UnaryOp.ClzI32,m);break;case 10:case 2:case 7:E=f.createUnary(o.UnaryOp.ClzI32,m);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}case 4:E=f.createUnary(e.options.isWasm64?o.UnaryOp.ClzI64:o.UnaryOp.ClzI32,m);break;case 3:case 8:E=f.createUnary(o.UnaryOp.ClzI64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"ctz":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],0,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=f.createUnary(o.UnaryOp.CtzI32,m);break;case 10:case 2:case 7:E=f.createUnary(o.UnaryOp.CtzI32,m);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}case 4:E=f.createUnary(e.options.isWasm64?o.UnaryOp.CtzI64:o.UnaryOp.CtzI32,m);break;case 3:case 8:E=f.createUnary(o.UnaryOp.CtzI64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"popcnt":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=f.createUnary(o.UnaryOp.PopcntI32,m);break;case 10:case 2:case 7:E=f.createUnary(o.UnaryOp.PopcntI32,m);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}case 4:E=f.createUnary(e.options.isWasm64?o.UnaryOp.PopcntI64:o.UnaryOp.PopcntI32,m);break;case 3:case 8:E=f.createUnary(o.UnaryOp.PopcntI64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"rotl":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(g=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:E=e.ensureSmallIntegerWrap(f.createBinary(o.BinaryOp.RotlI32,m,g),e.currentType);case 2:case 7:E=f.createBinary(o.BinaryOp.RotlI32,m,g);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}case 4:E=f.createBinary(e.options.isWasm64?o.BinaryOp.RotlI64:o.BinaryOp.RotlI32,m,g);break;case 3:case 8:E=f.createBinary(o.BinaryOp.RotlI64,m,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"rotr":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(g=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:E=e.ensureSmallIntegerWrap(f.createBinary(o.BinaryOp.RotrI32,m,g),e.currentType);break;case 2:case 7:E=f.createBinary(o.BinaryOp.RotrI32,m,g);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}case 4:E=f.createBinary(e.options.isWasm64?o.BinaryOp.RotrI64:o.BinaryOp.RotrI32,m,g);break;case 3:case 8:E=f.createBinary(o.BinaryOp.RotrI64,m,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"abs":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.f64,0,1);switch(e.currentType.kind){case 0:case 1:case 2:var S=(b=e.currentFlow).getTempLocal(s.Type.i32,!1),N=b.getAndFreeTempLocal(s.Type.i32,!1).index,O=S.index;E=f.createBinary(o.BinaryOp.XorI32,f.createBinary(o.BinaryOp.AddI32,f.createTeeLocal(N,f.createBinary(o.BinaryOp.ShrI32,f.createTeeLocal(O,m),f.createI32(31))),f.createGetLocal(O,o.NativeType.I32)),f.createGetLocal(N,o.NativeType.I32)),b.freeTempLocal(S);break;case 4:var x=e.options,b=e.currentFlow,L=x.isWasm64;S=b.getTempLocal(x.usizeType,!1),N=b.getAndFreeTempLocal(x.usizeType,!1).index,O=S.index;E=f.createBinary(L?o.BinaryOp.XorI64:o.BinaryOp.XorI32,f.createBinary(L?o.BinaryOp.AddI64:o.BinaryOp.AddI32,f.createTeeLocal(N,f.createBinary(L?o.BinaryOp.ShrI64:o.BinaryOp.ShrI32,f.createTeeLocal(O,m),L?f.createI64(63):f.createI32(31))),f.createGetLocal(O,x.nativeSizeType)),f.createGetLocal(N,x.nativeSizeType)),b.freeTempLocal(S);break;case 3:S=(b=e.currentFlow).getTempLocal(s.Type.i64,!1),N=b.getAndFreeTempLocal(s.Type.i64,!1).index,O=S.index;E=f.createBinary(o.BinaryOp.XorI64,f.createBinary(o.BinaryOp.AddI64,f.createTeeLocal(N,f.createBinary(o.BinaryOp.ShrI64,f.createTeeLocal(O,m),f.createI64(63))),f.createGetLocal(O,o.NativeType.I64)),f.createGetLocal(N,o.NativeType.I64)),b.freeTempLocal(S);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}case 5:case 6:case 7:case 8:case 10:E=m;break;case 11:E=f.createUnary(o.UnaryOp.AbsF32,m);break;case 12:E=f.createUnary(o.UnaryOp.AbsF64,m);break;case 14:E=f.createUnreachable();break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"max":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.f64,0,1);switch(g=e.compileExpression(n[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:var k=(b=e.currentFlow).getTempLocal(e.currentType,!b.canOverflow(m,e.currentType));S=b.getAndFreeTempLocal(e.currentType,!b.canOverflow(g,e.currentType));b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.GtI32,f.createGetLocal(k.index,o.NativeType.I32),f.createGetLocal(S.index,o.NativeType.I32)));break;case 5:case 6:case 7:case 10:k=(b=e.currentFlow).getTempLocal(e.currentType,!b.canOverflow(m,e.currentType)),S=b.getAndFreeTempLocal(e.currentType,!b.canOverflow(g,e.currentType));b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.GtU32,f.createGetLocal(k.index,o.NativeType.I32),f.createGetLocal(S.index,o.NativeType.I32)));break;case 3:k=(b=e.currentFlow).getTempLocal(s.Type.i64,!1),S=b.getAndFreeTempLocal(s.Type.i64,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.GtI64,f.createGetLocal(k.index,o.NativeType.I64),f.createGetLocal(S.index,o.NativeType.I64)));break;case 8:k=(b=e.currentFlow).getTempLocal(s.Type.i64,!1),S=b.getAndFreeTempLocal(s.Type.i64,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.GtU64,f.createGetLocal(k.index,o.NativeType.I64),f.createGetLocal(S.index,o.NativeType.I64)));break;case 4:k=(b=e.currentFlow).getTempLocal(e.options.usizeType,!1),S=b.getAndFreeTempLocal(e.options.usizeType,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,f.createGetLocal(k.index,e.options.nativeSizeType),f.createGetLocal(S.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}k=(b=e.currentFlow).getTempLocal(e.options.usizeType,!1),S=b.getAndFreeTempLocal(e.options.usizeType,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,f.createGetLocal(k.index,e.options.nativeSizeType),f.createGetLocal(S.index,e.options.nativeSizeType)));break;case 11:E=f.createBinary(o.BinaryOp.MaxF32,m,g);break;case 12:E=f.createBinary(o.BinaryOp.MaxF64,m,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"min":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.f64,0,1);switch(g=e.compileExpression(n[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:k=(b=e.currentFlow).getTempLocal(e.currentType,!b.canOverflow(m,e.currentType)),S=b.getAndFreeTempLocal(e.currentType,!b.canOverflow(g,e.currentType));b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.LtI32,f.createGetLocal(k.index,o.NativeType.I32),f.createGetLocal(S.index,o.NativeType.I32)));break;case 5:case 6:case 7:case 10:k=(b=e.currentFlow).getTempLocal(e.currentType,!b.canOverflow(m,e.currentType)),S=b.getAndFreeTempLocal(e.currentType,!b.canOverflow(g,e.currentType));b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.LtU32,f.createGetLocal(k.index,o.NativeType.I32),f.createGetLocal(S.index,o.NativeType.I32)));break;case 3:k=(b=e.currentFlow).getTempLocal(s.Type.i64,!1),S=b.getAndFreeTempLocal(s.Type.i64,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.LtI64,f.createGetLocal(k.index,o.NativeType.I64),f.createGetLocal(S.index,o.NativeType.I64)));break;case 8:k=(b=e.currentFlow).getTempLocal(s.Type.i64,!1),S=b.getAndFreeTempLocal(s.Type.i64,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.LtU64,f.createGetLocal(k.index,o.NativeType.I64),f.createGetLocal(S.index,o.NativeType.I64)));break;case 4:k=(b=e.currentFlow).getTempLocal(e.options.usizeType,!1),S=b.getAndFreeTempLocal(e.options.usizeType,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,f.createGetLocal(k.index,e.options.nativeSizeType),f.createGetLocal(S.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}k=(b=e.currentFlow).getTempLocal(e.options.usizeType,!1),S=b.getAndFreeTempLocal(e.options.usizeType,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,f.createGetLocal(k.index,e.options.nativeSizeType),f.createGetLocal(S.index,e.options.nativeSizeType)));break;case 11:E=f.createBinary(o.BinaryOp.MinF32,m,g);break;case 12:E=f.createBinary(o.BinaryOp.MinF64,m,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"ceil":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}default:E=m;break;case 11:E=f.createUnary(o.UnaryOp.CeilF32,m);break;case 12:E=f.createUnary(o.UnaryOp.CeilF64,m);break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"floor":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}default:E=m;break;case 11:E=f.createUnary(o.UnaryOp.FloorF32,m);break;case 12:E=f.createUnary(o.UnaryOp.FloorF64,m);break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"copysign":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(g=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 11:E=f.createBinary(o.BinaryOp.CopysignF32,m,g);break;case 12:E=f.createBinary(o.BinaryOp.CopysignF64,m,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"nearest":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}default:E=m;break;case 11:E=f.createUnary(o.UnaryOp.NearestF32,m);break;case 12:E=f.createUnary(o.UnaryOp.NearestF64,m);break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"reinterpret":if(1!=n.length)return r&&1==r.length||(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0")),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(!r||1!=r.length)return r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable();switch(r[0].kind){case 2:case 7:m=e.compileExpression(n[0],s.Type.f32,1,0),E=f.createUnary(o.UnaryOp.ReinterpretF32,m);break;case 3:case 8:m=e.compileExpression(n[0],s.Type.f64,1,0),E=f.createUnary(o.UnaryOp.ReinterpretF64,m);break;case 9:if(r[0].is(256))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),e.currentType=r[0],f.createUnreachable();case 4:m=e.compileExpression(n[0],e.options.isWasm64?s.Type.f64:s.Type.f32,1,0),E=f.createUnary(e.options.isWasm64?o.UnaryOp.ReinterpretF64:o.UnaryOp.ReinterpretF32,m);break;case 11:m=e.compileExpression(n[0],s.Type.i32,1,0),E=f.createUnary(o.UnaryOp.ReinterpretI32,m);break;case 12:m=e.compileExpression(n[0],s.Type.i64,1,0),E=f.createUnary(o.UnaryOp.ReinterpretI64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return e.currentType=r[0],E;case"sqrt":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 11:E=f.createUnary(o.UnaryOp.SqrtF32,m);break;case 12:E=f.createUnary(o.UnaryOp.SqrtF64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"trunc":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r&&r.length){if(e.currentType=r[0],1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}default:E=m;break;case 11:E=f.createUnary(o.UnaryOp.TruncF32,m);break;case 12:E=f.createUnary(o.UnaryOp.TruncF64,m);break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"load":return n.length<1||n.length>2?(r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<1?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable()):r&&1==r.length?(m=e.compileExpression(n[0],e.options.usizeType,1,0),(P=2==n.length?d(e,n[1]):0)<0?f.createUnreachable():(e.currentType=r[0],f.createLoad(r[0].byteSize,r[0].is(5),m,r[0].is(4)&&p.is(4)&&p.size>r[0].size?(e.currentType=p).toNativeType():(e.currentType=r[0]).toNativeType(),P))):(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable());case"store":if(e.currentType=s.Type.void,n.length<2||n.length>3)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"2",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),f.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable();m=e.compileExpression(n[0],e.options.usizeType,1,0),g=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);I=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size2?(r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<1?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable()):r&&1==r.length?(m=e.compileExpression(n[0],e.options.usizeType,1,0),(P=2==n.length?d(e,n[1]):0)<0?f.createUnreachable():(e.currentType=r[0],f.createAtomicLoad(r[0].byteSize,m,r[0].is(4)&&p.is(4)&&p.size>r[0].size?(e.currentType=p).toNativeType():(e.currentType=r[0]).toNativeType(),P))):(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable());case"atomic.store":if(!e.options.hasFeature(16))break;if(e.currentType=s.Type.void,n.length<2||n.length>3)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"2",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),f.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable();m=e.compileExpression(n[0],e.options.usizeType,1,0),g=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);I=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size3)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"2",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),f.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable();m=e.compileExpression(n[0],e.options.usizeType,1,0),g=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);I=void 0;if(r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size4)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<3?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"2",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),f.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable();m=e.compileExpression(n[0],e.options.usizeType,1,0),g=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0),T=e.compileExpression(n[2],r[0],r[0].is(4)?0:1,0);I=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size1)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable();var U;if(!(U=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),f.createUnreachable();var P=void 0;if(n.length){if(n[0].kind!=a.NodeKind.LITERAL||n[0].literalKind!=a.LiteralKind.STRING)return e.error(i.DiagnosticCode.String_literal_expected,n[0].range),f.createUnreachable();var w=n[0].value,M=U.members?U.members.get(w):null;if(!M||M.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,U.internalName,w),f.createUnreachable();P=M.memoryOffset}else P=U.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,f.createI32(P)):f.createI64(P):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,f.createI64(P)):f.createI32(P);case"select":if(3!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpressionRetainType(n[0],s.Type.i32,0);I=e.currentType;switch(g=e.compileExpression(n[1],I,1,0),T=e.makeIsTrueish(e.compileExpressionRetainType(n[2],s.Type.bool,0),e.currentType),e.currentType=I,e.currentType.kind){case 0:case 1:case 5:case 6:case 10:default:E=f.createSelect(m,g,T);break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"unreachable":return 0!=n.length&&e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"0",n.length.toString(10)),r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),f.createUnreachable();case"memory.size":return e.currentType=s.Type.i32,0!=n.length&&e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"0",n.length.toString(10)),r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),f.createHost(o.HostOp.CurrentMemory);case"memory.grow":return e.currentType=s.Type.i32,1!=n.length?(e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"0",n.length.toString(10)),m=f.createUnreachable()):m=e.compileExpression(n[0],s.Type.i32,1,0),r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),f.createHost(o.HostOp.GrowMemory,null,[m]);case"memory.copy":if(!e.options.hasFeature(4)){var G=e.resolver.resolveFunction(t,null);return e.currentType=s.Type.void,G?e.compileCallDirect(G,n,u):f.createUnreachable()}if(r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),3!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),e.currentType=s.Type.void,f.createUnreachable();var V=e.options.usizeType;return m=e.compileExpression(n[0],V,1,0),g=e.compileExpression(n[1],V,1,0),T=e.compileExpression(n[2],V,1,0),e.currentType=s.Type.void,f.createMemoryCopy(m,g,T);case"memory.fill":if(!e.options.hasFeature(4)){G=e.resolver.resolveFunction(t,null);return e.currentType=s.Type.void,G?e.compileCallDirect(G,n,u):f.createUnreachable()}if(r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),3!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),e.currentType=s.Type.void,f.createUnreachable();V=e.options.usizeType;return m=e.compileExpression(n[0],V,1,0),g=e.compileExpression(n[1],s.Type.u32,1,0),T=e.compileExpression(n[2],V,1,0),e.currentType=s.Type.void,f.createMemoryFill(m,g,T);case"changetype":return r&&1==r.length?1!=n.length?(e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),e.currentType=r[0],f.createUnreachable()):(m=e.compileExpressionRetainType(n[0],r[0],0),e.currentType=r[0],e.currentType.size!=r[0].size?(e.error(i.DiagnosticCode.Operation_not_supported,u.range),f.createUnreachable()):m):(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable());case"assert":if(n.length<1||n.length>2)return r&&(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),n.length<1?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)):n.length>2&&e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable();if(r){if(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpressionRetainType(n[0],s.Type.bool,1);I=e.currentType;if(e.currentType=I.nonNullableType,e.options.noAssert)return p==s.Type.void?(e.currentType=s.Type.void,f.createNop()):m;var K=y(e,2==n.length?n[1]:null,u);if(e.currentType=I.nonNullableType,p==s.Type.void){switch(e.currentType.kind){default:E=f.createIf(f.createUnary(o.UnaryOp.EqzI32,m),K);break;case 3:case 8:E=f.createIf(f.createUnary(o.UnaryOp.EqzI64,m),K);break;case 4:case 9:E=f.createIf(f.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,m),K);break;case 11:E=f.createIf(f.createBinary(o.BinaryOp.EqF32,m,f.createF32(0)),K);break;case 12:E=f.createIf(f.createBinary(o.BinaryOp.EqF64,m,f.createF64(0)),K);break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=K}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:var z=(b=e.currentFlow).getAndFreeTempLocal(e.currentType,!b.canOverflow(m,e.currentType));E=f.createIf(f.createTeeLocal(z.index,m),f.createGetLocal(z.index,o.NativeType.I32),K);break;case 2:case 7:default:z=e.currentFlow.getAndFreeTempLocal(s.Type.i32,!1);E=f.createIf(f.createTeeLocal(z.index,m),f.createGetLocal(z.index,o.NativeType.I32),K);break;case 3:case 8:z=e.currentFlow.getAndFreeTempLocal(s.Type.i64,!1);E=f.createIf(f.createUnary(o.UnaryOp.EqzI64,f.createTeeLocal(z.index,m)),K,f.createGetLocal(z.index,o.NativeType.I64));break;case 4:case 9:z=e.currentFlow.getAndFreeTempLocal(e.options.usizeType,!1);E=f.createIf(f.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,f.createTeeLocal(z.index,m)),K,f.createGetLocal(z.index,e.options.nativeSizeType));break;case 11:z=e.currentFlow.getAndFreeTempLocal(s.Type.f32,!1);E=f.createIf(f.createBinary(o.BinaryOp.EqF32,f.createTeeLocal(z.index,m),f.createF32(0)),K,f.createGetLocal(z.index,o.NativeType.F32));break;case 12:z=e.currentFlow.getAndFreeTempLocal(s.Type.f64,!1);E=f.createIf(f.createBinary(o.BinaryOp.EqF64,f.createTeeLocal(z.index,m),f.createF64(0)),K,f.createGetLocal(z.index,o.NativeType.F64));break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=K}return E;case"unchecked":return r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),1!=n.length?(e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable()):((b=e.currentFlow).set(8192),E=e.compileExpressionRetainType(n[0],p,0),b.unset(8192),E);case"call_indirect":if(n.length<1)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();var H=void 0;if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();H=r[0]}else H=p;if(m=e.compileExpressionRetainType(n[0],s.Type.u32,0),7!=e.currentType.kind)return e.error(i.DiagnosticCode.Operation_not_supported,n[0].range),f.createUnreachable();for(var X=n.length-1,W=new Array(X),Y=new Array(X+1),Q=H.toNativeType(),q=new Array(X),j=0;j void"),f.createUnreachable())}var ne=function(e,t,r,n,i){switch(t.internalName){case"i32.clz":return h("clz",e,s.Type.i32,r,s.Type.i32,i);case"i64.clz":return h("clz",e,s.Type.i64,r,s.Type.i64,i);case"i32.ctz":return h("ctz",e,s.Type.i32,r,s.Type.i32,i);case"i64.ctz":return h("ctz",e,s.Type.i64,r,s.Type.i64,i);case"i32.popcnt":return h("popcnt",e,s.Type.i32,r,s.Type.i32,i);case"i64.popcnt":return h("popcnt",e,s.Type.i64,r,s.Type.i64,i);case"i32.rotl":return h("rotl",e,s.Type.i32,r,s.Type.i32,i);case"i64.rotl":return h("rotl",e,s.Type.i64,r,s.Type.i64,i);case"i32.rotr":return h("rotr",e,s.Type.i32,r,s.Type.i32,i);case"i64.rotr":return h("rotr",e,s.Type.i64,r,s.Type.i64,i);case"f32.abs":return h("abs",e,s.Type.f32,r,s.Type.f32,i);case"f64.abs":return h("abs",e,s.Type.f64,r,s.Type.f64,i);case"f32.max":return h("max",e,s.Type.f32,r,s.Type.f32,i);case"f64.max":return h("max",e,s.Type.f64,r,s.Type.f64,i);case"f32.min":return h("min",e,s.Type.f32,r,s.Type.f32,i);case"f64.min":return h("min",e,s.Type.f64,r,s.Type.f64,i);case"f32.ceil":return h("ceil",e,s.Type.f32,r,s.Type.f32,i);case"f64.ceil":return h("ceil",e,s.Type.f64,r,s.Type.f64,i);case"f32.floor":return h("floor",e,s.Type.f32,r,s.Type.f32,i);case"f64.floor":return h("floor",e,s.Type.f64,r,s.Type.f64,i);case"f32.copysign":return h("copysign",e,s.Type.f32,r,s.Type.f32,i);case"f64.copysign":return h("copysign",e,s.Type.f64,r,s.Type.f64,i);case"f32.nearest":return h("nearest",e,s.Type.f32,r,s.Type.f32,i);case"f64.nearest":return h("nearest",e,s.Type.f64,r,s.Type.f64,i);case"i32.reinterpret_f32":return h("reinterpret",e,s.Type.i32,r,s.Type.f32,i);case"i64.reinterpret_f64":return h("reinterpret",e,s.Type.i64,r,s.Type.f64,i);case"f32.reinterpret_i32":return h("reinterpret",e,s.Type.f32,r,s.Type.i32,i);case"f64.reinterpret_i64":return h("reinterpret",e,s.Type.f64,r,s.Type.i64,i);case"f32.sqrt":return h("sqrt",e,s.Type.f32,r,s.Type.f32,i);case"f64.sqrt":return h("sqrt",e,s.Type.f64,r,s.Type.f64,i);case"f32.trunc":return h("trunc",e,s.Type.f32,r,s.Type.f32,i);case"f64.trunc":return h("trunc",e,s.Type.f64,r,s.Type.f64,i);case"i32.load8_s":return h("load",e,s.Type.i8,r,s.Type.i32,i);case"i32.load8_u":return h("load",e,s.Type.u8,r,s.Type.u32,i);case"i32.load16_s":return h("load",e,s.Type.i16,r,s.Type.i32,i);case"i32.load16_u":return h("load",e,s.Type.u16,r,s.Type.u32,i);case"i32.load":return h("load",e,s.Type.i32,r,s.Type.i32,i);case"i64.load8_s":return h("load",e,s.Type.i8,r,s.Type.i64,i);case"i64.load8_u":return h("load",e,s.Type.u8,r,s.Type.u64,i);case"i64.load16_s":return h("load",e,s.Type.i16,r,s.Type.i64,i);case"i64.load16_u":return h("load",e,s.Type.u16,r,s.Type.u64,i);case"i64.load32_s":return h("load",e,s.Type.i32,r,s.Type.i64,i);case"i64.load32_u":return h("load",e,s.Type.u32,r,s.Type.u64,i);case"i64.load":return h("load",e,s.Type.i64,r,s.Type.i64,i);case"f32.load":return h("load",e,s.Type.f32,r,s.Type.f32,i);case"f64.load":return h("load",e,s.Type.f64,r,s.Type.f64,i);case"i32.store8":return h("store",e,s.Type.i8,r,s.Type.i32,i);case"i32.store16":return h("store",e,s.Type.i16,r,s.Type.i32,i);case"i32.store":return h("store",e,s.Type.i32,r,s.Type.i32,i);case"i64.store8":return h("store",e,s.Type.i8,r,s.Type.i64,i);case"i64.store16":return h("store",e,s.Type.i16,r,s.Type.i64,i);case"i64.store32":return h("store",e,s.Type.i32,r,s.Type.i64,i);case"i64.store":return h("store",e,s.Type.i64,r,s.Type.i64,i);case"f32.store":return h("store",e,s.Type.f32,r,s.Type.f32,i);case"f64.store":return h("store",e,s.Type.f64,r,s.Type.f64,i)}if(e.options.hasFeature(16))switch(t.internalName){case"i32.atomic.load8_u":return h("atomic.load",e,s.Type.u8,r,s.Type.u32,i);case"i32.atomic.load16_u":return h("atomic.load",e,s.Type.u16,r,s.Type.u32,i);case"i32.atomic.load":return h("atomic.load",e,s.Type.i32,r,s.Type.i32,i);case"i64.atomic.load8_u":return h("atomic.load",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.load16_u":return h("atomic.load",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.load32_u":return h("atomic.load",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.load":return h("atomic.load",e,s.Type.i64,r,s.Type.i64,i);case"i32.atomic.store8":return h("atomic.store",e,s.Type.i8,r,s.Type.i32,i);case"i32.atomic.store16":return h("atomic.store",e,s.Type.i16,r,s.Type.i32,i);case"i32.atomic.store":return h("atomic.store",e,s.Type.i32,r,s.Type.i32,i);case"i64.atomic.store8":return h("atomic.store",e,s.Type.i8,r,s.Type.i64,i);case"i64.atomic.store16":return h("atomic.store",e,s.Type.i16,r,s.Type.i64,i);case"i64.atomic.store32":return h("atomic.store",e,s.Type.i32,r,s.Type.i64,i);case"i64.atomic.store":return h("atomic.store",e,s.Type.i64,r,s.Type.i64,i);case"i32.atomic.rmw8_u.add":return h("atomic.add",e,s.Type.u8,r,s.Type.u32,i);case"i32.atomic.rmw16_u.add":return h("atomic.add",e,s.Type.u16,r,s.Type.u32,i);case"i32.atomic.rmw.add":return h("atomic.add",e,s.Type.u32,r,s.Type.u32,i);case"i64.atomic.rmw8_u.add":return h("atomic.add",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.add":return h("atomic.add",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.add":return h("atomic.add",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.add":return h("atomic.add",e,s.Type.u64,r,s.Type.u64,i);case"i32.atomic.rmw8_u.sub":return h("atomic.sub",e,s.Type.u8,r,s.Type.u32,i);case"i32.atomic.rmw16_u.sub":return h("atomic.sub",e,s.Type.u16,r,s.Type.u32,i);case"i32.atomic.rmw.sub":return h("atomic.sub",e,s.Type.u32,r,s.Type.u32,i);case"i64.atomic.rmw8_u.sub":return h("atomic.sub",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.sub":return h("atomic.sub",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.sub":return h("atomic.sub",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.sub":return h("atomic.sub",e,s.Type.u64,r,s.Type.u64,i);case"i32.atomic.rmw8_u.and":return h("atomic.and",e,s.Type.u8,r,s.Type.u32,i);case"i32.atomic.rmw16_u.and":return h("atomic.and",e,s.Type.u16,r,s.Type.u32,i);case"i32.atomic.rmw.and":return h("atomic.and",e,s.Type.u32,r,s.Type.u32,i);case"i64.atomic.rmw8_u.and":return h("atomic.and",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.and":return h("atomic.and",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.and":return h("atomic.and",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.and":return h("atomic.and",e,s.Type.u64,r,s.Type.u64,i);case"i32.atomic.rmw8_u.or":return h("atomic.or",e,s.Type.u8,r,s.Type.u32,i);case"i32.atomic.rmw16_u.or":return h("atomic.or",e,s.Type.u16,r,s.Type.u32,i);case"i32.atomic.rmw.or":return h("atomic.or",e,s.Type.u32,r,s.Type.u32,i);case"i64.atomic.rmw8_u.or":return h("atomic.or",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.or":return h("atomic.or",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.or":return h("atomic.or",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.or":return h("atomic.or",e,s.Type.u64,r,s.Type.u64,i);case"i32.atomic.rmw8_u.xor":case"i32.atomic.rmw16_u.xor":case"i32.atomic.rmw.xor":return h("atomic.xor",e,s.Type.u8,r,s.Type.u32,i);case"i64.atomic.rmw8_u.xor":return h("atomic.xor",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.xor":return h("atomic.xor",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.xor":return h("atomic.xor",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.xor":return h("atomic.xor",e,s.Type.u64,r,s.Type.u64,i);case"i32.atomic.rmw8_u.xchg":case"i32.atomic.rmw16_u.xchg":case"i32.atomic.rmw.xchg":return h("atomic.xchg",e,s.Type.u8,r,s.Type.u32,i);case"i64.atomic.rmw8_u.xchg":return h("atomic.xchg",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.xchg":return h("atomic.xchg",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.xchg":return h("atomic.xchg",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.xchg":return h("atomic.xchg",e,s.Type.u64,r,s.Type.u64,i);case"i32.atomic.rmw8_u.cmpxchg":case"i32.atomic.rmw16_u.cmpxchg":case"i32.atomic.rmw.cmpxchg":return h("atomic.cmpxchg",e,s.Type.u8,r,s.Type.u32,i);case"i64.atomic.rmw8_u.cmpxchg":return h("atomic.cmpxchg",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.cmpxchg":return h("atomic.cmpxchg",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.cmpxchg":return h("atomic.cmpxchg",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.cmpxchg":return h("atomic.cmpxchg",e,s.Type.u64,r,s.Type.u64,i);case"i32.wait":return h("atomic.wait",e,s.Type.i32,r,s.Type.u32,i);case"i64.wait":return h("atomic.wait",e,s.Type.i64,r,s.Type.i64,i);case"i32.notify":return h("atomic.notify",e,s.Type.i32,r,s.Type.u32,i);case"i64.notify":return h("atomic.notify",e,s.Type.i64,r,s.Type.i64,i)}return 0}(e,t,n,0,u);return ne?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),ne):(e.error(i.DiagnosticCode.Cannot_find_name_0,u.expression.range,t.internalName),f.createUnreachable())}function h(e,t,r,n,i,a){var s=e.split("."),o=assert(t.program.elementsLookup.get(s[0]));if(s.length>1)for(var l=1;l1&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t.length.toString(10)),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"1",r.length.toString(10)),null}function d(e,t){var r,n;return e.options.isWasm64?(r=e.precomputeExpression(t,s.Type.usize64,1,0),(o.getExpressionId(r)!=o.ExpressionId.Const||o.getExpressionType(r)!=o.NativeType.I64||0!=o.getConstValueI64High(r)||(n=o.getConstValueI64Low(r))<0)&&(e.error(i.DiagnosticCode.Operation_not_supported,t.range),n=-1)):(r=e.precomputeExpression(t,s.Type.usize32,1,0),(o.getExpressionId(r)!=o.ExpressionId.Const||o.getExpressionType(r)!=o.NativeType.I32||(n=o.getConstValueI32(r))<0)&&(e.error(i.DiagnosticCode.Operation_not_supported,t.range),n=-1)),n}function y(e,t,r){var n=e.program,i=e.module,a=n.typesLookup.get("string");if(!a)return i.createUnreachable();var c=n.abortInstance;if(!c||!e.compileFunction(c))return i.createUnreachable();var l=null!=t?e.compileExpression(t,a,1,0):a.toNativeZero(i),p=e.ensureStaticString(r.range.source.normalizedPath);return e.currentType=s.Type.void,i.createBlock(null,[i.createCall(c.internalName,[l,p,i.createI32(r.range.line),i.createI32(r.range.column)],o.NativeType.None),i.createUnreachable()])}t.compileCall=u,t.compileAbort=y,t.compileIterateRoots=function(e){var t,r,i=e.module,a=new Array;try{for(var l=n(e.program.elementsLookup.values()),u=l.next();!u.done;u=l.next()){var h=u.value;if(h.kind==c.ElementKind.GLOBAL){var _=h,d=_.type.classReference;if(_.is(p.CommonFlags.COMPILED)&&null!==d&&!d.hasDecorator(c.DecoratorFlags.UNMANAGED))if(_.is(p.CommonFlags.INLINED)){var y=_.constantIntegerValue;a.push(i.createCallIndirect(i.createGetLocal(0,o.NativeType.I32),[e.options.isWasm64?i.createI64(i64_low(y),i64_high(y)):i.createI32(i64_low(y))],"i_"))}else a.push(i.createCallIndirect(i.createGetLocal(0,o.NativeType.I32),[i.createGetGlobal(_.internalName,e.options.nativeSizeType)],"i_"))}}}catch(e){t={error:e}}finally{try{u&&!u.done&&(r=l.return)&&r.call(l)}finally{if(t)throw t.error}}var m=e.ensureFunctionType([s.Type.i32],s.Type.void);i.addFunction("~iterateRoots",m,[],a.length?i.createBlock(null,a):i.createNop())},t.ensureGCHook=function e(t,r){var i,a,l=t.program;assert(r.type.isManaged(l));var u=r.gcHookIndex;if(-1!=u)return u;var h=r.members;if(r.prototype.declaration.range.source.isLibrary&&null!==h&&h.has("__gc")){var _=assert(h.get("__gc"));assert(_.kind==c.ElementKind.FUNCTION_PROTOTYPE);var d=assert(l.resolver.resolveFunction(_,null));assert(d.is(p.CommonFlags.PRIVATE|p.CommonFlags.INSTANCE)),assert(!d.isAny(p.CommonFlags.AMBIENT|p.CommonFlags.VIRTUAL)),assert(0==d.signature.parameterTypes.length),assert(d.signature.returnType==s.Type.void),d.internalName=r.internalName+"~gc",assert(t.compileFunction(d));var y=t.ensureFunctionTableEntry(d);return r.gcHookIndex=y,y}var m=t.module,g=t.options,T=g.nativeSizeType,E=g.usizeType.byteSize,f=new Array;f.push(m.createIf(m.createUnary(g.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,m.createGetLocal(0,T)),m.createReturn()));var I=t.functionTable,v=I.length;I.push(""),r.gcHookIndex=v;var A=r.base;if(A?(assert(A.type.isManaged(l)),f.push(m.createCallIndirect(m.createI32(e(t,A.type.classReference)),[m.createGetLocal(0,T)],T==o.NativeType.I64?"I_":"i_"))):f.push(m.createCall(assert(l.gcMarkInstance).internalName,[m.createGetLocal(0,T)],o.NativeType.None)),h)try{for(var C=n(h.values()),S=C.next();!S.done;S=C.next()){var N=S.value;if(N.kind==c.ElementKind.FIELD&&N.parent===r&&N.type.isManaged(l)){var O=N.memoryOffset;assert(O>=0),f.push(m.createCall(assert(l.gcMarkInstance).internalName,[m.createLoad(E,!1,m.createGetLocal(0,T),T,O)],o.NativeType.None))}}}catch(e){i={error:e}}finally{try{S&&!S.done&&(a=C.return)&&a.call(C)}finally{if(i)throw i.error}}var x=r.internalName+"~gc";return m.addFunction(x,t.ensureFunctionType(null,s.Type.void,g.usizeType),null,m.createBlock(null,f)),I[v]=x,v}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.bitsetIs=function(e,t){return assert(t>=0&&t<64),i64_ne(i64_and(e,i64_shl(i64_one,i64_new(t))),i64_zero)},t.bitsetSet=function(e,t,r){return assert(t>=0&&t<64),r?i64_or(e,i64_shl(i64_one,i64_new(t))):i64_and(e,i64_not(i64_shl(i64_one,i64_new(t))))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NULL=0]="NULL",e[e.LINEFEED=10]="LINEFEED",e[e.CARRIAGERETURN=13]="CARRIAGERETURN",e[e.LINESEPARATOR=8232]="LINESEPARATOR",e[e.PARAGRAPHSEPARATOR=8233]="PARAGRAPHSEPARATOR",e[e.NEXTLINE=133]="NEXTLINE",e[e.SPACE=32]="SPACE",e[e.NONBREAKINGSPACE=160]="NONBREAKINGSPACE",e[e.ENQUAD=8192]="ENQUAD",e[e.EMQUAD=8193]="EMQUAD",e[e.ENSPACE=8194]="ENSPACE",e[e.EMSPACE=8195]="EMSPACE",e[e.THREEPEREMSPACE=8196]="THREEPEREMSPACE",e[e.FOURPEREMSPACE=8197]="FOURPEREMSPACE",e[e.SIXPEREMSPACE=8198]="SIXPEREMSPACE",e[e.FIGURESPACE=8199]="FIGURESPACE",e[e.PUNCTUATIONSPACE=8200]="PUNCTUATIONSPACE",e[e.THINSPACE=8201]="THINSPACE",e[e.HAIRSPACE=8202]="HAIRSPACE",e[e.ZEROWIDTHSPACE=8203]="ZEROWIDTHSPACE",e[e.NARROWNOBREAKSPACE=8239]="NARROWNOBREAKSPACE",e[e.IDEOGRAPHICSPACE=12288]="IDEOGRAPHICSPACE",e[e.MATHEMATICALSPACE=8287]="MATHEMATICALSPACE",e[e.OGHAM=5760]="OGHAM",e[e._=95]="_",e[e._0=48]="_0",e[e._1=49]="_1",e[e._2=50]="_2",e[e._3=51]="_3",e[e._4=52]="_4",e[e._5=53]="_5",e[e._6=54]="_6",e[e._7=55]="_7",e[e._8=56]="_8",e[e._9=57]="_9",e[e.a=97]="a",e[e.b=98]="b",e[e.c=99]="c",e[e.d=100]="d",e[e.e=101]="e",e[e.f=102]="f",e[e.g=103]="g",e[e.h=104]="h",e[e.i=105]="i",e[e.j=106]="j",e[e.k=107]="k",e[e.l=108]="l",e[e.m=109]="m",e[e.n=110]="n",e[e.o=111]="o",e[e.p=112]="p",e[e.q=113]="q",e[e.r=114]="r",e[e.s=115]="s",e[e.t=116]="t",e[e.u=117]="u",e[e.v=118]="v",e[e.w=119]="w",e[e.x=120]="x",e[e.y=121]="y",e[e.z=122]="z",e[e.A=65]="A",e[e.B=66]="B",e[e.C=67]="C",e[e.D=68]="D",e[e.E=69]="E",e[e.F=70]="F",e[e.G=71]="G",e[e.H=72]="H",e[e.I=73]="I",e[e.J=74]="J",e[e.K=75]="K",e[e.L=76]="L",e[e.M=77]="M",e[e.N=78]="N",e[e.O=79]="O",e[e.P=80]="P",e[e.Q=81]="Q",e[e.R=82]="R",e[e.S=83]="S",e[e.T=84]="T",e[e.U=85]="U",e[e.V=86]="V",e[e.W=87]="W",e[e.X=88]="X",e[e.Y=89]="Y",e[e.Z=90]="Z",e[e.AMPERSAND=38]="AMPERSAND",e[e.ASTERISK=42]="ASTERISK",e[e.AT=64]="AT",e[e.BACKSLASH=92]="BACKSLASH",e[e.BACKTICK=96]="BACKTICK",e[e.BAR=124]="BAR",e[e.CARET=94]="CARET",e[e.CLOSEBRACE=125]="CLOSEBRACE",e[e.CLOSEBRACKET=93]="CLOSEBRACKET",e[e.CLOSEPAREN=41]="CLOSEPAREN",e[e.COLON=58]="COLON",e[e.COMMA=44]="COMMA",e[e.DOLLAR=36]="DOLLAR",e[e.DOT=46]="DOT",e[e.DOUBLEQUOTE=34]="DOUBLEQUOTE",e[e.EQUALS=61]="EQUALS",e[e.EXCLAMATION=33]="EXCLAMATION",e[e.GREATERTHAN=62]="GREATERTHAN",e[e.HASH=35]="HASH",e[e.LESSTHAN=60]="LESSTHAN",e[e.MINUS=45]="MINUS",e[e.OPENBRACE=123]="OPENBRACE",e[e.OPENBRACKET=91]="OPENBRACKET",e[e.OPENPAREN=40]="OPENPAREN",e[e.PERCENT=37]="PERCENT",e[e.PLUS=43]="PLUS",e[e.QUESTION=63]="QUESTION",e[e.SEMICOLON=59]="SEMICOLON",e[e.SINGLEQUOTE=39]="SINGLEQUOTE",e[e.SLASH=47]="SLASH",e[e.TILDE=126]="TILDE",e[e.BACKSPACE=8]="BACKSPACE",e[e.FORMFEED=12]="FORMFEED",e[e.BYTEORDERMARK=65279]="BYTEORDERMARK",e[e.TAB=9]="TAB",e[e.VERTICALTAB=11]="VERTICALTAB"}(t.CharCode||(t.CharCode={})),t.isLineBreak=function(e){switch(e){case 10:case 13:case 8232:case 8233:return!0;default:return!1}},t.isWhiteSpace=function(e){switch(e){case 32:case 9:case 11:case 12:case 160:case 133:case 5760:case 8239:case 8287:case 12288:case 65279:return!0;default:return e>=8192&&e<=8203}},t.isDecimalDigit=function(e){return e>=48&&e<=57},t.isOctalDigit=function(e){return e>=48&&e<=55},t.isIdentifierStart=function(e){return e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>127&&!((t=e)<0||t>65535)&&a(t,n);var t},t.isKeywordCharacter=function(e){return e>=97&&e<=122},t.isIdentifierPart=function(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||36==e||95==e||e>127&&!((t=e)<0||t>65535)&&a(t,i);var t};var n=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,880,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1162,1319,1329,1366,1369,1369,1377,1415,1488,1514,1520,1522,1568,1610,1646,1647,1649,1747,1749,1749,1765,1766,1774,1775,1786,1788,1791,1791,1808,1808,1810,1839,1869,1957,1969,1969,1994,2026,2036,2037,2042,2042,2048,2069,2074,2074,2084,2084,2088,2088,2112,2136,2208,2208,2210,2220,2308,2361,2365,2365,2384,2384,2392,2401,2417,2423,2425,2431,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2493,2493,2510,2510,2524,2525,2527,2529,2544,2545,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2649,2652,2654,2654,2674,2676,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2749,2749,2768,2768,2784,2785,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2877,2877,2908,2909,2911,2913,2929,2929,2947,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3024,3024,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3133,3160,3161,3168,3169,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3261,3261,3294,3294,3296,3297,3313,3314,3333,3340,3342,3344,3346,3386,3389,3389,3406,3406,3424,3425,3450,3455,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3585,3632,3634,3635,3648,3654,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3760,3762,3763,3773,3773,3776,3780,3782,3782,3804,3807,3840,3840,3904,3911,3913,3948,3976,3980,4096,4138,4159,4159,4176,4181,4186,4189,4193,4193,4197,4198,4206,4208,4213,4225,4238,4238,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5905,5920,5937,5952,5969,5984,5996,5998,6e3,6016,6067,6103,6103,6108,6108,6176,6263,6272,6312,6314,6314,6320,6389,6400,6428,6480,6509,6512,6516,6528,6571,6593,6599,6656,6678,6688,6740,6823,6823,6917,6963,6981,6987,7043,7072,7086,7087,7098,7141,7168,7203,7245,7247,7258,7293,7401,7404,7406,7409,7413,7414,7424,7615,7680,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8305,8305,8319,8319,8336,8348,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11502,11506,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11648,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11823,11823,12293,12295,12321,12329,12337,12341,12344,12348,12353,12438,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42527,42538,42539,42560,42606,42623,42647,42656,42735,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43009,43011,43013,43015,43018,43020,43042,43072,43123,43138,43187,43250,43255,43259,43259,43274,43301,43312,43334,43360,43388,43396,43442,43471,43471,43520,43560,43584,43586,43588,43595,43616,43638,43642,43642,43648,43695,43697,43697,43701,43702,43705,43709,43712,43712,43714,43714,43739,43741,43744,43754,43762,43764,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44002,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64285,64287,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65136,65140,65142,65276,65313,65338,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500],i=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,768,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1155,1159,1162,1319,1329,1366,1369,1369,1377,1415,1425,1469,1471,1471,1473,1474,1476,1477,1479,1479,1488,1514,1520,1522,1552,1562,1568,1641,1646,1747,1749,1756,1759,1768,1770,1788,1791,1791,1808,1866,1869,1969,1984,2037,2042,2042,2048,2093,2112,2139,2208,2208,2210,2220,2276,2302,2304,2403,2406,2415,2417,2423,2425,2431,2433,2435,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2492,2500,2503,2504,2507,2510,2519,2519,2524,2525,2527,2531,2534,2545,2561,2563,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2620,2620,2622,2626,2631,2632,2635,2637,2641,2641,2649,2652,2654,2654,2662,2677,2689,2691,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2748,2757,2759,2761,2763,2765,2768,2768,2784,2787,2790,2799,2817,2819,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2876,2884,2887,2888,2891,2893,2902,2903,2908,2909,2911,2915,2918,2927,2929,2929,2946,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3006,3010,3014,3016,3018,3021,3024,3024,3031,3031,3046,3055,3073,3075,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3140,3142,3144,3146,3149,3157,3158,3160,3161,3168,3171,3174,3183,3202,3203,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3260,3268,3270,3272,3274,3277,3285,3286,3294,3294,3296,3299,3302,3311,3313,3314,3330,3331,3333,3340,3342,3344,3346,3386,3389,3396,3398,3400,3402,3406,3415,3415,3424,3427,3430,3439,3450,3455,3458,3459,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3530,3530,3535,3540,3542,3542,3544,3551,3570,3571,3585,3642,3648,3662,3664,3673,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3769,3771,3773,3776,3780,3782,3782,3784,3789,3792,3801,3804,3807,3840,3840,3864,3865,3872,3881,3893,3893,3895,3895,3897,3897,3902,3911,3913,3948,3953,3972,3974,3991,3993,4028,4038,4038,4096,4169,4176,4253,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4957,4959,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5908,5920,5940,5952,5971,5984,5996,5998,6e3,6002,6003,6016,6099,6103,6103,6108,6109,6112,6121,6155,6157,6160,6169,6176,6263,6272,6314,6320,6389,6400,6428,6432,6443,6448,6459,6470,6509,6512,6516,6528,6571,6576,6601,6608,6617,6656,6683,6688,6750,6752,6780,6783,6793,6800,6809,6823,6823,6912,6987,6992,7001,7019,7027,7040,7155,7168,7223,7232,7241,7245,7293,7376,7378,7380,7414,7424,7654,7676,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8204,8205,8255,8256,8276,8276,8305,8305,8319,8319,8336,8348,8400,8412,8417,8417,8421,8432,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11647,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11744,11775,11823,11823,12293,12295,12321,12335,12337,12341,12344,12348,12353,12438,12441,12442,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42539,42560,42607,42612,42621,42623,42647,42655,42737,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43047,43072,43123,43136,43204,43216,43225,43232,43255,43259,43259,43264,43309,43312,43347,43360,43388,43392,43456,43471,43481,43520,43574,43584,43597,43600,43609,43616,43638,43642,43643,43648,43714,43739,43741,43744,43759,43762,43766,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44010,44012,44013,44016,44025,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65024,65039,65056,65062,65075,65076,65101,65103,65136,65140,65142,65276,65296,65305,65313,65338,65343,65343,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500];function a(e,t){if(e=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},i=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0}),t.makeArray=function(e){if(void 0===e&&(e=null),e){for(var t=new Array(e.length),r=0,n=e.length;r0||i=0;)if(e.charCodeAt(a)==n){r-a==3&&46==e.charCodeAt(a+1)&&46==e.charCodeAt(a+2)||(e=t?e.substring(0,a):e.substring(0,a)+e.substring(r+3),i-=r+3-a,r=a-1);break}if(a<0&&r>0&&(2!=r||46!=e.charCodeAt(0)||46!=e.charCodeAt(1))){i=(e=e.substring(r+4)).length;continue}}}r++}return i>0?e:"."}function a(e){for(var t=e.length;--t>0;)if(e.charCodeAt(t)==n)return e.substring(0,t);return"."}t.normalizePath=i,t.resolvePath=function(e,t){return e.startsWith("std/")?e:i(a(t)+String.fromCharCode(n)+e)},t.dirname=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=" ",i=" ",a=" ";t.indent=function(e,t){for(;t>=4;)e.push(a),t-=4;t>=2&&(e.push(i),t-=2),t&&e.push(n)}},function(e,t,r){"use strict";function n(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function i(e,t,r){t[r]=e,t[r+1]=e>>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function a(e,t){var r=n(e,t),i=n(e,t+4);return i64_new(r,i)}Object.defineProperty(t,"__esModule",{value:!0}),t.readI8=function(e,t){return e[t]},t.writeI8=function(e,t,r){t[r]=e},t.readI16=function(e,t){return e[t]|e[t+1]<<8},t.writeI16=function(e,t,r){t[r]=e,t[r+1]=e>>>8},t.readI32=n,t.writeI32=i,t.readI64=a,t.writeI64=function(e,t,r){i(i64_low(e),t,r),i(i64_high(e),t,r+4)},t.readF32=function(e,t){return i32_as_f32(n(e,t))},t.writeF32=function(e,t,r){i(f32_as_i32(e),t,r)},t.readF64=function(e,t){return i64_as_f64(a(e,t))},t.writeF64=function(e,t,r){var n=f64_as_i64(e);i(i64_low(n),t,r),i(i64_high(n),t,r+4)}},function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(9),a=r(12),s=r(13),o=r(2);t.formatDiagnostic=o.formatDiagnosticMessage;var c=r(14);t.parseFile=function(e,t,r,n){return void 0===r&&(r=!1),void 0===n&&(n=null),n||(n=new c.Parser),n.parseFile(e,t,r),n},t.nextFile=function(e){return e.nextFile()},t.nextDiagnostic=function(e){var t=e.program;return t.diagnosticsOffset0&&!a.isLineBreak(n.charCodeAt(s-1));)s--;for(;o=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i,a,s=r(9);!function(e){e[e.None=_BinaryenTypeNone()]="None",e[e.I32=_BinaryenTypeInt32()]="I32",e[e.I64=_BinaryenTypeInt64()]="I64",e[e.F32=_BinaryenTypeFloat32()]="F32",e[e.F64=_BinaryenTypeFloat64()]="F64",e[e.V128=_BinaryenTypeVec128()]="V128",e[e.Unreachable=_BinaryenTypeUnreachable()]="Unreachable",e[e.Auto=_BinaryenTypeAuto()]="Auto"}(i=t.NativeType||(t.NativeType={})),function(e){e[e.Invalid=_BinaryenInvalidId()]="Invalid",e[e.Block=_BinaryenBlockId()]="Block",e[e.If=_BinaryenIfId()]="If",e[e.Loop=_BinaryenLoopId()]="Loop",e[e.Break=_BinaryenBreakId()]="Break",e[e.Switch=_BinaryenSwitchId()]="Switch",e[e.Call=_BinaryenCallId()]="Call",e[e.CallIndirect=_BinaryenCallIndirectId()]="CallIndirect",e[e.GetLocal=_BinaryenGetLocalId()]="GetLocal",e[e.SetLocal=_BinaryenSetLocalId()]="SetLocal",e[e.GetGlobal=_BinaryenGetGlobalId()]="GetGlobal",e[e.SetGlobal=_BinaryenSetGlobalId()]="SetGlobal",e[e.Load=_BinaryenLoadId()]="Load",e[e.Store=_BinaryenStoreId()]="Store",e[e.Const=_BinaryenConstId()]="Const",e[e.Unary=_BinaryenUnaryId()]="Unary",e[e.Binary=_BinaryenBinaryId()]="Binary",e[e.Select=_BinaryenSelectId()]="Select",e[e.Drop=_BinaryenDropId()]="Drop",e[e.Return=_BinaryenReturnId()]="Return",e[e.Host=_BinaryenHostId()]="Host",e[e.Nop=_BinaryenNopId()]="Nop",e[e.Unreachable=_BinaryenUnreachableId()]="Unreachable",e[e.AtomicCmpxchg=_BinaryenAtomicCmpxchgId()]="AtomicCmpxchg",e[e.AtomicRMW=_BinaryenAtomicRMWId()]="AtomicRMW",e[e.AtomicWait=_BinaryenAtomicWaitId()]="AtomicWait",e[e.AtomicWake=_BinaryenAtomicWakeId()]="AtomicWake",e[e.SIMDExtract=_BinaryenSIMDExtractId()]="SIMDExtract",e[e.SIMDReplace=_BinaryenSIMDReplaceId()]="SIMDReplace",e[e.SIMDShuffle=_BinaryenSIMDShuffleId()]="SIMDShuffle",e[e.SIMDBitselect=_BinaryenSIMDBitselectId()]="SIMDBitselect",e[e.SIMDShift=_BinaryenSIMDShiftId()]="SIMDShift",e[e.MemoryInit=_BinaryenMemoryInitId()]="MemoryInit",e[e.DataDrop=_BinaryenDataDropId()]="DataDrop",e[e.MemoryCopy=_BinaryenMemoryCopyId()]="MemoryCopy",e[e.MemoryFill=_BinaryenMemoryFillId()]="MemoryFill"}(a=t.ExpressionId||(t.ExpressionId={})),function(e){e[e.ClzI32=_BinaryenClzInt32()]="ClzI32",e[e.CtzI32=_BinaryenCtzInt32()]="CtzI32",e[e.PopcntI32=_BinaryenPopcntInt32()]="PopcntI32",e[e.NegF32=_BinaryenNegFloat32()]="NegF32",e[e.AbsF32=_BinaryenAbsFloat32()]="AbsF32",e[e.CeilF32=_BinaryenCeilFloat32()]="CeilF32",e[e.FloorF32=_BinaryenFloorFloat32()]="FloorF32",e[e.TruncF32=_BinaryenTruncFloat32()]="TruncF32",e[e.NearestF32=_BinaryenNearestFloat32()]="NearestF32",e[e.SqrtF32=_BinaryenSqrtFloat32()]="SqrtF32",e[e.EqzI32=_BinaryenEqZInt32()]="EqzI32",e[e.ClzI64=_BinaryenClzInt64()]="ClzI64",e[e.CtzI64=_BinaryenCtzInt64()]="CtzI64",e[e.PopcntI64=_BinaryenPopcntInt64()]="PopcntI64",e[e.NegF64=_BinaryenNegFloat64()]="NegF64",e[e.AbsF64=_BinaryenAbsFloat64()]="AbsF64",e[e.CeilF64=_BinaryenCeilFloat64()]="CeilF64",e[e.FloorF64=_BinaryenFloorFloat64()]="FloorF64",e[e.TruncF64=_BinaryenTruncFloat64()]="TruncF64",e[e.NearestF64=_BinaryenNearestFloat64()]="NearestF64",e[e.SqrtF64=_BinaryenSqrtFloat64()]="SqrtF64",e[e.EqzI64=_BinaryenEqZInt64()]="EqzI64",e[e.ExtendI32=_BinaryenExtendSInt32()]="ExtendI32",e[e.ExtendU32=_BinaryenExtendUInt32()]="ExtendU32",e[e.WrapI64=_BinaryenWrapInt64()]="WrapI64",e[e.TruncF32ToI32=_BinaryenTruncSFloat32ToInt32()]="TruncF32ToI32",e[e.TruncF32ToI64=_BinaryenTruncSFloat32ToInt64()]="TruncF32ToI64",e[e.TruncF32ToU32=_BinaryenTruncUFloat32ToInt32()]="TruncF32ToU32",e[e.TruncF32ToU64=_BinaryenTruncUFloat32ToInt64()]="TruncF32ToU64",e[e.TruncF64ToI32=_BinaryenTruncSFloat64ToInt32()]="TruncF64ToI32",e[e.TruncF64ToI64=_BinaryenTruncSFloat64ToInt64()]="TruncF64ToI64",e[e.TruncF64ToU32=_BinaryenTruncUFloat64ToInt32()]="TruncF64ToU32",e[e.TruncF64ToU64=_BinaryenTruncUFloat64ToInt64()]="TruncF64ToU64",e[e.ReinterpretF32=_BinaryenReinterpretFloat32()]="ReinterpretF32",e[e.ReinterpretF64=_BinaryenReinterpretFloat64()]="ReinterpretF64",e[e.ConvertI32ToF32=_BinaryenConvertSInt32ToFloat32()]="ConvertI32ToF32",e[e.ConvertI32ToF64=_BinaryenConvertSInt32ToFloat64()]="ConvertI32ToF64",e[e.ConvertU32ToF32=_BinaryenConvertUInt32ToFloat32()]="ConvertU32ToF32",e[e.ConvertU32ToF64=_BinaryenConvertUInt32ToFloat64()]="ConvertU32ToF64",e[e.ConvertI64ToF32=_BinaryenConvertSInt64ToFloat32()]="ConvertI64ToF32",e[e.ConvertI64ToF64=_BinaryenConvertSInt64ToFloat64()]="ConvertI64ToF64",e[e.ConvertU64ToF32=_BinaryenConvertUInt64ToFloat32()]="ConvertU64ToF32",e[e.ConvertU64ToF64=_BinaryenConvertUInt64ToFloat64()]="ConvertU64ToF64",e[e.PromoteF32=_BinaryenPromoteFloat32()]="PromoteF32",e[e.DemoteF64=_BinaryenDemoteFloat64()]="DemoteF64",e[e.ReinterpretI32=_BinaryenReinterpretInt32()]="ReinterpretI32",e[e.ReinterpretI64=_BinaryenReinterpretInt64()]="ReinterpretI64",e[e.ExtendI8ToI32=_BinaryenExtendS8Int32()]="ExtendI8ToI32",e[e.ExtendI16ToI32=_BinaryenExtendS16Int32()]="ExtendI16ToI32",e[e.ExtendI8ToI64=_BinaryenExtendS8Int64()]="ExtendI8ToI64",e[e.ExtendI16ToI64=_BinaryenExtendS16Int64()]="ExtendI16ToI64",e[e.ExtendI32ToI64=_BinaryenExtendS32Int64()]="ExtendI32ToI64"}(t.UnaryOp||(t.UnaryOp={})),function(e){e[e.AddI32=_BinaryenAddInt32()]="AddI32",e[e.SubI32=_BinaryenSubInt32()]="SubI32",e[e.MulI32=_BinaryenMulInt32()]="MulI32",e[e.DivI32=_BinaryenDivSInt32()]="DivI32",e[e.DivU32=_BinaryenDivUInt32()]="DivU32",e[e.RemI32=_BinaryenRemSInt32()]="RemI32",e[e.RemU32=_BinaryenRemUInt32()]="RemU32",e[e.AndI32=_BinaryenAndInt32()]="AndI32",e[e.OrI32=_BinaryenOrInt32()]="OrI32",e[e.XorI32=_BinaryenXorInt32()]="XorI32",e[e.ShlI32=_BinaryenShlInt32()]="ShlI32",e[e.ShrU32=_BinaryenShrUInt32()]="ShrU32",e[e.ShrI32=_BinaryenShrSInt32()]="ShrI32",e[e.RotlI32=_BinaryenRotLInt32()]="RotlI32",e[e.RotrI32=_BinaryenRotRInt32()]="RotrI32",e[e.EqI32=_BinaryenEqInt32()]="EqI32",e[e.NeI32=_BinaryenNeInt32()]="NeI32",e[e.LtI32=_BinaryenLtSInt32()]="LtI32",e[e.LtU32=_BinaryenLtUInt32()]="LtU32",e[e.LeI32=_BinaryenLeSInt32()]="LeI32",e[e.LeU32=_BinaryenLeUInt32()]="LeU32",e[e.GtI32=_BinaryenGtSInt32()]="GtI32",e[e.GtU32=_BinaryenGtUInt32()]="GtU32",e[e.GeI32=_BinaryenGeSInt32()]="GeI32",e[e.GeU32=_BinaryenGeUInt32()]="GeU32",e[e.AddI64=_BinaryenAddInt64()]="AddI64",e[e.SubI64=_BinaryenSubInt64()]="SubI64",e[e.MulI64=_BinaryenMulInt64()]="MulI64",e[e.DivI64=_BinaryenDivSInt64()]="DivI64",e[e.DivU64=_BinaryenDivUInt64()]="DivU64",e[e.RemI64=_BinaryenRemSInt64()]="RemI64",e[e.RemU64=_BinaryenRemUInt64()]="RemU64",e[e.AndI64=_BinaryenAndInt64()]="AndI64",e[e.OrI64=_BinaryenOrInt64()]="OrI64",e[e.XorI64=_BinaryenXorInt64()]="XorI64",e[e.ShlI64=_BinaryenShlInt64()]="ShlI64",e[e.ShrU64=_BinaryenShrUInt64()]="ShrU64",e[e.ShrI64=_BinaryenShrSInt64()]="ShrI64",e[e.RotlI64=_BinaryenRotLInt64()]="RotlI64",e[e.RotrI64=_BinaryenRotRInt64()]="RotrI64",e[e.EqI64=_BinaryenEqInt64()]="EqI64",e[e.NeI64=_BinaryenNeInt64()]="NeI64",e[e.LtI64=_BinaryenLtSInt64()]="LtI64",e[e.LtU64=_BinaryenLtUInt64()]="LtU64",e[e.LeI64=_BinaryenLeSInt64()]="LeI64",e[e.LeU64=_BinaryenLeUInt64()]="LeU64",e[e.GtI64=_BinaryenGtSInt64()]="GtI64",e[e.GtU64=_BinaryenGtUInt64()]="GtU64",e[e.GeI64=_BinaryenGeSInt64()]="GeI64",e[e.GeU64=_BinaryenGeUInt64()]="GeU64",e[e.AddF32=_BinaryenAddFloat32()]="AddF32",e[e.SubF32=_BinaryenSubFloat32()]="SubF32",e[e.MulF32=_BinaryenMulFloat32()]="MulF32",e[e.DivF32=_BinaryenDivFloat32()]="DivF32",e[e.CopysignF32=_BinaryenCopySignFloat32()]="CopysignF32",e[e.MinF32=_BinaryenMinFloat32()]="MinF32",e[e.MaxF32=_BinaryenMaxFloat32()]="MaxF32",e[e.EqF32=_BinaryenEqFloat32()]="EqF32",e[e.NeF32=_BinaryenNeFloat32()]="NeF32",e[e.LtF32=_BinaryenLtFloat32()]="LtF32",e[e.LeF32=_BinaryenLeFloat32()]="LeF32",e[e.GtF32=_BinaryenGtFloat32()]="GtF32",e[e.GeF32=_BinaryenGeFloat32()]="GeF32",e[e.AddF64=_BinaryenAddFloat64()]="AddF64",e[e.SubF64=_BinaryenSubFloat64()]="SubF64",e[e.MulF64=_BinaryenMulFloat64()]="MulF64",e[e.DivF64=_BinaryenDivFloat64()]="DivF64",e[e.CopysignF64=_BinaryenCopySignFloat64()]="CopysignF64",e[e.MinF64=_BinaryenMinFloat64()]="MinF64",e[e.MaxF64=_BinaryenMaxFloat64()]="MaxF64",e[e.EqF64=_BinaryenEqFloat64()]="EqF64",e[e.NeF64=_BinaryenNeFloat64()]="NeF64",e[e.LtF64=_BinaryenLtFloat64()]="LtF64",e[e.LeF64=_BinaryenLeFloat64()]="LeF64",e[e.GtF64=_BinaryenGtFloat64()]="GtF64",e[e.GeF64=_BinaryenGeFloat64()]="GeF64"}(t.BinaryOp||(t.BinaryOp={})),function(e){e[e.CurrentMemory=_BinaryenCurrentMemory()]="CurrentMemory",e[e.GrowMemory=_BinaryenGrowMemory()]="GrowMemory"}(t.HostOp||(t.HostOp={})),function(e){e[e.Add=_BinaryenAtomicRMWAdd()]="Add",e[e.Sub=_BinaryenAtomicRMWSub()]="Sub",e[e.And=_BinaryenAtomicRMWAnd()]="And",e[e.Or=_BinaryenAtomicRMWOr()]="Or",e[e.Xor=_BinaryenAtomicRMWXor()]="Xor",e[e.Xchg=_BinaryenAtomicRMWXchg()]="Xchg"}(t.AtomicRMWOp||(t.AtomicRMWOp={})),function(e){e[e.SplatVecI8x16=_BinaryenSplatVecI8x16()]="SplatVecI8x16",e[e.SplatVecI16x8=_BinaryenSplatVecI16x8()]="SplatVecI16x8",e[e.SplatVecI32x4=_BinaryenSplatVecI32x4()]="SplatVecI32x4",e[e.SplatVecI64x2=_BinaryenSplatVecI64x2()]="SplatVecI64x2",e[e.SplatVecF32x4=_BinaryenSplatVecF32x4()]="SplatVecF32x4",e[e.SplatVecF64x2=_BinaryenSplatVecF64x2()]="SplatVecF64x2",e[e.NotVec128=_BinaryenNotVec128()]="NotVec128",e[e.NegVecI8x16=_BinaryenNegVecI8x16()]="NegVecI8x16",e[e.AnyTrueVecI8x16=_BinaryenAnyTrueVecI8x16()]="AnyTrueVecI8x16",e[e.AllTrueVecI8x16=_BinaryenAllTrueVecI8x16()]="AllTrueVecI8x16",e[e.NegVecI16x8=_BinaryenNegVecI16x8()]="NegVecI16x8",e[e.AnyTrueVecI16x8=_BinaryenAnyTrueVecI16x8()]="AnyTrueVecI16x8",e[e.AllTrueVecI16x8=_BinaryenAllTrueVecI16x8()]="AllTrueVecI16x8",e[e.NegVecI32x4=_BinaryenNegVecI32x4()]="NegVecI32x4",e[e.AnyTrueVecI32x4=_BinaryenAnyTrueVecI32x4()]="AnyTrueVecI32x4",e[e.AllTrueVecI32x4=_BinaryenAllTrueVecI32x4()]="AllTrueVecI32x4",e[e.NegVecI64x2=_BinaryenNegVecI64x2()]="NegVecI64x2",e[e.AnyTrueVecI64x2=_BinaryenAnyTrueVecI64x2()]="AnyTrueVecI64x2",e[e.AllTrueVecI64x2=_BinaryenAllTrueVecI64x2()]="AllTrueVecI64x2",e[e.AbsVecF32x4=_BinaryenAbsVecF32x4()]="AbsVecF32x4",e[e.NegVecF32x4=_BinaryenNegVecF32x4()]="NegVecF32x4",e[e.SqrtVecF32x4=_BinaryenSqrtVecF32x4()]="SqrtVecF32x4",e[e.AbsVecF64x2=_BinaryenAbsVecF64x2()]="AbsVecF64x2",e[e.NegVecF64x2=_BinaryenNegVecF64x2()]="NegVecF64x2",e[e.SqrtVecF64x2=_BinaryenSqrtVecF64x2()]="SqrtVecF64x2",e[e.TruncSatSVecF32x4ToVecI32x4=_BinaryenTruncSatSVecF32x4ToVecI32x4()]="TruncSatSVecF32x4ToVecI32x4",e[e.TruncSatUVecF32x4ToVecI32x4=_BinaryenTruncSatUVecF32x4ToVecI32x4()]="TruncSatUVecF32x4ToVecI32x4",e[e.TruncSatSVecF64x2ToVecI64x2=_BinaryenTruncSatSVecF64x2ToVecI64x2()]="TruncSatSVecF64x2ToVecI64x2",e[e.TruncSatUVecF64x2ToVecI64x2=_BinaryenTruncSatUVecF64x2ToVecI64x2()]="TruncSatUVecF64x2ToVecI64x2",e[e.ConvertSVecI32x4ToVecF32x4=_BinaryenConvertSVecI32x4ToVecF32x4()]="ConvertSVecI32x4ToVecF32x4",e[e.ConvertUVecI32x4ToVecF32x4=_BinaryenConvertUVecI32x4ToVecF32x4()]="ConvertUVecI32x4ToVecF32x4",e[e.ConvertSVecI64x2ToVecF64x2=_BinaryenConvertSVecI64x2ToVecF64x2()]="ConvertSVecI64x2ToVecF64x2",e[e.ConvertUVecI64x2ToVecF64x2=_BinaryenConvertUVecI64x2ToVecF64x2()]="ConvertUVecI64x2ToVecF64x2",e[e.EqVecI8x16=_BinaryenEqVecI8x16()]="EqVecI8x16",e[e.NeVecI8x16=_BinaryenNeVecI8x16()]="NeVecI8x16",e[e.LtSVecI8x16=_BinaryenLtSVecI8x16()]="LtSVecI8x16",e[e.LtUVecI8x16=_BinaryenLtUVecI8x16()]="LtUVecI8x16",e[e.LeSVecI8x16=_BinaryenLeSVecI8x16()]="LeSVecI8x16",e[e.LeUVecI8x16=_BinaryenLeUVecI8x16()]="LeUVecI8x16",e[e.GtSVecI8x16=_BinaryenGtSVecI8x16()]="GtSVecI8x16",e[e.GtUVecI8x16=_BinaryenGtUVecI8x16()]="GtUVecI8x16",e[e.GeSVecI8x16=_BinaryenGeSVecI8x16()]="GeSVecI8x16",e[e.GeUVecI8x16=_BinaryenGeUVecI8x16()]="GeUVecI8x16",e[e.EqVecI16x8=_BinaryenEqVecI16x8()]="EqVecI16x8",e[e.NeVecI16x8=_BinaryenNeVecI16x8()]="NeVecI16x8",e[e.LtSVecI16x8=_BinaryenLtSVecI16x8()]="LtSVecI16x8",e[e.LtUVecI16x8=_BinaryenLtUVecI16x8()]="LtUVecI16x8",e[e.LeSVecI16x8=_BinaryenLeSVecI16x8()]="LeSVecI16x8",e[e.LeUVecI16x8=_BinaryenLeUVecI16x8()]="LeUVecI16x8",e[e.GtSVecI16x8=_BinaryenGtSVecI16x8()]="GtSVecI16x8",e[e.GtUVecI16x8=_BinaryenGtUVecI16x8()]="GtUVecI16x8",e[e.GeSVecI16x8=_BinaryenGeSVecI16x8()]="GeSVecI16x8",e[e.GeUVecI16x8=_BinaryenGeUVecI16x8()]="GeUVecI16x8",e[e.EqVecI32x4=_BinaryenEqVecI32x4()]="EqVecI32x4",e[e.NeVecI32x4=_BinaryenNeVecI32x4()]="NeVecI32x4",e[e.LtSVecI32x4=_BinaryenLtSVecI32x4()]="LtSVecI32x4",e[e.LtUVecI32x4=_BinaryenLtUVecI32x4()]="LtUVecI32x4",e[e.LeSVecI32x4=_BinaryenLeSVecI32x4()]="LeSVecI32x4",e[e.LeUVecI32x4=_BinaryenLeUVecI32x4()]="LeUVecI32x4",e[e.GtSVecI32x4=_BinaryenGtSVecI32x4()]="GtSVecI32x4",e[e.GtUVecI32x4=_BinaryenGtUVecI32x4()]="GtUVecI32x4",e[e.GeSVecI32x4=_BinaryenGeSVecI32x4()]="GeSVecI32x4",e[e.GeUVecI32x4=_BinaryenGeUVecI32x4()]="GeUVecI32x4",e[e.EqVecF32x4=_BinaryenEqVecF32x4()]="EqVecF32x4",e[e.NeVecF32x4=_BinaryenNeVecF32x4()]="NeVecF32x4",e[e.LtVecF32x4=_BinaryenLtVecF32x4()]="LtVecF32x4",e[e.LeVecF32x4=_BinaryenLeVecF32x4()]="LeVecF32x4",e[e.GtVecF32x4=_BinaryenGtVecF32x4()]="GtVecF32x4",e[e.GeVecF32x4=_BinaryenGeVecF32x4()]="GeVecF32x4",e[e.EqVecF64x2=_BinaryenEqVecF64x2()]="EqVecF64x2",e[e.NeVecF64x2=_BinaryenNeVecF64x2()]="NeVecF64x2",e[e.LtVecF64x2=_BinaryenLtVecF64x2()]="LtVecF64x2",e[e.LeVecF64x2=_BinaryenLeVecF64x2()]="LeVecF64x2",e[e.GtVecF64x2=_BinaryenGtVecF64x2()]="GtVecF64x2",e[e.GeVecF64x2=_BinaryenGeVecF64x2()]="GeVecF64x2",e[e.AndVec128=_BinaryenAndVec128()]="AndVec128",e[e.OrVec128=_BinaryenOrVec128()]="OrVec128",e[e.XorVec128=_BinaryenXorVec128()]="XorVec128",e[e.AddVecI8x16=_BinaryenAddVecI8x16()]="AddVecI8x16",e[e.AddSatSVecI8x16=_BinaryenAddSatSVecI8x16()]="AddSatSVecI8x16",e[e.AddSatUVecI8x16=_BinaryenAddSatUVecI8x16()]="AddSatUVecI8x16",e[e.SubVecI8x16=_BinaryenSubVecI8x16()]="SubVecI8x16",e[e.SubSatSVecI8x16=_BinaryenSubSatSVecI8x16()]="SubSatSVecI8x16",e[e.SubSatUVecI8x16=_BinaryenSubSatUVecI8x16()]="SubSatUVecI8x16",e[e.MulVecI8x16=_BinaryenMulVecI8x16()]="MulVecI8x16",e[e.AddVecI16x8=_BinaryenAddVecI16x8()]="AddVecI16x8",e[e.AddSatSVecI16x8=_BinaryenAddSatSVecI16x8()]="AddSatSVecI16x8",e[e.AddSatUVecI16x8=_BinaryenAddSatUVecI16x8()]="AddSatUVecI16x8",e[e.SubVecI16x8=_BinaryenSubVecI16x8()]="SubVecI16x8",e[e.SubSatSVecI16x8=_BinaryenSubSatSVecI16x8()]="SubSatSVecI16x8",e[e.SubSatUVecI16x8=_BinaryenSubSatUVecI16x8()]="SubSatUVecI16x8",e[e.MulVecI16x8=_BinaryenMulVecI16x8()]="MulVecI16x8",e[e.AddVecI32x4=_BinaryenAddVecI32x4()]="AddVecI32x4",e[e.SubVecI32x4=_BinaryenSubVecI32x4()]="SubVecI32x4",e[e.MulVecI32x4=_BinaryenMulVecI32x4()]="MulVecI32x4",e[e.AddVecI64x2=_BinaryenAddVecI64x2()]="AddVecI64x2",e[e.SubVecI64x2=_BinaryenSubVecI64x2()]="SubVecI64x2",e[e.AddVecF32x4=_BinaryenAddVecF32x4()]="AddVecF32x4",e[e.SubVecF32x4=_BinaryenSubVecF32x4()]="SubVecF32x4",e[e.MulVecF32x4=_BinaryenMulVecF32x4()]="MulVecF32x4",e[e.DivVecF32x4=_BinaryenDivVecF32x4()]="DivVecF32x4",e[e.MinVecF32x4=_BinaryenMinVecF32x4()]="MinVecF32x4",e[e.MaxVecF32x4=_BinaryenMaxVecF32x4()]="MaxVecF32x4",e[e.AddVecF64x2=_BinaryenAddVecF64x2()]="AddVecF64x2",e[e.SubVecF64x2=_BinaryenSubVecF64x2()]="SubVecF64x2",e[e.MulVecF64x2=_BinaryenMulVecF64x2()]="MulVecF64x2",e[e.DivVecF64x2=_BinaryenDivVecF64x2()]="DivVecF64x2",e[e.MinVecF64x2=_BinaryenMinVecF64x2()]="MinVecF64x2",e[e.MaxVecF64x2=_BinaryenMaxVecF64x2()]="MaxVecF64x2"}(t.SIMDOp||(t.SIMDOp={}));var o=function(){function e(){}return e.create=function(t,r){var n=new e;return n.buffer=t,n.offset=r,n},e}();t.MemorySegment=o;var c=function(){function e(){this.hasTemporaryFunction=!1,this.cachedPrecomputeNames=0,this.cachedStrings=new Map}return e.create=function(){var t=new e;return t.ref=_BinaryenModuleCreate(),t.lit=memory.allocate(_BinaryenSizeofLiteral()),t},e.createFrom=function(t){var r=p(t);try{var n=new e;return n.ref=_BinaryenModuleRead(r,t.length),n.lit=memory.allocate(_BinaryenSizeofLiteral()),n}finally{memory.free(changetype(r))}},e.prototype.addFunctionType=function(e,t,r){var n=this.allocStringCached(e),i=u(r);try{return _BinaryenAddFunctionType(this.ref,n,t,i,r?r.length:0)}finally{memory.free(i)}},e.prototype.getFunctionTypeBySignature=function(e,t){var r=u(t);try{return _BinaryenGetFunctionTypeBySignature(this.ref,e,r,t?t.length:0)}finally{memory.free(r)}},e.prototype.removeFunctionType=function(e){var t=this.allocStringCached(e);_BinaryenRemoveFunctionType(this.ref,t)},e.prototype.createI32=function(e){var t=this.lit;return _BinaryenLiteralInt32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createI64=function(e,t){void 0===t&&(t=0);var r=this.lit;return _BinaryenLiteralInt64(r,e,t),_BinaryenConst(this.ref,r)},e.prototype.createF32=function(e){var t=this.lit;return _BinaryenLiteralFloat32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createF64=function(e){var t=this.lit;return _BinaryenLiteralFloat64(t,e),_BinaryenConst(this.ref,t)},e.prototype.createV128=function(e){assert(16==e.length);for(var t=this.lit,r=0;r<16;++r)store(t+r,e[r]);return _BinaryenLiteralVec128(t,t),_BinaryenConst(this.ref,t)},e.prototype.createUnary=function(e,t){return _BinaryenUnary(this.ref,e,t)},e.prototype.createBinary=function(e,t,r){return _BinaryenBinary(this.ref,e,t,r)},e.prototype.createHost=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=null);var n=this.allocStringCached(t),i=h(r);try{return _BinaryenHost(this.ref,e,n,i,r?r.length:0)}finally{memory.free(i)}},e.prototype.createGetLocal=function(e,t){return _BinaryenGetLocal(this.ref,e,t)},e.prototype.createTeeLocal=function(e,t){return _BinaryenTeeLocal(this.ref,e,t)},e.prototype.createGetGlobal=function(e,t){var r=this.allocStringCached(e);return _BinaryenGetGlobal(this.ref,r,t)},e.prototype.createLoad=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenLoad(this.ref,e,t?1:0,i,e,n,r)},e.prototype.createStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenStore(this.ref,e,i,e,t,r,n)},e.prototype.createAtomicLoad=function(e,t,r,n){return void 0===n&&(n=0),_BinaryenAtomicLoad(this.ref,e,n,r,t)},e.prototype.createAtomicStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenAtomicStore(this.ref,e,i,t,r,n)},e.prototype.createAtomicRMW=function(e,t,r,n,i,a){return _BinaryenAtomicRMW(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicCmpxchg=function(e,t,r,n,i,a){return _BinaryenAtomicCmpxchg(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicWait=function(e,t,r,n){return _BinaryenAtomicWait(this.ref,e,t,r,n)},e.prototype.createAtomicWake=function(e,t){return _BinaryenAtomicWake(this.ref,e,t)},e.prototype.createSetLocal=function(e,t){return _BinaryenSetLocal(this.ref,e,t)},e.prototype.createSetGlobal=function(e,t){var r=this.allocStringCached(e);return _BinaryenSetGlobal(this.ref,r,t)},e.prototype.createBlock=function(e,t,r){void 0===r&&(r=i.None);var n=this.allocStringCached(e),a=h(t);try{return _BinaryenBlock(this.ref,n,a,t.length,r)}finally{memory.free(a)}},e.prototype.createBreak=function(e,t,r){void 0===t&&(t=0),void 0===r&&(r=0);var n=this.allocStringCached(e);return _BinaryenBreak(this.ref,n,t,r)},e.prototype.createDrop=function(e){return _BinaryenDrop(this.ref,e)},e.prototype.createLoop=function(e,t){var r=this.allocStringCached(e);return _BinaryenLoop(this.ref,r,t)},e.prototype.createIf=function(e,t,r){return void 0===r&&(r=0),_BinaryenIf(this.ref,e,t,r)},e.prototype.createNop=function(){return _BinaryenNop(this.ref)},e.prototype.createReturn=function(e){return void 0===e&&(e=0),_BinaryenReturn(this.ref,e)},e.prototype.createSelect=function(e,t,r){return _BinaryenSelect(this.ref,r,e,t)},e.prototype.createSwitch=function(e,t,r,n){void 0===n&&(n=0);for(var i=e.length,a=new Array(i),s=0;s=0;--d)memory.free(l[d])}},e.prototype.setFunctionTable=function(e,t,r){for(var n=r.length,i=new Array(n),a=0;a=0;--i)memory.free(n[i])}},e.prototype.precomputeExpression=function(e){var t=_BinaryenGetOptimizeLevel(),r=_BinaryenGetShrinkLevel(),n=_BinaryenGetDebugInfo();_BinaryenSetOptimizeLevel(4),_BinaryenSetShrinkLevel(0),_BinaryenSetDebugInfo(!1);var i=_BinaryenExpressionGetType(e),a=this.addTemporaryFunction(i,null,e),s=this.cachedPrecomputeNames;return s||(this.cachedPrecomputeNames=s=u([this.allocStringCached("precompute")])),_BinaryenFunctionRunPasses(a,this.ref,s,1),e=_BinaryenFunctionGetBody(a),this.removeTemporaryFunction(),_BinaryenSetOptimizeLevel(t),_BinaryenSetShrinkLevel(r),_BinaryenSetDebugInfo(n),e},e.prototype.validate=function(){return 1==_BinaryenModuleValidate(this.ref)},e.prototype.interpret=function(){_BinaryenModuleInterpret(this.ref)},e.prototype.toBinary=function(e){var t=this.lit;assert(_BinaryenSizeofLiteral()>=12);var r=d(e),n=0,i=0;try{_BinaryenModuleAllocateAndWrite(t,this.ref,r),n=y(t);var a=y(t+4);i=y(t+8);var s=new g;return s.output=function(e,t){for(var r=new Uint8Array(t),n=0;n>8&255),store(r+2,a>>16&255),store(r+3,a>>>24),r+=4}return t}function h(e){return u(e)}t.Relooper=l;var _=new Map;function d(e){if(null==e)return 0;if(_.has(e))return _.get(e);for(var t=memory.allocate(function(e){for(var t=0,r=0,n=e.length;r=55296&&i<=57343&&r+1=55296&&a<=57343&&n+1>>6),store(r++,128|63&a)):a<=65535?(store(r++,224|a>>>12),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=2097151?(store(r++,240|a>>>18),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=67108863?(store(r++,248|a>>>24),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):(store(r++,252|a>>>30),store(r++,128|a>>>24&63),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a))}return store(r,0),_.set(e,t),t}function y(e){return load(e)|load(e+1)<<8|load(e+2)<<16|load(e+3)<<24}function m(e){if(!e)return null;for(var t,r,n,i,a,s=new Array;t=load(e++);)128&t?(r=63&load(e++),192!=(224&t)?(n=63&load(e++),224==(240&t)?t=(15&t)<<12|r<<6|n:(i=63&load(e++),240==(248&t)?t=(7&t)<<18|r<<12|n<<6|i:(a=63&load(e++),t=248==(252&t)?(3&t)<<24|r<<18|n<<12|i<<6|a:(1&t)<<30|r<<24|n<<18|i<<12|a<<6|63&load(e++))),s.push(t)):s.push((31&t)<<6|r)):s.push(t);return String.fromCodePoints(s)}t.readString=m;var g=function(){return function(){}}();t.BinaryModule=g,t.needsExplicitUnreachable=function e(t){switch(_BinaryenExpressionGetType(t)){case i.I32:case i.I64:case i.F32:case i.F64:return!1}switch(_BinaryenExpressionGetId(t)){case a.Unreachable:case a.Return:return!1;case a.Break:return 0!=_BinaryenBreakGetCondition(t);case a.Block:if(!_BinaryenBlockGetName(t)){var r=_BinaryenBlockGetNumChildren(t);return r>0&&e(_BinaryenBlockGetChild(t,r-1))}}return!0}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var a=r(1),s=r(6);t.Token=s.Token,t.Range=s.Range;var o,c=r(0);!function(e){e[e.SOURCE=0]="SOURCE",e[e.TYPE=1]="TYPE",e[e.TYPEPARAMETER=2]="TYPEPARAMETER",e[e.PARAMETER=3]="PARAMETER",e[e.SIGNATURE=4]="SIGNATURE",e[e.IDENTIFIER=5]="IDENTIFIER",e[e.ASSERTION=6]="ASSERTION",e[e.BINARY=7]="BINARY",e[e.CALL=8]="CALL",e[e.CLASS=9]="CLASS",e[e.COMMA=10]="COMMA",e[e.ELEMENTACCESS=11]="ELEMENTACCESS",e[e.FALSE=12]="FALSE",e[e.FUNCTION=13]="FUNCTION",e[e.INSTANCEOF=14]="INSTANCEOF",e[e.LITERAL=15]="LITERAL",e[e.NEW=16]="NEW",e[e.NULL=17]="NULL",e[e.PARENTHESIZED=18]="PARENTHESIZED",e[e.PROPERTYACCESS=19]="PROPERTYACCESS",e[e.TERNARY=20]="TERNARY",e[e.SUPER=21]="SUPER",e[e.THIS=22]="THIS",e[e.TRUE=23]="TRUE",e[e.CONSTRUCTOR=24]="CONSTRUCTOR",e[e.UNARYPOSTFIX=25]="UNARYPOSTFIX",e[e.UNARYPREFIX=26]="UNARYPREFIX",e[e.BLOCK=27]="BLOCK",e[e.BREAK=28]="BREAK",e[e.CONTINUE=29]="CONTINUE",e[e.DO=30]="DO",e[e.EMPTY=31]="EMPTY",e[e.EXPORT=32]="EXPORT",e[e.EXPORTIMPORT=33]="EXPORTIMPORT",e[e.EXPRESSION=34]="EXPRESSION",e[e.FOR=35]="FOR",e[e.IF=36]="IF",e[e.IMPORT=37]="IMPORT",e[e.RETURN=38]="RETURN",e[e.SWITCH=39]="SWITCH",e[e.THROW=40]="THROW",e[e.TRY=41]="TRY",e[e.VARIABLE=42]="VARIABLE",e[e.VOID=43]="VOID",e[e.WHILE=44]="WHILE",e[e.CLASSDECLARATION=45]="CLASSDECLARATION",e[e.ENUMDECLARATION=46]="ENUMDECLARATION",e[e.ENUMVALUEDECLARATION=47]="ENUMVALUEDECLARATION",e[e.FIELDDECLARATION=48]="FIELDDECLARATION",e[e.FUNCTIONDECLARATION=49]="FUNCTIONDECLARATION",e[e.IMPORTDECLARATION=50]="IMPORTDECLARATION",e[e.INDEXSIGNATUREDECLARATION=51]="INDEXSIGNATUREDECLARATION",e[e.INTERFACEDECLARATION=52]="INTERFACEDECLARATION",e[e.METHODDECLARATION=53]="METHODDECLARATION",e[e.NAMESPACEDECLARATION=54]="NAMESPACEDECLARATION",e[e.TYPEDECLARATION=55]="TYPEDECLARATION",e[e.VARIABLEDECLARATION=56]="VARIABLEDECLARATION",e[e.DECORATOR=57]="DECORATOR",e[e.EXPORTMEMBER=58]="EXPORTMEMBER",e[e.SWITCHCASE=59]="SWITCHCASE",e[e.COMMENT=60]="COMMENT"}(o=t.NodeKind||(t.NodeKind={})),t.nodeIsConstantValue=function(e){switch(e){case o.LITERAL:case o.NULL:case o.TRUE:case o.FALSE:return!0}return!1},t.nodeIsCallable=function(e){switch(e){case o.IDENTIFIER:case o.ASSERTION:case o.CALL:case o.ELEMENTACCESS:case o.PARENTHESIZED:case o.PROPERTYACCESS:case o.SUPER:return!0}return!1},t.nodeIsGenericCallable=function(e){switch(e){case o.IDENTIFIER:case o.PROPERTYACCESS:return!0}return!1};var l=function(){function e(){this.parent=null,this.flags=a.CommonFlags.NONE}return e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.set=function(e){this.flags|=e},e.createType=function(e,t,r,n){var i=new u;return i.range=n,i.name=e,e.parent=i,i.typeArguments=t,t&&De(t,i),i.isNullable=r,i},e.createOmittedType=function(t){return e.createType(e.createIdentifierExpression("",t),null,!1,t)},e.createTypeParameter=function(e,t,r,n){var i=new h;return i.range=n,i.name=e,e.parent=i,i.extendsType=t,t&&(t.parent=i),i.defaultType=r,r&&(r.parent=i),i},e.createParameter=function(e,t,r,n,i){var a=new _;return a.range=i,a.name=e,e.parent=a,a.type=t,t&&(t.parent=a),a.initializer=r,r&&(r.parent=a),a.parameterKind=n,a},e.createSignature=function(e,t,r,n,i){var a=new y;return a.range=i,a.parameters=e,De(e,a),a.returnType=t,t.parent=a,a.explicitThisType=r,r&&(r.parent=a),a.isNullable=n,a},e.createDecorator=function(e,t,r){var n=new g;return n.range=r,n.name=e,e.parent=n,n.arguments=t,t&&De(t,n),n.decoratorKind=m(e),n},e.createComment=function(e,t,r){var n=new T;return n.range=r,n.commentKind=t,n.text=e,n},e.createIdentifierExpression=function(e,t){var r=new I;return r.range=t,r.text=e,r},e.createEmptyIdentifierExpression=function(e){var t=new I;return t.range=e,t.text="",t},e.createArrayLiteralExpression=function(e,t){var r=new A;return r.range=t,r.elementExpressions=e,function(e,t){for(var r=0,n=e.length;r=0?c.substring(l+1):c,i.statements=new Array,i.range=new s.Range(i,0,r.length),i.text=r,i}return i(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==j.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==j.LIBRARY},enumerable:!0,configurable:!0}),t}(l);t.Source=J;var $=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.decorators=null,t.cachedProgramLevelInternalName=null,t.cachedFileLevelInternalName=null,t}return i(t,e),Object.defineProperty(t.prototype,"programLevelInternalName",{get:function(){return this.cachedProgramLevelInternalName||(this.cachedProgramLevelInternalName=Fe(this,!0)),this.cachedProgramLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"fileLevelInternalName",{get:function(){return this.cachedFileLevelInternalName||(this.cachedFileLevelInternalName=Fe(this,!1)),this.cachedFileLevelInternalName},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevel",{get:function(){var e=this.parent;return!!e&&(!(e.kind==o.VARIABLE&&!(e=e.parent))&&e.kind==o.SOURCE)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isTopLevelExport",{get:function(){var e=this.parent;return!(!e||e.kind==o.VARIABLE&&!(e=e.parent))&&(e.kind==o.NAMESPACEDECLARATION?this.is(a.CommonFlags.EXPORT)&&e.isTopLevelExport:e.kind==o.CLASSDECLARATION?this.is(a.CommonFlags.STATIC)&&e.isTopLevelExport:e.kind==o.SOURCE&&this.is(a.CommonFlags.EXPORT))},enumerable:!0,configurable:!0}),t.prototype.needsExplicitExport=function(e){return e.name.text!=e.externalName.text||this.range.source!=e.range.source||!this.isTopLevelExport},t}(Z);t.DeclarationStatement=$;var ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.INDEXSIGNATUREDECLARATION,t}return i(t,e),t}($);t.IndexSignatureDeclaration=ee;var te=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}($);t.VariableLikeDeclarationStatement=te;var re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.BLOCK,t}return i(t,e),t}(Z);t.BlockStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.BREAK,t}return i(t,e),t}(Z);t.BreakStatement=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.CLASSDECLARATION,t}return i(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}($);t.ClassDeclaration=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.CONTINUE,t}return i(t,e),t}(Z);t.ContinueStatement=ae;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.DO,t}return i(t,e),t}(Z);t.DoStatement=se;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EMPTY,t}return i(t,e),t}(Z);t.EmptyStatement=oe;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.ENUMDECLARATION,t}return i(t,e),t}($);t.EnumDeclaration=ce;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.ENUMVALUEDECLARATION,t}return i(t,e),t}($);t.EnumValueDeclaration=le;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPORTIMPORT,t}return i(t,e),t}(l);t.ExportImportStatement=pe;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPORTMEMBER,t}return i(t,e),t}(l);t.ExportMember=ue;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPORT,t}return i(t,e),t}(Z);t.ExportStatement=he;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.EXPRESSION,t}return i(t,e),t}(Z);t.ExpressionStatement=_e;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.FIELDDECLARATION,t.parameterIndex=-1,t}return i(t,e),t}(te);t.FieldDeclaration=de;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.FOR,t}return i(t,e),t}(Z);t.ForStatement=ye;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.FUNCTIONDECLARATION,t}return i(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}($);t.FunctionDeclaration=me;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.IF,t}return i(t,e),t}(Z);t.IfStatement=ge;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.IMPORTDECLARATION,t}return i(t,e),t}($);t.ImportDeclaration=Te;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.IMPORT,t}return i(t,e),t}(Z);t.ImportStatement=Ee;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.INTERFACEDECLARATION,t}return i(t,e),t}(ie);t.InterfaceDeclaration=fe;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.METHODDECLARATION,t}return i(t,e),t}(me);t.MethodDeclaration=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.NAMESPACEDECLARATION,t}return i(t,e),t}($);t.NamespaceDeclaration=ve;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.RETURN,t}return i(t,e),t}(Z);t.ReturnStatement=Ae;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.SWITCHCASE,t}return i(t,e),t}(l);t.SwitchCase=Ce;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.SWITCH,t}return i(t,e),t}(Z);t.SwitchStatement=Se;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.THROW,t}return i(t,e),t}(Z);t.ThrowStatement=Ne;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.TRY,t}return i(t,e),t}(Z);t.TryStatement=Oe;var xe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.TYPEDECLARATION,t}return i(t,e),t}($);t.TypeDeclaration=xe;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.VARIABLEDECLARATION,t}return i(t,e),t}(te);t.VariableDeclaration=be;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.VARIABLE,t}return i(t,e),t}(Z);t.VariableStatement=Le;var ke=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.VOID,t}return i(t,e),t}(Z);t.VoidStatement=ke;var Re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=o.WHILE,t}return i(t,e),t}(Z);function Fe(e,t){void 0===t&&(t=!1);var r=e.name.text,n=e.parent;return n&&(e.kind!=o.VARIABLEDECLARATION||n.kind!=o.VARIABLE||(n=n.parent))?n.kind==o.CLASSDECLARATION?Fe(n,t)+(e.is(a.CommonFlags.STATIC)?a.STATIC_DELIMITER:a.INSTANCE_DELIMITER)+r:n.kind==o.NAMESPACEDECLARATION||n.kind==o.ENUMDECLARATION?Fe(n,t)+a.STATIC_DELIMITER+r:t?r:e.range.source.internalPath+a.PATH_DELIMITER+r:r}function Be(e){return e.endsWith(".ts")&&(e=e.substring(0,e.length-3)),e}function De(e,t){for(var r=0,n=e.length;r=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o,c=r(1),l=r(2),p=r(7),u=r(4),h=r(3),_=r(0),d=r(11),y=function(){return function(){}}(),m=function(){return function(){}}(),g=function(){return function(){}}();function T(e,t){switch(assert(t.length),e){case u.DecoratorKind.OPERATOR:case u.DecoratorKind.OPERATOR_BINARY:switch(t.charCodeAt(0)){case 91:if("[]"==t)return o.INDEXED_GET;if("[]="==t)return o.INDEXED_SET;break;case 123:if("{}"==t)return o.UNCHECKED_INDEXED_GET;if("{}="==t)return o.UNCHECKED_INDEXED_SET;break;case 43:if("+"==t)return o.ADD;break;case 45:if("-"==t)return o.SUB;break;case 42:if("*"==t)return o.MUL;if("**"==t)return o.POW;break;case 47:if("/"==t)return o.DIV;break;case 37:if("%"==t)return o.REM;break;case 38:if("&"==t)return o.BITWISE_AND;break;case 124:if("|"==t)return o.BITWISE_OR;break;case 94:if("^"==t)return o.BITWISE_XOR;break;case 61:if("=="==t)return o.EQ;break;case 33:if("!="==t)return o.NE;break;case 62:if(">"==t)return o.GT;if(">="==t)return o.GE;if(">>"==t)return o.BITWISE_SHR;if(">>>"==t)return o.BITWISE_SHR_U;break;case 60:if("<"==t)return o.LT;if("<="==t)return o.LE;if("<<"==t)return o.BITWISE_SHL}break;case u.DecoratorKind.OPERATOR_PREFIX:switch(t.charCodeAt(0)){case 43:if("+"==t)return o.PLUS;if("++"==t)return o.PREFIX_INC;break;case 45:if("-"==t)return o.MINUS;if("--"==t)return o.PREFIX_DEC;break;case 33:if("!"==t)return o.NOT;break;case 126:if("~"==t)return o.BITWISE_NOT}break;case u.DecoratorKind.OPERATOR_POSTFIX:switch(t.charCodeAt(0)){case 43:if("++"==t)return o.POSTFIX_INC;break;case 45:if("--"==t)return o.POSTFIX_DEC}}return o.INVALID}!function(e){e[e.INVALID=0]="INVALID",e[e.INDEXED_GET=1]="INDEXED_GET",e[e.INDEXED_SET=2]="INDEXED_SET",e[e.UNCHECKED_INDEXED_GET=3]="UNCHECKED_INDEXED_GET",e[e.UNCHECKED_INDEXED_SET=4]="UNCHECKED_INDEXED_SET",e[e.ADD=5]="ADD",e[e.SUB=6]="SUB",e[e.MUL=7]="MUL",e[e.DIV=8]="DIV",e[e.REM=9]="REM",e[e.POW=10]="POW",e[e.BITWISE_AND=11]="BITWISE_AND",e[e.BITWISE_OR=12]="BITWISE_OR",e[e.BITWISE_XOR=13]="BITWISE_XOR",e[e.BITWISE_SHL=14]="BITWISE_SHL",e[e.BITWISE_SHR=15]="BITWISE_SHR",e[e.BITWISE_SHR_U=16]="BITWISE_SHR_U",e[e.EQ=17]="EQ",e[e.NE=18]="NE",e[e.GT=19]="GT",e[e.GE=20]="GE",e[e.LT=21]="LT",e[e.LE=22]="LE",e[e.PLUS=23]="PLUS",e[e.MINUS=24]="MINUS",e[e.NOT=25]="NOT",e[e.BITWISE_NOT=26]="BITWISE_NOT",e[e.PREFIX_INC=27]="PREFIX_INC",e[e.PREFIX_DEC=28]="PREFIX_DEC",e[e.POSTFIX_INC=29]="POSTFIX_INC",e[e.POSTFIX_DEC=30]="POSTFIX_DEC"}(o=t.OperatorKind||(t.OperatorKind={}));var E,f,I=new Map,v=function(e){function t(t){void 0===t&&(t=null);var r=e.call(this,t)||this;return r.diagnosticsOffset=0,r.elementsLookup=new Map,r.instancesLookup=new Map,r.typesLookup=I,r.typeAliases=new Map,r.fileLevelExports=new Map,r.moduleLevelExports=new Map,r.basicClasses=new Map,r.arrayBufferInstance=null,r.arrayPrototype=null,r.stringInstance=null,r.mainFunction=null,r.abortInstance=null,r.memoryAllocateInstance=null,r.hasGC=!1,r.gcAllocateInstance=null,r.gcLinkInstance=null,r.gcMarkInstance=null,r.gcHeaderSize=0,r.gcHookOffset=0,r.resolver=new d.Resolver(r),r.sources=[],r}return i(t,e),t.prototype.getSource=function(e){for(var t=this.sources,r=0,n=t.length;r=0);var t,r=this.parentFunction;switch(assert(null!=e.type),e.type.toNativeType()){case h.NativeType.I32:t=r.tempI32s||(r.tempI32s=[]);break;case h.NativeType.I64:t=r.tempI64s||(r.tempI64s=[]);break;case h.NativeType.F32:t=r.tempF32s||(r.tempF32s=[]);break;case h.NativeType.F64:t=r.tempF64s||(r.tempF64s=[]);break;default:throw new Error("concrete type expected")}assert(e.index>=0),t.push(e)}},e.prototype.getAndFreeTempLocal=function(e,t){var r,n,i=this.parentFunction;switch(e.toNativeType()){case h.NativeType.I32:r=i.tempI32s||(i.tempI32s=[]);break;case h.NativeType.I64:r=i.tempI64s||(i.tempI64s=[]);break;case h.NativeType.F32:r=i.tempF32s||(i.tempF32s=[]);break;case h.NativeType.F64:r=i.tempF64s||(i.tempF64s=[]);break;default:throw new Error("concrete type expected")}return r.length?(n=r[r.length-1]).type=e:(n=i.addLocal(e),r.push(n)),e.is(36)&&this.setLocalWrapped(n.index,t),n},e.prototype.addScopedLocal=function(e,t,r,n){void 0===n&&(n=null);var i=this.getTempLocal(t,!1);if(this.scopedLocals){var a=this.scopedLocals.get(e);if(a)return n&&this.parentFunction.program.error(l.DiagnosticCode.Duplicate_identifier_0,n.range),a}else this.scopedLocals=new Map;return i.set(c.CommonFlags.SCOPED),this.scopedLocals.set(e,i),t.is(36)&&this.setLocalWrapped(i.index,r),i},e.prototype.addScopedAlias=function(e,t,r,n){if(void 0===n&&(n=null),this.scopedLocals){var i=this.scopedLocals.get(e);if(i)return n&&this.parentFunction.program.error(l.DiagnosticCode.Duplicate_identifier_0,n.range),i}else this.scopedLocals=new Map;assert(r1?e.breakLabel=t[r-2].toString(10):(e.breakLabel=null,e.breakStack=null)},e.prototype.inherit=function(e){this.flags|=4095&e.flags,this.wrappedLocals=e.wrappedLocals,this.wrappedLocalsExt=e.wrappedLocalsExt},e.prototype.inheritConditional=function(e){e.is(1)&&this.set(128),e.is(4)&&this.set(256),e.is(8)&&e.breakLabel==this.breakLabel&&this.set(512),e.is(16)&&e.continueLabel==this.continueLabel&&this.set(1024),e.is(32)&&this.set(2048)},e.prototype.inheritMutual=function(e,t){this.flags|=e.flags&t.flags&127,this.flags|=3968&e.flags,this.flags|=3968&t.flags,this.wrappedLocals=i64_and(e.wrappedLocals,t.wrappedLocals);var r=e.wrappedLocalsExt,n=t.wrappedLocalsExt;if(null!=r&&null!=n){var i=this.wrappedLocalsExt,a=min(r.length,n.length);if(a){if(i)for(;i.lengtha):this.canOverflow(h.getBinaryLeft(e),t)&&!(h.getExpressionId(r=h.getBinaryRight(e))==h.ExpressionId.Const&&h.getConstValueI32(r)>=a);case h.BinaryOp.DivU32:case h.BinaryOp.RemI32:case h.BinaryOp.RemU32:return this.canOverflow(h.getBinaryLeft(e),t)||this.canOverflow(h.getBinaryRight(e),t)}break;case h.ExpressionId.Unary:switch(h.getUnaryOp(e)){case h.UnaryOp.EqzI32:case h.UnaryOp.EqzI64:return!1;case h.UnaryOp.ClzI32:case h.UnaryOp.CtzI32:case h.UnaryOp.PopcntI32:return t.size<7}break;case h.ExpressionId.Const:var s=0;switch(h.getExpressionType(e)){case h.NativeType.I32:s=h.getConstValueI32(e);break;case h.NativeType.I64:s=h.getConstValueI64Low(e);break;case h.NativeType.F32:s=i32(h.getConstValueF32(e));break;case h.NativeType.F64:s=i32(h.getConstValueF64(e));break;default:assert(!1)}switch(t.kind){case 0:return si8.MAX_VALUE;case 1:return si16.MAX_VALUE;case 5:return s<0||s>u8.MAX_VALUE;case 6:return s<0||s>u16.MAX_VALUE;case 10:return 0!=(-2&s)}break;case h.ExpressionId.Load:var o=void 0;switch(h.getLoadBytes(e)){case 1:o=h.isLoadSigned(e)?p.Type.i8:p.Type.u8;break;case 2:o=h.isLoadSigned(e)?p.Type.i16:p.Type.u16;break;default:o=h.isLoadSigned(e)?p.Type.i32:p.Type.u32}return H(o,t);case h.ExpressionId.Block:if(!h.getBlockName(e)){var c=assert(h.getBlockChildCount(e)),l=h.getBlockChild(e,c-1);return this.canOverflow(l,t)}break;case h.ExpressionId.If:return this.canOverflow(h.getIfTrue(e),t)||this.canOverflow(assert(h.getIfFalse(e)),t);case h.ExpressionId.Select:return this.canOverflow(h.getSelectThen(e),t)||this.canOverflow(h.getSelectElse(e),t);case h.ExpressionId.Call:var u=this.parentFunction.program,_=assert(u.instancesLookup.get(assert(h.getCallTarget(e))));assert(_.kind==E.FUNCTION);var d=_.signature.returnType;return!_.flow.is(2)||H(d,t);case h.ExpressionId.Unreachable:return!1}return!0},e}();function H(e,t){return!e.is(4)||e.size>t.size||e.is(1)!=t.is(1)}t.Flow=z},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var a,s,o=r(2),c=r(4),l=r(0);function p(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return a.ABSTRACT;case"as":return a.AS;case"async":return a.ASYNC;case"await":return a.AWAIT}break;case 98:switch(e){case"break":return a.BREAK}break;case 99:switch(e){case"case":return a.CASE;case"catch":return a.CATCH;case"class":return a.CLASS;case"continue":return a.CONTINUE;case"const":return a.CONST;case"constructor":return a.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return a.DEBUGGER;case"declare":return a.DECLARE;case"default":return a.DEFAULT;case"delete":return a.DELETE;case"do":return a.DO}break;case 101:switch(e){case"else":return a.ELSE;case"enum":return a.ENUM;case"export":return a.EXPORT;case"extends":return a.EXTENDS}break;case 102:switch(e){case"false":return a.FALSE;case"finally":return a.FINALLY;case"for":return a.FOR;case"from":return a.FROM;case"function":return a.FUNCTION}break;case 103:switch(e){case"get":return a.GET}break;case 105:switch(e){case"if":return a.IF;case"implements":return a.IMPLEMENTS;case"import":return a.IMPORT;case"in":return a.IN;case"instanceof":return a.INSTANCEOF;case"interface":return a.INTERFACE;case"is":return a.IS}break;case 107:switch(e){case"keyof":return a.KEYOF}break;case 108:switch(e){case"let":return a.LET}break;case 109:switch(e){case"module":return a.MODULE}break;case 110:switch(e){case"namespace":return a.NAMESPACE;case"new":return a.NEW;case"null":return a.NULL}break;case 111:switch(e){case"of":return a.OF}break;case 112:switch(e){case"package":return a.PACKAGE;case"private":return a.PRIVATE;case"protected":return a.PROTECTED;case"public":return a.PUBLIC}break;case 114:switch(e){case"readonly":return a.READONLY;case"return":return a.RETURN}break;case 115:switch(e){case"set":return a.SET;case"static":return a.STATIC;case"super":return a.SUPER;case"switch":return a.SWITCH}break;case 116:switch(e){case"this":return a.THIS;case"throw":return a.THROW;case"true":return a.TRUE;case"try":return a.TRY;case"type":return a.TYPE;case"typeof":return a.TYPEOF}break;case 118:switch(e){case"var":return a.VAR;case"void":return a.VOID}break;case 119:switch(e){case"while":return a.WHILE;case"with":return a.WITH}break;case 121:switch(e){case"yield":return a.YIELD}}return a.INVALID}function u(e){switch(e){case a.ABSTRACT:case a.AS:case a.CONSTRUCTOR:case a.DECLARE:case a.DELETE:case a.FROM:case a.FOR:case a.GET:case a.IS:case a.KEYOF:case a.MODULE:case a.NAMESPACE:case a.READONLY:case a.SET:case a.TYPE:case a.VOID:return!0;default:return!1}}!function(e){e[e.ABSTRACT=0]="ABSTRACT",e[e.AS=1]="AS",e[e.ASYNC=2]="ASYNC",e[e.AWAIT=3]="AWAIT",e[e.BREAK=4]="BREAK",e[e.CASE=5]="CASE",e[e.CATCH=6]="CATCH",e[e.CLASS=7]="CLASS",e[e.CONST=8]="CONST",e[e.CONTINUE=9]="CONTINUE",e[e.CONSTRUCTOR=10]="CONSTRUCTOR",e[e.DEBUGGER=11]="DEBUGGER",e[e.DECLARE=12]="DECLARE",e[e.DEFAULT=13]="DEFAULT",e[e.DELETE=14]="DELETE",e[e.DO=15]="DO",e[e.ELSE=16]="ELSE",e[e.ENUM=17]="ENUM",e[e.EXPORT=18]="EXPORT",e[e.EXTENDS=19]="EXTENDS",e[e.FALSE=20]="FALSE",e[e.FINALLY=21]="FINALLY",e[e.FOR=22]="FOR",e[e.FROM=23]="FROM",e[e.FUNCTION=24]="FUNCTION",e[e.GET=25]="GET",e[e.IF=26]="IF",e[e.IMPLEMENTS=27]="IMPLEMENTS",e[e.IMPORT=28]="IMPORT",e[e.IN=29]="IN",e[e.INSTANCEOF=30]="INSTANCEOF",e[e.INTERFACE=31]="INTERFACE",e[e.IS=32]="IS",e[e.KEYOF=33]="KEYOF",e[e.LET=34]="LET",e[e.MODULE=35]="MODULE",e[e.NAMESPACE=36]="NAMESPACE",e[e.NEW=37]="NEW",e[e.NULL=38]="NULL",e[e.OF=39]="OF",e[e.PACKAGE=40]="PACKAGE",e[e.PRIVATE=41]="PRIVATE",e[e.PROTECTED=42]="PROTECTED",e[e.PUBLIC=43]="PUBLIC",e[e.READONLY=44]="READONLY",e[e.RETURN=45]="RETURN",e[e.SET=46]="SET",e[e.STATIC=47]="STATIC",e[e.SUPER=48]="SUPER",e[e.SWITCH=49]="SWITCH",e[e.THIS=50]="THIS",e[e.THROW=51]="THROW",e[e.TRUE=52]="TRUE",e[e.TRY=53]="TRY",e[e.TYPE=54]="TYPE",e[e.TYPEOF=55]="TYPEOF",e[e.VAR=56]="VAR",e[e.VOID=57]="VOID",e[e.WHILE=58]="WHILE",e[e.WITH=59]="WITH",e[e.YIELD=60]="YIELD",e[e.OPENBRACE=61]="OPENBRACE",e[e.CLOSEBRACE=62]="CLOSEBRACE",e[e.OPENPAREN=63]="OPENPAREN",e[e.CLOSEPAREN=64]="CLOSEPAREN",e[e.OPENBRACKET=65]="OPENBRACKET",e[e.CLOSEBRACKET=66]="CLOSEBRACKET",e[e.DOT=67]="DOT",e[e.DOT_DOT_DOT=68]="DOT_DOT_DOT",e[e.SEMICOLON=69]="SEMICOLON",e[e.COMMA=70]="COMMA",e[e.LESSTHAN=71]="LESSTHAN",e[e.GREATERTHAN=72]="GREATERTHAN",e[e.LESSTHAN_EQUALS=73]="LESSTHAN_EQUALS",e[e.GREATERTHAN_EQUALS=74]="GREATERTHAN_EQUALS",e[e.EQUALS_EQUALS=75]="EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS=76]="EXCLAMATION_EQUALS",e[e.EQUALS_EQUALS_EQUALS=77]="EQUALS_EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS_EQUALS=78]="EXCLAMATION_EQUALS_EQUALS",e[e.EQUALS_GREATERTHAN=79]="EQUALS_GREATERTHAN",e[e.PLUS=80]="PLUS",e[e.MINUS=81]="MINUS",e[e.ASTERISK_ASTERISK=82]="ASTERISK_ASTERISK",e[e.ASTERISK=83]="ASTERISK",e[e.SLASH=84]="SLASH",e[e.PERCENT=85]="PERCENT",e[e.PLUS_PLUS=86]="PLUS_PLUS",e[e.MINUS_MINUS=87]="MINUS_MINUS",e[e.LESSTHAN_LESSTHAN=88]="LESSTHAN_LESSTHAN",e[e.GREATERTHAN_GREATERTHAN=89]="GREATERTHAN_GREATERTHAN",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN=90]="GREATERTHAN_GREATERTHAN_GREATERTHAN",e[e.AMPERSAND=91]="AMPERSAND",e[e.BAR=92]="BAR",e[e.CARET=93]="CARET",e[e.EXCLAMATION=94]="EXCLAMATION",e[e.TILDE=95]="TILDE",e[e.AMPERSAND_AMPERSAND=96]="AMPERSAND_AMPERSAND",e[e.BAR_BAR=97]="BAR_BAR",e[e.QUESTION=98]="QUESTION",e[e.COLON=99]="COLON",e[e.EQUALS=100]="EQUALS",e[e.PLUS_EQUALS=101]="PLUS_EQUALS",e[e.MINUS_EQUALS=102]="MINUS_EQUALS",e[e.ASTERISK_EQUALS=103]="ASTERISK_EQUALS",e[e.ASTERISK_ASTERISK_EQUALS=104]="ASTERISK_ASTERISK_EQUALS",e[e.SLASH_EQUALS=105]="SLASH_EQUALS",e[e.PERCENT_EQUALS=106]="PERCENT_EQUALS",e[e.LESSTHAN_LESSTHAN_EQUALS=107]="LESSTHAN_LESSTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_EQUALS=108]="GREATERTHAN_GREATERTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS=109]="GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS",e[e.AMPERSAND_EQUALS=110]="AMPERSAND_EQUALS",e[e.BAR_EQUALS=111]="BAR_EQUALS",e[e.CARET_EQUALS=112]="CARET_EQUALS",e[e.AT=113]="AT",e[e.IDENTIFIER=114]="IDENTIFIER",e[e.STRINGLITERAL=115]="STRINGLITERAL",e[e.INTEGERLITERAL=116]="INTEGERLITERAL",e[e.FLOATLITERAL=117]="FLOATLITERAL",e[e.INVALID=118]="INVALID",e[e.ENDOFFILE=119]="ENDOFFILE"}(a=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(s=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=p,t.tokenIsAlsoIdentifier=u,t.operatorTokenToString=function(e){switch(e){case a.DELETE:return"delete";case a.IN:return"in";case a.INSTANCEOF:return"instanceof";case a.NEW:return"new";case a.TYPEOF:return"typeof";case a.VOID:return"void";case a.YIELD:return"yield";case a.DOT_DOT_DOT:return"...";case a.COMMA:return",";case a.LESSTHAN:return"<";case a.GREATERTHAN:return">";case a.LESSTHAN_EQUALS:return"<=";case a.GREATERTHAN_EQUALS:return">=";case a.EQUALS_EQUALS:return"==";case a.EXCLAMATION_EQUALS:return"!=";case a.EQUALS_EQUALS_EQUALS:return"===";case a.EXCLAMATION_EQUALS_EQUALS:return"!==";case a.PLUS:return"+";case a.MINUS:return"-";case a.ASTERISK_ASTERISK:return"**";case a.ASTERISK:return"*";case a.SLASH:return"/";case a.PERCENT:return"%";case a.PLUS_PLUS:return"++";case a.MINUS_MINUS:return"--";case a.LESSTHAN_LESSTHAN:return"<<";case a.GREATERTHAN_GREATERTHAN:return">>";case a.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case a.AMPERSAND:return"&";case a.BAR:return"|";case a.CARET:return"^";case a.EXCLAMATION:return"!";case a.TILDE:return"~";case a.AMPERSAND_AMPERSAND:return"&&";case a.BAR_BAR:return"||";case a.EQUALS:return"=";case a.PLUS_EQUALS:return"+=";case a.MINUS_EQUALS:return"-=";case a.ASTERISK_EQUALS:return"*=";case a.ASTERISK_ASTERISK_EQUALS:return"**=";case a.SLASH_EQUALS:return"/=";case a.PERCENT_EQUALS:return"%=";case a.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case a.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case a.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case a.AMPERSAND_EQUALS:return"&=";case a.BAR_EQUALS:return"|=";case a.CARET_EQUALS:return"^=";default:return assert(!1),""}};var h=function(){function e(e,t,r){this.debugInfoRef=0,this.source=e,this.start=t,this.end=r}return e.join=function(t,r){if(t.source!=r.source)throw new Error("source mismatch");return new e(t.source,t.startr.end?t.end:r.end)},Object.defineProperty(e.prototype,"atStart",{get:function(){return new e(this.source,this.start,this.start)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"atEnd",{get:function(){return new e(this.source,this.end,this.end)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"line",{get:function(){for(var e=this.source.text,t=1,r=this.start;r>=0;--r)10==e.charCodeAt(r)&&t++;return t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"column",{get:function(){for(var e=this.source.text,t=0,r=this.start-1;r>=0&&10!=e.charCodeAt(r);--r)++t;return t},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return this.source.text.substring(this.start,this.end)},e}();t.Range=h;var _=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,r)||this;n.end=0,n.pos=0,n.token=-1,n.tokenPos=0,n.nextToken=-1,n.nextTokenPos=0,n.nextTokenOnNewLine=!1,n.onComment=null,n.source=t,n.pos=0,n.end=t.text.length,n.diagnostics=r||new Array;var i=t.text;if(n.pos1&&this.pos2&&this.pos1&&this.pos1&&this.pos1&&this.pos2&&this.pos1&&this.pos1&&this.pos1&&this.pos2&&this.pos+11&&this.pos1&&this.pos2&&this.pos1&&this.pos2&&this.pos1&&this.pos2&&this.pos3&&this.pos1&&this.pos1&&this.pos=this.end){n+=e.substring(r,this.pos),this.error(o.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.end));break}var i=e.charCodeAt(this.pos);if(i==t){n+=e.substring(r,this.pos++);break}if(92!=i){if(l.isLineBreak(i)){n+=e.substring(r,this.pos),this.error(o.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.pos));break}++this.pos}else n+=e.substring(r,this.pos),n+=this.readEscapeSequence(),r=this.pos}return n},t.prototype.readEscapeSequence=function(){if(++this.pos>=this.end)return this.error(o.DiagnosticCode.Unexpected_end_of_text,this.range(this.end)),"";var e=this.source.text,t=e.charCodeAt(this.pos++);switch(t){case 48:return"\0";case 98:return"\b";case 116:return"\t";case 110:return"\n";case 118:return"\v";case 102:return"\f";case 114:return"\r";case 39:return"'";case 34:return'"';case 117:return this.pos=this.end){this.error(o.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.end));break}if(92!=e.charCodeAt(this.pos)){var n=e.charCodeAt(this.pos);if(47==n&&!r)break;if(l.isLineBreak(n)){this.error(o.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.pos));break}++this.pos,r=!1}else++this.pos,r=!0}return e.substring(t,this.pos)},t.prototype.readRegexpFlags=function(){for(var e=this.source.text,t=this.pos,r=0;this.pos57)&&95!=r)break;t++}return!0},t.prototype.readInteger=function(){var e=this.source.text;if(48==e.charCodeAt(this.pos)&&this.pos+2=48&&s<=57)r=i64_add(i64_mul(r,n),i64_new(s-48,0));else if(s>=65&&s<=70)r=i64_add(i64_mul(r,n),i64_new(10+s-65,0));else if(s>=97&&s<=102)r=i64_add(i64_mul(r,n),i64_new(10+s-97,0));else{if(95!=s)break;i==a&&this.error(i==t?o.DiagnosticCode.Numeric_separators_are_not_allowed_here:o.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(o.DiagnosticCode.Hexadecimal_digit_expected,this.range(t)):i==this.pos&&this.error(o.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readDecimalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(10,0),i=t;this.pos=48&&s<=57)r=i64_add(i64_mul(r,n),i64_new(s-48,0));else{if(95!=s)break;i==a&&this.error(i==t?o.DiagnosticCode.Numeric_separators_are_not_allowed_here:o.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(o.DiagnosticCode.Digit_expected,this.range(t)):i==this.pos&&this.error(o.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readOctalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(8,0),i=t;this.pos=48&&s<=55)r=i64_add(i64_mul(r,n),i64_new(s-48,0));else{if(95!=s)break;i==a&&this.error(i==t?o.DiagnosticCode.Numeric_separators_are_not_allowed_here:o.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}++this.pos}return this.pos==t?this.error(o.DiagnosticCode.Octal_digit_expected,this.range(t)):i==this.pos&&this.error(o.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readBinaryInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(2,0),i=i64_new(1,0),a=t;this.pos=48&&n<=57)t=16*t+n-48;else if(n>=65&&n<=70)t=16*t+10+n-65;else{if(!(n>=97&&n<=102))return this.error(o.DiagnosticCode.Hexadecimal_digit_expected,this.range(this.pos-1,this.pos)),"";t=16*t+10+n-97}if(0==--e)break}return e?(this.error(o.DiagnosticCode.Unexpected_end_of_text,this.range(this.pos)),""):String.fromCharCode(t)},t.prototype.readExtendedUnicodeEscape=function(){var e=this.pos,t=this.readHexInteger(),r=i64_low(t),n=!1;assert(!i64_high(t)),r>1114111&&(this.error(o.DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,this.range(e,this.pos)),n=!0);var i=this.source.text;return this.pos>=this.end?(this.error(o.DiagnosticCode.Unexpected_end_of_text,this.range(e,this.end)),n=!0):125==i.charCodeAt(this.pos)?++this.pos:(this.error(o.DiagnosticCode.Unterminated_Unicode_escape_sequence,this.range(e,this.pos)),n=!0),n?"":r<65536?String.fromCharCode(r):String.fromCharCode(55296+((r-65536)/1024|0),(r-65536)%1024+56320)},t.prototype.finish=function(){},t}(o.DiagnosticEmitter);t.Tokenizer=_;var d=function(){return function(){}}();t.State=d;var y=null},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(5),i=r(3);!function(e){e[e.I8=0]="I8",e[e.I16=1]="I16",e[e.I32=2]="I32",e[e.I64=3]="I64",e[e.ISIZE=4]="ISIZE",e[e.U8=5]="U8",e[e.U16=6]="U16",e[e.U32=7]="U32",e[e.U64=8]="U64",e[e.USIZE=9]="USIZE",e[e.BOOL=10]="BOOL",e[e.F32=11]="F32",e[e.F64=12]="F64",e[e.V128=13]="V128",e[e.VOID=14]="VOID"}(t.TypeKind||(t.TypeKind={})),function(e){e[e.NONE=0]="NONE",e[e.SIGNED=1]="SIGNED",e[e.UNSIGNED=2]="UNSIGNED",e[e.INTEGER=4]="INTEGER",e[e.FLOAT=8]="FLOAT",e[e.POINTER=16]="POINTER",e[e.SHORT=32]="SHORT",e[e.LONG=64]="LONG",e[e.VALUE=128]="VALUE",e[e.REFERENCE=256]="REFERENCE",e[e.NULLABLE=512]="NULLABLE",e[e.VECTOR=1024]="VECTOR"}(t.TypeFlags||(t.TypeFlags={}));var a=new Uint8Array(16),s=function(){function e(e,t,r){this.cachedNullableType=null,this.kind=e,this.flags=t,this.size=r,this.byteSize=ceil(r/8),this.classReference=null,this.signatureReference=null,this.nonNullableType=this}return Object.defineProperty(e.prototype,"intType",{get:function(){switch(this.kind){case 0:return e.i8;case 1:return e.i16;case 11:case 2:return e.i32;case 12:case 3:return e.i64;case 4:return 64==this.size?e.isize64:e.isize32;case 5:return e.u8;case 6:return e.u16;case 7:return e.u32;case 8:return e.u64;case 9:return 64==this.size?e.usize64:e.usize32;case 10:default:return e.i32}},enumerable:!0,configurable:!0}),e.prototype.isManaged=function(e){if(e.hasGC){var t=this.classReference;return null!==t&&!t.hasDecorator(n.DecoratorFlags.UNMANAGED)}return!1},e.prototype.computeSmallIntegerShift=function(e){return e.size-this.size},e.prototype.computeSmallIntegerMask=function(e){var t=this.is(2)?this.size:this.size-1;return-1>>>e.size-t},e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.asClass=function(t){assert(9==this.kind&&!this.classReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.classReference=t,r},e.prototype.asFunction=function(t){assert(7==this.kind&&!this.signatureReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.signatureReference=t,r},e.prototype.asNullable=function(){return assert(this.is(256)),this.cachedNullableType||(assert(!this.is(512)),this.cachedNullableType=new e(this.kind,512|this.flags,this.size),this.cachedNullableType.nonNullableType=this,this.cachedNullableType.classReference=this.classReference,this.cachedNullableType.signatureReference=this.signatureReference),this.cachedNullableType},e.prototype.isAssignableTo=function(t,r){var n,i,a,s;if(void 0===r&&(r=!1),this.is(256)){if(t.is(256)&&(!this.is(512)||t.is(512)))if(n=this.classReference){if(i=t.classReference)return n.isAssignableTo(i)}else if((a=this.signatureReference)&&(s=t.signatureReference))return a.isAssignableTo(s)}else if(!t.is(256))if(this.is(4))if(t.is(4)){if(!r||this==e.bool||this.is(1)==t.is(1))return this.size<=t.size}else{if(11==t.kind)return this.size<=23;if(12==t.kind)return this.size<=52}else if(this.is(8)){if(t.is(8))return this.size<=t.size}else if(this.is(1024)&&t.is(1024))return this.size==t.size;return!1},e.commonCompatible=function(e,t,r){return t.isAssignableTo(e,r)?e:e.isAssignableTo(t,r)?t:null},e.prototype.toString=function(e){if(void 0===e&&(e=!1),!e&&this.is(256)){var t=this.classReference;if(t)return this.is(512)?t.toString()+" | null":t.toString();var r=this.signatureReference;if(r)return this.is(512)?"("+r.toString(!0)+") | null":r.toString(!0);assert(!1)}switch(this.kind){case 0:return"i8";case 1:return"i16";case 2:return"i32";case 3:return"i64";case 4:return"isize";case 5:return"u8";case 6:return"u16";case 7:return"u32";case 8:return"u64";case 9:return"usize";case 10:return"bool";case 11:return"f32";case 12:return"f64";case 13:return"v128";default:assert(!1);case 14:return"void"}},e.prototype.toNativeType=function(){switch(this.kind){default:return i.NativeType.I32;case 3:case 8:return i.NativeType.I64;case 4:case 9:return 64==this.size?i.NativeType.I64:i.NativeType.I32;case 11:return i.NativeType.F32;case 12:return i.NativeType.F64;case 13:return i.NativeType.V128;case 14:return i.NativeType.None}},e.prototype.toNativeZero=function(e){switch(this.kind){case 14:assert(!1);default:return e.createI32(0);case 4:case 9:if(64!=this.size)return e.createI32(0);case 3:case 8:return e.createI64(0);case 11:return e.createF32(0);case 12:return e.createF64(0);case 13:return e.createV128(a)}},e.prototype.toNativeOne=function(e){switch(this.kind){case 13:case 14:assert(!1);default:return e.createI32(1);case 4:case 9:if(64!=this.size)return e.createI32(1);case 3:case 8:return e.createI64(1);case 11:return e.createF32(1);case 12:return e.createF64(1)}},e.prototype.toNativeNegOne=function(e){switch(this.kind){case 13:case 14:assert(!1);default:return e.createI32(-1);case 4:case 9:if(64!=this.size)return e.createI32(-1);case 3:case 8:return e.createI64(-1,-1);case 11:return e.createF32(-1);case 12:return e.createF64(-1)}},e.prototype.toSignatureString=function(){switch(this.kind){default:return"i";case 3:case 8:return"I";case 4:case 9:return 64==this.size?"I":"i";case 11:return"f";case 12:return"F";case 13:return"v";case 14:return"_"}},e.i8=new e(0,165,8),e.i16=new e(1,165,16),e.i32=new e(2,133,32),e.i64=new e(3,197,64),e.isize32=new e(4,149,32),e.isize64=new e(4,213,64),e.u8=new e(5,166,8),e.u16=new e(6,166,16),e.u32=new e(7,134,32),e.u64=new e(8,198,64),e.usize32=new e(9,150,32),e.usize64=new e(9,214,64),e.bool=new e(10,166,1),e.f32=new e(11,137,32),e.f64=new e(12,201,64),e.v128=new e(13,1152,128),e.void=new e(14,0,0),e}();t.Type=s,t.typesToNativeTypes=function(e){for(var t=e.length,r=new Array(t),n=0;ne?t[e]:l(e)},e.prototype.isAssignableTo=function(e){var t=this.thisType,r=e.thisType;if(t){if(!r||!t.isAssignableTo(r))return!1}else if(r)return!1;if(this.hasRest!=e.hasRest)return!1;var n=this.parameterTypes,i=e.parameterTypes,a=n.length;if(a!=i.length)return!1;for(var s=0;s=c&&u!=p?t.push("?: "):t.push(": "),t.push(i[u].toString());return t.push(") => "),t.push(this.returnType.toString()),t.join("")},e}();t.Signature=o;var c=null;function l(e){c||(c=[]);for(var t=c.length;t<=e;++t)c.push("arg$"+t.toString(10));return c[e-1]}t.getDefaultParameterName=l},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o,c=r(23),l=r(2),p=r(3),u=r(1),h=r(5),_=r(6),d=r(4),y=r(7),m=r(0);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(o=t.Target||(t.Target={}));var g=function(){function e(){this.target=o.WASM32,this.noTreeShaking=!1,this.noAssert=!1,this.importMemory=!1,this.importTable=!1,this.sourceMap=!1,this.memoryBase=0,this.globalAliases=null,this.features=0,this.optimizeLevelHint=0,this.shrinkLevelHint=0}return Object.defineProperty(e.prototype,"isWasm64",{get:function(){return this.target==o.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==o.WASM64?y.Type.usize64:y.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==o.WASM64?y.Type.isize64:y.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==o.WASM64?p.NativeType.I64:p.NativeType.I32},enumerable:!0,configurable:!0}),e.prototype.hasFeature=function(e){return 0!=(this.features&e)},e}();t.Options=g,function(e){e[e.NONE=0]="NONE",e[e.SIGN_EXTENSION=1]="SIGN_EXTENSION",e[e.MUTABLE_GLOBAL=2]="MUTABLE_GLOBAL",e[e.BULK_MEMORY=4]="BULK_MEMORY",e[e.SIMD=8]="SIMD",e[e.THREADS=16]="THREADS"}(t.Feature||(t.Feature={})),function(e){e[e.NONE=0]="NONE",e[e.IMPLICIT=1]="IMPLICIT",e[e.EXPLICIT=2]="EXPLICIT"}(t.ConversionKind||(t.ConversionKind={})),function(e){e[e.NONE=0]="NONE",e[e.WRAP=1]="WRAP"}(t.WrapMode||(t.WrapMode={}));var T,E,f=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,t.diagnostics)||this;return n.currentInlineFunctions=[],n.currentEnum=null,n.currentType=y.Type.void,n.memorySegments=[],n.stringSegments=new Map,n.functionTable=["null"],n.argcVar=0,n.argcSet=0,n.needsIterateRoots=!1,n.f32ModInstance=null,n.f64ModInstance=null,n.f32PowInstance=null,n.f64PowInstance=null,n.program=t,n.resolver=t.resolver,r||(r=new g),n.options=r,n.memoryOffset=i64_new(max(r.memoryBase,8)),n.module=p.Module.create(),n}return i(t,e),t.compile=function(e,r){return void 0===r&&(r=null),new t(e,r).compile()},t.prototype.compile=function(){var e,t,r=this.options,n=this.module,i=this.program;i.initialize(r);var o=new h.Function(i.startFunction,"start",new y.Signature([],y.Type.void));this.startFunctionInstance=o;var l=new Array;this.startFunctionBody=l,this.currentFlow=o.flow,r.isWasm64?n.addGlobal("HEAP_BASE",p.NativeType.I64,!0,n.createI64(0,0)):n.addGlobal("HEAP_BASE",p.NativeType.I32,!1,n.createI32(0));for(var u=i.sources,_=0,d=u.length;_"),!1;e.type=this.currentType,e.set(u.CommonFlags.RESOLVED)}else assert(!1);if(e.is(u.CommonFlags.AMBIENT)&&e.hasDecorator(h.DecoratorFlags.BUILTIN))return!0;var a=e.type.toNativeType(),s=e.is(u.CommonFlags.CONST)||e.is(u.CommonFlags.STATIC|u.CommonFlags.READONLY);if(e.is(u.CommonFlags.AMBIENT))return s||this.options.hasFeature(2)?(e.set(u.CommonFlags.MODULE_IMPORT),r?I(e,r):(T="env",E=e.simpleName),t.addGlobalImport(e.internalName,T,E,a),e.set(u.CommonFlags.COMPILED),!0):(this.error(l.DiagnosticCode.Operation_not_supported,assert(r).range),!1);var o=!1;if(null!==r&&null!==r.initializer){if(n||(n=this.compileExpression(r.initializer,e.type,1,1)),p.getExpressionId(n)!=p.ExpressionId.Const&&(s?(n=t.precomputeExpression(n),p.getExpressionId(n)!=p.ExpressionId.Const&&(this.warning(l.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,r.range),o=!0)):o=!0),e.hasDecorator(h.DecoratorFlags.INLINE)&&!o){switch(assert(p.getExpressionId(n)==p.ExpressionId.Const),p.getExpressionType(n)){case p.NativeType.I32:e.constantValueKind=1,e.constantIntegerValue=i64_new(p.getConstValueI32(n),0);break;case p.NativeType.I64:e.constantValueKind=1,e.constantIntegerValue=i64_new(p.getConstValueI64Low(n),p.getConstValueI64High(n));break;case p.NativeType.F32:e.constantValueKind=2,e.constantFloatValue=p.getConstValueF32(n);break;case p.NativeType.F64:e.constantValueKind=2,e.constantFloatValue=p.getConstValueF64(n);break;default:return assert(!1),!1}e.set(u.CommonFlags.INLINED)}}else n=e.type.toNativeZero(t);var c=e.internalName;return o?(t.addGlobal(c,a,!0,e.type.toNativeZero(t)),this.startFunctionBody.push(t.createSetGlobal(c,n))):t.addGlobal(c,a,!s,n),!0},t.prototype.compileEnumDeclaration=function(e){var t=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(t.kind==h.ElementKind.ENUM),this.compileEnum(t)?t:null},t.prototype.compileEnum=function(e){var t,r;if(e.is(u.CommonFlags.COMPILED))return!0;e.set(u.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var i=null,s=!1;if(e.members)try{for(var o=a(e.members.values()),c=o.next();!c.done;c=o.next()){var _=c.value;if(_.kind==h.ElementKind.ENUMVALUE){var d=!1,m=_,g=m.declaration;m.set(u.CommonFlags.COMPILED);var T=void 0;g.value?(T=this.compileExpression(g.value,y.Type.i32,1,0),p.getExpressionId(T)!=p.ExpressionId.Const&&(e.is(u.CommonFlags.CONST)?(T=n.precomputeExpression(T),p.getExpressionId(T)!=p.ExpressionId.Const&&(this.error(l.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,g.value.range),d=!0)):d=!0)):null==i?T=n.createI32(0):(s&&this.error(l.DiagnosticCode.Enum_member_must_have_initializer,g.range),T=n.createBinary(p.BinaryOp.AddI32,n.createGetGlobal(i.internalName,p.NativeType.I32),n.createI32(1)),T=n.precomputeExpression(T),p.getExpressionId(T)!=p.ExpressionId.Const&&(e.is(u.CommonFlags.CONST)&&this.error(l.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,g.range),d=!0)),d?(n.addGlobal(m.internalName,p.NativeType.I32,!0,n.createI32(0)),this.startFunctionBody.push(n.createSetGlobal(m.internalName,T)),s=!0):(n.addGlobal(m.internalName,p.NativeType.I32,!e.is(u.CommonFlags.CONST),T),s=!1),i=m}}}catch(e){t={error:e}}finally{try{c&&!c.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}return this.currentEnum=null,!0},t.prototype.compileFunctionDeclaration=function(e,t){var r=assert(this.program.elementsLookup.get(e.fileLevelInternalName));return assert(r.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.compileFunctionUsingTypeArguments(r,t,m.makeMap(),null,r.declaration.name)},t.prototype.compileFunctionUsingTypeArguments=function(e,t,r,n,i){var a=this.resolver.resolveFunctionInclTypeArguments(e,t,r,i);return a?(a.outerScope=n,this.compileFunction(a)?a:null):null},t.prototype.ensureFunctionType=function(e,t,r){void 0===r&&(r=null);var n,i=e?e.length:0,a=0;if(r?((n=new Array(1+i))[0]=r.toNativeType(),a=1):n=new Array(i),e)for(var s=0;s=0)return e.functionTableIndex;var t=this.functionTable,r=t.length;return!e.is(u.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters=0?"case"+u.toString(10):"break")+"|"+a);var d=t.createBlock("case0|"+a,c,p.NativeType.None),m=!0,g=!0,T=!0,E=!0;for(h=0;h=0&&(m&&i.set(1),g&&i.set(2),T&&i.set(4),E&&i.set(32)),d},t.prototype.compileThrowStatement=function(e){var t=this.currentFlow;return t.set(4),t.set(1),c.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileVariableStatement=function(e,t){void 0===t&&(t=!1);var r=this.program,n=e.declarations,i=n.length,a=this.currentFlow;if(t||a.parentFunction==this.startFunctionInstance&&e.parent&&e.parent.kind==d.NodeKind.SOURCE){for(var s=0;s");continue}g=this.currentType}var E=!1;if(_.is(u.CommonFlags.CONST))if(T)if(T=this.module.precomputeExpression(T),p.getExpressionId(T)==p.ExpressionId.Const){var f=new h.Local(r,m,-1,g);switch(p.getExpressionType(T)){case p.NativeType.I32:f=f.withConstantIntegerValue(i64_new(p.getConstValueI32(T),0));break;case p.NativeType.I64:f=f.withConstantIntegerValue(i64_new(p.getConstValueI64Low(T),p.getConstValueI64High(T)));break;case p.NativeType.F32:f=f.withConstantFloatValue(p.getConstValueF32(T));break;case p.NativeType.F64:f=f.withConstantFloatValue(p.getConstValueF64(T));break;default:return assert(!1),this.module.createUnreachable()}var I=a.scopedLocals;if(I){if(I.has(m))return this.error(l.DiagnosticCode.Duplicate_identifier_0,_.name.range,m),this.module.createUnreachable()}else a.scopedLocals=I=new Map;I.set(m,f),E=!0}else this.warning(l.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,_.range);else this.error(l.DiagnosticCode._const_declarations_must_be_initialized,_.range);if(!E){f=void 0;if(_.isAny(u.CommonFlags.LET|u.CommonFlags.CONST)||a.is(4096))f=a.addScopedLocal(m,g,!1,_.name);else{if(a.lookupLocal(m)){this.error(l.DiagnosticCode.Duplicate_identifier_0,_.name.range,m);continue}f=a.parentFunction.addLocal(g,m,_)}T?(o.push(this.compileAssignmentWithValue(_.name,T)),f.type.is(36)&&a.setLocalWrapped(f.index,!a.canOverflow(T,g))):f.type.is(36)&&a.setLocalWrapped(f.index,!0)}}return o.length?1==o.length?o[0]:this.module.createBlock(null,o,p.NativeType.None):0},t.prototype.compileVoidStatement=function(e){return this.compileExpression(e.expression,y.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.currentFlow,n=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,y.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||r.actualFunction.isAny(u.CommonFlags.GENERIC|u.CommonFlags.GENERIC_CONTEXT)){var i=t.precomputeExpression(n);if(p.getExpressionId(i)==p.ExpressionId.Const&&p.getExpressionType(i)==p.NativeType.I32){if(!p.getConstValueI32(i))return t.createNop()}else n=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,y.Type.bool,0),this.currentType)}var a=r.pushBreakLabel(),s=r.fork();this.currentFlow=s;var o="break|"+a;s.breakLabel=o;var c="continue|"+a;s.continueLabel=c;var l=this.compileStatement(e.statement),h=s.isAny(29);return s.freeScopedLocals(),r.popBreakLabel(),this.currentFlow=r,s.unset(1560),r.inheritConditional(s),t.createBlock(o,[t.createLoop(c,t.createIf(n,h?l:t.createBlock(null,[l,t.createBreak(c)],p.NativeType.None)))])},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(u.CommonFlags.INLINED));var n=e.type;switch(!r&&n.is(4)&&t.is(4)&&n.size>i:0);case 5:case 6:case 10:var a=e.type.computeSmallIntegerMask(y.Type.i32);return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue)&a:0);case 2:case 7:return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 4:case 9:if(!e.program.options.isWasm64)return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 3:case 8:return 1==e.constantValueKind?this.module.createI64(i64_low(e.constantIntegerValue),i64_high(e.constantIntegerValue)):this.module.createI64(0);case 12:if(!e.hasDecorator(h.DecoratorFlags.BUILTIN)||t!=y.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=y.Type.f32;case 11:return this.module.createF32(e.constantFloatValue);default:return assert(!1),this.module.createUnreachable()}},t.prototype.compileExpression=function(e,t,r,n){var i;switch(this.currentType=t,e.kind){case d.NodeKind.ASSERTION:i=this.compileAssertionExpression(e,t);break;case d.NodeKind.BINARY:i=this.compileBinaryExpression(e,t);break;case d.NodeKind.CALL:i=this.compileCallExpression(e,t);break;case d.NodeKind.COMMA:i=this.compileCommaExpression(e,t);break;case d.NodeKind.ELEMENTACCESS:i=this.compileElementAccessExpression(e,t);break;case d.NodeKind.FUNCTION:i=this.compileFunctionExpression(e,t);break;case d.NodeKind.IDENTIFIER:case d.NodeKind.FALSE:case d.NodeKind.NULL:case d.NodeKind.THIS:case d.NodeKind.SUPER:case d.NodeKind.TRUE:i=this.compileIdentifierExpression(e,t,0==r);break;case d.NodeKind.INSTANCEOF:i=this.compileInstanceOfExpression(e,t);break;case d.NodeKind.LITERAL:i=this.compileLiteralExpression(e,t);break;case d.NodeKind.NEW:i=this.compileNewExpression(e,t);break;case d.NodeKind.PARENTHESIZED:i=this.compileParenthesizedExpression(e,t);break;case d.NodeKind.PROPERTYACCESS:i=this.compilePropertyAccessExpression(e,t,0==r);break;case d.NodeKind.TERNARY:i=this.compileTernaryExpression(e,t);break;case d.NodeKind.UNARYPOSTFIX:i=this.compileUnaryPostfixExpression(e,t);break;case d.NodeKind.UNARYPREFIX:i=this.compileUnaryPrefixExpression(e,t);break;default:this.error(l.DiagnosticCode.Operation_not_supported,e.range),i=this.module.createUnreachable()}var a=this.currentType;return 0!=r&&a!=t?(i=this.convertExpression(i,a,t,r,n,e),this.currentType=t):1==n&&(i=this.ensureSmallIntegerWrap(i,a)),this.options.sourceMap&&this.addDebugLocation(i,e.range),i},t.prototype.compileExpressionRetainType=function(e,t,r){return this.compileExpression(e,t==y.Type.void?y.Type.i32:t,0,r)},t.prototype.precomputeExpression=function(e,t,r,n){return this.module.precomputeExpression(this.compileExpression(e,t,r,n))},t.prototype.convertExpression=function(e,t,r,n,i,a){assert(0!=n);var s=this.module;return 14==t.kind?(assert(14!=r.kind),this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,a.range,t.toString(),r.toString()),s.createUnreachable()):14==r.kind?s.createDrop(e):(t.isAssignableTo(r)||1==n&&this.error(l.DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,a.range,t.toString(),r.toString()),t.is(8)?r.is(8)?11==t.kind?12==r.kind&&(e=s.createUnary(p.UnaryOp.PromoteF32,e)):11==r.kind&&(e=s.createUnary(p.UnaryOp.DemoteF64,e)):r.is(4)?11==t.kind?r==y.Type.bool?(e=s.createBinary(p.BinaryOp.NeF32,e,s.createF32(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(p.UnaryOp.TruncF32ToI64,e):s.createUnary(p.UnaryOp.TruncF32ToI32,e):r.is(64)?s.createUnary(p.UnaryOp.TruncF32ToU64,e):s.createUnary(p.UnaryOp.TruncF32ToU32,e):r==y.Type.bool?(e=s.createBinary(p.BinaryOp.NeF64,e,s.createF64(0)),i=0):e=r.is(1)?r.is(64)?s.createUnary(p.UnaryOp.TruncF64ToI64,e):s.createUnary(p.UnaryOp.TruncF64ToI32,e):r.is(64)?s.createUnary(p.UnaryOp.TruncF64ToU64,e):s.createUnary(p.UnaryOp.TruncF64ToU32,e):(assert(0==r.flags,"void type expected"),e=s.createDrop(e)):t.is(4)&&r.is(8)?e=11==r.kind?t.is(64)?s.createUnary(t.is(1)?p.UnaryOp.ConvertI64ToF32:p.UnaryOp.ConvertU64ToF32,e):s.createUnary(t.is(1)?p.UnaryOp.ConvertI32ToF32:p.UnaryOp.ConvertU32ToF32,e):t.is(64)?s.createUnary(t.is(1)?p.UnaryOp.ConvertI64ToF64:p.UnaryOp.ConvertU64ToF64,e):s.createUnary(t.is(1)?p.UnaryOp.ConvertI32ToF64:p.UnaryOp.ConvertU32ToF64,e):t.is(64)?r==y.Type.bool?(e=s.createBinary(p.BinaryOp.NeI64,e,s.createI64(0)),i=0):r.is(64)||(e=s.createUnary(p.UnaryOp.WrapI64,e)):r.is(64)?(e=s.createUnary(t.is(1)?p.UnaryOp.ExtendI32:p.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d),s.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.GtI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GtI64:p.BinaryOp.GtI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.GtU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GtU64:p.BinaryOp.GtU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.GtU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.GtF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.GtF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=y.Type.bool;break;case _.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.LE)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!0)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d),s.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.LeI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.LeI64:p.BinaryOp.LeI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.LeU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.LeU64:p.BinaryOp.LeU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.LeU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.LeF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.LeF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=y.Type.bool;break;case _.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.GE)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!0)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d),s.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.GeI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GeI64:p.BinaryOp.GeI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.GeU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.GeU64:p.BinaryOp.GeU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.GeU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.GeF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.GeF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=y.Type.bool;break;case _.Token.EQUALS_EQUALS_EQUALS:case _.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,g==_.Token.EQUALS_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.EQ)){o=this.compileBinaryOverload(v,u,r,d,e);break}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,_.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.EqI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.EqI64:p.BinaryOp.EqI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.EqI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.EqF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.EqF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=y.Type.bool;break;case _.Token.EXCLAMATION_EQUALS_EQUALS:case _.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,g==_.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.NE)){o=this.compileBinaryOverload(v,u,r,d,e);break}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,_.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d),s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:o=c.createBinary(p.BinaryOp.NeI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.NeI64:p.BinaryOp.NeI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.NeI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.NeF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.NeF64,r,i);break;default:assert(!1),o=c.createUnreachable()}this.currentType=y.Type.bool;break;case _.Token.EQUALS:return this.compileAssignment(u,d,t);case _.Token.PLUS_EQUALS:m=!0;case _.Token.PLUS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.ADD)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0);else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.AddI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.AddI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.AddF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.AddF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case _.Token.MINUS_EQUALS:m=!0;case _.Token.MINUS:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.SUB)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.SubI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.SubI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.SubF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.SubF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case _.Token.ASTERISK_EQUALS:m=!0;case _.Token.ASTERISK:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.MUL)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1);else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.MulI32,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.MulI64:p.BinaryOp.MulI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.MulI64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.MulF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.MulF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case _.Token.ASTERISK_ASTERISK_EQUALS:m=!0;case _.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.POW)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}var T=void 0;if(11==this.currentType.kind){if(i=this.compileExpression(d,y.Type.f32,1,0),a=this.currentType,!(T=this.f32PowInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=c.createUnreachable();break}if(!(f=E.members?E.members.get("pow"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),o=c.createUnreachable();break}assert(f.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=T=this.resolver.resolveFunction(f,null)}}else if(r=this.convertExpression(r,this.currentType,y.Type.f64,1,0,u),n=this.currentType,i=this.compileExpression(d,y.Type.f64,1,0),a=this.currentType,!(T=this.f64PowInstance)){if(!(E=this.program.elementsLookup.get("Math"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=c.createUnreachable();break}if(!(f=E.members?E.members.get("pow"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),o=c.createUnreachable();break}assert(f.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=T=this.resolver.resolveFunction(f,null)}o=T&&this.compileFunction(T)?this.makeCallDirect(T,[r,i]):c.createUnreachable();break;case _.Token.SLASH_EQUALS:m=!0;case _.Token.SLASH:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.DIV)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d)}switch(this.currentType.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.DivI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.DivI64:p.BinaryOp.DivI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.DivU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.DivU64:p.BinaryOp.DivU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.DivU64,r,i);break;case 11:o=c.createBinary(p.BinaryOp.DivF32,r,i);break;case 12:o=c.createBinary(p.BinaryOp.DivF64,r,i);break;default:assert(!1),o=c.createUnreachable()}break;case _.Token.PERCENT_EQUALS:m=!0;case _.Token.PERCENT:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.REM)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,1,u),i=this.convertExpression(i,a,a=s,1,1,d)}switch(this.currentType.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.RemI32,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.RemI64:p.BinaryOp.RemI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.RemU32,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.RemU64:p.BinaryOp.RemU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.RemU64,r,i);break;case 11:if(!(T=this.f32ModInstance)){if(!(E=this.program.elementsLookup.get("Mathf"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),o=c.createUnreachable();break}if(!(f=E.members?E.members.get("mod"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),o=c.createUnreachable();break}assert(f.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=T=this.resolver.resolveFunction(f,null)}o=T&&this.compileFunction(T)?this.makeCallDirect(T,[r,i]):c.createUnreachable();break;case 12:if(!(T=this.f64ModInstance)){var E,f;if(!(E=this.program.elementsLookup.get("Math"))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),o=c.createUnreachable();break}if(!(f=E.members?E.members.get("mod"):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),o=c.createUnreachable();break}assert(f.kind==h.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=T=this.resolver.resolveFunction(f,null)}o=T&&this.compileFunction(T)?this.makeCallDirect(T,[r,i]):c.createUnreachable();break;default:assert(!1),o=c.createUnreachable()}break;case _.Token.LESSTHAN_LESSTHAN_EQUALS:m=!0;case _.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_SHL)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(d,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:o=c.createBinary(p.BinaryOp.ShlI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.ShlI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShlI64:p.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,_.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case _.Token.GREATERTHAN_GREATERTHAN_EQUALS:m=!0;case _.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_SHR)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:o=c.createBinary(p.BinaryOp.ShrI32,r,i);break;case 3:o=c.createBinary(p.BinaryOp.ShrI64,r,i);break;case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrI64:p.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.ShrU32,r,i);break;case 8:o=c.createBinary(p.BinaryOp.ShrU64,r,i);break;case 9:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrU64:p.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,_.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case _.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:m=!0;case _.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_SHR_U)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:o=c.createBinary(p.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:o=c.createBinary(p.BinaryOp.ShrU32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.ShrU64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrU64:p.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,_.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case _.Token.AMPERSAND_EQUALS:m=!0;case _.Token.AMPERSAND:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_AND)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:o=c.createBinary(p.BinaryOp.AndI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.AndI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.AndI64:p.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,_.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case _.Token.BAR_EQUALS:m=!0;case _.Token.BAR:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_OR)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=c.createBinary(p.BinaryOp.OrI32,r,i);break;case 2:case 7:o=c.createBinary(p.BinaryOp.OrI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.OrI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.OrI64:p.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,_.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case _.Token.CARET_EQUALS:m=!0;case _.Token.CARET:if(r=this.compileExpressionRetainType(u,t.intType,0),n=this.currentType,this.currentType.is(256)){var I,v;if(I=n.classReference)if(v=I.lookupOverload(h.OperatorKind.BITWISE_XOR)){o=this.compileBinaryOverload(v,u,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(s=y.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=s,1,0,u),i=this.convertExpression(i,a,a=s,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:o=c.createBinary(p.BinaryOp.XorI32,r,i);break;case 2:case 7:o=c.createBinary(p.BinaryOp.XorI32,r,i);break;case 3:case 8:o=c.createBinary(p.BinaryOp.XorI64,r,i);break;case 9:case 4:o=c.createBinary(this.options.isWasm64?p.BinaryOp.XorI64:p.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,_.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),o=c.createUnreachable()}break;case _.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,i=this.compileExpression(d,n,1,0),a=this.currentType,o=c.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),o=c.createIf(this.makeIsTrueish(r,this.currentType),i,o);else{var A=(C=this.currentFlow).getAndFreeTempLocal(this.currentType,!C.canOverflow(r,this.currentType));o=c.createIf(this.makeIsTrueish(c.createTeeLocal(A.index,r),this.currentType),i,c.createGetLocal(assert(A).index,this.currentType.toNativeType()))}break;case _.Token.BAR_BAR:if(r=this.compileExpressionRetainType(u,t,0),n=this.currentType,i=this.compileExpression(d,n,1,0),a=this.currentType,o=this.module.cloneExpression(r,!0,0))o=this.module.createIf(this.makeIsTrueish(r,this.currentType),o,i);else{var C;A=(C=this.currentFlow).getAndFreeTempLocal(this.currentType,!C.canOverflow(r,this.currentType));o=c.createIf(this.makeIsTrueish(c.createTeeLocal(A.index,r),this.currentType),c.createGetLocal(assert(A).index,this.currentType.toNativeType()),i)}break;default:assert(!1),o=this.module.createUnreachable()}return m?this.compileAssignmentWithValue(u,o,t!=y.Type.void):o},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(u.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a)},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,s=0;if(e.is(u.CommonFlags.INSTANCE)){var o=assert(e.parent);assert(o.kind==h.ElementKind.CLASS),s=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,s)},t.prototype.compileAssignment=function(e,t,r){var n,i=this.program.resolver,a=this.currentFlow,s=i.resolveExpression(e,a);if(!s)return this.module.createUnreachable();switch(s.kind){case h.ElementKind.GLOBAL:if(!this.compileGlobal(s))return this.module.createUnreachable();assert(s.type!=y.Type.void);case h.ElementKind.LOCAL:case h.ElementKind.FIELD:n=s.type;break;case h.ElementKind.PROPERTY:var o=s.setterPrototype;if(o){var c=this.resolver.resolveFunction(o,null);if(!c)return this.module.createUnreachable();assert(1==c.signature.parameterTypes.length),n=c.signature.parameterTypes[0];break}return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,s.internalName),this.module.createUnreachable();case h.ElementKind.CLASS:if(i.currentElementExpression){var p=a.is(8192),u=s.lookupOverload(h.OperatorKind.INDEXED_SET,p);if(!u)return s.lookupOverload(h.OperatorKind.INDEXED_GET,p)?this.error(l.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,s.internalName):this.error(l.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,s.internalName),this.module.createUnreachable();assert(2==u.signature.parameterTypes.length),n=u.signature.parameterTypes[1];break}default:return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=y.Type.void);var _=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,_,r!=y.Type.void)},t.prototype.compileAssignmentWithValue=function(e,t,r){void 0===r&&(r=!1);var n=this.module,i=this.currentFlow,a=this.resolver.resolveExpression(e,i);if(!a)return n.createUnreachable();switch(a.kind){case h.ElementKind.LOCAL:var s=a.type;return assert(s!=y.Type.void),this.currentType=r?s:y.Type.void,a.is(u.CommonFlags.CONST)?(this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable()):(s.is(36)&&i.setLocalWrapped(a.index,!i.canOverflow(t,s)),r?n.createTeeLocal(a.index,t):n.createSetLocal(a.index,t));case h.ElementKind.GLOBAL:if(!this.compileGlobal(a))return n.createUnreachable();s=a.type;if(assert(s!=y.Type.void),this.currentType=r?s:y.Type.void,a.is(u.CommonFlags.CONST))return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();if(t=this.ensureSmallIntegerWrap(t,s),r){var o=s.toNativeType(),c=a.internalName;return n.createBlock(null,[n.createSetGlobal(c,t),n.createGetGlobal(c,o)],o)}return n.createSetGlobal(a.internalName,t);case h.ElementKind.FIELD:var p=a.declaration;if(a.is(u.CommonFlags.READONLY)&&!i.actualFunction.is(u.CommonFlags.CONSTRUCTOR)&&null!=p&&null==p.initializer)return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();var _=assert(this.resolver.currentThisExpression),d=this.compileExpressionRetainType(_,this.options.usizeType,0);s=a.type;this.currentType=r?s:y.Type.void;o=s.toNativeType();if(10==s.kind&&(t=this.ensureSmallIntegerWrap(t,s)),r){var m=this.currentFlow,g=m.getAndFreeTempLocal(s,!m.canOverflow(t,s)).index;return n.createBlock(null,[n.createSetLocal(g,t),n.createStore(s.byteSize,d,n.createGetLocal(g,o),o,a.memoryOffset),n.createGetLocal(g,o)],o)}return n.createStore(s.byteSize,d,t,o,a.memoryOffset);case h.ElementKind.PROPERTY:var T=a.setterPrototype;if(T){var E=this.resolver.resolveFunction(T,null);if(!E)return n.createUnreachable();if(!r){if(E.is(u.CommonFlags.INSTANCE)){_=assert(this.resolver.currentThisExpression),d=this.compileExpressionRetainType(_,this.options.usizeType,0);return this.makeCallDirect(E,[d,t])}return this.makeCallDirect(E,[t])}var f=a.getterPrototype;assert(null!=f);var I=this.resolver.resolveFunction(f,null);if(!I)return n.createUnreachable();var v=(k=I.signature.returnType).toNativeType();if(E.is(u.CommonFlags.INSTANCE)){_=assert(this.resolver.currentThisExpression),d=this.compileExpressionRetainType(_,this.options.usizeType,0),g=i.getAndFreeTempLocal(k,!1).index;return n.createBlock(null,[this.makeCallDirect(E,[n.createTeeLocal(g,d),t]),this.makeCallDirect(I,[n.createGetLocal(g,v)])],v)}return n.createBlock(null,[this.makeCallDirect(E,[t]),this.makeCallDirect(I)],v)}return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();case h.ElementKind.CLASS:var A=this.resolver.currentElementExpression;if(A){var C=i.is(8192),S=a.lookupOverload(h.OperatorKind.INDEXED_GET,C);if(!S)return this.error(l.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,a.internalName),n.createUnreachable();var N=a.lookupOverload(h.OperatorKind.INDEXED_SET,C);if(!N)return this.error(l.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,a.internalName),this.currentType=r?S.signature.returnType:y.Type.void,n.createUnreachable();var O=a.type,x=(_=assert(this.resolver.currentThisExpression),d=this.compileExpressionRetainType(_,this.options.usizeType,0),this.compileExpression(A,y.Type.i32,1,0));if(r){var b=i.getTempLocal(O,!1),L=i.getAndFreeTempLocal(this.currentType,!1),k=S.signature.returnType;return i.freeTempLocal(b),n.createBlock(null,[this.makeCallDirect(N,[n.createTeeLocal(b.index,d),n.createTeeLocal(L.index,x),t]),this.makeCallDirect(S,[n.createGetLocal(b.index,b.type.toNativeType()),n.createGetLocal(L.index,L.type.toNativeType())])],k.toNativeType())}return this.makeCallDirect(N,[d,x,t])}}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileCallExpression=function(e,t){var r=this.module,n=this.currentFlow;if(e.expression.kind==d.NodeKind.SUPER){var i=this.currentFlow,a=i.actualFunction;if(!a.is(u.CommonFlags.CONSTRUCTOR))return this.error(l.DiagnosticCode.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors,e.range),r.createUnreachable();var s=assert(a.parent);assert(s.kind==h.ElementKind.CLASS);var o=assert(s.base),c=assert(i.lookupLocal("this")),_=this.options.nativeSizeType,g=[r.createSetLocal(c.index,this.compileCallDirect(this.ensureConstructor(o,e),e.arguments,e,r.createIf(r.createGetLocal(c.index,_),r.createGetLocal(c.index,_),this.makeAllocation(s))))];return this.makeFieldInitialization(s,g),i.isAny(2080)?(this.error(l.DiagnosticCode._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class,e.range),r.createUnreachable()):(i.set(96),this.currentType=y.Type.void,r.createBlock(null,g))}var T,E,f=this.resolver.resolveExpression(e.expression,n);if(!f)return r.createUnreachable();switch(f.kind){case h.ElementKind.FUNCTION_PROTOTYPE:var I=f,v=e.typeArguments;if(I.hasDecorator(h.DecoratorFlags.BUILTIN))return this.compileCallExpressionBuiltin(I,e,t);var A=null;if(v){if(!I.is(u.CommonFlags.GENERIC))return this.error(l.DiagnosticCode.Type_0_is_not_generic,e.expression.range,I.internalName),r.createUnreachable();A=this.resolver.resolveFunctionInclTypeArguments(I,v,m.makeMap(n.contextualTypeArguments),e)}else{if(I.is(u.CommonFlags.GENERIC)){for(var C=new Map,S=assert(I.declaration.typeParameters),N=S.length,O=0;Os&&!i)||(this.error(l.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,s.toString(),t.toString()),!1)},t.prototype.compileCallDirect=function(e,t,r,n){void 0===n&&(n=0);var i=t.length,a=e.signature;if(!this.checkCallSignature(a,i,0!=n,r))return this.module.createUnreachable();if(e.hasDecorator(h.DecoratorFlags.INLINE)){if(assert(!e.is(u.CommonFlags.TRAMPOLINE)),!this.currentInlineFunctions.includes(e)){this.currentInlineFunctions.push(e);var s=this.compileCallInlinePrechecked(e,t,n);return this.currentInlineFunctions.pop(),s}this.warning(l.DiagnosticCode.Function_0_cannot_be_inlined_into_itself,r.range,e.internalName)}var o=n?i+1:i,c=new Array(o),p=0;n&&(c[0]=n,p=1);for(var _=a.parameterTypes,d=0;d=i);var o=this.module;if(!this.compileFunction(e))return o.createUnreachable();var c=e.signature.returnType,l=e.is(u.CommonFlags.MODULE_IMPORT);if(r=a),this.ensureFunctionType(e.parameterTypes,e.returnType,e.thisType);var c=this.module;if(n=0),this.currentType=N,this.module.createGetLocal(O,N.toNativeType());case h.ElementKind.GLOBAL:if(!this.compileGlobal(S))return this.module.createUnreachable();var x=S.type;return assert(x!=y.Type.void),S.is(u.CommonFlags.INLINED)?this.compileInlineConstant(S,t,r):(this.currentType=x,this.module.createGetGlobal(S.internalName,x.toNativeType()));case h.ElementKind.ENUMVALUE:return S.is(u.CommonFlags.COMPILED)?(this.currentType=y.Type.i32,S.is(u.CommonFlags.INLINED)?this.module.createI32(S.constantValue):this.module.createGetGlobal(S.internalName,p.NativeType.I32)):(this.error(l.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=y.Type.i32,this.module.createUnreachable());case h.ElementKind.FUNCTION_PROTOTYPE:var b=this.resolver.resolveFunction(S,null,m.makeMap(i.contextualTypeArguments));if(!b||!this.compileFunction(b))return n.createUnreachable();var L=this.ensureFunctionTableEntry(b);return this.currentType=b.signature.type,this.module.createI32(L)}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileInstanceOfExpression=function(e,t){var r=this.module,n=this.compileExpressionRetainType(e.expression,this.options.usizeType,0),i=this.currentType,a=this.resolver.resolveType(e.isType);return this.currentType=y.Type.bool,a?i.is(512)&&!a.is(512)?i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?p.BinaryOp.NeI64:p.BinaryOp.NeI32,n,i.toNativeZero(r)):r.createI32(0):r.createI32(i.isAssignableTo(a,!0)?1:0):r.createUnreachable()},t.prototype.compileLiteralExpression=function(e,t,r){void 0===r&&(r=!1);var n=this.module;switch(e.literalKind){case d.LiteralKind.ARRAY:assert(!r);var i=t.classReference;return i&&i.prototype==this.program.arrayPrototype?this.compileArrayLiteral(assert(i.typeArguments)[0],e.elementExpressions,!1,e):(this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case d.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==y.Type.f32?n.createF32(a):(this.currentType=y.Type.f64,n.createF64(a));case d.LiteralKind.INTEGER:var s=e.value;r&&(s=i64_sub(i64_new(0),s));var o=this.resolver.determineIntegerLiteralType(s,t);switch(this.currentType=o,o.kind){case 4:if(!this.options.isWasm64)return n.createI32(i64_low(s));case 3:return n.createI64(i64_low(s),i64_high(s));case 9:if(!this.options.isWasm64)return n.createI32(i64_low(s));case 8:return n.createI64(i64_low(s),i64_high(s));case 11:return n.createF32(i64_to_f32(s));case 12:return n.createF64(i64_to_f64(s));default:return n.createI32(i64_low(s))}case d.LiteralKind.STRING:return assert(!r),this.compileStringLiteral(e);case d.LiteralKind.OBJECT:return assert(!r),this.compileObjectLiteral(e,t)}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.currentType=t,n.createUnreachable()},t.prototype.ensureStaticString=function(e){var t,r=this.program,n=r.hasGC,i=r.gcHeaderSize,a=assert(r.stringInstance),s=this.stringSegments;if(s.has(e))t=s.get(e);else{var o=e.length,l=a.currentMemoryOffset+1&-2,p=l+2*o,u=void 0,h=void 0;n?(u=new Uint8Array(i+p),h=i,m.writeI32(c.ensureGCHook(this,a),u,r.gcHookOffset)):(u=new Uint8Array(p),h=0),m.writeI32(o,u,h+a.offsetof("length")),h+=l;for(var _=0;_",t.toString()),r.createUnreachable();var i=n.constructorInstance;if(i){if(i.signature.requiredParameters)return this.error(l.DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,e.range,n.toString()),r.createUnreachable();if(i.is(u.CommonFlags.PRIVATE))return this.error(l.DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable();if(i.is(u.CommonFlags.PROTECTED))return this.error(l.DiagnosticCode.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable()}var a=e.names,s=a.length,o=e.values,c=n.members,p=!1,_=new Array(s+2),d=this.currentFlow.getTempLocal(this.options.usizeType);assert(s==o.length);for(var y=0,m=s;yv)for(T=v;T=0);var _=this.compileExpressionRetainType(c,this.options.usizeType,0);return this.currentType=a.type,n.createLoad(a.type.byteSize,a.type.is(5),_,a.type.toNativeType(),a.memoryOffset);case h.ElementKind.PROPERTY:return this.compileGetter(a,e);case h.ElementKind.FUNCTION_PROTOTYPE:return this.error(l.DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,e.range,a.simpleName),n.createUnreachable()}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileGetter=function(e,t){var r=e.getterPrototype;if(r){var n=this.resolver.resolveFunction(r,null);if(!n)return this.module.createUnreachable();var i=n.signature;if(!this.checkCallSignature(i,0,n.is(u.CommonFlags.INSTANCE),t))return this.module.createUnreachable();if(n.is(u.CommonFlags.INSTANCE)){var a=assert(n.parent);assert(a.kind==h.ElementKind.CLASS);var s=assert(this.resolver.currentThisExpression),o=this.compileExpressionRetainType(s,this.options.usizeType,0);//!!! +return this.currentType=i.returnType,this.compileCallDirect(n,[],t,o)}return this.currentType=i.returnType,this.compileCallDirect(n,[],t,0)}return this.error(l.DiagnosticCode.Property_0_does_not_exist_on_type_1,t.range,e.simpleName,e.parent.toString()),this.module.createUnreachable()},t.prototype.compileTernaryExpression=function(e,t){var r=e.ifThen,n=e.ifElse,i=this.currentFlow,a=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,y.Type.bool,0),this.currentType);if(!this.options.noTreeShaking||i.actualFunction.isAny(u.CommonFlags.GENERIC|u.CommonFlags.GENERIC_CONTEXT)){var s=this.module.precomputeExpression(a);if(p.getExpressionId(s)==p.ExpressionId.Const&&p.getExpressionType(s)==p.NativeType.I32)return p.getConstValueI32(s)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);a=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,y.Type.bool,0),this.currentType)}var o=i.fork();this.currentFlow=o;var c=this.compileExpressionRetainType(r,t,0),h=this.currentType;o.freeScopedLocals();var _=i.fork();this.currentFlow=_;var d=this.compileExpressionRetainType(n,t,0),m=this.currentType;_.freeScopedLocals(),this.currentFlow=i,i.inheritMutual(o,_);var g=y.Type.commonCompatible(h,m,!1);return g?(c=this.convertExpression(c,h,g,1,0,r),d=this.convertExpression(d,m,g,1,0,n),this.currentType=g,this.module.createIf(a,c,d)):(this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,e.range,h.toString(),m.toString()),this.currentType=t,this.module.createUnreachable())},t.prototype.compileUnaryPostfixExpression=function(e,t){var r=this.module,n=this.currentFlow,i=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t,0,0);if(p.getExpressionId(i)==p.ExpressionId.Unreachable)return i;var a,s=this.currentType,o=null;switch(t!=y.Type.void&&(o=n.getTempLocal(s,!1),i=r.createTeeLocal(o.index,i)),e.operator){case _.Token.PLUS_PLUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(p.BinaryOp.AddI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){if(u=this.currentType.classReference)if(d=u.lookupOverload(h.OperatorKind.POSTFIX_INC)){a=this.compileUnaryOverload(d,e.operand,i,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:var c=this.options;a=r.createBinary(c.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(p.BinaryOp.AddI64,i,r.createI64(1));break;case 11:a=r.createBinary(p.BinaryOp.AddF32,i,r.createF32(1));break;case 12:a=r.createBinary(p.BinaryOp.AddF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;case _.Token.MINUS_MINUS:switch(s.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(p.BinaryOp.SubI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){var u,d;if(u=this.currentType.classReference)if(d=u.lookupOverload(h.OperatorKind.POSTFIX_DEC)){a=this.compileUnaryOverload(d,e.operand,i,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:c=this.options;a=r.createBinary(c.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,i,s.toNativeOne(r));break;case 3:case 8:a=r.createBinary(p.BinaryOp.SubI64,i,r.createI64(1));break;case 11:a=r.createBinary(p.BinaryOp.SubF32,i,r.createF32(1));break;case 12:a=r.createBinary(p.BinaryOp.SubF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;default:return assert(!1),r.createUnreachable()}if(!o)return this.currentType=y.Type.void,this.compileAssignmentWithValue(e.operand,a,!1);var m=this.compileAssignmentWithValue(e.operand,a,!1);this.currentType=o.type,n.freeTempLocal(o);var g=o.type.toNativeType();return r.createBlock(null,[m,r.createGetLocal(o.index,g)],g)},t.prototype.compileUnaryPrefixExpression=function(e,t){var r,n=this.module,i=!1;switch(e.operator){case _.Token.PLUS:if(r=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.PLUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case _.Token.MINUS:if(e.operand.kind==d.NodeKind.LITERAL&&(e.operand.literalKind==d.LiteralKind.INTEGER||e.operand.literalKind==d.LiteralKind.FLOAT)){r=this.compileLiteralExpression(e.operand,t,!0),this.options.sourceMap&&this.addDebugLocation(r,e.range);break}if(r=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.MINUS)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(p.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(p.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(p.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case _.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(p.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(p.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case _.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(p.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(p.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case _.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=y.Type.bool;break;case _.Token.TILDE:if(r=this.compileExpression(e.operand,t==y.Type.void?y.Type.i32:t.is(8)?y.Type.i64:t,0,0),this.currentType.is(256)){var a,s;if(a=this.currentType.classReference)if(s=a.lookupOverload(h.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(s,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(r=this.convertExpression(r,this.currentType,this.currentType.intType,1,0,e.operand),this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.XorI64:p.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case _.Token.TYPEOF:return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=y.Type.void):r},t.prototype.ensureSmallIntegerWrap=function(e,t){var r=this.module,n=this.currentFlow;switch(t.kind){case 0:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(p.UnaryOp.ExtendI8ToI32,e):r.createBinary(p.BinaryOp.ShrI32,r.createBinary(p.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(p.UnaryOp.ExtendI16ToI32,e):r.createBinary(p.BinaryOp.ShrI32,r.createBinary(p.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.NeI32,e,r.createI32(0)))}return e},t.prototype.makeIsFalseish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return r.createUnary(p.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(p.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?p.UnaryOp.EqzI64:p.UnaryOp.EqzI32,e);case 11:return r.createBinary(p.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(p.BinaryOp.EqF64,e,r.createF64(0));default:return assert(!1),r.createI32(1)}},t.prototype.makeIsTrueish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return e;case 3:case 8:return r.createBinary(p.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(p.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(p.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(p.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocation=function(e){var t=this.program;assert(e.program==t);var r=this.module,n=this.options;if(t.hasGC&&e.type.isManaged(t)){var i=assert(t.gcAllocateInstance);return this.compileFunction(i)?(this.currentType=e.type,r.createCall(i.internalName,[n.isWasm64?r.createI64(e.currentMemoryOffset):r.createI32(e.currentMemoryOffset),r.createI32(c.ensureGCHook(this,e))],n.nativeSizeType)):r.createUnreachable()}return(i=t.memoryAllocateInstance)&&this.compileFunction(i)?(this.currentType=e.type,r.createCall(i.internalName,[n.isWasm64?r.createI64(e.currentMemoryOffset):r.createI32(e.currentMemoryOffset)],n.nativeSizeType)):r.createUnreachable()},t.prototype.makeFieldInitialization=function(e,t){var r,n;void 0===t&&(t=[]);var i=e.members;if(!i)return[];var s=this.module,o=this.currentFlow,c=o.is(4096),l=c?assert(o.lookupLocal("this")).index:0,p=this.options.nativeSizeType;try{for(var _=a(i.values()),d=_.next();!d.done;d=_.next()){var y=d.value;if(y.kind==h.ElementKind.FIELD&&y.parent==e){var m=y;assert(!m.isAny(u.CommonFlags.CONST));var g=m.type,T=g.toNativeType(),E=m.prototype.declaration,f=E.initializer;if(f)t.push(s.createStore(g.byteSize,s.createGetLocal(l,p),this.compileExpression(f,g,1,0),T,m.memoryOffset));else{var I=E.parameterIndex;t.push(s.createStore(g.byteSize,s.createGetLocal(l,p),I>=0?s.createGetLocal(c?assert(o.lookupLocal(m.simpleName)).index:1+I,T):g.toNativeZero(s),T,m.memoryOffset))}}}}catch(e){r={error:e}}finally{try{d&&!d.done&&(n=_.return)&&n.call(_)}finally{if(r)throw r.error}}return t},t.prototype.addDebugLocation=function(e,t){var r=this.currentFlow.parentFunction,n=t.source;n.debugInfoIndex<0&&(n.debugInfoIndex=this.module.addDebugInfoFile(n.normalizedPath)),t.debugInfoRef=e,r.debugLocations.push(t)},t}(l.DiagnosticEmitter);function I(e,t){if(T=t.range.source.simplePath,E=t.programLevelInternalName,e.hasDecorator(h.DecoratorFlags.EXTERNAL)){var r=e.program,n=assert(d.findDecorator(d.DecoratorKind.EXTERNAL,t.decorators)),i=n.arguments;if(i&&i.length){var a=i[0];a.kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(E=a.value,i.length>=2&&((a=i[1]).kind==d.NodeKind.LITERAL&&a.literalKind==d.LiteralKind.STRING?(T=E,E=a.value,i.length>2&&r.error(l.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(l.DiagnosticCode.String_literal_expected,a.range))):r.error(l.DiagnosticCode.String_literal_expected,a.range)}else r.error(l.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=f},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.Operation_not_supported=100]="Operation_not_supported",e[e.Operation_is_unsafe=101]="Operation_is_unsafe",e[e.User_defined_0=102]="User_defined_0",e[e.Conversion_from_type_0_to_1_requires_an_explicit_cast=200]="Conversion_from_type_0_to_1_requires_an_explicit_cast",e[e.Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit=201]="Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit",e[e.Type_0_cannot_be_changed_to_type_1=202]="Type_0_cannot_be_changed_to_type_1",e[e.Type_0_cannot_be_reinterpreted_as_type_1=203]="Type_0_cannot_be_reinterpreted_as_type_1",e[e.Basic_type_0_cannot_be_nullable=204]="Basic_type_0_cannot_be_nullable",e[e.Cannot_export_a_mutable_global=205]="Cannot_export_a_mutable_global",e[e.Compiling_constant_with_non_constant_initializer_as_mutable=206]="Compiling_constant_with_non_constant_initializer_as_mutable",e[e.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa=207]="Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa",e[e.Unmanaged_classes_cannot_implement_interfaces=208]="Unmanaged_classes_cannot_implement_interfaces",e[e.Invalid_regular_expression_flags=209]="Invalid_regular_expression_flags",e[e.Implementation_0_must_match_the_signature_1=210]="Implementation_0_must_match_the_signature_1",e[e.Class_0_is_sealed_and_cannot_be_extended=211]="Class_0_is_sealed_and_cannot_be_extended",e[e.Decorator_0_is_not_valid_here=212]="Decorator_0_is_not_valid_here",e[e.Duplicate_decorator=213]="Duplicate_decorator",e[e.An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf=214]="An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf",e[e.Optional_parameter_must_have_an_initializer=215]="Optional_parameter_must_have_an_initializer",e[e.Constructor_of_class_0_must_not_require_any_arguments=216]="Constructor_of_class_0_must_not_require_any_arguments",e[e.Function_0_cannot_be_inlined_into_itself=217]="Function_0_cannot_be_inlined_into_itself",e[e.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set=218]="Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set",e[e.Optional_properties_are_not_supported=219]="Optional_properties_are_not_supported",e[e.Expression_must_be_a_compile_time_constant=220]="Expression_must_be_a_compile_time_constant",e[e.Unterminated_string_literal=1002]="Unterminated_string_literal",e[e.Identifier_expected=1003]="Identifier_expected",e[e._0_expected=1005]="_0_expected",e[e.A_file_cannot_have_a_reference_to_itself=1006]="A_file_cannot_have_a_reference_to_itself",e[e.Trailing_comma_not_allowed=1009]="Trailing_comma_not_allowed",e[e.Unexpected_token=1012]="Unexpected_token",e[e.A_rest_parameter_must_be_last_in_a_parameter_list=1014]="A_rest_parameter_must_be_last_in_a_parameter_list",e[e.Parameter_cannot_have_question_mark_and_initializer=1015]="Parameter_cannot_have_question_mark_and_initializer",e[e.A_required_parameter_cannot_follow_an_optional_parameter=1016]="A_required_parameter_cannot_follow_an_optional_parameter",e[e.Statements_are_not_allowed_in_ambient_contexts=1036]="Statements_are_not_allowed_in_ambient_contexts",e[e.Initializers_are_not_allowed_in_ambient_contexts=1039]="Initializers_are_not_allowed_in_ambient_contexts",e[e._0_modifier_cannot_be_used_here=1042]="_0_modifier_cannot_be_used_here",e[e.A_rest_parameter_cannot_be_optional=1047]="A_rest_parameter_cannot_be_optional",e[e.A_rest_parameter_cannot_have_an_initializer=1048]="A_rest_parameter_cannot_have_an_initializer",e[e.A_set_accessor_must_have_exactly_one_parameter=1049]="A_set_accessor_must_have_exactly_one_parameter",e[e.A_set_accessor_parameter_cannot_have_an_initializer=1052]="A_set_accessor_parameter_cannot_have_an_initializer",e[e.A_get_accessor_cannot_have_parameters=1054]="A_get_accessor_cannot_have_parameters",e[e.Enum_member_must_have_initializer=1061]="Enum_member_must_have_initializer",e[e.Type_parameters_cannot_appear_on_a_constructor_declaration=1092]="Type_parameters_cannot_appear_on_a_constructor_declaration",e[e.Type_annotation_cannot_appear_on_a_constructor_declaration=1093]="Type_annotation_cannot_appear_on_a_constructor_declaration",e[e.An_accessor_cannot_have_type_parameters=1094]="An_accessor_cannot_have_type_parameters",e[e.A_set_accessor_cannot_have_a_return_type_annotation=1095]="A_set_accessor_cannot_have_a_return_type_annotation",e[e.Type_parameter_list_cannot_be_empty=1098]="Type_parameter_list_cannot_be_empty",e[e.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement=1104]="A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement",e[e.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement=1105]="A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement",e[e.A_return_statement_can_only_be_used_within_a_function_body=1108]="A_return_statement_can_only_be_used_within_a_function_body",e[e.Expression_expected=1109]="Expression_expected",e[e.Type_expected=1110]="Type_expected",e[e.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement=1113]="A_default_clause_cannot_appear_more_than_once_in_a_switch_statement",e[e.Duplicate_label_0=1114]="Duplicate_label_0",e[e.Octal_literals_are_not_allowed_in_strict_mode=1121]="Octal_literals_are_not_allowed_in_strict_mode",e[e.Digit_expected=1124]="Digit_expected",e[e.Hexadecimal_digit_expected=1125]="Hexadecimal_digit_expected",e[e.Unexpected_end_of_text=1126]="Unexpected_end_of_text",e[e.Invalid_character=1127]="Invalid_character",e[e._case_or_default_expected=1130]="_case_or_default_expected",e[e._super_must_be_followed_by_an_argument_list_or_member_access=1034]="_super_must_be_followed_by_an_argument_list_or_member_access",e[e.A_declare_modifier_cannot_be_used_in_an_already_ambient_context=1038]="A_declare_modifier_cannot_be_used_in_an_already_ambient_context",e[e.Type_argument_expected=1140]="Type_argument_expected",e[e.String_literal_expected=1141]="String_literal_expected",e[e.Line_break_not_permitted_here=1142]="Line_break_not_permitted_here",e[e.Declaration_expected=1146]="Declaration_expected",e[e._const_declarations_must_be_initialized=1155]="_const_declarations_must_be_initialized",e[e.Unterminated_regular_expression_literal=1161]="Unterminated_regular_expression_literal",e[e.Interface_declaration_cannot_have_implements_clause=1176]="Interface_declaration_cannot_have_implements_clause",e[e.Binary_digit_expected=1177]="Binary_digit_expected",e[e.Octal_digit_expected=1178]="Octal_digit_expected",e[e.An_implementation_cannot_be_declared_in_ambient_contexts=1183]="An_implementation_cannot_be_declared_in_ambient_contexts",e[e.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive=1198]="An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive",e[e.Unterminated_Unicode_escape_sequence=1199]="Unterminated_Unicode_escape_sequence",e[e.Decorators_are_not_valid_here=1206]="Decorators_are_not_valid_here",e[e._abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration=1242]="_abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration",e[e.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract=1245]="Method_0_cannot_have_an_implementation_because_it_is_marked_abstract",e[e.A_definite_assignment_assertion_is_not_permitted_in_this_context=1255]="A_definite_assignment_assertion_is_not_permitted_in_this_context",e[e.A_class_may_only_extend_another_class=1311]="A_class_may_only_extend_another_class",e[e.A_parameter_property_cannot_be_declared_using_a_rest_parameter=1317]="A_parameter_property_cannot_be_declared_using_a_rest_parameter",e[e.Duplicate_identifier_0=2300]="Duplicate_identifier_0",e[e.Cannot_find_name_0=2304]="Cannot_find_name_0",e[e.Module_0_has_no_exported_member_1=2305]="Module_0_has_no_exported_member_1",e[e.Generic_type_0_requires_1_type_argument_s=2314]="Generic_type_0_requires_1_type_argument_s",e[e.Type_0_is_not_generic=2315]="Type_0_is_not_generic",e[e.Type_0_is_not_assignable_to_type_1=2322]="Type_0_is_not_assignable_to_type_1",e[e.Index_signature_is_missing_in_type_0=2329]="Index_signature_is_missing_in_type_0",e[e._this_cannot_be_referenced_in_current_location=2332]="_this_cannot_be_referenced_in_current_location",e[e._super_can_only_be_referenced_in_a_derived_class=2335]="_super_can_only_be_referenced_in_a_derived_class",e[e.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors=2337]="Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors",e[e.Property_0_does_not_exist_on_type_1=2339]="Property_0_does_not_exist_on_type_1",e[e.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures=2349]="Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures",e[e.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature=2351]="Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature",e[e.A_function_whose_declared_type_is_not_void_must_return_a_value=2355]="A_function_whose_declared_type_is_not_void_must_return_a_value",e[e.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access=2357]="The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access",e[e.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access=2364]="The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access",e[e.Operator_0_cannot_be_applied_to_types_1_and_2=2365]="Operator_0_cannot_be_applied_to_types_1_and_2",e[e.A_super_call_must_be_the_first_statement_in_the_constructor=2376]="A_super_call_must_be_the_first_statement_in_the_constructor",e[e.Constructors_for_derived_classes_must_contain_a_super_call=2377]="Constructors_for_derived_classes_must_contain_a_super_call",e[e._get_and_set_accessor_must_have_the_same_type=2380]="_get_and_set_accessor_must_have_the_same_type",e[e.Constructor_implementation_is_missing=2390]="Constructor_implementation_is_missing",e[e.Function_implementation_is_missing_or_not_immediately_following_the_declaration=2391]="Function_implementation_is_missing_or_not_immediately_following_the_declaration",e[e.Multiple_constructor_implementations_are_not_allowed=2392]="Multiple_constructor_implementations_are_not_allowed",e[e.Duplicate_function_implementation=2393]="Duplicate_function_implementation",e[e.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local=2395]="Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local",e[e.Type_0_has_no_property_1=2460]="Type_0_has_no_property_1",e[e.The_0_operator_cannot_be_applied_to_type_1=2469]="The_0_operator_cannot_be_applied_to_type_1",e[e.In_const_enum_declarations_member_initializer_must_be_constant_expression=2474]="In_const_enum_declarations_member_initializer_must_be_constant_expression",e[e.Export_declaration_conflicts_with_exported_declaration_of_0=2484]="Export_declaration_conflicts_with_exported_declaration_of_0",e[e.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property=2540]="Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property",e[e.The_target_of_an_assignment_must_be_a_variable_or_a_property_access=2541]="The_target_of_an_assignment_must_be_a_variable_or_a_property_access",e[e.Index_signature_in_type_0_only_permits_reading=2542]="Index_signature_in_type_0_only_permits_reading",e[e.Expected_0_arguments_but_got_1=2554]="Expected_0_arguments_but_got_1",e[e.Expected_at_least_0_arguments_but_got_1=2555]="Expected_at_least_0_arguments_but_got_1",e[e.Expected_0_type_arguments_but_got_1=2558]="Expected_0_type_arguments_but_got_1",e[e.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums=2651]="A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums",e[e.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration=2673]="Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration",e[e.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration=2674]="Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration",e[e.Namespace_0_has_no_exported_member_1=2694]="Namespace_0_has_no_exported_member_1",e[e.Required_type_parameters_may_not_follow_optional_type_parameters=2706]="Required_type_parameters_may_not_follow_optional_type_parameters",e[e.File_0_not_found=6054]="File_0_not_found",e[e.Numeric_separators_are_not_allowed_here=6188]="Numeric_separators_are_not_allowed_here",e[e.Multiple_consecutive_numeric_separators_are_not_permitted=6189]="Multiple_consecutive_numeric_separators_are_not_permitted",e[e._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class=17009]="_super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class",e[e._super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class=17011]="_super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class"}(t.DiagnosticCode||(t.DiagnosticCode={})),t.diagnosticCodeToString=function(e){switch(e){case 100:return"Operation not supported.";case 101:return"Operation is unsafe.";case 102:return"User-defined: {0}";case 200:return"Conversion from type '{0}' to '{1}' requires an explicit cast.";case 201:return"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.";case 202:return"Type '{0}' cannot be changed to type '{1}'.";case 203:return"Type '{0}' cannot be reinterpreted as type '{1}'.";case 204:return"Basic type '{0}' cannot be nullable.";case 205:return"Cannot export a mutable global.";case 206:return"Compiling constant with non-constant initializer as mutable.";case 207:return"Unmanaged classes cannot extend managed classes and vice-versa.";case 208:return"Unmanaged classes cannot implement interfaces.";case 209:return"Invalid regular expression flags.";case 210:return"Implementation '{0}' must match the signature '{1}'.";case 211:return"Class '{0}' is sealed and cannot be extended.";case 212:return"Decorator '{0}' is not valid here.";case 213:return"Duplicate decorator.";case 214:return"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.";case 215:return"Optional parameter must have an initializer.";case 216:return"Constructor of class '{0}' must not require any arguments.";case 217:return"Function '{0}' cannot be inlined into itself.";case 218:return"Cannot access method '{0}' without calling it as it requires 'this' to be set.";case 219:return"Optional properties are not supported.";case 220:return"Expression must be a compile-time constant.";case 1002:return"Unterminated string literal.";case 1003:return"Identifier expected.";case 1005:return"'{0}' expected.";case 1006:return"A file cannot have a reference to itself.";case 1009:return"Trailing comma not allowed.";case 1012:return"Unexpected token.";case 1014:return"A rest parameter must be last in a parameter list.";case 1015:return"Parameter cannot have question mark and initializer.";case 1016:return"A required parameter cannot follow an optional parameter.";case 1036:return"Statements are not allowed in ambient contexts.";case 1039:return"Initializers are not allowed in ambient contexts.";case 1042:return"'{0}' modifier cannot be used here.";case 1047:return"A rest parameter cannot be optional.";case 1048:return"A rest parameter cannot have an initializer.";case 1049:return"A 'set' accessor must have exactly one parameter.";case 1052:return"A 'set' accessor parameter cannot have an initializer.";case 1054:return"A 'get' accessor cannot have parameters.";case 1061:return"Enum member must have initializer.";case 1092:return"Type parameters cannot appear on a constructor declaration.";case 1093:return"Type annotation cannot appear on a constructor declaration.";case 1094:return"An accessor cannot have type parameters.";case 1095:return"A 'set' accessor cannot have a return type annotation.";case 1098:return"Type parameter list cannot be empty.";case 1104:return"A 'continue' statement can only be used within an enclosing iteration statement.";case 1105:return"A 'break' statement can only be used within an enclosing iteration or switch statement.";case 1108:return"A 'return' statement can only be used within a function body.";case 1109:return"Expression expected.";case 1110:return"Type expected.";case 1113:return"A 'default' clause cannot appear more than once in a 'switch' statement.";case 1114:return"Duplicate label '{0}'.";case 1121:return"Octal literals are not allowed in strict mode.";case 1124:return"Digit expected.";case 1125:return"Hexadecimal digit expected.";case 1126:return"Unexpected end of text.";case 1127:return"Invalid character.";case 1130:return"'case' or 'default' expected.";case 1034:return"'super' must be followed by an argument list or member access.";case 1038:return"A 'declare' modifier cannot be used in an already ambient context.";case 1140:return"Type argument expected.";case 1141:return"String literal expected.";case 1142:return"Line break not permitted here.";case 1146:return"Declaration expected.";case 1155:return"'const' declarations must be initialized.";case 1161:return"Unterminated regular expression literal.";case 1176:return"Interface declaration cannot have 'implements' clause.";case 1177:return"Binary digit expected.";case 1178:return"Octal digit expected.";case 1183:return"An implementation cannot be declared in ambient contexts.";case 1198:return"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.";case 1199:return"Unterminated Unicode escape sequence.";case 1206:return"Decorators are not valid here.";case 1242:return"'abstract' modifier can only appear on a class, method, or property declaration.";case 1245:return"Method '{0}' cannot have an implementation because it is marked abstract.";case 1255:return"A definite assignment assertion '!' is not permitted in this context.";case 1311:return"A class may only extend another class.";case 1317:return"A parameter property cannot be declared using a rest parameter.";case 2300:return"Duplicate identifier '{0}'.";case 2304:return"Cannot find name '{0}'.";case 2305:return"Module '{0}' has no exported member '{1}'.";case 2314:return"Generic type '{0}' requires {1} type argument(s).";case 2315:return"Type '{0}' is not generic.";case 2322:return"Type '{0}' is not assignable to type '{1}'.";case 2329:return"Index signature is missing in type '{0}'.";case 2332:return"'this' cannot be referenced in current location.";case 2335:return"'super' can only be referenced in a derived class.";case 2337:return"Super calls are not permitted outside constructors or in nested functions inside constructors.";case 2339:return"Property '{0}' does not exist on type '{1}'.";case 2349:return"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.";case 2351:return"Cannot use 'new' with an expression whose type lacks a construct signature.";case 2355:return"A function whose declared type is not 'void' must return a value.";case 2357:return"The operand of an increment or decrement operator must be a variable or a property access.";case 2364:return"The left-hand side of an assignment expression must be a variable or a property access.";case 2365:return"Operator '{0}' cannot be applied to types '{1}' and '{2}'.";case 2376:return"A 'super' call must be the first statement in the constructor.";case 2377:return"Constructors for derived classes must contain a 'super' call.";case 2380:return"'get' and 'set' accessor must have the same type.";case 2390:return"Constructor implementation is missing.";case 2391:return"Function implementation is missing or not immediately following the declaration.";case 2392:return"Multiple constructor implementations are not allowed.";case 2393:return"Duplicate function implementation.";case 2395:return"Individual declarations in merged declaration '{0}' must be all exported or all local.";case 2460:return"Type '{0}' has no property '{1}'.";case 2469:return"The '{0}' operator cannot be applied to type '{1}'.";case 2474:return"In 'const' enum declarations member initializer must be constant expression.";case 2484:return"Export declaration conflicts with exported declaration of '{0}'.";case 2540:return"Cannot assign to '{0}' because it is a constant or a read-only property.";case 2541:return"The target of an assignment must be a variable or a property access.";case 2542:return"Index signature in type '{0}' only permits reading.";case 2554:return"Expected {0} arguments, but got {1}.";case 2555:return"Expected at least {0} arguments, but got {1}.";case 2558:return"Expected {0} type arguments, but got {1}.";case 2651:return"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.";case 2673:return"Constructor of class '{0}' is private and only accessible within the class declaration.";case 2674:return"Constructor of class '{0}' is protected and only accessible within the class declaration.";case 2694:return"Namespace '{0}' has no exported member '{1}'.";case 2706:return"Required type parameters may not follow optional type parameters.";case 6054:return"File '{0}' not found.";case 6188:return"Numeric separators are not allowed here.";case 6189:return"Multiple consecutive numeric separators are not permitted.";case 17009:return"'super' must be called before accessing 'this' in the constructor of a derived class.";case 17011:return"'super' must be called before accessing a property of 'super' in the constructor of a derived class.";default:return""}}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o,c=r(2),l=r(5),p=r(4),u=r(7),h=r(1),_=r(0),d=r(6);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(o=t.ReportMode||(t.ReportMode={}));var y=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.program=t,r}return i(t,e),t.prototype.resolveType=function(e,t,r){if(void 0===t&&(t=null),void 0===r&&(r=o.REPORT),e.kind==p.NodeKind.SIGNATURE){var n=this.resolveSignature(e,t,r);return n?e.isNullable?n.type.asNullable():n.type:null}assert(e.kind==p.NodeKind.TYPE);var i=e,a=i.name.text,s=a,d=i.range.source.internalPath+h.PATH_DELIMITER+a,y=this.program.elementsLookup,m=void 0;if((m=y.get(d))||(m=y.get(s)))switch(m.kind){case l.ElementKind.ENUM:return null!==i.typeArguments&&i.typeArguments.length?(r==o.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,e.range,m.internalName),null):u.Type.i32;case l.ElementKind.CLASS_PROTOTYPE:var g=this.resolveClassInclTypeArguments(m,i.typeArguments,_.makeMap(t),e);return g?e.isNullable?g.type.asNullable():g.type:null}var T=this.program.typeAliases.get(a);if(T)return this.resolveType(T.type,t,r);var E=i.typeArguments,f=null;if(E){var I=E.length;f=new Array(I);for(var v=0;v",s+="<"+C+">")}else if(t){var S=t.get(s);if(S)return S}}var N=this.program.typesLookup,O=void 0;if((O=N.get(d))||(O=N.get(s)))return!O.is(256)&&e.isNullable&&r==o.REPORT&&this.error(c.DiagnosticCode.Basic_type_0_cannot_be_nullable,e.range,O.toString()),O;if("NATIVE"==a){if(!f||1!=f.length)return r==o.REPORT&&this.error(c.DiagnosticCode.Expected_0_type_arguments_but_got_1,i.range,"1",(E?E.length:1).toString(10)),null;switch(f[0].kind){case 0:case 1:case 2:return u.Type.i32;case 4:if(!this.program.options.isWasm64)return u.Type.i32;case 3:return u.Type.i64;case 5:case 6:case 7:case 10:return u.Type.u32;case 9:if(!this.program.options.isWasm64)return u.Type.u32;case 8:return u.Type.u64;case 11:return u.Type.f32;case 12:return u.Type.f64;case 13:return u.Type.v128;case 14:return u.Type.void;default:assert(!1)}}return r==o.REPORT&&this.error(c.DiagnosticCode.Cannot_find_name_0,i.name.range,s),null},t.prototype.resolveSignature=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=o.REPORT);var n=e.explicitThisType,i=null;if(n&&!(i=this.resolveType(n,t,r)))return null;for(var a=e.parameters,s=a.length,c=new Array(s),l=new Array(s),h=0,_=!1,d=0;ds)return this.error(c.DiagnosticCode.Expected_0_type_arguments_but_got_1,u?p.Range.join(t[0].range,t[u-1].range):assert(n).range.atEnd,(u");var w=new l.Function(e,P,U,A||T,r);return d||e.instances.set(a,d=new Map),d.set(s,w),this.program.instancesLookup.set(P,w),w},t.prototype.resolveFunctionPartially=function(e,t,r){void 0===r&&(r=o.REPORT),assert(e.is(h.CommonFlags.INSTANCE));var n=assert(e.classPrototype);if(!t||!t.length)return e;var i=e.simpleName,a=u.typesToString(t),s=new l.FunctionPrototype(this.program,i,n.internalName+"<"+a+">"+h.INSTANCE_DELIMITER+i,e.declaration,n,e.decoratorFlags);return s.flags=e.flags,s.operatorKind=e.operatorKind,s.classTypeArguments=t,s.instances=e.instances,s},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=o.REPORT);var a=null;if(e.is(h.CommonFlags.GENERIC)){if(e.classTypeArguments&&e.applyClassTypeArguments(r),!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==o.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveFunction(e,a,r,i)},t.prototype.resolveClass=function(e,t,r,n){var i,d,y,m,g,T;void 0===r&&(r=_.makeMap()),void 0===n&&(n=o.REPORT);var E=t?u.typesToString(t):"",f=e.instances.get(E);if(f)return f;var I=e.declaration;if(t){var v=I.typeParameters,A=v.length,C=t.length;assert(C==A);for(var S=0;S",b+="<"+E+">"),(f=new l.Class(e,x,b,t,N)).contextualTypeArguments=r,e.instances.set(E,f),this.program.instancesLookup.set(b,f);var L=0;if(N){if(N.members){f.members||(f.members=new Map);try{for(var k=a(N.members.values()),R=k.next();!R.done;R=k.next()){var F=R.value;f.members.set(F.simpleName,F)}}catch(e){i={error:e}}finally{try{R&&!R.done&&(d=k.return)&&d.call(k)}finally{if(i)throw i.error}}}L=N.currentMemoryOffset}var B=e.constructorPrototype;if(B){var D=this.resolveFunctionPartially(B,t,n);if(!D)return null;f.constructorInstance=this.resolveFunction(D,null,_.makeMap(),n)}if(e.instanceMembers)try{for(var U=a(e.instanceMembers.values()),P=U.next();!P.done;P=U.next()){var w=P.value;switch(w.kind){case l.ElementKind.FIELD_PROTOTYPE:var M=w.declaration;if(f.members){if(f.members.has(w.simpleName)){this.error(c.DiagnosticCode.Duplicate_identifier_0,M.name.range,w.simpleName);break}}else f.members=new Map;var G=null;if(M.type)G=this.resolveType(M.type,f.contextualTypeArguments,n);else{if(null!==N&&null!==N.members){var V=N.members.get(w.simpleName);V&&!V.is(h.CommonFlags.PRIVATE)&&(assert(V.kind==l.ElementKind.FIELD),G=V.type)}G||n==o.REPORT&&this.error(c.DiagnosticCode.Type_expected,M.name.range.atEnd)}if(!G)break;var K=new l.Field(w,b+h.INSTANCE_DELIMITER+w.simpleName,G,M,f);switch(G.byteSize){case 1:break;case 2:1&L&&++L;break;case 4:3&L&&(L=1+(3|L));break;case 8:7&L&&(L=1+(7|L));break;default:assert(!1)}K.memoryOffset=L,L+=G.byteSize,f.members.set(w.simpleName,K);break;case l.ElementKind.FUNCTION_PROTOTYPE:f.members||(f.members=new Map);var z=this.resolveFunctionPartially(w,t,n);if(!z)return null;z.internalName=b+h.INSTANCE_DELIMITER+z.simpleName,f.members.set(w.simpleName,z);break;case l.ElementKind.PROPERTY:f.members||(f.members=new Map);var H=assert(w.getterPrototype),X=w.setterPrototype,W=new l.Property(this.program,w.simpleName,b+h.INSTANCE_DELIMITER+w.simpleName,e),Y=this.resolveFunctionPartially(H,t,n);if(!Y)return null;if(Y.internalName=b+h.INSTANCE_DELIMITER+Y.simpleName,W.getterPrototype=Y,X){var Q=this.resolveFunctionPartially(X,t,n);if(!Q)return null;Q.internalName=b+h.INSTANCE_DELIMITER+Q.simpleName,W.setterPrototype=Q}f.members.set(w.simpleName,W);break;default:assert(!1)}}}catch(e){y={error:e}}finally{try{P&&!P.done&&(m=U.return)&&m.call(U)}finally{if(y)throw y.error}}f.currentMemoryOffset=L;try{for(var q=a(e.overloadPrototypes),j=q.next();!j.done;j=q.next()){var Z=s(j.value,2),J=Z[0],$=Z[1];assert(J!=l.OperatorKind.INVALID);var ee=void 0;if($.is(h.CommonFlags.INSTANCE)){var te=this.resolveFunctionPartially($,t,n);if(!te)continue;ee=this.resolveFunction(te,null,_.makeMap(),n)}else ee=this.resolveFunction($,null,_.makeMap(),n);if(ee){var re=f.overloads;re||(f.overloads=re=new Map),re.set(J,ee)}}}catch(e){g={error:e}}finally{try{j&&!j.done&&(T=q.return)&&T.call(q)}finally{if(g)throw g.error}}return f},t.prototype.resolveClassInclTypeArguments=function(e,t,r,n,i){void 0===i&&(i=o.REPORT);var a=null;if(e.is(h.CommonFlags.GENERIC)){if(!(a=this.resolveTypeArguments(assert(e.declaration.typeParameters),t,r,n,i)))return null}else if(null!==t&&t.length)return i==o.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,n.range,e.internalName),null;return this.resolveClass(e,a,r,i)},t}(c.DiagnosticEmitter);t.Resolver=y},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(3),i=function(){function e(){this.text=[],this.functionId=0}return e.decompile=function(t){var r=new e;return r.decompile(t),r.finish()},e.prototype.decompile=function(e){throw new Error("not implemented")},e.prototype.decompileFunction=function(e){var t=n.getFunctionName(e)||"$"+this.functionId.toString(10),r=n.getFunctionBody(e);this.push("function "),this.push(t),this.push("(");for(var i=0,s=n.getFunctionParamCount(e);i0&&this.push(", "),this.push("$"),this.push(i.toString(10)),this.push(": "),this.push(a(n.getFunctionParamType(e,i)));this.push("): "),this.push(a(n.getFunctionResultType(e))),this.push(" "),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("{\n"),this.decompileExpression(r),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("\n}\n"),++this.functionId},e.prototype.decompileExpression=function(e){var t,r,i,s,o=n.getExpressionId(e),c=n.getExpressionType(e);switch(o){case n.ExpressionId.Block:for(null!=(r=n.getBlockName(e))&&(this.push(r),this.push(": ")),this.push("{\n"),s=n.getBlockChildCount(e),i=0;i("),this.push(n.getLoadOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getLoadPtr(e)),void this.push(")");case n.ExpressionId.Store:return this.push("store<"),this.push(a(c)),this.push(">("),this.push(n.getStoreOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getStorePtr(e)),this.push(", "),this.decompileExpression(n.getStoreValue(e)),void this.push(")");case n.ExpressionId.Const:switch(c){case n.NativeType.I32:return void this.push(n.getConstValueI32(e).toString(10));case n.NativeType.I64:return void this.push(i64_to_string(i64_new(n.getConstValueI64Low(e),n.getConstValueI64High(e))));case n.NativeType.F32:return void this.push(n.getConstValueF32(e).toString(10));case n.NativeType.F64:return void this.push(n.getConstValueF64(e).toString(10))}break;case n.ExpressionId.Unary:switch(n.getUnaryOp(e)){case n.UnaryOp.ClzI32:return this.push("clz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI32:return this.push("ctz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI32:return this.push("popcnt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NegF32:case n.UnaryOp.NegF64:return this.push("-"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.AbsF32:return this.push("abs("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF32:return this.push("ceil("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF32:return this.push("floor("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF32:return this.push("trunc("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF32:return this.push("nearest("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF32:return this.push("sqrt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.EqzI32:case n.UnaryOp.EqzI64:return this.push("!"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ClzI64:return this.push("clz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI64:return this.push("ctz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI64:return this.push("popcnt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.AbsF64:return this.push("abs("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF64:return this.push("ceil("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF64:return this.push("floor("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF64:return this.push("trunc("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF64:return this.push("nearest("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF64:return this.push("sqrt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ExtendI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ExtendU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.WrapI64:case n.UnaryOp.TruncF32ToI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToI64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretF32:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretF64:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ConvertI32ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI32ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.PromoteF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.DemoteF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretI32:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretI64:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")")}break;case n.ExpressionId.Binary:switch(n.getBinaryOp(e)){case n.BinaryOp.AddI32:case n.BinaryOp.AddI64:case n.BinaryOp.AddF32:case n.BinaryOp.AddF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" + "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.SubI32:case n.BinaryOp.SubI64:case n.BinaryOp.SubF32:case n.BinaryOp.SubF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" - "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.MulI32:case n.BinaryOp.MulI64:case n.BinaryOp.MulF32:case n.BinaryOp.MulF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" * "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivI32:case n.BinaryOp.DivI64:case n.BinaryOp.DivF32:case n.BinaryOp.DivF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU32:return this.push("("),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RemI32:case n.BinaryOp.RemI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU32:return this.push("("),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.AndI32:case n.BinaryOp.AndI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" & "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.OrI32:case n.BinaryOp.OrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" | "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.XorI32:case n.BinaryOp.XorI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" ^ "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShlI32:case n.BinaryOp.ShlI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" << "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrU32:case n.BinaryOp.ShrU64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >>> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrI32:case n.BinaryOp.ShrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI32:return this.push("rotl("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI32:return this.push("rotr("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.EqI32:case n.BinaryOp.EqI64:case n.BinaryOp.EqF32:case n.BinaryOp.EqF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" == "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.NeI32:case n.BinaryOp.NeI64:case n.BinaryOp.NeF32:case n.BinaryOp.NeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" != "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtI32:case n.BinaryOp.LtI64:case n.BinaryOp.LtF32:case n.BinaryOp.LtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeI32:case n.BinaryOp.LeI64:case n.BinaryOp.LeF32:case n.BinaryOp.LeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtI32:case n.BinaryOp.GtI64:case n.BinaryOp.GtF32:case n.BinaryOp.GtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeI32:case n.BinaryOp.GeI64:case n.BinaryOp.GeF32:case n.BinaryOp.GeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI64:return this.push("rotl("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI64:return this.push("rotr("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.LtU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.CopysignF32:return this.push("copysign("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF32:return this.push("min("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF32:return this.push("max("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.CopysignF64:return this.push("copysign("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF64:return this.push("min("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF64:return this.push("max("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")")}return;case n.ExpressionId.Select:return this.push("select<"),this.push(a(c)),this.push(">("),this.decompileExpression(n.getSelectThen(e)),this.push(", "),this.decompileExpression(n.getSelectElse(e)),this.push(", "),this.decompileExpression(n.getSelectCondition(e)),void this.push(")");case n.ExpressionId.Drop:return this.decompileExpression(n.getDropValue(e)),void this.push(";\n");case n.ExpressionId.Return:return void((t=n.getReturnValue(e))?(this.push("return "),this.decompileExpression(t),this.push(";\n")):this.push("return;\n"));case n.ExpressionId.Host:switch(n.getHostOp(e)){case n.HostOp.CurrentMemory:return void this.push("memory.size()");case n.HostOp.GrowMemory:return this.push("memory.grow("),this.decompileExpression(n.getHostOperand(e,0)),void this.push(")")}break;case n.ExpressionId.Nop:return void this.push(";\n");case n.ExpressionId.Unreachable:return void this.push("unreachable()");case n.ExpressionId.AtomicCmpxchg:case n.ExpressionId.AtomicRMW:case n.ExpressionId.AtomicWait:case n.ExpressionId.AtomicWake:}throw new Error("not implemented")},e.prototype.push=function(e){this.text.push(e)},e.prototype.finish=function(){var e=this.text.join("");return this.text=[],e},e}();function a(e){switch(e){case n.NativeType.None:return"void";case n.NativeType.I32:return"i32";case n.NativeType.I64:return"i64";case n.NativeType.F32:return"f32";case n.NativeType.F64:return"f64";case n.NativeType.V128:return"v128";case n.NativeType.Unreachable:throw new Error("unreachable type");case n.NativeType.Auto:throw new Error("auto type");default:throw new Error("unexpected type")}}t.Decompiler=i},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},s=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0});var o=r(1),c=r(5),l=r(0),p=function(){function e(e,t){void 0===t&&(t=!1),this.todo=[],this.seen=new Set,this.program=e,this.includePrivate}return e.prototype.walk=function(){var e,t;try{for(var r=a(this.program.moduleLevelExports.values()),n=r.next();!n.done;n=r.next()){var i=n.value;this.visitElement(i.element)}}catch(t){e={error:t}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(e)throw e.error}}for(var s=this.todo;0"),null}for(;e.skip(o.Token.BAR);){if(!e.skip(o.Token.NULL))return r||this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;d=!0}n=p.Node.createType(h,_,d,e.range(a,e.pos))}for(;e.skip(o.Token.OPENBRACKET);){var m=e.tokenPos;if(!e.skip(o.Token.CLOSEBRACKET))return r||this.error(c.DiagnosticCode._0_expected,e.range(),"]"),null;var g=e.range(m,e.pos);d=!1;if(e.skip(o.Token.BAR)){if(!e.skip(o.Token.NULL))return r||this.error(c.DiagnosticCode._0_expected,e.range(),"null"),null;d=!0}if(n=p.Node.createType(p.Node.createIdentifierExpression("Array",g),[n],d,e.range(a,e.pos)),d)break}return n},t.prototype.tryParseSignature=function(e){var t,r=e.mark(),n=e.tokenPos,i=null,a=null,s=!1;if(e.skip(o.Token.CLOSEPAREN))s=!0,e.discard(r),i=[];else{s=!1;do{var l=p.ParameterKind.DEFAULT;if(e.skip(o.Token.DOT_DOT_DOT)&&(s=!0,e.discard(r),l=p.ParameterKind.REST),e.skip(o.Token.THIS)){if(!e.skip(o.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;s=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return s?this.error(c.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=s,null;var h=p.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(o.Token.QUESTION)&&(s=!0,e.discard(r),l==p.ParameterKind.REST?this.error(c.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):l=p.ParameterKind.OPTIONAL),e.skip(o.Token.COLON)){s=!0,e.discard(r);var _=this.parseType(e);if(!_)return this.tryParseSignatureIsSignature=s,null;var d=new p.ParameterNode;d.parameterKind=l,d.name=h,d.type=_,i?i.push(d):i=[d]}else s&&this.error(c.DiagnosticCode.Type_expected,e.range())}}while(e.skip(o.Token.COMMA));if(!e.skip(o.Token.CLOSEPAREN))return s?this.error(c.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=s,null}return e.skip(o.Token.EQUALS_GREATERTHAN)?(s=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,p.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=s,null)):(s?this.error(c.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=s,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=p.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(o.Token.DOT);){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=p.Node.createPropertyAccessExpression(n,p.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(o.Token.OPENPAREN))return p.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return p.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(c.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseVariable=function(e,t,r,n){var i=new Array;do{var a=this.parseVariableDeclaration(e,t,r);if(!a)return null;i.push(a)}while(e.skip(o.Token.COMMA));var s=p.Node.createVariableStatement(i,r,t,e.range(n,e.pos));return e.skip(o.Token.SEMICOLON),s},t.prototype.parseVariableDeclaration=function(e,t,r){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var n=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),i=t;e.skip(o.Token.EXCLAMATION)&&(i|=a.CommonFlags.DEFINITE_ASSIGNMENT);var s=null;e.skip(o.Token.COLON)&&(s=this.parseType(e));var l=null;if(e.skip(o.Token.EQUALS)){if(i&a.CommonFlags.AMBIENT&&this.error(c.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(l=this.parseExpression(e,2)))return null}else i&a.CommonFlags.CONST?i&a.CommonFlags.AMBIENT||this.error(c.DiagnosticCode._const_declarations_must_be_initialized,n.range):s||this.error(c.DiagnosticCode.Type_expected,e.range(e.pos));var u=o.Range.join(n.range,e.range());return i&a.CommonFlags.DEFINITE_ASSIGNMENT&&l&&this.error(c.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),p.Node.createVariableDeclaration(n,s,l,r,i,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=o.Token.IDENTIFIER)return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=o.Token.OPENBRACE)return this.error(c.DiagnosticCode._0_expected,e.range(),"{"),null;for(var s=new Array;!e.skip(o.Token.CLOSEBRACE);){var l=this.parseEnumValue(e,a.CommonFlags.NONE);if(!l)return null;if(s.push(l),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.CLOSEBRACE))break;return this.error(c.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=p.Node.createEnumDeclaration(i,s,r,t,e.range(n,e.pos));return e.skip(o.Token.SEMICOLON),u},t.prototype.parseEnumValue=function(e,t){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(o.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:p.Node.createEnumValueDeclaration(r,n,t,o.Range.join(r.range,e.range()))},t.prototype.parseReturn=function(e){var t=null;if(e.peek(!0)!=o.Token.SEMICOLON&&e.nextToken!=o.Token.CLOSEBRACE&&!e.nextTokenOnNewLine&&!(t=this.parseExpression(e)))return null;var r=p.Node.createReturnStatement(t,e.range());return e.skip(o.Token.SEMICOLON),r},t.prototype.parseTypeParameters=function(e){for(var t=new Array,r=!1;!e.skip(o.Token.GREATERTHAN);){var n=this.parseTypeParameter(e);if(!n)return null;if(null!==n.defaultType?r=!0:r&&(this.error(c.DiagnosticCode.Required_type_parameters_may_not_follow_optional_type_parameters,n.range),n.defaultType=null),t.push(n),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.GREATERTHAN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(c.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==o.Token.IDENTIFIER){var t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(o.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,i.range),null;r=i}var n=null;if(e.skip(o.Token.EQUALS)){var i;if(!(i=this.parseType(e)))return null;if(i.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return p.Node.createTypeParameter(t,r,n,o.Range.join(t.range,e.range()))}return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseParameters=function(e,t){void 0===t&&(t=!1);var r=new Array,n=null,i=!1,a=!1,s=null;if(this.parseParametersThis=null,e.skip(o.Token.THIS)){if(!e.skip(o.Token.COLON))return this.error(c.DiagnosticCode._0_expected,e.range(),":"),null;if(!(s=this.parseType(e)))return null;if(s.kind==p.NodeKind.TYPE?this.parseParametersThis=s:this.error(c.DiagnosticCode.Operation_not_supported,s.range),!e.skip(o.Token.COMMA))return e.skip(o.Token.CLOSEPAREN)?r:(this.error(c.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(o.Token.CLOSEPAREN);){var l=this.parseParameter(e,t);if(!l)return null;switch(n&&!a&&(this.error(c.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),l.parameterKind){default:i&&this.error(c.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,l.name.range);break;case p.ParameterKind.OPTIONAL:i=!0;break;case p.ParameterKind.REST:n=l}if(r.push(l),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.CLOSEPAREN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,i=null,s=a.CommonFlags.NONE;if(t&&(e.skip(o.Token.PUBLIC)?(i=e.range(),s|=a.CommonFlags.PUBLIC):e.skip(o.Token.PROTECTED)?(i=e.range(),s|=a.CommonFlags.PROTECTED):e.skip(o.Token.PRIVATE)&&(i=e.range(),s|=a.CommonFlags.PRIVATE),e.peek()==o.Token.READONLY)){var l=e.mark();e.next(),e.peek()!=o.Token.COLON?(e.discard(l),i||(i=e.range()),s|=a.CommonFlags.READONLY):e.reset(l)}if(e.skip(o.Token.DOT_DOT_DOT)&&(s?this.error(c.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):i=e.range(),r=!0),e.skipIdentifier()){r||(i=e.range());var u=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),h=null;if((n=e.skip(o.Token.QUESTION))&&r&&this.error(c.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(o.Token.COLON)){if(!(h=this.parseType(e)))return null}else h=p.Node.createOmittedType(e.range(e.pos));var _=null;if(e.skip(o.Token.EQUALS)&&(r&&this.error(c.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(c.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(_=this.parseExpression(e,2))))return null;var d=p.Node.createParameter(u,h,_,r?p.ParameterKind.REST:n?p.ParameterKind.OPTIONAL:p.ParameterKind.DEFAULT,o.Range.join(i,e.range()));return d.flags|=s,d}return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),s=-1,l=null;if(e.skip(o.Token.LESSTHAN)){if(s=e.tokenPos,!(l=this.parseTypeParameters(e)))return null;t|=a.CommonFlags.GENERIC}if(!e.skip(o.Token.OPENPAREN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"("),null;s<0&&(s=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var h=this.parseParametersThis,_=0!=(t&a.CommonFlags.SET);_&&(1!=u.length&&this.error(c.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,i.range),u.length&&u[0].initializer&&this.error(c.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,i.range)),t&a.CommonFlags.GET&&u.length&&this.error(c.DiagnosticCode.A_get_accessor_cannot_have_parameters,i.range);var d=null;if(e.skip(o.Token.COLON)&&!(d=this.parseType(e,!0,_)))return null;d||(d=p.Node.createOmittedType(e.range(e.pos)),_||this.error(c.DiagnosticCode.Type_expected,d.range));var y=p.Node.createSignature(u,d,h,!1,e.range(s,e.pos)),m=null;if(e.skip(o.Token.OPENBRACE)){if(t&a.CommonFlags.AMBIENT&&this.error(c.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(m=this.parseBlockStatement(e,!1)))return null}else t&a.CommonFlags.AMBIENT||this.error(c.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var g=p.Node.createFunctionDeclaration(i,l,y,m,r,t,e.range(n,e.pos));return e.skip(o.Token.SEMICOLON),g},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==o.Token.FUNCTION){if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(o.Token.OPENPAREN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==o.Token.OPENPAREN),t=p.Node.createEmptyIdentifierExpression(e.range(e.tokenPos));var i=e.pos,a=this.parseParameters(e);return a?this.parseFunctionExpressionCommon(e,t,a,n,r,i):null},t.prototype.parseFunctionExpressionCommon=function(e,t,r,n,i,s){void 0===i&&(i=-1),void 0===s&&(s=-1),i<0&&(i=t.range.start),s<0&&(s=i);var l=null;if(e.skip(o.Token.COLON)){if(!(l=this.parseType(e)))return null}else l=p.Node.createOmittedType(e.range(e.pos)),this.error(c.DiagnosticCode.Type_expected,l.range);if(n&&!e.skip(o.Token.EQUALS_GREATERTHAN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,h=p.Node.createSignature(r,l,null,!1,e.range(s,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(o.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var _=p.Node.createFunctionDeclaration(t,null,h,u,null,n?a.CommonFlags.ARROW:a.CommonFlags.NONE,e.range(i,e.pos));return p.Node.createFunctionExpression(_)},t.prototype.parseClassOrInterface=function(e,t,r,n){var i=e.token==o.Token.INTERFACE;if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var s,l=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.skip(o.Token.LESSTHAN)){if(!(s=this.parseTypeParameters(e)))return null;t|=a.CommonFlags.GENERIC}else s=[];var u=null;if(e.skip(o.Token.EXTENDS)){var h=this.parseType(e);if(!h)return null;if(h.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,h.range),null;u=h}var _=null;if(e.skip(o.Token.IMPLEMENTS)){i&&this.error(c.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var d=this.parseType(e);if(!d)return null;i||(_||(_=[]),_.push(d))}while(e.skip(o.Token.COMMA))}if(!e.skip(o.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(),"{"),null;var y,m=new Array;if(i?(assert(!_),y=p.Node.createInterfaceDeclaration(l,s,u,m,r,t,e.range(n,e.pos))):y=p.Node.createClassDeclaration(l,s,u,_,m,r,t,e.range(n,e.pos)),!e.skip(o.Token.CLOSEBRACE))do{var g=this.parseClassMember(e,y);if(!g)return null;g.parent=y,m.push(g)}while(!e.skip(o.Token.CLOSEBRACE));return y},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(o.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,i=p.Node.createClassDeclaration(t,[],null,null,n,null,a.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(o.Token.CLOSEBRACE))do{var s=this.parseClassMember(e,i);if(!s)return null;s.parent=i,n.push(s)}while(!e.skip(o.Token.CLOSEBRACE));return p.Node.createClassExpression(i)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==p.NodeKind.INTERFACEDECLARATION,i=new Array;if(e.skip(o.Token.AT)){do{var s=this.parseDecorator(e);if(!s)break;i.push(s)}while(e.skip(o.Token.AT));n&&this.error(c.DiagnosticCode.Decorators_are_not_valid_here,o.Range.join(i[0].range,i[i.length-1].range))}var l=t.flags&a.CommonFlags.AMBIENT;n&&(l|=a.CommonFlags.VIRTUAL);var u=0,h=0;e.skip(o.Token.PUBLIC)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),l|=a.CommonFlags.PUBLIC,u=e.tokenPos,h=e.pos):e.skip(o.Token.PRIVATE)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),l|=a.CommonFlags.PRIVATE,u=e.tokenPos,h=e.pos):e.skip(o.Token.PROTECTED)&&(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),l|=a.CommonFlags.PROTECTED,u=e.tokenPos,h=e.pos);var _=0,d=0,y=0,m=0;e.skip(o.Token.STATIC)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),l|=a.CommonFlags.STATIC,_=e.tokenPos,d=e.pos):(l|=a.CommonFlags.INSTANCE,e.skip(o.Token.ABSTRACT)&&(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),l|=a.CommonFlags.ABSTRACT,y=e.tokenPos,m=e.pos),t.flags&a.CommonFlags.GENERIC&&(l|=a.CommonFlags.GENERIC_CONTEXT));var g=0,T=0;e.skip(o.Token.READONLY)&&(l|=a.CommonFlags.READONLY,g=e.tokenPos,T=e.pos);var E,f=e.mark(),I=!1,v=!1,A=!1,C=0,S=0;if(n||(e.skip(o.Token.GET)?e.peek(!0,o.IdentifierHandling.PREFER)!=o.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(f):(l|=a.CommonFlags.GET,v=!0,C=e.tokenPos,S=e.pos,l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly")):e.skip(o.Token.SET)?e.peek(!0,o.IdentifierHandling.PREFER)!=o.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(f):(l|=a.CommonFlags.SET,A=!0,C=e.tokenPos,S=e.pos,l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly")):e.skip(o.Token.CONSTRUCTOR)&&(I=!0,(l|=a.CommonFlags.CONSTRUCTOR)&a.CommonFlags.STATIC&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(_,d),"static"),l&a.CommonFlags.ABSTRACT&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,m),"abstract"),l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly"))),I)E=p.Node.createConstructorExpression(e.range());else{if(!v&&!A&&e.skip(o.Token.OPENBRACKET)){l&a.CommonFlags.PUBLIC?this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"public"):l&a.CommonFlags.PROTECTED?this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"):l&a.CommonFlags.PRIVATE&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,h),"protected"),l&a.CommonFlags.STATIC&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(_,d),"static"),l&a.CommonFlags.ABSTRACT&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,m),"abstract"),l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly");var N=this.parseIndexSignatureDeclaration(e,i);return N?(e.skip(o.Token.SEMICOLON),N):null}if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;E=p.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var O=null;if(e.skip(o.Token.LESSTHAN)){var x=e.tokenPos;if(!(O=this.parseTypeParameters(e)))return null;I?this.error(c.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(x,e.pos)):v||A?this.error(c.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(x,e.pos)):l|=a.CommonFlags.GENERIC}if(e.skip(o.Token.OPENPAREN)){var b=e.tokenPos,L=this.parseParameters(e,I);if(!L)return null;var k=this.parseParametersThis;if(I)for(var R=0,F=L.length;R"),null):null;case o.Token.IDENTIFIER:return p.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case o.Token.THIS:return p.Node.createThisExpression(e.range(r,e.pos));case o.Token.CONSTRUCTOR:return p.Node.createConstructorExpression(e.range(r,e.pos));case o.Token.SUPER:return e.peek()!=o.Token.DOT&&e.nextToken!=o.Token.OPENPAREN&&this.error(c.DiagnosticCode._super_must_be_followed_by_an_argument_list_or_member_access,e.range()),p.Node.createSuperExpression(e.range(r,e.pos));case o.Token.STRINGLITERAL:return p.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case o.Token.INTEGERLITERAL:return p.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case o.Token.FLOATLITERAL:return p.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case o.Token.SLASH:var E=e.readRegexpPattern();return e.skip(o.Token.SLASH)?p.Node.createRegexpLiteralExpression(E,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(c.DiagnosticCode._0_expected,e.range(),"/"),null);case o.Token.FUNCTION:return this.parseFunctionExpression(e);case o.Token.CLASS:return this.parseClassExpression(e);default:return t==o.Token.ENDOFFILE?this.error(c.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(c.DiagnosticCode.Expression_expected,e.range()),null}},t.prototype.tryParseTypeArgumentsBeforeArguments=function(e){var t=e.mark();if(!e.skip(o.Token.LESSTHAN))return null;var r=new Array;do{if(e.peek()===o.Token.GREATERTHAN)break;var n=this.parseType(e,!0,!0);if(!n)return e.reset(t),null;r.push(n)}while(e.skip(o.Token.COMMA));return e.skip(o.Token.GREATERTHAN)&&e.skip(o.Token.OPENPAREN)?r:(e.reset(t),null)},t.prototype.parseArguments=function(e){for(var t=new Array;!e.skip(o.Token.CLOSEPAREN);){var r=this.parseExpression(e,2);if(!r)return null;if(t.push(r),!e.skip(o.Token.COMMA)){if(e.skip(o.Token.CLOSEPAREN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),")"),null}}return t},t.prototype.parseExpression=function(e,t){void 0===t&&(t=1),assert(0!=t);var r=this.parseExpressionStart(e);if(!r)return null;for(var n,i,a=(r=this.maybeParseCallExpression(e,r)).range.start,s=null;(i=h(n=e.peek()))>=t;){switch(e.next(),n){case o.Token.AS:var l=this.parseType(e);if(!l)return null;r=p.Node.createAssertionExpression(p.AssertionKind.AS,r,l,e.range(a,e.pos));break;case o.Token.EXCLAMATION:r=p.Node.createAssertionExpression(p.AssertionKind.NONNULL,r,null,e.range(a,e.pos));break;case o.Token.INSTANCEOF:var u=this.parseType(e);if(!u)return null;r=p.Node.createInstanceOfExpression(r,u,e.range(a,e.pos));break;case o.Token.OPENBRACKET:if(!(s=this.parseExpression(e)))return null;if(!e.skip(o.Token.CLOSEBRACKET))return this.error(c.DiagnosticCode._0_expected,e.range(),"]"),null;r=p.Node.createElementAccessExpression(r,s,e.range(a,e.pos));break;case o.Token.PLUS_PLUS:case o.Token.MINUS_MINUS:r.kind!=p.NodeKind.IDENTIFIER&&r.kind!=p.NodeKind.ELEMENTACCESS&&r.kind!=p.NodeKind.PROPERTYACCESS&&this.error(c.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=p.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case o.Token.QUESTION:var d=this.parseExpression(e);if(!d)return null;if(!e.skip(o.Token.COLON))return this.error(c.DiagnosticCode._0_expected,e.range(),":"),null;var y=this.parseExpression(e,t>1?2:1);if(!y)return null;r=p.Node.createTernaryExpression(r,d,y,e.range(a,e.pos));break;case o.Token.COMMA:var m=[r];do{if(!(r=this.parseExpression(e,2)))return null;m.push(r)}while(e.skip(o.Token.COMMA));r=p.Node.createCommaExpression(m,e.range(a,e.pos));break;default:if(n==o.Token.DOT){if(e.skipIdentifier())s=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(s=this.parseExpression(e,_(n)?i:i+1)))return null;if(s.kind==p.NodeKind.IDENTIFIER)r=p.Node.createPropertyAccessExpression(r,s,e.range(a,e.pos));else{if(s.kind!=p.NodeKind.CALL)return this.error(c.DiagnosticCode.Identifier_expected,s.range),null;if(!(r=this.joinPropertyCall(e,a,r,s)))return null}}else{if(!(s=this.parseExpression(e,_(n)?i:i+1)))return null;r=p.Node.createBinaryExpression(n,r,s,e.range(a,e.pos))}}r=this.maybeParseCallExpression(e,r)}return r},t.prototype.joinPropertyCall=function(e,t,r,n){var i=n.expression;switch(i.kind){case p.NodeKind.IDENTIFIER:n.expression=p.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case p.NodeKind.CALL:var a=this.joinPropertyCall(e,t,r,i);if(!a)return null;n.expression=a,n.range=e.range(t,e.pos);break;default:return this.error(c.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(p.nodeIsCallable(t.kind))for(var r=null;e.skip(o.Token.OPENPAREN)||p.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=p.Node.createCallExpression(t,r,n,e.range(t.range.start,e.pos))}return t},t.prototype.skipStatement=function(e){for(e.peek(!0),e.nextTokenOnNewLine&&e.next();;){var t=e.peek(!0);if(t==o.Token.ENDOFFILE||t==o.Token.SEMICOLON){e.next();break}if(e.nextTokenOnNewLine)break;switch(e.next()){case o.Token.IDENTIFIER:e.readIdentifier();break;case o.Token.STRINGLITERAL:e.readString();break;case o.Token.INTEGERLITERAL:e.readInteger();break;case o.Token.FLOATLITERAL:e.readFloat()}}},t.prototype.skipBlock=function(e){var t=1,r=!0;do{switch(e.next()){case o.Token.ENDOFFILE:this.error(c.DiagnosticCode._0_expected,e.range(),"}"),r=!1;break;case o.Token.OPENBRACE:++t;break;case o.Token.CLOSEBRACE:--t||(r=!1);break;case o.Token.IDENTIFIER:e.readIdentifier();break;case o.Token.STRINGLITERAL:e.readString();break;case o.Token.INTEGERLITERAL:e.readInteger();break;case o.Token.FLOATLITERAL:e.readFloat()}}while(r)},t}(c.DiagnosticEmitter);function h(e){switch(e){case o.Token.COMMA:return 1;case o.Token.EQUALS:case o.Token.PLUS_EQUALS:case o.Token.MINUS_EQUALS:case o.Token.ASTERISK_ASTERISK_EQUALS:case o.Token.ASTERISK_EQUALS:case o.Token.SLASH_EQUALS:case o.Token.PERCENT_EQUALS:case o.Token.LESSTHAN_LESSTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.AMPERSAND_EQUALS:case o.Token.CARET_EQUALS:case o.Token.BAR_EQUALS:return 4;case o.Token.QUESTION:return 5;case o.Token.BAR_BAR:return 6;case o.Token.AMPERSAND_AMPERSAND:return 7;case o.Token.BAR:return 8;case o.Token.CARET:return 9;case o.Token.AMPERSAND:return 10;case o.Token.EQUALS_EQUALS:case o.Token.EXCLAMATION_EQUALS:case o.Token.EQUALS_EQUALS_EQUALS:case o.Token.EXCLAMATION_EQUALS_EQUALS:return 11;case o.Token.AS:case o.Token.IN:case o.Token.INSTANCEOF:case o.Token.LESSTHAN:case o.Token.GREATERTHAN:case o.Token.LESSTHAN_EQUALS:case o.Token.GREATERTHAN_EQUALS:return 12;case o.Token.LESSTHAN_LESSTHAN:case o.Token.GREATERTHAN_GREATERTHAN:case o.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:return 13;case o.Token.PLUS:case o.Token.MINUS:return 14;case o.Token.ASTERISK:case o.Token.SLASH:case o.Token.PERCENT:return 15;case o.Token.ASTERISK_ASTERISK:return 16;case o.Token.PLUS_PLUS:case o.Token.MINUS_MINUS:return 18;case o.Token.DOT:case o.Token.NEW:case o.Token.OPENBRACKET:case o.Token.EXCLAMATION:return 20}return 0}function _(e){switch(e){case o.Token.EQUALS:case o.Token.PLUS_EQUALS:case o.Token.MINUS_EQUALS:case o.Token.ASTERISK_ASTERISK_EQUALS:case o.Token.ASTERISK_EQUALS:case o.Token.SLASH_EQUALS:case o.Token.PERCENT_EQUALS:case o.Token.LESSTHAN_LESSTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case o.Token.AMPERSAND_EQUALS:case o.Token.CARET_EQUALS:case o.Token.BAR_EQUALS:case o.Token.QUESTION:case o.Token.ASTERISK_ASTERISK:return!0;default:return!1}}t.Parser=u,function(e){e[e.NONE=0]="NONE",e[e.COMMA=1]="COMMA",e[e.SPREAD=2]="SPREAD",e[e.YIELD=3]="YIELD",e[e.ASSIGNMENT=4]="ASSIGNMENT",e[e.CONDITIONAL=5]="CONDITIONAL",e[e.LOGICAL_OR=6]="LOGICAL_OR",e[e.LOGICAL_AND=7]="LOGICAL_AND",e[e.BITWISE_OR=8]="BITWISE_OR",e[e.BITWISE_XOR=9]="BITWISE_XOR",e[e.BITWISE_AND=10]="BITWISE_AND",e[e.EQUALITY=11]="EQUALITY",e[e.RELATIONAL=12]="RELATIONAL",e[e.SHIFT=13]="SHIFT",e[e.ADDITIVE=14]="ADDITIVE",e[e.MULTIPLICATIVE=15]="MULTIPLICATIVE",e[e.EXPONENTIATED=16]="EXPONENTIATED",e[e.UNARY_PREFIX=17]="UNARY_PREFIX",e[e.UNARY_POSTFIX=18]="UNARY_POSTFIX",e[e.CALL=19]="CALL",e[e.MEMBERACCESS=20]="MEMBERACCESS",e[e.GROUPING=21]="GROUPING"}(t.Precedence||(t.Precedence={}))},function(e,t,r){r(16),e.exports=r(30)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),r(17),r(19),r(20),r(21);var n=r(3);n.Module.prototype.toText=function(){return binaryen.wrapModule(this.ref).emitStackIR()},n.Module.prototype.toAsmjs=function(){return binaryen.wrapModule(this.ref).emitAsmjs()}},function(e,t,r){(function(e){const t=e.Binaryen||r(18);for(var n in e.binaryen=t,t)(n.startsWith("_Binaryen")||n.startsWith("_Relooper"))&&(e[n]=t[n]);e.__memory_allocate=t._malloc,e.__memory_free=t._free,e.__memory_copy=t._memmove,e.__store=function(e,r){t.HEAPU8[e]=r},e.__load=function(e){return t.HEAPU8[e]}}).call(this,r(8))},function(t,r){t.exports=e},function(e,t,r){(function(e){var t="undefined"!=typeof window&&window||void 0!==e&&e||self;t.ASC_TARGET=0,t.ASC_NO_TREESHAKING=!1,t.ASC_NO_ASSERT=!1,t.ASC_MEMORY_BASE=0,t.ASC_OPTIMIZE_LEVEL=3,t.ASC_SHRINK_LEVEL=0,t.ASC_FEATURE_MUTABLE_GLOBAL=!1,t.ASC_FEATURE_SIGN_EXTENSION=!1,t.ASC_FEATURE_BULK_MEMORY=!1,t.ASC_FEATURE_SIMD=!1,t.ASC_FEATURE_THREADS=!1;var r=new Float64Array(1),n=new Uint32Array(r.buffer);function i(){Error.captureStackTrace?Error.captureStackTrace(this,i):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}function a(e){this.message=e||"assertion failed",Error.captureStackTrace?Error.captureStackTrace(this,a):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}Object.defineProperties(t.i8=function(e){return e<<24>>24},{MIN_VALUE:{value:-128,writable:!1},MAX_VALUE:{value:127,writable:!1}}),Object.defineProperties(t.i16=function(e){return e<<16>>16},{MIN_VALUE:{value:-32768,writable:!1},MAX_VALUE:{value:32767,writable:!1}}),Object.defineProperties(t.i32=t.isize=function(e){return 0|e},{MIN_VALUE:{value:-2147483648,writable:!1},MAX_VALUE:{value:2147483647,writable:!1}}),Object.defineProperties(t.u8=function(e){return 255&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:255,writable:!1}}),Object.defineProperties(t.u16=function(e){return 65535&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:65535,writable:!1}}),Object.defineProperties(t.u32=t.usize=function(e){return e>>>0},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:4294967295,writable:!1}}),Object.defineProperties(t.bool=function(e){return!!e},{MIN_VALUE:{value:!1,writable:!1},MAX_VALUE:{value:!0,writable:!1}}),Object.defineProperties(t.f32=function(e){return Math.fround(e)},{EPSILON:{value:Math.fround(1.1920929e-7),writable:!1},MIN_VALUE:{value:Math.fround(1.4012985e-45),writable:!1},MAX_VALUE:{value:Math.fround(3.4028235e38),writable:!1},MIN_NORMAL_VALUE:{value:Math.fround(1.17549435e-38),writable:!1},MIN_SAFE_INTEGER:{value:-16777215,writable:!1},MAX_SAFE_INTEGER:{value:16777215,writable:!1}}),Object.defineProperties(t.f64=function(e){return+e},{EPSILON:{value:2.220446049250313e-16,writable:!1},MIN_VALUE:{value:5e-324,writable:!1},MAX_VALUE:{value:1.7976931348623157e308,writable:!1},MIN_NORMAL_VALUE:{value:2.2250738585072014e-308,writable:!1},MIN_SAFE_INTEGER:{value:-9007199254740991,writable:!1},MAX_SAFE_INTEGER:{value:9007199254740991,writable:!1}}),t.clz=Math.clz32,t.ctz=function(e){var t=Math.clz32(e&-e);return e?31-t:t},t.popcnt=function(e){return 16843009*((e=(858993459&(e-=e>>>1&1431655765))+(e>>>2&858993459))+(e>>>4)&252645135)>>>24},t.rotl=function(e,t){return e<<(t&=31)|e>>>32-t},t.rotr=function(e,t){return e>>>(t&=31)|e<<32-t},t.abs=Math.abs,t.max=Math.max,t.min=Math.min,t.ceil=Math.ceil,t.floor=Math.floor,t.nearest=function(e){return.5===Math.abs(e-Math.trunc(e))?2*Math.round(.5*e):Math.round(e)},t.select=function(e,t,r){return r?e:t},t.sqrt=Math.sqrt,t.trunc=Math.trunc,t.copysign=function(e,t){return Math.abs(e)*Math.sign(t)},t.bswap=function(e){var t=e>>8&16711935,r=(16711935&e)<<8;return(t=(e=t|r)>>16&65535)|(r=(65535&e)<<16)},t.bswap16=function(e){return e<<8&65280|e>>8&255|4294901760&e},i.prototype=Object.create(Error.prototype),i.prototype.name="UnreachableError",i.prototype.message="unreachable",t.unreachable=function(){throw new i},a.prototype=Object.create(Error.prototype),a.prototype.name="AssertionError",t.assert=function(e,t){if(e)return e;throw new a(t)},t.changetype=function(e){return e},t.parseI32=function(e,t){return 0|parseInt(e,void 0)},String.fromCharCodes=function(e){return String.fromCharCode.apply(String,e)},String.fromCodePoints=function(e){return String.fromCodePoint.apply(String,e)},t.isInteger=Number.isInteger,t.isFloat=function(e){return"number"==typeof e},t.isReference=function(e){return"object"==typeof e||"string"==typeof e},t.isString=function(e){return"string"==typeof e||e instanceof String},t.isArray=Array.isArray,t.isDefined=function(e){return void 0!==e},t.isConstant=function(e){return!1},t.unchecked=function(e){return e},t.fmod=function(e,t){return e%t},t.fmodf=function(e,t){return Math.fround(e%t)},t.JSMath=Math,t.JSMath.signbit=function(e){return r[0]=e,Boolean(n[1]>>>31&e==e)},t.memory=(()=>{var e=new Uint8Array(0),r=0;return{allocate:t.__memory_allocate||function(t){if(!(t>>>=0))return 0;if(r+t>e.length){var n=e;(e=new Uint8Array(Math.max(65536,e.length+t,2*e.length))).set(n)}var i=r;return 7&(r+=t)&&(r=1+(7|r)),i},fill:t.__memory_fill||function(t,r,n){e.fill(r,t,t+n)},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)},reset:t.__memory_reset||function(){e=new Uint8Array(0),r=0}}})(),t.store=t.__store||function(e,t,r){HEAP[(0|e)+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[(0|e)+(0|t)]}}).call(this,r(8))},function(e,t,r){(function(e){const t=new Float64Array(1),r=new Float32Array(t.buffer),n=new Int32Array(t.buffer);e.f32_as_i32=function(e){return r[0]=e,n[0]},e.i32_as_f32=function(e){return n[0]=e,r[0]},e.f64_as_i64=function(e){return t[0]=e,i64_new(n[0],n[1])},e.i64_as_f64=function(e){return n[0]=i64_low(e),n[1]=i64_high(e),t[0]}}).call(this,r(8))},function(e,t,r){(function(e){const t=e.Long||r(22);e.i64_zero=t.ZERO,e.i64_one=t.ONE,e.i64_new=function(e,r){return t.fromBits(e,r)},e.i64_low=function(e){return e.low},e.i64_high=function(e){return e.high},e.i64_add=function(e,t){return e.add(t)},e.i64_sub=function(e,t){return e.sub(t)},e.i64_mul=function(e,t){return e.mul(t)},e.i64_div=function(e,t){return e.div(t)},e.i64_div_u=function(e,t){return e.toUnsigned().div(t.toUnsigned()).toSigned()},e.i64_rem=function(e,t){return e.mod(t)},e.i64_rem_u=function(e,t){return e.toUnsigned().mod(t.toUnsigned()).toSigned()},e.i64_and=function(e,t){return e.and(t)},e.i64_or=function(e,t){return e.or(t)},e.i64_xor=function(e,t){return e.xor(t)},e.i64_shl=function(e,t){return e.shl(t)},e.i64_shr=function(e,t){return e.shr(t)},e.i64_shr_u=function(e,t){return e.shru(t)},e.i64_not=function(e){return e.not()},e.i64_eq=function(e,t){return e.eq(t)},e.i64_ne=function(e,t){return e.ne(t)},e.i64_align=function(e,r){assert(r&&0==(r&r-1));var n=t.fromInt(r-1);return e.add(n).and(n.not())},e.i64_is_i8=function(e){return 0===e.high&&e.low>=0&&e.low<=i8.MAX_VALUE||-1===e.high&&e.low>=i8.MIN_VALUE&&e.low<0},e.i64_is_i16=function(e){return 0===e.high&&e.low>=0&&e.low<=i16.MAX_VALUE||-1===e.high&&e.low>=i16.MIN_VALUE&&e.low<0},e.i64_is_i32=function(e){return 0===e.high&&e.low>=0||-1===e.high&&e.low<0},e.i64_is_u8=function(e){return 0===e.high&&e.low>=0&&e.low<=u8.MAX_VALUE},e.i64_is_u16=function(e){return 0===e.high&&e.low>=0&&e.low<=u16.MAX_VALUE},e.i64_is_u32=function(e){return 0===e.high},e.i64_is_bool=function(e){return 0===e.high&&(0===e.low||1===e.low)};const n=t.fromNumber(f32.MIN_SAFE_INTEGER),i=t.fromNumber(f32.MAX_SAFE_INTEGER);e.i64_is_f32=function(e){return e.gte(n)&&e.lte(i)};const a=t.fromNumber(f64.MIN_SAFE_INTEGER),s=t.fromNumber(f64.MAX_SAFE_INTEGER);e.i64_is_f64=function(e){return e.gte(a)&&e.lte(s)},e.i64_to_f32=function(t){return e.Math.fround(t.toNumber())},e.i64_to_f64=function(e){return e.toNumber()},e.i64_to_string=function(e,t){return(t?e.toUnsigned():e).toString(10)}}).call(this,r(8))},function(e,t){e.exports=n;var r=null;try{r=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function n(e,t,r){this.low=0|e,this.high=0|t,this.unsigned=!!r}function i(e){return!0===(e&&e.__isLong__)}n.prototype.__isLong__,Object.defineProperty(n.prototype,"__isLong__",{value:!0}),n.isLong=i;var a={},s={};function o(e,t){var r,n,i;return t?(i=0<=(e>>>=0)&&e<256)&&(n=s[e])?n:(r=l(e,(0|e)<0?-1:0,!0),i&&(s[e]=r),r):(i=-128<=(e|=0)&&e<128)&&(n=a[e])?n:(r=l(e,e<0?-1:0,!1),i&&(a[e]=r),r)}function c(e,t){if(isNaN(e))return t?T:g;if(t){if(e<0)return T;if(e>=d)return A}else{if(e<=-y)return C;if(e+1>=y)return v}return e<0?c(-e,t).neg():l(e%_|0,e/_|0,t)}function l(e,t,r){return new n(e,t,r)}n.fromInt=o,n.fromNumber=c,n.fromBits=l;var p=Math.pow;function u(e,t,r){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return g;if("number"==typeof t?(r=t,t=!1):t=!!t,(r=r||10)<2||360)throw Error("interior hyphen");if(0===n)return u(e.substring(1),t,r).neg();for(var i=c(p(r,8)),a=g,s=0;s>>0:this.low},S.toNumber=function(){return this.unsigned?(this.high>>>0)*_+(this.low>>>0):this.high*_+(this.low>>>0)},S.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((a=o).isZero())return l+s;for(;l.length<6;)l="0"+l;s=""+l+s}},S.getHighBits=function(){return this.high},S.getHighBitsUnsigned=function(){return this.high>>>0},S.getLowBits=function(){return this.low},S.getLowBitsUnsigned=function(){return this.low>>>0},S.getNumBitsAbs=function(){if(this.isNegative())return this.eq(C)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<=0},S.isOdd=function(){return 1==(1&this.low)},S.isEven=function(){return 0==(1&this.low)},S.equals=function(e){return i(e)||(e=h(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},S.eq=S.equals,S.notEquals=function(e){return!this.eq(e)},S.neq=S.notEquals,S.ne=S.notEquals,S.lessThan=function(e){return this.comp(e)<0},S.lt=S.lessThan,S.lessThanOrEqual=function(e){return this.comp(e)<=0},S.lte=S.lessThanOrEqual,S.le=S.lessThanOrEqual,S.greaterThan=function(e){return this.comp(e)>0},S.gt=S.greaterThan,S.greaterThanOrEqual=function(e){return this.comp(e)>=0},S.gte=S.greaterThanOrEqual,S.ge=S.greaterThanOrEqual,S.compare=function(e){if(i(e)||(e=h(e)),this.eq(e))return 0;var t=this.isNegative(),r=e.isNegative();return t&&!r?-1:!t&&r?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},S.comp=S.compare,S.negate=function(){return!this.unsigned&&this.eq(C)?C:this.not().add(E)},S.neg=S.negate,S.add=function(e){i(e)||(e=h(e));var t=this.high>>>16,r=65535&this.high,n=this.low>>>16,a=65535&this.low,s=e.high>>>16,o=65535&e.high,c=e.low>>>16,p=0,u=0,_=0,d=0;return _+=(d+=a+(65535&e.low))>>>16,u+=(_+=n+c)>>>16,p+=(u+=r+o)>>>16,p+=t+s,l((_&=65535)<<16|(d&=65535),(p&=65535)<<16|(u&=65535),this.unsigned)},S.subtract=function(e){return i(e)||(e=h(e)),this.add(e.neg())},S.sub=S.subtract,S.multiply=function(e){if(this.isZero())return g;if(i(e)||(e=h(e)),r)return l(r.mul(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned);if(e.isZero())return g;if(this.eq(C))return e.isOdd()?C:g;if(e.eq(C))return this.isOdd()?C:g;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(m)&&e.lt(m))return c(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,n=65535&this.high,a=this.low>>>16,s=65535&this.low,o=e.high>>>16,p=65535&e.high,u=e.low>>>16,_=65535&e.low,d=0,y=0,T=0,E=0;return T+=(E+=s*_)>>>16,y+=(T+=a*_)>>>16,T&=65535,y+=(T+=s*u)>>>16,d+=(y+=n*_)>>>16,y&=65535,d+=(y+=a*u)>>>16,y&=65535,d+=(y+=s*p)>>>16,d+=t*_+n*u+a*p+s*o,l((T&=65535)<<16|(E&=65535),(d&=65535)<<16|(y&=65535),this.unsigned)},S.mul=S.multiply,S.divide=function(e){if(i(e)||(e=h(e)),e.isZero())throw Error("division by zero");var t,n,a;if(r)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?l((this.unsigned?r.div_u:r.div_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?T:g;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return T;if(e.gt(this.shru(1)))return f;a=T}else{if(this.eq(C))return e.eq(E)||e.eq(I)?C:e.eq(C)?E:(t=this.shr(1).div(e).shl(1)).eq(g)?e.isNegative()?E:I:(n=this.sub(e.mul(t)),a=t.add(n.div(e)));if(e.eq(C))return this.unsigned?T:g;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();a=g}for(n=this;n.gte(e);){t=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var s=Math.ceil(Math.log(t)/Math.LN2),o=s<=48?1:p(2,s-48),u=c(t),_=u.mul(e);_.isNegative()||_.gt(n);)_=(u=c(t-=o,this.unsigned)).mul(e);u.isZero()&&(u=E),a=a.add(u),n=n.sub(_)}return a},S.div=S.divide,S.modulo=function(e){return i(e)||(e=h(e)),r?l((this.unsigned?r.rem_u:r.rem_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},S.mod=S.modulo,S.rem=S.modulo,S.not=function(){return l(~this.low,~this.high,this.unsigned)},S.and=function(e){return i(e)||(e=h(e)),l(this.low&e.low,this.high&e.high,this.unsigned)},S.or=function(e){return i(e)||(e=h(e)),l(this.low|e.low,this.high|e.high,this.unsigned)},S.xor=function(e){return i(e)||(e=h(e)),l(this.low^e.low,this.high^e.high,this.unsigned)},S.shiftLeft=function(e){return i(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?l(this.low<>>32-e,this.unsigned):l(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):l(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},S.shr=S.shiftRight,S.shiftRightUnsigned=function(e){if(i(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?l(this.low>>>e|t<<32-e,t>>>e,this.unsigned):l(32===e?t:t>>>e-32,0,this.unsigned)},S.shru=S.shiftRightUnsigned,S.shr_u=S.shiftRightUnsigned,S.toSigned=function(){return this.unsigned?l(this.low,this.high,!1):this},S.toUnsigned=function(){return this.unsigned?this:l(this.low,this.high,!0)},S.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},S.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},S.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},n.fromBytes=function(e,t,r){return r?n.fromBytesLE(e,t):n.fromBytesBE(e,t)},n.fromBytesLE=function(e,t){return new n(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},n.fromBytesBE=function(e,t){return new n(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},function(e,t,r){"use strict";var n=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i=r(2),a=r(4),s=r(7),o=r(3),c=r(5),l=r(11),p=r(1);function u(e,t,r,n,p,u){var m,g,T,E,f=e.module;switch(t.internalName){case"isInteger":var I=_(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(4)&&!I.is(256)?f.createI32(1):f.createI32(0):f.createUnreachable();case"isFloat":I=_(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(8)?f.createI32(1):f.createI32(0):f.createUnreachable();case"isSigned":I=_(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(1)?f.createI32(1):f.createI32(0):f.createUnreachable();case"isReference":I=_(e,r,n,u);return e.currentType=s.Type.bool,I?I.is(256)?f.createI32(1):f.createI32(0):f.createUnreachable();case"isString":I=_(e,r,n,u);if(e.currentType=s.Type.bool,!I)return f.createUnreachable();if(U=I.classReference){var v=e.program.stringInstance;if(v&&U.isAssignableTo(v))return f.createI32(1)}return f.createI32(0);case"isArray":I=_(e,r,n,u);return e.currentType=s.Type.bool,I?null!==(U=I.classReference)&&U.prototype.extends(e.program.arrayPrototype)?f.createI32(1):f.createI32(0):f.createUnreachable();case"isDefined":if(e.currentType=s.Type.bool,r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),1!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();var A=e.resolver.resolveExpression(n[0],e.currentFlow,s.Type.void,l.ReportMode.SWALLOW);return f.createI32(A?1:0);case"isConstant":if(e.currentType=s.Type.bool,r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),1!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();var C=e.compileExpressionRetainType(n[0],s.Type.i32,0);return e.currentType=s.Type.bool,f.createI32(o.getExpressionId(C)==o.ExpressionId.Const?1:0);case"isManaged":if(!e.program.hasGC)return e.currentType=s.Type.bool,f.createI32(0);I=_(e,r,n,u);return e.currentType=s.Type.bool,I?null===(U=I.classReference)||U.hasDecorator(c.DecoratorFlags.UNMANAGED)?f.createI32(0):f.createI32(1):f.createUnreachable();case"clz":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=f.createUnary(o.UnaryOp.ClzI32,m);break;case 10:case 2:case 7:E=f.createUnary(o.UnaryOp.ClzI32,m);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}case 4:E=f.createUnary(e.options.isWasm64?o.UnaryOp.ClzI64:o.UnaryOp.ClzI32,m);break;case 3:case 8:E=f.createUnary(o.UnaryOp.ClzI64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"ctz":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],0,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=f.createUnary(o.UnaryOp.CtzI32,m);break;case 10:case 2:case 7:E=f.createUnary(o.UnaryOp.CtzI32,m);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}case 4:E=f.createUnary(e.options.isWasm64?o.UnaryOp.CtzI64:o.UnaryOp.CtzI32,m);break;case 3:case 8:E=f.createUnary(o.UnaryOp.CtzI64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"popcnt":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=f.createUnary(o.UnaryOp.PopcntI32,m);break;case 10:case 2:case 7:E=f.createUnary(o.UnaryOp.PopcntI32,m);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}case 4:E=f.createUnary(e.options.isWasm64?o.UnaryOp.PopcntI64:o.UnaryOp.PopcntI32,m);break;case 3:case 8:E=f.createUnary(o.UnaryOp.PopcntI64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"rotl":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(g=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:E=e.ensureSmallIntegerWrap(f.createBinary(o.BinaryOp.RotlI32,m,g),e.currentType);case 2:case 7:E=f.createBinary(o.BinaryOp.RotlI32,m,g);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}case 4:E=f.createBinary(e.options.isWasm64?o.BinaryOp.RotlI64:o.BinaryOp.RotlI32,m,g);break;case 3:case 8:E=f.createBinary(o.BinaryOp.RotlI64,m,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"rotr":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.i32,0,1);switch(g=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:E=e.ensureSmallIntegerWrap(f.createBinary(o.BinaryOp.RotrI32,m,g),e.currentType);break;case 2:case 7:E=f.createBinary(o.BinaryOp.RotrI32,m,g);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}case 4:E=f.createBinary(e.options.isWasm64?o.BinaryOp.RotrI64:o.BinaryOp.RotrI32,m,g);break;case 3:case 8:E=f.createBinary(o.BinaryOp.RotrI64,m,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"abs":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.f64,0,1);switch(e.currentType.kind){case 0:case 1:case 2:var S=(b=e.currentFlow).getTempLocal(s.Type.i32,!1),N=b.getAndFreeTempLocal(s.Type.i32,!1).index,O=S.index;E=f.createBinary(o.BinaryOp.XorI32,f.createBinary(o.BinaryOp.AddI32,f.createTeeLocal(N,f.createBinary(o.BinaryOp.ShrI32,f.createTeeLocal(O,m),f.createI32(31))),f.createGetLocal(O,o.NativeType.I32)),f.createGetLocal(N,o.NativeType.I32)),b.freeTempLocal(S);break;case 4:var x=e.options,b=e.currentFlow,L=x.isWasm64;S=b.getTempLocal(x.usizeType,!1),N=b.getAndFreeTempLocal(x.usizeType,!1).index,O=S.index;E=f.createBinary(L?o.BinaryOp.XorI64:o.BinaryOp.XorI32,f.createBinary(L?o.BinaryOp.AddI64:o.BinaryOp.AddI32,f.createTeeLocal(N,f.createBinary(L?o.BinaryOp.ShrI64:o.BinaryOp.ShrI32,f.createTeeLocal(O,m),L?f.createI64(63):f.createI32(31))),f.createGetLocal(O,x.nativeSizeType)),f.createGetLocal(N,x.nativeSizeType)),b.freeTempLocal(S);break;case 3:S=(b=e.currentFlow).getTempLocal(s.Type.i64,!1),N=b.getAndFreeTempLocal(s.Type.i64,!1).index,O=S.index;E=f.createBinary(o.BinaryOp.XorI64,f.createBinary(o.BinaryOp.AddI64,f.createTeeLocal(N,f.createBinary(o.BinaryOp.ShrI64,f.createTeeLocal(O,m),f.createI64(63))),f.createGetLocal(O,o.NativeType.I64)),f.createGetLocal(N,o.NativeType.I64)),b.freeTempLocal(S);break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}case 5:case 6:case 7:case 8:case 10:E=m;break;case 11:E=f.createUnary(o.UnaryOp.AbsF32,m);break;case 12:E=f.createUnary(o.UnaryOp.AbsF64,m);break;case 14:E=f.createUnreachable();break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"max":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.f64,0,1);switch(g=e.compileExpression(n[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:var k=(b=e.currentFlow).getTempLocal(e.currentType,!b.canOverflow(m,e.currentType));S=b.getAndFreeTempLocal(e.currentType,!b.canOverflow(g,e.currentType));b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.GtI32,f.createGetLocal(k.index,o.NativeType.I32),f.createGetLocal(S.index,o.NativeType.I32)));break;case 5:case 6:case 7:case 10:k=(b=e.currentFlow).getTempLocal(e.currentType,!b.canOverflow(m,e.currentType)),S=b.getAndFreeTempLocal(e.currentType,!b.canOverflow(g,e.currentType));b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.GtU32,f.createGetLocal(k.index,o.NativeType.I32),f.createGetLocal(S.index,o.NativeType.I32)));break;case 3:k=(b=e.currentFlow).getTempLocal(s.Type.i64,!1),S=b.getAndFreeTempLocal(s.Type.i64,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.GtI64,f.createGetLocal(k.index,o.NativeType.I64),f.createGetLocal(S.index,o.NativeType.I64)));break;case 8:k=(b=e.currentFlow).getTempLocal(s.Type.i64,!1),S=b.getAndFreeTempLocal(s.Type.i64,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.GtU64,f.createGetLocal(k.index,o.NativeType.I64),f.createGetLocal(S.index,o.NativeType.I64)));break;case 4:k=(b=e.currentFlow).getTempLocal(e.options.usizeType,!1),S=b.getAndFreeTempLocal(e.options.usizeType,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(e.options.isWasm64?o.BinaryOp.GtI64:o.BinaryOp.GtI32,f.createGetLocal(k.index,e.options.nativeSizeType),f.createGetLocal(S.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}k=(b=e.currentFlow).getTempLocal(e.options.usizeType,!1),S=b.getAndFreeTempLocal(e.options.usizeType,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(e.options.isWasm64?o.BinaryOp.GtU64:o.BinaryOp.GtU32,f.createGetLocal(k.index,e.options.nativeSizeType),f.createGetLocal(S.index,e.options.nativeSizeType)));break;case 11:E=f.createBinary(o.BinaryOp.MaxF32,m,g);break;case 12:E=f.createBinary(o.BinaryOp.MaxF64,m,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"min":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpression(n[0],s.Type.f64,0,1);switch(g=e.compileExpression(n[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:k=(b=e.currentFlow).getTempLocal(e.currentType,!b.canOverflow(m,e.currentType)),S=b.getAndFreeTempLocal(e.currentType,!b.canOverflow(g,e.currentType));b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.LtI32,f.createGetLocal(k.index,o.NativeType.I32),f.createGetLocal(S.index,o.NativeType.I32)));break;case 5:case 6:case 7:case 10:k=(b=e.currentFlow).getTempLocal(e.currentType,!b.canOverflow(m,e.currentType)),S=b.getAndFreeTempLocal(e.currentType,!b.canOverflow(g,e.currentType));b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.LtU32,f.createGetLocal(k.index,o.NativeType.I32),f.createGetLocal(S.index,o.NativeType.I32)));break;case 3:k=(b=e.currentFlow).getTempLocal(s.Type.i64,!1),S=b.getAndFreeTempLocal(s.Type.i64,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.LtI64,f.createGetLocal(k.index,o.NativeType.I64),f.createGetLocal(S.index,o.NativeType.I64)));break;case 8:k=(b=e.currentFlow).getTempLocal(s.Type.i64,!1),S=b.getAndFreeTempLocal(s.Type.i64,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(o.BinaryOp.LtU64,f.createGetLocal(k.index,o.NativeType.I64),f.createGetLocal(S.index,o.NativeType.I64)));break;case 4:k=(b=e.currentFlow).getTempLocal(e.options.usizeType,!1),S=b.getAndFreeTempLocal(e.options.usizeType,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(e.options.isWasm64?o.BinaryOp.LtI64:o.BinaryOp.LtI32,f.createGetLocal(k.index,e.options.nativeSizeType),f.createGetLocal(S.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}k=(b=e.currentFlow).getTempLocal(e.options.usizeType,!1),S=b.getAndFreeTempLocal(e.options.usizeType,!1);b.freeTempLocal(k),E=f.createSelect(f.createTeeLocal(k.index,m),f.createTeeLocal(S.index,g),f.createBinary(e.options.isWasm64?o.BinaryOp.LtU64:o.BinaryOp.LtU32,f.createGetLocal(k.index,e.options.nativeSizeType),f.createGetLocal(S.index,e.options.nativeSizeType)));break;case 11:E=f.createBinary(o.BinaryOp.MinF32,m,g);break;case 12:E=f.createBinary(o.BinaryOp.MinF64,m,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"ceil":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}default:E=m;break;case 11:E=f.createUnary(o.UnaryOp.CeilF32,m);break;case 12:E=f.createUnary(o.UnaryOp.CeilF64,m);break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"floor":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}default:E=m;break;case 11:E=f.createUnary(o.UnaryOp.FloorF32,m);break;case 12:E=f.createUnary(o.UnaryOp.FloorF64,m);break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"copysign":if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(g=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 11:E=f.createBinary(o.BinaryOp.CopysignF32,m,g);break;case 12:E=f.createBinary(o.BinaryOp.CopysignF64,m,g);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"nearest":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}default:E=m;break;case 11:E=f.createUnary(o.UnaryOp.NearestF32,m);break;case 12:E=f.createUnary(o.UnaryOp.NearestF64,m);break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"reinterpret":if(1!=n.length)return r&&1==r.length||(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0")),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(!r||1!=r.length)return r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable();switch(r[0].kind){case 2:case 7:m=e.compileExpression(n[0],s.Type.f32,1,0),E=f.createUnary(o.UnaryOp.ReinterpretF32,m);break;case 3:case 8:m=e.compileExpression(n[0],s.Type.f64,1,0),E=f.createUnary(o.UnaryOp.ReinterpretF64,m);break;case 9:if(r[0].is(256))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),e.currentType=r[0],f.createUnreachable();case 4:m=e.compileExpression(n[0],e.options.isWasm64?s.Type.f64:s.Type.f32,1,0),E=f.createUnary(e.options.isWasm64?o.UnaryOp.ReinterpretF64:o.UnaryOp.ReinterpretF32,m);break;case 11:m=e.compileExpression(n[0],s.Type.i32,1,0),E=f.createUnary(o.UnaryOp.ReinterpretI32,m);break;case 12:m=e.compileExpression(n[0],s.Type.i64,1,0),E=f.createUnary(o.UnaryOp.ReinterpretI64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return e.currentType=r[0],E;case"sqrt":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 11:E=f.createUnary(o.UnaryOp.SqrtF32,m);break;case 12:E=f.createUnary(o.UnaryOp.SqrtF64,m);break;default:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"trunc":if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(r&&r.length){if(e.currentType=r[0],1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable();break}default:E=m;break;case 11:E=f.createUnary(o.UnaryOp.TruncF32,m);break;case 12:E=f.createUnary(o.UnaryOp.TruncF64,m);break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"load":return n.length<1||n.length>2?(r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<1?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable()):r&&1==r.length?(m=e.compileExpression(n[0],e.options.usizeType,1,0),(P=2==n.length?d(e,n[1]):0)<0?f.createUnreachable():(e.currentType=r[0],f.createLoad(r[0].byteSize,r[0].is(5),m,r[0].is(4)&&p.is(4)&&p.size>r[0].size?(e.currentType=p).toNativeType():(e.currentType=r[0]).toNativeType(),P))):(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable());case"store":if(e.currentType=s.Type.void,n.length<2||n.length>3)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"2",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),f.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable();m=e.compileExpression(n[0],e.options.usizeType,1,0),g=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);I=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size2?(r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<1?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable()):r&&1==r.length?(m=e.compileExpression(n[0],e.options.usizeType,1,0),(P=2==n.length?d(e,n[1]):0)<0?f.createUnreachable():(e.currentType=r[0],f.createAtomicLoad(r[0].byteSize,m,r[0].is(4)&&p.is(4)&&p.size>r[0].size?(e.currentType=p).toNativeType():(e.currentType=r[0]).toNativeType(),P))):(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable());case"atomic.store":if(!e.options.hasFeature(16))break;if(e.currentType=s.Type.void,n.length<2||n.length>3)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"2",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),f.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable();m=e.compileExpression(n[0],e.options.usizeType,1,0),g=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);I=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size3)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"2",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),f.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable();m=e.compileExpression(n[0],e.options.usizeType,1,0),g=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);I=void 0;if(r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size4)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),n.length<3?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"2",n.length.toString(10)):e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),f.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable();m=e.compileExpression(n[0],e.options.usizeType,1,0),g=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0),T=e.compileExpression(n[2],r[0],r[0].is(4)?0:1,0);I=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size1)return r&&1==r.length||e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();if(!r||1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable();var U;if(!(U=r[0].classReference))return e.error(i.DiagnosticCode.Operation_not_supported,u.range),f.createUnreachable();var P=void 0;if(n.length){if(n[0].kind!=a.NodeKind.LITERAL||n[0].literalKind!=a.LiteralKind.STRING)return e.error(i.DiagnosticCode.String_literal_expected,n[0].range),f.createUnreachable();var w=n[0].value,M=U.members?U.members.get(w):null;if(!M||M.kind!=c.ElementKind.FIELD)return e.error(i.DiagnosticCode.Type_0_has_no_property_1,n[0].range,U.internalName,w),f.createUnreachable();P=M.memoryOffset}else P=U.currentMemoryOffset;return e.options.isWasm64?p.is(4)&&p.size<=32?(e.currentType=s.Type.u32,f.createI32(P)):f.createI64(P):p.is(4)&&64==p.size?(e.currentType=s.Type.u64,f.createI64(P)):f.createI32(P);case"select":if(3!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),f.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,0)}else m=e.compileExpressionRetainType(n[0],s.Type.i32,0);I=e.currentType;switch(g=e.compileExpression(n[1],I,1,0),T=e.makeIsTrueish(e.compileExpressionRetainType(n[2],s.Type.bool,0),e.currentType),e.currentType=I,e.currentType.kind){case 0:case 1:case 5:case 6:case 10:default:E=f.createSelect(m,g,T);break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=f.createUnreachable()}return E;case"unreachable":return 0!=n.length&&e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"0",n.length.toString(10)),r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),f.createUnreachable();case"memory.size":return e.currentType=s.Type.i32,0!=n.length&&e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"0",n.length.toString(10)),r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),f.createHost(o.HostOp.CurrentMemory);case"memory.grow":return e.currentType=s.Type.i32,1!=n.length?(e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"0",n.length.toString(10)),m=f.createUnreachable()):m=e.compileExpression(n[0],s.Type.i32,1,0),r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),f.createHost(o.HostOp.GrowMemory,null,[m]);case"memory.copy":if(!e.options.hasFeature(4)){var G=e.resolver.resolveFunction(t,null);return e.currentType=s.Type.void,G?e.compileCallDirect(G,n,u):f.createUnreachable()}if(r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),3!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),e.currentType=s.Type.void,f.createUnreachable();var V=e.options.usizeType;return m=e.compileExpression(n[0],V,1,0),g=e.compileExpression(n[1],V,1,0),T=e.compileExpression(n[2],V,1,0),e.currentType=s.Type.void,f.createMemoryCopy(m,g,T);case"memory.fill":if(!e.options.hasFeature(4)){G=e.resolver.resolveFunction(t,null);return e.currentType=s.Type.void,G?e.compileCallDirect(G,n,u):f.createUnreachable()}if(r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),3!=n.length)return e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"3",n.length.toString(10)),e.currentType=s.Type.void,f.createUnreachable();V=e.options.usizeType;return m=e.compileExpression(n[0],V,1,0),g=e.compileExpression(n[1],s.Type.u32,1,0),T=e.compileExpression(n[2],V,1,0),e.currentType=s.Type.void,f.createMemoryFill(m,g,T);case"changetype":return r&&1==r.length?1!=n.length?(e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),e.currentType=r[0],f.createUnreachable()):(m=e.compileExpressionRetainType(n[0],r[0],0),e.currentType=r[0],e.currentType.size!=r[0].size?(e.error(i.DiagnosticCode.Operation_not_supported,u.range),f.createUnreachable()):m):(r&&r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r?r.length.toString(10):"0"),f.createUnreachable());case"assert":if(n.length<1||n.length>2)return r&&(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),n.length<1?e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)):n.length>2&&e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"2",n.length.toString(10)),f.createUnreachable();if(r){if(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length)return e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();m=e.compileExpression(n[0],r[0],1,1)}else m=e.compileExpressionRetainType(n[0],s.Type.bool,1);I=e.currentType;if(e.currentType=I.nonNullableType,e.options.noAssert)return p==s.Type.void?(e.currentType=s.Type.void,f.createNop()):m;var K=y(e,2==n.length?n[1]:null,u);if(e.currentType=I.nonNullableType,p==s.Type.void){switch(e.currentType.kind){default:E=f.createIf(f.createUnary(o.UnaryOp.EqzI32,m),K);break;case 3:case 8:E=f.createIf(f.createUnary(o.UnaryOp.EqzI64,m),K);break;case 4:case 9:E=f.createIf(f.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,m),K);break;case 11:E=f.createIf(f.createBinary(o.BinaryOp.EqF32,m,f.createF32(0)),K);break;case 12:E=f.createIf(f.createBinary(o.BinaryOp.EqF64,m,f.createF64(0)),K);break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=K}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:var z=(b=e.currentFlow).getAndFreeTempLocal(e.currentType,!b.canOverflow(m,e.currentType));E=f.createIf(f.createTeeLocal(z.index,m),f.createGetLocal(z.index,o.NativeType.I32),K);break;case 2:case 7:default:z=e.currentFlow.getAndFreeTempLocal(s.Type.i32,!1);E=f.createIf(f.createTeeLocal(z.index,m),f.createGetLocal(z.index,o.NativeType.I32),K);break;case 3:case 8:z=e.currentFlow.getAndFreeTempLocal(s.Type.i64,!1);E=f.createIf(f.createUnary(o.UnaryOp.EqzI64,f.createTeeLocal(z.index,m)),K,f.createGetLocal(z.index,o.NativeType.I64));break;case 4:case 9:z=e.currentFlow.getAndFreeTempLocal(e.options.usizeType,!1);E=f.createIf(f.createUnary(e.options.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,f.createTeeLocal(z.index,m)),K,f.createGetLocal(z.index,e.options.nativeSizeType));break;case 11:z=e.currentFlow.getAndFreeTempLocal(s.Type.f32,!1);E=f.createIf(f.createBinary(o.BinaryOp.EqF32,f.createTeeLocal(z.index,m),f.createF32(0)),K,f.createGetLocal(z.index,o.NativeType.F32));break;case 12:z=e.currentFlow.getAndFreeTempLocal(s.Type.f64,!1);E=f.createIf(f.createBinary(o.BinaryOp.EqF64,f.createTeeLocal(z.index,m),f.createF64(0)),K,f.createGetLocal(z.index,o.NativeType.F64));break;case 14:e.error(i.DiagnosticCode.Operation_not_supported,u.range),E=K}return E;case"unchecked":return r&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),1!=n.length?(e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable()):((b=e.currentFlow).set(8192),E=e.compileExpressionRetainType(n[0],p,0),b.unset(8192),E);case"call_indirect":if(n.length<1)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10))),e.error(i.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,u.range,"1",n.length.toString(10)),f.createUnreachable();var H=void 0;if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,u.range,"1",r.length.toString(10)),f.createUnreachable();H=r[0]}else H=p;if(m=e.compileExpressionRetainType(n[0],s.Type.u32,0),7!=e.currentType.kind)return e.error(i.DiagnosticCode.Operation_not_supported,n[0].range),f.createUnreachable();for(var X=n.length-1,W=new Array(X),Y=new Array(X+1),Q=H.toNativeType(),q=new Array(X),j=0;j void"),f.createUnreachable())}var ne=function(e,t,r,n,i){switch(t.internalName){case"i32.clz":return h("clz",e,s.Type.i32,r,s.Type.i32,i);case"i64.clz":return h("clz",e,s.Type.i64,r,s.Type.i64,i);case"i32.ctz":return h("ctz",e,s.Type.i32,r,s.Type.i32,i);case"i64.ctz":return h("ctz",e,s.Type.i64,r,s.Type.i64,i);case"i32.popcnt":return h("popcnt",e,s.Type.i32,r,s.Type.i32,i);case"i64.popcnt":return h("popcnt",e,s.Type.i64,r,s.Type.i64,i);case"i32.rotl":return h("rotl",e,s.Type.i32,r,s.Type.i32,i);case"i64.rotl":return h("rotl",e,s.Type.i64,r,s.Type.i64,i);case"i32.rotr":return h("rotr",e,s.Type.i32,r,s.Type.i32,i);case"i64.rotr":return h("rotr",e,s.Type.i64,r,s.Type.i64,i);case"f32.abs":return h("abs",e,s.Type.f32,r,s.Type.f32,i);case"f64.abs":return h("abs",e,s.Type.f64,r,s.Type.f64,i);case"f32.max":return h("max",e,s.Type.f32,r,s.Type.f32,i);case"f64.max":return h("max",e,s.Type.f64,r,s.Type.f64,i);case"f32.min":return h("min",e,s.Type.f32,r,s.Type.f32,i);case"f64.min":return h("min",e,s.Type.f64,r,s.Type.f64,i);case"f32.ceil":return h("ceil",e,s.Type.f32,r,s.Type.f32,i);case"f64.ceil":return h("ceil",e,s.Type.f64,r,s.Type.f64,i);case"f32.floor":return h("floor",e,s.Type.f32,r,s.Type.f32,i);case"f64.floor":return h("floor",e,s.Type.f64,r,s.Type.f64,i);case"f32.copysign":return h("copysign",e,s.Type.f32,r,s.Type.f32,i);case"f64.copysign":return h("copysign",e,s.Type.f64,r,s.Type.f64,i);case"f32.nearest":return h("nearest",e,s.Type.f32,r,s.Type.f32,i);case"f64.nearest":return h("nearest",e,s.Type.f64,r,s.Type.f64,i);case"i32.reinterpret_f32":return h("reinterpret",e,s.Type.i32,r,s.Type.f32,i);case"i64.reinterpret_f64":return h("reinterpret",e,s.Type.i64,r,s.Type.f64,i);case"f32.reinterpret_i32":return h("reinterpret",e,s.Type.f32,r,s.Type.i32,i);case"f64.reinterpret_i64":return h("reinterpret",e,s.Type.f64,r,s.Type.i64,i);case"f32.sqrt":return h("sqrt",e,s.Type.f32,r,s.Type.f32,i);case"f64.sqrt":return h("sqrt",e,s.Type.f64,r,s.Type.f64,i);case"f32.trunc":return h("trunc",e,s.Type.f32,r,s.Type.f32,i);case"f64.trunc":return h("trunc",e,s.Type.f64,r,s.Type.f64,i);case"i32.load8_s":return h("load",e,s.Type.i8,r,s.Type.i32,i);case"i32.load8_u":return h("load",e,s.Type.u8,r,s.Type.u32,i);case"i32.load16_s":return h("load",e,s.Type.i16,r,s.Type.i32,i);case"i32.load16_u":return h("load",e,s.Type.u16,r,s.Type.u32,i);case"i32.load":return h("load",e,s.Type.i32,r,s.Type.i32,i);case"i64.load8_s":return h("load",e,s.Type.i8,r,s.Type.i64,i);case"i64.load8_u":return h("load",e,s.Type.u8,r,s.Type.u64,i);case"i64.load16_s":return h("load",e,s.Type.i16,r,s.Type.i64,i);case"i64.load16_u":return h("load",e,s.Type.u16,r,s.Type.u64,i);case"i64.load32_s":return h("load",e,s.Type.i32,r,s.Type.i64,i);case"i64.load32_u":return h("load",e,s.Type.u32,r,s.Type.u64,i);case"i64.load":return h("load",e,s.Type.i64,r,s.Type.i64,i);case"f32.load":return h("load",e,s.Type.f32,r,s.Type.f32,i);case"f64.load":return h("load",e,s.Type.f64,r,s.Type.f64,i);case"i32.store8":return h("store",e,s.Type.i8,r,s.Type.i32,i);case"i32.store16":return h("store",e,s.Type.i16,r,s.Type.i32,i);case"i32.store":return h("store",e,s.Type.i32,r,s.Type.i32,i);case"i64.store8":return h("store",e,s.Type.i8,r,s.Type.i64,i);case"i64.store16":return h("store",e,s.Type.i16,r,s.Type.i64,i);case"i64.store32":return h("store",e,s.Type.i32,r,s.Type.i64,i);case"i64.store":return h("store",e,s.Type.i64,r,s.Type.i64,i);case"f32.store":return h("store",e,s.Type.f32,r,s.Type.f32,i);case"f64.store":return h("store",e,s.Type.f64,r,s.Type.f64,i)}if(e.options.hasFeature(16))switch(t.internalName){case"i32.atomic.load8_u":return h("atomic.load",e,s.Type.u8,r,s.Type.u32,i);case"i32.atomic.load16_u":return h("atomic.load",e,s.Type.u16,r,s.Type.u32,i);case"i32.atomic.load":return h("atomic.load",e,s.Type.i32,r,s.Type.i32,i);case"i64.atomic.load8_u":return h("atomic.load",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.load16_u":return h("atomic.load",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.load32_u":return h("atomic.load",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.load":return h("atomic.load",e,s.Type.i64,r,s.Type.i64,i);case"i32.atomic.store8":return h("atomic.store",e,s.Type.i8,r,s.Type.i32,i);case"i32.atomic.store16":return h("atomic.store",e,s.Type.i16,r,s.Type.i32,i);case"i32.atomic.store":return h("atomic.store",e,s.Type.i32,r,s.Type.i32,i);case"i64.atomic.store8":return h("atomic.store",e,s.Type.i8,r,s.Type.i64,i);case"i64.atomic.store16":return h("atomic.store",e,s.Type.i16,r,s.Type.i64,i);case"i64.atomic.store32":return h("atomic.store",e,s.Type.i32,r,s.Type.i64,i);case"i64.atomic.store":return h("atomic.store",e,s.Type.i64,r,s.Type.i64,i);case"i32.atomic.rmw8_u.add":return h("atomic.add",e,s.Type.u8,r,s.Type.u32,i);case"i32.atomic.rmw16_u.add":return h("atomic.add",e,s.Type.u16,r,s.Type.u32,i);case"i32.atomic.rmw.add":return h("atomic.add",e,s.Type.u32,r,s.Type.u32,i);case"i64.atomic.rmw8_u.add":return h("atomic.add",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.add":return h("atomic.add",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.add":return h("atomic.add",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.add":return h("atomic.add",e,s.Type.u64,r,s.Type.u64,i);case"i32.atomic.rmw8_u.sub":return h("atomic.sub",e,s.Type.u8,r,s.Type.u32,i);case"i32.atomic.rmw16_u.sub":return h("atomic.sub",e,s.Type.u16,r,s.Type.u32,i);case"i32.atomic.rmw.sub":return h("atomic.sub",e,s.Type.u32,r,s.Type.u32,i);case"i64.atomic.rmw8_u.sub":return h("atomic.sub",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.sub":return h("atomic.sub",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.sub":return h("atomic.sub",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.sub":return h("atomic.sub",e,s.Type.u64,r,s.Type.u64,i);case"i32.atomic.rmw8_u.and":return h("atomic.and",e,s.Type.u8,r,s.Type.u32,i);case"i32.atomic.rmw16_u.and":return h("atomic.and",e,s.Type.u16,r,s.Type.u32,i);case"i32.atomic.rmw.and":return h("atomic.and",e,s.Type.u32,r,s.Type.u32,i);case"i64.atomic.rmw8_u.and":return h("atomic.and",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.and":return h("atomic.and",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.and":return h("atomic.and",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.and":return h("atomic.and",e,s.Type.u64,r,s.Type.u64,i);case"i32.atomic.rmw8_u.or":return h("atomic.or",e,s.Type.u8,r,s.Type.u32,i);case"i32.atomic.rmw16_u.or":return h("atomic.or",e,s.Type.u16,r,s.Type.u32,i);case"i32.atomic.rmw.or":return h("atomic.or",e,s.Type.u32,r,s.Type.u32,i);case"i64.atomic.rmw8_u.or":return h("atomic.or",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.or":return h("atomic.or",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.or":return h("atomic.or",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.or":return h("atomic.or",e,s.Type.u64,r,s.Type.u64,i);case"i32.atomic.rmw8_u.xor":case"i32.atomic.rmw16_u.xor":case"i32.atomic.rmw.xor":return h("atomic.xor",e,s.Type.u8,r,s.Type.u32,i);case"i64.atomic.rmw8_u.xor":return h("atomic.xor",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.xor":return h("atomic.xor",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.xor":return h("atomic.xor",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.xor":return h("atomic.xor",e,s.Type.u64,r,s.Type.u64,i);case"i32.atomic.rmw8_u.xchg":case"i32.atomic.rmw16_u.xchg":case"i32.atomic.rmw.xchg":return h("atomic.xchg",e,s.Type.u8,r,s.Type.u32,i);case"i64.atomic.rmw8_u.xchg":return h("atomic.xchg",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.xchg":return h("atomic.xchg",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.xchg":return h("atomic.xchg",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.xchg":return h("atomic.xchg",e,s.Type.u64,r,s.Type.u64,i);case"i32.atomic.rmw8_u.cmpxchg":case"i32.atomic.rmw16_u.cmpxchg":case"i32.atomic.rmw.cmpxchg":return h("atomic.cmpxchg",e,s.Type.u8,r,s.Type.u32,i);case"i64.atomic.rmw8_u.cmpxchg":return h("atomic.cmpxchg",e,s.Type.u8,r,s.Type.u64,i);case"i64.atomic.rmw16_u.cmpxchg":return h("atomic.cmpxchg",e,s.Type.u16,r,s.Type.u64,i);case"i64.atomic.rmw32_u.cmpxchg":return h("atomic.cmpxchg",e,s.Type.u32,r,s.Type.u64,i);case"i64.atomic.rmw.cmpxchg":return h("atomic.cmpxchg",e,s.Type.u64,r,s.Type.u64,i);case"i32.wait":return h("atomic.wait",e,s.Type.i32,r,s.Type.u32,i);case"i64.wait":return h("atomic.wait",e,s.Type.i64,r,s.Type.i64,i);case"i32.notify":return h("atomic.notify",e,s.Type.i32,r,s.Type.u32,i);case"i64.notify":return h("atomic.notify",e,s.Type.i64,r,s.Type.i64,i)}return 0}(e,t,n,0,u);return ne?(r&&r.length&&e.error(i.DiagnosticCode.Type_0_is_not_generic,u.range,t.internalName),ne):(e.error(i.DiagnosticCode.Cannot_find_name_0,u.expression.range,t.internalName),f.createUnreachable())}function h(e,t,r,n,i,a){var s=e.split("."),o=assert(t.program.elementsLookup.get(s[0]));if(s.length>1)for(var l=1;l1&&e.error(i.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t.length.toString(10)),e.error(i.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"1",r.length.toString(10)),null}function d(e,t){var r,n;return e.options.isWasm64?(r=e.precomputeExpression(t,s.Type.usize64,1,0),(o.getExpressionId(r)!=o.ExpressionId.Const||o.getExpressionType(r)!=o.NativeType.I64||0!=o.getConstValueI64High(r)||(n=o.getConstValueI64Low(r))<0)&&(e.error(i.DiagnosticCode.Expression_must_be_a_compile_time_constant,t.range),n=-1)):(r=e.precomputeExpression(t,s.Type.usize32,1,0),(o.getExpressionId(r)!=o.ExpressionId.Const||o.getExpressionType(r)!=o.NativeType.I32||(n=o.getConstValueI32(r))<0)&&(e.error(i.DiagnosticCode.Expression_must_be_a_compile_time_constant,t.range),n=-1)),n}function y(e,t,r){var n=e.program,i=e.module,a=n.typesLookup.get("string");if(!a)return i.createUnreachable();var c=n.abortInstance;if(!c||!e.compileFunction(c))return i.createUnreachable();var l=null!=t?e.compileExpression(t,a,1,0):a.toNativeZero(i),p=e.ensureStaticString(r.range.source.normalizedPath);return e.currentType=s.Type.void,i.createBlock(null,[i.createCall(c.internalName,[l,p,i.createI32(r.range.line),i.createI32(r.range.column)],o.NativeType.None),i.createUnreachable()])}t.compileCall=u,t.compileAbort=y,t.compileIterateRoots=function(e){var t,r,i=e.module,a=new Array;try{for(var l=n(e.program.elementsLookup.values()),u=l.next();!u.done;u=l.next()){var h=u.value;if(h.kind==c.ElementKind.GLOBAL){var _=h,d=_.type.classReference;if(_.is(p.CommonFlags.COMPILED)&&null!==d&&!d.hasDecorator(c.DecoratorFlags.UNMANAGED))if(_.is(p.CommonFlags.INLINED)){var y=_.constantIntegerValue;a.push(i.createCallIndirect(i.createGetLocal(0,o.NativeType.I32),[e.options.isWasm64?i.createI64(i64_low(y),i64_high(y)):i.createI32(i64_low(y))],"i_"))}else a.push(i.createCallIndirect(i.createGetLocal(0,o.NativeType.I32),[i.createGetGlobal(_.internalName,e.options.nativeSizeType)],"i_"))}}}catch(e){t={error:e}}finally{try{u&&!u.done&&(r=l.return)&&r.call(l)}finally{if(t)throw t.error}}var m=e.ensureFunctionType([s.Type.i32],s.Type.void);i.addFunction("~iterateRoots",m,[],a.length?i.createBlock(null,a):i.createNop())},t.ensureGCHook=function e(t,r){var i,a,l=t.program;assert(r.type.isManaged(l));var u=r.gcHookIndex;if(-1!=u)return u;var h=r.members;if(r.prototype.declaration.range.source.isLibrary&&null!==h&&h.has("__gc")){var _=assert(h.get("__gc"));assert(_.kind==c.ElementKind.FUNCTION_PROTOTYPE);var d=assert(l.resolver.resolveFunction(_,null));assert(d.is(p.CommonFlags.PRIVATE|p.CommonFlags.INSTANCE)),assert(!d.isAny(p.CommonFlags.AMBIENT|p.CommonFlags.VIRTUAL)),assert(0==d.signature.parameterTypes.length),assert(d.signature.returnType==s.Type.void),d.internalName=r.internalName+"~gc",assert(t.compileFunction(d));var y=t.ensureFunctionTableEntry(d);return r.gcHookIndex=y,y}var m=t.module,g=t.options,T=g.nativeSizeType,E=g.usizeType.byteSize,f=new Array;f.push(m.createIf(m.createUnary(g.isWasm64?o.UnaryOp.EqzI64:o.UnaryOp.EqzI32,m.createGetLocal(0,T)),m.createReturn()));var I=t.functionTable,v=I.length;I.push(""),r.gcHookIndex=v;var A=r.base;if(A?(assert(A.type.isManaged(l)),f.push(m.createCallIndirect(m.createI32(e(t,A.type.classReference)),[m.createGetLocal(0,T)],T==o.NativeType.I64?"I_":"i_"))):f.push(m.createCall(assert(l.gcMarkInstance).internalName,[m.createGetLocal(0,T)],o.NativeType.None)),h)try{for(var C=n(h.values()),S=C.next();!S.done;S=C.next()){var N=S.value;if(N.kind==c.ElementKind.FIELD&&N.parent===r&&N.type.isManaged(l)){var O=N.memoryOffset;assert(O>=0),f.push(m.createCall(assert(l.gcMarkInstance).internalName,[m.createLoad(E,!1,m.createGetLocal(0,T),T,O)],o.NativeType.None))}}}catch(e){i={error:e}}finally{try{S&&!S.done&&(a=C.return)&&a.call(C)}finally{if(i)throw i.error}}var x=r.internalName+"~gc";return m.addFunction(x,t.ensureFunctionType(null,s.Type.void,g.usizeType),null,m.createBlock(null,f)),I[v]=x,v}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.bitsetIs=function(e,t){return assert(t>=0&&t<64),i64_ne(i64_and(e,i64_shl(i64_one,i64_new(t))),i64_zero)},t.bitsetSet=function(e,t,r){return assert(t>=0&&t<64),r?i64_or(e,i64_shl(i64_one,i64_new(t))):i64_and(e,i64_not(i64_shl(i64_one,i64_new(t))))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NULL=0]="NULL",e[e.LINEFEED=10]="LINEFEED",e[e.CARRIAGERETURN=13]="CARRIAGERETURN",e[e.LINESEPARATOR=8232]="LINESEPARATOR",e[e.PARAGRAPHSEPARATOR=8233]="PARAGRAPHSEPARATOR",e[e.NEXTLINE=133]="NEXTLINE",e[e.SPACE=32]="SPACE",e[e.NONBREAKINGSPACE=160]="NONBREAKINGSPACE",e[e.ENQUAD=8192]="ENQUAD",e[e.EMQUAD=8193]="EMQUAD",e[e.ENSPACE=8194]="ENSPACE",e[e.EMSPACE=8195]="EMSPACE",e[e.THREEPEREMSPACE=8196]="THREEPEREMSPACE",e[e.FOURPEREMSPACE=8197]="FOURPEREMSPACE",e[e.SIXPEREMSPACE=8198]="SIXPEREMSPACE",e[e.FIGURESPACE=8199]="FIGURESPACE",e[e.PUNCTUATIONSPACE=8200]="PUNCTUATIONSPACE",e[e.THINSPACE=8201]="THINSPACE",e[e.HAIRSPACE=8202]="HAIRSPACE",e[e.ZEROWIDTHSPACE=8203]="ZEROWIDTHSPACE",e[e.NARROWNOBREAKSPACE=8239]="NARROWNOBREAKSPACE",e[e.IDEOGRAPHICSPACE=12288]="IDEOGRAPHICSPACE",e[e.MATHEMATICALSPACE=8287]="MATHEMATICALSPACE",e[e.OGHAM=5760]="OGHAM",e[e._=95]="_",e[e._0=48]="_0",e[e._1=49]="_1",e[e._2=50]="_2",e[e._3=51]="_3",e[e._4=52]="_4",e[e._5=53]="_5",e[e._6=54]="_6",e[e._7=55]="_7",e[e._8=56]="_8",e[e._9=57]="_9",e[e.a=97]="a",e[e.b=98]="b",e[e.c=99]="c",e[e.d=100]="d",e[e.e=101]="e",e[e.f=102]="f",e[e.g=103]="g",e[e.h=104]="h",e[e.i=105]="i",e[e.j=106]="j",e[e.k=107]="k",e[e.l=108]="l",e[e.m=109]="m",e[e.n=110]="n",e[e.o=111]="o",e[e.p=112]="p",e[e.q=113]="q",e[e.r=114]="r",e[e.s=115]="s",e[e.t=116]="t",e[e.u=117]="u",e[e.v=118]="v",e[e.w=119]="w",e[e.x=120]="x",e[e.y=121]="y",e[e.z=122]="z",e[e.A=65]="A",e[e.B=66]="B",e[e.C=67]="C",e[e.D=68]="D",e[e.E=69]="E",e[e.F=70]="F",e[e.G=71]="G",e[e.H=72]="H",e[e.I=73]="I",e[e.J=74]="J",e[e.K=75]="K",e[e.L=76]="L",e[e.M=77]="M",e[e.N=78]="N",e[e.O=79]="O",e[e.P=80]="P",e[e.Q=81]="Q",e[e.R=82]="R",e[e.S=83]="S",e[e.T=84]="T",e[e.U=85]="U",e[e.V=86]="V",e[e.W=87]="W",e[e.X=88]="X",e[e.Y=89]="Y",e[e.Z=90]="Z",e[e.AMPERSAND=38]="AMPERSAND",e[e.ASTERISK=42]="ASTERISK",e[e.AT=64]="AT",e[e.BACKSLASH=92]="BACKSLASH",e[e.BACKTICK=96]="BACKTICK",e[e.BAR=124]="BAR",e[e.CARET=94]="CARET",e[e.CLOSEBRACE=125]="CLOSEBRACE",e[e.CLOSEBRACKET=93]="CLOSEBRACKET",e[e.CLOSEPAREN=41]="CLOSEPAREN",e[e.COLON=58]="COLON",e[e.COMMA=44]="COMMA",e[e.DOLLAR=36]="DOLLAR",e[e.DOT=46]="DOT",e[e.DOUBLEQUOTE=34]="DOUBLEQUOTE",e[e.EQUALS=61]="EQUALS",e[e.EXCLAMATION=33]="EXCLAMATION",e[e.GREATERTHAN=62]="GREATERTHAN",e[e.HASH=35]="HASH",e[e.LESSTHAN=60]="LESSTHAN",e[e.MINUS=45]="MINUS",e[e.OPENBRACE=123]="OPENBRACE",e[e.OPENBRACKET=91]="OPENBRACKET",e[e.OPENPAREN=40]="OPENPAREN",e[e.PERCENT=37]="PERCENT",e[e.PLUS=43]="PLUS",e[e.QUESTION=63]="QUESTION",e[e.SEMICOLON=59]="SEMICOLON",e[e.SINGLEQUOTE=39]="SINGLEQUOTE",e[e.SLASH=47]="SLASH",e[e.TILDE=126]="TILDE",e[e.BACKSPACE=8]="BACKSPACE",e[e.FORMFEED=12]="FORMFEED",e[e.BYTEORDERMARK=65279]="BYTEORDERMARK",e[e.TAB=9]="TAB",e[e.VERTICALTAB=11]="VERTICALTAB"}(t.CharCode||(t.CharCode={})),t.isLineBreak=function(e){switch(e){case 10:case 13:case 8232:case 8233:return!0;default:return!1}},t.isWhiteSpace=function(e){switch(e){case 32:case 9:case 11:case 12:case 160:case 133:case 5760:case 8239:case 8287:case 12288:case 65279:return!0;default:return e>=8192&&e<=8203}},t.isDecimalDigit=function(e){return e>=48&&e<=57},t.isOctalDigit=function(e){return e>=48&&e<=55},t.isIdentifierStart=function(e){return e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>127&&!((t=e)<0||t>65535)&&a(t,n);var t},t.isKeywordCharacter=function(e){return e>=97&&e<=122},t.isIdentifierPart=function(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||36==e||95==e||e>127&&!((t=e)<0||t>65535)&&a(t,i);var t};var n=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,880,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1162,1319,1329,1366,1369,1369,1377,1415,1488,1514,1520,1522,1568,1610,1646,1647,1649,1747,1749,1749,1765,1766,1774,1775,1786,1788,1791,1791,1808,1808,1810,1839,1869,1957,1969,1969,1994,2026,2036,2037,2042,2042,2048,2069,2074,2074,2084,2084,2088,2088,2112,2136,2208,2208,2210,2220,2308,2361,2365,2365,2384,2384,2392,2401,2417,2423,2425,2431,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2493,2493,2510,2510,2524,2525,2527,2529,2544,2545,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2649,2652,2654,2654,2674,2676,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2749,2749,2768,2768,2784,2785,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2877,2877,2908,2909,2911,2913,2929,2929,2947,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3024,3024,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3133,3160,3161,3168,3169,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3261,3261,3294,3294,3296,3297,3313,3314,3333,3340,3342,3344,3346,3386,3389,3389,3406,3406,3424,3425,3450,3455,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3585,3632,3634,3635,3648,3654,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3760,3762,3763,3773,3773,3776,3780,3782,3782,3804,3807,3840,3840,3904,3911,3913,3948,3976,3980,4096,4138,4159,4159,4176,4181,4186,4189,4193,4193,4197,4198,4206,4208,4213,4225,4238,4238,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5905,5920,5937,5952,5969,5984,5996,5998,6e3,6016,6067,6103,6103,6108,6108,6176,6263,6272,6312,6314,6314,6320,6389,6400,6428,6480,6509,6512,6516,6528,6571,6593,6599,6656,6678,6688,6740,6823,6823,6917,6963,6981,6987,7043,7072,7086,7087,7098,7141,7168,7203,7245,7247,7258,7293,7401,7404,7406,7409,7413,7414,7424,7615,7680,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8305,8305,8319,8319,8336,8348,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11502,11506,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11648,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11823,11823,12293,12295,12321,12329,12337,12341,12344,12348,12353,12438,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42527,42538,42539,42560,42606,42623,42647,42656,42735,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43009,43011,43013,43015,43018,43020,43042,43072,43123,43138,43187,43250,43255,43259,43259,43274,43301,43312,43334,43360,43388,43396,43442,43471,43471,43520,43560,43584,43586,43588,43595,43616,43638,43642,43642,43648,43695,43697,43697,43701,43702,43705,43709,43712,43712,43714,43714,43739,43741,43744,43754,43762,43764,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44002,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64285,64287,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65136,65140,65142,65276,65313,65338,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500],i=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,768,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1155,1159,1162,1319,1329,1366,1369,1369,1377,1415,1425,1469,1471,1471,1473,1474,1476,1477,1479,1479,1488,1514,1520,1522,1552,1562,1568,1641,1646,1747,1749,1756,1759,1768,1770,1788,1791,1791,1808,1866,1869,1969,1984,2037,2042,2042,2048,2093,2112,2139,2208,2208,2210,2220,2276,2302,2304,2403,2406,2415,2417,2423,2425,2431,2433,2435,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2492,2500,2503,2504,2507,2510,2519,2519,2524,2525,2527,2531,2534,2545,2561,2563,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2620,2620,2622,2626,2631,2632,2635,2637,2641,2641,2649,2652,2654,2654,2662,2677,2689,2691,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2748,2757,2759,2761,2763,2765,2768,2768,2784,2787,2790,2799,2817,2819,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2876,2884,2887,2888,2891,2893,2902,2903,2908,2909,2911,2915,2918,2927,2929,2929,2946,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3006,3010,3014,3016,3018,3021,3024,3024,3031,3031,3046,3055,3073,3075,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3140,3142,3144,3146,3149,3157,3158,3160,3161,3168,3171,3174,3183,3202,3203,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3260,3268,3270,3272,3274,3277,3285,3286,3294,3294,3296,3299,3302,3311,3313,3314,3330,3331,3333,3340,3342,3344,3346,3386,3389,3396,3398,3400,3402,3406,3415,3415,3424,3427,3430,3439,3450,3455,3458,3459,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3530,3530,3535,3540,3542,3542,3544,3551,3570,3571,3585,3642,3648,3662,3664,3673,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3769,3771,3773,3776,3780,3782,3782,3784,3789,3792,3801,3804,3807,3840,3840,3864,3865,3872,3881,3893,3893,3895,3895,3897,3897,3902,3911,3913,3948,3953,3972,3974,3991,3993,4028,4038,4038,4096,4169,4176,4253,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4957,4959,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5908,5920,5940,5952,5971,5984,5996,5998,6e3,6002,6003,6016,6099,6103,6103,6108,6109,6112,6121,6155,6157,6160,6169,6176,6263,6272,6314,6320,6389,6400,6428,6432,6443,6448,6459,6470,6509,6512,6516,6528,6571,6576,6601,6608,6617,6656,6683,6688,6750,6752,6780,6783,6793,6800,6809,6823,6823,6912,6987,6992,7001,7019,7027,7040,7155,7168,7223,7232,7241,7245,7293,7376,7378,7380,7414,7424,7654,7676,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8204,8205,8255,8256,8276,8276,8305,8305,8319,8319,8336,8348,8400,8412,8417,8417,8421,8432,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11647,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11744,11775,11823,11823,12293,12295,12321,12335,12337,12341,12344,12348,12353,12438,12441,12442,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42539,42560,42607,42612,42621,42623,42647,42655,42737,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43047,43072,43123,43136,43204,43216,43225,43232,43255,43259,43259,43264,43309,43312,43347,43360,43388,43392,43456,43471,43481,43520,43574,43584,43597,43600,43609,43616,43638,43642,43643,43648,43714,43739,43741,43744,43759,43762,43766,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44010,44012,44013,44016,44025,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65024,65039,65056,65062,65075,65076,65101,65103,65136,65140,65142,65276,65296,65305,65313,65338,65343,65343,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500];function a(e,t){if(e=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},i=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)s.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return s};Object.defineProperty(t,"__esModule",{value:!0}),t.makeArray=function(e){if(void 0===e&&(e=null),e){for(var t=new Array(e.length),r=0,n=e.length;r0||i=0;)if(e.charCodeAt(a)==n){r-a==3&&46==e.charCodeAt(a+1)&&46==e.charCodeAt(a+2)||(e=t?e.substring(0,a):e.substring(0,a)+e.substring(r+3),i-=r+3-a,r=a-1);break}if(a<0&&r>0&&(2!=r||46!=e.charCodeAt(0)||46!=e.charCodeAt(1))){i=(e=e.substring(r+4)).length;continue}}}r++}return i>0?e:"."}function a(e){for(var t=e.length;--t>0;)if(e.charCodeAt(t)==n)return e.substring(0,t);return"."}t.normalizePath=i,t.resolvePath=function(e,t){return e.startsWith("std/")?e:i(a(t)+String.fromCharCode(n)+e)},t.dirname=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=" ",i=" ",a=" ";t.indent=function(e,t){for(;t>=4;)e.push(a),t-=4;t>=2&&(e.push(i),t-=2),t&&e.push(n)}},function(e,t,r){"use strict";function n(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function i(e,t,r){t[r]=e,t[r+1]=e>>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function a(e,t){var r=n(e,t),i=n(e,t+4);return i64_new(r,i)}Object.defineProperty(t,"__esModule",{value:!0}),t.readI8=function(e,t){return e[t]},t.writeI8=function(e,t,r){t[r]=e},t.readI16=function(e,t){return e[t]|e[t+1]<<8},t.writeI16=function(e,t,r){t[r]=e,t[r+1]=e>>>8},t.readI32=n,t.writeI32=i,t.readI64=a,t.writeI64=function(e,t,r){i(i64_low(e),t,r),i(i64_high(e),t,r+4)},t.readF32=function(e,t){return i32_as_f32(n(e,t))},t.writeF32=function(e,t,r){i(f32_as_i32(e),t,r)},t.readF64=function(e,t){return i64_as_f64(a(e,t))},t.writeF64=function(e,t,r){var n=f64_as_i64(e);i(i64_low(n),t,r),i(i64_high(n),t,r+4)}},function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(9),a=r(12),s=r(13),o=r(2);t.formatDiagnostic=o.formatDiagnosticMessage;var c=r(14);t.parseFile=function(e,t,r,n){return void 0===r&&(r=!1),void 0===n&&(n=null),n||(n=new c.Parser),n.parseFile(e,t,r),n},t.nextFile=function(e){return e.nextFile()},t.nextDiagnostic=function(e){var t=e.program;return t.diagnosticsOffset 0 && !isLineBreak(text.charCodeAt(start - 1))) start--;\r\n while (end < len && !isLineBreak(text.charCodeAt(end))) end++;\r\n var sb: string[] = [\r\n \"\\n \",\r\n text.substring(start, end),\r\n \"\\n \"\r\n ];\r\n while (start < range.start) {\r\n sb.push(\" \");\r\n start++;\r\n }\r\n if (useColors) sb.push(COLOR_RED);\r\n if (range.start == range.end) {\r\n sb.push(\"^\");\r\n } else {\r\n while (start++ < range.end) sb.push(\"~\");\r\n }\r\n if (useColors) sb.push(COLOR_RESET);\r\n return sb.join(\"\");\r\n}\r\n\r\n/** Base class of all diagnostic emitters. */\r\nexport abstract class DiagnosticEmitter {\r\n\r\n /** Diagnostic messages emitted so far. */\r\n diagnostics: DiagnosticMessage[];\r\n\r\n /** Initializes this diagnostic emitter. */\r\n protected constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n this.diagnostics = diagnostics ? diagnostics : new Array();\r\n }\r\n\r\n /** Emits a diagnostic message of the specified category. */\r\n emitDiagnostic(\r\n code: DiagnosticCode,\r\n category: DiagnosticCategory,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n var message = DiagnosticMessage.create(code, category, arg0, arg1, arg2).withRange(range);\r\n this.diagnostics.push(message);\r\n // console.log(formatDiagnosticMessage(message, true, true) + \"\\n\"); // temporary\r\n // console.log(new Error(\"stack\").stack);\r\n }\r\n\r\n /** Emits an informatory diagnostic message. */\r\n info(\r\n code: DiagnosticCode,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.INFO, range, arg0, arg1, arg2);\r\n }\r\n\r\n /** Emits a warning diagnostic message. */\r\n warning(\r\n code: DiagnosticCode,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, arg0, arg1, arg2);\r\n }\r\n\r\n /** Emits an error diagnostic message. */\r\n error(\r\n code: DiagnosticCode,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, arg0, arg1, arg2);\r\n }\r\n}\r\n","/**\r\n * A thin wrapper around Binaryen's C-API.\r\n * @module module\r\n *//***/\r\n\r\nimport {\r\n Target\r\n} from \"./compiler\";\r\n\r\nexport type ModuleRef = usize;\r\nexport type FunctionTypeRef = usize;\r\nexport type FunctionRef = usize;\r\nexport type ExpressionRef = usize;\r\nexport type GlobalRef = usize;\r\nexport type ImportRef = usize;\r\nexport type ExportRef = usize;\r\nexport type RelooperRef = usize;\r\nexport type RelooperBlockRef = usize;\r\nexport type Index = u32;\r\n\r\nexport enum NativeType {\r\n None = _BinaryenTypeNone(),\r\n I32 = _BinaryenTypeInt32(),\r\n I64 = _BinaryenTypeInt64(),\r\n F32 = _BinaryenTypeFloat32(),\r\n F64 = _BinaryenTypeFloat64(),\r\n V128 = _BinaryenTypeVec128(),\r\n Unreachable = _BinaryenTypeUnreachable(),\r\n Auto = _BinaryenTypeAuto()\r\n}\r\n\r\nexport enum ExpressionId {\r\n Invalid = _BinaryenInvalidId(),\r\n Block = _BinaryenBlockId(),\r\n If = _BinaryenIfId(),\r\n Loop = _BinaryenLoopId(),\r\n Break = _BinaryenBreakId(),\r\n Switch = _BinaryenSwitchId(),\r\n Call = _BinaryenCallId(),\r\n CallIndirect = _BinaryenCallIndirectId(),\r\n GetLocal = _BinaryenGetLocalId(),\r\n SetLocal = _BinaryenSetLocalId(),\r\n GetGlobal = _BinaryenGetGlobalId(),\r\n SetGlobal = _BinaryenSetGlobalId(),\r\n Load = _BinaryenLoadId(),\r\n Store = _BinaryenStoreId(),\r\n Const = _BinaryenConstId(),\r\n Unary = _BinaryenUnaryId(),\r\n Binary = _BinaryenBinaryId(),\r\n Select = _BinaryenSelectId(),\r\n Drop = _BinaryenDropId(),\r\n Return = _BinaryenReturnId(),\r\n Host = _BinaryenHostId(),\r\n Nop = _BinaryenNopId(),\r\n Unreachable = _BinaryenUnreachableId(),\r\n AtomicCmpxchg = _BinaryenAtomicCmpxchgId(),\r\n AtomicRMW = _BinaryenAtomicRMWId(),\r\n AtomicWait = _BinaryenAtomicWaitId(),\r\n AtomicWake = _BinaryenAtomicWakeId(),\r\n SIMDExtract = _BinaryenSIMDExtractId(),\r\n SIMDReplace = _BinaryenSIMDReplaceId(),\r\n SIMDShuffle = _BinaryenSIMDShuffleId(),\r\n SIMDBitselect = _BinaryenSIMDBitselectId(),\r\n SIMDShift = _BinaryenSIMDShiftId(),\r\n MemoryInit = _BinaryenMemoryInitId(),\r\n DataDrop = _BinaryenDataDropId(),\r\n MemoryCopy = _BinaryenMemoryCopyId(),\r\n MemoryFill = _BinaryenMemoryFillId()\r\n}\r\n\r\nexport enum UnaryOp {\r\n ClzI32 = _BinaryenClzInt32(),\r\n CtzI32 = _BinaryenCtzInt32(),\r\n PopcntI32 = _BinaryenPopcntInt32(),\r\n NegF32 = _BinaryenNegFloat32(),\r\n AbsF32 = _BinaryenAbsFloat32(),\r\n CeilF32 = _BinaryenCeilFloat32(),\r\n FloorF32 = _BinaryenFloorFloat32(),\r\n TruncF32 = _BinaryenTruncFloat32(),\r\n NearestF32 = _BinaryenNearestFloat32(),\r\n SqrtF32 = _BinaryenSqrtFloat32(),\r\n EqzI32 = _BinaryenEqZInt32(),\r\n ClzI64 = _BinaryenClzInt64(),\r\n CtzI64 = _BinaryenCtzInt64(),\r\n PopcntI64 = _BinaryenPopcntInt64(),\r\n NegF64 = _BinaryenNegFloat64(),\r\n AbsF64 = _BinaryenAbsFloat64(),\r\n CeilF64 = _BinaryenCeilFloat64(),\r\n FloorF64 = _BinaryenFloorFloat64(),\r\n TruncF64 = _BinaryenTruncFloat64(),\r\n NearestF64 = _BinaryenNearestFloat64(),\r\n SqrtF64 = _BinaryenSqrtFloat64(),\r\n EqzI64 = _BinaryenEqZInt64(),\r\n ExtendI32 = _BinaryenExtendSInt32(),\r\n ExtendU32 = _BinaryenExtendUInt32(),\r\n WrapI64 = _BinaryenWrapInt64(),\r\n TruncF32ToI32 = _BinaryenTruncSFloat32ToInt32(),\r\n TruncF32ToI64 = _BinaryenTruncSFloat32ToInt64(),\r\n TruncF32ToU32 = _BinaryenTruncUFloat32ToInt32(),\r\n TruncF32ToU64 = _BinaryenTruncUFloat32ToInt64(),\r\n TruncF64ToI32 = _BinaryenTruncSFloat64ToInt32(),\r\n TruncF64ToI64 = _BinaryenTruncSFloat64ToInt64(),\r\n TruncF64ToU32 = _BinaryenTruncUFloat64ToInt32(),\r\n TruncF64ToU64 = _BinaryenTruncUFloat64ToInt64(),\r\n ReinterpretF32 = _BinaryenReinterpretFloat32(),\r\n ReinterpretF64 = _BinaryenReinterpretFloat64(),\r\n ConvertI32ToF32 = _BinaryenConvertSInt32ToFloat32(),\r\n ConvertI32ToF64 = _BinaryenConvertSInt32ToFloat64(),\r\n ConvertU32ToF32 = _BinaryenConvertUInt32ToFloat32(),\r\n ConvertU32ToF64 = _BinaryenConvertUInt32ToFloat64(),\r\n ConvertI64ToF32 = _BinaryenConvertSInt64ToFloat32(),\r\n ConvertI64ToF64 = _BinaryenConvertSInt64ToFloat64(),\r\n ConvertU64ToF32 = _BinaryenConvertUInt64ToFloat32(),\r\n ConvertU64ToF64 = _BinaryenConvertUInt64ToFloat64(),\r\n PromoteF32 = _BinaryenPromoteFloat32(),\r\n DemoteF64 = _BinaryenDemoteFloat64(),\r\n ReinterpretI32 = _BinaryenReinterpretInt32(),\r\n ReinterpretI64 = _BinaryenReinterpretInt64(),\r\n\r\n // see: https://github.com/WebAssembly/sign-extension-ops\r\n ExtendI8ToI32 = _BinaryenExtendS8Int32(),\r\n ExtendI16ToI32 = _BinaryenExtendS16Int32(),\r\n ExtendI8ToI64 = _BinaryenExtendS8Int64(),\r\n ExtendI16ToI64 = _BinaryenExtendS16Int64(),\r\n ExtendI32ToI64 = _BinaryenExtendS32Int64()\r\n\r\n // see: https://github.com/WebAssembly/nontrapping-float-to-int-conversions\r\n // TruncF32ToI32Sat\r\n // TruncF32ToU32Sat\r\n // TruncF64ToI32Sat\r\n // TruncF64ToU32Sat\r\n // TruncF32ToI64Sat\r\n // TruncF32ToU64Sat\r\n // TruncF64ToI64Sat\r\n // TruncF64ToU64Sat\r\n}\r\n\r\nexport enum BinaryOp {\r\n AddI32 = _BinaryenAddInt32(),\r\n SubI32 = _BinaryenSubInt32(),\r\n MulI32 = _BinaryenMulInt32(),\r\n DivI32 = _BinaryenDivSInt32(),\r\n DivU32 = _BinaryenDivUInt32(),\r\n RemI32 = _BinaryenRemSInt32(),\r\n RemU32 = _BinaryenRemUInt32(),\r\n AndI32 = _BinaryenAndInt32(),\r\n OrI32 = _BinaryenOrInt32(),\r\n XorI32 = _BinaryenXorInt32(),\r\n ShlI32 = _BinaryenShlInt32(),\r\n ShrU32 = _BinaryenShrUInt32(),\r\n ShrI32 = _BinaryenShrSInt32(),\r\n RotlI32 = _BinaryenRotLInt32(),\r\n RotrI32 = _BinaryenRotRInt32(),\r\n EqI32 = _BinaryenEqInt32(),\r\n NeI32 = _BinaryenNeInt32(),\r\n LtI32 = _BinaryenLtSInt32(),\r\n LtU32 = _BinaryenLtUInt32(),\r\n LeI32 = _BinaryenLeSInt32(),\r\n LeU32 = _BinaryenLeUInt32(),\r\n GtI32 = _BinaryenGtSInt32(),\r\n GtU32 = _BinaryenGtUInt32(),\r\n GeI32 = _BinaryenGeSInt32(),\r\n GeU32 = _BinaryenGeUInt32(),\r\n AddI64 = _BinaryenAddInt64(),\r\n SubI64 = _BinaryenSubInt64(),\r\n MulI64 = _BinaryenMulInt64(),\r\n DivI64 = _BinaryenDivSInt64(),\r\n DivU64 = _BinaryenDivUInt64(),\r\n RemI64 = _BinaryenRemSInt64(),\r\n RemU64 = _BinaryenRemUInt64(),\r\n AndI64 = _BinaryenAndInt64(),\r\n OrI64 = _BinaryenOrInt64(),\r\n XorI64 = _BinaryenXorInt64(),\r\n ShlI64 = _BinaryenShlInt64(),\r\n ShrU64 = _BinaryenShrUInt64(),\r\n ShrI64 = _BinaryenShrSInt64(),\r\n RotlI64 = _BinaryenRotLInt64(),\r\n RotrI64 = _BinaryenRotRInt64(),\r\n EqI64 = _BinaryenEqInt64(),\r\n NeI64 = _BinaryenNeInt64(),\r\n LtI64 = _BinaryenLtSInt64(),\r\n LtU64 = _BinaryenLtUInt64(),\r\n LeI64 = _BinaryenLeSInt64(),\r\n LeU64 = _BinaryenLeUInt64(),\r\n GtI64 = _BinaryenGtSInt64(),\r\n GtU64 = _BinaryenGtUInt64(),\r\n GeI64 = _BinaryenGeSInt64(),\r\n GeU64 = _BinaryenGeUInt64(),\r\n AddF32 = _BinaryenAddFloat32(),\r\n SubF32 = _BinaryenSubFloat32(),\r\n MulF32 = _BinaryenMulFloat32(),\r\n DivF32 = _BinaryenDivFloat32(),\r\n CopysignF32 = _BinaryenCopySignFloat32(),\r\n MinF32 = _BinaryenMinFloat32(),\r\n MaxF32 = _BinaryenMaxFloat32(),\r\n EqF32 = _BinaryenEqFloat32(),\r\n NeF32 = _BinaryenNeFloat32(),\r\n LtF32 = _BinaryenLtFloat32(),\r\n LeF32 = _BinaryenLeFloat32(),\r\n GtF32 = _BinaryenGtFloat32(),\r\n GeF32 = _BinaryenGeFloat32(),\r\n AddF64 = _BinaryenAddFloat64(),\r\n SubF64 = _BinaryenSubFloat64(),\r\n MulF64 = _BinaryenMulFloat64(),\r\n DivF64 = _BinaryenDivFloat64(),\r\n CopysignF64 = _BinaryenCopySignFloat64(),\r\n MinF64 = _BinaryenMinFloat64(),\r\n MaxF64 = _BinaryenMaxFloat64(),\r\n EqF64 = _BinaryenEqFloat64(),\r\n NeF64 = _BinaryenNeFloat64(),\r\n LtF64 = _BinaryenLtFloat64(),\r\n LeF64 = _BinaryenLeFloat64(),\r\n GtF64 = _BinaryenGtFloat64(),\r\n GeF64 = _BinaryenGeFloat64()\r\n}\r\n\r\nexport enum HostOp {\r\n CurrentMemory = _BinaryenCurrentMemory(),\r\n GrowMemory = _BinaryenGrowMemory(),\r\n\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n // MoveMemory\r\n // SetMemory\r\n}\r\n\r\nexport enum AtomicRMWOp {\r\n Add = _BinaryenAtomicRMWAdd(),\r\n Sub = _BinaryenAtomicRMWSub(),\r\n And = _BinaryenAtomicRMWAnd(),\r\n Or = _BinaryenAtomicRMWOr(),\r\n Xor = _BinaryenAtomicRMWXor(),\r\n Xchg = _BinaryenAtomicRMWXchg()\r\n}\r\n\r\nexport enum SIMDOp {\r\n SplatVecI8x16 = _BinaryenSplatVecI8x16(),\r\n SplatVecI16x8 = _BinaryenSplatVecI16x8(),\r\n SplatVecI32x4 = _BinaryenSplatVecI32x4(),\r\n SplatVecI64x2 = _BinaryenSplatVecI64x2(),\r\n SplatVecF32x4 = _BinaryenSplatVecF32x4(),\r\n SplatVecF64x2 = _BinaryenSplatVecF64x2(),\r\n NotVec128 = _BinaryenNotVec128(),\r\n NegVecI8x16 = _BinaryenNegVecI8x16(),\r\n AnyTrueVecI8x16 = _BinaryenAnyTrueVecI8x16(),\r\n AllTrueVecI8x16 = _BinaryenAllTrueVecI8x16(),\r\n NegVecI16x8 = _BinaryenNegVecI16x8(),\r\n AnyTrueVecI16x8 = _BinaryenAnyTrueVecI16x8(),\r\n AllTrueVecI16x8 = _BinaryenAllTrueVecI16x8(),\r\n NegVecI32x4 = _BinaryenNegVecI32x4(),\r\n AnyTrueVecI32x4 = _BinaryenAnyTrueVecI32x4(),\r\n AllTrueVecI32x4 = _BinaryenAllTrueVecI32x4(),\r\n NegVecI64x2 = _BinaryenNegVecI64x2(),\r\n AnyTrueVecI64x2 = _BinaryenAnyTrueVecI64x2(),\r\n AllTrueVecI64x2 = _BinaryenAllTrueVecI64x2(),\r\n AbsVecF32x4 = _BinaryenAbsVecF32x4(),\r\n NegVecF32x4 = _BinaryenNegVecF32x4(),\r\n SqrtVecF32x4 = _BinaryenSqrtVecF32x4(),\r\n AbsVecF64x2 = _BinaryenAbsVecF64x2(),\r\n NegVecF64x2 = _BinaryenNegVecF64x2(),\r\n SqrtVecF64x2 = _BinaryenSqrtVecF64x2(),\r\n TruncSatSVecF32x4ToVecI32x4 = _BinaryenTruncSatSVecF32x4ToVecI32x4(),\r\n TruncSatUVecF32x4ToVecI32x4 = _BinaryenTruncSatUVecF32x4ToVecI32x4(),\r\n TruncSatSVecF64x2ToVecI64x2 = _BinaryenTruncSatSVecF64x2ToVecI64x2(),\r\n TruncSatUVecF64x2ToVecI64x2 = _BinaryenTruncSatUVecF64x2ToVecI64x2(),\r\n ConvertSVecI32x4ToVecF32x4 = _BinaryenConvertSVecI32x4ToVecF32x4(),\r\n ConvertUVecI32x4ToVecF32x4 = _BinaryenConvertUVecI32x4ToVecF32x4(),\r\n ConvertSVecI64x2ToVecF64x2 = _BinaryenConvertSVecI64x2ToVecF64x2(),\r\n ConvertUVecI64x2ToVecF64x2 = _BinaryenConvertUVecI64x2ToVecF64x2(),\r\n EqVecI8x16 = _BinaryenEqVecI8x16(),\r\n NeVecI8x16 = _BinaryenNeVecI8x16(),\r\n LtSVecI8x16 = _BinaryenLtSVecI8x16(),\r\n LtUVecI8x16 = _BinaryenLtUVecI8x16(),\r\n LeSVecI8x16 = _BinaryenLeSVecI8x16(),\r\n LeUVecI8x16 = _BinaryenLeUVecI8x16(),\r\n GtSVecI8x16 = _BinaryenGtSVecI8x16(),\r\n GtUVecI8x16 = _BinaryenGtUVecI8x16(),\r\n GeSVecI8x16 = _BinaryenGeSVecI8x16(),\r\n GeUVecI8x16 = _BinaryenGeUVecI8x16(),\r\n EqVecI16x8 = _BinaryenEqVecI16x8(),\r\n NeVecI16x8 = _BinaryenNeVecI16x8(),\r\n LtSVecI16x8 = _BinaryenLtSVecI16x8(),\r\n LtUVecI16x8 = _BinaryenLtUVecI16x8(),\r\n LeSVecI16x8 = _BinaryenLeSVecI16x8(),\r\n LeUVecI16x8 = _BinaryenLeUVecI16x8(),\r\n GtSVecI16x8 = _BinaryenGtSVecI16x8(),\r\n GtUVecI16x8 = _BinaryenGtUVecI16x8(),\r\n GeSVecI16x8 = _BinaryenGeSVecI16x8(),\r\n GeUVecI16x8 = _BinaryenGeUVecI16x8(),\r\n EqVecI32x4 = _BinaryenEqVecI32x4(),\r\n NeVecI32x4 = _BinaryenNeVecI32x4(),\r\n LtSVecI32x4 = _BinaryenLtSVecI32x4(),\r\n LtUVecI32x4 = _BinaryenLtUVecI32x4(),\r\n LeSVecI32x4 = _BinaryenLeSVecI32x4(),\r\n LeUVecI32x4 = _BinaryenLeUVecI32x4(),\r\n GtSVecI32x4 = _BinaryenGtSVecI32x4(),\r\n GtUVecI32x4 = _BinaryenGtUVecI32x4(),\r\n GeSVecI32x4 = _BinaryenGeSVecI32x4(),\r\n GeUVecI32x4 = _BinaryenGeUVecI32x4(),\r\n EqVecF32x4 = _BinaryenEqVecF32x4(),\r\n NeVecF32x4 = _BinaryenNeVecF32x4(),\r\n LtVecF32x4 = _BinaryenLtVecF32x4(),\r\n LeVecF32x4 = _BinaryenLeVecF32x4(),\r\n GtVecF32x4 = _BinaryenGtVecF32x4(),\r\n GeVecF32x4 = _BinaryenGeVecF32x4(),\r\n EqVecF64x2 = _BinaryenEqVecF64x2(),\r\n NeVecF64x2 = _BinaryenNeVecF64x2(),\r\n LtVecF64x2 = _BinaryenLtVecF64x2(),\r\n LeVecF64x2 = _BinaryenLeVecF64x2(),\r\n GtVecF64x2 = _BinaryenGtVecF64x2(),\r\n GeVecF64x2 = _BinaryenGeVecF64x2(),\r\n AndVec128 = _BinaryenAndVec128(),\r\n OrVec128 = _BinaryenOrVec128(),\r\n XorVec128 = _BinaryenXorVec128(),\r\n AddVecI8x16 = _BinaryenAddVecI8x16(),\r\n AddSatSVecI8x16 = _BinaryenAddSatSVecI8x16(),\r\n AddSatUVecI8x16 = _BinaryenAddSatUVecI8x16(),\r\n SubVecI8x16 = _BinaryenSubVecI8x16(),\r\n SubSatSVecI8x16 = _BinaryenSubSatSVecI8x16(),\r\n SubSatUVecI8x16 = _BinaryenSubSatUVecI8x16(),\r\n MulVecI8x16 = _BinaryenMulVecI8x16(),\r\n AddVecI16x8 = _BinaryenAddVecI16x8(),\r\n AddSatSVecI16x8 = _BinaryenAddSatSVecI16x8(),\r\n AddSatUVecI16x8 = _BinaryenAddSatUVecI16x8(),\r\n SubVecI16x8 = _BinaryenSubVecI16x8(),\r\n SubSatSVecI16x8 = _BinaryenSubSatSVecI16x8(),\r\n SubSatUVecI16x8 = _BinaryenSubSatUVecI16x8(),\r\n MulVecI16x8 = _BinaryenMulVecI16x8(),\r\n AddVecI32x4 = _BinaryenAddVecI32x4(),\r\n SubVecI32x4 = _BinaryenSubVecI32x4(),\r\n MulVecI32x4 = _BinaryenMulVecI32x4(),\r\n AddVecI64x2 = _BinaryenAddVecI64x2(),\r\n SubVecI64x2 = _BinaryenSubVecI64x2(),\r\n AddVecF32x4 = _BinaryenAddVecF32x4(),\r\n SubVecF32x4 = _BinaryenSubVecF32x4(),\r\n MulVecF32x4 = _BinaryenMulVecF32x4(),\r\n DivVecF32x4 = _BinaryenDivVecF32x4(),\r\n MinVecF32x4 = _BinaryenMinVecF32x4(),\r\n MaxVecF32x4 = _BinaryenMaxVecF32x4(),\r\n AddVecF64x2 = _BinaryenAddVecF64x2(),\r\n SubVecF64x2 = _BinaryenSubVecF64x2(),\r\n MulVecF64x2 = _BinaryenMulVecF64x2(),\r\n DivVecF64x2 = _BinaryenDivVecF64x2(),\r\n MinVecF64x2 = _BinaryenMinVecF64x2(),\r\n MaxVecF64x2 = _BinaryenMaxVecF64x2()\r\n}\r\n\r\nexport class MemorySegment {\r\n\r\n buffer: Uint8Array;\r\n offset: I64;\r\n\r\n static create(buffer: Uint8Array, offset: I64): MemorySegment {\r\n var segment = new MemorySegment();\r\n segment.buffer = buffer;\r\n segment.offset = offset;\r\n return segment;\r\n }\r\n}\r\n\r\nexport class Module {\r\n\r\n ref: ModuleRef;\r\n\r\n private lit: usize;\r\n\r\n static create(): Module {\r\n var module = new Module();\r\n module.ref = _BinaryenModuleCreate();\r\n module.lit = memory.allocate(_BinaryenSizeofLiteral());\r\n return module;\r\n }\r\n\r\n static createFrom(buffer: Uint8Array): Module {\r\n var cArr = allocU8Array(buffer);\r\n try {\r\n let module = new Module();\r\n module.ref = _BinaryenModuleRead(cArr, buffer.length);\r\n module.lit = memory.allocate(_BinaryenSizeofLiteral());\r\n return module;\r\n } finally {\r\n memory.free(changetype(cArr));\r\n }\r\n }\r\n\r\n private constructor() { }\r\n\r\n // types\r\n\r\n addFunctionType(\r\n name: string,\r\n result: NativeType,\r\n paramTypes: NativeType[] | null\r\n ): FunctionRef {\r\n var cStr = this.allocStringCached(name);\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenAddFunctionType(this.ref, cStr, result, cArr, paramTypes ? paramTypes.length : 0);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n getFunctionTypeBySignature(\r\n result: NativeType,\r\n paramTypes: NativeType[] | null\r\n ): FunctionTypeRef {\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenGetFunctionTypeBySignature(this.ref, result, cArr, paramTypes ? paramTypes.length : 0);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n removeFunctionType(name: string): void {\r\n var cStr = this.allocStringCached(name);\r\n _BinaryenRemoveFunctionType(this.ref, cStr);\r\n }\r\n\r\n // constants\r\n\r\n createI32(value: i32): ExpressionRef {\r\n var out = this.lit;\r\n _BinaryenLiteralInt32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createI64(valueLow: i32, valueHigh: i32 = 0): ExpressionRef {\r\n var out = this.lit;\r\n _BinaryenLiteralInt64(out, valueLow, valueHigh);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createF32(value: f32): ExpressionRef {\r\n var out = this.lit;\r\n _BinaryenLiteralFloat32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createF64(value: f64): ExpressionRef {\r\n var out = this.lit;\r\n _BinaryenLiteralFloat64(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createV128(bytes: Uint8Array): ExpressionRef {\r\n assert(bytes.length == 16);\r\n var out = this.lit;\r\n // FIXME: does this work or do we need to malloc?\r\n for (let i = 0; i < 16; ++i) store(out + i, bytes[i]);\r\n _BinaryenLiteralVec128(out, out);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n // expressions\r\n\r\n createUnary(\r\n op: UnaryOp,\r\n expr: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenUnary(this.ref, op, expr);\r\n }\r\n\r\n createBinary(\r\n op: BinaryOp,\r\n left: ExpressionRef,\r\n right: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenBinary(this.ref, op, left, right);\r\n }\r\n\r\n createHost(\r\n op: HostOp,\r\n name: string | null = null,\r\n operands: ExpressionRef[] | null = null\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(name);\r\n var cArr = allocPtrArray(operands);\r\n try {\r\n return _BinaryenHost(this.ref, op, cStr, cArr, operands ? (operands).length : 0);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n createGetLocal(\r\n index: i32,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenGetLocal(this.ref, index, type);\r\n }\r\n\r\n createTeeLocal(\r\n index: i32,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenTeeLocal(this.ref, index, value);\r\n }\r\n\r\n createGetGlobal(\r\n name: string,\r\n type: NativeType\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(name);\r\n return _BinaryenGetGlobal(this.ref, cStr, type);\r\n }\r\n\r\n createLoad(\r\n bytes: Index,\r\n signed: bool,\r\n ptr: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenLoad(this.ref, bytes, signed ? 1 : 0, offset, /* always aligned */ bytes, type, ptr);\r\n }\r\n\r\n createStore(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenStore(this.ref, bytes, offset, /* always aligned */ bytes, ptr, value, type);\r\n }\r\n\r\n createAtomicLoad(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenAtomicLoad(this.ref, bytes, offset, type, ptr);\r\n }\r\n\r\n createAtomicStore(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenAtomicStore(this.ref, bytes, offset, ptr, value, type);\r\n }\r\n\r\n createAtomicRMW(\r\n op: AtomicRMWOp,\r\n bytes: Index,\r\n offset: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicRMW(this.ref, op, bytes, offset, ptr, value, type);\r\n }\r\n\r\n createAtomicCmpxchg(\r\n bytes: Index,\r\n offset: Index,\r\n ptr: ExpressionRef,\r\n expected: ExpressionRef,\r\n replacement: ExpressionRef,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicCmpxchg(this.ref, bytes, offset, ptr, expected, replacement, type);\r\n }\r\n\r\n createAtomicWait(\r\n ptr: ExpressionRef,\r\n expected: ExpressionRef,\r\n timeout: ExpressionRef,\r\n expectedType: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicWait(this.ref, ptr, expected, timeout, expectedType);\r\n }\r\n\r\n createAtomicWake(\r\n ptr: ExpressionRef,\r\n wakeCount: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenAtomicWake(this.ref, ptr, wakeCount);\r\n }\r\n\r\n // statements\r\n\r\n createSetLocal(\r\n index: Index,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenSetLocal(this.ref, index, value);\r\n }\r\n\r\n createSetGlobal(\r\n name: string,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(name);\r\n return _BinaryenSetGlobal(this.ref, cStr, value);\r\n }\r\n\r\n createBlock(\r\n label: string | null,\r\n children: ExpressionRef[],\r\n type: NativeType = NativeType.None\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(label);\r\n var cArr = allocPtrArray(children);\r\n try {\r\n return _BinaryenBlock(this.ref, cStr, cArr, children.length, type);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n createBreak(\r\n label: string | null,\r\n condition: ExpressionRef = 0,\r\n value: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(label);\r\n return _BinaryenBreak(this.ref, cStr, condition, value);\r\n }\r\n\r\n createDrop(\r\n expression: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenDrop(this.ref, expression);\r\n }\r\n\r\n createLoop(\r\n label: string | null,\r\n body: ExpressionRef\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(label);\r\n return _BinaryenLoop(this.ref, cStr, body);\r\n }\r\n\r\n createIf(\r\n condition: ExpressionRef,\r\n ifTrue: ExpressionRef,\r\n ifFalse: ExpressionRef = 0\r\n ): ExpressionRef {\r\n return _BinaryenIf(this.ref, condition, ifTrue, ifFalse);\r\n }\r\n\r\n createNop(): ExpressionRef {\r\n return _BinaryenNop(this.ref);\r\n }\r\n\r\n createReturn(\r\n expression: ExpressionRef = 0\r\n ): ExpressionRef {\r\n return _BinaryenReturn(this.ref, expression);\r\n }\r\n\r\n createSelect(\r\n ifTrue: ExpressionRef,\r\n ifFalse: ExpressionRef,\r\n condition: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenSelect(this.ref, condition, ifTrue, ifFalse);\r\n }\r\n\r\n createSwitch(\r\n names: string[],\r\n defaultName: string | null,\r\n condition: ExpressionRef,\r\n value: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var numNames = names.length;\r\n var strs = new Array(numNames);\r\n for (let i = 0; i < numNames; ++i) {\r\n strs[i] = this.allocStringCached(names[i]);\r\n }\r\n var cArr = allocI32Array(strs);\r\n var cStr = this.allocStringCached(defaultName);\r\n try {\r\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n createCall(\r\n target: string,\r\n operands: ExpressionRef[] | null,\r\n returnType: NativeType\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(target);\r\n var cArr = allocPtrArray(operands);\r\n try {\r\n return _BinaryenCall(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n createCallIndirect(\r\n index: ExpressionRef,\r\n operands: ExpressionRef[] | null,\r\n typeName: string\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(typeName);\r\n var cArr = allocPtrArray(operands);\r\n try {\r\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n createUnreachable(): ExpressionRef {\r\n return _BinaryenUnreachable(this.ref);\r\n }\r\n\r\n // bulk memory\r\n\r\n createMemoryCopy(\r\n dest: ExpressionRef,\r\n source: ExpressionRef,\r\n size: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenMemoryCopy(this.ref, dest, source, size);\r\n }\r\n\r\n createMemoryFill(\r\n dest: ExpressionRef,\r\n value: ExpressionRef,\r\n size: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenMemoryFill(this.ref, dest, value, size);\r\n }\r\n\r\n // meta\r\n\r\n addGlobal(\r\n name: string,\r\n type: NativeType,\r\n mutable: bool,\r\n initializer: ExpressionRef\r\n ): GlobalRef {\r\n var cStr = this.allocStringCached(name);\r\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\r\n }\r\n\r\n removeGlobal(\r\n name: string\r\n ): void {\r\n var cStr = this.allocStringCached(name);\r\n _BinaryenRemoveGlobal(this.ref, cStr);\r\n }\r\n\r\n addFunction(\r\n name: string,\r\n type: FunctionTypeRef,\r\n varTypes: NativeType[] | null,\r\n body: ExpressionRef\r\n ): FunctionRef {\r\n var cStr = this.allocStringCached(name);\r\n var cArr = allocI32Array(varTypes);\r\n try {\r\n return _BinaryenAddFunction(this.ref, cStr, type, cArr, varTypes ? varTypes.length : 0, body);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n removeFunction(name: string): void {\r\n var cStr = this.allocStringCached(name);\r\n _BinaryenRemoveFunction(this.ref, cStr);\r\n }\r\n\r\n private hasTemporaryFunction: bool = false;\r\n\r\n addTemporaryFunction(result: NativeType, paramTypes: NativeType[] | null, body: ExpressionRef): FunctionRef {\r\n this.hasTemporaryFunction = assert(!this.hasTemporaryFunction);\r\n var tempName = this.allocStringCached(\"\");\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n let typeRef = _BinaryenAddFunctionType(this.ref, tempName, result, cArr, paramTypes ? paramTypes.length : 0);\r\n return _BinaryenAddFunction(this.ref, tempName, typeRef, 0, 0, body);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n removeTemporaryFunction(): void {\r\n this.hasTemporaryFunction = !assert(this.hasTemporaryFunction);\r\n var tempName = this.allocStringCached(\"\");\r\n _BinaryenRemoveFunction(this.ref, tempName);\r\n _BinaryenRemoveFunctionType(this.ref, tempName);\r\n }\r\n\r\n addFunctionExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalName);\r\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\r\n }\r\n\r\n addTableExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalName);\r\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\r\n }\r\n\r\n addMemoryExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalName);\r\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\r\n }\r\n\r\n addGlobalExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalName);\r\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\r\n }\r\n\r\n removeExport(externalName: string): void {\r\n var cStr = this.allocStringCached(externalName);\r\n _BinaryenRemoveExport(this.ref, cStr);\r\n }\r\n\r\n addFunctionImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string,\r\n functionType: FunctionTypeRef\r\n ): ImportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalModuleName);\r\n var cStr3 = this.allocStringCached(externalBaseName);\r\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\r\n }\r\n\r\n addTableImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string\r\n ): ImportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalModuleName);\r\n var cStr3 = this.allocStringCached(externalBaseName);\r\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\r\n }\r\n\r\n addMemoryImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string,\r\n shared: bool = false,\r\n ): ImportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalModuleName);\r\n var cStr3 = this.allocStringCached(externalBaseName);\r\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3, shared);\r\n }\r\n\r\n addGlobalImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string,\r\n globalType: NativeType\r\n ): ImportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalModuleName);\r\n var cStr3 = this.allocStringCached(externalBaseName);\r\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\r\n }\r\n\r\n /** Unlimited memory constant. */\r\n static readonly UNLIMITED_MEMORY: Index = -1;\r\n\r\n setMemory(\r\n initial: Index,\r\n maximum: Index,\r\n segments: MemorySegment[],\r\n target: Target,\r\n exportName: string | null = null,\r\n shared: bool = false\r\n ): void {\r\n var cStr = this.allocStringCached(exportName);\r\n var k = segments.length;\r\n var segs = new Array(k);\r\n var offs = new Array(k);\r\n var sizs = new Array(k);\r\n for (let i = 0; i < k; ++i) {\r\n let buffer = segments[i].buffer;\r\n let offset = segments[i].offset;\r\n segs[i] = allocU8Array(buffer);\r\n offs[i] = target == Target.WASM64\r\n ? this.createI64(i64_low(offset), i64_high(offset))\r\n : this.createI32(i64_low(offset));\r\n sizs[i] = buffer.length;\r\n }\r\n var cArr1 = allocI32Array(segs);\r\n var cArr2 = allocI32Array(offs);\r\n var cArr3 = allocI32Array(sizs);\r\n try {\r\n _BinaryenSetMemory(this.ref, initial, maximum, cStr, cArr1, cArr2, cArr3, k, shared);\r\n } finally {\r\n memory.free(cArr3);\r\n memory.free(cArr2);\r\n memory.free(cArr1);\r\n for (let i = k - 1; i >= 0; --i) memory.free(segs[i]);\r\n }\r\n }\r\n\r\n setFunctionTable(\r\n initial: Index,\r\n maximum: Index,\r\n funcs: string[]\r\n ): void {\r\n var numNames = funcs.length;\r\n var names = new Array(numNames);\r\n for (let i = 0; i < numNames; ++i) {\r\n names[i] = this.allocStringCached(funcs[i]);\r\n }\r\n var cArr = allocI32Array(names);\r\n try {\r\n _BinaryenSetFunctionTable(this.ref, initial, maximum, cArr, numNames);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n setStart(func: FunctionRef): void {\r\n _BinaryenSetStart(this.ref, func);\r\n }\r\n\r\n getOptimizeLevel(): i32 {\r\n return _BinaryenGetOptimizeLevel();\r\n }\r\n\r\n setOptimizeLevel(level: i32 = 2): void {\r\n _BinaryenSetOptimizeLevel(level);\r\n }\r\n\r\n getShrinkLevel(): i32 {\r\n return _BinaryenGetShrinkLevel();\r\n }\r\n\r\n setShrinkLevel(level: i32 = 1): void {\r\n _BinaryenSetShrinkLevel(level);\r\n }\r\n\r\n setDebugInfo(on: bool = false): void {\r\n _BinaryenSetDebugInfo(on);\r\n }\r\n\r\n optimize(func: FunctionRef = 0): void {\r\n if (func) {\r\n _BinaryenFunctionOptimize(func, this.ref);\r\n } else {\r\n _BinaryenModuleOptimize(this.ref);\r\n }\r\n }\r\n\r\n runPasses(passes: string[], func: FunctionRef = 0): void {\r\n var numNames = passes.length;\r\n var names = new Array(numNames);\r\n for (let i = 0; i < numNames; ++i) {\r\n names[i] = allocString(passes[i]);\r\n }\r\n var cArr = allocI32Array(names);\r\n try {\r\n if (func) {\r\n _BinaryenFunctionRunPasses(func, this.ref, cArr, numNames);\r\n } else {\r\n _BinaryenModuleRunPasses(this.ref, cArr, numNames);\r\n }\r\n } finally {\r\n memory.free(cArr);\r\n for (let i = numNames; i >= 0; --i) memory.free(names[i]);\r\n }\r\n }\r\n\r\n private cachedPrecomputeNames: usize = 0;\r\n\r\n precomputeExpression(expr: ExpressionRef): ExpressionRef {\r\n // remember the previous optimize levels and set to max instead, to be sure\r\n var previousOptimizeLevel = _BinaryenGetOptimizeLevel();\r\n var previousShrinkLevel = _BinaryenGetShrinkLevel();\r\n var previousDebugInfo = _BinaryenGetDebugInfo();\r\n _BinaryenSetOptimizeLevel(4);\r\n _BinaryenSetShrinkLevel(0);\r\n _BinaryenSetDebugInfo(false);\r\n\r\n // wrap the expression in a temp. function and run the precompute pass on it\r\n var type = _BinaryenExpressionGetType(expr);\r\n var func = this.addTemporaryFunction(type, null, expr);\r\n var names = this.cachedPrecomputeNames;\r\n if (!names) {\r\n this.cachedPrecomputeNames = names = allocI32Array([ this.allocStringCached(\"precompute\") ]);\r\n }\r\n _BinaryenFunctionRunPasses(func, this.ref, names, 1);\r\n expr = _BinaryenFunctionGetBody(func);\r\n this.removeTemporaryFunction();\r\n\r\n // reset optimize levels to previous\r\n _BinaryenSetOptimizeLevel(previousOptimizeLevel);\r\n _BinaryenSetShrinkLevel(previousShrinkLevel);\r\n _BinaryenSetDebugInfo(previousDebugInfo);\r\n return expr;\r\n }\r\n\r\n validate(): bool {\r\n return _BinaryenModuleValidate(this.ref) == 1;\r\n }\r\n\r\n interpret(): void {\r\n _BinaryenModuleInterpret(this.ref);\r\n }\r\n\r\n toBinary(sourceMapUrl: string | null): BinaryModule {\r\n var out = this.lit; // safe to reuse as long as..\r\n assert(_BinaryenSizeofLiteral() >= 12);\r\n var cStr = allocString(sourceMapUrl);\r\n var binaryPtr: usize = 0;\r\n var sourceMapPtr: usize = 0;\r\n try {\r\n _BinaryenModuleAllocateAndWrite(out, this.ref, cStr);\r\n binaryPtr = readInt(out);\r\n let binaryBytes = readInt(out + 4);\r\n sourceMapPtr = readInt(out + 4 * 2);\r\n let ret = new BinaryModule();\r\n ret.output = readBuffer(binaryPtr, binaryBytes);\r\n ret.sourceMap = readString(sourceMapPtr);\r\n return ret;\r\n } finally {\r\n if (cStr) memory.free(cStr);\r\n if (binaryPtr) memory.free(binaryPtr);\r\n if (sourceMapPtr) memory.free(sourceMapPtr);\r\n }\r\n }\r\n\r\n toText(): string {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n }\r\n\r\n toAsmjs(): string {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n }\r\n\r\n private cachedStrings: Map = new Map();\r\n\r\n private allocStringCached(str: string | null): usize {\r\n if (str == null) return 0;\r\n if (cachedStrings.has(str)) return cachedStrings.get(str);\r\n var ptr = allocString(str);\r\n cachedStrings.set(str, ptr);\r\n return ptr;\r\n }\r\n\r\n dispose(): void {\r\n assert(this.ref);\r\n for (let ptr of this.cachedStrings.values()) memory.free(ptr);\r\n this.cachedStrings = new Map();\r\n memory.free(this.lit);\r\n memory.free(this.cachedPrecomputeNames);\r\n this.cachedPrecomputeNames = 0;\r\n _BinaryenModuleDispose(this.ref);\r\n this.ref = 0;\r\n }\r\n\r\n createRelooper(): Relooper {\r\n return Relooper.create(this);\r\n }\r\n\r\n cloneExpression(\r\n expr: ExpressionRef,\r\n noSideEffects: bool = false,\r\n maxDepth: i32 = i32.MAX_VALUE\r\n ): ExpressionRef { // currently supports side effect free expressions only\r\n if (maxDepth < 0) return 0;\r\n maxDepth -= 1;\r\n\r\n var nested1: ExpressionRef,\r\n nested2: ExpressionRef;\r\n\r\n switch (_BinaryenExpressionGetId(expr)) {\r\n case ExpressionId.Const: {\r\n switch (_BinaryenExpressionGetType(expr)) {\r\n case NativeType.I32: {\r\n return this.createI32(_BinaryenConstGetValueI32(expr));\r\n }\r\n case NativeType.I64: {\r\n return this.createI64(\r\n _BinaryenConstGetValueI64Low(expr),\r\n _BinaryenConstGetValueI64High(expr)\r\n );\r\n }\r\n case NativeType.F32: {\r\n return this.createF32(_BinaryenConstGetValueF32(expr));\r\n }\r\n case NativeType.F64: {\r\n return this.createF64(_BinaryenConstGetValueF64(expr));\r\n }\r\n default: {\r\n throw new Error(\"concrete type expected\");\r\n }\r\n }\r\n }\r\n case ExpressionId.GetLocal: {\r\n return _BinaryenGetLocal(this.ref,\r\n _BinaryenGetLocalGetIndex(expr),\r\n _BinaryenExpressionGetType(expr)\r\n );\r\n }\r\n case ExpressionId.GetGlobal: {\r\n let globalName = _BinaryenGetGlobalGetName(expr);\r\n if (!globalName) break;\r\n return _BinaryenGetGlobal(this.ref, globalName, _BinaryenExpressionGetType(expr));\r\n }\r\n case ExpressionId.Load: {\r\n if (!(nested1 = this.cloneExpression(_BinaryenLoadGetPtr(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return (\r\n _BinaryenLoadIsAtomic(expr)\r\n ? _BinaryenAtomicLoad(this.ref,\r\n _BinaryenLoadGetBytes(expr),\r\n _BinaryenLoadGetOffset(expr),\r\n _BinaryenExpressionGetType(expr),\r\n nested1\r\n )\r\n : _BinaryenLoad(this.ref,\r\n _BinaryenLoadGetBytes(expr),\r\n _BinaryenLoadIsSigned(expr) ? 1 : 0,\r\n _BinaryenLoadGetOffset(expr),\r\n _BinaryenLoadGetAlign(expr),\r\n _BinaryenExpressionGetType(expr),\r\n nested1\r\n )\r\n );\r\n }\r\n case ExpressionId.Unary: {\r\n if (!(nested1 = this.cloneExpression(_BinaryenUnaryGetValue(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenUnary(this.ref, _BinaryenUnaryGetOp(expr), nested1);\r\n }\r\n case ExpressionId.Binary: {\r\n if (!(nested1 = this.cloneExpression(_BinaryenBinaryGetLeft(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n if (!(nested2 = this.cloneExpression(_BinaryenBinaryGetRight(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenBinary(this.ref, _BinaryenBinaryGetOp(expr), nested1, nested2);\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n // source map generation\r\n\r\n addDebugInfoFile(name: string): Index {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenModuleAddDebugInfoFileName(this.ref, cStr);\r\n } finally {\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n getDebugInfoFile(index: Index): string | null {\r\n return readString(_BinaryenModuleGetDebugInfoFileName(this.ref, index));\r\n }\r\n\r\n setDebugLocation(\r\n func: FunctionRef,\r\n expr: ExpressionRef,\r\n fileIndex: Index,\r\n lineNumber: Index,\r\n columnNumber: Index\r\n ): void {\r\n _BinaryenFunctionSetDebugLocation(func, expr, fileIndex, lineNumber, columnNumber);\r\n }\r\n}\r\n\r\n// expressions\r\n\r\nexport function getExpressionId(expr: ExpressionRef): ExpressionId {\r\n return _BinaryenExpressionGetId(expr);\r\n}\r\n\r\nexport function getExpressionType(expr: ExpressionRef): NativeType {\r\n return _BinaryenExpressionGetType(expr);\r\n}\r\n\r\nexport function getConstValueI32(expr: ExpressionRef): i32 {\r\n return _BinaryenConstGetValueI32(expr);\r\n}\r\n\r\nexport function getConstValueI64Low(expr: ExpressionRef): i32 {\r\n return _BinaryenConstGetValueI64Low(expr);\r\n}\r\n\r\nexport function getConstValueI64High(expr: ExpressionRef): i32 {\r\n return _BinaryenConstGetValueI64High(expr);\r\n}\r\n\r\nexport function getConstValueF32(expr: ExpressionRef): f32 {\r\n return _BinaryenConstGetValueF32(expr);\r\n}\r\n\r\nexport function getConstValueF64(expr: ExpressionRef): f32 {\r\n return _BinaryenConstGetValueF64(expr);\r\n}\r\n\r\nexport function getGetLocalIndex(expr: ExpressionRef): Index {\r\n return _BinaryenGetLocalGetIndex(expr);\r\n}\r\n\r\nexport function getSetLocalIndex(expr: ExpressionRef): Index {\r\n return _BinaryenSetLocalGetIndex(expr);\r\n}\r\n\r\nexport function getSetLocalValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenSetLocalGetValue(expr);\r\n}\r\n\r\nexport function isTeeLocal(expr: ExpressionRef): bool {\r\n return _BinaryenSetLocalIsTee(expr);\r\n}\r\n\r\nexport function getGetGlobalName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenGetGlobalGetName(expr));\r\n}\r\n\r\nexport function getBinaryOp(expr: ExpressionRef): BinaryOp {\r\n return _BinaryenBinaryGetOp(expr);\r\n}\r\n\r\nexport function getBinaryLeft(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenBinaryGetLeft(expr);\r\n}\r\n\r\nexport function getBinaryRight(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenBinaryGetRight(expr);\r\n}\r\n\r\nexport function getUnaryOp(expr: ExpressionRef): UnaryOp {\r\n return _BinaryenUnaryGetOp(expr);\r\n}\r\n\r\nexport function getUnaryValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenUnaryGetValue(expr);\r\n}\r\n\r\nexport function getLoadBytes(expr: ExpressionRef): u32 {\r\n return _BinaryenLoadGetBytes(expr);\r\n}\r\n\r\nexport function getLoadOffset(expr: ExpressionRef): u32 {\r\n return _BinaryenLoadGetOffset(expr);\r\n}\r\n\r\nexport function getLoadPtr(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenLoadGetPtr(expr);\r\n}\r\n\r\nexport function isLoadSigned(expr: ExpressionRef): bool {\r\n return _BinaryenLoadIsSigned(expr);\r\n}\r\n\r\nexport function getStoreBytes(expr: ExpressionRef): u32 {\r\n return _BinaryenStoreGetBytes(expr);\r\n}\r\n\r\nexport function getStoreOffset(expr: ExpressionRef): u32 {\r\n return _BinaryenStoreGetOffset(expr);\r\n}\r\n\r\nexport function getStorePtr(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenStoreGetPtr(expr);\r\n}\r\n\r\nexport function getStoreValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenStoreGetValue(expr);\r\n}\r\n\r\nexport function getBlockName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenBlockGetName(expr));\r\n}\r\n\r\nexport function getBlockChildCount(expr: ExpressionRef): Index {\r\n return _BinaryenBlockGetNumChildren(expr);\r\n}\r\n\r\nexport function getBlockChild(expr: ExpressionRef, index: Index): ExpressionRef {\r\n return _BinaryenBlockGetChild(expr, index);\r\n}\r\n\r\nexport function getIfCondition(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenIfGetCondition(expr);\r\n}\r\n\r\nexport function getIfTrue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenIfGetIfTrue(expr);\r\n}\r\n\r\nexport function getIfFalse(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenIfGetIfFalse(expr);\r\n}\r\n\r\nexport function getLoopName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenLoopGetName(expr));\r\n}\r\n\r\nexport function getLoopBody(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenLoopGetBody(expr);\r\n}\r\n\r\nexport function getBreakName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenBreakGetName(expr));\r\n}\r\n\r\nexport function getBreakCondition(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenBreakGetCondition(expr);\r\n}\r\n\r\nexport function getSelectThen(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenSelectGetIfTrue(expr);\r\n}\r\n\r\nexport function getSelectElse(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenSelectGetIfFalse(expr);\r\n}\r\n\r\nexport function getSelectCondition(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenSelectGetCondition(expr);\r\n}\r\n\r\nexport function getDropValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenDropGetValue(expr);\r\n}\r\n\r\nexport function getReturnValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenReturnGetValue(expr);\r\n}\r\n\r\nexport function getCallTarget(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenCallGetTarget(expr));\r\n}\r\n\r\nexport function getHostOp(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenHostGetOp(expr);\r\n}\r\n\r\nexport function getHostOperandCount(expr: ExpressionRef): Index {\r\n return _BinaryenHostGetNumOperands(expr);\r\n}\r\n\r\nexport function getHostOperand(expr: ExpressionRef, index: Index): ExpressionRef {\r\n return _BinaryenHostGetOperand(expr, index);\r\n}\r\n\r\nexport function getHostName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenHostGetNameOperand(expr));\r\n}\r\n\r\n// functions\r\n\r\nexport function getFunctionBody(func: FunctionRef): ExpressionRef {\r\n return _BinaryenFunctionGetBody(func);\r\n}\r\n\r\nexport function getFunctionName(func: FunctionRef): string | null {\r\n return readString(_BinaryenFunctionGetName(func));\r\n}\r\n\r\nexport function getFunctionParamCount(func: FunctionRef): Index {\r\n return _BinaryenFunctionGetNumParams(func);\r\n}\r\n\r\nexport function getFunctionParamType(func: FunctionRef, index: Index): NativeType {\r\n return _BinaryenFunctionGetParam(func, index);\r\n}\r\n\r\nexport function getFunctionResultType(func: FunctionRef): NativeType {\r\n return _BinaryenFunctionGetResult(func);\r\n}\r\n\r\nexport class Relooper {\r\n\r\n module: Module;\r\n ref: RelooperRef;\r\n\r\n static create(module: Module): Relooper {\r\n var relooper = new Relooper();\r\n relooper.module = module;\r\n relooper.ref = _RelooperCreate(module.ref);\r\n return relooper;\r\n }\r\n\r\n private constructor() {}\r\n\r\n addBlock(code: ExpressionRef): RelooperBlockRef {\r\n return _RelooperAddBlock(this.ref, code);\r\n }\r\n\r\n addBranch(\r\n from: RelooperBlockRef,\r\n to: RelooperBlockRef,\r\n condition: ExpressionRef = 0,\r\n code: ExpressionRef = 0\r\n ): void {\r\n _RelooperAddBranch(from, to, condition, code);\r\n }\r\n\r\n addBlockWithSwitch(code: ExpressionRef, condition: ExpressionRef): RelooperBlockRef {\r\n return _RelooperAddBlockWithSwitch(this.ref, code, condition);\r\n }\r\n\r\n addBranchForSwitch(\r\n from: RelooperBlockRef,\r\n to: RelooperBlockRef,\r\n indexes: i32[],\r\n code: ExpressionRef = 0\r\n ): void {\r\n var cArr = allocI32Array(indexes);\r\n try {\r\n _RelooperAddBranchForSwitch(from, to, cArr, indexes.length, code);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n renderAndDispose(entry: RelooperBlockRef, labelHelper: Index): ExpressionRef {\r\n return _RelooperRenderAndDispose(this.ref, entry, labelHelper);\r\n }\r\n}\r\n\r\n// export function hasSideEffects(expr: ExpressionRef): bool {\r\n// switch (_BinaryenExpressionGetId(expr = getPtr(expr))) {\r\n// case ExpressionId.GetLocal:\r\n// case ExpressionId.GetGlobal:\r\n// case ExpressionId.Const:\r\n// case ExpressionId.Nop:\r\n// case ExpressionId.Unreachable: {\r\n// return false;\r\n// }\r\n// case ExpressionId.Block: {\r\n// for (let i = 0, k = _BinaryenBlockGetNumChildren(expr); i < k; ++i) {\r\n// if (hasSideEffects(_BinaryenBlockGetChild(expr, i))) return true;\r\n// }\r\n// return false;\r\n// }\r\n// case ExpressionId.If: {\r\n// return hasSideEffects(_BinaryenIfGetCondition(expr))\r\n// || hasSideEffects(_BinaryenIfGetIfTrue(expr))\r\n// || hasSideEffects(_BinaryenIfGetIfFalse(expr));\r\n// }\r\n// case ExpressionId.Unary: {\r\n// return hasSideEffects(_BinaryenUnaryGetValue(expr));\r\n// }\r\n// case ExpressionId.Binary: {\r\n// return hasSideEffects(_BinaryenBinaryGetLeft(expr))\r\n// || hasSideEffects(_BinaryenBinaryGetRight(expr));\r\n// }\r\n// case ExpressionId.Drop: {\r\n// return hasSideEffects(_BinaryenDropGetValue(expr));\r\n// }\r\n// case ExpressionId.Select: {\r\n// return hasSideEffects(_BinaryenSelectGetIfTrue(expr))\r\n// || hasSideEffects(_BinaryenSelectGetIfFalse(expr))\r\n// || hasSideEffects(_BinaryenSelectGetCondition(expr));\r\n// }\r\n// }\r\n// return true;\r\n// }\r\n\r\n// helpers\r\n// can't do stack allocation here: STACKTOP is a global in WASM but a hidden variable in asm.js\r\n\r\nfunction allocU8Array(u8s: Uint8Array | null): usize {\r\n if (!u8s) return 0;\r\n var numValues = u8s.length;\r\n var ptr = memory.allocate(numValues);\r\n var idx = ptr;\r\n for (let i = 0; i < numValues; ++i) {\r\n store(idx++, u8s[i]);\r\n }\r\n return ptr;\r\n}\r\n\r\nfunction allocI32Array(i32s: i32[] | null): usize {\r\n if (!i32s) return 0;\r\n var ptr = memory.allocate(i32s.length << 2);\r\n var idx = ptr;\r\n for (let i = 0, k = i32s.length; i < k; ++i) {\r\n let val = i32s[i];\r\n // store(idx, val) is not portable\r\n store(idx , ( val & 0xff) as u8);\r\n store(idx + 1, ((val >> 8) & 0xff) as u8);\r\n store(idx + 2, ((val >> 16) & 0xff) as u8);\r\n store(idx + 3, ( val >>> 24 ) as u8);\r\n idx += 4;\r\n }\r\n return ptr;\r\n}\r\n\r\nfunction allocPtrArray(ptrs: usize[] | null): usize {\r\n return allocI32Array(ptrs); // TODO: WASM64 one day\r\n}\r\n\r\nfunction stringLengthUTF8(str: string): usize {\r\n var len = 0;\r\n for (let i = 0, k = str.length; i < k; ++i) {\r\n let u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n ++len;\r\n } else if (u <= 0x7FF) {\r\n len += 2;\r\n } else if (u <= 0xFFFF) {\r\n len += 3;\r\n } else if (u <= 0x1FFFFF) {\r\n len += 4;\r\n } else if (u <= 0x3FFFFFF) {\r\n len += 5;\r\n } else {\r\n len += 6;\r\n }\r\n }\r\n return len;\r\n}\r\n\r\nvar cachedStrings = new Map();\r\n\r\nfunction allocString(str: string | null): usize {\r\n if (str == null) return 0;\r\n if (cachedStrings.has(str)) return cachedStrings.get(str);\r\n var ptr = memory.allocate(stringLengthUTF8(str) + 1);\r\n // the following is based on Emscripten's stringToUTF8Array\r\n var idx = ptr;\r\n for (let i = 0, k = str.length; i < k; ++i) {\r\n let u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n store(idx++, u as u8);\r\n } else if (u <= 0x7FF) {\r\n store(idx++, (0xC0 | (u >>> 6) ) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0xFFFF) {\r\n store(idx++, (0xE0 | (u >>> 12) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0x1FFFFF) {\r\n store(idx++, (0xF0 | (u >>> 18) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0x3FFFFFF) {\r\n store(idx++, (0xF8 | (u >>> 24) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else {\r\n store(idx++, (0xFC | (u >>> 30) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 24) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n }\r\n }\r\n store(idx, 0);\r\n cachedStrings.set(str, ptr);\r\n return ptr;\r\n}\r\n\r\nfunction readInt(ptr: usize): i32 {\r\n return (\r\n load(ptr ) |\r\n (load(ptr + 1) << 8) |\r\n (load(ptr + 2) << 16) |\r\n (load(ptr + 3) << 24)\r\n );\r\n}\r\n\r\nfunction readBuffer(ptr: usize, length: usize): Uint8Array {\r\n var ret = new Uint8Array(length);\r\n for (let i: usize = 0; i < length; ++i) {\r\n ret[i] = load(ptr + i);\r\n }\r\n return ret;\r\n}\r\n\r\nexport function readString(ptr: usize): string | null {\r\n if (!ptr) return null;\r\n var arr = new Array();\r\n // the following is based on Emscripten's UTF8ArrayToString\r\n var cp: u32;\r\n var u1: u32, u2: u32, u3: u32, u4: u32, u5: u32;\r\n while (cp = load(ptr++)) {\r\n if (!(cp & 0x80)) {\r\n arr.push(cp);\r\n continue;\r\n }\r\n u1 = load(ptr++) & 63;\r\n if ((cp & 0xE0) == 0xC0) {\r\n arr.push(((cp & 31) << 6) | u1);\r\n continue;\r\n }\r\n u2 = load(ptr++) & 63;\r\n if ((cp & 0xF0) == 0xE0) {\r\n cp = ((cp & 15) << 12) | (u1 << 6) | u2;\r\n } else {\r\n u3 = load(ptr++) & 63;\r\n if ((cp & 0xF8) == 0xF0) {\r\n cp = ((cp & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;\r\n } else {\r\n u4 = load(ptr++) & 63;\r\n if ((cp & 0xFC) == 0xF8) {\r\n cp = ((cp & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;\r\n } else {\r\n u5 = load(ptr++) & 63;\r\n cp = ((cp & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;\r\n }\r\n }\r\n }\r\n arr.push(cp);\r\n // if (cp < 0x10000) {\r\n // arr.push(cp);\r\n // } else {\r\n // var ch = cp - 0x10000;\r\n // arr.push(0xD800 | (ch >> 10));\r\n // arr.push(0xDC00 | (ch & 0x3FF));\r\n // }\r\n }\r\n // return String.fromCharCodes(arr);\r\n return String.fromCodePoints(arr);\r\n}\r\n\r\n/** Result structure of {@link Module#toBinary}. */\r\nexport class BinaryModule {\r\n /** WebAssembly binary. */\r\n output: Uint8Array;\r\n /** Source map, if generated. */\r\n sourceMap: string | null;\r\n}\r\n\r\n/** Tests if an expression needs an explicit 'unreachable' when it is the terminating statement. */\r\nexport function needsExplicitUnreachable(expr: ExpressionRef): bool {\r\n // not applicable if pushing a value to the stack\r\n switch (_BinaryenExpressionGetType(expr)) {\r\n case NativeType.I32:\r\n case NativeType.I64:\r\n case NativeType.F32:\r\n case NativeType.F64: return false;\r\n }\r\n switch (_BinaryenExpressionGetId(expr)) {\r\n case ExpressionId.Unreachable:\r\n case ExpressionId.Return: return false;\r\n case ExpressionId.Break: return _BinaryenBreakGetCondition(expr) != 0;\r\n case ExpressionId.Block: {\r\n if (!_BinaryenBlockGetName(expr)) { // can't break out of it\r\n let numChildren = _BinaryenBlockGetNumChildren(expr); // last child needs unreachable\r\n return numChildren > 0 && needsExplicitUnreachable(_BinaryenBlockGetChild(expr, numChildren - 1));\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n","/**\r\n * Abstract syntax tree representing a source file once parsed.\r\n * @module ast\r\n *//***/\r\n\r\nimport {\r\n CommonFlags,\r\n PATH_DELIMITER,\r\n STATIC_DELIMITER,\r\n INSTANCE_DELIMITER,\r\n LIBRARY_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n Token,\r\n Tokenizer,\r\n Range\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n normalizePath,\r\n resolvePath,\r\n CharCode\r\n} from \"./util\";\r\n\r\nexport { Token, Range };\r\n\r\n/** Indicates the kind of a node. */\r\nexport enum NodeKind {\r\n\r\n SOURCE,\r\n\r\n // types\r\n TYPE,\r\n TYPEPARAMETER,\r\n PARAMETER,\r\n SIGNATURE,\r\n\r\n // expressions\r\n IDENTIFIER,\r\n ASSERTION,\r\n BINARY,\r\n CALL,\r\n CLASS,\r\n COMMA,\r\n ELEMENTACCESS,\r\n FALSE,\r\n FUNCTION,\r\n INSTANCEOF,\r\n LITERAL,\r\n NEW,\r\n NULL,\r\n PARENTHESIZED,\r\n PROPERTYACCESS,\r\n TERNARY,\r\n SUPER,\r\n THIS,\r\n TRUE,\r\n CONSTRUCTOR,\r\n UNARYPOSTFIX,\r\n UNARYPREFIX,\r\n\r\n // statements\r\n BLOCK,\r\n BREAK,\r\n CONTINUE,\r\n DO,\r\n EMPTY,\r\n EXPORT,\r\n EXPORTIMPORT,\r\n EXPRESSION,\r\n FOR,\r\n IF,\r\n IMPORT,\r\n RETURN,\r\n SWITCH,\r\n THROW,\r\n TRY,\r\n VARIABLE,\r\n VOID,\r\n WHILE,\r\n\r\n // declaration statements\r\n CLASSDECLARATION,\r\n ENUMDECLARATION,\r\n ENUMVALUEDECLARATION,\r\n FIELDDECLARATION,\r\n FUNCTIONDECLARATION,\r\n IMPORTDECLARATION,\r\n INDEXSIGNATUREDECLARATION,\r\n INTERFACEDECLARATION,\r\n METHODDECLARATION,\r\n NAMESPACEDECLARATION,\r\n TYPEDECLARATION,\r\n VARIABLEDECLARATION,\r\n\r\n // special\r\n DECORATOR,\r\n EXPORTMEMBER,\r\n SWITCHCASE,\r\n COMMENT\r\n}\r\n\r\n/** Checks if a node represents a constant value. */\r\nexport function nodeIsConstantValue(kind: NodeKind): bool {\r\n switch (kind) {\r\n case NodeKind.LITERAL:\r\n case NodeKind.NULL:\r\n case NodeKind.TRUE:\r\n case NodeKind.FALSE: return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Checks if a node might be callable. */\r\nexport function nodeIsCallable(kind: NodeKind): bool {\r\n switch (kind) {\r\n case NodeKind.IDENTIFIER:\r\n case NodeKind.ASSERTION: // if kind=NONNULL\r\n case NodeKind.CALL:\r\n case NodeKind.ELEMENTACCESS:\r\n case NodeKind.PARENTHESIZED:\r\n case NodeKind.PROPERTYACCESS:\r\n case NodeKind.SUPER: return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Checks if a node might be callable with generic arguments. */\r\nexport function nodeIsGenericCallable(kind: NodeKind): bool {\r\n switch (kind) {\r\n case NodeKind.IDENTIFIER:\r\n case NodeKind.PROPERTYACCESS: return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Base class of all nodes. */\r\nexport abstract class Node {\r\n\r\n /** Node kind indicator. */\r\n kind: NodeKind;\r\n /** Source range. */\r\n range: Range;\r\n /** Parent node. */\r\n parent: Node | null = null;\r\n /** Common flags indicating specific traits. */\r\n flags: CommonFlags = CommonFlags.NONE;\r\n\r\n /** Tests if this node has the specified flag or flags. */\r\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\r\n /** Tests if this node has one of the specified flags. */\r\n isAny(flag: CommonFlags): bool { return (this.flags & flag) != 0; }\r\n /** Sets a specific flag or flags. */\r\n set(flag: CommonFlags): void { this.flags |= flag; }\r\n\r\n // types\r\n\r\n static createType(\r\n name: IdentifierExpression,\r\n typeArguments: CommonTypeNode[] | null,\r\n isNullable: bool,\r\n range: Range\r\n ): TypeNode {\r\n var type = new TypeNode();\r\n type.range = range;\r\n type.name = name; name.parent = type;\r\n type.typeArguments = typeArguments; if (typeArguments) setParent(typeArguments, type);\r\n type.isNullable = isNullable;\r\n return type;\r\n }\r\n\r\n static createOmittedType(\r\n range: Range\r\n ): TypeNode {\r\n return Node.createType(\r\n Node.createIdentifierExpression(\"\", range),\r\n null,\r\n false,\r\n range\r\n );\r\n }\r\n\r\n static createTypeParameter(\r\n name: IdentifierExpression,\r\n extendsType: TypeNode | null,\r\n defaultType: TypeNode | null,\r\n range: Range\r\n ): TypeParameterNode {\r\n var elem = new TypeParameterNode();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n elem.extendsType = extendsType; if (extendsType) extendsType.parent = elem;\r\n elem.defaultType = defaultType; if (defaultType) defaultType.parent = elem;\r\n return elem;\r\n }\r\n\r\n static createParameter(\r\n name: IdentifierExpression,\r\n type: CommonTypeNode,\r\n initializer: Expression | null,\r\n kind: ParameterKind,\r\n range: Range\r\n ): ParameterNode {\r\n var elem = new ParameterNode();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n elem.type = type; if (type) type.parent = elem;\r\n elem.initializer = initializer; if (initializer) initializer.parent = elem;\r\n elem.parameterKind = kind;\r\n return elem;\r\n }\r\n\r\n static createSignature(\r\n parameters: ParameterNode[],\r\n returnType: CommonTypeNode,\r\n explicitThisType: TypeNode | null,\r\n isNullable: bool,\r\n range: Range\r\n ): SignatureNode {\r\n var sig = new SignatureNode();\r\n sig.range = range;\r\n sig.parameters = parameters; setParent(parameters, sig);\r\n sig.returnType = returnType; returnType.parent = sig;\r\n sig.explicitThisType = explicitThisType; if (explicitThisType) explicitThisType.parent = sig;\r\n sig.isNullable = isNullable;\r\n return sig;\r\n }\r\n\r\n // special\r\n\r\n static createDecorator(\r\n name: Expression,\r\n args: Expression[] | null,\r\n range: Range\r\n ): DecoratorNode {\r\n var stmt = new DecoratorNode();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.arguments = args; if (args) setParent(args, stmt);\r\n stmt.decoratorKind = decoratorNameToKind(name);\r\n return stmt;\r\n }\r\n\r\n static createComment(\r\n text: string,\r\n kind: CommentKind,\r\n range: Range\r\n ): CommentNode {\r\n var node = new CommentNode();\r\n node.range = range;\r\n node.commentKind = kind;\r\n node.text = text;\r\n return node;\r\n }\r\n\r\n // expressions\r\n\r\n static createIdentifierExpression(\r\n name: string,\r\n range: Range\r\n ): IdentifierExpression {\r\n var expr = new IdentifierExpression();\r\n expr.range = range;\r\n expr.text = name;\r\n return expr;\r\n }\r\n\r\n static createEmptyIdentifierExpression(\r\n range: Range\r\n ): IdentifierExpression {\r\n var expr = new IdentifierExpression();\r\n expr.range = range;\r\n expr.text = \"\";\r\n return expr;\r\n }\r\n\r\n static createArrayLiteralExpression(\r\n elements: (Expression | null)[],\r\n range: Range\r\n ): ArrayLiteralExpression {\r\n var expr = new ArrayLiteralExpression();\r\n expr.range = range;\r\n expr.elementExpressions = elements; setParentIfNotNull(elements, expr);\r\n return expr;\r\n }\r\n\r\n static createAssertionExpression(\r\n assertionKind: AssertionKind,\r\n expression: Expression,\r\n toType: CommonTypeNode | null,\r\n range: Range\r\n ): AssertionExpression {\r\n var expr = new AssertionExpression();\r\n expr.range = range;\r\n expr.assertionKind = assertionKind;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.toType = toType; if (toType) toType.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createBinaryExpression(\r\n operator: Token,\r\n left: Expression,\r\n right: Expression,\r\n range: Range\r\n ): BinaryExpression {\r\n var expr = new BinaryExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.left = left; left.parent = expr;\r\n expr.right = right; right.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createCallExpression(\r\n expression: Expression,\r\n typeArgs: CommonTypeNode[] | null,\r\n args: Expression[],\r\n range: Range\r\n ): CallExpression {\r\n var expr = new CallExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\r\n expr.arguments = args; setParent(args, expr);\r\n return expr;\r\n }\r\n\r\n static createClassExpression(\r\n declaration: ClassDeclaration\r\n ): ClassExpression {\r\n var expr = new ClassExpression();\r\n expr.range = declaration.range;\r\n expr.declaration = declaration;\r\n return expr;\r\n }\r\n\r\n static createCommaExpression(\r\n expressions: Expression[],\r\n range: Range\r\n ): CommaExpression {\r\n var expr = new CommaExpression();\r\n expr.range = range;\r\n expr.expressions = expressions; setParent(expressions, expr);\r\n return expr;\r\n }\r\n\r\n static createConstructorExpression(\r\n range: Range\r\n ): ConstructorExpression {\r\n var expr = new ConstructorExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createElementAccessExpression(\r\n expression: Expression,\r\n element: Expression,\r\n range: Range\r\n ): ElementAccessExpression {\r\n var expr = new ElementAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.elementExpression = element; element.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createFalseExpression(\r\n range: Range\r\n ): FalseExpression {\r\n var expr = new FalseExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createFloatLiteralExpression(\r\n value: f64,\r\n range: Range\r\n ): FloatLiteralExpression {\r\n var expr = new FloatLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createFunctionExpression(\r\n declaration: FunctionDeclaration\r\n ): FunctionExpression {\r\n var expr = new FunctionExpression();\r\n expr.flags = declaration.flags & CommonFlags.ARROW;\r\n expr.range = declaration.range;\r\n expr.declaration = declaration;\r\n return expr;\r\n }\r\n\r\n static createInstanceOfExpression(\r\n expression: Expression,\r\n isType: CommonTypeNode,\r\n range: Range\r\n ): InstanceOfExpression {\r\n var expr = new InstanceOfExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.isType = isType; isType.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createIntegerLiteralExpression(\r\n value: I64,\r\n range: Range\r\n ): IntegerLiteralExpression {\r\n var expr = new IntegerLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createNewExpression(\r\n expression: Expression,\r\n typeArgs: CommonTypeNode[] | null,\r\n args: Expression[],\r\n range: Range\r\n ): NewExpression {\r\n var expr = new NewExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\r\n expr.arguments = args; setParent(args, expr);\r\n return expr;\r\n }\r\n\r\n static createNullExpression(\r\n range: Range\r\n ): NullExpression {\r\n var expr = new NullExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createObjectLiteralExpression(\r\n names: IdentifierExpression[],\r\n values: Expression[],\r\n range: Range\r\n ): ObjectLiteralExpression {\r\n var expr = new ObjectLiteralExpression();\r\n expr.range = range;\r\n expr.names = names;\r\n expr.values = values;\r\n return expr;\r\n }\r\n\r\n static createParenthesizedExpression(\r\n expression: Expression,\r\n range: Range\r\n ): ParenthesizedExpression {\r\n var expr = new ParenthesizedExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createPropertyAccessExpression(\r\n expression: Expression,\r\n property: IdentifierExpression,\r\n range: Range\r\n ): PropertyAccessExpression {\r\n var expr = new PropertyAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression; expression.parent = expr;\r\n expr.property = property; property.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createRegexpLiteralExpression(\r\n pattern: string,\r\n flags: string,\r\n range: Range\r\n ): RegexpLiteralExpression {\r\n var expr = new RegexpLiteralExpression();\r\n expr.range = range;\r\n expr.pattern = pattern;\r\n expr.patternFlags = flags;\r\n return expr;\r\n }\r\n\r\n static createTernaryExpression(\r\n condition: Expression,\r\n ifThen: Expression,\r\n ifElse: Expression,\r\n range: Range\r\n ): TernaryExpression {\r\n var expr = new TernaryExpression();\r\n expr.range = range;\r\n expr.condition = condition; condition.parent = expr;\r\n expr.ifThen = ifThen; ifThen.parent = expr;\r\n expr.ifElse = ifElse; ifElse.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createStringLiteralExpression(\r\n value: string,\r\n range: Range\r\n ): StringLiteralExpression {\r\n var expr = new StringLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createSuperExpression(\r\n range: Range\r\n ): SuperExpression {\r\n var expr = new SuperExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createThisExpression(\r\n range: Range\r\n ): ThisExpression {\r\n var expr = new ThisExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createTrueExpression(\r\n range: Range\r\n ): TrueExpression {\r\n var expr = new TrueExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createUnaryPostfixExpression(\r\n operator: Token,\r\n operand: Expression,\r\n range: Range\r\n ): UnaryPostfixExpression {\r\n var expr = new UnaryPostfixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand; operand.parent = expr;\r\n return expr;\r\n }\r\n\r\n static createUnaryPrefixExpression(\r\n operator: Token,\r\n operand: Expression,\r\n range: Range\r\n ): UnaryPrefixExpression {\r\n var expr = new UnaryPrefixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand; operand.parent = expr;\r\n return expr;\r\n }\r\n\r\n // statements\r\n\r\n static createBlockStatement(\r\n statements: Statement[],\r\n range: Range\r\n ): BlockStatement {\r\n var stmt = new BlockStatement();\r\n stmt.range = range;\r\n stmt.statements = statements; setParent(statements, stmt);\r\n return stmt;\r\n }\r\n\r\n static createBreakStatement(\r\n label: IdentifierExpression | null,\r\n range: Range\r\n ): BreakStatement {\r\n var stmt = new BreakStatement();\r\n stmt.range = range;\r\n stmt.label = label; if (label) label.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createClassDeclaration(\r\n identifier: IdentifierExpression,\r\n typeParameters: TypeParameterNode[],\r\n extendsType: TypeNode | null, // can't be a function\r\n implementsTypes: TypeNode[] | null, // can't be functions\r\n members: DeclarationStatement[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): ClassDeclaration {\r\n var stmt = new ClassDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = identifier; identifier.parent = stmt;\r\n stmt.typeParameters = typeParameters; setParent(typeParameters, stmt);\r\n stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\r\n stmt.implementsTypes = implementsTypes; if (implementsTypes) setParent(implementsTypes, stmt);\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createContinueStatement(\r\n label: IdentifierExpression | null,\r\n range: Range\r\n ): ContinueStatement {\r\n var stmt = new ContinueStatement();\r\n stmt.range = range;\r\n stmt.label = label; if (label) label.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createDoStatement(\r\n statement: Statement,\r\n condition: Expression,\r\n range: Range\r\n ): DoStatement {\r\n var stmt = new DoStatement();\r\n stmt.range = range;\r\n stmt.statement = statement; statement.parent = stmt;\r\n stmt.condition = condition; condition.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createEmptyStatement(\r\n range: Range\r\n ): EmptyStatement {\r\n var stmt = new EmptyStatement();\r\n stmt.range = range;\r\n return stmt;\r\n }\r\n\r\n static createEnumDeclaration(\r\n name: IdentifierExpression,\r\n members: EnumValueDeclaration[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): EnumDeclaration {\r\n var stmt = new EnumDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.values = members; setParent(members, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createEnumValueDeclaration(\r\n name: IdentifierExpression,\r\n value: Expression | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): EnumValueDeclaration {\r\n var stmt = new EnumValueDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.value = value; if (value) value.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createExportStatement(\r\n members: ExportMember[] | null,\r\n path: StringLiteralExpression | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): ExportStatement {\r\n var stmt = new ExportStatement();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.members = members; if (members) setParent(members, stmt);\r\n stmt.path = path;\r\n if (path) {\r\n let normalizedPath = normalizePath(path.value);\r\n if (path.value.startsWith(\".\")) { // relative\r\n stmt.normalizedPath = resolvePath(\r\n normalizedPath,\r\n range.source.normalizedPath\r\n );\r\n } else { // absolute\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n } else {\r\n stmt.normalizedPath = null;\r\n stmt.internalPath = null;\r\n }\r\n return stmt;\r\n }\r\n\r\n static createExportImportStatement(\r\n name: IdentifierExpression,\r\n externalName: IdentifierExpression,\r\n range: Range\r\n ): ExportImportStatement {\r\n var stmt = new ExportImportStatement();\r\n stmt.range = range;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.externalName = externalName; externalName.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createExportMember(\r\n name: IdentifierExpression,\r\n externalName: IdentifierExpression | null,\r\n range: Range\r\n ): ExportMember {\r\n var elem = new ExportMember();\r\n elem.range = range;\r\n elem.name = name; name.parent = elem;\r\n if (!externalName) {\r\n externalName = name;\r\n } else {\r\n externalName.parent = elem;\r\n }\r\n elem.externalName = externalName;\r\n return elem;\r\n }\r\n\r\n static createExpressionStatement(\r\n expression: Expression\r\n ): ExpressionStatement {\r\n var stmt = new ExpressionStatement();\r\n stmt.range = expression.range;\r\n stmt.expression = expression; expression.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createIfStatement(\r\n condition: Expression,\r\n ifTrue: Statement,\r\n ifFalse: Statement | null,\r\n range: Range\r\n ): IfStatement {\r\n var stmt = new IfStatement();\r\n stmt.range = range;\r\n stmt.condition = condition; condition.parent = stmt;\r\n stmt.ifTrue = ifTrue; ifTrue.parent = stmt;\r\n stmt.ifFalse = ifFalse; if (ifFalse) ifFalse.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createImportStatement(\r\n decls: ImportDeclaration[] | null,\r\n path: StringLiteralExpression,\r\n range: Range\r\n ): ImportStatement {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = decls; if (decls) setParent(decls, stmt);\r\n stmt.namespaceName = null;\r\n stmt.path = path;\r\n var normalizedPath = normalizePath(path.value);\r\n if (path.value.startsWith(\".\")) { // relative in project\r\n stmt.normalizedPath = resolvePath(\r\n normalizedPath,\r\n range.source.normalizedPath\r\n );\r\n } else { // absolute in library\r\n if (!normalizedPath.startsWith(LIBRARY_PREFIX)) {\r\n normalizedPath = LIBRARY_PREFIX + normalizedPath;\r\n }\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n }\r\n\r\n static createImportStatementWithWildcard(\r\n identifier: IdentifierExpression,\r\n path: StringLiteralExpression,\r\n range: Range\r\n ): ImportStatement {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = null;\r\n stmt.namespaceName = identifier;\r\n stmt.path = path;\r\n stmt.normalizedPath = resolvePath(\r\n normalizePath(path.value),\r\n range.source.normalizedPath\r\n );\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n }\r\n\r\n static createImportDeclaration(\r\n externalName: IdentifierExpression,\r\n name: IdentifierExpression | null,\r\n range: Range\r\n ): ImportDeclaration {\r\n var elem = new ImportDeclaration();\r\n elem.range = range;\r\n elem.externalName = externalName; externalName.parent = elem;\r\n if (!name) {\r\n name = externalName;\r\n } else {\r\n name.parent = elem;\r\n }\r\n elem.name = name;\r\n return elem;\r\n }\r\n\r\n static createInterfaceDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameterNode[],\r\n extendsType: TypeNode | null, // can't be a function\r\n members: DeclarationStatement[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): InterfaceDeclaration {\r\n var stmt = new InterfaceDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createFieldDeclaration(\r\n name: IdentifierExpression,\r\n type: CommonTypeNode | null,\r\n initializer: Expression | null,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): FieldDeclaration {\r\n var stmt = new FieldDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.type = type; if (type) type.parent = stmt;\r\n stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createForStatement(\r\n initializer: Statement | null,\r\n condition: Expression | null,\r\n incrementor: Expression | null,\r\n statement: Statement,\r\n range: Range\r\n ): ForStatement {\r\n var stmt = new ForStatement();\r\n stmt.range = range;\r\n stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\r\n stmt.condition = condition; if (condition) condition.parent = stmt;\r\n stmt.incrementor = incrementor; if (incrementor) incrementor.parent = stmt;\r\n stmt.statement = statement; statement.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createFunctionDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameterNode[] | null,\r\n signature: SignatureNode,\r\n body: Statement | null,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): FunctionDeclaration {\r\n var stmt = new FunctionDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n stmt.signature = signature; signature.parent = stmt;\r\n stmt.body = body; if (body) body.parent = stmt;\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createIndexSignatureDeclaration(\r\n keyType: TypeNode,\r\n valueType: CommonTypeNode,\r\n range: Range\r\n ): IndexSignatureDeclaration {\r\n var elem = new IndexSignatureDeclaration();\r\n elem.range = range;\r\n elem.keyType = keyType; keyType.parent = elem;\r\n elem.valueType = valueType; valueType.parent = elem;\r\n return elem;\r\n }\r\n\r\n static createMethodDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameterNode[] | null,\r\n signature: SignatureNode,\r\n body: Statement | null,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): MethodDeclaration {\r\n var stmt = new MethodDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n stmt.signature = signature; signature.parent = stmt;\r\n stmt.body = body; if (body) body.parent = stmt;\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createNamespaceDeclaration(\r\n name: IdentifierExpression,\r\n members: Statement[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): NamespaceDeclaration {\r\n var stmt = new NamespaceDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.members = members; setParent(members, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createReturnStatement(\r\n value: Expression | null,\r\n range: Range\r\n ): ReturnStatement {\r\n var stmt = new ReturnStatement();\r\n stmt.range = range;\r\n stmt.value = value; if (value) value.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createSwitchStatement(\r\n condition: Expression,\r\n cases: SwitchCase[],\r\n range: Range\r\n ): SwitchStatement {\r\n var stmt = new SwitchStatement();\r\n stmt.range = range;\r\n stmt.condition = condition; condition.parent = stmt;\r\n stmt.cases = cases; setParent(cases, stmt);\r\n return stmt;\r\n }\r\n\r\n static createSwitchCase(\r\n label: Expression | null,\r\n statements: Statement[],\r\n range: Range\r\n ): SwitchCase {\r\n var elem = new SwitchCase();\r\n elem.range = range;\r\n elem.label = label; if (label) label.parent = elem;\r\n elem.statements = statements; setParent(statements, elem);\r\n return elem;\r\n }\r\n\r\n static createThrowStatement(\r\n value: Expression,\r\n range: Range\r\n ): ThrowStatement {\r\n var stmt = new ThrowStatement();\r\n stmt.range = range;\r\n stmt.value = value; value.parent = stmt;\r\n return stmt;\r\n }\r\n\r\n static createTryStatement(\r\n statements: Statement[],\r\n catchVariable: IdentifierExpression | null,\r\n catchStatements: Statement[] | null,\r\n finallyStatements: Statement[] | null,\r\n range: Range\r\n ): TryStatement {\r\n var stmt = new TryStatement();\r\n stmt.range = range;\r\n stmt.statements = statements; setParent(statements, stmt);\r\n stmt.catchVariable = catchVariable;\r\n if (catchVariable) catchVariable.parent = stmt;\r\n stmt.catchStatements = catchStatements;\r\n if (catchStatements) setParent(catchStatements, stmt);\r\n stmt.finallyStatements = finallyStatements;\r\n if (finallyStatements) setParent(finallyStatements, stmt);\r\n return stmt;\r\n }\r\n\r\n static createTypeDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameterNode[] | null,\r\n alias: CommonTypeNode,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): TypeDeclaration {\r\n var stmt = new TypeDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name; name.parent = stmt;\r\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\r\n stmt.type = alias; alias.parent = stmt;\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createVariableStatement(\r\n declarations: VariableDeclaration[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): VariableStatement {\r\n var stmt = new VariableStatement();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.declarations = declarations; setParent(declarations, stmt);\r\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\r\n return stmt;\r\n }\r\n\r\n static createVariableDeclaration(\r\n name: IdentifierExpression,\r\n type: CommonTypeNode | null,\r\n initializer: Expression | null,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): VariableDeclaration {\r\n var elem = new VariableDeclaration();\r\n elem.range = range;\r\n elem.flags = flags;\r\n elem.name = name; name.parent = elem;\r\n elem.type = type; if (type) type.parent = elem;\r\n elem.initializer = initializer; if (initializer) initializer.parent = elem;\r\n elem.decorators = decorators; // inherited\r\n return elem;\r\n }\r\n\r\n static createVoidStatement(\r\n expression: Expression,\r\n range: Range\r\n ): VoidStatement {\r\n var stmt = new VoidStatement();\r\n stmt.range = range;\r\n stmt.expression = expression;\r\n return stmt;\r\n }\r\n\r\n static createWhileStatement(\r\n condition: Expression,\r\n statement: Statement,\r\n range: Range\r\n ): WhileStatement {\r\n var stmt = new WhileStatement();\r\n stmt.range = range;\r\n stmt.condition = condition; condition.parent = stmt;\r\n stmt.statement = statement; statement.parent = stmt;\r\n return stmt;\r\n }\r\n}\r\n\r\n// types\r\n\r\nexport abstract class CommonTypeNode extends Node {\r\n // kind varies\r\n\r\n /** Whether nullable or not. */\r\n isNullable: bool;\r\n}\r\n\r\n/** Represents a type annotation. */\r\nexport class TypeNode extends CommonTypeNode {\r\n kind = NodeKind.TYPE;\r\n\r\n /** Identifier reference. */\r\n name: IdentifierExpression;\r\n /** Type argument references. */\r\n typeArguments: CommonTypeNode[] | null;\r\n}\r\n\r\n/** Represents a type parameter. */\r\nexport class TypeParameterNode extends Node {\r\n kind = NodeKind.TYPEPARAMETER;\r\n\r\n /** Identifier reference. */\r\n name: IdentifierExpression;\r\n /** Extended type reference, if any. */\r\n extendsType: TypeNode | null; // can't be a function\r\n /** Default type if omitted, if any. */\r\n defaultType: TypeNode | null; // can't be a function\r\n}\r\n\r\n/** Represents the kind of a parameter. */\r\nexport enum ParameterKind {\r\n /** No specific flags. */\r\n DEFAULT,\r\n /** Is an optional parameter. */\r\n OPTIONAL,\r\n /** Is a rest parameter. */\r\n REST\r\n}\r\n\r\n/** Represents a function parameter. */\r\nexport class ParameterNode extends Node {\r\n kind = NodeKind.PARAMETER;\r\n\r\n /** Parameter kind. */\r\n parameterKind: ParameterKind;\r\n /** Parameter name. */\r\n name: IdentifierExpression;\r\n /** Parameter type. */\r\n type: CommonTypeNode;\r\n /** Initializer expression, if present. */\r\n initializer: Expression | null;\r\n /** Implicit field declaration, if applicable. */\r\n implicitFieldDeclaration: FieldDeclaration | null = null;\r\n}\r\n\r\n/** Represents a function signature. */\r\nexport class SignatureNode extends CommonTypeNode {\r\n kind = NodeKind.SIGNATURE;\r\n\r\n /** Accepted parameters. */\r\n parameters: ParameterNode[];\r\n /** Return type. */\r\n returnType: CommonTypeNode;\r\n /** Explicitly provided this type, if any. */\r\n explicitThisType: TypeNode | null; // can't be a function\r\n}\r\n\r\n// special\r\n\r\n/** Built-in decorator kinds. */\r\nexport enum DecoratorKind {\r\n CUSTOM,\r\n GLOBAL,\r\n OPERATOR,\r\n OPERATOR_BINARY,\r\n OPERATOR_PREFIX,\r\n OPERATOR_POSTFIX,\r\n UNMANAGED,\r\n SEALED,\r\n INLINE,\r\n EXTERNAL,\r\n BUILTIN\r\n}\r\n\r\n/** Returns the kind of the specified decorator. Defaults to {@link DecoratorKind.CUSTOM}. */\r\nexport function decoratorNameToKind(name: Expression): DecoratorKind {\r\n // @global, @inline, @operator, @sealed, @unmanaged\r\n if (name.kind == NodeKind.IDENTIFIER) {\r\n let nameStr = (name).text;\r\n assert(nameStr.length);\r\n switch (nameStr.charCodeAt(0)) {\r\n case CharCode.b: {\r\n if (nameStr == \"builtin\") return DecoratorKind.BUILTIN;\r\n break;\r\n }\r\n case CharCode.e: {\r\n if (nameStr == \"external\") return DecoratorKind.EXTERNAL;\r\n break;\r\n }\r\n case CharCode.g: {\r\n if (nameStr == \"global\") return DecoratorKind.GLOBAL;\r\n break;\r\n }\r\n case CharCode.i: {\r\n if (nameStr == \"inline\") return DecoratorKind.INLINE;\r\n break;\r\n }\r\n case CharCode.o: {\r\n if (nameStr == \"operator\") return DecoratorKind.OPERATOR;\r\n break;\r\n }\r\n case CharCode.s: {\r\n if (nameStr == \"sealed\") return DecoratorKind.SEALED;\r\n break;\r\n }\r\n case CharCode.u: {\r\n if (nameStr == \"unmanaged\") return DecoratorKind.UNMANAGED;\r\n break;\r\n }\r\n }\r\n } else if (\r\n name.kind == NodeKind.PROPERTYACCESS &&\r\n (name).expression.kind == NodeKind.IDENTIFIER\r\n ) {\r\n let nameStr = ((name).expression).text;\r\n assert(nameStr.length);\r\n let propStr = (name).property.text;\r\n assert(propStr.length);\r\n // @operator.binary, @operator.prefix, @operator.postfix\r\n if (nameStr == \"operator\") {\r\n switch (propStr.charCodeAt(0)) {\r\n case CharCode.b: {\r\n if (propStr == \"binary\") return DecoratorKind.OPERATOR_BINARY;\r\n break;\r\n }\r\n case CharCode.p: {\r\n switch (propStr) {\r\n case \"prefix\": return DecoratorKind.OPERATOR_PREFIX;\r\n case \"postfix\": return DecoratorKind.OPERATOR_POSTFIX;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return DecoratorKind.CUSTOM;\r\n}\r\n\r\n/** Represents a decorator. */\r\nexport class DecoratorNode extends Node {\r\n kind = NodeKind.DECORATOR;\r\n\r\n /** Built-in kind, if applicable. */\r\n decoratorKind: DecoratorKind;\r\n /** Name expression. */\r\n name: Expression;\r\n /** Argument expressions. */\r\n arguments: Expression[] | null;\r\n}\r\n\r\n/** Comment kinds. */\r\nexport enum CommentKind {\r\n /** Line comment. */\r\n LINE,\r\n /** Triple-slash comment. */\r\n TRIPLE,\r\n /** Block comment. */\r\n BLOCK\r\n}\r\n\r\n/** Represents a comment. */\r\nexport class CommentNode extends Node {\r\n kind = NodeKind.COMMENT;\r\n\r\n /** Comment kind. */\r\n commentKind: CommentKind;\r\n /** Comment text. */\r\n text: string;\r\n}\r\n\r\n// expressions\r\n\r\n/** Base class of all expression nodes. */\r\nexport abstract class Expression extends Node { }\r\n\r\n/** Represents an identifier expression. */\r\nexport class IdentifierExpression extends Expression {\r\n kind = NodeKind.IDENTIFIER;\r\n\r\n /** Textual name. */\r\n text: string;\r\n}\r\n\r\n/** Indicates the kind of a literal. */\r\nexport enum LiteralKind {\r\n FLOAT,\r\n INTEGER,\r\n STRING,\r\n REGEXP,\r\n ARRAY,\r\n OBJECT\r\n}\r\n\r\n/** Base class of all literal expressions. */\r\nexport abstract class LiteralExpression extends Expression {\r\n kind = NodeKind.LITERAL;\r\n\r\n /** Specific literal kind. */\r\n literalKind: LiteralKind;\r\n}\r\n\r\n/** Represents an `[]` literal expression. */\r\nexport class ArrayLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.ARRAY;\r\n\r\n /** Nested element expressions. */\r\n elementExpressions: (Expression | null)[];\r\n}\r\n\r\n/** Indicates the kind of an assertion. */\r\nexport enum AssertionKind {\r\n PREFIX,\r\n AS,\r\n NONNULL\r\n}\r\n\r\n/** Represents an assertion expression. */\r\nexport class AssertionExpression extends Expression {\r\n kind = NodeKind.ASSERTION;\r\n\r\n /** Specific kind of this assertion. */\r\n assertionKind: AssertionKind;\r\n /** Expression being asserted. */\r\n expression: Expression;\r\n /** Target type. */\r\n toType: CommonTypeNode | null;\r\n}\r\n\r\n/** Represents a binary expression. */\r\nexport class BinaryExpression extends Expression {\r\n kind = NodeKind.BINARY;\r\n\r\n /** Operator token. */\r\n operator: Token;\r\n /** Left-hand side expression */\r\n left: Expression;\r\n /** Right-hand side expression. */\r\n right: Expression;\r\n}\r\n\r\n/** Represents a call expression. */\r\nexport class CallExpression extends Expression {\r\n kind = NodeKind.CALL;\r\n\r\n /** Called expression. Usually an identifier or property access expression. */\r\n expression: Expression;\r\n /** Provided type arguments. */\r\n typeArguments: CommonTypeNode[] | null;\r\n /** Provided arguments. */\r\n arguments: Expression[];\r\n}\r\n\r\n/** Represents a class expression using the 'class' keyword. */\r\nexport class ClassExpression extends Expression {\r\n kind = NodeKind.CLASS;\r\n\r\n /** Inline class declaration. */\r\n declaration: ClassDeclaration;\r\n}\r\n\r\n/** Represents a comma expression composed of multiple expressions. */\r\nexport class CommaExpression extends Expression {\r\n kind = NodeKind.COMMA;\r\n\r\n /** Sequential expressions. */\r\n expressions: Expression[];\r\n}\r\n\r\n/** Represents a `constructor` expression. */\r\nexport class ConstructorExpression extends IdentifierExpression {\r\n kind = NodeKind.CONSTRUCTOR;\r\n text = \"constructor\";\r\n}\r\n\r\n/** Represents an element access expression, e.g., array access. */\r\nexport class ElementAccessExpression extends Expression {\r\n kind = NodeKind.ELEMENTACCESS;\r\n\r\n /** Expression being accessed. */\r\n expression: Expression;\r\n /** Element of the expression being accessed. */\r\n elementExpression: Expression;\r\n}\r\n\r\n/** Represents a float literal expression. */\r\nexport class FloatLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.FLOAT;\r\n\r\n /** Float value. */\r\n value: f64;\r\n}\r\n\r\n/** Represents a function expression using the 'function' keyword. */\r\nexport class FunctionExpression extends Expression {\r\n kind = NodeKind.FUNCTION;\r\n\r\n /** Inline function declaration. */\r\n declaration: FunctionDeclaration;\r\n}\r\n\r\n/** Represents an `instanceof` expression. */\r\nexport class InstanceOfExpression extends Expression {\r\n kind = NodeKind.INSTANCEOF;\r\n\r\n /** Expression being asserted. */\r\n expression: Expression;\r\n /** Type to test for. */\r\n isType: CommonTypeNode;\r\n}\r\n\r\n/** Represents an integer literal expression. */\r\nexport class IntegerLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.INTEGER;\r\n\r\n /** Integer value. */\r\n value: I64;\r\n}\r\n\r\n/** Represents a `new` expression. Like a call but with its own kind. */\r\nexport class NewExpression extends CallExpression {\r\n kind = NodeKind.NEW;\r\n}\r\n\r\n/** Represents a `null` expression. */\r\nexport class NullExpression extends IdentifierExpression {\r\n kind = NodeKind.NULL;\r\n text = \"null\";\r\n}\r\n\r\n/** Represents an object literal expression. */\r\nexport class ObjectLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.OBJECT;\r\n\r\n /** Field names. */\r\n names: IdentifierExpression[];\r\n /** Field values. */\r\n values: Expression[];\r\n}\r\n\r\n/** Represents a parenthesized expression. */\r\nexport class ParenthesizedExpression extends Expression {\r\n kind = NodeKind.PARENTHESIZED;\r\n\r\n /** Expression in parenthesis. */\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a property access expression. */\r\nexport class PropertyAccessExpression extends Expression {\r\n kind = NodeKind.PROPERTYACCESS;\r\n\r\n /** Expression being accessed. */\r\n expression: Expression;\r\n /** Property of the expression being accessed. */\r\n property: IdentifierExpression;\r\n}\r\n\r\n/** Represents a regular expression literal expression. */\r\nexport class RegexpLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.REGEXP;\r\n\r\n /** Regular expression pattern. */\r\n pattern: string;\r\n /** Regular expression flags. */\r\n patternFlags: string;\r\n}\r\n\r\n/** Represents a ternary expression, i.e., short if notation. */\r\nexport class TernaryExpression extends Expression {\r\n kind = NodeKind.TERNARY;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Expression executed when condition is `true`. */\r\n ifThen: Expression;\r\n /** Expression executed when condition is `false`. */\r\n ifElse: Expression;\r\n}\r\n\r\n/** Represents a string literal expression. */\r\nexport class StringLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.STRING;\r\n\r\n /** String value without quotes. */\r\n value: string;\r\n}\r\n\r\n/** Represents a `super` expression. */\r\nexport class SuperExpression extends IdentifierExpression {\r\n kind = NodeKind.SUPER;\r\n text = \"super\";\r\n}\r\n\r\n/** Represents a `this` expression. */\r\nexport class ThisExpression extends IdentifierExpression {\r\n kind = NodeKind.THIS;\r\n text = \"this\";\r\n}\r\n\r\n/** Represents a `true` expression. */\r\nexport class TrueExpression extends IdentifierExpression {\r\n kind = NodeKind.TRUE;\r\n text = \"true\";\r\n}\r\n\r\n/** Represents a `false` expression. */\r\nexport class FalseExpression extends IdentifierExpression {\r\n kind = NodeKind.FALSE;\r\n text = \"false\";\r\n}\r\n\r\n/** Base class of all unary expressions. */\r\nexport abstract class UnaryExpression extends Expression {\r\n\r\n /** Operator token. */\r\n operator: Token;\r\n /** Operand expression. */\r\n operand: Expression;\r\n}\r\n\r\n/** Represents a unary postfix expression, e.g. a postfix increment. */\r\nexport class UnaryPostfixExpression extends UnaryExpression {\r\n kind = NodeKind.UNARYPOSTFIX;\r\n}\r\n\r\n/** Represents a unary prefix expression, e.g. a negation. */\r\nexport class UnaryPrefixExpression extends UnaryExpression {\r\n kind = NodeKind.UNARYPREFIX;\r\n}\r\n\r\n// statements\r\n\r\nexport function isLastStatement(statement: Statement): bool {\r\n var parent = assert(statement.parent);\r\n if (parent.kind == NodeKind.BLOCK) {\r\n let statements = (parent).statements;\r\n if (statements[statements.length - 1] === statement) {\r\n switch (assert(parent.parent).kind) {\r\n case NodeKind.FUNCTIONDECLARATION:\r\n case NodeKind.METHODDECLARATION: return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/** Base class of all statement nodes. */\r\nexport abstract class Statement extends Node { }\r\n\r\n/** Indicates the specific kind of a source. */\r\nexport enum SourceKind {\r\n /** Default source. Usually imported from an entry file. */\r\n DEFAULT,\r\n /** Entry file. */\r\n ENTRY,\r\n /** Library file. */\r\n LIBRARY\r\n}\r\n\r\n/** A top-level source node. */\r\nexport class Source extends Node {\r\n kind = NodeKind.SOURCE;\r\n parent = null;\r\n\r\n /** Source kind. */\r\n sourceKind: SourceKind;\r\n /** Normalized path. */\r\n normalizedPath: string;\r\n /** Path used internally. */\r\n internalPath: string;\r\n /** Simple path (last part without extension). */\r\n simplePath: string;\r\n /** Contained statements. */\r\n statements: Statement[];\r\n /** Full source text. */\r\n text: string;\r\n /** Tokenizer reference. */\r\n tokenizer: Tokenizer | null = null;\r\n /** Source map index. */\r\n debugInfoIndex: i32 = -1;\r\n /** Re-exported sources. */\r\n exportPaths: Set | null = null;\r\n\r\n /** Constructs a new source node. */\r\n constructor(normalizedPath: string, text: string, kind: SourceKind) {\r\n super();\r\n this.sourceKind = kind;\r\n this.normalizedPath = normalizedPath;\r\n var internalPath = mangleInternalPath(this.normalizedPath);\r\n this.internalPath = internalPath;\r\n var pos = internalPath.lastIndexOf(PATH_DELIMITER);\r\n this.simplePath = pos >= 0 ? internalPath.substring(pos + 1) : internalPath;\r\n this.statements = new Array();\r\n this.range = new Range(this, 0, text.length);\r\n this.text = text;\r\n }\r\n\r\n /** Tests if this source is an entry file. */\r\n get isEntry(): bool { return this.sourceKind == SourceKind.ENTRY; }\r\n /** Tests if this source is a stdlib file. */\r\n get isLibrary(): bool { return this.sourceKind == SourceKind.LIBRARY; }\r\n}\r\n\r\n/** Base class of all declaration statements. */\r\nexport abstract class DeclarationStatement extends Statement {\r\n\r\n /** Simple name being declared. */\r\n name: IdentifierExpression;\r\n /** Array of decorators. */\r\n decorators: DecoratorNode[] | null = null;\r\n\r\n protected cachedProgramLevelInternalName: string | null = null;\r\n protected cachedFileLevelInternalName: string | null = null;\r\n\r\n /** Gets the mangled program-level internal name of this declaration. */\r\n get programLevelInternalName(): string {\r\n if (!this.cachedProgramLevelInternalName) {\r\n this.cachedProgramLevelInternalName = mangleInternalName(this, true);\r\n }\r\n return this.cachedProgramLevelInternalName;\r\n }\r\n\r\n /** Gets the mangled file-level internal name of this declaration. */\r\n get fileLevelInternalName(): string {\r\n if (!this.cachedFileLevelInternalName) {\r\n this.cachedFileLevelInternalName = mangleInternalName(this, false);\r\n }\r\n return this.cachedFileLevelInternalName;\r\n }\r\n\r\n /** Tests if this is a top-level declaration within its source file. */\r\n get isTopLevel(): bool {\r\n var parent = this.parent;\r\n if (!parent) {\r\n return false;\r\n }\r\n if (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent)) {\r\n return false;\r\n }\r\n return parent.kind == NodeKind.SOURCE;\r\n }\r\n\r\n /** Tests if this declaration is a top-level export within its source file. */\r\n get isTopLevelExport(): bool {\r\n var parent = this.parent;\r\n if (!parent || (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent))) {\r\n return false;\r\n }\r\n if (parent.kind == NodeKind.NAMESPACEDECLARATION) {\r\n return this.is(CommonFlags.EXPORT) && (parent).isTopLevelExport;\r\n }\r\n if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n return this.is(CommonFlags.STATIC) && (parent).isTopLevelExport;\r\n }\r\n return parent.kind == NodeKind.SOURCE && this.is(CommonFlags.EXPORT);\r\n }\r\n\r\n /** Tests if this declaration needs an explicit export. */\r\n needsExplicitExport(member: ExportMember): bool {\r\n // This is necessary because module-level exports are automatically created\r\n // for top level declarations of all sorts. This function essentially tests\r\n // that there isn't a otherwise duplicate top-level export already.\r\n return (\r\n member.name.text != member.externalName.text || // if aliased\r\n this.range.source != member.range.source || // if a re-export\r\n !this.isTopLevelExport // if not top-level\r\n );\r\n }\r\n}\r\n\r\n/** Represents an index signature declaration. */\r\nexport class IndexSignatureDeclaration extends DeclarationStatement {\r\n kind = NodeKind.INDEXSIGNATUREDECLARATION;\r\n\r\n /** Key type. */\r\n keyType: TypeNode;\r\n /** Value type. */\r\n valueType: CommonTypeNode;\r\n}\r\n\r\n/** Base class of all variable-like declaration statements. */\r\nexport abstract class VariableLikeDeclarationStatement extends DeclarationStatement {\r\n\r\n /** Variable type. */\r\n type: CommonTypeNode | null;\r\n /** Variable initializer. */\r\n initializer: Expression | null;\r\n}\r\n\r\n/** Represents a block statement. */\r\nexport class BlockStatement extends Statement {\r\n kind = NodeKind.BLOCK;\r\n\r\n /** Contained statements. */\r\n statements: Statement[];\r\n}\r\n\r\n/** Represents a `break` statement. */\r\nexport class BreakStatement extends Statement {\r\n kind = NodeKind.BREAK;\r\n\r\n /** Target label, if applicable. */\r\n label: IdentifierExpression | null;\r\n}\r\n\r\n/** Represents a `class` declaration. */\r\nexport class ClassDeclaration extends DeclarationStatement {\r\n kind = NodeKind.CLASSDECLARATION;\r\n\r\n /** Accepted type parameters. */\r\n typeParameters: TypeParameterNode[];\r\n /** Base class type being extended, if any. */\r\n extendsType: TypeNode | null; // can't be a function\r\n /** Interface types being implemented, if any. */\r\n implementsTypes: TypeNode[] | null; // can't be functions\r\n /** Class member declarations. */\r\n members: DeclarationStatement[];\r\n\r\n get isGeneric(): bool {\r\n var typeParameters = this.typeParameters;\r\n return typeParameters != null && typeParameters.length > 0;\r\n }\r\n}\r\n\r\n/** Represents a `continue` statement. */\r\nexport class ContinueStatement extends Statement {\r\n kind = NodeKind.CONTINUE;\r\n\r\n /** Target label, if applicable. */\r\n label: IdentifierExpression | null;\r\n}\r\n\r\n/** Represents a `do` statement. */\r\nexport class DoStatement extends Statement {\r\n kind = NodeKind.DO;\r\n\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n /** Condition when to repeat. */\r\n condition: Expression;\r\n}\r\n\r\n/** Represents an empty statement, i.e., a semicolon terminating nothing. */\r\nexport class EmptyStatement extends Statement {\r\n kind = NodeKind.EMPTY;\r\n}\r\n\r\n/** Represents an `enum` declaration. */\r\nexport class EnumDeclaration extends DeclarationStatement {\r\n kind = NodeKind.ENUMDECLARATION;\r\n\r\n /** Enum value declarations. */\r\n values: EnumValueDeclaration[];\r\n}\r\n\r\n/** Represents a value of an `enum` declaration. */\r\nexport class EnumValueDeclaration extends DeclarationStatement {\r\n kind = NodeKind.ENUMVALUEDECLARATION;\r\n // name is inherited\r\n\r\n /** Value expression. */\r\n value: Expression | null;\r\n}\r\n\r\n/** Represents an `export import` statement of an interface. */\r\nexport class ExportImportStatement extends Node {\r\n kind = NodeKind.EXPORTIMPORT;\r\n\r\n /** Identifier being imported. */\r\n name: IdentifierExpression;\r\n /** Identifier being exported. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents a member of an `export` statement. */\r\nexport class ExportMember extends Node {\r\n kind = NodeKind.EXPORTMEMBER;\r\n\r\n /** Identifier being exported. */\r\n name: IdentifierExpression;\r\n /** Identifier seen when imported again. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `export` statement. */\r\nexport class ExportStatement extends Statement {\r\n kind = NodeKind.EXPORT;\r\n\r\n /** Array of members if a set of named exports, or `null` if a filespace export. */\r\n members: ExportMember[] | null;\r\n /** Path being exported from, if applicable. */\r\n path: StringLiteralExpression | null;\r\n /** Normalized path, if `path` is set. */\r\n normalizedPath: string | null;\r\n /** Mangled internal path being referenced, if `path` is set. */\r\n internalPath: string | null;\r\n}\r\n\r\n/** Represents an expression that is used as a statement. */\r\nexport class ExpressionStatement extends Statement {\r\n kind = NodeKind.EXPRESSION;\r\n\r\n /** Expression being used as a statement.*/\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a field declaration within a `class`. */\r\nexport class FieldDeclaration extends VariableLikeDeclarationStatement {\r\n kind = NodeKind.FIELDDECLARATION;\r\n\r\n /** Parameter index within the constructor, if applicable. */\r\n parameterIndex: i32 = -1;\r\n}\r\n\r\n/** Represents a `for` statement. */\r\nexport class ForStatement extends Statement {\r\n kind = NodeKind.FOR;\r\n\r\n /**\r\n * Initializer statement, if present.\r\n * Either a {@link VariableStatement} or {@link ExpressionStatement}.\r\n */\r\n initializer: Statement | null;\r\n /** Condition expression, if present. */\r\n condition: Expression | null;\r\n /** Incrementor expression, if present. */\r\n incrementor: Expression | null;\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n}\r\n\r\n/** Represents a `function` declaration. */\r\nexport class FunctionDeclaration extends DeclarationStatement {\r\n kind = NodeKind.FUNCTIONDECLARATION;\r\n\r\n /** Type parameters, if any. */\r\n typeParameters: TypeParameterNode[] | null;\r\n /** Function signature. */\r\n signature: SignatureNode;\r\n /** Body statement. Usually a block. */\r\n body: Statement | null;\r\n\r\n get isGeneric(): bool {\r\n var typeParameters = this.typeParameters;\r\n return typeParameters != null && typeParameters.length > 0;\r\n }\r\n}\r\n\r\n/** Represents an `if` statement. */\r\nexport class IfStatement extends Statement {\r\n kind = NodeKind.IF;\r\n\r\n /** Condition. */\r\n condition: Expression;\r\n /** Statement executed when condition is `true`. */\r\n ifTrue: Statement;\r\n /** Statement executed when condition is `false`. */\r\n ifFalse: Statement | null;\r\n}\r\n\r\n/** Represents an `import` declaration part of an {@link ImportStatement}. */\r\nexport class ImportDeclaration extends DeclarationStatement {\r\n kind = NodeKind.IMPORTDECLARATION;\r\n\r\n /** Identifier being imported. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `import` statement. */\r\nexport class ImportStatement extends Statement {\r\n kind = NodeKind.IMPORT;\r\n\r\n /** Array of member declarations or `null` if an asterisk import. */\r\n declarations: ImportDeclaration[] | null;\r\n /** Name of the local namespace, if an asterisk import. */\r\n namespaceName: IdentifierExpression | null;\r\n /** Path being imported from. */\r\n path: StringLiteralExpression;\r\n /** Normalized path. */\r\n normalizedPath: string;\r\n /** Mangled internal path being referenced. */\r\n internalPath: string;\r\n}\r\n\r\n/** Represents an `interfarce` declaration. */\r\nexport class InterfaceDeclaration extends ClassDeclaration {\r\n kind = NodeKind.INTERFACEDECLARATION;\r\n}\r\n\r\n/** Represents a method declaration within a `class`. */\r\nexport class MethodDeclaration extends FunctionDeclaration {\r\n kind = NodeKind.METHODDECLARATION;\r\n}\r\n\r\n/** Represents a `namespace` declaration. */\r\nexport class NamespaceDeclaration extends DeclarationStatement {\r\n kind = NodeKind.NAMESPACEDECLARATION;\r\n\r\n /** Array of namespace members. */\r\n members: Statement[];\r\n}\r\n\r\n/** Represents a `return` statement. */\r\nexport class ReturnStatement extends Statement {\r\n kind = NodeKind.RETURN;\r\n\r\n /** Value expression being returned, if present. */\r\n value: Expression | null;\r\n}\r\n\r\n/** Represents a single `case` within a `switch` statement. */\r\nexport class SwitchCase extends Node {\r\n kind = NodeKind.SWITCHCASE;\r\n\r\n /** Label expression. `null` indicates the default case. */\r\n label: Expression | null;\r\n /** Contained statements. */\r\n statements: Statement[];\r\n}\r\n\r\n/** Represents a `switch` statement. */\r\nexport class SwitchStatement extends Statement {\r\n kind = NodeKind.SWITCH;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Contained cases. */\r\n cases: SwitchCase[];\r\n}\r\n\r\n/** Represents a `throw` statement. */\r\nexport class ThrowStatement extends Statement {\r\n kind = NodeKind.THROW;\r\n\r\n /** Value expression being thrown. */\r\n value: Expression;\r\n}\r\n\r\n/** Represents a `try` statement. */\r\nexport class TryStatement extends Statement {\r\n kind = NodeKind.TRY;\r\n\r\n /** Contained statements. */\r\n statements: Statement[];\r\n /** Exception variable name, if a `catch` clause is present. */\r\n catchVariable: IdentifierExpression | null;\r\n /** Statements being executed on catch, if a `catch` clause is present. */\r\n catchStatements: Statement[] | null;\r\n /** Statements being executed afterwards, if a `finally` clause is present. */\r\n finallyStatements: Statement[] | null;\r\n}\r\n\r\n/** Represents a `type` declaration. */\r\nexport class TypeDeclaration extends DeclarationStatement {\r\n kind = NodeKind.TYPEDECLARATION;\r\n\r\n /** Type parameters, if any. */\r\n typeParameters: TypeParameterNode[] | null;\r\n /** Type being aliased. */\r\n type: CommonTypeNode;\r\n}\r\n\r\n/** Represents a variable declaration part of a {@link VariableStatement}. */\r\nexport class VariableDeclaration extends VariableLikeDeclarationStatement {\r\n kind = NodeKind.VARIABLEDECLARATION;\r\n}\r\n\r\n/** Represents a variable statement wrapping {@link VariableDeclaration}s. */\r\nexport class VariableStatement extends Statement {\r\n kind = NodeKind.VARIABLE;\r\n\r\n /** Array of decorators. */\r\n decorators: DecoratorNode[] | null;\r\n /** Array of member declarations. */\r\n declarations: VariableDeclaration[];\r\n}\r\n\r\n/** Represents a void statement dropping an expression's value. */\r\nexport class VoidStatement extends Statement {\r\n kind = NodeKind.VOID;\r\n\r\n /** Expression being dropped. */\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a `while` statement. */\r\nexport class WhileStatement extends Statement {\r\n kind = NodeKind.WHILE;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n}\r\n\r\n/** Finds the first decorator matching the specified kind. */\r\nexport function findDecorator(kind: DecoratorKind, decorators: DecoratorNode[] | null): DecoratorNode | null {\r\n if (decorators) {\r\n for (let i = 0, k = decorators.length; i < k; ++i) {\r\n let decorator = decorators[i];\r\n if (decorator.decoratorKind == kind) return decorator;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** Mangles a declaration's name to an internal name. */\r\nexport function mangleInternalName(declaration: DeclarationStatement, asGlobal: bool = false): string {\r\n var name = declaration.name.text;\r\n var parent = declaration.parent;\r\n if (!parent) return name;\r\n if (\r\n declaration.kind == NodeKind.VARIABLEDECLARATION &&\r\n parent.kind == NodeKind.VARIABLE\r\n ) { // skip over\r\n if (!(parent = parent.parent)) return name;\r\n }\r\n if (parent.kind == NodeKind.CLASSDECLARATION) {\r\n return mangleInternalName(parent, asGlobal) + (\r\n declaration.is(CommonFlags.STATIC)\r\n ? STATIC_DELIMITER\r\n : INSTANCE_DELIMITER\r\n ) + name;\r\n }\r\n if (\r\n parent.kind == NodeKind.NAMESPACEDECLARATION ||\r\n parent.kind == NodeKind.ENUMDECLARATION\r\n ) {\r\n return mangleInternalName(parent, asGlobal) +\r\n STATIC_DELIMITER + name;\r\n }\r\n return asGlobal\r\n ? name\r\n : declaration.range.source.internalPath + PATH_DELIMITER + name;\r\n}\r\n\r\n/** Mangles an external to an internal path. */\r\nexport function mangleInternalPath(path: string): string {\r\n if (path.endsWith(\".ts\")) path = path.substring(0, path.length - 3);\r\n return path;\r\n}\r\n\r\n// Helpers\r\n\r\n/** Sets the parent node on an array of nodes. */\r\nfunction setParent(nodes: Node[], parent: Node): void {\r\n for (let i = 0, k = nodes.length; i < k; ++i) {\r\n nodes[i].parent = parent;\r\n }\r\n}\r\n\r\n/** Sets the parent node on an array of nullable nodes. */\r\nfunction setParentIfNotNull(nodes: (Node | null)[], parent: Node): void {\r\n for (let i = 0, k = nodes.length; i < k; ++i) {\r\n let node = nodes[i];\r\n if (node) node.parent = parent;\r\n }\r\n}\r\n","/**\r\n * AssemblyScript's intermediate representation describing a program's elements.\r\n * @module program\r\n *//***/\r\n\r\nimport {\r\n CommonFlags,\r\n PATH_DELIMITER,\r\n STATIC_DELIMITER,\r\n INSTANCE_DELIMITER,\r\n LIBRARY_PREFIX,\r\n GETTER_PREFIX,\r\n SETTER_PREFIX,\r\n FILESPACE_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n Options,\r\n Feature\r\n} from \"./compiler\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticMessage,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags,\r\n Signature\r\n} from \"./types\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n Source,\r\n Range,\r\n CommonTypeNode,\r\n TypeParameterNode,\r\n DecoratorNode,\r\n DecoratorKind,\r\n\r\n Expression,\r\n IdentifierExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n StringLiteralExpression,\r\n\r\n ClassDeclaration,\r\n DeclarationStatement,\r\n EnumDeclaration,\r\n EnumValueDeclaration,\r\n ExportMember,\r\n ExportStatement,\r\n FieldDeclaration,\r\n FunctionDeclaration,\r\n ImportDeclaration,\r\n ImportStatement,\r\n InterfaceDeclaration,\r\n MethodDeclaration,\r\n NamespaceDeclaration,\r\n TypeDeclaration,\r\n VariableDeclaration,\r\n VariableLikeDeclarationStatement,\r\n VariableStatement,\r\n\r\n decoratorNameToKind,\r\n findDecorator\r\n} from \"./ast\";\r\n\r\nimport {\r\n Module,\r\n NativeType,\r\n FunctionRef,\r\n ExpressionRef,\r\n ExpressionId,\r\n BinaryOp,\r\n UnaryOp,\r\n\r\n getExpressionId,\r\n getGetLocalIndex,\r\n isTeeLocal,\r\n getSetLocalValue,\r\n getBinaryOp,\r\n getConstValueI32,\r\n getBinaryLeft,\r\n getBinaryRight,\r\n getUnaryOp,\r\n getExpressionType,\r\n getLoadBytes,\r\n isLoadSigned,\r\n getIfTrue,\r\n getIfFalse,\r\n getSelectThen,\r\n getSelectElse,\r\n getCallTarget,\r\n getBlockChildCount,\r\n getBlockChild,\r\n getBlockName,\r\n getConstValueF32,\r\n getConstValueF64,\r\n getConstValueI64Low,\r\n getGetGlobalName\r\n} from \"./module\";\r\n\r\nimport {\r\n CharCode,\r\n bitsetIs,\r\n bitsetSet\r\n} from \"./util\";\r\n\r\nimport {\r\n Resolver\r\n} from \"./resolver\";\r\n\r\n/** Represents a yet unresolved import. */\r\nclass QueuedImport {\r\n localName: string;\r\n externalName: string;\r\n externalNameAlt: string;\r\n declaration: ImportDeclaration | null; // not set if a filespace\r\n}\r\n\r\n/** Represents a yet unresolved export. */\r\nclass QueuedExport {\r\n externalName: string;\r\n isReExport: bool;\r\n member: ExportMember;\r\n}\r\n\r\n/** Represents a type alias. */\r\nclass TypeAlias {\r\n typeParameters: TypeParameterNode[] | null;\r\n type: CommonTypeNode;\r\n}\r\n\r\n/** Represents a module-level export. */\r\nclass ModuleExport {\r\n element: Element;\r\n identifier: IdentifierExpression;\r\n}\r\n\r\n/** Represents the kind of an operator overload. */\r\nexport enum OperatorKind {\r\n INVALID,\r\n\r\n // indexed access\r\n INDEXED_GET, // a[]\r\n INDEXED_SET, // a[]=b\r\n UNCHECKED_INDEXED_GET, // unchecked(a[])\r\n UNCHECKED_INDEXED_SET, // unchecked(a[]=b)\r\n\r\n // binary\r\n ADD, // a + b\r\n SUB, // a - b\r\n MUL, // a * b\r\n DIV, // a / b\r\n REM, // a % b\r\n POW, // a ** b\r\n BITWISE_AND, // a & b\r\n BITWISE_OR, // a | b\r\n BITWISE_XOR, // a ^ b\r\n BITWISE_SHL, // a << b\r\n BITWISE_SHR, // a >> b\r\n BITWISE_SHR_U, // a >>> b\r\n EQ, // a == b\r\n NE, // a != b\r\n GT, // a > b\r\n GE, // a >= b\r\n LT, // a < b\r\n LE, // a <= b\r\n\r\n // unary prefix\r\n PLUS, // +a\r\n MINUS, // -a\r\n NOT, // !a\r\n BITWISE_NOT, // ~a\r\n PREFIX_INC, // ++a\r\n PREFIX_DEC, // --a\r\n\r\n // unary postfix\r\n POSTFIX_INC, // a++\r\n POSTFIX_DEC // a--\r\n\r\n // not overridable:\r\n // IDENTITY // a === b\r\n // LOGICAL_AND // a && b\r\n // LOGICAL_OR // a || b\r\n}\r\n\r\n/** Returns the operator kind represented by the specified decorator and string argument. */\r\nfunction operatorKindFromDecorator(decoratorKind: DecoratorKind, arg: string): OperatorKind {\r\n assert(arg.length);\r\n switch (decoratorKind) {\r\n case DecoratorKind.OPERATOR:\r\n case DecoratorKind.OPERATOR_BINARY: {\r\n switch (arg.charCodeAt(0)) {\r\n case CharCode.OPENBRACKET: {\r\n if (arg == \"[]\") return OperatorKind.INDEXED_GET;\r\n if (arg == \"[]=\") return OperatorKind.INDEXED_SET;\r\n break;\r\n }\r\n case CharCode.OPENBRACE: {\r\n if (arg == \"{}\") return OperatorKind.UNCHECKED_INDEXED_GET;\r\n if (arg == \"{}=\") return OperatorKind.UNCHECKED_INDEXED_SET;\r\n break;\r\n }\r\n case CharCode.PLUS: {\r\n if (arg == \"+\") return OperatorKind.ADD;\r\n break;\r\n }\r\n case CharCode.MINUS: {\r\n if (arg == \"-\") return OperatorKind.SUB;\r\n break;\r\n }\r\n case CharCode.ASTERISK: {\r\n if (arg == \"*\") return OperatorKind.MUL;\r\n if (arg == \"**\") return OperatorKind.POW;\r\n break;\r\n }\r\n case CharCode.SLASH: {\r\n if (arg == \"/\") return OperatorKind.DIV;\r\n break;\r\n }\r\n case CharCode.PERCENT: {\r\n if (arg == \"%\") return OperatorKind.REM;\r\n break;\r\n }\r\n case CharCode.AMPERSAND: {\r\n if (arg == \"&\") return OperatorKind.BITWISE_AND;\r\n break;\r\n }\r\n case CharCode.BAR: {\r\n if (arg == \"|\") return OperatorKind.BITWISE_OR;\r\n break;\r\n }\r\n case CharCode.CARET: {\r\n if (arg == \"^\") return OperatorKind.BITWISE_XOR;\r\n break;\r\n }\r\n case CharCode.EQUALS: {\r\n if (arg == \"==\") return OperatorKind.EQ;\r\n break;\r\n }\r\n case CharCode.EXCLAMATION: {\r\n if (arg == \"!=\") return OperatorKind.NE;\r\n break;\r\n }\r\n case CharCode.GREATERTHAN: {\r\n if (arg == \">\") return OperatorKind.GT;\r\n if (arg == \">=\") return OperatorKind.GE;\r\n if (arg == \">>\") return OperatorKind.BITWISE_SHR;\r\n if (arg == \">>>\") return OperatorKind.BITWISE_SHR_U;\r\n break;\r\n }\r\n case CharCode.LESSTHAN: {\r\n if (arg == \"<\") return OperatorKind.LT;\r\n if (arg == \"<=\") return OperatorKind.LE;\r\n if (arg == \"<<\") return OperatorKind.BITWISE_SHL;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n case DecoratorKind.OPERATOR_PREFIX: {\r\n switch (arg.charCodeAt(0)) {\r\n case CharCode.PLUS: {\r\n if (arg == \"+\") return OperatorKind.PLUS;\r\n if (arg == \"++\") return OperatorKind.PREFIX_INC;\r\n break;\r\n }\r\n case CharCode.MINUS: {\r\n if (arg == \"-\") return OperatorKind.MINUS;\r\n if (arg == \"--\") return OperatorKind.PREFIX_DEC;\r\n break;\r\n }\r\n case CharCode.EXCLAMATION: {\r\n if (arg == \"!\") return OperatorKind.NOT;\r\n break;\r\n }\r\n case CharCode.TILDE: {\r\n if (arg == \"~\") return OperatorKind.BITWISE_NOT;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n case DecoratorKind.OPERATOR_POSTFIX: {\r\n switch (arg.charCodeAt(0)) {\r\n case CharCode.PLUS: {\r\n if (arg == \"++\") return OperatorKind.POSTFIX_INC;\r\n break;\r\n }\r\n case CharCode.MINUS: {\r\n if (arg == \"--\") return OperatorKind.POSTFIX_DEC;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n return OperatorKind.INVALID;\r\n}\r\n\r\nconst noTypesYet = new Map();\r\n\r\n/** Represents an AssemblyScript program. */\r\nexport class Program extends DiagnosticEmitter {\r\n\r\n /** Array of source files. */\r\n sources: Source[];\r\n /** Resolver instance. */\r\n resolver: Resolver;\r\n /** Diagnostic offset used where successively obtaining the next diagnostic. */\r\n diagnosticsOffset: i32 = 0;\r\n /** Compiler options. */\r\n options: Options;\r\n\r\n /** Elements by internal name. */\r\n elementsLookup: Map = new Map();\r\n /** Class and function instances by internal name. */\r\n instancesLookup: Map = new Map();\r\n /** Types by internal name. */\r\n typesLookup: Map = noTypesYet;\r\n /** Declared type aliases. */\r\n typeAliases: Map = new Map();\r\n /** File-level exports by exported name. */\r\n fileLevelExports: Map = new Map();\r\n /** Module-level exports by exported name. */\r\n moduleLevelExports: Map = new Map();\r\n /** Classes backing basic types like `i32`. */\r\n basicClasses: Map = new Map();\r\n\r\n /** ArrayBuffer instance reference. */\r\n arrayBufferInstance: Class | null = null;\r\n /** Array prototype reference. */\r\n arrayPrototype: ClassPrototype | null = null;\r\n /** String instance reference. */\r\n stringInstance: Class | null = null;\r\n /** Start function reference. */\r\n startFunction: FunctionPrototype;\r\n /** Main function reference, if present. */\r\n mainFunction: FunctionPrototype | null = null;\r\n /** Abort function reference, if present. */\r\n abortInstance: Function | null = null;\r\n /** Memory allocation function. */\r\n memoryAllocateInstance: Function | null = null;\r\n\r\n /** Whether a garbage collector is present or not. */\r\n hasGC: bool = false;\r\n /** Garbage collector allocation function. */\r\n gcAllocateInstance: Function | null = null;\r\n /** Garbage collector link function called when a managed object is referenced from a parent. */\r\n gcLinkInstance: Function | null = null;\r\n /** Garbage collector mark function called to on reachable managed objects. */\r\n gcMarkInstance: Function | null = null;\r\n /** Size of a managed object header. */\r\n gcHeaderSize: u32 = 0;\r\n /** Offset of the GC hook. */\r\n gcHookOffset: u32 = 0;\r\n\r\n /** Currently processing filespace. */\r\n currentFilespace: Filespace;\r\n\r\n /** Constructs a new program, optionally inheriting parser diagnostics. */\r\n constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n super(diagnostics);\r\n this.resolver = new Resolver(this);\r\n this.sources = [];\r\n }\r\n\r\n /** Gets a source by its exact path. */\r\n getSource(normalizedPath: string): Source | null {\r\n var sources = this.sources;\r\n for (let i = 0, k = sources.length; i < k; ++i) {\r\n let source = sources[i];\r\n if (source.normalizedPath == normalizedPath) return source;\r\n }\r\n return null;\r\n }\r\n\r\n /** Looks up the source for the specified possibly ambiguous path. */\r\n lookupSourceByPath(normalizedPathWithoutExtension: string): Source | null {\r\n var tmp: string;\r\n return (\r\n this.getSource(normalizedPathWithoutExtension + \".ts\") ||\r\n this.getSource(normalizedPathWithoutExtension + \"/index.ts\") ||\r\n this.getSource((tmp = LIBRARY_PREFIX + normalizedPathWithoutExtension) + \".ts\") ||\r\n this.getSource( tmp + \"/index.ts\")\r\n );\r\n }\r\n\r\n /** Initializes the program and its elements prior to compilation. */\r\n initialize(options: Options): void {\r\n this.options = options;\r\n\r\n // add built-in types\r\n this.typesLookup = new Map([\r\n [\"i8\", Type.i8],\r\n [\"i16\", Type.i16],\r\n [\"i32\", Type.i32],\r\n [\"i64\", Type.i64],\r\n [\"isize\", options.isizeType],\r\n [\"u8\", Type.u8],\r\n [\"u16\", Type.u16],\r\n [\"u32\", Type.u32],\r\n [\"u64\", Type.u64],\r\n [\"usize\", options.usizeType],\r\n [\"bool\", Type.bool],\r\n [\"f32\", Type.f32],\r\n [\"f64\", Type.f64],\r\n [\"void\", Type.void],\r\n [\"number\", Type.f64],\r\n [\"boolean\", Type.bool]\r\n ]);\r\n if (options.hasFeature(Feature.SIMD)) this.typesLookup.set(\"v128\", Type.v128);\r\n\r\n // add compiler hints\r\n this.setConstantInteger(\"ASC_TARGET\", Type.i32,\r\n i64_new(options.isWasm64 ? 2 : 1));\r\n this.setConstantInteger(\"ASC_NO_TREESHAKING\", Type.bool,\r\n i64_new(options.noTreeShaking ? 1 : 0, 0));\r\n this.setConstantInteger(\"ASC_NO_ASSERT\", Type.bool,\r\n i64_new(options.noAssert ? 1 : 0, 0));\r\n this.setConstantInteger(\"ASC_MEMORY_BASE\", Type.i32,\r\n i64_new(options.memoryBase, 0));\r\n this.setConstantInteger(\"ASC_OPTIMIZE_LEVEL\", Type.i32,\r\n i64_new(options.optimizeLevelHint, 0));\r\n this.setConstantInteger(\"ASC_SHRINK_LEVEL\", Type.i32,\r\n i64_new(options.shrinkLevelHint, 0));\r\n this.setConstantInteger(\"ASC_FEATURE_MUTABLE_GLOBAL\", Type.bool,\r\n i64_new(options.hasFeature(Feature.MUTABLE_GLOBAL) ? 1 : 0, 0));\r\n this.setConstantInteger(\"ASC_FEATURE_SIGN_EXTENSION\", Type.bool,\r\n i64_new(options.hasFeature(Feature.SIGN_EXTENSION) ? 1 : 0, 0));\r\n this.setConstantInteger(\"ASC_FEATURE_BULK_MEMORY\", Type.bool,\r\n i64_new(options.hasFeature(Feature.BULK_MEMORY) ? 1 : 0, 0));\r\n this.setConstantInteger(\"ASC_FEATURE_SIMD\", Type.bool,\r\n i64_new(options.hasFeature(Feature.SIMD) ? 1 : 0, 0));\r\n\r\n // remember deferred elements\r\n var queuedImports = new Array();\r\n var queuedExports = new Map();\r\n var queuedExtends = new Array();\r\n var queuedImplements = new Array();\r\n\r\n // build initial lookup maps of internal names to declarations\r\n for (let i = 0, k = this.sources.length; i < k; ++i) {\r\n let source = this.sources[i];\r\n\r\n // create one filespace per source\r\n let filespace = new Filespace(this, source);\r\n this.elementsLookup.set(filespace.internalName, filespace);\r\n this.currentFilespace = filespace;\r\n\r\n // process this source's statements\r\n let statements = source.statements;\r\n for (let j = 0, l = statements.length; j < l; ++j) {\r\n let statement = statements[j];\r\n switch (statement.kind) {\r\n case NodeKind.CLASSDECLARATION: {\r\n this.initializeClass(statement, queuedExtends, queuedImplements);\r\n break;\r\n }\r\n case NodeKind.ENUMDECLARATION: {\r\n this.initializeEnum(statement);\r\n break;\r\n }\r\n case NodeKind.EXPORT: {\r\n this.initializeExports(statement, queuedExports);\r\n break;\r\n }\r\n case NodeKind.FUNCTIONDECLARATION: {\r\n this.initializeFunction(statement);\r\n break;\r\n }\r\n case NodeKind.IMPORT: {\r\n this.initializeImports(statement, queuedExports, queuedImports);\r\n break;\r\n }\r\n case NodeKind.INTERFACEDECLARATION: {\r\n this.initializeInterface(statement);\r\n break;\r\n }\r\n case NodeKind.NAMESPACEDECLARATION: {\r\n this.initializeNamespace(statement, queuedExtends, queuedImplements);\r\n break;\r\n }\r\n case NodeKind.TYPEDECLARATION: {\r\n this.initializeTypeAlias(statement);\r\n break;\r\n }\r\n case NodeKind.VARIABLE: {\r\n this.initializeVariables(statement);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // queued imports should be resolvable now through traversing exports and queued exports\r\n for (let i = 0; i < queuedImports.length;) {\r\n let queuedImport = queuedImports[i];\r\n let declaration = queuedImport.declaration;\r\n if (declaration) { // named\r\n let element = this.tryLocateImport(queuedImport.externalName, queuedExports);\r\n if (element) {\r\n this.elementsLookup.set(queuedImport.localName, element);\r\n queuedImports.splice(i, 1);\r\n } else {\r\n if (element = this.tryLocateImport(queuedImport.externalNameAlt, queuedExports)) {\r\n this.elementsLookup.set(queuedImport.localName, element);\r\n queuedImports.splice(i, 1);\r\n } else {\r\n this.error(\r\n DiagnosticCode.Module_0_has_no_exported_member_1,\r\n declaration.range,\r\n (declaration.parent).path.value,\r\n declaration.externalName.text\r\n );\r\n ++i;\r\n }\r\n }\r\n } else { // filespace\r\n let element = this.elementsLookup.get(queuedImport.externalName);\r\n if (element) {\r\n this.elementsLookup.set(queuedImport.localName, element);\r\n queuedImports.splice(i, 1);\r\n } else {\r\n if (element = this.elementsLookup.get(queuedImport.externalNameAlt)) {\r\n this.elementsLookup.set(queuedImport.localName, element);\r\n queuedImports.splice(i, 1);\r\n } else {\r\n assert(false); // already reported by the parser not finding the file\r\n ++i;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // queued exports should be resolvable now that imports are finalized\r\n for (let [exportName, queuedExport] of queuedExports) {\r\n let currentExport: QueuedExport | null = queuedExport; // nullable below\r\n let element: Element | null;\r\n do {\r\n if (currentExport.isReExport) {\r\n if (element = this.fileLevelExports.get(currentExport.externalName)) {\r\n this.setExportAndCheckLibrary(\r\n exportName,\r\n element,\r\n queuedExport.member.externalName\r\n );\r\n break;\r\n }\r\n currentExport = queuedExports.get(currentExport.externalName);\r\n if (!currentExport) {\r\n this.error(\r\n DiagnosticCode.Module_0_has_no_exported_member_1,\r\n queuedExport.member.externalName.range,\r\n ((queuedExport.member.parent).path).value,\r\n queuedExport.member.externalName.text\r\n );\r\n }\r\n } else {\r\n if (\r\n // normal export\r\n (element = this.elementsLookup.get(currentExport.externalName)) ||\r\n // library re-export\r\n (element = this.elementsLookup.get(currentExport.member.name.text))\r\n ) {\r\n this.setExportAndCheckLibrary(\r\n exportName,\r\n element,\r\n queuedExport.member.externalName\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n queuedExport.member.range, queuedExport.member.name.text\r\n );\r\n }\r\n break;\r\n }\r\n } while (currentExport);\r\n }\r\n\r\n // resolve base prototypes of derived classes\r\n var resolver = this.resolver;\r\n for (let i = 0, k = queuedExtends.length; i < k; ++i) {\r\n let derivedPrototype = queuedExtends[i];\r\n let derivedDeclaration = derivedPrototype.declaration;\r\n let derivedType = assert(derivedDeclaration.extendsType);\r\n let baseElement = resolver.resolveIdentifier(derivedType.name, null, null); // reports\r\n if (!baseElement) continue;\r\n if (baseElement.kind == ElementKind.CLASS_PROTOTYPE) {\r\n let basePrototype = baseElement;\r\n derivedPrototype.basePrototype = basePrototype;\r\n } else {\r\n this.error(\r\n DiagnosticCode.A_class_may_only_extend_another_class,\r\n derivedType.range\r\n );\r\n }\r\n }\r\n\r\n // set up global aliases\r\n {\r\n let globalAliases = options.globalAliases;\r\n if (globalAliases) {\r\n for (let [alias, name] of globalAliases) {\r\n if (!name.length) continue; // explicitly disabled\r\n let element = this.elementsLookup.get(name);\r\n if (element) this.elementsLookup.set(alias, element);\r\n else throw new Error(\"element not found: \" + name);\r\n }\r\n }\r\n }\r\n\r\n // register 'ArrayBuffer'\r\n if (this.elementsLookup.has(\"ArrayBuffer\")) {\r\n let element = assert(this.elementsLookup.get(\"ArrayBuffer\"));\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n this.arrayBufferInstance = resolver.resolveClass(element, null);\r\n }\r\n\r\n // register 'Array'\r\n if (this.elementsLookup.has(\"Array\")) {\r\n let element = assert(this.elementsLookup.get(\"Array\"));\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n this.arrayPrototype = element;\r\n }\r\n\r\n // register 'String'\r\n if (this.elementsLookup.has(\"String\")) {\r\n let element = assert(this.elementsLookup.get(\"String\"));\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n let instance = resolver.resolveClass(element, null);\r\n if (instance) {\r\n if (this.typesLookup.has(\"string\")) {\r\n let declaration = (element).declaration;\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, declaration.programLevelInternalName\r\n );\r\n } else {\r\n this.stringInstance = instance;\r\n this.typesLookup.set(\"string\", instance.type);\r\n }\r\n }\r\n }\r\n\r\n // register classes backing basic types\r\n this.registerBasicClass(TypeKind.I8, \"I8\");\r\n this.registerBasicClass(TypeKind.I16, \"I16\");\r\n this.registerBasicClass(TypeKind.I32, \"I32\");\r\n this.registerBasicClass(TypeKind.I64, \"I64\");\r\n this.registerBasicClass(TypeKind.ISIZE, \"Isize\");\r\n this.registerBasicClass(TypeKind.U8, \"U8\");\r\n this.registerBasicClass(TypeKind.U16, \"U16\");\r\n this.registerBasicClass(TypeKind.U32, \"U32\");\r\n this.registerBasicClass(TypeKind.U64, \"U64\");\r\n this.registerBasicClass(TypeKind.USIZE, \"Usize\");\r\n this.registerBasicClass(TypeKind.BOOL, \"Bool\");\r\n this.registerBasicClass(TypeKind.F32, \"F32\");\r\n this.registerBasicClass(TypeKind.F64, \"F64\");\r\n if (options.hasFeature(Feature.SIMD)) this.registerBasicClass(TypeKind.V128, \"V128\");\r\n\r\n // register 'start'\r\n {\r\n let element = assert(this.elementsLookup.get(\"start\"));\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.startFunction = element;\r\n }\r\n\r\n // register 'main' if present\r\n if (this.moduleLevelExports.has(\"main\")) {\r\n let element = (this.moduleLevelExports.get(\"main\")).element;\r\n if (\r\n element.kind == ElementKind.FUNCTION_PROTOTYPE &&\r\n !(element).isAny(CommonFlags.GENERIC | CommonFlags.AMBIENT)\r\n ) {\r\n (element).set(CommonFlags.MAIN);\r\n this.mainFunction = element;\r\n }\r\n }\r\n\r\n // register 'abort' if present\r\n if (this.elementsLookup.has(\"abort\")) {\r\n let element = this.elementsLookup.get(\"abort\");\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let instance = this.resolver.resolveFunction(element, null);\r\n if (instance) this.abortInstance = instance;\r\n }\r\n\r\n // register 'memory.allocate' if present\r\n if (this.elementsLookup.has(\"memory\")) {\r\n let element = this.elementsLookup.get(\"memory\");\r\n let members = element.members;\r\n if (members) {\r\n if (members.has(\"allocate\")) {\r\n element = assert(members.get(\"allocate\"));\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let instance = this.resolver.resolveFunction(element, null);\r\n if (instance) this.memoryAllocateInstance = instance;\r\n }\r\n }\r\n }\r\n\r\n // register GC hooks if present\r\n if (\r\n this.elementsLookup.has(\"__gc_allocate\") &&\r\n this.elementsLookup.has(\"__gc_link\") &&\r\n this.elementsLookup.has(\"__gc_mark\")\r\n ) {\r\n // __gc_allocate(usize, (ref: usize) => void): usize\r\n let element = this.elementsLookup.get(\"__gc_allocate\");\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let gcAllocateInstance = assert(this.resolver.resolveFunction(element, null));\r\n let signature = gcAllocateInstance.signature;\r\n assert(signature.parameterTypes.length == 2);\r\n assert(signature.parameterTypes[0] == this.options.usizeType);\r\n assert(signature.parameterTypes[1].signatureReference);\r\n assert(signature.returnType == this.options.usizeType);\r\n\r\n // __gc_link(usize, usize): void\r\n element = this.elementsLookup.get(\"__gc_link\");\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let gcLinkInstance = assert(this.resolver.resolveFunction(element, null));\r\n signature = gcLinkInstance.signature;\r\n assert(signature.parameterTypes.length == 2);\r\n assert(signature.parameterTypes[0] == this.options.usizeType);\r\n assert(signature.parameterTypes[1] == this.options.usizeType);\r\n assert(signature.returnType == Type.void);\r\n\r\n // __gc_mark(usize): void\r\n element = this.elementsLookup.get(\"__gc_mark\");\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let gcMarkInstance = assert(this.resolver.resolveFunction(element, null));\r\n signature = gcMarkInstance.signature;\r\n assert(signature.parameterTypes.length == 1);\r\n assert(signature.parameterTypes[0] == this.options.usizeType);\r\n assert(signature.returnType == Type.void);\r\n\r\n this.gcAllocateInstance = gcAllocateInstance;\r\n this.gcLinkInstance = gcLinkInstance;\r\n this.gcMarkInstance = gcMarkInstance;\r\n let gcHookOffset = 2 * options.usizeType.byteSize; // .next + .prev\r\n this.gcHookOffset = gcHookOffset;\r\n this.gcHeaderSize = (gcHookOffset + 4 + 7) & ~7; // + .hook index + alignment\r\n this.hasGC = true;\r\n }\r\n }\r\n\r\n private registerBasicClass(typeKind: TypeKind, className: string): void {\r\n if (this.elementsLookup.has(className)) {\r\n let element = assert(this.elementsLookup.get(className));\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n let classElement = this.resolver.resolveClass(element, null);\r\n if (classElement) this.basicClasses.set(typeKind, classElement);\r\n }\r\n }\r\n\r\n /** Sets a constant integer value. */\r\n setConstantInteger(globalName: string, type: Type, value: I64): void {\r\n assert(type.is(TypeFlags.INTEGER));\r\n var global = new Global(this, globalName, globalName, type, null, DecoratorFlags.NONE)\r\n .withConstantIntegerValue(value);\r\n global.set(CommonFlags.RESOLVED);\r\n this.elementsLookup.set(globalName, global);\r\n }\r\n\r\n /** Sets a constant float value. */\r\n setConstantFloat(globalName: string, type: Type, value: f64): void {\r\n assert(type.is(TypeFlags.FLOAT));\r\n var global = new Global(this, globalName, globalName, type, null, DecoratorFlags.NONE)\r\n .withConstantFloatValue(value);\r\n global.set(CommonFlags.RESOLVED);\r\n this.elementsLookup.set(globalName, global);\r\n }\r\n\r\n /** Tries to locate an import by traversing exports and queued exports. */\r\n private tryLocateImport(\r\n externalName: string,\r\n queuedNamedExports: Map\r\n ): Element | null {\r\n var element: Element | null;\r\n var fileLevelExports = this.fileLevelExports;\r\n do {\r\n if (element = fileLevelExports.get(externalName)) return element;\r\n let queuedExport = queuedNamedExports.get(externalName);\r\n if (!queuedExport) break;\r\n if (queuedExport.isReExport) {\r\n externalName = queuedExport.externalName;\r\n continue;\r\n }\r\n return this.elementsLookup.get(queuedExport.externalName);\r\n } while (true);\r\n return null;\r\n }\r\n\r\n /** Checks that only supported decorators are present. */\r\n private checkDecorators(\r\n decorators: DecoratorNode[],\r\n acceptedFlags: DecoratorFlags\r\n ): DecoratorFlags {\r\n var presentFlags = DecoratorFlags.NONE;\r\n for (let i = 0, k = decorators.length; i < k; ++i) {\r\n let decorator = decorators[i];\r\n let kind = decoratorNameToKind(decorator.name);\r\n let flag = decoratorKindToFlag(kind);\r\n if (flag) {\r\n if (flag == DecoratorFlags.BUILTIN) {\r\n if (decorator.range.source.isLibrary) {\r\n presentFlags |= flag;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Decorator_0_is_not_valid_here,\r\n decorator.range, decorator.name.range.toString()\r\n );\r\n }\r\n } else if (!(acceptedFlags & flag)) {\r\n this.error(\r\n DiagnosticCode.Decorator_0_is_not_valid_here,\r\n decorator.range, decorator.name.range.toString()\r\n );\r\n } else if (presentFlags & flag) {\r\n this.error(\r\n DiagnosticCode.Duplicate_decorator,\r\n decorator.range, decorator.name.range.toString()\r\n );\r\n } else {\r\n presentFlags |= flag;\r\n }\r\n }\r\n }\r\n return presentFlags;\r\n }\r\n\r\n /** Checks and sets up global options of an element. */\r\n private checkGlobal(\r\n element: Element,\r\n declaration: DeclarationStatement\r\n ): void {\r\n var parentNode = declaration.parent;\r\n // alias globally if explicitly annotated @global or exported from a top-level library file\r\n if (\r\n (element.hasDecorator(DecoratorFlags.GLOBAL)) ||\r\n (\r\n declaration.range.source.isLibrary &&\r\n element.is(CommonFlags.EXPORT) &&\r\n (\r\n assert(parentNode).kind == NodeKind.SOURCE ||\r\n (\r\n parentNode).kind == NodeKind.VARIABLE &&\r\n assert((parentNode).parent).kind == NodeKind.SOURCE\r\n )\r\n )\r\n ) {\r\n let globalName = declaration.programLevelInternalName;\r\n if (this.elementsLookup.has(globalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, element.internalName\r\n );\r\n } else {\r\n this.elementsLookup.set(globalName, element);\r\n }\r\n }\r\n // builtins use the global name directly\r\n if (element.hasDecorator(DecoratorFlags.BUILTIN)) {\r\n element.internalName = declaration.programLevelInternalName;\r\n }\r\n }\r\n\r\n /** Initializes a class declaration. */\r\n private initializeClass(\r\n declaration: ClassDeclaration,\r\n queuedExtends: ClassPrototype[],\r\n queuedImplements: ClassPrototype[],\r\n namespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n\r\n var decorators = declaration.decorators;\r\n var simpleName = declaration.name.text;\r\n var prototype = new ClassPrototype(\r\n this,\r\n simpleName,\r\n internalName,\r\n declaration,\r\n decorators\r\n ? this.checkDecorators(decorators,\r\n DecoratorFlags.GLOBAL |\r\n DecoratorFlags.SEALED |\r\n DecoratorFlags.UNMANAGED\r\n )\r\n : DecoratorFlags.NONE\r\n );\r\n prototype.parent = namespace;\r\n this.elementsLookup.set(internalName, prototype);\r\n\r\n var implementsTypes = declaration.implementsTypes;\r\n if (implementsTypes) {\r\n let numImplementsTypes = implementsTypes.length;\r\n if (prototype.hasDecorator(DecoratorFlags.UNMANAGED)) {\r\n if (numImplementsTypes) {\r\n this.error(\r\n DiagnosticCode.Unmanaged_classes_cannot_implement_interfaces,\r\n Range.join(\r\n declaration.name.range,\r\n implementsTypes[numImplementsTypes - 1].range\r\n )\r\n );\r\n }\r\n\r\n // remember classes that implement interfaces\r\n } else if (numImplementsTypes) {\r\n for (let i = 0; i < numImplementsTypes; ++i) {\r\n this.warning( // TODO\r\n DiagnosticCode.Operation_not_supported,\r\n implementsTypes[i].range\r\n );\r\n }\r\n queuedImplements.push(prototype);\r\n }\r\n }\r\n\r\n // remember classes that extend another one\r\n if (declaration.extendsType) queuedExtends.push(prototype);\r\n\r\n // add as namespace member if applicable\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(simpleName, prototype);\r\n if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n\r\n // otherwise add to file-level exports if exported\r\n } else if (prototype.is(CommonFlags.EXPORT)) {\r\n if (this.fileLevelExports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.fileLevelExports.set(internalName, prototype);\r\n this.currentFilespace.members.set(simpleName, prototype);\r\n if (prototype.is(CommonFlags.EXPORT) && declaration.range.source.isEntry) {\r\n if (this.moduleLevelExports.has(simpleName)) {\r\n let existingExport = this.moduleLevelExports.get(simpleName);\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, existingExport.element.internalName\r\n );\r\n return;\r\n }\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n this.moduleLevelExports.set(simpleName, {\r\n element: prototype,\r\n identifier: declaration.name\r\n });\r\n }\r\n }\r\n\r\n // initialize members\r\n var memberDeclarations = declaration.members;\r\n for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n let memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n case NodeKind.FIELDDECLARATION: {\r\n this.initializeField(memberDeclaration, prototype);\r\n break;\r\n }\r\n case NodeKind.METHODDECLARATION: {\r\n if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\r\n this.initializeAccessor(memberDeclaration, prototype);\r\n } else {\r\n this.initializeMethod(memberDeclaration, prototype);\r\n }\r\n break;\r\n }\r\n case NodeKind.INDEXSIGNATUREDECLARATION: break; // ignored for now\r\n default: {\r\n assert(false); // should have been reported while parsing\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.checkGlobal(prototype, declaration);\r\n }\r\n\r\n /** Initializes a field of a class or interface. */\r\n private initializeField(\r\n declaration: FieldDeclaration,\r\n classPrototype: ClassPrototype\r\n ): void {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n var decorators = declaration.decorators;\r\n var isInterface = classPrototype.kind == ElementKind.INTERFACE_PROTOTYPE;\r\n\r\n // static fields become global variables\r\n if (declaration.is(CommonFlags.STATIC)) {\r\n if (isInterface) {\r\n // should have been reported while parsing\r\n assert(false);\r\n }\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.members = new Map();\r\n }\r\n let staticField = new Global(\r\n this,\r\n name,\r\n internalName,\r\n Type.void, // resolved later on\r\n declaration,\r\n decorators\r\n ? this.checkDecorators(decorators, DecoratorFlags.INLINE)\r\n : DecoratorFlags.NONE\r\n );\r\n staticField.parent = classPrototype;\r\n classPrototype.members.set(name, staticField);\r\n this.elementsLookup.set(internalName, staticField);\r\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n staticField.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n\r\n if (staticField.hasDecorator(DecoratorFlags.INLINE) && !staticField.is(CommonFlags.READONLY)) {\r\n this.error(\r\n DiagnosticCode.Decorator_0_is_not_valid_here,\r\n assert(findDecorator(DecoratorKind.INLINE, decorators)).range, \"inline\"\r\n );\r\n }\r\n\r\n // instance fields are remembered until resolved\r\n } else {\r\n if (isInterface) {\r\n // should have been reported while parsing\r\n assert(!declaration.isAny(CommonFlags.ABSTRACT | CommonFlags.GET | CommonFlags.SET));\r\n }\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n let instanceField = new FieldPrototype(\r\n classPrototype,\r\n name,\r\n internalName,\r\n declaration\r\n );\r\n if (decorators) this.checkDecorators(decorators, DecoratorFlags.NONE);\r\n classPrototype.instanceMembers.set(name, instanceField);\r\n }\r\n }\r\n\r\n /** Initializes a method of a class or interface. */\r\n private initializeMethod(\r\n declaration: MethodDeclaration,\r\n classPrototype: ClassPrototype\r\n ): void {\r\n var simpleName = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n var prototype: FunctionPrototype | null = null;\r\n\r\n var decorators = declaration.decorators;\r\n var decoratorFlags = DecoratorFlags.NONE;\r\n if (decorators) {\r\n decoratorFlags = this.checkDecorators(decorators,\r\n DecoratorFlags.OPERATOR_BINARY |\r\n DecoratorFlags.OPERATOR_PREFIX |\r\n DecoratorFlags.OPERATOR_POSTFIX |\r\n DecoratorFlags.INLINE\r\n );\r\n }\r\n\r\n // static methods become global functions\r\n if (declaration.is(CommonFlags.STATIC)) {\r\n assert(declaration.name.kind != NodeKind.CONSTRUCTOR);\r\n\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0, declaration.name.range,\r\n internalName\r\n );\r\n return;\r\n }\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.members = new Map();\r\n }\r\n prototype = new FunctionPrototype(\r\n this,\r\n simpleName,\r\n internalName,\r\n declaration,\r\n classPrototype,\r\n decoratorFlags\r\n );\r\n classPrototype.members.set(simpleName, prototype);\r\n this.elementsLookup.set(internalName, prototype);\r\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n\r\n // instance methods are remembered until resolved\r\n } else {\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n prototype = new FunctionPrototype(\r\n this,\r\n simpleName,\r\n internalName,\r\n declaration,\r\n classPrototype,\r\n decoratorFlags\r\n );\r\n // if (classPrototype.isUnmanaged && instancePrototype.isAbstract) {\r\n // this.error( Unmanaged classes cannot declare abstract methods. );\r\n // }\r\n if (declaration.name.kind == NodeKind.CONSTRUCTOR) {\r\n if (classPrototype.constructorPrototype) {\r\n this.error(\r\n DiagnosticCode.Multiple_constructor_implementations_are_not_allowed,\r\n declaration.name.range\r\n );\r\n } else {\r\n prototype.set(CommonFlags.CONSTRUCTOR);\r\n classPrototype.constructorPrototype = prototype;\r\n }\r\n } else {\r\n classPrototype.instanceMembers.set(simpleName, prototype);\r\n }\r\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n }\r\n\r\n this.checkOperatorOverloads(declaration.decorators, prototype, classPrototype);\r\n }\r\n\r\n private checkOperatorOverloads(\r\n decorators: DecoratorNode[] | null,\r\n prototype: FunctionPrototype,\r\n classPrototype: ClassPrototype\r\n ): void {\r\n if (decorators) {\r\n for (let i = 0, k = decorators.length; i < k; ++i) {\r\n let decorator = decorators[i];\r\n switch (decorator.decoratorKind) {\r\n case DecoratorKind.OPERATOR:\r\n case DecoratorKind.OPERATOR_BINARY:\r\n case DecoratorKind.OPERATOR_PREFIX:\r\n case DecoratorKind.OPERATOR_POSTFIX: {\r\n let numArgs = decorator.arguments && decorator.arguments.length || 0;\r\n if (numArgs == 1) {\r\n let firstArg = (decorator.arguments)[0];\r\n if (\r\n firstArg.kind == NodeKind.LITERAL &&\r\n (firstArg).literalKind == LiteralKind.STRING\r\n ) {\r\n let kind = operatorKindFromDecorator(\r\n decorator.decoratorKind,\r\n (firstArg).value\r\n );\r\n if (kind == OperatorKind.INVALID) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n firstArg.range\r\n );\r\n } else {\r\n let overloads = classPrototype.overloadPrototypes;\r\n if (overloads.has(kind)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_function_implementation,\r\n firstArg.range\r\n );\r\n } else {\r\n prototype.operatorKind = kind;\r\n overloads.set(kind, prototype);\r\n }\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n firstArg.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n decorator.range, \"1\", numArgs.toString(10)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private initializeAccessor(\r\n declaration: MethodDeclaration,\r\n classPrototype: ClassPrototype\r\n ): void {\r\n var simpleName = declaration.name.text;\r\n var internalPropertyName = declaration.fileLevelInternalName;\r\n var propertyElement = this.elementsLookup.get(internalPropertyName);\r\n var isGetter = declaration.is(CommonFlags.GET);\r\n var isNew = false;\r\n if (propertyElement) {\r\n if (\r\n propertyElement.kind != ElementKind.PROPERTY ||\r\n (isGetter\r\n ? (propertyElement).getterPrototype\r\n : (propertyElement).setterPrototype\r\n ) != null\r\n ) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalPropertyName\r\n );\r\n return;\r\n }\r\n } else {\r\n propertyElement = new Property(\r\n this,\r\n simpleName,\r\n internalPropertyName,\r\n classPrototype\r\n );\r\n isNew = true;\r\n }\r\n\r\n var decorators = declaration.decorators;\r\n var decoratorFlags = DecoratorFlags.NONE;\r\n if (decorators) {\r\n decoratorFlags = this.checkDecorators(decorators,\r\n DecoratorFlags.INLINE\r\n );\r\n }\r\n\r\n var baseName = (isGetter ? GETTER_PREFIX : SETTER_PREFIX) + simpleName;\r\n\r\n // static accessors become global functions\r\n if (declaration.is(CommonFlags.STATIC)) {\r\n let staticName = classPrototype.internalName + STATIC_DELIMITER + baseName;\r\n if (this.elementsLookup.has(staticName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, staticName\r\n );\r\n return;\r\n }\r\n let staticPrototype = new FunctionPrototype(\r\n this,\r\n baseName,\r\n staticName,\r\n declaration,\r\n null,\r\n decoratorFlags\r\n );\r\n if (isGetter) {\r\n (propertyElement).getterPrototype = staticPrototype;\r\n } else {\r\n (propertyElement).setterPrototype = staticPrototype;\r\n }\r\n if (isNew) {\r\n if (classPrototype.members) {\r\n if (classPrototype.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, staticName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.members = new Map();\r\n }\r\n classPrototype.members.set(simpleName, propertyElement); // check above\r\n } else {\r\n assert(classPrototype.members && classPrototype.members.has(simpleName));\r\n }\r\n this.elementsLookup.set(internalPropertyName, propertyElement);\r\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n propertyElement.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n\r\n // instance accessors are remembered until resolved\r\n } else {\r\n let instanceName = classPrototype.internalName + INSTANCE_DELIMITER + baseName;\r\n if (classPrototype.instanceMembers) {\r\n if (classPrototype.instanceMembers.has(baseName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalPropertyName\r\n );\r\n return;\r\n }\r\n } else {\r\n classPrototype.instanceMembers = new Map();\r\n }\r\n let instancePrototype = new FunctionPrototype(\r\n this,\r\n baseName,\r\n instanceName,\r\n declaration,\r\n classPrototype,\r\n decoratorFlags\r\n );\r\n if (isGetter) {\r\n (propertyElement).getterPrototype = instancePrototype;\r\n } else {\r\n (propertyElement).setterPrototype = instancePrototype;\r\n }\r\n classPrototype.instanceMembers.set(baseName, propertyElement);\r\n this.elementsLookup.set(internalPropertyName, propertyElement);\r\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\r\n propertyElement.set(CommonFlags.MODULE_EXPORT);\r\n instancePrototype.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n }\r\n }\r\n\r\n private initializeEnum(\r\n declaration: EnumDeclaration,\r\n namespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n var simpleName = declaration.name.text;\r\n var element = new Enum(this, simpleName, internalName, declaration);\r\n element.parent = namespace;\r\n this.elementsLookup.set(internalName, element);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(simpleName, element);\r\n if (namespace.is(CommonFlags.MODULE_EXPORT) && element.is(CommonFlags.EXPORT)) {\r\n element.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n } else if (element.is(CommonFlags.EXPORT)) { // no namespace\r\n if (this.fileLevelExports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.fileLevelExports.set(internalName, element);\r\n this.currentFilespace.members.set(simpleName, element);\r\n if (declaration.range.source.isEntry) {\r\n if (this.moduleLevelExports.has(simpleName)) {\r\n let existingExport = this.moduleLevelExports.get(simpleName);\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, existingExport.element.internalName\r\n );\r\n return;\r\n }\r\n element.set(CommonFlags.MODULE_EXPORT);\r\n this.moduleLevelExports.set(simpleName, {\r\n element,\r\n identifier: declaration.name\r\n });\r\n }\r\n }\r\n\r\n var values = declaration.values;\r\n for (let i = 0, k = values.length; i < k; ++i) {\r\n this.initializeEnumValue(values[i], element);\r\n }\r\n\r\n this.checkGlobal(element, declaration);\r\n }\r\n\r\n private initializeEnumValue(\r\n declaration: EnumValueDeclaration,\r\n enm: Enum\r\n ): void {\r\n var name = declaration.name.text;\r\n var internalName = declaration.fileLevelInternalName;\r\n if (enm.members) {\r\n if (enm.members.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n enm.members = new Map();\r\n }\r\n var value = new EnumValue(enm, this, name, internalName, declaration);\r\n enm.members.set(name, value);\r\n if (enm.is(CommonFlags.MODULE_EXPORT)) {\r\n value.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n }\r\n\r\n private initializeExports(\r\n statement: ExportStatement,\r\n queuedExports: Map\r\n ): void {\r\n var members = statement.members;\r\n if (members) { // named\r\n for (let i = 0, k = members.length; i < k; ++i) {\r\n this.initializeExport(members[i], statement.internalPath, queuedExports);\r\n }\r\n } else { // TODO: filespace\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.range\r\n );\r\n }\r\n }\r\n\r\n private setExportAndCheckLibrary(\r\n internalName: string,\r\n element: Element,\r\n externalIdentifier: IdentifierExpression\r\n ): void {\r\n // add to file-level exports\r\n this.fileLevelExports.set(internalName, element);\r\n\r\n // add to filespace\r\n var internalPath = externalIdentifier.range.source.internalPath;\r\n var prefix = FILESPACE_PREFIX + internalPath;\r\n var filespace = this.elementsLookup.get(prefix);\r\n if (!filespace) filespace = assert(this.elementsLookup.get(prefix + PATH_DELIMITER + \"index\"));\r\n assert(filespace.kind == ElementKind.FILESPACE);\r\n var simpleName = externalIdentifier.text;\r\n (filespace).members.set(simpleName, element);\r\n\r\n // add global alias if a top-level export of a library file\r\n var source = externalIdentifier.range.source;\r\n if (source.isLibrary) {\r\n if (this.elementsLookup.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n externalIdentifier.range, simpleName\r\n );\r\n } else {\r\n element.internalName = simpleName;\r\n this.elementsLookup.set(simpleName, element);\r\n }\r\n\r\n // add module level export if a top-level export of an entry file\r\n } else if (source.isEntry) {\r\n this.moduleLevelExports.set(externalIdentifier.text, {\r\n element,\r\n identifier: externalIdentifier\r\n });\r\n }\r\n }\r\n\r\n private initializeExport(\r\n member: ExportMember,\r\n internalPath: string | null,\r\n queuedExports: Map\r\n ): void {\r\n var externalName = member.range.source.internalPath + PATH_DELIMITER + member.externalName.text;\r\n if (this.fileLevelExports.has(externalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.externalName.range, externalName\r\n );\r\n return;\r\n }\r\n var referencedName: string;\r\n var referencedElement: Element | null;\r\n var queuedExport: QueuedExport | null;\r\n\r\n // export local element\r\n if (internalPath == null) {\r\n referencedName = member.range.source.internalPath + PATH_DELIMITER + member.name.text;\r\n\r\n // resolve right away if the element exists\r\n if (this.elementsLookup.has(referencedName)) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n this.elementsLookup.get(referencedName),\r\n member.externalName\r\n );\r\n return;\r\n }\r\n\r\n // otherwise queue it\r\n if (queuedExports.has(externalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.externalName.range, externalName\r\n );\r\n return;\r\n }\r\n queuedExport = new QueuedExport();\r\n queuedExport.isReExport = false;\r\n queuedExport.externalName = referencedName; // -> here: local name\r\n queuedExport.member = member;\r\n queuedExports.set(externalName, queuedExport);\r\n\r\n // export external element\r\n } else {\r\n referencedName = internalPath + PATH_DELIMITER + member.name.text;\r\n\r\n // resolve right away if the export exists\r\n referencedElement = this.elementsLookup.get(referencedName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n\r\n // walk already known queued exports\r\n let seen = new Set();\r\n while (queuedExport = queuedExports.get(referencedName)) {\r\n if (queuedExport.isReExport) {\r\n referencedElement = this.fileLevelExports.get(queuedExport.externalName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n referencedName = queuedExport.externalName;\r\n if (seen.has(queuedExport)) break;\r\n seen.add(queuedExport);\r\n } else {\r\n referencedElement = this.elementsLookup.get(queuedExport.externalName);\r\n if (referencedElement) {\r\n this.setExportAndCheckLibrary(\r\n externalName,\r\n referencedElement,\r\n member.externalName\r\n );\r\n return;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // otherwise queue it\r\n if (queuedExports.has(externalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.externalName.range, externalName\r\n );\r\n return;\r\n }\r\n queuedExport = new QueuedExport();\r\n queuedExport.isReExport = true;\r\n queuedExport.externalName = referencedName; // -> here: external name\r\n queuedExport.member = member;\r\n queuedExports.set(externalName, queuedExport);\r\n }\r\n }\r\n\r\n private initializeFunction(\r\n declaration: FunctionDeclaration,\r\n namespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n var simpleName = declaration.name.text;\r\n var decorators = declaration.decorators;\r\n var prototype = new FunctionPrototype(\r\n this,\r\n simpleName,\r\n internalName,\r\n declaration,\r\n null,\r\n decorators\r\n ? this.checkDecorators(decorators,\r\n DecoratorFlags.GLOBAL |\r\n DecoratorFlags.INLINE |\r\n DecoratorFlags.EXTERNAL\r\n )\r\n : DecoratorFlags.NONE\r\n );\r\n prototype.parent = namespace;\r\n this.elementsLookup.set(internalName, prototype);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(simpleName, prototype);\r\n if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\r\n prototype.parent = namespace;\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n } else if (prototype.is(CommonFlags.EXPORT)) { // no namespace\r\n if (this.fileLevelExports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.fileLevelExports.set(internalName, prototype);\r\n this.currentFilespace.members.set(simpleName, prototype);\r\n if (declaration.range.source.isEntry) {\r\n if (this.moduleLevelExports.has(simpleName)) {\r\n let existingExport = this.moduleLevelExports.get(simpleName);\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, existingExport.element.internalName\r\n );\r\n return;\r\n }\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n this.moduleLevelExports.set(simpleName, {\r\n element: prototype,\r\n identifier: declaration.name\r\n });\r\n }\r\n }\r\n\r\n this.checkGlobal(prototype, declaration);\r\n }\r\n\r\n private initializeImports(\r\n statement: ImportStatement,\r\n queuedExports: Map,\r\n queuedImports: QueuedImport[]\r\n ): void {\r\n var declarations = statement.declarations;\r\n if (declarations) {\r\n for (let i = 0, k = declarations.length; i < k; ++i) {\r\n this.initializeImport(\r\n declarations[i],\r\n statement.internalPath,\r\n queuedExports, queuedImports\r\n );\r\n }\r\n } else if (statement.namespaceName) { // import * as simpleName from \"file\"\r\n let simpleName = statement.namespaceName.text;\r\n let internalName = (\r\n statement.range.source.internalPath +\r\n PATH_DELIMITER +\r\n simpleName\r\n );\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n statement.namespaceName.range,\r\n internalName\r\n );\r\n return;\r\n }\r\n\r\n // resolve right away if the exact filespace exists\r\n let filespace = this.elementsLookup.get(statement.internalPath);\r\n if (filespace) {\r\n this.elementsLookup.set(internalName, filespace);\r\n return;\r\n }\r\n\r\n // otherwise queue it\r\n let queuedImport = new QueuedImport();\r\n queuedImport.localName = internalName;\r\n let externalName = FILESPACE_PREFIX + statement.internalPath;\r\n queuedImport.externalName = externalName;\r\n queuedImport.externalNameAlt = externalName + PATH_DELIMITER + \"index\";\r\n queuedImport.declaration = null; // filespace\r\n queuedImports.push(queuedImport);\r\n }\r\n }\r\n\r\n private initializeImport(\r\n declaration: ImportDeclaration,\r\n internalPath: string,\r\n queuedNamedExports: Map,\r\n queuedImports: QueuedImport[]\r\n ): void {\r\n var localName = declaration.fileLevelInternalName;\r\n if (this.elementsLookup.has(localName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, localName\r\n );\r\n return;\r\n }\r\n\r\n var externalName = internalPath + PATH_DELIMITER + declaration.externalName.text;\r\n\r\n // resolve right away if the exact export exists\r\n var element: Element | null;\r\n if (element = this.fileLevelExports.get(externalName)) {\r\n this.elementsLookup.set(localName, element);\r\n return;\r\n }\r\n\r\n // otherwise queue it\r\n const indexPart = PATH_DELIMITER + \"index\";\r\n var queuedImport = new QueuedImport();\r\n queuedImport.localName = localName;\r\n if (internalPath.endsWith(indexPart)) {\r\n queuedImport.externalName = externalName; // try exact first\r\n queuedImport.externalNameAlt = (\r\n internalPath.substring(0, internalPath.length - indexPart.length + 1) +\r\n declaration.externalName.text\r\n );\r\n } else {\r\n queuedImport.externalName = externalName; // try exact first\r\n queuedImport.externalNameAlt = (\r\n internalPath +\r\n indexPart +\r\n PATH_DELIMITER +\r\n declaration.externalName.text\r\n );\r\n }\r\n queuedImport.declaration = declaration; // named\r\n queuedImports.push(queuedImport);\r\n }\r\n\r\n private initializeInterface(declaration: InterfaceDeclaration, namespace: Element | null = null): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n\r\n var decorators = declaration.decorators;\r\n var simpleName = declaration.name.text;\r\n var prototype = new InterfacePrototype(\r\n this,\r\n simpleName,\r\n internalName,\r\n declaration,\r\n decorators\r\n ? this.checkDecorators(decorators, DecoratorFlags.GLOBAL)\r\n : DecoratorFlags.NONE\r\n );\r\n prototype.parent = namespace;\r\n this.elementsLookup.set(internalName, prototype);\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(prototype.internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(prototype.internalName, prototype);\r\n if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n } else if (prototype.is(CommonFlags.EXPORT)) { // no namespace\r\n if (this.fileLevelExports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n this.fileLevelExports.set(internalName, prototype);\r\n this.currentFilespace.members.set(simpleName, prototype);\r\n if (declaration.range.source.isEntry) {\r\n if (this.moduleLevelExports.has(simpleName)) {\r\n let existingExport = this.moduleLevelExports.get(simpleName);\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, existingExport.element.internalName\r\n );\r\n return;\r\n }\r\n prototype.set(CommonFlags.MODULE_EXPORT);\r\n this.moduleLevelExports.set(simpleName, {\r\n element: prototype,\r\n identifier: declaration.name\r\n });\r\n }\r\n }\r\n\r\n var memberDeclarations = declaration.members;\r\n for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n let memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n\r\n case NodeKind.FIELDDECLARATION: {\r\n this.initializeField(memberDeclaration, prototype);\r\n break;\r\n }\r\n case NodeKind.METHODDECLARATION: {\r\n if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\r\n this.initializeAccessor(memberDeclaration, prototype);\r\n } else {\r\n this.initializeMethod(memberDeclaration, prototype);\r\n }\r\n break;\r\n }\r\n default: {\r\n throw new Error(\"interface member expected\");\r\n }\r\n }\r\n }\r\n\r\n this.checkGlobal(prototype, declaration);\r\n }\r\n\r\n private initializeNamespace(\r\n declaration: NamespaceDeclaration,\r\n queuedExtends: ClassPrototype[],\r\n queuedImplements: ClassPrototype[],\r\n parentNamespace: Element | null = null\r\n ): void {\r\n var internalName = declaration.fileLevelInternalName;\r\n var simpleName = declaration.name.text;\r\n var namespace = this.elementsLookup.get(internalName);\r\n if (!namespace) {\r\n namespace = new Namespace(this, simpleName, internalName, declaration);\r\n namespace.parent = parentNamespace;\r\n this.elementsLookup.set(internalName, namespace);\r\n this.checkGlobal(namespace, declaration);\r\n }\r\n\r\n if (parentNamespace) {\r\n if (parentNamespace.members) {\r\n if (parentNamespace.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n parentNamespace.members = new Map();\r\n }\r\n parentNamespace.members.set(simpleName, namespace);\r\n if (parentNamespace.is(CommonFlags.MODULE_EXPORT) && namespace.is(CommonFlags.EXPORT)) {\r\n namespace.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n } else if (namespace.is(CommonFlags.EXPORT)) { // no parent namespace\r\n let existingExport = this.fileLevelExports.get(internalName);\r\n if (existingExport) {\r\n if (!existingExport.is(CommonFlags.EXPORT)) {\r\n this.error(\r\n DiagnosticCode.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local,\r\n declaration.name.range, namespace.internalName\r\n ); // recoverable\r\n }\r\n namespace = existingExport; // join\r\n } else {\r\n this.fileLevelExports.set(internalName, namespace);\r\n }\r\n this.currentFilespace.members.set(simpleName, namespace);\r\n if (declaration.range.source.isEntry) {\r\n if (this.moduleLevelExports.has(simpleName)) {\r\n let existingExport = this.moduleLevelExports.get(simpleName);\r\n if (existingExport.element !== namespace) { // not merged\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, existingExport.element.internalName\r\n );\r\n return;\r\n }\r\n } else {\r\n this.moduleLevelExports.set(simpleName, {\r\n element: namespace,\r\n identifier: declaration.name\r\n });\r\n }\r\n namespace.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n }\r\n\r\n var members = declaration.members;\r\n for (let i = 0, k = members.length; i < k; ++i) {\r\n switch (members[i].kind) {\r\n case NodeKind.CLASSDECLARATION: {\r\n this.initializeClass(members[i], queuedExtends, queuedImplements, namespace);\r\n break;\r\n }\r\n case NodeKind.ENUMDECLARATION: {\r\n this.initializeEnum(members[i], namespace);\r\n break;\r\n }\r\n case NodeKind.FUNCTIONDECLARATION: {\r\n this.initializeFunction(members[i], namespace);\r\n break;\r\n }\r\n case NodeKind.INTERFACEDECLARATION: {\r\n this.initializeInterface(members[i], namespace);\r\n break;\r\n }\r\n case NodeKind.NAMESPACEDECLARATION: {\r\n this.initializeNamespace(members[i], queuedExtends, queuedImplements, namespace);\r\n break;\r\n }\r\n case NodeKind.TYPEDECLARATION: {\r\n // this.initializeTypeAlias(members[i], namespace);\r\n // TODO: what about namespaced types?\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n members[i].range\r\n );\r\n break;\r\n }\r\n case NodeKind.VARIABLE: {\r\n this.initializeVariables(members[i], namespace);\r\n break;\r\n }\r\n default: {\r\n throw new Error(\"namespace member expected\");\r\n }\r\n }\r\n }\r\n }\r\n\r\n private initializeTypeAlias(declaration: TypeDeclaration, namespace: Element | null = null): void {\r\n // type aliases are program globals\r\n // TODO: what about namespaced types?\r\n var name = declaration.name.text;\r\n if (this.typesLookup.has(name) || this.typeAliases.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, name\r\n );\r\n return;\r\n }\r\n var alias = new TypeAlias();\r\n alias.typeParameters = declaration.typeParameters;\r\n alias.type = declaration.type;\r\n this.typeAliases.set(name, alias);\r\n }\r\n\r\n private initializeVariables(statement: VariableStatement, namespace: Element | null = null): void {\r\n var declarations = statement.declarations;\r\n for (let i = 0, k = declarations.length; i < k; ++i) {\r\n let declaration = declarations[i];\r\n let decorators = declaration.decorators;\r\n let internalName = declaration.fileLevelInternalName;\r\n if (this.elementsLookup.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n continue;\r\n }\r\n let simpleName = declaration.name.text;\r\n let global = new Global(\r\n this,\r\n simpleName,\r\n internalName,\r\n Type.void, // resolved later on\r\n declaration,\r\n decorators\r\n ? this.checkDecorators(decorators,\r\n DecoratorFlags.GLOBAL |\r\n DecoratorFlags.INLINE |\r\n DecoratorFlags.EXTERNAL\r\n )\r\n : DecoratorFlags.NONE\r\n );\r\n global.parent = namespace;\r\n this.elementsLookup.set(internalName, global);\r\n\r\n if (global.hasDecorator(DecoratorFlags.INLINE) && !global.is(CommonFlags.CONST)) {\r\n this.error(\r\n DiagnosticCode.Decorator_0_is_not_valid_here,\r\n assert(findDecorator(DecoratorKind.INLINE, decorators)).range, \"inline\"\r\n );\r\n }\r\n\r\n if (namespace) {\r\n if (namespace.members) {\r\n if (namespace.members.has(simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n continue;\r\n }\r\n } else {\r\n namespace.members = new Map();\r\n }\r\n namespace.members.set(simpleName, global);\r\n if (namespace.is(CommonFlags.MODULE_EXPORT) && global.is(CommonFlags.EXPORT)) {\r\n global.set(CommonFlags.MODULE_EXPORT);\r\n }\r\n } else if (global.is(CommonFlags.EXPORT)) { // no namespace\r\n if (this.fileLevelExports.has(internalName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, internalName\r\n );\r\n } else {\r\n this.fileLevelExports.set(internalName, global);\r\n }\r\n this.currentFilespace.members.set(simpleName, global);\r\n if (declaration.range.source.isEntry) {\r\n if (this.moduleLevelExports.has(simpleName)) {\r\n let existingExport = this.moduleLevelExports.get(simpleName);\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, existingExport.element.internalName\r\n );\r\n continue;\r\n }\r\n global.set(CommonFlags.MODULE_EXPORT);\r\n this.moduleLevelExports.set(simpleName, {\r\n element: global,\r\n identifier: declaration.name\r\n });\r\n }\r\n }\r\n this.checkGlobal(global, declaration);\r\n }\r\n }\r\n}\r\n\r\n/** Indicates the specific kind of an {@link Element}. */\r\nexport enum ElementKind {\r\n /** A {@link Global}. */\r\n GLOBAL,\r\n /** A {@link Local}. */\r\n LOCAL,\r\n /** An {@link Enum}. */\r\n ENUM,\r\n /** An {@link EnumValue}. */\r\n ENUMVALUE,\r\n /** A {@link FunctionPrototype}. */\r\n FUNCTION_PROTOTYPE,\r\n /** A {@link Function}. */\r\n FUNCTION,\r\n /** A {@link FunctionTarget}. */\r\n FUNCTION_TARGET,\r\n /** A {@link ClassPrototype}. */\r\n CLASS_PROTOTYPE,\r\n /** A {@link Class}. */\r\n CLASS,\r\n /** An {@link InterfacePrototype}. */\r\n INTERFACE_PROTOTYPE,\r\n /** An {@link Interface}. */\r\n INTERFACE,\r\n /** A {@link FieldPrototype}. */\r\n FIELD_PROTOTYPE,\r\n /** A {@link Field}. */\r\n FIELD,\r\n /** A {@link Property}. */\r\n PROPERTY,\r\n /** A {@link Namespace}. */\r\n NAMESPACE,\r\n /** A {@link Filespace}. */\r\n FILESPACE,\r\n}\r\n\r\nexport enum DecoratorFlags {\r\n /** No flags set. */\r\n NONE = 0,\r\n /** Is a program global. */\r\n GLOBAL = 1 << 0,\r\n /** Is a binary operator overload. */\r\n OPERATOR_BINARY = 1 << 1,\r\n /** Is a unary prefix operator overload. */\r\n OPERATOR_PREFIX = 1 << 2,\r\n /** Is a unary postfix operator overload. */\r\n OPERATOR_POSTFIX = 1 << 3,\r\n /** Is an unmanaged class. */\r\n UNMANAGED = 1 << 4,\r\n /** Is a sealed class. */\r\n SEALED = 1 << 5,\r\n /** Is always inlined. */\r\n INLINE = 1 << 6,\r\n /** Is using a different external name. */\r\n EXTERNAL = 1 << 7,\r\n /** Is a builtin. */\r\n BUILTIN = 1 << 8\r\n}\r\n\r\nexport function decoratorKindToFlag(kind: DecoratorKind): DecoratorFlags {\r\n switch (kind) {\r\n case DecoratorKind.GLOBAL: return DecoratorFlags.GLOBAL;\r\n case DecoratorKind.OPERATOR:\r\n case DecoratorKind.OPERATOR_BINARY: return DecoratorFlags.OPERATOR_BINARY;\r\n case DecoratorKind.OPERATOR_PREFIX: return DecoratorFlags.OPERATOR_PREFIX;\r\n case DecoratorKind.OPERATOR_POSTFIX: return DecoratorFlags.OPERATOR_POSTFIX;\r\n case DecoratorKind.UNMANAGED: return DecoratorFlags.UNMANAGED;\r\n case DecoratorKind.SEALED: return DecoratorFlags.SEALED;\r\n case DecoratorKind.INLINE: return DecoratorFlags.INLINE;\r\n case DecoratorKind.EXTERNAL: return DecoratorFlags.EXTERNAL;\r\n case DecoratorKind.BUILTIN: return DecoratorFlags.BUILTIN;\r\n default: return DecoratorFlags.NONE;\r\n }\r\n}\r\n\r\n/** Base class of all program elements. */\r\nexport abstract class Element {\r\n\r\n /** Specific element kind. */\r\n kind: ElementKind;\r\n /** Containing {@link Program}. */\r\n program: Program;\r\n /** Simple name. */\r\n simpleName: string;\r\n /** Internal name referring to this element. */\r\n internalName: string;\r\n /** Common flags indicating specific traits. */\r\n flags: CommonFlags = CommonFlags.NONE;\r\n /** Decorator flags indicating annotated traits. */\r\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE;\r\n /** Namespaced member elements. */\r\n members: Map | null = null;\r\n /** Parent element, if applicable. */\r\n parent: Element | null = null;\r\n\r\n /** Constructs a new element, linking it to its containing {@link Program}. */\r\n protected constructor(program: Program, simpleName: string, internalName: string) {\r\n this.program = program;\r\n this.simpleName = simpleName;\r\n this.internalName = internalName;\r\n }\r\n\r\n /** Tests if this element has a specific flag or flags. */\r\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\r\n /** Tests if this element has any of the specified flags. */\r\n isAny(flags: CommonFlags): bool { return (this.flags & flags) != 0; }\r\n /** Sets a specific flag or flags. */\r\n set(flag: CommonFlags): void { this.flags |= flag; }\r\n /** Tests if this element has a specific decorator flag or flags. */\r\n hasDecorator(flag: DecoratorFlags): bool { return (this.decoratorFlags & flag) == flag; }\r\n}\r\n\r\n/** A filespace representing the implicit top-level namespace of a source. */\r\nexport class Filespace extends Element {\r\n\r\n kind = ElementKind.FILESPACE;\r\n\r\n /** File members (externally visible only). */\r\n members: Map; // more specific\r\n\r\n /** Constructs a new filespace. */\r\n constructor(\r\n program: Program,\r\n source: Source\r\n ) {\r\n super(program, source.internalPath, FILESPACE_PREFIX + source.internalPath);\r\n this.members = new Map();\r\n }\r\n}\r\n\r\n/** A namespace that differs from a filespace in being user-declared with a name. */\r\nexport class Namespace extends Element {\r\n\r\n // All elements have namespace semantics. This is an explicitly declared one.\r\n kind = ElementKind.NAMESPACE;\r\n\r\n /** Declaration reference. */\r\n declaration: NamespaceDeclaration; // more specific\r\n\r\n /** Constructs a new namespace. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: NamespaceDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n this.flags = declaration.flags;\r\n }\r\n}\r\n\r\n/** An enum. */\r\nexport class Enum extends Element {\r\n\r\n kind = ElementKind.ENUM;\r\n\r\n /** Declaration reference. */\r\n declaration: EnumDeclaration;\r\n\r\n /** Constructs a new enum. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: EnumDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n this.flags = declaration.flags;\r\n }\r\n}\r\n\r\n/** An enum value. */\r\nexport class EnumValue extends Element {\r\n\r\n kind = ElementKind.ENUMVALUE;\r\n\r\n /** Declaration reference. */\r\n declaration: EnumValueDeclaration;\r\n /** Constant value, if applicable. */\r\n constantValue: i32 = 0;\r\n\r\n constructor(\r\n enm: Enum,\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: EnumValueDeclaration\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.parent = enm;\r\n this.declaration = declaration;\r\n }\r\n}\r\n\r\nexport const enum ConstantValueKind {\r\n NONE,\r\n INTEGER,\r\n FLOAT\r\n}\r\n\r\nexport class VariableLikeElement extends Element {\r\n\r\n // kind varies\r\n\r\n /** Declaration reference. */\r\n declaration: VariableLikeDeclarationStatement | null;\r\n /** Variable type. Is {@link Type.void} for type-inferred {@link Global}s before compilation. */\r\n type: Type;\r\n /** Constant value kind. */\r\n constantValueKind: ConstantValueKind = ConstantValueKind.NONE;\r\n /** Constant integer value, if applicable. */\r\n constantIntegerValue: I64;\r\n /** Constant float value, if applicable. */\r\n constantFloatValue: f64;\r\n\r\n protected constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n type: Type,\r\n declaration: VariableLikeDeclarationStatement | null\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.type = type;\r\n this.declaration = declaration;\r\n }\r\n\r\n withConstantIntegerValue(value: I64): this {\r\n this.constantValueKind = ConstantValueKind.INTEGER;\r\n this.constantIntegerValue = value;\r\n this.set(CommonFlags.CONST | CommonFlags.INLINED);\r\n return this;\r\n }\r\n\r\n withConstantFloatValue(value: f64): this {\r\n this.constantValueKind = ConstantValueKind.FLOAT;\r\n this.constantFloatValue = value;\r\n this.set(CommonFlags.CONST | CommonFlags.INLINED);\r\n return this;\r\n }\r\n}\r\n\r\n/** A global variable. */\r\nexport class Global extends VariableLikeElement {\r\n\r\n kind = ElementKind.GLOBAL;\r\n\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n type: Type,\r\n declaration: VariableLikeDeclarationStatement | null,\r\n decoratorFlags: DecoratorFlags\r\n ) {\r\n super(program, simpleName, internalName, type, declaration);\r\n this.flags = declaration ? declaration.flags : CommonFlags.NONE;\r\n this.decoratorFlags = decoratorFlags;\r\n this.type = type; // resolved later if `void`\r\n }\r\n}\r\n\r\n/** A function parameter. */\r\nexport class Parameter {\r\n\r\n // not an Element on its own\r\n\r\n /** Parameter name. */\r\n name: string;\r\n /** Parameter type. */\r\n type: Type;\r\n /** Parameter initializer. */\r\n initializer: Expression | null;\r\n\r\n /** Constructs a new function parameter. */\r\n constructor(name: string, type: Type, initializer: Expression | null = null) {\r\n this.name = name;\r\n this.type = type;\r\n this.initializer = initializer;\r\n }\r\n}\r\n\r\n/** A function local. */\r\nexport class Local extends VariableLikeElement {\r\n\r\n kind = ElementKind.LOCAL;\r\n\r\n /** Local index. */\r\n index: i32;\r\n /** Respective scoped global, if any. */\r\n scopedGlobal: Global | null = null;\r\n\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n index: i32,\r\n type: Type,\r\n declaration: VariableLikeDeclarationStatement | null = null\r\n ) {\r\n super(program, simpleName, simpleName, type, declaration);\r\n this.index = index;\r\n }\r\n}\r\n\r\n/** A yet unresolved function prototype. */\r\nexport class FunctionPrototype extends Element {\r\n\r\n kind = ElementKind.FUNCTION_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: FunctionDeclaration;\r\n /** If an instance method, the class prototype reference. */\r\n classPrototype: ClassPrototype | null;\r\n /** Resolved instances by class type arguments and function type arguments. */\r\n instances: Map> = new Map();\r\n /** Class type arguments, if a partially resolved method of a generic class. Not set otherwise. */\r\n classTypeArguments: Type[] | null = null;\r\n /** Operator kind, if an overload. */\r\n operatorKind: OperatorKind = OperatorKind.INVALID;\r\n\r\n /** Constructs a new function prototype. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: FunctionDeclaration,\r\n classPrototype: ClassPrototype | null = null,\r\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n this.flags = declaration.flags;\r\n this.classPrototype = classPrototype;\r\n this.decoratorFlags = decoratorFlags;\r\n }\r\n\r\n /** Applies class type arguments to the context of a partially resolved instance method. */\r\n applyClassTypeArguments(contextualTypeArguments: Map): void {\r\n var classTypeArguments = assert(this.classTypeArguments); // set only if partial\r\n var classDeclaration = assert(this.classPrototype).declaration;\r\n var classTypeParameters = classDeclaration.typeParameters;\r\n var numClassTypeParameters = classTypeParameters.length;\r\n assert(numClassTypeParameters == classTypeArguments.length);\r\n for (let i = 0; i < numClassTypeParameters; ++i) {\r\n contextualTypeArguments.set(\r\n classTypeParameters[i].name.text,\r\n classTypeArguments[i]\r\n );\r\n }\r\n }\r\n\r\n toString(): string { return this.simpleName; }\r\n}\r\n\r\n/** A resolved function. */\r\nexport class Function extends Element {\r\n\r\n kind = ElementKind.FUNCTION;\r\n\r\n /** Prototype reference. */\r\n prototype: FunctionPrototype;\r\n /** Function signature. */\r\n signature: Signature;\r\n /** Map of locals by name. */\r\n localsByName: Map = new Map();\r\n /** Array of locals by index. */\r\n localsByIndex: Local[] = [];\r\n /** List of additional non-parameter locals. */\r\n additionalLocals: Type[] = [];\r\n /** Contextual type arguments. */\r\n contextualTypeArguments: Map | null;\r\n /** Current control flow. */\r\n flow: Flow;\r\n /** Remembered debug locations. */\r\n debugLocations: Range[] = [];\r\n /** Function reference, if compiled. */\r\n ref: FunctionRef = 0;\r\n /** Function table index, if any. */\r\n functionTableIndex: i32 = -1;\r\n /** Trampoline function for calling with omitted arguments. */\r\n trampoline: Function | null = null;\r\n /** The outer scope, if a function expression. */\r\n outerScope: Flow | null = null;\r\n\r\n nextInlineId: i32 = 0;\r\n\r\n /** Constructs a new concrete function. */\r\n constructor(\r\n prototype: FunctionPrototype,\r\n internalName: string,\r\n signature: Signature,\r\n parent: Element | null = null,\r\n contextualTypeArguments: Map | null = null\r\n ) {\r\n super(prototype.program, prototype.simpleName, internalName);\r\n this.prototype = prototype;\r\n this.signature = signature;\r\n this.parent = parent;\r\n this.flags = prototype.flags;\r\n this.decoratorFlags = prototype.decoratorFlags;\r\n this.contextualTypeArguments = contextualTypeArguments;\r\n if (!prototype.is(CommonFlags.AMBIENT)) {\r\n let localIndex = 0;\r\n if (parent && parent.kind == ElementKind.CLASS) {\r\n let local = new Local(\r\n prototype.program,\r\n \"this\",\r\n localIndex++,\r\n assert(signature.thisType)\r\n );\r\n this.localsByName.set(\"this\", local);\r\n this.localsByIndex[local.index] = local;\r\n let inheritedTypeArguments = (parent).contextualTypeArguments;\r\n if (inheritedTypeArguments) {\r\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n for (let [inheritedName, inheritedType] of inheritedTypeArguments) {\r\n if (!this.contextualTypeArguments.has(inheritedName)) {\r\n this.contextualTypeArguments.set(inheritedName, inheritedType);\r\n }\r\n }\r\n }\r\n } else {\r\n assert(!this.is(CommonFlags.INSTANCE)); // internal error\r\n }\r\n let parameterTypes = signature.parameterTypes;\r\n for (let i = 0, k = parameterTypes.length; i < k; ++i) {\r\n let parameterType = parameterTypes[i];\r\n let parameterName = signature.getParameterName(i);\r\n let local = new Local(\r\n prototype.program,\r\n parameterName,\r\n localIndex++,\r\n parameterType\r\n // FIXME: declaration?\r\n );\r\n this.localsByName.set(parameterName, local);\r\n this.localsByIndex[local.index] = local;\r\n }\r\n }\r\n this.flow = Flow.create(this);\r\n }\r\n\r\n /** Adds a local of the specified type, with an optional name. */\r\n addLocal(type: Type, name: string | null = null, declaration: VariableDeclaration | null = null): Local {\r\n // if it has a name, check previously as this method will throw otherwise\r\n var localIndex = this.signature.parameterTypes.length + this.additionalLocals.length;\r\n if (this.is(CommonFlags.INSTANCE)) ++localIndex;\r\n var local = new Local(\r\n this.prototype.program,\r\n name\r\n ? name\r\n : \"var$\" + localIndex.toString(10),\r\n localIndex,\r\n type,\r\n declaration\r\n );\r\n if (name) {\r\n if (this.localsByName.has(name)) throw new Error(\"duplicate local name\");\r\n this.localsByName.set(name, local);\r\n }\r\n this.localsByIndex[local.index] = local;\r\n this.additionalLocals.push(type);\r\n return local;\r\n }\r\n\r\n // used by flows to keep track of temporary locals\r\n tempI32s: Local[] | null = null;\r\n tempI64s: Local[] | null = null;\r\n tempF32s: Local[] | null = null;\r\n tempF64s: Local[] | null = null;\r\n\r\n // used by flows to keep track of break labels\r\n nextBreakId: i32 = 0;\r\n breakStack: i32[] | null = null;\r\n breakLabel: string | null = null;\r\n\r\n /** Finalizes the function once compiled, releasing no longer needed resources. */\r\n finalize(module: Module, ref: FunctionRef): void {\r\n this.ref = ref;\r\n assert(!this.breakStack || !this.breakStack.length); // internal error\r\n this.breakStack = null;\r\n this.breakLabel = null;\r\n this.tempI32s = this.tempI64s = this.tempF32s = this.tempF64s = null;\r\n if (this.program.options.sourceMap) {\r\n let debugLocations = this.debugLocations;\r\n for (let i = 0, k = debugLocations.length; i < k; ++i) {\r\n let debugLocation = debugLocations[i];\r\n module.setDebugLocation(\r\n ref,\r\n debugLocation.debugInfoRef,\r\n debugLocation.source.debugInfoIndex,\r\n debugLocation.line,\r\n debugLocation.column\r\n );\r\n }\r\n }\r\n }\r\n\r\n /** Returns the TypeScript representation of this function. */\r\n toString(): string { return this.prototype.simpleName; }\r\n}\r\n\r\n/** A resolved function target, that is a function called indirectly by an index and signature. */\r\nexport class FunctionTarget extends Element {\r\n\r\n kind = ElementKind.FUNCTION_TARGET;\r\n\r\n /** Underlying signature. */\r\n signature: Signature;\r\n /** Function type. */\r\n type: Type;\r\n\r\n /** Constructs a new function target. */\r\n constructor(program: Program, signature: Signature) {\r\n super(program, \"\", \"\");\r\n var simpleName = signature.toSignatureString();\r\n this.simpleName = simpleName;\r\n this.internalName = simpleName;\r\n this.signature = signature;\r\n this.type = Type.u32.asFunction(signature);\r\n }\r\n}\r\n\r\n/** A yet unresolved instance field prototype. */\r\nexport class FieldPrototype extends Element {\r\n\r\n kind = ElementKind.FIELD_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: FieldDeclaration;\r\n /** Parent class prototype. */\r\n classPrototype: ClassPrototype;\r\n\r\n /** Constructs a new field prototype. */\r\n constructor(\r\n classPrototype: ClassPrototype,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: FieldDeclaration\r\n ) {\r\n super(classPrototype.program, simpleName, internalName);\r\n this.classPrototype = classPrototype;\r\n this.declaration = declaration;\r\n this.flags = declaration.flags;\r\n }\r\n}\r\n\r\n/** A resolved instance field. */\r\nexport class Field extends VariableLikeElement {\r\n\r\n kind = ElementKind.FIELD;\r\n\r\n /** Field prototype reference. */\r\n prototype: FieldPrototype;\r\n /** Field memory offset, if an instance field. */\r\n memoryOffset: i32 = -1;\r\n\r\n /** Constructs a new field. */\r\n constructor(\r\n prototype: FieldPrototype,\r\n internalName: string,\r\n type: Type,\r\n declaration: FieldDeclaration,\r\n parent: Class\r\n ) {\r\n super(prototype.program, prototype.simpleName, internalName, type, declaration);\r\n this.prototype = prototype;\r\n this.flags = prototype.flags;\r\n this.type = type;\r\n this.parent = parent;\r\n }\r\n}\r\n\r\n/** A property comprised of a getter and a setter function. */\r\nexport class Property extends Element {\r\n\r\n kind = ElementKind.PROPERTY;\r\n\r\n /** Parent class prototype. */\r\n parent: ClassPrototype;\r\n /** Getter prototype. */\r\n getterPrototype: FunctionPrototype | null = null;\r\n /** Setter prototype. */\r\n setterPrototype: FunctionPrototype | null = null;\r\n\r\n /** Constructs a new property prototype. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n parent: ClassPrototype\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.parent = parent;\r\n }\r\n}\r\n\r\n/** A yet unresolved class prototype. */\r\nexport class ClassPrototype extends Element {\r\n\r\n kind = ElementKind.CLASS_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: ClassDeclaration;\r\n /** Resolved instances. */\r\n instances: Map = new Map();\r\n /** Instance member prototypes. */\r\n instanceMembers: Map | null = null;\r\n /** Base class prototype, if applicable. */\r\n basePrototype: ClassPrototype | null = null; // set in Program#initialize\r\n /** Constructor prototype. */\r\n constructorPrototype: FunctionPrototype | null = null;\r\n /** Operator overload prototypes. */\r\n overloadPrototypes: Map = new Map();\r\n\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: ClassDeclaration,\r\n decoratorFlags: DecoratorFlags\r\n ) {\r\n super(program, simpleName, internalName);\r\n this.declaration = declaration;\r\n this.flags = declaration.flags;\r\n this.decoratorFlags = decoratorFlags;\r\n }\r\n\r\n extends(basePtototype: ClassPrototype | null): bool {\r\n var current: ClassPrototype | null = this;\r\n do {\r\n if (current === basePtototype) return true;\r\n } while (current = current.basePrototype);\r\n return false;\r\n }\r\n\r\n toString(): string {\r\n return this.simpleName;\r\n }\r\n}\r\n\r\n/** A resolved class. */\r\nexport class Class extends Element {\r\n\r\n kind = ElementKind.CLASS;\r\n\r\n /** Prototype reference. */\r\n prototype: ClassPrototype;\r\n /** Resolved type arguments. */\r\n typeArguments: Type[] | null;\r\n /** Resolved class type. */\r\n type: Type;\r\n /** Base class, if applicable. */\r\n base: Class | null;\r\n /** Contextual type arguments for fields and methods. */\r\n contextualTypeArguments: Map | null = null;\r\n /** Current member memory offset. */\r\n currentMemoryOffset: u32 = 0;\r\n /** Constructor instance. */\r\n constructorInstance: Function | null = null;\r\n /** Operator overloads. */\r\n overloads: Map | null = null;\r\n /** Function index of the GC hook. */\r\n gcHookIndex: u32 = -1;\r\n\r\n /** Constructs a new class. */\r\n constructor(\r\n prototype: ClassPrototype,\r\n simpleName: string,\r\n internalName: string,\r\n typeArguments: Type[] | null = null,\r\n base: Class | null = null\r\n ) {\r\n super(prototype.program, simpleName, internalName);\r\n this.prototype = prototype;\r\n this.flags = prototype.flags;\r\n this.decoratorFlags = prototype.decoratorFlags;\r\n this.typeArguments = typeArguments;\r\n this.type = prototype.program.options.usizeType.asClass(this);\r\n this.base = base;\r\n\r\n // inherit static members and contextual type arguments from base class\r\n if (base) {\r\n let inheritedTypeArguments = base.contextualTypeArguments;\r\n if (inheritedTypeArguments) {\r\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n for (let [baseName, baseType] of inheritedTypeArguments) {\r\n this.contextualTypeArguments.set(baseName, baseType);\r\n }\r\n }\r\n }\r\n\r\n // apply instance-specific contextual type arguments\r\n var declaration = this.prototype.declaration;\r\n var i: i32, k: i32;\r\n if (declaration) { // irrelevant for built-ins\r\n let typeParameters = declaration.typeParameters;\r\n if (typeArguments) {\r\n if ((k = typeArguments.length) != typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n if (k) {\r\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n for (i = 0; i < k; ++i) {\r\n this.contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n }\r\n } else if (typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n }\r\n }\r\n\r\n /** Tests if a value of this class type is assignable to a target of the specified class type. */\r\n isAssignableTo(target: Class): bool {\r\n var current: Class | null = this;\r\n do if (current == target) return true;\r\n while (current = current.base);\r\n return false;\r\n }\r\n\r\n /** Looks up the operator overload of the specified kind. */\r\n lookupOverload(kind: OperatorKind, unchecked: bool = false): Function | null {\r\n if (unchecked) {\r\n switch (kind) {\r\n case OperatorKind.INDEXED_GET: {\r\n let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_GET);\r\n if (uncheckedOverload) return uncheckedOverload;\r\n break;\r\n }\r\n case OperatorKind.INDEXED_SET: {\r\n let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_SET);\r\n if (uncheckedOverload) return uncheckedOverload;\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n var instance: Class | null = this;\r\n do {\r\n let overloads = instance.overloads;\r\n if (overloads) {\r\n let overload = overloads.get(kind);\r\n if (overload) return overload;\r\n }\r\n } while (instance = instance.base);\r\n return null;\r\n }\r\n\r\n lookupField(name: string, shouldReadonly: boolean = false): Element | null {\r\n if (this.members == null) return null;\r\n var member = this.members.get(name);\r\n if (\r\n member == null || member.kind != ElementKind.FIELD ||\r\n (shouldReadonly && !member.is(CommonFlags.READONLY))\r\n ) return null;\r\n return member;\r\n }\r\n\r\n offsetof(fieldName: string): u32 {\r\n var members = assert(this.members);\r\n assert(members.has(fieldName));\r\n var field = members.get(fieldName);\r\n assert(field.kind == ElementKind.FIELD);\r\n return (field).memoryOffset;\r\n }\r\n\r\n toString(): string {\r\n return this.simpleName;\r\n }\r\n}\r\n\r\n/** A yet unresolved interface. */\r\nexport class InterfacePrototype extends ClassPrototype {\r\n\r\n kind = ElementKind.INTERFACE_PROTOTYPE;\r\n\r\n /** Declaration reference. */\r\n declaration: InterfaceDeclaration; // more specific\r\n\r\n /** Constructs a new interface prototype. */\r\n constructor(\r\n program: Program,\r\n simpleName: string,\r\n internalName: string,\r\n declaration: InterfaceDeclaration,\r\n decoratorFlags: DecoratorFlags\r\n ) {\r\n super(program, simpleName, internalName, declaration, decoratorFlags);\r\n }\r\n}\r\n\r\n/** A resolved interface. */\r\nexport class Interface extends Class {\r\n\r\n kind = ElementKind.INTERFACE;\r\n\r\n /** Prototype reference. */\r\n prototype: InterfacePrototype; // more specific\r\n /** Base interface, if applcable. */\r\n base: Interface | null; // more specific\r\n\r\n /** Constructs a new interface. */\r\n constructor(\r\n prototype: InterfacePrototype,\r\n simpleName: string,\r\n internalName: string,\r\n typeArguments: Type[] = [],\r\n base: Interface | null = null\r\n ) {\r\n super(prototype, simpleName, internalName, typeArguments, base);\r\n }\r\n}\r\n\r\n/** Control flow flags indicating specific conditions. */\r\nexport const enum FlowFlags {\r\n /** No specific conditions. */\r\n NONE = 0,\r\n\r\n // categorical\r\n\r\n /** This flow returns. */\r\n RETURNS = 1 << 0,\r\n /** This flow returns a wrapped value. */\r\n RETURNS_WRAPPED = 1 << 1,\r\n /** This flow throws. */\r\n THROWS = 1 << 2,\r\n /** This flow breaks. */\r\n BREAKS = 1 << 3,\r\n /** This flow continues. */\r\n CONTINUES = 1 << 4,\r\n /** This flow allocates. Constructors only. */\r\n ALLOCATES = 1 << 5,\r\n /** This flow calls super. Constructors only. */\r\n CALLS_SUPER = 1 << 6,\r\n\r\n // conditional\r\n\r\n /** This flow conditionally returns in a child flow. */\r\n CONDITIONALLY_RETURNS = 1 << 7,\r\n /** This flow conditionally throws in a child flow. */\r\n CONDITIONALLY_THROWS = 1 << 8,\r\n /** This flow conditionally breaks in a child flow. */\r\n CONDITIONALLY_BREAKS = 1 << 9,\r\n /** This flow conditionally continues in a child flow. */\r\n CONDITIONALLY_CONTINUES = 1 << 10,\r\n /** This flow conditionally allocates in a child flow. Constructors only. */\r\n CONDITIONALLY_ALLOCATES = 1 << 11,\r\n\r\n // special\r\n\r\n /** This is an inlining flow. */\r\n INLINE_CONTEXT = 1 << 12,\r\n /** This is a flow with explicitly disabled bounds checking. */\r\n UNCHECKED_CONTEXT = 1 << 13,\r\n\r\n // masks\r\n\r\n /** Any terminating flag. */\r\n ANY_TERMINATING = FlowFlags.RETURNS\r\n | FlowFlags.THROWS\r\n | FlowFlags.BREAKS\r\n | FlowFlags.CONTINUES,\r\n\r\n /** Any categorical flag. */\r\n ANY_CATEGORICAL = FlowFlags.RETURNS\r\n | FlowFlags.RETURNS_WRAPPED\r\n | FlowFlags.THROWS\r\n | FlowFlags.BREAKS\r\n | FlowFlags.CONTINUES\r\n | FlowFlags.ALLOCATES\r\n | FlowFlags.CALLS_SUPER,\r\n\r\n /** Any conditional flag. */\r\n ANY_CONDITIONAL = FlowFlags.CONDITIONALLY_RETURNS\r\n | FlowFlags.CONDITIONALLY_THROWS\r\n | FlowFlags.CONDITIONALLY_BREAKS\r\n | FlowFlags.CONDITIONALLY_CONTINUES\r\n | FlowFlags.CONDITIONALLY_ALLOCATES\r\n}\r\n\r\n/** A control flow evaluator. */\r\nexport class Flow {\r\n\r\n /** Parent flow. */\r\n parent: Flow | null;\r\n /** Flow flags indicating specific conditions. */\r\n flags: FlowFlags;\r\n /** Function this flow belongs to. */\r\n parentFunction: Function;\r\n /** The label we break to when encountering a continue statement. */\r\n continueLabel: string | null;\r\n /** The label we break to when encountering a break statement. */\r\n breakLabel: string | null;\r\n /** The current return type. */\r\n returnType: Type;\r\n /** The current contextual type arguments. */\r\n contextualTypeArguments: Map | null;\r\n /** Scoped local variables. */\r\n scopedLocals: Map | null = null;\r\n /** Local variable wrap states for the first 64 locals. */\r\n wrappedLocals: I64;\r\n /** Local variable wrap states for locals with index >= 64. */\r\n wrappedLocalsExt: I64[] | null;\r\n /** Function being inlined, when inlining. */\r\n inlineFunction: Function | null;\r\n /** The label we break to when encountering a return statement, when inlining. */\r\n inlineReturnLabel: string | null;\r\n\r\n /** Creates the parent flow of the specified function. */\r\n static create(parentFunction: Function): Flow {\r\n var flow = new Flow();\r\n flow.parent = null;\r\n flow.flags = FlowFlags.NONE;\r\n flow.parentFunction = parentFunction;\r\n flow.continueLabel = null;\r\n flow.breakLabel = null;\r\n flow.returnType = parentFunction.signature.returnType;\r\n flow.contextualTypeArguments = parentFunction.contextualTypeArguments;\r\n flow.wrappedLocals = i64_new(0);\r\n flow.wrappedLocalsExt = null;\r\n flow.inlineFunction = null;\r\n flow.inlineReturnLabel = null;\r\n return flow;\r\n }\r\n\r\n /** Creates an inline flow within `currentFunction`. */\r\n static createInline(parentFunction: Function, inlineFunction: Function): Flow {\r\n var flow = Flow.create(parentFunction);\r\n flow.set(FlowFlags.INLINE_CONTEXT);\r\n flow.inlineFunction = inlineFunction;\r\n flow.inlineReturnLabel = inlineFunction.internalName + \"|inlined.\" + (inlineFunction.nextInlineId++).toString(10);\r\n flow.returnType = inlineFunction.signature.returnType;\r\n flow.contextualTypeArguments = inlineFunction.contextualTypeArguments;\r\n return flow;\r\n }\r\n\r\n private constructor() { }\r\n\r\n /** Gets the actual function being compiled, The inlined function when inlining, otherwise the parent function. */\r\n get actualFunction(): Function {\r\n return this.inlineFunction || this.parentFunction;\r\n }\r\n\r\n /** Tests if this flow has the specified flag or flags. */\r\n is(flag: FlowFlags): bool { return (this.flags & flag) == flag; }\r\n /** Tests if this flow has one of the specified flags. */\r\n isAny(flag: FlowFlags): bool { return (this.flags & flag) != 0; }\r\n /** Sets the specified flag or flags. */\r\n set(flag: FlowFlags): void { this.flags |= flag; }\r\n /** Unsets the specified flag or flags. */\r\n unset(flag: FlowFlags): void { this.flags &= ~flag; }\r\n\r\n /** Forks this flow to a child flow. */\r\n fork(): Flow {\r\n var branch = new Flow();\r\n branch.parent = this;\r\n branch.flags = this.flags;\r\n branch.parentFunction = this.parentFunction;\r\n branch.continueLabel = this.continueLabel;\r\n branch.breakLabel = this.breakLabel;\r\n branch.returnType = this.returnType;\r\n branch.contextualTypeArguments = this.contextualTypeArguments;\r\n branch.wrappedLocals = this.wrappedLocals;\r\n branch.wrappedLocalsExt = this.wrappedLocalsExt ? this.wrappedLocalsExt.slice() : null;\r\n branch.inlineFunction = this.inlineFunction;\r\n branch.inlineReturnLabel = this.inlineReturnLabel;\r\n return branch;\r\n }\r\n\r\n /** Gets a free temporary local of the specified type. */\r\n getTempLocal(type: Type, wrapped: bool = false): Local {\r\n var parentFunction = this.parentFunction;\r\n var temps: Local[] | null;\r\n switch (type.toNativeType()) {\r\n case NativeType.I32: { temps = parentFunction.tempI32s; break; }\r\n case NativeType.I64: { temps = parentFunction.tempI64s; break; }\r\n case NativeType.F32: { temps = parentFunction.tempF32s; break; }\r\n case NativeType.F64: { temps = parentFunction.tempF64s; break; }\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n var local: Local;\r\n if (temps && temps.length) {\r\n local = temps.pop();\r\n local.type = type;\r\n local.flags = CommonFlags.NONE;\r\n } else {\r\n local = parentFunction.addLocal(type);\r\n }\r\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) this.setLocalWrapped(local.index, wrapped);\r\n return local;\r\n }\r\n\r\n /** Frees the temporary local for reuse. */\r\n freeTempLocal(local: Local): void {\r\n if (local.is(CommonFlags.INLINED)) return;\r\n assert(local.index >= 0);\r\n var parentFunction = this.parentFunction;\r\n var temps: Local[];\r\n assert(local.type != null); // internal error\r\n switch ((local.type).toNativeType()) {\r\n case NativeType.I32: {\r\n temps = parentFunction.tempI32s || (parentFunction.tempI32s = []);\r\n break;\r\n }\r\n case NativeType.I64: {\r\n temps = parentFunction.tempI64s || (parentFunction.tempI64s = []);\r\n break;\r\n }\r\n case NativeType.F32: {\r\n temps = parentFunction.tempF32s || (parentFunction.tempF32s = []);\r\n break;\r\n }\r\n case NativeType.F64: {\r\n temps = parentFunction.tempF64s || (parentFunction.tempF64s = []);\r\n break;\r\n }\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n assert(local.index >= 0);\r\n temps.push(local);\r\n }\r\n\r\n /** Gets and immediately frees a temporary local of the specified type. */\r\n getAndFreeTempLocal(type: Type, wrapped: bool): Local {\r\n var parentFunction = this.parentFunction;\r\n var temps: Local[];\r\n switch (type.toNativeType()) {\r\n case NativeType.I32: {\r\n temps = parentFunction.tempI32s || (parentFunction.tempI32s = []);\r\n break;\r\n }\r\n case NativeType.I64: {\r\n temps = parentFunction.tempI64s || (parentFunction.tempI64s = []);\r\n break;\r\n }\r\n case NativeType.F32: {\r\n temps = parentFunction.tempF32s || (parentFunction.tempF32s = []);\r\n break;\r\n }\r\n case NativeType.F64: {\r\n temps = parentFunction.tempF64s || (parentFunction.tempF64s = []);\r\n break;\r\n }\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n var local: Local;\r\n if (temps.length) {\r\n local = temps[temps.length - 1];\r\n local.type = type;\r\n } else {\r\n local = parentFunction.addLocal(type);\r\n temps.push(local);\r\n }\r\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) this.setLocalWrapped(local.index, wrapped);\r\n return local;\r\n }\r\n\r\n /** Adds a new scoped local of the specified name. */\r\n addScopedLocal(name: string, type: Type, wrapped: bool, reportNode: Node | null = null): Local {\r\n var scopedLocal = this.getTempLocal(type, false);\r\n if (!this.scopedLocals) this.scopedLocals = new Map();\r\n else {\r\n let existingLocal = this.scopedLocals.get(name);\r\n if (existingLocal) {\r\n if (reportNode) {\r\n this.parentFunction.program.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n reportNode.range\r\n );\r\n }\r\n return existingLocal;\r\n }\r\n }\r\n scopedLocal.set(CommonFlags.SCOPED);\r\n this.scopedLocals.set(name, scopedLocal);\r\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n this.setLocalWrapped(scopedLocal.index, wrapped);\r\n }\r\n return scopedLocal;\r\n }\r\n\r\n /** Adds a new scoped alias for the specified local. For example `super` aliased to the `this` local. */\r\n addScopedAlias(name: string, type: Type, index: i32, reportNode: Node | null = null): Local {\r\n if (!this.scopedLocals) this.scopedLocals = new Map();\r\n else {\r\n let existingLocal = this.scopedLocals.get(name);\r\n if (existingLocal) {\r\n if (reportNode) {\r\n this.parentFunction.program.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n reportNode.range\r\n );\r\n }\r\n return existingLocal;\r\n }\r\n }\r\n assert(index < this.parentFunction.localsByIndex.length);\r\n var scopedAlias = new Local(\r\n this.parentFunction.program,\r\n name,\r\n index,\r\n type,\r\n null\r\n );\r\n // not flagged as SCOPED as it must not be free'd when the flow is finalized\r\n this.scopedLocals.set(name, scopedAlias);\r\n return scopedAlias;\r\n }\r\n\r\n /** Frees this flow's scoped variables and returns its parent flow. */\r\n freeScopedLocals(): void {\r\n if (this.scopedLocals) {\r\n for (let scopedLocal of this.scopedLocals.values()) {\r\n if (scopedLocal.is(CommonFlags.SCOPED)) { // otherwise an alias\r\n this.freeTempLocal(scopedLocal);\r\n }\r\n }\r\n this.scopedLocals = null;\r\n }\r\n }\r\n\r\n /** Looks up the local of the specified name in the current scope. */\r\n lookupLocal(name: string): Local | null {\r\n var local: Local | null;\r\n var current: Flow | null = this;\r\n do if (current.scopedLocals && (local = current.scopedLocals.get(name))) return local;\r\n while (current = current.parent);\r\n return this.parentFunction.localsByName.get(name);\r\n }\r\n\r\n /** Tests if the value of the local at the specified index is considered wrapped. */\r\n isLocalWrapped(index: i32): bool {\r\n if (index < 0) return true; // inlined constant\r\n if (index < 64) return bitsetIs(this.wrappedLocals, index);\r\n var ext = this.wrappedLocalsExt;\r\n var i = ((index - 64) / 64) | 0;\r\n if (!(ext && i < ext.length)) return false;\r\n return bitsetIs(ext[i], index - (i + 1) * 64);\r\n }\r\n\r\n /** Sets if the value of the local at the specified index is considered wrapped. */\r\n setLocalWrapped(index: i32, wrapped: bool): void {\r\n if (index < 0) return; // inlined constant\r\n if (index < 64) {\r\n this.wrappedLocals = bitsetSet(this.wrappedLocals, index, wrapped);\r\n return;\r\n }\r\n var ext = this.wrappedLocalsExt;\r\n var i = ((index - 64) / 64) | 0;\r\n if (!ext) {\r\n this.wrappedLocalsExt = ext = new Array(i + 1);\r\n for (let j = 0; j <= i; ++j) ext[j] = i64_new(0);\r\n } else {\r\n while (ext.length <= i) ext.push(i64_new(0));\r\n }\r\n ext[i] = bitsetSet(ext[i], index - (i + 1) * 64, wrapped);\r\n }\r\n\r\n /** Pushes a new break label to the stack, for example when entering a loop that one can `break` from. */\r\n pushBreakLabel(): string {\r\n var parentFunction = this.parentFunction;\r\n var id = parentFunction.nextBreakId++;\r\n var stack = parentFunction.breakStack;\r\n if (!stack) parentFunction.breakStack = [ id ];\r\n else stack.push(id);\r\n return parentFunction.breakLabel = id.toString(10);\r\n }\r\n\r\n /** Pops the most recent break label from the stack. */\r\n popBreakLabel(): void {\r\n var parentFunction = this.parentFunction;\r\n var stack = assert(parentFunction.breakStack);\r\n var length = assert(stack.length);\r\n stack.pop();\r\n if (length > 1) {\r\n parentFunction.breakLabel = stack[length - 2].toString(10);\r\n } else {\r\n parentFunction.breakLabel = null;\r\n parentFunction.breakStack = null;\r\n }\r\n }\r\n\r\n /** Inherits flags and local wrap states from the specified flow (e.g. blocks). */\r\n inherit(other: Flow): void {\r\n this.flags |= other.flags & (FlowFlags.ANY_CATEGORICAL | FlowFlags.ANY_CONDITIONAL);\r\n this.wrappedLocals = other.wrappedLocals;\r\n this.wrappedLocalsExt = other.wrappedLocalsExt; // no need to slice because other flow is finished\r\n }\r\n\r\n /** Inherits categorical flags as conditional flags from the specified flow (e.g. then without else). */\r\n inheritConditional(other: Flow): void {\r\n if (other.is(FlowFlags.RETURNS)) {\r\n this.set(FlowFlags.CONDITIONALLY_RETURNS);\r\n }\r\n if (other.is(FlowFlags.THROWS)) {\r\n this.set(FlowFlags.CONDITIONALLY_THROWS);\r\n }\r\n if (other.is(FlowFlags.BREAKS) && other.breakLabel == this.breakLabel) {\r\n this.set(FlowFlags.CONDITIONALLY_BREAKS);\r\n }\r\n if (other.is(FlowFlags.CONTINUES) && other.continueLabel == this.continueLabel) {\r\n this.set(FlowFlags.CONDITIONALLY_CONTINUES);\r\n }\r\n if (other.is(FlowFlags.ALLOCATES)) {\r\n this.set(FlowFlags.CONDITIONALLY_ALLOCATES);\r\n }\r\n }\r\n\r\n /** Inherits mutual flags and local wrap states from the specified flows (e.g. then with else). */\r\n inheritMutual(left: Flow, right: Flow): void {\r\n // categorical flags set in both arms\r\n this.flags |= left.flags & right.flags & FlowFlags.ANY_CATEGORICAL;\r\n\r\n // conditional flags set in at least one arm\r\n this.flags |= left.flags & FlowFlags.ANY_CONDITIONAL;\r\n this.flags |= right.flags & FlowFlags.ANY_CONDITIONAL;\r\n\r\n // locals wrapped in both arms\r\n this.wrappedLocals = i64_and(left.wrappedLocals, right.wrappedLocals);\r\n var leftExt = left.wrappedLocalsExt;\r\n var rightExt = right.wrappedLocalsExt;\r\n if (leftExt != null && rightExt != null) {\r\n let thisExt = this.wrappedLocalsExt;\r\n let minLength = min(leftExt.length, rightExt.length);\r\n if (minLength) {\r\n if (!thisExt) thisExt = new Array(minLength);\r\n else while (thisExt.length < minLength) thisExt.push(i64_new(0));\r\n for (let i = 0; i < minLength; ++i) {\r\n thisExt[i] = i64_and(\r\n leftExt[i],\r\n rightExt[i]\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Tests if an expression can possibly overflow in the context of this flow. Assumes that the\r\n * expression might already have overflown and returns `false` only if the operation neglects\r\n * any possible combination of garbage bits being present.\r\n */\r\n canOverflow(expr: ExpressionRef, type: Type): bool {\r\n // TODO: the following catches most common and a few uncommon cases, but there are additional\r\n // opportunities here, obviously.\r\n assert(type != Type.void);\r\n\r\n // types other than i8, u8, i16, u16 and bool do not overflow\r\n if (!type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) return false;\r\n\r\n var operand: ExpressionRef;\r\n switch (getExpressionId(expr)) {\r\n\r\n // overflows if the local isn't wrapped or the conversion does\r\n case ExpressionId.GetLocal: {\r\n let local = this.parentFunction.localsByIndex[getGetLocalIndex(expr)];\r\n return !this.isLocalWrapped(local.index)\r\n || canConversionOverflow(local.type, type);\r\n }\r\n\r\n // overflows if the value does\r\n case ExpressionId.SetLocal: { // tee\r\n assert(isTeeLocal(expr));\r\n return this.canOverflow(getSetLocalValue(expr), type);\r\n }\r\n\r\n // overflows if the conversion does (globals are wrapped on set)\r\n case ExpressionId.GetGlobal: {\r\n // TODO: this is inefficient because it has to read a string\r\n let global = assert(this.parentFunction.program.elementsLookup.get(assert(getGetGlobalName(expr))));\r\n assert(global.kind == ElementKind.GLOBAL);\r\n return canConversionOverflow(assert((global).type), type);\r\n }\r\n\r\n case ExpressionId.Binary: {\r\n switch (getBinaryOp(expr)) {\r\n\r\n // comparisons do not overflow (result is 0 or 1)\r\n case BinaryOp.EqI32:\r\n case BinaryOp.EqI64:\r\n case BinaryOp.EqF32:\r\n case BinaryOp.EqF64:\r\n case BinaryOp.NeI32:\r\n case BinaryOp.NeI64:\r\n case BinaryOp.NeF32:\r\n case BinaryOp.NeF64:\r\n case BinaryOp.LtI32:\r\n case BinaryOp.LtU32:\r\n case BinaryOp.LtI64:\r\n case BinaryOp.LtU64:\r\n case BinaryOp.LtF32:\r\n case BinaryOp.LtF64:\r\n case BinaryOp.LeI32:\r\n case BinaryOp.LeU32:\r\n case BinaryOp.LeI64:\r\n case BinaryOp.LeU64:\r\n case BinaryOp.LeF32:\r\n case BinaryOp.LeF64:\r\n case BinaryOp.GtI32:\r\n case BinaryOp.GtU32:\r\n case BinaryOp.GtI64:\r\n case BinaryOp.GtU64:\r\n case BinaryOp.GtF32:\r\n case BinaryOp.GtF64:\r\n case BinaryOp.GeI32:\r\n case BinaryOp.GeU32:\r\n case BinaryOp.GeI64:\r\n case BinaryOp.GeU64:\r\n case BinaryOp.GeF32:\r\n case BinaryOp.GeF64: return false;\r\n\r\n // result won't overflow if one side is 0 or if one side is 1 and the other wrapped\r\n case BinaryOp.MulI32: {\r\n return !(\r\n (\r\n getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\r\n (\r\n getConstValueI32(operand) == 0 ||\r\n (\r\n getConstValueI32(operand) == 1 &&\r\n !this.canOverflow(getBinaryRight(expr), type)\r\n )\r\n )\r\n ) || (\r\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n (\r\n getConstValueI32(operand) == 0 ||\r\n (\r\n getConstValueI32(operand) == 1 &&\r\n !this.canOverflow(getBinaryLeft(expr), type)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n\r\n // result won't overflow if one side is a constant less than this type's mask or one side\r\n // is wrapped\r\n case BinaryOp.AndI32: {\r\n // note that computeSmallIntegerMask returns the mask minus the MSB for signed types\r\n // because signed value garbage bits must be guaranteed to be equal to the MSB.\r\n return !(\r\n (\r\n (\r\n getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\r\n getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\r\n ) || !this.canOverflow(operand, type)\r\n ) || (\r\n (\r\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\r\n ) || !this.canOverflow(operand, type)\r\n )\r\n );\r\n }\r\n\r\n // overflows if the shift doesn't clear potential garbage bits\r\n case BinaryOp.ShlI32: {\r\n let shift = 32 - type.size;\r\n return getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const\r\n || getConstValueI32(operand) < shift;\r\n }\r\n\r\n // overflows if the value does and the shift doesn't clear potential garbage bits\r\n case BinaryOp.ShrI32: {\r\n let shift = 32 - type.size;\r\n return this.canOverflow(getBinaryLeft(expr), type) && (\r\n getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const ||\r\n getConstValueI32(operand) < shift\r\n );\r\n }\r\n\r\n // overflows if the shift does not clear potential garbage bits. if an unsigned value is\r\n // wrapped, it can't overflow.\r\n case BinaryOp.ShrU32: {\r\n let shift = 32 - type.size;\r\n return type.is(TypeFlags.SIGNED)\r\n ? !(\r\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n getConstValueI32(operand) > shift // must clear MSB\r\n )\r\n : this.canOverflow(getBinaryLeft(expr), type) && !(\r\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n getConstValueI32(operand) >= shift // can leave MSB\r\n );\r\n }\r\n\r\n // overflows if any side does\r\n case BinaryOp.DivU32:\r\n case BinaryOp.RemI32:\r\n case BinaryOp.RemU32: {\r\n return this.canOverflow(getBinaryLeft(expr), type)\r\n || this.canOverflow(getBinaryRight(expr), type);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case ExpressionId.Unary: {\r\n switch (getUnaryOp(expr)) {\r\n\r\n // comparisons do not overflow (result is 0 or 1)\r\n case UnaryOp.EqzI32:\r\n case UnaryOp.EqzI64: return false;\r\n\r\n // overflow if the maximum result (32) cannot be represented in the target type\r\n case UnaryOp.ClzI32:\r\n case UnaryOp.CtzI32:\r\n case UnaryOp.PopcntI32: return type.size < 7;\r\n }\r\n break;\r\n }\r\n\r\n // overflows if the value cannot be represented in the target type\r\n case ExpressionId.Const: {\r\n let value: i32 = 0;\r\n switch (getExpressionType(expr)) {\r\n case NativeType.I32: { value = getConstValueI32(expr); break; }\r\n case NativeType.I64: { value = getConstValueI64Low(expr); break; } // discards upper bits\r\n case NativeType.F32: { value = i32(getConstValueF32(expr)); break; }\r\n case NativeType.F64: { value = i32(getConstValueF64(expr)); break; }\r\n default: assert(false);\r\n }\r\n switch (type.kind) {\r\n case TypeKind.I8: return value < i8.MIN_VALUE || value > i8.MAX_VALUE;\r\n case TypeKind.I16: return value < i16.MIN_VALUE || value > i16.MAX_VALUE;\r\n case TypeKind.U8: return value < 0 || value > u8.MAX_VALUE;\r\n case TypeKind.U16: return value < 0 || value > u16.MAX_VALUE;\r\n case TypeKind.BOOL: return (value & ~1) != 0;\r\n }\r\n break;\r\n }\r\n\r\n // overflows if the conversion does\r\n case ExpressionId.Load: {\r\n let fromType: Type;\r\n switch (getLoadBytes(expr)) {\r\n case 1: { fromType = isLoadSigned(expr) ? Type.i8 : Type.u8; break; }\r\n case 2: { fromType = isLoadSigned(expr) ? Type.i16 : Type.u16; break; }\r\n default: { fromType = isLoadSigned(expr) ? Type.i32 : Type.u32; break; }\r\n }\r\n return canConversionOverflow(fromType, type);\r\n }\r\n\r\n // overflows if the result does, which is either\r\n // - the last expression of the block, by contract, if the block doesn't have a label\r\n // - the last expression or the value of an inner br if the block has a label (TODO)\r\n case ExpressionId.Block: {\r\n if (!getBlockName(expr)) {\r\n let size = assert(getBlockChildCount(expr));\r\n let last = getBlockChild(expr, size - 1);\r\n return this.canOverflow(last, type);\r\n }\r\n break;\r\n }\r\n\r\n // overflows if either side does\r\n case ExpressionId.If: {\r\n return this.canOverflow(getIfTrue(expr), type)\r\n || this.canOverflow(assert(getIfFalse(expr)), type);\r\n }\r\n\r\n // overflows if either side does\r\n case ExpressionId.Select: {\r\n return this.canOverflow(getSelectThen(expr), type)\r\n || this.canOverflow(getSelectElse(expr), type);\r\n }\r\n\r\n // overflows if the call does not return a wrapped value or the conversion does\r\n case ExpressionId.Call: {\r\n let program = this.parentFunction.program;\r\n let instance = assert(program.instancesLookup.get(assert(getCallTarget(expr))));\r\n assert(instance.kind == ElementKind.FUNCTION);\r\n let returnType = (instance).signature.returnType;\r\n return !(instance).flow.is(FlowFlags.RETURNS_WRAPPED)\r\n || canConversionOverflow(returnType, type);\r\n }\r\n\r\n // doesn't technically overflow\r\n case ExpressionId.Unreachable: return false;\r\n }\r\n return true;\r\n }\r\n}\r\n\r\n/** Tests if a conversion from one type to another can technically overflow. */\r\nfunction canConversionOverflow(fromType: Type, toType: Type): bool {\r\n return !fromType.is(TypeFlags.INTEGER) // non-i32 locals or returns\r\n || fromType.size > toType.size\r\n || fromType.is(TypeFlags.SIGNED) != toType.is(TypeFlags.SIGNED);\r\n}\r\n","/**\r\n * A TypeScript tokenizer modified for AssemblyScript.\r\n *\r\n * Skips over trivia and provides a general mark/reset mechanism for the parser to utilize on\r\n * ambiguous tokens.\r\n *\r\n * @module tokenizer\r\n *//***/\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticMessage,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Source,\r\n CommentKind\r\n} from \"./ast\";\r\n\r\nimport {\r\n CharCode,\r\n isLineBreak,\r\n isWhiteSpace,\r\n isIdentifierStart,\r\n isIdentifierPart,\r\n isDecimalDigit,\r\n isOctalDigit,\r\n isKeywordCharacter\r\n} from \"./util\";\r\n\r\n/** Named token types. */\r\nexport enum Token {\r\n\r\n // keywords\r\n // discarded: ANY, BOOLEAN, NEVER, NUMBER, STRING, SYMBOL, UNDEFINED, LESSTHAN_SLASH\r\n\r\n ABSTRACT,\r\n AS,\r\n ASYNC,\r\n AWAIT, // ES2017\r\n BREAK, // ES2017\r\n CASE, // ES2017\r\n CATCH, // ES2017\r\n CLASS, // ES2017\r\n CONST, // ES2017\r\n CONTINUE, // ES2017\r\n CONSTRUCTOR,\r\n DEBUGGER, // ES2017\r\n DECLARE,\r\n DEFAULT, // ES2017\r\n DELETE, // ES2017\r\n DO, // ES2017\r\n ELSE, // ES2017\r\n ENUM, // ES2017 future\r\n EXPORT, // ES2017\r\n EXTENDS, // ES2017\r\n FALSE, // ES\r\n FINALLY, // ES2017\r\n FOR, // ES2017\r\n FROM, // AS possible identifier\r\n FUNCTION, // ES2017\r\n GET,\r\n IF, // ES2017\r\n IMPLEMENTS, // ES2017 non-lexical\r\n IMPORT, // ES2017\r\n IN, // ES2017\r\n INSTANCEOF, // ES2017\r\n INTERFACE, // ES2017 non-lexical\r\n IS,\r\n KEYOF,\r\n LET, // ES2017 non-lexical\r\n MODULE, // AS possible identifier\r\n NAMESPACE, // AS possible identifier\r\n NEW, // ES2017\r\n NULL, // ES\r\n OF,\r\n PACKAGE, // ES2017 non-lexical\r\n PRIVATE, // ES2017 non-lexical\r\n PROTECTED, // ES2017 non-lexical\r\n PUBLIC, // ES2017 non-lexical\r\n READONLY,\r\n RETURN, // ES2017\r\n SET,\r\n STATIC, // ES2017 non-lexical\r\n SUPER, // ES2017\r\n SWITCH, // ES2017\r\n THIS, // ES2017\r\n THROW, // ES2017\r\n TRUE, // ES\r\n TRY, // ES2017\r\n TYPE, // AS possible identifier\r\n TYPEOF, // ES2017\r\n VAR, // ES2017\r\n VOID, // ES2017\r\n WHILE, // ES2017\r\n WITH, // ES2017\r\n YIELD, // ES2017\r\n\r\n // punctuation\r\n\r\n OPENBRACE,\r\n CLOSEBRACE,\r\n OPENPAREN,\r\n CLOSEPAREN,\r\n OPENBRACKET,\r\n CLOSEBRACKET,\r\n DOT,\r\n DOT_DOT_DOT,\r\n SEMICOLON,\r\n COMMA,\r\n LESSTHAN,\r\n GREATERTHAN,\r\n LESSTHAN_EQUALS,\r\n GREATERTHAN_EQUALS,\r\n EQUALS_EQUALS,\r\n EXCLAMATION_EQUALS,\r\n EQUALS_EQUALS_EQUALS,\r\n EXCLAMATION_EQUALS_EQUALS,\r\n EQUALS_GREATERTHAN,\r\n PLUS,\r\n MINUS,\r\n ASTERISK_ASTERISK,\r\n ASTERISK,\r\n SLASH,\r\n PERCENT,\r\n PLUS_PLUS,\r\n MINUS_MINUS,\r\n LESSTHAN_LESSTHAN,\r\n GREATERTHAN_GREATERTHAN,\r\n GREATERTHAN_GREATERTHAN_GREATERTHAN,\r\n AMPERSAND,\r\n BAR,\r\n CARET,\r\n EXCLAMATION,\r\n TILDE,\r\n AMPERSAND_AMPERSAND,\r\n BAR_BAR,\r\n QUESTION,\r\n COLON,\r\n EQUALS,\r\n PLUS_EQUALS,\r\n MINUS_EQUALS,\r\n ASTERISK_EQUALS,\r\n ASTERISK_ASTERISK_EQUALS,\r\n SLASH_EQUALS,\r\n PERCENT_EQUALS,\r\n LESSTHAN_LESSTHAN_EQUALS,\r\n GREATERTHAN_GREATERTHAN_EQUALS,\r\n GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS,\r\n AMPERSAND_EQUALS,\r\n BAR_EQUALS,\r\n CARET_EQUALS,\r\n AT,\r\n\r\n // literals\r\n\r\n IDENTIFIER,\r\n STRINGLITERAL,\r\n INTEGERLITERAL,\r\n FLOATLITERAL,\r\n\r\n // meta\r\n\r\n INVALID,\r\n ENDOFFILE\r\n}\r\n\r\nexport enum IdentifierHandling {\r\n DEFAULT,\r\n PREFER,\r\n ALWAYS\r\n}\r\n\r\nexport function tokenFromKeyword(text: string): Token {\r\n assert(text.length);\r\n switch (text.charCodeAt(0)) {\r\n case CharCode.a: {\r\n switch (text) {\r\n case \"abstract\": return Token.ABSTRACT;\r\n case \"as\": return Token.AS;\r\n case \"async\": return Token.ASYNC;\r\n case \"await\": return Token.AWAIT;\r\n }\r\n break;\r\n }\r\n case CharCode.b: {\r\n switch (text) {\r\n case \"break\": return Token.BREAK;\r\n }\r\n break;\r\n }\r\n case CharCode.c: {\r\n switch (text) {\r\n case \"case\": return Token.CASE;\r\n case \"catch\": return Token.CATCH;\r\n case \"class\": return Token.CLASS;\r\n case \"continue\": return Token.CONTINUE;\r\n case \"const\": return Token.CONST;\r\n case \"constructor\": return Token.CONSTRUCTOR;\r\n }\r\n break;\r\n }\r\n case CharCode.d: {\r\n switch (text) {\r\n case \"debugger\": return Token.DEBUGGER;\r\n case \"declare\": return Token.DECLARE;\r\n case \"default\": return Token.DEFAULT;\r\n case \"delete\": return Token.DELETE;\r\n case \"do\": return Token.DO;\r\n }\r\n break;\r\n }\r\n case CharCode.e: {\r\n switch (text) {\r\n case \"else\": return Token.ELSE;\r\n case \"enum\": return Token.ENUM;\r\n case \"export\": return Token.EXPORT;\r\n case \"extends\": return Token.EXTENDS;\r\n }\r\n break;\r\n }\r\n case CharCode.f: {\r\n switch (text) {\r\n case \"false\": return Token.FALSE;\r\n case \"finally\": return Token.FINALLY;\r\n case \"for\": return Token.FOR;\r\n case \"from\": return Token.FROM;\r\n case \"function\": return Token.FUNCTION;\r\n }\r\n break;\r\n }\r\n case CharCode.g: {\r\n switch (text) {\r\n case \"get\": return Token.GET;\r\n }\r\n break;\r\n }\r\n case CharCode.i: {\r\n switch (text) {\r\n case \"if\": return Token.IF;\r\n case \"implements\": return Token.IMPLEMENTS;\r\n case \"import\": return Token.IMPORT;\r\n case \"in\": return Token.IN;\r\n case \"instanceof\": return Token.INSTANCEOF;\r\n case \"interface\": return Token.INTERFACE;\r\n case \"is\": return Token.IS;\r\n }\r\n break;\r\n }\r\n case CharCode.k: {\r\n switch (text) {\r\n case \"keyof\": return Token.KEYOF;\r\n }\r\n break;\r\n }\r\n case CharCode.l: {\r\n switch (text) {\r\n case \"let\": return Token.LET;\r\n }\r\n break;\r\n }\r\n case CharCode.m: {\r\n switch (text) {\r\n case \"module\": return Token.MODULE;\r\n }\r\n break;\r\n }\r\n case CharCode.n: {\r\n switch (text) {\r\n case \"namespace\": return Token.NAMESPACE;\r\n case \"new\": return Token.NEW;\r\n case \"null\": return Token.NULL;\r\n }\r\n break;\r\n }\r\n case CharCode.o: {\r\n switch (text) {\r\n case \"of\": return Token.OF;\r\n }\r\n break;\r\n }\r\n case CharCode.p: {\r\n switch (text) {\r\n case \"package\": return Token.PACKAGE;\r\n case \"private\": return Token.PRIVATE;\r\n case \"protected\": return Token.PROTECTED;\r\n case \"public\": return Token.PUBLIC;\r\n }\r\n break;\r\n }\r\n case CharCode.r: {\r\n switch (text) {\r\n case \"readonly\": return Token.READONLY;\r\n case \"return\": return Token.RETURN;\r\n }\r\n break;\r\n }\r\n case CharCode.s: {\r\n switch (text) {\r\n case \"set\": return Token.SET;\r\n case \"static\": return Token.STATIC;\r\n case \"super\": return Token.SUPER;\r\n case \"switch\": return Token.SWITCH;\r\n }\r\n break;\r\n }\r\n case CharCode.t: {\r\n switch (text) {\r\n case \"this\": return Token.THIS;\r\n case \"throw\": return Token.THROW;\r\n case \"true\": return Token.TRUE;\r\n case \"try\": return Token.TRY;\r\n case \"type\": return Token.TYPE;\r\n case \"typeof\": return Token.TYPEOF;\r\n }\r\n break;\r\n }\r\n case CharCode.v: {\r\n switch (text) {\r\n case \"var\": return Token.VAR;\r\n case \"void\": return Token.VOID;\r\n }\r\n break;\r\n }\r\n case CharCode.w: {\r\n switch (text) {\r\n case \"while\": return Token.WHILE;\r\n case \"with\": return Token.WITH;\r\n }\r\n break;\r\n }\r\n case CharCode.y: {\r\n switch (text) {\r\n case \"yield\": return Token.YIELD;\r\n }\r\n break;\r\n }\r\n }\r\n return Token.INVALID;\r\n}\r\n\r\nexport function tokenIsAlsoIdentifier(token: Token): bool {\r\n switch (token) {\r\n case Token.ABSTRACT:\r\n case Token.AS:\r\n case Token.CONSTRUCTOR:\r\n case Token.DECLARE:\r\n case Token.DELETE:\r\n case Token.FROM:\r\n case Token.FOR:\r\n case Token.GET:\r\n case Token.IS:\r\n case Token.KEYOF:\r\n case Token.MODULE:\r\n case Token.NAMESPACE:\r\n case Token.READONLY:\r\n case Token.SET:\r\n case Token.TYPE:\r\n case Token.VOID: return true;\r\n default: return false;\r\n }\r\n}\r\n\r\nexport function operatorTokenToString(token: Token): string {\r\n switch (token) {\r\n case Token.DELETE: return \"delete\";\r\n case Token.IN: return \"in\";\r\n case Token.INSTANCEOF: return \"instanceof\";\r\n case Token.NEW: return \"new\";\r\n case Token.TYPEOF: return \"typeof\";\r\n case Token.VOID: return \"void\";\r\n case Token.YIELD: return \"yield\";\r\n case Token.DOT_DOT_DOT: return \"...\";\r\n case Token.COMMA: return \",\";\r\n case Token.LESSTHAN: return \"<\";\r\n case Token.GREATERTHAN: return \">\";\r\n case Token.LESSTHAN_EQUALS: return \"<=\";\r\n case Token.GREATERTHAN_EQUALS: return \">=\";\r\n case Token.EQUALS_EQUALS: return \"==\";\r\n case Token.EXCLAMATION_EQUALS: return \"!=\";\r\n case Token.EQUALS_EQUALS_EQUALS: return \"===\";\r\n case Token.EXCLAMATION_EQUALS_EQUALS: return \"!==\";\r\n case Token.PLUS: return \"+\";\r\n case Token.MINUS: return \"-\";\r\n case Token.ASTERISK_ASTERISK: return \"**\";\r\n case Token.ASTERISK: return \"*\";\r\n case Token.SLASH: return \"/\";\r\n case Token.PERCENT: return \"%\";\r\n case Token.PLUS_PLUS: return \"++\";\r\n case Token.MINUS_MINUS: return \"--\";\r\n case Token.LESSTHAN_LESSTHAN: return \"<<\";\r\n case Token.GREATERTHAN_GREATERTHAN: return \">>\";\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return \">>>\";\r\n case Token.AMPERSAND: return \"&\";\r\n case Token.BAR: return \"|\";\r\n case Token.CARET: return \"^\";\r\n case Token.EXCLAMATION: return \"!\";\r\n case Token.TILDE: return \"~\";\r\n case Token.AMPERSAND_AMPERSAND: return \"&&\";\r\n case Token.BAR_BAR: return \"||\";\r\n case Token.EQUALS: return \"=\";\r\n case Token.PLUS_EQUALS: return \"+=\";\r\n case Token.MINUS_EQUALS: return \"-=\";\r\n case Token.ASTERISK_EQUALS: return \"*=\";\r\n case Token.ASTERISK_ASTERISK_EQUALS: return \"**=\";\r\n case Token.SLASH_EQUALS: return \"/=\";\r\n case Token.PERCENT_EQUALS: return \"%=\";\r\n case Token.LESSTHAN_LESSTHAN_EQUALS: return \"<<=\";\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS: return \">>=\";\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: return \">>>=\";\r\n case Token.AMPERSAND_EQUALS: return \"&=\";\r\n case Token.BAR_EQUALS: return \"|=\";\r\n case Token.CARET_EQUALS: return \"^=\";\r\n default: {\r\n assert(false);\r\n return \"\";\r\n }\r\n }\r\n}\r\n\r\nexport class Range {\r\n\r\n source: Source;\r\n start: i32;\r\n end: i32;\r\n\r\n // TODO: set these while tokenizing\r\n // line: i32;\r\n // column: i32;\r\n\r\n constructor(source: Source, start: i32, end: i32) {\r\n this.source = source;\r\n this.start = start;\r\n this.end = end;\r\n }\r\n\r\n static join(a: Range, b: Range): Range {\r\n if (a.source != b.source) throw new Error(\"source mismatch\");\r\n return new Range(a.source,\r\n a.start < b.start ? a.start : b.start,\r\n a.end > b.end ? a.end : b.end\r\n );\r\n }\r\n\r\n get atStart(): Range {\r\n return new Range(this.source, this.start, this.start);\r\n }\r\n get atEnd(): Range {\r\n return new Range(this.source, this.end, this.end);\r\n }\r\n\r\n get line(): i32 {\r\n var text = this.source.text;\r\n var line = 1;\r\n for (let pos = this.start; pos >= 0; --pos) {\r\n if (text.charCodeAt(pos) == CharCode.LINEFEED) line++;\r\n }\r\n return line;\r\n }\r\n\r\n get column(): i32 {\r\n var text = this.source.text;\r\n var column = 0;\r\n for (let pos = this.start - 1; pos >= 0; --pos) {\r\n if (text.charCodeAt(pos) == CharCode.LINEFEED) break;\r\n ++column;\r\n }\r\n return column;\r\n }\r\n\r\n toString(): string {\r\n return this.source.text.substring(this.start, this.end);\r\n }\r\n\r\n debugInfoRef: usize = 0;\r\n}\r\n\r\ndeclare function parseFloat(str: string): f64;\r\n\r\n/** Handler for intercepting comments while tokenizing. */\r\nexport type CommentHandler = (kind: CommentKind, text: string, range: Range) => void;\r\n\r\n/** Tokenizes a source to individual {@link Token}s. */\r\nexport class Tokenizer extends DiagnosticEmitter {\r\n\r\n source: Source;\r\n end: i32 = 0;\r\n\r\n pos: i32 = 0;\r\n token: Token = -1;\r\n tokenPos: i32 = 0;\r\n\r\n nextToken: Token = -1;\r\n nextTokenPos: i32 = 0;\r\n nextTokenOnNewLine: bool = false;\r\n\r\n onComment: CommentHandler | null = null;\r\n\r\n /** Constructs a new tokenizer. */\r\n constructor(source: Source, diagnostics: DiagnosticMessage[] | null = null) {\r\n super(diagnostics);\r\n this.source = source;\r\n this.pos = 0;\r\n this.end = source.text.length;\r\n this.diagnostics = diagnostics ? diagnostics : new Array();\r\n\r\n var text = source.text;\r\n\r\n // skip bom\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.BYTEORDERMARK\r\n ) {\r\n ++this.pos;\r\n }\r\n\r\n // skip shebang\r\n if (\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.HASH &&\r\n text.charCodeAt(this.pos + 1) == CharCode.EXCLAMATION\r\n ) {\r\n this.pos += 2;\r\n while (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) != CharCode.LINEFEED\r\n ) {\r\n ++this.pos;\r\n }\r\n // 'next' now starts at lf or eof\r\n }\r\n }\r\n\r\n next(identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): Token {\r\n this.nextToken = -1;\r\n return this.token = this.unsafeNext(identifierHandling);\r\n }\r\n\r\n private unsafeNext(\r\n identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\r\n maxTokenLength: i32 = i32.MAX_VALUE\r\n ): Token {\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n this.tokenPos = this.pos;\r\n let c = text.charCodeAt(this.pos);\r\n switch (c) {\r\n case CharCode.CARRIAGERETURN: {\r\n if (!(\r\n ++this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n )) break;\r\n // otherwise fall-through\r\n }\r\n case CharCode.LINEFEED:\r\n case CharCode.TAB:\r\n case CharCode.VERTICALTAB:\r\n case CharCode.FORMFEED:\r\n case CharCode.SPACE: {\r\n ++this.pos;\r\n break;\r\n }\r\n case CharCode.EXCLAMATION: {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.EXCLAMATION_EQUALS_EQUALS;\r\n }\r\n return Token.EXCLAMATION_EQUALS;\r\n }\r\n return Token.EXCLAMATION;\r\n }\r\n case CharCode.DOUBLEQUOTE:\r\n case CharCode.SINGLEQUOTE:\r\n case CharCode.BACKTICK: { // TODO\r\n return Token.STRINGLITERAL; // expects a call to readString\r\n }\r\n case CharCode.PERCENT: {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.PERCENT_EQUALS;\r\n }\r\n return Token.PERCENT;\r\n }\r\n case CharCode.AMPERSAND: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.AMPERSAND) {\r\n ++this.pos;\r\n return Token.AMPERSAND_AMPERSAND;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.AMPERSAND_EQUALS;\r\n }\r\n }\r\n return Token.AMPERSAND;\r\n }\r\n case CharCode.OPENPAREN: {\r\n ++this.pos;\r\n return Token.OPENPAREN;\r\n }\r\n case CharCode.CLOSEPAREN: {\r\n ++this.pos;\r\n return Token.CLOSEPAREN;\r\n }\r\n case CharCode.ASTERISK: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.ASTERISK_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.ASTERISK_ASTERISK_EQUALS;\r\n }\r\n return Token.ASTERISK_ASTERISK;\r\n }\r\n }\r\n return Token.ASTERISK;\r\n }\r\n case CharCode.PLUS: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.PLUS) {\r\n ++this.pos;\r\n return Token.PLUS_PLUS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.PLUS_EQUALS;\r\n }\r\n }\r\n return Token.PLUS;\r\n }\r\n case CharCode.COMMA: {\r\n ++this.pos;\r\n return Token.COMMA;\r\n }\r\n case CharCode.MINUS: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.MINUS) {\r\n ++this.pos;\r\n return Token.MINUS_MINUS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.MINUS_EQUALS;\r\n }\r\n }\r\n return Token.MINUS;\r\n }\r\n case CharCode.DOT: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (isDecimalDigit(text.charCodeAt(this.pos))) {\r\n --this.pos;\r\n return Token.FLOATLITERAL; // expects a call to readFloat\r\n }\r\n if (\r\n maxTokenLength > 2 && this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.DOT &&\r\n text.charCodeAt(this.pos + 1) == CharCode.DOT\r\n ) {\r\n this.pos += 2;\r\n return Token.DOT_DOT_DOT;\r\n }\r\n }\r\n return Token.DOT;\r\n }\r\n case CharCode.SLASH: {\r\n let commentStartPos = this.pos;\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.SLASH) { // single-line\r\n let commentKind = CommentKind.LINE;\r\n if (\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n ) {\r\n ++this.pos;\r\n commentKind = CommentKind.TRIPLE;\r\n }\r\n while (++this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.LINEFEED) {\r\n ++this.pos;\r\n break;\r\n }\r\n }\r\n if (this.onComment) {\r\n this.onComment(\r\n commentKind,\r\n text.substring(commentStartPos, this.pos),\r\n this.range(commentStartPos, this.pos)\r\n );\r\n }\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) { // multi-line\r\n let closed = false;\r\n while (++this.pos < this.end) {\r\n c = text.charCodeAt(this.pos);\r\n if (\r\n c == CharCode.ASTERISK &&\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n ) {\r\n this.pos += 2;\r\n closed = true;\r\n break;\r\n }\r\n }\r\n if (!closed) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n this.range(this.pos), \"*/\"\r\n );\r\n } else if (this.onComment) {\r\n this.onComment(\r\n CommentKind.BLOCK,\r\n text.substring(commentStartPos, this.pos),\r\n this.range(commentStartPos, this.pos)\r\n );\r\n }\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.SLASH_EQUALS;\r\n }\r\n }\r\n return Token.SLASH;\r\n }\r\n case CharCode._0:\r\n case CharCode._1:\r\n case CharCode._2:\r\n case CharCode._3:\r\n case CharCode._4:\r\n case CharCode._5:\r\n case CharCode._6:\r\n case CharCode._7:\r\n case CharCode._8:\r\n case CharCode._9: {\r\n return this.testInteger()\r\n ? Token.INTEGERLITERAL // expects a call to readInteger\r\n : Token.FLOATLITERAL; // expects a call to readFloat\r\n }\r\n case CharCode.COLON: {\r\n ++this.pos;\r\n return Token.COLON;\r\n }\r\n case CharCode.SEMICOLON: {\r\n ++this.pos;\r\n return Token.SEMICOLON;\r\n }\r\n case CharCode.LESSTHAN: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.LESSTHAN) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.LESSTHAN_LESSTHAN_EQUALS;\r\n }\r\n return Token.LESSTHAN_LESSTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.LESSTHAN_EQUALS;\r\n }\r\n }\r\n return Token.LESSTHAN;\r\n }\r\n case CharCode.EQUALS: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.EQUALS_EQUALS_EQUALS;\r\n }\r\n return Token.EQUALS_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n return Token.EQUALS_GREATERTHAN;\r\n }\r\n }\r\n return Token.EQUALS;\r\n }\r\n case CharCode.GREATERTHAN: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 3 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN;\r\n }\r\n case CharCode.QUESTION: {\r\n ++this.pos;\r\n return Token.QUESTION;\r\n }\r\n case CharCode.OPENBRACKET: {\r\n ++this.pos;\r\n return Token.OPENBRACKET;\r\n }\r\n case CharCode.CLOSEBRACKET: {\r\n ++this.pos;\r\n return Token.CLOSEBRACKET;\r\n }\r\n case CharCode.CARET: {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.CARET_EQUALS;\r\n }\r\n return Token.CARET;\r\n }\r\n case CharCode.OPENBRACE: {\r\n ++this.pos;\r\n return Token.OPENBRACE;\r\n }\r\n case CharCode.BAR: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.BAR) {\r\n ++this.pos;\r\n return Token.BAR_BAR;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.BAR_EQUALS;\r\n }\r\n }\r\n return Token.BAR;\r\n }\r\n case CharCode.CLOSEBRACE: {\r\n ++this.pos;\r\n return Token.CLOSEBRACE;\r\n }\r\n case CharCode.TILDE: {\r\n ++this.pos;\r\n return Token.TILDE;\r\n }\r\n case CharCode.AT: {\r\n ++this.pos;\r\n return Token.AT;\r\n }\r\n default: {\r\n if (isIdentifierStart(c)) {\r\n if (isKeywordCharacter(c)) {\r\n let posBefore = this.pos;\r\n while (\r\n ++this.pos < this.end &&\r\n isIdentifierPart(c = text.charCodeAt(this.pos))\r\n ) {\r\n if (!isKeywordCharacter(c)) {\r\n this.pos = posBefore;\r\n return Token.IDENTIFIER;\r\n }\r\n }\r\n let keywordText = text.substring(posBefore, this.pos);\r\n let keywordToken = tokenFromKeyword(keywordText);\r\n if (\r\n keywordToken != Token.INVALID &&\r\n identifierHandling !== IdentifierHandling.ALWAYS &&\r\n !(\r\n identifierHandling === IdentifierHandling.PREFER &&\r\n tokenIsAlsoIdentifier(keywordToken)\r\n )\r\n ) {\r\n return keywordToken;\r\n }\r\n this.pos = posBefore;\r\n }\r\n return Token.IDENTIFIER; // expects a call to readIdentifier\r\n } else if (isWhiteSpace(c)) {\r\n ++this.pos;\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Invalid_character,\r\n this.range(this.pos, this.pos + 1)\r\n );\r\n ++this.pos;\r\n return Token.INVALID;\r\n }\r\n }\r\n }\r\n return Token.ENDOFFILE;\r\n }\r\n\r\n peek(\r\n checkOnNewLine: bool = false,\r\n identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\r\n maxCompoundLength: i32 = i32.MAX_VALUE\r\n ): Token {\r\n var text = this.source.text;\r\n if (this.nextToken < 0) {\r\n let posBefore = this.pos;\r\n let tokenBefore = this.token;\r\n let tokenPosBefore = this.tokenPos;\r\n this.nextToken = this.unsafeNext(identifierHandling, maxCompoundLength);\r\n this.nextTokenPos = this.tokenPos;\r\n if (checkOnNewLine) {\r\n this.nextTokenOnNewLine = false;\r\n for (let pos = posBefore, end = this.nextTokenPos; pos < end; ++pos) {\r\n if (isLineBreak(text.charCodeAt(pos))) {\r\n this.nextTokenOnNewLine = true;\r\n break;\r\n }\r\n }\r\n }\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n }\r\n return this.nextToken;\r\n }\r\n\r\n skipIdentifier(identifierHandling: IdentifierHandling = IdentifierHandling.PREFER): bool {\r\n return this.skip(Token.IDENTIFIER, identifierHandling);\r\n }\r\n\r\n skip(token: Token, identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): bool {\r\n var posBefore = this.pos;\r\n var tokenBefore = this.token;\r\n var tokenPosBefore = this.tokenPos;\r\n var maxCompoundLength = i32.MAX_VALUE;\r\n switch (token) {\r\n case Token.GREATERTHAN: { // where parsing type arguments\r\n maxCompoundLength = 1;\r\n break;\r\n }\r\n }\r\n this.token = this.unsafeNext(identifierHandling, maxCompoundLength);\r\n if (this.token == token) {\r\n this.nextToken = -1;\r\n return true;\r\n } else {\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n return false;\r\n }\r\n }\r\n\r\n mark(): State {\r\n var state: State;\r\n if (reusableState) {\r\n state = reusableState;\r\n reusableState = null;\r\n } else {\r\n state = new State();\r\n }\r\n state.pos = this.pos;\r\n state.token = this.token;\r\n state.tokenPos = this.tokenPos;\r\n return state;\r\n }\r\n\r\n discard(state: State): void {\r\n reusableState = state;\r\n }\r\n\r\n reset(state: State): void {\r\n this.pos = state.pos;\r\n this.token = state.token;\r\n this.tokenPos = state.tokenPos;\r\n this.nextToken = -1;\r\n }\r\n\r\n range(start: i32 = -1, end: i32 = -1): Range {\r\n if (start < 0) {\r\n start = this.tokenPos;\r\n end = this.pos;\r\n } else if (end < 0) {\r\n end = start;\r\n }\r\n return new Range(this.source, start, end);\r\n }\r\n\r\n readIdentifier(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n while (\r\n ++this.pos < this.end &&\r\n isIdentifierPart(text.charCodeAt(this.pos))\r\n );\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n readString(): string {\r\n var text = this.source.text;\r\n var quote = text.charCodeAt(this.pos++);\r\n var start = this.pos;\r\n var result = \"\";\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n result += text.substring(start, this.pos);\r\n this.error(\r\n DiagnosticCode.Unterminated_string_literal,\r\n this.range(start - 1, this.end)\r\n );\r\n break;\r\n }\r\n let c = text.charCodeAt(this.pos);\r\n if (c == quote) {\r\n result += text.substring(start, this.pos++);\r\n break;\r\n }\r\n if (c == CharCode.BACKSLASH) {\r\n result += text.substring(start, this.pos);\r\n result += this.readEscapeSequence();\r\n start = this.pos;\r\n continue;\r\n }\r\n if (isLineBreak(c)) {\r\n result += text.substring(start, this.pos);\r\n this.error(\r\n DiagnosticCode.Unterminated_string_literal,\r\n this.range(start - 1, this.pos)\r\n );\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n return result;\r\n }\r\n\r\n readEscapeSequence(): string {\r\n if (++this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(this.end)\r\n );\r\n return \"\";\r\n }\r\n\r\n var text = this.source.text;\r\n var c = text.charCodeAt(this.pos++);\r\n switch (c) {\r\n case CharCode._0: return \"\\0\";\r\n case CharCode.b: return \"\\b\";\r\n case CharCode.t: return \"\\t\";\r\n case CharCode.n: return \"\\n\";\r\n case CharCode.v: return \"\\v\";\r\n case CharCode.f: return \"\\f\";\r\n case CharCode.r: return \"\\r\";\r\n case CharCode.SINGLEQUOTE: return \"'\";\r\n case CharCode.DOUBLEQUOTE: return \"\\\"\";\r\n case CharCode.u: {\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.OPENBRACE\r\n ) {\r\n ++this.pos;\r\n return this.readExtendedUnicodeEscape(); // \\u{DDDDDDDD}\r\n }\r\n return this.readUnicodeEscape(); // \\uDDDD\r\n }\r\n case CharCode.CARRIAGERETURN: {\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n ) {\r\n ++this.pos;\r\n }\r\n // fall through\r\n }\r\n case CharCode.LINEFEED:\r\n case CharCode.LINESEPARATOR:\r\n case CharCode.PARAGRAPHSEPARATOR: return \"\";\r\n default: return String.fromCharCode(c);\r\n }\r\n }\r\n\r\n readRegexpPattern(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var escaped = false;\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unterminated_regular_expression_literal,\r\n this.range(start, this.end)\r\n );\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.BACKSLASH) {\r\n ++this.pos;\r\n escaped = true;\r\n continue;\r\n }\r\n let c = text.charCodeAt(this.pos);\r\n if (c == CharCode.SLASH && !escaped) break;\r\n if (isLineBreak(c)) {\r\n this.error(\r\n DiagnosticCode.Unterminated_regular_expression_literal,\r\n this.range(start, this.pos)\r\n );\r\n break;\r\n }\r\n ++this.pos;\r\n escaped = false;\r\n }\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n readRegexpFlags(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var flags = 0;\r\n while (this.pos < this.end) {\r\n let c: i32 = text.charCodeAt(this.pos);\r\n if (!isIdentifierPart(c)) break;\r\n ++this.pos;\r\n\r\n // make sure each supported flag is unique\r\n switch (c) {\r\n case CharCode.g: {\r\n flags |= flags & 1 ? -1 : 1;\r\n break;\r\n }\r\n case CharCode.i: {\r\n flags |= flags & 2 ? -1 : 2;\r\n break;\r\n }\r\n case CharCode.m: {\r\n flags |= flags & 4 ? -1 : 4;\r\n break;\r\n }\r\n default: {\r\n flags = -1;\r\n break;\r\n }\r\n }\r\n }\r\n if (flags == -1) {\r\n this.error(\r\n DiagnosticCode.Invalid_regular_expression_flags,\r\n this.range(start, this.pos)\r\n );\r\n }\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n testInteger(): bool {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 1 < this.end) {\r\n switch (text.charCodeAt(this.pos + 2)) {\r\n case CharCode.X:\r\n case CharCode.x:\r\n case CharCode.B:\r\n case CharCode.b:\r\n case CharCode.O:\r\n case CharCode.o: return true;\r\n }\r\n }\r\n var pos = this.pos;\r\n while (pos < this.end) {\r\n let c = text.charCodeAt(pos);\r\n if (c == CharCode.DOT || c == CharCode.E || c == CharCode.e) {\r\n return false;\r\n }\r\n if ((c < CharCode._0 || c > CharCode._9) && c != CharCode._) break;\r\n // does not validate separator placement (this is done in readXYInteger)\r\n pos++;\r\n }\r\n return true;\r\n }\r\n\r\n readInteger(): I64 {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\r\n switch (text.charCodeAt(this.pos + 1)) {\r\n case CharCode.X:\r\n case CharCode.x: {\r\n this.pos += 2;\r\n return this.readHexInteger();\r\n }\r\n case CharCode.B:\r\n case CharCode.b: {\r\n this.pos += 2;\r\n return this.readBinaryInteger();\r\n }\r\n case CharCode.O:\r\n case CharCode.o: {\r\n this.pos += 2;\r\n return this.readOctalInteger();\r\n }\r\n }\r\n if (isOctalDigit(text.charCodeAt(this.pos + 1))) {\r\n let start = this.pos;\r\n ++this.pos;\r\n let value = this.readOctalInteger();\r\n this.error(\r\n DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode,\r\n this.range(start, this.pos)\r\n );\r\n return value;\r\n }\r\n }\r\n return this.readDecimalInteger();\r\n }\r\n\r\n readHexInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_16 = i64_new(16, 0);\r\n var sepEnd = start;\r\n while (this.pos < this.end) {\r\n let pos = this.pos;\r\n let c = text.charCodeAt(pos);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n // value = value * 16 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else if (c >= CharCode.A && c <= CharCode.F) {\r\n // value = value * 16 + 10 + c - CharCode.A;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(10 + c - CharCode.A, 0)\r\n );\r\n } else if (c >= CharCode.a && c <= CharCode.f) {\r\n // value = value * 16 + 10 + c - CharCode.a;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(10 + c - CharCode.a, 0)\r\n );\r\n } else if (c == CharCode._) {\r\n if (sepEnd == pos) {\r\n this.error(\r\n sepEnd == start\r\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n this.range(pos)\r\n );\r\n }\r\n sepEnd = pos + 1;\r\n } else {\r\n break;\r\n }\r\n this.pos = pos + 1;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Hexadecimal_digit_expected,\r\n this.range(start)\r\n );\r\n } else if (sepEnd == this.pos) {\r\n this.error(\r\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n this.range(sepEnd - 1)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readDecimalInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_10 = i64_new(10, 0);\r\n var sepEnd = start;\r\n while (this.pos < this.end) {\r\n let pos = this.pos;\r\n let c = text.charCodeAt(pos);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n // value = value * 10 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_10),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else if (c == CharCode._) {\r\n if (sepEnd == pos) {\r\n this.error(\r\n sepEnd == start\r\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n this.range(pos)\r\n );\r\n }\r\n sepEnd = pos + 1;\r\n } else {\r\n break;\r\n }\r\n this.pos = pos + 1;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Digit_expected,\r\n this.range(start)\r\n );\r\n } else if (sepEnd == this.pos) {\r\n this.error(\r\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n this.range(sepEnd - 1)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readOctalInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_8 = i64_new(8, 0);\r\n var sepEnd = start;\r\n while (this.pos < this.end) {\r\n let pos = this.pos;\r\n let c = text.charCodeAt(pos);\r\n if (c >= CharCode._0 && c <= CharCode._7) {\r\n // value = value * 8 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_8),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else if (c == CharCode._) {\r\n if (sepEnd == pos) {\r\n this.error(\r\n sepEnd == start\r\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n this.range(pos)\r\n );\r\n }\r\n sepEnd = pos + 1;\r\n } else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Octal_digit_expected,\r\n this.range(start)\r\n );\r\n } else if (sepEnd == this.pos) {\r\n this.error(\r\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n this.range(sepEnd - 1)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readBinaryInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_2 = i64_new(2, 0);\r\n var i64_1 = i64_new(1, 0);\r\n var sepEnd = start;\r\n while (this.pos < this.end) {\r\n let pos = this.pos;\r\n let c = text.charCodeAt(pos);\r\n if (c == CharCode._0) {\r\n // value = value * 2;\r\n value = i64_mul(\r\n value,\r\n i64_2\r\n );\r\n } else if (c == CharCode._1) {\r\n // value = value * 2 + 1;\r\n value = i64_add(\r\n i64_mul(value, i64_2),\r\n i64_1\r\n );\r\n } else if (c == CharCode._) {\r\n if (sepEnd == pos) {\r\n this.error(\r\n sepEnd == start\r\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n this.range(pos)\r\n );\r\n }\r\n sepEnd = pos + 1;\r\n } else {\r\n break;\r\n }\r\n this.pos = pos + 1;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Binary_digit_expected,\r\n this.range(start)\r\n );\r\n } else if (sepEnd == this.pos) {\r\n this.error(\r\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n this.range(sepEnd - 1)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readFloat(): f64 {\r\n // var text = this.source.text;\r\n // if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\r\n // switch (text.charCodeAt(this.pos + 1)) {\r\n // case CharCode.X:\r\n // case CharCode.x: {\r\n // this.pos += 2;\r\n // return this.readHexFloat();\r\n // }\r\n // }\r\n // }\r\n return this.readDecimalFloat();\r\n }\r\n\r\n readDecimalFloat(): f64 {\r\n // TODO: numeric separators (parseFloat can't handle these)\r\n var start = this.pos;\r\n var text = this.source.text;\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n if (this.pos < this.end && text.charCodeAt(this.pos) == CharCode.DOT) {\r\n ++this.pos;\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n if (this.pos < this.end) {\r\n let c = text.charCodeAt(this.pos);\r\n if (c == CharCode.E || c == CharCode.e) {\r\n if (\r\n ++this.pos < this.end && (\r\n text.charCodeAt(this.pos) == CharCode.MINUS ||\r\n text.charCodeAt(this.pos) == CharCode.PLUS\r\n ) &&\r\n isDecimalDigit(text.charCodeAt(this.pos + 1))\r\n ) {\r\n ++this.pos;\r\n }\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n }\r\n return parseFloat(text.substring(start, this.pos));\r\n }\r\n\r\n readHexFloat(): f64 {\r\n throw new Error(\"not implemented\"); // TBD\r\n }\r\n\r\n readUnicodeEscape(): string {\r\n var remain = 4;\r\n var value = 0;\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n let c = text.charCodeAt(this.pos++);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n value = value * 16 + c - CharCode._0;\r\n } else if (c >= CharCode.A && c <= CharCode.F) {\r\n value = value * 16 + 10 + c - CharCode.A;\r\n } else if (c >= CharCode.a && c <= CharCode.f) {\r\n value = value * 16 + 10 + c - CharCode.a;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Hexadecimal_digit_expected,\r\n this.range(this.pos - 1, this.pos)\r\n );\r\n return \"\";\r\n }\r\n if (--remain == 0) break;\r\n }\r\n if (remain) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(this.pos)\r\n );\r\n return \"\";\r\n }\r\n return String.fromCharCode(value);\r\n }\r\n\r\n private readExtendedUnicodeEscape(): string {\r\n var start = this.pos;\r\n var value = this.readHexInteger();\r\n var value32 = i64_low(value);\r\n var invalid = false;\r\n\r\n assert(!i64_high(value));\r\n if (value32 > 0x10FFFF) {\r\n this.error(\r\n DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,\r\n this.range(start, this.pos)\r\n );\r\n invalid = true;\r\n }\r\n\r\n var text = this.source.text;\r\n if (this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(start, this.end)\r\n );\r\n invalid = true;\r\n } else if (text.charCodeAt(this.pos) == CharCode.CLOSEBRACE) {\r\n ++this.pos;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Unterminated_Unicode_escape_sequence,\r\n this.range(start, this.pos)\r\n );\r\n invalid = true;\r\n }\r\n\r\n if (invalid) return \"\";\r\n return value32 < 65536\r\n ? String.fromCharCode(value32)\r\n : String.fromCharCode(\r\n (((value32 - 65536) / 1024 | 0) + 0xD800) as i32,\r\n ( (value32 - 65536) % 1024 + 0xDC00) as i32\r\n );\r\n }\r\n\r\n finish(): void {\r\n }\r\n}\r\n\r\n/** Tokenizer state as returned by {@link Tokenizer#mark} and consumed by {@link Tokenizer#reset}. */\r\nexport class State {\r\n /** Current position. */\r\n pos: i32;\r\n /** Current token. */\r\n token: Token;\r\n /** Current token's position. */\r\n tokenPos: i32;\r\n}\r\n\r\n// Reusable state object to reduce allocations\r\nvar reusableState: State | null = null;\r\n","/**\r\n * Mappings from AssemblyScript types to WebAssembly types.\r\n * @module types\r\n *//***/\r\n\r\nimport {\r\n Class,\r\n FunctionTarget,\r\n Program,\r\n DecoratorFlags\r\n} from \"./program\";\r\n\r\nimport {\r\n NativeType,\r\n ExpressionRef,\r\n Module\r\n} from \"./module\";\r\n\r\n/** Indicates the kind of a type. */\r\nexport const enum TypeKind {\r\n\r\n // signed integers\r\n\r\n /** An 8-bit signed integer. */\r\n I8,\r\n /** A 16-bit signed integer. */\r\n I16,\r\n /** A 32-bit signed integer. */\r\n I32,\r\n /** A 64-bit signed integer. */\r\n I64,\r\n /** A 32-bit/64-bit signed integer, depending on the target. */\r\n ISIZE,\r\n\r\n // unsigned integers\r\n\r\n /** An 8-bit unsigned integer. */\r\n U8,\r\n /** A 16-bit unsigned integer. */\r\n U16,\r\n /** A 32-bit unsigned integer. Also the base of function types. */\r\n U32,\r\n /** A 64-bit unsigned integer. */\r\n U64,\r\n /** A 32-bit/64-bit unsigned integer, depending on the target. Also the base of class types. */\r\n USIZE,\r\n /** A 1-bit unsigned integer. */\r\n BOOL, // sic\r\n\r\n // floats\r\n\r\n /** A 32-bit float. */\r\n F32,\r\n /** A 64-bit double. */\r\n F64,\r\n\r\n // vectors\r\n V128,\r\n\r\n // other\r\n\r\n /** No return type. */\r\n VOID\r\n}\r\n\r\n/** Indicates capabilities of a type. */\r\nexport const enum TypeFlags {\r\n NONE = 0,\r\n /** Is a signed type that can represent negative values. */\r\n SIGNED = 1 << 0,\r\n /** Is an unsigned type that cannot represent negative values. */\r\n UNSIGNED = 1 << 1,\r\n /** Is an integer type. */\r\n INTEGER = 1 << 2,\r\n /** Is a floating point type. */\r\n FLOAT = 1 << 3,\r\n /** Is a pointer type. */\r\n POINTER = 1 << 4,\r\n /** Is smaller than 32-bits. */\r\n SHORT = 1 << 5,\r\n /** Is larger than 32-bits. */\r\n LONG = 1 << 6,\r\n /** Is a value type. */\r\n VALUE = 1 << 7,\r\n /** Is a reference type. */\r\n REFERENCE = 1 << 8,\r\n /** Is a nullable type. */\r\n NULLABLE = 1 << 9,\r\n /** Is a vector type. */\r\n VECTOR = 1 << 10\r\n}\r\n\r\nconst v128_zero = new Uint8Array(16);\r\n\r\n/** Represents a resolved type. */\r\nexport class Type {\r\n\r\n /** Type kind. */\r\n kind: TypeKind;\r\n /** Type flags. */\r\n flags: TypeFlags;\r\n /** Size in bits. */\r\n size: u32;\r\n /** Size in bytes. */\r\n byteSize: i32;\r\n /** Underlying class reference, if a class type. */\r\n classReference: Class | null;\r\n /** Underlying signature reference, if a function type. */\r\n signatureReference: Signature | null;\r\n /** Respective non-nullable type, if nullable. */\r\n nonNullableType: Type;\r\n /** Cached nullable type, if non-nullable. */\r\n private cachedNullableType: Type | null = null;\r\n\r\n /** Constructs a new resolved type. */\r\n constructor(kind: TypeKind, flags: TypeFlags, size: u32) {\r\n this.kind = kind;\r\n this.flags = flags;\r\n this.size = size;\r\n this.byteSize = ceil(size / 8);\r\n this.classReference = null;\r\n this.signatureReference = null;\r\n this.nonNullableType = this;\r\n }\r\n\r\n /** Returns the closest int type representing this type. */\r\n get intType(): Type {\r\n switch (this.kind) {\r\n case TypeKind.I8: return Type.i8;\r\n case TypeKind.I16: return Type.i16;\r\n case TypeKind.F32:\r\n case TypeKind.I32: return Type.i32;\r\n case TypeKind.F64:\r\n case TypeKind.I64: return Type.i64;\r\n case TypeKind.ISIZE: return this.size == 64 ? Type.isize64 : Type.isize32;\r\n case TypeKind.U8: return Type.u8;\r\n case TypeKind.U16: return Type.u16;\r\n case TypeKind.U32: return Type.u32;\r\n case TypeKind.U64: return Type.u64;\r\n case TypeKind.USIZE: return this.size == 64 ? Type.usize64 : Type.usize32;\r\n case TypeKind.BOOL:\r\n default: return Type.i32;\r\n }\r\n }\r\n\r\n /** Tests if this is a managed type that needs GC hooks. */\r\n isManaged(program: Program): bool {\r\n if (program.hasGC) {\r\n let classReference = this.classReference;\r\n return classReference !== null && !classReference.hasDecorator(DecoratorFlags.UNMANAGED);\r\n }\r\n return false;\r\n }\r\n\r\n /** Computes the sign-extending shift in the target type. */\r\n computeSmallIntegerShift(targetType: Type): u32 {\r\n return targetType.size - this.size;\r\n }\r\n\r\n /** Computes the truncating mask in the target type. */\r\n computeSmallIntegerMask(targetType: Type): u32 {\r\n var size = this.is(TypeFlags.UNSIGNED) ? this.size : this.size - 1;\r\n return ~0 >>> (targetType.size - size);\r\n }\r\n\r\n /** Tests if this type has (all of) the specified flags. */\r\n is(flags: TypeFlags): bool { return (this.flags & flags) == flags; }\r\n /** Tests if this type has any of the specified flags. */\r\n isAny(flags: TypeFlags): bool { return (this.flags & flags) != 0; }\r\n\r\n /** Composes a class type from this type and a class. */\r\n asClass(classType: Class): Type {\r\n assert(this.kind == TypeKind.USIZE && !this.classReference);\r\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n ret.classReference = classType;\r\n return ret;\r\n }\r\n\r\n /** Composes a function type from this type and a function. */\r\n asFunction(signature: Signature): Type {\r\n assert(this.kind == TypeKind.U32 && !this.signatureReference);\r\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n ret.signatureReference = signature;\r\n return ret;\r\n }\r\n\r\n /** Composes the respective nullable type of this type. */\r\n asNullable(): Type {\r\n assert(this.is(TypeFlags.REFERENCE));\r\n if (!this.cachedNullableType) {\r\n assert(!this.is(TypeFlags.NULLABLE));\r\n this.cachedNullableType = new Type(this.kind, this.flags | TypeFlags.NULLABLE, this.size);\r\n this.cachedNullableType.nonNullableType = this;\r\n this.cachedNullableType.classReference = this.classReference; // either a class reference\r\n this.cachedNullableType.signatureReference = this.signatureReference; // or a function reference\r\n }\r\n return this.cachedNullableType;\r\n }\r\n\r\n /** Tests if a value of this type is assignable to a target of the specified type. */\r\n isAssignableTo(target: Type, signednessIsRelevant: bool = false): bool {\r\n var currentClass: Class | null;\r\n var targetClass: Class | null;\r\n var currentFunction: Signature | null;\r\n var targetFunction: Signature | null;\r\n if (this.is(TypeFlags.REFERENCE)) {\r\n if (target.is(TypeFlags.REFERENCE)) {\r\n if (!this.is(TypeFlags.NULLABLE) || target.is(TypeFlags.NULLABLE)) {\r\n if (currentClass = this.classReference) {\r\n if (targetClass = target.classReference) {\r\n return currentClass.isAssignableTo(targetClass);\r\n }\r\n } else if (currentFunction = this.signatureReference) {\r\n if (targetFunction = target.signatureReference) {\r\n return currentFunction.isAssignableTo(targetFunction);\r\n }\r\n }\r\n }\r\n }\r\n } else if (!target.is(TypeFlags.REFERENCE)) {\r\n if (this.is(TypeFlags.INTEGER)) {\r\n if (target.is(TypeFlags.INTEGER)) {\r\n if (\r\n !signednessIsRelevant ||\r\n this == Type.bool || // a bool (0 or 1) can be safely assigned to all sorts of integers\r\n this.is(TypeFlags.SIGNED) == target.is(TypeFlags.SIGNED)\r\n ) {\r\n return this.size <= target.size;\r\n }\r\n } else if (target.kind == TypeKind.F32) {\r\n return this.size <= 23; // mantissa bits\r\n } else if (target.kind == TypeKind.F64) {\r\n return this.size <= 52; // ^\r\n }\r\n } else if (this.is(TypeFlags.FLOAT)) {\r\n if (target.is(TypeFlags.FLOAT)) {\r\n return this.size <= target.size;\r\n }\r\n } else if (this.is(TypeFlags.VECTOR)) {\r\n if (target.is(TypeFlags.VECTOR)) {\r\n return this.size == target.size;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /** Determines the common compatible type of two types, if any. */\r\n static commonCompatible(left: Type, right: Type, signednessIsImportant: bool): Type | null {\r\n if (right.isAssignableTo(left, signednessIsImportant)) return left;\r\n else if (left.isAssignableTo(right, signednessIsImportant)) return right;\r\n return null;\r\n }\r\n\r\n /** Converts this type to its TypeScript representation. */\r\n toString(kindOnly: bool = false): string {\r\n if (!kindOnly && this.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.classReference;\r\n if (classReference) {\r\n return this.is(TypeFlags.NULLABLE)\r\n ? classReference.toString() + \" | null\"\r\n : classReference.toString();\r\n }\r\n let signatureReference = this.signatureReference;\r\n if (signatureReference) {\r\n return this.is(TypeFlags.NULLABLE)\r\n ? \"(\" + signatureReference.toString(true) + \") | null\"\r\n : signatureReference.toString(true);\r\n }\r\n assert(false);\r\n }\r\n switch (this.kind) {\r\n case TypeKind.I8: return \"i8\";\r\n case TypeKind.I16: return \"i16\";\r\n case TypeKind.I32: return \"i32\";\r\n case TypeKind.I64: return \"i64\";\r\n case TypeKind.ISIZE: return \"isize\";\r\n case TypeKind.U8: return \"u8\";\r\n case TypeKind.U16: return \"u16\";\r\n case TypeKind.U32: return \"u32\";\r\n case TypeKind.U64: return \"u64\";\r\n case TypeKind.USIZE: return \"usize\";\r\n case TypeKind.BOOL: return \"bool\";\r\n case TypeKind.F32: return \"f32\";\r\n case TypeKind.F64: return \"f64\";\r\n case TypeKind.V128: return \"v128\";\r\n default: assert(false);\r\n case TypeKind.VOID: return \"void\";\r\n }\r\n }\r\n\r\n // Binaryen specific\r\n\r\n /** Converts this type to its respective native type. */\r\n toNativeType(): NativeType {\r\n switch (this.kind) {\r\n default: return NativeType.I32;\r\n case TypeKind.I64:\r\n case TypeKind.U64: return NativeType.I64;\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: return this.size == 64 ? NativeType.I64 : NativeType.I32;\r\n case TypeKind.F32: return NativeType.F32;\r\n case TypeKind.F64: return NativeType.F64;\r\n case TypeKind.V128: return NativeType.V128;\r\n case TypeKind.VOID: return NativeType.None;\r\n }\r\n }\r\n\r\n /** Converts this type to its native `0` value. */\r\n toNativeZero(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n case TypeKind.VOID: assert(false);\r\n default: return module.createI32(0);\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(0);\r\n case TypeKind.I64:\r\n case TypeKind.U64: return module.createI64(0);\r\n case TypeKind.F32: return module.createF32(0);\r\n case TypeKind.F64: return module.createF64(0);\r\n case TypeKind.V128: return module.createV128(v128_zero);\r\n }\r\n }\r\n\r\n /** Converts this type to its native `1` value. */\r\n toNativeOne(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n case TypeKind.V128:\r\n case TypeKind.VOID: assert(false);\r\n default: return module.createI32(1);\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(1);\r\n case TypeKind.I64:\r\n case TypeKind.U64: return module.createI64(1);\r\n case TypeKind.F32: return module.createF32(1);\r\n case TypeKind.F64: return module.createF64(1);\r\n }\r\n }\r\n\r\n /** Converts this type to its native `-1` value. */\r\n toNativeNegOne(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n case TypeKind.V128:\r\n case TypeKind.VOID: assert(false);\r\n default: return module.createI32(-1);\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(-1);\r\n case TypeKind.I64:\r\n case TypeKind.U64: return module.createI64(-1, -1);\r\n case TypeKind.F32: return module.createF32(-1);\r\n case TypeKind.F64: return module.createF64(-1);\r\n }\r\n }\r\n\r\n /** Converts this type to its signature string. */\r\n toSignatureString(): string {\r\n switch (this.kind) {\r\n default: return \"i\";\r\n case TypeKind.I64:\r\n case TypeKind.U64: return \"I\";\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: return this.size == 64 ? \"I\" : \"i\";\r\n case TypeKind.F32: return \"f\";\r\n case TypeKind.F64: return \"F\";\r\n case TypeKind.V128: return \"v\";\r\n case TypeKind.VOID: return \"_\";\r\n }\r\n }\r\n\r\n // Types\r\n\r\n /** An 8-bit signed integer. */\r\n static readonly i8: Type = new Type(TypeKind.I8,\r\n TypeFlags.SIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 8\r\n );\r\n\r\n /** A 16-bit signed integer. */\r\n static readonly i16: Type = new Type(TypeKind.I16,\r\n TypeFlags.SIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 16\r\n );\r\n\r\n /** A 32-bit signed integer. */\r\n static readonly i32: Type = new Type(TypeKind.I32,\r\n TypeFlags.SIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit signed integer. */\r\n static readonly i64: Type = new Type(TypeKind.I64,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 32-bit signed size. WASM32 only. */\r\n static readonly isize32: Type = new Type(TypeKind.ISIZE,\r\n TypeFlags.SIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.POINTER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit signed size. WASM64 only. */\r\n static readonly isize64: Type = new Type(TypeKind.ISIZE,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.POINTER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** An 8-bit unsigned integer. */\r\n static readonly u8: Type = new Type(TypeKind.U8,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 8\r\n );\r\n\r\n /** A 16-bit unsigned integer. */\r\n static readonly u16: Type = new Type(TypeKind.U16,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 16\r\n );\r\n\r\n /** A 32-bit unsigned integer. */\r\n static readonly u32: Type = new Type(TypeKind.U32,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit unsigned integer. */\r\n static readonly u64: Type = new Type(TypeKind.U64,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 32-bit unsigned size. WASM32 only. */\r\n static readonly usize32: Type = new Type(TypeKind.USIZE,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.POINTER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit unsigned size. WASM64 only. */\r\n static readonly usize64: Type = new Type(TypeKind.USIZE,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.POINTER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 1-bit unsigned integer. */\r\n static readonly bool: Type = new Type(TypeKind.BOOL,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 1\r\n );\r\n\r\n /** A 32-bit float. */\r\n static readonly f32: Type = new Type(TypeKind.F32,\r\n TypeFlags.SIGNED |\r\n TypeFlags.FLOAT |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit float. */\r\n static readonly f64: Type = new Type(TypeKind.F64,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.FLOAT |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 128-bit vector. */\r\n static readonly v128: Type = new Type(TypeKind.V128,\r\n TypeFlags.VECTOR |\r\n TypeFlags.VALUE, 128\r\n );\r\n\r\n /** No return type. */\r\n static readonly void: Type = new Type(TypeKind.VOID, TypeFlags.NONE, 0);\r\n}\r\n\r\n/** Converts an array of types to an array of native types. */\r\nexport function typesToNativeTypes(types: Type[]): NativeType[] {\r\n var numTypes = types.length;\r\n var ret = new Array(numTypes);\r\n for (let i = 0; i < numTypes; ++i) ret[i] = types[i].toNativeType();\r\n return ret;\r\n}\r\n\r\n/** Converts an array of types to its combined string representation. */\r\nexport function typesToString(types: Type[]): string {\r\n var numTypes = types.length;\r\n if (!numTypes) return \"\";\r\n var sb = new Array(numTypes);\r\n for (let i = 0; i < numTypes; ++i) sb[i] = types[i].toString();\r\n return sb.join(\",\");\r\n}\r\n\r\n/** Represents a fully resolved function signature. */\r\nexport class Signature {\r\n\r\n /** Parameter types, if any, excluding `this`. */\r\n parameterTypes: Type[];\r\n /** Parameter names, if known, excluding `this`. */\r\n parameterNames: string[] | null;\r\n /** Number of required parameters excluding `this`. Other parameters are considered optional. */\r\n requiredParameters: i32;\r\n /** Return type. */\r\n returnType: Type;\r\n /** This type, if an instance signature. */\r\n thisType: Type | null;\r\n /** Whether the last parameter is a rest parameter. */\r\n hasRest: bool;\r\n /** Cached {@link FunctionTarget}. */\r\n cachedFunctionTarget: FunctionTarget | null = null;\r\n /** Respective function type. */\r\n type: Type;\r\n\r\n /** Constructs a new signature. */\r\n constructor(\r\n parameterTypes: Type[] | null = null,\r\n returnType: Type | null = null,\r\n thisType: Type | null = null\r\n ) {\r\n this.parameterTypes = parameterTypes ? parameterTypes : [];\r\n this.parameterNames = null;\r\n this.requiredParameters = 0;\r\n this.returnType = returnType ? returnType : Type.void;\r\n this.thisType = thisType;\r\n this.hasRest = false;\r\n this.type = Type.u32.asFunction(this);\r\n }\r\n\r\n asFunctionTarget(program: Program): FunctionTarget {\r\n var target = this.cachedFunctionTarget;\r\n if (!target) this.cachedFunctionTarget = target = new FunctionTarget(program, this);\r\n else assert(target.program == program);\r\n return target;\r\n }\r\n\r\n /** Gets the known or, alternatively, generic parameter name at the specified index. */\r\n getParameterName(index: i32): string {\r\n var parameterNames = this.parameterNames;\r\n return parameterNames && parameterNames.length > index\r\n ? parameterNames[index]\r\n : getDefaultParameterName(index);\r\n }\r\n\r\n /** Tests if a value of this function type is assignable to a target of the specified function type. */\r\n isAssignableTo(target: Signature): bool {\r\n // TODO: maybe cache results?\r\n\r\n // check `this` type\r\n var thisThisType = this.thisType;\r\n var targetThisType = target.thisType;\r\n if (thisThisType) {\r\n if (!(targetThisType && thisThisType.isAssignableTo(targetThisType))) return false;\r\n } else if (targetThisType) {\r\n return false;\r\n }\r\n\r\n // check rest parameter\r\n if (this.hasRest != target.hasRest) return false; // TODO\r\n\r\n // check parameter types\r\n var thisParameterTypes = this.parameterTypes;\r\n var targetParameterTypes = target.parameterTypes;\r\n var numParameters = thisParameterTypes.length;\r\n if (numParameters != targetParameterTypes.length) return false;\r\n for (let i = 0; i < numParameters; ++i) {\r\n let thisParameterType = thisParameterTypes[i];\r\n let targetParameterType = targetParameterTypes[i];\r\n if (!thisParameterType.isAssignableTo(targetParameterType)) return false;\r\n }\r\n\r\n // check return type\r\n var thisReturnType = this.returnType;\r\n var targetReturnType = target.returnType;\r\n return thisReturnType == targetReturnType || thisReturnType.isAssignableTo(targetReturnType);\r\n }\r\n\r\n /** Converts a signature to a function type string. */\r\n static makeSignatureString(parameterTypes: Type[] | null, returnType: Type, thisType: Type | null = null): string {\r\n var sb = [];\r\n if (thisType) sb.push(thisType.toSignatureString());\r\n if (parameterTypes) {\r\n for (let i = 0, k = parameterTypes.length; i < k; ++i) sb.push(parameterTypes[i].toSignatureString());\r\n }\r\n sb.push(returnType.toSignatureString());\r\n return sb.join(\"\");\r\n }\r\n\r\n /** Converts this signature to a function type string. */\r\n toSignatureString(): string {\r\n return Signature.makeSignatureString(this.parameterTypes, this.returnType, this.thisType);\r\n }\r\n\r\n /** Converts this signature to a string. */\r\n toString(includeThis: bool = false): string {\r\n var sb = new Array();\r\n sb.push(\"(\");\r\n var index = 0;\r\n var thisType = this.thisType;\r\n if (thisType) {\r\n if (includeThis) {\r\n sb.push(\"this: \");\r\n sb.push(thisType.toString());\r\n index = 1;\r\n }\r\n }\r\n var parameters = this.parameterTypes;\r\n var numParameters = parameters.length;\r\n if (numParameters) {\r\n let names = this.parameterNames;\r\n let numNames = names ? names.length : 0;\r\n let optionalStart = this.requiredParameters;\r\n let restIndex = this.hasRest ? numParameters - 1 : -1;\r\n for (let i = 0; i < numParameters; ++i, ++index) {\r\n if (index) sb.push(\", \");\r\n if (i == restIndex) sb.push(\"...\");\r\n if (i < numNames) sb.push((names)[i]);\r\n else sb.push(getDefaultParameterName(i));\r\n if (i >= optionalStart && i != restIndex) sb.push(\"?: \");\r\n else sb.push(\": \");\r\n sb.push(parameters[i].toString());\r\n }\r\n }\r\n sb.push(\") => \");\r\n sb.push(this.returnType.toString());\r\n return sb.join(\"\");\r\n }\r\n}\r\n\r\n// helpers\r\n\r\n// Cached default parameter names used where names are unknown.\r\nvar cachedDefaultParameterNames: string[] | null = null;\r\n\r\n/** Gets the cached default parameter name for the specified index. */\r\nexport function getDefaultParameterName(index: i32): string {\r\n if (!cachedDefaultParameterNames) cachedDefaultParameterNames = [];\r\n for (let i = cachedDefaultParameterNames.length; i <= index; ++i) {\r\n cachedDefaultParameterNames.push(\"arg$\" + i.toString(10));\r\n }\r\n return cachedDefaultParameterNames[index - 1];\r\n}\r\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\r\n * The AssemblyScript compiler.\r\n * @module compiler\r\n *//***/\r\n\r\nimport {\r\n compileCall as compileBuiltinCall,\r\n compileAbort,\r\n compileIterateRoots,\r\n ensureGCHook\r\n} from \"./builtins\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Module,\r\n MemorySegment,\r\n ExpressionRef,\r\n UnaryOp,\r\n BinaryOp,\r\n NativeType,\r\n FunctionRef,\r\n ExpressionId,\r\n FunctionTypeRef,\r\n GlobalRef,\r\n getExpressionId,\r\n getExpressionType,\r\n getConstValueI32,\r\n getConstValueI64Low,\r\n getConstValueI64High,\r\n getConstValueF32,\r\n getConstValueF64,\r\n getGetLocalIndex,\r\n getBlockChildCount,\r\n getBlockChild,\r\n getBlockName,\r\n needsExplicitUnreachable\r\n} from \"./module\";\r\n\r\nimport {\r\n CommonFlags,\r\n PATH_DELIMITER,\r\n INNER_DELIMITER,\r\n INSTANCE_DELIMITER,\r\n STATIC_DELIMITER,\r\n GETTER_PREFIX,\r\n SETTER_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n Program,\r\n ClassPrototype,\r\n Class,\r\n Element,\r\n ElementKind,\r\n Enum,\r\n Field,\r\n FunctionPrototype,\r\n Function,\r\n FunctionTarget,\r\n Global,\r\n Local,\r\n Namespace,\r\n EnumValue,\r\n Property,\r\n VariableLikeElement,\r\n FlowFlags,\r\n ConstantValueKind,\r\n Flow,\r\n OperatorKind,\r\n DecoratorFlags\r\n} from \"./program\";\r\n\r\nimport {\r\n Resolver, ReportMode\r\n} from \"./resolver\";\r\n\r\nimport {\r\n Token,\r\n operatorTokenToString\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n TypeNode,\r\n Source,\r\n Range,\r\n DecoratorKind,\r\n AssertionKind,\r\n\r\n Statement,\r\n BlockStatement,\r\n BreakStatement,\r\n ClassDeclaration,\r\n ContinueStatement,\r\n DeclarationStatement,\r\n DoStatement,\r\n EmptyStatement,\r\n EnumDeclaration,\r\n ExportStatement,\r\n ExpressionStatement,\r\n FunctionDeclaration,\r\n ForStatement,\r\n IfStatement,\r\n ImportStatement,\r\n InstanceOfExpression,\r\n InterfaceDeclaration,\r\n NamespaceDeclaration,\r\n ReturnStatement,\r\n SwitchStatement,\r\n ThrowStatement,\r\n TryStatement,\r\n VariableDeclaration,\r\n VariableStatement,\r\n VoidStatement,\r\n WhileStatement,\r\n\r\n Expression,\r\n AssertionExpression,\r\n BinaryExpression,\r\n CallExpression,\r\n CommaExpression,\r\n ElementAccessExpression,\r\n FloatLiteralExpression,\r\n FunctionExpression,\r\n IdentifierExpression,\r\n IntegerLiteralExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n NewExpression,\r\n ObjectLiteralExpression,\r\n ParenthesizedExpression,\r\n PropertyAccessExpression,\r\n TernaryExpression,\r\n ArrayLiteralExpression,\r\n StringLiteralExpression,\r\n UnaryPostfixExpression,\r\n UnaryPrefixExpression,\r\n\r\n nodeIsConstantValue,\r\n isLastStatement,\r\n findDecorator\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags,\r\n Signature,\r\n\r\n typesToNativeTypes\r\n} from \"./types\";\r\n\r\nimport {\r\n writeI8,\r\n writeI16,\r\n writeI32,\r\n writeI64,\r\n writeF32,\r\n writeF64,\r\n makeMap\r\n} from \"./util\";\r\n\r\n/** Compilation target. */\r\nexport enum Target {\r\n /** WebAssembly with 32-bit pointers. */\r\n WASM32,\r\n /** WebAssembly with 64-bit pointers. Experimental and not supported by any runtime yet. */\r\n WASM64\r\n}\r\n\r\n/** Compiler options. */\r\nexport class Options {\r\n\r\n /** WebAssembly target. Defaults to {@link Target.WASM32}. */\r\n target: Target = Target.WASM32;\r\n /** If true, compiles everything instead of just reachable code. */\r\n noTreeShaking: bool = false;\r\n /** If true, replaces assertions with nops. */\r\n noAssert: bool = false;\r\n /** If true, imports the memory provided by the embedder. */\r\n importMemory: bool = false;\r\n /** If true, imports the function table provided by the embedder. */\r\n importTable: bool = false;\r\n /** If true, generates information necessary for source maps. */\r\n sourceMap: bool = false;\r\n /** Static memory start offset. */\r\n memoryBase: i32 = 0;\r\n /** Global aliases. */\r\n globalAliases: Map | null = null;\r\n /** Additional features to activate. */\r\n features: Feature = Feature.NONE;\r\n\r\n /** Hinted optimize level. Not applied by the compiler itself. */\r\n optimizeLevelHint: i32 = 0;\r\n /** Hinted shrink level. Not applied by the compiler itself. */\r\n shrinkLevelHint: i32 = 0;\r\n\r\n /** Tests if the target is WASM64 or, otherwise, WASM32. */\r\n get isWasm64(): bool {\r\n return this.target == Target.WASM64;\r\n }\r\n\r\n /** Gets the unsigned size type matching the target. */\r\n get usizeType(): Type {\r\n return this.target == Target.WASM64 ? Type.usize64 : Type.usize32;\r\n }\r\n\r\n /** Gets the signed size type matching the target. */\r\n get isizeType(): Type {\r\n return this.target == Target.WASM64 ? Type.isize64 : Type.isize32;\r\n }\r\n\r\n /** Gets the native size type matching the target. */\r\n get nativeSizeType(): NativeType {\r\n return this.target == Target.WASM64 ? NativeType.I64 : NativeType.I32;\r\n }\r\n\r\n /** Tests if a specific feature is activated. */\r\n hasFeature(feature: Feature): bool {\r\n return (this.features & feature) != 0;\r\n }\r\n}\r\n\r\n/** Indicates specific features to activate. */\r\nexport const enum Feature {\r\n /** No additional features. */\r\n NONE = 0,\r\n /** Sign extension operations. */\r\n SIGN_EXTENSION = 1 << 0, // see: https://github.com/WebAssembly/sign-extension-ops\r\n /** Mutable global imports and exports. */\r\n MUTABLE_GLOBAL = 1 << 1, // see: https://github.com/WebAssembly/mutable-global\r\n /** Bulk memory operations. */\r\n BULK_MEMORY = 1 << 2, // see: https://github.com/WebAssembly/bulk-memory-operations\r\n /** SIMD types and operations. */\r\n SIMD = 1 << 3, // see: https://github.com/WebAssembly/simd\r\n /** Threading and atomic operations. */\r\n THREADS = 1 << 4 // see: https://github.com/WebAssembly/threads\r\n}\r\n\r\n/** Indicates the desired kind of a conversion. */\r\nexport const enum ConversionKind {\r\n /** No conversion. */\r\n NONE,\r\n /** Implicit conversion. */\r\n IMPLICIT,\r\n /** Explicit conversion. */\r\n EXPLICIT\r\n}\r\n\r\n/** Indicates the desired wrap mode of a conversion. */\r\nexport const enum WrapMode {\r\n /** No wrapping. */\r\n NONE,\r\n /** Wrap small integer values. */\r\n WRAP\r\n}\r\n\r\n/** Compiler interface. */\r\nexport class Compiler extends DiagnosticEmitter {\r\n\r\n /** Program reference. */\r\n program: Program;\r\n /** Resolver reference. */\r\n resolver: Resolver;\r\n /** Provided options. */\r\n options: Options;\r\n /** Module instance being compiled. */\r\n module: Module;\r\n /** Current control flow. */\r\n currentFlow: Flow;\r\n /** Current inline functions stack. */\r\n currentInlineFunctions: Function[] = [];\r\n /** Current enum in compilation. */\r\n currentEnum: Enum | null = null;\r\n /** Current type in compilation. */\r\n currentType: Type = Type.void;\r\n /** Start function being compiled. */\r\n startFunctionInstance: Function;\r\n /** Start function statements. */\r\n startFunctionBody: ExpressionRef[];\r\n /** Counting memory offset. */\r\n memoryOffset: I64;\r\n /** Memory segments being compiled. */\r\n memorySegments: MemorySegment[] = [];\r\n /** Map of already compiled static string segments. */\r\n stringSegments: Map = new Map();\r\n /** Function table being compiled. */\r\n functionTable: string[] = [ \"null\" ];\r\n /** Argument count helper global. */\r\n argcVar: GlobalRef = 0;\r\n /** Argument count helper setter. */\r\n argcSet: FunctionRef = 0;\r\n /** Indicates whether the iterateRoots function must be generated. */\r\n needsIterateRoots: bool = false;\r\n\r\n /** Compiles a {@link Program} to a {@link Module} using the specified options. */\r\n static compile(program: Program, options: Options | null = null): Module {\r\n return new Compiler(program, options).compile();\r\n }\r\n\r\n /** Constructs a new compiler for a {@link Program} using the specified options. */\r\n constructor(program: Program, options: Options | null = null) {\r\n super(program.diagnostics);\r\n this.program = program;\r\n this.resolver = program.resolver;\r\n if (!options) options = new Options();\r\n this.options = options;\r\n this.memoryOffset = i64_new(\r\n // leave space for `null`. also functions as a sentinel for erroneous stores at offset 0.\r\n // note that Binaryen's asm.js output utilizes the first 8 bytes for reinterpretations (#1547)\r\n max(options.memoryBase, 8)\r\n );\r\n this.module = Module.create();\r\n }\r\n\r\n /** Performs compilation of the underlying {@link Program} to a {@link Module}. */\r\n compile(): Module {\r\n var options = this.options;\r\n var module = this.module;\r\n var program = this.program;\r\n\r\n // initialize lookup maps, built-ins, imports, exports, etc.\r\n program.initialize(options);\r\n\r\n // set up the start function\r\n var startFunctionInstance = new Function(program.startFunction, \"start\", new Signature([], Type.void));\r\n this.startFunctionInstance = startFunctionInstance;\r\n var startFunctionBody = new Array();\r\n this.startFunctionBody = startFunctionBody;\r\n this.currentFlow = startFunctionInstance.flow;\r\n\r\n // add a mutable heap base dummy\r\n if (options.isWasm64) {\r\n module.addGlobal(\r\n \"HEAP_BASE\",\r\n NativeType.I64,\r\n true,\r\n module.createI64(0, 0)\r\n );\r\n } else {\r\n module.addGlobal(\r\n \"HEAP_BASE\",\r\n NativeType.I32,\r\n false,\r\n module.createI32(0)\r\n );\r\n }\r\n\r\n // compile entry file(s) while traversing reachable elements\r\n var sources = program.sources;\r\n for (let i = 0, k = sources.length; i < k; ++i) {\r\n if (sources[i].isEntry) this.compileSource(sources[i]);\r\n }\r\n\r\n // compile the start function if not empty or called by main\r\n if (startFunctionBody.length || program.mainFunction !== null) {\r\n let signature = startFunctionInstance.signature;\r\n let funcRef = module.addFunction(\r\n startFunctionInstance.internalName,\r\n this.ensureFunctionType(\r\n signature.parameterTypes,\r\n signature.returnType,\r\n signature.thisType\r\n ),\r\n typesToNativeTypes(startFunctionInstance.additionalLocals),\r\n module.createBlock(null, startFunctionBody)\r\n );\r\n startFunctionInstance.finalize(module, funcRef);\r\n if (!program.mainFunction) module.setStart(funcRef);\r\n }\r\n\r\n // update the heap base pointer\r\n var memoryOffset = this.memoryOffset;\r\n memoryOffset = i64_align(memoryOffset, options.usizeType.byteSize);\r\n this.memoryOffset = memoryOffset;\r\n module.removeGlobal(\"HEAP_BASE\");\r\n if (options.isWasm64) {\r\n module.addGlobal(\r\n \"HEAP_BASE\",\r\n NativeType.I64,\r\n false,\r\n module.createI64(i64_low(memoryOffset), i64_high(memoryOffset))\r\n );\r\n } else {\r\n module.addGlobal(\r\n \"HEAP_BASE\",\r\n NativeType.I32,\r\n false,\r\n module.createI32(i64_low(memoryOffset))\r\n );\r\n }\r\n\r\n // set up memory\r\n module.setMemory(\r\n this.options.memoryBase /* is specified */ || this.memorySegments.length\r\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\r\n : 0,\r\n Module.UNLIMITED_MEMORY,\r\n this.memorySegments,\r\n options.target,\r\n \"memory\"\r\n );\r\n\r\n // import memory if requested (default memory is named '0' by Binaryen)\r\n if (options.importMemory) module.addMemoryImport(\"0\", \"env\", \"memory\");\r\n\r\n // set up function table\r\n var functionTable = this.functionTable;\r\n module.setFunctionTable(functionTable.length, 0xffffffff, functionTable);\r\n module.addTableExport(\"0\", \"table\");\r\n module.addFunction(\"null\", this.ensureFunctionType(null, Type.void), null, module.createBlock(null, []));\r\n\r\n // import table if requested (default table is named '0' by Binaryen)\r\n if (options.importTable) module.addTableImport(\"0\", \"env\", \"table\");\r\n\r\n // set up module exports\r\n for (let [name, moduleExport] of program.moduleLevelExports) {\r\n this.makeModuleExport(name, moduleExport.element);\r\n }\r\n\r\n // set up gc\r\n if (this.needsIterateRoots) compileIterateRoots(this);\r\n\r\n return module;\r\n }\r\n\r\n /** Applies the respective module export(s) for the specified element. */\r\n private makeModuleExport(name: string, element: Element, prefix: string = \"\"): void {\r\n\r\n // traverse members\r\n var members = element.members;\r\n if (members) {\r\n let subPrefix = prefix + name + (element.kind == ElementKind.CLASS\r\n ? INSTANCE_DELIMITER\r\n : STATIC_DELIMITER\r\n );\r\n if (element.kind == ElementKind.NAMESPACE) {\r\n for (let member of members.values()) {\r\n if (!member.is(CommonFlags.EXPORT)) continue;\r\n this.makeModuleExport(member.simpleName, member, subPrefix);\r\n }\r\n } else {\r\n for (let member of members.values()) {\r\n if (member.is(CommonFlags.PRIVATE)) continue;\r\n this.makeModuleExport(member.simpleName, member, subPrefix);\r\n }\r\n }\r\n }\r\n\r\n switch (element.kind) {\r\n\r\n // export global\r\n case ElementKind.GLOBAL: {\r\n let isConst = element.is(CommonFlags.CONST) || element.is(CommonFlags.STATIC | CommonFlags.READONLY);\r\n if (!isConst && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n let declaration = (element).declaration;\r\n if (declaration) {\r\n this.error(\r\n DiagnosticCode.Cannot_export_a_mutable_global,\r\n declaration.name.range\r\n );\r\n }\r\n } else {\r\n this.module.addGlobalExport(element.internalName, prefix + name);\r\n }\r\n break;\r\n }\r\n case ElementKind.ENUMVALUE: {\r\n if (!assert(element.parent).is(CommonFlags.CONST) && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n let declaration = (element).declaration;\r\n if (declaration) {\r\n this.error(\r\n DiagnosticCode.Cannot_export_a_mutable_global,\r\n declaration.name.range\r\n );\r\n }\r\n } else {\r\n this.module.addGlobalExport(element.internalName, prefix + name);\r\n }\r\n break;\r\n }\r\n\r\n // export function\r\n case ElementKind.FUNCTION: {\r\n let instance = element;\r\n let signature = instance.signature;\r\n if (signature.requiredParameters < signature.parameterTypes.length) {\r\n // utilize trampoline to fill in omitted arguments\r\n instance = this.ensureTrampoline(instance);\r\n this.ensureArgcSet();\r\n }\r\n if (instance.is(CommonFlags.COMPILED)) this.module.addFunctionExport(instance.internalName, prefix + name);\r\n break;\r\n }\r\n\r\n // export getter and setter\r\n case ElementKind.PROPERTY: {\r\n let getter = assert((element).getterPrototype);\r\n this.makeModuleExport(GETTER_PREFIX + name, getter, prefix);\r\n let setter = (element).setterPrototype;\r\n if (setter) this.makeModuleExport(SETTER_PREFIX + name, setter, prefix);\r\n break;\r\n }\r\n\r\n // export a getter and a setter\r\n case ElementKind.FIELD: {\r\n let module = this.module;\r\n let type = (element).type;\r\n let nativeType = type.toNativeType();\r\n let offset = (element).memoryOffset;\r\n let usizeType = this.options.usizeType;\r\n let nativeSizeType = this.options.nativeSizeType;\r\n\r\n // make a getter\r\n let getterName = prefix + GETTER_PREFIX + name;\r\n module.addFunction(\r\n getterName,\r\n this.ensureFunctionType(null, type, usizeType),\r\n null,\r\n module.createLoad(\r\n type.byteSize,\r\n type.is(TypeFlags.SIGNED),\r\n module.createGetLocal(0, nativeSizeType),\r\n nativeType,\r\n offset\r\n )\r\n );\r\n module.addFunctionExport(getterName, getterName);\r\n\r\n // make a setter\r\n if (!element.is(CommonFlags.READONLY)) {\r\n let setterName = prefix + SETTER_PREFIX + name;\r\n module.addFunction(\r\n setterName,\r\n this.ensureFunctionType([ type ], Type.void, usizeType),\r\n null,\r\n module.createStore(\r\n type.byteSize,\r\n module.createGetLocal(0, nativeSizeType),\r\n module.createGetLocal(1, nativeType),\r\n nativeType,\r\n offset\r\n )\r\n );\r\n module.addFunctionExport(setterName, setterName);\r\n }\r\n break;\r\n }\r\n\r\n // skip prototype and export instances\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n for (let instances of (element).instances.values()) {\r\n for (let instance of instances.values()) {\r\n let instanceName = name;\r\n if (instance.is(CommonFlags.GENERIC)) {\r\n let fullName = instance.internalName;\r\n instanceName += fullName.substring(fullName.lastIndexOf(\"<\"));\r\n }\r\n this.makeModuleExport(instanceName, instance, prefix);\r\n }\r\n }\r\n break;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n for (let instance of (element).instances.values()) {\r\n let instanceName = name;\r\n if (instance.is(CommonFlags.GENERIC)) {\r\n let fullName = instance.internalName;\r\n instanceName += fullName.substring(fullName.lastIndexOf(\"<\"));\r\n }\r\n let ctor = instance.constructorInstance;\r\n if (ctor) this.makeModuleExport(instanceName + INSTANCE_DELIMITER + ctor.simpleName, ctor, prefix);\r\n this.makeModuleExport(instanceName, instance, prefix);\r\n }\r\n break;\r\n }\r\n\r\n // all possible members already handled above\r\n case ElementKind.ENUM:\r\n case ElementKind.CLASS:\r\n case ElementKind.NAMESPACE: break;\r\n\r\n default: assert(false);\r\n }\r\n }\r\n\r\n // sources\r\n\r\n /** Compiles a source by looking it up by path first. */\r\n compileSourceByPath(normalizedPathWithoutExtension: string, reportNode: Node): void {\r\n var source = this.program.lookupSourceByPath(normalizedPathWithoutExtension);\r\n if (source) this.compileSource(source);\r\n else {\r\n this.error(\r\n DiagnosticCode.File_0_not_found,\r\n reportNode.range, normalizedPathWithoutExtension\r\n );\r\n }\r\n }\r\n\r\n /** Compiles a source. */\r\n compileSource(source: Source): void {\r\n if (source.is(CommonFlags.COMPILED)) return;\r\n source.set(CommonFlags.COMPILED);\r\n\r\n // compile top-level statements\r\n var noTreeShaking = this.options.noTreeShaking;\r\n var isEntry = source.isEntry;\r\n var startFunctionInstance = this.startFunctionInstance;\r\n var startFunctionBody = this.startFunctionBody;\r\n var statements = source.statements;\r\n for (let i = 0, k = statements.length; i < k; ++i) {\r\n let statement = statements[i];\r\n switch (statement.kind) {\r\n case NodeKind.CLASSDECLARATION: {\r\n if (\r\n (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&\r\n !(statement).isGeneric\r\n ) {\r\n this.compileClassDeclaration(statement, []);\r\n }\r\n break;\r\n }\r\n case NodeKind.INTERFACEDECLARATION: break;\r\n case NodeKind.ENUMDECLARATION: {\r\n if (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) {\r\n this.compileEnumDeclaration(statement);\r\n }\r\n break;\r\n }\r\n case NodeKind.FUNCTIONDECLARATION: {\r\n if (\r\n (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&\r\n !(statement).isGeneric\r\n ) {\r\n this.compileFunctionDeclaration(statement, []);\r\n }\r\n break;\r\n }\r\n case NodeKind.IMPORT: {\r\n this.compileSourceByPath(\r\n (statement).normalizedPath,\r\n (statement).path\r\n );\r\n break;\r\n }\r\n case NodeKind.NAMESPACEDECLARATION: {\r\n if (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) {\r\n this.compileNamespaceDeclaration(statement);\r\n }\r\n break;\r\n }\r\n case NodeKind.VARIABLE: { // global, always compiled as initializers might have side effects\r\n let variableInit = this.compileVariableStatement(statement);\r\n if (variableInit) startFunctionBody.push(variableInit);\r\n break;\r\n }\r\n case NodeKind.EXPORT: {\r\n if ((statement).normalizedPath != null) {\r\n this.compileSourceByPath(\r\n (statement).normalizedPath,\r\n (statement).path\r\n );\r\n }\r\n if (noTreeShaking || isEntry) {\r\n this.compileExportStatement(statement);\r\n }\r\n break;\r\n }\r\n default: { // otherwise a top-level statement that is part of the start function's body\r\n let previousFlow = this.currentFlow;\r\n this.currentFlow = startFunctionInstance.flow;\r\n startFunctionBody.push(\r\n this.compileStatement(statement)\r\n );\r\n this.currentFlow = previousFlow;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // globals\r\n\r\n compileGlobalDeclaration(declaration: VariableDeclaration): Global | null {\r\n // look up the initialized program element\r\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n assert(element.kind == ElementKind.GLOBAL);\r\n if (!this.compileGlobal(element)) return null; // reports\r\n return element;\r\n }\r\n\r\n compileGlobal(global: Global): bool {\r\n if (global.is(CommonFlags.COMPILED)) return true;\r\n global.set(CommonFlags.COMPILED);\r\n\r\n var module = this.module;\r\n var declaration = global.declaration;\r\n var initExpr: ExpressionRef = 0;\r\n\r\n if (!global.is(CommonFlags.RESOLVED)) {\r\n if (declaration) {\r\n\r\n // resolve now if annotated\r\n if (declaration.type) {\r\n let resolvedType = this.resolver.resolveType(declaration.type); // reports\r\n if (!resolvedType) return false;\r\n if (resolvedType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n declaration.type.range\r\n );\r\n return false;\r\n }\r\n global.type = resolvedType;\r\n global.set(CommonFlags.RESOLVED);\r\n\r\n // infer from initializer if not annotated\r\n } else if (declaration.initializer) { // infer type using void/NONE for literal inference\r\n initExpr = this.compileExpressionRetainType( // reports\r\n declaration.initializer,\r\n Type.void,\r\n WrapMode.WRAP\r\n );\r\n if (this.currentType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n declaration.initializer.range, this.currentType.toString(), \"\"\r\n );\r\n return false;\r\n }\r\n global.type = this.currentType;\r\n global.set(CommonFlags.RESOLVED);\r\n\r\n // must either be annotated or have an initializer\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n declaration.name.range.atEnd\r\n );\r\n return false;\r\n }\r\n } else {\r\n assert(false); // must have a declaration if resolved lazily\r\n }\r\n }\r\n\r\n // ambient builtins like 'HEAP_BASE' need to be resolved but are added explicitly\r\n if (global.is(CommonFlags.AMBIENT) && global.hasDecorator(DecoratorFlags.BUILTIN)) return true;\r\n\r\n var nativeType = global.type.toNativeType();\r\n var isDeclaredConstant = global.is(CommonFlags.CONST) || global.is(CommonFlags.STATIC | CommonFlags.READONLY);\r\n\r\n // handle imports\r\n if (global.is(CommonFlags.AMBIENT)) {\r\n\r\n // constant global\r\n if (isDeclaredConstant || this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n global.set(CommonFlags.MODULE_IMPORT);\r\n if (declaration) {\r\n mangleImportName(global, declaration);\r\n } else {\r\n mangleImportName_moduleName = \"env\";\r\n mangleImportName_elementName = global.simpleName;\r\n }\r\n module.addGlobalImport(\r\n global.internalName,\r\n mangleImportName_moduleName,\r\n mangleImportName_elementName,\r\n nativeType\r\n );\r\n global.set(CommonFlags.COMPILED);\r\n return true;\r\n\r\n // importing mutable globals is not supported in the MVP\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n assert(declaration).range\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n // the MVP does not yet support initializer expressions other than constant values (and constant\r\n // get_globals), hence such initializations must be performed in the start function for now.\r\n var initializeInStart = false;\r\n\r\n // evaluate initializer if present\r\n if (declaration !== null && declaration.initializer !== null) {\r\n if (!initExpr) {\r\n initExpr = this.compileExpression(\r\n declaration.initializer,\r\n global.type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP\r\n );\r\n }\r\n\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n if (isDeclaredConstant) {\r\n initExpr = module.precomputeExpression(initExpr);\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n declaration.range\r\n );\r\n initializeInStart = true;\r\n }\r\n } else {\r\n initializeInStart = true;\r\n }\r\n }\r\n\r\n // explicitly inline if annotated\r\n if (global.hasDecorator(DecoratorFlags.INLINE)) {\r\n if (!initializeInStart) { // reported above\r\n assert(getExpressionId(initExpr) == ExpressionId.Const);\r\n let exprType = getExpressionType(initExpr);\r\n switch (exprType) {\r\n case NativeType.I32: {\r\n global.constantValueKind = ConstantValueKind.INTEGER;\r\n global.constantIntegerValue = i64_new(getConstValueI32(initExpr), 0);\r\n break;\r\n }\r\n case NativeType.I64: {\r\n global.constantValueKind = ConstantValueKind.INTEGER;\r\n global.constantIntegerValue = i64_new(\r\n getConstValueI64Low(initExpr),\r\n getConstValueI64High(initExpr)\r\n );\r\n break;\r\n }\r\n case NativeType.F32: {\r\n global.constantValueKind = ConstantValueKind.FLOAT;\r\n global.constantFloatValue = getConstValueF32(initExpr);\r\n break;\r\n }\r\n case NativeType.F64: {\r\n global.constantValueKind = ConstantValueKind.FLOAT;\r\n global.constantFloatValue = getConstValueF64(initExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return false;\r\n }\r\n }\r\n global.set(CommonFlags.INLINED); // inline the value from now on\r\n }\r\n }\r\n\r\n // initialize to zero if there's no initializer\r\n } else {\r\n initExpr = global.type.toNativeZero(module);\r\n }\r\n\r\n var internalName = global.internalName;\r\n\r\n if (initializeInStart) { // initialize to mutable zero and set the actual value in start\r\n module.addGlobal(internalName, nativeType, true, global.type.toNativeZero(module));\r\n this.startFunctionBody.push(module.createSetGlobal(internalName, initExpr));\r\n\r\n } else { // compile normally\r\n module.addGlobal(internalName, nativeType, !isDeclaredConstant, initExpr);\r\n }\r\n return true;\r\n }\r\n\r\n // enums\r\n\r\n compileEnumDeclaration(declaration: EnumDeclaration): Enum | null {\r\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n assert(element.kind == ElementKind.ENUM);\r\n if (!this.compileEnum(element)) return null;\r\n return element;\r\n }\r\n\r\n compileEnum(element: Enum): bool {\r\n if (element.is(CommonFlags.COMPILED)) return true;\r\n element.set(CommonFlags.COMPILED);\r\n\r\n var module = this.module;\r\n this.currentEnum = element;\r\n var previousValue: EnumValue | null = null;\r\n var previousValueIsMut = false;\r\n\r\n if (element.members) {\r\n for (let member of element.members.values()) {\r\n if (member.kind != ElementKind.ENUMVALUE) continue; // happens if an enum is also a namespace\r\n let initInStart = false;\r\n let val = member;\r\n let valueDeclaration = val.declaration;\r\n val.set(CommonFlags.COMPILED);\r\n let initExpr: ExpressionRef;\r\n if (valueDeclaration.value) {\r\n initExpr = this.compileExpression(\r\n valueDeclaration.value,\r\n Type.i32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n if (element.is(CommonFlags.CONST)) {\r\n initExpr = module.precomputeExpression(initExpr);\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n this.error(\r\n DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,\r\n valueDeclaration.value.range\r\n );\r\n initInStart = true;\r\n }\r\n } else {\r\n initInStart = true;\r\n }\r\n }\r\n } else if (previousValue == null) {\r\n initExpr = module.createI32(0);\r\n } else {\r\n if (previousValueIsMut) {\r\n this.error(\r\n DiagnosticCode.Enum_member_must_have_initializer,\r\n valueDeclaration.range\r\n );\r\n }\r\n initExpr = module.createBinary(BinaryOp.AddI32,\r\n module.createGetGlobal(previousValue.internalName, NativeType.I32),\r\n module.createI32(1)\r\n );\r\n initExpr = module.precomputeExpression(initExpr);\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n if (element.is(CommonFlags.CONST)) {\r\n this.error(\r\n DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,\r\n valueDeclaration.range\r\n );\r\n }\r\n initInStart = true;\r\n }\r\n }\r\n if (initInStart) {\r\n module.addGlobal(val.internalName, NativeType.I32, true, module.createI32(0));\r\n this.startFunctionBody.push(module.createSetGlobal(val.internalName, initExpr));\r\n previousValueIsMut = true;\r\n } else {\r\n module.addGlobal(val.internalName, NativeType.I32, !element.is(CommonFlags.CONST), initExpr);\r\n previousValueIsMut = false;\r\n }\r\n previousValue = val;\r\n }\r\n }\r\n this.currentEnum = null;\r\n return true;\r\n }\r\n\r\n // functions\r\n\r\n /** Compiles a top-level function given its declaration. */\r\n compileFunctionDeclaration(\r\n declaration: FunctionDeclaration,\r\n typeArguments: TypeNode[]\r\n ): Function | null {\r\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n return this.compileFunctionUsingTypeArguments( // reports\r\n element,\r\n typeArguments,\r\n makeMap(),\r\n null,\r\n (element).declaration.name\r\n );\r\n }\r\n\r\n /** Resolves the specified type arguments prior to compiling the resulting function instance. */\r\n compileFunctionUsingTypeArguments(\r\n prototype: FunctionPrototype,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map,\r\n outerScope: Flow | null,\r\n reportNode: Node\r\n ): Function | null {\r\n var instance = this.resolver.resolveFunctionInclTypeArguments(\r\n prototype,\r\n typeArguments,\r\n contextualTypeArguments,\r\n reportNode\r\n );\r\n if (!instance) return null;\r\n instance.outerScope = outerScope;\r\n if (!this.compileFunction(instance)) return null; // reports\r\n return instance;\r\n }\r\n\r\n /** Either reuses or creates the function type matching the specified signature. */\r\n ensureFunctionType(\r\n parameterTypes: Type[] | null,\r\n returnType: Type,\r\n thisType: Type | null = null\r\n ): FunctionTypeRef {\r\n var numParameters = parameterTypes ? parameterTypes.length : 0;\r\n var paramTypes: NativeType[];\r\n var index = 0;\r\n if (thisType) {\r\n paramTypes = new Array(1 + numParameters);\r\n paramTypes[0] = thisType.toNativeType();\r\n index = 1;\r\n } else {\r\n paramTypes = new Array(numParameters);\r\n }\r\n if (parameterTypes) {\r\n for (let i = 0; i < numParameters; ++i, ++index) {\r\n paramTypes[index] = parameterTypes[i].toNativeType();\r\n }\r\n }\r\n var resultType = returnType.toNativeType();\r\n var module = this.module;\r\n var typeRef = module.getFunctionTypeBySignature(resultType, paramTypes);\r\n if (!typeRef) {\r\n let name = Signature.makeSignatureString(parameterTypes, returnType, thisType);\r\n typeRef = module.addFunctionType(name, resultType, paramTypes);\r\n }\r\n return typeRef;\r\n }\r\n\r\n /** Compiles the body of a function within the specified flow. */\r\n private compileFunctionBody(instance: Function): ExpressionRef[] {\r\n var module = this.module;\r\n var declaration = instance.prototype.declaration;\r\n var body = assert(declaration.body);\r\n var returnType = instance.signature.returnType;\r\n var flow = this.currentFlow;\r\n\r\n // compile statements\r\n var stmts: BinaryenExportRef[];\r\n if (body.kind == NodeKind.BLOCK) {\r\n stmts = this.compileStatements((body).statements);\r\n } else {\r\n // must be an expression statement if not a block\r\n assert(body.kind == NodeKind.EXPRESSION);\r\n\r\n // must be an arrow function\r\n assert(instance.is(CommonFlags.ARROW));\r\n\r\n // none of the following can be an arrow function\r\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\r\n\r\n let stmt = this.compileExpression(\r\n (body).expression,\r\n returnType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n flow.set(FlowFlags.RETURNS);\r\n if (!flow.canOverflow(stmt, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\r\n stmts = [ stmt ];\r\n }\r\n\r\n // make the main function call `start` implicitly, but only once\r\n if (instance.is(CommonFlags.MAIN)) {\r\n module.addGlobal(\"~started\", NativeType.I32, true, module.createI32(0));\r\n stmts.unshift(\r\n module.createIf(\r\n module.createUnary(\r\n UnaryOp.EqzI32,\r\n module.createGetGlobal(\"~started\", NativeType.I32)\r\n ),\r\n module.createBlock(null, [\r\n module.createCall(\"start\", null, NativeType.None),\r\n module.createSetGlobal(\"~started\", module.createI32(1))\r\n ])\r\n )\r\n );\r\n }\r\n\r\n // make constructors return their instance pointer\r\n if (instance.is(CommonFlags.CONSTRUCTOR)) {\r\n let nativeSizeType = this.options.nativeSizeType;\r\n assert(instance.is(CommonFlags.INSTANCE));\r\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n\r\n if (!flow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n let thisLocalIndex = flow.is(FlowFlags.INLINE_CONTEXT)\r\n ? assert(flow.lookupLocal(\"this\")).index\r\n : 0;\r\n\r\n // if `this` wasn't accessed before, allocate if necessary and initialize `this`\r\n if (!flow.is(FlowFlags.ALLOCATES)) {\r\n // {\r\n // if (!this) this = \r\n // this.a = X\r\n // this.b = Y\r\n // }\r\n stmts.push(\r\n module.createIf(\r\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\r\n module.createGetLocal(thisLocalIndex, nativeSizeType)\r\n ),\r\n module.createSetLocal(thisLocalIndex,\r\n this.makeAllocation(classInstance)\r\n )\r\n )\r\n );\r\n this.makeFieldInitialization(classInstance, stmts);\r\n }\r\n\r\n // implicitly return `this`\r\n stmts.push(\r\n module.createGetLocal(thisLocalIndex, nativeSizeType)\r\n );\r\n }\r\n\r\n // check that super has been called if this is a derived class\r\n if ((classInstance).base && !flow.is(FlowFlags.CALLS_SUPER)) {\r\n this.error(\r\n DiagnosticCode.Constructors_for_derived_classes_must_contain_a_super_call,\r\n instance.prototype.declaration.range\r\n );\r\n }\r\n\r\n // if this is a normal function, make sure that all branches return\r\n } else if (returnType != Type.void && !flow.is(FlowFlags.RETURNS)) {\r\n this.error(\r\n DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\r\n declaration.signature.returnType.range\r\n );\r\n }\r\n\r\n return stmts;\r\n }\r\n\r\n /** Compiles a readily resolved function instance. */\r\n compileFunction(instance: Function): bool {\r\n if (instance.is(CommonFlags.COMPILED)) return true;\r\n assert(!(instance.is(CommonFlags.AMBIENT) && instance.hasDecorator(DecoratorFlags.BUILTIN)));\r\n instance.set(CommonFlags.COMPILED);\r\n\r\n var module = this.module;\r\n var signature = instance.signature;\r\n var declaration = instance.prototype.declaration;\r\n var body = declaration.body;\r\n\r\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\r\n var funcRef: FunctionRef;\r\n\r\n // concrete function\r\n if (body) {\r\n\r\n // must not be ambient\r\n if (instance.is(CommonFlags.AMBIENT)) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n declaration.name.range\r\n );\r\n }\r\n\r\n // cannot have an annotated external name\r\n if (instance.hasDecorator(DecoratorFlags.EXTERNAL)) {\r\n let decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n decorator.range\r\n );\r\n }\r\n\r\n // compile body in this function's context\r\n let previousFlow = this.currentFlow;\r\n this.currentFlow = instance.flow;\r\n let stmts = this.compileFunctionBody(instance);\r\n this.currentFlow = previousFlow;\r\n\r\n // create the function\r\n funcRef = module.addFunction(\r\n instance.internalName,\r\n typeRef,\r\n typesToNativeTypes(instance.additionalLocals),\r\n stmts.length\r\n ? stmts.length == 1\r\n ? stmts[0]\r\n : module.createBlock(null, stmts, instance.signature.returnType.toNativeType())\r\n : module.createNop()\r\n );\r\n\r\n // imported function\r\n } else {\r\n if (!instance.is(CommonFlags.AMBIENT)) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n declaration.name.range\r\n );\r\n }\r\n\r\n instance.set(CommonFlags.MODULE_IMPORT);\r\n mangleImportName(instance, declaration); // TODO: check for duplicates\r\n\r\n // create the import\r\n funcRef = module.addFunctionImport(\r\n instance.internalName,\r\n mangleImportName_moduleName,\r\n mangleImportName_elementName,\r\n typeRef\r\n );\r\n }\r\n\r\n instance.finalize(module, funcRef);\r\n return true;\r\n }\r\n\r\n // namespaces\r\n\r\n compileNamespaceDeclaration(declaration: NamespaceDeclaration): void {\r\n var members = declaration.members;\r\n var noTreeShaking = this.options.noTreeShaking;\r\n for (let i = 0, k = members.length; i < k; ++i) {\r\n let member = members[i];\r\n switch (member.kind) {\r\n case NodeKind.CLASSDECLARATION: {\r\n if (\r\n (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\r\n !(member).isGeneric\r\n ) {\r\n this.compileClassDeclaration(member, []);\r\n }\r\n break;\r\n }\r\n case NodeKind.INTERFACEDECLARATION: {\r\n if (\r\n (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\r\n !(member).isGeneric\r\n ) {\r\n this.compileInterfaceDeclaration(member, []);\r\n }\r\n break;\r\n }\r\n case NodeKind.ENUMDECLARATION: {\r\n if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\r\n this.compileEnumDeclaration(member);\r\n }\r\n break;\r\n }\r\n case NodeKind.FUNCTIONDECLARATION: {\r\n if (\r\n (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\r\n !(member).isGeneric\r\n ) {\r\n this.compileFunctionDeclaration(member, []);\r\n }\r\n break;\r\n }\r\n case NodeKind.NAMESPACEDECLARATION: {\r\n if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\r\n this.compileNamespaceDeclaration(member);\r\n }\r\n break;\r\n }\r\n case NodeKind.VARIABLE: {\r\n if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\r\n let variableInit = this.compileVariableStatement(member, true);\r\n if (variableInit) this.startFunctionBody.push(variableInit);\r\n }\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n }\r\n\r\n compileNamespace(ns: Namespace): void {\r\n if (!ns.members) return;\r\n\r\n var noTreeShaking = this.options.noTreeShaking;\r\n for (let element of ns.members.values()) {\r\n switch (element.kind) {\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n if (\r\n (\r\n noTreeShaking ||\r\n (element).is(CommonFlags.EXPORT)\r\n ) && !(element).is(CommonFlags.GENERIC)\r\n ) {\r\n this.compileClassUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap()\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.ENUM: {\r\n this.compileEnum(element);\r\n break;\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (\r\n (\r\n noTreeShaking || (element).is(CommonFlags.EXPORT)\r\n ) && !(element).is(CommonFlags.GENERIC)\r\n ) {\r\n if (element.hasDecorator(DecoratorFlags.BUILTIN)) break;\r\n this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap(),\r\n null,\r\n (element).declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.GLOBAL: {\r\n this.compileGlobal(element);\r\n break;\r\n }\r\n case ElementKind.NAMESPACE: {\r\n this.compileNamespace(element);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // exports\r\n\r\n compileExportStatement(statement: ExportStatement): void {\r\n var fileLevelExports = this.program.fileLevelExports;\r\n var members = statement.members;\r\n if (!members) return; // filespace\r\n for (let i = 0, k = members.length; i < k; ++i) {\r\n let member = members[i];\r\n let element = fileLevelExports.get(\r\n statement.range.source.internalPath + PATH_DELIMITER + member.externalName.text\r\n );\r\n if (!element) continue; // reported in Program#initialize\r\n switch (element.kind) {\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n if (!(element).is(CommonFlags.GENERIC)) {\r\n this.compileClassUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap()\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.ENUM: {\r\n this.compileEnum(element);\r\n break;\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (\r\n !(element).is(CommonFlags.GENERIC) &&\r\n statement.range.source.isEntry\r\n ) {\r\n this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap(),\r\n null,\r\n (element).declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.GLOBAL: {\r\n this.compileGlobal(element);\r\n break;\r\n }\r\n case ElementKind.NAMESPACE: {\r\n this.compileNamespace(element);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // classes\r\n\r\n compileClassDeclaration(\r\n declaration: ClassDeclaration,\r\n typeArguments: TypeNode[]\r\n ): void {\r\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n this.compileClassUsingTypeArguments(\r\n element,\r\n typeArguments,\r\n makeMap(),\r\n declaration\r\n );\r\n }\r\n\r\n compileClassUsingTypeArguments(\r\n prototype: ClassPrototype,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map,\r\n alternativeReportNode: Node | null = null\r\n ): void {\r\n var instance = this.resolver.resolveClassInclTypeArguments(\r\n prototype,\r\n typeArguments,\r\n contextualTypeArguments,\r\n alternativeReportNode || prototype.declaration\r\n );\r\n if (!instance) return;\r\n this.compileClass(instance);\r\n }\r\n\r\n compileClass(instance: Class): bool {\r\n if (instance.is(CommonFlags.COMPILED)) return true;\r\n instance.set(CommonFlags.COMPILED);\r\n\r\n var staticMembers = instance.prototype.members;\r\n if (staticMembers) {\r\n for (let element of staticMembers.values()) {\r\n switch (element.kind) {\r\n case ElementKind.GLOBAL: {\r\n this.compileGlobal(element);\r\n break;\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (\r\n !(element).is(CommonFlags.GENERIC)\r\n ) {\r\n this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap(),\r\n null,\r\n (element).declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let getter = (element).getterPrototype;\r\n if (getter) {\r\n this.compileFunctionUsingTypeArguments(\r\n getter,\r\n [],\r\n makeMap(),\r\n null,\r\n getter.declaration.name\r\n );\r\n }\r\n let setter = (element).setterPrototype;\r\n if (setter) {\r\n this.compileFunctionUsingTypeArguments(\r\n setter,\r\n [],\r\n makeMap(),\r\n null,\r\n setter.declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n var ctorInstance = instance.constructorInstance;\r\n if (ctorInstance) this.compileFunction(ctorInstance);\r\n var instanceMembers = instance.members;\r\n if (instanceMembers) {\r\n for (let element of instanceMembers.values()) {\r\n switch (element.kind) {\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (\r\n !(element).is(CommonFlags.GENERIC)\r\n ) {\r\n this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap(instance.contextualTypeArguments),\r\n null,\r\n (element).declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.FIELD: {\r\n element.set(CommonFlags.COMPILED);\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let getter = (element).getterPrototype;\r\n if (getter) {\r\n this.compileFunctionUsingTypeArguments(\r\n getter,\r\n [],\r\n makeMap(instance.contextualTypeArguments),\r\n null,\r\n getter.declaration.name\r\n );\r\n }\r\n let setter = (element).setterPrototype;\r\n if (setter) {\r\n this.compileFunctionUsingTypeArguments(\r\n setter,\r\n [],\r\n makeMap(instance.contextualTypeArguments),\r\n null,\r\n setter.declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n compileInterfaceDeclaration(\r\n declaration: InterfaceDeclaration,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null = null,\r\n alternativeReportNode: Node | null = null\r\n ): void {\r\n // TODO\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n declaration.range\r\n );\r\n }\r\n\r\n // memory\r\n\r\n /** Adds a static memory segment with the specified data. */\r\n addMemorySegment(buffer: Uint8Array, alignment: i32 = 8): MemorySegment {\r\n var memoryOffset = i64_align(this.memoryOffset, alignment);\r\n var segment = MemorySegment.create(buffer, memoryOffset);\r\n this.memorySegments.push(segment);\r\n this.memoryOffset = i64_add(memoryOffset, i64_new(buffer.length, 0));\r\n return segment;\r\n }\r\n\r\n // function table\r\n\r\n /** Ensures that a table entry exists for the specified function and returns its index. */\r\n ensureFunctionTableEntry(func: Function): i32 {\r\n assert(func.is(CommonFlags.COMPILED));\r\n if (func.functionTableIndex >= 0) {\r\n return func.functionTableIndex;\r\n }\r\n var functionTable = this.functionTable;\r\n var index = functionTable.length;\r\n if (!func.is(CommonFlags.TRAMPOLINE) && func.signature.requiredParameters < func.signature.parameterTypes.length) {\r\n // insert the trampoline if the function has optional parameters\r\n func = this.ensureTrampoline(func);\r\n }\r\n functionTable.push(func.internalName);\r\n func.functionTableIndex = index;\r\n return index;\r\n }\r\n\r\n // statements\r\n\r\n compileStatement(statement: Statement): ExpressionRef {\r\n var module = this.module;\r\n var stmt: ExpressionRef;\r\n switch (statement.kind) {\r\n case NodeKind.BLOCK: {\r\n stmt = this.compileBlockStatement(statement);\r\n break;\r\n }\r\n case NodeKind.BREAK: {\r\n stmt = this.compileBreakStatement(statement);\r\n break;\r\n }\r\n case NodeKind.CONTINUE: {\r\n stmt = this.compileContinueStatement(statement);\r\n break;\r\n }\r\n case NodeKind.DO: {\r\n stmt = this.compileDoStatement(statement);\r\n break;\r\n }\r\n case NodeKind.EMPTY: {\r\n stmt = this.compileEmptyStatement(statement);\r\n break;\r\n }\r\n case NodeKind.EXPRESSION: {\r\n stmt = this.compileExpressionStatement(statement);\r\n break;\r\n }\r\n case NodeKind.FOR: {\r\n stmt = this.compileForStatement(statement);\r\n break;\r\n }\r\n case NodeKind.IF: {\r\n stmt = this.compileIfStatement(statement);\r\n break;\r\n }\r\n case NodeKind.RETURN: {\r\n stmt = this.compileReturnStatement(statement);\r\n break;\r\n }\r\n case NodeKind.SWITCH: {\r\n stmt = this.compileSwitchStatement(statement);\r\n break;\r\n }\r\n case NodeKind.THROW: {\r\n stmt = this.compileThrowStatement(statement);\r\n break;\r\n }\r\n case NodeKind.TRY: {\r\n stmt = this.compileTryStatement(statement);\r\n break;\r\n }\r\n case NodeKind.VARIABLE: {\r\n stmt = this.compileVariableStatement(statement);\r\n if (!stmt) stmt = module.createNop();\r\n break;\r\n }\r\n case NodeKind.VOID: {\r\n stmt = this.compileVoidStatement(statement);\r\n break;\r\n }\r\n case NodeKind.WHILE: {\r\n stmt = this.compileWhileStatement(statement);\r\n break;\r\n }\r\n case NodeKind.TYPEDECLARATION: {\r\n // type declarations must be top-level because function bodies are evaluated when\r\n // reachaable only.\r\n if (this.currentFlow.parentFunction == this.startFunctionInstance) {\r\n return module.createNop();\r\n }\r\n // otherwise fall-through\r\n }\r\n default: {\r\n assert(false);\r\n stmt = module.createUnreachable();\r\n }\r\n }\r\n if (this.options.sourceMap) this.addDebugLocation(stmt, statement.range);\r\n return stmt;\r\n }\r\n\r\n compileStatements(statements: Statement[]): ExpressionRef[] {\r\n var numStatements = statements.length;\r\n var stmts = new Array(numStatements);\r\n stmts.length = 0;\r\n var flow = this.currentFlow;\r\n for (let i = 0; i < numStatements; ++i) {\r\n let stmt = this.compileStatement(statements[i]);\r\n switch (getExpressionId(stmt)) {\r\n case ExpressionId.Block: {\r\n if (!getBlockName(stmt)) {\r\n for (let j = 0, k = getBlockChildCount(stmt); j < k; ++j) stmts.push(getBlockChild(stmt, j));\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: stmts.push(stmt);\r\n case ExpressionId.Nop:\r\n }\r\n if (flow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n if (needsExplicitUnreachable(stmt)) stmts.push(this.module.createUnreachable());\r\n break;\r\n }\r\n }\r\n return stmts;\r\n }\r\n\r\n compileBlockStatement(statement: BlockStatement): ExpressionRef {\r\n var statements = statement.statements;\r\n var outerFlow = this.currentFlow;\r\n var innerFlow = outerFlow.fork();\r\n this.currentFlow = innerFlow;\r\n\r\n var stmts = this.compileStatements(statements);\r\n var stmt = stmts.length == 0\r\n ? this.module.createNop()\r\n : stmts.length == 1\r\n ? stmts[0]\r\n : this.module.createBlock(null, stmts,getExpressionType(stmts[stmts.length - 1]));\r\n\r\n innerFlow.freeScopedLocals();\r\n outerFlow.inherit(innerFlow);\r\n this.currentFlow = outerFlow;\r\n return stmt;\r\n }\r\n\r\n compileBreakStatement(statement: BreakStatement): ExpressionRef {\r\n var module = this.module;\r\n if (statement.label) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.label.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n var flow = this.currentFlow;\r\n var breakLabel = flow.breakLabel;\r\n if (breakLabel == null) {\r\n this.error(\r\n DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement,\r\n statement.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n flow.set(FlowFlags.BREAKS);\r\n return module.createBreak(breakLabel);\r\n }\r\n\r\n compileContinueStatement(statement: ContinueStatement): ExpressionRef {\r\n var module = this.module;\r\n var label = statement.label;\r\n if (label) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n label.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n // Check if 'continue' is allowed here\r\n var flow = this.currentFlow;\r\n var continueLabel = flow.continueLabel;\r\n if (continueLabel == null) {\r\n this.error(\r\n DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement,\r\n statement.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n flow.set(FlowFlags.CONTINUES);\r\n return module.createBreak(continueLabel);\r\n }\r\n\r\n compileDoStatement(statement: DoStatement): ExpressionRef {\r\n var module = this.module;\r\n\r\n var outerFlow = this.currentFlow;\r\n var label = outerFlow.pushBreakLabel();\r\n var innerFlow = outerFlow.fork();\r\n this.currentFlow = innerFlow;\r\n var breakLabel = \"break|\" + label;\r\n innerFlow.breakLabel = breakLabel;\r\n var continueLabel = \"continue|\" + label;\r\n innerFlow.continueLabel = continueLabel;\r\n\r\n var body = this.compileStatement(statement.statement);\r\n var condExpr = this.makeIsTrueish(\r\n this.compileExpression(statement.condition, Type.i32, ConversionKind.NONE, WrapMode.NONE),\r\n this.currentType\r\n );\r\n // TODO: check if condition is always false and if so, omit it (just a block)\r\n\r\n // Switch back to the parent flow\r\n innerFlow.freeScopedLocals();\r\n outerFlow.popBreakLabel();\r\n this.currentFlow = outerFlow;\r\n var terminated = innerFlow.isAny(FlowFlags.ANY_TERMINATING);\r\n innerFlow.unset(\r\n FlowFlags.BREAKS |\r\n FlowFlags.CONDITIONALLY_BREAKS |\r\n FlowFlags.CONTINUES |\r\n FlowFlags.CONDITIONALLY_CONTINUES\r\n );\r\n outerFlow.inherit(innerFlow);\r\n\r\n var block: ExpressionRef[] = [\r\n module.createLoop(continueLabel,\r\n terminated\r\n ? body // skip trailing continue if unnecessary\r\n : module.createBlock(null, [\r\n body,\r\n module.createBreak(continueLabel, condExpr)\r\n ], NativeType.None)\r\n )\r\n ];\r\n if (terminated) block.push(module.createUnreachable());\r\n return module.createBlock(breakLabel, block);\r\n }\r\n\r\n compileEmptyStatement(statement: EmptyStatement): ExpressionRef {\r\n return this.module.createNop();\r\n }\r\n\r\n compileExpressionStatement(statement: ExpressionStatement): ExpressionRef {\r\n var expr = this.compileExpression(statement.expression, Type.void, ConversionKind.NONE, WrapMode.NONE);\r\n if (this.currentType != Type.void) {\r\n expr = this.module.createDrop(expr);\r\n this.currentType = Type.void;\r\n }\r\n return expr;\r\n }\r\n\r\n compileForStatement(statement: ForStatement): ExpressionRef {\r\n // A for statement initiates a new branch with its own scoped variables\r\n // possibly declared in its initializer, and break context.\r\n var outerFlow = this.currentFlow;\r\n var label = outerFlow.pushBreakLabel();\r\n var innerFlow = outerFlow.fork();\r\n this.currentFlow = innerFlow;\r\n var breakLabel = innerFlow.breakLabel = \"break|\" + label;\r\n innerFlow.breakLabel = breakLabel;\r\n var continueLabel = \"continue|\" + label;\r\n innerFlow.continueLabel = continueLabel;\r\n var repeatLabel = \"repeat|\" + label;\r\n\r\n // Compile in correct order\r\n var module = this.module;\r\n var initExpr = statement.initializer\r\n ? this.compileStatement(statement.initializer)\r\n : 0;\r\n var condExpr: ExpressionRef = 0;\r\n var alwaysTrue = false;\r\n if (statement.condition) {\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n // check if the condition is always true\r\n let condPre = module.precomputeExpression(condExpr);\r\n if (getExpressionId(condPre) == ExpressionId.Const) {\r\n assert(getExpressionType(condPre) == NativeType.I32);\r\n if (getConstValueI32(condPre) != 0) alwaysTrue = true;\r\n // TODO: could skip compilation if the condition is always false here, but beware that the\r\n // initializer could still declare new 'var's that are used later on.\r\n }\r\n // recompile to original\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n } else {\r\n // omitted condition is always true\r\n condExpr = module.createI32(1);\r\n alwaysTrue = true;\r\n }\r\n var incrExpr = statement.incrementor\r\n ? this.compileExpression(statement.incrementor, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n : 0;\r\n var bodyStatement = statement.statement;\r\n var bodyExpr = bodyStatement.kind == NodeKind.BLOCK && (bodyStatement).statements.length == 1\r\n ? this.compileStatement((bodyStatement).statements[0])\r\n : this.compileStatement(bodyStatement);\r\n\r\n // Switch back to the parent flow\r\n innerFlow.freeScopedLocals();\r\n outerFlow.popBreakLabel();\r\n this.currentFlow = outerFlow;\r\n var usesContinue = innerFlow.isAny(FlowFlags.CONTINUES | FlowFlags.CONDITIONALLY_CONTINUES);\r\n innerFlow.unset(\r\n FlowFlags.BREAKS |\r\n FlowFlags.CONDITIONALLY_BREAKS |\r\n FlowFlags.CONTINUES |\r\n FlowFlags.CONDITIONALLY_CONTINUES\r\n );\r\n if (alwaysTrue) outerFlow.inherit(innerFlow);\r\n else outerFlow.inheritConditional(innerFlow);\r\n\r\n var breakBlock = new Array(); // outer 'break' block\r\n if (initExpr) breakBlock.push(initExpr);\r\n\r\n var repeatBlock = new Array(); // block repeating the loop\r\n if (usesContinue) {\r\n repeatBlock.push(\r\n module.createBlock(continueLabel, [ // inner 'continue' block\r\n module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr)),\r\n bodyExpr\r\n ], NativeType.None)\r\n );\r\n } else { // can omit the 'continue' block\r\n repeatBlock.push(\r\n module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr))\r\n );\r\n repeatBlock.push(bodyExpr);\r\n }\r\n if (incrExpr) repeatBlock.push(incrExpr);\r\n repeatBlock.push(\r\n module.createBreak(repeatLabel)\r\n );\r\n\r\n breakBlock.push(\r\n module.createLoop(repeatLabel, module.createBlock(null, repeatBlock, NativeType.None))\r\n );\r\n\r\n return module.createBlock(breakLabel, breakBlock);\r\n }\r\n\r\n compileIfStatement(statement: IfStatement): ExpressionRef {\r\n var module = this.module;\r\n var ifTrue = statement.ifTrue;\r\n var ifFalse = statement.ifFalse;\r\n var outerFlow = this.currentFlow;\r\n var actualFunction = outerFlow.actualFunction;\r\n\r\n // The condition doesn't initiate a branch yet\r\n var condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n\r\n if (\r\n !this.options.noTreeShaking ||\r\n actualFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\r\n ) {\r\n // Try to eliminate unnecesssary branches if the condition is constant\r\n let condExprPrecomp = module.precomputeExpression(condExpr);\r\n if (\r\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n getExpressionType(condExprPrecomp) == NativeType.I32\r\n ) {\r\n return getConstValueI32(condExprPrecomp)\r\n ? this.compileStatement(ifTrue)\r\n : ifFalse\r\n ? this.compileStatement(ifFalse)\r\n : module.createNop();\r\n\r\n // Otherwise recompile to the original and let the optimizer decide\r\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n }\r\n }\r\n\r\n // Each arm initiates a branch\r\n var ifTrueFlow = outerFlow.fork();\r\n this.currentFlow = ifTrueFlow;\r\n var ifTrueExpr = this.compileStatement(ifTrue);\r\n ifTrueFlow.freeScopedLocals();\r\n this.currentFlow = outerFlow;\r\n\r\n var ifFalseExpr: ExpressionRef = 0;\r\n if (ifFalse) {\r\n let ifFalseFlow = outerFlow.fork();\r\n this.currentFlow = ifFalseFlow;\r\n ifFalseExpr = this.compileStatement(ifFalse);\r\n ifFalseFlow.freeScopedLocals();\r\n this.currentFlow = outerFlow;\r\n outerFlow.inheritMutual(ifTrueFlow, ifFalseFlow);\r\n } else {\r\n outerFlow.inheritConditional(ifTrueFlow);\r\n }\r\n return module.createIf(condExpr, ifTrueExpr, ifFalseExpr);\r\n }\r\n\r\n compileReturnStatement(statement: ReturnStatement): ExpressionRef {\r\n var module = this.module;\r\n var expr: ExpressionRef = 0;\r\n var flow = this.currentFlow;\r\n\r\n // Remember that this flow returns\r\n flow.set(FlowFlags.RETURNS);\r\n\r\n if (statement.value) {\r\n let returnType = flow.returnType;\r\n if (returnType == Type.void) {\r\n this.compileExpressionRetainType(statement.value, returnType, WrapMode.NONE);\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n statement.value.range, this.currentType.toString(), returnType.toString()\r\n );\r\n this.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n expr = this.compileExpression(\r\n statement.value,\r\n returnType,\r\n ConversionKind.IMPLICIT,\r\n flow.actualFunction.is(CommonFlags.MODULE_EXPORT)\r\n ? WrapMode.WRAP\r\n : WrapMode.NONE\r\n );\r\n\r\n // Remember whether returning a properly wrapped value\r\n if (!flow.canOverflow(expr, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\r\n }\r\n\r\n // If the last statement anyway, make it the block's return value\r\n if (isLastStatement(statement)) return expr ? expr : module.createNop();\r\n\r\n // When inlining, break to the end of the inlined function's block (no need to wrap)\r\n if (flow.is(FlowFlags.INLINE_CONTEXT)) return module.createBreak(assert(flow.inlineReturnLabel), 0, expr);\r\n\r\n return module.createReturn(expr);\r\n }\r\n\r\n compileSwitchStatement(statement: SwitchStatement): ExpressionRef {\r\n var module = this.module;\r\n\r\n var cases = statement.cases;\r\n var numCases = cases.length;\r\n if (!numCases) {\r\n return this.compileExpression(statement.condition, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n }\r\n\r\n // Everything within a switch uses the same break context\r\n var outerFlow = this.currentFlow;\r\n var context = outerFlow.pushBreakLabel();\r\n\r\n // introduce a local for evaluating the condition (exactly once)\r\n var tempLocal = outerFlow.getTempLocal(Type.u32, false);\r\n var tempLocalIndex = tempLocal.index;\r\n\r\n // Prepend initializer to inner block. Does not initiate a new branch, yet.\r\n var breaks = new Array(1 + numCases);\r\n breaks[0] = module.createSetLocal( // initializer\r\n tempLocalIndex,\r\n this.compileExpression(statement.condition, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n );\r\n\r\n // make one br_if per (possibly dynamic) labeled case (binaryen optimizes to br_table where possible)\r\n var breakIndex = 1;\r\n var defaultIndex = -1;\r\n for (let i = 0; i < numCases; ++i) {\r\n let case_ = cases[i];\r\n let label = case_.label;\r\n if (label) {\r\n breaks[breakIndex++] = module.createBreak(\"case\" + i.toString(10) + \"|\" + context,\r\n module.createBinary(BinaryOp.EqI32,\r\n module.createGetLocal(tempLocalIndex, NativeType.I32),\r\n this.compileExpression(label, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n )\r\n );\r\n } else {\r\n defaultIndex = i;\r\n }\r\n }\r\n\r\n outerFlow.freeTempLocal(tempLocal);\r\n\r\n // otherwise br to default respectively out of the switch if there is no default case\r\n breaks[breakIndex] = module.createBreak((defaultIndex >= 0\r\n ? \"case\" + defaultIndex.toString(10)\r\n : \"break\"\r\n ) + \"|\" + context);\r\n\r\n // nest blocks in order\r\n var currentBlock = module.createBlock(\"case0|\" + context, breaks, NativeType.None);\r\n var alwaysReturns = true;\r\n var alwaysReturnsWrapped = true;\r\n var alwaysThrows = true;\r\n var alwaysAllocates = true;\r\n for (let i = 0; i < numCases; ++i) {\r\n let case_ = cases[i];\r\n let statements = case_.statements;\r\n let numStatements = statements.length;\r\n\r\n // Each switch case initiates a new branch\r\n let innerFlow = outerFlow.fork();\r\n this.currentFlow = innerFlow;\r\n let breakLabel = \"break|\" + context;\r\n innerFlow.breakLabel = breakLabel;\r\n\r\n let isLast = i == numCases - 1;\r\n let nextLabel = isLast ? breakLabel : \"case\" + (i + 1).toString(10) + \"|\" + context;\r\n let stmts = new Array(1 + numStatements);\r\n stmts[0] = currentBlock;\r\n let count = 1;\r\n let terminated = false;\r\n for (let j = 0; j < numStatements; ++j) {\r\n let stmt = this.compileStatement(statements[j]);\r\n if (getExpressionId(stmt) != ExpressionId.Nop) {\r\n stmts[count++] = stmt;\r\n if (innerFlow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n terminated = true;\r\n break;\r\n }\r\n }\r\n }\r\n stmts.length = count;\r\n if (terminated || isLast) {\r\n if (!innerFlow.is(FlowFlags.RETURNS)) alwaysReturns = false;\r\n if (!innerFlow.is(FlowFlags.RETURNS_WRAPPED)) alwaysReturnsWrapped = false;\r\n if (!innerFlow.is(FlowFlags.THROWS)) alwaysThrows = false;\r\n if (!innerFlow.is(FlowFlags.ALLOCATES)) alwaysAllocates = false;\r\n }\r\n\r\n // Switch back to the parent flow\r\n innerFlow.unset(\r\n FlowFlags.BREAKS |\r\n FlowFlags.CONDITIONALLY_BREAKS\r\n );\r\n innerFlow.freeScopedLocals();\r\n this.currentFlow = outerFlow;\r\n currentBlock = module.createBlock(nextLabel, stmts, NativeType.None); // must be a labeled block\r\n }\r\n outerFlow.popBreakLabel();\r\n\r\n // If the switch has a default (guaranteed to handle any value), propagate common flags\r\n if (defaultIndex >= 0) {\r\n if (alwaysReturns) outerFlow.set(FlowFlags.RETURNS);\r\n if (alwaysReturnsWrapped) outerFlow.set(FlowFlags.RETURNS_WRAPPED);\r\n if (alwaysThrows) outerFlow.set(FlowFlags.THROWS);\r\n if (alwaysAllocates) outerFlow.set(FlowFlags.ALLOCATES);\r\n }\r\n return currentBlock;\r\n }\r\n\r\n compileThrowStatement(statement: ThrowStatement): ExpressionRef {\r\n var flow = this.currentFlow;\r\n\r\n // Remember that this branch throws\r\n flow.set(FlowFlags.THROWS);\r\n\r\n // FIXME: without try-catch it is safe to assume RETURNS as well for now\r\n flow.set(FlowFlags.RETURNS);\r\n\r\n // TODO: requires exception-handling spec.\r\n return compileAbort(this, null, statement);\r\n }\r\n\r\n compileTryStatement(statement: TryStatement): ExpressionRef {\r\n // TODO\r\n // can't yet support something like: try { return ... } finally { ... }\r\n // worthwhile to investigate lowering returns to block results (here)?\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n /**\r\n * Compiles a variable statement. Returns `0` if an initializer is not\r\n * necessary.\r\n */\r\n compileVariableStatement(statement: VariableStatement, isKnownGlobal: bool = false): ExpressionRef {\r\n var program = this.program;\r\n var declarations = statement.declarations;\r\n var numDeclarations = declarations.length;\r\n var flow = this.currentFlow;\r\n\r\n // top-level variables and constants become globals\r\n if (isKnownGlobal || (\r\n flow.parentFunction == this.startFunctionInstance &&\r\n statement.parent && statement.parent.kind == NodeKind.SOURCE\r\n )) {\r\n // NOTE that the above condition also covers top-level variables declared with 'let', even\r\n // though such variables could also become start function locals if, and only if, not used\r\n // within any function declared in the same source, which is unknown at this point. the only\r\n // efficient way to deal with this would be to keep track of all occasions it is used and\r\n // replace these instructions afterwards, dynamically. (TOOD: what about a Binaryen pass?)\r\n for (let i = 0; i < numDeclarations; ++i) {\r\n this.compileGlobalDeclaration(declarations[i]);\r\n }\r\n return 0;\r\n }\r\n\r\n // other variables become locals\r\n var initializers = new Array();\r\n var resolver = this.resolver;\r\n for (let i = 0; i < numDeclarations; ++i) {\r\n let declaration = declarations[i];\r\n let name = declaration.name.text;\r\n let type: Type | null = null;\r\n let initExpr: ExpressionRef = 0;\r\n if (declaration.type) {\r\n type = resolver.resolveType( // reports\r\n declaration.type,\r\n flow.contextualTypeArguments\r\n );\r\n if (!type) continue;\r\n if (declaration.initializer) {\r\n initExpr = this.compileExpression( // reports\r\n declaration.initializer,\r\n type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n } else if (declaration.initializer) { // infer type using void/NONE for proper literal inference\r\n initExpr = this.compileExpressionRetainType( // reports\r\n declaration.initializer,\r\n Type.void,\r\n WrapMode.NONE\r\n );\r\n if (this.currentType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n declaration.range, this.currentType.toString(), \"\"\r\n );\r\n continue;\r\n }\r\n type = this.currentType;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n declaration.name.range.atEnd\r\n );\r\n continue;\r\n }\r\n let isInlined = false;\r\n if (declaration.is(CommonFlags.CONST)) {\r\n if (initExpr) {\r\n initExpr = this.module.precomputeExpression(initExpr);\r\n if (getExpressionId(initExpr) == ExpressionId.Const) {\r\n let local = new Local(program, name, -1, type);\r\n switch (getExpressionType(initExpr)) {\r\n case NativeType.I32: {\r\n local = local.withConstantIntegerValue(\r\n i64_new(\r\n getConstValueI32(initExpr),\r\n 0\r\n )\r\n );\r\n break;\r\n }\r\n case NativeType.I64: {\r\n local = local.withConstantIntegerValue(\r\n i64_new(\r\n getConstValueI64Low(initExpr),\r\n getConstValueI64High(initExpr)\r\n )\r\n );\r\n break;\r\n }\r\n case NativeType.F32: {\r\n local = local.withConstantFloatValue(getConstValueF32(initExpr));\r\n break;\r\n }\r\n case NativeType.F64: {\r\n local = local.withConstantFloatValue(getConstValueF64(initExpr));\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n // Create a virtual local that doesn't actually exist in WebAssembly\r\n let scopedLocals = flow.scopedLocals;\r\n if (!scopedLocals) flow.scopedLocals = scopedLocals = new Map();\r\n else if (scopedLocals.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, name\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n scopedLocals.set(name, local);\r\n isInlined = true;\r\n } else {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n declaration.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._const_declarations_must_be_initialized,\r\n declaration.range\r\n );\r\n }\r\n }\r\n if (!isInlined) {\r\n let local: Local;\r\n if (\r\n declaration.isAny(CommonFlags.LET | CommonFlags.CONST) ||\r\n flow.is(FlowFlags.INLINE_CONTEXT)\r\n ) { // here: not top-level\r\n local = flow.addScopedLocal(name, type, false, declaration.name); // reports if duplicate\r\n } else {\r\n if (flow.lookupLocal(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, name\r\n );\r\n continue;\r\n }\r\n local = flow.parentFunction.addLocal(type, name, declaration);\r\n }\r\n if (initExpr) {\r\n initializers.push(\r\n this.compileAssignmentWithValue(declaration.name, initExpr)\r\n );\r\n if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n flow.setLocalWrapped(local.index, !flow.canOverflow(initExpr, type));\r\n }\r\n } else if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n flow.setLocalWrapped(local.index, true); // zero\r\n }\r\n }\r\n }\r\n return initializers.length // we can unwrap these here because the\r\n ? initializers.length == 1 // source didn't tell us exactly what to do\r\n ? initializers[0]\r\n : this.module.createBlock(null, initializers, NativeType.None)\r\n : 0;\r\n }\r\n\r\n compileVoidStatement(statement: VoidStatement): ExpressionRef {\r\n return this.compileExpression(statement.expression, Type.void, ConversionKind.EXPLICIT, WrapMode.NONE);\r\n }\r\n\r\n compileWhileStatement(statement: WhileStatement): ExpressionRef {\r\n var module = this.module;\r\n var outerFlow = this.currentFlow;\r\n\r\n // The condition does not yet initialize a branch\r\n var condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n\r\n if (\r\n !this.options.noTreeShaking ||\r\n outerFlow.actualFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\r\n ) {\r\n // Try to eliminate unnecesssary loops if the condition is constant\r\n let condExprPrecomp = module.precomputeExpression(condExpr);\r\n if (\r\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n getExpressionType(condExprPrecomp) == NativeType.I32\r\n ) {\r\n if (!getConstValueI32(condExprPrecomp)) return module.createNop();\r\n\r\n // Otherwise recompile to the original and let the optimizer decide\r\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n }\r\n }\r\n\r\n // Statements initiate a new branch with its own break context\r\n var label = outerFlow.pushBreakLabel();\r\n var innerFlow = outerFlow.fork();\r\n this.currentFlow = innerFlow;\r\n var breakLabel = \"break|\" + label;\r\n innerFlow.breakLabel = breakLabel;\r\n var continueLabel = \"continue|\" + label;\r\n innerFlow.continueLabel = continueLabel;\r\n\r\n var body = this.compileStatement(statement.statement);\r\n var alwaysTrue = false; // TODO\r\n var terminated = innerFlow.isAny(FlowFlags.ANY_TERMINATING);\r\n\r\n // Switch back to the parent flow\r\n innerFlow.freeScopedLocals();\r\n outerFlow.popBreakLabel();\r\n this.currentFlow = outerFlow;\r\n innerFlow.unset(\r\n FlowFlags.BREAKS |\r\n FlowFlags.CONDITIONALLY_BREAKS |\r\n FlowFlags.CONTINUES |\r\n FlowFlags.CONDITIONALLY_CONTINUES\r\n );\r\n if (alwaysTrue) outerFlow.inherit(innerFlow);\r\n else outerFlow.inheritConditional(innerFlow);\r\n\r\n return module.createBlock(breakLabel, [\r\n module.createLoop(continueLabel,\r\n module.createIf(condExpr,\r\n terminated\r\n ? body // skip trailing continue if unnecessary\r\n : module.createBlock(null, [\r\n body,\r\n module.createBreak(continueLabel)\r\n ], NativeType.None)\r\n )\r\n )\r\n ]);\r\n }\r\n\r\n // expressions\r\n\r\n /**\r\n * Compiles the value of an inlined constant element.\r\n * @param retainType If true, the annotated type of the constant is retained. Otherwise, the value\r\n * is precomputed according to context.\r\n */\r\n compileInlineConstant(\r\n element: VariableLikeElement,\r\n contextualType: Type,\r\n retainType: bool\r\n ): ExpressionRef {\r\n assert(element.is(CommonFlags.INLINED));\r\n var type = element.type;\r\n switch (\r\n !retainType &&\r\n type.is(TypeFlags.INTEGER) &&\r\n contextualType.is(TypeFlags.INTEGER) &&\r\n type.size < contextualType.size\r\n ? (this.currentType = contextualType).kind // essentially precomputes a (sign-)extension\r\n : (this.currentType = type).kind\r\n ) {\r\n case TypeKind.I8:\r\n case TypeKind.I16: {\r\n let shift = type.computeSmallIntegerShift(Type.i32);\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue) << shift >> shift\r\n : 0\r\n ); // recognized by canOverflow\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n let mask = element.type.computeSmallIntegerMask(Type.i32);\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue) & mask\r\n : 0\r\n ); // recognized by canOverflow\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue)\r\n : 0\r\n );\r\n }\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: {\r\n if (!element.program.options.isWasm64) {\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue)\r\n : 0\r\n );\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n return element.constantValueKind == ConstantValueKind.INTEGER\r\n ? this.module.createI64(\r\n i64_low(element.constantIntegerValue),\r\n i64_high(element.constantIntegerValue)\r\n )\r\n : this.module.createI64(0);\r\n }\r\n case TypeKind.F64: {\r\n // monkey-patch for converting built-in floats to f32 implicitly\r\n if (!(element.hasDecorator(DecoratorFlags.BUILTIN) && contextualType == Type.f32)) {\r\n return this.module.createF64((element).constantFloatValue);\r\n }\r\n // otherwise fall-through: basically precomputes f32.demote/f64 of NaN / Infinity\r\n this.currentType = Type.f32;\r\n }\r\n case TypeKind.F32: {\r\n return this.module.createF32((element).constantFloatValue);\r\n }\r\n default: {\r\n assert(false);\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n }\r\n\r\n compileExpression(\r\n expression: Expression,\r\n contextualType: Type,\r\n conversionKind: ConversionKind,\r\n wrapMode: WrapMode\r\n ): ExpressionRef {\r\n this.currentType = contextualType;\r\n\r\n var expr: ExpressionRef;\r\n switch (expression.kind) {\r\n case NodeKind.ASSERTION: {\r\n expr = this.compileAssertionExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.BINARY: {\r\n expr = this.compileBinaryExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.CALL: {\r\n expr = this.compileCallExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.COMMA: {\r\n expr = this.compileCommaExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.ELEMENTACCESS: {\r\n expr = this.compileElementAccessExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.FUNCTION: {\r\n expr = this.compileFunctionExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.IDENTIFIER:\r\n case NodeKind.FALSE:\r\n case NodeKind.NULL:\r\n case NodeKind.THIS:\r\n case NodeKind.SUPER:\r\n case NodeKind.TRUE: {\r\n expr = this.compileIdentifierExpression(\r\n expression,\r\n contextualType,\r\n conversionKind == ConversionKind.NONE // retain type of inlined constants\r\n );\r\n break;\r\n }\r\n case NodeKind.INSTANCEOF: {\r\n expr = this.compileInstanceOfExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.LITERAL: {\r\n expr = this.compileLiteralExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.NEW: {\r\n expr = this.compileNewExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.PARENTHESIZED: {\r\n expr = this.compileParenthesizedExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.PROPERTYACCESS: {\r\n expr = this.compilePropertyAccessExpression(\r\n expression,\r\n contextualType,\r\n conversionKind == ConversionKind.NONE // retain type of inlined constants\r\n );\r\n break;\r\n }\r\n case NodeKind.TERNARY: {\r\n expr = this.compileTernaryExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.UNARYPOSTFIX: {\r\n expr = this.compileUnaryPostfixExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.UNARYPREFIX: {\r\n expr = this.compileUnaryPrefixExpression(expression, contextualType);\r\n break;\r\n }\r\n default: {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n expr = this.module.createUnreachable();\r\n }\r\n }\r\n\r\n var currentType = this.currentType;\r\n if (conversionKind != ConversionKind.NONE && currentType != contextualType) {\r\n expr = this.convertExpression(expr, currentType, contextualType, conversionKind, wrapMode, expression);\r\n this.currentType = contextualType;\r\n } else if (wrapMode == WrapMode.WRAP) {\r\n expr = this.ensureSmallIntegerWrap(expr, currentType);\r\n }\r\n\r\n if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\r\n return expr;\r\n }\r\n\r\n compileExpressionRetainType(\r\n expression: Expression,\r\n contextualType: Type,\r\n wrapMode: WrapMode\r\n ): ExpressionRef {\r\n return this.compileExpression(\r\n expression,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n wrapMode\r\n );\r\n }\r\n\r\n precomputeExpression(\r\n expression: Expression,\r\n contextualType: Type,\r\n conversionKind: ConversionKind,\r\n wrapMode: WrapMode\r\n ): ExpressionRef {\r\n return this.module.precomputeExpression(\r\n this.compileExpression(expression, contextualType, conversionKind, wrapMode)\r\n );\r\n }\r\n\r\n convertExpression(\r\n expr: ExpressionRef,\r\n fromType: Type,\r\n toType: Type,\r\n conversionKind: ConversionKind,\r\n wrapMode: WrapMode,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n assert(conversionKind != ConversionKind.NONE);\r\n var module = this.module;\r\n\r\n // void to any\r\n if (fromType.kind == TypeKind.VOID) {\r\n assert(toType.kind != TypeKind.VOID); // convertExpression should not be called with void -> void\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n reportNode.range, fromType.toString(), toType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n // any to void\r\n if (toType.kind == TypeKind.VOID) return module.createDrop(expr);\r\n\r\n if (!fromType.isAssignableTo(toType)) {\r\n if (conversionKind == ConversionKind.IMPLICIT) {\r\n this.error(\r\n DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,\r\n reportNode.range, fromType.toString(), toType.toString()\r\n ); // recoverable\r\n }\r\n }\r\n\r\n if (fromType.is(TypeFlags.FLOAT)) {\r\n\r\n // float to float\r\n if (toType.is(TypeFlags.FLOAT)) {\r\n if (fromType.kind == TypeKind.F32) {\r\n\r\n // f32 to f64\r\n if (toType.kind == TypeKind.F64) {\r\n expr = module.createUnary(UnaryOp.PromoteF32, expr);\r\n }\r\n\r\n // otherwise f32 to f32\r\n\r\n // f64 to f32\r\n } else if (toType.kind == TypeKind.F32) {\r\n expr = module.createUnary(UnaryOp.DemoteF64, expr);\r\n }\r\n\r\n // otherwise f64 to f64\r\n\r\n // float to int\r\n } else if (toType.is(TypeFlags.INTEGER)) {\r\n\r\n // f32 to int\r\n if (fromType.kind == TypeKind.F32) {\r\n if (toType == Type.bool) {\r\n expr = module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\r\n wrapMode = WrapMode.NONE;\r\n } else if (toType.is(TypeFlags.SIGNED)) {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.TruncF32ToI64, expr);\r\n } else {\r\n expr = module.createUnary(UnaryOp.TruncF32ToI32, expr);\r\n }\r\n } else {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.TruncF32ToU64, expr);\r\n } else {\r\n expr = module.createUnary(UnaryOp.TruncF32ToU32, expr);\r\n }\r\n }\r\n\r\n // f64 to int\r\n } else {\r\n if (toType == Type.bool) {\r\n expr = module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\r\n wrapMode = WrapMode.NONE;\r\n } else if (toType.is(TypeFlags.SIGNED)) {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.TruncF64ToI64, expr);\r\n } else {\r\n expr = module.createUnary(UnaryOp.TruncF64ToI32, expr);\r\n }\r\n } else {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.TruncF64ToU64, expr);\r\n } else {\r\n expr = module.createUnary(UnaryOp.TruncF64ToU32, expr);\r\n }\r\n }\r\n }\r\n\r\n // float to void\r\n } else {\r\n assert(toType.flags == TypeFlags.NONE, \"void type expected\");\r\n expr = module.createDrop(expr);\r\n }\r\n\r\n // int to float\r\n } else if (fromType.is(TypeFlags.INTEGER) && toType.is(TypeFlags.FLOAT)) {\r\n\r\n // int to f32\r\n if (toType.kind == TypeKind.F32) {\r\n if (fromType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI64ToF32\r\n : UnaryOp.ConvertU64ToF32,\r\n expr\r\n );\r\n } else {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI32ToF32\r\n : UnaryOp.ConvertU32ToF32,\r\n expr\r\n );\r\n }\r\n\r\n // int to f64\r\n } else {\r\n if (fromType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI64ToF64\r\n : UnaryOp.ConvertU64ToF64,\r\n expr\r\n );\r\n } else {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI32ToF64\r\n : UnaryOp.ConvertU32ToF64,\r\n expr\r\n );\r\n }\r\n }\r\n\r\n // int to int\r\n } else {\r\n // i64 to ...\r\n if (fromType.is(TypeFlags.LONG)) {\r\n\r\n // i64 to i32 or smaller\r\n if (toType == Type.bool) {\r\n expr = module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\r\n wrapMode = WrapMode.NONE;\r\n } else if (!toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.WrapI64, expr); // discards upper bits\r\n }\r\n\r\n // i32 or smaller to i64\r\n } else if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED) ? UnaryOp.ExtendI32 : UnaryOp.ExtendU32,\r\n this.ensureSmallIntegerWrap(expr, fromType) // must clear garbage bits\r\n );\r\n wrapMode = WrapMode.NONE;\r\n\r\n // i32 to i32\r\n } else {\r\n // small i32 to ...\r\n if (fromType.is(TypeFlags.SHORT)) {\r\n // small i32 to larger i32\r\n if (fromType.size < toType.size) {\r\n expr = this.ensureSmallIntegerWrap(expr, fromType); // must clear garbage bits\r\n wrapMode = WrapMode.NONE;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.currentType = toType;\r\n return wrapMode == WrapMode.WRAP\r\n ? this.ensureSmallIntegerWrap(expr, toType)\r\n : expr;\r\n }\r\n\r\n compileAssertionExpression(expression: AssertionExpression, contextualType: Type): ExpressionRef {\r\n switch (expression.assertionKind) {\r\n case AssertionKind.PREFIX:\r\n case AssertionKind.AS: {\r\n let toType = this.resolver.resolveType( // reports\r\n assert(expression.toType),\r\n this.currentFlow.contextualTypeArguments\r\n );\r\n if (!toType) return this.module.createUnreachable();\r\n return this.compileExpression(expression.expression, toType, ConversionKind.EXPLICIT, WrapMode.NONE);\r\n }\r\n case AssertionKind.NONNULL: {\r\n assert(!expression.toType);\r\n let expr = this.compileExpressionRetainType(expression.expression, contextualType, WrapMode.NONE);\r\n this.currentType = this.currentType.nonNullableType;\r\n return expr;\r\n }\r\n default: assert(false);\r\n }\r\n return this.module.createUnreachable();\r\n }\r\n\r\n private f32ModInstance: Function | null = null;\r\n private f64ModInstance: Function | null = null;\r\n private f32PowInstance: Function | null = null;\r\n private f64PowInstance: Function | null = null;\r\n\r\n compileBinaryExpression(\r\n expression: BinaryExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var left = expression.left;\r\n var right = expression.right;\r\n\r\n var leftExpr: ExpressionRef;\r\n var leftType: Type;\r\n var rightExpr: ExpressionRef;\r\n var rightType: Type;\r\n var commonType: Type | null;\r\n\r\n var expr: ExpressionRef;\r\n var compound = false;\r\n\r\n var operator = expression.operator;\r\n switch (operator) {\r\n case Token.LESSTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.LT);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"<\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.LtI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.LtI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LtI64\r\n : BinaryOp.LtI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.LtU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LtU64\r\n : BinaryOp.LtU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.LtU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.LtF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.LtF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.GREATERTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.GT);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \">\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.GtI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GtI64\r\n : BinaryOp.GtI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.GtI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.GtU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GtU64\r\n : BinaryOp.GtU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.GtU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.GtF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.GtF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.LESSTHAN_EQUALS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.LE);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"<=\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.LeI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LeI64\r\n : BinaryOp.LeI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.LeI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.LeU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LeU64\r\n : BinaryOp.LeU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.LeU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.LeF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.LeF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.GREATERTHAN_EQUALS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.GE);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \">=\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.GeI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GeI64\r\n : BinaryOp.GeI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.GeI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.GeU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GeU64\r\n : BinaryOp.GeU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.GeU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.GeF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.GeF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n\r\n case Token.EQUALS_EQUALS_EQUALS:\r\n case Token.EQUALS_EQUALS: {\r\n\r\n // NOTE that this favors correctness, in terms of emitting a binary expression, over\r\n // checking for a possible use of unary EQZ. while the most classic of all optimizations,\r\n // that's not what the source told us to do. for reference, `!left` emits unary EQZ.\r\n\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (operator == Token.EQUALS_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.EQ);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n // still allow '==' with references\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.EqI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.EqI64\r\n : BinaryOp.EqI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.EqI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.EqF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.EqF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.EXCLAMATION_EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (operator == Token.EXCLAMATION_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.NE);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n // still allow '!=' with references\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.NeI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.NeI64\r\n : BinaryOp.NeI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.NeI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.NeF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.NeF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.EQUALS: {\r\n return this.compileAssignment(left, right, contextualType);\r\n }\r\n case Token.PLUS_EQUALS: compound = true;\r\n case Token.PLUS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.ADD);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"+\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8: // addition might overflow\r\n case TypeKind.I16: // ^\r\n case TypeKind.U8: // ^\r\n case TypeKind.U16: // ^\r\n case TypeKind.BOOL: // ^\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.AddI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.AddI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.AddF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.AddF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.MINUS_EQUALS: compound = true;\r\n case Token.MINUS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.SUB);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"-\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8: // subtraction might overflow\r\n case TypeKind.I16: // ^\r\n case TypeKind.U8: // ^\r\n case TypeKind.U16: // ^\r\n case TypeKind.BOOL: // ^\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.SubI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.SubI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.SubF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.SubF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.ASTERISK_EQUALS: compound = true;\r\n case Token.ASTERISK: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.MUL);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"*\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.MulI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.MulI64\r\n : BinaryOp.MulI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.MulI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.MulF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.MulF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.ASTERISK_ASTERISK_EQUALS: compound = true;\r\n case Token.ASTERISK_ASTERISK: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.POW);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n let instance: Function | null;\r\n\r\n // Mathf.pow if lhs is f32 (result is f32)\r\n if (this.currentType.kind == TypeKind.F32) {\r\n rightExpr = this.compileExpression(right, Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (!(instance = this.f32PowInstance)) {\r\n let namespace = this.program.elementsLookup.get(\"Mathf\");\r\n if (!namespace) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Mathf\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n let prototype = namespace.members ? namespace.members.get(\"pow\") : null;\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Mathf.pow\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.f32PowInstance = instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n\r\n // Math.pow otherwise (result is f64)\r\n // TODO: should the result be converted back?\r\n } else {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n this.currentType,\r\n Type.f64,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n leftType = this.currentType;\r\n rightExpr = this.compileExpression(\r\n right,\r\n Type.f64,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n rightType = this.currentType;\r\n if (!(instance = this.f64PowInstance)) {\r\n let namespace = this.program.elementsLookup.get(\"Math\");\r\n if (!namespace) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Math\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n let prototype = namespace.members ? namespace.members.get(\"pow\") : null;\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Math.pow\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.f64PowInstance = instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n }\r\n if (!(instance && this.compileFunction(instance))) {\r\n expr = module.createUnreachable();\r\n } else {\r\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n }\r\n break;\r\n }\r\n case Token.SLASH_EQUALS: compound = true;\r\n case Token.SLASH: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.DIV);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP, // !\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP, // !\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"/\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8: // signed div on signed small integers might overflow, e.g. -128/-1\r\n case TypeKind.I16: // ^\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.DivI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.DivI64\r\n : BinaryOp.DivI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.DivI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.DivU64\r\n : BinaryOp.DivU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.DivU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.DivF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.DivF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.PERCENT_EQUALS: compound = true;\r\n case Token.PERCENT: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.REM);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP, // !\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP, // !\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"%\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16: {\r\n expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.RemI64\r\n : BinaryOp.RemI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.RemI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.RemU64\r\n : BinaryOp.RemU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.RemU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n let instance = this.f32ModInstance;\r\n if (!instance) {\r\n let namespace = this.program.elementsLookup.get(\"Mathf\");\r\n if (!namespace) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Mathf\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n let prototype = namespace.members ? namespace.members.get(\"mod\") : null;\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Mathf.mod\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.f32ModInstance = instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n if (!(instance && this.compileFunction(instance))) {\r\n expr = module.createUnreachable();\r\n } else {\r\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n }\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n let instance = this.f64ModInstance;\r\n if (!instance) {\r\n let namespace = this.program.elementsLookup.get(\"Math\");\r\n if (!namespace) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Math\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n let prototype = namespace.members ? namespace.members.get(\"mod\") : null;\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Math.mod\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.f64ModInstance = instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n if (!(instance && this.compileFunction(instance))) {\r\n expr = module.createUnreachable();\r\n } else {\r\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n }\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.LESSTHAN_LESSTHAN_EQUALS: compound = true;\r\n case Token.LESSTHAN_LESSTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHL);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.ShlI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.ShlI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShlI64\r\n : BinaryOp.ShlI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\r\n case Token.GREATERTHAN_GREATERTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n rightType = this.currentType;\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16: {\r\n expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.ShrI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrI64\r\n : BinaryOp.ShrI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrU64\r\n : BinaryOp.ShrU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR_U);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n switch (this.currentType.kind) {\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: { // assumes that unsigned shr on unsigned small integers does not overflow\r\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n }\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrU64\r\n : BinaryOp.ShrU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.AMPERSAND_EQUALS: compound = true;\r\n case Token.AMPERSAND: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overloadd\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_AND);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"&\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.AndI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.AndI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AndI64\r\n : BinaryOp.AndI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.BAR_EQUALS: compound = true;\r\n case Token.BAR: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_OR);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"|\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.OrI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.OrI64\r\n : BinaryOp.OrI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.CARET_EQUALS: compound = true;\r\n case Token.CARET: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_XOR);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"^\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.XorI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.XorI64\r\n : BinaryOp.XorI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n\r\n // logical (no overloading)\r\n\r\n case Token.AMPERSAND_AMPERSAND: { // left && right\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n\r\n // simplify if cloning left without side effects is possible\r\n if (expr = module.cloneExpression(leftExpr, true, 0)) {\r\n this.makeIsTrueish(leftExpr, this.currentType);\r\n expr = module.createIf(\r\n this.makeIsTrueish(leftExpr, this.currentType),\r\n rightExpr,\r\n expr\r\n );\r\n\r\n // if not possible, tee left to a temp. local\r\n } else {\r\n let flow = this.currentFlow;\r\n let tempLocal = flow.getAndFreeTempLocal(\r\n this.currentType,\r\n !flow.canOverflow(leftExpr, this.currentType)\r\n );\r\n expr = module.createIf(\r\n this.makeIsTrueish(\r\n module.createTeeLocal(tempLocal.index, leftExpr),\r\n this.currentType\r\n ),\r\n rightExpr,\r\n module.createGetLocal(\r\n assert(tempLocal).index, // to be sure\r\n this.currentType.toNativeType()\r\n )\r\n );\r\n }\r\n break;\r\n }\r\n case Token.BAR_BAR: { // left || right\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n\r\n // simplify if cloning left without side effects is possible\r\n if (expr = this.module.cloneExpression(leftExpr, true, 0)) {\r\n expr = this.module.createIf(\r\n this.makeIsTrueish(leftExpr, this.currentType),\r\n expr,\r\n rightExpr\r\n );\r\n\r\n // if not possible, tee left to a temp. local\r\n } else {\r\n let flow = this.currentFlow;\r\n let tempLocal = flow.getAndFreeTempLocal(\r\n this.currentType,\r\n !flow.canOverflow(leftExpr, this.currentType)\r\n );\r\n expr = module.createIf(\r\n this.makeIsTrueish(\r\n module.createTeeLocal(tempLocal.index, leftExpr),\r\n this.currentType\r\n ),\r\n module.createGetLocal(\r\n assert(tempLocal).index, // to be sure\r\n this.currentType.toNativeType()\r\n ),\r\n rightExpr\r\n );\r\n }\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = this.module.createUnreachable();\r\n }\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(left, expr, contextualType != Type.void)\r\n : expr;\r\n }\r\n\r\n compileUnaryOverload(\r\n operatorInstance: Function,\r\n value: Expression,\r\n valueExpr: ExpressionRef,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n var argumentExpressions: Expression[];\r\n var thisArg: ExpressionRef = 0;\r\n if (operatorInstance.is(CommonFlags.INSTANCE)) {\r\n thisArg = valueExpr; // can reuse the previously evaluated expr as the this value here\r\n argumentExpressions = [];\r\n } else {\r\n argumentExpressions = [ value ]; // annotated type might differ -> recompile\r\n }\r\n return this.compileCallDirect(\r\n operatorInstance,\r\n argumentExpressions,\r\n reportNode,\r\n thisArg\r\n );\r\n }\r\n\r\n compileBinaryOverload(\r\n operatorInstance: Function,\r\n left: Expression,\r\n leftExpr: ExpressionRef,\r\n right: Expression,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n var argumentExpressions: Expression[];\r\n var thisArg: ExpressionRef = 0;\r\n if (operatorInstance.is(CommonFlags.INSTANCE)) {\r\n let classInstance = assert(operatorInstance.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n thisArg = leftExpr; // can reuse the previously evaluated leftExpr as the this value here\r\n argumentExpressions = [ right ];\r\n } else {\r\n argumentExpressions = [ left, right ]; // annotated type of LHS might differ -> recompile\r\n }\r\n var ret = this.compileCallDirect(\r\n operatorInstance,\r\n argumentExpressions,\r\n reportNode,\r\n thisArg\r\n );\r\n return ret;\r\n }\r\n\r\n compileAssignment(expression: Expression, valueExpression: Expression, contextualType: Type): ExpressionRef {\r\n var program = this.program;\r\n var resolver = program.resolver;\r\n var flow = this.currentFlow;\r\n var target = resolver.resolveExpression(expression, flow); // reports\r\n if (!target) return this.module.createUnreachable();\r\n\r\n // to compile just the value, we need to know the target's type\r\n var targetType: Type;\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL: {\r\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field compiled as a global\r\n return this.module.createUnreachable();\r\n }\r\n assert((target).type != Type.void); // compileGlobal must guarantee this\r\n // fall-through\r\n }\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD: {\r\n targetType = (target).type;\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let setterPrototype = (target).setterPrototype;\r\n if (setterPrototype) {\r\n let instance = this.resolver.resolveFunction(setterPrototype, null);\r\n if (!instance) return this.module.createUnreachable();\r\n assert(instance.signature.parameterTypes.length == 1); // parser must guarantee this\r\n targetType = instance.signature.parameterTypes[0];\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (target).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n case ElementKind.CLASS: {\r\n if (resolver.currentElementExpression) { // indexed access\r\n let isUnchecked = flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n let indexedSet = (target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\r\n if (!indexedSet) {\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n if (!indexedGet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n expression.range, (target).internalName\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n expression.range, (target).internalName\r\n );\r\n }\r\n return this.module.createUnreachable();\r\n }\r\n assert(indexedSet.signature.parameterTypes.length == 2); // parser must guarantee this\r\n targetType = indexedSet.signature.parameterTypes[1]; // 2nd parameter is the element\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n\r\n // compile the value and do the assignment\r\n assert(targetType != Type.void);\r\n var valueExpr = this.compileExpression(valueExpression, targetType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n return this.compileAssignmentWithValue(\r\n expression,\r\n valueExpr,\r\n contextualType != Type.void\r\n );\r\n }\r\n\r\n compileAssignmentWithValue(\r\n expression: Expression,\r\n valueWithCorrectType: ExpressionRef,\r\n tee: bool = false\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n var target = this.resolver.resolveExpression(expression, flow); // reports\r\n if (!target) return module.createUnreachable();\r\n\r\n switch (target.kind) {\r\n case ElementKind.LOCAL: {\r\n let type = (target).type;\r\n assert(type != Type.void);\r\n this.currentType = tee ? type : Type.void;\r\n if ((target).is(CommonFlags.CONST)) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, target.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n flow.setLocalWrapped((target).index, !flow.canOverflow(valueWithCorrectType, type));\r\n }\r\n return tee\r\n ? module.createTeeLocal((target).index, valueWithCorrectType)\r\n : module.createSetLocal((target).index, valueWithCorrectType);\r\n }\r\n case ElementKind.GLOBAL: {\r\n if (!this.compileGlobal(target)) return module.createUnreachable();\r\n let type = (target).type;\r\n assert(type != Type.void);\r\n this.currentType = tee ? type : Type.void;\r\n if ((target).is(CommonFlags.CONST)) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range,\r\n target.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type); // guaranteed\r\n if (tee) {\r\n let nativeType = type.toNativeType();\r\n let internalName = target.internalName;\r\n return module.createBlock(null, [ // emulated teeGlobal\r\n module.createSetGlobal(internalName, valueWithCorrectType),\r\n module.createGetGlobal(internalName, nativeType)\r\n ], nativeType);\r\n } else {\r\n return module.createSetGlobal(target.internalName, valueWithCorrectType);\r\n }\r\n }\r\n case ElementKind.FIELD: {\r\n const declaration = (target).declaration;\r\n if (\r\n (target).is(CommonFlags.READONLY) &&\r\n !(\r\n flow.actualFunction.is(CommonFlags.CONSTRUCTOR) ||\r\n declaration == null ||\r\n declaration.initializer != null\r\n )\r\n ) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (target).internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n let type = (target).type;\r\n this.currentType = tee ? type : Type.void;\r\n let nativeType = type.toNativeType();\r\n if (type.kind == TypeKind.BOOL) {\r\n // make sure bools are wrapped (usually are) when storing as 8 bits\r\n valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type);\r\n }\r\n if (tee) {\r\n let flow = this.currentFlow;\r\n let tempLocal = flow.getAndFreeTempLocal(\r\n type,\r\n !flow.canOverflow(valueWithCorrectType, type)\r\n );\r\n let tempLocalIndex = tempLocal.index;\r\n // TODO: simplify if valueWithCorrectType has no side effects\r\n // TODO: call __gc_link here if a GC is present\r\n return module.createBlock(null, [\r\n module.createSetLocal(tempLocalIndex, valueWithCorrectType),\r\n module.createStore(\r\n type.byteSize,\r\n thisExpr,\r\n module.createGetLocal(tempLocalIndex, nativeType),\r\n nativeType,\r\n (target).memoryOffset\r\n ),\r\n module.createGetLocal(tempLocalIndex, nativeType)\r\n ], nativeType);\r\n } else {\r\n // TODO: call __gc_link here if a GC is present\r\n return module.createStore(\r\n type.byteSize,\r\n thisExpr,\r\n valueWithCorrectType,\r\n nativeType,\r\n (target).memoryOffset\r\n );\r\n }\r\n }\r\n case ElementKind.PROPERTY: {\r\n let setterPrototype = (target).setterPrototype;\r\n if (setterPrototype) {\r\n let setterInstance = this.resolver.resolveFunction(setterPrototype, null);\r\n if (!setterInstance) return module.createUnreachable();\r\n\r\n // call just the setter if the return value isn't of interest\r\n if (!tee) {\r\n if (setterInstance.is(CommonFlags.INSTANCE)) {\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n return this.makeCallDirect(setterInstance, [ thisExpr, valueWithCorrectType ]);\r\n } else {\r\n return this.makeCallDirect(setterInstance, [ valueWithCorrectType ]);\r\n }\r\n }\r\n\r\n // otherwise call the setter first, then the getter\r\n let getterPrototype = (target).getterPrototype;\r\n assert(getterPrototype != null); // must have one if there is a setter\r\n let getterInstance = this.resolver.resolveFunction(getterPrototype, null);\r\n if (!getterInstance) return module.createUnreachable();\r\n let returnType = getterInstance.signature.returnType;\r\n let nativeReturnType = returnType.toNativeType();\r\n if (setterInstance.is(CommonFlags.INSTANCE)) {\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n let tempLocal = flow.getAndFreeTempLocal(returnType, false);\r\n let tempLocalIndex = tempLocal.index;\r\n return module.createBlock(null, [\r\n this.makeCallDirect(setterInstance, [ // set and remember the target\r\n module.createTeeLocal(tempLocalIndex, thisExpr),\r\n valueWithCorrectType\r\n ]),\r\n this.makeCallDirect(getterInstance, [ // get from remembered target\r\n module.createGetLocal(tempLocalIndex, nativeReturnType)\r\n ])\r\n ], nativeReturnType);\r\n } else {\r\n // note that this must be performed here because `resolved` is shared\r\n return module.createBlock(null, [\r\n this.makeCallDirect(setterInstance, [ valueWithCorrectType ]),\r\n this.makeCallDirect(getterInstance)\r\n ], nativeReturnType);\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, target.internalName\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n case ElementKind.CLASS: {\r\n let elementExpression = this.resolver.currentElementExpression;\r\n if (elementExpression) {\r\n let isUnchecked = flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n if (!indexedGet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n expression.range, target.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n let indexedSet = (target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\r\n if (!indexedSet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n expression.range, target.internalName\r\n );\r\n this.currentType = tee ? indexedGet.signature.returnType : Type.void;\r\n return module.createUnreachable();\r\n }\r\n let targetType = (target).type;\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n let elementExpr = this.compileExpression(\r\n elementExpression,\r\n Type.i32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n if (tee) {\r\n let tempLocalTarget = flow.getTempLocal(targetType, false);\r\n let tempLocalElement = flow.getAndFreeTempLocal(this.currentType, false);\r\n let returnType = indexedGet.signature.returnType;\r\n flow.freeTempLocal(tempLocalTarget);\r\n return module.createBlock(null, [\r\n this.makeCallDirect(indexedSet, [\r\n module.createTeeLocal(tempLocalTarget.index, thisExpr),\r\n module.createTeeLocal(tempLocalElement.index, elementExpr),\r\n valueWithCorrectType\r\n ]),\r\n this.makeCallDirect(indexedGet, [\r\n module.createGetLocal(tempLocalTarget.index, tempLocalTarget.type.toNativeType()),\r\n module.createGetLocal(tempLocalElement.index, tempLocalElement.type.toNativeType())\r\n ])\r\n ], returnType.toNativeType());\r\n } else {\r\n return this.makeCallDirect(indexedSet, [\r\n thisExpr,\r\n elementExpr,\r\n valueWithCorrectType\r\n ]);\r\n }\r\n }\r\n // fall-through\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n compileCallExpression(expression: CallExpression, contextualType: Type): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n\r\n // handle call to super\r\n if (expression.expression.kind == NodeKind.SUPER) {\r\n let flow = this.currentFlow;\r\n let actualFunction = flow.actualFunction;\r\n if (!actualFunction.is(CommonFlags.CONSTRUCTOR)) {\r\n this.error(\r\n DiagnosticCode.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n let classInstance = assert(actualFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n let baseClassInstance = assert((classInstance).base);\r\n let thisLocal = assert(flow.lookupLocal(\"this\"));\r\n let nativeSizeType = this.options.nativeSizeType;\r\n\r\n // {\r\n // this = super(this || , ...args)\r\n // this.a = X\r\n // this.b = Y\r\n // }\r\n let stmts: ExpressionRef[] = [\r\n module.createSetLocal(thisLocal.index,\r\n this.compileCallDirect(\r\n this.ensureConstructor(baseClassInstance, expression),\r\n expression.arguments,\r\n expression,\r\n module.createIf(\r\n module.createGetLocal(thisLocal.index, nativeSizeType),\r\n module.createGetLocal(thisLocal.index, nativeSizeType),\r\n this.makeAllocation(classInstance)\r\n )\r\n )\r\n )\r\n ];\r\n this.makeFieldInitialization(classInstance, stmts);\r\n\r\n // check that super had been called before accessing allocating `this`\r\n if (flow.isAny(\r\n FlowFlags.ALLOCATES |\r\n FlowFlags.CONDITIONALLY_ALLOCATES\r\n )) {\r\n this.error(\r\n DiagnosticCode._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n flow.set(FlowFlags.ALLOCATES | FlowFlags.CALLS_SUPER);\r\n this.currentType = Type.void;\r\n return module.createBlock(null, stmts);\r\n }\r\n\r\n // otherwise resolve normally\r\n var target = this.resolver.resolveExpression(expression.expression, flow); // reports\r\n if (!target) return module.createUnreachable();\r\n\r\n var signature: Signature | null;\r\n var indexArg: ExpressionRef;\r\n switch (target.kind) {\r\n\r\n // direct call: concrete function\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n let prototype = target;\r\n let typeArguments = expression.typeArguments;\r\n\r\n // builtins handle present respectively omitted type arguments on their own\r\n if (prototype.hasDecorator(DecoratorFlags.BUILTIN)) {\r\n return this.compileCallExpressionBuiltin(prototype, expression, contextualType);\r\n }\r\n\r\n let instance: Function | null = null;\r\n\r\n // resolve generic call if type arguments have been provided\r\n if (typeArguments) {\r\n if (!prototype.is(CommonFlags.GENERIC)) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n expression.expression.range, prototype.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n instance = this.resolver.resolveFunctionInclTypeArguments(\r\n prototype,\r\n typeArguments,\r\n makeMap(flow.contextualTypeArguments),\r\n expression\r\n );\r\n\r\n // infer generic call if type arguments have been omitted\r\n } else if (prototype.is(CommonFlags.GENERIC)) {\r\n let inferredTypes = new Map();\r\n let typeParameters = assert(prototype.declaration.typeParameters);\r\n let numTypeParameters = typeParameters.length;\r\n for (let i = 0; i < numTypeParameters; ++i) {\r\n inferredTypes.set(typeParameters[i].name.text, null);\r\n }\r\n // let numInferred = 0;\r\n let parameterTypes = prototype.declaration.signature.parameters;\r\n let numParameterTypes = parameterTypes.length;\r\n let argumentExpressions = expression.arguments;\r\n let numArguments = argumentExpressions.length;\r\n let argumentExprs = new Array(numArguments);\r\n for (let i = 0; i < numParameterTypes; ++i) {\r\n let typeNode = parameterTypes[i].type;\r\n let name = typeNode.kind == NodeKind.TYPE ? (typeNode).name.text : null;\r\n let argumentExpression = i < numArguments\r\n ? argumentExpressions[i]\r\n : prototype.declaration.signature.parameters[i].initializer;\r\n if (!argumentExpression) { // missing initializer -> too few arguments\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n expression.range, numParameterTypes.toString(10), numArguments.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (name !== null && inferredTypes.has(name)) {\r\n let inferredType = inferredTypes.get(name);\r\n if (inferredType) {\r\n argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, inferredType, WrapMode.NONE);\r\n let commonType: Type | null;\r\n if (!(commonType = Type.commonCompatible(inferredType, this.currentType, true))) {\r\n if (!(commonType = Type.commonCompatible(inferredType, this.currentType, false))) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n parameterTypes[i].type.range, this.currentType.toString(), inferredType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n inferredType = commonType;\r\n } else {\r\n argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, Type.i32, WrapMode.NONE);\r\n inferredType = this.currentType;\r\n // ++numInferred;\r\n }\r\n inferredTypes.set(name, inferredType);\r\n } else {\r\n let concreteType = this.resolver.resolveType(\r\n parameterTypes[i].type,\r\n flow.contextualTypeArguments\r\n );\r\n if (!concreteType) return module.createUnreachable();\r\n argumentExprs[i] = this.compileExpression(\r\n argumentExpression,\r\n concreteType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n }\r\n let resolvedTypeArguments = new Array(numTypeParameters);\r\n for (let i = 0; i < numTypeParameters; ++i) {\r\n let inferredType = assert(inferredTypes.get(typeParameters[i].name.text)); // TODO\r\n resolvedTypeArguments[i] = inferredType;\r\n }\r\n instance = this.resolver.resolveFunction(\r\n prototype,\r\n resolvedTypeArguments,\r\n makeMap(flow.contextualTypeArguments)\r\n );\r\n if (!instance) return this.module.createUnreachable();\r\n return this.makeCallDirect(instance, argumentExprs);\r\n // TODO: this skips inlining because inlining requires compiling its temporary locals in\r\n // the scope of the inlined flow. might need another mechanism to lock temp. locals early,\r\n // so inlining can be performed in `makeCallDirect` instead?\r\n\r\n // otherwise resolve the non-generic call as usual\r\n } else {\r\n instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n if (!instance) return this.module.createUnreachable();\r\n\r\n // compile 'this' expression if an instance method\r\n let thisExpr: ExpressionRef = 0;\r\n if (instance.is(CommonFlags.INSTANCE)) {\r\n thisExpr = this.compileExpressionRetainType(\r\n assert(this.resolver.currentThisExpression),\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n }\r\n\r\n return this.compileCallDirect(\r\n instance,\r\n expression.arguments,\r\n expression,\r\n thisExpr\r\n );\r\n }\r\n\r\n // indirect call: index argument with signature (non-generic, can't be inlined)\r\n case ElementKind.LOCAL: {\r\n if (signature = (target).type.signatureReference) {\r\n if ((target).is(CommonFlags.INLINED)) {\r\n indexArg = module.createI32(i64_low((target).constantIntegerValue));\r\n } else {\r\n indexArg = module.createGetLocal((target).index, NativeType.I32);\r\n }\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, (target).type.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case ElementKind.GLOBAL: {\r\n if (signature = (target).type.signatureReference) {\r\n indexArg = module.createGetGlobal((target).internalName, (target).type.toNativeType());\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, (target).type.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case ElementKind.FIELD: {\r\n let type = (target).type;\r\n if (signature = type.signatureReference) {\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n indexArg = module.createLoad(\r\n 4,\r\n false,\r\n thisExpr,\r\n NativeType.I32,\r\n (target).memoryOffset\r\n );\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, type.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case ElementKind.FUNCTION_TARGET: {\r\n signature = (target).signature;\r\n indexArg = this.compileExpression(\r\n expression.expression,\r\n (target).type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n break;\r\n }\r\n\r\n case ElementKind.PROPERTY: {\r\n indexArg = this.compileGetter(target, expression.expression);\r\n let type = this.currentType;\r\n signature = type.signatureReference;\r\n if (!signature) {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, type.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n break;\r\n }\r\n\r\n // not supported\r\n default: {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n return this.compileCallIndirect(\r\n signature,\r\n indexArg,\r\n expression.arguments,\r\n expression\r\n );\r\n }\r\n\r\n private compileCallExpressionBuiltin(\r\n prototype: FunctionPrototype,\r\n expression: CallExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var typeArguments: Type[] | null = null;\r\n\r\n // builtins handle omitted type arguments on their own. if present, however, resolve them here\r\n // and pass them to the builtin, even if it's still up to the builtin how to handle them.\r\n var typeArgumentNodes = expression.typeArguments;\r\n if (expression.typeArguments) {\r\n if (!prototype.is(CommonFlags.GENERIC)) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n expression.range, prototype.internalName\r\n );\r\n }\r\n typeArguments = this.resolver.resolveTypeArguments(\r\n assert(prototype.declaration.typeParameters),\r\n typeArgumentNodes,\r\n makeMap(this.currentFlow.contextualTypeArguments),\r\n expression\r\n );\r\n }\r\n\r\n // now compile the builtin, which usually returns a block of code that replaces the call.\r\n var expr = compileBuiltinCall(\r\n this,\r\n prototype,\r\n typeArguments,\r\n expression.arguments,\r\n contextualType,\r\n expression\r\n );\r\n if (!expr) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n return expr;\r\n }\r\n\r\n /**\r\n * Checks that a call with the given number as arguments can be performed according to the\r\n * specified signature.\r\n */\r\n checkCallSignature(\r\n signature: Signature,\r\n numArguments: i32,\r\n hasThis: bool,\r\n reportNode: Node\r\n ): bool {\r\n\r\n // cannot call an instance method without a `this` argument (TODO: `.call`?)\r\n var thisType = signature.thisType;\r\n if (hasThis != (thisType != null)) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported, // TODO: better message?\r\n reportNode.range\r\n );\r\n return false;\r\n }\r\n\r\n // not yet implemented (TODO: maybe some sort of an unmanaged/lightweight array?)\r\n var hasRest = signature.hasRest;\r\n if (hasRest) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return false;\r\n }\r\n\r\n var minimum = signature.requiredParameters;\r\n var maximum = signature.parameterTypes.length;\r\n\r\n // must at least be called with required arguments\r\n if (numArguments < minimum) {\r\n this.error(\r\n minimum < maximum\r\n ? DiagnosticCode.Expected_at_least_0_arguments_but_got_1\r\n : DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, minimum.toString(), numArguments.toString()\r\n );\r\n return false;\r\n }\r\n\r\n // must not be called with more than the maximum arguments\r\n if (numArguments > maximum && !hasRest) {\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, maximum.toString(), numArguments.toString()\r\n );\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** Compiles a direct call to a concrete function. */\r\n compileCallDirect(\r\n instance: Function,\r\n argumentExpressions: Expression[],\r\n reportNode: Node,\r\n thisArg: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var numArguments = argumentExpressions.length;\r\n var signature = instance.signature;\r\n\r\n if (!this.checkCallSignature( // reports\r\n signature,\r\n numArguments,\r\n thisArg != 0,\r\n reportNode\r\n )) {\r\n return this.module.createUnreachable();\r\n }\r\n\r\n // Inline if explicitly requested\r\n if (instance.hasDecorator(DecoratorFlags.INLINE)) {\r\n assert(!instance.is(CommonFlags.TRAMPOLINE)); // doesn't make sense\r\n if (this.currentInlineFunctions.includes(instance)) {\r\n this.warning(\r\n DiagnosticCode.Function_0_cannot_be_inlined_into_itself,\r\n reportNode.range, instance.internalName\r\n );\r\n } else {\r\n this.currentInlineFunctions.push(instance);\r\n let expr = this.compileCallInlinePrechecked(instance, argumentExpressions, thisArg);\r\n this.currentInlineFunctions.pop();\r\n return expr;\r\n }\r\n }\r\n\r\n // Otherwise compile to just a call\r\n var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\r\n var operands = new Array(numArgumentsInclThis);\r\n var index = 0;\r\n if (thisArg) {\r\n operands[0] = thisArg;\r\n index = 1;\r\n }\r\n var parameterTypes = signature.parameterTypes;\r\n for (let i = 0; i < numArguments; ++i, ++index) {\r\n operands[index] = this.compileExpression(\r\n argumentExpressions[i],\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n assert(index == numArgumentsInclThis);\r\n return this.makeCallDirect(instance, operands);\r\n }\r\n\r\n // Depends on being pre-checked in compileCallDirect\r\n private compileCallInlinePrechecked(\r\n instance: Function,\r\n argumentExpressions: Expression[],\r\n thisArg: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var module = this.module;\r\n\r\n // Create a new inline flow and use it to compile the function as a block\r\n var previousFlow = this.currentFlow;\r\n var flow = Flow.createInline(previousFlow.parentFunction, instance);\r\n\r\n // Convert provided call arguments to temporary locals. It is important that these are compiled\r\n // here, with their respective locals being blocked. There is no 'makeCallInline'.\r\n var body = [];\r\n\r\n if (thisArg) {\r\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n let thisType = assert(instance.signature.thisType);\r\n let thisLocal = flow.addScopedLocal(\"this\", thisType, false);\r\n body.push(\r\n module.createSetLocal(thisLocal.index, thisArg)\r\n );\r\n let baseInstance = (classInstance).base;\r\n if (baseInstance) flow.addScopedAlias(\"super\", baseInstance.type, thisLocal.index);\r\n }\r\n\r\n var numArguments = argumentExpressions.length;\r\n var signature = instance.signature;\r\n var parameterTypes = signature.parameterTypes;\r\n for (let i = 0; i < numArguments; ++i) {\r\n let paramExpr = this.compileExpression(\r\n argumentExpressions[i],\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n let argumentLocal = flow.addScopedLocal(\r\n signature.getParameterName(i),\r\n parameterTypes[i],\r\n !previousFlow.canOverflow(paramExpr, parameterTypes[i])\r\n );\r\n body.push(\r\n module.createSetLocal(argumentLocal.index, paramExpr)\r\n );\r\n }\r\n\r\n // Compile optional parameter initializers in the scope of the inlined flow\r\n this.currentFlow = flow;\r\n var declaration = instance.prototype.declaration;\r\n var numParameters = signature.parameterTypes.length;\r\n for (let i = numArguments; i < numParameters; ++i) {\r\n let initExpr = this.compileExpression(\r\n assert(declaration.signature.parameters[i].initializer),\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP\r\n );\r\n let argumentLocal = flow.addScopedLocal(\r\n signature.getParameterName(i),\r\n parameterTypes[i],\r\n !flow.canOverflow(initExpr, parameterTypes[i])\r\n );\r\n body.push(\r\n module.createSetLocal(argumentLocal.index, initExpr)\r\n );\r\n }\r\n\r\n // Compile the called function's body in the scope of the inlined flow\r\n {\r\n let stmts = this.compileFunctionBody(instance);\r\n for (let i = 0, k = stmts.length; i < k; ++i) body.push(stmts[i]);\r\n }\r\n\r\n // Free any new scoped locals and reset to the original flow\r\n flow.freeScopedLocals();\r\n var returnType = flow.returnType;\r\n this.currentFlow = previousFlow;\r\n this.currentType = returnType;\r\n\r\n // Create an outer block that we can break to when returning a value out of order\r\n return module.createBlock(flow.inlineReturnLabel, body, returnType.toNativeType());\r\n }\r\n\r\n /** Gets the trampoline for the specified function. */\r\n ensureTrampoline(original: Function): Function {\r\n // A trampoline is a function that takes a fixed amount of operands with some of them possibly\r\n // being zeroed. It takes one additional argument denoting the number of actual operands\r\n // provided to the call, and takes appropriate steps to initialize zeroed operands to their\r\n // default values using the optional parameter initializers of the original function. Doing so\r\n // allows calls to functions with optional parameters to circumvent the trampoline when all\r\n // parameters are provided as a fast route, respectively setting up omitted operands in a proper\r\n // context otherwise.\r\n var trampoline = original.trampoline;\r\n if (trampoline) return trampoline;\r\n\r\n var originalSignature = original.signature;\r\n var originalName = original.internalName;\r\n var originalParameterTypes = originalSignature.parameterTypes;\r\n var originalParameterDeclarations = original.prototype.declaration.signature.parameters;\r\n var commonReturnType = originalSignature.returnType;\r\n var commonThisType = originalSignature.thisType;\r\n var isInstance = original.is(CommonFlags.INSTANCE);\r\n\r\n // arguments excl. `this`, operands incl. `this`\r\n var minArguments = originalSignature.requiredParameters;\r\n var minOperands = minArguments;\r\n var maxArguments = originalParameterTypes.length;\r\n var maxOperands = maxArguments;\r\n if (isInstance) {\r\n ++minOperands;\r\n ++maxOperands;\r\n }\r\n var numOptional = assert(maxOperands - minOperands);\r\n\r\n var forwardedOperands = new Array(minOperands);\r\n var operandIndex = 0;\r\n\r\n // forward `this` if applicable\r\n var module = this.module;\r\n if (isInstance) {\r\n forwardedOperands[0] = module.createGetLocal(0, this.options.nativeSizeType);\r\n operandIndex = 1;\r\n }\r\n\r\n // forward required arguments\r\n for (let i = 0; i < minArguments; ++i, ++operandIndex) {\r\n forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, originalParameterTypes[i].toNativeType());\r\n }\r\n assert(operandIndex == minOperands);\r\n\r\n // create the trampoline element\r\n var trampolineSignature = new Signature(originalParameterTypes, commonReturnType, commonThisType);\r\n var trampolineName = originalName + \"|trampoline\";\r\n trampolineSignature.requiredParameters = maxArguments;\r\n trampoline = new Function(\r\n original.prototype,\r\n trampolineName,\r\n trampolineSignature,\r\n original.parent,\r\n original.contextualTypeArguments\r\n );\r\n trampoline.set(original.flags | CommonFlags.TRAMPOLINE | CommonFlags.COMPILED);\r\n original.trampoline = trampoline;\r\n\r\n // compile initializers of omitted arguments in scope of the trampoline function\r\n // this is necessary because initializers might need additional locals and a proper this context\r\n var previousFlow = this.currentFlow;\r\n this.currentFlow = trampoline.flow;\r\n\r\n // create a br_table switching over the number of optional parameters provided\r\n var numNames = numOptional + 1; // incl. outer block\r\n var names = new Array(numNames);\r\n var ofN = \"of\" + numOptional.toString(10);\r\n for (let i = 0; i < numNames; ++i) {\r\n let label = i.toString(10) + ofN;\r\n names[i] = label;\r\n }\r\n var body = module.createBlock(names[0], [\r\n module.createBlock(\"outOfRange\", [\r\n module.createSwitch(names, \"outOfRange\",\r\n // condition is number of provided optional arguments, so subtract required arguments\r\n minArguments\r\n ? module.createBinary(\r\n BinaryOp.SubI32,\r\n module.createGetGlobal(\"~argc\", NativeType.I32),\r\n module.createI32(minArguments)\r\n )\r\n : module.createGetGlobal(\"~argc\", NativeType.I32)\r\n )\r\n ]),\r\n module.createUnreachable()\r\n ]);\r\n for (let i = 0; i < numOptional; ++i, ++operandIndex) {\r\n let type = originalParameterTypes[minArguments + i];\r\n let declaration = originalParameterDeclarations[minArguments + i];\r\n let initializer = declaration.initializer;\r\n let initExpr: ExpressionRef;\r\n if (initializer) {\r\n initExpr = module.createSetLocal(operandIndex,\r\n this.compileExpression(\r\n initializer,\r\n type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP\r\n )\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Optional_parameter_must_have_an_initializer,\r\n declaration.range\r\n );\r\n initExpr = module.createUnreachable();\r\n }\r\n body = module.createBlock(names[i + 1], [\r\n body,\r\n initExpr,\r\n ]);\r\n forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, type.toNativeType());\r\n }\r\n this.currentFlow = previousFlow;\r\n assert(operandIndex == maxOperands);\r\n\r\n var funcRef = module.addFunction(\r\n trampolineName,\r\n this.ensureFunctionType(\r\n trampolineSignature.parameterTypes,\r\n trampolineSignature.returnType,\r\n trampolineSignature.thisType\r\n ),\r\n typesToNativeTypes(trampoline.additionalLocals),\r\n module.createBlock(null, [\r\n body,\r\n module.createCall(\r\n originalName,\r\n forwardedOperands,\r\n commonReturnType.toNativeType()\r\n )\r\n ], commonReturnType.toNativeType())\r\n );\r\n trampoline.finalize(module, funcRef);\r\n return trampoline;\r\n }\r\n\r\n /** Makes sure that the argument count helper global is present and returns its name. */\r\n private ensureArgcVar(): string {\r\n var internalName = \"~argc\";\r\n if (!this.argcVar) {\r\n let module = this.module;\r\n this.argcVar = module.addGlobal(\r\n internalName,\r\n NativeType.I32,\r\n true,\r\n module.createI32(0)\r\n );\r\n }\r\n return internalName;\r\n }\r\n\r\n /** Makes sure that the argument count helper setter is present and returns its name. */\r\n private ensureArgcSet(): string {\r\n var internalName = \"~setargc\";\r\n if (!this.argcSet) {\r\n let module = this.module;\r\n this.argcSet = module.addFunction(internalName,\r\n this.ensureFunctionType([ Type.u32 ], Type.void),\r\n null,\r\n module.createSetGlobal(this.ensureArgcVar(),\r\n module.createGetLocal(0, NativeType.I32)\r\n )\r\n );\r\n module.addFunctionExport(internalName, \"_setargc\");\r\n }\r\n return internalName;\r\n }\r\n\r\n /** Creates a direct call to the specified function. */\r\n makeCallDirect(\r\n instance: Function,\r\n operands: ExpressionRef[] | null = null\r\n ): ExpressionRef {\r\n var numOperands = operands ? operands.length : 0;\r\n var numArguments = numOperands;\r\n var minArguments = instance.signature.requiredParameters;\r\n var minOperands = minArguments;\r\n var maxArguments = instance.signature.parameterTypes.length;\r\n var maxOperands = maxArguments;\r\n if (instance.is(CommonFlags.INSTANCE)) {\r\n ++minOperands;\r\n ++maxOperands;\r\n --numArguments;\r\n }\r\n assert(numOperands >= minOperands);\r\n\r\n var module = this.module;\r\n if (!this.compileFunction(instance)) return module.createUnreachable();\r\n var returnType = instance.signature.returnType;\r\n var isCallImport = instance.is(CommonFlags.MODULE_IMPORT);\r\n\r\n // fill up omitted arguments with their initializers, if constant, otherwise with zeroes.\r\n if (numOperands < maxOperands) {\r\n if (!operands) {\r\n operands = new Array(maxOperands);\r\n operands.length = 0;\r\n }\r\n let parameterTypes = instance.signature.parameterTypes;\r\n let parameterNodes = instance.prototype.declaration.signature.parameters;\r\n let allOptionalsAreConstant = true;\r\n for (let i = numArguments; i < maxArguments; ++i) {\r\n let initializer = parameterNodes[i].initializer;\r\n if (!(initializer !== null && nodeIsConstantValue(initializer.kind))) {\r\n allOptionalsAreConstant = false;\r\n break;\r\n }\r\n }\r\n if (allOptionalsAreConstant) { // inline into the call\r\n for (let i = numArguments; i < maxArguments; ++i) {\r\n operands.push(\r\n this.compileExpression(\r\n parameterNodes[i].initializer,\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n )\r\n );\r\n }\r\n } else { // otherwise fill up with zeroes and call the trampoline\r\n for (let i = numArguments; i < maxArguments; ++i) {\r\n operands.push(parameterTypes[i].toNativeZero(module));\r\n }\r\n if (!isCallImport) {\r\n let original = instance;\r\n instance = this.ensureTrampoline(instance);\r\n if (!this.compileFunction(instance)) return module.createUnreachable();\r\n instance.flow.flags = original.flow.flags;\r\n this.program.instancesLookup.set(instance.internalName, instance); // so canOverflow can find it\r\n let nativeReturnType = returnType.toNativeType();\r\n this.currentType = returnType;\r\n return module.createBlock(null, [\r\n module.createSetGlobal(this.ensureArgcVar(), module.createI32(numArguments)),\r\n module.createCall(instance.internalName, operands, nativeReturnType)\r\n ], nativeReturnType);\r\n }\r\n }\r\n }\r\n\r\n // otherwise just call through\r\n this.currentType = returnType;\r\n return module.createCall(instance.internalName, operands, returnType.toNativeType());\r\n }\r\n\r\n /** Compiles an indirect call using an index argument and a signature. */\r\n compileCallIndirect(\r\n signature: Signature,\r\n indexArg: ExpressionRef,\r\n argumentExpressions: Expression[],\r\n reportNode: Node,\r\n thisArg: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var numArguments = argumentExpressions.length;\r\n\r\n if (!this.checkCallSignature( // reports\r\n signature,\r\n numArguments,\r\n thisArg != 0,\r\n reportNode\r\n )) {\r\n return this.module.createUnreachable();\r\n }\r\n\r\n var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\r\n var operands = new Array(numArgumentsInclThis);\r\n var index = 0;\r\n if (thisArg) {\r\n operands[0] = thisArg;\r\n index = 1;\r\n }\r\n var parameterTypes = signature.parameterTypes;\r\n for (let i = 0; i < numArguments; ++i, ++index) {\r\n operands[index] = this.compileExpression(\r\n argumentExpressions[i],\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n assert(index == numArgumentsInclThis);\r\n return this.makeCallIndirect(signature, indexArg, operands);\r\n }\r\n\r\n /** Creates an indirect call to the function at `indexArg` in the function table. */\r\n makeCallIndirect(\r\n signature: Signature,\r\n indexArg: ExpressionRef,\r\n operands: ExpressionRef[] | null = null\r\n ): ExpressionRef {\r\n var numOperands = operands ? operands.length : 0;\r\n var numArguments = numOperands;\r\n var minArguments = signature.requiredParameters;\r\n var minOperands = minArguments;\r\n var maxArguments = signature.parameterTypes.length;\r\n var maxOperands = maxArguments;\r\n if (signature.thisType) {\r\n ++minOperands;\r\n ++maxOperands;\r\n --numArguments;\r\n }\r\n assert(numOperands >= minOperands);\r\n\r\n this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\r\n var module = this.module;\r\n\r\n // fill up omitted arguments with zeroes\r\n if (numOperands < maxOperands) {\r\n if (!operands) {\r\n operands = new Array(maxOperands);\r\n operands.length = 0;\r\n }\r\n let parameterTypes = signature.parameterTypes;\r\n for (let i = numArguments; i < maxArguments; ++i) {\r\n operands.push(parameterTypes[i].toNativeZero(module));\r\n }\r\n }\r\n\r\n var returnType = signature.returnType;\r\n this.currentType = returnType;\r\n return module.createBlock(null, [\r\n module.createSetGlobal(this.ensureArgcVar(), // might still be calling a trampoline\r\n module.createI32(numArguments)\r\n ),\r\n module.createCallIndirect(indexArg, operands, signature.toSignatureString())\r\n ], returnType.toNativeType()); // not necessarily wrapped\r\n }\r\n\r\n compileCommaExpression(expression: CommaExpression, contextualType: Type): ExpressionRef {\r\n var expressions = expression.expressions;\r\n var numExpressions = expressions.length;\r\n var exprs = new Array(numExpressions--);\r\n for (let i = 0; i < numExpressions; ++i) {\r\n exprs[i] = this.compileExpression(\r\n expressions[i],\r\n Type.void, // drop all\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n exprs[numExpressions] = this.compileExpression(\r\n expressions[numExpressions],\r\n contextualType, // except last\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n return this.module.createBlock(null, exprs, this.currentType.toNativeType());\r\n }\r\n\r\n compileElementAccessExpression(expression: ElementAccessExpression, contextualType: Type): ExpressionRef {\r\n var target = this.resolver.resolveElementAccess(\r\n expression,\r\n this.currentFlow,\r\n contextualType\r\n ); // reports\r\n if (!target) return this.module.createUnreachable();\r\n switch (target.kind) {\r\n case ElementKind.CLASS: {\r\n let isUnchecked = this.currentFlow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n if (!indexedGet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n expression.expression.range, (target).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n let thisArg = this.compileExpression(\r\n expression.expression,\r\n (target).type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n return this.compileCallDirect(indexedGet, [\r\n expression.elementExpression\r\n ], expression, thisArg);\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileFunctionExpression(expression: FunctionExpression, contextualType: Type): ExpressionRef {\r\n var declaration = expression.declaration;\r\n var name = declaration.name;\r\n var simpleName = (name.text.length\r\n ? name.text\r\n : \"anonymous\") + \"|\" + this.functionTable.length.toString(10);\r\n var flow = this.currentFlow;\r\n var prototype = new FunctionPrototype(\r\n this.program,\r\n simpleName,\r\n flow.actualFunction.internalName + INNER_DELIMITER + simpleName,\r\n declaration,\r\n null,\r\n DecoratorFlags.NONE\r\n );\r\n var instance = this.compileFunctionUsingTypeArguments(\r\n prototype,\r\n [],\r\n makeMap(flow.contextualTypeArguments),\r\n flow,\r\n declaration\r\n );\r\n if (!instance) return this.module.createUnreachable();\r\n this.currentType = instance.signature.type; // TODO: get cached type?\r\n // NOTE that, in order to make this work in every case, the function must be represented by a\r\n // value, so we add it and rely on the optimizer to figure out where it can be called directly.\r\n var index = this.ensureFunctionTableEntry(instance); // reports\r\n return index < 0\r\n ? this.module.createUnreachable()\r\n : this.module.createI32(index);\r\n }\r\n\r\n /**\r\n * Compiles an identifier in the specified context.\r\n * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\r\n * precomputes them according to context.\r\n */\r\n compileIdentifierExpression(\r\n expression: IdentifierExpression,\r\n contextualType: Type,\r\n retainConstantType: bool\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n var actualFunction = flow.actualFunction;\r\n\r\n // check special keywords first\r\n switch (expression.kind) {\r\n case NodeKind.NULL: {\r\n let options = this.options;\r\n if (!contextualType.classReference) {\r\n this.currentType = options.usizeType;\r\n }\r\n return options.isWasm64\r\n ? module.createI64(0)\r\n : module.createI32(0);\r\n }\r\n case NodeKind.TRUE: {\r\n this.currentType = Type.bool;\r\n return module.createI32(1);\r\n }\r\n case NodeKind.FALSE: {\r\n this.currentType = Type.bool;\r\n return module.createI32(0);\r\n }\r\n case NodeKind.THIS: {\r\n if (actualFunction.is(CommonFlags.INSTANCE)) {\r\n let thisLocal = assert(flow.lookupLocal(\"this\"));\r\n let classInstance = assert(actualFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n let nativeSizeType = this.options.nativeSizeType;\r\n if (actualFunction.is(CommonFlags.CONSTRUCTOR)) {\r\n if (!flow.is(FlowFlags.ALLOCATES)) {\r\n flow.set(FlowFlags.ALLOCATES);\r\n // {\r\n // if (!this) this = \r\n // this.a = X\r\n // this.b = Y\r\n // return this\r\n // }\r\n let stmts: ExpressionRef[] = [\r\n module.createIf(\r\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\r\n module.createGetLocal(thisLocal.index, nativeSizeType)\r\n ),\r\n module.createSetLocal(thisLocal.index,\r\n this.makeAllocation(classInstance)\r\n )\r\n )\r\n ];\r\n this.makeFieldInitialization(classInstance, stmts);\r\n stmts.push(\r\n module.createGetLocal(thisLocal.index, nativeSizeType)\r\n );\r\n this.currentType = thisLocal.type;\r\n return module.createBlock(null, stmts, nativeSizeType);\r\n }\r\n }\r\n // if not a constructor, `this` type can differ\r\n let thisType = assert(actualFunction.signature.thisType);\r\n this.currentType = thisType;\r\n return module.createGetLocal(thisLocal.index, thisType.toNativeType());\r\n }\r\n this.error(\r\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n expression.range\r\n );\r\n this.currentType = this.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n case NodeKind.SUPER: {\r\n let flow = this.currentFlow;\r\n let actualFunction = flow.actualFunction;\r\n if (actualFunction.is(CommonFlags.CONSTRUCTOR)) {\r\n if (!flow.is(FlowFlags.CALLS_SUPER)) {\r\n // TS1034 in the parser effectively limits this to property accesses\r\n this.error(\r\n DiagnosticCode._super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class,\r\n expression.range\r\n );\r\n }\r\n }\r\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n let scopedThis = flow.lookupLocal(\"this\");\r\n if (scopedThis) {\r\n let scopedThisClass = assert(scopedThis.type.classReference);\r\n let base = scopedThisClass.base;\r\n if (base) {\r\n this.currentType = base.type;\r\n return module.createGetLocal(scopedThis.index, base.type.toNativeType());\r\n }\r\n }\r\n }\r\n if (actualFunction.is(CommonFlags.INSTANCE)) {\r\n let classInstance = assert(actualFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n let baseClassInstance = (classInstance).base;\r\n if (baseClassInstance) {\r\n let superType = baseClassInstance.type;\r\n this.currentType = superType;\r\n return module.createGetLocal(0, superType.toNativeType());\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n expression.range\r\n );\r\n this.currentType = this.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n\r\n // otherwise resolve\r\n var target = this.resolver.resolveIdentifier( // reports\r\n expression,\r\n flow,\r\n this.currentEnum || actualFunction\r\n );\r\n if (!target) return module.createUnreachable();\r\n\r\n switch (target.kind) {\r\n case ElementKind.LOCAL: {\r\n let localType = (target).type;\r\n assert(localType != Type.void);\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return this.compileInlineConstant(target, contextualType, retainConstantType);\r\n }\r\n let localIndex = (target).index;\r\n assert(localIndex >= 0);\r\n this.currentType = localType;\r\n return this.module.createGetLocal(localIndex, localType.toNativeType());\r\n }\r\n case ElementKind.GLOBAL: {\r\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field\r\n return this.module.createUnreachable();\r\n }\r\n let globalType = (target).type;\r\n assert(globalType != Type.void);\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return this.compileInlineConstant(target, contextualType, retainConstantType);\r\n }\r\n this.currentType = globalType;\r\n return this.module.createGetGlobal((target).internalName, globalType.toNativeType());\r\n }\r\n case ElementKind.ENUMVALUE: { // here: if referenced from within the same enum\r\n if (!target.is(CommonFlags.COMPILED)) {\r\n this.error(\r\n DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,\r\n expression.range\r\n );\r\n this.currentType = Type.i32;\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = Type.i32;\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return this.module.createI32((target).constantValue);\r\n }\r\n return this.module.createGetGlobal((target).internalName, NativeType.I32);\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n let instance = this.resolver.resolveFunction(\r\n target,\r\n null,\r\n makeMap(flow.contextualTypeArguments)\r\n );\r\n if (!(instance && this.compileFunction(instance))) return module.createUnreachable();\r\n let index = this.ensureFunctionTableEntry(instance);\r\n this.currentType = instance.signature.type;\r\n return this.module.createI32(index);\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileInstanceOfExpression(\r\n expression: InstanceOfExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var module = this.module;\r\n // NOTE that this differs from TypeScript in that the rhs is a type, not an expression. at the\r\n // time of implementation, this seemed more useful because dynamic rhs expressions are not\r\n // possible in AS anyway.\r\n var expr = this.compileExpressionRetainType(expression.expression, this.options.usizeType, WrapMode.NONE);\r\n var type = this.currentType;\r\n var isType = this.resolver.resolveType(expression.isType);\r\n this.currentType = Type.bool;\r\n if (!isType) return module.createUnreachable();\r\n return type.is(TypeFlags.NULLABLE) && !isType.is(TypeFlags.NULLABLE)\r\n ? type.nonNullableType.isAssignableTo(isType)\r\n ? module.createBinary( // not precomputeable\r\n type.is(TypeFlags.LONG)\r\n ? BinaryOp.NeI64\r\n : BinaryOp.NeI32,\r\n expr,\r\n type.toNativeZero(module)\r\n )\r\n : module.createI32(0)\r\n : module.createI32(type.isAssignableTo(isType, true) ? 1 : 0);\r\n }\r\n\r\n compileLiteralExpression(\r\n expression: LiteralExpression,\r\n contextualType: Type,\r\n implicitNegate: bool = false\r\n ): ExpressionRef {\r\n var module = this.module;\r\n\r\n switch (expression.literalKind) {\r\n case LiteralKind.ARRAY: {\r\n assert(!implicitNegate);\r\n let classType = contextualType.classReference;\r\n if (\r\n classType &&\r\n classType.prototype == this.program.arrayPrototype\r\n ) {\r\n return this.compileArrayLiteral(\r\n assert(classType.typeArguments)[0],\r\n (expression).elementExpressions,\r\n false, // TODO: isConst?\r\n expression\r\n );\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n case LiteralKind.FLOAT: {\r\n let floatValue = (expression).value;\r\n if (implicitNegate) {\r\n floatValue = -floatValue;\r\n }\r\n if (contextualType == Type.f32) {\r\n return module.createF32(floatValue);\r\n }\r\n this.currentType = Type.f64;\r\n return module.createF64(floatValue);\r\n }\r\n case LiteralKind.INTEGER: {\r\n let intValue = (expression).value;\r\n if (implicitNegate) {\r\n intValue = i64_sub(\r\n i64_new(0),\r\n intValue\r\n );\r\n }\r\n let type = this.resolver.determineIntegerLiteralType(intValue, contextualType);\r\n this.currentType = type;\r\n switch (type.kind) {\r\n case TypeKind.ISIZE: if (!this.options.isWasm64) return module.createI32(i64_low(intValue));\r\n case TypeKind.I64: return module.createI64(i64_low(intValue), i64_high(intValue));\r\n case TypeKind.USIZE: if (!this.options.isWasm64) return module.createI32(i64_low(intValue));\r\n case TypeKind.U64: return module.createI64(i64_low(intValue), i64_high(intValue));\r\n case TypeKind.F32: return module.createF32(i64_to_f32(intValue));\r\n case TypeKind.F64: return module.createF64(i64_to_f64(intValue));\r\n default: return module.createI32(i64_low(intValue));\r\n }\r\n }\r\n case LiteralKind.STRING: {\r\n assert(!implicitNegate);\r\n return this.compileStringLiteral(expression);\r\n }\r\n case LiteralKind.OBJECT: {\r\n assert(!implicitNegate);\r\n return this.compileObjectLiteral(expression, contextualType);\r\n }\r\n // case LiteralKind.REGEXP:\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n\r\n /** Ensures that the specified string exists in static memory and returns a pointer to it. */\r\n ensureStaticString(stringValue: string): ExpressionRef {\r\n var program = this.program;\r\n var hasGC = program.hasGC;\r\n var gcHeaderSize = program.gcHeaderSize;\r\n\r\n var stringInstance = assert(program.stringInstance);\r\n var stringSegment: MemorySegment;\r\n\r\n // if the string already exists, reuse it\r\n var segments = this.stringSegments;\r\n if (segments.has(stringValue)) {\r\n stringSegment = segments.get(stringValue);\r\n\r\n // otherwise create it\r\n } else {\r\n let length = stringValue.length;\r\n let headerSize = (stringInstance.currentMemoryOffset + 1) & ~1;\r\n let totalSize = headerSize + length * 2;\r\n\r\n let buf: Uint8Array;\r\n let pos: u32;\r\n\r\n if (hasGC) {\r\n buf = new Uint8Array(gcHeaderSize + totalSize);\r\n pos = gcHeaderSize;\r\n writeI32(ensureGCHook(this, stringInstance), buf, program.gcHookOffset);\r\n } else {\r\n buf = new Uint8Array(totalSize);\r\n pos = 0;\r\n }\r\n writeI32(length, buf, pos + stringInstance.offsetof(\"length\"));\r\n pos += headerSize;\r\n for (let i = 0; i < length; ++i) {\r\n writeI16(stringValue.charCodeAt(i), buf, pos + (i << 1));\r\n }\r\n stringSegment = this.addMemorySegment(buf);\r\n segments.set(stringValue, stringSegment);\r\n }\r\n var stringOffset = stringSegment.offset;\r\n if (hasGC) stringOffset = i64_add(stringOffset, i64_new(gcHeaderSize));\r\n\r\n this.currentType = stringInstance.type;\r\n if (this.options.isWasm64) {\r\n return this.module.createI64(i64_low(stringOffset), i64_high(stringOffset));\r\n } else {\r\n assert(i64_is_u32(stringOffset));\r\n return this.module.createI32(i64_low(stringOffset));\r\n }\r\n }\r\n\r\n compileStringLiteral(expression: StringLiteralExpression): ExpressionRef {\r\n return this.ensureStaticString(expression.value);\r\n }\r\n\r\n /** Ensures that the specified array exists in static memory and returns a pointer to it. */\r\n ensureStaticArray(elementType: Type, values: ExpressionRef[]): ExpressionRef {\r\n var program = this.program;\r\n var hasGC = program.hasGC;\r\n var gcHeaderSize = program.gcHeaderSize;\r\n\r\n var length = values.length;\r\n var byteSize = elementType.byteSize;\r\n var byteLength = length * byteSize;\r\n var usizeTypeSize = this.options.usizeType.byteSize;\r\n\r\n var buf: Uint8Array;\r\n var pos: u32;\r\n\r\n // create the backing ArrayBuffer segment\r\n var bufferInstance = assert(program.arrayBufferInstance);\r\n var bufferHeaderSize = (bufferInstance.currentMemoryOffset + 7) & ~7;\r\n var bufferTotalSize = 1 << (32 - clz(bufferHeaderSize + byteLength - 1));\r\n if (hasGC) {\r\n buf = new Uint8Array(gcHeaderSize + bufferTotalSize);\r\n pos = gcHeaderSize;\r\n writeI32(ensureGCHook(this, bufferInstance), buf, program.gcHookOffset);\r\n } else {\r\n buf = new Uint8Array(bufferTotalSize);\r\n pos = 0;\r\n }\r\n writeI32(byteLength, buf, pos + bufferInstance.offsetof(\"byteLength\"));\r\n pos += bufferHeaderSize;\r\n var nativeType = elementType.toNativeType();\r\n switch (nativeType) {\r\n case NativeType.I32: {\r\n switch (byteSize) {\r\n case 1: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeI8(getConstValueI32(value), buf, pos);\r\n pos += 1;\r\n }\r\n break;\r\n }\r\n case 2: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeI16(getConstValueI32(value), buf, pos);\r\n pos += 2;\r\n }\r\n break;\r\n }\r\n case 4: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeI32(getConstValueI32(value), buf, pos);\r\n pos += 4;\r\n }\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n break;\r\n }\r\n case NativeType.I64: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeI64(i64_new(getConstValueI64Low(value), getConstValueI64High(value)), buf, pos);\r\n pos += 8;\r\n }\r\n break;\r\n }\r\n case NativeType.F32: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeF32(getConstValueF32(value), buf, pos);\r\n pos += 4;\r\n }\r\n break;\r\n }\r\n case NativeType.F64: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeF64(getConstValueF64(value), buf, pos);\r\n pos += 8;\r\n }\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n var bufferSegment = this.addMemorySegment(buf);\r\n var bufferOffset = bufferSegment.offset;\r\n if (hasGC) bufferOffset = i64_add(bufferOffset, i64_new(gcHeaderSize));\r\n\r\n // create the Array segment and return a pointer to it\r\n var arrayPrototype = assert(program.arrayPrototype);\r\n var arrayInstance = assert(this.resolver.resolveClass(\r\n arrayPrototype,\r\n [ elementType ],\r\n makeMap()\r\n ));\r\n var arrayHeaderSize = (arrayInstance.currentMemoryOffset + 7) & ~7;\r\n if (hasGC) {\r\n buf = new Uint8Array(gcHeaderSize + arrayHeaderSize);\r\n pos = gcHeaderSize;\r\n writeI32(ensureGCHook(this, arrayInstance), buf, program.gcHookOffset);\r\n } else {\r\n buf = new Uint8Array(arrayHeaderSize);\r\n pos = 0;\r\n }\r\n var arraySegment = this.addMemorySegment(buf);\r\n var arrayOffset = arraySegment.offset;\r\n if (hasGC) arrayOffset = i64_add(arrayOffset, i64_new(gcHeaderSize));\r\n this.currentType = arrayInstance.type;\r\n if (usizeTypeSize == 8) {\r\n writeI64(bufferOffset, buf, pos + arrayInstance.offsetof(\"buffer_\"));\r\n writeI32(length, buf, pos + arrayInstance.offsetof(\"length_\"));\r\n return this.module.createI64(i64_low(arrayOffset), i64_high(arrayOffset));\r\n } else {\r\n assert(i64_is_u32(bufferOffset));\r\n writeI32(i64_low(bufferOffset), buf, pos + arrayInstance.offsetof(\"buffer_\"));\r\n writeI32(length, buf, pos + arrayInstance.offsetof(\"length_\"));\r\n assert(i64_is_u32(arrayOffset));\r\n return this.module.createI32(i64_low(arrayOffset));\r\n }\r\n }\r\n\r\n compileArrayLiteral(\r\n elementType: Type,\r\n expressions: (Expression | null)[],\r\n isConst: bool,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n var module = this.module;\r\n\r\n // find out whether all elements are constant (array is static)\r\n var length = expressions.length;\r\n var compiledValues = new Array(length);\r\n var constantValues = new Array(length);\r\n var nativeElementType = elementType.toNativeType();\r\n var isStatic = true;\r\n for (let i = 0; i < length; ++i) {\r\n let expr = expressions[i]\r\n ? this.compileExpression(expressions[i], elementType, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n : elementType.toNativeZero(module);\r\n compiledValues[i] = expr;\r\n if (isStatic) {\r\n expr = module.precomputeExpression(compiledValues[i]);\r\n if (getExpressionId(expr) == ExpressionId.Const) {\r\n assert(getExpressionType(expr) == nativeElementType);\r\n constantValues[i] = expr;\r\n } else {\r\n if (isConst) {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n reportNode.range\r\n );\r\n }\r\n isStatic = false;\r\n }\r\n }\r\n }\r\n\r\n // make a static array if possible\r\n if (isStatic) return this.ensureStaticArray(elementType, constantValues);\r\n\r\n // otherwise obtain the array type\r\n var arrayPrototype = assert(this.program.arrayPrototype);\r\n var arrayInstance = assert(this.resolver.resolveClass(\r\n arrayPrototype,\r\n [ elementType ],\r\n makeMap()\r\n ));\r\n var arrayType = arrayInstance.type;\r\n\r\n // and compile an explicit instantiation\r\n this.currentType = arrayType;\r\n var setter = arrayInstance.lookupOverload(OperatorKind.INDEXED_SET, true);\r\n if (!setter) {\r\n this.error(\r\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n reportNode.range, arrayInstance.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n var nativeArrayType = arrayType.toNativeType();\r\n var flow = this.currentFlow;\r\n var tempLocal = flow.parentFunction.addLocal(arrayType); // can't reuse a temp (used in compiledValues)\r\n var stmts = new Array(2 + length);\r\n var index = 0;\r\n stmts[index++] = module.createSetLocal(tempLocal.index,\r\n this.makeCallDirect(assert(arrayInstance.constructorInstance), [\r\n module.createI32(0), // this\r\n module.createI32(length)\r\n ])\r\n );\r\n for (let i = 0; i < length; ++i) {\r\n stmts[index++] = this.makeCallDirect(setter, [\r\n module.createGetLocal(tempLocal.index, nativeArrayType), // this\r\n module.createI32(i),\r\n compiledValues[i]\r\n ]);\r\n }\r\n assert(index + 1 == stmts.length);\r\n stmts[index] = module.createGetLocal(tempLocal.index, nativeArrayType);\r\n flow.freeTempLocal(tempLocal); // but can be reused now\r\n this.currentType = arrayType;\r\n return module.createBlock(null, stmts, nativeArrayType);\r\n }\r\n\r\n compileObjectLiteral(expression: ObjectLiteralExpression, contextualType: Type): ExpressionRef {\r\n var module = this.module;\r\n\r\n // contextual type must be a class\r\n var classReference = contextualType.classReference;\r\n if (!classReference || classReference.is(CommonFlags.ABSTRACT)) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n expression.range, \"\", contextualType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n // if present, check that the constructor is compatible with object literals\r\n var ctor = classReference.constructorInstance;\r\n if (ctor) {\r\n // TODO: if the constructor requires parameters, check whether these are given as part of the\r\n // object literal and use them to call the ctor while not generating a store.\r\n if (ctor.signature.requiredParameters) {\r\n this.error(\r\n DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,\r\n expression.range, classReference.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (ctor.is(CommonFlags.PRIVATE)) {\r\n this.error(\r\n DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,\r\n expression.range, classReference.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (ctor.is(CommonFlags.PROTECTED)) {\r\n this.error(\r\n DiagnosticCode.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration,\r\n expression.range, classReference.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n\r\n // check and compile field values\r\n var names = expression.names;\r\n var numNames = names.length;\r\n var values = expression.values;\r\n var members = classReference.members;\r\n var hasErrors = false;\r\n var exprs = new Array(numNames + 2);\r\n var flow = this.currentFlow;\r\n var tempLocal = flow.getTempLocal(this.options.usizeType);\r\n assert(numNames == values.length);\r\n for (let i = 0, k = numNames; i < k; ++i) {\r\n let member = members ? members.get(names[i].text) : null;\r\n if (!member || member.kind != ElementKind.FIELD) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n names[i].range, names[i].text, classReference.toString()\r\n );\r\n hasErrors = true;\r\n continue;\r\n }\r\n let type = (member).type;\r\n exprs[i + 1] = this.module.createStore( // TODO: handle setters as well\r\n type.byteSize,\r\n this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType),\r\n this.compileExpression(values[i], (member).type, ConversionKind.IMPLICIT, WrapMode.NONE),\r\n type.toNativeType(),\r\n (member).memoryOffset\r\n );\r\n }\r\n this.currentType = classReference.type.nonNullableType;\r\n if (hasErrors) return module.createUnreachable();\r\n\r\n // allocate a new instance first and assign 'this' to the temp. local\r\n exprs[0] = module.createSetLocal(\r\n tempLocal.index,\r\n this.makeAllocation(classReference)\r\n );\r\n\r\n // once all field values have been set, return 'this'\r\n exprs[exprs.length - 1] = module.createGetLocal(tempLocal.index, this.options.nativeSizeType);\r\n\r\n return module.createBlock(null, exprs, this.options.nativeSizeType);\r\n }\r\n\r\n compileNewExpression(expression: NewExpression, contextualType: Type): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n\r\n // obtain the class being instantiated\r\n var target = this.resolver.resolveExpression( // reports\r\n expression.expression,\r\n flow\r\n );\r\n if (!target) return module.createUnreachable();\r\n if (target.kind != ElementKind.CLASS_PROTOTYPE) {\r\n this.error(\r\n DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature,\r\n expression.expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n var classPrototype = target;\r\n var classInstance: Class | null = null;\r\n var typeArguments = expression.typeArguments;\r\n var classReference: Class | null;\r\n if (\r\n !typeArguments &&\r\n (classReference = contextualType.classReference) !== null &&\r\n classReference.is(CommonFlags.GENERIC)\r\n ) {\r\n classInstance = this.resolver.resolveClass(\r\n classPrototype,\r\n classReference.typeArguments,\r\n makeMap(flow.contextualTypeArguments)\r\n );\r\n } else {\r\n classInstance = this.resolver.resolveClassInclTypeArguments(\r\n classPrototype,\r\n typeArguments,\r\n makeMap(flow.contextualTypeArguments),\r\n expression\r\n );\r\n }\r\n if (!classInstance) return module.createUnreachable();\r\n return this.compileInstantiate(classInstance, expression.arguments, expression);\r\n }\r\n\r\n /** Gets the compiled constructor of the specified class or generates one if none is present. */\r\n ensureConstructor(classInstance: Class, reportNode: Node): Function {\r\n var ctorInstance = classInstance.constructorInstance;\r\n if (ctorInstance) {\r\n // do not attempt to compile it if inlined anyway\r\n if (!ctorInstance.hasDecorator(DecoratorFlags.INLINE)) this.compileFunction(ctorInstance);\r\n return ctorInstance;\r\n }\r\n\r\n // use the signature of the parent constructor if a derived class\r\n var baseClass = classInstance.base;\r\n var signature = baseClass\r\n ? this.ensureConstructor(baseClass, reportNode).signature\r\n : new Signature(null, classInstance.type, classInstance.type);\r\n\r\n var internalName = classInstance.internalName + INSTANCE_DELIMITER + \"constructor\";\r\n\r\n var nativeDummy = assert(this.program.elementsLookup.get(\"NATIVE_CODE\"));\r\n assert(nativeDummy.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n\r\n ctorInstance = new Function(\r\n nativeDummy,\r\n internalName,\r\n signature,\r\n classInstance,\r\n null\r\n );\r\n ctorInstance.set(CommonFlags.INSTANCE | CommonFlags.CONSTRUCTOR | CommonFlags.COMPILED);\r\n classInstance.constructorInstance = ctorInstance;\r\n var previousFlow = this.currentFlow;\r\n this.currentFlow = ctorInstance.flow;\r\n\r\n // generate body\r\n var module = this.module;\r\n var nativeSizeType = this.options.nativeSizeType;\r\n var stmts = new Array();\r\n\r\n // {\r\n // if (!this) this = \r\n // IF_DERIVED: this = super(this, ...args)\r\n // this.a = X\r\n // this.b = Y\r\n // return this\r\n // }\r\n stmts.push(\r\n module.createIf(\r\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\r\n module.createGetLocal(0, nativeSizeType)\r\n ),\r\n module.createSetLocal(0,\r\n this.makeAllocation(classInstance)\r\n )\r\n )\r\n );\r\n if (baseClass) {\r\n let parameterTypes = signature.parameterTypes;\r\n let numParameters = parameterTypes.length;\r\n let operands = new Array(1 + numParameters);\r\n operands[0] = module.createGetLocal(0, nativeSizeType);\r\n for (let i = 0; i < numParameters; ++i) {\r\n operands[i + 1] = module.createGetLocal(i + 1, parameterTypes[i].toNativeType());\r\n }\r\n // TODO: base constructor might be inlined, but makeCallDirect can't do this\r\n stmts.push(\r\n module.createSetLocal(0,\r\n this.makeCallDirect(assert(baseClass.constructorInstance), operands)\r\n )\r\n );\r\n }\r\n this.makeFieldInitialization(classInstance, stmts);\r\n stmts.push(\r\n module.createGetLocal(0, nativeSizeType)\r\n );\r\n\r\n // make the function\r\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\r\n var locals = ctorInstance.localsByIndex;\r\n var varTypes = new Array(); // of temp. vars added while compiling initializers\r\n var numOperands = 1 + signature.parameterTypes.length;\r\n var numLocals = locals.length;\r\n if (numLocals > numOperands) {\r\n for (let i = numOperands; i < numLocals; ++i) varTypes.push(locals[i].type.toNativeType());\r\n }\r\n var funcRef = module.addFunction(ctorInstance.internalName, typeRef, varTypes,\r\n stmts.length == 1\r\n ? stmts[0]\r\n : module.createBlock(null, stmts, nativeSizeType)\r\n );\r\n ctorInstance.finalize(module, funcRef);\r\n this.currentFlow = previousFlow;\r\n return ctorInstance;\r\n }\r\n\r\n compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\r\n var ctor = this.ensureConstructor(classInstance, reportNode);\r\n var expr = this.compileCallDirect(\r\n ctor,\r\n argumentExpressions,\r\n reportNode,\r\n this.options.usizeType.toNativeZero(this.module)\r\n );\r\n this.currentType = classInstance.type;\r\n return expr;\r\n }\r\n\r\n compileParenthesizedExpression(\r\n expression: ParenthesizedExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n // does not change types, just order\r\n return this.compileExpression(\r\n expression.expression,\r\n contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n }\r\n\r\n /**\r\n * Compiles a property access in the specified context.\r\n * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\r\n * precomputes them according to context.\r\n */\r\n compilePropertyAccessExpression(\r\n propertyAccess: PropertyAccessExpression,\r\n contextualType: Type,\r\n retainConstantType: bool\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n\r\n var target = this.resolver.resolvePropertyAccess(propertyAccess, flow, contextualType); // reports\r\n if (!target) return module.createUnreachable();\r\n\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL: { // static property\r\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field\r\n return module.createUnreachable();\r\n }\r\n let globalType = (target).type;\r\n assert(globalType != Type.void);\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return this.compileInlineConstant(target, contextualType, retainConstantType);\r\n }\r\n this.currentType = globalType;\r\n return module.createGetGlobal((target).internalName, globalType.toNativeType());\r\n }\r\n case ElementKind.ENUMVALUE: { // enum value\r\n let theEnum = assert((target).parent); assert(theEnum.kind == ElementKind.ENUM);\r\n if (!this.compileEnum(theEnum)) {\r\n this.currentType = Type.i32;\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = Type.i32;\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return module.createI32((target).constantValue);\r\n }\r\n return module.createGetGlobal((target).internalName, NativeType.I32);\r\n }\r\n case ElementKind.FIELD: { // instance field\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n assert((target).memoryOffset >= 0);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n this.currentType = (target).type;\r\n return module.createLoad(\r\n (target).type.byteSize,\r\n (target).type.is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n thisExpr,\r\n (target).type.toNativeType(),\r\n (target).memoryOffset\r\n );\r\n }\r\n case ElementKind.PROPERTY: {// instance property (here: getter)\r\n return this.compileGetter(target, propertyAccess);\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n this.error(\r\n DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,\r\n propertyAccess.range, (target).simpleName\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n propertyAccess.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n private compileGetter(target: Property, reportNode: Node): ExpressionRef {\r\n var prototype = target.getterPrototype;\r\n if (prototype) {\r\n let instance = this.resolver.resolveFunction(prototype, null);\r\n if (!instance) return this.module.createUnreachable();\r\n let signature = instance.signature;\r\n if (!this.checkCallSignature( // reports\r\n signature,\r\n 0,\r\n instance.is(CommonFlags.INSTANCE),\r\n reportNode\r\n )) {\r\n return this.module.createUnreachable();\r\n }\r\n if (instance.is(CommonFlags.INSTANCE)) {\r\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n let thisExpression = assert(this.resolver.currentThisExpression); //!!!\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n this.currentType = signature.returnType;\r\n return this.compileCallDirect(instance, [], reportNode, thisExpr);\r\n } else {\r\n this.currentType = signature.returnType;\r\n return this.compileCallDirect(instance, [], reportNode, 0);\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n reportNode.range, (target).simpleName, (target).parent.toString()\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n\r\n compileTernaryExpression(expression: TernaryExpression, contextualType: Type): ExpressionRef {\r\n var ifThen = expression.ifThen;\r\n var ifElse = expression.ifElse;\r\n var outerFlow = this.currentFlow;\r\n\r\n var condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n\r\n if (\r\n !this.options.noTreeShaking ||\r\n outerFlow.actualFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\r\n ) {\r\n // Try to eliminate unnecesssary branches if the condition is constant\r\n let condExprPrecomp = this.module.precomputeExpression(condExpr);\r\n if (\r\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n getExpressionType(condExprPrecomp) == NativeType.I32\r\n ) {\r\n return getConstValueI32(condExprPrecomp)\r\n ? this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE)\r\n : this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\r\n\r\n // Otherwise recompile to the original and let the optimizer decide\r\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n }\r\n }\r\n\r\n var ifThenFlow = outerFlow.fork();\r\n this.currentFlow = ifThenFlow;\r\n var ifThenExpr = this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE);\r\n var ifThenType = this.currentType;\r\n ifThenFlow.freeScopedLocals();\r\n\r\n var ifElseFlow = outerFlow.fork();\r\n this.currentFlow = ifElseFlow;\r\n var ifElseExpr = this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\r\n var ifElseType = this.currentType;\r\n ifElseFlow.freeScopedLocals();\r\n this.currentFlow = outerFlow;\r\n\r\n outerFlow.inheritMutual(ifThenFlow, ifElseFlow);\r\n\r\n var commonType = Type.commonCompatible(ifThenType, ifElseType, false);\r\n if (!commonType) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n expression.range, ifThenType.toString(), ifElseType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return this.module.createUnreachable();\r\n }\r\n ifThenExpr = this.convertExpression(\r\n ifThenExpr,\r\n ifThenType,\r\n commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n ifThen\r\n );\r\n ifElseExpr = this.convertExpression(\r\n ifElseExpr,\r\n ifElseType,\r\n commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n ifElse\r\n );\r\n this.currentType = commonType;\r\n return this.module.createIf(condExpr, ifThenExpr, ifElseExpr);\r\n }\r\n\r\n compileUnaryPostfixExpression(expression: UnaryPostfixExpression, contextualType: Type): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n\r\n // make a getter for the expression (also obtains the type)\r\n var getValue = this.compileExpression( // reports\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // shortcut if compiling the getter already failed\r\n if (getExpressionId(getValue) == ExpressionId.Unreachable) return getValue;\r\n\r\n var currentType = this.currentType;\r\n\r\n // if the value isn't dropped, a temp. local is required to remember the original value\r\n var tempLocal: Local | null = null;\r\n if (contextualType != Type.void) {\r\n tempLocal = flow.getTempLocal(currentType, false);\r\n getValue = module.createTeeLocal(\r\n tempLocal.index,\r\n getValue\r\n );\r\n }\r\n\r\n var calcValue: ExpressionRef;\r\n\r\n switch (expression.operator) {\r\n case Token.PLUS_PLUS: {\r\n switch (currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n calcValue = module.createBinary(\r\n BinaryOp.AddI32,\r\n getValue,\r\n module.createI32(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.POSTFIX_INC);\r\n if (overload) {\r\n calcValue = this.compileUnaryOverload(overload, expression.operand, getValue, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case TypeKind.ISIZE: {\r\n let options = this.options;\r\n calcValue = module.createBinary(\r\n options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n getValue,\r\n currentType.toNativeOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n calcValue = module.createBinary(\r\n BinaryOp.AddI64,\r\n getValue,\r\n module.createI64(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n calcValue = module.createBinary(\r\n BinaryOp.AddF32,\r\n getValue,\r\n module.createF32(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n calcValue = module.createBinary(\r\n BinaryOp.AddF64,\r\n getValue,\r\n module.createF64(1)\r\n );\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.MINUS_MINUS: {\r\n switch (currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n calcValue = module.createBinary(\r\n BinaryOp.SubI32,\r\n getValue,\r\n module.createI32(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.POSTFIX_DEC);\r\n if (overload) {\r\n calcValue = this.compileUnaryOverload(overload, expression.operand, getValue, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case TypeKind.ISIZE: {\r\n let options = this.options;\r\n calcValue = module.createBinary(\r\n options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n getValue,\r\n currentType.toNativeOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n calcValue = module.createBinary(\r\n BinaryOp.SubI64,\r\n getValue,\r\n module.createI64(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n calcValue = module.createBinary(\r\n BinaryOp.SubF32,\r\n getValue,\r\n module.createF32(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n calcValue = module.createBinary(\r\n BinaryOp.SubF64,\r\n getValue,\r\n module.createF64(1)\r\n );\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return module.createUnreachable();\r\n }\r\n }\r\n\r\n // simplify if dropped anyway\r\n if (!tempLocal) {\r\n this.currentType = Type.void;\r\n return this.compileAssignmentWithValue(expression.operand,\r\n calcValue,\r\n false\r\n );\r\n }\r\n\r\n // otherwise use the temp. local for the intermediate value (always possibly overflows)\r\n var setValue = this.compileAssignmentWithValue(expression.operand,\r\n calcValue, // also tees getValue to tempLocal\r\n false\r\n );\r\n\r\n this.currentType = tempLocal.type;\r\n flow.freeTempLocal(tempLocal);\r\n var nativeType = tempLocal.type.toNativeType();\r\n\r\n return module.createBlock(null, [\r\n setValue,\r\n module.createGetLocal(tempLocal.index, nativeType)\r\n ], nativeType); // result of 'x++' / 'x--' might overflow\r\n }\r\n\r\n compileUnaryPrefixExpression(\r\n expression: UnaryPrefixExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var compound = false;\r\n var expr: ExpressionRef;\r\n\r\n switch (expression.operator) {\r\n case Token.PLUS: {\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.PLUS);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n // nop\r\n break;\r\n }\r\n case Token.MINUS: {\r\n if (expression.operand.kind == NodeKind.LITERAL && (\r\n (expression.operand).literalKind == LiteralKind.INTEGER ||\r\n (expression.operand).literalKind == LiteralKind.FLOAT\r\n )) {\r\n // implicitly negate integer and float literals. also enables proper checking of literal ranges.\r\n expr = this.compileLiteralExpression(expression.operand, contextualType, true);\r\n // compileExpression normally does this:\r\n if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\r\n break;\r\n }\r\n\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.MINUS);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.SubI32, module.createI32(0), expr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n this.currentType.toNativeZero(module),\r\n expr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.SubI64, module.createI64(0), expr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createUnary(UnaryOp.NegF32, expr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createUnary(UnaryOp.NegF64, expr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.PLUS_PLUS: {\r\n compound = true;\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.PREFIX_INC);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.AddI32, expr, this.module.createI32(1));\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n expr,\r\n this.currentType.toNativeOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.AddI64, expr, module.createI64(1));\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.AddF32, expr, module.createF32(1));\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.AddF64, expr, module.createF64(1));\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.MINUS_MINUS: {\r\n compound = true;\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.PREFIX_DEC);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.SubI32, expr, module.createI32(1));\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n expr,\r\n this.currentType.toNativeOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.SubI64, expr, module.createI64(1));\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.SubF32, expr, module.createF32(1));\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.SubF64, expr, module.createF64(1));\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.EXCLAMATION: {\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.NOT);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n // allow '!' for references even without an overload\r\n }\r\n\r\n expr = this.makeIsFalseish(expr, this.currentType);\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.TILDE: {\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_NOT);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n } else {\r\n expr = this.convertExpression(\r\n expr,\r\n this.currentType, this.currentType.intType,\r\n ConversionKind.IMPLICIT, WrapMode.NONE,\r\n expression.operand\r\n );\r\n }\r\n\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.XorI32, expr, module.createI32(-1));\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.XorI64\r\n : BinaryOp.XorI32,\r\n expr,\r\n this.currentType.toNativeNegOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.XorI64, expr, module.createI64(-1, -1));\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.TYPEOF: {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n return module.createUnreachable();\r\n }\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(expression.operand, expr, contextualType != Type.void)\r\n : expr;\r\n }\r\n\r\n /** Makes sure that a 32-bit integer value is wrapped to a valid value of the specified type. */\r\n ensureSmallIntegerWrap(expr: ExpressionRef, type: Type): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n switch (type.kind) {\r\n case TypeKind.I8: {\r\n if (flow.canOverflow(expr, type)) {\r\n expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\r\n ? module.createUnary(UnaryOp.ExtendI8ToI32, expr)\r\n : module.createBinary(BinaryOp.ShrI32,\r\n module.createBinary(BinaryOp.ShlI32,\r\n expr,\r\n module.createI32(24)\r\n ),\r\n module.createI32(24)\r\n );\r\n }\r\n break;\r\n }\r\n case TypeKind.I16: {\r\n if (flow.canOverflow(expr, type)) {\r\n expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\r\n ? module.createUnary(UnaryOp.ExtendI16ToI32, expr)\r\n : module.createBinary(BinaryOp.ShrI32,\r\n module.createBinary(BinaryOp.ShlI32,\r\n expr,\r\n module.createI32(16)\r\n ),\r\n module.createI32(16)\r\n );\r\n }\r\n break;\r\n }\r\n case TypeKind.U8: {\r\n if (flow.canOverflow(expr, type)) {\r\n expr = module.createBinary(BinaryOp.AndI32,\r\n expr,\r\n module.createI32(0xff)\r\n );\r\n }\r\n break;\r\n }\r\n case TypeKind.U16: {\r\n if (flow.canOverflow(expr, type)) {\r\n expr = module.createBinary(BinaryOp.AndI32,\r\n expr,\r\n module.createI32(0xffff)\r\n );\r\n }\r\n break;\r\n }\r\n case TypeKind.BOOL: {\r\n if (flow.canOverflow(expr, type)) {\r\n // bool is special in that it compares to 0 instead of masking with 0x1\r\n expr = module.createBinary(BinaryOp.NeI32,\r\n expr,\r\n module.createI32(0)\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n return expr;\r\n }\r\n\r\n /** Creates a comparison whether an expression is 'false' in a broader sense. */\r\n makeIsFalseish(expr: ExpressionRef, type: Type): ExpressionRef {\r\n var module = this.module;\r\n switch (type.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = this.ensureSmallIntegerWrap(expr, type);\r\n // fall-through\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n return module.createUnary(UnaryOp.EqzI32, expr);\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n return module.createUnary(UnaryOp.EqzI64, expr);\r\n }\r\n case TypeKind.USIZE: // TODO: strings?\r\n case TypeKind.ISIZE: {\r\n return module.createUnary(type.size == 64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32, expr);\r\n }\r\n case TypeKind.F32: {\r\n return module.createBinary(BinaryOp.EqF32, expr, module.createF32(0));\r\n }\r\n case TypeKind.F64: {\r\n return module.createBinary(BinaryOp.EqF64, expr, module.createF64(0));\r\n }\r\n default: {\r\n assert(false);\r\n return module.createI32(1);\r\n }\r\n }\r\n }\r\n\r\n /** Creates a comparison whether an expression is 'true' in a broader sense. */\r\n makeIsTrueish(expr: ExpressionRef, type: Type): ExpressionRef {\r\n var module = this.module;\r\n switch (type.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = this.ensureSmallIntegerWrap(expr, type);\r\n // fall-through\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n return expr;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n return module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\r\n }\r\n case TypeKind.USIZE: // TODO: strings?\r\n case TypeKind.ISIZE: {\r\n return type.size == 64\r\n ? module.createBinary(BinaryOp.NeI64, expr, module.createI64(0))\r\n : expr;\r\n }\r\n case TypeKind.F32: {\r\n return module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\r\n }\r\n case TypeKind.F64: {\r\n return module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\r\n }\r\n default: {\r\n assert(false);\r\n return module.createI32(0);\r\n }\r\n }\r\n }\r\n\r\n /** Makes an allocation suitable to hold the data of an instance of the given class. */\r\n makeAllocation(classInstance: Class): ExpressionRef {\r\n var program = this.program;\r\n assert(classInstance.program == program);\r\n var module = this.module;\r\n var options = this.options;\r\n\r\n // __gc_allocate(size, markFn)\r\n if (program.hasGC && classInstance.type.isManaged(program)) {\r\n let allocateInstance = assert(program.gcAllocateInstance);\r\n if (!this.compileFunction(allocateInstance)) return module.createUnreachable();\r\n this.currentType = classInstance.type;\r\n return module.createCall(\r\n allocateInstance.internalName, [\r\n options.isWasm64\r\n ? module.createI64(classInstance.currentMemoryOffset)\r\n : module.createI32(classInstance.currentMemoryOffset),\r\n module.createI32(\r\n ensureGCHook(this, classInstance)\r\n )\r\n ],\r\n options.nativeSizeType\r\n );\r\n\r\n // memory.allocate(size)\r\n } else {\r\n let allocateInstance = program.memoryAllocateInstance;\r\n if (!allocateInstance || !this.compileFunction(allocateInstance)) return module.createUnreachable();\r\n this.currentType = classInstance.type;\r\n return module.createCall(\r\n allocateInstance.internalName, [\r\n options.isWasm64\r\n ? module.createI64(classInstance.currentMemoryOffset)\r\n : module.createI32(classInstance.currentMemoryOffset)\r\n ],\r\n options.nativeSizeType\r\n );\r\n }\r\n }\r\n\r\n /** Makes the initializers for a class's fields. */\r\n makeFieldInitialization(classInstance: Class, stmts: ExpressionRef[] = []): ExpressionRef[] {\r\n var members = classInstance.members;\r\n if (!members) return [];\r\n\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n var isInline = flow.is(FlowFlags.INLINE_CONTEXT);\r\n var thisLocalIndex = isInline\r\n ? assert(flow.lookupLocal(\"this\")).index\r\n : 0;\r\n var nativeSizeType = this.options.nativeSizeType;\r\n\r\n for (let member of members.values()) {\r\n if (\r\n member.kind != ElementKind.FIELD || // not a field\r\n member.parent != classInstance // inherited field\r\n ) continue;\r\n\r\n let field = member; assert(!field.isAny(CommonFlags.CONST));\r\n let fieldType = field.type;\r\n let nativeFieldType = fieldType.toNativeType();\r\n let fieldDeclaration = field.prototype.declaration;\r\n let initializer = fieldDeclaration.initializer;\r\n if (initializer) { // use initializer\r\n stmts.push(\r\n module.createStore(fieldType.byteSize,\r\n module.createGetLocal(thisLocalIndex, nativeSizeType),\r\n this.compileExpression( // reports\r\n initializer,\r\n fieldType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n ),\r\n nativeFieldType,\r\n field.memoryOffset\r\n )\r\n );\r\n } else {\r\n let parameterIndex = fieldDeclaration.parameterIndex;\r\n stmts.push(\r\n module.createStore(fieldType.byteSize,\r\n module.createGetLocal(thisLocalIndex, nativeSizeType),\r\n parameterIndex >= 0 // initialized via parameter (here: a local)\r\n ? module.createGetLocal(\r\n isInline\r\n ? assert(flow.lookupLocal(field.simpleName)).index\r\n : 1 + parameterIndex, // this is local 0\r\n nativeFieldType\r\n )\r\n : fieldType.toNativeZero(module),\r\n nativeFieldType,\r\n field.memoryOffset\r\n )\r\n );\r\n }\r\n }\r\n return stmts;\r\n }\r\n\r\n /** Adds the debug location of the specified expression at the specified range to the source map. */\r\n addDebugLocation(expr: ExpressionRef, range: Range): void {\r\n var parentFunction = this.currentFlow.parentFunction;\r\n var source = range.source;\r\n if (source.debugInfoIndex < 0) source.debugInfoIndex = this.module.addDebugInfoFile(source.normalizedPath);\r\n range.debugInfoRef = expr;\r\n parentFunction.debugLocations.push(range);\r\n }\r\n}\r\n\r\n// helpers\r\n\r\nfunction mangleImportName(\r\n element: Element,\r\n declaration: DeclarationStatement\r\n): void {\r\n // by default, use the file name as the module name\r\n mangleImportName_moduleName = declaration.range.source.simplePath;\r\n // and the internal name of the element within that file as the element name\r\n mangleImportName_elementName = declaration.programLevelInternalName;\r\n\r\n if (!element.hasDecorator(DecoratorFlags.EXTERNAL)) return;\r\n\r\n var program = element.program;\r\n var decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\r\n var args = decorator.arguments;\r\n if (args && args.length) {\r\n let arg = args[0];\r\n // if one argument is given, override just the element name\r\n // if two arguments are given, override both module and element name\r\n if (arg.kind == NodeKind.LITERAL && (arg).literalKind == LiteralKind.STRING) {\r\n mangleImportName_elementName = (arg).value;\r\n if (args.length >= 2) {\r\n arg = args[1];\r\n if (arg.kind == NodeKind.LITERAL && (arg).literalKind == LiteralKind.STRING) {\r\n mangleImportName_moduleName = mangleImportName_elementName;\r\n mangleImportName_elementName = (arg).value;\r\n if (args.length > 2) {\r\n program.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n decorator.range, \"2\", args.length.toString()\r\n );\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.String_literal_expected,\r\n arg.range\r\n );\r\n }\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.String_literal_expected,\r\n arg.range\r\n );\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n decorator.range, \"1\", \"0\"\r\n );\r\n }\r\n}\r\n\r\nvar mangleImportName_moduleName: string;\r\nvar mangleImportName_elementName: string;\r\n","/**\r\n * Generated from diagnosticsMessages.json. Do not edit.\r\n * @module diagnostics\r\n *//***/\r\n\r\n/* tslint:disable:max-line-length */\r\n\r\n/** Enum of available diagnostic codes. */\r\nexport enum DiagnosticCode {\r\n Operation_not_supported = 100,\r\n Operation_is_unsafe = 101,\r\n User_defined_0 = 102,\r\n Conversion_from_type_0_to_1_requires_an_explicit_cast = 200,\r\n Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit = 201,\r\n Type_0_cannot_be_changed_to_type_1 = 202,\r\n Type_0_cannot_be_reinterpreted_as_type_1 = 203,\r\n Basic_type_0_cannot_be_nullable = 204,\r\n Cannot_export_a_mutable_global = 205,\r\n Compiling_constant_with_non_constant_initializer_as_mutable = 206,\r\n Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa = 207,\r\n Unmanaged_classes_cannot_implement_interfaces = 208,\r\n Invalid_regular_expression_flags = 209,\r\n Implementation_0_must_match_the_signature_1 = 210,\r\n Class_0_is_sealed_and_cannot_be_extended = 211,\r\n Decorator_0_is_not_valid_here = 212,\r\n Duplicate_decorator = 213,\r\n An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf = 214,\r\n Optional_parameter_must_have_an_initializer = 215,\r\n Constructor_of_class_0_must_not_require_any_arguments = 216,\r\n Function_0_cannot_be_inlined_into_itself = 217,\r\n Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set = 218,\r\n Optional_properties_are_not_supported = 219,\r\n Unterminated_string_literal = 1002,\r\n Identifier_expected = 1003,\r\n _0_expected = 1005,\r\n A_file_cannot_have_a_reference_to_itself = 1006,\r\n Trailing_comma_not_allowed = 1009,\r\n Unexpected_token = 1012,\r\n A_rest_parameter_must_be_last_in_a_parameter_list = 1014,\r\n Parameter_cannot_have_question_mark_and_initializer = 1015,\r\n A_required_parameter_cannot_follow_an_optional_parameter = 1016,\r\n Statements_are_not_allowed_in_ambient_contexts = 1036,\r\n Initializers_are_not_allowed_in_ambient_contexts = 1039,\r\n _0_modifier_cannot_be_used_here = 1042,\r\n A_rest_parameter_cannot_be_optional = 1047,\r\n A_rest_parameter_cannot_have_an_initializer = 1048,\r\n A_set_accessor_must_have_exactly_one_parameter = 1049,\r\n A_set_accessor_parameter_cannot_have_an_initializer = 1052,\r\n A_get_accessor_cannot_have_parameters = 1054,\r\n Enum_member_must_have_initializer = 1061,\r\n Type_parameters_cannot_appear_on_a_constructor_declaration = 1092,\r\n Type_annotation_cannot_appear_on_a_constructor_declaration = 1093,\r\n An_accessor_cannot_have_type_parameters = 1094,\r\n A_set_accessor_cannot_have_a_return_type_annotation = 1095,\r\n Type_parameter_list_cannot_be_empty = 1098,\r\n A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement = 1104,\r\n A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement = 1105,\r\n A_return_statement_can_only_be_used_within_a_function_body = 1108,\r\n Expression_expected = 1109,\r\n Type_expected = 1110,\r\n A_default_clause_cannot_appear_more_than_once_in_a_switch_statement = 1113,\r\n Duplicate_label_0 = 1114,\r\n Octal_literals_are_not_allowed_in_strict_mode = 1121,\r\n Digit_expected = 1124,\r\n Hexadecimal_digit_expected = 1125,\r\n Unexpected_end_of_text = 1126,\r\n Invalid_character = 1127,\r\n _case_or_default_expected = 1130,\r\n _super_must_be_followed_by_an_argument_list_or_member_access = 1034,\r\n A_declare_modifier_cannot_be_used_in_an_already_ambient_context = 1038,\r\n Type_argument_expected = 1140,\r\n String_literal_expected = 1141,\r\n Line_break_not_permitted_here = 1142,\r\n Declaration_expected = 1146,\r\n _const_declarations_must_be_initialized = 1155,\r\n Unterminated_regular_expression_literal = 1161,\r\n Interface_declaration_cannot_have_implements_clause = 1176,\r\n Binary_digit_expected = 1177,\r\n Octal_digit_expected = 1178,\r\n An_implementation_cannot_be_declared_in_ambient_contexts = 1183,\r\n An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive = 1198,\r\n Unterminated_Unicode_escape_sequence = 1199,\r\n Decorators_are_not_valid_here = 1206,\r\n _abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration = 1242,\r\n Method_0_cannot_have_an_implementation_because_it_is_marked_abstract = 1245,\r\n A_definite_assignment_assertion_is_not_permitted_in_this_context = 1255,\r\n A_class_may_only_extend_another_class = 1311,\r\n A_parameter_property_cannot_be_declared_using_a_rest_parameter = 1317,\r\n Duplicate_identifier_0 = 2300,\r\n Cannot_find_name_0 = 2304,\r\n Module_0_has_no_exported_member_1 = 2305,\r\n Generic_type_0_requires_1_type_argument_s = 2314,\r\n Type_0_is_not_generic = 2315,\r\n Type_0_is_not_assignable_to_type_1 = 2322,\r\n Index_signature_is_missing_in_type_0 = 2329,\r\n _this_cannot_be_referenced_in_current_location = 2332,\r\n _super_can_only_be_referenced_in_a_derived_class = 2335,\r\n Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors = 2337,\r\n Property_0_does_not_exist_on_type_1 = 2339,\r\n Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures = 2349,\r\n Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature = 2351,\r\n A_function_whose_declared_type_is_not_void_must_return_a_value = 2355,\r\n The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access = 2357,\r\n The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access = 2364,\r\n Operator_0_cannot_be_applied_to_types_1_and_2 = 2365,\r\n A_super_call_must_be_the_first_statement_in_the_constructor = 2376,\r\n Constructors_for_derived_classes_must_contain_a_super_call = 2377,\r\n _get_and_set_accessor_must_have_the_same_type = 2380,\r\n Constructor_implementation_is_missing = 2390,\r\n Function_implementation_is_missing_or_not_immediately_following_the_declaration = 2391,\r\n Multiple_constructor_implementations_are_not_allowed = 2392,\r\n Duplicate_function_implementation = 2393,\r\n Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local = 2395,\r\n Type_0_has_no_property_1 = 2460,\r\n The_0_operator_cannot_be_applied_to_type_1 = 2469,\r\n In_const_enum_declarations_member_initializer_must_be_constant_expression = 2474,\r\n Export_declaration_conflicts_with_exported_declaration_of_0 = 2484,\r\n Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property = 2540,\r\n The_target_of_an_assignment_must_be_a_variable_or_a_property_access = 2541,\r\n Index_signature_in_type_0_only_permits_reading = 2542,\r\n Expected_0_arguments_but_got_1 = 2554,\r\n Expected_at_least_0_arguments_but_got_1 = 2555,\r\n Expected_0_type_arguments_but_got_1 = 2558,\r\n A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums = 2651,\r\n Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration = 2673,\r\n Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration = 2674,\r\n Namespace_0_has_no_exported_member_1 = 2694,\r\n Required_type_parameters_may_not_follow_optional_type_parameters = 2706,\r\n File_0_not_found = 6054,\r\n Numeric_separators_are_not_allowed_here = 6188,\r\n Multiple_consecutive_numeric_separators_are_not_permitted = 6189,\r\n _super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class = 17009,\r\n _super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class = 17011\r\n}\r\n\r\n/** Translates a diagnostic code to its respective string. */\r\nexport function diagnosticCodeToString(code: DiagnosticCode): string {\r\n switch (code) {\r\n case 100: return \"Operation not supported.\";\r\n case 101: return \"Operation is unsafe.\";\r\n case 102: return \"User-defined: {0}\";\r\n case 200: return \"Conversion from type '{0}' to '{1}' requires an explicit cast.\";\r\n case 201: return \"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.\";\r\n case 202: return \"Type '{0}' cannot be changed to type '{1}'.\";\r\n case 203: return \"Type '{0}' cannot be reinterpreted as type '{1}'.\";\r\n case 204: return \"Basic type '{0}' cannot be nullable.\";\r\n case 205: return \"Cannot export a mutable global.\";\r\n case 206: return \"Compiling constant with non-constant initializer as mutable.\";\r\n case 207: return \"Unmanaged classes cannot extend managed classes and vice-versa.\";\r\n case 208: return \"Unmanaged classes cannot implement interfaces.\";\r\n case 209: return \"Invalid regular expression flags.\";\r\n case 210: return \"Implementation '{0}' must match the signature '{1}'.\";\r\n case 211: return \"Class '{0}' is sealed and cannot be extended.\";\r\n case 212: return \"Decorator '{0}' is not valid here.\";\r\n case 213: return \"Duplicate decorator.\";\r\n case 214: return \"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.\";\r\n case 215: return \"Optional parameter must have an initializer.\";\r\n case 216: return \"Constructor of class '{0}' must not require any arguments.\";\r\n case 217: return \"Function '{0}' cannot be inlined into itself.\";\r\n case 218: return \"Cannot access method '{0}' without calling it as it requires 'this' to be set.\";\r\n case 219: return \"Optional properties are not supported.\";\r\n case 1002: return \"Unterminated string literal.\";\r\n case 1003: return \"Identifier expected.\";\r\n case 1005: return \"'{0}' expected.\";\r\n case 1006: return \"A file cannot have a reference to itself.\";\r\n case 1009: return \"Trailing comma not allowed.\";\r\n case 1012: return \"Unexpected token.\";\r\n case 1014: return \"A rest parameter must be last in a parameter list.\";\r\n case 1015: return \"Parameter cannot have question mark and initializer.\";\r\n case 1016: return \"A required parameter cannot follow an optional parameter.\";\r\n case 1036: return \"Statements are not allowed in ambient contexts.\";\r\n case 1039: return \"Initializers are not allowed in ambient contexts.\";\r\n case 1042: return \"'{0}' modifier cannot be used here.\";\r\n case 1047: return \"A rest parameter cannot be optional.\";\r\n case 1048: return \"A rest parameter cannot have an initializer.\";\r\n case 1049: return \"A 'set' accessor must have exactly one parameter.\";\r\n case 1052: return \"A 'set' accessor parameter cannot have an initializer.\";\r\n case 1054: return \"A 'get' accessor cannot have parameters.\";\r\n case 1061: return \"Enum member must have initializer.\";\r\n case 1092: return \"Type parameters cannot appear on a constructor declaration.\";\r\n case 1093: return \"Type annotation cannot appear on a constructor declaration.\";\r\n case 1094: return \"An accessor cannot have type parameters.\";\r\n case 1095: return \"A 'set' accessor cannot have a return type annotation.\";\r\n case 1098: return \"Type parameter list cannot be empty.\";\r\n case 1104: return \"A 'continue' statement can only be used within an enclosing iteration statement.\";\r\n case 1105: return \"A 'break' statement can only be used within an enclosing iteration or switch statement.\";\r\n case 1108: return \"A 'return' statement can only be used within a function body.\";\r\n case 1109: return \"Expression expected.\";\r\n case 1110: return \"Type expected.\";\r\n case 1113: return \"A 'default' clause cannot appear more than once in a 'switch' statement.\";\r\n case 1114: return \"Duplicate label '{0}'.\";\r\n case 1121: return \"Octal literals are not allowed in strict mode.\";\r\n case 1124: return \"Digit expected.\";\r\n case 1125: return \"Hexadecimal digit expected.\";\r\n case 1126: return \"Unexpected end of text.\";\r\n case 1127: return \"Invalid character.\";\r\n case 1130: return \"'case' or 'default' expected.\";\r\n case 1034: return \"'super' must be followed by an argument list or member access.\";\r\n case 1038: return \"A 'declare' modifier cannot be used in an already ambient context.\";\r\n case 1140: return \"Type argument expected.\";\r\n case 1141: return \"String literal expected.\";\r\n case 1142: return \"Line break not permitted here.\";\r\n case 1146: return \"Declaration expected.\";\r\n case 1155: return \"'const' declarations must be initialized.\";\r\n case 1161: return \"Unterminated regular expression literal.\";\r\n case 1176: return \"Interface declaration cannot have 'implements' clause.\";\r\n case 1177: return \"Binary digit expected.\";\r\n case 1178: return \"Octal digit expected.\";\r\n case 1183: return \"An implementation cannot be declared in ambient contexts.\";\r\n case 1198: return \"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.\";\r\n case 1199: return \"Unterminated Unicode escape sequence.\";\r\n case 1206: return \"Decorators are not valid here.\";\r\n case 1242: return \"'abstract' modifier can only appear on a class, method, or property declaration.\";\r\n case 1245: return \"Method '{0}' cannot have an implementation because it is marked abstract.\";\r\n case 1255: return \"A definite assignment assertion '!' is not permitted in this context.\";\r\n case 1311: return \"A class may only extend another class.\";\r\n case 1317: return \"A parameter property cannot be declared using a rest parameter.\";\r\n case 2300: return \"Duplicate identifier '{0}'.\";\r\n case 2304: return \"Cannot find name '{0}'.\";\r\n case 2305: return \"Module '{0}' has no exported member '{1}'.\";\r\n case 2314: return \"Generic type '{0}' requires {1} type argument(s).\";\r\n case 2315: return \"Type '{0}' is not generic.\";\r\n case 2322: return \"Type '{0}' is not assignable to type '{1}'.\";\r\n case 2329: return \"Index signature is missing in type '{0}'.\";\r\n case 2332: return \"'this' cannot be referenced in current location.\";\r\n case 2335: return \"'super' can only be referenced in a derived class.\";\r\n case 2337: return \"Super calls are not permitted outside constructors or in nested functions inside constructors.\";\r\n case 2339: return \"Property '{0}' does not exist on type '{1}'.\";\r\n case 2349: return \"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.\";\r\n case 2351: return \"Cannot use 'new' with an expression whose type lacks a construct signature.\";\r\n case 2355: return \"A function whose declared type is not 'void' must return a value.\";\r\n case 2357: return \"The operand of an increment or decrement operator must be a variable or a property access.\";\r\n case 2364: return \"The left-hand side of an assignment expression must be a variable or a property access.\";\r\n case 2365: return \"Operator '{0}' cannot be applied to types '{1}' and '{2}'.\";\r\n case 2376: return \"A 'super' call must be the first statement in the constructor.\";\r\n case 2377: return \"Constructors for derived classes must contain a 'super' call.\";\r\n case 2380: return \"'get' and 'set' accessor must have the same type.\";\r\n case 2390: return \"Constructor implementation is missing.\";\r\n case 2391: return \"Function implementation is missing or not immediately following the declaration.\";\r\n case 2392: return \"Multiple constructor implementations are not allowed.\";\r\n case 2393: return \"Duplicate function implementation.\";\r\n case 2395: return \"Individual declarations in merged declaration '{0}' must be all exported or all local.\";\r\n case 2460: return \"Type '{0}' has no property '{1}'.\";\r\n case 2469: return \"The '{0}' operator cannot be applied to type '{1}'.\";\r\n case 2474: return \"In 'const' enum declarations member initializer must be constant expression.\";\r\n case 2484: return \"Export declaration conflicts with exported declaration of '{0}'.\";\r\n case 2540: return \"Cannot assign to '{0}' because it is a constant or a read-only property.\";\r\n case 2541: return \"The target of an assignment must be a variable or a property access.\";\r\n case 2542: return \"Index signature in type '{0}' only permits reading.\";\r\n case 2554: return \"Expected {0} arguments, but got {1}.\";\r\n case 2555: return \"Expected at least {0} arguments, but got {1}.\";\r\n case 2558: return \"Expected {0} type arguments, but got {1}.\";\r\n case 2651: return \"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.\";\r\n case 2673: return \"Constructor of class '{0}' is private and only accessible within the class declaration.\";\r\n case 2674: return \"Constructor of class '{0}' is protected and only accessible within the class declaration.\";\r\n case 2694: return \"Namespace '{0}' has no exported member '{1}'.\";\r\n case 2706: return \"Required type parameters may not follow optional type parameters.\";\r\n case 6054: return \"File '{0}' not found.\";\r\n case 6188: return \"Numeric separators are not allowed here.\";\r\n case 6189: return \"Multiple consecutive numeric separators are not permitted.\";\r\n case 17009: return \"'super' must be called before accessing 'this' in the constructor of a derived class.\";\r\n case 17011: return \"'super' must be called before accessing a property of 'super' in the constructor of a derived class.\";\r\n default: return \"\";\r\n }\r\n}\r\n","/**\r\n * Resolve infrastructure to obtain types and elements.\r\n * @module resolver\r\n *//***/\r\n\r\nimport {\r\n DiagnosticEmitter,\r\n DiagnosticCode\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Program,\r\n ElementKind,\r\n OperatorKind,\r\n FlowFlags,\r\n\r\n Element,\r\n Class,\r\n ClassPrototype,\r\n Function,\r\n FunctionTarget,\r\n FunctionPrototype,\r\n VariableLikeElement,\r\n Property,\r\n DecoratorFlags,\r\n FieldPrototype,\r\n Field,\r\n Global,\r\n Flow\r\n} from \"./program\";\r\n\r\nimport {\r\n SignatureNode,\r\n ParameterKind,\r\n CommonTypeNode,\r\n NodeKind,\r\n TypeNode,\r\n TypeParameterNode,\r\n Node,\r\n Range,\r\n IdentifierExpression,\r\n CallExpression,\r\n ElementAccessExpression,\r\n PropertyAccessExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n ParenthesizedExpression,\r\n AssertionExpression,\r\n Expression,\r\n IntegerLiteralExpression,\r\n UnaryPrefixExpression,\r\n UnaryPostfixExpression,\r\n AssertionKind\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n Signature,\r\n typesToString,\r\n TypeKind,\r\n TypeFlags\r\n} from \"./types\";\r\n\r\nimport {\r\n PATH_DELIMITER,\r\n INSTANCE_DELIMITER,\r\n CommonFlags\r\n} from \"./common\";\r\n\r\nimport {\r\n makeMap\r\n} from \"./util\";\r\n\r\nimport {\r\n Token\r\n} from \"./tokenizer\";\r\n\r\n/** Indicates whether errors are reported or not. */\r\nexport enum ReportMode {\r\n /** Report errors. */\r\n REPORT,\r\n /** Swallow errors. */\r\n SWALLOW\r\n}\r\n\r\n/** Provides tools to resolve types and expressions. */\r\nexport class Resolver extends DiagnosticEmitter {\r\n\r\n /** The program this resolver belongs to. */\r\n program: Program;\r\n\r\n /** Target expression of the previously resolved property or element access. */\r\n currentThisExpression: Expression | null = null;\r\n /** Element expression of the previously resolved element access. */\r\n currentElementExpression : Expression | null = null;\r\n\r\n /** Constructs the resolver for the specified program. */\r\n constructor(program: Program) {\r\n super(program.diagnostics);\r\n this.program = program;\r\n }\r\n\r\n /** Resolves a {@link CommonTypeNode} to a concrete {@link Type}. */\r\n resolveType(\r\n node: CommonTypeNode,\r\n contextualTypeArguments: Map | null = null,\r\n reportMode = ReportMode.REPORT\r\n ): Type | null {\r\n\r\n // handle signatures specifically\r\n if (node.kind == NodeKind.SIGNATURE) {\r\n let signature = this.resolveSignature(node, contextualTypeArguments, reportMode);\r\n if (!signature) return null;\r\n return node.isNullable ? signature.type.asNullable() : signature.type;\r\n }\r\n\r\n // now dealing with TypeNode\r\n assert(node.kind == NodeKind.TYPE);\r\n var typeNode = node;\r\n var simpleName = typeNode.name.text;\r\n var globalName = simpleName;\r\n var localName = typeNode.range.source.internalPath + PATH_DELIMITER + simpleName; // TODO cache\r\n\r\n // check file-global / program-global enum or class\r\n {\r\n let elementsLookup = this.program.elementsLookup;\r\n let element: Element | null;\r\n if (\r\n (element = elementsLookup.get(localName)) || // file-global\r\n (element = elementsLookup.get(globalName)) // program-global\r\n ) {\r\n switch (element.kind) {\r\n case ElementKind.ENUM: {\r\n if (typeNode.typeArguments !== null && typeNode.typeArguments.length) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n node.range, element.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n return Type.i32;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n let instance = this.resolveClassInclTypeArguments(\r\n element,\r\n typeNode.typeArguments,\r\n makeMap(contextualTypeArguments),\r\n node\r\n ); // reports\r\n if (!instance) return null;\r\n return node.isNullable ? instance.type.asNullable() : instance.type;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // check (global) type alias\r\n {\r\n let alias = this.program.typeAliases.get(simpleName);\r\n if (alias) return this.resolveType(alias.type, contextualTypeArguments, reportMode);\r\n }\r\n\r\n // resolve parameters\r\n var typeArgumentNodes = typeNode.typeArguments;\r\n var typeArguments: Type[] | null = null;\r\n if (typeArgumentNodes) {\r\n let numTypeArguments = typeArgumentNodes.length;\r\n typeArguments = new Array(numTypeArguments);\r\n for (let i = 0; i < numTypeArguments; ++i) {\r\n let paramType = this.resolveType( // reports\r\n typeArgumentNodes[i],\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!paramType) return null;\r\n typeArguments[i] = paramType;\r\n }\r\n if (numTypeArguments) { // can't be a placeholder if it has parameters\r\n let instanceKey = typesToString(typeArguments);\r\n if (instanceKey.length) {\r\n localName += \"<\" + instanceKey + \">\";\r\n globalName += \"<\" + instanceKey + \">\";\r\n }\r\n } else if (contextualTypeArguments) {\r\n let placeholderType = contextualTypeArguments.get(globalName);\r\n if (placeholderType) return placeholderType;\r\n }\r\n }\r\n\r\n // check file-global / program-global type\r\n {\r\n let typesLookup = this.program.typesLookup;\r\n let type: Type | null;\r\n if (\r\n (type = typesLookup.get(localName)) ||\r\n (type = typesLookup.get(globalName))\r\n ) {\r\n if (!type.is(TypeFlags.REFERENCE) && node.isNullable) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Basic_type_0_cannot_be_nullable,\r\n node.range, type.toString()\r\n );\r\n }\r\n }\r\n return type;\r\n }\r\n }\r\n\r\n // check built-in macro types\r\n if (simpleName == \"NATIVE\") {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n typeNode.range, \"1\", (typeArgumentNodes ? typeArgumentNodes.length : 1).toString(10)\r\n );\r\n }\r\n return null;\r\n }\r\n switch (typeArguments[0].kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: return Type.i32;\r\n case TypeKind.ISIZE: if (!this.program.options.isWasm64) return Type.i32;\r\n case TypeKind.I64: return Type.i64;\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: return Type.u32;\r\n case TypeKind.USIZE: if (!this.program.options.isWasm64) return Type.u32;\r\n case TypeKind.U64: return Type.u64;\r\n case TypeKind.F32: return Type.f32;\r\n case TypeKind.F64: return Type.f64;\r\n case TypeKind.V128: return Type.v128;\r\n case TypeKind.VOID: return Type.void;\r\n default: assert(false);\r\n }\r\n }\r\n\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n typeNode.name.range, globalName\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a {@link SignatureNode} to a concrete {@link Signature}. */\r\n resolveSignature(\r\n node: SignatureNode,\r\n contextualTypeArguments: Map | null = null,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Signature | null {\r\n var explicitThisType = node.explicitThisType;\r\n var thisType: Type | null = null;\r\n if (explicitThisType) {\r\n thisType = this.resolveType(explicitThisType, contextualTypeArguments, reportMode);\r\n if (!thisType) return null;\r\n }\r\n var parameterTypeNodes = node.parameters;\r\n var numParameters = parameterTypeNodes.length;\r\n var parameterTypes = new Array(numParameters);\r\n var parameterNames = new Array(numParameters);\r\n var requiredParameters = 0;\r\n var hasRest = false;\r\n for (let i = 0; i < numParameters; ++i) {\r\n let parameterTypeNode = parameterTypeNodes[i];\r\n switch (parameterTypeNode.parameterKind) {\r\n case ParameterKind.DEFAULT: {\r\n requiredParameters = i + 1;\r\n break;\r\n }\r\n case ParameterKind.REST: {\r\n assert(i == numParameters);\r\n hasRest = true;\r\n break;\r\n }\r\n }\r\n let parameterType = this.resolveType(\r\n assert(parameterTypeNode.type),\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!parameterType) return null;\r\n parameterTypes[i] = parameterType;\r\n parameterNames[i] = parameterTypeNode.name.text;\r\n }\r\n var returnTypeNode = node.returnType;\r\n var returnType: Type | null;\r\n if (returnTypeNode) {\r\n returnType = this.resolveType(returnTypeNode, contextualTypeArguments, reportMode);\r\n if (!returnType) return null;\r\n } else {\r\n returnType = Type.void;\r\n }\r\n var signature = new Signature(parameterTypes, returnType, thisType);\r\n signature.parameterNames = parameterNames;\r\n signature.requiredParameters = requiredParameters;\r\n signature.hasRest = hasRest;\r\n return signature;\r\n }\r\n\r\n /** Resolves an array of type arguments to concrete types. */\r\n resolveTypeArguments(\r\n typeParameters: TypeParameterNode[],\r\n typeArgumentNodes: CommonTypeNode[] | null,\r\n contextualTypeArguments: Map,\r\n alternativeReportNode: Node | null = null,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Type[] | null {\r\n var minParameterCount = 0;\r\n var maxParameterCount = 0;\r\n for (let i = 0; i < typeParameters.length; ++i) {\r\n if (!typeParameters[i].defaultType) ++minParameterCount;\r\n ++maxParameterCount;\r\n }\r\n var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;\r\n if (argumentCount < minParameterCount || argumentCount > maxParameterCount) {\r\n this.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n argumentCount\r\n ? Range.join(\r\n (typeArgumentNodes)[0].range,\r\n (typeArgumentNodes)[argumentCount - 1].range\r\n )\r\n : assert(alternativeReportNode).range.atEnd,\r\n (argumentCount < minParameterCount ? minParameterCount : maxParameterCount).toString(10),\r\n argumentCount.toString(10)\r\n );\r\n return null;\r\n }\r\n var typeArguments = new Array(maxParameterCount);\r\n for (let i = 0; i < maxParameterCount; ++i) {\r\n let type = i < argumentCount\r\n ? this.resolveType( // reports\r\n (typeArgumentNodes)[i],\r\n contextualTypeArguments,\r\n reportMode\r\n )\r\n : this.resolveType( // reports\r\n assert(typeParameters[i].defaultType),\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!type) return null;\r\n // TODO: check extendsType\r\n contextualTypeArguments.set(typeParameters[i].name.text, type);\r\n typeArguments[i] = type;\r\n }\r\n return typeArguments;\r\n }\r\n\r\n /** Resolves an identifier to the element it refers to. */\r\n resolveIdentifier(\r\n identifier: IdentifierExpression,\r\n flow: Flow | null,\r\n context: Element | null,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n var name = identifier.text;\r\n var element: Element | null;\r\n\r\n if (flow) {\r\n let local = flow.lookupLocal(name);\r\n if (local) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return local;\r\n }\r\n }\r\n\r\n if (context) {\r\n\r\n switch (context.kind) {\r\n case ElementKind.FUNCTION: { // use prototype\r\n context = (context).prototype.parent;\r\n break;\r\n }\r\n case ElementKind.CLASS: { // use prototype\r\n context = (context).prototype.parent;\r\n break;\r\n }\r\n }\r\n\r\n // search context\r\n while (context) {\r\n let members = context.members;\r\n if (members) {\r\n if (element = members.get(name)) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return element;\r\n }\r\n }\r\n context = context.parent;\r\n }\r\n }\r\n\r\n // search current file\r\n var elementsLookup = this.program.elementsLookup;\r\n if (element = elementsLookup.get(identifier.range.source.internalPath + PATH_DELIMITER + name)) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE\r\n }\r\n\r\n // search global scope\r\n if (element = elementsLookup.get(name)) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE\r\n }\r\n\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n identifier.range, name\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a lazily compiled global, i.e. a static class field. */\r\n ensureResolvedLazyGlobal(global: Global, reportMode: ReportMode = ReportMode.REPORT): bool {\r\n if (global.is(CommonFlags.RESOLVED)) return true;\r\n var resolveType = assert(global.declaration).type;\r\n if (!resolveType) return false;\r\n var resolvedType = this.resolveType(resolveType, null, reportMode);\r\n if (!resolvedType) return false;\r\n global.type = resolvedType;\r\n global.set(CommonFlags.RESOLVED);\r\n return true;\r\n }\r\n\r\n /** Resolves a property access to the element it refers to. */\r\n resolvePropertyAccess(\r\n propertyAccess: PropertyAccessExpression,\r\n flow: Flow,\r\n contextualType: Type,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n // start by resolving the lhs target (expression before the last dot)\r\n var targetExpression = propertyAccess.expression;\r\n var target = this.resolveExpression(targetExpression, flow, contextualType, reportMode); // reports\r\n if (!target) return null;\r\n\r\n // at this point we know exactly what the target is, so look up the element within\r\n var propertyName = propertyAccess.property.text;\r\n\r\n // Resolve variable-likes to the class type they reference first\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL: if (!this.ensureResolvedLazyGlobal(target, reportMode)) return null;\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD: {\r\n let type = (target).type;\r\n assert(type != Type.void);\r\n let classReference = type.classReference;\r\n if (!classReference) {\r\n let basicClasses = this.program.basicClasses;\r\n if (!type.is(TypeFlags.REFERENCE) && basicClasses.has(type.kind)) {\r\n classReference = assert(basicClasses.get(type.kind));\r\n } else {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, (target).type.toString()\r\n );\r\n return null;\r\n }\r\n }\r\n target = classReference;\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let getter = this.resolveFunction(\r\n assert((target).getterPrototype),\r\n null,\r\n makeMap(),\r\n reportMode\r\n );\r\n if (!getter) return null;\r\n let classReference = getter.signature.returnType.classReference;\r\n if (!classReference) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, getter.signature.returnType.toString()\r\n );\r\n return null;\r\n }\r\n target = classReference;\r\n break;\r\n }\r\n case ElementKind.CLASS: {\r\n let elementExpression = this.currentElementExpression;\r\n if (elementExpression) {\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET);\r\n if (!indexedGet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n elementExpression.range, (target).internalName\r\n );\r\n return null;\r\n }\r\n let returnType = indexedGet.signature.returnType;\r\n if (!(target = returnType.classReference)) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, returnType.toString()\r\n );\r\n return null;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Look up the member within\r\n switch (target.kind) {\r\n case ElementKind.CLASS_PROTOTYPE:\r\n case ElementKind.CLASS: {\r\n do {\r\n let members = target.members;\r\n let member: Element | null;\r\n if (members && (member = members.get(propertyName))) {\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = null;\r\n return member; // instance FIELD, static GLOBAL, FUNCTION_PROTOTYPE...\r\n }\r\n // traverse inherited static members on the base prototype if target is a class prototype\r\n if (target.kind == ElementKind.CLASS_PROTOTYPE) {\r\n if ((target).basePrototype) {\r\n target = (target).basePrototype;\r\n } else {\r\n break;\r\n }\r\n // traverse inherited instance members on the base class if target is a class instance\r\n } else if (target.kind == ElementKind.CLASS) {\r\n if ((target).base) {\r\n target = (target).base;\r\n } else {\r\n break;\r\n }\r\n } else {\r\n break;\r\n }\r\n } while (true);\r\n break;\r\n }\r\n default: { // enums or other namespace-like elements\r\n let members = target.members;\r\n if (members) {\r\n let member = members.get(propertyName);\r\n if (member) {\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = null;\r\n return member; // static ENUMVALUE, static GLOBAL, static FUNCTION_PROTOTYPE...\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, target.internalName\r\n );\r\n return null;\r\n }\r\n\r\n resolveElementAccess(\r\n elementAccess: ElementAccessExpression,\r\n flow: Flow,\r\n contextualType: Type,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n var targetExpression = elementAccess.expression;\r\n var target = this.resolveExpression(targetExpression, flow, contextualType, reportMode);\r\n if (!target) return null;\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL: if (!this.ensureResolvedLazyGlobal(target, reportMode)) return null;\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD: {\r\n let type = (target).type;\r\n if (target = type.classReference) {\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = elementAccess.elementExpression;\r\n return target;\r\n }\r\n break;\r\n }\r\n case ElementKind.CLASS: {\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET);\r\n if (!indexedGet) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n elementAccess.range, (target).internalName\r\n );\r\n }\r\n return null;\r\n }\r\n if (targetExpression.kind == NodeKind.ELEMENTACCESS) { // nested element access\r\n let returnType = indexedGet.signature.returnType;\r\n if (target = returnType.classReference) {\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = elementAccess.elementExpression;\r\n return target;\r\n }\r\n return null;\r\n }\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = elementAccess.elementExpression;\r\n return target;\r\n }\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n targetExpression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n determineIntegerLiteralType(\r\n intValue: I64,\r\n contextualType: Type\r\n ): Type {\r\n\r\n if (!contextualType.is(TypeFlags.REFERENCE)) {\r\n // compile to contextualType if matching\r\n switch (contextualType.kind) {\r\n case TypeKind.I8: {\r\n if (i64_is_i8(intValue)) return Type.i8;\r\n break;\r\n }\r\n case TypeKind.U8: {\r\n if (i64_is_u8(intValue)) return Type.u8;\r\n break;\r\n }\r\n case TypeKind.I16: {\r\n if (i64_is_i16(intValue)) return Type.i16;\r\n break;\r\n }\r\n case TypeKind.U16: {\r\n if (i64_is_u16(intValue)) return Type.u16;\r\n break;\r\n }\r\n case TypeKind.I32: {\r\n if (i64_is_i32(intValue)) return Type.i32;\r\n break;\r\n }\r\n case TypeKind.U32: {\r\n if (i64_is_u32(intValue)) return Type.u32;\r\n break;\r\n }\r\n case TypeKind.BOOL: {\r\n if (i64_is_bool(intValue)) return Type.bool;\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n if (!this.program.options.isWasm64) {\r\n if (i64_is_i32(intValue)) return Type.isize32;\r\n break;\r\n }\r\n return Type.isize64;\r\n }\r\n case TypeKind.USIZE: {\r\n if (!this.program.options.isWasm64) {\r\n if (i64_is_u32(intValue)) return Type.usize32;\r\n break;\r\n }\r\n return Type.usize64;\r\n }\r\n case TypeKind.I64: return Type.i64;\r\n case TypeKind.U64: return Type.u64;\r\n case TypeKind.F32: return Type.f32;\r\n case TypeKind.F64: return Type.f64;\r\n case TypeKind.VOID: break; // best fitting below\r\n default: assert(false);\r\n }\r\n }\r\n\r\n // otherwise compile to best fitting native type\r\n if (i64_is_i32(intValue)) return Type.i32;\r\n if (i64_is_u32(intValue)) return Type.u32;\r\n return Type.i64;\r\n }\r\n\r\n resolveExpression(\r\n expression: Expression,\r\n flow: Flow,\r\n contextualType: Type = Type.void,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n while (expression.kind == NodeKind.PARENTHESIZED) {\r\n expression = (expression).expression;\r\n }\r\n switch (expression.kind) {\r\n case NodeKind.ASSERTION: {\r\n if ((expression).assertionKind == AssertionKind.NONNULL) {\r\n return this.resolveExpression(\r\n (expression).expression,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n let type = this.resolveType(\r\n assert((expression).toType),\r\n flow.contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!type) return null;\r\n let element: Element | null = type.classReference;\r\n if (!element) {\r\n let signature = type.signatureReference;\r\n if (!signature) return null;\r\n element = signature.asFunctionTarget(this.program);\r\n }\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return element;\r\n }\r\n case NodeKind.UNARYPREFIX: {\r\n // TODO: overloads\r\n switch ((expression).operator) {\r\n case Token.MINUS: {\r\n let operand = (expression).operand;\r\n // implicitly negate if an integer literal to distinguish between i32/u32/i64\r\n if (operand.kind == NodeKind.LITERAL && (operand).literalKind == LiteralKind.INTEGER) {\r\n let type = this.determineIntegerLiteralType(\r\n i64_sub(i64_zero, (operand).value),\r\n contextualType\r\n );\r\n return assert(this.program.basicClasses.get(type.kind));\r\n }\r\n return this.resolveExpression(\r\n operand,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n case Token.PLUS:\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS: {\r\n return this.resolveExpression(\r\n (expression).operand,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n case Token.EXCLAMATION: {\r\n return assert(this.program.basicClasses.get(TypeKind.BOOL));\r\n }\r\n case Token.TILDE: {\r\n let resolvedOperand = this.resolveExpression(\r\n (expression).operand,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n if (!resolvedOperand) return null;\r\n throw new Error(\"not implemented\"); // TODO: should all elements have a corresponding type right away?\r\n }\r\n default: assert(false);\r\n }\r\n return null;\r\n }\r\n case NodeKind.UNARYPOSTFIX: {\r\n // TODO: overloads\r\n switch ((expression).operator) {\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS: {\r\n return this.resolveExpression(\r\n (expression).operand,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n default: assert(false);\r\n }\r\n return null;\r\n }\r\n case NodeKind.BINARY: {\r\n // TODO: all sorts of unary and binary expressions, which means looking up overloads and\r\n // evaluating their return types, knowing the semantics of different operators etc.\r\n // should probably share that code with the compiler somehow, as it also does exactly this.\r\n throw new Error(\"not implemented\");\r\n }\r\n case NodeKind.THIS: { // -> Class / ClassPrototype\r\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n let explicitLocal = flow.lookupLocal(\"this\");\r\n if (explicitLocal) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return explicitLocal;\r\n }\r\n }\r\n let parent = flow.parentFunction.parent;\r\n if (parent) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return parent;\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n case NodeKind.SUPER: { // -> Class\r\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n let explicitLocal = flow.lookupLocal(\"super\");\r\n if (explicitLocal) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return explicitLocal;\r\n }\r\n }\r\n let parent = flow.actualFunction.parent;\r\n if (parent && parent.kind == ElementKind.CLASS && (parent = (parent).base)) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return parent;\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n case NodeKind.IDENTIFIER: {\r\n return this.resolveIdentifier(expression, flow, flow.actualFunction, reportMode);\r\n }\r\n case NodeKind.LITERAL: {\r\n switch ((expression).literalKind) {\r\n case LiteralKind.INTEGER: {\r\n return assert(\r\n this.program.basicClasses.get(\r\n this.determineIntegerLiteralType(\r\n (expression).value,\r\n contextualType\r\n ).kind\r\n )\r\n );\r\n }\r\n case LiteralKind.FLOAT: {\r\n this.currentThisExpression = expression;\r\n this.currentElementExpression = null;\r\n return assert(\r\n this.program.basicClasses.get(\r\n contextualType == Type.f32\r\n ? TypeKind.F32\r\n : TypeKind.F64\r\n )\r\n );\r\n }\r\n case LiteralKind.STRING: {\r\n this.currentThisExpression = expression;\r\n this.currentElementExpression = null;\r\n return this.program.stringInstance;\r\n }\r\n // case LiteralKind.ARRAY: // TODO\r\n }\r\n break;\r\n }\r\n case NodeKind.PROPERTYACCESS: {\r\n return this.resolvePropertyAccess(\r\n expression,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n case NodeKind.ELEMENTACCESS: {\r\n return this.resolveElementAccess(\r\n expression,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n case NodeKind.CALL: {\r\n let targetExpression = (expression).expression;\r\n let target = this.resolveExpression(targetExpression, flow, contextualType, reportMode);\r\n if (!target) return null;\r\n if (target.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n let instance = this.resolveFunctionInclTypeArguments(\r\n target,\r\n (expression).typeArguments,\r\n makeMap(flow.contextualTypeArguments),\r\n expression,\r\n reportMode\r\n );\r\n if (!instance) return null;\r\n let returnType = instance.signature.returnType;\r\n let classType = returnType.classReference;\r\n if (classType) {\r\n // reuse resolvedThisExpression (might be property access)\r\n // reuse resolvedElementExpression (might be element access)\r\n return classType;\r\n } else {\r\n let signature = returnType.signatureReference;\r\n if (signature) {\r\n let functionTarget = signature.asFunctionTarget(this.program);\r\n // reuse resolvedThisExpression (might be property access)\r\n // reuse resolvedElementExpression (might be element access)\r\n return functionTarget;\r\n }\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n targetExpression.range, target.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n break;\r\n }\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a function prototype to an instance using the specified concrete type arguments. */\r\n resolveFunction(\r\n prototype: FunctionPrototype,\r\n typeArguments: Type[] | null,\r\n contextualTypeArguments: Map = makeMap(),\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Function | null {\r\n var classTypeArguments = prototype.classTypeArguments; // set only if partially resolved\r\n var classInstanceKey = classTypeArguments ? typesToString(classTypeArguments) : \"\";\r\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\r\n var classInstances = prototype.instances.get(classInstanceKey);\r\n if (classInstances) {\r\n let instance = classInstances.get(instanceKey);\r\n if (instance) return instance;\r\n }\r\n\r\n var declaration = prototype.declaration;\r\n var isInstance = prototype.is(CommonFlags.INSTANCE);\r\n var classPrototype = prototype.classPrototype;\r\n\r\n // apply class type arguments if a partially resolved instance method\r\n if (classTypeArguments) prototype.applyClassTypeArguments(contextualTypeArguments);\r\n\r\n // override with function specific type arguments\r\n var signatureNode = declaration.signature;\r\n var functionTypeParameters = declaration.typeParameters;\r\n var numFunctionTypeArguments: i32;\r\n if (typeArguments && (numFunctionTypeArguments = typeArguments.length)) {\r\n assert(functionTypeParameters && numFunctionTypeArguments == functionTypeParameters.length);\r\n for (let i = 0; i < numFunctionTypeArguments; ++i) {\r\n contextualTypeArguments.set(\r\n (functionTypeParameters)[i].name.text,\r\n typeArguments[i]\r\n );\r\n }\r\n } else {\r\n assert(!functionTypeParameters || functionTypeParameters.length == 0);\r\n }\r\n\r\n // resolve class if an instance method\r\n var classInstance: Class | null = null;\r\n var thisType: Type | null = null;\r\n if (isInstance) {\r\n classInstance = this.resolveClass(\r\n assert(classPrototype),\r\n classTypeArguments,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!classInstance) return null;\r\n let explicitThisType = signatureNode.explicitThisType;\r\n if (explicitThisType) {\r\n thisType = this.resolveType(explicitThisType, contextualTypeArguments, reportMode);\r\n if (!thisType) return null;\r\n } else {\r\n thisType = classInstance.type;\r\n }\r\n contextualTypeArguments.set(\"this\", thisType);\r\n } else {\r\n if (signatureNode.explicitThisType) {\r\n this.error(\r\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n signatureNode.explicitThisType.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n // resolve signature node\r\n var signatureParameters = signatureNode.parameters;\r\n var signatureParameterCount = signatureParameters.length;\r\n var parameterTypes = new Array(signatureParameterCount);\r\n var parameterNames = new Array(signatureParameterCount);\r\n var requiredParameters = 0;\r\n for (let i = 0; i < signatureParameterCount; ++i) {\r\n let parameterDeclaration = signatureParameters[i];\r\n if (parameterDeclaration.parameterKind == ParameterKind.DEFAULT) {\r\n requiredParameters = i + 1;\r\n }\r\n let typeNode = assert(parameterDeclaration.type);\r\n let parameterType = this.resolveType(typeNode, contextualTypeArguments, reportMode);\r\n if (!parameterType) return null;\r\n parameterTypes[i] = parameterType;\r\n parameterNames[i] = parameterDeclaration.name.text;\r\n }\r\n\r\n var returnType: Type;\r\n if (prototype.is(CommonFlags.SET)) {\r\n returnType = Type.void; // not annotated\r\n } else if (prototype.is(CommonFlags.CONSTRUCTOR)) {\r\n returnType = assert(classInstance).type; // not annotated\r\n } else {\r\n let typeNode = assert(signatureNode.returnType);\r\n let type = this.resolveType(typeNode, contextualTypeArguments, reportMode);\r\n if (!type) return null;\r\n returnType = type;\r\n }\r\n\r\n var signature = new Signature(parameterTypes, returnType, thisType);\r\n signature.parameterNames = parameterNames;\r\n signature.requiredParameters = requiredParameters;\r\n\r\n var internalName = prototype.internalName;\r\n if (instanceKey.length) internalName += \"<\" + instanceKey + \">\";\r\n var instance = new Function(\r\n prototype,\r\n internalName,\r\n signature,\r\n classInstance\r\n ? classInstance\r\n : classPrototype,\r\n contextualTypeArguments\r\n );\r\n if (!classInstances) prototype.instances.set(classInstanceKey, classInstances = new Map());\r\n classInstances.set(instanceKey, instance);\r\n this.program.instancesLookup.set(internalName, instance);\r\n return instance;\r\n }\r\n\r\n /** Resolves a function prototype partially by applying the specified type arguments. */\r\n resolveFunctionPartially(\r\n prototype: FunctionPrototype,\r\n typeArguments: Type[] | null,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): FunctionPrototype | null {\r\n assert(prototype.is(CommonFlags.INSTANCE));\r\n var classPrototype = assert(prototype.classPrototype);\r\n\r\n if (!(typeArguments && typeArguments.length)) return prototype; // no need to clone\r\n\r\n var simpleName = prototype.simpleName;\r\n var partialKey = typesToString(typeArguments);\r\n var partialPrototype = new FunctionPrototype(\r\n this.program,\r\n simpleName,\r\n classPrototype.internalName + \"<\" + partialKey + \">\" + INSTANCE_DELIMITER + simpleName,\r\n prototype.declaration,\r\n classPrototype,\r\n prototype.decoratorFlags\r\n );\r\n partialPrototype.flags = prototype.flags;\r\n partialPrototype.operatorKind = prototype.operatorKind;\r\n partialPrototype.classTypeArguments = typeArguments;\r\n partialPrototype.instances = prototype.instances;\r\n return partialPrototype;\r\n }\r\n\r\n /** Resolves a function prototype to an instance by first resolving the specified type arguments. */\r\n resolveFunctionInclTypeArguments(\r\n prototype: FunctionPrototype,\r\n typeArgumentNodes: CommonTypeNode[] | null,\r\n contextualTypeArguments: Map,\r\n reportNode: Node,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Function | null {\r\n var resolvedTypeArguments: Type[] | null = null;\r\n\r\n // Resolve type arguments if generic\r\n if (prototype.is(CommonFlags.GENERIC)) {\r\n\r\n // apply class type arguments if a partially resolved instance method\r\n // FIXME: this is done once more in resolveFunction. required here for resolveTypeArguments,\r\n // required there for just resolving a function no matter if a partial or not.\r\n let classTypeArguments = prototype.classTypeArguments;\r\n if (classTypeArguments) prototype.applyClassTypeArguments(contextualTypeArguments);\r\n\r\n resolvedTypeArguments = this.resolveTypeArguments( // reports\r\n assert(prototype.declaration.typeParameters),\r\n typeArgumentNodes,\r\n contextualTypeArguments,\r\n reportNode,\r\n reportMode\r\n );\r\n if (!resolvedTypeArguments) return null;\r\n\r\n // Otherwise make sure that no type arguments have been specified\r\n } else {\r\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Continue with concrete types\r\n return this.resolveFunction(\r\n prototype,\r\n resolvedTypeArguments,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n }\r\n\r\n /** Resolves a class prototype using the specified concrete type arguments. */\r\n resolveClass(\r\n prototype: ClassPrototype,\r\n typeArguments: Type[] | null,\r\n contextualTypeArguments: Map = makeMap(),\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Class | null {\r\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\r\n\r\n // Check if this exact instance has already been resolved\r\n var instance = prototype.instances.get(instanceKey);\r\n if (instance) return instance;\r\n\r\n // Insert contextual type arguments for this operation. Internally, this method is always\r\n // called with matching type parameter / argument counts.\r\n var declaration = prototype.declaration;\r\n if (typeArguments) {\r\n let typeParameters = declaration.typeParameters;\r\n let expectedTypeArguments = typeParameters.length;\r\n let actualTypeArguments = typeArguments.length;\r\n assert(actualTypeArguments == expectedTypeArguments);\r\n for (let i = 0; i < actualTypeArguments; ++i) {\r\n contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n } else {\r\n assert(declaration.typeParameters.length == 0);\r\n }\r\n\r\n // Resolve base class if applicable\r\n var baseClass: Class | null = null;\r\n if (declaration.extendsType) {\r\n let baseClassType = this.resolveType(\r\n declaration.extendsType,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!baseClassType) return null;\r\n if (!(baseClass = baseClassType.classReference)) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.program.error(\r\n DiagnosticCode.A_class_may_only_extend_another_class,\r\n declaration.extendsType.range\r\n );\r\n }\r\n return null;\r\n }\r\n if (baseClass.hasDecorator(DecoratorFlags.SEALED)) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.program.error(\r\n DiagnosticCode.Class_0_is_sealed_and_cannot_be_extended,\r\n declaration.extendsType.range, baseClass.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n if (baseClass.hasDecorator(DecoratorFlags.UNMANAGED) != prototype.hasDecorator(DecoratorFlags.UNMANAGED)) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.program.error(\r\n DiagnosticCode.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa,\r\n Range.join(declaration.name.range, declaration.extendsType.range)\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Construct the instance and remember that it has been resolved already\r\n var simpleName = prototype.simpleName;\r\n var internalName = prototype.internalName;\r\n if (instanceKey.length) {\r\n simpleName += \"<\" + instanceKey + \">\";\r\n internalName += \"<\" + instanceKey + \">\";\r\n }\r\n instance = new Class(prototype, simpleName, internalName, typeArguments, baseClass);\r\n instance.contextualTypeArguments = contextualTypeArguments;\r\n prototype.instances.set(instanceKey, instance);\r\n this.program.instancesLookup.set(internalName, instance);\r\n\r\n // Inherit base class members and set up the initial memory offset for own fields\r\n var memoryOffset: u32 = 0;\r\n if (baseClass) {\r\n if (baseClass.members) {\r\n if (!instance.members) instance.members = new Map();\r\n for (let inheritedMember of baseClass.members.values()) {\r\n instance.members.set(inheritedMember.simpleName, inheritedMember);\r\n }\r\n }\r\n memoryOffset = baseClass.currentMemoryOffset;\r\n }\r\n\r\n // Resolve constructor by first applying the class type arguments\r\n var constructorPrototype = prototype.constructorPrototype;\r\n if (constructorPrototype) {\r\n let constructorPartial = this.resolveFunctionPartially(\r\n constructorPrototype,\r\n typeArguments,\r\n reportMode\r\n );\r\n if (!constructorPartial) return null;\r\n instance.constructorInstance = this.resolveFunction(\r\n constructorPartial,\r\n null,\r\n makeMap(),\r\n reportMode\r\n );\r\n }\r\n\r\n // Resolve instance members\r\n if (prototype.instanceMembers) {\r\n for (let member of prototype.instanceMembers.values()) {\r\n switch (member.kind) {\r\n\r\n // Lay out fields in advance\r\n case ElementKind.FIELD_PROTOTYPE: {\r\n let fieldDeclaration = (member).declaration;\r\n if (!instance.members) instance.members = new Map();\r\n else if (instance.members.has(member.simpleName)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n fieldDeclaration.name.range,\r\n member.simpleName\r\n );\r\n break;\r\n }\r\n let fieldType: Type | null = null;\r\n // TODO: handle duplicate non-private fields\r\n if (!fieldDeclaration.type) {\r\n if (baseClass !== null && baseClass.members !== null) {\r\n let baseField = baseClass.members.get((member).simpleName);\r\n if (baseField && !baseField.is(CommonFlags.PRIVATE)) {\r\n assert(baseField.kind == ElementKind.FIELD);\r\n fieldType = (baseField).type;\r\n }\r\n }\r\n if (!fieldType) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n fieldDeclaration.name.range.atEnd\r\n );\r\n }\r\n }\r\n } else {\r\n fieldType = this.resolveType(\r\n fieldDeclaration.type,\r\n instance.contextualTypeArguments,\r\n reportMode\r\n );\r\n }\r\n if (!fieldType) break;\r\n let fieldInstance = new Field(\r\n member,\r\n internalName + INSTANCE_DELIMITER + (member).simpleName,\r\n fieldType,\r\n fieldDeclaration,\r\n instance\r\n );\r\n switch (fieldType.byteSize) { // align\r\n case 1: break;\r\n case 2: { if (memoryOffset & 1) ++memoryOffset; break; }\r\n case 4: { if (memoryOffset & 3) memoryOffset = (memoryOffset | 3) + 1; break; }\r\n case 8: { if (memoryOffset & 7) memoryOffset = (memoryOffset | 7) + 1; break; }\r\n default: assert(false);\r\n }\r\n fieldInstance.memoryOffset = memoryOffset;\r\n memoryOffset += fieldType.byteSize;\r\n instance.members.set(member.simpleName, fieldInstance);\r\n break;\r\n }\r\n\r\n // Partially resolve methods as these might have type arguments on their own\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (!instance.members) instance.members = new Map();\r\n let partialPrototype = this.resolveFunctionPartially(\r\n member,\r\n typeArguments,\r\n reportMode\r\n );\r\n if (!partialPrototype) return null;\r\n partialPrototype.internalName = internalName + INSTANCE_DELIMITER + partialPrototype.simpleName;\r\n instance.members.set(member.simpleName, partialPrototype);\r\n break;\r\n }\r\n\r\n // Clone properties and partially resolve the wrapped accessors for consistence with other methods\r\n case ElementKind.PROPERTY: {\r\n if (!instance.members) instance.members = new Map();\r\n let getterPrototype = assert((member).getterPrototype); // must be present\r\n let setterPrototype = (member).setterPrototype; // might be present\r\n let instanceProperty = new Property(\r\n this.program,\r\n member.simpleName,\r\n internalName + INSTANCE_DELIMITER + member.simpleName,\r\n prototype\r\n );\r\n let partialGetterPrototype = this.resolveFunctionPartially(\r\n getterPrototype,\r\n typeArguments,\r\n reportMode\r\n );\r\n if (!partialGetterPrototype) return null;\r\n partialGetterPrototype\r\n .internalName = internalName + INSTANCE_DELIMITER + partialGetterPrototype.simpleName;\r\n instanceProperty.getterPrototype = partialGetterPrototype;\r\n if (setterPrototype) {\r\n let partialSetterPrototype = this.resolveFunctionPartially(\r\n setterPrototype,\r\n typeArguments,\r\n reportMode\r\n );\r\n if (!partialSetterPrototype) return null;\r\n partialSetterPrototype\r\n .internalName = internalName + INSTANCE_DELIMITER + partialSetterPrototype.simpleName;\r\n instanceProperty.setterPrototype = partialSetterPrototype;\r\n }\r\n instance.members.set(member.simpleName, instanceProperty);\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n }\r\n\r\n // Finalize memory offset\r\n instance.currentMemoryOffset = memoryOffset;\r\n\r\n // Fully resolve operator overloads (don't have type parameters on their own)\r\n for (let [kind, overloadPrototype] of prototype.overloadPrototypes) {\r\n assert(kind != OperatorKind.INVALID);\r\n let operatorInstance: Function | null;\r\n if (overloadPrototype.is(CommonFlags.INSTANCE)) {\r\n let operatorPartial = this.resolveFunctionPartially(\r\n overloadPrototype,\r\n typeArguments,\r\n reportMode\r\n );\r\n if (!operatorPartial) continue;\r\n operatorInstance = this.resolveFunction(\r\n operatorPartial,\r\n null,\r\n makeMap(),\r\n reportMode\r\n );\r\n } else {\r\n operatorInstance = this.resolveFunction(\r\n overloadPrototype,\r\n null,\r\n makeMap(),\r\n reportMode\r\n );\r\n }\r\n if (!operatorInstance) continue;\r\n let overloads = instance.overloads;\r\n if (!overloads) instance.overloads = overloads = new Map();\r\n overloads.set(kind, operatorInstance);\r\n }\r\n return instance;\r\n }\r\n\r\n /** Resolves a class prototype by first resolving the specified type arguments. */\r\n resolveClassInclTypeArguments(\r\n prototype: ClassPrototype,\r\n typeArgumentNodes: CommonTypeNode[] | null,\r\n contextualTypeArguments: Map,\r\n reportNode: Node,\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Class | null {\r\n var resolvedTypeArguments: Type[] | null = null;\r\n\r\n // Resolve type arguments if generic\r\n if (prototype.is(CommonFlags.GENERIC)) {\r\n resolvedTypeArguments = this.resolveTypeArguments(\r\n assert(prototype.declaration.typeParameters),\r\n typeArgumentNodes,\r\n contextualTypeArguments,\r\n reportNode,\r\n reportMode\r\n );\r\n if (!resolvedTypeArguments) return null;\r\n\r\n // Otherwise make sure that no type arguments have been specified\r\n } else {\r\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Continue with concrete types\r\n return this.resolveClass(\r\n prototype,\r\n resolvedTypeArguments,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n }\r\n}\r\n","/**\r\n * A decompiler that generates low-level AssemblyScript from WebAssembly binaries.\r\n * @module decompiler\r\n *//***/\r\n\r\nimport {\r\n Module,\r\n NativeType,\r\n ExpressionId,\r\n UnaryOp,\r\n BinaryOp,\r\n HostOp,\r\n FunctionRef,\r\n ExpressionRef,\r\n Index,\r\n getFunctionName,\r\n getFunctionBody,\r\n getFunctionParamCount,\r\n getFunctionParamType,\r\n getFunctionResultType,\r\n getExpressionId,\r\n getExpressionType,\r\n getBlockName,\r\n getBlockChildCount,\r\n getBlockChild,\r\n getIfCondition,\r\n getIfTrue,\r\n getIfFalse,\r\n getLoopName,\r\n getLoopBody,\r\n getBreakName,\r\n getBreakCondition,\r\n getGetLocalIndex,\r\n getSetLocalIndex,\r\n getSetLocalValue,\r\n getLoadOffset,\r\n getLoadPtr,\r\n getStoreOffset,\r\n getStorePtr,\r\n getStoreValue,\r\n getConstValueI32,\r\n getConstValueI64Low,\r\n getConstValueI64High,\r\n getConstValueF32,\r\n getConstValueF64,\r\n getUnaryOp,\r\n getUnaryValue,\r\n getBinaryOp,\r\n getBinaryLeft,\r\n getBinaryRight,\r\n getSelectThen,\r\n getSelectElse,\r\n getSelectCondition,\r\n getDropValue,\r\n getReturnValue,\r\n getHostOp,\r\n getHostOperand\r\n} from \"./module\";\r\n\r\n// TODO :-)\r\n\r\nexport class Decompiler {\r\n\r\n static decompile(module: Module): string {\r\n var decompiler = new Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n }\r\n\r\n text: string[] = [];\r\n functionId: i32 = 0;\r\n\r\n constructor() { }\r\n\r\n /** Decompiles a module to an AST that can then be serialized. */\r\n decompile(module: Module): void {\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n decompileFunction(func: FunctionRef): void {\r\n var name = getFunctionName(func) || \"$\" + this.functionId.toString(10);\r\n var body = getFunctionBody(func);\r\n this.push(\"function \");\r\n this.push(name);\r\n this.push(\"(\");\r\n for (let i: Index = 0, k: Index = getFunctionParamCount(func); i < k; ++i) {\r\n if (i > 0) this.push(\", \");\r\n this.push(\"$\");\r\n this.push(i.toString(10));\r\n this.push(\": \");\r\n this.push(nativeTypeToType(getFunctionParamType(func, i)));\r\n }\r\n this.push(\"): \");\r\n this.push(nativeTypeToType(getFunctionResultType(func)));\r\n this.push(\" \");\r\n if (getExpressionId(body) != ExpressionId.Block) {\r\n this.push(\"{\\n\");\r\n }\r\n this.decompileExpression(body);\r\n if (getExpressionId(body) != ExpressionId.Block) {\r\n this.push(\"\\n}\\n\");\r\n }\r\n ++this.functionId;\r\n }\r\n\r\n decompileExpression(expr: ExpressionRef): void {\r\n var id = getExpressionId(expr);\r\n var type = getExpressionType(expr);\r\n\r\n var nested: ExpressionRef;\r\n var string: string | null;\r\n var i: Index, k: Index;\r\n\r\n switch (id) {\r\n case ExpressionId.Block: { // TODO: magic\r\n if ((string = getBlockName(expr)) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"{\\n\");\r\n k = getBlockChildCount(expr);\r\n for (i = 0; i < k; ++i) {\r\n this.decompileExpression(getBlockChild(expr, i));\r\n }\r\n this.push(\"}\\n\");\r\n return;\r\n }\r\n case ExpressionId.If: {\r\n if (type == NativeType.None) {\r\n this.push(\"if (\");\r\n this.decompileExpression(getIfCondition(expr));\r\n this.push(\") \");\r\n this.decompileExpression(getIfTrue(expr));\r\n if (nested = getIfFalse(expr)) {\r\n this.push(\" else \");\r\n this.decompileExpression(nested);\r\n }\r\n } else {\r\n this.decompileExpression(getIfCondition(expr));\r\n this.push(\" ? \");\r\n this.decompileExpression(getIfTrue(expr));\r\n this.push(\" : \");\r\n this.decompileExpression(getIfFalse(expr));\r\n }\r\n return;\r\n }\r\n case ExpressionId.Loop: {\r\n if ((string = getLoopName(expr)) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"do \");\r\n this.decompileExpression(getLoopBody(expr));\r\n this.push(\"while (0);\\n\");\r\n }\r\n case ExpressionId.Break: {\r\n if (nested = getBreakCondition(expr)) {\r\n this.push(\"if (\");\r\n this.decompileExpression(nested);\r\n this.push(\") \");\r\n }\r\n if ((string = getBreakName(expr)) != null) {\r\n this.push(\"break \");\r\n this.push(string);\r\n this.push(\";\\n\");\r\n } else {\r\n this.push(\"break;\\n\");\r\n }\r\n return;\r\n }\r\n case ExpressionId.Switch:\r\n case ExpressionId.Call:\r\n case ExpressionId.CallIndirect: {\r\n throw new Error(\"not implemented\");\r\n }\r\n case ExpressionId.GetLocal: {\r\n this.push(\"$\");\r\n this.push(getGetLocalIndex(expr).toString(10));\r\n return;\r\n }\r\n case ExpressionId.SetLocal: {\r\n this.push(\"$\");\r\n this.push(getSetLocalIndex(expr).toString(10));\r\n this.push(\" = \");\r\n this.decompileExpression(getSetLocalValue(expr));\r\n return;\r\n }\r\n case ExpressionId.GetGlobal:\r\n case ExpressionId.SetGlobal: {\r\n throw new Error(\"not implemented\");\r\n }\r\n case ExpressionId.Load: {\r\n this.push(\"load<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(getLoadOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(getLoadPtr(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case ExpressionId.Store: {\r\n this.push(\"store<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(getStoreOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(getStorePtr(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getStoreValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case ExpressionId.Const: {\r\n switch (type) {\r\n case NativeType.I32: {\r\n this.push(getConstValueI32(expr).toString(10));\r\n return;\r\n }\r\n case NativeType.I64: {\r\n this.push(\r\n i64_to_string(\r\n i64_new(\r\n getConstValueI64Low(expr),\r\n getConstValueI64High(expr)\r\n )\r\n )\r\n );\r\n return;\r\n }\r\n case NativeType.F32: {\r\n this.push(getConstValueF32(expr).toString(10));\r\n return;\r\n }\r\n case NativeType.F64: {\r\n this.push(getConstValueF64(expr).toString(10));\r\n return;\r\n }\r\n }\r\n break;\r\n }\r\n case ExpressionId.Unary: {\r\n switch (getUnaryOp(expr)) {\r\n case UnaryOp.ClzI32: {\r\n this.push(\"clz(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.CtzI32: {\r\n this.push(\"ctz(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.PopcntI32: {\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.NegF32:\r\n case UnaryOp.NegF64: {\r\n this.push(\"-\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.AbsF32: {\r\n this.push(\"abs(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.CeilF32: {\r\n this.push(\"ceil(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.FloorF32: {\r\n this.push(\"floor(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.TruncF32: {\r\n this.push(\"trunc(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.NearestF32: {\r\n this.push(\"nearest(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.SqrtF32: {\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.EqzI32:\r\n case UnaryOp.EqzI64: {\r\n this.push(\"!\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ClzI64: {\r\n this.push(\"clz(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.CtzI64: {\r\n this.push(\"ctz(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.PopcntI64: {\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.AbsF64: {\r\n this.push(\"abs(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.CeilF64: {\r\n this.push(\"ceil(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.FloorF64: {\r\n this.push(\"floor(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.TruncF64: {\r\n this.push(\"trunc(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.NearestF64: {\r\n this.push(\"nearest(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.SqrtF64: {\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.ExtendI32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ExtendU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.WrapI64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF32ToI32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF32ToI64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF32ToU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF32ToU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF64ToI32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF64ToI64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF64ToU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF64ToU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ReinterpretF32: {\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.ReinterpretF64: {\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.ConvertI32ToF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertI32ToF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertU32ToF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertU32ToF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertI64ToF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertI64ToF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertU64ToF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertU64ToF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.PromoteF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.DemoteF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ReinterpretI32: {\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.ReinterpretI64: {\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n }\r\n break;\r\n }\r\n case ExpressionId.Binary: { // TODO: precedence\r\n switch (getBinaryOp(expr)) {\r\n case BinaryOp.AddI32:\r\n case BinaryOp.AddI64:\r\n case BinaryOp.AddF32:\r\n case BinaryOp.AddF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" + \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.SubI32:\r\n case BinaryOp.SubI64:\r\n case BinaryOp.SubF32:\r\n case BinaryOp.SubF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" - \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.MulI32:\r\n case BinaryOp.MulI64:\r\n case BinaryOp.MulF32:\r\n case BinaryOp.MulF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" * \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.DivI32:\r\n case BinaryOp.DivI64:\r\n case BinaryOp.DivF32:\r\n case BinaryOp.DivF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.DivU32: {\r\n this.push(\"(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.RemI32:\r\n case BinaryOp.RemI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.RemU32: {\r\n this.push(\"(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.AndI32:\r\n case BinaryOp.AndI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" & \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.OrI32:\r\n case BinaryOp.OrI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" | \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.XorI32:\r\n case BinaryOp.XorI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" ^ \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.ShlI32:\r\n case BinaryOp.ShlI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" << \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.ShrU32:\r\n case BinaryOp.ShrU64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >>> \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.ShrI32:\r\n case BinaryOp.ShrI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >> \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.RotlI32: {\r\n this.push(\"rotl(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.RotrI32: {\r\n this.push(\"rotr(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.EqI32:\r\n case BinaryOp.EqI64:\r\n case BinaryOp.EqF32:\r\n case BinaryOp.EqF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" == \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.NeI32:\r\n case BinaryOp.NeI64:\r\n case BinaryOp.NeF32:\r\n case BinaryOp.NeF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" != \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LtI32:\r\n case BinaryOp.LtI64:\r\n case BinaryOp.LtF32:\r\n case BinaryOp.LtF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LtU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LeI32:\r\n case BinaryOp.LeI64:\r\n case BinaryOp.LeF32:\r\n case BinaryOp.LeF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LeU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GtI32:\r\n case BinaryOp.GtI64:\r\n case BinaryOp.GtF32:\r\n case BinaryOp.GtF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GtU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GeI32:\r\n case BinaryOp.GeI64:\r\n case BinaryOp.GeF32:\r\n case BinaryOp.GeF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GeU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.DivU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.RemU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.RotlI64: {\r\n this.push(\"rotl(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.RotrI64: {\r\n this.push(\"rotr(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.LtU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LeU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GtU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GeU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.CopysignF32: {\r\n this.push(\"copysign(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.MinF32: {\r\n this.push(\"min(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.MaxF32: {\r\n this.push(\"max(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.CopysignF64: {\r\n this.push(\"copysign(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.MinF64: {\r\n this.push(\"min(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.MaxF64: {\r\n this.push(\"max(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n }\r\n return;\r\n }\r\n case ExpressionId.Select: {\r\n this.push(\"select<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.decompileExpression(getSelectThen(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getSelectElse(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getSelectCondition(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case ExpressionId.Drop: {\r\n this.decompileExpression(getDropValue(expr));\r\n this.push(\";\\n\");\r\n return;\r\n }\r\n case ExpressionId.Return: {\r\n if (nested = getReturnValue(expr)) {\r\n this.push(\"return \");\r\n this.decompileExpression(nested);\r\n this.push(\";\\n\");\r\n } else {\r\n this.push(\"return;\\n\");\r\n }\r\n return;\r\n }\r\n case ExpressionId.Host: {\r\n switch (getHostOp(expr)) {\r\n case HostOp.CurrentMemory: {\r\n this.push(\"memory.size()\");\r\n return;\r\n }\r\n case HostOp.GrowMemory: {\r\n this.push(\"memory.grow(\");\r\n this.decompileExpression(getHostOperand(expr, 0));\r\n this.push(\")\");\r\n return;\r\n }\r\n }\r\n break;\r\n }\r\n case ExpressionId.Nop: {\r\n this.push(\";\\n\");\r\n return;\r\n }\r\n case ExpressionId.Unreachable: {\r\n this.push(\"unreachable()\");\r\n return;\r\n }\r\n case ExpressionId.AtomicCmpxchg:\r\n case ExpressionId.AtomicRMW:\r\n case ExpressionId.AtomicWait:\r\n case ExpressionId.AtomicWake:\r\n }\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n private push(text: string): void {\r\n // mostly here so we can add debugging if necessary\r\n this.text.push(text);\r\n }\r\n\r\n finish(): string {\r\n var ret = this.text.join(\"\");\r\n this.text = [];\r\n return ret;\r\n }\r\n}\r\n\r\nfunction nativeTypeToType(type: NativeType): string {\r\n switch (type) {\r\n case NativeType.None: return \"void\";\r\n case NativeType.I32: return \"i32\";\r\n case NativeType.I64: return \"i64\";\r\n case NativeType.F32: return \"f32\";\r\n case NativeType.F64: return \"f64\";\r\n case NativeType.V128: return \"v128\";\r\n case NativeType.Unreachable: throw new Error(\"unreachable type\");\r\n case NativeType.Auto: throw new Error(\"auto type\");\r\n default: throw new Error(\"unexpected type\");\r\n }\r\n}\r\n","/**\r\n * Definition builders for WebIDL and TypeScript.\r\n * @module definitions\r\n *//***/\r\n\r\nimport {\r\n CommonFlags\r\n} from \"./common\";\r\n\r\nimport {\r\n Program,\r\n Element,\r\n ElementKind,\r\n Global,\r\n Enum,\r\n EnumValue,\r\n Field,\r\n Function,\r\n FunctionPrototype,\r\n Class,\r\n ClassPrototype,\r\n Namespace,\r\n ConstantValueKind,\r\n Interface,\r\n Property\r\n} from \"./program\";\r\n\r\nimport {\r\n Type,\r\n TypeKind\r\n} from \"./types\";\r\n\r\nimport {\r\n indent\r\n} from \"./util\";\r\n\r\n/** Walker base class. */\r\nabstract class ExportsWalker {\r\n\r\n /** Program reference. */\r\n program: Program;\r\n /** Whether to include private members */\r\n includePrivate: bool;\r\n /** Elements still to do. */\r\n todo: Element[] = [];\r\n /** Already seen elements. */\r\n seen: Set = new Set();\r\n\r\n /** Constructs a new Element walker. */\r\n constructor(program: Program, includePrivate: bool = false) {\r\n this.program = program;\r\n this.includePrivate;\r\n }\r\n\r\n /** Walks all exports and calls the respective handlers. */\r\n walk(): void {\r\n for (let moduleExport of this.program.moduleLevelExports.values()) {\r\n // FIXME: doesn't honor the actual externally visible name\r\n this.visitElement(moduleExport.element);\r\n }\r\n var todo = this.todo;\r\n for (let i = 0; i < todo.length; ) this.visitElement(todo[i]);\r\n }\r\n\r\n /** Visits an element.*/\r\n visitElement(element: Element): void {\r\n if (element.is(CommonFlags.PRIVATE) && !this.includePrivate) return;\r\n if (this.seen.has(element)) return;\r\n this.seen.add(element);\r\n switch (element.kind) {\r\n case ElementKind.GLOBAL: {\r\n if (element.is(CommonFlags.COMPILED)) this.visitGlobal(element);\r\n break;\r\n }\r\n case ElementKind.ENUM: {\r\n if (element.is(CommonFlags.COMPILED)) this.visitEnum(element);\r\n break;\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n this.visitFunctionInstances(element);\r\n break;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n this.visitClassInstances(element);\r\n break;\r\n }\r\n case ElementKind.FIELD: {\r\n if ((element).is(CommonFlags.COMPILED)) this.visitField(element);\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let prop = element;\r\n let getter = prop.getterPrototype;\r\n if (getter) this.visitFunctionInstances(getter);\r\n let setter = prop.setterPrototype;\r\n if (setter) this.visitFunctionInstances(setter);\r\n break;\r\n }\r\n case ElementKind.NAMESPACE: {\r\n if (hasCompiledMember(element)) this.visitNamespace(element);\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n\r\n private visitFunctionInstances(element: FunctionPrototype): void {\r\n for (let instances of element.instances.values()) {\r\n for (let instance of instances.values()) {\r\n if (instance.is(CommonFlags.COMPILED)) this.visitFunction(instance);\r\n }\r\n }\r\n }\r\n\r\n private visitClassInstances(element: ClassPrototype): void {\r\n for (let instance of element.instances.values()) {\r\n if (instance.is(CommonFlags.COMPILED)) this.visitClass(instance);\r\n }\r\n }\r\n\r\n abstract visitGlobal(element: Global): void;\r\n abstract visitEnum(element: Enum): void;\r\n abstract visitFunction(element: Function): void;\r\n abstract visitClass(element: Class): void;\r\n abstract visitInterface(element: Interface): void;\r\n abstract visitField(element: Field): void;\r\n abstract visitNamespace(element: Element): void;\r\n}\r\n\r\n/** A WebIDL definitions builder. */\r\nexport class IDLBuilder extends ExportsWalker {\r\n\r\n /** Builds WebIDL definitions for the specified program. */\r\n static build(program: Program): string {\r\n return new IDLBuilder(program).build();\r\n }\r\n\r\n private sb: string[] = [];\r\n private indentLevel: i32 = 0;\r\n\r\n /** Constructs a new WebIDL builder. */\r\n constructor(program: Program, includePrivate: bool = false) {\r\n super(program, includePrivate);\r\n }\r\n\r\n visitGlobal(element: Global): void {\r\n var sb = this.sb;\r\n var isConst = element.is(CommonFlags.INLINED);\r\n indent(sb, this.indentLevel);\r\n if (isConst) sb.push(\"const \");\r\n sb.push(this.typeToString(element.type));\r\n sb.push(\" \");\r\n sb.push(element.simpleName);\r\n if (isConst) {\r\n switch (element.constantValueKind) {\r\n case ConstantValueKind.INTEGER: {\r\n sb.push(\" = \");\r\n sb.push(i64_to_string(element.constantIntegerValue));\r\n break;\r\n }\r\n case ConstantValueKind.FLOAT: {\r\n sb.push(\" = \");\r\n sb.push(element.constantFloatValue.toString());\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n sb.push(\";\\n\");\r\n }\r\n\r\n visitEnum(element: Enum): void {\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"interface \");\r\n sb.push(element.simpleName);\r\n sb.push(\" {\\n\");\r\n var members = element.members;\r\n if (members) {\r\n for (let [name, member] of members) {\r\n if (member.kind == ElementKind.ENUMVALUE) {\r\n let isConst = (member).is(CommonFlags.INLINED);\r\n indent(sb, this.indentLevel);\r\n if (isConst) sb.push(\"const \");\r\n else sb.push(\"readonly \");\r\n sb.push(\"unsigned long \");\r\n sb.push(name);\r\n if (isConst) {\r\n sb.push(\" = \");\r\n sb.push((member).constantValue.toString(10));\r\n }\r\n sb.push(\";\\n\");\r\n }\r\n }\r\n for (let member of members.values()) {\r\n if (member.kind != ElementKind.ENUMVALUE) this.visitElement(member);\r\n }\r\n }\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n visitFunction(element: Function): void {\r\n var sb = this.sb;\r\n var signature = element.signature;\r\n indent(sb, this.indentLevel);\r\n sb.push(this.typeToString(signature.returnType));\r\n sb.push(\" \");\r\n sb.push(element.simpleName);\r\n sb.push(\"(\");\r\n var parameters = signature.parameterTypes;\r\n var numParameters = parameters.length;\r\n // var requiredParameters = signature.requiredParameters;\r\n for (let i = 0; i < numParameters; ++i) {\r\n if (i) sb.push(\", \");\r\n // if (i >= requiredParameters) sb.push(\"optional \");\r\n sb.push(this.typeToString(parameters[i]));\r\n sb.push(\" \");\r\n sb.push(signature.getParameterName(i));\r\n }\r\n sb.push(\");\\n\");\r\n var members = element.members;\r\n if (members && members.size) {\r\n indent(sb, this.indentLevel);\r\n sb.push(\"interface \");\r\n sb.push(element.simpleName);\r\n sb.push(\" {\\n\");\r\n for (let member of members.values()) this.visitElement(member);\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n }\r\n\r\n visitClass(element: Class): void {\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"interface \");\r\n sb.push(element.simpleName);\r\n sb.push(\" {\\n\");\r\n // TODO\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n visitInterface(element: Interface): void {\r\n this.visitClass(element);\r\n }\r\n\r\n visitField(element: Field): void {\r\n // TODO\r\n }\r\n\r\n visitNamespace(element: Namespace): void {\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"interface \");\r\n sb.push(element.simpleName);\r\n sb.push(\" {\\n\");\r\n var members = element.members;\r\n if (members) {\r\n for (let member of members.values()) this.visitElement(member);\r\n }\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n typeToString(type: Type): string {\r\n switch (type.kind) {\r\n case TypeKind.I8: return \"byte\";\r\n case TypeKind.I16: return \"short\";\r\n case TypeKind.I32: return \"long\";\r\n case TypeKind.I64: return \"long long\";\r\n case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"long long\" : \"long\";\r\n case TypeKind.U8: return \"octet\";\r\n case TypeKind.U16: return \"unsigned short\";\r\n case TypeKind.U32: return \"unsigned long\";\r\n // ^ TODO: function types\r\n case TypeKind.U64: return \"unsigned long long\";\r\n case TypeKind.USIZE: return this.program.options.isWasm64 ? \"unsigned long long\" : \"unsigned long\";\r\n // ^ TODO: class types\r\n case TypeKind.BOOL: return \"boolean\";\r\n case TypeKind.F32: return \"unrestricted float\";\r\n case TypeKind.F64: return \"unrestricted double\";\r\n case TypeKind.VOID: return \"void\";\r\n default: {\r\n assert(false);\r\n return \"\";\r\n }\r\n }\r\n }\r\n\r\n build(): string {\r\n var sb = this.sb;\r\n sb.push(\"interface ASModule {\\n\");\r\n ++this.indentLevel;\r\n this.walk();\r\n --this.indentLevel;\r\n sb.push(\"}\\n\");\r\n return sb.join(\"\");\r\n }\r\n}\r\n\r\n/** A TypeScript definitions builder. */\r\nexport class TSDBuilder extends ExportsWalker {\r\n\r\n /** Builds TypeScript definitions for the specified program. */\r\n static build(program: Program): string {\r\n return new TSDBuilder(program).build();\r\n }\r\n\r\n private sb: string[] = [];\r\n private indentLevel: i32 = 0;\r\n\r\n /** Constructs a new WebIDL builder. */\r\n constructor(program: Program, includePrivate: bool = false) {\r\n super(program, includePrivate);\r\n }\r\n\r\n visitGlobal(element: Global): void {\r\n var sb = this.sb;\r\n var isConst = element.is(CommonFlags.INLINED);\r\n indent(sb, this.indentLevel);\r\n if (element.is(CommonFlags.STATIC)) {\r\n if (isConst) sb.push(\"static readonly \");\r\n else sb.push(\"static \");\r\n } else {\r\n if (isConst) sb.push(\"const \");\r\n else sb.push(\"var \");\r\n }\r\n sb.push(element.simpleName);\r\n sb.push(\": \");\r\n sb.push(this.typeToString(element.type));\r\n sb.push(\";\\n\");\r\n this.visitNamespace(element);\r\n }\r\n\r\n visitEnum(element: Enum): void {\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"enum \");\r\n sb.push(element.simpleName);\r\n sb.push(\" {\\n\");\r\n var members = element.members;\r\n if (members) {\r\n let numMembers = members.size;\r\n for (let [name, member] of members) {\r\n if (member.kind == ElementKind.ENUMVALUE) {\r\n indent(sb, this.indentLevel);\r\n sb.push(name);\r\n if (member.is(CommonFlags.INLINED)) {\r\n sb.push(\" = \");\r\n sb.push((member).constantValue.toString(10));\r\n }\r\n sb.push(\",\\n\");\r\n --numMembers;\r\n }\r\n }\r\n if (numMembers) this.visitNamespace(element);\r\n }\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n visitFunction(element: Function): void {\r\n if (element.isAny(CommonFlags.PRIVATE | CommonFlags.SET)) return;\r\n var sb = this.sb;\r\n var signature = element.signature;\r\n indent(sb, this.indentLevel);\r\n if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\r\n if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\r\n if (element.is(CommonFlags.GET)) {\r\n sb.push(element.prototype.declaration.name.text); // 'get:funcName' internally\r\n sb.push(\": \");\r\n sb.push(this.typeToString(signature.returnType));\r\n sb.push(\";\\n\");\r\n return;\r\n } else {\r\n if (!element.isAny(CommonFlags.STATIC | CommonFlags.INSTANCE)) sb.push(\"function \");\r\n sb.push(element.simpleName);\r\n }\r\n sb.push(\"(\");\r\n var parameters = signature.parameterTypes;\r\n var numParameters = parameters.length;\r\n // var requiredParameters = signature.requiredParameters;\r\n for (let i = 0; i < numParameters; ++i) {\r\n if (i) sb.push(\", \");\r\n // if (i >= requiredParameters) sb.push(\"optional \");\r\n sb.push(signature.getParameterName(i));\r\n sb.push(\": \");\r\n sb.push(this.typeToString(parameters[i]));\r\n }\r\n if (element.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.SET)) {\r\n sb.push(\")\");\r\n } else {\r\n sb.push(\"): \");\r\n sb.push(this.typeToString(signature.returnType));\r\n }\r\n sb.push(\";\\n\");\r\n this.visitNamespace(element);\r\n }\r\n\r\n visitClass(element: Class): void {\r\n var sb = this.sb;\r\n var isInterface = element.kind == ElementKind.INTERFACE;\r\n indent(sb, this.indentLevel++);\r\n if (isInterface) {\r\n sb.push(\"interface \");\r\n } else {\r\n if (element.is(CommonFlags.ABSTRACT)) sb.push(\"abstract \");\r\n sb.push(\"class \");\r\n }\r\n sb.push(element.simpleName);\r\n var base = element.base;\r\n if (base && base.is(CommonFlags.COMPILED | CommonFlags.MODULE_EXPORT)) {\r\n sb.push(\" extends \");\r\n sb.push(base.simpleName); // TODO: fqn\r\n }\r\n sb.push(\" {\\n\");\r\n var members = element.prototype.members; // static\r\n if (members) {\r\n for (let member of members.values()) {\r\n this.visitElement(member);\r\n }\r\n }\r\n var ctor = element.constructorInstance;\r\n if (ctor) this.visitFunction(ctor);\r\n members = element.members; // instance\r\n if (members) {\r\n for (let member of members.values()) this.visitElement(member);\r\n }\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n visitInterface(element: Interface): void {\r\n this.visitClass(element);\r\n }\r\n\r\n visitField(element: Field): void {\r\n if (element.is(CommonFlags.PRIVATE)) return;\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel);\r\n if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\r\n if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\r\n if (element.is(CommonFlags.READONLY)) sb.push(\"readonly \");\r\n sb.push(element.simpleName);\r\n sb.push(\": \");\r\n sb.push(this.typeToString(element.type));\r\n sb.push(\";\\n\");\r\n }\r\n\r\n visitNamespace(element: Element): void {\r\n var members = element.members;\r\n if (members && members.size) {\r\n let sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"namespace \");\r\n sb.push(element.simpleName);\r\n sb.push(\" {\\n\");\r\n for (let member of members.values()) this.visitElement(member);\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n }\r\n\r\n typeToString(type: Type): string {\r\n switch (type.kind) {\r\n case TypeKind.I8: return \"i8\";\r\n case TypeKind.I16: return \"i16\";\r\n case TypeKind.I32: return \"i32\";\r\n case TypeKind.I64: return \"I64\";\r\n case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"I64\" : \"i32\";\r\n case TypeKind.U8: return \"u8\";\r\n case TypeKind.U16: return \"u16\";\r\n case TypeKind.U32: return \"u32\";\r\n // ^ TODO: function types\r\n case TypeKind.U64: return \"U64\";\r\n case TypeKind.USIZE: return this.program.options.isWasm64 ? \"U64\" : \"u32\";\r\n // ^ TODO: class types\r\n case TypeKind.BOOL: return \"bool\";\r\n case TypeKind.F32: return \"f32\";\r\n case TypeKind.F64: return \"f64\";\r\n case TypeKind.V128: return \"v128\";\r\n case TypeKind.VOID: return \"void\";\r\n default: {\r\n assert(false);\r\n return \"\";\r\n }\r\n }\r\n }\r\n\r\n build(): string {\r\n var sb = this.sb;\r\n sb.push(\"declare module ASModule {\\n\");\r\n sb.push(\" type i8 = number;\\n\");\r\n sb.push(\" type i16 = number;\\n\");\r\n sb.push(\" type i32 = number;\\n\");\r\n sb.push(\" type u8 = number;\\n\");\r\n sb.push(\" type u16 = number;\\n\");\r\n sb.push(\" type u32 = number;\\n\");\r\n sb.push(\" type f32 = number;\\n\");\r\n sb.push(\" type f64 = number;\\n\");\r\n sb.push(\" type bool = any;\\n\");\r\n ++this.indentLevel;\r\n this.walk();\r\n --this.indentLevel;\r\n sb.push(\"}\\n\");\r\n sb.push(\"export default ASModule;\\n\");\r\n return this.sb.join(\"\");\r\n }\r\n}\r\n\r\n// helpers\r\n\r\n/** Tests if a namespace-like element has at least one compiled member. */\r\nfunction hasCompiledMember(element: Element): bool {\r\n var members = element.members;\r\n if (members) {\r\n for (let member of members.values()) {\r\n switch (member.kind) {\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n for (let instances of (member).instances.values()) {\r\n for (let instance of instances.values()) {\r\n if (instance.is(CommonFlags.COMPILED)) return true;\r\n }\r\n }\r\n break;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n for (let instance of (member).instances.values()) {\r\n if (instance.is(CommonFlags.COMPILED)) return true;\r\n }\r\n break;\r\n }\r\n default: {\r\n if (member.is(CommonFlags.COMPILED) || hasCompiledMember(member)) return true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n","/**\r\n * A TypeScript parser for the AssemblyScript subset.\r\n * @module parser\r\n *//***/\r\n\r\nimport {\r\n CommonFlags,\r\n LIBRARY_PREFIX,\r\n PATH_DELIMITER\r\n} from \"./common\";\r\n\r\nimport {\r\n Program\r\n} from \"./program\";\r\n\r\nimport {\r\n Tokenizer,\r\n Token,\r\n Range,\r\n CommentHandler,\r\n IdentifierHandling\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n normalizePath\r\n} from \"./util\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n Source,\r\n SourceKind,\r\n CommonTypeNode,\r\n TypeNode,\r\n SignatureNode,\r\n\r\n Expression,\r\n AssertionKind,\r\n CallExpression,\r\n ClassExpression,\r\n FunctionExpression,\r\n IdentifierExpression,\r\n StringLiteralExpression,\r\n\r\n Statement,\r\n BlockStatement,\r\n BreakStatement,\r\n ClassDeclaration,\r\n ContinueStatement,\r\n DeclarationStatement,\r\n DecoratorNode,\r\n DoStatement,\r\n EnumDeclaration,\r\n EnumValueDeclaration,\r\n ExportImportStatement,\r\n ExportMember,\r\n ExportStatement,\r\n ExpressionStatement,\r\n ForStatement,\r\n FunctionDeclaration,\r\n IfStatement,\r\n ImportDeclaration,\r\n ImportStatement,\r\n NamespaceDeclaration,\r\n ParameterNode,\r\n ParameterKind,\r\n ReturnStatement,\r\n SwitchCase,\r\n SwitchStatement,\r\n ThrowStatement,\r\n TryStatement,\r\n TypeDeclaration,\r\n TypeParameterNode,\r\n VariableStatement,\r\n VariableDeclaration,\r\n VoidStatement,\r\n WhileStatement,\r\n\r\n mangleInternalPath,\r\n nodeIsCallable,\r\n nodeIsGenericCallable,\r\n IndexSignatureDeclaration\r\n} from \"./ast\";\r\n\r\n/** Parser interface. */\r\nexport class Parser extends DiagnosticEmitter {\r\n\r\n /** Program being created. */\r\n program: Program;\r\n /** Source file names to be requested next. */\r\n backlog: string[] = new Array();\r\n /** Source file names already seen, that is processed or backlogged. */\r\n seenlog: Set = new Set();\r\n /** Source file names already completely processed. */\r\n donelog: Set = new Set();\r\n /** Optional handler to intercept comments while tokenizing. */\r\n onComment: CommentHandler | null = null;\r\n\r\n /** Constructs a new parser. */\r\n constructor() {\r\n super();\r\n this.program = new Program(this.diagnostics);\r\n }\r\n\r\n /** Parses a file and adds its definitions to the program. */\r\n parseFile(\r\n text: string,\r\n path: string,\r\n isEntry: bool\r\n ): void {\r\n var normalizedPath = normalizePath(path);\r\n var internalPath = mangleInternalPath(normalizedPath);\r\n\r\n // check if already processed\r\n if (this.donelog.has(internalPath)) return;\r\n this.donelog.add(internalPath); // do not parse again\r\n this.seenlog.add(internalPath); // do not request again\r\n\r\n // create the source element\r\n var source = new Source(\r\n normalizedPath,\r\n text,\r\n isEntry\r\n ? SourceKind.ENTRY\r\n : path.startsWith(LIBRARY_PREFIX) && path.indexOf(PATH_DELIMITER, LIBRARY_PREFIX.length) < 0\r\n ? SourceKind.LIBRARY\r\n : SourceKind.DEFAULT\r\n );\r\n var program = this.program;\r\n program.sources.push(source);\r\n\r\n // tokenize and parse\r\n var tn = new Tokenizer(source, program.diagnostics);\r\n tn.onComment = this.onComment;\r\n source.tokenizer = tn;\r\n var statements = source.statements;\r\n while (!tn.skip(Token.ENDOFFILE)) {\r\n let statement = this.parseTopLevelStatement(tn);\r\n if (statement) {\r\n statement.parent = source;\r\n statements.push(statement);\r\n }\r\n }\r\n tn.finish();\r\n }\r\n\r\n /** Parses a top-level statement. */\r\n parseTopLevelStatement(\r\n tn: Tokenizer,\r\n namespace: Node | null = null\r\n ): Statement | null {\r\n var flags = CommonFlags.NONE;\r\n var startPos: i32 = -1;\r\n\r\n // check decorators\r\n var decorators: DecoratorNode[] | null = null;\r\n while (tn.skip(Token.AT)) {\r\n if (startPos < 0) startPos = tn.tokenPos;\r\n let decorator = this.parseDecorator(tn);\r\n if (!decorator) {\r\n this.skipStatement(tn);\r\n continue;\r\n }\r\n if (!decorators) decorators = [];\r\n decorators.push(decorator);\r\n }\r\n\r\n // check modifiers\r\n var exportStart: i32 = 0;\r\n var exportEnd: i32 = 0;\r\n if (tn.skip(Token.EXPORT)) {\r\n if (tn.skip(Token.DEFAULT)) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n tn.range()\r\n );\r\n }\r\n if (startPos < 0) startPos = tn.tokenPos;\r\n flags |= CommonFlags.EXPORT;\r\n exportStart = tn.tokenPos;\r\n exportEnd = tn.pos;\r\n }\r\n\r\n var declareStart: i32 = 0;\r\n var declareEnd: i32 = 0;\r\n var contextIsAmbient = namespace != null && namespace.is(CommonFlags.AMBIENT);\r\n if (tn.skip(Token.DECLARE)) {\r\n if (startPos < 0) startPos = tn.tokenPos;\r\n if (contextIsAmbient) {\r\n this.error(\r\n DiagnosticCode.A_declare_modifier_cannot_be_used_in_an_already_ambient_context,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n flags |= CommonFlags.DECLARE | CommonFlags.AMBIENT;\r\n } else if (contextIsAmbient) {\r\n flags |= CommonFlags.AMBIENT;\r\n }\r\n\r\n // parse the statement\r\n var statement: Statement | null = null;\r\n\r\n // handle declarations\r\n var first = tn.peek();\r\n if (startPos < 0) startPos = tn.nextTokenPos;\r\n switch (first) {\r\n case Token.CONST: {\r\n tn.next();\r\n flags |= CommonFlags.CONST;\r\n if (tn.skip(Token.ENUM)) {\r\n statement = this.parseEnum(tn, flags, decorators, startPos);\r\n break;\r\n } else {\r\n statement = this.parseVariable(tn, flags, decorators, startPos);\r\n decorators = null;\r\n }\r\n break;\r\n }\r\n case Token.LET: flags |= CommonFlags.LET;\r\n case Token.VAR: {\r\n tn.next();\r\n statement = this.parseVariable(tn, flags, decorators, startPos);\r\n decorators = null;\r\n break;\r\n }\r\n case Token.ENUM: {\r\n tn.next();\r\n statement = this.parseEnum(tn, flags, decorators, startPos);\r\n decorators = null;\r\n break;\r\n }\r\n case Token.FUNCTION: {\r\n tn.next();\r\n statement = this.parseFunction(tn, flags, decorators, startPos);\r\n decorators = null;\r\n break;\r\n }\r\n case Token.ABSTRACT: {\r\n let state = tn.mark();\r\n tn.next();\r\n if (!tn.skip(Token.CLASS)) {\r\n tn.reset(state);\r\n statement = this.parseStatement(tn, true);\r\n break;\r\n } else {\r\n tn.discard(state);\r\n }\r\n flags |= CommonFlags.ABSTRACT;\r\n // fall through\r\n }\r\n case Token.CLASS:\r\n case Token.INTERFACE: {\r\n tn.next();\r\n statement = this.parseClassOrInterface(tn, flags, decorators, startPos);\r\n decorators = null;\r\n break;\r\n }\r\n case Token.NAMESPACE: {\r\n let state = tn.mark();\r\n tn.next();\r\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n tn.discard(state);\r\n statement = this.parseNamespace(tn, flags, decorators, startPos);\r\n decorators = null;\r\n } else {\r\n tn.reset(state);\r\n statement = this.parseStatement(tn, true);\r\n }\r\n break;\r\n }\r\n case Token.IMPORT: {\r\n tn.next();\r\n flags |= CommonFlags.IMPORT;\r\n if (flags & CommonFlags.EXPORT) {\r\n statement = this.parseExportImport(tn, startPos);\r\n } else {\r\n statement = this.parseImport(tn);\r\n }\r\n break;\r\n }\r\n case Token.TYPE: { // also identifier\r\n let state = tn.mark();\r\n tn.next();\r\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n tn.discard(state);\r\n statement = this.parseTypeDeclaration(tn, flags, decorators, startPos);\r\n decorators = null;\r\n } else {\r\n tn.reset(state);\r\n statement = this.parseStatement(tn, true);\r\n }\r\n break;\r\n }\r\n default: {\r\n\r\n // handle plain exports\r\n if (flags & CommonFlags.EXPORT) {\r\n statement = this.parseExport(tn, flags, startPos);\r\n\r\n // handle non-declaration statements\r\n } else {\r\n if (exportEnd) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(exportStart, exportEnd), \"export\"\r\n ); // recoverable\r\n }\r\n if (declareEnd) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(declareStart, declareEnd), \"declare\"\r\n ); // recoverable\r\n }\r\n if (!namespace) {\r\n statement = this.parseStatement(tn, true);\r\n } // TODO: else?\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // check for decorators that weren't consumed\r\n if (decorators) {\r\n for (let i = 0, k = decorators.length; i < k; ++i) {\r\n this.error(\r\n DiagnosticCode.Decorators_are_not_valid_here,\r\n decorators[i].range\r\n );\r\n }\r\n }\r\n return statement;\r\n }\r\n\r\n /** Obtains the next file to parse. */\r\n nextFile(): string | null {\r\n var backlog = this.backlog;\r\n return backlog.length ? backlog.shift() : null;\r\n }\r\n\r\n /** Finishes parsing and returns the program. */\r\n finish(): Program {\r\n if (this.backlog.length) throw new Error(\"backlog is not empty\");\r\n this.backlog = [];\r\n this.seenlog.clear();\r\n this.donelog.clear();\r\n return this.program;\r\n }\r\n\r\n /** Parses a type. */\r\n parseType(\r\n tn: Tokenizer,\r\n acceptParenthesized: bool = true,\r\n suppressErrors: bool = false\r\n ): CommonTypeNode | null {\r\n\r\n // NOTE: this parses our limited subset\r\n var token = tn.next();\r\n var startPos = tn.tokenPos;\r\n\r\n var type: CommonTypeNode;\r\n\r\n // '(' ...\r\n if (token == Token.OPENPAREN) {\r\n\r\n // '(' FunctionSignature ')' '|' 'null'?\r\n let isNullableSignature = tn.skip(Token.OPENPAREN);\r\n // FunctionSignature?\r\n let signature = this.tryParseSignature(tn);\r\n if (signature) {\r\n if (isNullableSignature) {\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.BAR)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"|\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.NULL)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"null\"\r\n );\r\n }\r\n signature.isNullable = true;\r\n }\r\n return signature;\r\n } else if (isNullableSignature || this.tryParseSignatureIsSignature) {\r\n this.error(\r\n DiagnosticCode.Unexpected_token,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n\r\n // Type (',' Type)* ')'\r\n if (acceptParenthesized) {\r\n let innerType = this.parseType(tn, false, suppressErrors);\r\n if (!innerType) return null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"}\"\r\n );\r\n }\r\n return null;\r\n }\r\n type = innerType;\r\n type.range.start = startPos;\r\n type.range.end = tn.pos;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Unexpected_token,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n\r\n // 'void'\r\n } else if (token == Token.VOID) {\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"void\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // 'this'\r\n } else if (token == Token.THIS) {\r\n type = Node.createType(\r\n Node.createThisExpression(tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // 'true'\r\n } else if (token == Token.TRUE || token == Token.FALSE) {\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"bool\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // StringLiteral\r\n } else if (token == Token.STRINGLITERAL) {\r\n tn.readString();\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"string\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // Identifier\r\n } else if (token == Token.IDENTIFIER) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let parameters = new Array();\r\n let nullable = false;\r\n\r\n // Identifier ('.' Identifier)+\r\n while (tn.skip(Token.DOT)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n // TODO: this works for now, but the representation isn't great\r\n identifier = Node.createIdentifierExpression(\r\n identifier.text + \".\" + tn.readIdentifier(),\r\n tn.range(identifier.range.start, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range(tn.pos)\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n // Name\r\n if (tn.skip(Token.LESSTHAN)) {\r\n do {\r\n let parameter = this.parseType(tn, true, suppressErrors);\r\n if (!parameter) return null;\r\n parameters.push(parameter);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \">\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n // ... | null\r\n while (tn.skip(Token.BAR)) {\r\n if (tn.skip(Token.NULL)) {\r\n nullable = true;\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"null\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n type = Node.createType(identifier, parameters, nullable, tn.range(startPos, tn.pos));\r\n\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n // ... [][]\r\n while (tn.skip(Token.OPENBRACKET)) {\r\n let bracketStart = tn.tokenPos;\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n }\r\n return null;\r\n }\r\n let bracketRange = tn.range(bracketStart, tn.pos);\r\n\r\n // ...[] | null\r\n let nullable = false;\r\n if (tn.skip(Token.BAR)) {\r\n if (tn.skip(Token.NULL)) {\r\n nullable = true;\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"null\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n type = Node.createType(\r\n Node.createIdentifierExpression(\"Array\", bracketRange),\r\n [ type ],\r\n nullable,\r\n tn.range(startPos, tn.pos)\r\n );\r\n if (nullable) break;\r\n }\r\n\r\n return type;\r\n }\r\n\r\n // Indicates whether tryParseSignature determined that it is handling a Signature\r\n private tryParseSignatureIsSignature: bool = false;\r\n\r\n /** Parses a function signature, as used in type declarations. */\r\n tryParseSignature(\r\n tn: Tokenizer\r\n ): SignatureNode | null {\r\n\r\n // at '(': ('...'? Identifier '?'? ':' Type (',' '...'? Identifier '?'? ':' Type)* )? ')' '=>' Type\r\n\r\n var state = tn.mark();\r\n var startPos = tn.tokenPos;\r\n var parameters: ParameterNode[] | null = null;\r\n var thisType: TypeNode | null = null;\r\n var isSignature: bool = false;\r\n\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n parameters = [];\r\n\r\n } else {\r\n isSignature = false; // not yet known\r\n do {\r\n let kind = ParameterKind.DEFAULT;\r\n if (tn.skip(Token.DOT_DOT_DOT)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n kind = ParameterKind.REST;\r\n }\r\n if (tn.skip(Token.THIS)) {\r\n if (tn.skip(Token.COLON)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n let t = this.parseType(tn, false);\r\n if (!t) return null;\r\n if (t.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n t.range\r\n );\r\n this.tryParseSignatureIsSignature = true;\r\n return null;\r\n }\r\n thisType = t;\r\n } else {\r\n tn.reset(state);\r\n this.tryParseSignatureIsSignature = false;\r\n return null;\r\n }\r\n } else if (tn.skipIdentifier()) {\r\n let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range(tn.tokenPos, tn.pos));\r\n if (tn.skip(Token.QUESTION)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n if (kind == ParameterKind.REST) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\r\n tn.range()\r\n ); // recoverable\r\n } else {\r\n kind = ParameterKind.OPTIONAL;\r\n }\r\n }\r\n if (tn.skip(Token.COLON)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n let type = this.parseType(tn); // not suppressing errors because known\r\n if (!type) {\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n let param = new ParameterNode();\r\n param.parameterKind = kind;\r\n param.name = name;\r\n param.type = type;\r\n if (!parameters) parameters = [ param ];\r\n else parameters.push(param);\r\n } else {\r\n if (isSignature) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n }\r\n } else {\r\n if (isSignature) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n } else {\r\n tn.reset(state);\r\n }\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n if (isSignature) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n } else {\r\n tn.reset(state);\r\n }\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n }\r\n\r\n var returnType: CommonTypeNode | null;\r\n if (tn.skip(Token.EQUALS_GREATERTHAN)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n returnType = this.parseType(tn);\r\n if (!returnType) {\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n } else {\r\n if (isSignature) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=>\"\r\n );\r\n } else {\r\n tn.reset(state);\r\n }\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n this.tryParseSignatureIsSignature = true;\r\n return Node.createSignature(\r\n parameters || [],\r\n returnType,\r\n thisType,\r\n false,\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n\r\n // statements\r\n\r\n parseDecorator(\r\n tn: Tokenizer\r\n ): DecoratorNode | null {\r\n\r\n // at '@': Identifier ('.' Identifier)* '(' Arguments\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skipIdentifier()) {\r\n let name = tn.readIdentifier();\r\n let expression: Expression = Node.createIdentifierExpression(name, tn.range(startPos, tn.pos));\r\n while (tn.skip(Token.DOT)) {\r\n if (tn.skipIdentifier()) {\r\n name = tn.readIdentifier();\r\n expression = Node.createPropertyAccessExpression(\r\n expression,\r\n Node.createIdentifierExpression(name, tn.range()),\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n let args: Expression[] | null;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n args = this.parseArguments(tn);\r\n if (args) {\r\n return Node.createDecorator(expression, args, tn.range(startPos, tn.pos));\r\n }\r\n } else {\r\n return Node.createDecorator(expression, null, tn.range(startPos, tn.pos));\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseVariable(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): VariableStatement | null {\r\n\r\n // at ('const' | 'let' | 'var'): VariableDeclaration (',' VariableDeclaration)* ';'?\r\n\r\n var members = new Array();\r\n do {\r\n let member = this.parseVariableDeclaration(tn, flags, decorators);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (tn.skip(Token.COMMA));\r\n\r\n var ret = Node.createVariableStatement(members, decorators, flags, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseVariableDeclaration(\r\n tn: Tokenizer,\r\n parentFlags: CommonFlags,\r\n parentDecorators: DecoratorNode[] | null\r\n ): VariableDeclaration | null {\r\n\r\n // before: Identifier (':' Type)? ('=' Expression)?\r\n\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var flags = parentFlags;\r\n if (tn.skip(Token.EXCLAMATION)) {\r\n flags |= CommonFlags.DEFINITE_ASSIGNMENT;\r\n }\r\n\r\n var type: CommonTypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n }\r\n\r\n var initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n if (flags & CommonFlags.AMBIENT) {\r\n this.error(\r\n DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!initializer) return null;\r\n } else {\r\n if (flags & CommonFlags.CONST) {\r\n if (!(flags & CommonFlags.AMBIENT)) {\r\n this.error(\r\n DiagnosticCode._const_declarations_must_be_initialized,\r\n identifier.range\r\n ); // recoverable\r\n }\r\n } else if (!type) { // neither type nor initializer\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range(tn.pos)\r\n ); // recoverable\r\n }\r\n }\r\n var range = Range.join(identifier.range, tn.range());\r\n if ((flags & CommonFlags.DEFINITE_ASSIGNMENT) && initializer) {\r\n this.error(\r\n DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,\r\n range);\r\n }\r\n return Node.createVariableDeclaration(\r\n identifier,\r\n type,\r\n initializer,\r\n parentDecorators,\r\n flags,\r\n range\r\n );\r\n }\r\n\r\n parseEnum(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): EnumDeclaration | null {\r\n\r\n // at 'enum': Identifier '{' (EnumValueDeclaration (',' EnumValueDeclaration )*)? '}' ';'?\r\n\r\n if (tn.next() != Token.IDENTIFIER) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.next() != Token.OPENBRACE) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n var members = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let member = this.parseEnumValue(tn, CommonFlags.NONE);\r\n if (!member) return null;\r\n members.push(member);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACE)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n var ret = Node.createEnumDeclaration(\r\n identifier,\r\n members,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseEnumValue(\r\n tn: Tokenizer,\r\n parentFlags: CommonFlags\r\n ): EnumValueDeclaration | null {\r\n\r\n // before: Identifier ('=' Expression)?\r\n\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var value: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n value = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!value) return null;\r\n }\r\n return Node.createEnumValueDeclaration(\r\n identifier,\r\n value,\r\n parentFlags,\r\n Range.join(identifier.range, tn.range())\r\n );\r\n }\r\n\r\n parseReturn(\r\n tn: Tokenizer\r\n ): ReturnStatement | null {\r\n\r\n // at 'return': Expression | (';' | '}' | ...'\\n')\r\n\r\n var expr: Expression | null = null;\r\n if (\r\n tn.peek(true) != Token.SEMICOLON &&\r\n tn.nextToken != Token.CLOSEBRACE &&\r\n !tn.nextTokenOnNewLine\r\n ) {\r\n if (!(expr = this.parseExpression(tn))) return null;\r\n }\r\n\r\n var ret = Node.createReturnStatement(expr, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseTypeParameters(\r\n tn: Tokenizer\r\n ): TypeParameterNode[] | null {\r\n\r\n // at '<': TypeParameter (',' TypeParameter)* '>'\r\n\r\n var typeParameters = new Array();\r\n var seenOptional = false;\r\n while (!tn.skip(Token.GREATERTHAN)) {\r\n let typeParameter = this.parseTypeParameter(tn);\r\n if (!typeParameter) return null;\r\n if (typeParameter.defaultType !== null) {\r\n seenOptional = true;\r\n } else if (seenOptional) {\r\n this.error(\r\n DiagnosticCode.Required_type_parameters_may_not_follow_optional_type_parameters,\r\n typeParameter.range\r\n );\r\n typeParameter.defaultType = null;\r\n }\r\n typeParameters.push(typeParameter);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.GREATERTHAN)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \">\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n if (typeParameters.length === 0) {\r\n this.error(\r\n DiagnosticCode.Type_parameter_list_cannot_be_empty,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n return typeParameters;\r\n }\r\n\r\n parseTypeParameter(\r\n tn: Tokenizer\r\n ): TypeParameterNode | null {\r\n\r\n // before: Identifier ('extends' Type)? ('=' Type)?\r\n\r\n if (tn.next() == Token.IDENTIFIER) {\r\n let identifier = Node.createIdentifierExpression(\r\n tn.readIdentifier(),\r\n tn.range()\r\n );\r\n let extendsType: TypeNode | null = null;\r\n if (tn.skip(Token.EXTENDS)) {\r\n let t = this.parseType(tn);\r\n if (!t) return null;\r\n if (t.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n t.range\r\n );\r\n return null;\r\n }\r\n extendsType = t;\r\n }\r\n let defaultType: TypeNode | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n let t = this.parseType(tn);\r\n if (!t) return null;\r\n if (t.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n t.range\r\n );\r\n return null;\r\n }\r\n defaultType = t;\r\n }\r\n return Node.createTypeParameter(\r\n identifier,\r\n extendsType,\r\n defaultType,\r\n Range.join(identifier.range, tn.range())\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private parseParametersThis: TypeNode | null = null;\r\n\r\n parseParameters(\r\n tn: Tokenizer,\r\n isConstructor: bool = false\r\n ): ParameterNode[] | null {\r\n\r\n // at '(': (Parameter (',' Parameter)*)? ')'\r\n\r\n var parameters = new Array();\r\n var seenRest: ParameterNode | null = null;\r\n var seenOptional = false;\r\n var reportedRest = false;\r\n var thisType: CommonTypeNode | null = null;\r\n\r\n // check if there is a leading `this` parameter\r\n this.parseParametersThis = null;\r\n if (tn.skip(Token.THIS)) {\r\n if (tn.skip(Token.COLON)) {\r\n thisType = this.parseType(tn); // reports\r\n if (!thisType) return null;\r\n if (thisType.kind == NodeKind.TYPE) {\r\n this.parseParametersThis = thisType;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n thisType.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n return parameters;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n while (!tn.skip(Token.CLOSEPAREN)) {\r\n let param = this.parseParameter(tn, isConstructor); // reports\r\n if (!param) return null;\r\n if (seenRest && !reportedRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,\r\n seenRest.name.range\r\n );\r\n reportedRest = true;\r\n }\r\n switch (param.parameterKind) {\r\n default: {\r\n if (seenOptional) {\r\n this.error(\r\n DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,\r\n param.name.range\r\n );\r\n }\r\n break;\r\n }\r\n case ParameterKind.OPTIONAL: {\r\n seenOptional = true;\r\n break;\r\n }\r\n case ParameterKind.REST: {\r\n seenRest = param;\r\n break;\r\n }\r\n }\r\n parameters.push(param);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n return parameters;\r\n }\r\n\r\n parseParameter(\r\n tn: Tokenizer,\r\n isConstructor: bool = false\r\n ): ParameterNode | null {\r\n\r\n // before: ('public' | 'private' | 'protected' | '...')? Identifier '?'? (':' Type)? ('=' Expression)?\r\n\r\n var isRest = false;\r\n var isOptional = false;\r\n var startRange: Range | null = null;\r\n var accessFlags: CommonFlags = CommonFlags.NONE;\r\n if (isConstructor) {\r\n if (tn.skip(Token.PUBLIC)) {\r\n startRange = tn.range();\r\n accessFlags |= CommonFlags.PUBLIC;\r\n } else if (tn.skip(Token.PROTECTED)) {\r\n startRange = tn.range();\r\n accessFlags |= CommonFlags.PROTECTED;\r\n } else if (tn.skip(Token.PRIVATE)) {\r\n startRange = tn.range();\r\n accessFlags |= CommonFlags.PRIVATE;\r\n }\r\n if (tn.peek() == Token.READONLY) {\r\n let state = tn.mark();\r\n tn.next();\r\n if (tn.peek() != Token.COLON) { // modifier\r\n tn.discard(state);\r\n if (!startRange) startRange = tn.range();\r\n accessFlags |= CommonFlags.READONLY;\r\n } else { // identifier\r\n tn.reset(state);\r\n }\r\n }\r\n }\r\n if (tn.skip(Token.DOT_DOT_DOT)) {\r\n if (accessFlags) {\r\n this.error(\r\n DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,\r\n tn.range()\r\n );\r\n } else {\r\n startRange = tn.range();\r\n }\r\n isRest = true;\r\n }\r\n if (tn.skipIdentifier()) {\r\n if (!isRest) startRange = tn.range();\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let type: CommonTypeNode | null = null;\r\n if (isOptional = tn.skip(Token.QUESTION)) {\r\n if (isRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\r\n identifier.range\r\n );\r\n }\r\n }\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type) return null;\r\n } else {\r\n type = Node.createOmittedType(tn.range(tn.pos));\r\n }\r\n let initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n if (isRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,\r\n identifier.range\r\n );\r\n }\r\n if (isOptional) {\r\n this.error(\r\n DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,\r\n identifier.range\r\n );\r\n } else {\r\n isOptional = true;\r\n }\r\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!initializer) return null;\r\n }\r\n let param = Node.createParameter(\r\n identifier,\r\n type,\r\n initializer,\r\n isRest\r\n ? ParameterKind.REST\r\n : isOptional\r\n ? ParameterKind.OPTIONAL\r\n : ParameterKind.DEFAULT,\r\n Range.join(startRange, tn.range())\r\n );\r\n param.flags |= accessFlags;\r\n return param;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseFunction(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): FunctionDeclaration | null {\r\n\r\n // at 'function':\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // '(' Parameters (':' Type)?\r\n // '{' Statement* '}'\r\n // ';'?\r\n\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range(tn.pos)\r\n );\r\n return null;\r\n }\r\n\r\n var name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var signatureStart: i32 = -1;\r\n\r\n var typeParameters: TypeParameterNode[] | null = null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n signatureStart = tn.tokenPos;\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n flags |= CommonFlags.GENERIC;\r\n }\r\n\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"(\"\r\n );\r\n return null;\r\n }\r\n\r\n if (signatureStart < 0) {\r\n signatureStart = tn.tokenPos;\r\n }\r\n\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters) return null;\r\n var thisType = this.parseParametersThis;\r\n\r\n var isSetter = (flags & CommonFlags.SET) != 0;\r\n if (isSetter) {\r\n if (parameters.length != 1) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n name.range\r\n ); // recoverable\r\n }\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n name.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n if (flags & CommonFlags.GET) {\r\n if (parameters.length) {\r\n this.error(\r\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n name.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n var returnType: CommonTypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n returnType = this.parseType(tn, true, isSetter);\r\n if (!returnType) return null;\r\n }\r\n\r\n if (!returnType) {\r\n returnType = Node.createOmittedType(\r\n tn.range(tn.pos)\r\n );\r\n if (!isSetter) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n returnType.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n var signature = Node.createSignature(\r\n parameters,\r\n returnType,\r\n thisType,\r\n false,\r\n tn.range(signatureStart, tn.pos)\r\n );\r\n\r\n var body: Statement | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n if (flags & CommonFlags.AMBIENT) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n\r\n body = this.parseBlockStatement(tn, false);\r\n if (!body) return null;\r\n } else if (!(flags & CommonFlags.AMBIENT)) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n tn.range(tn.pos)\r\n );\r\n }\r\n\r\n var ret = Node.createFunctionDeclaration(\r\n name,\r\n typeParameters,\r\n signature,\r\n body,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseFunctionExpression(tn: Tokenizer): FunctionExpression | null {\r\n var startPos = tn.tokenPos;\r\n var name: IdentifierExpression;\r\n var isArrow = false;\r\n\r\n // either at 'function':\r\n // Identifier?\r\n // '(' Parameters (':' Type)?\r\n // Statement\r\n\r\n if (tn.token == Token.FUNCTION) {\r\n if (tn.skipIdentifier()) {\r\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else { // empty name\r\n name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\r\n }\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"(\"\r\n );\r\n return null;\r\n }\r\n\r\n // or at '(' of arrow function:\r\n // Parameters (':' Type)?\r\n // Statement\r\n\r\n } else {\r\n isArrow = true;\r\n assert(tn.token == Token.OPENPAREN);\r\n name = Node.createEmptyIdentifierExpression(tn.range(tn.tokenPos));\r\n }\r\n\r\n // TODO: type parameters? doesn't seem worth it.\r\n\r\n var signatureStart = tn.pos;\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters) return null;\r\n\r\n return this.parseFunctionExpressionCommon(tn, name, parameters, isArrow, startPos, signatureStart);\r\n }\r\n\r\n private parseFunctionExpressionCommon(\r\n tn: Tokenizer,\r\n name: IdentifierExpression,\r\n parameters: ParameterNode[],\r\n isArrow: bool,\r\n startPos: i32 = -1,\r\n signatureStart: i32 = -1\r\n ): FunctionExpression | null {\r\n if (startPos < 0) startPos = name.range.start;\r\n if (signatureStart < 0) signatureStart = startPos;\r\n\r\n var returnType: CommonTypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n returnType = this.parseType(tn);\r\n if (!returnType) return null;\r\n } else {\r\n returnType = Node.createOmittedType(tn.range(tn.pos));\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n returnType.range\r\n ); // recoverable\r\n }\r\n\r\n if (isArrow) {\r\n if (!tn.skip(Token.EQUALS_GREATERTHAN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"=>\"\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n var signature = Node.createSignature(\r\n parameters,\r\n returnType,\r\n null, // TODO?\r\n false,\r\n tn.range(signatureStart, tn.pos)\r\n );\r\n\r\n var body: Statement | null;\r\n if (isArrow) {\r\n body = this.parseStatement(tn, false);\r\n } else {\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"{\"\r\n );\r\n return null;\r\n }\r\n body = this.parseBlockStatement(tn, false);\r\n }\r\n if (!body) return null;\r\n\r\n var declaration = Node.createFunctionDeclaration(\r\n name,\r\n null,\r\n signature,\r\n body,\r\n null,\r\n isArrow ? CommonFlags.ARROW : CommonFlags.NONE,\r\n tn.range(startPos, tn.pos)\r\n );\r\n return Node.createFunctionExpression(declaration);\r\n }\r\n\r\n parseClassOrInterface(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): ClassDeclaration | null {\r\n\r\n // at ('class' | 'interface'):\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // ('extends' Type)?\r\n // ('implements' Type (',' Type)*)?\r\n // '{' ClassMember* '}'\r\n\r\n var isInterface = tn.token == Token.INTERFACE;\r\n\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n\r\n var identifier = Node.createIdentifierExpression(\r\n tn.readIdentifier(),\r\n tn.range()\r\n );\r\n\r\n var typeParameters: TypeParameterNode[] | null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n flags |= CommonFlags.GENERIC;\r\n } else {\r\n typeParameters = [];\r\n }\r\n\r\n var extendsType: TypeNode | null = null;\r\n if (tn.skip(Token.EXTENDS)) {\r\n let t = this.parseType(tn);\r\n if (!t) return null;\r\n if (t.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n t.range\r\n );\r\n return null;\r\n }\r\n extendsType = t;\r\n }\r\n\r\n var implementsTypes: TypeNode[] | null = null;\r\n if (tn.skip(Token.IMPLEMENTS)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode.Interface_declaration_cannot_have_implements_clause,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n do {\r\n let type = this.parseType(tn);\r\n if (!type) return null;\r\n if (!isInterface) {\r\n if (!implementsTypes) implementsTypes = [];\r\n implementsTypes.push(type);\r\n }\r\n } while (tn.skip(Token.COMMA));\r\n }\r\n\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n\r\n var members = new Array();\r\n var declaration: ClassDeclaration;\r\n if (isInterface) {\r\n assert(!implementsTypes);\r\n declaration = Node.createInterfaceDeclaration(\r\n identifier,\r\n typeParameters,\r\n extendsType,\r\n members,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n declaration = Node.createClassDeclaration(\r\n identifier,\r\n typeParameters,\r\n extendsType,\r\n implementsTypes,\r\n members,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n do {\r\n let member = this.parseClassMember(tn, declaration);\r\n if (!member) return null;\r\n member.parent = declaration;\r\n members.push(member);\r\n } while (!tn.skip(Token.CLOSEBRACE));\r\n }\r\n return declaration;\r\n }\r\n\r\n parseClassExpression(tn: Tokenizer): ClassExpression | null {\r\n\r\n // at 'class': Identifier? '{' ... '}'\r\n\r\n var startPos = tn.tokenPos;\r\n var name: IdentifierExpression;\r\n\r\n if (tn.skipIdentifier()) {\r\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\r\n }\r\n\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"{\"\r\n );\r\n return null;\r\n }\r\n\r\n var members = new Array();\r\n var declaration = Node.createClassDeclaration(\r\n name,\r\n [],\r\n null,\r\n null,\r\n members,\r\n null,\r\n CommonFlags.NONE,\r\n tn.range(startPos, tn.pos)\r\n );\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n do {\r\n let member = this.parseClassMember(tn, declaration);\r\n if (!member) return null;\r\n member.parent = declaration;\r\n members.push(member);\r\n } while (!tn.skip(Token.CLOSEBRACE));\r\n }\r\n return Node.createClassExpression(declaration);\r\n }\r\n\r\n parseClassMember(\r\n tn: Tokenizer,\r\n parent: ClassDeclaration\r\n ): DeclarationStatement | null {\r\n\r\n // before:\r\n // ('public' | 'private' | 'protected')?\r\n // ('static' | 'abstract')?\r\n // 'readonly'?\r\n // ('get' | 'set')?\r\n // Identifier ...\r\n\r\n var startPos = tn.pos;\r\n var isInterface = parent.kind == NodeKind.INTERFACEDECLARATION;\r\n\r\n var decorators = new Array();\r\n if (tn.skip(Token.AT)) {\r\n do {\r\n let decorator = this.parseDecorator(tn);\r\n if (!decorator) break;\r\n decorators.push(decorator);\r\n } while (tn.skip(Token.AT));\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode.Decorators_are_not_valid_here,\r\n Range.join(decorators[0].range, decorators[decorators.length - 1].range)\r\n );\r\n }\r\n }\r\n\r\n // inherit ambient status\r\n var flags = parent.flags & CommonFlags.AMBIENT;\r\n\r\n // implemented methods are virtual\r\n if (isInterface) flags |= CommonFlags.VIRTUAL;\r\n\r\n var accessStart = 0;\r\n var accessEnd = 0;\r\n if (tn.skip(Token.PUBLIC)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"public\"\r\n );\r\n }\r\n flags |= CommonFlags.PUBLIC;\r\n accessStart = tn.tokenPos;\r\n accessEnd = tn.pos;\r\n } else if (tn.skip(Token.PRIVATE)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"private\"\r\n );\r\n }\r\n flags |= CommonFlags.PRIVATE;\r\n accessStart = tn.tokenPos;\r\n accessEnd = tn.pos;\r\n } else if (tn.skip(Token.PROTECTED)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"protected\"\r\n );\r\n }\r\n flags |= CommonFlags.PROTECTED;\r\n accessStart = tn.tokenPos;\r\n accessEnd = tn.pos;\r\n }\r\n\r\n var staticStart = 0;\r\n var staticEnd = 0;\r\n var abstractStart = 0;\r\n var abstractEnd = 0;\r\n if (tn.skip(Token.STATIC)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"static\"\r\n );\r\n }\r\n flags |= CommonFlags.STATIC;\r\n staticStart = tn.tokenPos;\r\n staticEnd = tn.pos;\r\n } else {\r\n flags |= CommonFlags.INSTANCE;\r\n if (tn.skip(Token.ABSTRACT)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"abstract\"\r\n );\r\n }\r\n flags |= CommonFlags.ABSTRACT;\r\n abstractStart = tn.tokenPos;\r\n abstractEnd = tn.pos;\r\n }\r\n if (parent.flags & CommonFlags.GENERIC) flags |= CommonFlags.GENERIC_CONTEXT;\r\n }\r\n\r\n var readonlyStart: i32 = 0;\r\n var readonlyEnd: i32 = 0;\r\n if (tn.skip(Token.READONLY)) {\r\n flags |= CommonFlags.READONLY;\r\n readonlyStart = tn.tokenPos;\r\n readonlyEnd = tn.pos;\r\n }\r\n\r\n // check if accessor: ('get' | 'set') ^\\n Identifier\r\n var state = tn.mark();\r\n var isConstructor = false;\r\n var isGetter = false;\r\n var getStart: i32 = 0;\r\n var getEnd: i32 = 0;\r\n var isSetter = false;\r\n var setStart: i32 = 0;\r\n var setEnd: i32 = 0;\r\n if (!isInterface) {\r\n if (tn.skip(Token.GET)) {\r\n if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n flags |= CommonFlags.GET;\r\n isGetter = true;\r\n setStart = tn.tokenPos;\r\n setEnd = tn.pos;\r\n if (flags & CommonFlags.READONLY) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n ); // recoverable\r\n }\r\n } else {\r\n tn.reset(state);\r\n }\r\n } else if (tn.skip(Token.SET)) {\r\n if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n flags |= CommonFlags.SET;\r\n isSetter = true;\r\n setStart = tn.tokenPos;\r\n setEnd = tn.pos;\r\n if (flags & CommonFlags.READONLY) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n ); // recoverable\r\n }\r\n } else {\r\n tn.reset(state);\r\n }\r\n } else if (tn.skip(Token.CONSTRUCTOR)) {\r\n flags |= CommonFlags.CONSTRUCTOR;\r\n isConstructor = true;\r\n if (flags & CommonFlags.STATIC) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(staticStart, staticEnd), \"static\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.ABSTRACT) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(abstractStart, abstractEnd), \"abstract\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.READONLY) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n ); // recoverable\r\n }\r\n }\r\n }\r\n\r\n var name: IdentifierExpression;\r\n if (isConstructor) {\r\n name = Node.createConstructorExpression(tn.range());\r\n } else {\r\n if (!(isGetter || isSetter) && tn.skip(Token.OPENBRACKET)) {\r\n // TODO: also handle symbols, which might have some of these modifiers\r\n if (flags & CommonFlags.PUBLIC) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(accessStart, accessEnd), \"public\"\r\n ); // recoverable\r\n } else if (flags & CommonFlags.PROTECTED) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(accessStart, accessEnd), \"protected\"\r\n ); // recoverable\r\n } else if (flags & CommonFlags.PRIVATE) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(accessStart, accessEnd), \"protected\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.STATIC) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(staticStart, staticEnd), \"static\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.ABSTRACT) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(abstractStart, abstractEnd), \"abstract\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.READONLY) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n ); // recoverable\r\n }\r\n let retIndex = this.parseIndexSignatureDeclaration(tn, decorators);\r\n if (!retIndex) return null;\r\n tn.skip(Token.SEMICOLON);\r\n return retIndex;\r\n }\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var typeParameters: TypeParameterNode[] | null = null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n let typeParametersStart = tn.tokenPos;\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n if (isConstructor) {\r\n this.error(\r\n DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,\r\n tn.range(typeParametersStart, tn.pos)\r\n ); // recoverable\r\n } else if (isGetter || isSetter) {\r\n this.error(\r\n DiagnosticCode.An_accessor_cannot_have_type_parameters,\r\n tn.range(typeParametersStart, tn.pos)\r\n ); // recoverable\r\n } else {\r\n flags |= CommonFlags.GENERIC;\r\n }\r\n }\r\n\r\n // method: '(' Parameters (':' Type)? '{' Statement* '}' ';'?\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let signatureStart = tn.tokenPos;\r\n let parameters = this.parseParameters(tn, isConstructor);\r\n if (!parameters) return null;\r\n let thisType = this.parseParametersThis;\r\n if (isConstructor) {\r\n for (let i = 0, k = parameters.length; i < k; ++i) {\r\n let parameter = parameters[i];\r\n if (parameter.isAny(\r\n CommonFlags.PUBLIC |\r\n CommonFlags.PROTECTED |\r\n CommonFlags.PRIVATE |\r\n CommonFlags.READONLY\r\n )) {\r\n let implicitFieldDeclaration = Node.createFieldDeclaration(\r\n parameter.name,\r\n parameter.type,\r\n null, // initialized via parameter\r\n null,\r\n parameter.flags | CommonFlags.INSTANCE,\r\n parameter.range\r\n );\r\n implicitFieldDeclaration.parameterIndex = i;\r\n implicitFieldDeclaration.parent = parent;\r\n parameter.implicitFieldDeclaration = implicitFieldDeclaration;\r\n parent.members.push(implicitFieldDeclaration);\r\n }\r\n }\r\n } else if (isGetter) {\r\n if (parameters.length) {\r\n this.error(\r\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n name.range\r\n );\r\n }\r\n } else if (isSetter) {\r\n if (parameters.length != 1) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n name.range\r\n );\r\n }\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n name.range\r\n );\r\n }\r\n }\r\n\r\n let returnType: CommonTypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n if (name.kind == NodeKind.CONSTRUCTOR) {\r\n this.error(\r\n DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration,\r\n tn.range()\r\n );\r\n } else if (isSetter) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation,\r\n tn.range()\r\n );\r\n }\r\n returnType = this.parseType(tn, name.kind == NodeKind.CONSTRUCTOR || isSetter);\r\n if (!returnType) return null;\r\n } else {\r\n returnType = Node.createOmittedType(tn.range(tn.pos));\r\n if (!isSetter && name.kind != NodeKind.CONSTRUCTOR) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n returnType.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n let signature = Node.createSignature(\r\n parameters,\r\n returnType,\r\n thisType,\r\n false,\r\n tn.range(signatureStart, tn.pos)\r\n );\r\n\r\n let body: Statement | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n if (flags & CommonFlags.AMBIENT) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n } else if (flags & CommonFlags.ABSTRACT) {\r\n this.error(\r\n DiagnosticCode.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract,\r\n tn.range(), name.text\r\n ); // recoverable\r\n }\r\n body = this.parseBlockStatement(tn, false);\r\n if (!body) return null;\r\n } else if (!(flags & CommonFlags.AMBIENT) && !isInterface) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n\r\n let retMethod = Node.createMethodDeclaration(\r\n name,\r\n typeParameters,\r\n signature,\r\n body,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return retMethod;\r\n\r\n } else if (isConstructor) {\r\n this.error(\r\n DiagnosticCode.Constructor_implementation_is_missing,\r\n name.range\r\n );\r\n\r\n } else if (isGetter || isSetter) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n name.range\r\n );\r\n\r\n // field: (':' Type)? ('=' Expression)? ';'?\r\n } else {\r\n if (flags & CommonFlags.ABSTRACT) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(abstractStart, abstractEnd), \"abstract\"\r\n ); // recoverable\r\n }\r\n\r\n if (flags & CommonFlags.GET) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(getStart, getEnd), \"get\"\r\n ); // recoverable\r\n }\r\n\r\n if (flags & CommonFlags.SET) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(setStart, setEnd), \"set\"\r\n ); // recoverable\r\n }\r\n\r\n let type: CommonTypeNode | null = null;\r\n if (tn.skip(Token.QUESTION)) {\r\n this.error(\r\n DiagnosticCode.Optional_properties_are_not_supported,\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n if (tn.skip(Token.EXCLAMATION)) {\r\n flags |= CommonFlags.DEFINITE_ASSIGNMENT;\r\n }\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type) return null;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n let initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n initializer = this.parseExpression(tn);\r\n if (!initializer) return null;\r\n }\r\n let range = tn.range(startPos, tn.pos);\r\n if ((flags & CommonFlags.DEFINITE_ASSIGNMENT) && ((flags & CommonFlags.STATIC) || isInterface || initializer)) {\r\n this.error(\r\n DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,\r\n range\r\n );\r\n }\r\n let retField = Node.createFieldDeclaration(\r\n name,\r\n type,\r\n initializer,\r\n decorators,\r\n flags,\r\n range\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return retField;\r\n }\r\n return null;\r\n }\r\n\r\n parseIndexSignatureDeclaration(tn: Tokenizer, decorators: DecoratorNode[]): IndexSignatureDeclaration | null {\r\n\r\n // at: '[': 'key' ':' Type ']' ':' Type\r\n\r\n if (decorators.length) {\r\n this.error(\r\n DiagnosticCode.Decorators_are_not_valid_here,\r\n Range.join(decorators[0].range, decorators[decorators.length - 1].range)\r\n ); // recoverable\r\n }\r\n\r\n var start = tn.tokenPos;\r\n if (tn.skipIdentifier()) {\r\n let id = tn.readIdentifier();\r\n if (id == \"key\") {\r\n if (tn.skip(Token.COLON)) {\r\n let keyType = this.parseType(tn);\r\n if (!keyType) return null;\r\n if (keyType.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n if (tn.skip(Token.CLOSEBRACKET)) {\r\n if (tn.skip(Token.COLON)) {\r\n let valueType = this.parseType(tn);\r\n if (!valueType) return null;\r\n return Node.createIndexSignatureDeclaration(keyType, valueType, tn.range(start, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"key\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseNamespace(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): NamespaceDeclaration | null {\r\n\r\n // at 'namespace': Identifier '{' (Variable | Function)* '}'\r\n\r\n if (tn.skipIdentifier()) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(Token.OPENBRACE)) {\r\n let members = new Array();\r\n let ns = Node.createNamespaceDeclaration(\r\n identifier,\r\n members,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let member = this.parseTopLevelStatement(tn, ns);\r\n if (!member) return null;\r\n member.parent = ns;\r\n members.push(member);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ns;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExport(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n startPos: i32\r\n ): ExportStatement | null {\r\n\r\n // at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?\r\n\r\n var path: StringLiteralExpression | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n let members = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let member = this.parseExportMember(tn);\r\n if (!member) return null;\r\n members.push(member);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACE)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n if (tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n let ret = Node.createExportStatement(members, path, flags, tn.range(startPos, tn.pos));\r\n let internalPath = ret.internalPath;\r\n if (internalPath !== null && !this.seenlog.has(internalPath)) {\r\n this.backlog.push(internalPath);\r\n this.seenlog.add(internalPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else if (tn.skip(Token.ASTERISK)) {\r\n if (tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n let ret = Node.createExportStatement(null, path, flags, tn.range(startPos, tn.pos));\r\n let internalPath = assert(ret.internalPath);\r\n let source = tn.source;\r\n if (!source.exportPaths) source.exportPaths = new Set();\r\n source.exportPaths.add(internalPath);\r\n if (!this.seenlog.has(internalPath)) {\r\n this.backlog.push(internalPath);\r\n this.seenlog.add(internalPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"from\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExportMember(\r\n tn: Tokenizer\r\n ): ExportMember | null {\r\n\r\n // before: Identifier ('as' Identifier)?\r\n\r\n if (tn.skipIdentifier()) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let asIdentifier: IdentifierExpression | null = null;\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {\r\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n return Node.createExportMember(\r\n identifier,\r\n asIdentifier,\r\n asIdentifier\r\n ? Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseImport(\r\n tn: Tokenizer\r\n ): ImportStatement | null {\r\n\r\n // at 'import':\r\n // ('{' (ImportMember (',' ImportMember)* '}') | ('*' 'as' Identifier)?\r\n // 'from' StringLiteral ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var members: ImportDeclaration[] | null = null;\r\n var namespaceName: IdentifierExpression | null = null;\r\n var skipFrom = false;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n members = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let member = this.parseImportDeclaration(tn);\r\n if (!member) return null;\r\n members.push(member);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACE)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n } else if (tn.skip(Token.ASTERISK)) {\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skipIdentifier()) {\r\n namespaceName = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"as\"\r\n );\r\n return null;\r\n }\r\n } else {\r\n skipFrom = true;\r\n }\r\n\r\n if (skipFrom || tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n let path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n let ret: ImportStatement;\r\n if (namespaceName) {\r\n assert(!members);\r\n ret = Node.createImportStatementWithWildcard(namespaceName, path, tn.range(startPos, tn.pos));\r\n } else {\r\n ret = Node.createImportStatement(members, path, tn.range(startPos, tn.pos));\r\n }\r\n let internalPath = ret.internalPath;\r\n if (!this.seenlog.has(internalPath)) {\r\n this.backlog.push(internalPath);\r\n this.seenlog.add(internalPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"from\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseImportDeclaration(\r\n tn: Tokenizer\r\n ): ImportDeclaration | null {\r\n\r\n // before: Identifier ('as' Identifier)?\r\n\r\n if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let asIdentifier: IdentifierExpression | null = null;\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skipIdentifier()) {\r\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n return Node.createImportDeclaration(\r\n identifier,\r\n asIdentifier,\r\n asIdentifier\r\n ? Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExportImport(\r\n tn: Tokenizer,\r\n startPos: i32\r\n ): ExportImportStatement | null {\r\n\r\n // at 'export' 'import': Identifier ('=' Identifier)? ';'?\r\n\r\n if (tn.skipIdentifier()) {\r\n let asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(Token.EQUALS)) {\r\n if (tn.skipIdentifier()) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let ret = Node.createExportImportStatement(identifier, asIdentifier, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseStatement(\r\n tn: Tokenizer,\r\n topLevel: bool = false\r\n ): Statement | null {\r\n\r\n // at previous token\r\n\r\n var state = tn.mark();\r\n var token = tn.next();\r\n var statement: Statement | null = null;\r\n switch (token) {\r\n case Token.BREAK: {\r\n statement = this.parseBreak(tn);\r\n break;\r\n }\r\n case Token.CONST: {\r\n statement = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\r\n break;\r\n }\r\n case Token.CONTINUE: {\r\n statement = this.parseContinue(tn);\r\n break;\r\n }\r\n case Token.DO: {\r\n statement = this.parseDoStatement(tn);\r\n break;\r\n }\r\n case Token.FOR: {\r\n statement = this.parseForStatement(tn);\r\n break;\r\n }\r\n case Token.IF: {\r\n statement = this.parseIfStatement(tn);\r\n break;\r\n }\r\n case Token.LET: {\r\n statement = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\r\n break;\r\n }\r\n case Token.VAR: {\r\n statement = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n break;\r\n }\r\n case Token.OPENBRACE: {\r\n statement = this.parseBlockStatement(tn, topLevel);\r\n break;\r\n }\r\n case Token.RETURN: {\r\n if (topLevel) {\r\n this.error(\r\n DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n statement = this.parseReturn(tn);\r\n break;\r\n }\r\n case Token.SEMICOLON: {\r\n return Node.createEmptyStatement(tn.range(tn.tokenPos));\r\n }\r\n case Token.SWITCH: {\r\n statement = this.parseSwitchStatement(tn);\r\n break;\r\n }\r\n case Token.THROW: {\r\n statement = this.parseThrowStatement(tn);\r\n break;\r\n }\r\n case Token.TRY: {\r\n statement = this.parseTryStatement(tn);\r\n break;\r\n }\r\n case Token.VOID: {\r\n statement = this.parseVoidStatement(tn);\r\n break;\r\n }\r\n case Token.WHILE: {\r\n statement = this.parseWhileStatement(tn);\r\n break;\r\n }\r\n case Token.TYPE: { // also identifier\r\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n statement = this.parseTypeDeclaration(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: {\r\n tn.reset(state);\r\n statement = this.parseExpressionStatement(tn);\r\n break;\r\n }\r\n }\r\n if (!statement) { // has been reported\r\n tn.reset(state);\r\n this.skipStatement(tn);\r\n } else {\r\n tn.discard(state);\r\n }\r\n return statement;\r\n }\r\n\r\n parseBlockStatement(\r\n tn: Tokenizer,\r\n topLevel: bool\r\n ): BlockStatement | null {\r\n\r\n // at '{': Statement* '}' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var statements = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let state = tn.mark();\r\n let statement = this.parseStatement(tn, topLevel);\r\n if (!statement) {\r\n if (tn.token == Token.ENDOFFILE) return null;\r\n tn.reset(state);\r\n this.skipStatement(tn);\r\n } else {\r\n tn.discard(state);\r\n statements.push(statement);\r\n }\r\n }\r\n var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseBreak(\r\n tn: Tokenizer\r\n ): BreakStatement | null {\r\n\r\n // at 'break': Identifier? ';'?\r\n\r\n var identifier: IdentifierExpression | null = null;\r\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(IdentifierHandling.PREFER);\r\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = Node.createBreakStatement(identifier, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseContinue(\r\n tn: Tokenizer\r\n ): ContinueStatement | null {\r\n\r\n // at 'continue': Identifier? ';'?\r\n\r\n var identifier: IdentifierExpression | null = null;\r\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(IdentifierHandling.PREFER);\r\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = Node.createContinueStatement(identifier, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseDoStatement(\r\n tn: Tokenizer\r\n ): DoStatement | null {\r\n\r\n // at 'do': Statement 'while' '(' Expression ')' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n\r\n if (tn.skip(Token.WHILE)) {\r\n\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n let ret = Node.createDoStatement(statement, condition, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"while\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExpressionStatement(\r\n tn: Tokenizer\r\n ): ExpressionStatement | null {\r\n\r\n // at previous token\r\n\r\n var expr = this.parseExpression(tn);\r\n if (!expr) return null;\r\n\r\n var ret = Node.createExpressionStatement(expr);\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseForStatement(\r\n tn: Tokenizer\r\n ): ForStatement | null {\r\n\r\n // at 'for': '(' Statement? Expression? ';' Expression? ')' Statement\r\n\r\n var startPos = tn.tokenPos;\r\n\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let initializer: Statement | null = null;\r\n\r\n if (tn.skip(Token.CONST)) {\r\n initializer = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\r\n } else if (tn.skip(Token.LET)) {\r\n initializer = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\r\n } else if (tn.skip(Token.VAR)) {\r\n initializer = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n\r\n } else if (!tn.skip(Token.SEMICOLON)) {\r\n initializer = this.parseExpressionStatement(tn);\r\n if (!initializer) return null;\r\n }\r\n\r\n if (tn.token == Token.SEMICOLON) {\r\n let condition: ExpressionStatement | null = null;\r\n if (!tn.skip(Token.SEMICOLON)) {\r\n condition = this.parseExpressionStatement(tn);\r\n if (!condition) return null;\r\n }\r\n\r\n if (tn.token == Token.SEMICOLON) {\r\n let incrementor: Expression | null = null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n incrementor = this.parseExpression(tn);\r\n if (!incrementor) return null;\r\n\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n let statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n\r\n return Node.createForStatement(\r\n initializer,\r\n condition\r\n ? condition.expression\r\n : null,\r\n incrementor,\r\n statement,\r\n tn.range(startPos, tn.pos)\r\n );\r\n\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \";\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \";\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseIfStatement(\r\n tn: Tokenizer\r\n ): IfStatement | null {\r\n\r\n // at 'if': '(' Expression ')' Statement ('else' Statement)?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n let statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n let elseStatement: Statement | null = null;\r\n if (tn.skip(Token.ELSE)) {\r\n elseStatement = this.parseStatement(tn);\r\n if (!elseStatement) return null;\r\n }\r\n return Node.createIfStatement(\r\n condition,\r\n statement,\r\n elseStatement,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseSwitchStatement(\r\n tn: Tokenizer\r\n ): SwitchStatement | null {\r\n\r\n // at 'switch': '(' Expression ')' '{' SwitchCase* '}' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n if (tn.skip(Token.OPENBRACE)) {\r\n let cases = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let case_ = this.parseSwitchCase(tn);\r\n if (!case_) return null;\r\n cases.push(case_);\r\n }\r\n let ret = Node.createSwitchStatement(condition, cases, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseSwitchCase(\r\n tn: Tokenizer\r\n ): SwitchCase | null {\r\n\r\n var startPos = tn.tokenPos;\r\n var statements: Statement[],\r\n statement: Statement | null;\r\n\r\n // 'case' Expression ':' Statement*\r\n\r\n if (tn.skip(Token.CASE)) {\r\n let label = this.parseExpression(tn);\r\n if (!label) return null;\r\n if (tn.skip(Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n return Node.createSwitchCase(label, statements, tn.range(startPos, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n\r\n // 'default' ':' Statement*\r\n\r\n } else if (tn.skip(Token.DEFAULT)) {\r\n if (tn.skip(Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n return Node.createSwitchCase(null, statements, tn.range(startPos, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._case_or_default_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseThrowStatement(\r\n tn: Tokenizer\r\n ): ThrowStatement | null {\r\n\r\n // at 'throw': Expression ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var expression = this.parseExpression(tn);\r\n if (!expression) return null;\r\n var ret = Node.createThrowStatement(expression, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseTryStatement(\r\n tn: Tokenizer\r\n ): TryStatement | null {\r\n\r\n // at 'try':\r\n // '{' Statement* '}'\r\n // ('catch' '(' VariableMember ')' '{' Statement* '}')?\r\n // ('finally' '{' Statement* '}'? ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var stmt: Statement | null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n let statements = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n statements.push(stmt);\r\n }\r\n let catchVariable: IdentifierExpression | null = null;\r\n let catchStatements: Statement[] | null = null;\r\n let finallyStatements: Statement[] | null = null;\r\n if (tn.skip(Token.CATCH)) {\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n catchVariable = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n catchStatements = [];\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n catchStatements.push(stmt);\r\n }\r\n }\r\n if (tn.skip(Token.FINALLY)) {\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n finallyStatements = [];\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n finallyStatements.push(stmt);\r\n }\r\n }\r\n if (!(catchStatements || finallyStatements)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"catch\"\r\n );\r\n return null;\r\n }\r\n let ret = Node.createTryStatement(\r\n statements,\r\n catchVariable,\r\n catchStatements,\r\n finallyStatements,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseTypeDeclaration(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): TypeDeclaration | null {\r\n\r\n // at 'type': Identifier ('<' TypeParameters '>')? '=' Type ';'?\r\n\r\n if (tn.skipIdentifier()) {\r\n let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let typeParameters: TypeParameterNode[] | null = null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n flags |= CommonFlags.GENERIC;\r\n }\r\n if (tn.skip(Token.EQUALS)) {\r\n let type = this.parseType(tn);\r\n if (!type) return null;\r\n let ret = Node.createTypeDeclaration(\r\n name,\r\n typeParameters,\r\n type,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseVoidStatement(\r\n tn: Tokenizer\r\n ): VoidStatement | null {\r\n\r\n // at 'void': Expression ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var expression = this.parseExpression(tn, Precedence.GROUPING);\r\n if (!expression) return null;\r\n var ret = Node.createVoidStatement(expression, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseWhileStatement(\r\n tn: Tokenizer\r\n ): WhileStatement | null {\r\n\r\n // at 'while': '(' Expression ')' Statement ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let expression = this.parseExpression(tn);\r\n if (!expression) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n let statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n let ret = Node.createWhileStatement(expression, statement, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n // expressions\r\n // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing\r\n\r\n parseExpressionStart(\r\n tn: Tokenizer\r\n ): Expression | null {\r\n\r\n var token = tn.next(IdentifierHandling.PREFER);\r\n var startPos = tn.tokenPos;\r\n var precedence = determinePrecedenceStart(token);\r\n if (precedence != Precedence.NONE) {\r\n let operand: Expression | null;\r\n\r\n // TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)\r\n\r\n // NewExpression\r\n if (token == Token.NEW) {\r\n operand = this.parseExpression(tn, Precedence.CALL);\r\n if (!operand) return null;\r\n if (operand.kind == NodeKind.CALL) {\r\n return Node.createNewExpression(\r\n (operand).expression,\r\n (operand).typeArguments,\r\n (operand).arguments,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n } else {\r\n operand = this.parseExpression(tn, precedence);\r\n if (!operand) return null;\r\n }\r\n\r\n // UnaryPrefixExpression\r\n if (token == Token.PLUS_PLUS || token == Token.MINUS_MINUS) {\r\n if (\r\n operand.kind != NodeKind.IDENTIFIER &&\r\n operand.kind != NodeKind.ELEMENTACCESS &&\r\n operand.kind != NodeKind.PROPERTYACCESS\r\n ) {\r\n this.error(\r\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n operand.range\r\n );\r\n }\r\n }\r\n return Node.createUnaryPrefixExpression(token, operand, tn.range(startPos, tn.pos));\r\n }\r\n\r\n var expr: Expression | null = null;\r\n switch (token) {\r\n\r\n case Token.NULL: return Node.createNullExpression(tn.range());\r\n case Token.TRUE: return Node.createTrueExpression(tn.range());\r\n case Token.FALSE: return Node.createFalseExpression(tn.range());\r\n\r\n // ParenthesizedExpression\r\n // FunctionExpression\r\n case Token.OPENPAREN: {\r\n\r\n // determine whether this is a function expression\r\n if (tn.skip(Token.CLOSEPAREN)) { // must be a function expression (fast route)\r\n return this.parseFunctionExpressionCommon(\r\n tn,\r\n Node.createEmptyIdentifierExpression(tn.range(startPos)),\r\n [],\r\n true\r\n );\r\n }\r\n let state = tn.mark();\r\n let again = true;\r\n do {\r\n switch (tn.next(IdentifierHandling.PREFER)) {\r\n\r\n // function expression\r\n case Token.DOT_DOT_DOT: {\r\n tn.reset(state);\r\n return this.parseFunctionExpression(tn);\r\n }\r\n // can be both\r\n case Token.IDENTIFIER: {\r\n tn.readIdentifier();\r\n switch (tn.next()) {\r\n\r\n // if we got here, check for arrow\r\n case Token.CLOSEPAREN: {\r\n if (\r\n !tn.skip(Token.COLON) &&\r\n !tn.skip(Token.EQUALS_GREATERTHAN)\r\n ) {\r\n again = false;\r\n break;\r\n }\r\n // fall-through\r\n }\r\n // function expression\r\n case Token.COLON: { // type annotation\r\n tn.reset(state);\r\n return this.parseFunctionExpression(tn);\r\n }\r\n // optional parameter or parenthesized\r\n case Token.QUESTION: {\r\n if (\r\n tn.skip(Token.COLON) || // optional parameter with type\r\n tn.skip(Token.COMMA) || // optional parameter without type\r\n tn.skip(Token.CLOSEPAREN) // last optional parameter without type\r\n ) {\r\n tn.reset(state);\r\n return this.parseFunctionExpression(tn);\r\n }\r\n again = false; // parenthesized\r\n break;\r\n }\r\n case Token.COMMA: {\r\n break; // continue\r\n }\r\n // parenthesized expression\r\n // case Token.EQUALS: // missing type annotation for simplicity\r\n default: {\r\n again = false;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n // parenthesized expression\r\n default: {\r\n again = false;\r\n break;\r\n }\r\n }\r\n } while (again);\r\n tn.reset(state);\r\n\r\n // parse parenthesized\r\n expr = this.parseExpression(tn);\r\n if (!expr) return null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n return Node.createParenthesizedExpression(expr, tn.range(startPos, tn.pos));\r\n }\r\n // ArrayLiteralExpression\r\n case Token.OPENBRACKET: {\r\n let elementExpressions = new Array();\r\n while (!tn.skip(Token.CLOSEBRACKET)) {\r\n if (tn.peek() == Token.COMMA) {\r\n expr = null; // omitted\r\n } else {\r\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n }\r\n elementExpressions.push(expr);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACKET)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n return Node.createArrayLiteralExpression(elementExpressions, tn.range(startPos, tn.pos));\r\n }\r\n // ObjectLiteralExpression\r\n case Token.OPENBRACE: {\r\n let startPos = tn.tokenPos;\r\n let names = new Array();\r\n let values = new Array();\r\n let name: IdentifierExpression;\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n if (!tn.skipIdentifier()) {\r\n if (!tn.skip(Token.STRINGLITERAL)) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range(),\r\n );\r\n return null;\r\n }\r\n name = Node.createIdentifierExpression(tn.readString(), tn.range());\r\n name.set(CommonFlags.QUOTED);\r\n } else {\r\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n names.push(name);\r\n if (tn.skip(Token.COLON)) {\r\n let value = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!value) return null;\r\n values.push(value);\r\n } else if (!name.is(CommonFlags.QUOTED)) {\r\n values.push(name);\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACE)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n return Node.createObjectLiteralExpression(names, values, tn.range(startPos, tn.pos));\r\n }\r\n // AssertionExpression (unary prefix)\r\n case Token.LESSTHAN: {\r\n let toType = this.parseType(tn);\r\n if (!toType) return null;\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \">\"\r\n );\r\n return null;\r\n }\r\n expr = this.parseExpression(tn, Precedence.CALL);\r\n if (!expr) return null;\r\n return Node.createAssertionExpression(\r\n AssertionKind.PREFIX,\r\n expr,\r\n toType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n case Token.IDENTIFIER: {\r\n return Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));\r\n }\r\n case Token.THIS: {\r\n return Node.createThisExpression(tn.range(startPos, tn.pos));\r\n }\r\n case Token.CONSTRUCTOR: {\r\n return Node.createConstructorExpression(tn.range(startPos, tn.pos));\r\n }\r\n case Token.SUPER: {\r\n if (tn.peek() != Token.DOT && tn.nextToken != Token.OPENPAREN) {\r\n this.error(\r\n DiagnosticCode._super_must_be_followed_by_an_argument_list_or_member_access,\r\n tn.range()\r\n );\r\n }\r\n return Node.createSuperExpression(tn.range(startPos, tn.pos));\r\n }\r\n case Token.STRINGLITERAL: {\r\n return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos));\r\n }\r\n case Token.INTEGERLITERAL: {\r\n return Node.createIntegerLiteralExpression(tn.readInteger(), tn.range(startPos, tn.pos));\r\n }\r\n case Token.FLOATLITERAL: {\r\n return Node.createFloatLiteralExpression(tn.readFloat(), tn.range(startPos, tn.pos));\r\n }\r\n // RegexpLiteralExpression\r\n // note that this also continues on invalid ones so the surrounding AST remains intact\r\n case Token.SLASH: {\r\n let regexpPattern = tn.readRegexpPattern(); // also reports\r\n if (!tn.skip(Token.SLASH)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"/\"\r\n );\r\n return null;\r\n }\r\n return Node.createRegexpLiteralExpression(\r\n regexpPattern,\r\n tn.readRegexpFlags(), // also reports\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n case Token.FUNCTION: {\r\n return this.parseFunctionExpression(tn);\r\n }\r\n case Token.CLASS: {\r\n return this.parseClassExpression(tn);\r\n }\r\n default: {\r\n if (token == Token.ENDOFFILE) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n tn.range(startPos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Expression_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n tryParseTypeArgumentsBeforeArguments(\r\n tn: Tokenizer\r\n ): CommonTypeNode[] | null {\r\n\r\n // at '<': Type (',' Type)* '>' '('\r\n\r\n var state = tn.mark();\r\n if (!tn.skip(Token.LESSTHAN)) return null;\r\n var typeArguments = new Array();\r\n do {\r\n if (tn.peek() === Token.GREATERTHAN) {\r\n break;\r\n }\r\n let type = this.parseType(tn, true, true);\r\n if (!type) {\r\n tn.reset(state);\r\n return null;\r\n }\r\n typeArguments.push(type);\r\n } while (tn.skip(Token.COMMA));\r\n if (tn.skip(Token.GREATERTHAN) && tn.skip(Token.OPENPAREN)) {\r\n return typeArguments;\r\n }\r\n tn.reset(state);\r\n return null;\r\n }\r\n\r\n parseArguments(\r\n tn: Tokenizer\r\n ): Expression[] | null {\r\n\r\n // at '(': (Expression (',' Expression)*)? ')'\r\n\r\n var args = new Array();\r\n while (!tn.skip(Token.CLOSEPAREN)) {\r\n let expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n args.push(expr);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n return args;\r\n }\r\n\r\n parseExpression(\r\n tn: Tokenizer,\r\n precedence: Precedence = Precedence.COMMA\r\n ): Expression | null {\r\n assert(precedence != Precedence.NONE);\r\n\r\n var expr = this.parseExpressionStart(tn);\r\n if (!expr) return null;\r\n expr = this.maybeParseCallExpression(tn, expr); // simple call like on an Identifier\r\n\r\n var startPos = expr.range.start;\r\n var token: Token;\r\n var next: Expression | null = null;\r\n var nextPrecedence: Precedence;\r\n while (\r\n (nextPrecedence = determinePrecedence(token = tn.peek())) >= precedence\r\n ) { // precedence climbing\r\n tn.next();\r\n switch (token) {\r\n // AssertionExpression\r\n case Token.AS: {\r\n let toType = this.parseType(tn); // reports\r\n if (!toType) return null;\r\n expr = Node.createAssertionExpression(\r\n AssertionKind.AS,\r\n expr,\r\n toType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n case Token.EXCLAMATION: {\r\n expr = Node.createAssertionExpression(\r\n AssertionKind.NONNULL,\r\n expr,\r\n null,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // InstanceOfExpression\r\n case Token.INSTANCEOF: {\r\n let isType = this.parseType(tn); // reports\r\n if (!isType) return null;\r\n expr = Node.createInstanceOfExpression(\r\n expr,\r\n isType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // ElementAccessExpression\r\n case Token.OPENBRACKET: {\r\n next = this.parseExpression(tn); // reports\r\n if (!next) return null;\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n return null;\r\n }\r\n expr = Node.createElementAccessExpression(\r\n expr,\r\n next,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // UnaryPostfixExpression\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS: {\r\n if (\r\n expr.kind != NodeKind.IDENTIFIER &&\r\n expr.kind != NodeKind.ELEMENTACCESS &&\r\n expr.kind != NodeKind.PROPERTYACCESS\r\n ) {\r\n this.error(\r\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n expr.range\r\n );\r\n }\r\n expr = Node.createUnaryPostfixExpression(\r\n token,\r\n expr,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // TernaryExpression\r\n case Token.QUESTION: {\r\n let ifThen = this.parseExpression(tn);\r\n if (!ifThen) return null;\r\n if (!tn.skip(Token.COLON)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n return null;\r\n }\r\n let ifElse = this.parseExpression(tn, precedence > Precedence.COMMA\r\n ? Precedence.COMMA + 1\r\n : Precedence.COMMA\r\n );\r\n if (!ifElse) return null;\r\n expr = Node.createTernaryExpression(\r\n expr,\r\n ifThen,\r\n ifElse,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // CommaExpression\r\n case Token.COMMA: {\r\n let commaExprs: Expression[] = [ expr ];\r\n do {\r\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n commaExprs.push(expr);\r\n } while (tn.skip(Token.COMMA));\r\n expr = Node.createCommaExpression(commaExprs, tn.range(startPos, tn.pos));\r\n break;\r\n }\r\n default: {\r\n\r\n // PropertyAccessExpression\r\n if (token == Token.DOT) {\r\n if (tn.skipIdentifier()) {\r\n next = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n next = this.parseExpression(tn,\r\n isRightAssociative(token)\r\n ? nextPrecedence\r\n : nextPrecedence + 1\r\n );\r\n if (!next) return null;\r\n }\r\n if (next.kind == NodeKind.IDENTIFIER) { // expr '.' Identifier\r\n expr = Node.createPropertyAccessExpression(\r\n expr,\r\n next,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else if (next.kind == NodeKind.CALL) { // expr '.' CallExpression\r\n expr = this.joinPropertyCall(tn, startPos, expr, next);\r\n if (!expr) return null;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n next.range\r\n );\r\n return null;\r\n }\r\n\r\n // BinaryExpression\r\n } else {\r\n next = this.parseExpression(tn,\r\n isRightAssociative(token)\r\n ? nextPrecedence\r\n : nextPrecedence + 1\r\n );\r\n if (!next) return null;\r\n expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));\r\n }\r\n break;\r\n }\r\n }\r\n expr = this.maybeParseCallExpression(tn, expr); // compound call like on an ElementAccess\r\n }\r\n return expr;\r\n }\r\n\r\n private joinPropertyCall(\r\n tn: Tokenizer,\r\n startPos: i32,\r\n expr: Expression,\r\n call: CallExpression\r\n ): Expression | null {\r\n var callee = call.expression;\r\n switch (callee.kind) {\r\n case NodeKind.IDENTIFIER: { // join property access and use as call target\r\n call.expression = Node.createPropertyAccessExpression(\r\n expr,\r\n callee,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n case NodeKind.CALL: { // join call target und wrap the original call around it\r\n let inner = this.joinPropertyCall(tn, startPos, expr, callee);\r\n if (!inner) return null;\r\n call.expression = inner;\r\n call.range = tn.range(startPos, tn.pos);\r\n break;\r\n }\r\n default: {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n call.range\r\n );\r\n return null;\r\n }\r\n }\r\n return call;\r\n }\r\n\r\n private maybeParseCallExpression(\r\n tn: Tokenizer,\r\n expr: Expression\r\n ): Expression {\r\n if (nodeIsCallable(expr.kind)) {\r\n let typeArguments: CommonTypeNode[] | null = null;\r\n while (\r\n tn.skip(Token.OPENPAREN)\r\n ||\r\n nodeIsGenericCallable(expr.kind) && (typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null\r\n ) {\r\n let args = this.parseArguments(tn);\r\n if (!args) break;\r\n expr = Node.createCallExpression( // is again callable\r\n expr,\r\n typeArguments,\r\n args,\r\n tn.range(expr.range.start, tn.pos)\r\n );\r\n }\r\n }\r\n return expr;\r\n }\r\n\r\n /** Skips over a statement on errors in an attempt to reduce unnecessary diagnostic noise. */\r\n skipStatement(tn: Tokenizer): void {\r\n tn.peek(true);\r\n if (tn.nextTokenOnNewLine) tn.next(); // if reset() to the previous line\r\n do {\r\n let nextToken = tn.peek(true);\r\n if (\r\n nextToken == Token.ENDOFFILE || // next step should handle this\r\n nextToken == Token.SEMICOLON // end of the statement for sure\r\n ) {\r\n tn.next();\r\n break;\r\n }\r\n if (tn.nextTokenOnNewLine) break; // end of the statement maybe\r\n switch (tn.next()) {\r\n case Token.IDENTIFIER: {\r\n tn.readIdentifier();\r\n break;\r\n }\r\n case Token.STRINGLITERAL: {\r\n tn.readString();\r\n break;\r\n }\r\n case Token.INTEGERLITERAL: {\r\n tn.readInteger();\r\n break;\r\n }\r\n case Token.FLOATLITERAL: {\r\n tn.readFloat();\r\n break;\r\n }\r\n }\r\n } while (true);\r\n }\r\n\r\n /** Skips over a block on errors in an attempt to reduce unnecessary diagnostic noise. */\r\n skipBlock(tn: Tokenizer): void {\r\n // at '{': ... '}'\r\n var depth = 1;\r\n var again = true;\r\n do {\r\n switch (tn.next()) {\r\n case Token.ENDOFFILE: {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n again = false;\r\n break;\r\n }\r\n case Token.OPENBRACE: {\r\n ++depth;\r\n break;\r\n }\r\n case Token.CLOSEBRACE: {\r\n --depth;\r\n if (!depth) again = false;\r\n break;\r\n }\r\n case Token.IDENTIFIER: {\r\n tn.readIdentifier();\r\n break;\r\n }\r\n case Token.STRINGLITERAL: {\r\n tn.readString();\r\n break;\r\n }\r\n case Token.INTEGERLITERAL: {\r\n tn.readInteger();\r\n break;\r\n }\r\n case Token.FLOATLITERAL: {\r\n tn.readFloat();\r\n break;\r\n }\r\n }\r\n } while (again);\r\n }\r\n}\r\n\r\n/** Operator precedence from least to largest. */\r\nexport const enum Precedence {\r\n NONE,\r\n COMMA,\r\n SPREAD,\r\n YIELD,\r\n ASSIGNMENT,\r\n CONDITIONAL,\r\n LOGICAL_OR,\r\n LOGICAL_AND,\r\n BITWISE_OR,\r\n BITWISE_XOR,\r\n BITWISE_AND,\r\n EQUALITY,\r\n RELATIONAL,\r\n SHIFT,\r\n ADDITIVE,\r\n MULTIPLICATIVE,\r\n EXPONENTIATED,\r\n UNARY_PREFIX,\r\n UNARY_POSTFIX,\r\n CALL,\r\n MEMBERACCESS,\r\n GROUPING\r\n}\r\n\r\n/** Determines the precedence of a starting token. */\r\nfunction determinePrecedenceStart(kind: Token): Precedence {\r\n switch (kind) {\r\n case Token.DOT_DOT_DOT: return Precedence.SPREAD;\r\n case Token.YIELD: return Precedence.YIELD;\r\n case Token.EXCLAMATION:\r\n case Token.TILDE:\r\n case Token.PLUS:\r\n case Token.MINUS:\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS:\r\n case Token.TYPEOF:\r\n case Token.VOID:\r\n case Token.DELETE: return Precedence.UNARY_PREFIX;\r\n case Token.NEW: return Precedence.MEMBERACCESS;\r\n }\r\n return Precedence.NONE;\r\n}\r\n\r\n/** Determines the precende of a non-starting token. */\r\nfunction determinePrecedence(kind: Token): Precedence {\r\n switch (kind) {\r\n case Token.COMMA: return Precedence.COMMA;\r\n case Token.EQUALS:\r\n case Token.PLUS_EQUALS:\r\n case Token.MINUS_EQUALS:\r\n case Token.ASTERISK_ASTERISK_EQUALS:\r\n case Token.ASTERISK_EQUALS:\r\n case Token.SLASH_EQUALS:\r\n case Token.PERCENT_EQUALS:\r\n case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.AMPERSAND_EQUALS:\r\n case Token.CARET_EQUALS:\r\n case Token.BAR_EQUALS: return Precedence.ASSIGNMENT;\r\n case Token.QUESTION: return Precedence.CONDITIONAL;\r\n case Token.BAR_BAR: return Precedence.LOGICAL_OR;\r\n case Token.AMPERSAND_AMPERSAND: return Precedence.LOGICAL_AND;\r\n case Token.BAR: return Precedence.BITWISE_OR;\r\n case Token.CARET: return Precedence.BITWISE_XOR;\r\n case Token.AMPERSAND: return Precedence.BITWISE_AND;\r\n case Token.EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS:\r\n case Token.EQUALS_EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS_EQUALS: return Precedence.EQUALITY;\r\n case Token.AS:\r\n case Token.IN:\r\n case Token.INSTANCEOF:\r\n case Token.LESSTHAN:\r\n case Token.GREATERTHAN:\r\n case Token.LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_EQUALS: return Precedence.RELATIONAL;\r\n case Token.LESSTHAN_LESSTHAN:\r\n case Token.GREATERTHAN_GREATERTHAN:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return Precedence.SHIFT;\r\n case Token.PLUS:\r\n case Token.MINUS: return Precedence.ADDITIVE;\r\n case Token.ASTERISK:\r\n case Token.SLASH:\r\n case Token.PERCENT: return Precedence.MULTIPLICATIVE;\r\n case Token.ASTERISK_ASTERISK: return Precedence.EXPONENTIATED;\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS: return Precedence.UNARY_POSTFIX;\r\n case Token.DOT:\r\n case Token.NEW:\r\n case Token.OPENBRACKET:\r\n case Token.EXCLAMATION: return Precedence.MEMBERACCESS;\r\n }\r\n return Precedence.NONE;\r\n}\r\n\r\n/** Determines whether a non-starting token is right associative. */\r\nfunction isRightAssociative(kind: Token): bool {\r\n switch (kind) {\r\n case Token.EQUALS:\r\n case Token.PLUS_EQUALS:\r\n case Token.MINUS_EQUALS:\r\n case Token.ASTERISK_ASTERISK_EQUALS:\r\n case Token.ASTERISK_EQUALS:\r\n case Token.SLASH_EQUALS:\r\n case Token.PERCENT_EQUALS:\r\n case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.AMPERSAND_EQUALS:\r\n case Token.CARET_EQUALS:\r\n case Token.BAR_EQUALS:\r\n case Token.QUESTION:\r\n case Token.ASTERISK_ASTERISK: return true;\r\n default: return false;\r\n }\r\n}\r\n","/**\r\n * JavaScript glue code.\r\n * @module glue/js\r\n * @preferred\r\n *//***/\r\n\r\n/// \r\n\r\nimport \"./binaryen\"; // must be first so portable can pick up the memory implementation\r\nimport \"../../../std/portable/index\";\r\nimport \"./float\";\r\nimport \"./i64\";\r\n\r\nimport { Module } from \"../../module\";\r\n\r\nModule.prototype.toText = function(this: Module) {\r\n return binaryen.wrapModule(this.ref).emitStackIR();\r\n};\r\n\r\nModule.prototype.toAsmjs = function(this: Module) {\r\n return binaryen.wrapModule(this.ref).emitAsmjs();\r\n};\r\n","// Copy Binaryen exports to global scope\r\n\r\nconst binaryen = global.Binaryen || require(\"binaryen\");\r\nglobal.binaryen = binaryen;\r\n\r\nfor (var key in binaryen) {\r\n if (key.startsWith(\"_Binaryen\") || key.startsWith(\"_Relooper\")) global[key] = binaryen[key];\r\n}\r\n\r\n// Utilize Binaryen's heap\r\n\r\nglobal.__memory_allocate = binaryen._malloc;\r\nglobal.__memory_free = binaryen._free;\r\nglobal.__memory_copy = binaryen._memmove;\r\nglobal.__store = function(ptr, val) { binaryen.HEAPU8[ptr] = val; };\r\nglobal.__load = function(ptr) { return binaryen.HEAPU8[ptr]; };\r\n","module.exports = __WEBPACK_EXTERNAL_MODULE__18__;","/** @module std/portable *//***/\r\n\r\nvar globalScope = typeof window !== \"undefined\" && window || typeof global !== \"undefined\" && global || self;\r\n\r\nglobalScope.ASC_TARGET = 0; // JS\r\nglobalScope.ASC_NO_TREESHAKING = false;\r\nglobalScope.ASC_NO_ASSERT = false;\r\nglobalScope.ASC_MEMORY_BASE = 0;\r\nglobalScope.ASC_OPTIMIZE_LEVEL = 3;\r\nglobalScope.ASC_SHRINK_LEVEL = 0;\r\nglobalScope.ASC_FEATURE_MUTABLE_GLOBAL = false;\r\nglobalScope.ASC_FEATURE_SIGN_EXTENSION = false;\r\nglobalScope.ASC_FEATURE_BULK_MEMORY = false;\r\nglobalScope.ASC_FEATURE_SIMD = false;\r\nglobalScope.ASC_FEATURE_THREADS = false;\r\n\r\nvar F64 = new Float64Array(1);\r\nvar U64 = new Uint32Array(F64.buffer);\r\n\r\nObject.defineProperties(\r\n globalScope[\"i8\"] = function i8(value) { return value << 24 >> 24; }\r\n, {\r\n \"MIN_VALUE\": { value: -128, writable: false },\r\n \"MAX_VALUE\": { value: 127, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i16\"] = function i16(value) { return value << 16 >> 16; }\r\n, {\r\n \"MIN_VALUE\": { value: -32768, writable: false },\r\n \"MAX_VALUE\": { value: 32767, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i32\"] = globalScope[\"isize\"] = function i32(value) { return value | 0; }\r\n, {\r\n \"MIN_VALUE\": { value: -2147483648, writable: false },\r\n \"MAX_VALUE\": { value: 2147483647, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u8\"] = function u8(value) { return value & 0xff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 255, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u16\"] = function u16(value) { return value & 0xffff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 65535, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u32\"] = globalScope[\"usize\"] = function u32(value) { return value >>> 0; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 4294967295, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"bool\"] = function bool(value) { return !!value; }\r\n, {\r\n \"MIN_VALUE\": { value: false, writable: false },\r\n \"MAX_VALUE\": { value: true, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f32\"] = function f32(value) { return Math.fround(value); }\r\n, {\r\n \"EPSILON\": { value: Math.fround(1.1920929e-07), writable: false },\r\n \"MIN_VALUE\": { value: Math.fround(1.4012985e-45), writable: false },\r\n \"MAX_VALUE\": { value: Math.fround(3.4028235e+38), writable: false },\r\n \"MIN_NORMAL_VALUE\": { value: Math.fround(1.17549435e-38), writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -16777215, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 16777215, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f64\"] = function f64(value) { return +value; }\r\n, {\r\n \"EPSILON\": { value: 2.2204460492503131e-16, writable: false },\r\n \"MIN_VALUE\": { value: 5e-324, writable: false },\r\n \"MAX_VALUE\": { value: 1.7976931348623157e+308, writable: false },\r\n \"MIN_NORMAL_VALUE\": { value: 2.2250738585072014e-308 , writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -9007199254740991, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 9007199254740991, writable: false }\r\n});\r\n\r\nglobalScope[\"clz\"] = Math.clz32;\r\n\r\nglobalScope[\"ctz\"] = function ctz(value) {\r\n var c = Math.clz32(value & -value);\r\n return value ? 31 - c : c;\r\n};\r\n\r\nglobalScope[\"popcnt\"] = function popcnt(value) {\r\n value -= value >>> 1 & 0x55555555;\r\n value = (value & 0x33333333) + (value >>> 2 & 0x33333333);\r\n return (((value + (value >>> 4)) & 0x0F0F0F0F) * 0x01010101) >>> 24;\r\n};\r\n\r\nglobalScope[\"rotl\"] = function rotl(value, shift) {\r\n shift &= 31;\r\n return (value << shift) | (value >>> (32 - shift));\r\n};\r\n\r\nglobalScope[\"rotr\"] = function rotr(value, shift) {\r\n shift &= 31;\r\n return (value >>> shift) | (value << (32 - shift));\r\n};\r\n\r\nglobalScope[\"abs\"] = Math.abs;\r\n\r\nglobalScope[\"max\"] = Math.max;\r\n\r\nglobalScope[\"min\"] = Math.min;\r\n\r\nglobalScope[\"ceil\"] = Math.ceil;\r\n\r\nglobalScope[\"floor\"] = Math.floor;\r\n\r\n// Adopt code from https://github.com/rfk/wasm-polyfill\r\nglobalScope[\"nearest\"] = function nearest(value) {\r\n if (Math.abs(value - Math.trunc(value)) === 0.5) {\r\n return 2.0 * Math.round(value * 0.5);\r\n }\r\n return Math.round(value);\r\n};\r\n\r\nglobalScope[\"select\"] = function select(ifTrue, ifFalse, condition) {\r\n return condition ? ifTrue : ifFalse;\r\n};\r\n\r\nglobalScope[\"sqrt\"] = Math.sqrt;\r\n\r\nglobalScope[\"trunc\"] = Math.trunc;\r\n\r\nglobalScope[\"copysign\"] = function copysign(x, y) {\r\n return Math.abs(x) * Math.sign(y);\r\n};\r\n\r\nglobalScope[\"bswap\"] = function bswap(value) {\r\n var a = value >> 8 & 0x00FF00FF;\r\n var b = (value & 0x00FF00FF) << 8;\r\n value = a | b;\r\n a = value >> 16 & 0x0000FFFF;\r\n b = (value & 0x0000FFFF) << 16;\r\n return a | b;\r\n};\r\n\r\nglobalScope[\"bswap16\"] = function bswap16(value) {\r\n return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);\r\n};\r\n\r\nfunction UnreachableError() {\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, UnreachableError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nUnreachableError.prototype = Object.create(Error.prototype);\r\nUnreachableError.prototype.name = \"UnreachableError\";\r\nUnreachableError.prototype.message = \"unreachable\";\r\n\r\nglobalScope[\"unreachable\"] = function unreachable() {\r\n throw new UnreachableError();\r\n};\r\n\r\nfunction AssertionError(message) {\r\n this.message = message || \"assertion failed\";\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, AssertionError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nAssertionError.prototype = Object.create(Error.prototype);\r\nAssertionError.prototype.name = \"AssertionError\";\r\n\r\nglobalScope[\"assert\"] = function assert(isTrueish, message) {\r\n if (isTrueish) return isTrueish;\r\n throw new AssertionError(message);\r\n};\r\n\r\nglobalScope[\"changetype\"] = function changetype(value) {\r\n return value;\r\n};\r\n\r\nglobalScope[\"parseI32\"] = function parseI32(str, radix) {\r\n return parseInt(str, undefined) | 0;\r\n};\r\n\r\nString[\"fromCharCodes\"] = function fromCharCodes(arr) {\r\n return String.fromCharCode.apply(String, arr);\r\n};\r\n\r\nString[\"fromCodePoints\"] = function fromCodePoints(arr) {\r\n return String.fromCodePoint.apply(String, arr);\r\n};\r\n\r\nglobalScope[\"isInteger\"] = Number.isInteger;\r\n\r\nglobalScope[\"isFloat\"] = function isFloat(arg) {\r\n return typeof arg === \"number\";\r\n};\r\n\r\nglobalScope[\"isReference\"] = function isReference(arg) {\r\n return typeof arg === \"object\" || typeof arg === \"string\";\r\n};\r\n\r\nglobalScope[\"isString\"] = function isString(arg) {\r\n return typeof arg === \"string\" || arg instanceof String;\r\n};\r\n\r\nglobalScope[\"isArray\"] = Array.isArray;\r\n\r\nglobalScope[\"isDefined\"] = function isDefined(expr) {\r\n return typeof expr !== \"undefined\";\r\n}\r\n\r\nglobalScope[\"isConstant\"] = function isConstant(expr) {\r\n return false;\r\n};\r\n\r\nglobalScope[\"unchecked\"] = function unchecked(expr) {\r\n return expr;\r\n};\r\n\r\nglobalScope[\"fmod\"] = function fmod(x, y) {\r\n return x % y;\r\n};\r\n\r\nglobalScope[\"fmodf\"] = function fmodf(x, y) {\r\n return Math.fround(x % y);\r\n};\r\n\r\nglobalScope[\"JSMath\"] = Math;\r\nglobalScope[\"JSMath\"].signbit = function signbit(x) {\r\n F64[0] = x; return Boolean((U64[1] >>> 31) & (x == x));\r\n}\r\n\r\nglobalScope[\"memory\"] = (() => {\r\n var HEAP = new Uint8Array(0);\r\n var HEAP_OFFSET = 0;\r\n return {\r\n allocate: globalScope[\"__memory_allocate\"] || function allocate(size) {\r\n if (!(size >>>= 0)) return 0;\r\n if (HEAP_OFFSET + size > HEAP.length) {\r\n var oldHeap = HEAP;\r\n HEAP = new Uint8Array(Math.max(65536, HEAP.length + size, HEAP.length * 2));\r\n HEAP.set(oldHeap);\r\n }\r\n var ptr = HEAP_OFFSET;\r\n if ((HEAP_OFFSET += size) & 7) HEAP_OFFSET = (HEAP_OFFSET | 7) + 1;\r\n return ptr;\r\n },\r\n fill: globalScope[\"__memory_fill\"] || function fill(dest, value, size) {\r\n HEAP.fill(value, dest, dest + size);\r\n },\r\n free: globalScope[\"__memory_free\"] || function free(ptr) { },\r\n copy: globalScope[\"__memory_copy\"] || function copy(dest, src, size) {\r\n HEAP.copyWithin(dest, src, src + size);\r\n },\r\n reset: globalScope[\"__memory_reset\"] || function reset() {\r\n HEAP = new Uint8Array(0);\r\n HEAP_OFFSET = 0;\r\n }\r\n };\r\n})();\r\n\r\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\r\n HEAP[(ptr | 0) + (offset | 0)] = value;\r\n};\r\n\r\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\r\n return HEAP[(ptr | 0) + (offset | 0)];\r\n};\r\n","const F64 = new Float64Array(1);\r\nconst F32 = new Float32Array(F64.buffer);\r\nconst I32 = new Int32Array(F64.buffer);\r\n\r\nglobal.f32_as_i32 = function(value) {\r\n F32[0] = value;\r\n return I32[0];\r\n};\r\n\r\nglobal.i32_as_f32 = function(value) {\r\n I32[0] = value;\r\n return F32[0];\r\n};\r\n\r\nglobal.f64_as_i64 = function(value) {\r\n F64[0] = value;\r\n return i64_new(I32[0], I32[1]);\r\n};\r\n\r\nglobal.i64_as_f64 = function(value) {\r\n I32[0] = i64_low(value);\r\n I32[1] = i64_high(value);\r\n return F64[0];\r\n};\r\n","const Long = global.Long || require(\"long\");\r\n\r\nglobal.i64_zero = Long.ZERO;\r\n\r\nglobal.i64_one = Long.ONE;\r\n\r\nglobal.i64_new = function(lo, hi) {\r\n return Long.fromBits(lo, hi);\r\n};\r\n\r\nglobal.i64_low = function(value) {\r\n return value.low;\r\n};\r\n\r\nglobal.i64_high = function(value) {\r\n return value.high;\r\n};\r\n\r\nglobal.i64_add = function(left, right) {\r\n return left.add(right);\r\n};\r\n\r\nglobal.i64_sub = function(left, right) {\r\n return left.sub(right);\r\n};\r\n\r\nglobal.i64_mul = function(left, right) {\r\n return left.mul(right);\r\n};\r\n\r\nglobal.i64_div = function(left, right) {\r\n return left.div(right);\r\n};\r\n\r\nglobal.i64_div_u = function(left, right) {\r\n return left.toUnsigned().div(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_rem = function(left, right) {\r\n return left.mod(right);\r\n};\r\n\r\nglobal.i64_rem_u = function(left, right) {\r\n return left.toUnsigned().mod(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_and = function(left, right) {\r\n return left.and(right);\r\n};\r\n\r\nglobal.i64_or = function(left, right) {\r\n return left.or(right);\r\n};\r\n\r\nglobal.i64_xor = function(left, right) {\r\n return left.xor(right);\r\n};\r\n\r\nglobal.i64_shl = function(left, right) {\r\n return left.shl(right);\r\n};\r\n\r\nglobal.i64_shr = function(left, right) {\r\n return left.shr(right);\r\n};\r\n\r\nglobal.i64_shr_u = function(left, right) {\r\n return left.shru(right);\r\n};\r\n\r\nglobal.i64_not = function(value) {\r\n return value.not();\r\n};\r\n\r\nglobal.i64_eq = function(left, right) {\r\n return left.eq(right);\r\n};\r\n\r\nglobal.i64_ne = function(left, right) {\r\n return left.ne(right);\r\n};\r\n\r\nglobal.i64_align = function(value, alignment) {\r\n assert(alignment && (alignment & (alignment - 1)) == 0);\r\n var mask = Long.fromInt(alignment - 1);\r\n return value.add(mask).and(mask.not());\r\n};\r\n\r\nglobal.i64_is_i8 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i8.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i8.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i16 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i16.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i16.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i32 = function(value) {\r\n return (value.high === 0 && value.low >= 0)\r\n || (value.high === -1 && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_u8 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u8.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u16 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u16.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u32 = function(value) {\r\n return value.high === 0;\r\n};\r\n\r\nglobal.i64_is_bool = function(value) {\r\n return value.high === 0 && (value.low === 0 || value.low === 1);\r\n};\r\n\r\nconst minSafeF32 = Long.fromNumber(f32.MIN_SAFE_INTEGER);\r\nconst maxSafeF32 = Long.fromNumber(f32.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f32 = function(value) {\r\n return value.gte(minSafeF32) && value.lte(maxSafeF32);\r\n};\r\n\r\nconst minSafeF64 = Long.fromNumber(f64.MIN_SAFE_INTEGER);\r\nconst maxSafeF64 = Long.fromNumber(f64.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f64 = function(value) {\r\n return value.gte(minSafeF64) && value.lte(maxSafeF64);\r\n};\r\n\r\nglobal.i64_to_f32 = function(value) {\r\n return global.Math.fround(value.toNumber());\r\n};\r\n\r\nglobal.i64_to_f64 = function(value) {\r\n return value.toNumber();\r\n};\r\n\r\nglobal.i64_to_string = function(value, unsigned) {\r\n return (unsigned ? value.toUnsigned() : value).toString(10);\r\n};\r\n","module.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n ])), {}).exports;\r\n} catch (e) {\r\n // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n * See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n /**\r\n * The low 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.low = low | 0;\r\n\r\n /**\r\n * The high 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.high = high | 0;\r\n\r\n /**\r\n * Whether unsigned or not.\r\n * @type {boolean}\r\n */\r\n this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations. For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative). Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n var obj, cachedObj, cache;\r\n if (unsigned) {\r\n value >>>= 0;\r\n if (cache = (0 <= value && value < 256)) {\r\n cachedObj = UINT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n if (cache)\r\n UINT_CACHE[value] = obj;\r\n return obj;\r\n } else {\r\n value |= 0;\r\n if (cache = (-128 <= value && value < 128)) {\r\n cachedObj = INT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n if (cache)\r\n INT_CACHE[value] = obj;\r\n return obj;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n if (isNaN(value))\r\n return unsigned ? UZERO : ZERO;\r\n if (unsigned) {\r\n if (value < 0)\r\n return UZERO;\r\n if (value >= TWO_PWR_64_DBL)\r\n return MAX_UNSIGNED_VALUE;\r\n } else {\r\n if (value <= -TWO_PWR_63_DBL)\r\n return MIN_VALUE;\r\n if (value + 1 >= TWO_PWR_63_DBL)\r\n return MAX_VALUE;\r\n }\r\n if (value < 0)\r\n return fromNumber(-value, unsigned).neg();\r\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n * assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n if (str.length === 0)\r\n throw Error('empty string');\r\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n return ZERO;\r\n if (typeof unsigned === 'number') {\r\n // For goog.math.long compatibility\r\n radix = unsigned,\r\n unsigned = false;\r\n } else {\r\n unsigned = !! unsigned;\r\n }\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n\r\n var p;\r\n if ((p = str.indexOf('-')) > 0)\r\n throw Error('interior hyphen');\r\n else if (p === 0) {\r\n return fromString(str.substring(1), unsigned, radix).neg();\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n var result = ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i),\r\n value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = fromNumber(pow_dbl(radix, size));\r\n result = result.mul(power).add(fromNumber(value));\r\n } else {\r\n result = result.mul(radixToPower);\r\n result = result.add(fromNumber(value));\r\n }\r\n }\r\n result.unsigned = unsigned;\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n if (typeof val === 'number')\r\n return fromNumber(val, unsigned);\r\n if (typeof val === 'string')\r\n return fromString(val, unsigned);\r\n // Throws for non-objects, converts non-instanceof Long:\r\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n if (this.unsigned)\r\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n if (this.isZero())\r\n return '0';\r\n if (this.isNegative()) { // Unsigned Longs are never negative\r\n if (this.eq(MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = fromNumber(radix),\r\n div = this.div(radixLong),\r\n rem1 = div.mul(radixLong).sub(this);\r\n return div.toString(radix) + rem1.toInt().toString(radix);\r\n } else\r\n return '-' + this.neg().toString(radix);\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower),\r\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n digits = intval.toString(radix);\r\n rem = remDiv;\r\n if (rem.isZero())\r\n return digits + result;\r\n else {\r\n while (digits.length < 6)\r\n digits = '0' + digits;\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n if (this.isNegative()) // Unsigned Longs are never negative\r\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n var val = this.high != 0 ? this.high : this.low;\r\n for (var bit = 31; bit > 0; bit--)\r\n if ((val & (1 << bit)) != 0)\r\n break;\r\n return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n return false;\r\n return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.eq(other))\r\n return 0;\r\n var thisNeg = this.isNegative(),\r\n otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg)\r\n return -1;\r\n if (!thisNeg && otherNeg)\r\n return 1;\r\n // At this point the sign bits are the same\r\n if (!this.unsigned)\r\n return this.sub(other).isNegative() ? -1 : 1;\r\n // Both are positive if at least one is unsigned\r\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n if (!this.unsigned && this.eq(MIN_VALUE))\r\n return MIN_VALUE;\r\n return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n if (!isLong(addend))\r\n addend = fromValue(addend);\r\n\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = addend.high >>> 16;\r\n var b32 = addend.high & 0xFFFF;\r\n var b16 = addend.low >>> 16;\r\n var b00 = addend.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n if (!isLong(subtrahend))\r\n subtrahend = fromValue(subtrahend);\r\n return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n if (this.isZero())\r\n return ZERO;\r\n if (!isLong(multiplier))\r\n multiplier = fromValue(multiplier);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = wasm.mul(this.low,\r\n this.high,\r\n multiplier.low,\r\n multiplier.high);\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (multiplier.isZero())\r\n return ZERO;\r\n if (this.eq(MIN_VALUE))\r\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n if (multiplier.eq(MIN_VALUE))\r\n return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n if (this.isNegative()) {\r\n if (multiplier.isNegative())\r\n return this.neg().mul(multiplier.neg());\r\n else\r\n return this.neg().mul(multiplier).neg();\r\n } else if (multiplier.isNegative())\r\n return this.mul(multiplier.neg()).neg();\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = multiplier.high >>> 16;\r\n var b32 = multiplier.high & 0xFFFF;\r\n var b16 = multiplier.low >>> 16;\r\n var b00 = multiplier.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n * unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n if (divisor.isZero())\r\n throw Error('division by zero');\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n // guard against signed division overflow: the largest\r\n // negative number / -1 would be 1 larger than the largest\r\n // positive number, due to two's complement.\r\n if (!this.unsigned &&\r\n this.high === -0x80000000 &&\r\n divisor.low === -1 && divisor.high === -1) {\r\n // be consistent with non-wasm code path\r\n return this;\r\n }\r\n var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (this.isZero())\r\n return this.unsigned ? UZERO : ZERO;\r\n var approx, rem, res;\r\n if (!this.unsigned) {\r\n // This section is only relevant for signed longs and is derived from the\r\n // closure library as a whole.\r\n if (this.eq(MIN_VALUE)) {\r\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n else if (divisor.eq(MIN_VALUE))\r\n return ONE;\r\n else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shr(1);\r\n approx = halfThis.div(divisor).shl(1);\r\n if (approx.eq(ZERO)) {\r\n return divisor.isNegative() ? ONE : NEG_ONE;\r\n } else {\r\n rem = this.sub(divisor.mul(approx));\r\n res = approx.add(rem.div(divisor));\r\n return res;\r\n }\r\n }\r\n } else if (divisor.eq(MIN_VALUE))\r\n return this.unsigned ? UZERO : ZERO;\r\n if (this.isNegative()) {\r\n if (divisor.isNegative())\r\n return this.neg().div(divisor.neg());\r\n return this.neg().div(divisor).neg();\r\n } else if (divisor.isNegative())\r\n return this.div(divisor.neg()).neg();\r\n res = ZERO;\r\n } else {\r\n // The algorithm below has not been made for unsigned longs. It's therefore\r\n // required to take special care of the MSB prior to running it.\r\n if (!divisor.unsigned)\r\n divisor = divisor.toUnsigned();\r\n if (divisor.gt(this))\r\n return UZERO;\r\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n return UONE;\r\n res = UZERO;\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n rem = this;\r\n while (rem.gte(divisor)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n approxRes = fromNumber(approx),\r\n approxRem = approxRes.mul(divisor);\r\n while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n approx -= delta;\r\n approxRes = fromNumber(approx, this.unsigned);\r\n approxRem = approxRes.mul(divisor);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero())\r\n approxRes = ONE;\r\n\r\n res = res.add(approxRes);\r\n rem = rem.sub(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n else\r\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n else\r\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n numBits &= 63;\r\n if (numBits === 0)\r\n return this;\r\n else {\r\n var high = this.high;\r\n if (numBits < 32) {\r\n var low = this.low;\r\n return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n } else if (numBits === 32)\r\n return fromBits(high, 0, this.unsigned);\r\n else\r\n return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n if (!this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n if (this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n lo & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo >>> 16 & 0xff,\r\n lo >>> 24 ,\r\n hi & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi >>> 16 & 0xff,\r\n hi >>> 24\r\n ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n hi >>> 24 ,\r\n hi >>> 16 & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi & 0xff,\r\n lo >>> 24 ,\r\n lo >>> 16 & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo & 0xff\r\n ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n return new Long(\r\n bytes[0] |\r\n bytes[1] << 8 |\r\n bytes[2] << 16 |\r\n bytes[3] << 24,\r\n bytes[4] |\r\n bytes[5] << 8 |\r\n bytes[6] << 16 |\r\n bytes[7] << 24,\r\n unsigned\r\n );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n return new Long(\r\n bytes[4] << 24 |\r\n bytes[5] << 16 |\r\n bytes[6] << 8 |\r\n bytes[7],\r\n bytes[0] << 24 |\r\n bytes[1] << 16 |\r\n bytes[2] << 8 |\r\n bytes[3],\r\n unsigned\r\n );\r\n};\r\n","/**\r\n * Built-in elements providing WebAssembly core functionality.\r\n * @module builtins\r\n *//***/\r\n\r\n import {\r\n Compiler,\r\n ConversionKind,\r\n WrapMode,\r\n Feature\r\n} from \"./compiler\";\r\n\r\nimport {\r\n DiagnosticCode\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n Expression,\r\n LiteralKind,\r\n LiteralExpression,\r\n StringLiteralExpression,\r\n CallExpression\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags\r\n} from \"./types\";\r\n\r\nimport {\r\n BinaryOp,\r\n UnaryOp,\r\n HostOp,\r\n NativeType,\r\n ExpressionRef,\r\n ExpressionId,\r\n getExpressionId,\r\n getExpressionType,\r\n getConstValueI64High,\r\n getConstValueI64Low,\r\n getConstValueI32,\r\n AtomicRMWOp\r\n} from \"./module\";\r\n\r\nimport {\r\n ElementKind,\r\n FunctionPrototype,\r\n Class,\r\n Field,\r\n OperatorKind,\r\n FlowFlags,\r\n Global,\r\n DecoratorFlags,\r\n Element\r\n} from \"./program\";\r\n\r\nimport {\r\n ReportMode\r\n} from \"./resolver\";\r\n\r\nimport {\r\n CommonFlags\r\n} from \"./common\";\r\n\r\n/** Compiles a call to a built-in function. */\r\nexport function compileCall(\r\n compiler: Compiler,\r\n prototype: FunctionPrototype,\r\n typeArguments: Type[] | null,\r\n operands: Expression[],\r\n contextualType: Type,\r\n reportNode: CallExpression\r\n): ExpressionRef {\r\n var module = compiler.module;\r\n\r\n var arg0: ExpressionRef,\r\n arg1: ExpressionRef,\r\n arg2: ExpressionRef,\r\n ret: ExpressionRef;\r\n\r\n // NOTE that some implementations below make use of the select expression where straight-forward.\r\n // whether worth or not should probably be tested once it's known if/how embedders handle it.\r\n // search: createSelect\r\n\r\n switch (prototype.internalName) {\r\n\r\n // types\r\n\r\n case \"isInteger\": { // isInteger() / isInteger(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n return type.is(TypeFlags.INTEGER) && !type.is(TypeFlags.REFERENCE)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case \"isFloat\": { // isFloat() / isFloat(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n return type.is(TypeFlags.FLOAT)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case \"isSigned\": { // isSigned() / isSigned(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n return type.is(TypeFlags.SIGNED)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case \"isReference\": { // isReference() / isReference(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n return type.is(TypeFlags.REFERENCE)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case \"isString\": { // isString() / isString(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n let classType = type.classReference;\r\n if (classType) {\r\n let stringInstance = compiler.program.stringInstance;\r\n if (stringInstance && classType.isAssignableTo(stringInstance)) return module.createI32(1);\r\n }\r\n return module.createI32(0);\r\n }\r\n case \"isArray\": { // isArray() / isArray(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n let classType = type.classReference;\r\n return (\r\n classType !== null && classType.prototype.extends(compiler.program.arrayPrototype)\r\n ) ? module.createI32(1) : module.createI32(0);\r\n }\r\n case \"isDefined\": { // isDefined(expression) -> bool\r\n compiler.currentType = Type.bool;\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n let element = compiler.resolver.resolveExpression(\r\n operands[0],\r\n compiler.currentFlow,\r\n Type.void,\r\n ReportMode.SWALLOW\r\n );\r\n return module.createI32(element ? 1 : 0);\r\n }\r\n case \"isConstant\": { // isConstant(expression) -> bool\r\n compiler.currentType = Type.bool;\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n let expr = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n compiler.currentType = Type.bool;\r\n return module.createI32(getExpressionId(expr) == ExpressionId.Const ? 1 : 0);\r\n }\r\n case \"isManaged\": { // isManaged() -> bool\r\n if (!compiler.program.hasGC) {\r\n compiler.currentType = Type.bool;\r\n return module.createI32(0);\r\n }\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n let classType = type.classReference;\r\n return classType !== null && !classType.hasDecorator(DecoratorFlags.UNMANAGED)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n\r\n // math\r\n\r\n case \"clz\": { // clz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16: {\r\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\r\n break;\r\n }\r\n case TypeKind.BOOL: // usually overflows\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.ClzI64\r\n : UnaryOp.ClzI32,\r\n arg0\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createUnary(UnaryOp.ClzI64, arg0);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"ctz\": { // ctz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.NONE, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16: {\r\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\r\n break;\r\n }\r\n case TypeKind.BOOL: // usually overflows\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.CtzI64\r\n : UnaryOp.CtzI32,\r\n arg0\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createUnary(UnaryOp.CtzI64, arg0);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"popcnt\": { // popcnt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16: {\r\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\r\n break;\r\n }\r\n case TypeKind.BOOL: // usually overflows\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.PopcntI64\r\n : UnaryOp.PopcntI32,\r\n arg0\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createUnary(UnaryOp.PopcntI64, arg0);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"rotl\": { // rotl(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n ret = compiler.ensureSmallIntegerWrap(\r\n module.createBinary(BinaryOp.RotlI32, arg0, arg1),\r\n compiler.currentType\r\n );\r\n // fall-through\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createBinary(BinaryOp.RotlI32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.RotlI64\r\n : BinaryOp.RotlI32,\r\n arg0,\r\n arg1\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createBinary(BinaryOp.RotlI64, arg0, arg1);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret; // possibly overflows\r\n }\r\n case \"rotr\": { // rotr(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n ret = compiler.ensureSmallIntegerWrap(\r\n module.createBinary(BinaryOp.RotrI32, arg0, arg1),\r\n compiler.currentType\r\n );\r\n break;\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createBinary(BinaryOp.RotrI32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.RotrI64\r\n : BinaryOp.RotrI32,\r\n arg0,\r\n arg1\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createBinary(BinaryOp.RotrI64, arg0, arg1);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret; // possibly overflowws\r\n }\r\n case \"abs\": { // abs(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n let flow = compiler.currentFlow;\r\n\r\n // possibly overflows, e.g. abs(-128) == 128\r\n let tempLocal1 = flow.getTempLocal(Type.i32, false);\r\n let tempLocalIndex2 = flow.getAndFreeTempLocal(Type.i32, false).index;\r\n let tempLocalIndex1 = tempLocal1.index;\r\n\r\n // (x + (x >> 31)) ^ (x >> 31)\r\n ret = module.createBinary(BinaryOp.XorI32,\r\n module.createBinary(BinaryOp.AddI32,\r\n module.createTeeLocal(\r\n tempLocalIndex2,\r\n module.createBinary(BinaryOp.ShrI32,\r\n module.createTeeLocal(tempLocalIndex1, arg0),\r\n module.createI32(31)\r\n )\r\n ),\r\n module.createGetLocal(tempLocalIndex1, NativeType.I32)\r\n ),\r\n module.createGetLocal(tempLocalIndex2, NativeType.I32)\r\n );\r\n\r\n flow.freeTempLocal(tempLocal1);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n let options = compiler.options;\r\n let flow = compiler.currentFlow;\r\n let wasm64 = options.isWasm64;\r\n\r\n let tempLocal1 = flow.getTempLocal(options.usizeType, false);\r\n let tempLocalIndex2 = flow.getAndFreeTempLocal(options.usizeType, false).index;\r\n let tempLocalIndex1 = tempLocal1.index;\r\n\r\n ret = module.createBinary(wasm64 ? BinaryOp.XorI64 : BinaryOp.XorI32,\r\n module.createBinary(wasm64 ? BinaryOp.AddI64 : BinaryOp.AddI32,\r\n module.createTeeLocal(\r\n tempLocalIndex2,\r\n module.createBinary(wasm64 ? BinaryOp.ShrI64 : BinaryOp.ShrI32,\r\n module.createTeeLocal(tempLocalIndex1, arg0),\r\n wasm64 ? module.createI64(63) : module.createI32(31)\r\n )\r\n ),\r\n module.createGetLocal(tempLocalIndex1, options.nativeSizeType)\r\n ),\r\n module.createGetLocal(tempLocalIndex2, options.nativeSizeType)\r\n );\r\n\r\n flow.freeTempLocal(tempLocal1);\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n let flow = compiler.currentFlow;\r\n\r\n let tempLocal1 = flow.getTempLocal(Type.i64, false);\r\n let tempLocalIndex2 = flow.getAndFreeTempLocal(Type.i64, false).index;\r\n let tempLocalIndex1 = tempLocal1.index;\r\n\r\n // (x + (x >> 63)) ^ (x >> 63)\r\n ret = module.createBinary(BinaryOp.XorI64,\r\n module.createBinary(BinaryOp.AddI64,\r\n module.createTeeLocal(\r\n tempLocalIndex2,\r\n module.createBinary(BinaryOp.ShrI64,\r\n module.createTeeLocal(tempLocalIndex1, arg0),\r\n module.createI64(63)\r\n )\r\n ),\r\n module.createGetLocal(tempLocalIndex1, NativeType.I64)\r\n ),\r\n module.createGetLocal(tempLocalIndex2, NativeType.I64)\r\n );\r\n\r\n flow.freeTempLocal(tempLocal1);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.U64:\r\n case TypeKind.BOOL: {\r\n ret = arg0;\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.AbsF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.AbsF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n default: { // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"max\": { // max(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n let tempLocal1 = flow.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg1, compiler.currentType)\r\n );\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n let tempLocal1 = flow.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg1, compiler.currentType)\r\n );\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtU32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtI64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtU64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.GtI64\r\n : BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.GtU64\r\n : BinaryOp.GtU32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createBinary(BinaryOp.MaxF32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createBinary(BinaryOp.MaxF64, arg0, arg1);\r\n break;\r\n }\r\n default: { // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"min\": { // min(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n let tempLocal1 = flow.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg1, compiler.currentType)\r\n );\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtI32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n let tempLocal1 = flow.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg1, compiler.currentType)\r\n );\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtU32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtI64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtU64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.LtI64\r\n : BinaryOp.LtI32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.LtU64\r\n : BinaryOp.LtU32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createBinary(BinaryOp.MinF32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createBinary(BinaryOp.MinF64, arg0, arg1);\r\n break;\r\n }\r\n default: { // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"ceil\": { // ceil(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: { // any integer\r\n ret = arg0;\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.CeilF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.CeilF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"floor\": { // floor(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: { // any integer\r\n ret = arg0;\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.FloorF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.FloorF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"copysign\": { // copysign(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n switch (compiler.currentType.kind) { // TODO: does an integer version make sense?\r\n case TypeKind.F32: {\r\n ret = module.createBinary(BinaryOp.CopysignF32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createBinary(BinaryOp.CopysignF64, arg0, arg1);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"nearest\": { // nearest(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: { // any integer\r\n ret = arg0;\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.NearestF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.NearestF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"reinterpret\": { // reinterpret(value: *) -> T\r\n if (operands.length != 1) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n switch (typeArguments[0].kind) {\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n arg0 = compiler.compileExpression(operands[0], Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n ret = module.createUnary(UnaryOp.ReinterpretF32, arg0);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n ret = module.createUnary(UnaryOp.ReinterpretF64, arg0);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (typeArguments[0].is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.isWasm64\r\n ? Type.f64\r\n : Type.f32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.ReinterpretF64\r\n : UnaryOp.ReinterpretF32,\r\n arg0\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n ret = module.createUnary(UnaryOp.ReinterpretI32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n arg0 = compiler.compileExpression(operands[0], Type.i64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n ret = module.createUnary(UnaryOp.ReinterpretI64, arg0);\r\n break;\r\n }\r\n default: { // small integers and void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return ret;\r\n }\r\n case \"sqrt\": { // sqrt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) { // TODO: integer versions (that return f64 or convert)?\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.SqrtF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.SqrtF64, arg0);\r\n break;\r\n }\r\n // case TypeKind.VOID:\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"trunc\": { // trunc(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments && typeArguments.length) {\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: { // any integer\r\n ret = arg0;\r\n break;\r\n }\r\n // TODO: truncate to contextual type directly (if not void etc.)?\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.TruncF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.TruncF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n // memory access\r\n\r\n case \"load\": { // load(offset: usize, constantOffset?: usize) -> *\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n let offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return module.createLoad(\r\n typeArguments[0].byteSize,\r\n typeArguments[0].is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n arg0,\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n contextualType.is(TypeFlags.INTEGER) &&\r\n contextualType.size > typeArguments[0].size\r\n ? (compiler.currentType = contextualType).toNativeType()\r\n : (compiler.currentType = typeArguments[0]).toNativeType(),\r\n offset\r\n );\r\n }\r\n case \"store\": { // store(offset: usize, value: *, constantOffset?: usize) -> void\r\n compiler.currentType = Type.void;\r\n if (operands.length < 2 || operands.length > 3) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n let type: Type;\r\n if (\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n (\r\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\r\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n )\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[1]\r\n );\r\n type = typeArguments[0];\r\n } else {\r\n type = compiler.currentType;\r\n }\r\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = Type.void;\r\n return module.createStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\r\n }\r\n case \"atomic.load\": { // load(offset: usize, constantOffset?: usize) -> *\r\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n let offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return module.createAtomicLoad(\r\n typeArguments[0].byteSize,\r\n arg0,\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n contextualType.is(TypeFlags.INTEGER) &&\r\n contextualType.size > typeArguments[0].size\r\n ? (compiler.currentType = contextualType).toNativeType()\r\n : (compiler.currentType = typeArguments[0]).toNativeType(),\r\n offset\r\n );\r\n }\r\n case \"atomic.store\": { // store(offset: usize, value: *, constantOffset?: usize) -> void\r\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\r\n compiler.currentType = Type.void;\r\n if (operands.length < 2 || operands.length > 3) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n let type: Type;\r\n if (\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n (\r\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\r\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n )\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[1]\r\n );\r\n type = typeArguments[0];\r\n } else {\r\n type = compiler.currentType;\r\n }\r\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = Type.void;\r\n return module.createAtomicStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\r\n }\r\n case \"atomic.add\": // add(ptr: usize, value: T, constantOffset?: usize): T;\r\n case \"atomic.sub\": // sub(ptr: usize, value: T, constantOffset?: usize): T;\r\n case \"atomic.and\": // and(ptr: usize, value: T, constantOffset?: usize): T;\r\n case \"atomic.or\": // or(ptr: usize, value: T, constantOffset?: usize): T;\r\n case \"atomic.xor\": // xor(ptr: usize, value: T, constantOffset?: usize): T;\r\n case \"atomic.xchg\": // xchg(ptr: usize, value: T, constantOffset?: usize): T;\r\n {\r\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\r\n if (operands.length < 2 || operands.length > 3) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n\r\n let type: Type;\r\n if (\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n (\r\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\r\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n )\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[1]\r\n );\r\n type = typeArguments[0];\r\n } else {\r\n type = compiler.currentType;\r\n }\r\n\r\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n let RMWOp: AtomicRMWOp | null = null;\r\n switch (prototype.simpleName) {\r\n case \"add\": { RMWOp = AtomicRMWOp.Add; break; }\r\n case \"sub\": { RMWOp = AtomicRMWOp.Sub; break; }\r\n case \"and\": { RMWOp = AtomicRMWOp.And; break; }\r\n case \"or\": { RMWOp = AtomicRMWOp.Or; break; }\r\n case \"xor\": { RMWOp = AtomicRMWOp.Xor; break; }\r\n case \"xchg\": { RMWOp = AtomicRMWOp.Xchg; break; }\r\n }\r\n compiler.currentType = typeArguments[0];\r\n if (RMWOp !== null) {\r\n return module.createAtomicRMW(\r\n RMWOp, typeArguments[0].byteSize, offset, arg0, arg1, type.toNativeType()\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case \"atomic.cmpxchg\": { // cmpxchg(ptr: usize, expected:T, replacement: T, constantOffset?: usize): T;\r\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\r\n if (operands.length < 3 || operands.length > 4) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg2 = compiler.compileExpression(\r\n operands[2],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n\r\n let type: Type;\r\n if (\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n (\r\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\r\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n )\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[1]\r\n );\r\n arg2 = compiler.convertExpression(\r\n arg2,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[2]\r\n );\r\n type = typeArguments[0];\r\n } else {\r\n type = compiler.currentType;\r\n }\r\n\r\n let offset = operands.length == 4 ? evaluateConstantOffset(compiler, operands[3]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return module.createAtomicCmpxchg(\r\n typeArguments[0].byteSize, offset, arg0, arg1, arg2, type.toNativeType()\r\n );\r\n }\r\n case \"atomic.wait\": { // wait(ptr: usize, expected:T, timeout: i64): i32;\r\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\r\n let hasError = typeArguments == null;\r\n if (operands.length != 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n hasError = true;\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n hasError = true;\r\n }\r\n\r\n if (!typeArguments || hasError) {\r\n return module.createUnreachable();\r\n }\r\n\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg2 = compiler.compileExpression(\r\n operands[2],\r\n Type.i64,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n\r\n let type: Type = typeArguments[0];\r\n if (\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n (\r\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\r\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n )\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[1]\r\n );\r\n arg2 = compiler.convertExpression(\r\n arg2,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[2]\r\n );\r\n }\r\n\r\n return module.createAtomicWait(\r\n arg0, arg1, arg2, type.toNativeType()\r\n );\r\n }\r\n case \"atomic.notify\": { // notify(ptr: usize, count: u32): u32;\r\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\r\n let hasError = typeArguments == null;\r\n if (operands.length != 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n hasError = true;\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n hasError = true;\r\n }\r\n\r\n if (!typeArguments || hasError) {\r\n return module.createUnreachable();\r\n }\r\n\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n Type.i32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n\r\n return module.createAtomicWake(\r\n arg0, arg1\r\n );\r\n }\r\n case \"sizeof\": { // sizeof() -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length != 0) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n let byteSize = (typeArguments)[0].byteSize;\r\n if (compiler.options.isWasm64) {\r\n // implicitly wrap if contextual type is a 32-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n compiler.currentType = Type.u32;\r\n ret = module.createI32(byteSize);\r\n } else {\r\n ret = module.createI64(byteSize, 0);\r\n }\r\n } else {\r\n // implicitly extend if contextual type is a 64-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n compiler.currentType = Type.u64;\r\n ret = module.createI64(byteSize, 0);\r\n } else {\r\n ret = module.createI32(byteSize);\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"alignof\": { // alignof() -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length != 0) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n let byteSize = (typeArguments)[0].byteSize;\r\n let alignLog2: i32;\r\n switch (byteSize) {\r\n case 1: { alignLog2 = 0; break; }\r\n case 2: { alignLog2 = 1; break; }\r\n case 4: { alignLog2 = 2; break; }\r\n case 8: { alignLog2 = 3; break; }\r\n default: { assert(false); return module.createUnreachable(); }\r\n }\r\n if (compiler.options.isWasm64) {\r\n // implicitly wrap if contextual type is a 32-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n compiler.currentType = Type.u32;\r\n ret = module.createI32(alignLog2);\r\n } else {\r\n ret = module.createI64(alignLog2, 0);\r\n }\r\n } else {\r\n // implicitly extend if contextual type is a 64-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n compiler.currentType = Type.u64;\r\n ret = module.createI64(alignLog2, 0);\r\n } else {\r\n ret = module.createI32(alignLog2);\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"offsetof\": { // offsetof(fieldName?: string) -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length > 1) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n let classType = typeArguments[0].classReference;\r\n if (!classType) {\r\n compiler.error( // TODO: better error\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n let offset: i32;\r\n if (operands.length) {\r\n if (\r\n operands[0].kind != NodeKind.LITERAL ||\r\n (operands[0]).literalKind != LiteralKind.STRING\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.String_literal_expected,\r\n operands[0].range\r\n );\r\n return module.createUnreachable();\r\n }\r\n let fieldName = (operands[0]).value;\r\n let field = classType.members ? classType.members.get(fieldName) : null;\r\n if (!(field && field.kind == ElementKind.FIELD)) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_has_no_property_1,\r\n operands[0].range, classType.internalName, fieldName\r\n );\r\n return module.createUnreachable();\r\n }\r\n offset = (field).memoryOffset;\r\n } else {\r\n offset = classType.currentMemoryOffset;\r\n }\r\n if (compiler.options.isWasm64) {\r\n // implicitly wrap if contextual type is a 32-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n compiler.currentType = Type.u32;\r\n return module.createI32(offset);\r\n } else {\r\n return module.createI64(offset);\r\n }\r\n } else {\r\n // implicitly extend if contextual type is a 64-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n compiler.currentType = Type.u64;\r\n return module.createI64(offset);\r\n } else {\r\n return module.createI32(offset);\r\n }\r\n }\r\n }\r\n\r\n // control flow\r\n\r\n case \"select\": { // select(ifTrue: T, ifFalse: T, condition: bool) -> T\r\n if (operands.length != 3) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n }\r\n let type = compiler.currentType;\r\n arg1 = compiler.compileExpression(operands[1], type, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n arg2 = compiler.makeIsTrueish(\r\n compiler.compileExpressionRetainType(operands[2], Type.bool, WrapMode.NONE),\r\n compiler.currentType\r\n );\r\n compiler.currentType = type;\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n ret = module.createSelect(arg0, arg1, arg2);\r\n break;\r\n }\r\n default: { // any other value type\r\n ret = module.createSelect(arg0, arg1, arg2);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"unreachable\": { // unreachable() -> *\r\n if (operands.length != 0) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n\r\n // host operations\r\n\r\n case \"memory.size\": { // memory.size() -> i32\r\n compiler.currentType = Type.i32;\r\n if (operands.length != 0) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createHost(HostOp.CurrentMemory);\r\n }\r\n case \"memory.grow\": { // memory.grow(pages: i32) -> i32\r\n compiler.currentType = Type.i32;\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n arg0 = module.createUnreachable();\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createHost(HostOp.GrowMemory, null, [ arg0 ]);\r\n }\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n case \"memory.copy\": { // memory.copy(dest: usize, src: usize: n: usize) -> void\r\n if (!compiler.options.hasFeature(Feature.BULK_MEMORY)) {\r\n let instance = compiler.resolver.resolveFunction(prototype, null); // reports\r\n compiler.currentType = Type.void;\r\n if (!instance) return module.createUnreachable();\r\n return compiler.compileCallDirect(instance, operands, reportNode);\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n let usizeType = compiler.options.usizeType;\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg2 = compiler.compileExpression(\r\n operands[2],\r\n usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createMemoryCopy(arg0, arg1, arg2);\r\n }\r\n case \"memory.fill\": { // memory.fill(dest: usize, value: u8, n: usize) -> void\r\n if (!compiler.options.hasFeature(Feature.BULK_MEMORY)) {\r\n let instance = compiler.resolver.resolveFunction(prototype, null); // reports\r\n compiler.currentType = Type.void;\r\n if (!instance) return module.createUnreachable();\r\n return compiler.compileCallDirect(instance, operands, reportNode);\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n let usizeType = compiler.options.usizeType;\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n Type.u32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg2 = compiler.compileExpression(\r\n operands[2],\r\n usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createMemoryFill(arg0, arg1, arg2);\r\n }\r\n\r\n // other\r\n\r\n case \"changetype\": { // changetype(value: *) -> T\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpressionRetainType(\r\n operands[0],\r\n typeArguments[0],\r\n WrapMode.NONE\r\n );\r\n compiler.currentType = typeArguments[0];\r\n if (compiler.currentType.size != typeArguments[0].size) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n // if (reportNode.range.source.sourceKind != SourceKind.STDLIB)\r\n // compiler.warning(DiagnosticCode.Operation_is_unsafe, reportNode.range);\r\n return arg0; // any usize to any usize\r\n }\r\n case \"assert\": { // assert(isTrueish: T, message?: string) -> T with T != null\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n } else if (operands.length > 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.bool, WrapMode.WRAP);\r\n }\r\n\r\n let type = compiler.currentType;\r\n compiler.currentType = type.nonNullableType;\r\n\r\n // just return ifTrueish if assertions are disabled, or simplify if dropped anyway\r\n if (compiler.options.noAssert) {\r\n if (contextualType == Type.void) {\r\n compiler.currentType = Type.void;\r\n return module.createNop();\r\n }\r\n return arg0;\r\n }\r\n\r\n let abort = compileAbort(compiler, operands.length == 2 ? operands[1] : null, reportNode);\r\n\r\n compiler.currentType = type.nonNullableType;\r\n\r\n if (contextualType == Type.void) { // simplify if dropped anyway\r\n switch (compiler.currentType.kind) {\r\n default: { // any integer up to 32-bits incl. bool\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI32,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI64,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: {\r\n ret = module.createIf(\r\n module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n // TODO: also check for NaN in float assertions, as in `Boolean(NaN) -> false`?\r\n case TypeKind.F32: {\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF32,\r\n arg0,\r\n module.createF32(0)\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF64,\r\n arg0,\r\n module.createF64(0)\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = abort;\r\n break;\r\n }\r\n }\r\n compiler.currentType = Type.void;\r\n } else {\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal = flow.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n ret = module.createIf(\r\n module.createTeeLocal(tempLocal.index, arg0),\r\n module.createGetLocal(tempLocal.index, NativeType.I32),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n default: {\r\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.i32, false);\r\n ret = module.createIf(\r\n module.createTeeLocal(tempLocal.index, arg0),\r\n module.createGetLocal(tempLocal.index, NativeType.I32),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.i64, false);\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI64,\r\n module.createTeeLocal(tempLocal.index, arg0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal.index, NativeType.I64)\r\n );\r\n break;\r\n }\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: {\r\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n ret = module.createIf(\r\n module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n module.createTeeLocal(tempLocal.index, arg0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.f32, false);\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF32,\r\n module.createTeeLocal(tempLocal.index, arg0),\r\n module.createF32(0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal.index, NativeType.F32)\r\n );\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.f64, false);\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF64,\r\n module.createTeeLocal(tempLocal.index, arg0),\r\n module.createF64(0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal.index, NativeType.F64)\r\n );\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = abort;\r\n break;\r\n }\r\n }\r\n }\r\n return ret;\r\n }\r\n case \"unchecked\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n let flow = compiler.currentFlow;\r\n flow.set(FlowFlags.UNCHECKED_CONTEXT);\r\n ret = compiler.compileExpressionRetainType(operands[0], contextualType, WrapMode.NONE);\r\n flow.unset(FlowFlags.UNCHECKED_CONTEXT);\r\n return ret;\r\n }\r\n case \"call_indirect\": { // call_indirect(target: Function | u32, ...args: *[]) -> T\r\n if (operands.length < 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n let returnType: Type;\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n returnType = typeArguments[0];\r\n } else {\r\n returnType = contextualType;\r\n }\r\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\r\n if (compiler.currentType.kind != TypeKind.U32) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n operands[0].range\r\n );\r\n return module.createUnreachable();\r\n }\r\n let numOperands = operands.length - 1;\r\n let operandExprs = new Array(numOperands);\r\n let signatureParts = new Array(numOperands + 1);\r\n let nativeReturnType = returnType.toNativeType();\r\n let nativeParamTypes = new Array(numOperands);\r\n for (let i = 0; i < numOperands; ++i) {\r\n operandExprs[i] = compiler.compileExpressionRetainType(operands[1 + i], Type.i32, WrapMode.NONE);\r\n let operandType = compiler.currentType;\r\n signatureParts[i] = operandType.toSignatureString();\r\n nativeParamTypes[i] = operandType.toNativeType();\r\n }\r\n signatureParts[numOperands] = returnType.toSignatureString();\r\n let typeName = signatureParts.join(\"\");\r\n let typeRef = module.getFunctionTypeBySignature(nativeReturnType, nativeParamTypes);\r\n if (!typeRef) typeRef = module.addFunctionType(typeName, nativeReturnType, nativeParamTypes);\r\n compiler.currentType = returnType;\r\n // of course this can easily result in a 'RuntimeError: function signature mismatch' trap and\r\n // thus must be used with care. it exists because it *might* be useful in specific scenarios.\r\n return module.createCallIndirect(arg0, operandExprs, typeName);\r\n }\r\n case \"instantiate\": {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n let classInstance = typeArguments[0].classReference;\r\n if (!classInstance) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileInstantiate(classInstance, operands, reportNode);\r\n }\r\n\r\n // user-defined diagnostic macros\r\n\r\n case \"ERROR\": {\r\n compiler.error(\r\n DiagnosticCode.User_defined_0,\r\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n case \"WARNING\": {\r\n compiler.warning(\r\n DiagnosticCode.User_defined_0,\r\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\r\n );\r\n return module.createNop();\r\n }\r\n case \"INFO\": {\r\n compiler.info(\r\n DiagnosticCode.User_defined_0,\r\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\r\n );\r\n return module.createNop();\r\n }\r\n\r\n // conversions\r\n\r\n case \"i8\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.i8,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"i16\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.i16,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"i32\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.i32,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"i64\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.i64,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"isize\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = compiler.options.isWasm64\r\n ? Type.isize64\r\n : Type.isize32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n compiler.options.isWasm64\r\n ? Type.isize64\r\n : Type.isize32,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"u8\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.u8,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"u16\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.u16,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"u32\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.u32,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"u64\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.u64,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"usize\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = compiler.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"bool\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.bool;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.bool,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"f32\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.f32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.f32,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case \"f64\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.f64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.f64,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n\r\n // gc\r\n\r\n case \"iterateRoots\": {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n let expr = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\r\n let type = compiler.currentType;\r\n let signatureReference = type.signatureReference;\r\n compiler.currentType = Type.void;\r\n if (\r\n !type.is(TypeFlags.REFERENCE) ||\r\n !signatureReference ||\r\n signatureReference.parameterTypes.length != 1 ||\r\n signatureReference.parameterTypes[0] != compiler.options.usizeType\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n reportNode.range, type.toString(), \"(ref: usize) => void\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = Type.void;\r\n // just emit a call even if the function doesn't yet exist\r\n compiler.needsIterateRoots = true;\r\n return module.createCall(\"~iterateRoots\", [ expr ], NativeType.None);\r\n }\r\n }\r\n var expr = deferASMCall(compiler, prototype, operands, contextualType, reportNode);\r\n if (expr) {\r\n if (typeArguments && typeArguments.length) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return expr;\r\n }\r\n compiler.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n reportNode.expression.range, prototype.internalName\r\n );\r\n return module.createUnreachable();\r\n}\r\n\r\n/** Defers an inline-assembler-like call to a built-in function. */\r\nfunction deferASMCall(\r\n compiler: Compiler,\r\n prototype: FunctionPrototype,\r\n operands: Expression[],\r\n contextualType: Type,\r\n reportNode: CallExpression\r\n): ExpressionRef {\r\n /* tslint:disable:max-line-length */\r\n switch (prototype.internalName) {\r\n\r\n // TODO: Operators can't be just deferred (don't have a corresponding generic built-in)\r\n // add, sub, mul, div_s, div_u, rem_s, rem_u\r\n // and, or, xor, shl, shr_u, shr_s\r\n // eq, eqz, ne, lt_s, lt_u, le_s, le_u, gt_s, gt_u, ge_s, ge_u\r\n\r\n case \"i32.clz\": return deferASM(\"clz\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.clz\": return deferASM(\"clz\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n case \"i32.ctz\": return deferASM(\"ctz\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.ctz\": return deferASM(\"ctz\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n case \"i32.popcnt\": return deferASM(\"popcnt\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.popcnt\": return deferASM(\"popcnt\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n case \"i32.rotl\": return deferASM(\"rotl\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.rotl\": return deferASM(\"rotl\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n case \"i32.rotr\": return deferASM(\"rotr\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.rotr\": return deferASM(\"rotr\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n case \"f32.abs\": return deferASM(\"abs\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.abs\": return deferASM(\"abs\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.max\": return deferASM(\"max\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.max\": return deferASM(\"max\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.min\": return deferASM(\"min\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.min\": return deferASM(\"min\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.ceil\": return deferASM(\"ceil\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.ceil\": return deferASM(\"ceil\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.floor\": return deferASM(\"floor\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.floor\": return deferASM(\"floor\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.copysign\": return deferASM(\"copysign\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.copysign\": return deferASM(\"copysign\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.nearest\": return deferASM(\"nearest\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.nearest\": return deferASM(\"nearest\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"i32.reinterpret_f32\": return deferASM(\"reinterpret\", compiler, Type.i32, operands, Type.f32, reportNode);\r\n case \"i64.reinterpret_f64\": return deferASM(\"reinterpret\", compiler, Type.i64, operands, Type.f64, reportNode);\r\n case \"f32.reinterpret_i32\": return deferASM(\"reinterpret\", compiler, Type.f32, operands, Type.i32, reportNode);\r\n case \"f64.reinterpret_i64\": return deferASM(\"reinterpret\", compiler, Type.f64, operands, Type.i64, reportNode);\r\n\r\n case \"f32.sqrt\": return deferASM(\"sqrt\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.sqrt\": return deferASM(\"sqrt\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"f32.trunc\": return deferASM(\"trunc\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.trunc\": return deferASM(\"trunc\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"i32.load8_s\": return deferASM(\"load\", compiler, Type.i8, operands, Type.i32, reportNode);\r\n case \"i32.load8_u\": return deferASM(\"load\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.load16_s\": return deferASM(\"load\", compiler, Type.i16, operands, Type.i32, reportNode);\r\n case \"i32.load16_u\": return deferASM(\"load\", compiler, Type.u16, operands, Type.u32, reportNode);\r\n case \"i32.load\": return deferASM(\"load\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.load8_s\": return deferASM(\"load\", compiler, Type.i8, operands, Type.i64, reportNode);\r\n case \"i64.load8_u\": return deferASM(\"load\", compiler, Type.u8, operands, Type.u64, reportNode);\r\n case \"i64.load16_s\": return deferASM(\"load\", compiler, Type.i16, operands, Type.i64, reportNode);\r\n case \"i64.load16_u\": return deferASM(\"load\", compiler, Type.u16, operands, Type.u64, reportNode);\r\n case \"i64.load32_s\": return deferASM(\"load\", compiler, Type.i32, operands, Type.i64, reportNode);\r\n case \"i64.load32_u\": return deferASM(\"load\", compiler, Type.u32, operands, Type.u64, reportNode);\r\n case \"i64.load\": return deferASM(\"load\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n case \"f32.load\": return deferASM(\"load\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.load\": return deferASM(\"load\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n\r\n case \"i32.store8\": return deferASM(\"store\", compiler, Type.i8, operands, Type.i32, reportNode);\r\n case \"i32.store16\": return deferASM(\"store\", compiler, Type.i16, operands, Type.i32, reportNode);\r\n case \"i32.store\": return deferASM(\"store\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.store8\": return deferASM(\"store\", compiler, Type.i8, operands, Type.i64, reportNode);\r\n case \"i64.store16\": return deferASM(\"store\", compiler, Type.i16, operands, Type.i64, reportNode);\r\n case \"i64.store32\": return deferASM(\"store\", compiler, Type.i32, operands, Type.i64, reportNode);\r\n case \"i64.store\": return deferASM(\"store\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n case \"f32.store\": return deferASM(\"store\", compiler, Type.f32, operands, Type.f32, reportNode);\r\n case \"f64.store\": return deferASM(\"store\", compiler, Type.f64, operands, Type.f64, reportNode);\r\n }\r\n if (compiler.options.hasFeature(Feature.THREADS)) {\r\n switch (prototype.internalName) {\r\n case \"i32.atomic.load8_u\": return deferASM(\"atomic.load\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.atomic.load16_u\": return deferASM(\"atomic.load\", compiler, Type.u16, operands, Type.u32, reportNode);\r\n case \"i32.atomic.load\": return deferASM(\"atomic.load\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.atomic.load8_u\": return deferASM(\"atomic.load\", compiler, Type.u8, operands, Type.u64, reportNode);\r\n case \"i64.atomic.load16_u\": return deferASM(\"atomic.load\", compiler, Type.u16, operands, Type.u64, reportNode);\r\n case \"i64.atomic.load32_u\": return deferASM(\"atomic.load\", compiler, Type.u32, operands, Type.u64, reportNode);\r\n case \"i64.atomic.load\": return deferASM(\"atomic.load\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n case \"i32.atomic.store8\": return deferASM(\"atomic.store\", compiler, Type.i8, operands, Type.i32, reportNode);\r\n case \"i32.atomic.store16\": return deferASM(\"atomic.store\", compiler, Type.i16, operands, Type.i32, reportNode);\r\n case \"i32.atomic.store\": return deferASM(\"atomic.store\", compiler, Type.i32, operands, Type.i32, reportNode);\r\n case \"i64.atomic.store8\": return deferASM(\"atomic.store\", compiler, Type.i8, operands, Type.i64, reportNode);\r\n case \"i64.atomic.store16\": return deferASM(\"atomic.store\", compiler, Type.i16, operands, Type.i64, reportNode);\r\n case \"i64.atomic.store32\": return deferASM(\"atomic.store\", compiler, Type.i32, operands, Type.i64, reportNode);\r\n case \"i64.atomic.store\": return deferASM(\"atomic.store\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n\r\n case \"i32.atomic.rmw8_u.add\": return deferASM(\"atomic.add\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw16_u.add\": return deferASM(\"atomic.add\", compiler, Type.u16, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw.add\": return deferASM(\"atomic.add\", compiler, Type.u32, operands, Type.u32, reportNode);\r\n case \"i64.atomic.rmw8_u.add\": return deferASM(\"atomic.add\", compiler, Type.u8, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw16_u.add\": return deferASM(\"atomic.add\", compiler, Type.u16, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw32_u.add\": return deferASM(\"atomic.add\", compiler, Type.u32, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw.add\": return deferASM(\"atomic.add\", compiler, Type.u64, operands, Type.u64, reportNode);\r\n\r\n case \"i32.atomic.rmw8_u.sub\": return deferASM(\"atomic.sub\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw16_u.sub\": return deferASM(\"atomic.sub\", compiler, Type.u16, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw.sub\": return deferASM(\"atomic.sub\", compiler, Type.u32, operands, Type.u32, reportNode);\r\n case \"i64.atomic.rmw8_u.sub\": return deferASM(\"atomic.sub\", compiler, Type.u8, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw16_u.sub\": return deferASM(\"atomic.sub\", compiler, Type.u16, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw32_u.sub\": return deferASM(\"atomic.sub\", compiler, Type.u32, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw.sub\": return deferASM(\"atomic.sub\", compiler, Type.u64, operands, Type.u64, reportNode);\r\n\r\n case \"i32.atomic.rmw8_u.and\": return deferASM(\"atomic.and\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw16_u.and\": return deferASM(\"atomic.and\", compiler, Type.u16, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw.and\": return deferASM(\"atomic.and\", compiler, Type.u32, operands, Type.u32, reportNode);\r\n case \"i64.atomic.rmw8_u.and\": return deferASM(\"atomic.and\", compiler, Type.u8, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw16_u.and\": return deferASM(\"atomic.and\", compiler, Type.u16, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw32_u.and\": return deferASM(\"atomic.and\", compiler, Type.u32, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw.and\": return deferASM(\"atomic.and\", compiler, Type.u64, operands, Type.u64, reportNode);\r\n\r\n case \"i32.atomic.rmw8_u.or\": return deferASM(\"atomic.or\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw16_u.or\": return deferASM(\"atomic.or\", compiler, Type.u16, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw.or\": return deferASM(\"atomic.or\", compiler, Type.u32, operands, Type.u32, reportNode);\r\n case \"i64.atomic.rmw8_u.or\": return deferASM(\"atomic.or\", compiler, Type.u8, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw16_u.or\": return deferASM(\"atomic.or\", compiler, Type.u16, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw32_u.or\": return deferASM(\"atomic.or\", compiler, Type.u32, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw.or\": return deferASM(\"atomic.or\", compiler, Type.u64, operands, Type.u64, reportNode);\r\n\r\n case \"i32.atomic.rmw8_u.xor\": return deferASM(\"atomic.xor\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw16_u.xor\": return deferASM(\"atomic.xor\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw.xor\": return deferASM(\"atomic.xor\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i64.atomic.rmw8_u.xor\": return deferASM(\"atomic.xor\", compiler, Type.u8, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw16_u.xor\": return deferASM(\"atomic.xor\", compiler, Type.u16, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw32_u.xor\": return deferASM(\"atomic.xor\", compiler, Type.u32, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw.xor\": return deferASM(\"atomic.xor\", compiler, Type.u64, operands, Type.u64, reportNode);\r\n\r\n case \"i32.atomic.rmw8_u.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw16_u.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i64.atomic.rmw8_u.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u8, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw16_u.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u16, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw32_u.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u32, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u64, operands, Type.u64, reportNode);\r\n\r\n case \"i32.atomic.rmw8_u.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw16_u.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i32.atomic.rmw.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u8, operands, Type.u32, reportNode);\r\n case \"i64.atomic.rmw8_u.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u8, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw16_u.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u16, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw32_u.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u32, operands, Type.u64, reportNode);\r\n case \"i64.atomic.rmw.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u64, operands, Type.u64, reportNode);\r\n\r\n case \"i32.wait\": return deferASM(\"atomic.wait\", compiler, Type.i32, operands, Type.u32, reportNode);\r\n case \"i64.wait\": return deferASM(\"atomic.wait\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n case \"i32.notify\": return deferASM(\"atomic.notify\", compiler, Type.i32, operands, Type.u32, reportNode);\r\n case \"i64.notify\": return deferASM(\"atomic.notify\", compiler, Type.i64, operands, Type.i64, reportNode);\r\n }\r\n }\r\n /* tslint:enable:max-line-length */\r\n return 0;\r\n}\r\n\r\n/** A helper for deferring inline-assembler-like calls to built-in functions. */\r\nfunction deferASM(\r\n name: string,\r\n compiler: Compiler,\r\n typeArgument: Type,\r\n operands: Expression[],\r\n valueType: Type,\r\n reportNode: CallExpression\r\n): ExpressionRef {\r\n // Built-in wasm functions can be namespaced like atomic.{OPERATION}\r\n // Split name by '.' to find member function prototype\r\n // FIXME: This is slower than it needs to be due to the way resolving works atm\r\n var names = name.split(\".\");\r\n var prototype: Element = assert(compiler.program.elementsLookup.get(names[0]));\r\n if (names.length > 1) {\r\n for (let i = 1; i < names.length; i++) {\r\n const subName = names[i];\r\n if (prototype && prototype.members) {\r\n prototype = assert(prototype.members.get(subName));\r\n }\r\n }\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n return compileCall(compiler, prototype, [ typeArgument ], operands, valueType, reportNode);\r\n}\r\n\r\n/** Evaluates the constant type of a type argument *or* expression. */\r\nfunction evaluateConstantType(\r\n compiler: Compiler,\r\n typeArguments: Type[] | null,\r\n operands: Expression[],\r\n reportNode: Node\r\n): Type | null {\r\n if (operands.length == 0) { // requires type argument\r\n if (!typeArguments || typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return null;\r\n }\r\n return typeArguments[0];\r\n }\r\n if (operands.length == 1) { // optional type argument\r\n if (typeArguments) {\r\n if (typeArguments.length == 1) {\r\n compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n if (typeArguments.length) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return null;\r\n }\r\n compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n }\r\n } else {\r\n compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n }\r\n return compiler.currentType;\r\n }\r\n if (typeArguments && typeArguments.length > 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return null;\r\n}\r\n\r\n/** Evaluates a `constantOffset` argument.*/\r\nfunction evaluateConstantOffset(compiler: Compiler, expression: Expression): i32 {\r\n var expr: ExpressionRef;\r\n var value: i32;\r\n if (compiler.options.isWasm64) {\r\n expr = compiler.precomputeExpression(expression, Type.usize64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n if (\r\n getExpressionId(expr) != ExpressionId.Const ||\r\n getExpressionType(expr) != NativeType.I64 ||\r\n getConstValueI64High(expr) != 0 ||\r\n (value = getConstValueI64Low(expr)) < 0\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n value = -1;\r\n }\r\n } else {\r\n expr = compiler.precomputeExpression(expression, Type.usize32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n if (\r\n getExpressionId(expr) != ExpressionId.Const ||\r\n getExpressionType(expr) != NativeType.I32 ||\r\n (value = getConstValueI32(expr)) < 0\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n value = -1;\r\n }\r\n }\r\n return value;\r\n}\r\n\r\n/** Compiles an abort wired to the conditionally imported 'abort' function. */\r\nexport function compileAbort(\r\n compiler: Compiler,\r\n message: Expression | null,\r\n reportNode: Node\r\n): ExpressionRef {\r\n var program = compiler.program;\r\n var module = compiler.module;\r\n\r\n var stringType = program.typesLookup.get(\"string\");\r\n if (!stringType) return module.createUnreachable();\r\n\r\n var abortInstance = program.abortInstance;\r\n if (!(abortInstance && compiler.compileFunction(abortInstance))) return module.createUnreachable();\r\n\r\n var messageArg = message != null\r\n ? compiler.compileExpression(message, stringType, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n : stringType.toNativeZero(module);\r\n\r\n var filenameArg = compiler.ensureStaticString(reportNode.range.source.normalizedPath);\r\n\r\n compiler.currentType = Type.void;\r\n return module.createBlock(null, [\r\n module.createCall(\r\n abortInstance.internalName, [\r\n messageArg,\r\n filenameArg,\r\n module.createI32(reportNode.range.line),\r\n module.createI32(reportNode.range.column)\r\n ],\r\n NativeType.None\r\n ),\r\n module.createUnreachable()\r\n ]);\r\n}\r\n\r\n/** Compiles the iterateRoots function if requires. */\r\nexport function compileIterateRoots(compiler: Compiler): void {\r\n var module = compiler.module;\r\n var exprs = new Array();\r\n\r\n for (let element of compiler.program.elementsLookup.values()) {\r\n if (element.kind != ElementKind.GLOBAL) continue;\r\n let global = element;\r\n let classReference = global.type.classReference;\r\n if (\r\n global.is(CommonFlags.COMPILED) &&\r\n classReference !== null &&\r\n !classReference.hasDecorator(DecoratorFlags.UNMANAGED)\r\n ) {\r\n if (global.is(CommonFlags.INLINED)) {\r\n let value = global.constantIntegerValue;\r\n exprs.push(\r\n module.createCallIndirect(\r\n module.createGetLocal(0, NativeType.I32),\r\n [\r\n compiler.options.isWasm64\r\n ? module.createI64(i64_low(value), i64_high(value))\r\n : module.createI32(i64_low(value))\r\n ],\r\n \"i_\"\r\n )\r\n );\r\n } else {\r\n exprs.push(\r\n module.createCallIndirect(\r\n module.createGetLocal(0, NativeType.I32),\r\n [\r\n module.createGetGlobal(\r\n global.internalName,\r\n compiler.options.nativeSizeType\r\n )\r\n ],\r\n \"i_\"\r\n )\r\n );\r\n }\r\n }\r\n }\r\n var typeRef = compiler.ensureFunctionType([ Type.i32 ], Type.void);\r\n module.addFunction(\"~iterateRoots\", typeRef, [],\r\n exprs.length\r\n ? module.createBlock(null, exprs)\r\n : module.createNop()\r\n );\r\n}\r\n\r\n/** Ensures that the specified class's GC hook exists and returns its function table index. */\r\nexport function ensureGCHook(\r\n compiler: Compiler,\r\n classInstance: Class\r\n): u32 {\r\n var program = compiler.program;\r\n assert(classInstance.type.isManaged(program));\r\n\r\n // check if the GC hook has already been created\r\n {\r\n let existingIndex = classInstance.gcHookIndex;\r\n if (existingIndex != -1) return existingIndex;\r\n }\r\n\r\n // check if the class implements a custom GC function (only valid for internals)\r\n var members = classInstance.members;\r\n if (classInstance.prototype.declaration.range.source.isLibrary) {\r\n if (members !== null && members.has(\"__gc\")) {\r\n let gcPrototype = assert(members.get(\"__gc\"));\r\n assert(gcPrototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let gcInstance = assert(program.resolver.resolveFunction(gcPrototype, null));\r\n assert(gcInstance.is(CommonFlags.PRIVATE | CommonFlags.INSTANCE));\r\n assert(!gcInstance.isAny(CommonFlags.AMBIENT | CommonFlags.VIRTUAL));\r\n assert(gcInstance.signature.parameterTypes.length == 0);\r\n assert(gcInstance.signature.returnType == Type.void);\r\n gcInstance.internalName = classInstance.internalName + \"~gc\";\r\n assert(compiler.compileFunction(gcInstance));\r\n let index = compiler.ensureFunctionTableEntry(gcInstance);\r\n classInstance.gcHookIndex = index;\r\n return index;\r\n }\r\n }\r\n\r\n var module = compiler.module;\r\n var options = compiler.options;\r\n var nativeSizeType = options.nativeSizeType;\r\n var nativeSizeSize = options.usizeType.byteSize;\r\n var body = new Array();\r\n\r\n // nothing to mark if 'this' is null\r\n body.push(\r\n module.createIf(\r\n module.createUnary(\r\n options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n module.createGetLocal(0, nativeSizeType)\r\n ),\r\n module.createReturn()\r\n )\r\n );\r\n\r\n // remember the function index so we don't recurse infinitely\r\n var functionTable = compiler.functionTable;\r\n var gcHookIndex = functionTable.length;\r\n functionTable.push(\"\");\r\n classInstance.gcHookIndex = gcHookIndex;\r\n\r\n // if the class extends a base class, call its hook first (calls mark)\r\n var baseInstance = classInstance.base;\r\n if (baseInstance) {\r\n assert(baseInstance.type.isManaged(program));\r\n body.push(\r\n module.createCallIndirect(\r\n module.createI32(\r\n ensureGCHook(compiler, baseInstance.type.classReference)\r\n ),\r\n [\r\n module.createGetLocal(0, nativeSizeType)\r\n ],\r\n nativeSizeType == NativeType.I64 ? \"I_\" : \"i_\"\r\n )\r\n );\r\n\r\n // if this class is the top-most base class, mark the instance\r\n } else {\r\n body.push(\r\n module.createCall(assert(program.gcMarkInstance).internalName, [\r\n module.createGetLocal(0, nativeSizeType)\r\n ], NativeType.None)\r\n );\r\n }\r\n\r\n // mark instances assigned to own fields that are again references\r\n if (members) {\r\n for (let member of members.values()) {\r\n if (member.kind == ElementKind.FIELD) {\r\n if ((member).parent === classInstance) {\r\n let type = (member).type;\r\n if (type.isManaged(program)) {\r\n let offset = (member).memoryOffset;\r\n assert(offset >= 0);\r\n body.push(\r\n module.createCall(assert(program.gcMarkInstance).internalName, [\r\n module.createLoad(\r\n nativeSizeSize,\r\n false,\r\n module.createGetLocal(0, nativeSizeType),\r\n nativeSizeType,\r\n offset\r\n )\r\n ], NativeType.None)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // add the function to the module and return its table index\r\n var funcName = classInstance.internalName + \"~gc\";\r\n module.addFunction(\r\n funcName,\r\n compiler.ensureFunctionType(null, Type.void, options.usizeType),\r\n null,\r\n module.createBlock(null, body)\r\n );\r\n functionTable[gcHookIndex] = funcName;\r\n return gcHookIndex;\r\n}\r\n","/** @module util *//***/\r\n\r\n/** Tests if the bit at the specified index is set within a 64-bit map. */\r\nexport function bitsetIs(map: I64, index: i32): bool {\r\n assert(index >= 0 && index < 64);\r\n return i64_ne(\r\n i64_and(\r\n map,\r\n i64_shl(\r\n i64_one,\r\n i64_new(index)\r\n )\r\n ),\r\n i64_zero\r\n );\r\n}\r\n\r\n/** Sets or unsets the bit at the specified index within a 64-bit map and returns the new map. */\r\nexport function bitsetSet(map: I64, index: i32, isSet: bool): I64 {\r\n assert(index >= 0 && index < 64);\r\n return isSet\r\n ? i64_or(\r\n map,\r\n i64_shl(\r\n i64_one,\r\n i64_new(index)\r\n )\r\n )\r\n : i64_and(\r\n map,\r\n i64_not(\r\n i64_shl(\r\n i64_one,\r\n i64_new(index)\r\n )\r\n )\r\n );\r\n}\r\n","/** @module util *//***/\r\n\r\n/** An enum of named character codes. */\r\nexport const enum CharCode {\r\n\r\n NULL = 0,\r\n LINEFEED = 0x0A,\r\n CARRIAGERETURN = 0x0D,\r\n LINESEPARATOR = 0x2028,\r\n PARAGRAPHSEPARATOR = 0x2029,\r\n NEXTLINE = 0x0085,\r\n\r\n SPACE = 0x20,\r\n NONBREAKINGSPACE = 0xA0,\r\n ENQUAD = 0x2000,\r\n EMQUAD = 0x2001,\r\n ENSPACE = 0x2002,\r\n EMSPACE = 0x2003,\r\n THREEPEREMSPACE = 0x2004,\r\n FOURPEREMSPACE = 0x2005,\r\n SIXPEREMSPACE = 0x2006,\r\n FIGURESPACE = 0x2007,\r\n PUNCTUATIONSPACE = 0x2008,\r\n THINSPACE = 0x2009,\r\n HAIRSPACE = 0x200A,\r\n ZEROWIDTHSPACE = 0x200B,\r\n NARROWNOBREAKSPACE = 0x202F,\r\n IDEOGRAPHICSPACE = 0x3000,\r\n MATHEMATICALSPACE = 0x205F,\r\n OGHAM = 0x1680,\r\n\r\n _ = 0x5F,\r\n\r\n _0 = 0x30,\r\n _1 = 0x31,\r\n _2 = 0x32,\r\n _3 = 0x33,\r\n _4 = 0x34,\r\n _5 = 0x35,\r\n _6 = 0x36,\r\n _7 = 0x37,\r\n _8 = 0x38,\r\n _9 = 0x39,\r\n\r\n a = 0x61,\r\n b = 0x62,\r\n c = 0x63,\r\n d = 0x64,\r\n e = 0x65,\r\n f = 0x66,\r\n g = 0x67,\r\n h = 0x68,\r\n i = 0x69,\r\n j = 0x6A,\r\n k = 0x6B,\r\n l = 0x6C,\r\n m = 0x6D,\r\n n = 0x6E,\r\n o = 0x6F,\r\n p = 0x70,\r\n q = 0x71,\r\n r = 0x72,\r\n s = 0x73,\r\n t = 0x74,\r\n u = 0x75,\r\n v = 0x76,\r\n w = 0x77,\r\n x = 0x78,\r\n y = 0x79,\r\n z = 0x7A,\r\n\r\n A = 0x41,\r\n B = 0x42,\r\n C = 0x43,\r\n D = 0x44,\r\n E = 0x45,\r\n F = 0x46,\r\n G = 0x47,\r\n H = 0x48,\r\n I = 0x49,\r\n J = 0x4A,\r\n K = 0x4B,\r\n L = 0x4C,\r\n M = 0x4D,\r\n N = 0x4E,\r\n O = 0x4F,\r\n P = 0x50,\r\n Q = 0x51,\r\n R = 0x52,\r\n S = 0x53,\r\n T = 0x54,\r\n U = 0x55,\r\n V = 0x56,\r\n W = 0x57,\r\n X = 0x58,\r\n Y = 0x59,\r\n Z = 0x5a,\r\n\r\n AMPERSAND = 0x26,\r\n ASTERISK = 0x2A,\r\n AT = 0x40,\r\n BACKSLASH = 0x5C,\r\n BACKTICK = 0x60,\r\n BAR = 0x7C,\r\n CARET = 0x5E,\r\n CLOSEBRACE = 0x7D,\r\n CLOSEBRACKET = 0x5D,\r\n CLOSEPAREN = 0x29,\r\n COLON = 0x3A,\r\n COMMA = 0x2C,\r\n DOLLAR = 0x24,\r\n DOT = 0x2E,\r\n DOUBLEQUOTE = 0x22,\r\n EQUALS = 0x3D,\r\n EXCLAMATION = 0x21,\r\n GREATERTHAN = 0x3E,\r\n HASH = 0x23,\r\n LESSTHAN = 0x3C,\r\n MINUS = 0x2D,\r\n OPENBRACE = 0x7B,\r\n OPENBRACKET = 0x5B,\r\n OPENPAREN = 0x28,\r\n PERCENT = 0x25,\r\n PLUS = 0x2B,\r\n QUESTION = 0x3F,\r\n SEMICOLON = 0x3B,\r\n SINGLEQUOTE = 0x27,\r\n SLASH = 0x2F,\r\n TILDE = 0x7E,\r\n\r\n BACKSPACE = 0x08,\r\n FORMFEED = 0x0C,\r\n BYTEORDERMARK = 0xFEFF,\r\n TAB = 0x09,\r\n VERTICALTAB = 0x0B\r\n}\r\n\r\n/** Tests if the specified character code is some sort of line break. */\r\nexport function isLineBreak(c: CharCode): bool {\r\n switch (c) {\r\n case CharCode.LINEFEED:\r\n case CharCode.CARRIAGERETURN:\r\n case CharCode.LINESEPARATOR:\r\n case CharCode.PARAGRAPHSEPARATOR: {\r\n return true;\r\n }\r\n default: {\r\n return false;\r\n }\r\n }\r\n}\r\n\r\n/** Tests if the specified character code is some sort of white space. */\r\nexport function isWhiteSpace(c: i32): bool {\r\n switch (c) {\r\n case CharCode.SPACE:\r\n case CharCode.TAB:\r\n case CharCode.VERTICALTAB:\r\n case CharCode.FORMFEED:\r\n case CharCode.NONBREAKINGSPACE:\r\n case CharCode.NEXTLINE:\r\n case CharCode.OGHAM:\r\n case CharCode.NARROWNOBREAKSPACE:\r\n case CharCode.MATHEMATICALSPACE:\r\n case CharCode.IDEOGRAPHICSPACE:\r\n case CharCode.BYTEORDERMARK: {\r\n return true;\r\n }\r\n default: {\r\n return c >= CharCode.ENQUAD && c <= CharCode.ZEROWIDTHSPACE;\r\n }\r\n }\r\n}\r\n\r\n/** Tests if the specified character code is a valid decimal digit. */\r\nexport function isDecimalDigit(c: i32): bool {\r\n return c >= CharCode._0 && c <= CharCode._9;\r\n}\r\n\r\n/** Tests if the specified character code is a valid octal digit. */\r\nexport function isOctalDigit(c: i32): bool {\r\n return c >= CharCode._0 && c <= CharCode._7;\r\n}\r\n\r\n/** Tests if the specified character code is a valid start of an identifier. */\r\nexport function isIdentifierStart(c: i32): bool {\r\n return c >= CharCode.A && c <= CharCode.Z\r\n || c >= CharCode.a && c <= CharCode.z\r\n || c == CharCode.DOLLAR\r\n || c == CharCode._\r\n || c > 0x7f && isUnicodeIdentifierStart(c);\r\n}\r\n\r\n/** Tests if the specified character code is a valid keyword character. */\r\nexport function isKeywordCharacter(c: i32): bool {\r\n return c >= CharCode.a && c <= CharCode.z;\r\n}\r\n\r\n/** Tests if the specified character code is a valid part of an identifier. */\r\nexport function isIdentifierPart(c: i32): bool {\r\n return c >= CharCode.A && c <= CharCode.Z\r\n || c >= CharCode.a && c <= CharCode.z\r\n || c >= CharCode._0 && c <= CharCode._9\r\n || c == CharCode.DOLLAR\r\n || c == CharCode._\r\n || c > 0x7f && isUnicodeIdentifierPart(c);\r\n}\r\n\r\n// storing as u16 to save memory\r\nconst unicodeIdentifierStart: u16[] = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514,\r\n 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774,\r\n 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969,\r\n 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088,\r\n 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384,\r\n 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474,\r\n 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\r\n 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\r\n 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705,\r\n 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784,\r\n 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873,\r\n 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958,\r\n 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986,\r\n 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125,\r\n 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240,\r\n 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333,\r\n 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\r\n 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634,\r\n 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725,\r\n 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\r\n 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840,\r\n 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186,\r\n 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293,\r\n 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\r\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798,\r\n 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\r\n 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872,\r\n 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016,\r\n 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389,\r\n 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688,\r\n 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141,\r\n 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424,\r\n 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025,\r\n 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130,\r\n 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\r\n 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\r\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505,\r\n 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520,\r\n 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670,\r\n 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720,\r\n 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540,\r\n 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893,\r\n 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538,\r\n 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888,\r\n 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015,\r\n 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\r\n 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520,\r\n 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695,\r\n 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739,\r\n 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798,\r\n 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243,\r\n 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285,\r\n 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323,\r\n 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\r\n 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\r\n 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\nconst unicodeIdentifierPart: u16[] = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415,\r\n 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520,\r\n 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788,\r\n 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112,\r\n 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423,\r\n 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482,\r\n 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525,\r\n 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602,\r\n 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632,\r\n 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693,\r\n 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757,\r\n 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821,\r\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884,\r\n 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929,\r\n 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972,\r\n 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018,\r\n 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088,\r\n 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157,\r\n 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216,\r\n 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\r\n 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340,\r\n 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424,\r\n 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515,\r\n 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570,\r\n 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720,\r\n 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751,\r\n 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789,\r\n 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895,\r\n 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028,\r\n 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304,\r\n 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744,\r\n 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808,\r\n 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108,\r\n 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902,\r\n 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099,\r\n 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272,\r\n 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516,\r\n 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783,\r\n 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155,\r\n 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676,\r\n 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027,\r\n 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134,\r\n 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205,\r\n 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417,\r\n 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477,\r\n 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\r\n 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559,\r\n 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686,\r\n 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728,\r\n 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\r\n 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799,\r\n 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512,\r\n 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783,\r\n 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072,\r\n 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309,\r\n 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584,\r\n 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741,\r\n 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808,\r\n 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203,\r\n 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275,\r\n 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321,\r\n 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008,\r\n 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140,\r\n 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382,\r\n 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\n\r\nfunction lookupInUnicodeMap(code: u16, map: u16[]): bool {\r\n if (code < map[0]) return false;\r\n\r\n var lo = 0;\r\n var hi = map.length;\r\n var mid: i32;\r\n\r\n while (lo + 1 < hi) {\r\n mid = lo + (hi - lo) / 2;\r\n mid -= mid % 2;\r\n if (map[mid] <= code && code <= map[mid + 1]) {\r\n return true;\r\n }\r\n if (code < map[mid]) {\r\n hi = mid;\r\n } else {\r\n lo = mid + 2;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isUnicodeIdentifierStart(code: i32): bool {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code as u16, unicodeIdentifierStart);\r\n}\r\n\r\nfunction isUnicodeIdentifierPart(code: i32): bool {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code as u16, unicodeIdentifierPart);\r\n}\r\n","export function makeArray(original: Array | null = null): Array {\r\n if (original) {\r\n let cloned = new Array(original.length);\r\n for (let i = 0, k = original.length; i < k; ++i) unchecked(cloned[i] = original[i]);\r\n return cloned;\r\n }\r\n return new Array();\r\n}\r\n\r\nexport function makeSet(original: Set | null = null): Set {\r\n if (original) {\r\n let cloned = new Set();\r\n for (let v of original) cloned.add(v);\r\n return cloned;\r\n }\r\n return new Set();\r\n}\r\n\r\nexport function makeMap(original: Map | null = null): Map {\r\n if (original) {\r\n let cloned = new Map();\r\n for (let [k, v] of original) cloned.set(k, v);\r\n return cloned;\r\n }\r\n return new Map();\r\n}\r\n","/** @module util *//***/\r\n\r\nimport {\r\n CharCode\r\n} from \"./charcode\";\r\n\r\nconst separator = CharCode.SLASH;\r\n\r\n/**\r\n * Normalizes the specified path, removing interior placeholders.\r\n * Expects a posix-compatible relative path (not Windows compatible).\r\n */\r\nexport function normalizePath(path: string): string {\r\n var pos = 0;\r\n var len = path.length;\r\n\r\n // trim leading './'\r\n while (pos + 1 < len &&\r\n path.charCodeAt(pos) == CharCode.DOT &&\r\n path.charCodeAt(pos + 1) == separator\r\n ) {\r\n pos += 2;\r\n }\r\n\r\n if (pos > 0 || len < path.length) {\r\n path = path.substring(pos, len);\r\n len -= pos;\r\n pos = 0;\r\n }\r\n\r\n var atEnd: bool;\r\n while (pos + 1 < len) {\r\n atEnd = false;\r\n\r\n // we are only interested in '/.' sequences ...\r\n if (\r\n path.charCodeAt(pos) == separator &&\r\n path.charCodeAt(pos + 1) == CharCode.DOT\r\n ) {\r\n // '/.' ( '/' | $ )\r\n atEnd = pos + 2 == len;\r\n if (atEnd ||\r\n pos + 2 < len &&\r\n path.charCodeAt(pos + 2) == separator\r\n ) {\r\n path = atEnd\r\n ? path.substring(0, pos)\r\n : path.substring(0, pos) + path.substring(pos + 2);\r\n len -= 2;\r\n continue;\r\n }\r\n\r\n // '/.' ( './' | '.' $ )\r\n atEnd = pos + 3 == len;\r\n if (atEnd && path.charCodeAt(pos + 2) == CharCode.DOT ||\r\n pos + 3 < len &&\r\n path.charCodeAt(pos + 2) == CharCode.DOT &&\r\n path.charCodeAt(pos + 3) == separator\r\n ) {\r\n // find preceeding '/'\r\n let ipos = pos;\r\n while (--ipos >= 0) {\r\n if (path.charCodeAt(ipos) == separator) {\r\n if (pos - ipos != 3 ||\r\n path.charCodeAt(ipos + 1) != CharCode.DOT ||\r\n path.charCodeAt(ipos + 2) != CharCode.DOT\r\n ) { // exclude '..' itself\r\n path = atEnd\r\n ? path.substring(0, ipos)\r\n : path.substring(0, ipos) + path.substring(pos + 3);\r\n len -= pos + 3 - ipos;\r\n pos = ipos - 1; // incremented again at end of loop\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // if there's no preceeding '/', trim start if non-empty\r\n if (ipos < 0 && pos > 0) {\r\n if (pos != 2 ||\r\n path.charCodeAt(0) != CharCode.DOT ||\r\n path.charCodeAt(1) != CharCode.DOT\r\n ) { // exclude '..' itself\r\n path = path.substring(pos + 4);\r\n len = path.length;\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n pos++;\r\n }\r\n return len > 0 ? path : \".\";\r\n}\r\n\r\n/** Resolves the specified path relative to the specified origin. */\r\nexport function resolvePath(normalizedPath: string, origin: string): string {\r\n if (normalizedPath.startsWith(\"std/\")) {\r\n return normalizedPath;\r\n }\r\n return normalizePath(\r\n dirname(origin) + String.fromCharCode(separator) + normalizedPath\r\n );\r\n}\r\n\r\n/** Obtains the directory portion of a normalized path. */\r\nexport function dirname(normalizedPath: string): string {\r\n var pos = normalizedPath.length;\r\n while (--pos > 0) {\r\n if (normalizedPath.charCodeAt(pos) == separator) {\r\n return normalizedPath.substring(0, pos);\r\n }\r\n }\r\n return \".\";\r\n}\r\n","/** @module util *//***/\r\n\r\nconst indentX1 = \" \";\r\nconst indentX2 = \" \";\r\nconst indentX4 = \" \";\r\n\r\n/** Creates an indentation matching the number of specified levels. */\r\nexport function indent(sb: string[], level: i32): void {\r\n while (level >= 4) {\r\n sb.push(indentX4);\r\n level -= 4;\r\n }\r\n if (level >= 2) {\r\n sb.push(indentX2);\r\n level -= 2;\r\n }\r\n if (level) {\r\n sb.push(indentX1);\r\n }\r\n}\r\n","/** @module util *//***/\r\n\r\n/** Reads an 8-bit integer from the specified buffer. */\r\nexport function readI8(buffer: Uint8Array, offset: i32): i32 {\r\n return buffer[offset];\r\n}\r\n\r\n/** Writes an 8-bit integer to the specified buffer. */\r\nexport function writeI8(value: i32, buffer: Uint8Array, offset: i32): void {\r\n buffer[offset] = value;\r\n}\r\n\r\n/** Reads a 16-bit integer from the specified buffer. */\r\nexport function readI16(buffer: Uint8Array, offset: i32): i32 {\r\n return buffer[offset ]\r\n | buffer[offset + 1] << 8;\r\n}\r\n\r\n/** Writes a 16-bit integer to the specified buffer. */\r\nexport function writeI16(value: i32, buffer: Uint8Array, offset: i32): void {\r\n buffer[offset ] = value;\r\n buffer[offset + 1] = value >>> 8;\r\n}\r\n\r\n/** Reads a 32-bit integer from the specified buffer. */\r\nexport function readI32(buffer: Uint8Array, offset: i32): i32 {\r\n return buffer[offset ]\r\n | buffer[offset + 1] << 8\r\n | buffer[offset + 2] << 16\r\n | buffer[offset + 3] << 24;\r\n}\r\n\r\n/** Writes a 32-bit integer to the specified buffer. */\r\nexport function writeI32(value: i32, buffer: Uint8Array, offset: i32): void {\r\n buffer[offset ] = value;\r\n buffer[offset + 1] = value >>> 8;\r\n buffer[offset + 2] = value >>> 16;\r\n buffer[offset + 3] = value >>> 24;\r\n}\r\n\r\n/** Reads a 64-bit integer from the specified buffer. */\r\nexport function readI64(buffer: Uint8Array, offset: i32): I64 {\r\n var lo = readI32(buffer, offset);\r\n var hi = readI32(buffer, offset + 4);\r\n return i64_new(lo, hi);\r\n}\r\n\r\n/** Writes a 64-bit integer to the specified buffer. */\r\nexport function writeI64(value: I64, buffer: Uint8Array, offset: i32): void {\r\n writeI32(i64_low(value), buffer, offset);\r\n writeI32(i64_high(value), buffer, offset + 4);\r\n}\r\n\r\n/** Reads a 32-bit float from the specified buffer. */\r\nexport function readF32(buffer: Uint8Array, offset: i32): f32 {\r\n return i32_as_f32(readI32(buffer, offset));\r\n}\r\n\r\n/** Writes a 32-bit float to the specified buffer. */\r\nexport function writeF32(value: f32, buffer: Uint8Array, offset: i32): void {\r\n writeI32(f32_as_i32(value), buffer, offset);\r\n}\r\n\r\n/** Reads a 64-bit float from the specified buffer. */\r\nexport function readF64(buffer: Uint8Array, offset: i32): f64 {\r\n return i64_as_f64(readI64(buffer, offset));\r\n}\r\n\r\n/** Writes a 64-bit float to the specified buffer. */\r\nexport function writeF64(value: f64, buffer: Uint8Array, offset: i32): void {\r\n var valueI64 = f64_as_i64(value);\r\n writeI32(i64_low(valueI64), buffer, offset);\r\n writeI32(i64_high(valueI64), buffer, offset + 4);\r\n}\r\n","/**\r\n * Low-level C-like compiler API.\r\n * @module index\r\n *//***/\r\n\r\nimport {\r\n Compiler,\r\n Options,\r\n Target,\r\n Feature\r\n} from \"./compiler\";\r\n\r\nimport {\r\n Decompiler\r\n} from \"./decompiler\";\r\n\r\nimport {\r\n IDLBuilder,\r\n TSDBuilder\r\n} from \"./definitions\";\r\n\r\nimport {\r\n DiagnosticMessage,\r\n DiagnosticCategory,\r\n formatDiagnosticMessage\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Module\r\n} from \"./module\";\r\n\r\nimport {\r\n Parser\r\n} from \"./parser\";\r\n\r\nimport {\r\n Program\r\n} from \"./program\";\r\n\r\n/** Parses a source file. If `parser` has been omitted a new one is created. */\r\nexport function parseFile(text: string, path: string, isEntry: bool = false,\r\n parser: Parser | null = null\r\n): Parser {\r\n if (!parser) parser = new Parser();\r\n parser.parseFile(text, path, isEntry);\r\n return parser;\r\n}\r\n\r\n/** Obtains the next required file's path. Returns `null` once complete. */\r\nexport function nextFile(parser: Parser): string | null {\r\n return parser.nextFile();\r\n}\r\n\r\n/** Obtains the next diagnostic message. Returns `null` once complete. */\r\nexport function nextDiagnostic(parser: Parser): DiagnosticMessage | null {\r\n var program = parser.program;\r\n return program.diagnosticsOffset < program.diagnostics.length\r\n ? program.diagnostics[program.diagnosticsOffset++]\r\n : null;\r\n}\r\n\r\n/** Formats a diagnostic message to a string. */\r\nexport { formatDiagnosticMessage as formatDiagnostic };\r\n\r\n/** Tests whether a diagnostic is informatory. */\r\nexport function isInfo(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.INFO;\r\n}\r\n\r\n/** Tests whether a diagnostic is a warning. */\r\nexport function isWarning(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.WARNING;\r\n}\r\n\r\n/** Tests whether a diagnostic is an error. */\r\nexport function isError(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.ERROR;\r\n}\r\n\r\n/** Creates a new set of compiler options. */\r\nexport function createOptions(): Options {\r\n return new Options();\r\n}\r\n\r\n/** Sets the `target` option. */\r\nexport function setTarget(options: Options, target: Target): void {\r\n options.target = target;\r\n}\r\n\r\n/** Sets the `noTreeShaking` option. */\r\nexport function setNoTreeShaking(options: Options, noTreeShaking: bool): void {\r\n options.noTreeShaking = noTreeShaking;\r\n}\r\n\r\n/** Sets the `noAssert` option. */\r\nexport function setNoAssert(options: Options, noAssert: bool): void {\r\n options.noAssert = noAssert;\r\n}\r\n\r\n/** Sets the `importMemory` option. */\r\nexport function setImportMemory(options: Options, importMemory: bool): void {\r\n options.importMemory = importMemory;\r\n}\r\n\r\n/** Sets the `importTable` option. */\r\nexport function setImportTable(options: Options, importTable: bool): void {\r\n options.importTable = importTable;\r\n}\r\n\r\n/** Sets the `sourceMap` option. */\r\nexport function setSourceMap(options: Options, sourceMap: bool): void {\r\n options.sourceMap = sourceMap;\r\n}\r\n\r\n/** Sets the `memoryBase` option. */\r\nexport function setMemoryBase(options: Options, memoryBase: u32): void {\r\n options.memoryBase = memoryBase;\r\n}\r\n\r\n/** Sets a 'globalAliases' value. */\r\nexport function setGlobalAlias(options: Options, name: string, alias: string): void {\r\n var globalAliases = options.globalAliases;\r\n if (!globalAliases) options.globalAliases = globalAliases = new Map();\r\n globalAliases.set(name, alias);\r\n}\r\n\r\n/** Sign extension operations. */\r\nexport const FEATURE_SIGN_EXTENSION = Feature.SIGN_EXTENSION;\r\n/** Mutable global imports and exports. */\r\nexport const FEATURE_MUTABLE_GLOBAL = Feature.MUTABLE_GLOBAL;\r\n/** Bulk memory operations. */\r\nexport const FEATURE_BULK_MEMORY = Feature.BULK_MEMORY;\r\n/** SIMD types and operations. */\r\nexport const FEATURE_SIMD = Feature.SIMD;\r\n/** Threading and atomic operations. */\r\nexport const FEATURE_THREADS = Feature.THREADS;\r\n\r\n/** Enables a specific feature. */\r\nexport function enableFeature(options: Options, feature: Feature): void {\r\n options.features |= feature;\r\n}\r\n\r\n/** Gives the compiler a hint at the optimize levels that will be used later on. */\r\nexport function setOptimizeLevelHints(options: Options, optimizeLevel: i32, shrinkLevel: i32): void {\r\n options.optimizeLevelHint = optimizeLevel;\r\n options.shrinkLevelHint = shrinkLevel;\r\n}\r\n\r\n/** Finishes parsing. */\r\nexport function finishParsing(parser: Parser): Program {\r\n return parser.finish();\r\n}\r\n\r\n/** Compiles the sources computed by the parser to a module. */\r\nexport function compileProgram(program: Program, options: Options | null = null): Module {\r\n return new Compiler(program, options).compile();\r\n}\r\n\r\n/** Decompiles a module to its (low level) source. */\r\nexport function decompileModule(module: Module): string {\r\n var decompiler = new Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n}\r\n\r\n/** Builds WebIDL definitions for the specified program. */\r\nexport function buildIDL(program: Program): string {\r\n return IDLBuilder.build(program);\r\n}\r\n\r\n/** Builds TypeScript definitions for the specified program. */\r\nexport function buildTSD(program: Program): string {\r\n return TSDBuilder.build(program);\r\n}\r\n\r\n/** Prefix indicating a library file. */\r\nexport { LIBRARY_PREFIX } from \"./common\";\r\n\r\n// Full API\r\nexport * from \"./ast\";\r\n// export * from \"./binary\";\r\nexport * from \"./common\";\r\nexport * from \"./compiler\";\r\nexport * from \"./decompiler\";\r\nexport * from \"./definitions\";\r\nexport * from \"./diagnosticMessages.generated\";\r\nexport * from \"./diagnostics\";\r\nexport * from \"./module\";\r\nexport * from \"./parser\";\r\nexport * from \"./program\";\r\nexport * from \"./resolver\";\r\nexport * from \"./tokenizer\";\r\nexport * from \"./types\";\r\nexport * from \"./util\";\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://assemblyscript/webpack/universalModuleDefinition","webpack://assemblyscript/webpack/bootstrap","webpack://assemblyscript/./src/util/index.ts","webpack://assemblyscript/./src/common.ts","webpack://assemblyscript/./src/diagnostics.ts","webpack://assemblyscript/./src/module.ts","webpack://assemblyscript/./src/ast.ts","webpack://assemblyscript/./src/program.ts","webpack://assemblyscript/./src/tokenizer.ts","webpack://assemblyscript/./src/types.ts","webpack://assemblyscript/(webpack)/buildin/global.js","webpack://assemblyscript/./src/compiler.ts","webpack://assemblyscript/./src/diagnosticMessages.generated.ts","webpack://assemblyscript/./src/resolver.ts","webpack://assemblyscript/./src/decompiler.ts","webpack://assemblyscript/./src/definitions.ts","webpack://assemblyscript/./src/parser.ts","webpack://assemblyscript/./src/glue/js/index.ts","webpack://assemblyscript/./src/glue/js/binaryen.js","webpack://assemblyscript/external \"binaryen\"","webpack://assemblyscript/./std/portable/index.js","webpack://assemblyscript/./src/glue/js/float.js","webpack://assemblyscript/./src/glue/js/i64.js","webpack://assemblyscript/./node_modules/long/src/long.js","webpack://assemblyscript/./src/builtins.ts","webpack://assemblyscript/./src/util/bitset.ts","webpack://assemblyscript/./src/util/charcode.ts","webpack://assemblyscript/./src/util/collections.ts","webpack://assemblyscript/./src/util/path.ts","webpack://assemblyscript/./src/util/text.ts","webpack://assemblyscript/./src/util/binary.ts","webpack://assemblyscript/./src/index.ts"],"names":["root","factory","exports","module","require","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE__18__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","__export","CommonFlags","PATH_DELIMITER","PARENT_SUBST","GETTER_PREFIX","SETTER_PREFIX","INSTANCE_DELIMITER","STATIC_DELIMITER","INNER_DELIMITER","LIBRARY_SUBST","LIBRARY_PREFIX","FILESPACE_PREFIX","DiagnosticCategory","diagnosticMessages_generated_1","util_1","diagnosticMessages_generated_2","diagnosticCategoryToString","category","INFO","WARNING","ERROR","assert","diagnosticCategoryToColor","COLOR_BLUE","COLOR_YELLOW","COLOR_RED","DiagnosticCode","diagnosticCodeToString","COLOR_RESET","DiagnosticMessage","code","message","range","arg0","arg1","arg2","replace","createInfo","createWarning","createError","withRange","toString","source","normalizedPath","line","column","formatDiagnosticContext","useColors","text","len","length","start","end","isLineBreak","charCodeAt","sb","substring","push","join","formatDiagnosticMessage","showContext","DiagnosticEmitter","diagnostics","Array","emitDiagnostic","info","warning","error","NativeType","ExpressionId","compiler_1","_BinaryenTypeNone","_BinaryenTypeInt32","_BinaryenTypeInt64","_BinaryenTypeFloat32","_BinaryenTypeFloat64","_BinaryenTypeVec128","_BinaryenTypeUnreachable","_BinaryenTypeAuto","_BinaryenInvalidId","_BinaryenBlockId","_BinaryenIfId","_BinaryenLoopId","_BinaryenBreakId","_BinaryenSwitchId","_BinaryenCallId","_BinaryenCallIndirectId","_BinaryenGetLocalId","_BinaryenSetLocalId","_BinaryenGetGlobalId","_BinaryenSetGlobalId","_BinaryenLoadId","_BinaryenStoreId","_BinaryenConstId","_BinaryenUnaryId","_BinaryenBinaryId","_BinaryenSelectId","_BinaryenDropId","_BinaryenReturnId","_BinaryenHostId","_BinaryenNopId","_BinaryenUnreachableId","_BinaryenAtomicCmpxchgId","_BinaryenAtomicRMWId","_BinaryenAtomicWaitId","_BinaryenAtomicWakeId","_BinaryenSIMDExtractId","_BinaryenSIMDReplaceId","_BinaryenSIMDShuffleId","_BinaryenSIMDBitselectId","_BinaryenSIMDShiftId","_BinaryenMemoryInitId","_BinaryenDataDropId","_BinaryenMemoryCopyId","_BinaryenMemoryFillId","UnaryOp","_BinaryenClzInt32","_BinaryenCtzInt32","_BinaryenPopcntInt32","_BinaryenNegFloat32","_BinaryenAbsFloat32","_BinaryenCeilFloat32","_BinaryenFloorFloat32","_BinaryenTruncFloat32","_BinaryenNearestFloat32","_BinaryenSqrtFloat32","_BinaryenEqZInt32","_BinaryenClzInt64","_BinaryenCtzInt64","_BinaryenPopcntInt64","_BinaryenNegFloat64","_BinaryenAbsFloat64","_BinaryenCeilFloat64","_BinaryenFloorFloat64","_BinaryenTruncFloat64","_BinaryenNearestFloat64","_BinaryenSqrtFloat64","_BinaryenEqZInt64","_BinaryenExtendSInt32","_BinaryenExtendUInt32","_BinaryenWrapInt64","_BinaryenTruncSFloat32ToInt32","_BinaryenTruncSFloat32ToInt64","_BinaryenTruncUFloat32ToInt32","_BinaryenTruncUFloat32ToInt64","_BinaryenTruncSFloat64ToInt32","_BinaryenTruncSFloat64ToInt64","_BinaryenTruncUFloat64ToInt32","_BinaryenTruncUFloat64ToInt64","_BinaryenReinterpretFloat32","_BinaryenReinterpretFloat64","_BinaryenConvertSInt32ToFloat32","_BinaryenConvertSInt32ToFloat64","_BinaryenConvertUInt32ToFloat32","_BinaryenConvertUInt32ToFloat64","_BinaryenConvertSInt64ToFloat32","_BinaryenConvertSInt64ToFloat64","_BinaryenConvertUInt64ToFloat32","_BinaryenConvertUInt64ToFloat64","_BinaryenPromoteFloat32","_BinaryenDemoteFloat64","_BinaryenReinterpretInt32","_BinaryenReinterpretInt64","_BinaryenExtendS8Int32","_BinaryenExtendS16Int32","_BinaryenExtendS8Int64","_BinaryenExtendS16Int64","_BinaryenExtendS32Int64","BinaryOp","_BinaryenAddInt32","_BinaryenSubInt32","_BinaryenMulInt32","_BinaryenDivSInt32","_BinaryenDivUInt32","_BinaryenRemSInt32","_BinaryenRemUInt32","_BinaryenAndInt32","_BinaryenOrInt32","_BinaryenXorInt32","_BinaryenShlInt32","_BinaryenShrUInt32","_BinaryenShrSInt32","_BinaryenRotLInt32","_BinaryenRotRInt32","_BinaryenEqInt32","_BinaryenNeInt32","_BinaryenLtSInt32","_BinaryenLtUInt32","_BinaryenLeSInt32","_BinaryenLeUInt32","_BinaryenGtSInt32","_BinaryenGtUInt32","_BinaryenGeSInt32","_BinaryenGeUInt32","_BinaryenAddInt64","_BinaryenSubInt64","_BinaryenMulInt64","_BinaryenDivSInt64","_BinaryenDivUInt64","_BinaryenRemSInt64","_BinaryenRemUInt64","_BinaryenAndInt64","_BinaryenOrInt64","_BinaryenXorInt64","_BinaryenShlInt64","_BinaryenShrUInt64","_BinaryenShrSInt64","_BinaryenRotLInt64","_BinaryenRotRInt64","_BinaryenEqInt64","_BinaryenNeInt64","_BinaryenLtSInt64","_BinaryenLtUInt64","_BinaryenLeSInt64","_BinaryenLeUInt64","_BinaryenGtSInt64","_BinaryenGtUInt64","_BinaryenGeSInt64","_BinaryenGeUInt64","_BinaryenAddFloat32","_BinaryenSubFloat32","_BinaryenMulFloat32","_BinaryenDivFloat32","_BinaryenCopySignFloat32","_BinaryenMinFloat32","_BinaryenMaxFloat32","_BinaryenEqFloat32","_BinaryenNeFloat32","_BinaryenLtFloat32","_BinaryenLeFloat32","_BinaryenGtFloat32","_BinaryenGeFloat32","_BinaryenAddFloat64","_BinaryenSubFloat64","_BinaryenMulFloat64","_BinaryenDivFloat64","_BinaryenCopySignFloat64","_BinaryenMinFloat64","_BinaryenMaxFloat64","_BinaryenEqFloat64","_BinaryenNeFloat64","_BinaryenLtFloat64","_BinaryenLeFloat64","_BinaryenGtFloat64","_BinaryenGeFloat64","HostOp","_BinaryenCurrentMemory","_BinaryenGrowMemory","AtomicRMWOp","_BinaryenAtomicRMWAdd","_BinaryenAtomicRMWSub","_BinaryenAtomicRMWAnd","_BinaryenAtomicRMWOr","_BinaryenAtomicRMWXor","_BinaryenAtomicRMWXchg","SIMDOp","_BinaryenSplatVecI8x16","_BinaryenSplatVecI16x8","_BinaryenSplatVecI32x4","_BinaryenSplatVecI64x2","_BinaryenSplatVecF32x4","_BinaryenSplatVecF64x2","_BinaryenNotVec128","_BinaryenNegVecI8x16","_BinaryenAnyTrueVecI8x16","_BinaryenAllTrueVecI8x16","_BinaryenNegVecI16x8","_BinaryenAnyTrueVecI16x8","_BinaryenAllTrueVecI16x8","_BinaryenNegVecI32x4","_BinaryenAnyTrueVecI32x4","_BinaryenAllTrueVecI32x4","_BinaryenNegVecI64x2","_BinaryenAnyTrueVecI64x2","_BinaryenAllTrueVecI64x2","_BinaryenAbsVecF32x4","_BinaryenNegVecF32x4","_BinaryenSqrtVecF32x4","_BinaryenAbsVecF64x2","_BinaryenNegVecF64x2","_BinaryenSqrtVecF64x2","_BinaryenTruncSatSVecF32x4ToVecI32x4","_BinaryenTruncSatUVecF32x4ToVecI32x4","_BinaryenTruncSatSVecF64x2ToVecI64x2","_BinaryenTruncSatUVecF64x2ToVecI64x2","_BinaryenConvertSVecI32x4ToVecF32x4","_BinaryenConvertUVecI32x4ToVecF32x4","_BinaryenConvertSVecI64x2ToVecF64x2","_BinaryenConvertUVecI64x2ToVecF64x2","_BinaryenEqVecI8x16","_BinaryenNeVecI8x16","_BinaryenLtSVecI8x16","_BinaryenLtUVecI8x16","_BinaryenLeSVecI8x16","_BinaryenLeUVecI8x16","_BinaryenGtSVecI8x16","_BinaryenGtUVecI8x16","_BinaryenGeSVecI8x16","_BinaryenGeUVecI8x16","_BinaryenEqVecI16x8","_BinaryenNeVecI16x8","_BinaryenLtSVecI16x8","_BinaryenLtUVecI16x8","_BinaryenLeSVecI16x8","_BinaryenLeUVecI16x8","_BinaryenGtSVecI16x8","_BinaryenGtUVecI16x8","_BinaryenGeSVecI16x8","_BinaryenGeUVecI16x8","_BinaryenEqVecI32x4","_BinaryenNeVecI32x4","_BinaryenLtSVecI32x4","_BinaryenLtUVecI32x4","_BinaryenLeSVecI32x4","_BinaryenLeUVecI32x4","_BinaryenGtSVecI32x4","_BinaryenGtUVecI32x4","_BinaryenGeSVecI32x4","_BinaryenGeUVecI32x4","_BinaryenEqVecF32x4","_BinaryenNeVecF32x4","_BinaryenLtVecF32x4","_BinaryenLeVecF32x4","_BinaryenGtVecF32x4","_BinaryenGeVecF32x4","_BinaryenEqVecF64x2","_BinaryenNeVecF64x2","_BinaryenLtVecF64x2","_BinaryenLeVecF64x2","_BinaryenGtVecF64x2","_BinaryenGeVecF64x2","_BinaryenAndVec128","_BinaryenOrVec128","_BinaryenXorVec128","_BinaryenAddVecI8x16","_BinaryenAddSatSVecI8x16","_BinaryenAddSatUVecI8x16","_BinaryenSubVecI8x16","_BinaryenSubSatSVecI8x16","_BinaryenSubSatUVecI8x16","_BinaryenMulVecI8x16","_BinaryenAddVecI16x8","_BinaryenAddSatSVecI16x8","_BinaryenAddSatUVecI16x8","_BinaryenSubVecI16x8","_BinaryenSubSatSVecI16x8","_BinaryenSubSatUVecI16x8","_BinaryenMulVecI16x8","_BinaryenAddVecI32x4","_BinaryenSubVecI32x4","_BinaryenMulVecI32x4","_BinaryenAddVecI64x2","_BinaryenSubVecI64x2","_BinaryenAddVecF32x4","_BinaryenSubVecF32x4","_BinaryenMulVecF32x4","_BinaryenDivVecF32x4","_BinaryenMinVecF32x4","_BinaryenMaxVecF32x4","_BinaryenAddVecF64x2","_BinaryenSubVecF64x2","_BinaryenMulVecF64x2","_BinaryenDivVecF64x2","_BinaryenMinVecF64x2","_BinaryenMaxVecF64x2","MemorySegment","buffer","offset","segment","Module","hasTemporaryFunction","cachedPrecomputeNames","cachedStrings","Map","ref","_BinaryenModuleCreate","lit","memory","allocate","_BinaryenSizeofLiteral","createFrom","cArr","allocU8Array","_BinaryenModuleRead","free","changetype","addFunctionType","result","paramTypes","cStr","allocStringCached","allocI32Array","_BinaryenAddFunctionType","getFunctionTypeBySignature","_BinaryenGetFunctionTypeBySignature","removeFunctionType","_BinaryenRemoveFunctionType","createI32","out","_BinaryenLiteralInt32","_BinaryenConst","createI64","valueLow","valueHigh","_BinaryenLiteralInt64","createF32","_BinaryenLiteralFloat32","createF64","_BinaryenLiteralFloat64","createV128","bytes","store","_BinaryenLiteralVec128","createUnary","op","expr","_BinaryenUnary","createBinary","left","right","_BinaryenBinary","createHost","operands","allocPtrArray","_BinaryenHost","createGetLocal","index","type","_BinaryenGetLocal","createTeeLocal","_BinaryenTeeLocal","createGetGlobal","_BinaryenGetGlobal","createLoad","signed","ptr","_BinaryenLoad","createStore","_BinaryenStore","createAtomicLoad","_BinaryenAtomicLoad","createAtomicStore","_BinaryenAtomicStore","createAtomicRMW","_BinaryenAtomicRMW","createAtomicCmpxchg","expected","replacement","_BinaryenAtomicCmpxchg","createAtomicWait","timeout","expectedType","_BinaryenAtomicWait","createAtomicWake","wakeCount","_BinaryenAtomicWake","createSetLocal","_BinaryenSetLocal","createSetGlobal","_BinaryenSetGlobal","createBlock","label","children","None","_BinaryenBlock","createBreak","condition","_BinaryenBreak","createDrop","expression","_BinaryenDrop","createLoop","body","_BinaryenLoop","createIf","ifTrue","ifFalse","_BinaryenIf","createNop","_BinaryenNop","createReturn","_BinaryenReturn","createSelect","_BinaryenSelect","createSwitch","names","defaultName","numNames","strs","_BinaryenSwitch","createCall","target","returnType","_BinaryenCall","createCallIndirect","typeName","_BinaryenCallIndirect","createUnreachable","_BinaryenUnreachable","createMemoryCopy","dest","size","_BinaryenMemoryCopy","createMemoryFill","_BinaryenMemoryFill","addGlobal","mutable","initializer","_BinaryenAddGlobal","removeGlobal","_BinaryenRemoveGlobal","addFunction","varTypes","_BinaryenAddFunction","removeFunction","_BinaryenRemoveFunction","addTemporaryFunction","tempName","typeRef","removeTemporaryFunction","addFunctionExport","internalName","externalName","cStr1","cStr2","_BinaryenAddFunctionExport","addTableExport","_BinaryenAddTableExport","addMemoryExport","_BinaryenAddMemoryExport","addGlobalExport","_BinaryenAddGlobalExport","removeExport","_BinaryenRemoveExport","addFunctionImport","externalModuleName","externalBaseName","functionType","cStr3","_BinaryenAddFunctionImport","addTableImport","_BinaryenAddTableImport","addMemoryImport","shared","_BinaryenAddMemoryImport","addGlobalImport","globalType","_BinaryenAddGlobalImport","setMemory","initial","maximum","segments","exportName","k","segs","offs","sizs","Target","WASM64","i64_low","i64_high","cArr1","cArr2","cArr3","_BinaryenSetMemory","setFunctionTable","funcs","_BinaryenSetFunctionTable","setStart","func","_BinaryenSetStart","getOptimizeLevel","_BinaryenGetOptimizeLevel","setOptimizeLevel","level","_BinaryenSetOptimizeLevel","getShrinkLevel","_BinaryenGetShrinkLevel","setShrinkLevel","_BinaryenSetShrinkLevel","setDebugInfo","on","_BinaryenSetDebugInfo","optimize","_BinaryenFunctionOptimize","_BinaryenModuleOptimize","runPasses","passes","allocString","_BinaryenFunctionRunPasses","_BinaryenModuleRunPasses","precomputeExpression","previousOptimizeLevel","previousShrinkLevel","previousDebugInfo","_BinaryenGetDebugInfo","_BinaryenExpressionGetType","_BinaryenFunctionGetBody","validate","_BinaryenModuleValidate","interpret","_BinaryenModuleInterpret","toBinary","sourceMapUrl","binaryPtr","sourceMapPtr","_BinaryenModuleAllocateAndWrite","readInt","binaryBytes","ret","BinaryModule","output","Uint8Array","load","readBuffer","sourceMap","readString","toText","Error","toAsmjs","str","has","set","dispose","_b","__values","values","_c","next","done","_BinaryenModuleDispose","createRelooper","Relooper","cloneExpression","noSideEffects","maxDepth","i32","MAX_VALUE","nested1","nested2","_BinaryenExpressionGetId","Const","I32","_BinaryenConstGetValueI32","I64","_BinaryenConstGetValueI64Low","_BinaryenConstGetValueI64High","F32","_BinaryenConstGetValueF32","F64","_BinaryenConstGetValueF64","GetLocal","_BinaryenGetLocalGetIndex","GetGlobal","globalName","_BinaryenGetGlobalGetName","Load","_BinaryenLoadGetPtr","_BinaryenLoadIsAtomic","_BinaryenLoadGetBytes","_BinaryenLoadGetOffset","_BinaryenLoadIsSigned","_BinaryenLoadGetAlign","Unary","_BinaryenUnaryGetValue","_BinaryenUnaryGetOp","Binary","_BinaryenBinaryGetLeft","_BinaryenBinaryGetRight","_BinaryenBinaryGetOp","addDebugInfoFile","_BinaryenModuleAddDebugInfoFileName","getDebugInfoFile","_BinaryenModuleGetDebugInfoFileName","setDebugLocation","fileIndex","lineNumber","columnNumber","_BinaryenFunctionSetDebugLocation","UNLIMITED_MEMORY","getExpressionId","getExpressionType","getConstValueI32","getConstValueI64Low","getConstValueI64High","getConstValueF32","getConstValueF64","getGetLocalIndex","getSetLocalIndex","_BinaryenSetLocalGetIndex","getSetLocalValue","_BinaryenSetLocalGetValue","isTeeLocal","_BinaryenSetLocalIsTee","getGetGlobalName","getBinaryOp","getBinaryLeft","getBinaryRight","getUnaryOp","getUnaryValue","getLoadBytes","getLoadOffset","getLoadPtr","isLoadSigned","getStoreBytes","_BinaryenStoreGetBytes","getStoreOffset","_BinaryenStoreGetOffset","getStorePtr","_BinaryenStoreGetPtr","getStoreValue","_BinaryenStoreGetValue","getBlockName","_BinaryenBlockGetName","getBlockChildCount","_BinaryenBlockGetNumChildren","getBlockChild","_BinaryenBlockGetChild","getIfCondition","_BinaryenIfGetCondition","getIfTrue","_BinaryenIfGetIfTrue","getIfFalse","_BinaryenIfGetIfFalse","getLoopName","_BinaryenLoopGetName","getLoopBody","_BinaryenLoopGetBody","getBreakName","_BinaryenBreakGetName","getBreakCondition","_BinaryenBreakGetCondition","getSelectThen","_BinaryenSelectGetIfTrue","getSelectElse","_BinaryenSelectGetIfFalse","getSelectCondition","_BinaryenSelectGetCondition","getDropValue","_BinaryenDropGetValue","getReturnValue","_BinaryenReturnGetValue","getCallTarget","_BinaryenCallGetTarget","getHostOp","_BinaryenHostGetOp","getHostOperandCount","_BinaryenHostGetNumOperands","getHostOperand","_BinaryenHostGetOperand","getHostName","_BinaryenHostGetNameOperand","getFunctionBody","getFunctionName","_BinaryenFunctionGetName","getFunctionParamCount","_BinaryenFunctionGetNumParams","getFunctionParamType","_BinaryenFunctionGetParam","getFunctionResultType","_BinaryenFunctionGetResult","relooper","_RelooperCreate","addBlock","_RelooperAddBlock","addBranch","from","to","_RelooperAddBranch","addBlockWithSwitch","_RelooperAddBlockWithSwitch","addBranchForSwitch","indexes","_RelooperAddBranchForSwitch","renderAndDispose","entry","labelHelper","_RelooperRenderAndDispose","u8s","numValues","idx","i32s","val","ptrs","u","stringLengthUTF8","cp","u1","u2","u3","u4","arr","String","fromCodePoints","needsExplicitUnreachable","Unreachable","Return","Break","Block","numChildren","common_1","tokenizer_1","Token","Range","NodeKind","nodeIsConstantValue","kind","LITERAL","NULL","TRUE","FALSE","nodeIsCallable","IDENTIFIER","ASSERTION","CALL","ELEMENTACCESS","PARENTHESIZED","PROPERTYACCESS","SUPER","nodeIsGenericCallable","Node","parent","flags","NONE","is","flag","isAny","createType","typeArguments","isNullable","TypeNode","setParent","createOmittedType","createIdentifierExpression","createTypeParameter","extendsType","defaultType","elem","TypeParameterNode","createParameter","ParameterNode","parameterKind","createSignature","parameters","explicitThisType","sig","SignatureNode","createDecorator","args","stmt","DecoratorNode","arguments","decoratorKind","decoratorNameToKind","createComment","node","CommentNode","commentKind","IdentifierExpression","createEmptyIdentifierExpression","createArrayLiteralExpression","elements","ArrayLiteralExpression","elementExpressions","nodes","setParentIfNotNull","createAssertionExpression","assertionKind","toType","AssertionExpression","createBinaryExpression","operator","BinaryExpression","createCallExpression","typeArgs","CallExpression","createClassExpression","declaration","ClassExpression","createCommaExpression","expressions","CommaExpression","createConstructorExpression","ConstructorExpression","createElementAccessExpression","element","ElementAccessExpression","elementExpression","createFalseExpression","FalseExpression","createFloatLiteralExpression","FloatLiteralExpression","createFunctionExpression","FunctionExpression","ARROW","createInstanceOfExpression","isType","InstanceOfExpression","createIntegerLiteralExpression","IntegerLiteralExpression","createNewExpression","NewExpression","createNullExpression","NullExpression","createObjectLiteralExpression","ObjectLiteralExpression","createParenthesizedExpression","ParenthesizedExpression","createPropertyAccessExpression","PropertyAccessExpression","createRegexpLiteralExpression","pattern","RegexpLiteralExpression","patternFlags","createTernaryExpression","ifThen","ifElse","TernaryExpression","createStringLiteralExpression","StringLiteralExpression","createSuperExpression","SuperExpression","createThisExpression","ThisExpression","createTrueExpression","TrueExpression","createUnaryPostfixExpression","operand","UnaryPostfixExpression","createUnaryPrefixExpression","UnaryPrefixExpression","createBlockStatement","statements","BlockStatement","createBreakStatement","BreakStatement","createClassDeclaration","identifier","typeParameters","implementsTypes","members","decorators","ClassDeclaration","createContinueStatement","ContinueStatement","createDoStatement","statement","DoStatement","createEmptyStatement","EmptyStatement","createEnumDeclaration","EnumDeclaration","createEnumValueDeclaration","EnumValueDeclaration","createExportStatement","path","ExportStatement","normalizePath","startsWith","resolvePath","internalPath","mangleInternalPath","createExportImportStatement","ExportImportStatement","createExportMember","ExportMember","createExpressionStatement","ExpressionStatement","createIfStatement","IfStatement","createImportStatement","decls","ImportStatement","declarations","namespaceName","createImportStatementWithWildcard","createImportDeclaration","ImportDeclaration","createInterfaceDeclaration","InterfaceDeclaration","createFieldDeclaration","FieldDeclaration","createForStatement","incrementor","ForStatement","createFunctionDeclaration","signature","FunctionDeclaration","createIndexSignatureDeclaration","keyType","valueType","IndexSignatureDeclaration","createMethodDeclaration","MethodDeclaration","createNamespaceDeclaration","NamespaceDeclaration","createReturnStatement","ReturnStatement","createSwitchStatement","cases","SwitchStatement","createSwitchCase","SwitchCase","createThrowStatement","ThrowStatement","createTryStatement","catchVariable","catchStatements","finallyStatements","TryStatement","createTypeDeclaration","alias","TypeDeclaration","createVariableStatement","VariableStatement","createVariableDeclaration","VariableDeclaration","createVoidStatement","VoidStatement","createWhileStatement","WhileStatement","CommonTypeNode","_super","__extends","_this","apply","TYPE","TYPEPARAMETER","ParameterKind","PARAMETER","implicitFieldDeclaration","DecoratorKind","SIGNATURE","nameStr","BUILTIN","EXTERNAL","GLOBAL","INLINE","OPERATOR","SEALED","UNMANAGED","propStr","OPERATOR_BINARY","OPERATOR_PREFIX","OPERATOR_POSTFIX","CUSTOM","DECORATOR","CommentKind","COMMENT","Expression","LiteralKind","LiteralExpression","literalKind","ARRAY","AssertionKind","BINARY","CLASS","COMMA","CONSTRUCTOR","FLOAT","FUNCTION","INSTANCEOF","INTEGER","NEW","OBJECT","REGEXP","TERNARY","STRING","THIS","UnaryExpression","UNARYPOSTFIX","UNARYPREFIX","isLastStatement","BLOCK","FUNCTIONDECLARATION","METHODDECLARATION","SourceKind","Statement","Source","SOURCE","tokenizer","debugInfoIndex","exportPaths","sourceKind","pos","lastIndexOf","simplePath","ENTRY","LIBRARY","DeclarationStatement","cachedProgramLevelInternalName","cachedFileLevelInternalName","mangleInternalName","VARIABLE","NAMESPACEDECLARATION","EXPORT","isTopLevelExport","CLASSDECLARATION","STATIC","needsExplicitExport","member","INDEXSIGNATUREDECLARATION","VariableLikeDeclarationStatement","BREAK","CONTINUE","DO","EMPTY","ENUMDECLARATION","ENUMVALUEDECLARATION","EXPORTIMPORT","EXPORTMEMBER","EXPRESSION","FIELDDECLARATION","parameterIndex","FOR","IF","IMPORTDECLARATION","IMPORT","INTERFACEDECLARATION","RETURN","SWITCHCASE","SWITCH","THROW","TRY","TYPEDECLARATION","VARIABLEDECLARATION","VOID","WHILE","asGlobal","endsWith","findDecorator","decorator","OperatorKind","diagnostics_1","types_1","ast_1","module_1","resolver_1","QueuedImport","QueuedExport","TypeAlias","operatorKindFromDecorator","arg","INDEXED_GET","INDEXED_SET","UNCHECKED_INDEXED_GET","UNCHECKED_INDEXED_SET","ADD","SUB","MUL","POW","DIV","REM","BITWISE_AND","BITWISE_OR","BITWISE_XOR","EQ","NE","GT","GE","BITWISE_SHR","BITWISE_SHR_U","LT","LE","BITWISE_SHL","PLUS","PREFIX_INC","MINUS","PREFIX_DEC","NOT","BITWISE_NOT","POSTFIX_INC","POSTFIX_DEC","INVALID","ElementKind","DecoratorFlags","noTypesYet","Program","diagnosticsOffset","elementsLookup","instancesLookup","typesLookup","typeAliases","fileLevelExports","moduleLevelExports","basicClasses","arrayBufferInstance","arrayPrototype","stringInstance","mainFunction","abortInstance","memoryAllocateInstance","hasGC","gcAllocateInstance","gcLinkInstance","gcMarkInstance","gcHeaderSize","gcHookOffset","resolver","Resolver","sources","getSource","lookupSourceByPath","normalizedPathWithoutExtension","tmp","initialize","options","Type","i8","i16","i64","isizeType","u8","u16","u32","u64","usizeType","bool","f32","f64","void","hasFeature","v128","setConstantInteger","i64_new","isWasm64","noTreeShaking","noAssert","memoryBase","optimizeLevelHint","shrinkLevelHint","queuedImports","queuedExports","queuedExtends","queuedImplements","filespace","Filespace","currentFilespace","j","initializeClass","initializeEnum","initializeExports","initializeFunction","initializeImports","initializeInterface","initializeNamespace","initializeTypeAlias","initializeVariables","queuedImport","tryLocateImport","localName","splice","externalNameAlt","Module_0_has_no_exported_member_1","queuedExports_1","queuedExports_1_1","__read","queuedExport","currentExport","isReExport","setExportAndCheckLibrary","Cannot_find_name_0","derivedPrototype","derivedDeclaration","derivedType","baseElement","resolveIdentifier","CLASS_PROTOTYPE","basePrototype","A_class_may_only_extend_another_class","globalAliases","globalAliases_1","globalAliases_1_1","_d","resolveClass","instance","Duplicate_identifier_0","programLevelInternalName","registerBasicClass","FUNCTION_PROTOTYPE","startFunction","GENERIC","AMBIENT","MAIN","resolveFunction","parameterTypes","signatureReference","byteSize","typeKind","className","classElement","global","Global","withConstantIntegerValue","RESOLVED","setConstantFloat","withConstantFloatValue","queuedNamedExports","checkDecorators","acceptedFlags","presentFlags","decoratorKindToFlag","isLibrary","Decorator_0_is_not_valid_here","Duplicate_decorator","checkGlobal","parentNode","hasDecorator","namespace","fileLevelInternalName","simpleName","ClassPrototype","numImplementsTypes","Unmanaged_classes_cannot_implement_interfaces","Operation_not_supported","MODULE_EXPORT","Export_declaration_conflicts_with_exported_declaration_of_0","isEntry","existingExport","memberDeclarations","memberDeclaration","initializeField","GET","SET","initializeAccessor","initializeMethod","classPrototype","isInterface","INTERFACE_PROTOTYPE","staticField","READONLY","ABSTRACT","instanceMembers","instanceField","FieldPrototype","decoratorFlags","FunctionPrototype","constructorPrototype","Multiple_constructor_implementations_are_not_allowed","checkOperatorOverloads","numArgs","firstArg","overloads","overloadPrototypes","Duplicate_function_implementation","operatorKind","String_literal_expected","Expected_0_arguments_but_got_1","internalPropertyName","propertyElement","isGetter","isNew","PROPERTY","getterPrototype","setterPrototype","Property","baseName","staticName","staticPrototype","instanceName","instancePrototype","Enum","initializeEnumValue","enm","EnumValue","initializeExport","externalIdentifier","prefix","FILESPACE","referencedName","referencedElement","seen","Set","add","initializeImport","indexPart","InterfacePrototype","parentNamespace","Namespace","Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local","existingExport_1","global_1","CONST","Element","program","NAMESPACE","ENUM","ENUMVALUE","constantValue","ConstantValueKind","VariableLikeElement","constantValueKind","constantIntegerValue","INLINED","constantFloatValue","Parameter","Local","LOCAL","scopedGlobal","instances","classTypeArguments","applyClassTypeArguments","contextualTypeArguments","classTypeParameters","numClassTypeParameters","Function","localsByName","localsByIndex","additionalLocals","debugLocations","functionTableIndex","trampoline","outerScope","nextInlineId","tempI32s","tempI64s","tempF32s","tempF64s","nextBreakId","breakStack","breakLabel","localIndex","local","thisType","inheritedTypeArguments","inheritedTypeArguments_1","inheritedTypeArguments_1_1","inheritedName","inheritedType","INSTANCE","parameterType","parameterName","getParameterName","flow","Flow","addLocal","finalize","debugLocation","debugInfoRef","FunctionTarget","FUNCTION_TARGET","toSignatureString","asFunction","FIELD_PROTOTYPE","Field","FIELD","memoryOffset","extends","basePtototype","current","Class","base","currentMemoryOffset","constructorInstance","gcHookIndex","asClass","inheritedTypeArguments_2","inheritedTypeArguments_2_1","baseType","isAssignableTo","lookupOverload","unchecked","uncheckedOverload","overload","lookupField","shouldReadonly","offsetof","fieldName","field","Interface","INTERFACE","FlowFlags","scopedLocals","parentFunction","continueLabel","wrappedLocals","wrappedLocalsExt","inlineFunction","inlineReturnLabel","createInline","unset","fork","branch","slice","getTempLocal","wrapped","temps","toNativeType","pop","setLocalWrapped","freeTempLocal","getAndFreeTempLocal","addScopedLocal","reportNode","scopedLocal","existingLocal","SCOPED","addScopedAlias","scopedAlias","freeScopedLocals","lookupLocal","isLocalWrapped","bitsetIs","ext","bitsetSet","pushBreakLabel","id","stack","popBreakLabel","inherit","other","inheritConditional","inheritMutual","i64_and","leftExt","rightExt","thisExt","minLength","min","canOverflow","canConversionOverflow","SetLocal","global_2","EqI32","EqI64","EqF32","EqF64","NeI32","NeI64","NeF32","NeF64","LtI32","LtU32","LtI64","LtU64","LtF32","LtF64","LeI32","LeU32","LeI64","LeU64","LeF32","LeF64","GtI32","GtU32","GtI64","GtU64","GtF32","GtF64","GeI32","GeU32","GeI64","GeU64","GeF32","GeF64","MulI32","AndI32","computeSmallIntegerMask","ShlI32","shift","ShrI32","ShrU32","DivU32","RemI32","RemU32","EqzI32","EqzI64","ClzI32","CtzI32","PopcntI32","MIN_VALUE","fromType","last","If","Select","Call","IdentifierHandling","tokenFromKeyword","AS","ASYNC","AWAIT","CASE","CATCH","DEBUGGER","DECLARE","DEFAULT","DELETE","ELSE","EXTENDS","FINALLY","FROM","IMPLEMENTS","IN","IS","KEYOF","LET","MODULE","OF","PACKAGE","PRIVATE","PROTECTED","PUBLIC","TYPEOF","VAR","WITH","YIELD","tokenIsAlsoIdentifier","token","operatorTokenToString","DOT_DOT_DOT","LESSTHAN","GREATERTHAN","LESSTHAN_EQUALS","GREATERTHAN_EQUALS","EQUALS_EQUALS","EXCLAMATION_EQUALS","EQUALS_EQUALS_EQUALS","EXCLAMATION_EQUALS_EQUALS","ASTERISK_ASTERISK","ASTERISK","SLASH","PERCENT","PLUS_PLUS","MINUS_MINUS","LESSTHAN_LESSTHAN","GREATERTHAN_GREATERTHAN","GREATERTHAN_GREATERTHAN_GREATERTHAN","AMPERSAND","BAR","CARET","EXCLAMATION","TILDE","AMPERSAND_AMPERSAND","BAR_BAR","EQUALS","PLUS_EQUALS","MINUS_EQUALS","ASTERISK_EQUALS","ASTERISK_ASTERISK_EQUALS","SLASH_EQUALS","PERCENT_EQUALS","LESSTHAN_LESSTHAN_EQUALS","GREATERTHAN_GREATERTHAN_EQUALS","GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS","AMPERSAND_EQUALS","BAR_EQUALS","CARET_EQUALS","a","b","Tokenizer","tokenPos","nextToken","nextTokenPos","nextTokenOnNewLine","onComment","identifierHandling","unsafeNext","maxTokenLength","STRINGLITERAL","OPENPAREN","CLOSEPAREN","isDecimalDigit","FLOATLITERAL","DOT","commentStartPos","LINE","TRIPLE","closed","_0_expected","testInteger","INTEGERLITERAL","COLON","SEMICOLON","EQUALS_GREATERTHAN","QUESTION","OPENBRACKET","CLOSEBRACKET","OPENBRACE","CLOSEBRACE","AT","isIdentifierStart","isKeywordCharacter","posBefore","isIdentifierPart","keywordToken","ALWAYS","PREFER","isWhiteSpace","Invalid_character","ENDOFFILE","peek","checkOnNewLine","maxCompoundLength","tokenBefore","tokenPosBefore","skipIdentifier","skip","mark","state","reusableState","State","discard","reset","readIdentifier","quote","Unterminated_string_literal","readEscapeSequence","Unexpected_end_of_text","readExtendedUnicodeEscape","readUnicodeEscape","fromCharCode","readRegexpPattern","escaped","Unterminated_regular_expression_literal","readRegexpFlags","Invalid_regular_expression_flags","readInteger","readHexInteger","readBinaryInteger","readOctalInteger","isOctalDigit","Octal_literals_are_not_allowed_in_strict_mode","readDecimalInteger","i64_16","sepEnd","i64_add","i64_mul","Numeric_separators_are_not_allowed_here","Multiple_consecutive_numeric_separators_are_not_permitted","Hexadecimal_digit_expected","i64_10","Digit_expected","i64_8","Octal_digit_expected","i64_2","i64_1","Binary_digit_expected","readFloat","readDecimalFloat","parseFloat","readHexFloat","remain","value32","invalid","An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive","Unterminated_Unicode_escape_sequence","finish","program_1","TypeKind","TypeFlags","v128_zero","cachedNullableType","ceil","classReference","nonNullableType","isize64","isize32","usize64","usize32","isManaged","computeSmallIntegerShift","targetType","classType","asNullable","signednessIsRelevant","currentClass","targetClass","currentFunction","targetFunction","commonCompatible","signednessIsImportant","kindOnly","V128","toNativeZero","toNativeOne","toNativeNegOne","typesToNativeTypes","types","numTypes","typesToString","Signature","cachedFunctionTarget","parameterNames","requiredParameters","hasRest","asFunctionTarget","getDefaultParameterName","thisThisType","targetThisType","thisParameterTypes","targetParameterTypes","numParameters","thisParameterType","targetParameterType","thisReturnType","targetReturnType","makeSignatureString","includeThis","optionalStart","restIndex","cachedDefaultParameterNames","g","e","window","builtins_1","Options","WASM32","importMemory","importTable","features","feature","Feature","ConversionKind","WrapMode","mangleImportName_moduleName","mangleImportName_elementName","Compiler","currentInlineFunctions","currentEnum","currentType","memorySegments","stringSegments","functionTable","argcVar","argcSet","needsIterateRoots","f32ModInstance","f64ModInstance","f32PowInstance","f64PowInstance","max","compile","startFunctionInstance","startFunctionBody","currentFlow","compileSource","funcRef","ensureFunctionType","i64_align","i64_shr_u","moduleExport","makeModuleExport","compileIterateRoots","subPrefix","_f","_g","_h","_j","Cannot_export_a_mutable_global","ensureTrampoline","ensureArgcSet","returnTypePostFix","COMPILED","setter","nativeType","nativeSizeType","getterName","setterName","_k","_l","_m","_o","fullName","_p","_q","ctor","compileSourceByPath","File_0_not_found","isGeneric","compileClassDeclaration","compileEnumDeclaration","compileFunctionDeclaration","compileNamespaceDeclaration","variableInit","compileVariableStatement","compileExportStatement","previousFlow","compileStatement","compileGlobalDeclaration","compileGlobal","initExpr","resolvedType","resolveType","Type_expected","atEnd","compileExpressionRetainType","Type_0_is_not_assignable_to_type_1","isDeclaredConstant","MODULE_IMPORT","mangleImportName","initializeInStart","compileExpression","Compiling_constant_with_non_constant_initializer_as_mutable","compileEnum","previousValue","previousValueIsMut","initInStart","valueDeclaration","In_const_enum_declarations_member_initializer_must_be_constant_expression","Enum_member_must_have_initializer","AddI32","compileFunctionUsingTypeArguments","makeMap","resolveFunctionInclTypeArguments","compileFunction","resultType","compileFunctionBody","stmts","compileStatements","unshift","classInstance","thisLocalIndex","makeAllocation","makeFieldInitialization","Constructors_for_derived_classes_must_contain_a_super_call","A_function_whose_declared_type_is_not_void_must_return_a_value","An_implementation_cannot_be_declared_in_ambient_contexts","Function_implementation_is_missing_or_not_immediately_following_the_declaration","compileInterfaceDeclaration","compileNamespace","compileClassUsingTypeArguments","alternativeReportNode","resolveClassInclTypeArguments","compileClass","staticMembers","ctorInstance","_e","addMemorySegment","alignment","ensureFunctionTableEntry","TRAMPOLINE","compileBlockStatement","compileBreakStatement","compileContinueStatement","compileDoStatement","compileEmptyStatement","compileExpressionStatement","compileForStatement","compileIfStatement","compileReturnStatement","compileSwitchStatement","compileThrowStatement","compileTryStatement","compileVoidStatement","compileWhileStatement","addDebugLocation","numStatements","Nop","outerFlow","innerFlow","A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement","A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement","condExpr","makeIsTrueish","terminated","block","repeatLabel","alwaysTrue","condPre","incrExpr","bodyStatement","bodyExpr","usesContinue","breakBlock","repeatBlock","actualFunction","GENERIC_CONTEXT","condExprPrecomp","ifTrueFlow","ifTrueExpr","ifFalseExpr","ifFalseFlow","numCases","context","tempLocal","tempLocalIndex","breaks","breakIndex","defaultIndex","currentBlock","alwaysReturns","alwaysReturnsWrapped","alwaysThrows","alwaysAllocates","isLast","nextLabel","count","compileAbort","isKnownGlobal","numDeclarations","initializers","isInlined","_const_declarations_must_be_initialized","compileAssignmentWithValue","compileInlineConstant","contextualType","retainType","mask","conversionKind","wrapMode","compileAssertionExpression","compileBinaryExpression","compileCallExpression","compileCommaExpression","compileElementAccessExpression","compileFunctionExpression","compileIdentifierExpression","compileInstanceOfExpression","compileLiteralExpression","compileNewExpression","compileParenthesizedExpression","compilePropertyAccessExpression","compileTernaryExpression","compileUnaryPostfixExpression","compileUnaryPrefixExpression","convertExpression","ensureSmallIntegerWrap","Conversion_from_type_0_to_1_requires_an_explicit_cast","PromoteF32","DemoteF64","TruncF32ToI64","TruncF32ToI32","TruncF32ToU64","TruncF32ToU32","TruncF64ToI64","TruncF64ToI32","TruncF64ToU64","TruncF64ToU32","ConvertI64ToF32","ConvertU64ToF32","ConvertI32ToF32","ConvertU32ToF32","ConvertI64ToF64","ConvertU64ToF64","ConvertI32ToF64","ConvertU32ToF64","WrapI64","ExtendI32","ExtendU32","PREFIX","NONNULL","leftExpr","leftType","rightExpr","rightType","commonType","compound","compileBinaryOverload","Operator_0_cannot_be_applied_to_types_1_and_2","compileAssignment","AddI64","AddF32","AddF64","SubI32","SubI64","SubF32","SubF64","MulI64","MulF32","MulF64","makeCallDirect","DivI32","DivI64","DivU64","DivF32","DivF64","RemI64","RemU64","intType","ShlI64","The_0_operator_cannot_be_applied_to_type_1","ShrI64","ShrU64","AndI64","OrI32","OrI64","XorI32","XorI64","compileUnaryOverload","operatorInstance","valueExpr","argumentExpressions","thisArg","compileCallDirect","valueExpression","resolveExpression","Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property","currentElementExpression","isUnchecked","indexedSet","Index_signature_in_type_0_only_permits_reading","Index_signature_is_missing_in_type_0","valueWithCorrectType","tee","thisExpression","currentThisExpression","thisExpr","flow_1","setterInstance","getterInstance","nativeReturnType","indexedGet","elementExpr","tempLocalTarget","tempLocalElement","flow_2","Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors","baseClassInstance","thisLocal","ensureConstructor","_super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class","indexArg","compileCallExpressionBuiltin","Type_0_is_not_generic","inferredTypes","numTypeParameters","numParameterTypes","numArguments","argumentExprs","typeNode","argumentExpression","inferredType","concreteType","resolvedTypeArguments","Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures","compileGetter","compileCallIndirect","typeArgumentNodes","resolveTypeArguments","compileCall","checkCallSignature","hasThis","minimum","Expected_at_least_0_arguments_but_got_1","includes","compileCallInlinePrechecked","Function_0_cannot_be_inlined_into_itself","numArgumentsInclThis","baseInstance","paramExpr","argumentLocal","original","originalSignature","originalName","originalParameterTypes","originalParameterDeclarations","commonReturnType","commonThisType","isInstance","minArguments","minOperands","maxArguments","maxOperands","numOptional","forwardedOperands","operandIndex","trampolineSignature","trampolineName","ofN","Optional_parameter_must_have_an_initializer","ensureArgcVar","numOperands","isCallImport","parameterNodes","allOptionalsAreConstant","makeCallIndirect","numExpressions","exprs","resolveElementAccess","retainConstantType","_this_cannot_be_referenced_in_current_location","flow_3","actualFunction_1","_super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class","scopedThis","superType","_super_can_only_be_referenced_in_a_derived_class","localType","A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums","implicitNegate","compileArrayLiteral","floatValue","intValue","i64_sub","determineIntegerLiteralType","i64_to_f32","i64_to_f64","compileStringLiteral","compileObjectLiteral","ensureStaticString","stringValue","stringSegment","headerSize","totalSize","buf","writeI32","ensureGCHook","writeI16","stringOffset","i64_is_u32","ensureStaticArray","elementType","byteLength","usizeTypeSize","bufferInstance","bufferHeaderSize","bufferTotalSize","clz","writeI8","writeI64","writeF32","writeF64","bufferOffset","arrayInstance","arrayHeaderSize","arrayOffset","isConst","compiledValues","constantValues","nativeElementType","isStatic","arrayType","nativeArrayType","Constructor_of_class_0_must_not_require_any_arguments","Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration","Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration","hasErrors","Property_0_does_not_exist_on_type_1","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","compileInstantiate","baseClass","nativeDummy","locals","numLocals","propertyAccess","resolvePropertyAccess","theEnum","Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set","ifThenFlow","ifThenExpr","ifThenType","ifElseFlow","ifElseExpr","ifElseType","getValue","calcValue","setValue","NegF32","NegF64","makeIsFalseish","ExtendI8ToI32","ExtendI16ToI32","allocateInstance","isInline","fieldType","nativeFieldType","fieldDeclaration","ReportMode","reportMode","REPORT","resolveSignature","numTypeArguments","paramType","instanceKey","placeholderType","Basic_type_0_cannot_be_nullable","Expected_0_type_arguments_but_got_1","parameterTypeNodes","parameterTypeNode","REST","returnTypeNode","minParameterCount","maxParameterCount","argumentCount","ensureResolvedLazyGlobal","targetExpression","propertyName","elementAccess","i64_is_i8","i64_is_u8","i64_is_i16","i64_is_u16","i64_is_i32","i64_is_bool","i64_zero","explicitLocal","classInstanceKey","classInstances","instance_1","numFunctionTypeArguments","signatureNode","functionTypeParameters","signatureParameters","signatureParameterCount","parameterDeclaration","resolveFunctionPartially","partialKey","partialPrototype","expectedTypeArguments","actualTypeArguments","baseClassType","Class_0_is_sealed_and_cannot_be_extended","Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa","inheritedMember","constructorPartial","baseField","fieldInstance","instanceProperty","partialGetterPrototype","partialSetterPrototype","overloadPrototype","operatorPartial","Decompiler","functionId","decompile","decompiler","decompileFunction","nativeTypeToType","decompileExpression","nested","string","Loop","Switch","CallIndirect","SetGlobal","Store","i64_to_string","AbsF32","CeilF32","FloorF32","TruncF32","NearestF32","SqrtF32","ClzI64","CtzI64","PopcntI64","AbsF64","CeilF64","FloorF64","TruncF64","NearestF64","SqrtF64","ReinterpretF32","ReinterpretF64","ReinterpretI32","ReinterpretI64","RotlI32","RotrI32","RotlI64","RotrI64","CopysignF32","MinF32","MaxF32","CopysignF64","MinF64","MaxF64","Drop","Host","CurrentMemory","GrowMemory","AtomicCmpxchg","AtomicRMW","AtomicWait","AtomicWake","Auto","ExportsWalker","includePrivate","todo","walk","visitElement","visitGlobal","visitEnum","visitFunctionInstances","visitClassInstances","visitField","prop","hasCompiledMember","visitNamespace","visitFunction","visitClass","IDLBuilder","indentLevel","build","indent","typeToString","members_1","members_1_1","visitInterface","TSDBuilder","numMembers","members_2","members_2_1","Parser","backlog","seenlog","donelog","tryParseSignatureIsSignature","parseParametersThis","parseFile","indexOf","tn","parseTopLevelStatement","startPos","parseDecorator","skipStatement","exportStart","exportEnd","contextIsAmbient","A_declare_modifier_cannot_be_used_in_an_already_ambient_context","first","parseEnum","parseVariable","parseFunction","parseStatement","parseClassOrInterface","parseNamespace","parseExportImport","parseImport","parseTypeDeclaration","parseExport","_0_modifier_cannot_be_used_here","Decorators_are_not_valid_here","nextFile","clear","parseType","acceptParenthesized","suppressErrors","isNullableSignature","tryParseSignature","Unexpected_token","innerType","Identifier_expected","nullable","parameter","bracketStart","bracketRange","isSignature","A_rest_parameter_cannot_be_optional","OPTIONAL","param","parseArguments","parseVariableDeclaration","parentFlags","parentDecorators","DEFINITE_ASSIGNMENT","Initializers_are_not_allowed_in_ambient_contexts","parseExpression","A_definite_assignment_assertion_is_not_permitted_in_this_context","parseEnumValue","parseReturn","parseTypeParameters","seenOptional","typeParameter","parseTypeParameter","Required_type_parameters_may_not_follow_optional_type_parameters","Type_parameter_list_cannot_be_empty","parseParameters","isConstructor","seenRest","reportedRest","parseParameter","A_rest_parameter_must_be_last_in_a_parameter_list","A_required_parameter_cannot_follow_an_optional_parameter","isRest","isOptional","startRange","accessFlags","A_parameter_property_cannot_be_declared_using_a_rest_parameter","A_rest_parameter_cannot_have_an_initializer","Parameter_cannot_have_question_mark_and_initializer","signatureStart","isSetter","A_set_accessor_must_have_exactly_one_parameter","A_set_accessor_parameter_cannot_have_an_initializer","A_get_accessor_cannot_have_parameters","parseBlockStatement","parseFunctionExpression","isArrow","parseFunctionExpressionCommon","Interface_declaration_cannot_have_implements_clause","parseClassMember","parseClassExpression","VIRTUAL","accessStart","accessEnd","staticStart","staticEnd","abstractStart","abstractEnd","readonlyStart","readonlyEnd","setEnd","retIndex","parseIndexSignatureDeclaration","typeParametersStart","Type_parameters_cannot_appear_on_a_constructor_declaration","An_accessor_cannot_have_type_parameters","Type_annotation_cannot_appear_on_a_constructor_declaration","A_set_accessor_cannot_have_a_return_type_annotation","Method_0_cannot_have_an_implementation_because_it_is_marked_abstract","retMethod","Constructor_implementation_is_missing","Optional_properties_are_not_supported","retField","parseExportMember","asIdentifier","skipFrom","parseImportDeclaration","topLevel","parseBreak","parseContinue","parseDoStatement","parseForStatement","parseIfStatement","A_return_statement_can_only_be_used_within_a_function_body","parseSwitchStatement","parseThrowStatement","parseTryStatement","parseVoidStatement","parseWhileStatement","parseExpressionStatement","elseStatement","case_","parseSwitchCase","_case_or_default_expected","parseExpressionStart","precedence","determinePrecedenceStart","The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access","again","startPos_1","QUOTED","_super_must_be_followed_by_an_argument_list_or_member_access","regexpPattern","Expression_expected","tryParseTypeArgumentsBeforeArguments","nextPrecedence","maybeParseCallExpression","determinePrecedence","commaExprs","isRightAssociative","joinPropertyCall","callee","inner","skipBlock","depth","Precedence","binaryen","wrapModule","emitStackIR","emitAsmjs","Binaryen","__memory_allocate","_malloc","__memory_free","_free","__memory_copy","_memmove","__store","HEAPU8","__load","globalScope","ASC_TARGET","ASC_NO_TREESHAKING","ASC_NO_ASSERT","ASC_MEMORY_BASE","ASC_OPTIMIZE_LEVEL","ASC_SHRINK_LEVEL","ASC_FEATURE_MUTABLE_GLOBAL","ASC_FEATURE_SIGN_EXTENSION","ASC_FEATURE_BULK_MEMORY","ASC_FEATURE_SIMD","ASC_FEATURE_THREADS","Float64Array","U64","Uint32Array","UnreachableError","captureStackTrace","AssertionError","defineProperties","writable","Math","fround","EPSILON","MIN_NORMAL_VALUE","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","clz32","abs","floor","trunc","round","sqrt","x","y","sign","isTrueish","radix","parseInt","undefined","fromCodePoint","Number","isInteger","isArray","signbit","Boolean","HEAP","HEAP_OFFSET","oldHeap","fill","copy","src","copyWithin","Float32Array","Int32Array","f32_as_i32","i32_as_f32","f64_as_i64","i64_as_f64","Long","ZERO","i64_one","ONE","lo","hi","fromBits","low","high","sub","mul","i64_div","div","i64_div_u","toUnsigned","toSigned","i64_rem","mod","i64_rem_u","and","i64_or","or","i64_xor","xor","i64_shl","shl","i64_shr","shr","shru","i64_not","not","i64_eq","eq","i64_ne","ne","fromInt","minSafeF32","fromNumber","maxSafeF32","i64_is_f32","gte","lte","minSafeF64","maxSafeF64","i64_is_f64","toNumber","unsigned","wasm","WebAssembly","Instance","isLong","obj","__isLong__","INT_CACHE","UINT_CACHE","cachedObj","cache","isNaN","UZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_63_DBL","neg","TWO_PWR_32_DBL","lowBits","highBits","pow_dbl","pow","fromString","RangeError","radixToPower","power","fromValue","TWO_PWR_16_DBL","TWO_PWR_24","UONE","NEG_ONE","LongPrototype","toInt","isZero","isNegative","radixLong","rem1","rem","remDiv","digits","getHighBits","getHighBitsUnsigned","getLowBits","getLowBitsUnsigned","getNumBitsAbs","bit","eqz","isPositive","isOdd","isEven","equals","notEquals","neq","lessThan","comp","lt","lessThanOrEqual","le","greaterThan","gt","greaterThanOrEqual","ge","compare","thisNeg","otherNeg","negate","addend","a48","a32","a16","a00","b48","b32","b16","c48","c32","c16","c00","subtract","subtrahend","multiply","multiplier","get_high","b00","divide","divisor","approx","res","div_u","div_s","log2","log","LN2","delta","approxRes","approxRem","modulo","rem_u","rem_s","shiftLeft","numBits","shiftRight","shiftRightUnsigned","shr_u","toBytes","toBytesLE","toBytesBE","fromBytes","fromBytesLE","fromBytesBE","compiler","evaluateConstantType","SWALLOW","expr_1","tempLocal1","tempLocalIndex2","tempLocalIndex1","wasm64","tempLocal0","evaluateConstantOffset","RMWOp","Add","Sub","And","Or","Xor","Xchg","hasError","alignLog2","Type_0_has_no_property_1","abort","operandExprs","signatureParts","nativeParamTypes","operandType","User_defined_0","expr_2","deferASM","deferASMCall","typeArgument","split","subName","Expression_must_be_a_compile_time_constant","stringType","messageArg","filenameArg","existingIndex","gcPrototype","gcInstance","nativeSizeSize","funcName","map","isSet","CharCode","lookupInUnicodeMap","unicodeIdentifierStart","unicodeIdentifierPart","mid","makeArray","cloned","makeSet","original_1","original_1_1","v","original_2","original_2_1","separator","ipos","dirname","origin","indentX1","indentX2","indentX4","readI32","readI64","readI8","readI16","readF32","readF64","valueI64","decompiler_1","definitions_1","formatDiagnostic","parser_1","parser","nextDiagnostic","isInfo","isWarning","isError","createOptions","setTarget","setNoTreeShaking","setNoAssert","setImportMemory","setImportTable","setSourceMap","setMemoryBase","setGlobalAlias","FEATURE_SIGN_EXTENSION","FEATURE_MUTABLE_GLOBAL","FEATURE_BULK_MEMORY","FEATURE_SIMD","FEATURE_THREADS","enableFeature","setOptimizeLevelHints","optimizeLevel","shrinkLevel","finishParsing","compileProgram","decompileModule","buildIDL","buildTSD"],"mappings":"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,IACpB,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC1C,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAEtCC,EAA+B,CACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IACpB,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KACxB,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAG1D,SAASF,EAAmBruF,EAAWkuF,GACrC,GAAIluF,EAAOkuF,EAAI,GAAI,OAAO,EAM1B,IAJA,IAEIM,EAFAvM,EAAK,EACLC,EAAKgM,EAAI9sF,OAGN6gF,EAAK,EAAIC,GAAI,CAGlB,GAFAsM,EAAMvM,GAAMC,EAAKD,GAAM,EAEnBiM,EADJM,GAAOA,EAAM,IACGxuF,GAAQA,GAAQkuF,EAAIM,EAAM,GACxC,OAAO,EAELxuF,EAAOkuF,EAAIM,GACbtM,EAAKsM,EAELvM,EAAKuM,EAAM,EAGf,OAAO,ikBC5WTjzF,EAAAkzF,UAAA,SAA6B1qB,GAC3B,QAD2B,IAAAA,MAAA,MACvBA,EAAU,CAEZ,IADA,IAAI2qB,EAAS,IAAIzsF,MAAS8hE,EAAS3iE,QAC1BlF,EAAI,EAAGykB,EAAIojD,EAAS3iE,OAAQlF,EAAIykB,IAAKzkB,EAAGq9C,UAAUm1C,EAAOxyF,GAAK6nE,EAAS7nE,IAChF,OAAOwyF,EAET,OAAO,IAAIzsF,OAGb1G,EAAAozF,QAAA,SAA2B5qB,WACzB,QADyB,IAAAA,MAAA,MACrBA,EAAU,CACZ,IAAI2qB,EAAS,IAAI56C,QACjB,IAAc,IAAA86C,EAAAzpE,EAAA4+C,GAAQ8qB,EAAAD,EAAAtpE,QAAAupE,EAAAtpE,KAAAspE,EAAAD,EAAAtpE,OAAA,CAAjB,IAAIwpE,EAACD,EAAA1xF,MAAcuxF,EAAO36C,IAAI+6C,qGACnC,OAAOJ,EAET,OAAO,IAAI56C,KAGbv4C,EAAAy5D,QAAA,SAA6B+O,WAC3B,QAD2B,IAAAA,MAAA,MACvBA,EAAU,CACZ,IAAI2qB,EAAS,IAAIn5E,QACjB,IAAmB,IAAAw5E,EAAA5pE,EAAA4+C,GAAQirB,EAAAD,EAAAzpE,QAAA0pE,EAAAzpE,KAAAypE,EAAAD,EAAAzpE,OAAA,CAAlB,IAAAJ,EAAAwnB,EAAAsiD,EAAA7xF,MAAA,GAACwjB,EAAAuE,EAAA,GAAG4pE,EAAA5pE,EAAA,GAAgBwpE,EAAO1pE,IAAIrE,EAAGmuE,qGAC3C,OAAOJ,EAET,OAAO,IAAIn5E,oFClBb,IAAM05E,EAAS,GAMf,SAAgBl1D,EAAcF,GAK5B,IAJA,IAiBIi6B,EAjBAhyB,EAAM,EACN3gC,EAAM04B,EAAKz4B,OAGR0gC,EAAM,EAAI3gC,GACK,IAApB04B,EAAKr4B,WAAWsgC,IAChBjI,EAAKr4B,WAAWsgC,EAAM,IAAMmtD,GAE5BntD,GAAO,EAUT,KAPIA,EAAM,GAAK3gC,EAAM04B,EAAKz4B,UACxBy4B,EAAOA,EAAKn4B,UAAUogC,EAAK3gC,GAC3BA,GAAO2gC,EACPA,EAAM,GAIDA,EAAM,EAAI3gC,GAAK,CAIpB,GAHA2yD,GAAQ,EAINj6B,EAAKr4B,WAAWsgC,IAAQmtD,GACA,IAAxBp1D,EAAKr4B,WAAWsgC,EAAM,GACtB,CAGA,IADAgyB,EAAQhyB,EAAM,GAAK3gC,IAEjB2gC,EAAM,EAAI3gC,GACV04B,EAAKr4B,WAAWsgC,EAAM,IAAMmtD,EAC5B,CACAp1D,EAAOi6B,EACHj6B,EAAKn4B,UAAU,EAAGogC,GAClBjI,EAAKn4B,UAAU,EAAGogC,GAAOjI,EAAKn4B,UAAUogC,EAAM,GAClD3gC,GAAO,EACP,SAKF,IADA2yD,EAAQhyB,EAAM,GAAK3gC,IACkB,IAAxB04B,EAAKr4B,WAAWsgC,EAAM,IACjCA,EAAM,EAAI3gC,GACc,IAAxB04B,EAAKr4B,WAAWsgC,EAAM,IACtBjI,EAAKr4B,WAAWsgC,EAAM,IAAMmtD,EAC5B,CAGA,IADA,IAAIC,EAAOptD,IACFotD,GAAQ,GACf,GAAIr1D,EAAKr4B,WAAW0tF,IAASD,EAAW,CAClCntD,EAAMotD,GAAQ,GACS,IAAzBr1D,EAAKr4B,WAAW0tF,EAAO,IACE,IAAzBr1D,EAAKr4B,WAAW0tF,EAAO,KAEvBr1D,EAAOi6B,EACHj6B,EAAKn4B,UAAU,EAAGwtF,GAClBr1D,EAAKn4B,UAAU,EAAGwtF,GAAQr1D,EAAKn4B,UAAUogC,EAAM,GACnD3gC,GAAO2gC,EAAM,EAAIotD,EACjBptD,EAAMotD,EAAO,GAEf,MAKJ,GAAIA,EAAO,GAAKptD,EAAM,IACT,GAAPA,GACgB,IAAlBjI,EAAKr4B,WAAW,IACE,IAAlBq4B,EAAKr4B,WAAW,IAChB,CAEAL,GADA04B,EAAOA,EAAKn4B,UAAUogC,EAAM,IACjB1gC,OACX,WAKR0gC,IAEF,OAAO3gC,EAAM,EAAI04B,EAAO,IAc1B,SAAgBs1D,EAAQtuF,GAEtB,IADA,IAAIihC,EAAMjhC,EAAeO,SAChB0gC,EAAM,GACb,GAAIjhC,EAAeW,WAAWsgC,IAAQmtD,EACpC,OAAOpuF,EAAea,UAAU,EAAGogC,GAGvC,MAAO,IArGTvmC,EAAAw+B,gBAoFAx+B,EAAA0+B,YAAA,SAA4Bp5B,EAAwBuuF,GAClD,OAAIvuF,EAAem5B,WAAW,QACrBn5B,EAEFk5B,EACLo1D,EAAQC,GAAU1/D,OAAOs5B,aAAaimC,GAAapuF,IAKvDtF,EAAA4zF,yFCxGA,IAAME,EAAW,KACXC,EAAW,OACXC,EAAW,WAGjBh0F,EAAA03E,OAAA,SAAuBxxE,EAAcugB,GACnC,KAAOA,GAAS,GACdvgB,EAAGE,KAAK4tF,GACRvtE,GAAS,EAEPA,GAAS,IACXvgB,EAAGE,KAAK2tF,GACRttE,GAAS,GAEPA,GACFvgB,EAAGE,KAAK0tF,kCCQZ,SAAgBG,EAAQx6E,EAAoBC,GAC1C,OAAOD,EAAOC,GACPD,EAAOC,EAAS,IAAM,EACtBD,EAAOC,EAAS,IAAM,GACtBD,EAAOC,EAAS,IAAM,GAI/B,SAAgBoyD,EAASlqE,EAAY6X,EAAoBC,GACvDD,EAAOC,GAAc9X,EACrB6X,EAAOC,EAAS,GAAK9X,IAAU,EAC/B6X,EAAOC,EAAS,GAAK9X,IAAU,GAC/B6X,EAAOC,EAAS,GAAK9X,IAAU,GAIjC,SAAgBsyF,EAAQz6E,EAAoBC,GAC1C,IAAIgtE,EAAKuN,EAAQx6E,EAAQC,GACrBitE,EAAKsN,EAAQx6E,EAAQC,EAAS,GAClC,OAAOy1B,QAAQu3C,EAAIC,oDAzCrB3mF,EAAAm0F,OAAA,SAAuB16E,EAAoBC,GACzC,OAAOD,EAAOC,IAIhB1Z,EAAA2sE,QAAA,SAAwB/qE,EAAY6X,EAAoBC,GACtDD,EAAOC,GAAU9X,GAInB5B,EAAAo0F,QAAA,SAAwB36E,EAAoBC,GAC1C,OAAOD,EAAOC,GACPD,EAAOC,EAAS,IAAM,GAI/B1Z,EAAAgsE,SAAA,SAAyBpqE,EAAY6X,EAAoBC,GACvDD,EAAOC,GAAc9X,EACrB6X,EAAOC,EAAS,GAAK9X,IAAU,GAIjC5B,EAAAi0F,UAQAj0F,EAAA8rE,WAQA9rE,EAAAk0F,UAOAl0F,EAAA4sE,SAAA,SAAyBhrE,EAAY6X,EAAoBC,GACvDoyD,EAASpmD,QAAQ9jB,GAAQ6X,EAAQC,GACjCoyD,EAASnmD,SAAS/jB,GAAQ6X,EAAQC,EAAS,IAI7C1Z,EAAAq0F,QAAA,SAAwB56E,EAAoBC,GAC1C,OAAOysE,WAAW8N,EAAQx6E,EAAQC,KAIpC1Z,EAAA6sE,SAAA,SAAyBjrE,EAAY6X,EAAoBC,GACvDoyD,EAASoa,WAAWtkF,GAAQ6X,EAAQC,IAItC1Z,EAAAs0F,QAAA,SAAwB76E,EAAoBC,GAC1C,OAAO2sE,WAAW6N,EAAQz6E,EAAQC,KAIpC1Z,EAAA8sE,SAAA,SAAyBlrE,EAAY6X,EAAoBC,GACvD,IAAI66E,EAAWnO,WAAWxkF,GAC1BkqE,EAASpmD,QAAQ6uE,GAAW96E,EAAQC,GACpCoyD,EAASnmD,SAAS4uE,GAAW96E,EAAQC,EAAS,iJCnEhD,IAAAzS,EAAAxG,EAAA,GAOA+zF,EAAA/zF,EAAA,IAIAg0F,EAAAh0F,EAAA,IAKA+oC,EAAA/oC,EAAA,GAyCoCT,EAAA00F,iBAtClClrD,EAAAljC,wBAOF,IAAAquF,EAAAl0F,EAAA,IASAT,EAAAy4E,UAAA,SAA0B9yE,EAAc24B,EAAc0W,EACpD4/C,GAIA,YALoD,IAAA5/C,OAAA,QACpD,IAAA4/C,MAAA,MAEKA,IAAQA,EAAS,IAAID,EAAAxc,QAC1Byc,EAAOnc,UAAU9yE,EAAM24B,EAAM0W,GACtB4/C,GAIT50F,EAAAi6E,SAAA,SAAyB2a,GACvB,OAAOA,EAAO3a,YAIhBj6E,EAAA60F,eAAA,SAA+BD,GAC7B,IAAIz7C,EAAUy7C,EAAOz7C,QACrB,OAAOA,EAAQ9M,kBAAoB8M,EAAQ1yC,YAAYZ,OACnDszC,EAAQ1yC,YAAY0yC,EAAQ9M,qBAC5B,MAONrsC,EAAA80F,OAAA,SAAuBpwF,GACrB,OAAOA,EAAQd,UAAY4lC,EAAAjmC,mBAAmBM,MAIhD7D,EAAA+0F,UAAA,SAA0BrwF,GACxB,OAAOA,EAAQd,UAAY4lC,EAAAjmC,mBAAmBO,SAIhD9D,EAAAg1F,QAAA,SAAwBtwF,GACtB,OAAOA,EAAQd,UAAY4lC,EAAAjmC,mBAAmBQ,OAIhD/D,EAAAi1F,cAAA,WACE,OAAO,IAAIhuF,EAAAusD,SAIbxzD,EAAAk1F,UAAA,SAA0BjnD,EAAkB3sB,GAC1C2sB,EAAQ3sB,OAASA,GAInBthB,EAAAm1F,iBAAA,SAAiClnD,EAAkBoB,GACjDpB,EAAQoB,cAAgBA,GAI1BrvC,EAAAo1F,YAAA,SAA4BnnD,EAAkBqB,GAC5CrB,EAAQqB,SAAWA,GAIrBtvC,EAAAq1F,gBAAA,SAAgCpnD,EAAkBylB,GAChDzlB,EAAQylB,aAAeA,GAIzB1zD,EAAAs1F,eAAA,SAA+BrnD,EAAkB0lB,GAC/C1lB,EAAQ0lB,YAAcA,GAIxB3zD,EAAAu1F,aAAA,SAA6BtnD,EAAkB/kB,GAC7C+kB,EAAQ/kB,UAAYA,GAItBlpB,EAAAw1F,cAAA,SAA8BvnD,EAAkBsB,GAC9CtB,EAAQsB,WAAaA,GAIvBvvC,EAAAy1F,eAAA,SAA+BxnD,EAAkB/sC,EAAc4gC,GAC7D,IAAImQ,EAAgBhE,EAAQgE,cACvBA,IAAehE,EAAQgE,cAAgBA,EAAgB,IAAIj4B,KAChEi4B,EAAcxoB,IAAIvoB,EAAM4gC,IAIb9hC,EAAA01F,uBAAsB,EAEtB11F,EAAA21F,uBAAsB,EAEtB31F,EAAA41F,oBAAmB,EAEnB51F,EAAA61F,aAAY,EAEZ71F,EAAA81F,gBAAe,GAG5B91F,EAAA+1F,cAAA,SAA8B9nD,EAAkB4lB,GAC9C5lB,EAAQ2lB,UAAYC,GAItB7zD,EAAAg2F,sBAAA,SAAsC/nD,EAAkBgoD,EAAoBC,GAC1EjoD,EAAQuB,kBAAoBymD,EAC5BhoD,EAAQwB,gBAAkBymD,GAI5Bl2F,EAAAm2F,cAAA,SAA8BvB,GAC5B,OAAOA,EAAO/kC,UAIhB7vD,EAAAo2F,eAAA,SAA+Bj9C,EAAkBlL,GAC/C,YAD+C,IAAAA,MAAA,MACxC,IAAIhnC,EAAAktD,SAAShb,EAASlL,GAASinB,WAIxCl1D,EAAAq2F,gBAAA,SAAgCp2F,GAC9B,IAAIqzE,EAAa,IAAIkhB,EAAArhB,WAErB,OADAG,EAAWD,UAAUpzE,GACdqzE,EAAWzjB,UAIpB7vD,EAAAs2F,SAAA,SAAyBn9C,GACvB,OAAOs7C,EAAAld,WAAWE,MAAMt+B,IAI1Bn5C,EAAAu2F,SAAA,SAAyBp9C,GACvB,OAAOs7C,EAAA1c,WAAWN,MAAMt+B,IAI1B,IAAAxkB,EAAAl0B,EAAA,GAAST,EAAAqD,eAAAsxB,EAAAtxB,eAGTV,EAAAlC,EAAA,IAEAkC,EAAAlC,EAAA,IACAkC,EAAAlC,EAAA,IACAkC,EAAAlC,EAAA,KACAkC,EAAAlC,EAAA,KACAkC,EAAAlC,EAAA,KACAkC,EAAAlC,EAAA,IACAkC,EAAAlC,EAAA,IACAkC,EAAAlC,EAAA,KACAkC,EAAAlC,EAAA,IACAkC,EAAAlC,EAAA,KACAkC,EAAAlC,EAAA,IACAkC,EAAAlC,EAAA,IACAkC,EAAAlC,EAAA","file":"assemblyscript.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"binaryen\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"binaryen\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"assemblyscript\"] = factory(require(\"binaryen\"));\n\telse\n\t\troot[\"assemblyscript\"] = factory(root[\"binaryen\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE__18__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 15);\n","/**\n * Various compiler utilities.\n * @module util\n * @preferred\n *//***/\n\nexport * from \"./bitset\";\nexport * from \"./charcode\";\nexport * from \"./collections\";\nexport * from \"./path\";\nexport * from \"./text\";\nexport * from \"./binary\";\n","/**\n * Common constants.\n * @module common\n *//***/\n\n/** Indicates traits of a {@link Node} or {@link Element}. */\nexport enum CommonFlags {\n /** No flags set. */\n NONE = 0,\n\n // Basic modifiers\n\n /** Has an `import` modifier. */\n IMPORT = 1 << 0,\n /** Has an `export` modifier. */\n EXPORT = 1 << 1,\n /** Has a `declare` modifier. */\n DECLARE = 1 << 2,\n /** Has a `const` modifier. */\n CONST = 1 << 3,\n /** Has a `let` modifier. */\n LET = 1 << 4,\n /** Has a `static` modifier. */\n STATIC = 1 << 5,\n /** Has a `readonly` modifier. */\n READONLY = 1 << 6,\n /** Has an `abstract` modifier. */\n ABSTRACT = 1 << 7,\n /** Has a `public` modifier. */\n PUBLIC = 1 << 8,\n /** Has a `private` modifier. */\n PRIVATE = 1 << 9,\n /** Has a `protected` modifier. */\n PROTECTED = 1 << 10,\n /** Has a `get` modifier. */\n GET = 1 << 11,\n /** Has a `set` modifier. */\n SET = 1 << 12,\n /** Has a definite assignment assertion `!` as in `x!: i32;`. */\n DEFINITE_ASSIGNMENT = 1 << 13,\n\n // Extended modifiers usually derived from basic modifiers\n\n /** Is ambient, that is either declared or nested in a declared element. */\n AMBIENT = 1 << 14,\n /** Is generic. */\n GENERIC = 1 << 15,\n /** Is part of a generic context. */\n GENERIC_CONTEXT = 1 << 16,\n /** Is an instance member. */\n INSTANCE = 1 << 17,\n /** Is a constructor. */\n CONSTRUCTOR = 1 << 18,\n /** Is an arrow function. */\n ARROW = 1 << 19,\n /** Is a module export. */\n MODULE_EXPORT = 1 << 20,\n /** Is a module import. */\n MODULE_IMPORT = 1 << 21,\n\n // Compilation states\n\n /** Is resolved. */\n RESOLVED = 1 << 22,\n /** Is compiled. */\n COMPILED = 1 << 23,\n /** Has a constant value and is therefore inlined. */\n INLINED = 1 << 24,\n /** Is scoped. */\n SCOPED = 1 << 25,\n /** Is a trampoline. */\n TRAMPOLINE = 1 << 26,\n /** Is a virtual method. */\n VIRTUAL = 1 << 27,\n /** Is the main function. */\n MAIN = 1 << 28,\n\n // Other\n\n QUOTED = 1 << 29\n}\n\n/** Path delimiter inserted between file system levels. */\nexport const PATH_DELIMITER = \"/\";\n/** Substitution used to indicate the parent directory. */\nexport const PARENT_SUBST = \"..\";\n/** Function name prefix used for getters. */\nexport const GETTER_PREFIX = \"get:\";\n/** Function name prefix used for setters. */\nexport const SETTER_PREFIX = \"set:\";\n/** Delimiter used between class names and instance members. */\nexport const INSTANCE_DELIMITER = \"#\";\n/** Delimiter used between class and namespace names and static members. */\nexport const STATIC_DELIMITER = \".\";\n/** Delimiter used between a function and its inner elements. */\nexport const INNER_DELIMITER = \"~\";\n/** Substitution used to indicate a library directory. */\nexport const LIBRARY_SUBST = \"~lib\";\n/** Library directory prefix. */\nexport const LIBRARY_PREFIX = LIBRARY_SUBST + PATH_DELIMITER;\n/** Prefix used to indicate a filespace element. */\nexport const FILESPACE_PREFIX = \"file:\";\n","/**\n * Shared diagnostic handling inherited by the parser and the compiler.\n * @module diagnostics\n * @preferred\n *//***/\n\nimport {\n Range\n} from \"./ast\";\n\nimport {\n DiagnosticCode,\n diagnosticCodeToString\n} from \"./diagnosticMessages.generated\";\n\nimport {\n isLineBreak\n} from \"./util\";\n\nexport {\n DiagnosticCode,\n diagnosticCodeToString\n} from \"./diagnosticMessages.generated\";\n\n/** Indicates the category of a {@link DiagnosticMessage}. */\nexport enum DiagnosticCategory {\n /** Informatory message. */\n INFO,\n /** Warning message. */\n WARNING,\n /** Error message. */\n ERROR\n}\n\n/** Returns the string representation of the specified diagnostic category. */\nexport function diagnosticCategoryToString(category: DiagnosticCategory): string {\n switch (category) {\n case DiagnosticCategory.INFO: return \"INFO\";\n case DiagnosticCategory.WARNING: return \"WARNING\";\n case DiagnosticCategory.ERROR: return \"ERROR\";\n default: {\n assert(false);\n return \"\";\n }\n }\n}\n\n/** ANSI escape sequence for blue foreground. */\nexport const COLOR_BLUE: string = \"\\u001b[96m\";\n/** ANSI escape sequence for yellow foreground. */\nexport const COLOR_YELLOW: string = \"\\u001b[93m\";\n/** ANSI escape sequence for red foreground. */\nexport const COLOR_RED: string = \"\\u001b[91m\";\n/** ANSI escape sequence to reset the foreground color. */\nexport const COLOR_RESET: string = \"\\u001b[0m\";\n\n/** Returns the ANSI escape sequence for the specified category. */\nexport function diagnosticCategoryToColor(category: DiagnosticCategory): string {\n switch (category) {\n case DiagnosticCategory.INFO: return COLOR_BLUE;\n case DiagnosticCategory.WARNING: return COLOR_YELLOW;\n case DiagnosticCategory.ERROR: return COLOR_RED;\n default: {\n assert(false);\n return \"\";\n }\n }\n}\n\n/** Represents a diagnostic message. */\nexport class DiagnosticMessage {\n\n /** Message code. */\n code: i32;\n /** Message category. */\n category: DiagnosticCategory;\n /** Message text. */\n message: string;\n /** Respective source range, if any. */\n range: Range | null = null;\n\n /** Constructs a new diagnostic message. */\n private constructor(code: i32, category: DiagnosticCategory, message: string) {\n this.code = code;\n this.category = category;\n this.message = message;\n }\n\n /** Creates a new diagnostic message of the specified category. */\n static create(\n code: DiagnosticCode,\n category: DiagnosticCategory,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): DiagnosticMessage {\n var message = diagnosticCodeToString(code);\n if (arg0 != null) message = message.replace(\"{0}\", arg0);\n if (arg1 != null) message = message.replace(\"{1}\", arg1);\n if (arg2 != null) message = message.replace(\"{2}\", arg2);\n return new DiagnosticMessage(code, category, message);\n }\n\n /** Creates a new informatory diagnostic message. */\n static createInfo(\n code: DiagnosticCode,\n arg0: string | null = null,\n arg1: string | null = null\n ): DiagnosticMessage {\n return DiagnosticMessage.create(code, DiagnosticCategory.INFO, arg0, arg1);\n }\n\n /** Creates a new warning diagnostic message. */\n static createWarning(\n code: DiagnosticCode,\n arg0: string | null = null,\n arg1: string | null = null\n ): DiagnosticMessage {\n return DiagnosticMessage.create(code, DiagnosticCategory.WARNING, arg0, arg1);\n }\n\n /** Creates a new error diagnostic message. */\n static createError(\n code: DiagnosticCode,\n arg0: string | null = null,\n arg1: string | null = null\n ): DiagnosticMessage {\n return DiagnosticMessage.create(code, DiagnosticCategory.ERROR, arg0, arg1);\n }\n\n /** Adds a source range to this message. */\n withRange(range: Range): this {\n this.range = range;\n return this;\n }\n\n /** Converts this message to a string. */\n toString(): string {\n if (this.range) {\n return (\n diagnosticCategoryToString(this.category) +\n \" \" +\n this.code.toString(10) +\n \": \\\"\" +\n this.message +\n \"\\\" in \" +\n this.range.source.normalizedPath +\n \":\" +\n this.range.line.toString(10) +\n \":\" +\n this.range.column.toString(10)\n );\n }\n return (\n diagnosticCategoryToString(this.category) +\n \" \" +\n this.code.toString(10) +\n \": \" +\n this.message\n );\n }\n}\n\n/** Formats a diagnostic message, optionally with terminal colors and source context. */\nexport function formatDiagnosticMessage(\n message: DiagnosticMessage,\n useColors: bool = false,\n showContext: bool = false\n): string {\n\n // general information\n var sb: string[] = [];\n if (useColors) sb.push(diagnosticCategoryToColor(message.category));\n sb.push(diagnosticCategoryToString(message.category));\n if (useColors) sb.push(COLOR_RESET);\n sb.push(message.code < 1000 ? \" AS\" : \" TS\");\n sb.push(message.code.toString(10));\n sb.push(\": \");\n sb.push(message.message);\n\n // include range information if available\n if (message.range) {\n\n // include context information if requested\n let range = message.range;\n if (showContext) {\n sb.push(\"\\n\");\n sb.push(formatDiagnosticContext(message.range, useColors));\n }\n\n sb.push(\"\\n\");\n sb.push(\" in \");\n sb.push(range.source.normalizedPath);\n sb.push(\"(\");\n sb.push(range.line.toString(10));\n sb.push(\",\");\n sb.push(range.column.toString(10));\n sb.push(\")\");\n }\n return sb.join(\"\");\n}\n\n/** Formats the diagnostic context for the specified range, optionally with terminal colors. */\nexport function formatDiagnosticContext(range: Range, useColors: bool = false): string {\n var text = range.source.text;\n var len = text.length;\n var start = range.start;\n var end = range.end;\n while (start > 0 && !isLineBreak(text.charCodeAt(start - 1))) start--;\n while (end < len && !isLineBreak(text.charCodeAt(end))) end++;\n var sb: string[] = [\n \"\\n \",\n text.substring(start, end),\n \"\\n \"\n ];\n while (start < range.start) {\n sb.push(\" \");\n start++;\n }\n if (useColors) sb.push(COLOR_RED);\n if (range.start == range.end) {\n sb.push(\"^\");\n } else {\n while (start++ < range.end) sb.push(\"~\");\n }\n if (useColors) sb.push(COLOR_RESET);\n return sb.join(\"\");\n}\n\n/** Base class of all diagnostic emitters. */\nexport abstract class DiagnosticEmitter {\n\n /** Diagnostic messages emitted so far. */\n diagnostics: DiagnosticMessage[];\n\n /** Initializes this diagnostic emitter. */\n protected constructor(diagnostics: DiagnosticMessage[] | null = null) {\n this.diagnostics = diagnostics ? diagnostics : new Array();\n }\n\n /** Emits a diagnostic message of the specified category. */\n emitDiagnostic(\n code: DiagnosticCode,\n category: DiagnosticCategory,\n range: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n var message = DiagnosticMessage.create(code, category, arg0, arg1, arg2).withRange(range);\n this.diagnostics.push(message);\n // console.log(formatDiagnosticMessage(message, true, true) + \"\\n\"); // temporary\n // console.log(new Error(\"stack\").stack);\n }\n\n /** Emits an informatory diagnostic message. */\n info(\n code: DiagnosticCode,\n range: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n this.emitDiagnostic(code, DiagnosticCategory.INFO, range, arg0, arg1, arg2);\n }\n\n /** Emits a warning diagnostic message. */\n warning(\n code: DiagnosticCode,\n range: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, arg0, arg1, arg2);\n }\n\n /** Emits an error diagnostic message. */\n error(\n code: DiagnosticCode,\n range: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, arg0, arg1, arg2);\n }\n}\n","/**\n * A thin wrapper around Binaryen's C-API.\n * @module module\n *//***/\n\nimport {\n Target\n} from \"./compiler\";\n\nexport type ModuleRef = usize;\nexport type FunctionTypeRef = usize;\nexport type FunctionRef = usize;\nexport type ExpressionRef = usize;\nexport type GlobalRef = usize;\nexport type ImportRef = usize;\nexport type ExportRef = usize;\nexport type RelooperRef = usize;\nexport type RelooperBlockRef = usize;\nexport type Index = u32;\n\nexport enum NativeType {\n None = _BinaryenTypeNone(),\n I32 = _BinaryenTypeInt32(),\n I64 = _BinaryenTypeInt64(),\n F32 = _BinaryenTypeFloat32(),\n F64 = _BinaryenTypeFloat64(),\n V128 = _BinaryenTypeVec128(),\n Unreachable = _BinaryenTypeUnreachable(),\n Auto = _BinaryenTypeAuto()\n}\n\nexport enum ExpressionId {\n Invalid = _BinaryenInvalidId(),\n Block = _BinaryenBlockId(),\n If = _BinaryenIfId(),\n Loop = _BinaryenLoopId(),\n Break = _BinaryenBreakId(),\n Switch = _BinaryenSwitchId(),\n Call = _BinaryenCallId(),\n CallIndirect = _BinaryenCallIndirectId(),\n GetLocal = _BinaryenGetLocalId(),\n SetLocal = _BinaryenSetLocalId(),\n GetGlobal = _BinaryenGetGlobalId(),\n SetGlobal = _BinaryenSetGlobalId(),\n Load = _BinaryenLoadId(),\n Store = _BinaryenStoreId(),\n Const = _BinaryenConstId(),\n Unary = _BinaryenUnaryId(),\n Binary = _BinaryenBinaryId(),\n Select = _BinaryenSelectId(),\n Drop = _BinaryenDropId(),\n Return = _BinaryenReturnId(),\n Host = _BinaryenHostId(),\n Nop = _BinaryenNopId(),\n Unreachable = _BinaryenUnreachableId(),\n AtomicCmpxchg = _BinaryenAtomicCmpxchgId(),\n AtomicRMW = _BinaryenAtomicRMWId(),\n AtomicWait = _BinaryenAtomicWaitId(),\n AtomicWake = _BinaryenAtomicWakeId(),\n SIMDExtract = _BinaryenSIMDExtractId(),\n SIMDReplace = _BinaryenSIMDReplaceId(),\n SIMDShuffle = _BinaryenSIMDShuffleId(),\n SIMDBitselect = _BinaryenSIMDBitselectId(),\n SIMDShift = _BinaryenSIMDShiftId(),\n MemoryInit = _BinaryenMemoryInitId(),\n DataDrop = _BinaryenDataDropId(),\n MemoryCopy = _BinaryenMemoryCopyId(),\n MemoryFill = _BinaryenMemoryFillId()\n}\n\nexport enum UnaryOp {\n ClzI32 = _BinaryenClzInt32(),\n CtzI32 = _BinaryenCtzInt32(),\n PopcntI32 = _BinaryenPopcntInt32(),\n NegF32 = _BinaryenNegFloat32(),\n AbsF32 = _BinaryenAbsFloat32(),\n CeilF32 = _BinaryenCeilFloat32(),\n FloorF32 = _BinaryenFloorFloat32(),\n TruncF32 = _BinaryenTruncFloat32(),\n NearestF32 = _BinaryenNearestFloat32(),\n SqrtF32 = _BinaryenSqrtFloat32(),\n EqzI32 = _BinaryenEqZInt32(),\n ClzI64 = _BinaryenClzInt64(),\n CtzI64 = _BinaryenCtzInt64(),\n PopcntI64 = _BinaryenPopcntInt64(),\n NegF64 = _BinaryenNegFloat64(),\n AbsF64 = _BinaryenAbsFloat64(),\n CeilF64 = _BinaryenCeilFloat64(),\n FloorF64 = _BinaryenFloorFloat64(),\n TruncF64 = _BinaryenTruncFloat64(),\n NearestF64 = _BinaryenNearestFloat64(),\n SqrtF64 = _BinaryenSqrtFloat64(),\n EqzI64 = _BinaryenEqZInt64(),\n ExtendI32 = _BinaryenExtendSInt32(),\n ExtendU32 = _BinaryenExtendUInt32(),\n WrapI64 = _BinaryenWrapInt64(),\n TruncF32ToI32 = _BinaryenTruncSFloat32ToInt32(),\n TruncF32ToI64 = _BinaryenTruncSFloat32ToInt64(),\n TruncF32ToU32 = _BinaryenTruncUFloat32ToInt32(),\n TruncF32ToU64 = _BinaryenTruncUFloat32ToInt64(),\n TruncF64ToI32 = _BinaryenTruncSFloat64ToInt32(),\n TruncF64ToI64 = _BinaryenTruncSFloat64ToInt64(),\n TruncF64ToU32 = _BinaryenTruncUFloat64ToInt32(),\n TruncF64ToU64 = _BinaryenTruncUFloat64ToInt64(),\n ReinterpretF32 = _BinaryenReinterpretFloat32(),\n ReinterpretF64 = _BinaryenReinterpretFloat64(),\n ConvertI32ToF32 = _BinaryenConvertSInt32ToFloat32(),\n ConvertI32ToF64 = _BinaryenConvertSInt32ToFloat64(),\n ConvertU32ToF32 = _BinaryenConvertUInt32ToFloat32(),\n ConvertU32ToF64 = _BinaryenConvertUInt32ToFloat64(),\n ConvertI64ToF32 = _BinaryenConvertSInt64ToFloat32(),\n ConvertI64ToF64 = _BinaryenConvertSInt64ToFloat64(),\n ConvertU64ToF32 = _BinaryenConvertUInt64ToFloat32(),\n ConvertU64ToF64 = _BinaryenConvertUInt64ToFloat64(),\n PromoteF32 = _BinaryenPromoteFloat32(),\n DemoteF64 = _BinaryenDemoteFloat64(),\n ReinterpretI32 = _BinaryenReinterpretInt32(),\n ReinterpretI64 = _BinaryenReinterpretInt64(),\n\n // see: https://github.com/WebAssembly/sign-extension-ops\n ExtendI8ToI32 = _BinaryenExtendS8Int32(),\n ExtendI16ToI32 = _BinaryenExtendS16Int32(),\n ExtendI8ToI64 = _BinaryenExtendS8Int64(),\n ExtendI16ToI64 = _BinaryenExtendS16Int64(),\n ExtendI32ToI64 = _BinaryenExtendS32Int64()\n\n // see: https://github.com/WebAssembly/nontrapping-float-to-int-conversions\n // TruncF32ToI32Sat\n // TruncF32ToU32Sat\n // TruncF64ToI32Sat\n // TruncF64ToU32Sat\n // TruncF32ToI64Sat\n // TruncF32ToU64Sat\n // TruncF64ToI64Sat\n // TruncF64ToU64Sat\n}\n\nexport enum BinaryOp {\n AddI32 = _BinaryenAddInt32(),\n SubI32 = _BinaryenSubInt32(),\n MulI32 = _BinaryenMulInt32(),\n DivI32 = _BinaryenDivSInt32(),\n DivU32 = _BinaryenDivUInt32(),\n RemI32 = _BinaryenRemSInt32(),\n RemU32 = _BinaryenRemUInt32(),\n AndI32 = _BinaryenAndInt32(),\n OrI32 = _BinaryenOrInt32(),\n XorI32 = _BinaryenXorInt32(),\n ShlI32 = _BinaryenShlInt32(),\n ShrU32 = _BinaryenShrUInt32(),\n ShrI32 = _BinaryenShrSInt32(),\n RotlI32 = _BinaryenRotLInt32(),\n RotrI32 = _BinaryenRotRInt32(),\n EqI32 = _BinaryenEqInt32(),\n NeI32 = _BinaryenNeInt32(),\n LtI32 = _BinaryenLtSInt32(),\n LtU32 = _BinaryenLtUInt32(),\n LeI32 = _BinaryenLeSInt32(),\n LeU32 = _BinaryenLeUInt32(),\n GtI32 = _BinaryenGtSInt32(),\n GtU32 = _BinaryenGtUInt32(),\n GeI32 = _BinaryenGeSInt32(),\n GeU32 = _BinaryenGeUInt32(),\n AddI64 = _BinaryenAddInt64(),\n SubI64 = _BinaryenSubInt64(),\n MulI64 = _BinaryenMulInt64(),\n DivI64 = _BinaryenDivSInt64(),\n DivU64 = _BinaryenDivUInt64(),\n RemI64 = _BinaryenRemSInt64(),\n RemU64 = _BinaryenRemUInt64(),\n AndI64 = _BinaryenAndInt64(),\n OrI64 = _BinaryenOrInt64(),\n XorI64 = _BinaryenXorInt64(),\n ShlI64 = _BinaryenShlInt64(),\n ShrU64 = _BinaryenShrUInt64(),\n ShrI64 = _BinaryenShrSInt64(),\n RotlI64 = _BinaryenRotLInt64(),\n RotrI64 = _BinaryenRotRInt64(),\n EqI64 = _BinaryenEqInt64(),\n NeI64 = _BinaryenNeInt64(),\n LtI64 = _BinaryenLtSInt64(),\n LtU64 = _BinaryenLtUInt64(),\n LeI64 = _BinaryenLeSInt64(),\n LeU64 = _BinaryenLeUInt64(),\n GtI64 = _BinaryenGtSInt64(),\n GtU64 = _BinaryenGtUInt64(),\n GeI64 = _BinaryenGeSInt64(),\n GeU64 = _BinaryenGeUInt64(),\n AddF32 = _BinaryenAddFloat32(),\n SubF32 = _BinaryenSubFloat32(),\n MulF32 = _BinaryenMulFloat32(),\n DivF32 = _BinaryenDivFloat32(),\n CopysignF32 = _BinaryenCopySignFloat32(),\n MinF32 = _BinaryenMinFloat32(),\n MaxF32 = _BinaryenMaxFloat32(),\n EqF32 = _BinaryenEqFloat32(),\n NeF32 = _BinaryenNeFloat32(),\n LtF32 = _BinaryenLtFloat32(),\n LeF32 = _BinaryenLeFloat32(),\n GtF32 = _BinaryenGtFloat32(),\n GeF32 = _BinaryenGeFloat32(),\n AddF64 = _BinaryenAddFloat64(),\n SubF64 = _BinaryenSubFloat64(),\n MulF64 = _BinaryenMulFloat64(),\n DivF64 = _BinaryenDivFloat64(),\n CopysignF64 = _BinaryenCopySignFloat64(),\n MinF64 = _BinaryenMinFloat64(),\n MaxF64 = _BinaryenMaxFloat64(),\n EqF64 = _BinaryenEqFloat64(),\n NeF64 = _BinaryenNeFloat64(),\n LtF64 = _BinaryenLtFloat64(),\n LeF64 = _BinaryenLeFloat64(),\n GtF64 = _BinaryenGtFloat64(),\n GeF64 = _BinaryenGeFloat64()\n}\n\nexport enum HostOp {\n CurrentMemory = _BinaryenCurrentMemory(),\n GrowMemory = _BinaryenGrowMemory(),\n\n // see: https://github.com/WebAssembly/bulk-memory-operations\n // MoveMemory\n // SetMemory\n}\n\nexport enum AtomicRMWOp {\n Add = _BinaryenAtomicRMWAdd(),\n Sub = _BinaryenAtomicRMWSub(),\n And = _BinaryenAtomicRMWAnd(),\n Or = _BinaryenAtomicRMWOr(),\n Xor = _BinaryenAtomicRMWXor(),\n Xchg = _BinaryenAtomicRMWXchg()\n}\n\nexport enum SIMDOp {\n SplatVecI8x16 = _BinaryenSplatVecI8x16(),\n SplatVecI16x8 = _BinaryenSplatVecI16x8(),\n SplatVecI32x4 = _BinaryenSplatVecI32x4(),\n SplatVecI64x2 = _BinaryenSplatVecI64x2(),\n SplatVecF32x4 = _BinaryenSplatVecF32x4(),\n SplatVecF64x2 = _BinaryenSplatVecF64x2(),\n NotVec128 = _BinaryenNotVec128(),\n NegVecI8x16 = _BinaryenNegVecI8x16(),\n AnyTrueVecI8x16 = _BinaryenAnyTrueVecI8x16(),\n AllTrueVecI8x16 = _BinaryenAllTrueVecI8x16(),\n NegVecI16x8 = _BinaryenNegVecI16x8(),\n AnyTrueVecI16x8 = _BinaryenAnyTrueVecI16x8(),\n AllTrueVecI16x8 = _BinaryenAllTrueVecI16x8(),\n NegVecI32x4 = _BinaryenNegVecI32x4(),\n AnyTrueVecI32x4 = _BinaryenAnyTrueVecI32x4(),\n AllTrueVecI32x4 = _BinaryenAllTrueVecI32x4(),\n NegVecI64x2 = _BinaryenNegVecI64x2(),\n AnyTrueVecI64x2 = _BinaryenAnyTrueVecI64x2(),\n AllTrueVecI64x2 = _BinaryenAllTrueVecI64x2(),\n AbsVecF32x4 = _BinaryenAbsVecF32x4(),\n NegVecF32x4 = _BinaryenNegVecF32x4(),\n SqrtVecF32x4 = _BinaryenSqrtVecF32x4(),\n AbsVecF64x2 = _BinaryenAbsVecF64x2(),\n NegVecF64x2 = _BinaryenNegVecF64x2(),\n SqrtVecF64x2 = _BinaryenSqrtVecF64x2(),\n TruncSatSVecF32x4ToVecI32x4 = _BinaryenTruncSatSVecF32x4ToVecI32x4(),\n TruncSatUVecF32x4ToVecI32x4 = _BinaryenTruncSatUVecF32x4ToVecI32x4(),\n TruncSatSVecF64x2ToVecI64x2 = _BinaryenTruncSatSVecF64x2ToVecI64x2(),\n TruncSatUVecF64x2ToVecI64x2 = _BinaryenTruncSatUVecF64x2ToVecI64x2(),\n ConvertSVecI32x4ToVecF32x4 = _BinaryenConvertSVecI32x4ToVecF32x4(),\n ConvertUVecI32x4ToVecF32x4 = _BinaryenConvertUVecI32x4ToVecF32x4(),\n ConvertSVecI64x2ToVecF64x2 = _BinaryenConvertSVecI64x2ToVecF64x2(),\n ConvertUVecI64x2ToVecF64x2 = _BinaryenConvertUVecI64x2ToVecF64x2(),\n EqVecI8x16 = _BinaryenEqVecI8x16(),\n NeVecI8x16 = _BinaryenNeVecI8x16(),\n LtSVecI8x16 = _BinaryenLtSVecI8x16(),\n LtUVecI8x16 = _BinaryenLtUVecI8x16(),\n LeSVecI8x16 = _BinaryenLeSVecI8x16(),\n LeUVecI8x16 = _BinaryenLeUVecI8x16(),\n GtSVecI8x16 = _BinaryenGtSVecI8x16(),\n GtUVecI8x16 = _BinaryenGtUVecI8x16(),\n GeSVecI8x16 = _BinaryenGeSVecI8x16(),\n GeUVecI8x16 = _BinaryenGeUVecI8x16(),\n EqVecI16x8 = _BinaryenEqVecI16x8(),\n NeVecI16x8 = _BinaryenNeVecI16x8(),\n LtSVecI16x8 = _BinaryenLtSVecI16x8(),\n LtUVecI16x8 = _BinaryenLtUVecI16x8(),\n LeSVecI16x8 = _BinaryenLeSVecI16x8(),\n LeUVecI16x8 = _BinaryenLeUVecI16x8(),\n GtSVecI16x8 = _BinaryenGtSVecI16x8(),\n GtUVecI16x8 = _BinaryenGtUVecI16x8(),\n GeSVecI16x8 = _BinaryenGeSVecI16x8(),\n GeUVecI16x8 = _BinaryenGeUVecI16x8(),\n EqVecI32x4 = _BinaryenEqVecI32x4(),\n NeVecI32x4 = _BinaryenNeVecI32x4(),\n LtSVecI32x4 = _BinaryenLtSVecI32x4(),\n LtUVecI32x4 = _BinaryenLtUVecI32x4(),\n LeSVecI32x4 = _BinaryenLeSVecI32x4(),\n LeUVecI32x4 = _BinaryenLeUVecI32x4(),\n GtSVecI32x4 = _BinaryenGtSVecI32x4(),\n GtUVecI32x4 = _BinaryenGtUVecI32x4(),\n GeSVecI32x4 = _BinaryenGeSVecI32x4(),\n GeUVecI32x4 = _BinaryenGeUVecI32x4(),\n EqVecF32x4 = _BinaryenEqVecF32x4(),\n NeVecF32x4 = _BinaryenNeVecF32x4(),\n LtVecF32x4 = _BinaryenLtVecF32x4(),\n LeVecF32x4 = _BinaryenLeVecF32x4(),\n GtVecF32x4 = _BinaryenGtVecF32x4(),\n GeVecF32x4 = _BinaryenGeVecF32x4(),\n EqVecF64x2 = _BinaryenEqVecF64x2(),\n NeVecF64x2 = _BinaryenNeVecF64x2(),\n LtVecF64x2 = _BinaryenLtVecF64x2(),\n LeVecF64x2 = _BinaryenLeVecF64x2(),\n GtVecF64x2 = _BinaryenGtVecF64x2(),\n GeVecF64x2 = _BinaryenGeVecF64x2(),\n AndVec128 = _BinaryenAndVec128(),\n OrVec128 = _BinaryenOrVec128(),\n XorVec128 = _BinaryenXorVec128(),\n AddVecI8x16 = _BinaryenAddVecI8x16(),\n AddSatSVecI8x16 = _BinaryenAddSatSVecI8x16(),\n AddSatUVecI8x16 = _BinaryenAddSatUVecI8x16(),\n SubVecI8x16 = _BinaryenSubVecI8x16(),\n SubSatSVecI8x16 = _BinaryenSubSatSVecI8x16(),\n SubSatUVecI8x16 = _BinaryenSubSatUVecI8x16(),\n MulVecI8x16 = _BinaryenMulVecI8x16(),\n AddVecI16x8 = _BinaryenAddVecI16x8(),\n AddSatSVecI16x8 = _BinaryenAddSatSVecI16x8(),\n AddSatUVecI16x8 = _BinaryenAddSatUVecI16x8(),\n SubVecI16x8 = _BinaryenSubVecI16x8(),\n SubSatSVecI16x8 = _BinaryenSubSatSVecI16x8(),\n SubSatUVecI16x8 = _BinaryenSubSatUVecI16x8(),\n MulVecI16x8 = _BinaryenMulVecI16x8(),\n AddVecI32x4 = _BinaryenAddVecI32x4(),\n SubVecI32x4 = _BinaryenSubVecI32x4(),\n MulVecI32x4 = _BinaryenMulVecI32x4(),\n AddVecI64x2 = _BinaryenAddVecI64x2(),\n SubVecI64x2 = _BinaryenSubVecI64x2(),\n AddVecF32x4 = _BinaryenAddVecF32x4(),\n SubVecF32x4 = _BinaryenSubVecF32x4(),\n MulVecF32x4 = _BinaryenMulVecF32x4(),\n DivVecF32x4 = _BinaryenDivVecF32x4(),\n MinVecF32x4 = _BinaryenMinVecF32x4(),\n MaxVecF32x4 = _BinaryenMaxVecF32x4(),\n AddVecF64x2 = _BinaryenAddVecF64x2(),\n SubVecF64x2 = _BinaryenSubVecF64x2(),\n MulVecF64x2 = _BinaryenMulVecF64x2(),\n DivVecF64x2 = _BinaryenDivVecF64x2(),\n MinVecF64x2 = _BinaryenMinVecF64x2(),\n MaxVecF64x2 = _BinaryenMaxVecF64x2()\n}\n\nexport class MemorySegment {\n\n buffer: Uint8Array;\n offset: I64;\n\n static create(buffer: Uint8Array, offset: I64): MemorySegment {\n var segment = new MemorySegment();\n segment.buffer = buffer;\n segment.offset = offset;\n return segment;\n }\n}\n\nexport class Module {\n\n ref: ModuleRef;\n\n private lit: usize;\n\n static create(): Module {\n var module = new Module();\n module.ref = _BinaryenModuleCreate();\n module.lit = memory.allocate(_BinaryenSizeofLiteral());\n return module;\n }\n\n static createFrom(buffer: Uint8Array): Module {\n var cArr = allocU8Array(buffer);\n try {\n let module = new Module();\n module.ref = _BinaryenModuleRead(cArr, buffer.length);\n module.lit = memory.allocate(_BinaryenSizeofLiteral());\n return module;\n } finally {\n memory.free(changetype(cArr));\n }\n }\n\n private constructor() { }\n\n // types\n\n addFunctionType(\n name: string,\n result: NativeType,\n paramTypes: NativeType[] | null\n ): FunctionRef {\n var cStr = this.allocStringCached(name);\n var cArr = allocI32Array(paramTypes);\n try {\n return _BinaryenAddFunctionType(this.ref, cStr, result, cArr, paramTypes ? paramTypes.length : 0);\n } finally {\n memory.free(cArr);\n }\n }\n\n getFunctionTypeBySignature(\n result: NativeType,\n paramTypes: NativeType[] | null\n ): FunctionTypeRef {\n var cArr = allocI32Array(paramTypes);\n try {\n return _BinaryenGetFunctionTypeBySignature(this.ref, result, cArr, paramTypes ? paramTypes.length : 0);\n } finally {\n memory.free(cArr);\n }\n }\n\n removeFunctionType(name: string): void {\n var cStr = this.allocStringCached(name);\n _BinaryenRemoveFunctionType(this.ref, cStr);\n }\n\n // constants\n\n createI32(value: i32): ExpressionRef {\n var out = this.lit;\n _BinaryenLiteralInt32(out, value);\n return _BinaryenConst(this.ref, out);\n }\n\n createI64(valueLow: i32, valueHigh: i32 = 0): ExpressionRef {\n var out = this.lit;\n _BinaryenLiteralInt64(out, valueLow, valueHigh);\n return _BinaryenConst(this.ref, out);\n }\n\n createF32(value: f32): ExpressionRef {\n var out = this.lit;\n _BinaryenLiteralFloat32(out, value);\n return _BinaryenConst(this.ref, out);\n }\n\n createF64(value: f64): ExpressionRef {\n var out = this.lit;\n _BinaryenLiteralFloat64(out, value);\n return _BinaryenConst(this.ref, out);\n }\n\n createV128(bytes: Uint8Array): ExpressionRef {\n assert(bytes.length == 16);\n var out = this.lit;\n // FIXME: does this work or do we need to malloc?\n for (let i = 0; i < 16; ++i) store(out + i, bytes[i]);\n _BinaryenLiteralVec128(out, out);\n return _BinaryenConst(this.ref, out);\n }\n\n // expressions\n\n createUnary(\n op: UnaryOp,\n expr: ExpressionRef\n ): ExpressionRef {\n return _BinaryenUnary(this.ref, op, expr);\n }\n\n createBinary(\n op: BinaryOp,\n left: ExpressionRef,\n right: ExpressionRef\n ): ExpressionRef {\n return _BinaryenBinary(this.ref, op, left, right);\n }\n\n createHost(\n op: HostOp,\n name: string | null = null,\n operands: ExpressionRef[] | null = null\n ): ExpressionRef {\n var cStr = this.allocStringCached(name);\n var cArr = allocPtrArray(operands);\n try {\n return _BinaryenHost(this.ref, op, cStr, cArr, operands ? (operands).length : 0);\n } finally {\n memory.free(cArr);\n }\n }\n\n createGetLocal(\n index: i32,\n type: NativeType\n ): ExpressionRef {\n return _BinaryenGetLocal(this.ref, index, type);\n }\n\n createTeeLocal(\n index: i32,\n value: ExpressionRef\n ): ExpressionRef {\n return _BinaryenTeeLocal(this.ref, index, value);\n }\n\n createGetGlobal(\n name: string,\n type: NativeType\n ): ExpressionRef {\n var cStr = this.allocStringCached(name);\n return _BinaryenGetGlobal(this.ref, cStr, type);\n }\n\n createLoad(\n bytes: Index,\n signed: bool,\n ptr: ExpressionRef,\n type: NativeType,\n offset: Index = 0\n ): ExpressionRef {\n return _BinaryenLoad(this.ref, bytes, signed ? 1 : 0, offset, /* always aligned */ bytes, type, ptr);\n }\n\n createStore(\n bytes: Index,\n ptr: ExpressionRef,\n value: ExpressionRef,\n type: NativeType,\n offset: Index = 0\n ): ExpressionRef {\n return _BinaryenStore(this.ref, bytes, offset, /* always aligned */ bytes, ptr, value, type);\n }\n\n createAtomicLoad(\n bytes: Index,\n ptr: ExpressionRef,\n type: NativeType,\n offset: Index = 0\n ): ExpressionRef {\n return _BinaryenAtomicLoad(this.ref, bytes, offset, type, ptr);\n }\n\n createAtomicStore(\n bytes: Index,\n ptr: ExpressionRef,\n value: ExpressionRef,\n type: NativeType,\n offset: Index = 0\n ): ExpressionRef {\n return _BinaryenAtomicStore(this.ref, bytes, offset, ptr, value, type);\n }\n\n createAtomicRMW(\n op: AtomicRMWOp,\n bytes: Index,\n offset: Index,\n ptr: ExpressionRef,\n value: ExpressionRef,\n type: NativeType\n ): ExpressionRef {\n return _BinaryenAtomicRMW(this.ref, op, bytes, offset, ptr, value, type);\n }\n\n createAtomicCmpxchg(\n bytes: Index,\n offset: Index,\n ptr: ExpressionRef,\n expected: ExpressionRef,\n replacement: ExpressionRef,\n type: NativeType\n ): ExpressionRef {\n return _BinaryenAtomicCmpxchg(this.ref, bytes, offset, ptr, expected, replacement, type);\n }\n\n createAtomicWait(\n ptr: ExpressionRef,\n expected: ExpressionRef,\n timeout: ExpressionRef,\n expectedType: NativeType\n ): ExpressionRef {\n return _BinaryenAtomicWait(this.ref, ptr, expected, timeout, expectedType);\n }\n\n createAtomicWake(\n ptr: ExpressionRef,\n wakeCount: ExpressionRef\n ): ExpressionRef {\n return _BinaryenAtomicWake(this.ref, ptr, wakeCount);\n }\n\n // statements\n\n createSetLocal(\n index: Index,\n value: ExpressionRef\n ): ExpressionRef {\n return _BinaryenSetLocal(this.ref, index, value);\n }\n\n createSetGlobal(\n name: string,\n value: ExpressionRef\n ): ExpressionRef {\n var cStr = this.allocStringCached(name);\n return _BinaryenSetGlobal(this.ref, cStr, value);\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = this.allocStringCached(label);\n var cArr = allocPtrArray(children);\n try {\n return _BinaryenBlock(this.ref, cStr, cArr, children.length, type);\n } finally {\n memory.free(cArr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = this.allocStringCached(label);\n return _BinaryenBreak(this.ref, cStr, condition, value);\n }\n\n createDrop(\n expression: ExpressionRef\n ): ExpressionRef {\n return _BinaryenDrop(this.ref, expression);\n }\n\n createLoop(\n label: string | null,\n body: ExpressionRef\n ): ExpressionRef {\n var cStr = this.allocStringCached(label);\n return _BinaryenLoop(this.ref, cStr, body);\n }\n\n createIf(\n condition: ExpressionRef,\n ifTrue: ExpressionRef,\n ifFalse: ExpressionRef = 0\n ): ExpressionRef {\n return _BinaryenIf(this.ref, condition, ifTrue, ifFalse);\n }\n\n createNop(): ExpressionRef {\n return _BinaryenNop(this.ref);\n }\n\n createReturn(\n expression: ExpressionRef = 0\n ): ExpressionRef {\n return _BinaryenReturn(this.ref, expression);\n }\n\n createSelect(\n ifTrue: ExpressionRef,\n ifFalse: ExpressionRef,\n condition: ExpressionRef\n ): ExpressionRef {\n return _BinaryenSelect(this.ref, condition, ifTrue, ifFalse);\n }\n\n createSwitch(\n names: string[],\n defaultName: string | null,\n condition: ExpressionRef,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var numNames = names.length;\n var strs = new Array(numNames);\n for (let i = 0; i < numNames; ++i) {\n strs[i] = this.allocStringCached(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = this.allocStringCached(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cArr);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = this.allocStringCached(target);\n var cArr = allocPtrArray(operands);\n try {\n return _BinaryenCall(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\n } finally {\n memory.free(cArr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cStr = this.allocStringCached(typeName);\n var cArr = allocPtrArray(operands);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cArr);\n }\n }\n\n createUnreachable(): ExpressionRef {\n return _BinaryenUnreachable(this.ref);\n }\n\n // bulk memory\n\n createMemoryCopy(\n dest: ExpressionRef,\n source: ExpressionRef,\n size: ExpressionRef\n ): ExpressionRef {\n return _BinaryenMemoryCopy(this.ref, dest, source, size);\n }\n\n createMemoryFill(\n dest: ExpressionRef,\n value: ExpressionRef,\n size: ExpressionRef\n ): ExpressionRef {\n return _BinaryenMemoryFill(this.ref, dest, value, size);\n }\n\n // meta\n\n addGlobal(\n name: string,\n type: NativeType,\n mutable: bool,\n initializer: ExpressionRef\n ): GlobalRef {\n var cStr = this.allocStringCached(name);\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = this.allocStringCached(name);\n _BinaryenRemoveGlobal(this.ref, cStr);\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = this.allocStringCached(name);\n var cArr = allocI32Array(varTypes);\n try {\n return _BinaryenAddFunction(this.ref, cStr, type, cArr, varTypes ? varTypes.length : 0, body);\n } finally {\n memory.free(cArr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = this.allocStringCached(name);\n _BinaryenRemoveFunction(this.ref, cStr);\n }\n\n private hasTemporaryFunction: bool = false;\n\n addTemporaryFunction(result: NativeType, paramTypes: NativeType[] | null, body: ExpressionRef): FunctionRef {\n this.hasTemporaryFunction = assert(!this.hasTemporaryFunction);\n var tempName = this.allocStringCached(\"\");\n var cArr = allocI32Array(paramTypes);\n try {\n let typeRef = _BinaryenAddFunctionType(this.ref, tempName, result, cArr, paramTypes ? paramTypes.length : 0);\n return _BinaryenAddFunction(this.ref, tempName, typeRef, 0, 0, body);\n } finally {\n memory.free(cArr);\n }\n }\n\n removeTemporaryFunction(): void {\n this.hasTemporaryFunction = !assert(this.hasTemporaryFunction);\n var tempName = this.allocStringCached(\"\");\n _BinaryenRemoveFunction(this.ref, tempName);\n _BinaryenRemoveFunctionType(this.ref, tempName);\n }\n\n addFunctionExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalName);\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalName);\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalName);\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalName);\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n }\n\n removeExport(externalName: string): void {\n var cStr = this.allocStringCached(externalName);\n _BinaryenRemoveExport(this.ref, cStr);\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalModuleName);\n var cStr3 = this.allocStringCached(externalBaseName);\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalModuleName);\n var cStr3 = this.allocStringCached(externalBaseName);\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n shared: bool = false,\n ): ImportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalModuleName);\n var cStr3 = this.allocStringCached(externalBaseName);\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3, shared);\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalModuleName);\n var cStr3 = this.allocStringCached(externalBaseName);\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n }\n\n /** Unlimited memory constant. */\n static readonly UNLIMITED_MEMORY: Index = -1;\n\n setMemory(\n initial: Index,\n maximum: Index,\n segments: MemorySegment[],\n target: Target,\n exportName: string | null = null,\n shared: bool = false\n ): void {\n var cStr = this.allocStringCached(exportName);\n var k = segments.length;\n var segs = new Array(k);\n var offs = new Array(k);\n var sizs = new Array(k);\n for (let i = 0; i < k; ++i) {\n let buffer = segments[i].buffer;\n let offset = segments[i].offset;\n segs[i] = allocU8Array(buffer);\n offs[i] = target == Target.WASM64\n ? this.createI64(i64_low(offset), i64_high(offset))\n : this.createI32(i64_low(offset));\n sizs[i] = buffer.length;\n }\n var cArr1 = allocI32Array(segs);\n var cArr2 = allocI32Array(offs);\n var cArr3 = allocI32Array(sizs);\n try {\n _BinaryenSetMemory(this.ref, initial, maximum, cStr, cArr1, cArr2, cArr3, k, shared);\n } finally {\n memory.free(cArr3);\n memory.free(cArr2);\n memory.free(cArr1);\n for (let i = k - 1; i >= 0; --i) memory.free(segs[i]);\n }\n }\n\n setFunctionTable(\n initial: Index,\n maximum: Index,\n funcs: string[]\n ): void {\n var numNames = funcs.length;\n var names = new Array(numNames);\n for (let i = 0; i < numNames; ++i) {\n names[i] = this.allocStringCached(funcs[i]);\n }\n var cArr = allocI32Array(names);\n try {\n _BinaryenSetFunctionTable(this.ref, initial, maximum, cArr, numNames);\n } finally {\n memory.free(cArr);\n }\n }\n\n setStart(func: FunctionRef): void {\n _BinaryenSetStart(this.ref, func);\n }\n\n getOptimizeLevel(): i32 {\n return _BinaryenGetOptimizeLevel();\n }\n\n setOptimizeLevel(level: i32 = 2): void {\n _BinaryenSetOptimizeLevel(level);\n }\n\n getShrinkLevel(): i32 {\n return _BinaryenGetShrinkLevel();\n }\n\n setShrinkLevel(level: i32 = 1): void {\n _BinaryenSetShrinkLevel(level);\n }\n\n setDebugInfo(on: bool = false): void {\n _BinaryenSetDebugInfo(on);\n }\n\n optimize(func: FunctionRef = 0): void {\n if (func) {\n _BinaryenFunctionOptimize(func, this.ref);\n } else {\n _BinaryenModuleOptimize(this.ref);\n }\n }\n\n runPasses(passes: string[], func: FunctionRef = 0): void {\n var numNames = passes.length;\n var names = new Array(numNames);\n for (let i = 0; i < numNames; ++i) {\n names[i] = allocString(passes[i]);\n }\n var cArr = allocI32Array(names);\n try {\n if (func) {\n _BinaryenFunctionRunPasses(func, this.ref, cArr, numNames);\n } else {\n _BinaryenModuleRunPasses(this.ref, cArr, numNames);\n }\n } finally {\n memory.free(cArr);\n for (let i = numNames; i >= 0; --i) memory.free(names[i]);\n }\n }\n\n private cachedPrecomputeNames: usize = 0;\n\n precomputeExpression(expr: ExpressionRef): ExpressionRef {\n // remember the previous optimize levels and set to max instead, to be sure\n var previousOptimizeLevel = _BinaryenGetOptimizeLevel();\n var previousShrinkLevel = _BinaryenGetShrinkLevel();\n var previousDebugInfo = _BinaryenGetDebugInfo();\n _BinaryenSetOptimizeLevel(4);\n _BinaryenSetShrinkLevel(0);\n _BinaryenSetDebugInfo(false);\n\n // wrap the expression in a temp. function and run the precompute pass on it\n var type = _BinaryenExpressionGetType(expr);\n var func = this.addTemporaryFunction(type, null, expr);\n var names = this.cachedPrecomputeNames;\n if (!names) {\n this.cachedPrecomputeNames = names = allocI32Array([ this.allocStringCached(\"precompute\") ]);\n }\n _BinaryenFunctionRunPasses(func, this.ref, names, 1);\n expr = _BinaryenFunctionGetBody(func);\n this.removeTemporaryFunction();\n\n // reset optimize levels to previous\n _BinaryenSetOptimizeLevel(previousOptimizeLevel);\n _BinaryenSetShrinkLevel(previousShrinkLevel);\n _BinaryenSetDebugInfo(previousDebugInfo);\n return expr;\n }\n\n validate(): bool {\n return _BinaryenModuleValidate(this.ref) == 1;\n }\n\n interpret(): void {\n _BinaryenModuleInterpret(this.ref);\n }\n\n toBinary(sourceMapUrl: string | null): BinaryModule {\n var out = this.lit; // safe to reuse as long as..\n assert(_BinaryenSizeofLiteral() >= 12);\n var cStr = allocString(sourceMapUrl);\n var binaryPtr: usize = 0;\n var sourceMapPtr: usize = 0;\n try {\n _BinaryenModuleAllocateAndWrite(out, this.ref, cStr);\n binaryPtr = readInt(out);\n let binaryBytes = readInt(out + 4);\n sourceMapPtr = readInt(out + 4 * 2);\n let ret = new BinaryModule();\n ret.output = readBuffer(binaryPtr, binaryBytes);\n ret.sourceMap = readString(sourceMapPtr);\n return ret;\n } finally {\n if (cStr) memory.free(cStr);\n if (binaryPtr) memory.free(binaryPtr);\n if (sourceMapPtr) memory.free(sourceMapPtr);\n }\n }\n\n toText(): string {\n throw new Error(\"not implemented\"); // JS glue overrides this\n }\n\n toAsmjs(): string {\n throw new Error(\"not implemented\"); // JS glue overrides this\n }\n\n private cachedStrings: Map = new Map();\n\n private allocStringCached(str: string | null): usize {\n if (str == null) return 0;\n if (cachedStrings.has(str)) return cachedStrings.get(str);\n var ptr = allocString(str);\n cachedStrings.set(str, ptr);\n return ptr;\n }\n\n dispose(): void {\n assert(this.ref);\n for (let ptr of this.cachedStrings.values()) memory.free(ptr);\n this.cachedStrings = new Map();\n memory.free(this.lit);\n memory.free(this.cachedPrecomputeNames);\n this.cachedPrecomputeNames = 0;\n _BinaryenModuleDispose(this.ref);\n this.ref = 0;\n }\n\n createRelooper(): Relooper {\n return Relooper.create(this);\n }\n\n cloneExpression(\n expr: ExpressionRef,\n noSideEffects: bool = false,\n maxDepth: i32 = i32.MAX_VALUE\n ): ExpressionRef { // currently supports side effect free expressions only\n if (maxDepth < 0) return 0;\n maxDepth -= 1;\n\n var nested1: ExpressionRef,\n nested2: ExpressionRef;\n\n switch (_BinaryenExpressionGetId(expr)) {\n case ExpressionId.Const: {\n switch (_BinaryenExpressionGetType(expr)) {\n case NativeType.I32: {\n return this.createI32(_BinaryenConstGetValueI32(expr));\n }\n case NativeType.I64: {\n return this.createI64(\n _BinaryenConstGetValueI64Low(expr),\n _BinaryenConstGetValueI64High(expr)\n );\n }\n case NativeType.F32: {\n return this.createF32(_BinaryenConstGetValueF32(expr));\n }\n case NativeType.F64: {\n return this.createF64(_BinaryenConstGetValueF64(expr));\n }\n default: {\n throw new Error(\"concrete type expected\");\n }\n }\n }\n case ExpressionId.GetLocal: {\n return _BinaryenGetLocal(this.ref,\n _BinaryenGetLocalGetIndex(expr),\n _BinaryenExpressionGetType(expr)\n );\n }\n case ExpressionId.GetGlobal: {\n let globalName = _BinaryenGetGlobalGetName(expr);\n if (!globalName) break;\n return _BinaryenGetGlobal(this.ref, globalName, _BinaryenExpressionGetType(expr));\n }\n case ExpressionId.Load: {\n if (!(nested1 = this.cloneExpression(_BinaryenLoadGetPtr(expr), noSideEffects, maxDepth))) {\n break;\n }\n return (\n _BinaryenLoadIsAtomic(expr)\n ? _BinaryenAtomicLoad(this.ref,\n _BinaryenLoadGetBytes(expr),\n _BinaryenLoadGetOffset(expr),\n _BinaryenExpressionGetType(expr),\n nested1\n )\n : _BinaryenLoad(this.ref,\n _BinaryenLoadGetBytes(expr),\n _BinaryenLoadIsSigned(expr) ? 1 : 0,\n _BinaryenLoadGetOffset(expr),\n _BinaryenLoadGetAlign(expr),\n _BinaryenExpressionGetType(expr),\n nested1\n )\n );\n }\n case ExpressionId.Unary: {\n if (!(nested1 = this.cloneExpression(_BinaryenUnaryGetValue(expr), noSideEffects, maxDepth))) {\n break;\n }\n return _BinaryenUnary(this.ref, _BinaryenUnaryGetOp(expr), nested1);\n }\n case ExpressionId.Binary: {\n if (!(nested1 = this.cloneExpression(_BinaryenBinaryGetLeft(expr), noSideEffects, maxDepth))) {\n break;\n }\n if (!(nested2 = this.cloneExpression(_BinaryenBinaryGetRight(expr), noSideEffects, maxDepth))) {\n break;\n }\n return _BinaryenBinary(this.ref, _BinaryenBinaryGetOp(expr), nested1, nested2);\n }\n }\n return 0;\n }\n\n // source map generation\n\n addDebugInfoFile(name: string): Index {\n var cStr = allocString(name);\n try {\n return _BinaryenModuleAddDebugInfoFileName(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n getDebugInfoFile(index: Index): string | null {\n return readString(_BinaryenModuleGetDebugInfoFileName(this.ref, index));\n }\n\n setDebugLocation(\n func: FunctionRef,\n expr: ExpressionRef,\n fileIndex: Index,\n lineNumber: Index,\n columnNumber: Index\n ): void {\n _BinaryenFunctionSetDebugLocation(func, expr, fileIndex, lineNumber, columnNumber);\n }\n}\n\n// expressions\n\nexport function getExpressionId(expr: ExpressionRef): ExpressionId {\n return _BinaryenExpressionGetId(expr);\n}\n\nexport function getExpressionType(expr: ExpressionRef): NativeType {\n return _BinaryenExpressionGetType(expr);\n}\n\nexport function getConstValueI32(expr: ExpressionRef): i32 {\n return _BinaryenConstGetValueI32(expr);\n}\n\nexport function getConstValueI64Low(expr: ExpressionRef): i32 {\n return _BinaryenConstGetValueI64Low(expr);\n}\n\nexport function getConstValueI64High(expr: ExpressionRef): i32 {\n return _BinaryenConstGetValueI64High(expr);\n}\n\nexport function getConstValueF32(expr: ExpressionRef): f32 {\n return _BinaryenConstGetValueF32(expr);\n}\n\nexport function getConstValueF64(expr: ExpressionRef): f32 {\n return _BinaryenConstGetValueF64(expr);\n}\n\nexport function getGetLocalIndex(expr: ExpressionRef): Index {\n return _BinaryenGetLocalGetIndex(expr);\n}\n\nexport function getSetLocalIndex(expr: ExpressionRef): Index {\n return _BinaryenSetLocalGetIndex(expr);\n}\n\nexport function getSetLocalValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenSetLocalGetValue(expr);\n}\n\nexport function isTeeLocal(expr: ExpressionRef): bool {\n return _BinaryenSetLocalIsTee(expr);\n}\n\nexport function getGetGlobalName(expr: ExpressionRef): string | null {\n return readString(_BinaryenGetGlobalGetName(expr));\n}\n\nexport function getBinaryOp(expr: ExpressionRef): BinaryOp {\n return _BinaryenBinaryGetOp(expr);\n}\n\nexport function getBinaryLeft(expr: ExpressionRef): ExpressionRef {\n return _BinaryenBinaryGetLeft(expr);\n}\n\nexport function getBinaryRight(expr: ExpressionRef): ExpressionRef {\n return _BinaryenBinaryGetRight(expr);\n}\n\nexport function getUnaryOp(expr: ExpressionRef): UnaryOp {\n return _BinaryenUnaryGetOp(expr);\n}\n\nexport function getUnaryValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenUnaryGetValue(expr);\n}\n\nexport function getLoadBytes(expr: ExpressionRef): u32 {\n return _BinaryenLoadGetBytes(expr);\n}\n\nexport function getLoadOffset(expr: ExpressionRef): u32 {\n return _BinaryenLoadGetOffset(expr);\n}\n\nexport function getLoadPtr(expr: ExpressionRef): ExpressionRef {\n return _BinaryenLoadGetPtr(expr);\n}\n\nexport function isLoadSigned(expr: ExpressionRef): bool {\n return _BinaryenLoadIsSigned(expr);\n}\n\nexport function getStoreBytes(expr: ExpressionRef): u32 {\n return _BinaryenStoreGetBytes(expr);\n}\n\nexport function getStoreOffset(expr: ExpressionRef): u32 {\n return _BinaryenStoreGetOffset(expr);\n}\n\nexport function getStorePtr(expr: ExpressionRef): ExpressionRef {\n return _BinaryenStoreGetPtr(expr);\n}\n\nexport function getStoreValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenStoreGetValue(expr);\n}\n\nexport function getBlockName(expr: ExpressionRef): string | null {\n return readString(_BinaryenBlockGetName(expr));\n}\n\nexport function getBlockChildCount(expr: ExpressionRef): Index {\n return _BinaryenBlockGetNumChildren(expr);\n}\n\nexport function getBlockChild(expr: ExpressionRef, index: Index): ExpressionRef {\n return _BinaryenBlockGetChild(expr, index);\n}\n\nexport function getIfCondition(expr: ExpressionRef): ExpressionRef {\n return _BinaryenIfGetCondition(expr);\n}\n\nexport function getIfTrue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenIfGetIfTrue(expr);\n}\n\nexport function getIfFalse(expr: ExpressionRef): ExpressionRef {\n return _BinaryenIfGetIfFalse(expr);\n}\n\nexport function getLoopName(expr: ExpressionRef): string | null {\n return readString(_BinaryenLoopGetName(expr));\n}\n\nexport function getLoopBody(expr: ExpressionRef): ExpressionRef {\n return _BinaryenLoopGetBody(expr);\n}\n\nexport function getBreakName(expr: ExpressionRef): string | null {\n return readString(_BinaryenBreakGetName(expr));\n}\n\nexport function getBreakCondition(expr: ExpressionRef): ExpressionRef {\n return _BinaryenBreakGetCondition(expr);\n}\n\nexport function getSelectThen(expr: ExpressionRef): ExpressionRef {\n return _BinaryenSelectGetIfTrue(expr);\n}\n\nexport function getSelectElse(expr: ExpressionRef): ExpressionRef {\n return _BinaryenSelectGetIfFalse(expr);\n}\n\nexport function getSelectCondition(expr: ExpressionRef): ExpressionRef {\n return _BinaryenSelectGetCondition(expr);\n}\n\nexport function getDropValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenDropGetValue(expr);\n}\n\nexport function getReturnValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenReturnGetValue(expr);\n}\n\nexport function getCallTarget(expr: ExpressionRef): string | null {\n return readString(_BinaryenCallGetTarget(expr));\n}\n\nexport function getHostOp(expr: ExpressionRef): ExpressionRef {\n return _BinaryenHostGetOp(expr);\n}\n\nexport function getHostOperandCount(expr: ExpressionRef): Index {\n return _BinaryenHostGetNumOperands(expr);\n}\n\nexport function getHostOperand(expr: ExpressionRef, index: Index): ExpressionRef {\n return _BinaryenHostGetOperand(expr, index);\n}\n\nexport function getHostName(expr: ExpressionRef): string | null {\n return readString(_BinaryenHostGetNameOperand(expr));\n}\n\n// functions\n\nexport function getFunctionBody(func: FunctionRef): ExpressionRef {\n return _BinaryenFunctionGetBody(func);\n}\n\nexport function getFunctionName(func: FunctionRef): string | null {\n return readString(_BinaryenFunctionGetName(func));\n}\n\nexport function getFunctionParamCount(func: FunctionRef): Index {\n return _BinaryenFunctionGetNumParams(func);\n}\n\nexport function getFunctionParamType(func: FunctionRef, index: Index): NativeType {\n return _BinaryenFunctionGetParam(func, index);\n}\n\nexport function getFunctionResultType(func: FunctionRef): NativeType {\n return _BinaryenFunctionGetResult(func);\n}\n\nexport class Relooper {\n\n module: Module;\n ref: RelooperRef;\n\n static create(module: Module): Relooper {\n var relooper = new Relooper();\n relooper.module = module;\n relooper.ref = _RelooperCreate(module.ref);\n return relooper;\n }\n\n private constructor() {}\n\n addBlock(code: ExpressionRef): RelooperBlockRef {\n return _RelooperAddBlock(this.ref, code);\n }\n\n addBranch(\n from: RelooperBlockRef,\n to: RelooperBlockRef,\n condition: ExpressionRef = 0,\n code: ExpressionRef = 0\n ): void {\n _RelooperAddBranch(from, to, condition, code);\n }\n\n addBlockWithSwitch(code: ExpressionRef, condition: ExpressionRef): RelooperBlockRef {\n return _RelooperAddBlockWithSwitch(this.ref, code, condition);\n }\n\n addBranchForSwitch(\n from: RelooperBlockRef,\n to: RelooperBlockRef,\n indexes: i32[],\n code: ExpressionRef = 0\n ): void {\n var cArr = allocI32Array(indexes);\n try {\n _RelooperAddBranchForSwitch(from, to, cArr, indexes.length, code);\n } finally {\n memory.free(cArr);\n }\n }\n\n renderAndDispose(entry: RelooperBlockRef, labelHelper: Index): ExpressionRef {\n return _RelooperRenderAndDispose(this.ref, entry, labelHelper);\n }\n}\n\n// export function hasSideEffects(expr: ExpressionRef): bool {\n// switch (_BinaryenExpressionGetId(expr = getPtr(expr))) {\n// case ExpressionId.GetLocal:\n// case ExpressionId.GetGlobal:\n// case ExpressionId.Const:\n// case ExpressionId.Nop:\n// case ExpressionId.Unreachable: {\n// return false;\n// }\n// case ExpressionId.Block: {\n// for (let i = 0, k = _BinaryenBlockGetNumChildren(expr); i < k; ++i) {\n// if (hasSideEffects(_BinaryenBlockGetChild(expr, i))) return true;\n// }\n// return false;\n// }\n// case ExpressionId.If: {\n// return hasSideEffects(_BinaryenIfGetCondition(expr))\n// || hasSideEffects(_BinaryenIfGetIfTrue(expr))\n// || hasSideEffects(_BinaryenIfGetIfFalse(expr));\n// }\n// case ExpressionId.Unary: {\n// return hasSideEffects(_BinaryenUnaryGetValue(expr));\n// }\n// case ExpressionId.Binary: {\n// return hasSideEffects(_BinaryenBinaryGetLeft(expr))\n// || hasSideEffects(_BinaryenBinaryGetRight(expr));\n// }\n// case ExpressionId.Drop: {\n// return hasSideEffects(_BinaryenDropGetValue(expr));\n// }\n// case ExpressionId.Select: {\n// return hasSideEffects(_BinaryenSelectGetIfTrue(expr))\n// || hasSideEffects(_BinaryenSelectGetIfFalse(expr))\n// || hasSideEffects(_BinaryenSelectGetCondition(expr));\n// }\n// }\n// return true;\n// }\n\n// helpers\n// can't do stack allocation here: STACKTOP is a global in WASM but a hidden variable in asm.js\n\nfunction allocU8Array(u8s: Uint8Array | null): usize {\n if (!u8s) return 0;\n var numValues = u8s.length;\n var ptr = memory.allocate(numValues);\n var idx = ptr;\n for (let i = 0; i < numValues; ++i) {\n store(idx++, u8s[i]);\n }\n return ptr;\n}\n\nfunction allocI32Array(i32s: i32[] | null): usize {\n if (!i32s) return 0;\n var ptr = memory.allocate(i32s.length << 2);\n var idx = ptr;\n for (let i = 0, k = i32s.length; i < k; ++i) {\n let val = i32s[i];\n // store(idx, val) is not portable\n store(idx , ( val & 0xff) as u8);\n store(idx + 1, ((val >> 8) & 0xff) as u8);\n store(idx + 2, ((val >> 16) & 0xff) as u8);\n store(idx + 3, ( val >>> 24 ) as u8);\n idx += 4;\n }\n return ptr;\n}\n\nfunction allocPtrArray(ptrs: usize[] | null): usize {\n return allocI32Array(ptrs); // TODO: WASM64 one day\n}\n\nfunction stringLengthUTF8(str: string): usize {\n var len = 0;\n for (let i = 0, k = str.length; i < k; ++i) {\n let u = str.charCodeAt(i);\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\n }\n if (u <= 0x7F) {\n ++len;\n } else if (u <= 0x7FF) {\n len += 2;\n } else if (u <= 0xFFFF) {\n len += 3;\n } else if (u <= 0x1FFFFF) {\n len += 4;\n } else if (u <= 0x3FFFFFF) {\n len += 5;\n } else {\n len += 6;\n }\n }\n return len;\n}\n\nvar cachedStrings = new Map();\n\nfunction allocString(str: string | null): usize {\n if (str == null) return 0;\n if (cachedStrings.has(str)) return cachedStrings.get(str);\n var ptr = memory.allocate(stringLengthUTF8(str) + 1);\n // the following is based on Emscripten's stringToUTF8Array\n var idx = ptr;\n for (let i = 0, k = str.length; i < k; ++i) {\n let u = str.charCodeAt(i);\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\n }\n if (u <= 0x7F) {\n store(idx++, u as u8);\n } else if (u <= 0x7FF) {\n store(idx++, (0xC0 | (u >>> 6) ) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n } else if (u <= 0xFFFF) {\n store(idx++, (0xE0 | (u >>> 12) ) as u8);\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n } else if (u <= 0x1FFFFF) {\n store(idx++, (0xF0 | (u >>> 18) ) as u8);\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n } else if (u <= 0x3FFFFFF) {\n store(idx++, (0xF8 | (u >>> 24) ) as u8);\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n } else {\n store(idx++, (0xFC | (u >>> 30) ) as u8);\n store(idx++, (0x80 | ((u >>> 24) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n }\n }\n store(idx, 0);\n cachedStrings.set(str, ptr);\n return ptr;\n}\n\nfunction readInt(ptr: usize): i32 {\n return (\n load(ptr ) |\n (load(ptr + 1) << 8) |\n (load(ptr + 2) << 16) |\n (load(ptr + 3) << 24)\n );\n}\n\nfunction readBuffer(ptr: usize, length: usize): Uint8Array {\n var ret = new Uint8Array(length);\n for (let i: usize = 0; i < length; ++i) {\n ret[i] = load(ptr + i);\n }\n return ret;\n}\n\nexport function readString(ptr: usize): string | null {\n if (!ptr) return null;\n var arr = new Array();\n // the following is based on Emscripten's UTF8ArrayToString\n var cp: u32;\n var u1: u32, u2: u32, u3: u32, u4: u32, u5: u32;\n while (cp = load(ptr++)) {\n if (!(cp & 0x80)) {\n arr.push(cp);\n continue;\n }\n u1 = load(ptr++) & 63;\n if ((cp & 0xE0) == 0xC0) {\n arr.push(((cp & 31) << 6) | u1);\n continue;\n }\n u2 = load(ptr++) & 63;\n if ((cp & 0xF0) == 0xE0) {\n cp = ((cp & 15) << 12) | (u1 << 6) | u2;\n } else {\n u3 = load(ptr++) & 63;\n if ((cp & 0xF8) == 0xF0) {\n cp = ((cp & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;\n } else {\n u4 = load(ptr++) & 63;\n if ((cp & 0xFC) == 0xF8) {\n cp = ((cp & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;\n } else {\n u5 = load(ptr++) & 63;\n cp = ((cp & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;\n }\n }\n }\n arr.push(cp);\n // if (cp < 0x10000) {\n // arr.push(cp);\n // } else {\n // var ch = cp - 0x10000;\n // arr.push(0xD800 | (ch >> 10));\n // arr.push(0xDC00 | (ch & 0x3FF));\n // }\n }\n // return String.fromCharCodes(arr);\n return String.fromCodePoints(arr);\n}\n\n/** Result structure of {@link Module#toBinary}. */\nexport class BinaryModule {\n /** WebAssembly binary. */\n output: Uint8Array;\n /** Source map, if generated. */\n sourceMap: string | null;\n}\n\n/** Tests if an expression needs an explicit 'unreachable' when it is the terminating statement. */\nexport function needsExplicitUnreachable(expr: ExpressionRef): bool {\n // not applicable if pushing a value to the stack\n switch (_BinaryenExpressionGetType(expr)) {\n case NativeType.I32:\n case NativeType.I64:\n case NativeType.F32:\n case NativeType.F64: return false;\n }\n switch (_BinaryenExpressionGetId(expr)) {\n case ExpressionId.Unreachable:\n case ExpressionId.Return: return false;\n case ExpressionId.Break: return _BinaryenBreakGetCondition(expr) != 0;\n case ExpressionId.Block: {\n if (!_BinaryenBlockGetName(expr)) { // can't break out of it\n let numChildren = _BinaryenBlockGetNumChildren(expr); // last child needs unreachable\n return numChildren > 0 && needsExplicitUnreachable(_BinaryenBlockGetChild(expr, numChildren - 1));\n }\n }\n }\n return true;\n}\n","/**\n * Abstract syntax tree representing a source file once parsed.\n * @module ast\n *//***/\n\nimport {\n CommonFlags,\n PATH_DELIMITER,\n STATIC_DELIMITER,\n INSTANCE_DELIMITER,\n LIBRARY_PREFIX\n} from \"./common\";\n\nimport {\n Token,\n Tokenizer,\n Range\n} from \"./tokenizer\";\n\nimport {\n normalizePath,\n resolvePath,\n CharCode\n} from \"./util\";\n\nexport { Token, Range };\n\n/** Indicates the kind of a node. */\nexport enum NodeKind {\n\n SOURCE,\n\n // types\n TYPE,\n TYPEPARAMETER,\n PARAMETER,\n SIGNATURE,\n\n // expressions\n IDENTIFIER,\n ASSERTION,\n BINARY,\n CALL,\n CLASS,\n COMMA,\n ELEMENTACCESS,\n FALSE,\n FUNCTION,\n INSTANCEOF,\n LITERAL,\n NEW,\n NULL,\n PARENTHESIZED,\n PROPERTYACCESS,\n TERNARY,\n SUPER,\n THIS,\n TRUE,\n CONSTRUCTOR,\n UNARYPOSTFIX,\n UNARYPREFIX,\n\n // statements\n BLOCK,\n BREAK,\n CONTINUE,\n DO,\n EMPTY,\n EXPORT,\n EXPORTIMPORT,\n EXPRESSION,\n FOR,\n IF,\n IMPORT,\n RETURN,\n SWITCH,\n THROW,\n TRY,\n VARIABLE,\n VOID,\n WHILE,\n\n // declaration statements\n CLASSDECLARATION,\n ENUMDECLARATION,\n ENUMVALUEDECLARATION,\n FIELDDECLARATION,\n FUNCTIONDECLARATION,\n IMPORTDECLARATION,\n INDEXSIGNATUREDECLARATION,\n INTERFACEDECLARATION,\n METHODDECLARATION,\n NAMESPACEDECLARATION,\n TYPEDECLARATION,\n VARIABLEDECLARATION,\n\n // special\n DECORATOR,\n EXPORTMEMBER,\n SWITCHCASE,\n COMMENT\n}\n\n/** Checks if a node represents a constant value. */\nexport function nodeIsConstantValue(kind: NodeKind): bool {\n switch (kind) {\n case NodeKind.LITERAL:\n case NodeKind.NULL:\n case NodeKind.TRUE:\n case NodeKind.FALSE: return true;\n }\n return false;\n}\n\n/** Checks if a node might be callable. */\nexport function nodeIsCallable(kind: NodeKind): bool {\n switch (kind) {\n case NodeKind.IDENTIFIER:\n case NodeKind.ASSERTION: // if kind=NONNULL\n case NodeKind.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PARENTHESIZED:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.SUPER: return true;\n }\n return false;\n}\n\n/** Checks if a node might be callable with generic arguments. */\nexport function nodeIsGenericCallable(kind: NodeKind): bool {\n switch (kind) {\n case NodeKind.IDENTIFIER:\n case NodeKind.PROPERTYACCESS: return true;\n }\n return false;\n}\n\n/** Base class of all nodes. */\nexport abstract class Node {\n\n /** Node kind indicator. */\n kind: NodeKind;\n /** Source range. */\n range: Range;\n /** Parent node. */\n parent: Node | null = null;\n /** Common flags indicating specific traits. */\n flags: CommonFlags = CommonFlags.NONE;\n\n /** Tests if this node has the specified flag or flags. */\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\n /** Tests if this node has one of the specified flags. */\n isAny(flag: CommonFlags): bool { return (this.flags & flag) != 0; }\n /** Sets a specific flag or flags. */\n set(flag: CommonFlags): void { this.flags |= flag; }\n\n // types\n\n static createType(\n name: IdentifierExpression,\n typeArguments: CommonTypeNode[] | null,\n isNullable: bool,\n range: Range\n ): TypeNode {\n var type = new TypeNode();\n type.range = range;\n type.name = name; name.parent = type;\n type.typeArguments = typeArguments; if (typeArguments) setParent(typeArguments, type);\n type.isNullable = isNullable;\n return type;\n }\n\n static createOmittedType(\n range: Range\n ): TypeNode {\n return Node.createType(\n Node.createIdentifierExpression(\"\", range),\n null,\n false,\n range\n );\n }\n\n static createTypeParameter(\n name: IdentifierExpression,\n extendsType: TypeNode | null,\n defaultType: TypeNode | null,\n range: Range\n ): TypeParameterNode {\n var elem = new TypeParameterNode();\n elem.range = range;\n elem.name = name; name.parent = elem;\n elem.extendsType = extendsType; if (extendsType) extendsType.parent = elem;\n elem.defaultType = defaultType; if (defaultType) defaultType.parent = elem;\n return elem;\n }\n\n static createParameter(\n name: IdentifierExpression,\n type: CommonTypeNode,\n initializer: Expression | null,\n kind: ParameterKind,\n range: Range\n ): ParameterNode {\n var elem = new ParameterNode();\n elem.range = range;\n elem.name = name; name.parent = elem;\n elem.type = type; if (type) type.parent = elem;\n elem.initializer = initializer; if (initializer) initializer.parent = elem;\n elem.parameterKind = kind;\n return elem;\n }\n\n static createSignature(\n parameters: ParameterNode[],\n returnType: CommonTypeNode,\n explicitThisType: TypeNode | null,\n isNullable: bool,\n range: Range\n ): SignatureNode {\n var sig = new SignatureNode();\n sig.range = range;\n sig.parameters = parameters; setParent(parameters, sig);\n sig.returnType = returnType; returnType.parent = sig;\n sig.explicitThisType = explicitThisType; if (explicitThisType) explicitThisType.parent = sig;\n sig.isNullable = isNullable;\n return sig;\n }\n\n // special\n\n static createDecorator(\n name: Expression,\n args: Expression[] | null,\n range: Range\n ): DecoratorNode {\n var stmt = new DecoratorNode();\n stmt.range = range;\n stmt.name = name; name.parent = stmt;\n stmt.arguments = args; if (args) setParent(args, stmt);\n stmt.decoratorKind = decoratorNameToKind(name);\n return stmt;\n }\n\n static createComment(\n text: string,\n kind: CommentKind,\n range: Range\n ): CommentNode {\n var node = new CommentNode();\n node.range = range;\n node.commentKind = kind;\n node.text = text;\n return node;\n }\n\n // expressions\n\n static createIdentifierExpression(\n name: string,\n range: Range\n ): IdentifierExpression {\n var expr = new IdentifierExpression();\n expr.range = range;\n expr.text = name;\n return expr;\n }\n\n static createEmptyIdentifierExpression(\n range: Range\n ): IdentifierExpression {\n var expr = new IdentifierExpression();\n expr.range = range;\n expr.text = \"\";\n return expr;\n }\n\n static createArrayLiteralExpression(\n elements: (Expression | null)[],\n range: Range\n ): ArrayLiteralExpression {\n var expr = new ArrayLiteralExpression();\n expr.range = range;\n expr.elementExpressions = elements; setParentIfNotNull(elements, expr);\n return expr;\n }\n\n static createAssertionExpression(\n assertionKind: AssertionKind,\n expression: Expression,\n toType: CommonTypeNode | null,\n range: Range\n ): AssertionExpression {\n var expr = new AssertionExpression();\n expr.range = range;\n expr.assertionKind = assertionKind;\n expr.expression = expression; expression.parent = expr;\n expr.toType = toType; if (toType) toType.parent = expr;\n return expr;\n }\n\n static createBinaryExpression(\n operator: Token,\n left: Expression,\n right: Expression,\n range: Range\n ): BinaryExpression {\n var expr = new BinaryExpression();\n expr.range = range;\n expr.operator = operator;\n expr.left = left; left.parent = expr;\n expr.right = right; right.parent = expr;\n return expr;\n }\n\n static createCallExpression(\n expression: Expression,\n typeArgs: CommonTypeNode[] | null,\n args: Expression[],\n range: Range\n ): CallExpression {\n var expr = new CallExpression();\n expr.range = range;\n expr.expression = expression; expression.parent = expr;\n expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\n expr.arguments = args; setParent(args, expr);\n return expr;\n }\n\n static createClassExpression(\n declaration: ClassDeclaration\n ): ClassExpression {\n var expr = new ClassExpression();\n expr.range = declaration.range;\n expr.declaration = declaration;\n return expr;\n }\n\n static createCommaExpression(\n expressions: Expression[],\n range: Range\n ): CommaExpression {\n var expr = new CommaExpression();\n expr.range = range;\n expr.expressions = expressions; setParent(expressions, expr);\n return expr;\n }\n\n static createConstructorExpression(\n range: Range\n ): ConstructorExpression {\n var expr = new ConstructorExpression();\n expr.range = range;\n return expr;\n }\n\n static createElementAccessExpression(\n expression: Expression,\n element: Expression,\n range: Range\n ): ElementAccessExpression {\n var expr = new ElementAccessExpression();\n expr.range = range;\n expr.expression = expression; expression.parent = expr;\n expr.elementExpression = element; element.parent = expr;\n return expr;\n }\n\n static createFalseExpression(\n range: Range\n ): FalseExpression {\n var expr = new FalseExpression();\n expr.range = range;\n return expr;\n }\n\n static createFloatLiteralExpression(\n value: f64,\n range: Range\n ): FloatLiteralExpression {\n var expr = new FloatLiteralExpression();\n expr.range = range;\n expr.value = value;\n return expr;\n }\n\n static createFunctionExpression(\n declaration: FunctionDeclaration\n ): FunctionExpression {\n var expr = new FunctionExpression();\n expr.flags = declaration.flags & CommonFlags.ARROW;\n expr.range = declaration.range;\n expr.declaration = declaration;\n return expr;\n }\n\n static createInstanceOfExpression(\n expression: Expression,\n isType: CommonTypeNode,\n range: Range\n ): InstanceOfExpression {\n var expr = new InstanceOfExpression();\n expr.range = range;\n expr.expression = expression; expression.parent = expr;\n expr.isType = isType; isType.parent = expr;\n return expr;\n }\n\n static createIntegerLiteralExpression(\n value: I64,\n range: Range\n ): IntegerLiteralExpression {\n var expr = new IntegerLiteralExpression();\n expr.range = range;\n expr.value = value;\n return expr;\n }\n\n static createNewExpression(\n expression: Expression,\n typeArgs: CommonTypeNode[] | null,\n args: Expression[],\n range: Range\n ): NewExpression {\n var expr = new NewExpression();\n expr.range = range;\n expr.expression = expression; expression.parent = expr;\n expr.typeArguments = typeArgs; if (typeArgs) setParent(typeArgs, expr);\n expr.arguments = args; setParent(args, expr);\n return expr;\n }\n\n static createNullExpression(\n range: Range\n ): NullExpression {\n var expr = new NullExpression();\n expr.range = range;\n return expr;\n }\n\n static createObjectLiteralExpression(\n names: IdentifierExpression[],\n values: Expression[],\n range: Range\n ): ObjectLiteralExpression {\n var expr = new ObjectLiteralExpression();\n expr.range = range;\n expr.names = names;\n expr.values = values;\n return expr;\n }\n\n static createParenthesizedExpression(\n expression: Expression,\n range: Range\n ): ParenthesizedExpression {\n var expr = new ParenthesizedExpression();\n expr.range = range;\n expr.expression = expression; expression.parent = expr;\n return expr;\n }\n\n static createPropertyAccessExpression(\n expression: Expression,\n property: IdentifierExpression,\n range: Range\n ): PropertyAccessExpression {\n var expr = new PropertyAccessExpression();\n expr.range = range;\n expr.expression = expression; expression.parent = expr;\n expr.property = property; property.parent = expr;\n return expr;\n }\n\n static createRegexpLiteralExpression(\n pattern: string,\n flags: string,\n range: Range\n ): RegexpLiteralExpression {\n var expr = new RegexpLiteralExpression();\n expr.range = range;\n expr.pattern = pattern;\n expr.patternFlags = flags;\n return expr;\n }\n\n static createTernaryExpression(\n condition: Expression,\n ifThen: Expression,\n ifElse: Expression,\n range: Range\n ): TernaryExpression {\n var expr = new TernaryExpression();\n expr.range = range;\n expr.condition = condition; condition.parent = expr;\n expr.ifThen = ifThen; ifThen.parent = expr;\n expr.ifElse = ifElse; ifElse.parent = expr;\n return expr;\n }\n\n static createStringLiteralExpression(\n value: string,\n range: Range\n ): StringLiteralExpression {\n var expr = new StringLiteralExpression();\n expr.range = range;\n expr.value = value;\n return expr;\n }\n\n static createSuperExpression(\n range: Range\n ): SuperExpression {\n var expr = new SuperExpression();\n expr.range = range;\n return expr;\n }\n\n static createThisExpression(\n range: Range\n ): ThisExpression {\n var expr = new ThisExpression();\n expr.range = range;\n return expr;\n }\n\n static createTrueExpression(\n range: Range\n ): TrueExpression {\n var expr = new TrueExpression();\n expr.range = range;\n return expr;\n }\n\n static createUnaryPostfixExpression(\n operator: Token,\n operand: Expression,\n range: Range\n ): UnaryPostfixExpression {\n var expr = new UnaryPostfixExpression();\n expr.range = range;\n expr.operator = operator;\n expr.operand = operand; operand.parent = expr;\n return expr;\n }\n\n static createUnaryPrefixExpression(\n operator: Token,\n operand: Expression,\n range: Range\n ): UnaryPrefixExpression {\n var expr = new UnaryPrefixExpression();\n expr.range = range;\n expr.operator = operator;\n expr.operand = operand; operand.parent = expr;\n return expr;\n }\n\n // statements\n\n static createBlockStatement(\n statements: Statement[],\n range: Range\n ): BlockStatement {\n var stmt = new BlockStatement();\n stmt.range = range;\n stmt.statements = statements; setParent(statements, stmt);\n return stmt;\n }\n\n static createBreakStatement(\n label: IdentifierExpression | null,\n range: Range\n ): BreakStatement {\n var stmt = new BreakStatement();\n stmt.range = range;\n stmt.label = label; if (label) label.parent = stmt;\n return stmt;\n }\n\n static createClassDeclaration(\n identifier: IdentifierExpression,\n typeParameters: TypeParameterNode[],\n extendsType: TypeNode | null, // can't be a function\n implementsTypes: TypeNode[] | null, // can't be functions\n members: DeclarationStatement[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): ClassDeclaration {\n var stmt = new ClassDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = identifier; identifier.parent = stmt;\n stmt.typeParameters = typeParameters; setParent(typeParameters, stmt);\n stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\n stmt.implementsTypes = implementsTypes; if (implementsTypes) setParent(implementsTypes, stmt);\n stmt.members = members; setParent(members, stmt);\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createContinueStatement(\n label: IdentifierExpression | null,\n range: Range\n ): ContinueStatement {\n var stmt = new ContinueStatement();\n stmt.range = range;\n stmt.label = label; if (label) label.parent = stmt;\n return stmt;\n }\n\n static createDoStatement(\n statement: Statement,\n condition: Expression,\n range: Range\n ): DoStatement {\n var stmt = new DoStatement();\n stmt.range = range;\n stmt.statement = statement; statement.parent = stmt;\n stmt.condition = condition; condition.parent = stmt;\n return stmt;\n }\n\n static createEmptyStatement(\n range: Range\n ): EmptyStatement {\n var stmt = new EmptyStatement();\n stmt.range = range;\n return stmt;\n }\n\n static createEnumDeclaration(\n name: IdentifierExpression,\n members: EnumValueDeclaration[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): EnumDeclaration {\n var stmt = new EnumDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.values = members; setParent(members, stmt);\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createEnumValueDeclaration(\n name: IdentifierExpression,\n value: Expression | null,\n flags: CommonFlags,\n range: Range\n ): EnumValueDeclaration {\n var stmt = new EnumValueDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.value = value; if (value) value.parent = stmt;\n return stmt;\n }\n\n static createExportStatement(\n members: ExportMember[] | null,\n path: StringLiteralExpression | null,\n flags: CommonFlags,\n range: Range\n ): ExportStatement {\n var stmt = new ExportStatement();\n stmt.range = range;\n stmt.flags = flags;\n stmt.members = members; if (members) setParent(members, stmt);\n stmt.path = path;\n if (path) {\n let normalizedPath = normalizePath(path.value);\n if (path.value.startsWith(\".\")) { // relative\n stmt.normalizedPath = resolvePath(\n normalizedPath,\n range.source.normalizedPath\n );\n } else { // absolute\n stmt.normalizedPath = normalizedPath;\n }\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\n } else {\n stmt.normalizedPath = null;\n stmt.internalPath = null;\n }\n return stmt;\n }\n\n static createExportImportStatement(\n name: IdentifierExpression,\n externalName: IdentifierExpression,\n range: Range\n ): ExportImportStatement {\n var stmt = new ExportImportStatement();\n stmt.range = range;\n stmt.name = name; name.parent = stmt;\n stmt.externalName = externalName; externalName.parent = stmt;\n return stmt;\n }\n\n static createExportMember(\n name: IdentifierExpression,\n externalName: IdentifierExpression | null,\n range: Range\n ): ExportMember {\n var elem = new ExportMember();\n elem.range = range;\n elem.name = name; name.parent = elem;\n if (!externalName) {\n externalName = name;\n } else {\n externalName.parent = elem;\n }\n elem.externalName = externalName;\n return elem;\n }\n\n static createExpressionStatement(\n expression: Expression\n ): ExpressionStatement {\n var stmt = new ExpressionStatement();\n stmt.range = expression.range;\n stmt.expression = expression; expression.parent = stmt;\n return stmt;\n }\n\n static createIfStatement(\n condition: Expression,\n ifTrue: Statement,\n ifFalse: Statement | null,\n range: Range\n ): IfStatement {\n var stmt = new IfStatement();\n stmt.range = range;\n stmt.condition = condition; condition.parent = stmt;\n stmt.ifTrue = ifTrue; ifTrue.parent = stmt;\n stmt.ifFalse = ifFalse; if (ifFalse) ifFalse.parent = stmt;\n return stmt;\n }\n\n static createImportStatement(\n decls: ImportDeclaration[] | null,\n path: StringLiteralExpression,\n range: Range\n ): ImportStatement {\n var stmt = new ImportStatement();\n stmt.range = range;\n stmt.declarations = decls; if (decls) setParent(decls, stmt);\n stmt.namespaceName = null;\n stmt.path = path;\n var normalizedPath = normalizePath(path.value);\n if (path.value.startsWith(\".\")) { // relative in project\n stmt.normalizedPath = resolvePath(\n normalizedPath,\n range.source.normalizedPath\n );\n } else { // absolute in library\n if (!normalizedPath.startsWith(LIBRARY_PREFIX)) {\n normalizedPath = LIBRARY_PREFIX + normalizedPath;\n }\n stmt.normalizedPath = normalizedPath;\n }\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\n return stmt;\n }\n\n static createImportStatementWithWildcard(\n identifier: IdentifierExpression,\n path: StringLiteralExpression,\n range: Range\n ): ImportStatement {\n var stmt = new ImportStatement();\n stmt.range = range;\n stmt.declarations = null;\n stmt.namespaceName = identifier;\n stmt.path = path;\n stmt.normalizedPath = resolvePath(\n normalizePath(path.value),\n range.source.normalizedPath\n );\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\n return stmt;\n }\n\n static createImportDeclaration(\n externalName: IdentifierExpression,\n name: IdentifierExpression | null,\n range: Range\n ): ImportDeclaration {\n var elem = new ImportDeclaration();\n elem.range = range;\n elem.externalName = externalName; externalName.parent = elem;\n if (!name) {\n name = externalName;\n } else {\n name.parent = elem;\n }\n elem.name = name;\n return elem;\n }\n\n static createInterfaceDeclaration(\n name: IdentifierExpression,\n typeParameters: TypeParameterNode[],\n extendsType: TypeNode | null, // can't be a function\n members: DeclarationStatement[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): InterfaceDeclaration {\n var stmt = new InterfaceDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\n stmt.extendsType = extendsType; if (extendsType) extendsType.parent = stmt;\n stmt.members = members; setParent(members, stmt);\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createFieldDeclaration(\n name: IdentifierExpression,\n type: CommonTypeNode | null,\n initializer: Expression | null,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): FieldDeclaration {\n var stmt = new FieldDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.type = type; if (type) type.parent = stmt;\n stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createForStatement(\n initializer: Statement | null,\n condition: Expression | null,\n incrementor: Expression | null,\n statement: Statement,\n range: Range\n ): ForStatement {\n var stmt = new ForStatement();\n stmt.range = range;\n stmt.initializer = initializer; if (initializer) initializer.parent = stmt;\n stmt.condition = condition; if (condition) condition.parent = stmt;\n stmt.incrementor = incrementor; if (incrementor) incrementor.parent = stmt;\n stmt.statement = statement; statement.parent = stmt;\n return stmt;\n }\n\n static createFunctionDeclaration(\n name: IdentifierExpression,\n typeParameters: TypeParameterNode[] | null,\n signature: SignatureNode,\n body: Statement | null,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): FunctionDeclaration {\n var stmt = new FunctionDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\n stmt.signature = signature; signature.parent = stmt;\n stmt.body = body; if (body) body.parent = stmt;\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createIndexSignatureDeclaration(\n keyType: TypeNode,\n valueType: CommonTypeNode,\n range: Range\n ): IndexSignatureDeclaration {\n var elem = new IndexSignatureDeclaration();\n elem.range = range;\n elem.keyType = keyType; keyType.parent = elem;\n elem.valueType = valueType; valueType.parent = elem;\n return elem;\n }\n\n static createMethodDeclaration(\n name: IdentifierExpression,\n typeParameters: TypeParameterNode[] | null,\n signature: SignatureNode,\n body: Statement | null,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): MethodDeclaration {\n var stmt = new MethodDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\n stmt.signature = signature; signature.parent = stmt;\n stmt.body = body; if (body) body.parent = stmt;\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createNamespaceDeclaration(\n name: IdentifierExpression,\n members: Statement[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): NamespaceDeclaration {\n var stmt = new NamespaceDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.members = members; setParent(members, stmt);\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createReturnStatement(\n value: Expression | null,\n range: Range\n ): ReturnStatement {\n var stmt = new ReturnStatement();\n stmt.range = range;\n stmt.value = value; if (value) value.parent = stmt;\n return stmt;\n }\n\n static createSwitchStatement(\n condition: Expression,\n cases: SwitchCase[],\n range: Range\n ): SwitchStatement {\n var stmt = new SwitchStatement();\n stmt.range = range;\n stmt.condition = condition; condition.parent = stmt;\n stmt.cases = cases; setParent(cases, stmt);\n return stmt;\n }\n\n static createSwitchCase(\n label: Expression | null,\n statements: Statement[],\n range: Range\n ): SwitchCase {\n var elem = new SwitchCase();\n elem.range = range;\n elem.label = label; if (label) label.parent = elem;\n elem.statements = statements; setParent(statements, elem);\n return elem;\n }\n\n static createThrowStatement(\n value: Expression,\n range: Range\n ): ThrowStatement {\n var stmt = new ThrowStatement();\n stmt.range = range;\n stmt.value = value; value.parent = stmt;\n return stmt;\n }\n\n static createTryStatement(\n statements: Statement[],\n catchVariable: IdentifierExpression | null,\n catchStatements: Statement[] | null,\n finallyStatements: Statement[] | null,\n range: Range\n ): TryStatement {\n var stmt = new TryStatement();\n stmt.range = range;\n stmt.statements = statements; setParent(statements, stmt);\n stmt.catchVariable = catchVariable;\n if (catchVariable) catchVariable.parent = stmt;\n stmt.catchStatements = catchStatements;\n if (catchStatements) setParent(catchStatements, stmt);\n stmt.finallyStatements = finallyStatements;\n if (finallyStatements) setParent(finallyStatements, stmt);\n return stmt;\n }\n\n static createTypeDeclaration(\n name: IdentifierExpression,\n typeParameters: TypeParameterNode[] | null,\n alias: CommonTypeNode,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): TypeDeclaration {\n var stmt = new TypeDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name; name.parent = stmt;\n stmt.typeParameters = typeParameters; if (typeParameters) setParent(typeParameters, stmt);\n stmt.type = alias; alias.parent = stmt;\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createVariableStatement(\n declarations: VariableDeclaration[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): VariableStatement {\n var stmt = new VariableStatement();\n stmt.range = range;\n stmt.flags = flags;\n stmt.declarations = declarations; setParent(declarations, stmt);\n stmt.decorators = decorators; if (decorators) setParent(decorators, stmt);\n return stmt;\n }\n\n static createVariableDeclaration(\n name: IdentifierExpression,\n type: CommonTypeNode | null,\n initializer: Expression | null,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): VariableDeclaration {\n var elem = new VariableDeclaration();\n elem.range = range;\n elem.flags = flags;\n elem.name = name; name.parent = elem;\n elem.type = type; if (type) type.parent = elem;\n elem.initializer = initializer; if (initializer) initializer.parent = elem;\n elem.decorators = decorators; // inherited\n return elem;\n }\n\n static createVoidStatement(\n expression: Expression,\n range: Range\n ): VoidStatement {\n var stmt = new VoidStatement();\n stmt.range = range;\n stmt.expression = expression;\n return stmt;\n }\n\n static createWhileStatement(\n condition: Expression,\n statement: Statement,\n range: Range\n ): WhileStatement {\n var stmt = new WhileStatement();\n stmt.range = range;\n stmt.condition = condition; condition.parent = stmt;\n stmt.statement = statement; statement.parent = stmt;\n return stmt;\n }\n}\n\n// types\n\nexport abstract class CommonTypeNode extends Node {\n // kind varies\n\n /** Whether nullable or not. */\n isNullable: bool;\n}\n\n/** Represents a type annotation. */\nexport class TypeNode extends CommonTypeNode {\n kind = NodeKind.TYPE;\n\n /** Identifier reference. */\n name: IdentifierExpression;\n /** Type argument references. */\n typeArguments: CommonTypeNode[] | null;\n}\n\n/** Represents a type parameter. */\nexport class TypeParameterNode extends Node {\n kind = NodeKind.TYPEPARAMETER;\n\n /** Identifier reference. */\n name: IdentifierExpression;\n /** Extended type reference, if any. */\n extendsType: TypeNode | null; // can't be a function\n /** Default type if omitted, if any. */\n defaultType: TypeNode | null; // can't be a function\n}\n\n/** Represents the kind of a parameter. */\nexport enum ParameterKind {\n /** No specific flags. */\n DEFAULT,\n /** Is an optional parameter. */\n OPTIONAL,\n /** Is a rest parameter. */\n REST\n}\n\n/** Represents a function parameter. */\nexport class ParameterNode extends Node {\n kind = NodeKind.PARAMETER;\n\n /** Parameter kind. */\n parameterKind: ParameterKind;\n /** Parameter name. */\n name: IdentifierExpression;\n /** Parameter type. */\n type: CommonTypeNode;\n /** Initializer expression, if present. */\n initializer: Expression | null;\n /** Implicit field declaration, if applicable. */\n implicitFieldDeclaration: FieldDeclaration | null = null;\n}\n\n/** Represents a function signature. */\nexport class SignatureNode extends CommonTypeNode {\n kind = NodeKind.SIGNATURE;\n\n /** Accepted parameters. */\n parameters: ParameterNode[];\n /** Return type. */\n returnType: CommonTypeNode;\n /** Explicitly provided this type, if any. */\n explicitThisType: TypeNode | null; // can't be a function\n}\n\n// special\n\n/** Built-in decorator kinds. */\nexport enum DecoratorKind {\n CUSTOM,\n GLOBAL,\n OPERATOR,\n OPERATOR_BINARY,\n OPERATOR_PREFIX,\n OPERATOR_POSTFIX,\n UNMANAGED,\n SEALED,\n INLINE,\n EXTERNAL,\n BUILTIN\n}\n\n/** Returns the kind of the specified decorator. Defaults to {@link DecoratorKind.CUSTOM}. */\nexport function decoratorNameToKind(name: Expression): DecoratorKind {\n // @global, @inline, @operator, @sealed, @unmanaged\n if (name.kind == NodeKind.IDENTIFIER) {\n let nameStr = (name).text;\n assert(nameStr.length);\n switch (nameStr.charCodeAt(0)) {\n case CharCode.b: {\n if (nameStr == \"builtin\") return DecoratorKind.BUILTIN;\n break;\n }\n case CharCode.e: {\n if (nameStr == \"external\") return DecoratorKind.EXTERNAL;\n break;\n }\n case CharCode.g: {\n if (nameStr == \"global\") return DecoratorKind.GLOBAL;\n break;\n }\n case CharCode.i: {\n if (nameStr == \"inline\") return DecoratorKind.INLINE;\n break;\n }\n case CharCode.o: {\n if (nameStr == \"operator\") return DecoratorKind.OPERATOR;\n break;\n }\n case CharCode.s: {\n if (nameStr == \"sealed\") return DecoratorKind.SEALED;\n break;\n }\n case CharCode.u: {\n if (nameStr == \"unmanaged\") return DecoratorKind.UNMANAGED;\n break;\n }\n }\n } else if (\n name.kind == NodeKind.PROPERTYACCESS &&\n (name).expression.kind == NodeKind.IDENTIFIER\n ) {\n let nameStr = ((name).expression).text;\n assert(nameStr.length);\n let propStr = (name).property.text;\n assert(propStr.length);\n // @operator.binary, @operator.prefix, @operator.postfix\n if (nameStr == \"operator\") {\n switch (propStr.charCodeAt(0)) {\n case CharCode.b: {\n if (propStr == \"binary\") return DecoratorKind.OPERATOR_BINARY;\n break;\n }\n case CharCode.p: {\n switch (propStr) {\n case \"prefix\": return DecoratorKind.OPERATOR_PREFIX;\n case \"postfix\": return DecoratorKind.OPERATOR_POSTFIX;\n }\n break;\n }\n }\n }\n }\n return DecoratorKind.CUSTOM;\n}\n\n/** Represents a decorator. */\nexport class DecoratorNode extends Node {\n kind = NodeKind.DECORATOR;\n\n /** Built-in kind, if applicable. */\n decoratorKind: DecoratorKind;\n /** Name expression. */\n name: Expression;\n /** Argument expressions. */\n arguments: Expression[] | null;\n}\n\n/** Comment kinds. */\nexport enum CommentKind {\n /** Line comment. */\n LINE,\n /** Triple-slash comment. */\n TRIPLE,\n /** Block comment. */\n BLOCK\n}\n\n/** Represents a comment. */\nexport class CommentNode extends Node {\n kind = NodeKind.COMMENT;\n\n /** Comment kind. */\n commentKind: CommentKind;\n /** Comment text. */\n text: string;\n}\n\n// expressions\n\n/** Base class of all expression nodes. */\nexport abstract class Expression extends Node { }\n\n/** Represents an identifier expression. */\nexport class IdentifierExpression extends Expression {\n kind = NodeKind.IDENTIFIER;\n\n /** Textual name. */\n text: string;\n}\n\n/** Indicates the kind of a literal. */\nexport enum LiteralKind {\n FLOAT,\n INTEGER,\n STRING,\n REGEXP,\n ARRAY,\n OBJECT\n}\n\n/** Base class of all literal expressions. */\nexport abstract class LiteralExpression extends Expression {\n kind = NodeKind.LITERAL;\n\n /** Specific literal kind. */\n literalKind: LiteralKind;\n}\n\n/** Represents an `[]` literal expression. */\nexport class ArrayLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.ARRAY;\n\n /** Nested element expressions. */\n elementExpressions: (Expression | null)[];\n}\n\n/** Indicates the kind of an assertion. */\nexport enum AssertionKind {\n PREFIX,\n AS,\n NONNULL\n}\n\n/** Represents an assertion expression. */\nexport class AssertionExpression extends Expression {\n kind = NodeKind.ASSERTION;\n\n /** Specific kind of this assertion. */\n assertionKind: AssertionKind;\n /** Expression being asserted. */\n expression: Expression;\n /** Target type. */\n toType: CommonTypeNode | null;\n}\n\n/** Represents a binary expression. */\nexport class BinaryExpression extends Expression {\n kind = NodeKind.BINARY;\n\n /** Operator token. */\n operator: Token;\n /** Left-hand side expression */\n left: Expression;\n /** Right-hand side expression. */\n right: Expression;\n}\n\n/** Represents a call expression. */\nexport class CallExpression extends Expression {\n kind = NodeKind.CALL;\n\n /** Called expression. Usually an identifier or property access expression. */\n expression: Expression;\n /** Provided type arguments. */\n typeArguments: CommonTypeNode[] | null;\n /** Provided arguments. */\n arguments: Expression[];\n}\n\n/** Represents a class expression using the 'class' keyword. */\nexport class ClassExpression extends Expression {\n kind = NodeKind.CLASS;\n\n /** Inline class declaration. */\n declaration: ClassDeclaration;\n}\n\n/** Represents a comma expression composed of multiple expressions. */\nexport class CommaExpression extends Expression {\n kind = NodeKind.COMMA;\n\n /** Sequential expressions. */\n expressions: Expression[];\n}\n\n/** Represents a `constructor` expression. */\nexport class ConstructorExpression extends IdentifierExpression {\n kind = NodeKind.CONSTRUCTOR;\n text = \"constructor\";\n}\n\n/** Represents an element access expression, e.g., array access. */\nexport class ElementAccessExpression extends Expression {\n kind = NodeKind.ELEMENTACCESS;\n\n /** Expression being accessed. */\n expression: Expression;\n /** Element of the expression being accessed. */\n elementExpression: Expression;\n}\n\n/** Represents a float literal expression. */\nexport class FloatLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.FLOAT;\n\n /** Float value. */\n value: f64;\n}\n\n/** Represents a function expression using the 'function' keyword. */\nexport class FunctionExpression extends Expression {\n kind = NodeKind.FUNCTION;\n\n /** Inline function declaration. */\n declaration: FunctionDeclaration;\n}\n\n/** Represents an `instanceof` expression. */\nexport class InstanceOfExpression extends Expression {\n kind = NodeKind.INSTANCEOF;\n\n /** Expression being asserted. */\n expression: Expression;\n /** Type to test for. */\n isType: CommonTypeNode;\n}\n\n/** Represents an integer literal expression. */\nexport class IntegerLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.INTEGER;\n\n /** Integer value. */\n value: I64;\n}\n\n/** Represents a `new` expression. Like a call but with its own kind. */\nexport class NewExpression extends CallExpression {\n kind = NodeKind.NEW;\n}\n\n/** Represents a `null` expression. */\nexport class NullExpression extends IdentifierExpression {\n kind = NodeKind.NULL;\n text = \"null\";\n}\n\n/** Represents an object literal expression. */\nexport class ObjectLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.OBJECT;\n\n /** Field names. */\n names: IdentifierExpression[];\n /** Field values. */\n values: Expression[];\n}\n\n/** Represents a parenthesized expression. */\nexport class ParenthesizedExpression extends Expression {\n kind = NodeKind.PARENTHESIZED;\n\n /** Expression in parenthesis. */\n expression: Expression;\n}\n\n/** Represents a property access expression. */\nexport class PropertyAccessExpression extends Expression {\n kind = NodeKind.PROPERTYACCESS;\n\n /** Expression being accessed. */\n expression: Expression;\n /** Property of the expression being accessed. */\n property: IdentifierExpression;\n}\n\n/** Represents a regular expression literal expression. */\nexport class RegexpLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.REGEXP;\n\n /** Regular expression pattern. */\n pattern: string;\n /** Regular expression flags. */\n patternFlags: string;\n}\n\n/** Represents a ternary expression, i.e., short if notation. */\nexport class TernaryExpression extends Expression {\n kind = NodeKind.TERNARY;\n\n /** Condition expression. */\n condition: Expression;\n /** Expression executed when condition is `true`. */\n ifThen: Expression;\n /** Expression executed when condition is `false`. */\n ifElse: Expression;\n}\n\n/** Represents a string literal expression. */\nexport class StringLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.STRING;\n\n /** String value without quotes. */\n value: string;\n}\n\n/** Represents a `super` expression. */\nexport class SuperExpression extends IdentifierExpression {\n kind = NodeKind.SUPER;\n text = \"super\";\n}\n\n/** Represents a `this` expression. */\nexport class ThisExpression extends IdentifierExpression {\n kind = NodeKind.THIS;\n text = \"this\";\n}\n\n/** Represents a `true` expression. */\nexport class TrueExpression extends IdentifierExpression {\n kind = NodeKind.TRUE;\n text = \"true\";\n}\n\n/** Represents a `false` expression. */\nexport class FalseExpression extends IdentifierExpression {\n kind = NodeKind.FALSE;\n text = \"false\";\n}\n\n/** Base class of all unary expressions. */\nexport abstract class UnaryExpression extends Expression {\n\n /** Operator token. */\n operator: Token;\n /** Operand expression. */\n operand: Expression;\n}\n\n/** Represents a unary postfix expression, e.g. a postfix increment. */\nexport class UnaryPostfixExpression extends UnaryExpression {\n kind = NodeKind.UNARYPOSTFIX;\n}\n\n/** Represents a unary prefix expression, e.g. a negation. */\nexport class UnaryPrefixExpression extends UnaryExpression {\n kind = NodeKind.UNARYPREFIX;\n}\n\n// statements\n\nexport function isLastStatement(statement: Statement): bool {\n var parent = assert(statement.parent);\n if (parent.kind == NodeKind.BLOCK) {\n let statements = (parent).statements;\n if (statements[statements.length - 1] === statement) {\n switch (assert(parent.parent).kind) {\n case NodeKind.FUNCTIONDECLARATION:\n case NodeKind.METHODDECLARATION: return true;\n }\n }\n }\n return false;\n}\n\n/** Base class of all statement nodes. */\nexport abstract class Statement extends Node { }\n\n/** Indicates the specific kind of a source. */\nexport enum SourceKind {\n /** Default source. Usually imported from an entry file. */\n DEFAULT,\n /** Entry file. */\n ENTRY,\n /** Library file. */\n LIBRARY\n}\n\n/** A top-level source node. */\nexport class Source extends Node {\n kind = NodeKind.SOURCE;\n parent = null;\n\n /** Source kind. */\n sourceKind: SourceKind;\n /** Normalized path. */\n normalizedPath: string;\n /** Path used internally. */\n internalPath: string;\n /** Simple path (last part without extension). */\n simplePath: string;\n /** Contained statements. */\n statements: Statement[];\n /** Full source text. */\n text: string;\n /** Tokenizer reference. */\n tokenizer: Tokenizer | null = null;\n /** Source map index. */\n debugInfoIndex: i32 = -1;\n /** Re-exported sources. */\n exportPaths: Set | null = null;\n\n /** Constructs a new source node. */\n constructor(normalizedPath: string, text: string, kind: SourceKind) {\n super();\n this.sourceKind = kind;\n this.normalizedPath = normalizedPath;\n var internalPath = mangleInternalPath(this.normalizedPath);\n this.internalPath = internalPath;\n var pos = internalPath.lastIndexOf(PATH_DELIMITER);\n this.simplePath = pos >= 0 ? internalPath.substring(pos + 1) : internalPath;\n this.statements = new Array();\n this.range = new Range(this, 0, text.length);\n this.text = text;\n }\n\n /** Tests if this source is an entry file. */\n get isEntry(): bool { return this.sourceKind == SourceKind.ENTRY; }\n /** Tests if this source is a stdlib file. */\n get isLibrary(): bool { return this.sourceKind == SourceKind.LIBRARY; }\n}\n\n/** Base class of all declaration statements. */\nexport abstract class DeclarationStatement extends Statement {\n\n /** Simple name being declared. */\n name: IdentifierExpression;\n /** Array of decorators. */\n decorators: DecoratorNode[] | null = null;\n\n protected cachedProgramLevelInternalName: string | null = null;\n protected cachedFileLevelInternalName: string | null = null;\n\n /** Gets the mangled program-level internal name of this declaration. */\n get programLevelInternalName(): string {\n if (!this.cachedProgramLevelInternalName) {\n this.cachedProgramLevelInternalName = mangleInternalName(this, true);\n }\n return this.cachedProgramLevelInternalName;\n }\n\n /** Gets the mangled file-level internal name of this declaration. */\n get fileLevelInternalName(): string {\n if (!this.cachedFileLevelInternalName) {\n this.cachedFileLevelInternalName = mangleInternalName(this, false);\n }\n return this.cachedFileLevelInternalName;\n }\n\n /** Tests if this is a top-level declaration within its source file. */\n get isTopLevel(): bool {\n var parent = this.parent;\n if (!parent) {\n return false;\n }\n if (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent)) {\n return false;\n }\n return parent.kind == NodeKind.SOURCE;\n }\n\n /** Tests if this declaration is a top-level export within its source file. */\n get isTopLevelExport(): bool {\n var parent = this.parent;\n if (!parent || (parent.kind == NodeKind.VARIABLE && !(parent = parent.parent))) {\n return false;\n }\n if (parent.kind == NodeKind.NAMESPACEDECLARATION) {\n return this.is(CommonFlags.EXPORT) && (parent).isTopLevelExport;\n }\n if (parent.kind == NodeKind.CLASSDECLARATION) {\n return this.is(CommonFlags.STATIC) && (parent).isTopLevelExport;\n }\n return parent.kind == NodeKind.SOURCE && this.is(CommonFlags.EXPORT);\n }\n\n /** Tests if this declaration needs an explicit export. */\n needsExplicitExport(member: ExportMember): bool {\n // This is necessary because module-level exports are automatically created\n // for top level declarations of all sorts. This function essentially tests\n // that there isn't a otherwise duplicate top-level export already.\n return (\n member.name.text != member.externalName.text || // if aliased\n this.range.source != member.range.source || // if a re-export\n !this.isTopLevelExport // if not top-level\n );\n }\n}\n\n/** Represents an index signature declaration. */\nexport class IndexSignatureDeclaration extends DeclarationStatement {\n kind = NodeKind.INDEXSIGNATUREDECLARATION;\n\n /** Key type. */\n keyType: TypeNode;\n /** Value type. */\n valueType: CommonTypeNode;\n}\n\n/** Base class of all variable-like declaration statements. */\nexport abstract class VariableLikeDeclarationStatement extends DeclarationStatement {\n\n /** Variable type. */\n type: CommonTypeNode | null;\n /** Variable initializer. */\n initializer: Expression | null;\n}\n\n/** Represents a block statement. */\nexport class BlockStatement extends Statement {\n kind = NodeKind.BLOCK;\n\n /** Contained statements. */\n statements: Statement[];\n}\n\n/** Represents a `break` statement. */\nexport class BreakStatement extends Statement {\n kind = NodeKind.BREAK;\n\n /** Target label, if applicable. */\n label: IdentifierExpression | null;\n}\n\n/** Represents a `class` declaration. */\nexport class ClassDeclaration extends DeclarationStatement {\n kind = NodeKind.CLASSDECLARATION;\n\n /** Accepted type parameters. */\n typeParameters: TypeParameterNode[];\n /** Base class type being extended, if any. */\n extendsType: TypeNode | null; // can't be a function\n /** Interface types being implemented, if any. */\n implementsTypes: TypeNode[] | null; // can't be functions\n /** Class member declarations. */\n members: DeclarationStatement[];\n\n get isGeneric(): bool {\n var typeParameters = this.typeParameters;\n return typeParameters != null && typeParameters.length > 0;\n }\n}\n\n/** Represents a `continue` statement. */\nexport class ContinueStatement extends Statement {\n kind = NodeKind.CONTINUE;\n\n /** Target label, if applicable. */\n label: IdentifierExpression | null;\n}\n\n/** Represents a `do` statement. */\nexport class DoStatement extends Statement {\n kind = NodeKind.DO;\n\n /** Statement being looped over. */\n statement: Statement;\n /** Condition when to repeat. */\n condition: Expression;\n}\n\n/** Represents an empty statement, i.e., a semicolon terminating nothing. */\nexport class EmptyStatement extends Statement {\n kind = NodeKind.EMPTY;\n}\n\n/** Represents an `enum` declaration. */\nexport class EnumDeclaration extends DeclarationStatement {\n kind = NodeKind.ENUMDECLARATION;\n\n /** Enum value declarations. */\n values: EnumValueDeclaration[];\n}\n\n/** Represents a value of an `enum` declaration. */\nexport class EnumValueDeclaration extends DeclarationStatement {\n kind = NodeKind.ENUMVALUEDECLARATION;\n // name is inherited\n\n /** Value expression. */\n value: Expression | null;\n}\n\n/** Represents an `export import` statement of an interface. */\nexport class ExportImportStatement extends Node {\n kind = NodeKind.EXPORTIMPORT;\n\n /** Identifier being imported. */\n name: IdentifierExpression;\n /** Identifier being exported. */\n externalName: IdentifierExpression;\n}\n\n/** Represents a member of an `export` statement. */\nexport class ExportMember extends Node {\n kind = NodeKind.EXPORTMEMBER;\n\n /** Identifier being exported. */\n name: IdentifierExpression;\n /** Identifier seen when imported again. */\n externalName: IdentifierExpression;\n}\n\n/** Represents an `export` statement. */\nexport class ExportStatement extends Statement {\n kind = NodeKind.EXPORT;\n\n /** Array of members if a set of named exports, or `null` if a filespace export. */\n members: ExportMember[] | null;\n /** Path being exported from, if applicable. */\n path: StringLiteralExpression | null;\n /** Normalized path, if `path` is set. */\n normalizedPath: string | null;\n /** Mangled internal path being referenced, if `path` is set. */\n internalPath: string | null;\n}\n\n/** Represents an expression that is used as a statement. */\nexport class ExpressionStatement extends Statement {\n kind = NodeKind.EXPRESSION;\n\n /** Expression being used as a statement.*/\n expression: Expression;\n}\n\n/** Represents a field declaration within a `class`. */\nexport class FieldDeclaration extends VariableLikeDeclarationStatement {\n kind = NodeKind.FIELDDECLARATION;\n\n /** Parameter index within the constructor, if applicable. */\n parameterIndex: i32 = -1;\n}\n\n/** Represents a `for` statement. */\nexport class ForStatement extends Statement {\n kind = NodeKind.FOR;\n\n /**\n * Initializer statement, if present.\n * Either a {@link VariableStatement} or {@link ExpressionStatement}.\n */\n initializer: Statement | null;\n /** Condition expression, if present. */\n condition: Expression | null;\n /** Incrementor expression, if present. */\n incrementor: Expression | null;\n /** Statement being looped over. */\n statement: Statement;\n}\n\n/** Represents a `function` declaration. */\nexport class FunctionDeclaration extends DeclarationStatement {\n kind = NodeKind.FUNCTIONDECLARATION;\n\n /** Type parameters, if any. */\n typeParameters: TypeParameterNode[] | null;\n /** Function signature. */\n signature: SignatureNode;\n /** Body statement. Usually a block. */\n body: Statement | null;\n\n get isGeneric(): bool {\n var typeParameters = this.typeParameters;\n return typeParameters != null && typeParameters.length > 0;\n }\n}\n\n/** Represents an `if` statement. */\nexport class IfStatement extends Statement {\n kind = NodeKind.IF;\n\n /** Condition. */\n condition: Expression;\n /** Statement executed when condition is `true`. */\n ifTrue: Statement;\n /** Statement executed when condition is `false`. */\n ifFalse: Statement | null;\n}\n\n/** Represents an `import` declaration part of an {@link ImportStatement}. */\nexport class ImportDeclaration extends DeclarationStatement {\n kind = NodeKind.IMPORTDECLARATION;\n\n /** Identifier being imported. */\n externalName: IdentifierExpression;\n}\n\n/** Represents an `import` statement. */\nexport class ImportStatement extends Statement {\n kind = NodeKind.IMPORT;\n\n /** Array of member declarations or `null` if an asterisk import. */\n declarations: ImportDeclaration[] | null;\n /** Name of the local namespace, if an asterisk import. */\n namespaceName: IdentifierExpression | null;\n /** Path being imported from. */\n path: StringLiteralExpression;\n /** Normalized path. */\n normalizedPath: string;\n /** Mangled internal path being referenced. */\n internalPath: string;\n}\n\n/** Represents an `interfarce` declaration. */\nexport class InterfaceDeclaration extends ClassDeclaration {\n kind = NodeKind.INTERFACEDECLARATION;\n}\n\n/** Represents a method declaration within a `class`. */\nexport class MethodDeclaration extends FunctionDeclaration {\n kind = NodeKind.METHODDECLARATION;\n}\n\n/** Represents a `namespace` declaration. */\nexport class NamespaceDeclaration extends DeclarationStatement {\n kind = NodeKind.NAMESPACEDECLARATION;\n\n /** Array of namespace members. */\n members: Statement[];\n}\n\n/** Represents a `return` statement. */\nexport class ReturnStatement extends Statement {\n kind = NodeKind.RETURN;\n\n /** Value expression being returned, if present. */\n value: Expression | null;\n}\n\n/** Represents a single `case` within a `switch` statement. */\nexport class SwitchCase extends Node {\n kind = NodeKind.SWITCHCASE;\n\n /** Label expression. `null` indicates the default case. */\n label: Expression | null;\n /** Contained statements. */\n statements: Statement[];\n}\n\n/** Represents a `switch` statement. */\nexport class SwitchStatement extends Statement {\n kind = NodeKind.SWITCH;\n\n /** Condition expression. */\n condition: Expression;\n /** Contained cases. */\n cases: SwitchCase[];\n}\n\n/** Represents a `throw` statement. */\nexport class ThrowStatement extends Statement {\n kind = NodeKind.THROW;\n\n /** Value expression being thrown. */\n value: Expression;\n}\n\n/** Represents a `try` statement. */\nexport class TryStatement extends Statement {\n kind = NodeKind.TRY;\n\n /** Contained statements. */\n statements: Statement[];\n /** Exception variable name, if a `catch` clause is present. */\n catchVariable: IdentifierExpression | null;\n /** Statements being executed on catch, if a `catch` clause is present. */\n catchStatements: Statement[] | null;\n /** Statements being executed afterwards, if a `finally` clause is present. */\n finallyStatements: Statement[] | null;\n}\n\n/** Represents a `type` declaration. */\nexport class TypeDeclaration extends DeclarationStatement {\n kind = NodeKind.TYPEDECLARATION;\n\n /** Type parameters, if any. */\n typeParameters: TypeParameterNode[] | null;\n /** Type being aliased. */\n type: CommonTypeNode;\n}\n\n/** Represents a variable declaration part of a {@link VariableStatement}. */\nexport class VariableDeclaration extends VariableLikeDeclarationStatement {\n kind = NodeKind.VARIABLEDECLARATION;\n}\n\n/** Represents a variable statement wrapping {@link VariableDeclaration}s. */\nexport class VariableStatement extends Statement {\n kind = NodeKind.VARIABLE;\n\n /** Array of decorators. */\n decorators: DecoratorNode[] | null;\n /** Array of member declarations. */\n declarations: VariableDeclaration[];\n}\n\n/** Represents a void statement dropping an expression's value. */\nexport class VoidStatement extends Statement {\n kind = NodeKind.VOID;\n\n /** Expression being dropped. */\n expression: Expression;\n}\n\n/** Represents a `while` statement. */\nexport class WhileStatement extends Statement {\n kind = NodeKind.WHILE;\n\n /** Condition expression. */\n condition: Expression;\n /** Statement being looped over. */\n statement: Statement;\n}\n\n/** Finds the first decorator matching the specified kind. */\nexport function findDecorator(kind: DecoratorKind, decorators: DecoratorNode[] | null): DecoratorNode | null {\n if (decorators) {\n for (let i = 0, k = decorators.length; i < k; ++i) {\n let decorator = decorators[i];\n if (decorator.decoratorKind == kind) return decorator;\n }\n }\n return null;\n}\n\n/** Mangles a declaration's name to an internal name. */\nexport function mangleInternalName(declaration: DeclarationStatement, asGlobal: bool = false): string {\n var name = declaration.name.text;\n var parent = declaration.parent;\n if (!parent) return name;\n if (\n declaration.kind == NodeKind.VARIABLEDECLARATION &&\n parent.kind == NodeKind.VARIABLE\n ) { // skip over\n if (!(parent = parent.parent)) return name;\n }\n if (parent.kind == NodeKind.CLASSDECLARATION) {\n return mangleInternalName(parent, asGlobal) + (\n declaration.is(CommonFlags.STATIC)\n ? STATIC_DELIMITER\n : INSTANCE_DELIMITER\n ) + name;\n }\n if (\n parent.kind == NodeKind.NAMESPACEDECLARATION ||\n parent.kind == NodeKind.ENUMDECLARATION\n ) {\n return mangleInternalName(parent, asGlobal) +\n STATIC_DELIMITER + name;\n }\n return asGlobal\n ? name\n : declaration.range.source.internalPath + PATH_DELIMITER + name;\n}\n\n/** Mangles an external to an internal path. */\nexport function mangleInternalPath(path: string): string {\n if (path.endsWith(\".ts\")) path = path.substring(0, path.length - 3);\n return path;\n}\n\n// Helpers\n\n/** Sets the parent node on an array of nodes. */\nfunction setParent(nodes: Node[], parent: Node): void {\n for (let i = 0, k = nodes.length; i < k; ++i) {\n nodes[i].parent = parent;\n }\n}\n\n/** Sets the parent node on an array of nullable nodes. */\nfunction setParentIfNotNull(nodes: (Node | null)[], parent: Node): void {\n for (let i = 0, k = nodes.length; i < k; ++i) {\n let node = nodes[i];\n if (node) node.parent = parent;\n }\n}\n","/**\n * AssemblyScript's intermediate representation describing a program's elements.\n * @module program\n *//***/\n\nimport {\n CommonFlags,\n PATH_DELIMITER,\n STATIC_DELIMITER,\n INSTANCE_DELIMITER,\n LIBRARY_PREFIX,\n GETTER_PREFIX,\n SETTER_PREFIX,\n FILESPACE_PREFIX\n} from \"./common\";\n\nimport {\n Options,\n Feature\n} from \"./compiler\";\n\nimport {\n DiagnosticCode,\n DiagnosticMessage,\n DiagnosticEmitter\n} from \"./diagnostics\";\n\nimport {\n Type,\n TypeKind,\n TypeFlags,\n Signature\n} from \"./types\";\n\nimport {\n Node,\n NodeKind,\n Source,\n Range,\n CommonTypeNode,\n TypeParameterNode,\n DecoratorNode,\n DecoratorKind,\n\n Expression,\n IdentifierExpression,\n LiteralExpression,\n LiteralKind,\n StringLiteralExpression,\n\n ClassDeclaration,\n DeclarationStatement,\n EnumDeclaration,\n EnumValueDeclaration,\n ExportMember,\n ExportStatement,\n FieldDeclaration,\n FunctionDeclaration,\n ImportDeclaration,\n ImportStatement,\n InterfaceDeclaration,\n MethodDeclaration,\n NamespaceDeclaration,\n TypeDeclaration,\n VariableDeclaration,\n VariableLikeDeclarationStatement,\n VariableStatement,\n\n decoratorNameToKind,\n findDecorator\n} from \"./ast\";\n\nimport {\n Module,\n NativeType,\n FunctionRef,\n ExpressionRef,\n ExpressionId,\n BinaryOp,\n UnaryOp,\n\n getExpressionId,\n getGetLocalIndex,\n isTeeLocal,\n getSetLocalValue,\n getBinaryOp,\n getConstValueI32,\n getBinaryLeft,\n getBinaryRight,\n getUnaryOp,\n getExpressionType,\n getLoadBytes,\n isLoadSigned,\n getIfTrue,\n getIfFalse,\n getSelectThen,\n getSelectElse,\n getCallTarget,\n getBlockChildCount,\n getBlockChild,\n getBlockName,\n getConstValueF32,\n getConstValueF64,\n getConstValueI64Low,\n getGetGlobalName\n} from \"./module\";\n\nimport {\n CharCode,\n bitsetIs,\n bitsetSet\n} from \"./util\";\n\nimport {\n Resolver\n} from \"./resolver\";\n\n/** Represents a yet unresolved import. */\nclass QueuedImport {\n localName: string;\n externalName: string;\n externalNameAlt: string;\n declaration: ImportDeclaration | null; // not set if a filespace\n}\n\n/** Represents a yet unresolved export. */\nclass QueuedExport {\n externalName: string;\n isReExport: bool;\n member: ExportMember;\n}\n\n/** Represents a type alias. */\nclass TypeAlias {\n typeParameters: TypeParameterNode[] | null;\n type: CommonTypeNode;\n}\n\n/** Represents a module-level export. */\nclass ModuleExport {\n element: Element;\n identifier: IdentifierExpression;\n}\n\n/** Represents the kind of an operator overload. */\nexport enum OperatorKind {\n INVALID,\n\n // indexed access\n INDEXED_GET, // a[]\n INDEXED_SET, // a[]=b\n UNCHECKED_INDEXED_GET, // unchecked(a[])\n UNCHECKED_INDEXED_SET, // unchecked(a[]=b)\n\n // binary\n ADD, // a + b\n SUB, // a - b\n MUL, // a * b\n DIV, // a / b\n REM, // a % b\n POW, // a ** b\n BITWISE_AND, // a & b\n BITWISE_OR, // a | b\n BITWISE_XOR, // a ^ b\n BITWISE_SHL, // a << b\n BITWISE_SHR, // a >> b\n BITWISE_SHR_U, // a >>> b\n EQ, // a == b\n NE, // a != b\n GT, // a > b\n GE, // a >= b\n LT, // a < b\n LE, // a <= b\n\n // unary prefix\n PLUS, // +a\n MINUS, // -a\n NOT, // !a\n BITWISE_NOT, // ~a\n PREFIX_INC, // ++a\n PREFIX_DEC, // --a\n\n // unary postfix\n POSTFIX_INC, // a++\n POSTFIX_DEC // a--\n\n // not overridable:\n // IDENTITY // a === b\n // LOGICAL_AND // a && b\n // LOGICAL_OR // a || b\n}\n\n/** Returns the operator kind represented by the specified decorator and string argument. */\nfunction operatorKindFromDecorator(decoratorKind: DecoratorKind, arg: string): OperatorKind {\n assert(arg.length);\n switch (decoratorKind) {\n case DecoratorKind.OPERATOR:\n case DecoratorKind.OPERATOR_BINARY: {\n switch (arg.charCodeAt(0)) {\n case CharCode.OPENBRACKET: {\n if (arg == \"[]\") return OperatorKind.INDEXED_GET;\n if (arg == \"[]=\") return OperatorKind.INDEXED_SET;\n break;\n }\n case CharCode.OPENBRACE: {\n if (arg == \"{}\") return OperatorKind.UNCHECKED_INDEXED_GET;\n if (arg == \"{}=\") return OperatorKind.UNCHECKED_INDEXED_SET;\n break;\n }\n case CharCode.PLUS: {\n if (arg == \"+\") return OperatorKind.ADD;\n break;\n }\n case CharCode.MINUS: {\n if (arg == \"-\") return OperatorKind.SUB;\n break;\n }\n case CharCode.ASTERISK: {\n if (arg == \"*\") return OperatorKind.MUL;\n if (arg == \"**\") return OperatorKind.POW;\n break;\n }\n case CharCode.SLASH: {\n if (arg == \"/\") return OperatorKind.DIV;\n break;\n }\n case CharCode.PERCENT: {\n if (arg == \"%\") return OperatorKind.REM;\n break;\n }\n case CharCode.AMPERSAND: {\n if (arg == \"&\") return OperatorKind.BITWISE_AND;\n break;\n }\n case CharCode.BAR: {\n if (arg == \"|\") return OperatorKind.BITWISE_OR;\n break;\n }\n case CharCode.CARET: {\n if (arg == \"^\") return OperatorKind.BITWISE_XOR;\n break;\n }\n case CharCode.EQUALS: {\n if (arg == \"==\") return OperatorKind.EQ;\n break;\n }\n case CharCode.EXCLAMATION: {\n if (arg == \"!=\") return OperatorKind.NE;\n break;\n }\n case CharCode.GREATERTHAN: {\n if (arg == \">\") return OperatorKind.GT;\n if (arg == \">=\") return OperatorKind.GE;\n if (arg == \">>\") return OperatorKind.BITWISE_SHR;\n if (arg == \">>>\") return OperatorKind.BITWISE_SHR_U;\n break;\n }\n case CharCode.LESSTHAN: {\n if (arg == \"<\") return OperatorKind.LT;\n if (arg == \"<=\") return OperatorKind.LE;\n if (arg == \"<<\") return OperatorKind.BITWISE_SHL;\n break;\n }\n }\n break;\n }\n case DecoratorKind.OPERATOR_PREFIX: {\n switch (arg.charCodeAt(0)) {\n case CharCode.PLUS: {\n if (arg == \"+\") return OperatorKind.PLUS;\n if (arg == \"++\") return OperatorKind.PREFIX_INC;\n break;\n }\n case CharCode.MINUS: {\n if (arg == \"-\") return OperatorKind.MINUS;\n if (arg == \"--\") return OperatorKind.PREFIX_DEC;\n break;\n }\n case CharCode.EXCLAMATION: {\n if (arg == \"!\") return OperatorKind.NOT;\n break;\n }\n case CharCode.TILDE: {\n if (arg == \"~\") return OperatorKind.BITWISE_NOT;\n break;\n }\n }\n break;\n }\n case DecoratorKind.OPERATOR_POSTFIX: {\n switch (arg.charCodeAt(0)) {\n case CharCode.PLUS: {\n if (arg == \"++\") return OperatorKind.POSTFIX_INC;\n break;\n }\n case CharCode.MINUS: {\n if (arg == \"--\") return OperatorKind.POSTFIX_DEC;\n break;\n }\n }\n break;\n }\n }\n return OperatorKind.INVALID;\n}\n\nconst noTypesYet = new Map();\n\n/** Represents an AssemblyScript program. */\nexport class Program extends DiagnosticEmitter {\n\n /** Array of source files. */\n sources: Source[];\n /** Resolver instance. */\n resolver: Resolver;\n /** Diagnostic offset used where successively obtaining the next diagnostic. */\n diagnosticsOffset: i32 = 0;\n /** Compiler options. */\n options: Options;\n\n /** Elements by internal name. */\n elementsLookup: Map = new Map();\n /** Class and function instances by internal name. */\n instancesLookup: Map = new Map();\n /** Types by internal name. */\n typesLookup: Map = noTypesYet;\n /** Declared type aliases. */\n typeAliases: Map = new Map();\n /** File-level exports by exported name. */\n fileLevelExports: Map = new Map();\n /** Module-level exports by exported name. */\n moduleLevelExports: Map = new Map();\n /** Classes backing basic types like `i32`. */\n basicClasses: Map = new Map();\n\n /** ArrayBuffer instance reference. */\n arrayBufferInstance: Class | null = null;\n /** Array prototype reference. */\n arrayPrototype: ClassPrototype | null = null;\n /** String instance reference. */\n stringInstance: Class | null = null;\n /** Start function reference. */\n startFunction: FunctionPrototype;\n /** Main function reference, if present. */\n mainFunction: FunctionPrototype | null = null;\n /** Abort function reference, if present. */\n abortInstance: Function | null = null;\n /** Memory allocation function. */\n memoryAllocateInstance: Function | null = null;\n\n /** Whether a garbage collector is present or not. */\n hasGC: bool = false;\n /** Garbage collector allocation function. */\n gcAllocateInstance: Function | null = null;\n /** Garbage collector link function called when a managed object is referenced from a parent. */\n gcLinkInstance: Function | null = null;\n /** Garbage collector mark function called to on reachable managed objects. */\n gcMarkInstance: Function | null = null;\n /** Size of a managed object header. */\n gcHeaderSize: u32 = 0;\n /** Offset of the GC hook. */\n gcHookOffset: u32 = 0;\n\n /** Currently processing filespace. */\n currentFilespace: Filespace;\n\n /** Constructs a new program, optionally inheriting parser diagnostics. */\n constructor(diagnostics: DiagnosticMessage[] | null = null) {\n super(diagnostics);\n this.resolver = new Resolver(this);\n this.sources = [];\n }\n\n /** Gets a source by its exact path. */\n getSource(normalizedPath: string): Source | null {\n var sources = this.sources;\n for (let i = 0, k = sources.length; i < k; ++i) {\n let source = sources[i];\n if (source.normalizedPath == normalizedPath) return source;\n }\n return null;\n }\n\n /** Looks up the source for the specified possibly ambiguous path. */\n lookupSourceByPath(normalizedPathWithoutExtension: string): Source | null {\n var tmp: string;\n return (\n this.getSource(normalizedPathWithoutExtension + \".ts\") ||\n this.getSource(normalizedPathWithoutExtension + \"/index.ts\") ||\n this.getSource((tmp = LIBRARY_PREFIX + normalizedPathWithoutExtension) + \".ts\") ||\n this.getSource( tmp + \"/index.ts\")\n );\n }\n\n /** Initializes the program and its elements prior to compilation. */\n initialize(options: Options): void {\n this.options = options;\n\n // add built-in types\n this.typesLookup = new Map([\n [\"i8\", Type.i8],\n [\"i16\", Type.i16],\n [\"i32\", Type.i32],\n [\"i64\", Type.i64],\n [\"isize\", options.isizeType],\n [\"u8\", Type.u8],\n [\"u16\", Type.u16],\n [\"u32\", Type.u32],\n [\"u64\", Type.u64],\n [\"usize\", options.usizeType],\n [\"bool\", Type.bool],\n [\"f32\", Type.f32],\n [\"f64\", Type.f64],\n [\"void\", Type.void],\n [\"number\", Type.f64],\n [\"boolean\", Type.bool]\n ]);\n if (options.hasFeature(Feature.SIMD)) this.typesLookup.set(\"v128\", Type.v128);\n\n // add compiler hints\n this.setConstantInteger(\"ASC_TARGET\", Type.i32,\n i64_new(options.isWasm64 ? 2 : 1));\n this.setConstantInteger(\"ASC_NO_TREESHAKING\", Type.bool,\n i64_new(options.noTreeShaking ? 1 : 0, 0));\n this.setConstantInteger(\"ASC_NO_ASSERT\", Type.bool,\n i64_new(options.noAssert ? 1 : 0, 0));\n this.setConstantInteger(\"ASC_MEMORY_BASE\", Type.i32,\n i64_new(options.memoryBase, 0));\n this.setConstantInteger(\"ASC_OPTIMIZE_LEVEL\", Type.i32,\n i64_new(options.optimizeLevelHint, 0));\n this.setConstantInteger(\"ASC_SHRINK_LEVEL\", Type.i32,\n i64_new(options.shrinkLevelHint, 0));\n this.setConstantInteger(\"ASC_FEATURE_MUTABLE_GLOBAL\", Type.bool,\n i64_new(options.hasFeature(Feature.MUTABLE_GLOBAL) ? 1 : 0, 0));\n this.setConstantInteger(\"ASC_FEATURE_SIGN_EXTENSION\", Type.bool,\n i64_new(options.hasFeature(Feature.SIGN_EXTENSION) ? 1 : 0, 0));\n this.setConstantInteger(\"ASC_FEATURE_BULK_MEMORY\", Type.bool,\n i64_new(options.hasFeature(Feature.BULK_MEMORY) ? 1 : 0, 0));\n this.setConstantInteger(\"ASC_FEATURE_SIMD\", Type.bool,\n i64_new(options.hasFeature(Feature.SIMD) ? 1 : 0, 0));\n\n // remember deferred elements\n var queuedImports = new Array();\n var queuedExports = new Map();\n var queuedExtends = new Array();\n var queuedImplements = new Array();\n\n // build initial lookup maps of internal names to declarations\n for (let i = 0, k = this.sources.length; i < k; ++i) {\n let source = this.sources[i];\n\n // create one filespace per source\n let filespace = new Filespace(this, source);\n this.elementsLookup.set(filespace.internalName, filespace);\n this.currentFilespace = filespace;\n\n // process this source's statements\n let statements = source.statements;\n for (let j = 0, l = statements.length; j < l; ++j) {\n let statement = statements[j];\n switch (statement.kind) {\n case NodeKind.CLASSDECLARATION: {\n this.initializeClass(statement, queuedExtends, queuedImplements);\n break;\n }\n case NodeKind.ENUMDECLARATION: {\n this.initializeEnum(statement);\n break;\n }\n case NodeKind.EXPORT: {\n this.initializeExports(statement, queuedExports);\n break;\n }\n case NodeKind.FUNCTIONDECLARATION: {\n this.initializeFunction(statement);\n break;\n }\n case NodeKind.IMPORT: {\n this.initializeImports(statement, queuedExports, queuedImports);\n break;\n }\n case NodeKind.INTERFACEDECLARATION: {\n this.initializeInterface(statement);\n break;\n }\n case NodeKind.NAMESPACEDECLARATION: {\n this.initializeNamespace(statement, queuedExtends, queuedImplements);\n break;\n }\n case NodeKind.TYPEDECLARATION: {\n this.initializeTypeAlias(statement);\n break;\n }\n case NodeKind.VARIABLE: {\n this.initializeVariables(statement);\n break;\n }\n }\n }\n }\n\n // queued imports should be resolvable now through traversing exports and queued exports\n for (let i = 0; i < queuedImports.length;) {\n let queuedImport = queuedImports[i];\n let declaration = queuedImport.declaration;\n if (declaration) { // named\n let element = this.tryLocateImport(queuedImport.externalName, queuedExports);\n if (element) {\n this.elementsLookup.set(queuedImport.localName, element);\n queuedImports.splice(i, 1);\n } else {\n if (element = this.tryLocateImport(queuedImport.externalNameAlt, queuedExports)) {\n this.elementsLookup.set(queuedImport.localName, element);\n queuedImports.splice(i, 1);\n } else {\n this.error(\n DiagnosticCode.Module_0_has_no_exported_member_1,\n declaration.range,\n (declaration.parent).path.value,\n declaration.externalName.text\n );\n ++i;\n }\n }\n } else { // filespace\n let element = this.elementsLookup.get(queuedImport.externalName);\n if (element) {\n this.elementsLookup.set(queuedImport.localName, element);\n queuedImports.splice(i, 1);\n } else {\n if (element = this.elementsLookup.get(queuedImport.externalNameAlt)) {\n this.elementsLookup.set(queuedImport.localName, element);\n queuedImports.splice(i, 1);\n } else {\n assert(false); // already reported by the parser not finding the file\n ++i;\n }\n }\n }\n }\n\n // queued exports should be resolvable now that imports are finalized\n for (let [exportName, queuedExport] of queuedExports) {\n let currentExport: QueuedExport | null = queuedExport; // nullable below\n let element: Element | null;\n do {\n if (currentExport.isReExport) {\n if (element = this.fileLevelExports.get(currentExport.externalName)) {\n this.setExportAndCheckLibrary(\n exportName,\n element,\n queuedExport.member.externalName\n );\n break;\n }\n currentExport = queuedExports.get(currentExport.externalName);\n if (!currentExport) {\n this.error(\n DiagnosticCode.Module_0_has_no_exported_member_1,\n queuedExport.member.externalName.range,\n ((queuedExport.member.parent).path).value,\n queuedExport.member.externalName.text\n );\n }\n } else {\n if (\n // normal export\n (element = this.elementsLookup.get(currentExport.externalName)) ||\n // library re-export\n (element = this.elementsLookup.get(currentExport.member.name.text))\n ) {\n this.setExportAndCheckLibrary(\n exportName,\n element,\n queuedExport.member.externalName\n );\n } else {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n queuedExport.member.range, queuedExport.member.name.text\n );\n }\n break;\n }\n } while (currentExport);\n }\n\n // resolve base prototypes of derived classes\n var resolver = this.resolver;\n for (let i = 0, k = queuedExtends.length; i < k; ++i) {\n let derivedPrototype = queuedExtends[i];\n let derivedDeclaration = derivedPrototype.declaration;\n let derivedType = assert(derivedDeclaration.extendsType);\n let baseElement = resolver.resolveIdentifier(derivedType.name, null, null); // reports\n if (!baseElement) continue;\n if (baseElement.kind == ElementKind.CLASS_PROTOTYPE) {\n let basePrototype = baseElement;\n derivedPrototype.basePrototype = basePrototype;\n } else {\n this.error(\n DiagnosticCode.A_class_may_only_extend_another_class,\n derivedType.range\n );\n }\n }\n\n // set up global aliases\n {\n let globalAliases = options.globalAliases;\n if (globalAliases) {\n for (let [alias, name] of globalAliases) {\n if (!name.length) continue; // explicitly disabled\n let element = this.elementsLookup.get(name);\n if (element) this.elementsLookup.set(alias, element);\n else throw new Error(\"element not found: \" + name);\n }\n }\n }\n\n // register 'ArrayBuffer'\n if (this.elementsLookup.has(\"ArrayBuffer\")) {\n let element = assert(this.elementsLookup.get(\"ArrayBuffer\"));\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n this.arrayBufferInstance = resolver.resolveClass(element, null);\n }\n\n // register 'Array'\n if (this.elementsLookup.has(\"Array\")) {\n let element = assert(this.elementsLookup.get(\"Array\"));\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n this.arrayPrototype = element;\n }\n\n // register 'String'\n if (this.elementsLookup.has(\"String\")) {\n let element = assert(this.elementsLookup.get(\"String\"));\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n let instance = resolver.resolveClass(element, null);\n if (instance) {\n if (this.typesLookup.has(\"string\")) {\n let declaration = (element).declaration;\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, declaration.programLevelInternalName\n );\n } else {\n this.stringInstance = instance;\n this.typesLookup.set(\"string\", instance.type);\n }\n }\n }\n\n // register classes backing basic types\n this.registerBasicClass(TypeKind.I8, \"I8\");\n this.registerBasicClass(TypeKind.I16, \"I16\");\n this.registerBasicClass(TypeKind.I32, \"I32\");\n this.registerBasicClass(TypeKind.I64, \"I64\");\n this.registerBasicClass(TypeKind.ISIZE, \"Isize\");\n this.registerBasicClass(TypeKind.U8, \"U8\");\n this.registerBasicClass(TypeKind.U16, \"U16\");\n this.registerBasicClass(TypeKind.U32, \"U32\");\n this.registerBasicClass(TypeKind.U64, \"U64\");\n this.registerBasicClass(TypeKind.USIZE, \"Usize\");\n this.registerBasicClass(TypeKind.BOOL, \"Bool\");\n this.registerBasicClass(TypeKind.F32, \"F32\");\n this.registerBasicClass(TypeKind.F64, \"F64\");\n if (options.hasFeature(Feature.SIMD)) this.registerBasicClass(TypeKind.V128, \"V128\");\n\n // register 'start'\n {\n let element = assert(this.elementsLookup.get(\"start\"));\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.startFunction = element;\n }\n\n // register 'main' if present\n if (this.moduleLevelExports.has(\"main\")) {\n let element = (this.moduleLevelExports.get(\"main\")).element;\n if (\n element.kind == ElementKind.FUNCTION_PROTOTYPE &&\n !(element).isAny(CommonFlags.GENERIC | CommonFlags.AMBIENT)\n ) {\n (element).set(CommonFlags.MAIN);\n this.mainFunction = element;\n }\n }\n\n // register 'abort' if present\n if (this.elementsLookup.has(\"abort\")) {\n let element = this.elementsLookup.get(\"abort\");\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let instance = this.resolver.resolveFunction(element, null);\n if (instance) this.abortInstance = instance;\n }\n\n // register 'memory.allocate' if present\n if (this.elementsLookup.has(\"memory\")) {\n let element = this.elementsLookup.get(\"memory\");\n let members = element.members;\n if (members) {\n if (members.has(\"allocate\")) {\n element = assert(members.get(\"allocate\"));\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let instance = this.resolver.resolveFunction(element, null);\n if (instance) this.memoryAllocateInstance = instance;\n }\n }\n }\n\n // register GC hooks if present\n if (\n this.elementsLookup.has(\"__gc_allocate\") &&\n this.elementsLookup.has(\"__gc_link\") &&\n this.elementsLookup.has(\"__gc_mark\")\n ) {\n // __gc_allocate(usize, (ref: usize) => void): usize\n let element = this.elementsLookup.get(\"__gc_allocate\");\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let gcAllocateInstance = assert(this.resolver.resolveFunction(element, null));\n let signature = gcAllocateInstance.signature;\n assert(signature.parameterTypes.length == 2);\n assert(signature.parameterTypes[0] == this.options.usizeType);\n assert(signature.parameterTypes[1].signatureReference);\n assert(signature.returnType == this.options.usizeType);\n\n // __gc_link(usize, usize): void\n element = this.elementsLookup.get(\"__gc_link\");\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let gcLinkInstance = assert(this.resolver.resolveFunction(element, null));\n signature = gcLinkInstance.signature;\n assert(signature.parameterTypes.length == 2);\n assert(signature.parameterTypes[0] == this.options.usizeType);\n assert(signature.parameterTypes[1] == this.options.usizeType);\n assert(signature.returnType == Type.void);\n\n // __gc_mark(usize): void\n element = this.elementsLookup.get(\"__gc_mark\");\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let gcMarkInstance = assert(this.resolver.resolveFunction(element, null));\n signature = gcMarkInstance.signature;\n assert(signature.parameterTypes.length == 1);\n assert(signature.parameterTypes[0] == this.options.usizeType);\n assert(signature.returnType == Type.void);\n\n this.gcAllocateInstance = gcAllocateInstance;\n this.gcLinkInstance = gcLinkInstance;\n this.gcMarkInstance = gcMarkInstance;\n let gcHookOffset = 2 * options.usizeType.byteSize; // .next + .prev\n this.gcHookOffset = gcHookOffset;\n this.gcHeaderSize = (gcHookOffset + 4 + 7) & ~7; // + .hook index + alignment\n this.hasGC = true;\n }\n }\n\n private registerBasicClass(typeKind: TypeKind, className: string): void {\n if (this.elementsLookup.has(className)) {\n let element = assert(this.elementsLookup.get(className));\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n let classElement = this.resolver.resolveClass(element, null);\n if (classElement) this.basicClasses.set(typeKind, classElement);\n }\n }\n\n /** Sets a constant integer value. */\n setConstantInteger(globalName: string, type: Type, value: I64): void {\n assert(type.is(TypeFlags.INTEGER));\n var global = new Global(this, globalName, globalName, type, null, DecoratorFlags.NONE)\n .withConstantIntegerValue(value);\n global.set(CommonFlags.RESOLVED);\n this.elementsLookup.set(globalName, global);\n }\n\n /** Sets a constant float value. */\n setConstantFloat(globalName: string, type: Type, value: f64): void {\n assert(type.is(TypeFlags.FLOAT));\n var global = new Global(this, globalName, globalName, type, null, DecoratorFlags.NONE)\n .withConstantFloatValue(value);\n global.set(CommonFlags.RESOLVED);\n this.elementsLookup.set(globalName, global);\n }\n\n /** Tries to locate an import by traversing exports and queued exports. */\n private tryLocateImport(\n externalName: string,\n queuedNamedExports: Map\n ): Element | null {\n var element: Element | null;\n var fileLevelExports = this.fileLevelExports;\n do {\n if (element = fileLevelExports.get(externalName)) return element;\n let queuedExport = queuedNamedExports.get(externalName);\n if (!queuedExport) break;\n if (queuedExport.isReExport) {\n externalName = queuedExport.externalName;\n continue;\n }\n return this.elementsLookup.get(queuedExport.externalName);\n } while (true);\n return null;\n }\n\n /** Checks that only supported decorators are present. */\n private checkDecorators(\n decorators: DecoratorNode[],\n acceptedFlags: DecoratorFlags\n ): DecoratorFlags {\n var presentFlags = DecoratorFlags.NONE;\n for (let i = 0, k = decorators.length; i < k; ++i) {\n let decorator = decorators[i];\n let kind = decoratorNameToKind(decorator.name);\n let flag = decoratorKindToFlag(kind);\n if (flag) {\n if (flag == DecoratorFlags.BUILTIN) {\n if (decorator.range.source.isLibrary) {\n presentFlags |= flag;\n } else {\n this.error(\n DiagnosticCode.Decorator_0_is_not_valid_here,\n decorator.range, decorator.name.range.toString()\n );\n }\n } else if (!(acceptedFlags & flag)) {\n this.error(\n DiagnosticCode.Decorator_0_is_not_valid_here,\n decorator.range, decorator.name.range.toString()\n );\n } else if (presentFlags & flag) {\n this.error(\n DiagnosticCode.Duplicate_decorator,\n decorator.range, decorator.name.range.toString()\n );\n } else {\n presentFlags |= flag;\n }\n }\n }\n return presentFlags;\n }\n\n /** Checks and sets up global options of an element. */\n private checkGlobal(\n element: Element,\n declaration: DeclarationStatement\n ): void {\n var parentNode = declaration.parent;\n // alias globally if explicitly annotated @global or exported from a top-level library file\n if (\n (element.hasDecorator(DecoratorFlags.GLOBAL)) ||\n (\n declaration.range.source.isLibrary &&\n element.is(CommonFlags.EXPORT) &&\n (\n assert(parentNode).kind == NodeKind.SOURCE ||\n (\n parentNode).kind == NodeKind.VARIABLE &&\n assert((parentNode).parent).kind == NodeKind.SOURCE\n )\n )\n ) {\n let globalName = declaration.programLevelInternalName;\n if (this.elementsLookup.has(globalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, element.internalName\n );\n } else {\n this.elementsLookup.set(globalName, element);\n }\n }\n // builtins use the global name directly\n if (element.hasDecorator(DecoratorFlags.BUILTIN)) {\n element.internalName = declaration.programLevelInternalName;\n }\n }\n\n /** Initializes a class declaration. */\n private initializeClass(\n declaration: ClassDeclaration,\n queuedExtends: ClassPrototype[],\n queuedImplements: ClassPrototype[],\n namespace: Element | null = null\n ): void {\n var internalName = declaration.fileLevelInternalName;\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n\n var decorators = declaration.decorators;\n var simpleName = declaration.name.text;\n var prototype = new ClassPrototype(\n this,\n simpleName,\n internalName,\n declaration,\n decorators\n ? this.checkDecorators(decorators,\n DecoratorFlags.GLOBAL |\n DecoratorFlags.SEALED |\n DecoratorFlags.UNMANAGED\n )\n : DecoratorFlags.NONE\n );\n prototype.parent = namespace;\n this.elementsLookup.set(internalName, prototype);\n\n var implementsTypes = declaration.implementsTypes;\n if (implementsTypes) {\n let numImplementsTypes = implementsTypes.length;\n if (prototype.hasDecorator(DecoratorFlags.UNMANAGED)) {\n if (numImplementsTypes) {\n this.error(\n DiagnosticCode.Unmanaged_classes_cannot_implement_interfaces,\n Range.join(\n declaration.name.range,\n implementsTypes[numImplementsTypes - 1].range\n )\n );\n }\n\n // remember classes that implement interfaces\n } else if (numImplementsTypes) {\n for (let i = 0; i < numImplementsTypes; ++i) {\n this.warning( // TODO\n DiagnosticCode.Operation_not_supported,\n implementsTypes[i].range\n );\n }\n queuedImplements.push(prototype);\n }\n }\n\n // remember classes that extend another one\n if (declaration.extendsType) queuedExtends.push(prototype);\n\n // add as namespace member if applicable\n if (namespace) {\n if (namespace.members) {\n if (namespace.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n namespace.members = new Map();\n }\n namespace.members.set(simpleName, prototype);\n if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\n prototype.set(CommonFlags.MODULE_EXPORT);\n }\n\n // otherwise add to file-level exports if exported\n } else if (prototype.is(CommonFlags.EXPORT)) {\n if (this.fileLevelExports.has(internalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n declaration.name.range, internalName\n );\n return;\n }\n this.fileLevelExports.set(internalName, prototype);\n this.currentFilespace.members.set(simpleName, prototype);\n if (prototype.is(CommonFlags.EXPORT) && declaration.range.source.isEntry) {\n if (this.moduleLevelExports.has(simpleName)) {\n let existingExport = this.moduleLevelExports.get(simpleName);\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n declaration.name.range, existingExport.element.internalName\n );\n return;\n }\n prototype.set(CommonFlags.MODULE_EXPORT);\n this.moduleLevelExports.set(simpleName, {\n element: prototype,\n identifier: declaration.name\n });\n }\n }\n\n // initialize members\n var memberDeclarations = declaration.members;\n for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\n let memberDeclaration = memberDeclarations[i];\n switch (memberDeclaration.kind) {\n case NodeKind.FIELDDECLARATION: {\n this.initializeField(memberDeclaration, prototype);\n break;\n }\n case NodeKind.METHODDECLARATION: {\n if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\n this.initializeAccessor(memberDeclaration, prototype);\n } else {\n this.initializeMethod(memberDeclaration, prototype);\n }\n break;\n }\n case NodeKind.INDEXSIGNATUREDECLARATION: break; // ignored for now\n default: {\n assert(false); // should have been reported while parsing\n return;\n }\n }\n }\n\n this.checkGlobal(prototype, declaration);\n }\n\n /** Initializes a field of a class or interface. */\n private initializeField(\n declaration: FieldDeclaration,\n classPrototype: ClassPrototype\n ): void {\n var name = declaration.name.text;\n var internalName = declaration.fileLevelInternalName;\n var decorators = declaration.decorators;\n var isInterface = classPrototype.kind == ElementKind.INTERFACE_PROTOTYPE;\n\n // static fields become global variables\n if (declaration.is(CommonFlags.STATIC)) {\n if (isInterface) {\n // should have been reported while parsing\n assert(false);\n }\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n if (classPrototype.members) {\n if (classPrototype.members.has(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n classPrototype.members = new Map();\n }\n let staticField = new Global(\n this,\n name,\n internalName,\n Type.void, // resolved later on\n declaration,\n decorators\n ? this.checkDecorators(decorators, DecoratorFlags.INLINE)\n : DecoratorFlags.NONE\n );\n staticField.parent = classPrototype;\n classPrototype.members.set(name, staticField);\n this.elementsLookup.set(internalName, staticField);\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\n staticField.set(CommonFlags.MODULE_EXPORT);\n }\n\n if (staticField.hasDecorator(DecoratorFlags.INLINE) && !staticField.is(CommonFlags.READONLY)) {\n this.error(\n DiagnosticCode.Decorator_0_is_not_valid_here,\n assert(findDecorator(DecoratorKind.INLINE, decorators)).range, \"inline\"\n );\n }\n\n // instance fields are remembered until resolved\n } else {\n if (isInterface) {\n // should have been reported while parsing\n assert(!declaration.isAny(CommonFlags.ABSTRACT | CommonFlags.GET | CommonFlags.SET));\n }\n if (classPrototype.instanceMembers) {\n if (classPrototype.instanceMembers.has(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n classPrototype.instanceMembers = new Map();\n }\n let instanceField = new FieldPrototype(\n classPrototype,\n name,\n internalName,\n declaration\n );\n if (decorators) this.checkDecorators(decorators, DecoratorFlags.NONE);\n classPrototype.instanceMembers.set(name, instanceField);\n }\n }\n\n /** Initializes a method of a class or interface. */\n private initializeMethod(\n declaration: MethodDeclaration,\n classPrototype: ClassPrototype\n ): void {\n var simpleName = declaration.name.text;\n var internalName = declaration.fileLevelInternalName;\n var prototype: FunctionPrototype | null = null;\n\n var decorators = declaration.decorators;\n var decoratorFlags = DecoratorFlags.NONE;\n if (decorators) {\n decoratorFlags = this.checkDecorators(decorators,\n DecoratorFlags.OPERATOR_BINARY |\n DecoratorFlags.OPERATOR_PREFIX |\n DecoratorFlags.OPERATOR_POSTFIX |\n DecoratorFlags.INLINE\n );\n }\n\n // static methods become global functions\n if (declaration.is(CommonFlags.STATIC)) {\n assert(declaration.name.kind != NodeKind.CONSTRUCTOR);\n\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0, declaration.name.range,\n internalName\n );\n return;\n }\n if (classPrototype.members) {\n if (classPrototype.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n classPrototype.members = new Map();\n }\n prototype = new FunctionPrototype(\n this,\n simpleName,\n internalName,\n declaration,\n classPrototype,\n decoratorFlags\n );\n classPrototype.members.set(simpleName, prototype);\n this.elementsLookup.set(internalName, prototype);\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\n prototype.set(CommonFlags.MODULE_EXPORT);\n }\n\n // instance methods are remembered until resolved\n } else {\n if (classPrototype.instanceMembers) {\n if (classPrototype.instanceMembers.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n classPrototype.instanceMembers = new Map();\n }\n prototype = new FunctionPrototype(\n this,\n simpleName,\n internalName,\n declaration,\n classPrototype,\n decoratorFlags\n );\n // if (classPrototype.isUnmanaged && instancePrototype.isAbstract) {\n // this.error( Unmanaged classes cannot declare abstract methods. );\n // }\n if (declaration.name.kind == NodeKind.CONSTRUCTOR) {\n if (classPrototype.constructorPrototype) {\n this.error(\n DiagnosticCode.Multiple_constructor_implementations_are_not_allowed,\n declaration.name.range\n );\n } else {\n prototype.set(CommonFlags.CONSTRUCTOR);\n classPrototype.constructorPrototype = prototype;\n }\n } else {\n classPrototype.instanceMembers.set(simpleName, prototype);\n }\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\n prototype.set(CommonFlags.MODULE_EXPORT);\n }\n }\n\n this.checkOperatorOverloads(declaration.decorators, prototype, classPrototype);\n }\n\n private checkOperatorOverloads(\n decorators: DecoratorNode[] | null,\n prototype: FunctionPrototype,\n classPrototype: ClassPrototype\n ): void {\n if (decorators) {\n for (let i = 0, k = decorators.length; i < k; ++i) {\n let decorator = decorators[i];\n switch (decorator.decoratorKind) {\n case DecoratorKind.OPERATOR:\n case DecoratorKind.OPERATOR_BINARY:\n case DecoratorKind.OPERATOR_PREFIX:\n case DecoratorKind.OPERATOR_POSTFIX: {\n let numArgs = decorator.arguments && decorator.arguments.length || 0;\n if (numArgs == 1) {\n let firstArg = (decorator.arguments)[0];\n if (\n firstArg.kind == NodeKind.LITERAL &&\n (firstArg).literalKind == LiteralKind.STRING\n ) {\n let kind = operatorKindFromDecorator(\n decorator.decoratorKind,\n (firstArg).value\n );\n if (kind == OperatorKind.INVALID) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n firstArg.range\n );\n } else {\n let overloads = classPrototype.overloadPrototypes;\n if (overloads.has(kind)) {\n this.error(\n DiagnosticCode.Duplicate_function_implementation,\n firstArg.range\n );\n } else {\n prototype.operatorKind = kind;\n overloads.set(kind, prototype);\n }\n }\n } else {\n this.error(\n DiagnosticCode.String_literal_expected,\n firstArg.range\n );\n }\n } else {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n decorator.range, \"1\", numArgs.toString(10)\n );\n }\n }\n }\n }\n }\n }\n\n private initializeAccessor(\n declaration: MethodDeclaration,\n classPrototype: ClassPrototype\n ): void {\n var simpleName = declaration.name.text;\n var internalPropertyName = declaration.fileLevelInternalName;\n var propertyElement = this.elementsLookup.get(internalPropertyName);\n var isGetter = declaration.is(CommonFlags.GET);\n var isNew = false;\n if (propertyElement) {\n if (\n propertyElement.kind != ElementKind.PROPERTY ||\n (isGetter\n ? (propertyElement).getterPrototype\n : (propertyElement).setterPrototype\n ) != null\n ) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalPropertyName\n );\n return;\n }\n } else {\n propertyElement = new Property(\n this,\n simpleName,\n internalPropertyName,\n classPrototype\n );\n isNew = true;\n }\n\n var decorators = declaration.decorators;\n var decoratorFlags = DecoratorFlags.NONE;\n if (decorators) {\n decoratorFlags = this.checkDecorators(decorators,\n DecoratorFlags.INLINE\n );\n }\n\n var baseName = (isGetter ? GETTER_PREFIX : SETTER_PREFIX) + simpleName;\n\n // static accessors become global functions\n if (declaration.is(CommonFlags.STATIC)) {\n let staticName = classPrototype.internalName + STATIC_DELIMITER + baseName;\n if (this.elementsLookup.has(staticName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, staticName\n );\n return;\n }\n let staticPrototype = new FunctionPrototype(\n this,\n baseName,\n staticName,\n declaration,\n null,\n decoratorFlags\n );\n if (isGetter) {\n (propertyElement).getterPrototype = staticPrototype;\n } else {\n (propertyElement).setterPrototype = staticPrototype;\n }\n if (isNew) {\n if (classPrototype.members) {\n if (classPrototype.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, staticName\n );\n return;\n }\n } else {\n classPrototype.members = new Map();\n }\n classPrototype.members.set(simpleName, propertyElement); // check above\n } else {\n assert(classPrototype.members && classPrototype.members.has(simpleName));\n }\n this.elementsLookup.set(internalPropertyName, propertyElement);\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\n propertyElement.set(CommonFlags.MODULE_EXPORT);\n }\n\n // instance accessors are remembered until resolved\n } else {\n let instanceName = classPrototype.internalName + INSTANCE_DELIMITER + baseName;\n if (classPrototype.instanceMembers) {\n if (classPrototype.instanceMembers.has(baseName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalPropertyName\n );\n return;\n }\n } else {\n classPrototype.instanceMembers = new Map();\n }\n let instancePrototype = new FunctionPrototype(\n this,\n baseName,\n instanceName,\n declaration,\n classPrototype,\n decoratorFlags\n );\n if (isGetter) {\n (propertyElement).getterPrototype = instancePrototype;\n } else {\n (propertyElement).setterPrototype = instancePrototype;\n }\n classPrototype.instanceMembers.set(baseName, propertyElement);\n this.elementsLookup.set(internalPropertyName, propertyElement);\n if (classPrototype.is(CommonFlags.MODULE_EXPORT)) {\n propertyElement.set(CommonFlags.MODULE_EXPORT);\n instancePrototype.set(CommonFlags.MODULE_EXPORT);\n }\n }\n }\n\n private initializeEnum(\n declaration: EnumDeclaration,\n namespace: Element | null = null\n ): void {\n var internalName = declaration.fileLevelInternalName;\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n var simpleName = declaration.name.text;\n var element = new Enum(this, simpleName, internalName, declaration);\n element.parent = namespace;\n this.elementsLookup.set(internalName, element);\n\n if (namespace) {\n if (namespace.members) {\n if (namespace.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n namespace.members = new Map();\n }\n namespace.members.set(simpleName, element);\n if (namespace.is(CommonFlags.MODULE_EXPORT) && element.is(CommonFlags.EXPORT)) {\n element.set(CommonFlags.MODULE_EXPORT);\n }\n } else if (element.is(CommonFlags.EXPORT)) { // no namespace\n if (this.fileLevelExports.has(internalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n declaration.name.range, internalName\n );\n return;\n }\n this.fileLevelExports.set(internalName, element);\n this.currentFilespace.members.set(simpleName, element);\n if (declaration.range.source.isEntry) {\n if (this.moduleLevelExports.has(simpleName)) {\n let existingExport = this.moduleLevelExports.get(simpleName);\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n declaration.name.range, existingExport.element.internalName\n );\n return;\n }\n element.set(CommonFlags.MODULE_EXPORT);\n this.moduleLevelExports.set(simpleName, {\n element,\n identifier: declaration.name\n });\n }\n }\n\n var values = declaration.values;\n for (let i = 0, k = values.length; i < k; ++i) {\n this.initializeEnumValue(values[i], element);\n }\n\n this.checkGlobal(element, declaration);\n }\n\n private initializeEnumValue(\n declaration: EnumValueDeclaration,\n enm: Enum\n ): void {\n var name = declaration.name.text;\n var internalName = declaration.fileLevelInternalName;\n if (enm.members) {\n if (enm.members.has(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n enm.members = new Map();\n }\n var value = new EnumValue(enm, this, name, internalName, declaration);\n enm.members.set(name, value);\n if (enm.is(CommonFlags.MODULE_EXPORT)) {\n value.set(CommonFlags.MODULE_EXPORT);\n }\n }\n\n private initializeExports(\n statement: ExportStatement,\n queuedExports: Map\n ): void {\n var members = statement.members;\n if (members) { // named\n for (let i = 0, k = members.length; i < k; ++i) {\n this.initializeExport(members[i], statement.internalPath, queuedExports);\n }\n } else { // TODO: filespace\n this.error(\n DiagnosticCode.Operation_not_supported,\n statement.range\n );\n }\n }\n\n private setExportAndCheckLibrary(\n internalName: string,\n element: Element,\n externalIdentifier: IdentifierExpression\n ): void {\n // add to file-level exports\n this.fileLevelExports.set(internalName, element);\n\n // add to filespace\n var internalPath = externalIdentifier.range.source.internalPath;\n var prefix = FILESPACE_PREFIX + internalPath;\n var filespace = this.elementsLookup.get(prefix);\n if (!filespace) filespace = assert(this.elementsLookup.get(prefix + PATH_DELIMITER + \"index\"));\n assert(filespace.kind == ElementKind.FILESPACE);\n var simpleName = externalIdentifier.text;\n (filespace).members.set(simpleName, element);\n\n // add global alias if a top-level export of a library file\n var source = externalIdentifier.range.source;\n if (source.isLibrary) {\n if (this.elementsLookup.has(simpleName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n externalIdentifier.range, simpleName\n );\n } else {\n element.internalName = simpleName;\n this.elementsLookup.set(simpleName, element);\n }\n\n // add module level export if a top-level export of an entry file\n } else if (source.isEntry) {\n this.moduleLevelExports.set(externalIdentifier.text, {\n element,\n identifier: externalIdentifier\n });\n }\n }\n\n private initializeExport(\n member: ExportMember,\n internalPath: string | null,\n queuedExports: Map\n ): void {\n var externalName = member.range.source.internalPath + PATH_DELIMITER + member.externalName.text;\n if (this.fileLevelExports.has(externalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n member.externalName.range, externalName\n );\n return;\n }\n var referencedName: string;\n var referencedElement: Element | null;\n var queuedExport: QueuedExport | null;\n\n // export local element\n if (internalPath == null) {\n referencedName = member.range.source.internalPath + PATH_DELIMITER + member.name.text;\n\n // resolve right away if the element exists\n if (this.elementsLookup.has(referencedName)) {\n this.setExportAndCheckLibrary(\n externalName,\n this.elementsLookup.get(referencedName),\n member.externalName\n );\n return;\n }\n\n // otherwise queue it\n if (queuedExports.has(externalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n member.externalName.range, externalName\n );\n return;\n }\n queuedExport = new QueuedExport();\n queuedExport.isReExport = false;\n queuedExport.externalName = referencedName; // -> here: local name\n queuedExport.member = member;\n queuedExports.set(externalName, queuedExport);\n\n // export external element\n } else {\n referencedName = internalPath + PATH_DELIMITER + member.name.text;\n\n // resolve right away if the export exists\n referencedElement = this.elementsLookup.get(referencedName);\n if (referencedElement) {\n this.setExportAndCheckLibrary(\n externalName,\n referencedElement,\n member.externalName\n );\n return;\n }\n\n // walk already known queued exports\n let seen = new Set();\n while (queuedExport = queuedExports.get(referencedName)) {\n if (queuedExport.isReExport) {\n referencedElement = this.fileLevelExports.get(queuedExport.externalName);\n if (referencedElement) {\n this.setExportAndCheckLibrary(\n externalName,\n referencedElement,\n member.externalName\n );\n return;\n }\n referencedName = queuedExport.externalName;\n if (seen.has(queuedExport)) break;\n seen.add(queuedExport);\n } else {\n referencedElement = this.elementsLookup.get(queuedExport.externalName);\n if (referencedElement) {\n this.setExportAndCheckLibrary(\n externalName,\n referencedElement,\n member.externalName\n );\n return;\n }\n break;\n }\n }\n\n // otherwise queue it\n if (queuedExports.has(externalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n member.externalName.range, externalName\n );\n return;\n }\n queuedExport = new QueuedExport();\n queuedExport.isReExport = true;\n queuedExport.externalName = referencedName; // -> here: external name\n queuedExport.member = member;\n queuedExports.set(externalName, queuedExport);\n }\n }\n\n private initializeFunction(\n declaration: FunctionDeclaration,\n namespace: Element | null = null\n ): void {\n var internalName = declaration.fileLevelInternalName;\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n var simpleName = declaration.name.text;\n var decorators = declaration.decorators;\n var prototype = new FunctionPrototype(\n this,\n simpleName,\n internalName,\n declaration,\n null,\n decorators\n ? this.checkDecorators(decorators,\n DecoratorFlags.GLOBAL |\n DecoratorFlags.INLINE |\n DecoratorFlags.EXTERNAL\n )\n : DecoratorFlags.NONE\n );\n prototype.parent = namespace;\n this.elementsLookup.set(internalName, prototype);\n\n if (namespace) {\n if (namespace.members) {\n if (namespace.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n namespace.members = new Map();\n }\n namespace.members.set(simpleName, prototype);\n if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\n prototype.parent = namespace;\n prototype.set(CommonFlags.MODULE_EXPORT);\n }\n } else if (prototype.is(CommonFlags.EXPORT)) { // no namespace\n if (this.fileLevelExports.has(internalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n declaration.name.range, internalName\n );\n return;\n }\n this.fileLevelExports.set(internalName, prototype);\n this.currentFilespace.members.set(simpleName, prototype);\n if (declaration.range.source.isEntry) {\n if (this.moduleLevelExports.has(simpleName)) {\n let existingExport = this.moduleLevelExports.get(simpleName);\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, existingExport.element.internalName\n );\n return;\n }\n prototype.set(CommonFlags.MODULE_EXPORT);\n this.moduleLevelExports.set(simpleName, {\n element: prototype,\n identifier: declaration.name\n });\n }\n }\n\n this.checkGlobal(prototype, declaration);\n }\n\n private initializeImports(\n statement: ImportStatement,\n queuedExports: Map,\n queuedImports: QueuedImport[]\n ): void {\n var declarations = statement.declarations;\n if (declarations) {\n for (let i = 0, k = declarations.length; i < k; ++i) {\n this.initializeImport(\n declarations[i],\n statement.internalPath,\n queuedExports, queuedImports\n );\n }\n } else if (statement.namespaceName) { // import * as simpleName from \"file\"\n let simpleName = statement.namespaceName.text;\n let internalName = (\n statement.range.source.internalPath +\n PATH_DELIMITER +\n simpleName\n );\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n statement.namespaceName.range,\n internalName\n );\n return;\n }\n\n // resolve right away if the exact filespace exists\n let filespace = this.elementsLookup.get(statement.internalPath);\n if (filespace) {\n this.elementsLookup.set(internalName, filespace);\n return;\n }\n\n // otherwise queue it\n let queuedImport = new QueuedImport();\n queuedImport.localName = internalName;\n let externalName = FILESPACE_PREFIX + statement.internalPath;\n queuedImport.externalName = externalName;\n queuedImport.externalNameAlt = externalName + PATH_DELIMITER + \"index\";\n queuedImport.declaration = null; // filespace\n queuedImports.push(queuedImport);\n }\n }\n\n private initializeImport(\n declaration: ImportDeclaration,\n internalPath: string,\n queuedNamedExports: Map,\n queuedImports: QueuedImport[]\n ): void {\n var localName = declaration.fileLevelInternalName;\n if (this.elementsLookup.has(localName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, localName\n );\n return;\n }\n\n var externalName = internalPath + PATH_DELIMITER + declaration.externalName.text;\n\n // resolve right away if the exact export exists\n var element: Element | null;\n if (element = this.fileLevelExports.get(externalName)) {\n this.elementsLookup.set(localName, element);\n return;\n }\n\n // otherwise queue it\n const indexPart = PATH_DELIMITER + \"index\";\n var queuedImport = new QueuedImport();\n queuedImport.localName = localName;\n if (internalPath.endsWith(indexPart)) {\n queuedImport.externalName = externalName; // try exact first\n queuedImport.externalNameAlt = (\n internalPath.substring(0, internalPath.length - indexPart.length + 1) +\n declaration.externalName.text\n );\n } else {\n queuedImport.externalName = externalName; // try exact first\n queuedImport.externalNameAlt = (\n internalPath +\n indexPart +\n PATH_DELIMITER +\n declaration.externalName.text\n );\n }\n queuedImport.declaration = declaration; // named\n queuedImports.push(queuedImport);\n }\n\n private initializeInterface(declaration: InterfaceDeclaration, namespace: Element | null = null): void {\n var internalName = declaration.fileLevelInternalName;\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n\n var decorators = declaration.decorators;\n var simpleName = declaration.name.text;\n var prototype = new InterfacePrototype(\n this,\n simpleName,\n internalName,\n declaration,\n decorators\n ? this.checkDecorators(decorators, DecoratorFlags.GLOBAL)\n : DecoratorFlags.NONE\n );\n prototype.parent = namespace;\n this.elementsLookup.set(internalName, prototype);\n\n if (namespace) {\n if (namespace.members) {\n if (namespace.members.has(prototype.internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n namespace.members = new Map();\n }\n namespace.members.set(prototype.internalName, prototype);\n if (namespace.is(CommonFlags.MODULE_EXPORT) && prototype.is(CommonFlags.EXPORT)) {\n prototype.set(CommonFlags.MODULE_EXPORT);\n }\n } else if (prototype.is(CommonFlags.EXPORT)) { // no namespace\n if (this.fileLevelExports.has(internalName)) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n declaration.name.range, internalName\n );\n return;\n }\n this.fileLevelExports.set(internalName, prototype);\n this.currentFilespace.members.set(simpleName, prototype);\n if (declaration.range.source.isEntry) {\n if (this.moduleLevelExports.has(simpleName)) {\n let existingExport = this.moduleLevelExports.get(simpleName);\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, existingExport.element.internalName\n );\n return;\n }\n prototype.set(CommonFlags.MODULE_EXPORT);\n this.moduleLevelExports.set(simpleName, {\n element: prototype,\n identifier: declaration.name\n });\n }\n }\n\n var memberDeclarations = declaration.members;\n for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\n let memberDeclaration = memberDeclarations[i];\n switch (memberDeclaration.kind) {\n\n case NodeKind.FIELDDECLARATION: {\n this.initializeField(memberDeclaration, prototype);\n break;\n }\n case NodeKind.METHODDECLARATION: {\n if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\n this.initializeAccessor(memberDeclaration, prototype);\n } else {\n this.initializeMethod(memberDeclaration, prototype);\n }\n break;\n }\n default: {\n throw new Error(\"interface member expected\");\n }\n }\n }\n\n this.checkGlobal(prototype, declaration);\n }\n\n private initializeNamespace(\n declaration: NamespaceDeclaration,\n queuedExtends: ClassPrototype[],\n queuedImplements: ClassPrototype[],\n parentNamespace: Element | null = null\n ): void {\n var internalName = declaration.fileLevelInternalName;\n var simpleName = declaration.name.text;\n var namespace = this.elementsLookup.get(internalName);\n if (!namespace) {\n namespace = new Namespace(this, simpleName, internalName, declaration);\n namespace.parent = parentNamespace;\n this.elementsLookup.set(internalName, namespace);\n this.checkGlobal(namespace, declaration);\n }\n\n if (parentNamespace) {\n if (parentNamespace.members) {\n if (parentNamespace.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n return;\n }\n } else {\n parentNamespace.members = new Map();\n }\n parentNamespace.members.set(simpleName, namespace);\n if (parentNamespace.is(CommonFlags.MODULE_EXPORT) && namespace.is(CommonFlags.EXPORT)) {\n namespace.set(CommonFlags.MODULE_EXPORT);\n }\n } else if (namespace.is(CommonFlags.EXPORT)) { // no parent namespace\n let existingExport = this.fileLevelExports.get(internalName);\n if (existingExport) {\n if (!existingExport.is(CommonFlags.EXPORT)) {\n this.error(\n DiagnosticCode.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local,\n declaration.name.range, namespace.internalName\n ); // recoverable\n }\n namespace = existingExport; // join\n } else {\n this.fileLevelExports.set(internalName, namespace);\n }\n this.currentFilespace.members.set(simpleName, namespace);\n if (declaration.range.source.isEntry) {\n if (this.moduleLevelExports.has(simpleName)) {\n let existingExport = this.moduleLevelExports.get(simpleName);\n if (existingExport.element !== namespace) { // not merged\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, existingExport.element.internalName\n );\n return;\n }\n } else {\n this.moduleLevelExports.set(simpleName, {\n element: namespace,\n identifier: declaration.name\n });\n }\n namespace.set(CommonFlags.MODULE_EXPORT);\n }\n }\n\n var members = declaration.members;\n for (let i = 0, k = members.length; i < k; ++i) {\n switch (members[i].kind) {\n case NodeKind.CLASSDECLARATION: {\n this.initializeClass(members[i], queuedExtends, queuedImplements, namespace);\n break;\n }\n case NodeKind.ENUMDECLARATION: {\n this.initializeEnum(members[i], namespace);\n break;\n }\n case NodeKind.FUNCTIONDECLARATION: {\n this.initializeFunction(members[i], namespace);\n break;\n }\n case NodeKind.INTERFACEDECLARATION: {\n this.initializeInterface(members[i], namespace);\n break;\n }\n case NodeKind.NAMESPACEDECLARATION: {\n this.initializeNamespace(members[i], queuedExtends, queuedImplements, namespace);\n break;\n }\n case NodeKind.TYPEDECLARATION: {\n // this.initializeTypeAlias(members[i], namespace);\n // TODO: what about namespaced types?\n this.error(\n DiagnosticCode.Operation_not_supported,\n members[i].range\n );\n break;\n }\n case NodeKind.VARIABLE: {\n this.initializeVariables(members[i], namespace);\n break;\n }\n default: {\n throw new Error(\"namespace member expected\");\n }\n }\n }\n }\n\n private initializeTypeAlias(declaration: TypeDeclaration, namespace: Element | null = null): void {\n // type aliases are program globals\n // TODO: what about namespaced types?\n var name = declaration.name.text;\n if (this.typesLookup.has(name) || this.typeAliases.has(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, name\n );\n return;\n }\n var alias = new TypeAlias();\n alias.typeParameters = declaration.typeParameters;\n alias.type = declaration.type;\n this.typeAliases.set(name, alias);\n }\n\n private initializeVariables(statement: VariableStatement, namespace: Element | null = null): void {\n var declarations = statement.declarations;\n for (let i = 0, k = declarations.length; i < k; ++i) {\n let declaration = declarations[i];\n let decorators = declaration.decorators;\n let internalName = declaration.fileLevelInternalName;\n if (this.elementsLookup.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n continue;\n }\n let simpleName = declaration.name.text;\n let global = new Global(\n this,\n simpleName,\n internalName,\n Type.void, // resolved later on\n declaration,\n decorators\n ? this.checkDecorators(decorators,\n DecoratorFlags.GLOBAL |\n DecoratorFlags.INLINE |\n DecoratorFlags.EXTERNAL\n )\n : DecoratorFlags.NONE\n );\n global.parent = namespace;\n this.elementsLookup.set(internalName, global);\n\n if (global.hasDecorator(DecoratorFlags.INLINE) && !global.is(CommonFlags.CONST)) {\n this.error(\n DiagnosticCode.Decorator_0_is_not_valid_here,\n assert(findDecorator(DecoratorKind.INLINE, decorators)).range, \"inline\"\n );\n }\n\n if (namespace) {\n if (namespace.members) {\n if (namespace.members.has(simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n continue;\n }\n } else {\n namespace.members = new Map();\n }\n namespace.members.set(simpleName, global);\n if (namespace.is(CommonFlags.MODULE_EXPORT) && global.is(CommonFlags.EXPORT)) {\n global.set(CommonFlags.MODULE_EXPORT);\n }\n } else if (global.is(CommonFlags.EXPORT)) { // no namespace\n if (this.fileLevelExports.has(internalName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, internalName\n );\n } else {\n this.fileLevelExports.set(internalName, global);\n }\n this.currentFilespace.members.set(simpleName, global);\n if (declaration.range.source.isEntry) {\n if (this.moduleLevelExports.has(simpleName)) {\n let existingExport = this.moduleLevelExports.get(simpleName);\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, existingExport.element.internalName\n );\n continue;\n }\n global.set(CommonFlags.MODULE_EXPORT);\n this.moduleLevelExports.set(simpleName, {\n element: global,\n identifier: declaration.name\n });\n }\n }\n this.checkGlobal(global, declaration);\n }\n }\n}\n\n/** Indicates the specific kind of an {@link Element}. */\nexport enum ElementKind {\n /** A {@link Global}. */\n GLOBAL,\n /** A {@link Local}. */\n LOCAL,\n /** An {@link Enum}. */\n ENUM,\n /** An {@link EnumValue}. */\n ENUMVALUE,\n /** A {@link FunctionPrototype}. */\n FUNCTION_PROTOTYPE,\n /** A {@link Function}. */\n FUNCTION,\n /** A {@link FunctionTarget}. */\n FUNCTION_TARGET,\n /** A {@link ClassPrototype}. */\n CLASS_PROTOTYPE,\n /** A {@link Class}. */\n CLASS,\n /** An {@link InterfacePrototype}. */\n INTERFACE_PROTOTYPE,\n /** An {@link Interface}. */\n INTERFACE,\n /** A {@link FieldPrototype}. */\n FIELD_PROTOTYPE,\n /** A {@link Field}. */\n FIELD,\n /** A {@link Property}. */\n PROPERTY,\n /** A {@link Namespace}. */\n NAMESPACE,\n /** A {@link Filespace}. */\n FILESPACE,\n}\n\nexport enum DecoratorFlags {\n /** No flags set. */\n NONE = 0,\n /** Is a program global. */\n GLOBAL = 1 << 0,\n /** Is a binary operator overload. */\n OPERATOR_BINARY = 1 << 1,\n /** Is a unary prefix operator overload. */\n OPERATOR_PREFIX = 1 << 2,\n /** Is a unary postfix operator overload. */\n OPERATOR_POSTFIX = 1 << 3,\n /** Is an unmanaged class. */\n UNMANAGED = 1 << 4,\n /** Is a sealed class. */\n SEALED = 1 << 5,\n /** Is always inlined. */\n INLINE = 1 << 6,\n /** Is using a different external name. */\n EXTERNAL = 1 << 7,\n /** Is a builtin. */\n BUILTIN = 1 << 8\n}\n\nexport function decoratorKindToFlag(kind: DecoratorKind): DecoratorFlags {\n switch (kind) {\n case DecoratorKind.GLOBAL: return DecoratorFlags.GLOBAL;\n case DecoratorKind.OPERATOR:\n case DecoratorKind.OPERATOR_BINARY: return DecoratorFlags.OPERATOR_BINARY;\n case DecoratorKind.OPERATOR_PREFIX: return DecoratorFlags.OPERATOR_PREFIX;\n case DecoratorKind.OPERATOR_POSTFIX: return DecoratorFlags.OPERATOR_POSTFIX;\n case DecoratorKind.UNMANAGED: return DecoratorFlags.UNMANAGED;\n case DecoratorKind.SEALED: return DecoratorFlags.SEALED;\n case DecoratorKind.INLINE: return DecoratorFlags.INLINE;\n case DecoratorKind.EXTERNAL: return DecoratorFlags.EXTERNAL;\n case DecoratorKind.BUILTIN: return DecoratorFlags.BUILTIN;\n default: return DecoratorFlags.NONE;\n }\n}\n\n/** Base class of all program elements. */\nexport abstract class Element {\n\n /** Specific element kind. */\n kind: ElementKind;\n /** Containing {@link Program}. */\n program: Program;\n /** Simple name. */\n simpleName: string;\n /** Internal name referring to this element. */\n internalName: string;\n /** Common flags indicating specific traits. */\n flags: CommonFlags = CommonFlags.NONE;\n /** Decorator flags indicating annotated traits. */\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE;\n /** Namespaced member elements. */\n members: Map | null = null;\n /** Parent element, if applicable. */\n parent: Element | null = null;\n\n /** Constructs a new element, linking it to its containing {@link Program}. */\n protected constructor(program: Program, simpleName: string, internalName: string) {\n this.program = program;\n this.simpleName = simpleName;\n this.internalName = internalName;\n }\n\n /** Tests if this element has a specific flag or flags. */\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\n /** Tests if this element has any of the specified flags. */\n isAny(flags: CommonFlags): bool { return (this.flags & flags) != 0; }\n /** Sets a specific flag or flags. */\n set(flag: CommonFlags): void { this.flags |= flag; }\n /** Tests if this element has a specific decorator flag or flags. */\n hasDecorator(flag: DecoratorFlags): bool { return (this.decoratorFlags & flag) == flag; }\n}\n\n/** A filespace representing the implicit top-level namespace of a source. */\nexport class Filespace extends Element {\n\n kind = ElementKind.FILESPACE;\n\n /** File members (externally visible only). */\n members: Map; // more specific\n\n /** Constructs a new filespace. */\n constructor(\n program: Program,\n source: Source\n ) {\n super(program, source.internalPath, FILESPACE_PREFIX + source.internalPath);\n this.members = new Map();\n }\n}\n\n/** A namespace that differs from a filespace in being user-declared with a name. */\nexport class Namespace extends Element {\n\n // All elements have namespace semantics. This is an explicitly declared one.\n kind = ElementKind.NAMESPACE;\n\n /** Declaration reference. */\n declaration: NamespaceDeclaration; // more specific\n\n /** Constructs a new namespace. */\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n declaration: NamespaceDeclaration\n ) {\n super(program, simpleName, internalName);\n this.declaration = declaration;\n this.flags = declaration.flags;\n }\n}\n\n/** An enum. */\nexport class Enum extends Element {\n\n kind = ElementKind.ENUM;\n\n /** Declaration reference. */\n declaration: EnumDeclaration;\n\n /** Constructs a new enum. */\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n declaration: EnumDeclaration\n ) {\n super(program, simpleName, internalName);\n this.declaration = declaration;\n this.flags = declaration.flags;\n }\n}\n\n/** An enum value. */\nexport class EnumValue extends Element {\n\n kind = ElementKind.ENUMVALUE;\n\n /** Declaration reference. */\n declaration: EnumValueDeclaration;\n /** Constant value, if applicable. */\n constantValue: i32 = 0;\n\n constructor(\n enm: Enum,\n program: Program,\n simpleName: string,\n internalName: string,\n declaration: EnumValueDeclaration\n ) {\n super(program, simpleName, internalName);\n this.parent = enm;\n this.declaration = declaration;\n }\n}\n\nexport const enum ConstantValueKind {\n NONE,\n INTEGER,\n FLOAT\n}\n\nexport class VariableLikeElement extends Element {\n\n // kind varies\n\n /** Declaration reference. */\n declaration: VariableLikeDeclarationStatement | null;\n /** Variable type. Is {@link Type.void} for type-inferred {@link Global}s before compilation. */\n type: Type;\n /** Constant value kind. */\n constantValueKind: ConstantValueKind = ConstantValueKind.NONE;\n /** Constant integer value, if applicable. */\n constantIntegerValue: I64;\n /** Constant float value, if applicable. */\n constantFloatValue: f64;\n\n protected constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n type: Type,\n declaration: VariableLikeDeclarationStatement | null\n ) {\n super(program, simpleName, internalName);\n this.type = type;\n this.declaration = declaration;\n }\n\n withConstantIntegerValue(value: I64): this {\n this.constantValueKind = ConstantValueKind.INTEGER;\n this.constantIntegerValue = value;\n this.set(CommonFlags.CONST | CommonFlags.INLINED);\n return this;\n }\n\n withConstantFloatValue(value: f64): this {\n this.constantValueKind = ConstantValueKind.FLOAT;\n this.constantFloatValue = value;\n this.set(CommonFlags.CONST | CommonFlags.INLINED);\n return this;\n }\n}\n\n/** A global variable. */\nexport class Global extends VariableLikeElement {\n\n kind = ElementKind.GLOBAL;\n\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n type: Type,\n declaration: VariableLikeDeclarationStatement | null,\n decoratorFlags: DecoratorFlags\n ) {\n super(program, simpleName, internalName, type, declaration);\n this.flags = declaration ? declaration.flags : CommonFlags.NONE;\n this.decoratorFlags = decoratorFlags;\n this.type = type; // resolved later if `void`\n }\n}\n\n/** A function parameter. */\nexport class Parameter {\n\n // not an Element on its own\n\n /** Parameter name. */\n name: string;\n /** Parameter type. */\n type: Type;\n /** Parameter initializer. */\n initializer: Expression | null;\n\n /** Constructs a new function parameter. */\n constructor(name: string, type: Type, initializer: Expression | null = null) {\n this.name = name;\n this.type = type;\n this.initializer = initializer;\n }\n}\n\n/** A function local. */\nexport class Local extends VariableLikeElement {\n\n kind = ElementKind.LOCAL;\n\n /** Local index. */\n index: i32;\n /** Respective scoped global, if any. */\n scopedGlobal: Global | null = null;\n\n constructor(\n program: Program,\n simpleName: string,\n index: i32,\n type: Type,\n declaration: VariableLikeDeclarationStatement | null = null\n ) {\n super(program, simpleName, simpleName, type, declaration);\n this.index = index;\n }\n}\n\n/** A yet unresolved function prototype. */\nexport class FunctionPrototype extends Element {\n\n kind = ElementKind.FUNCTION_PROTOTYPE;\n\n /** Declaration reference. */\n declaration: FunctionDeclaration;\n /** If an instance method, the class prototype reference. */\n classPrototype: ClassPrototype | null;\n /** Resolved instances by class type arguments and function type arguments. */\n instances: Map> = new Map();\n /** Class type arguments, if a partially resolved method of a generic class. Not set otherwise. */\n classTypeArguments: Type[] | null = null;\n /** Operator kind, if an overload. */\n operatorKind: OperatorKind = OperatorKind.INVALID;\n\n /** Constructs a new function prototype. */\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n declaration: FunctionDeclaration,\n classPrototype: ClassPrototype | null = null,\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\n ) {\n super(program, simpleName, internalName);\n this.declaration = declaration;\n this.flags = declaration.flags;\n this.classPrototype = classPrototype;\n this.decoratorFlags = decoratorFlags;\n }\n\n /** Applies class type arguments to the context of a partially resolved instance method. */\n applyClassTypeArguments(contextualTypeArguments: Map): void {\n var classTypeArguments = assert(this.classTypeArguments); // set only if partial\n var classDeclaration = assert(this.classPrototype).declaration;\n var classTypeParameters = classDeclaration.typeParameters;\n var numClassTypeParameters = classTypeParameters.length;\n assert(numClassTypeParameters == classTypeArguments.length);\n for (let i = 0; i < numClassTypeParameters; ++i) {\n contextualTypeArguments.set(\n classTypeParameters[i].name.text,\n classTypeArguments[i]\n );\n }\n }\n\n toString(): string { return this.simpleName; }\n}\n\n/** A resolved function. */\nexport class Function extends Element {\n\n kind = ElementKind.FUNCTION;\n\n /** Prototype reference. */\n prototype: FunctionPrototype;\n /** Function signature. */\n signature: Signature;\n /** Map of locals by name. */\n localsByName: Map = new Map();\n /** Array of locals by index. */\n localsByIndex: Local[] = [];\n /** List of additional non-parameter locals. */\n additionalLocals: Type[] = [];\n /** Contextual type arguments. */\n contextualTypeArguments: Map | null;\n /** Current control flow. */\n flow: Flow;\n /** Remembered debug locations. */\n debugLocations: Range[] = [];\n /** Function reference, if compiled. */\n ref: FunctionRef = 0;\n /** Function table index, if any. */\n functionTableIndex: i32 = -1;\n /** Trampoline function for calling with omitted arguments. */\n trampoline: Function | null = null;\n /** The outer scope, if a function expression. */\n outerScope: Flow | null = null;\n\n nextInlineId: i32 = 0;\n\n /** Constructs a new concrete function. */\n constructor(\n prototype: FunctionPrototype,\n internalName: string,\n signature: Signature,\n parent: Element | null = null,\n contextualTypeArguments: Map | null = null\n ) {\n super(prototype.program, prototype.simpleName, internalName);\n this.prototype = prototype;\n this.signature = signature;\n this.parent = parent;\n this.flags = prototype.flags;\n this.decoratorFlags = prototype.decoratorFlags;\n this.contextualTypeArguments = contextualTypeArguments;\n if (!prototype.is(CommonFlags.AMBIENT)) {\n let localIndex = 0;\n if (parent && parent.kind == ElementKind.CLASS) {\n let local = new Local(\n prototype.program,\n \"this\",\n localIndex++,\n assert(signature.thisType)\n );\n this.localsByName.set(\"this\", local);\n this.localsByIndex[local.index] = local;\n let inheritedTypeArguments = (parent).contextualTypeArguments;\n if (inheritedTypeArguments) {\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\n for (let [inheritedName, inheritedType] of inheritedTypeArguments) {\n if (!this.contextualTypeArguments.has(inheritedName)) {\n this.contextualTypeArguments.set(inheritedName, inheritedType);\n }\n }\n }\n } else {\n assert(!this.is(CommonFlags.INSTANCE)); // internal error\n }\n let parameterTypes = signature.parameterTypes;\n for (let i = 0, k = parameterTypes.length; i < k; ++i) {\n let parameterType = parameterTypes[i];\n let parameterName = signature.getParameterName(i);\n let local = new Local(\n prototype.program,\n parameterName,\n localIndex++,\n parameterType\n // FIXME: declaration?\n );\n this.localsByName.set(parameterName, local);\n this.localsByIndex[local.index] = local;\n }\n }\n this.flow = Flow.create(this);\n }\n\n /** Adds a local of the specified type, with an optional name. */\n addLocal(type: Type, name: string | null = null, declaration: VariableDeclaration | null = null): Local {\n // if it has a name, check previously as this method will throw otherwise\n var localIndex = this.signature.parameterTypes.length + this.additionalLocals.length;\n if (this.is(CommonFlags.INSTANCE)) ++localIndex;\n var local = new Local(\n this.prototype.program,\n name\n ? name\n : \"var$\" + localIndex.toString(10),\n localIndex,\n type,\n declaration\n );\n if (name) {\n if (this.localsByName.has(name)) throw new Error(\"duplicate local name\");\n this.localsByName.set(name, local);\n }\n this.localsByIndex[local.index] = local;\n this.additionalLocals.push(type);\n return local;\n }\n\n // used by flows to keep track of temporary locals\n tempI32s: Local[] | null = null;\n tempI64s: Local[] | null = null;\n tempF32s: Local[] | null = null;\n tempF64s: Local[] | null = null;\n\n // used by flows to keep track of break labels\n nextBreakId: i32 = 0;\n breakStack: i32[] | null = null;\n breakLabel: string | null = null;\n\n /** Finalizes the function once compiled, releasing no longer needed resources. */\n finalize(module: Module, ref: FunctionRef): void {\n this.ref = ref;\n assert(!this.breakStack || !this.breakStack.length); // internal error\n this.breakStack = null;\n this.breakLabel = null;\n this.tempI32s = this.tempI64s = this.tempF32s = this.tempF64s = null;\n if (this.program.options.sourceMap) {\n let debugLocations = this.debugLocations;\n for (let i = 0, k = debugLocations.length; i < k; ++i) {\n let debugLocation = debugLocations[i];\n module.setDebugLocation(\n ref,\n debugLocation.debugInfoRef,\n debugLocation.source.debugInfoIndex,\n debugLocation.line,\n debugLocation.column\n );\n }\n }\n }\n\n /** Returns the TypeScript representation of this function. */\n toString(): string { return this.prototype.simpleName; }\n}\n\n/** A resolved function target, that is a function called indirectly by an index and signature. */\nexport class FunctionTarget extends Element {\n\n kind = ElementKind.FUNCTION_TARGET;\n\n /** Underlying signature. */\n signature: Signature;\n /** Function type. */\n type: Type;\n\n /** Constructs a new function target. */\n constructor(program: Program, signature: Signature) {\n super(program, \"\", \"\");\n var simpleName = signature.toSignatureString();\n this.simpleName = simpleName;\n this.internalName = simpleName;\n this.signature = signature;\n this.type = Type.u32.asFunction(signature);\n }\n}\n\n/** A yet unresolved instance field prototype. */\nexport class FieldPrototype extends Element {\n\n kind = ElementKind.FIELD_PROTOTYPE;\n\n /** Declaration reference. */\n declaration: FieldDeclaration;\n /** Parent class prototype. */\n classPrototype: ClassPrototype;\n\n /** Constructs a new field prototype. */\n constructor(\n classPrototype: ClassPrototype,\n simpleName: string,\n internalName: string,\n declaration: FieldDeclaration\n ) {\n super(classPrototype.program, simpleName, internalName);\n this.classPrototype = classPrototype;\n this.declaration = declaration;\n this.flags = declaration.flags;\n }\n}\n\n/** A resolved instance field. */\nexport class Field extends VariableLikeElement {\n\n kind = ElementKind.FIELD;\n\n /** Field prototype reference. */\n prototype: FieldPrototype;\n /** Field memory offset, if an instance field. */\n memoryOffset: i32 = -1;\n\n /** Constructs a new field. */\n constructor(\n prototype: FieldPrototype,\n internalName: string,\n type: Type,\n declaration: FieldDeclaration,\n parent: Class\n ) {\n super(prototype.program, prototype.simpleName, internalName, type, declaration);\n this.prototype = prototype;\n this.flags = prototype.flags;\n this.type = type;\n this.parent = parent;\n }\n}\n\n/** A property comprised of a getter and a setter function. */\nexport class Property extends Element {\n\n kind = ElementKind.PROPERTY;\n\n /** Parent class prototype. */\n parent: ClassPrototype;\n /** Getter prototype. */\n getterPrototype: FunctionPrototype | null = null;\n /** Setter prototype. */\n setterPrototype: FunctionPrototype | null = null;\n\n /** Constructs a new property prototype. */\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n parent: ClassPrototype\n ) {\n super(program, simpleName, internalName);\n this.parent = parent;\n }\n}\n\n/** A yet unresolved class prototype. */\nexport class ClassPrototype extends Element {\n\n kind = ElementKind.CLASS_PROTOTYPE;\n\n /** Declaration reference. */\n declaration: ClassDeclaration;\n /** Resolved instances. */\n instances: Map = new Map();\n /** Instance member prototypes. */\n instanceMembers: Map | null = null;\n /** Base class prototype, if applicable. */\n basePrototype: ClassPrototype | null = null; // set in Program#initialize\n /** Constructor prototype. */\n constructorPrototype: FunctionPrototype | null = null;\n /** Operator overload prototypes. */\n overloadPrototypes: Map = new Map();\n\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n declaration: ClassDeclaration,\n decoratorFlags: DecoratorFlags\n ) {\n super(program, simpleName, internalName);\n this.declaration = declaration;\n this.flags = declaration.flags;\n this.decoratorFlags = decoratorFlags;\n }\n\n extends(basePtototype: ClassPrototype | null): bool {\n var current: ClassPrototype | null = this;\n do {\n if (current === basePtototype) return true;\n } while (current = current.basePrototype);\n return false;\n }\n\n toString(): string {\n return this.simpleName;\n }\n}\n\n/** A resolved class. */\nexport class Class extends Element {\n\n kind = ElementKind.CLASS;\n\n /** Prototype reference. */\n prototype: ClassPrototype;\n /** Resolved type arguments. */\n typeArguments: Type[] | null;\n /** Resolved class type. */\n type: Type;\n /** Base class, if applicable. */\n base: Class | null;\n /** Contextual type arguments for fields and methods. */\n contextualTypeArguments: Map | null = null;\n /** Current member memory offset. */\n currentMemoryOffset: u32 = 0;\n /** Constructor instance. */\n constructorInstance: Function | null = null;\n /** Operator overloads. */\n overloads: Map | null = null;\n /** Function index of the GC hook. */\n gcHookIndex: u32 = -1;\n\n /** Constructs a new class. */\n constructor(\n prototype: ClassPrototype,\n simpleName: string,\n internalName: string,\n typeArguments: Type[] | null = null,\n base: Class | null = null\n ) {\n super(prototype.program, simpleName, internalName);\n this.prototype = prototype;\n this.flags = prototype.flags;\n this.decoratorFlags = prototype.decoratorFlags;\n this.typeArguments = typeArguments;\n this.type = prototype.program.options.usizeType.asClass(this);\n this.base = base;\n\n // inherit static members and contextual type arguments from base class\n if (base) {\n let inheritedTypeArguments = base.contextualTypeArguments;\n if (inheritedTypeArguments) {\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\n for (let [baseName, baseType] of inheritedTypeArguments) {\n this.contextualTypeArguments.set(baseName, baseType);\n }\n }\n }\n\n // apply instance-specific contextual type arguments\n var declaration = this.prototype.declaration;\n var i: i32, k: i32;\n if (declaration) { // irrelevant for built-ins\n let typeParameters = declaration.typeParameters;\n if (typeArguments) {\n if ((k = typeArguments.length) != typeParameters.length) {\n throw new Error(\"type argument count mismatch\");\n }\n if (k) {\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\n for (i = 0; i < k; ++i) {\n this.contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\n }\n }\n } else if (typeParameters.length) {\n throw new Error(\"type argument count mismatch\");\n }\n }\n }\n\n /** Tests if a value of this class type is assignable to a target of the specified class type. */\n isAssignableTo(target: Class): bool {\n var current: Class | null = this;\n do if (current == target) return true;\n while (current = current.base);\n return false;\n }\n\n /** Looks up the operator overload of the specified kind. */\n lookupOverload(kind: OperatorKind, unchecked: bool = false): Function | null {\n if (unchecked) {\n switch (kind) {\n case OperatorKind.INDEXED_GET: {\n let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_GET);\n if (uncheckedOverload) return uncheckedOverload;\n break;\n }\n case OperatorKind.INDEXED_SET: {\n let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_SET);\n if (uncheckedOverload) return uncheckedOverload;\n break;\n }\n default: assert(false);\n }\n }\n var instance: Class | null = this;\n do {\n let overloads = instance.overloads;\n if (overloads) {\n let overload = overloads.get(kind);\n if (overload) return overload;\n }\n } while (instance = instance.base);\n return null;\n }\n\n lookupField(name: string, shouldReadonly: boolean = false): Element | null {\n if (this.members == null) return null;\n var member = this.members.get(name);\n if (\n member == null || member.kind != ElementKind.FIELD ||\n (shouldReadonly && !member.is(CommonFlags.READONLY))\n ) return null;\n return member;\n }\n\n offsetof(fieldName: string): u32 {\n var members = assert(this.members);\n assert(members.has(fieldName));\n var field = members.get(fieldName);\n assert(field.kind == ElementKind.FIELD);\n return (field).memoryOffset;\n }\n\n toString(): string {\n return this.simpleName;\n }\n}\n\n/** A yet unresolved interface. */\nexport class InterfacePrototype extends ClassPrototype {\n\n kind = ElementKind.INTERFACE_PROTOTYPE;\n\n /** Declaration reference. */\n declaration: InterfaceDeclaration; // more specific\n\n /** Constructs a new interface prototype. */\n constructor(\n program: Program,\n simpleName: string,\n internalName: string,\n declaration: InterfaceDeclaration,\n decoratorFlags: DecoratorFlags\n ) {\n super(program, simpleName, internalName, declaration, decoratorFlags);\n }\n}\n\n/** A resolved interface. */\nexport class Interface extends Class {\n\n kind = ElementKind.INTERFACE;\n\n /** Prototype reference. */\n prototype: InterfacePrototype; // more specific\n /** Base interface, if applcable. */\n base: Interface | null; // more specific\n\n /** Constructs a new interface. */\n constructor(\n prototype: InterfacePrototype,\n simpleName: string,\n internalName: string,\n typeArguments: Type[] = [],\n base: Interface | null = null\n ) {\n super(prototype, simpleName, internalName, typeArguments, base);\n }\n}\n\n/** Control flow flags indicating specific conditions. */\nexport const enum FlowFlags {\n /** No specific conditions. */\n NONE = 0,\n\n // categorical\n\n /** This flow returns. */\n RETURNS = 1 << 0,\n /** This flow returns a wrapped value. */\n RETURNS_WRAPPED = 1 << 1,\n /** This flow throws. */\n THROWS = 1 << 2,\n /** This flow breaks. */\n BREAKS = 1 << 3,\n /** This flow continues. */\n CONTINUES = 1 << 4,\n /** This flow allocates. Constructors only. */\n ALLOCATES = 1 << 5,\n /** This flow calls super. Constructors only. */\n CALLS_SUPER = 1 << 6,\n\n // conditional\n\n /** This flow conditionally returns in a child flow. */\n CONDITIONALLY_RETURNS = 1 << 7,\n /** This flow conditionally throws in a child flow. */\n CONDITIONALLY_THROWS = 1 << 8,\n /** This flow conditionally breaks in a child flow. */\n CONDITIONALLY_BREAKS = 1 << 9,\n /** This flow conditionally continues in a child flow. */\n CONDITIONALLY_CONTINUES = 1 << 10,\n /** This flow conditionally allocates in a child flow. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 11,\n\n // special\n\n /** This is an inlining flow. */\n INLINE_CONTEXT = 1 << 12,\n /** This is a flow with explicitly disabled bounds checking. */\n UNCHECKED_CONTEXT = 1 << 13,\n\n // masks\n\n /** Any terminating flag. */\n ANY_TERMINATING = FlowFlags.RETURNS\n | FlowFlags.THROWS\n | FlowFlags.BREAKS\n | FlowFlags.CONTINUES,\n\n /** Any categorical flag. */\n ANY_CATEGORICAL = FlowFlags.RETURNS\n | FlowFlags.RETURNS_WRAPPED\n | FlowFlags.THROWS\n | FlowFlags.BREAKS\n | FlowFlags.CONTINUES\n | FlowFlags.ALLOCATES\n | FlowFlags.CALLS_SUPER,\n\n /** Any conditional flag. */\n ANY_CONDITIONAL = FlowFlags.CONDITIONALLY_RETURNS\n | FlowFlags.CONDITIONALLY_THROWS\n | FlowFlags.CONDITIONALLY_BREAKS\n | FlowFlags.CONDITIONALLY_CONTINUES\n | FlowFlags.CONDITIONALLY_ALLOCATES\n}\n\n/** A control flow evaluator. */\nexport class Flow {\n\n /** Parent flow. */\n parent: Flow | null;\n /** Flow flags indicating specific conditions. */\n flags: FlowFlags;\n /** Function this flow belongs to. */\n parentFunction: Function;\n /** The label we break to when encountering a continue statement. */\n continueLabel: string | null;\n /** The label we break to when encountering a break statement. */\n breakLabel: string | null;\n /** The current return type. */\n returnType: Type;\n /** The current contextual type arguments. */\n contextualTypeArguments: Map | null;\n /** Scoped local variables. */\n scopedLocals: Map | null = null;\n /** Local variable wrap states for the first 64 locals. */\n wrappedLocals: I64;\n /** Local variable wrap states for locals with index >= 64. */\n wrappedLocalsExt: I64[] | null;\n /** Function being inlined, when inlining. */\n inlineFunction: Function | null;\n /** The label we break to when encountering a return statement, when inlining. */\n inlineReturnLabel: string | null;\n\n /** Creates the parent flow of the specified function. */\n static create(parentFunction: Function): Flow {\n var flow = new Flow();\n flow.parent = null;\n flow.flags = FlowFlags.NONE;\n flow.parentFunction = parentFunction;\n flow.continueLabel = null;\n flow.breakLabel = null;\n flow.returnType = parentFunction.signature.returnType;\n flow.contextualTypeArguments = parentFunction.contextualTypeArguments;\n flow.wrappedLocals = i64_new(0);\n flow.wrappedLocalsExt = null;\n flow.inlineFunction = null;\n flow.inlineReturnLabel = null;\n return flow;\n }\n\n /** Creates an inline flow within `currentFunction`. */\n static createInline(parentFunction: Function, inlineFunction: Function): Flow {\n var flow = Flow.create(parentFunction);\n flow.set(FlowFlags.INLINE_CONTEXT);\n flow.inlineFunction = inlineFunction;\n flow.inlineReturnLabel = inlineFunction.internalName + \"|inlined.\" + (inlineFunction.nextInlineId++).toString(10);\n flow.returnType = inlineFunction.signature.returnType;\n flow.contextualTypeArguments = inlineFunction.contextualTypeArguments;\n return flow;\n }\n\n private constructor() { }\n\n /** Gets the actual function being compiled, The inlined function when inlining, otherwise the parent function. */\n get actualFunction(): Function {\n return this.inlineFunction || this.parentFunction;\n }\n\n /** Tests if this flow has the specified flag or flags. */\n is(flag: FlowFlags): bool { return (this.flags & flag) == flag; }\n /** Tests if this flow has one of the specified flags. */\n isAny(flag: FlowFlags): bool { return (this.flags & flag) != 0; }\n /** Sets the specified flag or flags. */\n set(flag: FlowFlags): void { this.flags |= flag; }\n /** Unsets the specified flag or flags. */\n unset(flag: FlowFlags): void { this.flags &= ~flag; }\n\n /** Forks this flow to a child flow. */\n fork(): Flow {\n var branch = new Flow();\n branch.parent = this;\n branch.flags = this.flags;\n branch.parentFunction = this.parentFunction;\n branch.continueLabel = this.continueLabel;\n branch.breakLabel = this.breakLabel;\n branch.returnType = this.returnType;\n branch.contextualTypeArguments = this.contextualTypeArguments;\n branch.wrappedLocals = this.wrappedLocals;\n branch.wrappedLocalsExt = this.wrappedLocalsExt ? this.wrappedLocalsExt.slice() : null;\n branch.inlineFunction = this.inlineFunction;\n branch.inlineReturnLabel = this.inlineReturnLabel;\n return branch;\n }\n\n /** Gets a free temporary local of the specified type. */\n getTempLocal(type: Type, wrapped: bool = false): Local {\n var parentFunction = this.parentFunction;\n var temps: Local[] | null;\n switch (type.toNativeType()) {\n case NativeType.I32: { temps = parentFunction.tempI32s; break; }\n case NativeType.I64: { temps = parentFunction.tempI64s; break; }\n case NativeType.F32: { temps = parentFunction.tempF32s; break; }\n case NativeType.F64: { temps = parentFunction.tempF64s; break; }\n default: throw new Error(\"concrete type expected\");\n }\n var local: Local;\n if (temps && temps.length) {\n local = temps.pop();\n local.type = type;\n local.flags = CommonFlags.NONE;\n } else {\n local = parentFunction.addLocal(type);\n }\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) this.setLocalWrapped(local.index, wrapped);\n return local;\n }\n\n /** Frees the temporary local for reuse. */\n freeTempLocal(local: Local): void {\n if (local.is(CommonFlags.INLINED)) return;\n assert(local.index >= 0);\n var parentFunction = this.parentFunction;\n var temps: Local[];\n assert(local.type != null); // internal error\n switch ((local.type).toNativeType()) {\n case NativeType.I32: {\n temps = parentFunction.tempI32s || (parentFunction.tempI32s = []);\n break;\n }\n case NativeType.I64: {\n temps = parentFunction.tempI64s || (parentFunction.tempI64s = []);\n break;\n }\n case NativeType.F32: {\n temps = parentFunction.tempF32s || (parentFunction.tempF32s = []);\n break;\n }\n case NativeType.F64: {\n temps = parentFunction.tempF64s || (parentFunction.tempF64s = []);\n break;\n }\n default: throw new Error(\"concrete type expected\");\n }\n assert(local.index >= 0);\n temps.push(local);\n }\n\n /** Gets and immediately frees a temporary local of the specified type. */\n getAndFreeTempLocal(type: Type, wrapped: bool): Local {\n var parentFunction = this.parentFunction;\n var temps: Local[];\n switch (type.toNativeType()) {\n case NativeType.I32: {\n temps = parentFunction.tempI32s || (parentFunction.tempI32s = []);\n break;\n }\n case NativeType.I64: {\n temps = parentFunction.tempI64s || (parentFunction.tempI64s = []);\n break;\n }\n case NativeType.F32: {\n temps = parentFunction.tempF32s || (parentFunction.tempF32s = []);\n break;\n }\n case NativeType.F64: {\n temps = parentFunction.tempF64s || (parentFunction.tempF64s = []);\n break;\n }\n default: throw new Error(\"concrete type expected\");\n }\n var local: Local;\n if (temps.length) {\n local = temps[temps.length - 1];\n local.type = type;\n } else {\n local = parentFunction.addLocal(type);\n temps.push(local);\n }\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) this.setLocalWrapped(local.index, wrapped);\n return local;\n }\n\n /** Adds a new scoped local of the specified name. */\n addScopedLocal(name: string, type: Type, wrapped: bool, reportNode: Node | null = null): Local {\n var scopedLocal = this.getTempLocal(type, false);\n if (!this.scopedLocals) this.scopedLocals = new Map();\n else {\n let existingLocal = this.scopedLocals.get(name);\n if (existingLocal) {\n if (reportNode) {\n this.parentFunction.program.error(\n DiagnosticCode.Duplicate_identifier_0,\n reportNode.range\n );\n }\n return existingLocal;\n }\n }\n scopedLocal.set(CommonFlags.SCOPED);\n this.scopedLocals.set(name, scopedLocal);\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n this.setLocalWrapped(scopedLocal.index, wrapped);\n }\n return scopedLocal;\n }\n\n /** Adds a new scoped alias for the specified local. For example `super` aliased to the `this` local. */\n addScopedAlias(name: string, type: Type, index: i32, reportNode: Node | null = null): Local {\n if (!this.scopedLocals) this.scopedLocals = new Map();\n else {\n let existingLocal = this.scopedLocals.get(name);\n if (existingLocal) {\n if (reportNode) {\n this.parentFunction.program.error(\n DiagnosticCode.Duplicate_identifier_0,\n reportNode.range\n );\n }\n return existingLocal;\n }\n }\n assert(index < this.parentFunction.localsByIndex.length);\n var scopedAlias = new Local(\n this.parentFunction.program,\n name,\n index,\n type,\n null\n );\n // not flagged as SCOPED as it must not be free'd when the flow is finalized\n this.scopedLocals.set(name, scopedAlias);\n return scopedAlias;\n }\n\n /** Frees this flow's scoped variables and returns its parent flow. */\n freeScopedLocals(): void {\n if (this.scopedLocals) {\n for (let scopedLocal of this.scopedLocals.values()) {\n if (scopedLocal.is(CommonFlags.SCOPED)) { // otherwise an alias\n this.freeTempLocal(scopedLocal);\n }\n }\n this.scopedLocals = null;\n }\n }\n\n /** Looks up the local of the specified name in the current scope. */\n lookupLocal(name: string): Local | null {\n var local: Local | null;\n var current: Flow | null = this;\n do if (current.scopedLocals && (local = current.scopedLocals.get(name))) return local;\n while (current = current.parent);\n return this.parentFunction.localsByName.get(name);\n }\n\n /** Tests if the value of the local at the specified index is considered wrapped. */\n isLocalWrapped(index: i32): bool {\n if (index < 0) return true; // inlined constant\n if (index < 64) return bitsetIs(this.wrappedLocals, index);\n var ext = this.wrappedLocalsExt;\n var i = ((index - 64) / 64) | 0;\n if (!(ext && i < ext.length)) return false;\n return bitsetIs(ext[i], index - (i + 1) * 64);\n }\n\n /** Sets if the value of the local at the specified index is considered wrapped. */\n setLocalWrapped(index: i32, wrapped: bool): void {\n if (index < 0) return; // inlined constant\n if (index < 64) {\n this.wrappedLocals = bitsetSet(this.wrappedLocals, index, wrapped);\n return;\n }\n var ext = this.wrappedLocalsExt;\n var i = ((index - 64) / 64) | 0;\n if (!ext) {\n this.wrappedLocalsExt = ext = new Array(i + 1);\n for (let j = 0; j <= i; ++j) ext[j] = i64_new(0);\n } else {\n while (ext.length <= i) ext.push(i64_new(0));\n }\n ext[i] = bitsetSet(ext[i], index - (i + 1) * 64, wrapped);\n }\n\n /** Pushes a new break label to the stack, for example when entering a loop that one can `break` from. */\n pushBreakLabel(): string {\n var parentFunction = this.parentFunction;\n var id = parentFunction.nextBreakId++;\n var stack = parentFunction.breakStack;\n if (!stack) parentFunction.breakStack = [ id ];\n else stack.push(id);\n return parentFunction.breakLabel = id.toString(10);\n }\n\n /** Pops the most recent break label from the stack. */\n popBreakLabel(): void {\n var parentFunction = this.parentFunction;\n var stack = assert(parentFunction.breakStack);\n var length = assert(stack.length);\n stack.pop();\n if (length > 1) {\n parentFunction.breakLabel = stack[length - 2].toString(10);\n } else {\n parentFunction.breakLabel = null;\n parentFunction.breakStack = null;\n }\n }\n\n /** Inherits flags and local wrap states from the specified flow (e.g. blocks). */\n inherit(other: Flow): void {\n this.flags |= other.flags & (FlowFlags.ANY_CATEGORICAL | FlowFlags.ANY_CONDITIONAL);\n this.wrappedLocals = other.wrappedLocals;\n this.wrappedLocalsExt = other.wrappedLocalsExt; // no need to slice because other flow is finished\n }\n\n /** Inherits categorical flags as conditional flags from the specified flow (e.g. then without else). */\n inheritConditional(other: Flow): void {\n if (other.is(FlowFlags.RETURNS)) {\n this.set(FlowFlags.CONDITIONALLY_RETURNS);\n }\n if (other.is(FlowFlags.THROWS)) {\n this.set(FlowFlags.CONDITIONALLY_THROWS);\n }\n if (other.is(FlowFlags.BREAKS) && other.breakLabel == this.breakLabel) {\n this.set(FlowFlags.CONDITIONALLY_BREAKS);\n }\n if (other.is(FlowFlags.CONTINUES) && other.continueLabel == this.continueLabel) {\n this.set(FlowFlags.CONDITIONALLY_CONTINUES);\n }\n if (other.is(FlowFlags.ALLOCATES)) {\n this.set(FlowFlags.CONDITIONALLY_ALLOCATES);\n }\n }\n\n /** Inherits mutual flags and local wrap states from the specified flows (e.g. then with else). */\n inheritMutual(left: Flow, right: Flow): void {\n // categorical flags set in both arms\n this.flags |= left.flags & right.flags & FlowFlags.ANY_CATEGORICAL;\n\n // conditional flags set in at least one arm\n this.flags |= left.flags & FlowFlags.ANY_CONDITIONAL;\n this.flags |= right.flags & FlowFlags.ANY_CONDITIONAL;\n\n // locals wrapped in both arms\n this.wrappedLocals = i64_and(left.wrappedLocals, right.wrappedLocals);\n var leftExt = left.wrappedLocalsExt;\n var rightExt = right.wrappedLocalsExt;\n if (leftExt != null && rightExt != null) {\n let thisExt = this.wrappedLocalsExt;\n let minLength = min(leftExt.length, rightExt.length);\n if (minLength) {\n if (!thisExt) thisExt = new Array(minLength);\n else while (thisExt.length < minLength) thisExt.push(i64_new(0));\n for (let i = 0; i < minLength; ++i) {\n thisExt[i] = i64_and(\n leftExt[i],\n rightExt[i]\n );\n }\n }\n }\n }\n\n /**\n * Tests if an expression can possibly overflow in the context of this flow. Assumes that the\n * expression might already have overflown and returns `false` only if the operation neglects\n * any possible combination of garbage bits being present.\n */\n canOverflow(expr: ExpressionRef, type: Type): bool {\n // TODO: the following catches most common and a few uncommon cases, but there are additional\n // opportunities here, obviously.\n assert(type != Type.void);\n\n // types other than i8, u8, i16, u16 and bool do not overflow\n if (!type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) return false;\n\n var operand: ExpressionRef;\n switch (getExpressionId(expr)) {\n\n // overflows if the local isn't wrapped or the conversion does\n case ExpressionId.GetLocal: {\n let local = this.parentFunction.localsByIndex[getGetLocalIndex(expr)];\n return !this.isLocalWrapped(local.index)\n || canConversionOverflow(local.type, type);\n }\n\n // overflows if the value does\n case ExpressionId.SetLocal: { // tee\n assert(isTeeLocal(expr));\n return this.canOverflow(getSetLocalValue(expr), type);\n }\n\n // overflows if the conversion does (globals are wrapped on set)\n case ExpressionId.GetGlobal: {\n // TODO: this is inefficient because it has to read a string\n let global = assert(this.parentFunction.program.elementsLookup.get(assert(getGetGlobalName(expr))));\n assert(global.kind == ElementKind.GLOBAL);\n return canConversionOverflow(assert((global).type), type);\n }\n\n case ExpressionId.Binary: {\n switch (getBinaryOp(expr)) {\n\n // comparisons do not overflow (result is 0 or 1)\n case BinaryOp.EqI32:\n case BinaryOp.EqI64:\n case BinaryOp.EqF32:\n case BinaryOp.EqF64:\n case BinaryOp.NeI32:\n case BinaryOp.NeI64:\n case BinaryOp.NeF32:\n case BinaryOp.NeF64:\n case BinaryOp.LtI32:\n case BinaryOp.LtU32:\n case BinaryOp.LtI64:\n case BinaryOp.LtU64:\n case BinaryOp.LtF32:\n case BinaryOp.LtF64:\n case BinaryOp.LeI32:\n case BinaryOp.LeU32:\n case BinaryOp.LeI64:\n case BinaryOp.LeU64:\n case BinaryOp.LeF32:\n case BinaryOp.LeF64:\n case BinaryOp.GtI32:\n case BinaryOp.GtU32:\n case BinaryOp.GtI64:\n case BinaryOp.GtU64:\n case BinaryOp.GtF32:\n case BinaryOp.GtF64:\n case BinaryOp.GeI32:\n case BinaryOp.GeU32:\n case BinaryOp.GeI64:\n case BinaryOp.GeU64:\n case BinaryOp.GeF32:\n case BinaryOp.GeF64: return false;\n\n // result won't overflow if one side is 0 or if one side is 1 and the other wrapped\n case BinaryOp.MulI32: {\n return !(\n (\n getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\n (\n getConstValueI32(operand) == 0 ||\n (\n getConstValueI32(operand) == 1 &&\n !this.canOverflow(getBinaryRight(expr), type)\n )\n )\n ) || (\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\n (\n getConstValueI32(operand) == 0 ||\n (\n getConstValueI32(operand) == 1 &&\n !this.canOverflow(getBinaryLeft(expr), type)\n )\n )\n )\n );\n }\n\n // result won't overflow if one side is a constant less than this type's mask or one side\n // is wrapped\n case BinaryOp.AndI32: {\n // note that computeSmallIntegerMask returns the mask minus the MSB for signed types\n // because signed value garbage bits must be guaranteed to be equal to the MSB.\n return !(\n (\n (\n getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\n getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\n ) || !this.canOverflow(operand, type)\n ) || (\n (\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\n getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\n ) || !this.canOverflow(operand, type)\n )\n );\n }\n\n // overflows if the shift doesn't clear potential garbage bits\n case BinaryOp.ShlI32: {\n let shift = 32 - type.size;\n return getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const\n || getConstValueI32(operand) < shift;\n }\n\n // overflows if the value does and the shift doesn't clear potential garbage bits\n case BinaryOp.ShrI32: {\n let shift = 32 - type.size;\n return this.canOverflow(getBinaryLeft(expr), type) && (\n getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const ||\n getConstValueI32(operand) < shift\n );\n }\n\n // overflows if the shift does not clear potential garbage bits. if an unsigned value is\n // wrapped, it can't overflow.\n case BinaryOp.ShrU32: {\n let shift = 32 - type.size;\n return type.is(TypeFlags.SIGNED)\n ? !(\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\n getConstValueI32(operand) > shift // must clear MSB\n )\n : this.canOverflow(getBinaryLeft(expr), type) && !(\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\n getConstValueI32(operand) >= shift // can leave MSB\n );\n }\n\n // overflows if any side does\n case BinaryOp.DivU32:\n case BinaryOp.RemI32:\n case BinaryOp.RemU32: {\n return this.canOverflow(getBinaryLeft(expr), type)\n || this.canOverflow(getBinaryRight(expr), type);\n }\n }\n break;\n }\n\n case ExpressionId.Unary: {\n switch (getUnaryOp(expr)) {\n\n // comparisons do not overflow (result is 0 or 1)\n case UnaryOp.EqzI32:\n case UnaryOp.EqzI64: return false;\n\n // overflow if the maximum result (32) cannot be represented in the target type\n case UnaryOp.ClzI32:\n case UnaryOp.CtzI32:\n case UnaryOp.PopcntI32: return type.size < 7;\n }\n break;\n }\n\n // overflows if the value cannot be represented in the target type\n case ExpressionId.Const: {\n let value: i32 = 0;\n switch (getExpressionType(expr)) {\n case NativeType.I32: { value = getConstValueI32(expr); break; }\n case NativeType.I64: { value = getConstValueI64Low(expr); break; } // discards upper bits\n case NativeType.F32: { value = i32(getConstValueF32(expr)); break; }\n case NativeType.F64: { value = i32(getConstValueF64(expr)); break; }\n default: assert(false);\n }\n switch (type.kind) {\n case TypeKind.I8: return value < i8.MIN_VALUE || value > i8.MAX_VALUE;\n case TypeKind.I16: return value < i16.MIN_VALUE || value > i16.MAX_VALUE;\n case TypeKind.U8: return value < 0 || value > u8.MAX_VALUE;\n case TypeKind.U16: return value < 0 || value > u16.MAX_VALUE;\n case TypeKind.BOOL: return (value & ~1) != 0;\n }\n break;\n }\n\n // overflows if the conversion does\n case ExpressionId.Load: {\n let fromType: Type;\n switch (getLoadBytes(expr)) {\n case 1: { fromType = isLoadSigned(expr) ? Type.i8 : Type.u8; break; }\n case 2: { fromType = isLoadSigned(expr) ? Type.i16 : Type.u16; break; }\n default: { fromType = isLoadSigned(expr) ? Type.i32 : Type.u32; break; }\n }\n return canConversionOverflow(fromType, type);\n }\n\n // overflows if the result does, which is either\n // - the last expression of the block, by contract, if the block doesn't have a label\n // - the last expression or the value of an inner br if the block has a label (TODO)\n case ExpressionId.Block: {\n if (!getBlockName(expr)) {\n let size = assert(getBlockChildCount(expr));\n let last = getBlockChild(expr, size - 1);\n return this.canOverflow(last, type);\n }\n break;\n }\n\n // overflows if either side does\n case ExpressionId.If: {\n return this.canOverflow(getIfTrue(expr), type)\n || this.canOverflow(assert(getIfFalse(expr)), type);\n }\n\n // overflows if either side does\n case ExpressionId.Select: {\n return this.canOverflow(getSelectThen(expr), type)\n || this.canOverflow(getSelectElse(expr), type);\n }\n\n // overflows if the call does not return a wrapped value or the conversion does\n case ExpressionId.Call: {\n let program = this.parentFunction.program;\n let instance = assert(program.instancesLookup.get(assert(getCallTarget(expr))));\n assert(instance.kind == ElementKind.FUNCTION);\n let returnType = (instance).signature.returnType;\n return !(instance).flow.is(FlowFlags.RETURNS_WRAPPED)\n || canConversionOverflow(returnType, type);\n }\n\n // doesn't technically overflow\n case ExpressionId.Unreachable: return false;\n }\n return true;\n }\n}\n\n/** Tests if a conversion from one type to another can technically overflow. */\nfunction canConversionOverflow(fromType: Type, toType: Type): bool {\n return !fromType.is(TypeFlags.INTEGER) // non-i32 locals or returns\n || fromType.size > toType.size\n || fromType.is(TypeFlags.SIGNED) != toType.is(TypeFlags.SIGNED);\n}\n","/**\n * A TypeScript tokenizer modified for AssemblyScript.\n *\n * Skips over trivia and provides a general mark/reset mechanism for the parser to utilize on\n * ambiguous tokens.\n *\n * @module tokenizer\n *//***/\n\nimport {\n DiagnosticCode,\n DiagnosticMessage,\n DiagnosticEmitter\n} from \"./diagnostics\";\n\nimport {\n Source,\n CommentKind\n} from \"./ast\";\n\nimport {\n CharCode,\n isLineBreak,\n isWhiteSpace,\n isIdentifierStart,\n isIdentifierPart,\n isDecimalDigit,\n isOctalDigit,\n isKeywordCharacter\n} from \"./util\";\n\n/** Named token types. */\nexport enum Token {\n\n // keywords\n // discarded: ANY, BOOLEAN, NEVER, NUMBER, STRING, SYMBOL, UNDEFINED, LESSTHAN_SLASH\n\n ABSTRACT,\n AS,\n ASYNC,\n AWAIT, // ES2017\n BREAK, // ES2017\n CASE, // ES2017\n CATCH, // ES2017\n CLASS, // ES2017\n CONST, // ES2017\n CONTINUE, // ES2017\n CONSTRUCTOR,\n DEBUGGER, // ES2017\n DECLARE,\n DEFAULT, // ES2017\n DELETE, // ES2017\n DO, // ES2017\n ELSE, // ES2017\n ENUM, // ES2017 future\n EXPORT, // ES2017\n EXTENDS, // ES2017\n FALSE, // ES\n FINALLY, // ES2017\n FOR, // ES2017\n FROM, // AS possible identifier\n FUNCTION, // ES2017\n GET,\n IF, // ES2017\n IMPLEMENTS, // ES2017 non-lexical\n IMPORT, // ES2017\n IN, // ES2017\n INSTANCEOF, // ES2017\n INTERFACE, // ES2017 non-lexical\n IS,\n KEYOF,\n LET, // ES2017 non-lexical\n MODULE, // AS possible identifier\n NAMESPACE, // AS possible identifier\n NEW, // ES2017\n NULL, // ES\n OF,\n PACKAGE, // ES2017 non-lexical\n PRIVATE, // ES2017 non-lexical\n PROTECTED, // ES2017 non-lexical\n PUBLIC, // ES2017 non-lexical\n READONLY,\n RETURN, // ES2017\n SET,\n STATIC, // ES2017 non-lexical\n SUPER, // ES2017\n SWITCH, // ES2017\n THIS, // ES2017\n THROW, // ES2017\n TRUE, // ES\n TRY, // ES2017\n TYPE, // AS possible identifier\n TYPEOF, // ES2017\n VAR, // ES2017\n VOID, // ES2017\n WHILE, // ES2017\n WITH, // ES2017\n YIELD, // ES2017\n\n // punctuation\n\n OPENBRACE,\n CLOSEBRACE,\n OPENPAREN,\n CLOSEPAREN,\n OPENBRACKET,\n CLOSEBRACKET,\n DOT,\n DOT_DOT_DOT,\n SEMICOLON,\n COMMA,\n LESSTHAN,\n GREATERTHAN,\n LESSTHAN_EQUALS,\n GREATERTHAN_EQUALS,\n EQUALS_EQUALS,\n EXCLAMATION_EQUALS,\n EQUALS_EQUALS_EQUALS,\n EXCLAMATION_EQUALS_EQUALS,\n EQUALS_GREATERTHAN,\n PLUS,\n MINUS,\n ASTERISK_ASTERISK,\n ASTERISK,\n SLASH,\n PERCENT,\n PLUS_PLUS,\n MINUS_MINUS,\n LESSTHAN_LESSTHAN,\n GREATERTHAN_GREATERTHAN,\n GREATERTHAN_GREATERTHAN_GREATERTHAN,\n AMPERSAND,\n BAR,\n CARET,\n EXCLAMATION,\n TILDE,\n AMPERSAND_AMPERSAND,\n BAR_BAR,\n QUESTION,\n COLON,\n EQUALS,\n PLUS_EQUALS,\n MINUS_EQUALS,\n ASTERISK_EQUALS,\n ASTERISK_ASTERISK_EQUALS,\n SLASH_EQUALS,\n PERCENT_EQUALS,\n LESSTHAN_LESSTHAN_EQUALS,\n GREATERTHAN_GREATERTHAN_EQUALS,\n GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS,\n AMPERSAND_EQUALS,\n BAR_EQUALS,\n CARET_EQUALS,\n AT,\n\n // literals\n\n IDENTIFIER,\n STRINGLITERAL,\n INTEGERLITERAL,\n FLOATLITERAL,\n\n // meta\n\n INVALID,\n ENDOFFILE\n}\n\nexport enum IdentifierHandling {\n DEFAULT,\n PREFER,\n ALWAYS\n}\n\nexport function tokenFromKeyword(text: string): Token {\n assert(text.length);\n switch (text.charCodeAt(0)) {\n case CharCode.a: {\n switch (text) {\n case \"abstract\": return Token.ABSTRACT;\n case \"as\": return Token.AS;\n case \"async\": return Token.ASYNC;\n case \"await\": return Token.AWAIT;\n }\n break;\n }\n case CharCode.b: {\n switch (text) {\n case \"break\": return Token.BREAK;\n }\n break;\n }\n case CharCode.c: {\n switch (text) {\n case \"case\": return Token.CASE;\n case \"catch\": return Token.CATCH;\n case \"class\": return Token.CLASS;\n case \"continue\": return Token.CONTINUE;\n case \"const\": return Token.CONST;\n case \"constructor\": return Token.CONSTRUCTOR;\n }\n break;\n }\n case CharCode.d: {\n switch (text) {\n case \"debugger\": return Token.DEBUGGER;\n case \"declare\": return Token.DECLARE;\n case \"default\": return Token.DEFAULT;\n case \"delete\": return Token.DELETE;\n case \"do\": return Token.DO;\n }\n break;\n }\n case CharCode.e: {\n switch (text) {\n case \"else\": return Token.ELSE;\n case \"enum\": return Token.ENUM;\n case \"export\": return Token.EXPORT;\n case \"extends\": return Token.EXTENDS;\n }\n break;\n }\n case CharCode.f: {\n switch (text) {\n case \"false\": return Token.FALSE;\n case \"finally\": return Token.FINALLY;\n case \"for\": return Token.FOR;\n case \"from\": return Token.FROM;\n case \"function\": return Token.FUNCTION;\n }\n break;\n }\n case CharCode.g: {\n switch (text) {\n case \"get\": return Token.GET;\n }\n break;\n }\n case CharCode.i: {\n switch (text) {\n case \"if\": return Token.IF;\n case \"implements\": return Token.IMPLEMENTS;\n case \"import\": return Token.IMPORT;\n case \"in\": return Token.IN;\n case \"instanceof\": return Token.INSTANCEOF;\n case \"interface\": return Token.INTERFACE;\n case \"is\": return Token.IS;\n }\n break;\n }\n case CharCode.k: {\n switch (text) {\n case \"keyof\": return Token.KEYOF;\n }\n break;\n }\n case CharCode.l: {\n switch (text) {\n case \"let\": return Token.LET;\n }\n break;\n }\n case CharCode.m: {\n switch (text) {\n case \"module\": return Token.MODULE;\n }\n break;\n }\n case CharCode.n: {\n switch (text) {\n case \"namespace\": return Token.NAMESPACE;\n case \"new\": return Token.NEW;\n case \"null\": return Token.NULL;\n }\n break;\n }\n case CharCode.o: {\n switch (text) {\n case \"of\": return Token.OF;\n }\n break;\n }\n case CharCode.p: {\n switch (text) {\n case \"package\": return Token.PACKAGE;\n case \"private\": return Token.PRIVATE;\n case \"protected\": return Token.PROTECTED;\n case \"public\": return Token.PUBLIC;\n }\n break;\n }\n case CharCode.r: {\n switch (text) {\n case \"readonly\": return Token.READONLY;\n case \"return\": return Token.RETURN;\n }\n break;\n }\n case CharCode.s: {\n switch (text) {\n case \"set\": return Token.SET;\n case \"static\": return Token.STATIC;\n case \"super\": return Token.SUPER;\n case \"switch\": return Token.SWITCH;\n }\n break;\n }\n case CharCode.t: {\n switch (text) {\n case \"this\": return Token.THIS;\n case \"throw\": return Token.THROW;\n case \"true\": return Token.TRUE;\n case \"try\": return Token.TRY;\n case \"type\": return Token.TYPE;\n case \"typeof\": return Token.TYPEOF;\n }\n break;\n }\n case CharCode.v: {\n switch (text) {\n case \"var\": return Token.VAR;\n case \"void\": return Token.VOID;\n }\n break;\n }\n case CharCode.w: {\n switch (text) {\n case \"while\": return Token.WHILE;\n case \"with\": return Token.WITH;\n }\n break;\n }\n case CharCode.y: {\n switch (text) {\n case \"yield\": return Token.YIELD;\n }\n break;\n }\n }\n return Token.INVALID;\n}\n\nexport function tokenIsAlsoIdentifier(token: Token): bool {\n switch (token) {\n case Token.ABSTRACT:\n case Token.AS:\n case Token.CONSTRUCTOR:\n case Token.DECLARE:\n case Token.DELETE:\n case Token.FROM:\n case Token.FOR:\n case Token.GET:\n case Token.IS:\n case Token.KEYOF:\n case Token.MODULE:\n case Token.NAMESPACE:\n case Token.READONLY:\n case Token.SET:\n case Token.TYPE:\n case Token.VOID: return true;\n default: return false;\n }\n}\n\nexport function operatorTokenToString(token: Token): string {\n switch (token) {\n case Token.DELETE: return \"delete\";\n case Token.IN: return \"in\";\n case Token.INSTANCEOF: return \"instanceof\";\n case Token.NEW: return \"new\";\n case Token.TYPEOF: return \"typeof\";\n case Token.VOID: return \"void\";\n case Token.YIELD: return \"yield\";\n case Token.DOT_DOT_DOT: return \"...\";\n case Token.COMMA: return \",\";\n case Token.LESSTHAN: return \"<\";\n case Token.GREATERTHAN: return \">\";\n case Token.LESSTHAN_EQUALS: return \"<=\";\n case Token.GREATERTHAN_EQUALS: return \">=\";\n case Token.EQUALS_EQUALS: return \"==\";\n case Token.EXCLAMATION_EQUALS: return \"!=\";\n case Token.EQUALS_EQUALS_EQUALS: return \"===\";\n case Token.EXCLAMATION_EQUALS_EQUALS: return \"!==\";\n case Token.PLUS: return \"+\";\n case Token.MINUS: return \"-\";\n case Token.ASTERISK_ASTERISK: return \"**\";\n case Token.ASTERISK: return \"*\";\n case Token.SLASH: return \"/\";\n case Token.PERCENT: return \"%\";\n case Token.PLUS_PLUS: return \"++\";\n case Token.MINUS_MINUS: return \"--\";\n case Token.LESSTHAN_LESSTHAN: return \"<<\";\n case Token.GREATERTHAN_GREATERTHAN: return \">>\";\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return \">>>\";\n case Token.AMPERSAND: return \"&\";\n case Token.BAR: return \"|\";\n case Token.CARET: return \"^\";\n case Token.EXCLAMATION: return \"!\";\n case Token.TILDE: return \"~\";\n case Token.AMPERSAND_AMPERSAND: return \"&&\";\n case Token.BAR_BAR: return \"||\";\n case Token.EQUALS: return \"=\";\n case Token.PLUS_EQUALS: return \"+=\";\n case Token.MINUS_EQUALS: return \"-=\";\n case Token.ASTERISK_EQUALS: return \"*=\";\n case Token.ASTERISK_ASTERISK_EQUALS: return \"**=\";\n case Token.SLASH_EQUALS: return \"/=\";\n case Token.PERCENT_EQUALS: return \"%=\";\n case Token.LESSTHAN_LESSTHAN_EQUALS: return \"<<=\";\n case Token.GREATERTHAN_GREATERTHAN_EQUALS: return \">>=\";\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: return \">>>=\";\n case Token.AMPERSAND_EQUALS: return \"&=\";\n case Token.BAR_EQUALS: return \"|=\";\n case Token.CARET_EQUALS: return \"^=\";\n default: {\n assert(false);\n return \"\";\n }\n }\n}\n\nexport class Range {\n\n source: Source;\n start: i32;\n end: i32;\n\n // TODO: set these while tokenizing\n // line: i32;\n // column: i32;\n\n constructor(source: Source, start: i32, end: i32) {\n this.source = source;\n this.start = start;\n this.end = end;\n }\n\n static join(a: Range, b: Range): Range {\n if (a.source != b.source) throw new Error(\"source mismatch\");\n return new Range(a.source,\n a.start < b.start ? a.start : b.start,\n a.end > b.end ? a.end : b.end\n );\n }\n\n get atStart(): Range {\n return new Range(this.source, this.start, this.start);\n }\n get atEnd(): Range {\n return new Range(this.source, this.end, this.end);\n }\n\n get line(): i32 {\n var text = this.source.text;\n var line = 1;\n for (let pos = this.start; pos >= 0; --pos) {\n if (text.charCodeAt(pos) == CharCode.LINEFEED) line++;\n }\n return line;\n }\n\n get column(): i32 {\n var text = this.source.text;\n var column = 0;\n for (let pos = this.start - 1; pos >= 0; --pos) {\n if (text.charCodeAt(pos) == CharCode.LINEFEED) break;\n ++column;\n }\n return column;\n }\n\n toString(): string {\n return this.source.text.substring(this.start, this.end);\n }\n\n debugInfoRef: usize = 0;\n}\n\ndeclare function parseFloat(str: string): f64;\n\n/** Handler for intercepting comments while tokenizing. */\nexport type CommentHandler = (kind: CommentKind, text: string, range: Range) => void;\n\n/** Tokenizes a source to individual {@link Token}s. */\nexport class Tokenizer extends DiagnosticEmitter {\n\n source: Source;\n end: i32 = 0;\n\n pos: i32 = 0;\n token: Token = -1;\n tokenPos: i32 = 0;\n\n nextToken: Token = -1;\n nextTokenPos: i32 = 0;\n nextTokenOnNewLine: bool = false;\n\n onComment: CommentHandler | null = null;\n\n /** Constructs a new tokenizer. */\n constructor(source: Source, diagnostics: DiagnosticMessage[] | null = null) {\n super(diagnostics);\n this.source = source;\n this.pos = 0;\n this.end = source.text.length;\n this.diagnostics = diagnostics ? diagnostics : new Array();\n\n var text = source.text;\n\n // skip bom\n if (\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.BYTEORDERMARK\n ) {\n ++this.pos;\n }\n\n // skip shebang\n if (\n this.pos + 1 < this.end &&\n text.charCodeAt(this.pos) == CharCode.HASH &&\n text.charCodeAt(this.pos + 1) == CharCode.EXCLAMATION\n ) {\n this.pos += 2;\n while (\n this.pos < this.end &&\n text.charCodeAt(this.pos) != CharCode.LINEFEED\n ) {\n ++this.pos;\n }\n // 'next' now starts at lf or eof\n }\n }\n\n next(identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): Token {\n this.nextToken = -1;\n return this.token = this.unsafeNext(identifierHandling);\n }\n\n private unsafeNext(\n identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\n maxTokenLength: i32 = i32.MAX_VALUE\n ): Token {\n var text = this.source.text;\n while (this.pos < this.end) {\n this.tokenPos = this.pos;\n let c = text.charCodeAt(this.pos);\n switch (c) {\n case CharCode.CARRIAGERETURN: {\n if (!(\n ++this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.LINEFEED\n )) break;\n // otherwise fall-through\n }\n case CharCode.LINEFEED:\n case CharCode.TAB:\n case CharCode.VERTICALTAB:\n case CharCode.FORMFEED:\n case CharCode.SPACE: {\n ++this.pos;\n break;\n }\n case CharCode.EXCLAMATION: {\n ++this.pos;\n if (\n maxTokenLength > 1 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n if (\n maxTokenLength > 2 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.EXCLAMATION_EQUALS_EQUALS;\n }\n return Token.EXCLAMATION_EQUALS;\n }\n return Token.EXCLAMATION;\n }\n case CharCode.DOUBLEQUOTE:\n case CharCode.SINGLEQUOTE:\n case CharCode.BACKTICK: { // TODO\n return Token.STRINGLITERAL; // expects a call to readString\n }\n case CharCode.PERCENT: {\n ++this.pos;\n if (\n maxTokenLength > 1 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.PERCENT_EQUALS;\n }\n return Token.PERCENT;\n }\n case CharCode.AMPERSAND: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.AMPERSAND) {\n ++this.pos;\n return Token.AMPERSAND_AMPERSAND;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.AMPERSAND_EQUALS;\n }\n }\n return Token.AMPERSAND;\n }\n case CharCode.OPENPAREN: {\n ++this.pos;\n return Token.OPENPAREN;\n }\n case CharCode.CLOSEPAREN: {\n ++this.pos;\n return Token.CLOSEPAREN;\n }\n case CharCode.ASTERISK: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.ASTERISK_EQUALS;\n }\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) {\n ++this.pos;\n if (\n maxTokenLength > 2 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.ASTERISK_ASTERISK_EQUALS;\n }\n return Token.ASTERISK_ASTERISK;\n }\n }\n return Token.ASTERISK;\n }\n case CharCode.PLUS: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.PLUS) {\n ++this.pos;\n return Token.PLUS_PLUS;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.PLUS_EQUALS;\n }\n }\n return Token.PLUS;\n }\n case CharCode.COMMA: {\n ++this.pos;\n return Token.COMMA;\n }\n case CharCode.MINUS: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.MINUS) {\n ++this.pos;\n return Token.MINUS_MINUS;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.MINUS_EQUALS;\n }\n }\n return Token.MINUS;\n }\n case CharCode.DOT: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (isDecimalDigit(text.charCodeAt(this.pos))) {\n --this.pos;\n return Token.FLOATLITERAL; // expects a call to readFloat\n }\n if (\n maxTokenLength > 2 && this.pos + 1 < this.end &&\n text.charCodeAt(this.pos) == CharCode.DOT &&\n text.charCodeAt(this.pos + 1) == CharCode.DOT\n ) {\n this.pos += 2;\n return Token.DOT_DOT_DOT;\n }\n }\n return Token.DOT;\n }\n case CharCode.SLASH: {\n let commentStartPos = this.pos;\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.SLASH) { // single-line\n let commentKind = CommentKind.LINE;\n if (\n this.pos + 1 < this.end &&\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\n ) {\n ++this.pos;\n commentKind = CommentKind.TRIPLE;\n }\n while (++this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.LINEFEED) {\n ++this.pos;\n break;\n }\n }\n if (this.onComment) {\n this.onComment(\n commentKind,\n text.substring(commentStartPos, this.pos),\n this.range(commentStartPos, this.pos)\n );\n }\n break;\n }\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) { // multi-line\n let closed = false;\n while (++this.pos < this.end) {\n c = text.charCodeAt(this.pos);\n if (\n c == CharCode.ASTERISK &&\n this.pos + 1 < this.end &&\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\n ) {\n this.pos += 2;\n closed = true;\n break;\n }\n }\n if (!closed) {\n this.error(\n DiagnosticCode._0_expected,\n this.range(this.pos), \"*/\"\n );\n } else if (this.onComment) {\n this.onComment(\n CommentKind.BLOCK,\n text.substring(commentStartPos, this.pos),\n this.range(commentStartPos, this.pos)\n );\n }\n break;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.SLASH_EQUALS;\n }\n }\n return Token.SLASH;\n }\n case CharCode._0:\n case CharCode._1:\n case CharCode._2:\n case CharCode._3:\n case CharCode._4:\n case CharCode._5:\n case CharCode._6:\n case CharCode._7:\n case CharCode._8:\n case CharCode._9: {\n return this.testInteger()\n ? Token.INTEGERLITERAL // expects a call to readInteger\n : Token.FLOATLITERAL; // expects a call to readFloat\n }\n case CharCode.COLON: {\n ++this.pos;\n return Token.COLON;\n }\n case CharCode.SEMICOLON: {\n ++this.pos;\n return Token.SEMICOLON;\n }\n case CharCode.LESSTHAN: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.LESSTHAN) {\n ++this.pos;\n if (\n maxTokenLength > 2 &&\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.LESSTHAN_LESSTHAN_EQUALS;\n }\n return Token.LESSTHAN_LESSTHAN;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.LESSTHAN_EQUALS;\n }\n }\n return Token.LESSTHAN;\n }\n case CharCode.EQUALS: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n if (\n maxTokenLength > 2 &&\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.EQUALS_EQUALS_EQUALS;\n }\n return Token.EQUALS_EQUALS;\n }\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\n ++this.pos;\n return Token.EQUALS_GREATERTHAN;\n }\n }\n return Token.EQUALS;\n }\n case CharCode.GREATERTHAN: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\n ++this.pos;\n if (maxTokenLength > 2 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\n ++this.pos;\n if (\n maxTokenLength > 3 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS;\n }\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.GREATERTHAN_GREATERTHAN_EQUALS;\n }\n }\n return Token.GREATERTHAN_GREATERTHAN;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.GREATERTHAN_EQUALS;\n }\n }\n return Token.GREATERTHAN;\n }\n case CharCode.QUESTION: {\n ++this.pos;\n return Token.QUESTION;\n }\n case CharCode.OPENBRACKET: {\n ++this.pos;\n return Token.OPENBRACKET;\n }\n case CharCode.CLOSEBRACKET: {\n ++this.pos;\n return Token.CLOSEBRACKET;\n }\n case CharCode.CARET: {\n ++this.pos;\n if (\n maxTokenLength > 1 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.CARET_EQUALS;\n }\n return Token.CARET;\n }\n case CharCode.OPENBRACE: {\n ++this.pos;\n return Token.OPENBRACE;\n }\n case CharCode.BAR: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.BAR) {\n ++this.pos;\n return Token.BAR_BAR;\n }\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\n ++this.pos;\n return Token.BAR_EQUALS;\n }\n }\n return Token.BAR;\n }\n case CharCode.CLOSEBRACE: {\n ++this.pos;\n return Token.CLOSEBRACE;\n }\n case CharCode.TILDE: {\n ++this.pos;\n return Token.TILDE;\n }\n case CharCode.AT: {\n ++this.pos;\n return Token.AT;\n }\n default: {\n if (isIdentifierStart(c)) {\n if (isKeywordCharacter(c)) {\n let posBefore = this.pos;\n while (\n ++this.pos < this.end &&\n isIdentifierPart(c = text.charCodeAt(this.pos))\n ) {\n if (!isKeywordCharacter(c)) {\n this.pos = posBefore;\n return Token.IDENTIFIER;\n }\n }\n let keywordText = text.substring(posBefore, this.pos);\n let keywordToken = tokenFromKeyword(keywordText);\n if (\n keywordToken != Token.INVALID &&\n identifierHandling !== IdentifierHandling.ALWAYS &&\n !(\n identifierHandling === IdentifierHandling.PREFER &&\n tokenIsAlsoIdentifier(keywordToken)\n )\n ) {\n return keywordToken;\n }\n this.pos = posBefore;\n }\n return Token.IDENTIFIER; // expects a call to readIdentifier\n } else if (isWhiteSpace(c)) {\n ++this.pos;\n break;\n }\n this.error(\n DiagnosticCode.Invalid_character,\n this.range(this.pos, this.pos + 1)\n );\n ++this.pos;\n return Token.INVALID;\n }\n }\n }\n return Token.ENDOFFILE;\n }\n\n peek(\n checkOnNewLine: bool = false,\n identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\n maxCompoundLength: i32 = i32.MAX_VALUE\n ): Token {\n var text = this.source.text;\n if (this.nextToken < 0) {\n let posBefore = this.pos;\n let tokenBefore = this.token;\n let tokenPosBefore = this.tokenPos;\n this.nextToken = this.unsafeNext(identifierHandling, maxCompoundLength);\n this.nextTokenPos = this.tokenPos;\n if (checkOnNewLine) {\n this.nextTokenOnNewLine = false;\n for (let pos = posBefore, end = this.nextTokenPos; pos < end; ++pos) {\n if (isLineBreak(text.charCodeAt(pos))) {\n this.nextTokenOnNewLine = true;\n break;\n }\n }\n }\n this.pos = posBefore;\n this.token = tokenBefore;\n this.tokenPos = tokenPosBefore;\n }\n return this.nextToken;\n }\n\n skipIdentifier(identifierHandling: IdentifierHandling = IdentifierHandling.PREFER): bool {\n return this.skip(Token.IDENTIFIER, identifierHandling);\n }\n\n skip(token: Token, identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): bool {\n var posBefore = this.pos;\n var tokenBefore = this.token;\n var tokenPosBefore = this.tokenPos;\n var maxCompoundLength = i32.MAX_VALUE;\n switch (token) {\n case Token.GREATERTHAN: { // where parsing type arguments\n maxCompoundLength = 1;\n break;\n }\n }\n this.token = this.unsafeNext(identifierHandling, maxCompoundLength);\n if (this.token == token) {\n this.nextToken = -1;\n return true;\n } else {\n this.pos = posBefore;\n this.token = tokenBefore;\n this.tokenPos = tokenPosBefore;\n return false;\n }\n }\n\n mark(): State {\n var state: State;\n if (reusableState) {\n state = reusableState;\n reusableState = null;\n } else {\n state = new State();\n }\n state.pos = this.pos;\n state.token = this.token;\n state.tokenPos = this.tokenPos;\n return state;\n }\n\n discard(state: State): void {\n reusableState = state;\n }\n\n reset(state: State): void {\n this.pos = state.pos;\n this.token = state.token;\n this.tokenPos = state.tokenPos;\n this.nextToken = -1;\n }\n\n range(start: i32 = -1, end: i32 = -1): Range {\n if (start < 0) {\n start = this.tokenPos;\n end = this.pos;\n } else if (end < 0) {\n end = start;\n }\n return new Range(this.source, start, end);\n }\n\n readIdentifier(): string {\n var text = this.source.text;\n var start = this.pos;\n while (\n ++this.pos < this.end &&\n isIdentifierPart(text.charCodeAt(this.pos))\n );\n return text.substring(start, this.pos);\n }\n\n readString(): string {\n var text = this.source.text;\n var quote = text.charCodeAt(this.pos++);\n var start = this.pos;\n var result = \"\";\n while (true) {\n if (this.pos >= this.end) {\n result += text.substring(start, this.pos);\n this.error(\n DiagnosticCode.Unterminated_string_literal,\n this.range(start - 1, this.end)\n );\n break;\n }\n let c = text.charCodeAt(this.pos);\n if (c == quote) {\n result += text.substring(start, this.pos++);\n break;\n }\n if (c == CharCode.BACKSLASH) {\n result += text.substring(start, this.pos);\n result += this.readEscapeSequence();\n start = this.pos;\n continue;\n }\n if (isLineBreak(c)) {\n result += text.substring(start, this.pos);\n this.error(\n DiagnosticCode.Unterminated_string_literal,\n this.range(start - 1, this.pos)\n );\n break;\n }\n ++this.pos;\n }\n return result;\n }\n\n readEscapeSequence(): string {\n if (++this.pos >= this.end) {\n this.error(\n DiagnosticCode.Unexpected_end_of_text,\n this.range(this.end)\n );\n return \"\";\n }\n\n var text = this.source.text;\n var c = text.charCodeAt(this.pos++);\n switch (c) {\n case CharCode._0: return \"\\0\";\n case CharCode.b: return \"\\b\";\n case CharCode.t: return \"\\t\";\n case CharCode.n: return \"\\n\";\n case CharCode.v: return \"\\v\";\n case CharCode.f: return \"\\f\";\n case CharCode.r: return \"\\r\";\n case CharCode.SINGLEQUOTE: return \"'\";\n case CharCode.DOUBLEQUOTE: return \"\\\"\";\n case CharCode.u: {\n if (\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.OPENBRACE\n ) {\n ++this.pos;\n return this.readExtendedUnicodeEscape(); // \\u{DDDDDDDD}\n }\n return this.readUnicodeEscape(); // \\uDDDD\n }\n case CharCode.CARRIAGERETURN: {\n if (\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.LINEFEED\n ) {\n ++this.pos;\n }\n // fall through\n }\n case CharCode.LINEFEED:\n case CharCode.LINESEPARATOR:\n case CharCode.PARAGRAPHSEPARATOR: return \"\";\n default: return String.fromCharCode(c);\n }\n }\n\n readRegexpPattern(): string {\n var text = this.source.text;\n var start = this.pos;\n var escaped = false;\n while (true) {\n if (this.pos >= this.end) {\n this.error(\n DiagnosticCode.Unterminated_regular_expression_literal,\n this.range(start, this.end)\n );\n break;\n }\n if (text.charCodeAt(this.pos) == CharCode.BACKSLASH) {\n ++this.pos;\n escaped = true;\n continue;\n }\n let c = text.charCodeAt(this.pos);\n if (c == CharCode.SLASH && !escaped) break;\n if (isLineBreak(c)) {\n this.error(\n DiagnosticCode.Unterminated_regular_expression_literal,\n this.range(start, this.pos)\n );\n break;\n }\n ++this.pos;\n escaped = false;\n }\n return text.substring(start, this.pos);\n }\n\n readRegexpFlags(): string {\n var text = this.source.text;\n var start = this.pos;\n var flags = 0;\n while (this.pos < this.end) {\n let c: i32 = text.charCodeAt(this.pos);\n if (!isIdentifierPart(c)) break;\n ++this.pos;\n\n // make sure each supported flag is unique\n switch (c) {\n case CharCode.g: {\n flags |= flags & 1 ? -1 : 1;\n break;\n }\n case CharCode.i: {\n flags |= flags & 2 ? -1 : 2;\n break;\n }\n case CharCode.m: {\n flags |= flags & 4 ? -1 : 4;\n break;\n }\n default: {\n flags = -1;\n break;\n }\n }\n }\n if (flags == -1) {\n this.error(\n DiagnosticCode.Invalid_regular_expression_flags,\n this.range(start, this.pos)\n );\n }\n return text.substring(start, this.pos);\n }\n\n testInteger(): bool {\n var text = this.source.text;\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 1 < this.end) {\n switch (text.charCodeAt(this.pos + 2)) {\n case CharCode.X:\n case CharCode.x:\n case CharCode.B:\n case CharCode.b:\n case CharCode.O:\n case CharCode.o: return true;\n }\n }\n var pos = this.pos;\n while (pos < this.end) {\n let c = text.charCodeAt(pos);\n if (c == CharCode.DOT || c == CharCode.E || c == CharCode.e) {\n return false;\n }\n if ((c < CharCode._0 || c > CharCode._9) && c != CharCode._) break;\n // does not validate separator placement (this is done in readXYInteger)\n pos++;\n }\n return true;\n }\n\n readInteger(): I64 {\n var text = this.source.text;\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\n switch (text.charCodeAt(this.pos + 1)) {\n case CharCode.X:\n case CharCode.x: {\n this.pos += 2;\n return this.readHexInteger();\n }\n case CharCode.B:\n case CharCode.b: {\n this.pos += 2;\n return this.readBinaryInteger();\n }\n case CharCode.O:\n case CharCode.o: {\n this.pos += 2;\n return this.readOctalInteger();\n }\n }\n if (isOctalDigit(text.charCodeAt(this.pos + 1))) {\n let start = this.pos;\n ++this.pos;\n let value = this.readOctalInteger();\n this.error(\n DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode,\n this.range(start, this.pos)\n );\n return value;\n }\n }\n return this.readDecimalInteger();\n }\n\n readHexInteger(): I64 {\n var text = this.source.text;\n var start = this.pos;\n var value = i64_new(0, 0);\n var i64_16 = i64_new(16, 0);\n var sepEnd = start;\n while (this.pos < this.end) {\n let pos = this.pos;\n let c = text.charCodeAt(pos);\n if (c >= CharCode._0 && c <= CharCode._9) {\n // value = value * 16 + c - CharCode._0;\n value = i64_add(\n i64_mul(value, i64_16),\n i64_new(c - CharCode._0, 0)\n );\n } else if (c >= CharCode.A && c <= CharCode.F) {\n // value = value * 16 + 10 + c - CharCode.A;\n value = i64_add(\n i64_mul(value, i64_16),\n i64_new(10 + c - CharCode.A, 0)\n );\n } else if (c >= CharCode.a && c <= CharCode.f) {\n // value = value * 16 + 10 + c - CharCode.a;\n value = i64_add(\n i64_mul(value, i64_16),\n i64_new(10 + c - CharCode.a, 0)\n );\n } else if (c == CharCode._) {\n if (sepEnd == pos) {\n this.error(\n sepEnd == start\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\n this.range(pos)\n );\n }\n sepEnd = pos + 1;\n } else {\n break;\n }\n this.pos = pos + 1;\n }\n if (this.pos == start) {\n this.error(\n DiagnosticCode.Hexadecimal_digit_expected,\n this.range(start)\n );\n } else if (sepEnd == this.pos) {\n this.error(\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\n this.range(sepEnd - 1)\n );\n }\n return value;\n }\n\n readDecimalInteger(): I64 {\n var text = this.source.text;\n var start = this.pos;\n var value = i64_new(0, 0);\n var i64_10 = i64_new(10, 0);\n var sepEnd = start;\n while (this.pos < this.end) {\n let pos = this.pos;\n let c = text.charCodeAt(pos);\n if (c >= CharCode._0 && c <= CharCode._9) {\n // value = value * 10 + c - CharCode._0;\n value = i64_add(\n i64_mul(value, i64_10),\n i64_new(c - CharCode._0, 0)\n );\n } else if (c == CharCode._) {\n if (sepEnd == pos) {\n this.error(\n sepEnd == start\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\n this.range(pos)\n );\n }\n sepEnd = pos + 1;\n } else {\n break;\n }\n this.pos = pos + 1;\n }\n if (this.pos == start) {\n this.error(\n DiagnosticCode.Digit_expected,\n this.range(start)\n );\n } else if (sepEnd == this.pos) {\n this.error(\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\n this.range(sepEnd - 1)\n );\n }\n return value;\n }\n\n readOctalInteger(): I64 {\n var text = this.source.text;\n var start = this.pos;\n var value = i64_new(0, 0);\n var i64_8 = i64_new(8, 0);\n var sepEnd = start;\n while (this.pos < this.end) {\n let pos = this.pos;\n let c = text.charCodeAt(pos);\n if (c >= CharCode._0 && c <= CharCode._7) {\n // value = value * 8 + c - CharCode._0;\n value = i64_add(\n i64_mul(value, i64_8),\n i64_new(c - CharCode._0, 0)\n );\n } else if (c == CharCode._) {\n if (sepEnd == pos) {\n this.error(\n sepEnd == start\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\n this.range(pos)\n );\n }\n sepEnd = pos + 1;\n } else {\n break;\n }\n ++this.pos;\n }\n if (this.pos == start) {\n this.error(\n DiagnosticCode.Octal_digit_expected,\n this.range(start)\n );\n } else if (sepEnd == this.pos) {\n this.error(\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\n this.range(sepEnd - 1)\n );\n }\n return value;\n }\n\n readBinaryInteger(): I64 {\n var text = this.source.text;\n var start = this.pos;\n var value = i64_new(0, 0);\n var i64_2 = i64_new(2, 0);\n var i64_1 = i64_new(1, 0);\n var sepEnd = start;\n while (this.pos < this.end) {\n let pos = this.pos;\n let c = text.charCodeAt(pos);\n if (c == CharCode._0) {\n // value = value * 2;\n value = i64_mul(\n value,\n i64_2\n );\n } else if (c == CharCode._1) {\n // value = value * 2 + 1;\n value = i64_add(\n i64_mul(value, i64_2),\n i64_1\n );\n } else if (c == CharCode._) {\n if (sepEnd == pos) {\n this.error(\n sepEnd == start\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\n this.range(pos)\n );\n }\n sepEnd = pos + 1;\n } else {\n break;\n }\n this.pos = pos + 1;\n }\n if (this.pos == start) {\n this.error(\n DiagnosticCode.Binary_digit_expected,\n this.range(start)\n );\n } else if (sepEnd == this.pos) {\n this.error(\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\n this.range(sepEnd - 1)\n );\n }\n return value;\n }\n\n readFloat(): f64 {\n // var text = this.source.text;\n // if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\n // switch (text.charCodeAt(this.pos + 1)) {\n // case CharCode.X:\n // case CharCode.x: {\n // this.pos += 2;\n // return this.readHexFloat();\n // }\n // }\n // }\n return this.readDecimalFloat();\n }\n\n readDecimalFloat(): f64 {\n // TODO: numeric separators (parseFloat can't handle these)\n var start = this.pos;\n var text = this.source.text;\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\n ++this.pos;\n }\n if (this.pos < this.end && text.charCodeAt(this.pos) == CharCode.DOT) {\n ++this.pos;\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\n ++this.pos;\n }\n }\n if (this.pos < this.end) {\n let c = text.charCodeAt(this.pos);\n if (c == CharCode.E || c == CharCode.e) {\n if (\n ++this.pos < this.end && (\n text.charCodeAt(this.pos) == CharCode.MINUS ||\n text.charCodeAt(this.pos) == CharCode.PLUS\n ) &&\n isDecimalDigit(text.charCodeAt(this.pos + 1))\n ) {\n ++this.pos;\n }\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\n ++this.pos;\n }\n }\n }\n return parseFloat(text.substring(start, this.pos));\n }\n\n readHexFloat(): f64 {\n throw new Error(\"not implemented\"); // TBD\n }\n\n readUnicodeEscape(): string {\n var remain = 4;\n var value = 0;\n var text = this.source.text;\n while (this.pos < this.end) {\n let c = text.charCodeAt(this.pos++);\n if (c >= CharCode._0 && c <= CharCode._9) {\n value = value * 16 + c - CharCode._0;\n } else if (c >= CharCode.A && c <= CharCode.F) {\n value = value * 16 + 10 + c - CharCode.A;\n } else if (c >= CharCode.a && c <= CharCode.f) {\n value = value * 16 + 10 + c - CharCode.a;\n } else {\n this.error(\n DiagnosticCode.Hexadecimal_digit_expected,\n this.range(this.pos - 1, this.pos)\n );\n return \"\";\n }\n if (--remain == 0) break;\n }\n if (remain) {\n this.error(\n DiagnosticCode.Unexpected_end_of_text,\n this.range(this.pos)\n );\n return \"\";\n }\n return String.fromCharCode(value);\n }\n\n private readExtendedUnicodeEscape(): string {\n var start = this.pos;\n var value = this.readHexInteger();\n var value32 = i64_low(value);\n var invalid = false;\n\n assert(!i64_high(value));\n if (value32 > 0x10FFFF) {\n this.error(\n DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,\n this.range(start, this.pos)\n );\n invalid = true;\n }\n\n var text = this.source.text;\n if (this.pos >= this.end) {\n this.error(\n DiagnosticCode.Unexpected_end_of_text,\n this.range(start, this.end)\n );\n invalid = true;\n } else if (text.charCodeAt(this.pos) == CharCode.CLOSEBRACE) {\n ++this.pos;\n } else {\n this.error(\n DiagnosticCode.Unterminated_Unicode_escape_sequence,\n this.range(start, this.pos)\n );\n invalid = true;\n }\n\n if (invalid) return \"\";\n return value32 < 65536\n ? String.fromCharCode(value32)\n : String.fromCharCode(\n (((value32 - 65536) / 1024 | 0) + 0xD800) as i32,\n ( (value32 - 65536) % 1024 + 0xDC00) as i32\n );\n }\n\n finish(): void {\n }\n}\n\n/** Tokenizer state as returned by {@link Tokenizer#mark} and consumed by {@link Tokenizer#reset}. */\nexport class State {\n /** Current position. */\n pos: i32;\n /** Current token. */\n token: Token;\n /** Current token's position. */\n tokenPos: i32;\n}\n\n// Reusable state object to reduce allocations\nvar reusableState: State | null = null;\n","/**\n * Mappings from AssemblyScript types to WebAssembly types.\n * @module types\n *//***/\n\nimport {\n Class,\n FunctionTarget,\n Program,\n DecoratorFlags\n} from \"./program\";\n\nimport {\n NativeType,\n ExpressionRef,\n Module\n} from \"./module\";\n\n/** Indicates the kind of a type. */\nexport const enum TypeKind {\n\n // signed integers\n\n /** An 8-bit signed integer. */\n I8,\n /** A 16-bit signed integer. */\n I16,\n /** A 32-bit signed integer. */\n I32,\n /** A 64-bit signed integer. */\n I64,\n /** A 32-bit/64-bit signed integer, depending on the target. */\n ISIZE,\n\n // unsigned integers\n\n /** An 8-bit unsigned integer. */\n U8,\n /** A 16-bit unsigned integer. */\n U16,\n /** A 32-bit unsigned integer. Also the base of function types. */\n U32,\n /** A 64-bit unsigned integer. */\n U64,\n /** A 32-bit/64-bit unsigned integer, depending on the target. Also the base of class types. */\n USIZE,\n /** A 1-bit unsigned integer. */\n BOOL, // sic\n\n // floats\n\n /** A 32-bit float. */\n F32,\n /** A 64-bit double. */\n F64,\n\n // vectors\n V128,\n\n // other\n\n /** No return type. */\n VOID\n}\n\n/** Indicates capabilities of a type. */\nexport const enum TypeFlags {\n NONE = 0,\n /** Is a signed type that can represent negative values. */\n SIGNED = 1 << 0,\n /** Is an unsigned type that cannot represent negative values. */\n UNSIGNED = 1 << 1,\n /** Is an integer type. */\n INTEGER = 1 << 2,\n /** Is a floating point type. */\n FLOAT = 1 << 3,\n /** Is a pointer type. */\n POINTER = 1 << 4,\n /** Is smaller than 32-bits. */\n SHORT = 1 << 5,\n /** Is larger than 32-bits. */\n LONG = 1 << 6,\n /** Is a value type. */\n VALUE = 1 << 7,\n /** Is a reference type. */\n REFERENCE = 1 << 8,\n /** Is a nullable type. */\n NULLABLE = 1 << 9,\n /** Is a vector type. */\n VECTOR = 1 << 10\n}\n\nconst v128_zero = new Uint8Array(16);\n\n/** Represents a resolved type. */\nexport class Type {\n\n /** Type kind. */\n kind: TypeKind;\n /** Type flags. */\n flags: TypeFlags;\n /** Size in bits. */\n size: u32;\n /** Size in bytes. */\n byteSize: i32;\n /** Underlying class reference, if a class type. */\n classReference: Class | null;\n /** Underlying signature reference, if a function type. */\n signatureReference: Signature | null;\n /** Respective non-nullable type, if nullable. */\n nonNullableType: Type;\n /** Cached nullable type, if non-nullable. */\n private cachedNullableType: Type | null = null;\n\n /** Constructs a new resolved type. */\n constructor(kind: TypeKind, flags: TypeFlags, size: u32) {\n this.kind = kind;\n this.flags = flags;\n this.size = size;\n this.byteSize = ceil(size / 8);\n this.classReference = null;\n this.signatureReference = null;\n this.nonNullableType = this;\n }\n\n /** Returns the closest int type representing this type. */\n get intType(): Type {\n switch (this.kind) {\n case TypeKind.I8: return Type.i8;\n case TypeKind.I16: return Type.i16;\n case TypeKind.F32:\n case TypeKind.I32: return Type.i32;\n case TypeKind.F64:\n case TypeKind.I64: return Type.i64;\n case TypeKind.ISIZE: return this.size == 64 ? Type.isize64 : Type.isize32;\n case TypeKind.U8: return Type.u8;\n case TypeKind.U16: return Type.u16;\n case TypeKind.U32: return Type.u32;\n case TypeKind.U64: return Type.u64;\n case TypeKind.USIZE: return this.size == 64 ? Type.usize64 : Type.usize32;\n case TypeKind.BOOL:\n default: return Type.i32;\n }\n }\n\n /** Tests if this is a managed type that needs GC hooks. */\n isManaged(program: Program): bool {\n if (program.hasGC) {\n let classReference = this.classReference;\n return classReference !== null && !classReference.hasDecorator(DecoratorFlags.UNMANAGED);\n }\n return false;\n }\n\n /** Computes the sign-extending shift in the target type. */\n computeSmallIntegerShift(targetType: Type): u32 {\n return targetType.size - this.size;\n }\n\n /** Computes the truncating mask in the target type. */\n computeSmallIntegerMask(targetType: Type): u32 {\n var size = this.is(TypeFlags.UNSIGNED) ? this.size : this.size - 1;\n return ~0 >>> (targetType.size - size);\n }\n\n /** Tests if this type has (all of) the specified flags. */\n is(flags: TypeFlags): bool { return (this.flags & flags) == flags; }\n /** Tests if this type has any of the specified flags. */\n isAny(flags: TypeFlags): bool { return (this.flags & flags) != 0; }\n\n /** Composes a class type from this type and a class. */\n asClass(classType: Class): Type {\n assert(this.kind == TypeKind.USIZE && !this.classReference);\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\n ret.classReference = classType;\n return ret;\n }\n\n /** Composes a function type from this type and a function. */\n asFunction(signature: Signature): Type {\n assert(this.kind == TypeKind.U32 && !this.signatureReference);\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\n ret.signatureReference = signature;\n return ret;\n }\n\n /** Composes the respective nullable type of this type. */\n asNullable(): Type {\n assert(this.is(TypeFlags.REFERENCE));\n if (!this.cachedNullableType) {\n assert(!this.is(TypeFlags.NULLABLE));\n this.cachedNullableType = new Type(this.kind, this.flags | TypeFlags.NULLABLE, this.size);\n this.cachedNullableType.nonNullableType = this;\n this.cachedNullableType.classReference = this.classReference; // either a class reference\n this.cachedNullableType.signatureReference = this.signatureReference; // or a function reference\n }\n return this.cachedNullableType;\n }\n\n /** Tests if a value of this type is assignable to a target of the specified type. */\n isAssignableTo(target: Type, signednessIsRelevant: bool = false): bool {\n var currentClass: Class | null;\n var targetClass: Class | null;\n var currentFunction: Signature | null;\n var targetFunction: Signature | null;\n if (this.is(TypeFlags.REFERENCE)) {\n if (target.is(TypeFlags.REFERENCE)) {\n if (!this.is(TypeFlags.NULLABLE) || target.is(TypeFlags.NULLABLE)) {\n if (currentClass = this.classReference) {\n if (targetClass = target.classReference) {\n return currentClass.isAssignableTo(targetClass);\n }\n } else if (currentFunction = this.signatureReference) {\n if (targetFunction = target.signatureReference) {\n return currentFunction.isAssignableTo(targetFunction);\n }\n }\n }\n }\n } else if (!target.is(TypeFlags.REFERENCE)) {\n if (this.is(TypeFlags.INTEGER)) {\n if (target.is(TypeFlags.INTEGER)) {\n if (\n !signednessIsRelevant ||\n this == Type.bool || // a bool (0 or 1) can be safely assigned to all sorts of integers\n this.is(TypeFlags.SIGNED) == target.is(TypeFlags.SIGNED)\n ) {\n return this.size <= target.size;\n }\n } else if (target.kind == TypeKind.F32) {\n return this.size <= 23; // mantissa bits\n } else if (target.kind == TypeKind.F64) {\n return this.size <= 52; // ^\n }\n } else if (this.is(TypeFlags.FLOAT)) {\n if (target.is(TypeFlags.FLOAT)) {\n return this.size <= target.size;\n }\n } else if (this.is(TypeFlags.VECTOR)) {\n if (target.is(TypeFlags.VECTOR)) {\n return this.size == target.size;\n }\n }\n }\n return false;\n }\n\n /** Determines the common compatible type of two types, if any. */\n static commonCompatible(left: Type, right: Type, signednessIsImportant: bool): Type | null {\n if (right.isAssignableTo(left, signednessIsImportant)) return left;\n else if (left.isAssignableTo(right, signednessIsImportant)) return right;\n return null;\n }\n\n /** Converts this type to its TypeScript representation. */\n toString(kindOnly: bool = false): string {\n if (!kindOnly && this.is(TypeFlags.REFERENCE)) {\n let classReference = this.classReference;\n if (classReference) {\n return this.is(TypeFlags.NULLABLE)\n ? classReference.toString() + \" | null\"\n : classReference.toString();\n }\n let signatureReference = this.signatureReference;\n if (signatureReference) {\n return this.is(TypeFlags.NULLABLE)\n ? \"(\" + signatureReference.toString(true) + \") | null\"\n : signatureReference.toString(true);\n }\n assert(false);\n }\n switch (this.kind) {\n case TypeKind.I8: return \"i8\";\n case TypeKind.I16: return \"i16\";\n case TypeKind.I32: return \"i32\";\n case TypeKind.I64: return \"i64\";\n case TypeKind.ISIZE: return \"isize\";\n case TypeKind.U8: return \"u8\";\n case TypeKind.U16: return \"u16\";\n case TypeKind.U32: return \"u32\";\n case TypeKind.U64: return \"u64\";\n case TypeKind.USIZE: return \"usize\";\n case TypeKind.BOOL: return \"bool\";\n case TypeKind.F32: return \"f32\";\n case TypeKind.F64: return \"f64\";\n case TypeKind.V128: return \"v128\";\n default: assert(false);\n case TypeKind.VOID: return \"void\";\n }\n }\n\n // Binaryen specific\n\n /** Converts this type to its respective native type. */\n toNativeType(): NativeType {\n switch (this.kind) {\n default: return NativeType.I32;\n case TypeKind.I64:\n case TypeKind.U64: return NativeType.I64;\n case TypeKind.ISIZE:\n case TypeKind.USIZE: return this.size == 64 ? NativeType.I64 : NativeType.I32;\n case TypeKind.F32: return NativeType.F32;\n case TypeKind.F64: return NativeType.F64;\n case TypeKind.V128: return NativeType.V128;\n case TypeKind.VOID: return NativeType.None;\n }\n }\n\n /** Converts this type to its native `0` value. */\n toNativeZero(module: Module): ExpressionRef {\n switch (this.kind) {\n case TypeKind.VOID: assert(false);\n default: return module.createI32(0);\n case TypeKind.ISIZE:\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(0);\n case TypeKind.I64:\n case TypeKind.U64: return module.createI64(0);\n case TypeKind.F32: return module.createF32(0);\n case TypeKind.F64: return module.createF64(0);\n case TypeKind.V128: return module.createV128(v128_zero);\n }\n }\n\n /** Converts this type to its native `1` value. */\n toNativeOne(module: Module): ExpressionRef {\n switch (this.kind) {\n case TypeKind.V128:\n case TypeKind.VOID: assert(false);\n default: return module.createI32(1);\n case TypeKind.ISIZE:\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(1);\n case TypeKind.I64:\n case TypeKind.U64: return module.createI64(1);\n case TypeKind.F32: return module.createF32(1);\n case TypeKind.F64: return module.createF64(1);\n }\n }\n\n /** Converts this type to its native `-1` value. */\n toNativeNegOne(module: Module): ExpressionRef {\n switch (this.kind) {\n case TypeKind.V128:\n case TypeKind.VOID: assert(false);\n default: return module.createI32(-1);\n case TypeKind.ISIZE:\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(-1);\n case TypeKind.I64:\n case TypeKind.U64: return module.createI64(-1, -1);\n case TypeKind.F32: return module.createF32(-1);\n case TypeKind.F64: return module.createF64(-1);\n }\n }\n\n /** Converts this type to its signature string. */\n toSignatureString(): string {\n switch (this.kind) {\n default: return \"i\";\n case TypeKind.I64:\n case TypeKind.U64: return \"I\";\n case TypeKind.ISIZE:\n case TypeKind.USIZE: return this.size == 64 ? \"I\" : \"i\";\n case TypeKind.F32: return \"f\";\n case TypeKind.F64: return \"F\";\n case TypeKind.V128: return \"v\";\n case TypeKind.VOID: return \"_\";\n }\n }\n\n // Types\n\n /** An 8-bit signed integer. */\n static readonly i8: Type = new Type(TypeKind.I8,\n TypeFlags.SIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 8\n );\n\n /** A 16-bit signed integer. */\n static readonly i16: Type = new Type(TypeKind.I16,\n TypeFlags.SIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 16\n );\n\n /** A 32-bit signed integer. */\n static readonly i32: Type = new Type(TypeKind.I32,\n TypeFlags.SIGNED |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit signed integer. */\n static readonly i64: Type = new Type(TypeKind.I64,\n TypeFlags.SIGNED |\n TypeFlags.LONG |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 64\n );\n\n /** A 32-bit signed size. WASM32 only. */\n static readonly isize32: Type = new Type(TypeKind.ISIZE,\n TypeFlags.SIGNED |\n TypeFlags.INTEGER |\n TypeFlags.POINTER |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit signed size. WASM64 only. */\n static readonly isize64: Type = new Type(TypeKind.ISIZE,\n TypeFlags.SIGNED |\n TypeFlags.LONG |\n TypeFlags.INTEGER |\n TypeFlags.POINTER |\n TypeFlags.VALUE, 64\n );\n\n /** An 8-bit unsigned integer. */\n static readonly u8: Type = new Type(TypeKind.U8,\n TypeFlags.UNSIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 8\n );\n\n /** A 16-bit unsigned integer. */\n static readonly u16: Type = new Type(TypeKind.U16,\n TypeFlags.UNSIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 16\n );\n\n /** A 32-bit unsigned integer. */\n static readonly u32: Type = new Type(TypeKind.U32,\n TypeFlags.UNSIGNED |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit unsigned integer. */\n static readonly u64: Type = new Type(TypeKind.U64,\n TypeFlags.UNSIGNED |\n TypeFlags.LONG |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 64\n );\n\n /** A 32-bit unsigned size. WASM32 only. */\n static readonly usize32: Type = new Type(TypeKind.USIZE,\n TypeFlags.UNSIGNED |\n TypeFlags.INTEGER |\n TypeFlags.POINTER |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit unsigned size. WASM64 only. */\n static readonly usize64: Type = new Type(TypeKind.USIZE,\n TypeFlags.UNSIGNED |\n TypeFlags.LONG |\n TypeFlags.INTEGER |\n TypeFlags.POINTER |\n TypeFlags.VALUE, 64\n );\n\n /** A 1-bit unsigned integer. */\n static readonly bool: Type = new Type(TypeKind.BOOL,\n TypeFlags.UNSIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 1\n );\n\n /** A 32-bit float. */\n static readonly f32: Type = new Type(TypeKind.F32,\n TypeFlags.SIGNED |\n TypeFlags.FLOAT |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit float. */\n static readonly f64: Type = new Type(TypeKind.F64,\n TypeFlags.SIGNED |\n TypeFlags.LONG |\n TypeFlags.FLOAT |\n TypeFlags.VALUE, 64\n );\n\n /** A 128-bit vector. */\n static readonly v128: Type = new Type(TypeKind.V128,\n TypeFlags.VECTOR |\n TypeFlags.VALUE, 128\n );\n\n /** No return type. */\n static readonly void: Type = new Type(TypeKind.VOID, TypeFlags.NONE, 0);\n}\n\n/** Converts an array of types to an array of native types. */\nexport function typesToNativeTypes(types: Type[]): NativeType[] {\n var numTypes = types.length;\n var ret = new Array(numTypes);\n for (let i = 0; i < numTypes; ++i) ret[i] = types[i].toNativeType();\n return ret;\n}\n\n/** Converts an array of types to its combined string representation. */\nexport function typesToString(types: Type[]): string {\n var numTypes = types.length;\n if (!numTypes) return \"\";\n var sb = new Array(numTypes);\n for (let i = 0; i < numTypes; ++i) sb[i] = types[i].toString();\n return sb.join(\",\");\n}\n\n/** Represents a fully resolved function signature. */\nexport class Signature {\n\n /** Parameter types, if any, excluding `this`. */\n parameterTypes: Type[];\n /** Parameter names, if known, excluding `this`. */\n parameterNames: string[] | null;\n /** Number of required parameters excluding `this`. Other parameters are considered optional. */\n requiredParameters: i32;\n /** Return type. */\n returnType: Type;\n /** This type, if an instance signature. */\n thisType: Type | null;\n /** Whether the last parameter is a rest parameter. */\n hasRest: bool;\n /** Cached {@link FunctionTarget}. */\n cachedFunctionTarget: FunctionTarget | null = null;\n /** Respective function type. */\n type: Type;\n\n /** Constructs a new signature. */\n constructor(\n parameterTypes: Type[] | null = null,\n returnType: Type | null = null,\n thisType: Type | null = null\n ) {\n this.parameterTypes = parameterTypes ? parameterTypes : [];\n this.parameterNames = null;\n this.requiredParameters = 0;\n this.returnType = returnType ? returnType : Type.void;\n this.thisType = thisType;\n this.hasRest = false;\n this.type = Type.u32.asFunction(this);\n }\n\n asFunctionTarget(program: Program): FunctionTarget {\n var target = this.cachedFunctionTarget;\n if (!target) this.cachedFunctionTarget = target = new FunctionTarget(program, this);\n else assert(target.program == program);\n return target;\n }\n\n /** Gets the known or, alternatively, generic parameter name at the specified index. */\n getParameterName(index: i32): string {\n var parameterNames = this.parameterNames;\n return parameterNames && parameterNames.length > index\n ? parameterNames[index]\n : getDefaultParameterName(index);\n }\n\n /** Tests if a value of this function type is assignable to a target of the specified function type. */\n isAssignableTo(target: Signature): bool {\n // TODO: maybe cache results?\n\n // check `this` type\n var thisThisType = this.thisType;\n var targetThisType = target.thisType;\n if (thisThisType) {\n if (!(targetThisType && thisThisType.isAssignableTo(targetThisType))) return false;\n } else if (targetThisType) {\n return false;\n }\n\n // check rest parameter\n if (this.hasRest != target.hasRest) return false; // TODO\n\n // check parameter types\n var thisParameterTypes = this.parameterTypes;\n var targetParameterTypes = target.parameterTypes;\n var numParameters = thisParameterTypes.length;\n if (numParameters != targetParameterTypes.length) return false;\n for (let i = 0; i < numParameters; ++i) {\n let thisParameterType = thisParameterTypes[i];\n let targetParameterType = targetParameterTypes[i];\n if (!thisParameterType.isAssignableTo(targetParameterType)) return false;\n }\n\n // check return type\n var thisReturnType = this.returnType;\n var targetReturnType = target.returnType;\n return thisReturnType == targetReturnType || thisReturnType.isAssignableTo(targetReturnType);\n }\n\n /** Converts a signature to a function type string. */\n static makeSignatureString(parameterTypes: Type[] | null, returnType: Type, thisType: Type | null = null): string {\n var sb = [];\n if (thisType) sb.push(thisType.toSignatureString());\n if (parameterTypes) {\n for (let i = 0, k = parameterTypes.length; i < k; ++i) sb.push(parameterTypes[i].toSignatureString());\n }\n sb.push(returnType.toSignatureString());\n return sb.join(\"\");\n }\n\n /** Converts this signature to a function type string. */\n toSignatureString(): string {\n return Signature.makeSignatureString(this.parameterTypes, this.returnType, this.thisType);\n }\n\n /** Converts this signature to a string. */\n toString(includeThis: bool = false): string {\n var sb = new Array();\n sb.push(\"(\");\n var index = 0;\n var thisType = this.thisType;\n if (thisType) {\n if (includeThis) {\n sb.push(\"this: \");\n sb.push(thisType.toString());\n index = 1;\n }\n }\n var parameters = this.parameterTypes;\n var numParameters = parameters.length;\n if (numParameters) {\n let names = this.parameterNames;\n let numNames = names ? names.length : 0;\n let optionalStart = this.requiredParameters;\n let restIndex = this.hasRest ? numParameters - 1 : -1;\n for (let i = 0; i < numParameters; ++i, ++index) {\n if (index) sb.push(\", \");\n if (i == restIndex) sb.push(\"...\");\n if (i < numNames) sb.push((names)[i]);\n else sb.push(getDefaultParameterName(i));\n if (i >= optionalStart && i != restIndex) sb.push(\"?: \");\n else sb.push(\": \");\n sb.push(parameters[i].toString());\n }\n }\n sb.push(\") => \");\n sb.push(this.returnType.toString());\n return sb.join(\"\");\n }\n}\n\n// helpers\n\n// Cached default parameter names used where names are unknown.\nvar cachedDefaultParameterNames: string[] | null = null;\n\n/** Gets the cached default parameter name for the specified index. */\nexport function getDefaultParameterName(index: i32): string {\n if (!cachedDefaultParameterNames) cachedDefaultParameterNames = [];\n for (let i = cachedDefaultParameterNames.length; i <= index; ++i) {\n cachedDefaultParameterNames.push(\"arg$\" + i.toString(10));\n }\n return cachedDefaultParameterNames[index - 1];\n}\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\n * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAbort,\n compileIterateRoots,\n ensureGCHook\n} from \"./builtins\";\n\nimport {\n DiagnosticCode,\n DiagnosticEmitter\n} from \"./diagnostics\";\n\nimport {\n Module,\n MemorySegment,\n ExpressionRef,\n UnaryOp,\n BinaryOp,\n NativeType,\n FunctionRef,\n ExpressionId,\n FunctionTypeRef,\n GlobalRef,\n getExpressionId,\n getExpressionType,\n getConstValueI32,\n getConstValueI64Low,\n getConstValueI64High,\n getConstValueF32,\n getConstValueF64,\n getGetLocalIndex,\n getBlockChildCount,\n getBlockChild,\n getBlockName,\n needsExplicitUnreachable\n} from \"./module\";\n\nimport {\n CommonFlags,\n PATH_DELIMITER,\n INNER_DELIMITER,\n INSTANCE_DELIMITER,\n STATIC_DELIMITER,\n GETTER_PREFIX,\n SETTER_PREFIX\n} from \"./common\";\n\nimport {\n Program,\n ClassPrototype,\n Class,\n Element,\n ElementKind,\n Enum,\n Field,\n FunctionPrototype,\n Function,\n FunctionTarget,\n Global,\n Local,\n Namespace,\n EnumValue,\n Property,\n VariableLikeElement,\n FlowFlags,\n ConstantValueKind,\n Flow,\n OperatorKind,\n DecoratorFlags\n} from \"./program\";\n\nimport {\n Resolver, ReportMode\n} from \"./resolver\";\n\nimport {\n Token,\n operatorTokenToString\n} from \"./tokenizer\";\n\nimport {\n Node,\n NodeKind,\n TypeNode,\n Source,\n Range,\n DecoratorKind,\n AssertionKind,\n\n Statement,\n BlockStatement,\n BreakStatement,\n ClassDeclaration,\n ContinueStatement,\n DeclarationStatement,\n DoStatement,\n EmptyStatement,\n EnumDeclaration,\n ExportStatement,\n ExpressionStatement,\n FunctionDeclaration,\n ForStatement,\n IfStatement,\n ImportStatement,\n InstanceOfExpression,\n InterfaceDeclaration,\n NamespaceDeclaration,\n ReturnStatement,\n SwitchStatement,\n ThrowStatement,\n TryStatement,\n VariableDeclaration,\n VariableStatement,\n VoidStatement,\n WhileStatement,\n\n Expression,\n AssertionExpression,\n BinaryExpression,\n CallExpression,\n CommaExpression,\n ElementAccessExpression,\n FloatLiteralExpression,\n FunctionExpression,\n IdentifierExpression,\n IntegerLiteralExpression,\n LiteralExpression,\n LiteralKind,\n NewExpression,\n ObjectLiteralExpression,\n ParenthesizedExpression,\n PropertyAccessExpression,\n TernaryExpression,\n ArrayLiteralExpression,\n StringLiteralExpression,\n UnaryPostfixExpression,\n UnaryPrefixExpression,\n\n nodeIsConstantValue,\n isLastStatement,\n findDecorator\n} from \"./ast\";\n\nimport {\n Type,\n TypeKind,\n TypeFlags,\n Signature,\n\n typesToNativeTypes\n} from \"./types\";\n\nimport {\n writeI8,\n writeI16,\n writeI32,\n writeI64,\n writeF32,\n writeF64,\n makeMap\n} from \"./util\";\n\n/** Compilation target. */\nexport enum Target {\n /** WebAssembly with 32-bit pointers. */\n WASM32,\n /** WebAssembly with 64-bit pointers. Experimental and not supported by any runtime yet. */\n WASM64\n}\n\n/** Compiler options. */\nexport class Options {\n\n /** WebAssembly target. Defaults to {@link Target.WASM32}. */\n target: Target = Target.WASM32;\n /** If true, compiles everything instead of just reachable code. */\n noTreeShaking: bool = false;\n /** If true, replaces assertions with nops. */\n noAssert: bool = false;\n /** If true, imports the memory provided by the embedder. */\n importMemory: bool = false;\n /** If true, imports the function table provided by the embedder. */\n importTable: bool = false;\n /** If true, generates information necessary for source maps. */\n sourceMap: bool = false;\n /** Static memory start offset. */\n memoryBase: i32 = 0;\n /** Global aliases. */\n globalAliases: Map | null = null;\n /** Additional features to activate. */\n features: Feature = Feature.NONE;\n\n /** Hinted optimize level. Not applied by the compiler itself. */\n optimizeLevelHint: i32 = 0;\n /** Hinted shrink level. Not applied by the compiler itself. */\n shrinkLevelHint: i32 = 0;\n\n /** Tests if the target is WASM64 or, otherwise, WASM32. */\n get isWasm64(): bool {\n return this.target == Target.WASM64;\n }\n\n /** Gets the unsigned size type matching the target. */\n get usizeType(): Type {\n return this.target == Target.WASM64 ? Type.usize64 : Type.usize32;\n }\n\n /** Gets the signed size type matching the target. */\n get isizeType(): Type {\n return this.target == Target.WASM64 ? Type.isize64 : Type.isize32;\n }\n\n /** Gets the native size type matching the target. */\n get nativeSizeType(): NativeType {\n return this.target == Target.WASM64 ? NativeType.I64 : NativeType.I32;\n }\n\n /** Tests if a specific feature is activated. */\n hasFeature(feature: Feature): bool {\n return (this.features & feature) != 0;\n }\n}\n\n/** Indicates specific features to activate. */\nexport const enum Feature {\n /** No additional features. */\n NONE = 0,\n /** Sign extension operations. */\n SIGN_EXTENSION = 1 << 0, // see: https://github.com/WebAssembly/sign-extension-ops\n /** Mutable global imports and exports. */\n MUTABLE_GLOBAL = 1 << 1, // see: https://github.com/WebAssembly/mutable-global\n /** Bulk memory operations. */\n BULK_MEMORY = 1 << 2, // see: https://github.com/WebAssembly/bulk-memory-operations\n /** SIMD types and operations. */\n SIMD = 1 << 3, // see: https://github.com/WebAssembly/simd\n /** Threading and atomic operations. */\n THREADS = 1 << 4 // see: https://github.com/WebAssembly/threads\n}\n\n/** Indicates the desired kind of a conversion. */\nexport const enum ConversionKind {\n /** No conversion. */\n NONE,\n /** Implicit conversion. */\n IMPLICIT,\n /** Explicit conversion. */\n EXPLICIT\n}\n\n/** Indicates the desired wrap mode of a conversion. */\nexport const enum WrapMode {\n /** No wrapping. */\n NONE,\n /** Wrap small integer values. */\n WRAP\n}\n\n/** Compiler interface. */\nexport class Compiler extends DiagnosticEmitter {\n\n /** Program reference. */\n program: Program;\n /** Resolver reference. */\n resolver: Resolver;\n /** Provided options. */\n options: Options;\n /** Module instance being compiled. */\n module: Module;\n /** Current control flow. */\n currentFlow: Flow;\n /** Current inline functions stack. */\n currentInlineFunctions: Function[] = [];\n /** Current enum in compilation. */\n currentEnum: Enum | null = null;\n /** Current type in compilation. */\n currentType: Type = Type.void;\n /** Start function being compiled. */\n startFunctionInstance: Function;\n /** Start function statements. */\n startFunctionBody: ExpressionRef[];\n /** Counting memory offset. */\n memoryOffset: I64;\n /** Memory segments being compiled. */\n memorySegments: MemorySegment[] = [];\n /** Map of already compiled static string segments. */\n stringSegments: Map = new Map();\n /** Function table being compiled. */\n functionTable: string[] = [ \"null\" ];\n /** Argument count helper global. */\n argcVar: GlobalRef = 0;\n /** Argument count helper setter. */\n argcSet: FunctionRef = 0;\n /** Indicates whether the iterateRoots function must be generated. */\n needsIterateRoots: bool = false;\n\n /** Compiles a {@link Program} to a {@link Module} using the specified options. */\n static compile(program: Program, options: Options | null = null): Module {\n return new Compiler(program, options).compile();\n }\n\n /** Constructs a new compiler for a {@link Program} using the specified options. */\n constructor(program: Program, options: Options | null = null) {\n super(program.diagnostics);\n this.program = program;\n this.resolver = program.resolver;\n if (!options) options = new Options();\n this.options = options;\n this.memoryOffset = i64_new(\n // leave space for `null`. also functions as a sentinel for erroneous stores at offset 0.\n // note that Binaryen's asm.js output utilizes the first 8 bytes for reinterpretations (#1547)\n max(options.memoryBase, 8)\n );\n this.module = Module.create();\n }\n\n /** Performs compilation of the underlying {@link Program} to a {@link Module}. */\n compile(): Module {\n var options = this.options;\n var module = this.module;\n var program = this.program;\n\n // initialize lookup maps, built-ins, imports, exports, etc.\n program.initialize(options);\n\n // set up the start function\n var startFunctionInstance = new Function(program.startFunction, \"start\", new Signature([], Type.void));\n this.startFunctionInstance = startFunctionInstance;\n var startFunctionBody = new Array();\n this.startFunctionBody = startFunctionBody;\n this.currentFlow = startFunctionInstance.flow;\n\n // add a mutable heap base dummy\n if (options.isWasm64) {\n module.addGlobal(\n \"HEAP_BASE\",\n NativeType.I64,\n true,\n module.createI64(0, 0)\n );\n } else {\n module.addGlobal(\n \"HEAP_BASE\",\n NativeType.I32,\n false,\n module.createI32(0)\n );\n }\n\n // compile entry file(s) while traversing reachable elements\n var sources = program.sources;\n for (let i = 0, k = sources.length; i < k; ++i) {\n if (sources[i].isEntry) this.compileSource(sources[i]);\n }\n\n // compile the start function if not empty or called by main\n if (startFunctionBody.length || program.mainFunction !== null) {\n let signature = startFunctionInstance.signature;\n let funcRef = module.addFunction(\n startFunctionInstance.internalName,\n this.ensureFunctionType(\n signature.parameterTypes,\n signature.returnType,\n signature.thisType\n ),\n typesToNativeTypes(startFunctionInstance.additionalLocals),\n module.createBlock(null, startFunctionBody)\n );\n startFunctionInstance.finalize(module, funcRef);\n if (!program.mainFunction) module.setStart(funcRef);\n }\n\n // update the heap base pointer\n var memoryOffset = this.memoryOffset;\n memoryOffset = i64_align(memoryOffset, options.usizeType.byteSize);\n this.memoryOffset = memoryOffset;\n module.removeGlobal(\"HEAP_BASE\");\n if (options.isWasm64) {\n module.addGlobal(\n \"HEAP_BASE\",\n NativeType.I64,\n false,\n module.createI64(i64_low(memoryOffset), i64_high(memoryOffset))\n );\n } else {\n module.addGlobal(\n \"HEAP_BASE\",\n NativeType.I32,\n false,\n module.createI32(i64_low(memoryOffset))\n );\n }\n\n // set up memory\n module.setMemory(\n this.options.memoryBase /* is specified */ || this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0,\n Module.UNLIMITED_MEMORY,\n this.memorySegments,\n options.target,\n \"memory\"\n );\n\n // import memory if requested (default memory is named '0' by Binaryen)\n if (options.importMemory) module.addMemoryImport(\"0\", \"env\", \"memory\");\n\n // set up function table\n var functionTable = this.functionTable;\n module.setFunctionTable(functionTable.length, 0xffffffff, functionTable);\n module.addTableExport(\"0\", \"table\");\n module.addFunction(\"null\", this.ensureFunctionType(null, Type.void), null, module.createBlock(null, []));\n\n // import table if requested (default table is named '0' by Binaryen)\n if (options.importTable) module.addTableImport(\"0\", \"env\", \"table\");\n\n // set up module exports\n for (let [name, moduleExport] of program.moduleLevelExports) {\n this.makeModuleExport(name, moduleExport.element);\n }\n\n // set up gc\n if (this.needsIterateRoots) compileIterateRoots(this);\n\n return module;\n }\n\n /** Applies the respective module export(s) for the specified element. */\n private makeModuleExport(name: string, element: Element, prefix: string = \"\"): void {\n\n // traverse members\n var members = element.members;\n if (members) {\n let subPrefix = prefix + name + (element.kind == ElementKind.CLASS\n ? INSTANCE_DELIMITER\n : STATIC_DELIMITER\n );\n if (element.kind == ElementKind.NAMESPACE) {\n for (let member of members.values()) {\n if (!member.is(CommonFlags.EXPORT)) continue;\n this.makeModuleExport(member.simpleName, member, subPrefix);\n }\n } else {\n for (let member of members.values()) {\n if (member.is(CommonFlags.PRIVATE)) continue;\n this.makeModuleExport(member.simpleName, member, subPrefix);\n }\n }\n }\n\n switch (element.kind) {\n\n // export global\n case ElementKind.GLOBAL: {\n let isConst = element.is(CommonFlags.CONST) || element.is(CommonFlags.STATIC | CommonFlags.READONLY);\n if (!isConst && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\n let declaration = (element).declaration;\n if (declaration) {\n this.error(\n DiagnosticCode.Cannot_export_a_mutable_global,\n declaration.name.range\n );\n }\n } else {\n this.module.addGlobalExport(element.internalName, prefix + name);\n }\n break;\n }\n case ElementKind.ENUMVALUE: {\n if (!assert(element.parent).is(CommonFlags.CONST) && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\n let declaration = (element).declaration;\n if (declaration) {\n this.error(\n DiagnosticCode.Cannot_export_a_mutable_global,\n declaration.name.range\n );\n }\n } else {\n this.module.addGlobalExport(element.internalName, prefix + name);\n }\n break;\n }\n\n // export function\n case ElementKind.FUNCTION: {\n let instance = element;\n let signature = instance.signature;\n if (signature.requiredParameters < signature.parameterTypes.length) {\n // utilize trampoline to fill in omitted arguments\n instance = this.ensureTrampoline(instance);\n this.ensureArgcSet();\n }\n let returnTypePostFix = (!name.endsWith(\"constructor\") && signature.returnType.is(TypeFlags.REFERENCE))\n ? \"!\" + signature.returnType.toString()\n : \"\";\n if (instance.is(CommonFlags.COMPILED)) {\n this.module.addFunctionExport(instance.internalName, prefix + name + returnTypePostFix);\n }\n break;\n }\n\n // export getter and setter\n case ElementKind.PROPERTY: {\n let getter = assert((element).getterPrototype);\n this.makeModuleExport(GETTER_PREFIX + name, getter, prefix);\n let setter = (element).setterPrototype;\n if (setter) this.makeModuleExport(SETTER_PREFIX + name, setter, prefix);\n break;\n }\n\n // export a getter and a setter\n case ElementKind.FIELD: {\n let module = this.module;\n let type = (element).type;\n let nativeType = type.toNativeType();\n let offset = (element).memoryOffset;\n let usizeType = this.options.usizeType;\n let nativeSizeType = this.options.nativeSizeType;\n\n // make a getter\n let getterName = prefix + GETTER_PREFIX + name;\n module.addFunction(\n getterName,\n this.ensureFunctionType(null, type, usizeType),\n null,\n module.createLoad(\n type.byteSize,\n type.is(TypeFlags.SIGNED),\n module.createGetLocal(0, nativeSizeType),\n nativeType,\n offset\n )\n );\n module.addFunctionExport(getterName, getterName);\n\n // make a setter\n if (!element.is(CommonFlags.READONLY)) {\n let setterName = prefix + SETTER_PREFIX + name;\n module.addFunction(\n setterName,\n this.ensureFunctionType([ type ], Type.void, usizeType),\n null,\n module.createStore(\n type.byteSize,\n module.createGetLocal(0, nativeSizeType),\n module.createGetLocal(1, nativeType),\n nativeType,\n offset\n )\n );\n module.addFunctionExport(setterName, setterName);\n }\n break;\n }\n\n // skip prototype and export instances\n case ElementKind.FUNCTION_PROTOTYPE: {\n for (let instances of (element).instances.values()) {\n for (let instance of instances.values()) {\n let instanceName = name;\n if (instance.is(CommonFlags.GENERIC)) {\n let fullName = instance.internalName;\n instanceName += fullName.substring(fullName.lastIndexOf(\"<\"));\n }\n this.makeModuleExport(instanceName, instance, prefix);\n }\n }\n break;\n }\n case ElementKind.CLASS_PROTOTYPE: {\n for (let instance of (element).instances.values()) {\n let instanceName = name;\n if (instance.is(CommonFlags.GENERIC)) {\n let fullName = instance.internalName;\n instanceName += fullName.substring(fullName.lastIndexOf(\"<\"));\n }\n let ctor = instance.constructorInstance;\n if (ctor) this.makeModuleExport(instanceName + INSTANCE_DELIMITER + ctor.simpleName, ctor, prefix);\n this.makeModuleExport(instanceName, instance, prefix);\n }\n break;\n }\n\n // all possible members already handled above\n case ElementKind.ENUM:\n case ElementKind.CLASS:\n case ElementKind.NAMESPACE: break;\n\n default: assert(false);\n }\n }\n\n // sources\n\n /** Compiles a source by looking it up by path first. */\n compileSourceByPath(normalizedPathWithoutExtension: string, reportNode: Node): void {\n var source = this.program.lookupSourceByPath(normalizedPathWithoutExtension);\n if (source) this.compileSource(source);\n else {\n this.error(\n DiagnosticCode.File_0_not_found,\n reportNode.range, normalizedPathWithoutExtension\n );\n }\n }\n\n /** Compiles a source. */\n compileSource(source: Source): void {\n if (source.is(CommonFlags.COMPILED)) return;\n source.set(CommonFlags.COMPILED);\n\n // compile top-level statements\n var noTreeShaking = this.options.noTreeShaking;\n var isEntry = source.isEntry;\n var startFunctionInstance = this.startFunctionInstance;\n var startFunctionBody = this.startFunctionBody;\n var statements = source.statements;\n for (let i = 0, k = statements.length; i < k; ++i) {\n let statement = statements[i];\n switch (statement.kind) {\n case NodeKind.CLASSDECLARATION: {\n if (\n (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&\n !(statement).isGeneric\n ) {\n this.compileClassDeclaration(statement, []);\n }\n break;\n }\n case NodeKind.INTERFACEDECLARATION: break;\n case NodeKind.ENUMDECLARATION: {\n if (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) {\n this.compileEnumDeclaration(statement);\n }\n break;\n }\n case NodeKind.FUNCTIONDECLARATION: {\n if (\n (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) &&\n !(statement).isGeneric\n ) {\n this.compileFunctionDeclaration(statement, []);\n }\n break;\n }\n case NodeKind.IMPORT: {\n this.compileSourceByPath(\n (statement).normalizedPath,\n (statement).path\n );\n break;\n }\n case NodeKind.NAMESPACEDECLARATION: {\n if (noTreeShaking || (isEntry && statement.is(CommonFlags.EXPORT))) {\n this.compileNamespaceDeclaration(statement);\n }\n break;\n }\n case NodeKind.VARIABLE: { // global, always compiled as initializers might have side effects\n let variableInit = this.compileVariableStatement(statement);\n if (variableInit) startFunctionBody.push(variableInit);\n break;\n }\n case NodeKind.EXPORT: {\n if ((statement).normalizedPath != null) {\n this.compileSourceByPath(\n (statement).normalizedPath,\n (statement).path\n );\n }\n if (noTreeShaking || isEntry) {\n this.compileExportStatement(statement);\n }\n break;\n }\n default: { // otherwise a top-level statement that is part of the start function's body\n let previousFlow = this.currentFlow;\n this.currentFlow = startFunctionInstance.flow;\n startFunctionBody.push(\n this.compileStatement(statement)\n );\n this.currentFlow = previousFlow;\n break;\n }\n }\n }\n }\n\n // globals\n\n compileGlobalDeclaration(declaration: VariableDeclaration): Global | null {\n // look up the initialized program element\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\n assert(element.kind == ElementKind.GLOBAL);\n if (!this.compileGlobal(element)) return null; // reports\n return element;\n }\n\n compileGlobal(global: Global): bool {\n if (global.is(CommonFlags.COMPILED)) return true;\n global.set(CommonFlags.COMPILED);\n\n var module = this.module;\n var declaration = global.declaration;\n var initExpr: ExpressionRef = 0;\n\n if (!global.is(CommonFlags.RESOLVED)) {\n if (declaration) {\n\n // resolve now if annotated\n if (declaration.type) {\n let resolvedType = this.resolver.resolveType(declaration.type); // reports\n if (!resolvedType) return false;\n if (resolvedType == Type.void) {\n this.error(\n DiagnosticCode.Type_expected,\n declaration.type.range\n );\n return false;\n }\n global.type = resolvedType;\n global.set(CommonFlags.RESOLVED);\n\n // infer from initializer if not annotated\n } else if (declaration.initializer) { // infer type using void/NONE for literal inference\n initExpr = this.compileExpressionRetainType( // reports\n declaration.initializer,\n Type.void,\n WrapMode.WRAP\n );\n if (this.currentType == Type.void) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n declaration.initializer.range, this.currentType.toString(), \"\"\n );\n return false;\n }\n global.type = this.currentType;\n global.set(CommonFlags.RESOLVED);\n\n // must either be annotated or have an initializer\n } else {\n this.error(\n DiagnosticCode.Type_expected,\n declaration.name.range.atEnd\n );\n return false;\n }\n } else {\n assert(false); // must have a declaration if resolved lazily\n }\n }\n\n // ambient builtins like 'HEAP_BASE' need to be resolved but are added explicitly\n if (global.is(CommonFlags.AMBIENT) && global.hasDecorator(DecoratorFlags.BUILTIN)) return true;\n\n var nativeType = global.type.toNativeType();\n var isDeclaredConstant = global.is(CommonFlags.CONST) || global.is(CommonFlags.STATIC | CommonFlags.READONLY);\n\n // handle imports\n if (global.is(CommonFlags.AMBIENT)) {\n\n // constant global\n if (isDeclaredConstant || this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\n global.set(CommonFlags.MODULE_IMPORT);\n if (declaration) {\n mangleImportName(global, declaration);\n } else {\n mangleImportName_moduleName = \"env\";\n mangleImportName_elementName = global.simpleName;\n }\n module.addGlobalImport(\n global.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n nativeType\n );\n global.set(CommonFlags.COMPILED);\n return true;\n\n // importing mutable globals is not supported in the MVP\n } else {\n this.error(\n DiagnosticCode.Operation_not_supported,\n assert(declaration).range\n );\n }\n return false;\n }\n\n // the MVP does not yet support initializer expressions other than constant values (and constant\n // get_globals), hence such initializations must be performed in the start function for now.\n var initializeInStart = false;\n\n // evaluate initializer if present\n if (declaration !== null && declaration.initializer !== null) {\n if (!initExpr) {\n initExpr = this.compileExpression(\n declaration.initializer,\n global.type,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP\n );\n }\n\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n if (isDeclaredConstant) {\n initExpr = module.precomputeExpression(initExpr);\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n this.warning(\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\n declaration.range\n );\n initializeInStart = true;\n }\n } else {\n initializeInStart = true;\n }\n }\n\n // explicitly inline if annotated\n if (global.hasDecorator(DecoratorFlags.INLINE)) {\n if (!initializeInStart) { // reported above\n assert(getExpressionId(initExpr) == ExpressionId.Const);\n let exprType = getExpressionType(initExpr);\n switch (exprType) {\n case NativeType.I32: {\n global.constantValueKind = ConstantValueKind.INTEGER;\n global.constantIntegerValue = i64_new(getConstValueI32(initExpr), 0);\n break;\n }\n case NativeType.I64: {\n global.constantValueKind = ConstantValueKind.INTEGER;\n global.constantIntegerValue = i64_new(\n getConstValueI64Low(initExpr),\n getConstValueI64High(initExpr)\n );\n break;\n }\n case NativeType.F32: {\n global.constantValueKind = ConstantValueKind.FLOAT;\n global.constantFloatValue = getConstValueF32(initExpr);\n break;\n }\n case NativeType.F64: {\n global.constantValueKind = ConstantValueKind.FLOAT;\n global.constantFloatValue = getConstValueF64(initExpr);\n break;\n }\n default: {\n assert(false);\n return false;\n }\n }\n global.set(CommonFlags.INLINED); // inline the value from now on\n }\n }\n\n // initialize to zero if there's no initializer\n } else {\n initExpr = global.type.toNativeZero(module);\n }\n\n var internalName = global.internalName;\n\n if (initializeInStart) { // initialize to mutable zero and set the actual value in start\n module.addGlobal(internalName, nativeType, true, global.type.toNativeZero(module));\n this.startFunctionBody.push(module.createSetGlobal(internalName, initExpr));\n\n } else { // compile normally\n module.addGlobal(internalName, nativeType, !isDeclaredConstant, initExpr);\n }\n return true;\n }\n\n // enums\n\n compileEnumDeclaration(declaration: EnumDeclaration): Enum | null {\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\n assert(element.kind == ElementKind.ENUM);\n if (!this.compileEnum(element)) return null;\n return element;\n }\n\n compileEnum(element: Enum): bool {\n if (element.is(CommonFlags.COMPILED)) return true;\n element.set(CommonFlags.COMPILED);\n\n var module = this.module;\n this.currentEnum = element;\n var previousValue: EnumValue | null = null;\n var previousValueIsMut = false;\n\n if (element.members) {\n for (let member of element.members.values()) {\n if (member.kind != ElementKind.ENUMVALUE) continue; // happens if an enum is also a namespace\n let initInStart = false;\n let val = member;\n let valueDeclaration = val.declaration;\n val.set(CommonFlags.COMPILED);\n let initExpr: ExpressionRef;\n if (valueDeclaration.value) {\n initExpr = this.compileExpression(\n valueDeclaration.value,\n Type.i32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n if (element.is(CommonFlags.CONST)) {\n initExpr = module.precomputeExpression(initExpr);\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n this.error(\n DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,\n valueDeclaration.value.range\n );\n initInStart = true;\n }\n } else {\n initInStart = true;\n }\n }\n } else if (previousValue == null) {\n initExpr = module.createI32(0);\n } else {\n if (previousValueIsMut) {\n this.error(\n DiagnosticCode.Enum_member_must_have_initializer,\n valueDeclaration.range\n );\n }\n initExpr = module.createBinary(BinaryOp.AddI32,\n module.createGetGlobal(previousValue.internalName, NativeType.I32),\n module.createI32(1)\n );\n initExpr = module.precomputeExpression(initExpr);\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n if (element.is(CommonFlags.CONST)) {\n this.error(\n DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,\n valueDeclaration.range\n );\n }\n initInStart = true;\n }\n }\n if (initInStart) {\n module.addGlobal(val.internalName, NativeType.I32, true, module.createI32(0));\n this.startFunctionBody.push(module.createSetGlobal(val.internalName, initExpr));\n previousValueIsMut = true;\n } else {\n module.addGlobal(val.internalName, NativeType.I32, !element.is(CommonFlags.CONST), initExpr);\n previousValueIsMut = false;\n }\n previousValue = val;\n }\n }\n this.currentEnum = null;\n return true;\n }\n\n // functions\n\n /** Compiles a top-level function given its declaration. */\n compileFunctionDeclaration(\n declaration: FunctionDeclaration,\n typeArguments: TypeNode[]\n ): Function | null {\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n return this.compileFunctionUsingTypeArguments( // reports\n element,\n typeArguments,\n makeMap(),\n null,\n (element).declaration.name\n );\n }\n\n /** Resolves the specified type arguments prior to compiling the resulting function instance. */\n compileFunctionUsingTypeArguments(\n prototype: FunctionPrototype,\n typeArguments: TypeNode[],\n contextualTypeArguments: Map,\n outerScope: Flow | null,\n reportNode: Node\n ): Function | null {\n var instance = this.resolver.resolveFunctionInclTypeArguments(\n prototype,\n typeArguments,\n contextualTypeArguments,\n reportNode\n );\n if (!instance) return null;\n instance.outerScope = outerScope;\n if (!this.compileFunction(instance)) return null; // reports\n return instance;\n }\n\n /** Either reuses or creates the function type matching the specified signature. */\n ensureFunctionType(\n parameterTypes: Type[] | null,\n returnType: Type,\n thisType: Type | null = null\n ): FunctionTypeRef {\n var numParameters = parameterTypes ? parameterTypes.length : 0;\n var paramTypes: NativeType[];\n var index = 0;\n if (thisType) {\n paramTypes = new Array(1 + numParameters);\n paramTypes[0] = thisType.toNativeType();\n index = 1;\n } else {\n paramTypes = new Array(numParameters);\n }\n if (parameterTypes) {\n for (let i = 0; i < numParameters; ++i, ++index) {\n paramTypes[index] = parameterTypes[i].toNativeType();\n }\n }\n var resultType = returnType.toNativeType();\n var module = this.module;\n var typeRef = module.getFunctionTypeBySignature(resultType, paramTypes);\n if (!typeRef) {\n let name = Signature.makeSignatureString(parameterTypes, returnType, thisType);\n typeRef = module.addFunctionType(name, resultType, paramTypes);\n }\n return typeRef;\n }\n\n /** Compiles the body of a function within the specified flow. */\n private compileFunctionBody(instance: Function): ExpressionRef[] {\n var module = this.module;\n var declaration = instance.prototype.declaration;\n var body = assert(declaration.body);\n var returnType = instance.signature.returnType;\n var flow = this.currentFlow;\n\n // compile statements\n var stmts: BinaryenExportRef[];\n if (body.kind == NodeKind.BLOCK) {\n stmts = this.compileStatements((body).statements);\n } else {\n // must be an expression statement if not a block\n assert(body.kind == NodeKind.EXPRESSION);\n\n // must be an arrow function\n assert(instance.is(CommonFlags.ARROW));\n\n // none of the following can be an arrow function\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n\n let stmt = this.compileExpression(\n (body).expression,\n returnType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n flow.set(FlowFlags.RETURNS);\n if (!flow.canOverflow(stmt, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\n stmts = [ stmt ];\n }\n\n // make the main function call `start` implicitly, but only once\n if (instance.is(CommonFlags.MAIN)) {\n module.addGlobal(\"~started\", NativeType.I32, true, module.createI32(0));\n stmts.unshift(\n module.createIf(\n module.createUnary(\n UnaryOp.EqzI32,\n module.createGetGlobal(\"~started\", NativeType.I32)\n ),\n module.createBlock(null, [\n module.createCall(\"start\", null, NativeType.None),\n module.createSetGlobal(\"~started\", module.createI32(1))\n ])\n )\n );\n }\n\n // make constructors return their instance pointer\n if (instance.is(CommonFlags.CONSTRUCTOR)) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\n\n if (!flow.isAny(FlowFlags.ANY_TERMINATING)) {\n let thisLocalIndex = flow.is(FlowFlags.INLINE_CONTEXT)\n ? assert(flow.lookupLocal(\"this\")).index\n : 0;\n\n // if `this` wasn't accessed before, allocate if necessary and initialize `this`\n if (!flow.is(FlowFlags.ALLOCATES)) {\n // {\n // if (!this) this = \n // this.a = X\n // this.b = Y\n // }\n stmts.push(\n module.createIf(\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\n module.createGetLocal(thisLocalIndex, nativeSizeType)\n ),\n module.createSetLocal(thisLocalIndex,\n this.makeAllocation(classInstance)\n )\n )\n );\n this.makeFieldInitialization(classInstance, stmts);\n }\n\n // implicitly return `this`\n stmts.push(\n module.createGetLocal(thisLocalIndex, nativeSizeType)\n );\n }\n\n // check that super has been called if this is a derived class\n if ((classInstance).base && !flow.is(FlowFlags.CALLS_SUPER)) {\n this.error(\n DiagnosticCode.Constructors_for_derived_classes_must_contain_a_super_call,\n instance.prototype.declaration.range\n );\n }\n\n // if this is a normal function, make sure that all branches return\n } else if (returnType != Type.void && !flow.is(FlowFlags.RETURNS)) {\n this.error(\n DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\n declaration.signature.returnType.range\n );\n }\n\n return stmts;\n }\n\n /** Compiles a readily resolved function instance. */\n compileFunction(instance: Function): bool {\n if (instance.is(CommonFlags.COMPILED)) return true;\n assert(!(instance.is(CommonFlags.AMBIENT) && instance.hasDecorator(DecoratorFlags.BUILTIN)));\n instance.set(CommonFlags.COMPILED);\n\n var module = this.module;\n var signature = instance.signature;\n var declaration = instance.prototype.declaration;\n var body = declaration.body;\n\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var funcRef: FunctionRef;\n\n // concrete function\n if (body) {\n\n // must not be ambient\n if (instance.is(CommonFlags.AMBIENT)) {\n this.error(\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\n declaration.name.range\n );\n }\n\n // cannot have an annotated external name\n if (instance.hasDecorator(DecoratorFlags.EXTERNAL)) {\n let decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\n this.error(\n DiagnosticCode.Operation_not_supported,\n decorator.range\n );\n }\n\n // compile body in this function's context\n let previousFlow = this.currentFlow;\n this.currentFlow = instance.flow;\n let stmts = this.compileFunctionBody(instance);\n this.currentFlow = previousFlow;\n\n // create the function\n funcRef = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmts.length\n ? stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, instance.signature.returnType.toNativeType())\n : module.createNop()\n );\n\n // imported function\n } else {\n if (!instance.is(CommonFlags.AMBIENT)) {\n this.error(\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\n declaration.name.range\n );\n }\n\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, declaration); // TODO: check for duplicates\n\n // create the import\n funcRef = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, funcRef);\n return true;\n }\n\n // namespaces\n\n compileNamespaceDeclaration(declaration: NamespaceDeclaration): void {\n var members = declaration.members;\n var noTreeShaking = this.options.noTreeShaking;\n for (let i = 0, k = members.length; i < k; ++i) {\n let member = members[i];\n switch (member.kind) {\n case NodeKind.CLASSDECLARATION: {\n if (\n (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\n !(member).isGeneric\n ) {\n this.compileClassDeclaration(member, []);\n }\n break;\n }\n case NodeKind.INTERFACEDECLARATION: {\n if (\n (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\n !(member).isGeneric\n ) {\n this.compileInterfaceDeclaration(member, []);\n }\n break;\n }\n case NodeKind.ENUMDECLARATION: {\n if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\n this.compileEnumDeclaration(member);\n }\n break;\n }\n case NodeKind.FUNCTIONDECLARATION: {\n if (\n (noTreeShaking || member.is(CommonFlags.EXPORT)) &&\n !(member).isGeneric\n ) {\n this.compileFunctionDeclaration(member, []);\n }\n break;\n }\n case NodeKind.NAMESPACEDECLARATION: {\n if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\n this.compileNamespaceDeclaration(member);\n }\n break;\n }\n case NodeKind.VARIABLE: {\n if (noTreeShaking || member.is(CommonFlags.EXPORT)) {\n let variableInit = this.compileVariableStatement(member, true);\n if (variableInit) this.startFunctionBody.push(variableInit);\n }\n break;\n }\n default: assert(false);\n }\n }\n }\n\n compileNamespace(ns: Namespace): void {\n if (!ns.members) return;\n\n var noTreeShaking = this.options.noTreeShaking;\n for (let element of ns.members.values()) {\n switch (element.kind) {\n case ElementKind.CLASS_PROTOTYPE: {\n if (\n (\n noTreeShaking ||\n (element).is(CommonFlags.EXPORT)\n ) && !(element).is(CommonFlags.GENERIC)\n ) {\n this.compileClassUsingTypeArguments(\n element,\n [],\n makeMap()\n );\n }\n break;\n }\n case ElementKind.ENUM: {\n this.compileEnum(element);\n break;\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (\n (\n noTreeShaking || (element).is(CommonFlags.EXPORT)\n ) && !(element).is(CommonFlags.GENERIC)\n ) {\n if (element.hasDecorator(DecoratorFlags.BUILTIN)) break;\n this.compileFunctionUsingTypeArguments(\n element,\n [],\n makeMap(),\n null,\n (element).declaration.name\n );\n }\n break;\n }\n case ElementKind.GLOBAL: {\n this.compileGlobal(element);\n break;\n }\n case ElementKind.NAMESPACE: {\n this.compileNamespace(element);\n break;\n }\n }\n }\n }\n\n // exports\n\n compileExportStatement(statement: ExportStatement): void {\n var fileLevelExports = this.program.fileLevelExports;\n var members = statement.members;\n if (!members) return; // filespace\n for (let i = 0, k = members.length; i < k; ++i) {\n let member = members[i];\n let element = fileLevelExports.get(\n statement.range.source.internalPath + PATH_DELIMITER + member.externalName.text\n );\n if (!element) continue; // reported in Program#initialize\n switch (element.kind) {\n case ElementKind.CLASS_PROTOTYPE: {\n if (!(element).is(CommonFlags.GENERIC)) {\n this.compileClassUsingTypeArguments(\n element,\n [],\n makeMap()\n );\n }\n break;\n }\n case ElementKind.ENUM: {\n this.compileEnum(element);\n break;\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (\n !(element).is(CommonFlags.GENERIC) &&\n statement.range.source.isEntry\n ) {\n this.compileFunctionUsingTypeArguments(\n element,\n [],\n makeMap(),\n null,\n (element).declaration.name\n );\n }\n break;\n }\n case ElementKind.GLOBAL: {\n this.compileGlobal(element);\n break;\n }\n case ElementKind.NAMESPACE: {\n this.compileNamespace(element);\n break;\n }\n }\n }\n }\n\n // classes\n\n compileClassDeclaration(\n declaration: ClassDeclaration,\n typeArguments: TypeNode[]\n ): void {\n var element = assert(this.program.elementsLookup.get(declaration.fileLevelInternalName));\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n this.compileClassUsingTypeArguments(\n element,\n typeArguments,\n makeMap(),\n declaration\n );\n }\n\n compileClassUsingTypeArguments(\n prototype: ClassPrototype,\n typeArguments: TypeNode[],\n contextualTypeArguments: Map,\n alternativeReportNode: Node | null = null\n ): void {\n var instance = this.resolver.resolveClassInclTypeArguments(\n prototype,\n typeArguments,\n contextualTypeArguments,\n alternativeReportNode || prototype.declaration\n );\n if (!instance) return;\n this.compileClass(instance);\n }\n\n compileClass(instance: Class): bool {\n if (instance.is(CommonFlags.COMPILED)) return true;\n instance.set(CommonFlags.COMPILED);\n\n var staticMembers = instance.prototype.members;\n if (staticMembers) {\n for (let element of staticMembers.values()) {\n switch (element.kind) {\n case ElementKind.GLOBAL: {\n this.compileGlobal(element);\n break;\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (\n !(element).is(CommonFlags.GENERIC)\n ) {\n this.compileFunctionUsingTypeArguments(\n element,\n [],\n makeMap(),\n null,\n (element).declaration.name\n );\n }\n break;\n }\n case ElementKind.PROPERTY: {\n let getter = (element).getterPrototype;\n if (getter) {\n this.compileFunctionUsingTypeArguments(\n getter,\n [],\n makeMap(),\n null,\n getter.declaration.name\n );\n }\n let setter = (element).setterPrototype;\n if (setter) {\n this.compileFunctionUsingTypeArguments(\n setter,\n [],\n makeMap(),\n null,\n setter.declaration.name\n );\n }\n break;\n }\n }\n }\n }\n var ctorInstance = instance.constructorInstance;\n if (ctorInstance) this.compileFunction(ctorInstance);\n var instanceMembers = instance.members;\n if (instanceMembers) {\n for (let element of instanceMembers.values()) {\n switch (element.kind) {\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (\n !(element).is(CommonFlags.GENERIC)\n ) {\n this.compileFunctionUsingTypeArguments(\n element,\n [],\n makeMap(instance.contextualTypeArguments),\n null,\n (element).declaration.name\n );\n }\n break;\n }\n case ElementKind.FIELD: {\n element.set(CommonFlags.COMPILED);\n break;\n }\n case ElementKind.PROPERTY: {\n let getter = (element).getterPrototype;\n if (getter) {\n this.compileFunctionUsingTypeArguments(\n getter,\n [],\n makeMap(instance.contextualTypeArguments),\n null,\n getter.declaration.name\n );\n }\n let setter = (element).setterPrototype;\n if (setter) {\n this.compileFunctionUsingTypeArguments(\n setter,\n [],\n makeMap(instance.contextualTypeArguments),\n null,\n setter.declaration.name\n );\n }\n break;\n }\n }\n }\n }\n return true;\n }\n\n compileInterfaceDeclaration(\n declaration: InterfaceDeclaration,\n typeArguments: TypeNode[],\n contextualTypeArguments: Map | null = null,\n alternativeReportNode: Node | null = null\n ): void {\n // TODO\n this.error(\n DiagnosticCode.Operation_not_supported,\n declaration.range\n );\n }\n\n // memory\n\n /** Adds a static memory segment with the specified data. */\n addMemorySegment(buffer: Uint8Array, alignment: i32 = 8): MemorySegment {\n var memoryOffset = i64_align(this.memoryOffset, alignment);\n var segment = MemorySegment.create(buffer, memoryOffset);\n this.memorySegments.push(segment);\n this.memoryOffset = i64_add(memoryOffset, i64_new(buffer.length, 0));\n return segment;\n }\n\n // function table\n\n /** Ensures that a table entry exists for the specified function and returns its index. */\n ensureFunctionTableEntry(func: Function): i32 {\n assert(func.is(CommonFlags.COMPILED));\n if (func.functionTableIndex >= 0) {\n return func.functionTableIndex;\n }\n var functionTable = this.functionTable;\n var index = functionTable.length;\n if (!func.is(CommonFlags.TRAMPOLINE) && func.signature.requiredParameters < func.signature.parameterTypes.length) {\n // insert the trampoline if the function has optional parameters\n func = this.ensureTrampoline(func);\n }\n functionTable.push(func.internalName);\n func.functionTableIndex = index;\n return index;\n }\n\n // statements\n\n compileStatement(statement: Statement): ExpressionRef {\n var module = this.module;\n var stmt: ExpressionRef;\n switch (statement.kind) {\n case NodeKind.BLOCK: {\n stmt = this.compileBlockStatement(statement);\n break;\n }\n case NodeKind.BREAK: {\n stmt = this.compileBreakStatement(statement);\n break;\n }\n case NodeKind.CONTINUE: {\n stmt = this.compileContinueStatement(statement);\n break;\n }\n case NodeKind.DO: {\n stmt = this.compileDoStatement(statement);\n break;\n }\n case NodeKind.EMPTY: {\n stmt = this.compileEmptyStatement(statement);\n break;\n }\n case NodeKind.EXPRESSION: {\n stmt = this.compileExpressionStatement(statement);\n break;\n }\n case NodeKind.FOR: {\n stmt = this.compileForStatement(statement);\n break;\n }\n case NodeKind.IF: {\n stmt = this.compileIfStatement(statement);\n break;\n }\n case NodeKind.RETURN: {\n stmt = this.compileReturnStatement(statement);\n break;\n }\n case NodeKind.SWITCH: {\n stmt = this.compileSwitchStatement(statement);\n break;\n }\n case NodeKind.THROW: {\n stmt = this.compileThrowStatement(statement);\n break;\n }\n case NodeKind.TRY: {\n stmt = this.compileTryStatement(statement);\n break;\n }\n case NodeKind.VARIABLE: {\n stmt = this.compileVariableStatement(statement);\n if (!stmt) stmt = module.createNop();\n break;\n }\n case NodeKind.VOID: {\n stmt = this.compileVoidStatement(statement);\n break;\n }\n case NodeKind.WHILE: {\n stmt = this.compileWhileStatement(statement);\n break;\n }\n case NodeKind.TYPEDECLARATION: {\n // type declarations must be top-level because function bodies are evaluated when\n // reachaable only.\n if (this.currentFlow.parentFunction == this.startFunctionInstance) {\n return module.createNop();\n }\n // otherwise fall-through\n }\n default: {\n assert(false);\n stmt = module.createUnreachable();\n }\n }\n if (this.options.sourceMap) this.addDebugLocation(stmt, statement.range);\n return stmt;\n }\n\n compileStatements(statements: Statement[]): ExpressionRef[] {\n var numStatements = statements.length;\n var stmts = new Array(numStatements);\n stmts.length = 0;\n var flow = this.currentFlow;\n for (let i = 0; i < numStatements; ++i) {\n let stmt = this.compileStatement(statements[i]);\n switch (getExpressionId(stmt)) {\n case ExpressionId.Block: {\n if (!getBlockName(stmt)) {\n for (let j = 0, k = getBlockChildCount(stmt); j < k; ++j) stmts.push(getBlockChild(stmt, j));\n break;\n }\n // fall-through\n }\n default: stmts.push(stmt);\n case ExpressionId.Nop:\n }\n if (flow.isAny(FlowFlags.ANY_TERMINATING)) {\n if (needsExplicitUnreachable(stmt)) stmts.push(this.module.createUnreachable());\n break;\n }\n }\n return stmts;\n }\n\n compileBlockStatement(statement: BlockStatement): ExpressionRef {\n var statements = statement.statements;\n var outerFlow = this.currentFlow;\n var innerFlow = outerFlow.fork();\n this.currentFlow = innerFlow;\n\n var stmts = this.compileStatements(statements);\n var stmt = stmts.length == 0\n ? this.module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : this.module.createBlock(null, stmts,getExpressionType(stmts[stmts.length - 1]));\n\n innerFlow.freeScopedLocals();\n outerFlow.inherit(innerFlow);\n this.currentFlow = outerFlow;\n return stmt;\n }\n\n compileBreakStatement(statement: BreakStatement): ExpressionRef {\n var module = this.module;\n if (statement.label) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n statement.label.range\n );\n return module.createUnreachable();\n }\n var flow = this.currentFlow;\n var breakLabel = flow.breakLabel;\n if (breakLabel == null) {\n this.error(\n DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement,\n statement.range\n );\n return module.createUnreachable();\n }\n flow.set(FlowFlags.BREAKS);\n return module.createBreak(breakLabel);\n }\n\n compileContinueStatement(statement: ContinueStatement): ExpressionRef {\n var module = this.module;\n var label = statement.label;\n if (label) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n label.range\n );\n return module.createUnreachable();\n }\n // Check if 'continue' is allowed here\n var flow = this.currentFlow;\n var continueLabel = flow.continueLabel;\n if (continueLabel == null) {\n this.error(\n DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement,\n statement.range\n );\n return module.createUnreachable();\n }\n flow.set(FlowFlags.CONTINUES);\n return module.createBreak(continueLabel);\n }\n\n compileDoStatement(statement: DoStatement): ExpressionRef {\n var module = this.module;\n\n var outerFlow = this.currentFlow;\n var label = outerFlow.pushBreakLabel();\n var innerFlow = outerFlow.fork();\n this.currentFlow = innerFlow;\n var breakLabel = \"break|\" + label;\n innerFlow.breakLabel = breakLabel;\n var continueLabel = \"continue|\" + label;\n innerFlow.continueLabel = continueLabel;\n\n var body = this.compileStatement(statement.statement);\n var condExpr = this.makeIsTrueish(\n this.compileExpression(statement.condition, Type.i32, ConversionKind.NONE, WrapMode.NONE),\n this.currentType\n );\n // TODO: check if condition is always false and if so, omit it (just a block)\n\n // Switch back to the parent flow\n innerFlow.freeScopedLocals();\n outerFlow.popBreakLabel();\n this.currentFlow = outerFlow;\n var terminated = innerFlow.isAny(FlowFlags.ANY_TERMINATING);\n innerFlow.unset(\n FlowFlags.BREAKS |\n FlowFlags.CONDITIONALLY_BREAKS |\n FlowFlags.CONTINUES |\n FlowFlags.CONDITIONALLY_CONTINUES\n );\n outerFlow.inherit(innerFlow);\n\n var block: ExpressionRef[] = [\n module.createLoop(continueLabel,\n terminated\n ? body // skip trailing continue if unnecessary\n : module.createBlock(null, [\n body,\n module.createBreak(continueLabel, condExpr)\n ], NativeType.None)\n )\n ];\n if (terminated) block.push(module.createUnreachable());\n return module.createBlock(breakLabel, block);\n }\n\n compileEmptyStatement(statement: EmptyStatement): ExpressionRef {\n return this.module.createNop();\n }\n\n compileExpressionStatement(statement: ExpressionStatement): ExpressionRef {\n var expr = this.compileExpression(statement.expression, Type.void, ConversionKind.NONE, WrapMode.NONE);\n if (this.currentType != Type.void) {\n expr = this.module.createDrop(expr);\n this.currentType = Type.void;\n }\n return expr;\n }\n\n compileForStatement(statement: ForStatement): ExpressionRef {\n // A for statement initiates a new branch with its own scoped variables\n // possibly declared in its initializer, and break context.\n var outerFlow = this.currentFlow;\n var label = outerFlow.pushBreakLabel();\n var innerFlow = outerFlow.fork();\n this.currentFlow = innerFlow;\n var breakLabel = innerFlow.breakLabel = \"break|\" + label;\n innerFlow.breakLabel = breakLabel;\n var continueLabel = \"continue|\" + label;\n innerFlow.continueLabel = continueLabel;\n var repeatLabel = \"repeat|\" + label;\n\n // Compile in correct order\n var module = this.module;\n var initExpr = statement.initializer\n ? this.compileStatement(statement.initializer)\n : 0;\n var condExpr: ExpressionRef = 0;\n var alwaysTrue = false;\n if (statement.condition) {\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n // check if the condition is always true\n let condPre = module.precomputeExpression(condExpr);\n if (getExpressionId(condPre) == ExpressionId.Const) {\n assert(getExpressionType(condPre) == NativeType.I32);\n if (getConstValueI32(condPre) != 0) alwaysTrue = true;\n // TODO: could skip compilation if the condition is always false here, but beware that the\n // initializer could still declare new 'var's that are used later on.\n }\n // recompile to original\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n } else {\n // omitted condition is always true\n condExpr = module.createI32(1);\n alwaysTrue = true;\n }\n var incrExpr = statement.incrementor\n ? this.compileExpression(statement.incrementor, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE)\n : 0;\n var bodyStatement = statement.statement;\n var bodyExpr = bodyStatement.kind == NodeKind.BLOCK && (bodyStatement).statements.length == 1\n ? this.compileStatement((bodyStatement).statements[0])\n : this.compileStatement(bodyStatement);\n\n // Switch back to the parent flow\n innerFlow.freeScopedLocals();\n outerFlow.popBreakLabel();\n this.currentFlow = outerFlow;\n var usesContinue = innerFlow.isAny(FlowFlags.CONTINUES | FlowFlags.CONDITIONALLY_CONTINUES);\n innerFlow.unset(\n FlowFlags.BREAKS |\n FlowFlags.CONDITIONALLY_BREAKS |\n FlowFlags.CONTINUES |\n FlowFlags.CONDITIONALLY_CONTINUES\n );\n if (alwaysTrue) outerFlow.inherit(innerFlow);\n else outerFlow.inheritConditional(innerFlow);\n\n var breakBlock = new Array(); // outer 'break' block\n if (initExpr) breakBlock.push(initExpr);\n\n var repeatBlock = new Array(); // block repeating the loop\n if (usesContinue) {\n repeatBlock.push(\n module.createBlock(continueLabel, [ // inner 'continue' block\n module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr)),\n bodyExpr\n ], NativeType.None)\n );\n } else { // can omit the 'continue' block\n repeatBlock.push(\n module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr))\n );\n repeatBlock.push(bodyExpr);\n }\n if (incrExpr) repeatBlock.push(incrExpr);\n repeatBlock.push(\n module.createBreak(repeatLabel)\n );\n\n breakBlock.push(\n module.createLoop(repeatLabel, module.createBlock(null, repeatBlock, NativeType.None))\n );\n\n return module.createBlock(breakLabel, breakBlock);\n }\n\n compileIfStatement(statement: IfStatement): ExpressionRef {\n var module = this.module;\n var ifTrue = statement.ifTrue;\n var ifFalse = statement.ifFalse;\n var outerFlow = this.currentFlow;\n var actualFunction = outerFlow.actualFunction;\n\n // The condition doesn't initiate a branch yet\n var condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n\n if (\n !this.options.noTreeShaking ||\n actualFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\n ) {\n // Try to eliminate unnecesssary branches if the condition is constant\n let condExprPrecomp = module.precomputeExpression(condExpr);\n if (\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\n getExpressionType(condExprPrecomp) == NativeType.I32\n ) {\n return getConstValueI32(condExprPrecomp)\n ? this.compileStatement(ifTrue)\n : ifFalse\n ? this.compileStatement(ifFalse)\n : module.createNop();\n\n // Otherwise recompile to the original and let the optimizer decide\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n }\n }\n\n // Each arm initiates a branch\n var ifTrueFlow = outerFlow.fork();\n this.currentFlow = ifTrueFlow;\n var ifTrueExpr = this.compileStatement(ifTrue);\n ifTrueFlow.freeScopedLocals();\n this.currentFlow = outerFlow;\n\n var ifFalseExpr: ExpressionRef = 0;\n if (ifFalse) {\n let ifFalseFlow = outerFlow.fork();\n this.currentFlow = ifFalseFlow;\n ifFalseExpr = this.compileStatement(ifFalse);\n ifFalseFlow.freeScopedLocals();\n this.currentFlow = outerFlow;\n outerFlow.inheritMutual(ifTrueFlow, ifFalseFlow);\n } else {\n outerFlow.inheritConditional(ifTrueFlow);\n }\n return module.createIf(condExpr, ifTrueExpr, ifFalseExpr);\n }\n\n compileReturnStatement(statement: ReturnStatement): ExpressionRef {\n var module = this.module;\n var expr: ExpressionRef = 0;\n var flow = this.currentFlow;\n var returnType = flow.returnType;\n\n // Remember that this flow returns\n flow.set(FlowFlags.RETURNS);\n\n if (statement.value) {\n if (returnType == Type.void) {\n this.compileExpressionRetainType(statement.value, returnType, WrapMode.NONE);\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n statement.value.range, this.currentType.toString(), returnType.toString()\n );\n this.currentType = Type.void;\n return module.createUnreachable();\n }\n expr = this.compileExpression(\n statement.value,\n returnType,\n ConversionKind.IMPLICIT,\n flow.actualFunction.is(CommonFlags.MODULE_EXPORT)\n ? WrapMode.WRAP\n : WrapMode.NONE\n );\n\n // Remember whether returning a properly wrapped value\n if (!flow.canOverflow(expr, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\n\n } else if (returnType != Type.void) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n statement.range, \"void\", returnType.toString()\n );\n expr = module.createUnreachable();\n }\n\n // If the last statement anyway, make it the block's return value\n if (isLastStatement(statement)) return expr ? expr : module.createNop();\n\n // When inlining, break to the end of the inlined function's block (no need to wrap)\n if (flow.is(FlowFlags.INLINE_CONTEXT)) return module.createBreak(assert(flow.inlineReturnLabel), 0, expr);\n\n return module.createReturn(expr);\n }\n\n compileSwitchStatement(statement: SwitchStatement): ExpressionRef {\n var module = this.module;\n\n var cases = statement.cases;\n var numCases = cases.length;\n if (!numCases) {\n return this.compileExpression(statement.condition, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE);\n }\n\n // Everything within a switch uses the same break context\n var outerFlow = this.currentFlow;\n var context = outerFlow.pushBreakLabel();\n\n // introduce a local for evaluating the condition (exactly once)\n var tempLocal = outerFlow.getTempLocal(Type.u32, false);\n var tempLocalIndex = tempLocal.index;\n\n // Prepend initializer to inner block. Does not initiate a new branch, yet.\n var breaks = new Array(1 + numCases);\n breaks[0] = module.createSetLocal( // initializer\n tempLocalIndex,\n this.compileExpression(statement.condition, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\n );\n\n // make one br_if per (possibly dynamic) labeled case (binaryen optimizes to br_table where possible)\n var breakIndex = 1;\n var defaultIndex = -1;\n for (let i = 0; i < numCases; ++i) {\n let case_ = cases[i];\n let label = case_.label;\n if (label) {\n breaks[breakIndex++] = module.createBreak(\"case\" + i.toString(10) + \"|\" + context,\n module.createBinary(BinaryOp.EqI32,\n module.createGetLocal(tempLocalIndex, NativeType.I32),\n this.compileExpression(label, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\n )\n );\n } else {\n defaultIndex = i;\n }\n }\n\n outerFlow.freeTempLocal(tempLocal);\n\n // otherwise br to default respectively out of the switch if there is no default case\n breaks[breakIndex] = module.createBreak((defaultIndex >= 0\n ? \"case\" + defaultIndex.toString(10)\n : \"break\"\n ) + \"|\" + context);\n\n // nest blocks in order\n var currentBlock = module.createBlock(\"case0|\" + context, breaks, NativeType.None);\n var alwaysReturns = true;\n var alwaysReturnsWrapped = true;\n var alwaysThrows = true;\n var alwaysAllocates = true;\n for (let i = 0; i < numCases; ++i) {\n let case_ = cases[i];\n let statements = case_.statements;\n let numStatements = statements.length;\n\n // Each switch case initiates a new branch\n let innerFlow = outerFlow.fork();\n this.currentFlow = innerFlow;\n let breakLabel = \"break|\" + context;\n innerFlow.breakLabel = breakLabel;\n\n let isLast = i == numCases - 1;\n let nextLabel = isLast ? breakLabel : \"case\" + (i + 1).toString(10) + \"|\" + context;\n let stmts = new Array(1 + numStatements);\n stmts[0] = currentBlock;\n let count = 1;\n let terminated = false;\n for (let j = 0; j < numStatements; ++j) {\n let stmt = this.compileStatement(statements[j]);\n if (getExpressionId(stmt) != ExpressionId.Nop) {\n stmts[count++] = stmt;\n if (innerFlow.isAny(FlowFlags.ANY_TERMINATING)) {\n terminated = true;\n break;\n }\n }\n }\n stmts.length = count;\n if (terminated || isLast) {\n if (!innerFlow.is(FlowFlags.RETURNS)) alwaysReturns = false;\n if (!innerFlow.is(FlowFlags.RETURNS_WRAPPED)) alwaysReturnsWrapped = false;\n if (!innerFlow.is(FlowFlags.THROWS)) alwaysThrows = false;\n if (!innerFlow.is(FlowFlags.ALLOCATES)) alwaysAllocates = false;\n }\n\n // Switch back to the parent flow\n innerFlow.unset(\n FlowFlags.BREAKS |\n FlowFlags.CONDITIONALLY_BREAKS\n );\n innerFlow.freeScopedLocals();\n this.currentFlow = outerFlow;\n currentBlock = module.createBlock(nextLabel, stmts, NativeType.None); // must be a labeled block\n }\n outerFlow.popBreakLabel();\n\n // If the switch has a default (guaranteed to handle any value), propagate common flags\n if (defaultIndex >= 0) {\n if (alwaysReturns) outerFlow.set(FlowFlags.RETURNS);\n if (alwaysReturnsWrapped) outerFlow.set(FlowFlags.RETURNS_WRAPPED);\n if (alwaysThrows) outerFlow.set(FlowFlags.THROWS);\n if (alwaysAllocates) outerFlow.set(FlowFlags.ALLOCATES);\n }\n return currentBlock;\n }\n\n compileThrowStatement(statement: ThrowStatement): ExpressionRef {\n var flow = this.currentFlow;\n\n // Remember that this branch throws\n flow.set(FlowFlags.THROWS);\n\n // FIXME: without try-catch it is safe to assume RETURNS as well for now\n flow.set(FlowFlags.RETURNS);\n\n // TODO: requires exception-handling spec.\n return compileAbort(this, null, statement);\n }\n\n compileTryStatement(statement: TryStatement): ExpressionRef {\n // TODO\n // can't yet support something like: try { return ... } finally { ... }\n // worthwhile to investigate lowering returns to block results (here)?\n this.error(\n DiagnosticCode.Operation_not_supported,\n statement.range\n );\n return this.module.createUnreachable();\n }\n\n /**\n * Compiles a variable statement. Returns `0` if an initializer is not\n * necessary.\n */\n compileVariableStatement(statement: VariableStatement, isKnownGlobal: bool = false): ExpressionRef {\n var program = this.program;\n var declarations = statement.declarations;\n var numDeclarations = declarations.length;\n var flow = this.currentFlow;\n\n // top-level variables and constants become globals\n if (isKnownGlobal || (\n flow.parentFunction == this.startFunctionInstance &&\n statement.parent && statement.parent.kind == NodeKind.SOURCE\n )) {\n // NOTE that the above condition also covers top-level variables declared with 'let', even\n // though such variables could also become start function locals if, and only if, not used\n // within any function declared in the same source, which is unknown at this point. the only\n // efficient way to deal with this would be to keep track of all occasions it is used and\n // replace these instructions afterwards, dynamically. (TOOD: what about a Binaryen pass?)\n for (let i = 0; i < numDeclarations; ++i) {\n this.compileGlobalDeclaration(declarations[i]);\n }\n return 0;\n }\n\n // other variables become locals\n var initializers = new Array();\n var resolver = this.resolver;\n for (let i = 0; i < numDeclarations; ++i) {\n let declaration = declarations[i];\n let name = declaration.name.text;\n let type: Type | null = null;\n let initExpr: ExpressionRef = 0;\n if (declaration.type) {\n type = resolver.resolveType( // reports\n declaration.type,\n flow.contextualTypeArguments\n );\n if (!type) continue;\n if (declaration.initializer) {\n initExpr = this.compileExpression( // reports\n declaration.initializer,\n type,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n }\n } else if (declaration.initializer) { // infer type using void/NONE for proper literal inference\n initExpr = this.compileExpressionRetainType( // reports\n declaration.initializer,\n Type.void,\n WrapMode.NONE\n );\n if (this.currentType == Type.void) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n declaration.range, this.currentType.toString(), \"\"\n );\n continue;\n }\n type = this.currentType;\n } else {\n this.error(\n DiagnosticCode.Type_expected,\n declaration.name.range.atEnd\n );\n continue;\n }\n let isInlined = false;\n if (declaration.is(CommonFlags.CONST)) {\n if (initExpr) {\n initExpr = this.module.precomputeExpression(initExpr);\n if (getExpressionId(initExpr) == ExpressionId.Const) {\n let local = new Local(program, name, -1, type);\n switch (getExpressionType(initExpr)) {\n case NativeType.I32: {\n local = local.withConstantIntegerValue(\n i64_new(\n getConstValueI32(initExpr),\n 0\n )\n );\n break;\n }\n case NativeType.I64: {\n local = local.withConstantIntegerValue(\n i64_new(\n getConstValueI64Low(initExpr),\n getConstValueI64High(initExpr)\n )\n );\n break;\n }\n case NativeType.F32: {\n local = local.withConstantFloatValue(getConstValueF32(initExpr));\n break;\n }\n case NativeType.F64: {\n local = local.withConstantFloatValue(getConstValueF64(initExpr));\n break;\n }\n default: {\n assert(false);\n return this.module.createUnreachable();\n }\n }\n // Create a virtual local that doesn't actually exist in WebAssembly\n let scopedLocals = flow.scopedLocals;\n if (!scopedLocals) flow.scopedLocals = scopedLocals = new Map();\n else if (scopedLocals.has(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, name\n );\n return this.module.createUnreachable();\n }\n scopedLocals.set(name, local);\n isInlined = true;\n } else {\n this.warning(\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\n declaration.range\n );\n }\n } else {\n this.error(\n DiagnosticCode._const_declarations_must_be_initialized,\n declaration.range\n );\n }\n }\n if (!isInlined) {\n let local: Local;\n if (\n declaration.isAny(CommonFlags.LET | CommonFlags.CONST) ||\n flow.is(FlowFlags.INLINE_CONTEXT)\n ) { // here: not top-level\n local = flow.addScopedLocal(name, type, false, declaration.name); // reports if duplicate\n } else {\n if (flow.lookupLocal(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, name\n );\n continue;\n }\n local = flow.parentFunction.addLocal(type, name, declaration);\n }\n if (initExpr) {\n initializers.push(\n this.compileAssignmentWithValue(declaration.name, initExpr)\n );\n if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n flow.setLocalWrapped(local.index, !flow.canOverflow(initExpr, type));\n }\n } else if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n flow.setLocalWrapped(local.index, true); // zero\n }\n }\n }\n return initializers.length // we can unwrap these here because the\n ? initializers.length == 1 // source didn't tell us exactly what to do\n ? initializers[0]\n : this.module.createBlock(null, initializers, NativeType.None)\n : 0;\n }\n\n compileVoidStatement(statement: VoidStatement): ExpressionRef {\n return this.compileExpression(statement.expression, Type.void, ConversionKind.EXPLICIT, WrapMode.NONE);\n }\n\n compileWhileStatement(statement: WhileStatement): ExpressionRef {\n var module = this.module;\n var outerFlow = this.currentFlow;\n\n // The condition does not yet initialize a branch\n var condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n\n if (\n !this.options.noTreeShaking ||\n outerFlow.actualFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\n ) {\n // Try to eliminate unnecesssary loops if the condition is constant\n let condExprPrecomp = module.precomputeExpression(condExpr);\n if (\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\n getExpressionType(condExprPrecomp) == NativeType.I32\n ) {\n if (!getConstValueI32(condExprPrecomp)) return module.createNop();\n\n // Otherwise recompile to the original and let the optimizer decide\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n }\n }\n\n // Statements initiate a new branch with its own break context\n var label = outerFlow.pushBreakLabel();\n var innerFlow = outerFlow.fork();\n this.currentFlow = innerFlow;\n var breakLabel = \"break|\" + label;\n innerFlow.breakLabel = breakLabel;\n var continueLabel = \"continue|\" + label;\n innerFlow.continueLabel = continueLabel;\n\n var body = this.compileStatement(statement.statement);\n var alwaysTrue = false; // TODO\n var terminated = innerFlow.isAny(FlowFlags.ANY_TERMINATING);\n\n // Switch back to the parent flow\n innerFlow.freeScopedLocals();\n outerFlow.popBreakLabel();\n this.currentFlow = outerFlow;\n innerFlow.unset(\n FlowFlags.BREAKS |\n FlowFlags.CONDITIONALLY_BREAKS |\n FlowFlags.CONTINUES |\n FlowFlags.CONDITIONALLY_CONTINUES\n );\n if (alwaysTrue) outerFlow.inherit(innerFlow);\n else outerFlow.inheritConditional(innerFlow);\n\n return module.createBlock(breakLabel, [\n module.createLoop(continueLabel,\n module.createIf(condExpr,\n terminated\n ? body // skip trailing continue if unnecessary\n : module.createBlock(null, [\n body,\n module.createBreak(continueLabel)\n ], NativeType.None)\n )\n )\n ]);\n }\n\n // expressions\n\n /**\n * Compiles the value of an inlined constant element.\n * @param retainType If true, the annotated type of the constant is retained. Otherwise, the value\n * is precomputed according to context.\n */\n compileInlineConstant(\n element: VariableLikeElement,\n contextualType: Type,\n retainType: bool\n ): ExpressionRef {\n assert(element.is(CommonFlags.INLINED));\n var type = element.type;\n switch (\n !retainType &&\n type.is(TypeFlags.INTEGER) &&\n contextualType.is(TypeFlags.INTEGER) &&\n type.size < contextualType.size\n ? (this.currentType = contextualType).kind // essentially precomputes a (sign-)extension\n : (this.currentType = type).kind\n ) {\n case TypeKind.I8:\n case TypeKind.I16: {\n let shift = type.computeSmallIntegerShift(Type.i32);\n return this.module.createI32(\n element.constantValueKind == ConstantValueKind.INTEGER\n ? i64_low(element.constantIntegerValue) << shift >> shift\n : 0\n ); // recognized by canOverflow\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n let mask = element.type.computeSmallIntegerMask(Type.i32);\n return this.module.createI32(\n element.constantValueKind == ConstantValueKind.INTEGER\n ? i64_low(element.constantIntegerValue) & mask\n : 0\n ); // recognized by canOverflow\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n return this.module.createI32(\n element.constantValueKind == ConstantValueKind.INTEGER\n ? i64_low(element.constantIntegerValue)\n : 0\n );\n }\n case TypeKind.ISIZE:\n case TypeKind.USIZE: {\n if (!element.program.options.isWasm64) {\n return this.module.createI32(\n element.constantValueKind == ConstantValueKind.INTEGER\n ? i64_low(element.constantIntegerValue)\n : 0\n );\n }\n // fall-through\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return element.constantValueKind == ConstantValueKind.INTEGER\n ? this.module.createI64(\n i64_low(element.constantIntegerValue),\n i64_high(element.constantIntegerValue)\n )\n : this.module.createI64(0);\n }\n case TypeKind.F64: {\n // monkey-patch for converting built-in floats to f32 implicitly\n if (!(element.hasDecorator(DecoratorFlags.BUILTIN) && contextualType == Type.f32)) {\n return this.module.createF64((element).constantFloatValue);\n }\n // otherwise fall-through: basically precomputes f32.demote/f64 of NaN / Infinity\n this.currentType = Type.f32;\n }\n case TypeKind.F32: {\n return this.module.createF32((element).constantFloatValue);\n }\n default: {\n assert(false);\n return this.module.createUnreachable();\n }\n }\n }\n\n compileExpression(\n expression: Expression,\n contextualType: Type,\n conversionKind: ConversionKind,\n wrapMode: WrapMode\n ): ExpressionRef {\n this.currentType = contextualType;\n\n var expr: ExpressionRef;\n switch (expression.kind) {\n case NodeKind.ASSERTION: {\n expr = this.compileAssertionExpression(expression, contextualType);\n break;\n }\n case NodeKind.BINARY: {\n expr = this.compileBinaryExpression(expression, contextualType);\n break;\n }\n case NodeKind.CALL: {\n expr = this.compileCallExpression(expression, contextualType);\n break;\n }\n case NodeKind.COMMA: {\n expr = this.compileCommaExpression(expression, contextualType);\n break;\n }\n case NodeKind.ELEMENTACCESS: {\n expr = this.compileElementAccessExpression(expression, contextualType);\n break;\n }\n case NodeKind.FUNCTION: {\n expr = this.compileFunctionExpression(expression, contextualType);\n break;\n }\n case NodeKind.IDENTIFIER:\n case NodeKind.FALSE:\n case NodeKind.NULL:\n case NodeKind.THIS:\n case NodeKind.SUPER:\n case NodeKind.TRUE: {\n expr = this.compileIdentifierExpression(\n expression,\n contextualType,\n conversionKind == ConversionKind.NONE // retain type of inlined constants\n );\n break;\n }\n case NodeKind.INSTANCEOF: {\n expr = this.compileInstanceOfExpression(expression, contextualType);\n break;\n }\n case NodeKind.LITERAL: {\n expr = this.compileLiteralExpression(expression, contextualType);\n break;\n }\n case NodeKind.NEW: {\n expr = this.compileNewExpression(expression, contextualType);\n break;\n }\n case NodeKind.PARENTHESIZED: {\n expr = this.compileParenthesizedExpression(expression, contextualType);\n break;\n }\n case NodeKind.PROPERTYACCESS: {\n expr = this.compilePropertyAccessExpression(\n expression,\n contextualType,\n conversionKind == ConversionKind.NONE // retain type of inlined constants\n );\n break;\n }\n case NodeKind.TERNARY: {\n expr = this.compileTernaryExpression(expression, contextualType);\n break;\n }\n case NodeKind.UNARYPOSTFIX: {\n expr = this.compileUnaryPostfixExpression(expression, contextualType);\n break;\n }\n case NodeKind.UNARYPREFIX: {\n expr = this.compileUnaryPrefixExpression(expression, contextualType);\n break;\n }\n default: {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n expr = this.module.createUnreachable();\n }\n }\n\n var currentType = this.currentType;\n if (conversionKind != ConversionKind.NONE && currentType != contextualType) {\n expr = this.convertExpression(expr, currentType, contextualType, conversionKind, wrapMode, expression);\n this.currentType = contextualType;\n } else if (wrapMode == WrapMode.WRAP) {\n expr = this.ensureSmallIntegerWrap(expr, currentType);\n }\n\n if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\n return expr;\n }\n\n compileExpressionRetainType(\n expression: Expression,\n contextualType: Type,\n wrapMode: WrapMode\n ): ExpressionRef {\n return this.compileExpression(\n expression,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n wrapMode\n );\n }\n\n precomputeExpression(\n expression: Expression,\n contextualType: Type,\n conversionKind: ConversionKind,\n wrapMode: WrapMode\n ): ExpressionRef {\n return this.module.precomputeExpression(\n this.compileExpression(expression, contextualType, conversionKind, wrapMode)\n );\n }\n\n convertExpression(\n expr: ExpressionRef,\n fromType: Type,\n toType: Type,\n conversionKind: ConversionKind,\n wrapMode: WrapMode,\n reportNode: Node\n ): ExpressionRef {\n assert(conversionKind != ConversionKind.NONE);\n var module = this.module;\n\n // void to any\n if (fromType.kind == TypeKind.VOID) {\n assert(toType.kind != TypeKind.VOID); // convertExpression should not be called with void -> void\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n reportNode.range, fromType.toString(), toType.toString()\n );\n return module.createUnreachable();\n }\n\n // any to void\n if (toType.kind == TypeKind.VOID) return module.createDrop(expr);\n\n if (!fromType.isAssignableTo(toType)) {\n if (conversionKind == ConversionKind.IMPLICIT) {\n this.error(\n DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,\n reportNode.range, fromType.toString(), toType.toString()\n ); // recoverable\n }\n }\n\n if (fromType.is(TypeFlags.FLOAT)) {\n\n // float to float\n if (toType.is(TypeFlags.FLOAT)) {\n if (fromType.kind == TypeKind.F32) {\n\n // f32 to f64\n if (toType.kind == TypeKind.F64) {\n expr = module.createUnary(UnaryOp.PromoteF32, expr);\n }\n\n // otherwise f32 to f32\n\n // f64 to f32\n } else if (toType.kind == TypeKind.F32) {\n expr = module.createUnary(UnaryOp.DemoteF64, expr);\n }\n\n // otherwise f64 to f64\n\n // float to int\n } else if (toType.is(TypeFlags.INTEGER)) {\n\n // f32 to int\n if (fromType.kind == TypeKind.F32) {\n if (toType == Type.bool) {\n expr = module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\n wrapMode = WrapMode.NONE;\n } else if (toType.is(TypeFlags.SIGNED)) {\n if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.TruncF32ToI64, expr);\n } else {\n expr = module.createUnary(UnaryOp.TruncF32ToI32, expr);\n }\n } else {\n if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.TruncF32ToU64, expr);\n } else {\n expr = module.createUnary(UnaryOp.TruncF32ToU32, expr);\n }\n }\n\n // f64 to int\n } else {\n if (toType == Type.bool) {\n expr = module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\n wrapMode = WrapMode.NONE;\n } else if (toType.is(TypeFlags.SIGNED)) {\n if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.TruncF64ToI64, expr);\n } else {\n expr = module.createUnary(UnaryOp.TruncF64ToI32, expr);\n }\n } else {\n if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.TruncF64ToU64, expr);\n } else {\n expr = module.createUnary(UnaryOp.TruncF64ToU32, expr);\n }\n }\n }\n\n // float to void\n } else {\n assert(toType.flags == TypeFlags.NONE, \"void type expected\");\n expr = module.createDrop(expr);\n }\n\n // int to float\n } else if (fromType.is(TypeFlags.INTEGER) && toType.is(TypeFlags.FLOAT)) {\n\n // int to f32\n if (toType.kind == TypeKind.F32) {\n if (fromType.is(TypeFlags.LONG)) {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED)\n ? UnaryOp.ConvertI64ToF32\n : UnaryOp.ConvertU64ToF32,\n expr\n );\n } else {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED)\n ? UnaryOp.ConvertI32ToF32\n : UnaryOp.ConvertU32ToF32,\n expr\n );\n }\n\n // int to f64\n } else {\n if (fromType.is(TypeFlags.LONG)) {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED)\n ? UnaryOp.ConvertI64ToF64\n : UnaryOp.ConvertU64ToF64,\n expr\n );\n } else {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED)\n ? UnaryOp.ConvertI32ToF64\n : UnaryOp.ConvertU32ToF64,\n expr\n );\n }\n }\n\n // int to int\n } else {\n // i64 to ...\n if (fromType.is(TypeFlags.LONG)) {\n\n // i64 to i32 or smaller\n if (toType == Type.bool) {\n expr = module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\n wrapMode = WrapMode.NONE;\n } else if (!toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.WrapI64, expr); // discards upper bits\n }\n\n // i32 or smaller to i64\n } else if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED) ? UnaryOp.ExtendI32 : UnaryOp.ExtendU32,\n this.ensureSmallIntegerWrap(expr, fromType) // must clear garbage bits\n );\n wrapMode = WrapMode.NONE;\n\n // i32 to i32\n } else {\n // small i32 to ...\n if (fromType.is(TypeFlags.SHORT)) {\n // small i32 to larger i32\n if (fromType.size < toType.size) {\n expr = this.ensureSmallIntegerWrap(expr, fromType); // must clear garbage bits\n wrapMode = WrapMode.NONE;\n }\n }\n }\n }\n\n this.currentType = toType;\n return wrapMode == WrapMode.WRAP\n ? this.ensureSmallIntegerWrap(expr, toType)\n : expr;\n }\n\n compileAssertionExpression(expression: AssertionExpression, contextualType: Type): ExpressionRef {\n switch (expression.assertionKind) {\n case AssertionKind.PREFIX:\n case AssertionKind.AS: {\n let toType = this.resolver.resolveType( // reports\n assert(expression.toType),\n this.currentFlow.contextualTypeArguments\n );\n if (!toType) return this.module.createUnreachable();\n return this.compileExpression(expression.expression, toType, ConversionKind.EXPLICIT, WrapMode.NONE);\n }\n case AssertionKind.NONNULL: {\n assert(!expression.toType);\n let expr = this.compileExpressionRetainType(expression.expression, contextualType, WrapMode.NONE);\n this.currentType = this.currentType.nonNullableType;\n return expr;\n }\n default: assert(false);\n }\n return this.module.createUnreachable();\n }\n\n private f32ModInstance: Function | null = null;\n private f64ModInstance: Function | null = null;\n private f32PowInstance: Function | null = null;\n private f64PowInstance: Function | null = null;\n\n compileBinaryExpression(\n expression: BinaryExpression,\n contextualType: Type\n ): ExpressionRef {\n var module = this.module;\n var left = expression.left;\n var right = expression.right;\n\n var leftExpr: ExpressionRef;\n var leftType: Type;\n var rightExpr: ExpressionRef;\n var rightType: Type;\n var commonType: Type | null;\n\n var expr: ExpressionRef;\n var compound = false;\n\n var operator = expression.operator;\n switch (operator) {\n case Token.LESSTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.LT);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"<\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.LtI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.LtI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.LtI64\n : BinaryOp.LtI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.LtU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.LtU64\n : BinaryOp.LtU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.LtU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.LtF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.LtF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.GREATERTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.GT);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \">\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.GtI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.GtI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.GtU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.GtU64\n : BinaryOp.GtU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.GtU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.GtF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.GtF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.LESSTHAN_EQUALS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.LE);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"<=\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.LeI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.LeI64\n : BinaryOp.LeI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.LeI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.LeU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.LeU64\n : BinaryOp.LeU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.LeU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.LeF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.LeF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.GREATERTHAN_EQUALS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.GE);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \">=\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.GeI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.GeI64\n : BinaryOp.GeI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.GeI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.GeU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.GeU64\n : BinaryOp.GeU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.GeU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.GeF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.GeF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n\n case Token.EQUALS_EQUALS_EQUALS:\n case Token.EQUALS_EQUALS: {\n\n // NOTE that this favors correctness, in terms of emitting a binary expression, over\n // checking for a possible use of unary EQZ. while the most classic of all optimizations,\n // that's not what the source told us to do. for reference, `!left` emits unary EQZ.\n\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (operator == Token.EQUALS_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.EQ);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n // still allow '==' with references\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.EqI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.EqI64\n : BinaryOp.EqI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.EqI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.EqF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.EqF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.EXCLAMATION_EQUALS_EQUALS:\n case Token.EXCLAMATION_EQUALS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (operator == Token.EXCLAMATION_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.NE);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n // still allow '!=' with references\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.NeI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.NeI64\n : BinaryOp.NeI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.NeI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.NeF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.NeF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.EQUALS: {\n return this.compileAssignment(left, right, contextualType);\n }\n case Token.PLUS_EQUALS: compound = true;\n case Token.PLUS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.ADD);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"+\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8: // addition might overflow\n case TypeKind.I16: // ^\n case TypeKind.U8: // ^\n case TypeKind.U16: // ^\n case TypeKind.BOOL: // ^\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.AddI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.AddI64\n : BinaryOp.AddI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.AddI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.AddF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.AddF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.MINUS_EQUALS: compound = true;\n case Token.MINUS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.SUB);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"-\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8: // subtraction might overflow\n case TypeKind.I16: // ^\n case TypeKind.U8: // ^\n case TypeKind.U16: // ^\n case TypeKind.BOOL: // ^\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.SubI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.SubI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.SubF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.SubF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.ASTERISK_EQUALS: compound = true;\n case Token.ASTERISK: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.MUL);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"*\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL:\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.MulI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.MulI64\n : BinaryOp.MulI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.MulI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.MulF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.MulF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.ASTERISK_ASTERISK_EQUALS: compound = true;\n case Token.ASTERISK_ASTERISK: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.POW);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n let instance: Function | null;\n\n // Mathf.pow if lhs is f32 (result is f32)\n if (this.currentType.kind == TypeKind.F32) {\n rightExpr = this.compileExpression(right, Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n if (!(instance = this.f32PowInstance)) {\n let namespace = this.program.elementsLookup.get(\"Mathf\");\n if (!namespace) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Mathf\"\n );\n expr = module.createUnreachable();\n break;\n }\n let prototype = namespace.members ? namespace.members.get(\"pow\") : null;\n if (!prototype) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Mathf.pow\"\n );\n expr = module.createUnreachable();\n break;\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.f32PowInstance = instance = this.resolver.resolveFunction(prototype, null);\n }\n\n // Math.pow otherwise (result is f64)\n // TODO: should the result be converted back?\n } else {\n leftExpr = this.convertExpression(\n leftExpr,\n this.currentType,\n Type.f64,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n leftType = this.currentType;\n rightExpr = this.compileExpression(\n right,\n Type.f64,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n rightType = this.currentType;\n if (!(instance = this.f64PowInstance)) {\n let namespace = this.program.elementsLookup.get(\"Math\");\n if (!namespace) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Math\"\n );\n expr = module.createUnreachable();\n break;\n }\n let prototype = namespace.members ? namespace.members.get(\"pow\") : null;\n if (!prototype) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Math.pow\"\n );\n expr = module.createUnreachable();\n break;\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.f64PowInstance = instance = this.resolver.resolveFunction(prototype, null);\n }\n }\n if (!(instance && this.compileFunction(instance))) {\n expr = module.createUnreachable();\n } else {\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\n }\n break;\n }\n case Token.SLASH_EQUALS: compound = true;\n case Token.SLASH: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.DIV);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP, // !\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP, // !\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"/\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8: // signed div on signed small integers might overflow, e.g. -128/-1\n case TypeKind.I16: // ^\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.DivI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.DivI64\n : BinaryOp.DivI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.DivI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.DivU64\n : BinaryOp.DivU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.DivU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.DivF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.DivF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.PERCENT_EQUALS: compound = true;\n case Token.PERCENT: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.REM);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP, // !\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP, // !\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"%\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16: {\n expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.RemI64\n : BinaryOp.RemI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.RemI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.RemU64\n : BinaryOp.RemU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.RemU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n let instance = this.f32ModInstance;\n if (!instance) {\n let namespace = this.program.elementsLookup.get(\"Mathf\");\n if (!namespace) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Mathf\"\n );\n expr = module.createUnreachable();\n break;\n }\n let prototype = namespace.members ? namespace.members.get(\"mod\") : null;\n if (!prototype) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Mathf.mod\"\n );\n expr = module.createUnreachable();\n break;\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.f32ModInstance = instance = this.resolver.resolveFunction(prototype, null);\n }\n if (!(instance && this.compileFunction(instance))) {\n expr = module.createUnreachable();\n } else {\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\n }\n break;\n }\n case TypeKind.F64: {\n let instance = this.f64ModInstance;\n if (!instance) {\n let namespace = this.program.elementsLookup.get(\"Math\");\n if (!namespace) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Math\"\n );\n expr = module.createUnreachable();\n break;\n }\n let prototype = namespace.members ? namespace.members.get(\"mod\") : null;\n if (!prototype) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Math.mod\"\n );\n expr = module.createUnreachable();\n break;\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.f64ModInstance = instance = this.resolver.resolveFunction(prototype, null);\n }\n if (!(instance && this.compileFunction(instance))) {\n expr = module.createUnreachable();\n } else {\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\n }\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.LESSTHAN_LESSTHAN_EQUALS: compound = true;\n case Token.LESSTHAN_LESSTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHL);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL:\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.ShlI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.ShlI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.ShlI64\n : BinaryOp.ShlI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\n case Token.GREATERTHAN_GREATERTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n rightType = this.currentType;\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16: {\n expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.ShrI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.ShrI64\n : BinaryOp.ShrI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.ShrU64\n : BinaryOp.ShrU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR_U);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n switch (this.currentType.kind) {\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: { // assumes that unsigned shr on unsigned small integers does not overflow\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\n }\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.ShrU64\n : BinaryOp.ShrU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.AMPERSAND_EQUALS: compound = true;\n case Token.AMPERSAND: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overloadd\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_AND);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"&\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.AndI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.AndI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.AndI64\n : BinaryOp.AndI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.BAR_EQUALS: compound = true;\n case Token.BAR: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_OR);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"|\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.OrI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.OrI64\n : BinaryOp.OrI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.CARET_EQUALS: compound = true;\n case Token.CARET: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_XOR);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"^\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.XorI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.XorI64\n : BinaryOp.XorI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n\n // logical (no overloading)\n\n case Token.AMPERSAND_AMPERSAND: { // left && right\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n\n // simplify if cloning left without side effects is possible\n if (expr = module.cloneExpression(leftExpr, true, 0)) {\n this.makeIsTrueish(leftExpr, this.currentType);\n expr = module.createIf(\n this.makeIsTrueish(leftExpr, this.currentType),\n rightExpr,\n expr\n );\n\n // if not possible, tee left to a temp. local\n } else {\n let flow = this.currentFlow;\n let tempLocal = flow.getAndFreeTempLocal(\n this.currentType,\n !flow.canOverflow(leftExpr, this.currentType)\n );\n expr = module.createIf(\n this.makeIsTrueish(\n module.createTeeLocal(tempLocal.index, leftExpr),\n this.currentType\n ),\n rightExpr,\n module.createGetLocal(\n assert(tempLocal).index, // to be sure\n this.currentType.toNativeType()\n )\n );\n }\n break;\n }\n case Token.BAR_BAR: { // left || right\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n\n // simplify if cloning left without side effects is possible\n if (expr = this.module.cloneExpression(leftExpr, true, 0)) {\n expr = this.module.createIf(\n this.makeIsTrueish(leftExpr, this.currentType),\n expr,\n rightExpr\n );\n\n // if not possible, tee left to a temp. local\n } else {\n let flow = this.currentFlow;\n let tempLocal = flow.getAndFreeTempLocal(\n this.currentType,\n !flow.canOverflow(leftExpr, this.currentType)\n );\n expr = module.createIf(\n this.makeIsTrueish(\n module.createTeeLocal(tempLocal.index, leftExpr),\n this.currentType\n ),\n module.createGetLocal(\n assert(tempLocal).index, // to be sure\n this.currentType.toNativeType()\n ),\n rightExpr\n );\n }\n break;\n }\n default: {\n assert(false);\n expr = this.module.createUnreachable();\n }\n }\n return compound\n ? this.compileAssignmentWithValue(left, expr, contextualType != Type.void)\n : expr;\n }\n\n compileUnaryOverload(\n operatorInstance: Function,\n value: Expression,\n valueExpr: ExpressionRef,\n reportNode: Node\n ): ExpressionRef {\n var argumentExpressions: Expression[];\n var thisArg: ExpressionRef = 0;\n if (operatorInstance.is(CommonFlags.INSTANCE)) {\n thisArg = valueExpr; // can reuse the previously evaluated expr as the this value here\n argumentExpressions = [];\n } else {\n argumentExpressions = [ value ]; // annotated type might differ -> recompile\n }\n return this.compileCallDirect(\n operatorInstance,\n argumentExpressions,\n reportNode,\n thisArg\n );\n }\n\n compileBinaryOverload(\n operatorInstance: Function,\n left: Expression,\n leftExpr: ExpressionRef,\n right: Expression,\n reportNode: Node\n ): ExpressionRef {\n var argumentExpressions: Expression[];\n var thisArg: ExpressionRef = 0;\n if (operatorInstance.is(CommonFlags.INSTANCE)) {\n let classInstance = assert(operatorInstance.parent); assert(classInstance.kind == ElementKind.CLASS);\n thisArg = leftExpr; // can reuse the previously evaluated leftExpr as the this value here\n argumentExpressions = [ right ];\n } else {\n argumentExpressions = [ left, right ]; // annotated type of LHS might differ -> recompile\n }\n var ret = this.compileCallDirect(\n operatorInstance,\n argumentExpressions,\n reportNode,\n thisArg\n );\n return ret;\n }\n\n compileAssignment(expression: Expression, valueExpression: Expression, contextualType: Type): ExpressionRef {\n var program = this.program;\n var resolver = program.resolver;\n var flow = this.currentFlow;\n var target = resolver.resolveExpression(expression, flow); // reports\n if (!target) return this.module.createUnreachable();\n\n // to compile just the value, we need to know the target's type\n var targetType: Type;\n switch (target.kind) {\n case ElementKind.GLOBAL: {\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field compiled as a global\n return this.module.createUnreachable();\n }\n assert((target).type != Type.void); // compileGlobal must guarantee this\n // fall-through\n }\n case ElementKind.LOCAL:\n case ElementKind.FIELD: {\n targetType = (target).type;\n break;\n }\n case ElementKind.PROPERTY: {\n let setterPrototype = (target).setterPrototype;\n if (setterPrototype) {\n let instance = this.resolver.resolveFunction(setterPrototype, null);\n if (!instance) return this.module.createUnreachable();\n assert(instance.signature.parameterTypes.length == 1); // parser must guarantee this\n targetType = instance.signature.parameterTypes[0];\n break;\n }\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, (target).internalName\n );\n return this.module.createUnreachable();\n }\n case ElementKind.CLASS: {\n if (resolver.currentElementExpression) { // indexed access\n let isUnchecked = flow.is(FlowFlags.UNCHECKED_CONTEXT);\n let indexedSet = (target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\n if (!indexedSet) {\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\n if (!indexedGet) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n expression.range, (target).internalName\n );\n } else {\n this.error(\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\n expression.range, (target).internalName\n );\n }\n return this.module.createUnreachable();\n }\n assert(indexedSet.signature.parameterTypes.length == 2); // parser must guarantee this\n targetType = indexedSet.signature.parameterTypes[1]; // 2nd parameter is the element\n break;\n }\n // fall-through\n }\n default: {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n }\n\n // compile the value and do the assignment\n assert(targetType != Type.void);\n var valueExpr = this.compileExpression(valueExpression, targetType, ConversionKind.IMPLICIT, WrapMode.NONE);\n return this.compileAssignmentWithValue(\n expression,\n valueExpr,\n contextualType != Type.void\n );\n }\n\n compileAssignmentWithValue(\n expression: Expression,\n valueWithCorrectType: ExpressionRef,\n tee: bool = false\n ): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n var target = this.resolver.resolveExpression(expression, flow); // reports\n if (!target) return module.createUnreachable();\n\n switch (target.kind) {\n case ElementKind.LOCAL: {\n let type = (target).type;\n assert(type != Type.void);\n this.currentType = tee ? type : Type.void;\n if ((target).is(CommonFlags.CONST)) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, target.internalName\n );\n return module.createUnreachable();\n }\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n flow.setLocalWrapped((target).index, !flow.canOverflow(valueWithCorrectType, type));\n }\n return tee\n ? module.createTeeLocal((target).index, valueWithCorrectType)\n : module.createSetLocal((target).index, valueWithCorrectType);\n }\n case ElementKind.GLOBAL: {\n if (!this.compileGlobal(target)) return module.createUnreachable();\n let type = (target).type;\n assert(type != Type.void);\n this.currentType = tee ? type : Type.void;\n if ((target).is(CommonFlags.CONST)) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range,\n target.internalName\n );\n return module.createUnreachable();\n }\n valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type); // guaranteed\n if (tee) {\n let nativeType = type.toNativeType();\n let internalName = target.internalName;\n return module.createBlock(null, [ // emulated teeGlobal\n module.createSetGlobal(internalName, valueWithCorrectType),\n module.createGetGlobal(internalName, nativeType)\n ], nativeType);\n } else {\n return module.createSetGlobal(target.internalName, valueWithCorrectType);\n }\n }\n case ElementKind.FIELD: {\n const declaration = (target).declaration;\n if (\n (target).is(CommonFlags.READONLY) &&\n !(\n flow.actualFunction.is(CommonFlags.CONSTRUCTOR) ||\n declaration == null ||\n declaration.initializer != null\n )\n ) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, (target).internalName\n );\n return module.createUnreachable();\n }\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n let type = (target).type;\n this.currentType = tee ? type : Type.void;\n let nativeType = type.toNativeType();\n if (type.kind == TypeKind.BOOL) {\n // make sure bools are wrapped (usually are) when storing as 8 bits\n valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type);\n }\n if (tee) {\n let flow = this.currentFlow;\n let tempLocal = flow.getAndFreeTempLocal(\n type,\n !flow.canOverflow(valueWithCorrectType, type)\n );\n let tempLocalIndex = tempLocal.index;\n // TODO: simplify if valueWithCorrectType has no side effects\n // TODO: call __gc_link here if a GC is present\n return module.createBlock(null, [\n module.createSetLocal(tempLocalIndex, valueWithCorrectType),\n module.createStore(\n type.byteSize,\n thisExpr,\n module.createGetLocal(tempLocalIndex, nativeType),\n nativeType,\n (target).memoryOffset\n ),\n module.createGetLocal(tempLocalIndex, nativeType)\n ], nativeType);\n } else {\n // TODO: call __gc_link here if a GC is present\n return module.createStore(\n type.byteSize,\n thisExpr,\n valueWithCorrectType,\n nativeType,\n (target).memoryOffset\n );\n }\n }\n case ElementKind.PROPERTY: {\n let setterPrototype = (target).setterPrototype;\n if (setterPrototype) {\n let setterInstance = this.resolver.resolveFunction(setterPrototype, null);\n if (!setterInstance) return module.createUnreachable();\n\n // call just the setter if the return value isn't of interest\n if (!tee) {\n if (setterInstance.is(CommonFlags.INSTANCE)) {\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n return this.makeCallDirect(setterInstance, [ thisExpr, valueWithCorrectType ]);\n } else {\n return this.makeCallDirect(setterInstance, [ valueWithCorrectType ]);\n }\n }\n\n // otherwise call the setter first, then the getter\n let getterPrototype = (target).getterPrototype;\n assert(getterPrototype != null); // must have one if there is a setter\n let getterInstance = this.resolver.resolveFunction(getterPrototype, null);\n if (!getterInstance) return module.createUnreachable();\n let returnType = getterInstance.signature.returnType;\n let nativeReturnType = returnType.toNativeType();\n if (setterInstance.is(CommonFlags.INSTANCE)) {\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n let tempLocal = flow.getAndFreeTempLocal(returnType, false);\n let tempLocalIndex = tempLocal.index;\n return module.createBlock(null, [\n this.makeCallDirect(setterInstance, [ // set and remember the target\n module.createTeeLocal(tempLocalIndex, thisExpr),\n valueWithCorrectType\n ]),\n this.makeCallDirect(getterInstance, [ // get from remembered target\n module.createGetLocal(tempLocalIndex, nativeReturnType)\n ])\n ], nativeReturnType);\n } else {\n // note that this must be performed here because `resolved` is shared\n return module.createBlock(null, [\n this.makeCallDirect(setterInstance, [ valueWithCorrectType ]),\n this.makeCallDirect(getterInstance)\n ], nativeReturnType);\n }\n } else {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, target.internalName\n );\n }\n return module.createUnreachable();\n }\n case ElementKind.CLASS: {\n let elementExpression = this.resolver.currentElementExpression;\n if (elementExpression) {\n let isUnchecked = flow.is(FlowFlags.UNCHECKED_CONTEXT);\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\n if (!indexedGet) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n expression.range, target.internalName\n );\n return module.createUnreachable();\n }\n let indexedSet = (target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\n if (!indexedSet) {\n this.error(\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\n expression.range, target.internalName\n );\n this.currentType = tee ? indexedGet.signature.returnType : Type.void;\n return module.createUnreachable();\n }\n let targetType = (target).type;\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n let elementExpr = this.compileExpression(\n elementExpression,\n Type.i32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n if (tee) {\n let tempLocalTarget = flow.getTempLocal(targetType, false);\n let tempLocalElement = flow.getAndFreeTempLocal(this.currentType, false);\n let returnType = indexedGet.signature.returnType;\n flow.freeTempLocal(tempLocalTarget);\n return module.createBlock(null, [\n this.makeCallDirect(indexedSet, [\n module.createTeeLocal(tempLocalTarget.index, thisExpr),\n module.createTeeLocal(tempLocalElement.index, elementExpr),\n valueWithCorrectType\n ]),\n this.makeCallDirect(indexedGet, [\n module.createGetLocal(tempLocalTarget.index, tempLocalTarget.type.toNativeType()),\n module.createGetLocal(tempLocalElement.index, tempLocalElement.type.toNativeType())\n ])\n ], returnType.toNativeType());\n } else {\n return this.makeCallDirect(indexedSet, [\n thisExpr,\n elementExpr,\n valueWithCorrectType\n ]);\n }\n }\n // fall-through\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n compileCallExpression(expression: CallExpression, contextualType: Type): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n\n // handle call to super\n if (expression.expression.kind == NodeKind.SUPER) {\n let flow = this.currentFlow;\n let actualFunction = flow.actualFunction;\n if (!actualFunction.is(CommonFlags.CONSTRUCTOR)) {\n this.error(\n DiagnosticCode.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors,\n expression.range\n );\n return module.createUnreachable();\n }\n\n let classInstance = assert(actualFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\n let baseClassInstance = assert((classInstance).base);\n let thisLocal = assert(flow.lookupLocal(\"this\"));\n let nativeSizeType = this.options.nativeSizeType;\n\n // {\n // this = super(this || , ...args)\n // this.a = X\n // this.b = Y\n // }\n let stmts: ExpressionRef[] = [\n module.createSetLocal(thisLocal.index,\n this.compileCallDirect(\n this.ensureConstructor(baseClassInstance, expression),\n expression.arguments,\n expression,\n module.createIf(\n module.createGetLocal(thisLocal.index, nativeSizeType),\n module.createGetLocal(thisLocal.index, nativeSizeType),\n this.makeAllocation(classInstance)\n )\n )\n )\n ];\n this.makeFieldInitialization(classInstance, stmts);\n\n // check that super had been called before accessing allocating `this`\n if (flow.isAny(\n FlowFlags.ALLOCATES |\n FlowFlags.CONDITIONALLY_ALLOCATES\n )) {\n this.error(\n DiagnosticCode._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class,\n expression.range\n );\n return module.createUnreachable();\n }\n flow.set(FlowFlags.ALLOCATES | FlowFlags.CALLS_SUPER);\n this.currentType = Type.void;\n return module.createBlock(null, stmts);\n }\n\n // otherwise resolve normally\n var target = this.resolver.resolveExpression(expression.expression, flow); // reports\n if (!target) return module.createUnreachable();\n\n var signature: Signature | null;\n var indexArg: ExpressionRef;\n switch (target.kind) {\n\n // direct call: concrete function\n case ElementKind.FUNCTION_PROTOTYPE: {\n let prototype = target;\n let typeArguments = expression.typeArguments;\n\n // builtins handle present respectively omitted type arguments on their own\n if (prototype.hasDecorator(DecoratorFlags.BUILTIN)) {\n return this.compileCallExpressionBuiltin(prototype, expression, contextualType);\n }\n\n let instance: Function | null = null;\n\n // resolve generic call if type arguments have been provided\n if (typeArguments) {\n if (!prototype.is(CommonFlags.GENERIC)) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n expression.expression.range, prototype.internalName\n );\n return module.createUnreachable();\n }\n instance = this.resolver.resolveFunctionInclTypeArguments(\n prototype,\n typeArguments,\n makeMap(flow.contextualTypeArguments),\n expression\n );\n\n // infer generic call if type arguments have been omitted\n } else if (prototype.is(CommonFlags.GENERIC)) {\n let inferredTypes = new Map();\n let typeParameters = assert(prototype.declaration.typeParameters);\n let numTypeParameters = typeParameters.length;\n for (let i = 0; i < numTypeParameters; ++i) {\n inferredTypes.set(typeParameters[i].name.text, null);\n }\n // let numInferred = 0;\n let parameterTypes = prototype.declaration.signature.parameters;\n let numParameterTypes = parameterTypes.length;\n let argumentExpressions = expression.arguments;\n let numArguments = argumentExpressions.length;\n let argumentExprs = new Array(numArguments);\n for (let i = 0; i < numParameterTypes; ++i) {\n let typeNode = parameterTypes[i].type;\n let name = typeNode.kind == NodeKind.TYPE ? (typeNode).name.text : null;\n let argumentExpression = i < numArguments\n ? argumentExpressions[i]\n : prototype.declaration.signature.parameters[i].initializer;\n if (!argumentExpression) { // missing initializer -> too few arguments\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n expression.range, numParameterTypes.toString(10), numArguments.toString(10)\n );\n return module.createUnreachable();\n }\n if (name !== null && inferredTypes.has(name)) {\n let inferredType = inferredTypes.get(name);\n if (inferredType) {\n argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, inferredType, WrapMode.NONE);\n let commonType: Type | null;\n if (!(commonType = Type.commonCompatible(inferredType, this.currentType, true))) {\n if (!(commonType = Type.commonCompatible(inferredType, this.currentType, false))) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n parameterTypes[i].type.range, this.currentType.toString(), inferredType.toString()\n );\n return module.createUnreachable();\n }\n }\n inferredType = commonType;\n } else {\n argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, Type.i32, WrapMode.NONE);\n inferredType = this.currentType;\n // ++numInferred;\n }\n inferredTypes.set(name, inferredType);\n } else {\n let concreteType = this.resolver.resolveType(\n parameterTypes[i].type,\n flow.contextualTypeArguments\n );\n if (!concreteType) return module.createUnreachable();\n argumentExprs[i] = this.compileExpression(\n argumentExpression,\n concreteType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n }\n }\n let resolvedTypeArguments = new Array(numTypeParameters);\n for (let i = 0; i < numTypeParameters; ++i) {\n let inferredType = assert(inferredTypes.get(typeParameters[i].name.text)); // TODO\n resolvedTypeArguments[i] = inferredType;\n }\n instance = this.resolver.resolveFunction(\n prototype,\n resolvedTypeArguments,\n makeMap(flow.contextualTypeArguments)\n );\n if (!instance) return this.module.createUnreachable();\n return this.makeCallDirect(instance, argumentExprs);\n // TODO: this skips inlining because inlining requires compiling its temporary locals in\n // the scope of the inlined flow. might need another mechanism to lock temp. locals early,\n // so inlining can be performed in `makeCallDirect` instead?\n\n // otherwise resolve the non-generic call as usual\n } else {\n instance = this.resolver.resolveFunction(prototype, null);\n }\n if (!instance) return this.module.createUnreachable();\n\n // compile 'this' expression if an instance method\n let thisExpr: ExpressionRef = 0;\n if (instance.is(CommonFlags.INSTANCE)) {\n thisExpr = this.compileExpressionRetainType(\n assert(this.resolver.currentThisExpression),\n this.options.usizeType,\n WrapMode.NONE\n );\n }\n\n return this.compileCallDirect(\n instance,\n expression.arguments,\n expression,\n thisExpr\n );\n }\n\n // indirect call: index argument with signature (non-generic, can't be inlined)\n case ElementKind.LOCAL: {\n if (signature = (target).type.signatureReference) {\n if ((target).is(CommonFlags.INLINED)) {\n indexArg = module.createI32(i64_low((target).constantIntegerValue));\n } else {\n indexArg = module.createGetLocal((target).index, NativeType.I32);\n }\n break;\n } else {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, (target).type.toString()\n );\n return module.createUnreachable();\n }\n }\n case ElementKind.GLOBAL: {\n if (signature = (target).type.signatureReference) {\n indexArg = module.createGetGlobal((target).internalName, (target).type.toNativeType());\n break;\n } else {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, (target).type.toString()\n );\n return module.createUnreachable();\n }\n }\n case ElementKind.FIELD: {\n let type = (target).type;\n if (signature = type.signatureReference) {\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n indexArg = module.createLoad(\n 4,\n false,\n thisExpr,\n NativeType.I32,\n (target).memoryOffset\n );\n break;\n } else {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, type.toString()\n );\n return module.createUnreachable();\n }\n }\n case ElementKind.FUNCTION_TARGET: {\n signature = (target).signature;\n indexArg = this.compileExpression(\n expression.expression,\n (target).type,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n break;\n }\n\n case ElementKind.PROPERTY: {\n indexArg = this.compileGetter(target, expression.expression);\n let type = this.currentType;\n signature = type.signatureReference;\n if (!signature) {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, type.toString()\n );\n return module.createUnreachable();\n }\n break;\n }\n\n // not supported\n default: {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n }\n return this.compileCallIndirect(\n signature,\n indexArg,\n expression.arguments,\n expression\n );\n }\n\n private compileCallExpressionBuiltin(\n prototype: FunctionPrototype,\n expression: CallExpression,\n contextualType: Type\n ): ExpressionRef {\n var typeArguments: Type[] | null = null;\n\n // builtins handle omitted type arguments on their own. if present, however, resolve them here\n // and pass them to the builtin, even if it's still up to the builtin how to handle them.\n var typeArgumentNodes = expression.typeArguments;\n if (expression.typeArguments) {\n if (!prototype.is(CommonFlags.GENERIC)) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n expression.range, prototype.internalName\n );\n }\n typeArguments = this.resolver.resolveTypeArguments(\n assert(prototype.declaration.typeParameters),\n typeArgumentNodes,\n makeMap(this.currentFlow.contextualTypeArguments),\n expression\n );\n }\n\n // now compile the builtin, which usually returns a block of code that replaces the call.\n var expr = compileBuiltinCall(\n this,\n prototype,\n typeArguments,\n expression.arguments,\n contextualType,\n expression\n );\n if (!expr) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n return expr;\n }\n\n /**\n * Checks that a call with the given number as arguments can be performed according to the\n * specified signature.\n */\n checkCallSignature(\n signature: Signature,\n numArguments: i32,\n hasThis: bool,\n reportNode: Node\n ): bool {\n\n // cannot call an instance method without a `this` argument (TODO: `.call`?)\n var thisType = signature.thisType;\n if (hasThis != (thisType != null)) {\n this.error(\n DiagnosticCode.Operation_not_supported, // TODO: better message?\n reportNode.range\n );\n return false;\n }\n\n // not yet implemented (TODO: maybe some sort of an unmanaged/lightweight array?)\n var hasRest = signature.hasRest;\n if (hasRest) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return false;\n }\n\n var minimum = signature.requiredParameters;\n var maximum = signature.parameterTypes.length;\n\n // must at least be called with required arguments\n if (numArguments < minimum) {\n this.error(\n minimum < maximum\n ? DiagnosticCode.Expected_at_least_0_arguments_but_got_1\n : DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, minimum.toString(), numArguments.toString()\n );\n return false;\n }\n\n // must not be called with more than the maximum arguments\n if (numArguments > maximum && !hasRest) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, maximum.toString(), numArguments.toString()\n );\n return false;\n }\n\n return true;\n }\n\n /** Compiles a direct call to a concrete function. */\n compileCallDirect(\n instance: Function,\n argumentExpressions: Expression[],\n reportNode: Node,\n thisArg: ExpressionRef = 0\n ): ExpressionRef {\n var numArguments = argumentExpressions.length;\n var signature = instance.signature;\n\n if (!this.checkCallSignature( // reports\n signature,\n numArguments,\n thisArg != 0,\n reportNode\n )) {\n return this.module.createUnreachable();\n }\n\n // Inline if explicitly requested\n if (instance.hasDecorator(DecoratorFlags.INLINE)) {\n assert(!instance.is(CommonFlags.TRAMPOLINE)); // doesn't make sense\n if (this.currentInlineFunctions.includes(instance)) {\n this.warning(\n DiagnosticCode.Function_0_cannot_be_inlined_into_itself,\n reportNode.range, instance.internalName\n );\n } else {\n this.currentInlineFunctions.push(instance);\n let expr = this.compileCallInlinePrechecked(instance, argumentExpressions, thisArg);\n this.currentInlineFunctions.pop();\n return expr;\n }\n }\n\n // Otherwise compile to just a call\n var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\n var operands = new Array(numArgumentsInclThis);\n var index = 0;\n if (thisArg) {\n operands[0] = thisArg;\n index = 1;\n }\n var parameterTypes = signature.parameterTypes;\n for (let i = 0; i < numArguments; ++i, ++index) {\n operands[index] = this.compileExpression(\n argumentExpressions[i],\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n }\n assert(index == numArgumentsInclThis);\n return this.makeCallDirect(instance, operands);\n }\n\n // Depends on being pre-checked in compileCallDirect\n private compileCallInlinePrechecked(\n instance: Function,\n argumentExpressions: Expression[],\n thisArg: ExpressionRef = 0\n ): ExpressionRef {\n var module = this.module;\n\n // Create a new inline flow and use it to compile the function as a block\n var previousFlow = this.currentFlow;\n var flow = Flow.createInline(previousFlow.parentFunction, instance);\n\n // Convert provided call arguments to temporary locals. It is important that these are compiled\n // here, with their respective locals being blocked. There is no 'makeCallInline'.\n var body = [];\n\n if (thisArg) {\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\n let thisType = assert(instance.signature.thisType);\n let thisLocal = flow.addScopedLocal(\"this\", thisType, false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let baseInstance = (classInstance).base;\n if (baseInstance) flow.addScopedAlias(\"super\", baseInstance.type, thisLocal.index);\n }\n\n var numArguments = argumentExpressions.length;\n var signature = instance.signature;\n var parameterTypes = signature.parameterTypes;\n for (let i = 0; i < numArguments; ++i) {\n let paramExpr = this.compileExpression(\n argumentExpressions[i],\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n let argumentLocal = flow.addScopedLocal(\n signature.getParameterName(i),\n parameterTypes[i],\n !previousFlow.canOverflow(paramExpr, parameterTypes[i])\n );\n body.push(\n module.createSetLocal(argumentLocal.index, paramExpr)\n );\n }\n\n // Compile optional parameter initializers in the scope of the inlined flow\n this.currentFlow = flow;\n var declaration = instance.prototype.declaration;\n var numParameters = signature.parameterTypes.length;\n for (let i = numArguments; i < numParameters; ++i) {\n let initExpr = this.compileExpression(\n assert(declaration.signature.parameters[i].initializer),\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.WRAP\n );\n let argumentLocal = flow.addScopedLocal(\n signature.getParameterName(i),\n parameterTypes[i],\n !flow.canOverflow(initExpr, parameterTypes[i])\n );\n body.push(\n module.createSetLocal(argumentLocal.index, initExpr)\n );\n }\n\n // Compile the called function's body in the scope of the inlined flow\n {\n let stmts = this.compileFunctionBody(instance);\n for (let i = 0, k = stmts.length; i < k; ++i) body.push(stmts[i]);\n }\n\n // Free any new scoped locals and reset to the original flow\n flow.freeScopedLocals();\n var returnType = flow.returnType;\n this.currentFlow = previousFlow;\n this.currentType = returnType;\n\n // Create an outer block that we can break to when returning a value out of order\n return module.createBlock(flow.inlineReturnLabel, body, returnType.toNativeType());\n }\n\n /** Gets the trampoline for the specified function. */\n ensureTrampoline(original: Function): Function {\n // A trampoline is a function that takes a fixed amount of operands with some of them possibly\n // being zeroed. It takes one additional argument denoting the number of actual operands\n // provided to the call, and takes appropriate steps to initialize zeroed operands to their\n // default values using the optional parameter initializers of the original function. Doing so\n // allows calls to functions with optional parameters to circumvent the trampoline when all\n // parameters are provided as a fast route, respectively setting up omitted operands in a proper\n // context otherwise.\n var trampoline = original.trampoline;\n if (trampoline) return trampoline;\n\n var originalSignature = original.signature;\n var originalName = original.internalName;\n var originalParameterTypes = originalSignature.parameterTypes;\n var originalParameterDeclarations = original.prototype.declaration.signature.parameters;\n var commonReturnType = originalSignature.returnType;\n var commonThisType = originalSignature.thisType;\n var isInstance = original.is(CommonFlags.INSTANCE);\n\n // arguments excl. `this`, operands incl. `this`\n var minArguments = originalSignature.requiredParameters;\n var minOperands = minArguments;\n var maxArguments = originalParameterTypes.length;\n var maxOperands = maxArguments;\n if (isInstance) {\n ++minOperands;\n ++maxOperands;\n }\n var numOptional = assert(maxOperands - minOperands);\n\n var forwardedOperands = new Array(minOperands);\n var operandIndex = 0;\n\n // forward `this` if applicable\n var module = this.module;\n if (isInstance) {\n forwardedOperands[0] = module.createGetLocal(0, this.options.nativeSizeType);\n operandIndex = 1;\n }\n\n // forward required arguments\n for (let i = 0; i < minArguments; ++i, ++operandIndex) {\n forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, originalParameterTypes[i].toNativeType());\n }\n assert(operandIndex == minOperands);\n\n // create the trampoline element\n var trampolineSignature = new Signature(originalParameterTypes, commonReturnType, commonThisType);\n var trampolineName = originalName + \"|trampoline\";\n trampolineSignature.requiredParameters = maxArguments;\n trampoline = new Function(\n original.prototype,\n trampolineName,\n trampolineSignature,\n original.parent,\n original.contextualTypeArguments\n );\n trampoline.set(original.flags | CommonFlags.TRAMPOLINE | CommonFlags.COMPILED);\n original.trampoline = trampoline;\n\n // compile initializers of omitted arguments in scope of the trampoline function\n // this is necessary because initializers might need additional locals and a proper this context\n var previousFlow = this.currentFlow;\n this.currentFlow = trampoline.flow;\n\n // create a br_table switching over the number of optional parameters provided\n var numNames = numOptional + 1; // incl. outer block\n var names = new Array(numNames);\n var ofN = \"of\" + numOptional.toString(10);\n for (let i = 0; i < numNames; ++i) {\n let label = i.toString(10) + ofN;\n names[i] = label;\n }\n var body = module.createBlock(names[0], [\n module.createBlock(\"outOfRange\", [\n module.createSwitch(names, \"outOfRange\",\n // condition is number of provided optional arguments, so subtract required arguments\n minArguments\n ? module.createBinary(\n BinaryOp.SubI32,\n module.createGetGlobal(\"~argc\", NativeType.I32),\n module.createI32(minArguments)\n )\n : module.createGetGlobal(\"~argc\", NativeType.I32)\n )\n ]),\n module.createUnreachable()\n ]);\n for (let i = 0; i < numOptional; ++i, ++operandIndex) {\n let type = originalParameterTypes[minArguments + i];\n let declaration = originalParameterDeclarations[minArguments + i];\n let initializer = declaration.initializer;\n let initExpr: ExpressionRef;\n if (initializer) {\n initExpr = module.createSetLocal(operandIndex,\n this.compileExpression(\n initializer,\n type,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP\n )\n );\n } else {\n this.error(\n DiagnosticCode.Optional_parameter_must_have_an_initializer,\n declaration.range\n );\n initExpr = module.createUnreachable();\n }\n body = module.createBlock(names[i + 1], [\n body,\n initExpr,\n ]);\n forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, type.toNativeType());\n }\n this.currentFlow = previousFlow;\n assert(operandIndex == maxOperands);\n\n var funcRef = module.addFunction(\n trampolineName,\n this.ensureFunctionType(\n trampolineSignature.parameterTypes,\n trampolineSignature.returnType,\n trampolineSignature.thisType\n ),\n typesToNativeTypes(trampoline.additionalLocals),\n module.createBlock(null, [\n body,\n module.createCall(\n originalName,\n forwardedOperands,\n commonReturnType.toNativeType()\n )\n ], commonReturnType.toNativeType())\n );\n trampoline.finalize(module, funcRef);\n return trampoline;\n }\n\n /** Makes sure that the argument count helper global is present and returns its name. */\n private ensureArgcVar(): string {\n var internalName = \"~argc\";\n if (!this.argcVar) {\n let module = this.module;\n this.argcVar = module.addGlobal(\n internalName,\n NativeType.I32,\n true,\n module.createI32(0)\n );\n }\n return internalName;\n }\n\n /** Makes sure that the argument count helper setter is present and returns its name. */\n private ensureArgcSet(): string {\n var internalName = \"~setargc\";\n if (!this.argcSet) {\n let module = this.module;\n this.argcSet = module.addFunction(internalName,\n this.ensureFunctionType([ Type.u32 ], Type.void),\n null,\n module.createSetGlobal(this.ensureArgcVar(),\n module.createGetLocal(0, NativeType.I32)\n )\n );\n module.addFunctionExport(internalName, \"_setargc\");\n }\n return internalName;\n }\n\n /** Creates a direct call to the specified function. */\n makeCallDirect(\n instance: Function,\n operands: ExpressionRef[] | null = null\n ): ExpressionRef {\n var numOperands = operands ? operands.length : 0;\n var numArguments = numOperands;\n var minArguments = instance.signature.requiredParameters;\n var minOperands = minArguments;\n var maxArguments = instance.signature.parameterTypes.length;\n var maxOperands = maxArguments;\n if (instance.is(CommonFlags.INSTANCE)) {\n ++minOperands;\n ++maxOperands;\n --numArguments;\n }\n assert(numOperands >= minOperands);\n\n var module = this.module;\n if (!this.compileFunction(instance)) return module.createUnreachable();\n var returnType = instance.signature.returnType;\n var isCallImport = instance.is(CommonFlags.MODULE_IMPORT);\n\n // fill up omitted arguments with their initializers, if constant, otherwise with zeroes.\n if (numOperands < maxOperands) {\n if (!operands) {\n operands = new Array(maxOperands);\n operands.length = 0;\n }\n let parameterTypes = instance.signature.parameterTypes;\n let parameterNodes = instance.prototype.declaration.signature.parameters;\n let allOptionalsAreConstant = true;\n for (let i = numArguments; i < maxArguments; ++i) {\n let initializer = parameterNodes[i].initializer;\n if (!(initializer !== null && nodeIsConstantValue(initializer.kind))) {\n allOptionalsAreConstant = false;\n break;\n }\n }\n if (allOptionalsAreConstant) { // inline into the call\n for (let i = numArguments; i < maxArguments; ++i) {\n operands.push(\n this.compileExpression(\n parameterNodes[i].initializer,\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n )\n );\n }\n } else { // otherwise fill up with zeroes and call the trampoline\n for (let i = numArguments; i < maxArguments; ++i) {\n operands.push(parameterTypes[i].toNativeZero(module));\n }\n if (!isCallImport) {\n let original = instance;\n instance = this.ensureTrampoline(instance);\n if (!this.compileFunction(instance)) return module.createUnreachable();\n instance.flow.flags = original.flow.flags;\n this.program.instancesLookup.set(instance.internalName, instance); // so canOverflow can find it\n let nativeReturnType = returnType.toNativeType();\n this.currentType = returnType;\n return module.createBlock(null, [\n module.createSetGlobal(this.ensureArgcVar(), module.createI32(numArguments)),\n module.createCall(instance.internalName, operands, nativeReturnType)\n ], nativeReturnType);\n }\n }\n }\n\n // otherwise just call through\n this.currentType = returnType;\n return module.createCall(instance.internalName, operands, returnType.toNativeType());\n }\n\n /** Compiles an indirect call using an index argument and a signature. */\n compileCallIndirect(\n signature: Signature,\n indexArg: ExpressionRef,\n argumentExpressions: Expression[],\n reportNode: Node,\n thisArg: ExpressionRef = 0\n ): ExpressionRef {\n var numArguments = argumentExpressions.length;\n\n if (!this.checkCallSignature( // reports\n signature,\n numArguments,\n thisArg != 0,\n reportNode\n )) {\n return this.module.createUnreachable();\n }\n\n var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\n var operands = new Array(numArgumentsInclThis);\n var index = 0;\n if (thisArg) {\n operands[0] = thisArg;\n index = 1;\n }\n var parameterTypes = signature.parameterTypes;\n for (let i = 0; i < numArguments; ++i, ++index) {\n operands[index] = this.compileExpression(\n argumentExpressions[i],\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n }\n assert(index == numArgumentsInclThis);\n return this.makeCallIndirect(signature, indexArg, operands);\n }\n\n /** Creates an indirect call to the function at `indexArg` in the function table. */\n makeCallIndirect(\n signature: Signature,\n indexArg: ExpressionRef,\n operands: ExpressionRef[] | null = null\n ): ExpressionRef {\n var numOperands = operands ? operands.length : 0;\n var numArguments = numOperands;\n var minArguments = signature.requiredParameters;\n var minOperands = minArguments;\n var maxArguments = signature.parameterTypes.length;\n var maxOperands = maxArguments;\n if (signature.thisType) {\n ++minOperands;\n ++maxOperands;\n --numArguments;\n }\n assert(numOperands >= minOperands);\n\n this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n\n // fill up omitted arguments with zeroes\n if (numOperands < maxOperands) {\n if (!operands) {\n operands = new Array(maxOperands);\n operands.length = 0;\n }\n let parameterTypes = signature.parameterTypes;\n for (let i = numArguments; i < maxArguments; ++i) {\n operands.push(parameterTypes[i].toNativeZero(module));\n }\n }\n\n var returnType = signature.returnType;\n this.currentType = returnType;\n return module.createBlock(null, [\n module.createSetGlobal(this.ensureArgcVar(), // might still be calling a trampoline\n module.createI32(numArguments)\n ),\n module.createCallIndirect(indexArg, operands, signature.toSignatureString())\n ], returnType.toNativeType()); // not necessarily wrapped\n }\n\n compileCommaExpression(expression: CommaExpression, contextualType: Type): ExpressionRef {\n var expressions = expression.expressions;\n var numExpressions = expressions.length;\n var exprs = new Array(numExpressions--);\n for (let i = 0; i < numExpressions; ++i) {\n exprs[i] = this.compileExpression(\n expressions[i],\n Type.void, // drop all\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n exprs[numExpressions] = this.compileExpression(\n expressions[numExpressions],\n contextualType, // except last\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n return this.module.createBlock(null, exprs, this.currentType.toNativeType());\n }\n\n compileElementAccessExpression(expression: ElementAccessExpression, contextualType: Type): ExpressionRef {\n var target = this.resolver.resolveElementAccess(\n expression,\n this.currentFlow,\n contextualType\n ); // reports\n if (!target) return this.module.createUnreachable();\n switch (target.kind) {\n case ElementKind.CLASS: {\n let isUnchecked = this.currentFlow.is(FlowFlags.UNCHECKED_CONTEXT);\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\n if (!indexedGet) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n expression.expression.range, (target).internalName\n );\n return this.module.createUnreachable();\n }\n let thisArg = this.compileExpression(\n expression.expression,\n (target).type,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n return this.compileCallDirect(indexedGet, [\n expression.elementExpression\n ], expression, thisArg);\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n compileFunctionExpression(expression: FunctionExpression, contextualType: Type): ExpressionRef {\n var declaration = expression.declaration;\n var name = declaration.name;\n var simpleName = (name.text.length\n ? name.text\n : \"anonymous\") + \"|\" + this.functionTable.length.toString(10);\n var flow = this.currentFlow;\n var prototype = new FunctionPrototype(\n this.program,\n simpleName,\n flow.actualFunction.internalName + INNER_DELIMITER + simpleName,\n declaration,\n null,\n DecoratorFlags.NONE\n );\n var instance = this.compileFunctionUsingTypeArguments(\n prototype,\n [],\n makeMap(flow.contextualTypeArguments),\n flow,\n declaration\n );\n if (!instance) return this.module.createUnreachable();\n this.currentType = instance.signature.type; // TODO: get cached type?\n // NOTE that, in order to make this work in every case, the function must be represented by a\n // value, so we add it and rely on the optimizer to figure out where it can be called directly.\n var index = this.ensureFunctionTableEntry(instance); // reports\n return index < 0\n ? this.module.createUnreachable()\n : this.module.createI32(index);\n }\n\n /**\n * Compiles an identifier in the specified context.\n * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\n * precomputes them according to context.\n */\n compileIdentifierExpression(\n expression: IdentifierExpression,\n contextualType: Type,\n retainConstantType: bool\n ): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n var actualFunction = flow.actualFunction;\n\n // check special keywords first\n switch (expression.kind) {\n case NodeKind.NULL: {\n let options = this.options;\n if (!contextualType.classReference) {\n this.currentType = options.usizeType;\n }\n return options.isWasm64\n ? module.createI64(0)\n : module.createI32(0);\n }\n case NodeKind.TRUE: {\n this.currentType = Type.bool;\n return module.createI32(1);\n }\n case NodeKind.FALSE: {\n this.currentType = Type.bool;\n return module.createI32(0);\n }\n case NodeKind.THIS: {\n if (actualFunction.is(CommonFlags.INSTANCE)) {\n let thisLocal = assert(flow.lookupLocal(\"this\"));\n let classInstance = assert(actualFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\n let nativeSizeType = this.options.nativeSizeType;\n if (actualFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // {\n // if (!this) this = \n // this.a = X\n // this.b = Y\n // return this\n // }\n let stmts: ExpressionRef[] = [\n module.createIf(\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\n module.createGetLocal(thisLocal.index, nativeSizeType)\n ),\n module.createSetLocal(thisLocal.index,\n this.makeAllocation(classInstance)\n )\n )\n ];\n this.makeFieldInitialization(classInstance, stmts);\n stmts.push(\n module.createGetLocal(thisLocal.index, nativeSizeType)\n );\n this.currentType = thisLocal.type;\n return module.createBlock(null, stmts, nativeSizeType);\n }\n }\n // if not a constructor, `this` type can differ\n let thisType = assert(actualFunction.signature.thisType);\n this.currentType = thisType;\n return module.createGetLocal(thisLocal.index, thisType.toNativeType());\n }\n this.error(\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\n expression.range\n );\n this.currentType = this.options.usizeType;\n return module.createUnreachable();\n }\n case NodeKind.SUPER: {\n let flow = this.currentFlow;\n let actualFunction = flow.actualFunction;\n if (actualFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.CALLS_SUPER)) {\n // TS1034 in the parser effectively limits this to property accesses\n this.error(\n DiagnosticCode._super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class,\n expression.range\n );\n }\n }\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\n let scopedThis = flow.lookupLocal(\"this\");\n if (scopedThis) {\n let scopedThisClass = assert(scopedThis.type.classReference);\n let base = scopedThisClass.base;\n if (base) {\n this.currentType = base.type;\n return module.createGetLocal(scopedThis.index, base.type.toNativeType());\n }\n }\n }\n if (actualFunction.is(CommonFlags.INSTANCE)) {\n let classInstance = assert(actualFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\n let baseClassInstance = (classInstance).base;\n if (baseClassInstance) {\n let superType = baseClassInstance.type;\n this.currentType = superType;\n return module.createGetLocal(0, superType.toNativeType());\n }\n }\n this.error(\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\n expression.range\n );\n this.currentType = this.options.usizeType;\n return module.createUnreachable();\n }\n }\n\n // otherwise resolve\n var target = this.resolver.resolveIdentifier( // reports\n expression,\n flow,\n this.currentEnum || actualFunction\n );\n if (!target) return module.createUnreachable();\n\n switch (target.kind) {\n case ElementKind.LOCAL: {\n let localType = (target).type;\n assert(localType != Type.void);\n if ((target).is(CommonFlags.INLINED)) {\n return this.compileInlineConstant(target, contextualType, retainConstantType);\n }\n let localIndex = (target).index;\n assert(localIndex >= 0);\n this.currentType = localType;\n return this.module.createGetLocal(localIndex, localType.toNativeType());\n }\n case ElementKind.GLOBAL: {\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field\n return this.module.createUnreachable();\n }\n let globalType = (target).type;\n assert(globalType != Type.void);\n if ((target).is(CommonFlags.INLINED)) {\n return this.compileInlineConstant(target, contextualType, retainConstantType);\n }\n this.currentType = globalType;\n return this.module.createGetGlobal((target).internalName, globalType.toNativeType());\n }\n case ElementKind.ENUMVALUE: { // here: if referenced from within the same enum\n if (!target.is(CommonFlags.COMPILED)) {\n this.error(\n DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,\n expression.range\n );\n this.currentType = Type.i32;\n return this.module.createUnreachable();\n }\n this.currentType = Type.i32;\n if ((target).is(CommonFlags.INLINED)) {\n return this.module.createI32((target).constantValue);\n }\n return this.module.createGetGlobal((target).internalName, NativeType.I32);\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n let instance = this.resolver.resolveFunction(\n target,\n null,\n makeMap(flow.contextualTypeArguments)\n );\n if (!(instance && this.compileFunction(instance))) return module.createUnreachable();\n let index = this.ensureFunctionTableEntry(instance);\n this.currentType = instance.signature.type;\n return this.module.createI32(index);\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n compileInstanceOfExpression(\n expression: InstanceOfExpression,\n contextualType: Type\n ): ExpressionRef {\n var module = this.module;\n // NOTE that this differs from TypeScript in that the rhs is a type, not an expression. at the\n // time of implementation, this seemed more useful because dynamic rhs expressions are not\n // possible in AS anyway.\n var expr = this.compileExpressionRetainType(expression.expression, this.options.usizeType, WrapMode.NONE);\n var type = this.currentType;\n var isType = this.resolver.resolveType(expression.isType);\n this.currentType = Type.bool;\n if (!isType) return module.createUnreachable();\n return type.is(TypeFlags.NULLABLE) && !isType.is(TypeFlags.NULLABLE)\n ? type.nonNullableType.isAssignableTo(isType)\n ? module.createBinary( // not precomputeable\n type.is(TypeFlags.LONG)\n ? BinaryOp.NeI64\n : BinaryOp.NeI32,\n expr,\n type.toNativeZero(module)\n )\n : module.createI32(0)\n : module.createI32(type.isAssignableTo(isType, true) ? 1 : 0);\n }\n\n compileLiteralExpression(\n expression: LiteralExpression,\n contextualType: Type,\n implicitNegate: bool = false\n ): ExpressionRef {\n var module = this.module;\n\n switch (expression.literalKind) {\n case LiteralKind.ARRAY: {\n assert(!implicitNegate);\n let classType = contextualType.classReference;\n if (\n classType &&\n classType.prototype == this.program.arrayPrototype\n ) {\n return this.compileArrayLiteral(\n assert(classType.typeArguments)[0],\n (expression).elementExpressions,\n false, // TODO: isConst?\n expression\n );\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n case LiteralKind.FLOAT: {\n let floatValue = (expression).value;\n if (implicitNegate) {\n floatValue = -floatValue;\n }\n if (contextualType == Type.f32) {\n return module.createF32(floatValue);\n }\n this.currentType = Type.f64;\n return module.createF64(floatValue);\n }\n case LiteralKind.INTEGER: {\n let intValue = (expression).value;\n if (implicitNegate) {\n intValue = i64_sub(\n i64_new(0),\n intValue\n );\n }\n let type = this.resolver.determineIntegerLiteralType(intValue, contextualType);\n this.currentType = type;\n switch (type.kind) {\n case TypeKind.ISIZE: if (!this.options.isWasm64) return module.createI32(i64_low(intValue));\n case TypeKind.I64: return module.createI64(i64_low(intValue), i64_high(intValue));\n case TypeKind.USIZE: if (!this.options.isWasm64) return module.createI32(i64_low(intValue));\n case TypeKind.U64: return module.createI64(i64_low(intValue), i64_high(intValue));\n case TypeKind.F32: return module.createF32(i64_to_f32(intValue));\n case TypeKind.F64: return module.createF64(i64_to_f64(intValue));\n default: return module.createI32(i64_low(intValue));\n }\n }\n case LiteralKind.STRING: {\n assert(!implicitNegate);\n return this.compileStringLiteral(expression);\n }\n case LiteralKind.OBJECT: {\n assert(!implicitNegate);\n return this.compileObjectLiteral(expression, contextualType);\n }\n // case LiteralKind.REGEXP:\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n\n /** Ensures that the specified string exists in static memory and returns a pointer to it. */\n ensureStaticString(stringValue: string): ExpressionRef {\n var program = this.program;\n var hasGC = program.hasGC;\n var gcHeaderSize = program.gcHeaderSize;\n\n var stringInstance = assert(program.stringInstance);\n var stringSegment: MemorySegment;\n\n // if the string already exists, reuse it\n var segments = this.stringSegments;\n if (segments.has(stringValue)) {\n stringSegment = segments.get(stringValue);\n\n // otherwise create it\n } else {\n let length = stringValue.length;\n let headerSize = (stringInstance.currentMemoryOffset + 1) & ~1;\n let totalSize = headerSize + length * 2;\n\n let buf: Uint8Array;\n let pos: u32;\n\n if (hasGC) {\n buf = new Uint8Array(gcHeaderSize + totalSize);\n pos = gcHeaderSize;\n writeI32(ensureGCHook(this, stringInstance), buf, program.gcHookOffset);\n } else {\n buf = new Uint8Array(totalSize);\n pos = 0;\n }\n writeI32(length, buf, pos + stringInstance.offsetof(\"length\"));\n pos += headerSize;\n for (let i = 0; i < length; ++i) {\n writeI16(stringValue.charCodeAt(i), buf, pos + (i << 1));\n }\n stringSegment = this.addMemorySegment(buf);\n segments.set(stringValue, stringSegment);\n }\n var stringOffset = stringSegment.offset;\n if (hasGC) stringOffset = i64_add(stringOffset, i64_new(gcHeaderSize));\n\n this.currentType = stringInstance.type;\n if (this.options.isWasm64) {\n return this.module.createI64(i64_low(stringOffset), i64_high(stringOffset));\n } else {\n assert(i64_is_u32(stringOffset));\n return this.module.createI32(i64_low(stringOffset));\n }\n }\n\n compileStringLiteral(expression: StringLiteralExpression): ExpressionRef {\n return this.ensureStaticString(expression.value);\n }\n\n /** Ensures that the specified array exists in static memory and returns a pointer to it. */\n ensureStaticArray(elementType: Type, values: ExpressionRef[]): ExpressionRef {\n var program = this.program;\n var hasGC = program.hasGC;\n var gcHeaderSize = program.gcHeaderSize;\n\n var length = values.length;\n var byteSize = elementType.byteSize;\n var byteLength = length * byteSize;\n var usizeTypeSize = this.options.usizeType.byteSize;\n\n var buf: Uint8Array;\n var pos: u32;\n\n // create the backing ArrayBuffer segment\n var bufferInstance = assert(program.arrayBufferInstance);\n var bufferHeaderSize = (bufferInstance.currentMemoryOffset + 7) & ~7;\n var bufferTotalSize = 1 << (32 - clz(bufferHeaderSize + byteLength - 1));\n if (hasGC) {\n buf = new Uint8Array(gcHeaderSize + bufferTotalSize);\n pos = gcHeaderSize;\n writeI32(ensureGCHook(this, bufferInstance), buf, program.gcHookOffset);\n } else {\n buf = new Uint8Array(bufferTotalSize);\n pos = 0;\n }\n writeI32(byteLength, buf, pos + bufferInstance.offsetof(\"byteLength\"));\n pos += bufferHeaderSize;\n var nativeType = elementType.toNativeType();\n switch (nativeType) {\n case NativeType.I32: {\n switch (byteSize) {\n case 1: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeI8(getConstValueI32(value), buf, pos);\n pos += 1;\n }\n break;\n }\n case 2: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeI16(getConstValueI32(value), buf, pos);\n pos += 2;\n }\n break;\n }\n case 4: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeI32(getConstValueI32(value), buf, pos);\n pos += 4;\n }\n break;\n }\n default: assert(false);\n }\n break;\n }\n case NativeType.I64: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeI64(i64_new(getConstValueI64Low(value), getConstValueI64High(value)), buf, pos);\n pos += 8;\n }\n break;\n }\n case NativeType.F32: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeF32(getConstValueF32(value), buf, pos);\n pos += 4;\n }\n break;\n }\n case NativeType.F64: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeF64(getConstValueF64(value), buf, pos);\n pos += 8;\n }\n break;\n }\n default: assert(false);\n }\n var bufferSegment = this.addMemorySegment(buf);\n var bufferOffset = bufferSegment.offset;\n if (hasGC) bufferOffset = i64_add(bufferOffset, i64_new(gcHeaderSize));\n\n // create the Array segment and return a pointer to it\n var arrayPrototype = assert(program.arrayPrototype);\n var arrayInstance = assert(this.resolver.resolveClass(\n arrayPrototype,\n [ elementType ],\n makeMap()\n ));\n var arrayHeaderSize = (arrayInstance.currentMemoryOffset + 7) & ~7;\n if (hasGC) {\n buf = new Uint8Array(gcHeaderSize + arrayHeaderSize);\n pos = gcHeaderSize;\n writeI32(ensureGCHook(this, arrayInstance), buf, program.gcHookOffset);\n } else {\n buf = new Uint8Array(arrayHeaderSize);\n pos = 0;\n }\n var arraySegment = this.addMemorySegment(buf);\n var arrayOffset = arraySegment.offset;\n if (hasGC) arrayOffset = i64_add(arrayOffset, i64_new(gcHeaderSize));\n this.currentType = arrayInstance.type;\n if (usizeTypeSize == 8) {\n writeI64(bufferOffset, buf, pos + arrayInstance.offsetof(\"buffer_\"));\n writeI32(length, buf, pos + arrayInstance.offsetof(\"length_\"));\n return this.module.createI64(i64_low(arrayOffset), i64_high(arrayOffset));\n } else {\n assert(i64_is_u32(bufferOffset));\n writeI32(i64_low(bufferOffset), buf, pos + arrayInstance.offsetof(\"buffer_\"));\n writeI32(length, buf, pos + arrayInstance.offsetof(\"length_\"));\n assert(i64_is_u32(arrayOffset));\n return this.module.createI32(i64_low(arrayOffset));\n }\n }\n\n compileArrayLiteral(\n elementType: Type,\n expressions: (Expression | null)[],\n isConst: bool,\n reportNode: Node\n ): ExpressionRef {\n var module = this.module;\n\n // find out whether all elements are constant (array is static)\n var length = expressions.length;\n var compiledValues = new Array(length);\n var constantValues = new Array(length);\n var nativeElementType = elementType.toNativeType();\n var isStatic = true;\n for (let i = 0; i < length; ++i) {\n let expr = expressions[i]\n ? this.compileExpression(expressions[i], elementType, ConversionKind.IMPLICIT, WrapMode.NONE)\n : elementType.toNativeZero(module);\n compiledValues[i] = expr;\n if (isStatic) {\n expr = module.precomputeExpression(compiledValues[i]);\n if (getExpressionId(expr) == ExpressionId.Const) {\n assert(getExpressionType(expr) == nativeElementType);\n constantValues[i] = expr;\n } else {\n if (isConst) {\n this.warning(\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\n reportNode.range\n );\n }\n isStatic = false;\n }\n }\n }\n\n // make a static array if possible\n if (isStatic) return this.ensureStaticArray(elementType, constantValues);\n\n // otherwise obtain the array type\n var arrayPrototype = assert(this.program.arrayPrototype);\n var arrayInstance = assert(this.resolver.resolveClass(\n arrayPrototype,\n [ elementType ],\n makeMap()\n ));\n var arrayType = arrayInstance.type;\n\n // and compile an explicit instantiation\n this.currentType = arrayType;\n var setter = arrayInstance.lookupOverload(OperatorKind.INDEXED_SET, true);\n if (!setter) {\n this.error(\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\n reportNode.range, arrayInstance.internalName\n );\n return module.createUnreachable();\n }\n var nativeArrayType = arrayType.toNativeType();\n var flow = this.currentFlow;\n var tempLocal = flow.parentFunction.addLocal(arrayType); // can't reuse a temp (used in compiledValues)\n var stmts = new Array(2 + length);\n var index = 0;\n stmts[index++] = module.createSetLocal(tempLocal.index,\n this.makeCallDirect(assert(arrayInstance.constructorInstance), [\n module.createI32(0), // this\n module.createI32(length)\n ])\n );\n for (let i = 0; i < length; ++i) {\n stmts[index++] = this.makeCallDirect(setter, [\n module.createGetLocal(tempLocal.index, nativeArrayType), // this\n module.createI32(i),\n compiledValues[i]\n ]);\n }\n assert(index + 1 == stmts.length);\n stmts[index] = module.createGetLocal(tempLocal.index, nativeArrayType);\n flow.freeTempLocal(tempLocal); // but can be reused now\n this.currentType = arrayType;\n return module.createBlock(null, stmts, nativeArrayType);\n }\n\n compileObjectLiteral(expression: ObjectLiteralExpression, contextualType: Type): ExpressionRef {\n var module = this.module;\n\n // contextual type must be a class\n var classReference = contextualType.classReference;\n if (!classReference || classReference.is(CommonFlags.ABSTRACT)) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n expression.range, \"\", contextualType.toString()\n );\n return module.createUnreachable();\n }\n\n // if present, check that the constructor is compatible with object literals\n var ctor = classReference.constructorInstance;\n if (ctor) {\n // TODO: if the constructor requires parameters, check whether these are given as part of the\n // object literal and use them to call the ctor while not generating a store.\n if (ctor.signature.requiredParameters) {\n this.error(\n DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,\n expression.range, classReference.toString()\n );\n return module.createUnreachable();\n }\n if (ctor.is(CommonFlags.PRIVATE)) {\n this.error(\n DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,\n expression.range, classReference.toString()\n );\n return module.createUnreachable();\n }\n if (ctor.is(CommonFlags.PROTECTED)) {\n this.error(\n DiagnosticCode.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration,\n expression.range, classReference.toString()\n );\n return module.createUnreachable();\n }\n }\n\n // check and compile field values\n var names = expression.names;\n var numNames = names.length;\n var values = expression.values;\n var members = classReference.members;\n var hasErrors = false;\n var exprs = new Array(numNames + 2);\n var flow = this.currentFlow;\n var tempLocal = flow.getTempLocal(this.options.usizeType);\n assert(numNames == values.length);\n for (let i = 0, k = numNames; i < k; ++i) {\n let member = members ? members.get(names[i].text) : null;\n if (!member || member.kind != ElementKind.FIELD) {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n names[i].range, names[i].text, classReference.toString()\n );\n hasErrors = true;\n continue;\n }\n let type = (member).type;\n exprs[i + 1] = this.module.createStore( // TODO: handle setters as well\n type.byteSize,\n this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType),\n this.compileExpression(values[i], (member).type, ConversionKind.IMPLICIT, WrapMode.NONE),\n type.toNativeType(),\n (member).memoryOffset\n );\n }\n this.currentType = classReference.type.nonNullableType;\n if (hasErrors) return module.createUnreachable();\n\n // allocate a new instance first and assign 'this' to the temp. local\n exprs[0] = module.createSetLocal(\n tempLocal.index,\n this.makeAllocation(classReference)\n );\n\n // once all field values have been set, return 'this'\n exprs[exprs.length - 1] = module.createGetLocal(tempLocal.index, this.options.nativeSizeType);\n\n return module.createBlock(null, exprs, this.options.nativeSizeType);\n }\n\n compileNewExpression(expression: NewExpression, contextualType: Type): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n\n // obtain the class being instantiated\n var target = this.resolver.resolveExpression( // reports\n expression.expression,\n flow\n );\n if (!target) return module.createUnreachable();\n if (target.kind != ElementKind.CLASS_PROTOTYPE) {\n this.error(\n DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature,\n expression.expression.range\n );\n return this.module.createUnreachable();\n }\n var classPrototype = target;\n var classInstance: Class | null = null;\n var typeArguments = expression.typeArguments;\n var classReference: Class | null;\n if (\n !typeArguments &&\n (classReference = contextualType.classReference) !== null &&\n classReference.is(CommonFlags.GENERIC)\n ) {\n classInstance = this.resolver.resolveClass(\n classPrototype,\n classReference.typeArguments,\n makeMap(flow.contextualTypeArguments)\n );\n } else {\n classInstance = this.resolver.resolveClassInclTypeArguments(\n classPrototype,\n typeArguments,\n makeMap(flow.contextualTypeArguments),\n expression\n );\n }\n if (!classInstance) return module.createUnreachable();\n return this.compileInstantiate(classInstance, expression.arguments, expression);\n }\n\n /** Gets the compiled constructor of the specified class or generates one if none is present. */\n ensureConstructor(classInstance: Class, reportNode: Node): Function {\n var ctorInstance = classInstance.constructorInstance;\n if (ctorInstance) {\n // do not attempt to compile it if inlined anyway\n if (!ctorInstance.hasDecorator(DecoratorFlags.INLINE)) this.compileFunction(ctorInstance);\n return ctorInstance;\n }\n\n // use the signature of the parent constructor if a derived class\n var baseClass = classInstance.base;\n var signature = baseClass\n ? this.ensureConstructor(baseClass, reportNode).signature\n : new Signature(null, classInstance.type, classInstance.type);\n\n var internalName = classInstance.internalName + INSTANCE_DELIMITER + \"constructor\";\n\n var nativeDummy = assert(this.program.elementsLookup.get(\"NATIVE_CODE\"));\n assert(nativeDummy.kind == ElementKind.FUNCTION_PROTOTYPE);\n\n ctorInstance = new Function(\n nativeDummy,\n internalName,\n signature,\n classInstance,\n null\n );\n ctorInstance.set(CommonFlags.INSTANCE | CommonFlags.CONSTRUCTOR | CommonFlags.COMPILED);\n classInstance.constructorInstance = ctorInstance;\n var previousFlow = this.currentFlow;\n this.currentFlow = ctorInstance.flow;\n\n // generate body\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n var stmts = new Array();\n\n // {\n // if (!this) this = \n // IF_DERIVED: this = super(this, ...args)\n // this.a = X\n // this.b = Y\n // return this\n // }\n stmts.push(\n module.createIf(\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\n module.createGetLocal(0, nativeSizeType)\n ),\n module.createSetLocal(0,\n this.makeAllocation(classInstance)\n )\n )\n );\n if (baseClass) {\n let parameterTypes = signature.parameterTypes;\n let numParameters = parameterTypes.length;\n let operands = new Array(1 + numParameters);\n operands[0] = module.createGetLocal(0, nativeSizeType);\n for (let i = 0; i < numParameters; ++i) {\n operands[i + 1] = module.createGetLocal(i + 1, parameterTypes[i].toNativeType());\n }\n // TODO: base constructor might be inlined, but makeCallDirect can't do this\n stmts.push(\n module.createSetLocal(0,\n this.makeCallDirect(assert(baseClass.constructorInstance), operands)\n )\n );\n }\n this.makeFieldInitialization(classInstance, stmts);\n stmts.push(\n module.createGetLocal(0, nativeSizeType)\n );\n\n // make the function\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var locals = ctorInstance.localsByIndex;\n var varTypes = new Array(); // of temp. vars added while compiling initializers\n var numOperands = 1 + signature.parameterTypes.length;\n var numLocals = locals.length;\n if (numLocals > numOperands) {\n for (let i = numOperands; i < numLocals; ++i) varTypes.push(locals[i].type.toNativeType());\n }\n var funcRef = module.addFunction(ctorInstance.internalName, typeRef, varTypes,\n stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, nativeSizeType)\n );\n ctorInstance.finalize(module, funcRef);\n this.currentFlow = previousFlow;\n return ctorInstance;\n }\n\n compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n var ctor = this.ensureConstructor(classInstance, reportNode);\n var expr = this.compileCallDirect(\n ctor,\n argumentExpressions,\n reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n this.currentType = classInstance.type;\n return expr;\n }\n\n compileParenthesizedExpression(\n expression: ParenthesizedExpression,\n contextualType: Type\n ): ExpressionRef {\n // does not change types, just order\n return this.compileExpression(\n expression.expression,\n contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n }\n\n /**\n * Compiles a property access in the specified context.\n * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\n * precomputes them according to context.\n */\n compilePropertyAccessExpression(\n propertyAccess: PropertyAccessExpression,\n contextualType: Type,\n retainConstantType: bool\n ): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n\n var target = this.resolver.resolvePropertyAccess(propertyAccess, flow, contextualType); // reports\n if (!target) return module.createUnreachable();\n\n switch (target.kind) {\n case ElementKind.GLOBAL: { // static property\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field\n return module.createUnreachable();\n }\n let globalType = (target).type;\n assert(globalType != Type.void);\n if ((target).is(CommonFlags.INLINED)) {\n return this.compileInlineConstant(target, contextualType, retainConstantType);\n }\n this.currentType = globalType;\n return module.createGetGlobal((target).internalName, globalType.toNativeType());\n }\n case ElementKind.ENUMVALUE: { // enum value\n let theEnum = assert((target).parent); assert(theEnum.kind == ElementKind.ENUM);\n if (!this.compileEnum(theEnum)) {\n this.currentType = Type.i32;\n return this.module.createUnreachable();\n }\n this.currentType = Type.i32;\n if ((target).is(CommonFlags.INLINED)) {\n return module.createI32((target).constantValue);\n }\n return module.createGetGlobal((target).internalName, NativeType.I32);\n }\n case ElementKind.FIELD: { // instance field\n let thisExpression = assert(this.resolver.currentThisExpression);\n assert((target).memoryOffset >= 0);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n this.currentType = (target).type;\n return module.createLoad(\n (target).type.byteSize,\n (target).type.is(TypeFlags.SIGNED | TypeFlags.INTEGER),\n thisExpr,\n (target).type.toNativeType(),\n (target).memoryOffset\n );\n }\n case ElementKind.PROPERTY: {// instance property (here: getter)\n return this.compileGetter(target, propertyAccess);\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n this.error(\n DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,\n propertyAccess.range, (target).simpleName\n );\n return module.createUnreachable();\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n propertyAccess.range\n );\n return module.createUnreachable();\n }\n\n private compileGetter(target: Property, reportNode: Node): ExpressionRef {\n var prototype = target.getterPrototype;\n if (prototype) {\n let instance = this.resolver.resolveFunction(prototype, null);\n if (!instance) return this.module.createUnreachable();\n let signature = instance.signature;\n if (!this.checkCallSignature( // reports\n signature,\n 0,\n instance.is(CommonFlags.INSTANCE),\n reportNode\n )) {\n return this.module.createUnreachable();\n }\n if (instance.is(CommonFlags.INSTANCE)) {\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\n let thisExpression = assert(this.resolver.currentThisExpression); //!!!\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n this.currentType = signature.returnType;\n return this.compileCallDirect(instance, [], reportNode, thisExpr);\n } else {\n this.currentType = signature.returnType;\n return this.compileCallDirect(instance, [], reportNode, 0);\n }\n } else {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n reportNode.range, (target).simpleName, (target).parent.toString()\n );\n return this.module.createUnreachable();\n }\n }\n\n compileTernaryExpression(expression: TernaryExpression, contextualType: Type): ExpressionRef {\n var ifThen = expression.ifThen;\n var ifElse = expression.ifElse;\n var outerFlow = this.currentFlow;\n\n var condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n\n if (\n !this.options.noTreeShaking ||\n outerFlow.actualFunction.isAny(CommonFlags.GENERIC | CommonFlags.GENERIC_CONTEXT)\n ) {\n // Try to eliminate unnecesssary branches if the condition is constant\n let condExprPrecomp = this.module.precomputeExpression(condExpr);\n if (\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\n getExpressionType(condExprPrecomp) == NativeType.I32\n ) {\n return getConstValueI32(condExprPrecomp)\n ? this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE)\n : this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\n\n // Otherwise recompile to the original and let the optimizer decide\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n }\n }\n\n var ifThenFlow = outerFlow.fork();\n this.currentFlow = ifThenFlow;\n var ifThenExpr = this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE);\n var ifThenType = this.currentType;\n ifThenFlow.freeScopedLocals();\n\n var ifElseFlow = outerFlow.fork();\n this.currentFlow = ifElseFlow;\n var ifElseExpr = this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\n var ifElseType = this.currentType;\n ifElseFlow.freeScopedLocals();\n this.currentFlow = outerFlow;\n\n outerFlow.inheritMutual(ifThenFlow, ifElseFlow);\n\n var commonType = Type.commonCompatible(ifThenType, ifElseType, false);\n if (!commonType) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n expression.range, ifThenType.toString(), ifElseType.toString()\n );\n this.currentType = contextualType;\n return this.module.createUnreachable();\n }\n ifThenExpr = this.convertExpression(\n ifThenExpr,\n ifThenType,\n commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n ifThen\n );\n ifElseExpr = this.convertExpression(\n ifElseExpr,\n ifElseType,\n commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n ifElse\n );\n this.currentType = commonType;\n return this.module.createIf(condExpr, ifThenExpr, ifElseExpr);\n }\n\n compileUnaryPostfixExpression(expression: UnaryPostfixExpression, contextualType: Type): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n\n // make a getter for the expression (also obtains the type)\n var getValue = this.compileExpression( // reports\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // shortcut if compiling the getter already failed\n if (getExpressionId(getValue) == ExpressionId.Unreachable) return getValue;\n\n var currentType = this.currentType;\n\n // if the value isn't dropped, a temp. local is required to remember the original value\n var tempLocal: Local | null = null;\n if (contextualType != Type.void) {\n tempLocal = flow.getTempLocal(currentType, false);\n getValue = module.createTeeLocal(\n tempLocal.index,\n getValue\n );\n }\n\n var calcValue: ExpressionRef;\n\n switch (expression.operator) {\n case Token.PLUS_PLUS: {\n switch (currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n calcValue = module.createBinary(\n BinaryOp.AddI32,\n getValue,\n module.createI32(1)\n );\n break;\n }\n case TypeKind.USIZE: {\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.POSTFIX_INC);\n if (overload) {\n calcValue = this.compileUnaryOverload(overload, expression.operand, getValue, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n }\n case TypeKind.ISIZE: {\n let options = this.options;\n calcValue = module.createBinary(\n options.isWasm64\n ? BinaryOp.AddI64\n : BinaryOp.AddI32,\n getValue,\n currentType.toNativeOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n calcValue = module.createBinary(\n BinaryOp.AddI64,\n getValue,\n module.createI64(1)\n );\n break;\n }\n case TypeKind.F32: {\n calcValue = module.createBinary(\n BinaryOp.AddF32,\n getValue,\n module.createF32(1)\n );\n break;\n }\n case TypeKind.F64: {\n calcValue = module.createBinary(\n BinaryOp.AddF64,\n getValue,\n module.createF64(1)\n );\n break;\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n break;\n }\n case Token.MINUS_MINUS: {\n switch (currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n calcValue = module.createBinary(\n BinaryOp.SubI32,\n getValue,\n module.createI32(1)\n );\n break;\n }\n case TypeKind.USIZE: {\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.POSTFIX_DEC);\n if (overload) {\n calcValue = this.compileUnaryOverload(overload, expression.operand, getValue, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n }\n case TypeKind.ISIZE: {\n let options = this.options;\n calcValue = module.createBinary(\n options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n getValue,\n currentType.toNativeOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n calcValue = module.createBinary(\n BinaryOp.SubI64,\n getValue,\n module.createI64(1)\n );\n break;\n }\n case TypeKind.F32: {\n calcValue = module.createBinary(\n BinaryOp.SubF32,\n getValue,\n module.createF32(1)\n );\n break;\n }\n case TypeKind.F64: {\n calcValue = module.createBinary(\n BinaryOp.SubF64,\n getValue,\n module.createF64(1)\n );\n break;\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n break;\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // simplify if dropped anyway\n if (!tempLocal) {\n this.currentType = Type.void;\n return this.compileAssignmentWithValue(expression.operand,\n calcValue,\n false\n );\n }\n\n // otherwise use the temp. local for the intermediate value (always possibly overflows)\n var setValue = this.compileAssignmentWithValue(expression.operand,\n calcValue, // also tees getValue to tempLocal\n false\n );\n\n this.currentType = tempLocal.type;\n flow.freeTempLocal(tempLocal);\n var nativeType = tempLocal.type.toNativeType();\n\n return module.createBlock(null, [\n setValue,\n module.createGetLocal(tempLocal.index, nativeType)\n ], nativeType); // result of 'x++' / 'x--' might overflow\n }\n\n compileUnaryPrefixExpression(\n expression: UnaryPrefixExpression,\n contextualType: Type\n ): ExpressionRef {\n var module = this.module;\n var compound = false;\n var expr: ExpressionRef;\n\n switch (expression.operator) {\n case Token.PLUS: {\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.PLUS);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n // nop\n break;\n }\n case Token.MINUS: {\n if (expression.operand.kind == NodeKind.LITERAL && (\n (expression.operand).literalKind == LiteralKind.INTEGER ||\n (expression.operand).literalKind == LiteralKind.FLOAT\n )) {\n // implicitly negate integer and float literals. also enables proper checking of literal ranges.\n expr = this.compileLiteralExpression(expression.operand, contextualType, true);\n // compileExpression normally does this:\n if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\n break;\n }\n\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.MINUS);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.SubI32, module.createI32(0), expr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n this.currentType.toNativeZero(module),\n expr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.SubI64, module.createI64(0), expr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createUnary(UnaryOp.NegF32, expr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createUnary(UnaryOp.NegF64, expr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.PLUS_PLUS: {\n compound = true;\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.PREFIX_INC);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.AddI32, expr, this.module.createI32(1));\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.AddI64\n : BinaryOp.AddI32,\n expr,\n this.currentType.toNativeOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.AddI64, expr, module.createI64(1));\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.AddF32, expr, module.createF32(1));\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.AddF64, expr, module.createF64(1));\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.MINUS_MINUS: {\n compound = true;\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.PREFIX_DEC);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.SubI32, expr, module.createI32(1));\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n expr,\n this.currentType.toNativeOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.SubI64, expr, module.createI64(1));\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.SubF32, expr, module.createF32(1));\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.SubF64, expr, module.createF64(1));\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.EXCLAMATION: {\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.NOT);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n // allow '!' for references even without an overload\n }\n\n expr = this.makeIsFalseish(expr, this.currentType);\n this.currentType = Type.bool;\n break;\n }\n case Token.TILDE: {\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType.is(TypeFlags.FLOAT)\n ? Type.i64\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_NOT);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n } else {\n expr = this.convertExpression(\n expr,\n this.currentType, this.currentType.intType,\n ConversionKind.IMPLICIT, WrapMode.NONE,\n expression.operand\n );\n }\n\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.XorI32, expr, module.createI32(-1));\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.XorI64\n : BinaryOp.XorI32,\n expr,\n this.currentType.toNativeNegOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.XorI64, expr, module.createI64(-1, -1));\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.TYPEOF: {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n return compound\n ? this.compileAssignmentWithValue(expression.operand, expr, contextualType != Type.void)\n : expr;\n }\n\n /** Makes sure that a 32-bit integer value is wrapped to a valid value of the specified type. */\n ensureSmallIntegerWrap(expr: ExpressionRef, type: Type): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n switch (type.kind) {\n case TypeKind.I8: {\n if (flow.canOverflow(expr, type)) {\n expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\n ? module.createUnary(UnaryOp.ExtendI8ToI32, expr)\n : module.createBinary(BinaryOp.ShrI32,\n module.createBinary(BinaryOp.ShlI32,\n expr,\n module.createI32(24)\n ),\n module.createI32(24)\n );\n }\n break;\n }\n case TypeKind.I16: {\n if (flow.canOverflow(expr, type)) {\n expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\n ? module.createUnary(UnaryOp.ExtendI16ToI32, expr)\n : module.createBinary(BinaryOp.ShrI32,\n module.createBinary(BinaryOp.ShlI32,\n expr,\n module.createI32(16)\n ),\n module.createI32(16)\n );\n }\n break;\n }\n case TypeKind.U8: {\n if (flow.canOverflow(expr, type)) {\n expr = module.createBinary(BinaryOp.AndI32,\n expr,\n module.createI32(0xff)\n );\n }\n break;\n }\n case TypeKind.U16: {\n if (flow.canOverflow(expr, type)) {\n expr = module.createBinary(BinaryOp.AndI32,\n expr,\n module.createI32(0xffff)\n );\n }\n break;\n }\n case TypeKind.BOOL: {\n if (flow.canOverflow(expr, type)) {\n // bool is special in that it compares to 0 instead of masking with 0x1\n expr = module.createBinary(BinaryOp.NeI32,\n expr,\n module.createI32(0)\n );\n }\n break;\n }\n }\n return expr;\n }\n\n /** Creates a comparison whether an expression is 'false' in a broader sense. */\n makeIsFalseish(expr: ExpressionRef, type: Type): ExpressionRef {\n var module = this.module;\n switch (type.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = this.ensureSmallIntegerWrap(expr, type);\n // fall-through\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n return module.createUnary(UnaryOp.EqzI32, expr);\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createUnary(UnaryOp.EqzI64, expr);\n }\n case TypeKind.USIZE: // TODO: strings?\n case TypeKind.ISIZE: {\n return module.createUnary(type.size == 64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32, expr);\n }\n case TypeKind.F32: {\n return module.createBinary(BinaryOp.EqF32, expr, module.createF32(0));\n }\n case TypeKind.F64: {\n return module.createBinary(BinaryOp.EqF64, expr, module.createF64(0));\n }\n default: {\n assert(false);\n return module.createI32(1);\n }\n }\n }\n\n /** Creates a comparison whether an expression is 'true' in a broader sense. */\n makeIsTrueish(expr: ExpressionRef, type: Type): ExpressionRef {\n var module = this.module;\n switch (type.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = this.ensureSmallIntegerWrap(expr, type);\n // fall-through\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n return expr;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\n }\n case TypeKind.USIZE: // TODO: strings?\n case TypeKind.ISIZE: {\n return type.size == 64\n ? module.createBinary(BinaryOp.NeI64, expr, module.createI64(0))\n : expr;\n }\n case TypeKind.F32: {\n return module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\n }\n case TypeKind.F64: {\n return module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\n }\n default: {\n assert(false);\n return module.createI32(0);\n }\n }\n }\n\n /** Makes an allocation suitable to hold the data of an instance of the given class. */\n makeAllocation(classInstance: Class): ExpressionRef {\n var program = this.program;\n assert(classInstance.program == program);\n var module = this.module;\n var options = this.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!this.compileFunction(allocateInstance)) return module.createUnreachable();\n this.currentType = classInstance.type;\n return module.createCall(\n allocateInstance.internalName, [\n options.isWasm64\n ? module.createI64(classInstance.currentMemoryOffset)\n : module.createI32(classInstance.currentMemoryOffset),\n module.createI32(\n ensureGCHook(this, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance || !this.compileFunction(allocateInstance)) return module.createUnreachable();\n this.currentType = classInstance.type;\n return module.createCall(\n allocateInstance.internalName, [\n options.isWasm64\n ? module.createI64(classInstance.currentMemoryOffset)\n : module.createI32(classInstance.currentMemoryOffset)\n ],\n options.nativeSizeType\n );\n }\n }\n\n /** Makes the initializers for a class's fields. */\n makeFieldInitialization(classInstance: Class, stmts: ExpressionRef[] = []): ExpressionRef[] {\n var members = classInstance.members;\n if (!members) return [];\n\n var module = this.module;\n var flow = this.currentFlow;\n var isInline = flow.is(FlowFlags.INLINE_CONTEXT);\n var thisLocalIndex = isInline\n ? assert(flow.lookupLocal(\"this\")).index\n : 0;\n var nativeSizeType = this.options.nativeSizeType;\n\n for (let member of members.values()) {\n if (\n member.kind != ElementKind.FIELD || // not a field\n member.parent != classInstance // inherited field\n ) continue;\n\n let field = member; assert(!field.isAny(CommonFlags.CONST));\n let fieldType = field.type;\n let nativeFieldType = fieldType.toNativeType();\n let fieldDeclaration = field.prototype.declaration;\n let initializer = fieldDeclaration.initializer;\n if (initializer) { // use initializer\n stmts.push(\n module.createStore(fieldType.byteSize,\n module.createGetLocal(thisLocalIndex, nativeSizeType),\n this.compileExpression( // reports\n initializer,\n fieldType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n ),\n nativeFieldType,\n field.memoryOffset\n )\n );\n } else {\n let parameterIndex = fieldDeclaration.parameterIndex;\n stmts.push(\n module.createStore(fieldType.byteSize,\n module.createGetLocal(thisLocalIndex, nativeSizeType),\n parameterIndex >= 0 // initialized via parameter (here: a local)\n ? module.createGetLocal(\n isInline\n ? assert(flow.lookupLocal(field.simpleName)).index\n : 1 + parameterIndex, // this is local 0\n nativeFieldType\n )\n : fieldType.toNativeZero(module),\n nativeFieldType,\n field.memoryOffset\n )\n );\n }\n }\n return stmts;\n }\n\n /** Adds the debug location of the specified expression at the specified range to the source map. */\n addDebugLocation(expr: ExpressionRef, range: Range): void {\n var parentFunction = this.currentFlow.parentFunction;\n var source = range.source;\n if (source.debugInfoIndex < 0) source.debugInfoIndex = this.module.addDebugInfoFile(source.normalizedPath);\n range.debugInfoRef = expr;\n parentFunction.debugLocations.push(range);\n }\n}\n\n// helpers\n\nfunction mangleImportName(\n element: Element,\n declaration: DeclarationStatement\n): void {\n // by default, use the file name as the module name\n mangleImportName_moduleName = declaration.range.source.simplePath;\n // and the internal name of the element within that file as the element name\n mangleImportName_elementName = declaration.programLevelInternalName;\n\n if (!element.hasDecorator(DecoratorFlags.EXTERNAL)) return;\n\n var program = element.program;\n var decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\n var args = decorator.arguments;\n if (args && args.length) {\n let arg = args[0];\n // if one argument is given, override just the element name\n // if two arguments are given, override both module and element name\n if (arg.kind == NodeKind.LITERAL && (arg).literalKind == LiteralKind.STRING) {\n mangleImportName_elementName = (arg).value;\n if (args.length >= 2) {\n arg = args[1];\n if (arg.kind == NodeKind.LITERAL && (arg).literalKind == LiteralKind.STRING) {\n mangleImportName_moduleName = mangleImportName_elementName;\n mangleImportName_elementName = (arg).value;\n if (args.length > 2) {\n program.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n decorator.range, \"2\", args.length.toString()\n );\n }\n } else {\n program.error(\n DiagnosticCode.String_literal_expected,\n arg.range\n );\n }\n }\n } else {\n program.error(\n DiagnosticCode.String_literal_expected,\n arg.range\n );\n }\n } else {\n program.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n decorator.range, \"1\", \"0\"\n );\n }\n}\n\nvar mangleImportName_moduleName: string;\nvar mangleImportName_elementName: string;\n","/**\n * Generated from diagnosticsMessages.json. Do not edit.\n * @module diagnostics\n *//***/\n\n/* tslint:disable:max-line-length */\n\n/** Enum of available diagnostic codes. */\nexport enum DiagnosticCode {\n Operation_not_supported = 100,\n Operation_is_unsafe = 101,\n User_defined_0 = 102,\n Conversion_from_type_0_to_1_requires_an_explicit_cast = 200,\n Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit = 201,\n Type_0_cannot_be_changed_to_type_1 = 202,\n Type_0_cannot_be_reinterpreted_as_type_1 = 203,\n Basic_type_0_cannot_be_nullable = 204,\n Cannot_export_a_mutable_global = 205,\n Compiling_constant_with_non_constant_initializer_as_mutable = 206,\n Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa = 207,\n Unmanaged_classes_cannot_implement_interfaces = 208,\n Invalid_regular_expression_flags = 209,\n Implementation_0_must_match_the_signature_1 = 210,\n Class_0_is_sealed_and_cannot_be_extended = 211,\n Decorator_0_is_not_valid_here = 212,\n Duplicate_decorator = 213,\n An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf = 214,\n Optional_parameter_must_have_an_initializer = 215,\n Constructor_of_class_0_must_not_require_any_arguments = 216,\n Function_0_cannot_be_inlined_into_itself = 217,\n Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set = 218,\n Optional_properties_are_not_supported = 219,\n Expression_must_be_a_compile_time_constant = 220,\n Unterminated_string_literal = 1002,\n Identifier_expected = 1003,\n _0_expected = 1005,\n A_file_cannot_have_a_reference_to_itself = 1006,\n Trailing_comma_not_allowed = 1009,\n Unexpected_token = 1012,\n A_rest_parameter_must_be_last_in_a_parameter_list = 1014,\n Parameter_cannot_have_question_mark_and_initializer = 1015,\n A_required_parameter_cannot_follow_an_optional_parameter = 1016,\n Statements_are_not_allowed_in_ambient_contexts = 1036,\n Initializers_are_not_allowed_in_ambient_contexts = 1039,\n _0_modifier_cannot_be_used_here = 1042,\n A_rest_parameter_cannot_be_optional = 1047,\n A_rest_parameter_cannot_have_an_initializer = 1048,\n A_set_accessor_must_have_exactly_one_parameter = 1049,\n A_set_accessor_parameter_cannot_have_an_initializer = 1052,\n A_get_accessor_cannot_have_parameters = 1054,\n Enum_member_must_have_initializer = 1061,\n Type_parameters_cannot_appear_on_a_constructor_declaration = 1092,\n Type_annotation_cannot_appear_on_a_constructor_declaration = 1093,\n An_accessor_cannot_have_type_parameters = 1094,\n A_set_accessor_cannot_have_a_return_type_annotation = 1095,\n Type_parameter_list_cannot_be_empty = 1098,\n A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement = 1104,\n A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement = 1105,\n A_return_statement_can_only_be_used_within_a_function_body = 1108,\n Expression_expected = 1109,\n Type_expected = 1110,\n A_default_clause_cannot_appear_more_than_once_in_a_switch_statement = 1113,\n Duplicate_label_0 = 1114,\n Octal_literals_are_not_allowed_in_strict_mode = 1121,\n Digit_expected = 1124,\n Hexadecimal_digit_expected = 1125,\n Unexpected_end_of_text = 1126,\n Invalid_character = 1127,\n _case_or_default_expected = 1130,\n _super_must_be_followed_by_an_argument_list_or_member_access = 1034,\n A_declare_modifier_cannot_be_used_in_an_already_ambient_context = 1038,\n Type_argument_expected = 1140,\n String_literal_expected = 1141,\n Line_break_not_permitted_here = 1142,\n Declaration_expected = 1146,\n _const_declarations_must_be_initialized = 1155,\n Unterminated_regular_expression_literal = 1161,\n Interface_declaration_cannot_have_implements_clause = 1176,\n Binary_digit_expected = 1177,\n Octal_digit_expected = 1178,\n An_implementation_cannot_be_declared_in_ambient_contexts = 1183,\n An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive = 1198,\n Unterminated_Unicode_escape_sequence = 1199,\n Decorators_are_not_valid_here = 1206,\n _abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration = 1242,\n Method_0_cannot_have_an_implementation_because_it_is_marked_abstract = 1245,\n A_definite_assignment_assertion_is_not_permitted_in_this_context = 1255,\n A_class_may_only_extend_another_class = 1311,\n A_parameter_property_cannot_be_declared_using_a_rest_parameter = 1317,\n Duplicate_identifier_0 = 2300,\n Cannot_find_name_0 = 2304,\n Module_0_has_no_exported_member_1 = 2305,\n Generic_type_0_requires_1_type_argument_s = 2314,\n Type_0_is_not_generic = 2315,\n Type_0_is_not_assignable_to_type_1 = 2322,\n Index_signature_is_missing_in_type_0 = 2329,\n _this_cannot_be_referenced_in_current_location = 2332,\n _super_can_only_be_referenced_in_a_derived_class = 2335,\n Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors = 2337,\n Property_0_does_not_exist_on_type_1 = 2339,\n Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures = 2349,\n Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature = 2351,\n A_function_whose_declared_type_is_not_void_must_return_a_value = 2355,\n The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access = 2357,\n The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access = 2364,\n Operator_0_cannot_be_applied_to_types_1_and_2 = 2365,\n A_super_call_must_be_the_first_statement_in_the_constructor = 2376,\n Constructors_for_derived_classes_must_contain_a_super_call = 2377,\n _get_and_set_accessor_must_have_the_same_type = 2380,\n Constructor_implementation_is_missing = 2390,\n Function_implementation_is_missing_or_not_immediately_following_the_declaration = 2391,\n Multiple_constructor_implementations_are_not_allowed = 2392,\n Duplicate_function_implementation = 2393,\n Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local = 2395,\n Type_0_has_no_property_1 = 2460,\n The_0_operator_cannot_be_applied_to_type_1 = 2469,\n In_const_enum_declarations_member_initializer_must_be_constant_expression = 2474,\n Export_declaration_conflicts_with_exported_declaration_of_0 = 2484,\n Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property = 2540,\n The_target_of_an_assignment_must_be_a_variable_or_a_property_access = 2541,\n Index_signature_in_type_0_only_permits_reading = 2542,\n Expected_0_arguments_but_got_1 = 2554,\n Expected_at_least_0_arguments_but_got_1 = 2555,\n Expected_0_type_arguments_but_got_1 = 2558,\n A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums = 2651,\n Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration = 2673,\n Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration = 2674,\n Namespace_0_has_no_exported_member_1 = 2694,\n Required_type_parameters_may_not_follow_optional_type_parameters = 2706,\n File_0_not_found = 6054,\n Numeric_separators_are_not_allowed_here = 6188,\n Multiple_consecutive_numeric_separators_are_not_permitted = 6189,\n _super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class = 17009,\n _super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class = 17011\n}\n\n/** Translates a diagnostic code to its respective string. */\nexport function diagnosticCodeToString(code: DiagnosticCode): string {\n switch (code) {\n case 100: return \"Operation not supported.\";\n case 101: return \"Operation is unsafe.\";\n case 102: return \"User-defined: {0}\";\n case 200: return \"Conversion from type '{0}' to '{1}' requires an explicit cast.\";\n case 201: return \"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.\";\n case 202: return \"Type '{0}' cannot be changed to type '{1}'.\";\n case 203: return \"Type '{0}' cannot be reinterpreted as type '{1}'.\";\n case 204: return \"Basic type '{0}' cannot be nullable.\";\n case 205: return \"Cannot export a mutable global.\";\n case 206: return \"Compiling constant with non-constant initializer as mutable.\";\n case 207: return \"Unmanaged classes cannot extend managed classes and vice-versa.\";\n case 208: return \"Unmanaged classes cannot implement interfaces.\";\n case 209: return \"Invalid regular expression flags.\";\n case 210: return \"Implementation '{0}' must match the signature '{1}'.\";\n case 211: return \"Class '{0}' is sealed and cannot be extended.\";\n case 212: return \"Decorator '{0}' is not valid here.\";\n case 213: return \"Duplicate decorator.\";\n case 214: return \"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.\";\n case 215: return \"Optional parameter must have an initializer.\";\n case 216: return \"Constructor of class '{0}' must not require any arguments.\";\n case 217: return \"Function '{0}' cannot be inlined into itself.\";\n case 218: return \"Cannot access method '{0}' without calling it as it requires 'this' to be set.\";\n case 219: return \"Optional properties are not supported.\";\n case 220: return \"Expression must be a compile-time constant.\";\n case 1002: return \"Unterminated string literal.\";\n case 1003: return \"Identifier expected.\";\n case 1005: return \"'{0}' expected.\";\n case 1006: return \"A file cannot have a reference to itself.\";\n case 1009: return \"Trailing comma not allowed.\";\n case 1012: return \"Unexpected token.\";\n case 1014: return \"A rest parameter must be last in a parameter list.\";\n case 1015: return \"Parameter cannot have question mark and initializer.\";\n case 1016: return \"A required parameter cannot follow an optional parameter.\";\n case 1036: return \"Statements are not allowed in ambient contexts.\";\n case 1039: return \"Initializers are not allowed in ambient contexts.\";\n case 1042: return \"'{0}' modifier cannot be used here.\";\n case 1047: return \"A rest parameter cannot be optional.\";\n case 1048: return \"A rest parameter cannot have an initializer.\";\n case 1049: return \"A 'set' accessor must have exactly one parameter.\";\n case 1052: return \"A 'set' accessor parameter cannot have an initializer.\";\n case 1054: return \"A 'get' accessor cannot have parameters.\";\n case 1061: return \"Enum member must have initializer.\";\n case 1092: return \"Type parameters cannot appear on a constructor declaration.\";\n case 1093: return \"Type annotation cannot appear on a constructor declaration.\";\n case 1094: return \"An accessor cannot have type parameters.\";\n case 1095: return \"A 'set' accessor cannot have a return type annotation.\";\n case 1098: return \"Type parameter list cannot be empty.\";\n case 1104: return \"A 'continue' statement can only be used within an enclosing iteration statement.\";\n case 1105: return \"A 'break' statement can only be used within an enclosing iteration or switch statement.\";\n case 1108: return \"A 'return' statement can only be used within a function body.\";\n case 1109: return \"Expression expected.\";\n case 1110: return \"Type expected.\";\n case 1113: return \"A 'default' clause cannot appear more than once in a 'switch' statement.\";\n case 1114: return \"Duplicate label '{0}'.\";\n case 1121: return \"Octal literals are not allowed in strict mode.\";\n case 1124: return \"Digit expected.\";\n case 1125: return \"Hexadecimal digit expected.\";\n case 1126: return \"Unexpected end of text.\";\n case 1127: return \"Invalid character.\";\n case 1130: return \"'case' or 'default' expected.\";\n case 1034: return \"'super' must be followed by an argument list or member access.\";\n case 1038: return \"A 'declare' modifier cannot be used in an already ambient context.\";\n case 1140: return \"Type argument expected.\";\n case 1141: return \"String literal expected.\";\n case 1142: return \"Line break not permitted here.\";\n case 1146: return \"Declaration expected.\";\n case 1155: return \"'const' declarations must be initialized.\";\n case 1161: return \"Unterminated regular expression literal.\";\n case 1176: return \"Interface declaration cannot have 'implements' clause.\";\n case 1177: return \"Binary digit expected.\";\n case 1178: return \"Octal digit expected.\";\n case 1183: return \"An implementation cannot be declared in ambient contexts.\";\n case 1198: return \"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.\";\n case 1199: return \"Unterminated Unicode escape sequence.\";\n case 1206: return \"Decorators are not valid here.\";\n case 1242: return \"'abstract' modifier can only appear on a class, method, or property declaration.\";\n case 1245: return \"Method '{0}' cannot have an implementation because it is marked abstract.\";\n case 1255: return \"A definite assignment assertion '!' is not permitted in this context.\";\n case 1311: return \"A class may only extend another class.\";\n case 1317: return \"A parameter property cannot be declared using a rest parameter.\";\n case 2300: return \"Duplicate identifier '{0}'.\";\n case 2304: return \"Cannot find name '{0}'.\";\n case 2305: return \"Module '{0}' has no exported member '{1}'.\";\n case 2314: return \"Generic type '{0}' requires {1} type argument(s).\";\n case 2315: return \"Type '{0}' is not generic.\";\n case 2322: return \"Type '{0}' is not assignable to type '{1}'.\";\n case 2329: return \"Index signature is missing in type '{0}'.\";\n case 2332: return \"'this' cannot be referenced in current location.\";\n case 2335: return \"'super' can only be referenced in a derived class.\";\n case 2337: return \"Super calls are not permitted outside constructors or in nested functions inside constructors.\";\n case 2339: return \"Property '{0}' does not exist on type '{1}'.\";\n case 2349: return \"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.\";\n case 2351: return \"Cannot use 'new' with an expression whose type lacks a construct signature.\";\n case 2355: return \"A function whose declared type is not 'void' must return a value.\";\n case 2357: return \"The operand of an increment or decrement operator must be a variable or a property access.\";\n case 2364: return \"The left-hand side of an assignment expression must be a variable or a property access.\";\n case 2365: return \"Operator '{0}' cannot be applied to types '{1}' and '{2}'.\";\n case 2376: return \"A 'super' call must be the first statement in the constructor.\";\n case 2377: return \"Constructors for derived classes must contain a 'super' call.\";\n case 2380: return \"'get' and 'set' accessor must have the same type.\";\n case 2390: return \"Constructor implementation is missing.\";\n case 2391: return \"Function implementation is missing or not immediately following the declaration.\";\n case 2392: return \"Multiple constructor implementations are not allowed.\";\n case 2393: return \"Duplicate function implementation.\";\n case 2395: return \"Individual declarations in merged declaration '{0}' must be all exported or all local.\";\n case 2460: return \"Type '{0}' has no property '{1}'.\";\n case 2469: return \"The '{0}' operator cannot be applied to type '{1}'.\";\n case 2474: return \"In 'const' enum declarations member initializer must be constant expression.\";\n case 2484: return \"Export declaration conflicts with exported declaration of '{0}'.\";\n case 2540: return \"Cannot assign to '{0}' because it is a constant or a read-only property.\";\n case 2541: return \"The target of an assignment must be a variable or a property access.\";\n case 2542: return \"Index signature in type '{0}' only permits reading.\";\n case 2554: return \"Expected {0} arguments, but got {1}.\";\n case 2555: return \"Expected at least {0} arguments, but got {1}.\";\n case 2558: return \"Expected {0} type arguments, but got {1}.\";\n case 2651: return \"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.\";\n case 2673: return \"Constructor of class '{0}' is private and only accessible within the class declaration.\";\n case 2674: return \"Constructor of class '{0}' is protected and only accessible within the class declaration.\";\n case 2694: return \"Namespace '{0}' has no exported member '{1}'.\";\n case 2706: return \"Required type parameters may not follow optional type parameters.\";\n case 6054: return \"File '{0}' not found.\";\n case 6188: return \"Numeric separators are not allowed here.\";\n case 6189: return \"Multiple consecutive numeric separators are not permitted.\";\n case 17009: return \"'super' must be called before accessing 'this' in the constructor of a derived class.\";\n case 17011: return \"'super' must be called before accessing a property of 'super' in the constructor of a derived class.\";\n default: return \"\";\n }\n}\n","/**\n * Resolve infrastructure to obtain types and elements.\n * @module resolver\n *//***/\n\nimport {\n DiagnosticEmitter,\n DiagnosticCode\n} from \"./diagnostics\";\n\nimport {\n Program,\n ElementKind,\n OperatorKind,\n FlowFlags,\n\n Element,\n Class,\n ClassPrototype,\n Function,\n FunctionTarget,\n FunctionPrototype,\n VariableLikeElement,\n Property,\n DecoratorFlags,\n FieldPrototype,\n Field,\n Global,\n Flow\n} from \"./program\";\n\nimport {\n SignatureNode,\n ParameterKind,\n CommonTypeNode,\n NodeKind,\n TypeNode,\n TypeParameterNode,\n Node,\n Range,\n IdentifierExpression,\n CallExpression,\n ElementAccessExpression,\n PropertyAccessExpression,\n LiteralExpression,\n LiteralKind,\n ParenthesizedExpression,\n AssertionExpression,\n Expression,\n IntegerLiteralExpression,\n UnaryPrefixExpression,\n UnaryPostfixExpression,\n AssertionKind\n} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind,\n TypeFlags\n} from \"./types\";\n\nimport {\n PATH_DELIMITER,\n INSTANCE_DELIMITER,\n CommonFlags\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\n\nimport {\n Token\n} from \"./tokenizer\";\n\n/** Indicates whether errors are reported or not. */\nexport enum ReportMode {\n /** Report errors. */\n REPORT,\n /** Swallow errors. */\n SWALLOW\n}\n\n/** Provides tools to resolve types and expressions. */\nexport class Resolver extends DiagnosticEmitter {\n\n /** The program this resolver belongs to. */\n program: Program;\n\n /** Target expression of the previously resolved property or element access. */\n currentThisExpression: Expression | null = null;\n /** Element expression of the previously resolved element access. */\n currentElementExpression : Expression | null = null;\n\n /** Constructs the resolver for the specified program. */\n constructor(program: Program) {\n super(program.diagnostics);\n this.program = program;\n }\n\n /** Resolves a {@link CommonTypeNode} to a concrete {@link Type}. */\n resolveType(\n node: CommonTypeNode,\n contextualTypeArguments: Map | null = null,\n reportMode = ReportMode.REPORT\n ): Type | null {\n\n // handle signatures specifically\n if (node.kind == NodeKind.SIGNATURE) {\n let signature = this.resolveSignature(node, contextualTypeArguments, reportMode);\n if (!signature) return null;\n return node.isNullable ? signature.type.asNullable() : signature.type;\n }\n\n // now dealing with TypeNode\n assert(node.kind == NodeKind.TYPE);\n var typeNode = node;\n var simpleName = typeNode.name.text;\n var globalName = simpleName;\n var localName = typeNode.range.source.internalPath + PATH_DELIMITER + simpleName; // TODO cache\n\n // check file-global / program-global enum or class\n {\n let elementsLookup = this.program.elementsLookup;\n let element: Element | null;\n if (\n (element = elementsLookup.get(localName)) || // file-global\n (element = elementsLookup.get(globalName)) // program-global\n ) {\n switch (element.kind) {\n case ElementKind.ENUM: {\n if (typeNode.typeArguments !== null && typeNode.typeArguments.length) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n node.range, element.internalName\n );\n }\n return null;\n }\n return Type.i32;\n }\n case ElementKind.CLASS_PROTOTYPE: {\n let instance = this.resolveClassInclTypeArguments(\n element,\n typeNode.typeArguments,\n makeMap(contextualTypeArguments),\n node\n ); // reports\n if (!instance) return null;\n return node.isNullable ? instance.type.asNullable() : instance.type;\n }\n }\n }\n }\n\n // check (global) type alias\n {\n let alias = this.program.typeAliases.get(simpleName);\n if (alias) return this.resolveType(alias.type, contextualTypeArguments, reportMode);\n }\n\n // resolve parameters\n var typeArgumentNodes = typeNode.typeArguments;\n var typeArguments: Type[] | null = null;\n if (typeArgumentNodes) {\n let numTypeArguments = typeArgumentNodes.length;\n typeArguments = new Array(numTypeArguments);\n for (let i = 0; i < numTypeArguments; ++i) {\n let paramType = this.resolveType( // reports\n typeArgumentNodes[i],\n contextualTypeArguments,\n reportMode\n );\n if (!paramType) return null;\n typeArguments[i] = paramType;\n }\n if (numTypeArguments) { // can't be a placeholder if it has parameters\n let instanceKey = typesToString(typeArguments);\n if (instanceKey.length) {\n localName += \"<\" + instanceKey + \">\";\n globalName += \"<\" + instanceKey + \">\";\n }\n } else if (contextualTypeArguments) {\n let placeholderType = contextualTypeArguments.get(globalName);\n if (placeholderType) return placeholderType;\n }\n }\n\n // check file-global / program-global type\n {\n let typesLookup = this.program.typesLookup;\n let type: Type | null;\n if (\n (type = typesLookup.get(localName)) ||\n (type = typesLookup.get(globalName))\n ) {\n if (!type.is(TypeFlags.REFERENCE) && node.isNullable) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Basic_type_0_cannot_be_nullable,\n node.range, type.toString()\n );\n }\n }\n return type;\n }\n }\n\n // check built-in macro types\n if (simpleName == \"NATIVE\") {\n if (!(typeArguments && typeArguments.length == 1)) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n typeNode.range, \"1\", (typeArgumentNodes ? typeArgumentNodes.length : 1).toString(10)\n );\n }\n return null;\n }\n switch (typeArguments[0].kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: return Type.i32;\n case TypeKind.ISIZE: if (!this.program.options.isWasm64) return Type.i32;\n case TypeKind.I64: return Type.i64;\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: return Type.u32;\n case TypeKind.USIZE: if (!this.program.options.isWasm64) return Type.u32;\n case TypeKind.U64: return Type.u64;\n case TypeKind.F32: return Type.f32;\n case TypeKind.F64: return Type.f64;\n case TypeKind.V128: return Type.v128;\n case TypeKind.VOID: return Type.void;\n default: assert(false);\n }\n }\n\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n typeNode.name.range, globalName\n );\n }\n return null;\n }\n\n /** Resolves a {@link SignatureNode} to a concrete {@link Signature}. */\n resolveSignature(\n node: SignatureNode,\n contextualTypeArguments: Map | null = null,\n reportMode: ReportMode = ReportMode.REPORT\n ): Signature | null {\n var explicitThisType = node.explicitThisType;\n var thisType: Type | null = null;\n if (explicitThisType) {\n thisType = this.resolveType(explicitThisType, contextualTypeArguments, reportMode);\n if (!thisType) return null;\n }\n var parameterTypeNodes = node.parameters;\n var numParameters = parameterTypeNodes.length;\n var parameterTypes = new Array(numParameters);\n var parameterNames = new Array(numParameters);\n var requiredParameters = 0;\n var hasRest = false;\n for (let i = 0; i < numParameters; ++i) {\n let parameterTypeNode = parameterTypeNodes[i];\n switch (parameterTypeNode.parameterKind) {\n case ParameterKind.DEFAULT: {\n requiredParameters = i + 1;\n break;\n }\n case ParameterKind.REST: {\n assert(i == numParameters);\n hasRest = true;\n break;\n }\n }\n let parameterType = this.resolveType(\n assert(parameterTypeNode.type),\n contextualTypeArguments,\n reportMode\n );\n if (!parameterType) return null;\n parameterTypes[i] = parameterType;\n parameterNames[i] = parameterTypeNode.name.text;\n }\n var returnTypeNode = node.returnType;\n var returnType: Type | null;\n if (returnTypeNode) {\n returnType = this.resolveType(returnTypeNode, contextualTypeArguments, reportMode);\n if (!returnType) return null;\n } else {\n returnType = Type.void;\n }\n var signature = new Signature(parameterTypes, returnType, thisType);\n signature.parameterNames = parameterNames;\n signature.requiredParameters = requiredParameters;\n signature.hasRest = hasRest;\n return signature;\n }\n\n /** Resolves an array of type arguments to concrete types. */\n resolveTypeArguments(\n typeParameters: TypeParameterNode[],\n typeArgumentNodes: CommonTypeNode[] | null,\n contextualTypeArguments: Map,\n alternativeReportNode: Node | null = null,\n reportMode: ReportMode = ReportMode.REPORT\n ): Type[] | null {\n var minParameterCount = 0;\n var maxParameterCount = 0;\n for (let i = 0; i < typeParameters.length; ++i) {\n if (!typeParameters[i].defaultType) ++minParameterCount;\n ++maxParameterCount;\n }\n var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;\n if (argumentCount < minParameterCount || argumentCount > maxParameterCount) {\n this.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n argumentCount\n ? Range.join(\n (typeArgumentNodes)[0].range,\n (typeArgumentNodes)[argumentCount - 1].range\n )\n : assert(alternativeReportNode).range.atEnd,\n (argumentCount < minParameterCount ? minParameterCount : maxParameterCount).toString(10),\n argumentCount.toString(10)\n );\n return null;\n }\n var typeArguments = new Array(maxParameterCount);\n for (let i = 0; i < maxParameterCount; ++i) {\n let type = i < argumentCount\n ? this.resolveType( // reports\n (typeArgumentNodes)[i],\n contextualTypeArguments,\n reportMode\n )\n : this.resolveType( // reports\n assert(typeParameters[i].defaultType),\n contextualTypeArguments,\n reportMode\n );\n if (!type) return null;\n // TODO: check extendsType\n contextualTypeArguments.set(typeParameters[i].name.text, type);\n typeArguments[i] = type;\n }\n return typeArguments;\n }\n\n /** Resolves an identifier to the element it refers to. */\n resolveIdentifier(\n identifier: IdentifierExpression,\n flow: Flow | null,\n context: Element | null,\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var name = identifier.text;\n var element: Element | null;\n\n if (flow) {\n let local = flow.lookupLocal(name);\n if (local) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return local;\n }\n }\n\n if (context) {\n\n switch (context.kind) {\n case ElementKind.FUNCTION: { // use prototype\n context = (context).prototype.parent;\n break;\n }\n case ElementKind.CLASS: { // use prototype\n context = (context).prototype.parent;\n break;\n }\n }\n\n // search context\n while (context) {\n let members = context.members;\n if (members) {\n if (element = members.get(name)) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element;\n }\n }\n context = context.parent;\n }\n }\n\n // search current file\n var elementsLookup = this.program.elementsLookup;\n if (element = elementsLookup.get(identifier.range.source.internalPath + PATH_DELIMITER + name)) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE\n }\n\n // search global scope\n if (element = elementsLookup.get(name)) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element; // GLOBAL, FUNCTION_PROTOTYPE, CLASS_PROTOTYPE\n }\n\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n identifier.range, name\n );\n }\n return null;\n }\n\n /** Resolves a lazily compiled global, i.e. a static class field. */\n ensureResolvedLazyGlobal(global: Global, reportMode: ReportMode = ReportMode.REPORT): bool {\n if (global.is(CommonFlags.RESOLVED)) return true;\n var resolveType = assert(global.declaration).type;\n if (!resolveType) return false;\n var resolvedType = this.resolveType(resolveType, null, reportMode);\n if (!resolvedType) return false;\n global.type = resolvedType;\n global.set(CommonFlags.RESOLVED);\n return true;\n }\n\n /** Resolves a property access to the element it refers to. */\n resolvePropertyAccess(\n propertyAccess: PropertyAccessExpression,\n flow: Flow,\n contextualType: Type,\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n // start by resolving the lhs target (expression before the last dot)\n var targetExpression = propertyAccess.expression;\n var target = this.resolveExpression(targetExpression, flow, contextualType, reportMode); // reports\n if (!target) return null;\n\n // at this point we know exactly what the target is, so look up the element within\n var propertyName = propertyAccess.property.text;\n\n // Resolve variable-likes to the class type they reference first\n switch (target.kind) {\n case ElementKind.GLOBAL: if (!this.ensureResolvedLazyGlobal(target, reportMode)) return null;\n case ElementKind.LOCAL:\n case ElementKind.FIELD: {\n let type = (target).type;\n assert(type != Type.void);\n let classReference = type.classReference;\n if (!classReference) {\n let basicClasses = this.program.basicClasses;\n if (!type.is(TypeFlags.REFERENCE) && basicClasses.has(type.kind)) {\n classReference = assert(basicClasses.get(type.kind));\n } else {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, (target).type.toString()\n );\n return null;\n }\n }\n target = classReference;\n break;\n }\n case ElementKind.PROPERTY: {\n let getter = this.resolveFunction(\n assert((target).getterPrototype),\n null,\n makeMap(),\n reportMode\n );\n if (!getter) return null;\n let classReference = getter.signature.returnType.classReference;\n if (!classReference) {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, getter.signature.returnType.toString()\n );\n return null;\n }\n target = classReference;\n break;\n }\n case ElementKind.CLASS: {\n let elementExpression = this.currentElementExpression;\n if (elementExpression) {\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET);\n if (!indexedGet) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n elementExpression.range, (target).internalName\n );\n return null;\n }\n let returnType = indexedGet.signature.returnType;\n if (!(target = returnType.classReference)) {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, returnType.toString()\n );\n return null;\n }\n }\n break;\n }\n }\n\n // Look up the member within\n switch (target.kind) {\n case ElementKind.CLASS_PROTOTYPE:\n case ElementKind.CLASS: {\n do {\n let members = target.members;\n let member: Element | null;\n if (members && (member = members.get(propertyName))) {\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = null;\n return member; // instance FIELD, static GLOBAL, FUNCTION_PROTOTYPE...\n }\n // traverse inherited static members on the base prototype if target is a class prototype\n if (target.kind == ElementKind.CLASS_PROTOTYPE) {\n if ((target).basePrototype) {\n target = (target).basePrototype;\n } else {\n break;\n }\n // traverse inherited instance members on the base class if target is a class instance\n } else if (target.kind == ElementKind.CLASS) {\n if ((target).base) {\n target = (target).base;\n } else {\n break;\n }\n } else {\n break;\n }\n } while (true);\n break;\n }\n default: { // enums or other namespace-like elements\n let members = target.members;\n if (members) {\n let member = members.get(propertyName);\n if (member) {\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = null;\n return member; // static ENUMVALUE, static GLOBAL, static FUNCTION_PROTOTYPE...\n }\n }\n break;\n }\n }\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, target.internalName\n );\n return null;\n }\n\n resolveElementAccess(\n elementAccess: ElementAccessExpression,\n flow: Flow,\n contextualType: Type,\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, flow, contextualType, reportMode);\n if (!target) return null;\n switch (target.kind) {\n case ElementKind.GLOBAL: if (!this.ensureResolvedLazyGlobal(target, reportMode)) return null;\n case ElementKind.LOCAL:\n case ElementKind.FIELD: {\n let type = (target).type;\n if (target = type.classReference) {\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = elementAccess.elementExpression;\n return target;\n }\n break;\n }\n case ElementKind.CLASS: {\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET);\n if (!indexedGet) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n elementAccess.range, (target).internalName\n );\n }\n return null;\n }\n if (targetExpression.kind == NodeKind.ELEMENTACCESS) { // nested element access\n let returnType = indexedGet.signature.returnType;\n if (target = returnType.classReference) {\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = elementAccess.elementExpression;\n return target;\n }\n return null;\n }\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = elementAccess.elementExpression;\n return target;\n }\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n targetExpression.range\n );\n }\n return null;\n }\n\n determineIntegerLiteralType(\n intValue: I64,\n contextualType: Type\n ): Type {\n\n if (!contextualType.is(TypeFlags.REFERENCE)) {\n // compile to contextualType if matching\n switch (contextualType.kind) {\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return Type.i8;\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return Type.u8;\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return Type.i16;\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return Type.u16;\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return Type.i32;\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return Type.u32;\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return Type.bool;\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.program.options.isWasm64) {\n if (i64_is_i32(intValue)) return Type.isize32;\n break;\n }\n return Type.isize64;\n }\n case TypeKind.USIZE: {\n if (!this.program.options.isWasm64) {\n if (i64_is_u32(intValue)) return Type.usize32;\n break;\n }\n return Type.usize64;\n }\n case TypeKind.I64: return Type.i64;\n case TypeKind.U64: return Type.u64;\n case TypeKind.F32: return Type.f32;\n case TypeKind.F64: return Type.f64;\n case TypeKind.VOID: break; // best fitting below\n default: assert(false);\n }\n }\n\n // otherwise compile to best fitting native type\n if (i64_is_i32(intValue)) return Type.i32;\n if (i64_is_u32(intValue)) return Type.u32;\n return Type.i64;\n }\n\n resolveExpression(\n expression: Expression,\n flow: Flow,\n contextualType: Type = Type.void,\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n while (expression.kind == NodeKind.PARENTHESIZED) {\n expression = (expression).expression;\n }\n switch (expression.kind) {\n case NodeKind.ASSERTION: {\n if ((expression).assertionKind == AssertionKind.NONNULL) {\n return this.resolveExpression(\n (expression).expression,\n flow,\n contextualType,\n reportMode\n );\n }\n let type = this.resolveType(\n assert((expression).toType),\n flow.contextualTypeArguments,\n reportMode\n );\n if (!type) return null;\n let element: Element | null = type.classReference;\n if (!element) {\n let signature = type.signatureReference;\n if (!signature) return null;\n element = signature.asFunctionTarget(this.program);\n }\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element;\n }\n case NodeKind.UNARYPREFIX: {\n // TODO: overloads\n switch ((expression).operator) {\n case Token.MINUS: {\n let operand = (expression).operand;\n // implicitly negate if an integer literal to distinguish between i32/u32/i64\n if (operand.kind == NodeKind.LITERAL && (operand).literalKind == LiteralKind.INTEGER) {\n let type = this.determineIntegerLiteralType(\n i64_sub(i64_zero, (operand).value),\n contextualType\n );\n return assert(this.program.basicClasses.get(type.kind));\n }\n return this.resolveExpression(\n operand,\n flow,\n contextualType,\n reportMode\n );\n }\n case Token.PLUS:\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS: {\n return this.resolveExpression(\n (expression).operand,\n flow,\n contextualType,\n reportMode\n );\n }\n case Token.EXCLAMATION: {\n return assert(this.program.basicClasses.get(TypeKind.BOOL));\n }\n case Token.TILDE: {\n let resolvedOperand = this.resolveExpression(\n (expression).operand,\n flow,\n contextualType,\n reportMode\n );\n if (!resolvedOperand) return null;\n throw new Error(\"not implemented\"); // TODO: should all elements have a corresponding type right away?\n }\n default: assert(false);\n }\n return null;\n }\n case NodeKind.UNARYPOSTFIX: {\n // TODO: overloads\n switch ((expression).operator) {\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS: {\n return this.resolveExpression(\n (expression).operand,\n flow,\n contextualType,\n reportMode\n );\n }\n default: assert(false);\n }\n return null;\n }\n case NodeKind.BINARY: {\n // TODO: all sorts of unary and binary expressions, which means looking up overloads and\n // evaluating their return types, knowing the semantics of different operators etc.\n // should probably share that code with the compiler somehow, as it also does exactly this.\n throw new Error(\"not implemented\");\n }\n case NodeKind.THIS: { // -> Class / ClassPrototype\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\n let explicitLocal = flow.lookupLocal(\"this\");\n if (explicitLocal) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return explicitLocal;\n }\n }\n let parent = flow.parentFunction.parent;\n if (parent) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return parent;\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\n expression.range\n );\n }\n return null;\n }\n case NodeKind.SUPER: { // -> Class\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\n let explicitLocal = flow.lookupLocal(\"super\");\n if (explicitLocal) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return explicitLocal;\n }\n }\n let parent = flow.actualFunction.parent;\n if (parent && parent.kind == ElementKind.CLASS && (parent = (parent).base)) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return parent;\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\n expression.range\n );\n }\n return null;\n }\n case NodeKind.IDENTIFIER: {\n return this.resolveIdentifier(expression, flow, flow.actualFunction, reportMode);\n }\n case NodeKind.LITERAL: {\n switch ((expression).literalKind) {\n case LiteralKind.INTEGER: {\n return assert(\n this.program.basicClasses.get(\n this.determineIntegerLiteralType(\n (expression).value,\n contextualType\n ).kind\n )\n );\n }\n case LiteralKind.FLOAT: {\n this.currentThisExpression = expression;\n this.currentElementExpression = null;\n return assert(\n this.program.basicClasses.get(\n contextualType == Type.f32\n ? TypeKind.F32\n : TypeKind.F64\n )\n );\n }\n case LiteralKind.STRING: {\n this.currentThisExpression = expression;\n this.currentElementExpression = null;\n return this.program.stringInstance;\n }\n // case LiteralKind.ARRAY: // TODO\n }\n break;\n }\n case NodeKind.PROPERTYACCESS: {\n return this.resolvePropertyAccess(\n expression,\n flow,\n contextualType,\n reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccess(\n expression,\n flow,\n contextualType,\n reportMode\n );\n }\n case NodeKind.CALL: {\n let targetExpression = (expression).expression;\n let target = this.resolveExpression(targetExpression, flow, contextualType, reportMode);\n if (!target) return null;\n if (target.kind == ElementKind.FUNCTION_PROTOTYPE) {\n let instance = this.resolveFunctionInclTypeArguments(\n target,\n (expression).typeArguments,\n makeMap(flow.contextualTypeArguments),\n expression,\n reportMode\n );\n if (!instance) return null;\n let returnType = instance.signature.returnType;\n let classType = returnType.classReference;\n if (classType) {\n // reuse resolvedThisExpression (might be property access)\n // reuse resolvedElementExpression (might be element access)\n return classType;\n } else {\n let signature = returnType.signatureReference;\n if (signature) {\n let functionTarget = signature.asFunctionTarget(this.program);\n // reuse resolvedThisExpression (might be property access)\n // reuse resolvedElementExpression (might be element access)\n return functionTarget;\n }\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n targetExpression.range, target.internalName\n );\n }\n return null;\n }\n break;\n }\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n }\n return null;\n }\n\n /** Resolves a function prototype to an instance using the specified concrete type arguments. */\n resolveFunction(\n prototype: FunctionPrototype,\n typeArguments: Type[] | null,\n contextualTypeArguments: Map = makeMap(),\n reportMode: ReportMode = ReportMode.REPORT\n ): Function | null {\n var classTypeArguments = prototype.classTypeArguments; // set only if partially resolved\n var classInstanceKey = classTypeArguments ? typesToString(classTypeArguments) : \"\";\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\n var classInstances = prototype.instances.get(classInstanceKey);\n if (classInstances) {\n let instance = classInstances.get(instanceKey);\n if (instance) return instance;\n }\n\n var declaration = prototype.declaration;\n var isInstance = prototype.is(CommonFlags.INSTANCE);\n var classPrototype = prototype.classPrototype;\n\n // apply class type arguments if a partially resolved instance method\n if (classTypeArguments) prototype.applyClassTypeArguments(contextualTypeArguments);\n\n // override with function specific type arguments\n var signatureNode = declaration.signature;\n var functionTypeParameters = declaration.typeParameters;\n var numFunctionTypeArguments: i32;\n if (typeArguments && (numFunctionTypeArguments = typeArguments.length)) {\n assert(functionTypeParameters && numFunctionTypeArguments == functionTypeParameters.length);\n for (let i = 0; i < numFunctionTypeArguments; ++i) {\n contextualTypeArguments.set(\n (functionTypeParameters)[i].name.text,\n typeArguments[i]\n );\n }\n } else {\n assert(!functionTypeParameters || functionTypeParameters.length == 0);\n }\n\n // resolve class if an instance method\n var classInstance: Class | null = null;\n var thisType: Type | null = null;\n if (isInstance) {\n classInstance = this.resolveClass(\n assert(classPrototype),\n classTypeArguments,\n contextualTypeArguments,\n reportMode\n );\n if (!classInstance) return null;\n let explicitThisType = signatureNode.explicitThisType;\n if (explicitThisType) {\n thisType = this.resolveType(explicitThisType, contextualTypeArguments, reportMode);\n if (!thisType) return null;\n } else {\n thisType = classInstance.type;\n }\n contextualTypeArguments.set(\"this\", thisType);\n } else {\n if (signatureNode.explicitThisType) {\n this.error(\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\n signatureNode.explicitThisType.range\n ); // recoverable\n }\n }\n\n // resolve signature node\n var signatureParameters = signatureNode.parameters;\n var signatureParameterCount = signatureParameters.length;\n var parameterTypes = new Array(signatureParameterCount);\n var parameterNames = new Array(signatureParameterCount);\n var requiredParameters = 0;\n for (let i = 0; i < signatureParameterCount; ++i) {\n let parameterDeclaration = signatureParameters[i];\n if (parameterDeclaration.parameterKind == ParameterKind.DEFAULT) {\n requiredParameters = i + 1;\n }\n let typeNode = assert(parameterDeclaration.type);\n let parameterType = this.resolveType(typeNode, contextualTypeArguments, reportMode);\n if (!parameterType) return null;\n parameterTypes[i] = parameterType;\n parameterNames[i] = parameterDeclaration.name.text;\n }\n\n var returnType: Type;\n if (prototype.is(CommonFlags.SET)) {\n returnType = Type.void; // not annotated\n } else if (prototype.is(CommonFlags.CONSTRUCTOR)) {\n returnType = assert(classInstance).type; // not annotated\n } else {\n let typeNode = assert(signatureNode.returnType);\n let type = this.resolveType(typeNode, contextualTypeArguments, reportMode);\n if (!type) return null;\n returnType = type;\n }\n\n var signature = new Signature(parameterTypes, returnType, thisType);\n signature.parameterNames = parameterNames;\n signature.requiredParameters = requiredParameters;\n\n var internalName = prototype.internalName;\n if (instanceKey.length) internalName += \"<\" + instanceKey + \">\";\n var instance = new Function(\n prototype,\n internalName,\n signature,\n classInstance\n ? classInstance\n : classPrototype,\n contextualTypeArguments\n );\n if (!classInstances) prototype.instances.set(classInstanceKey, classInstances = new Map());\n classInstances.set(instanceKey, instance);\n this.program.instancesLookup.set(internalName, instance);\n return instance;\n }\n\n /** Resolves a function prototype partially by applying the specified type arguments. */\n resolveFunctionPartially(\n prototype: FunctionPrototype,\n typeArguments: Type[] | null,\n reportMode: ReportMode = ReportMode.REPORT\n ): FunctionPrototype | null {\n assert(prototype.is(CommonFlags.INSTANCE));\n var classPrototype = assert(prototype.classPrototype);\n\n if (!(typeArguments && typeArguments.length)) return prototype; // no need to clone\n\n var simpleName = prototype.simpleName;\n var partialKey = typesToString(typeArguments);\n var partialPrototype = new FunctionPrototype(\n this.program,\n simpleName,\n classPrototype.internalName + \"<\" + partialKey + \">\" + INSTANCE_DELIMITER + simpleName,\n prototype.declaration,\n classPrototype,\n prototype.decoratorFlags\n );\n partialPrototype.flags = prototype.flags;\n partialPrototype.operatorKind = prototype.operatorKind;\n partialPrototype.classTypeArguments = typeArguments;\n partialPrototype.instances = prototype.instances;\n return partialPrototype;\n }\n\n /** Resolves a function prototype to an instance by first resolving the specified type arguments. */\n resolveFunctionInclTypeArguments(\n prototype: FunctionPrototype,\n typeArgumentNodes: CommonTypeNode[] | null,\n contextualTypeArguments: Map,\n reportNode: Node,\n reportMode: ReportMode = ReportMode.REPORT\n ): Function | null {\n var resolvedTypeArguments: Type[] | null = null;\n\n // Resolve type arguments if generic\n if (prototype.is(CommonFlags.GENERIC)) {\n\n // apply class type arguments if a partially resolved instance method\n // FIXME: this is done once more in resolveFunction. required here for resolveTypeArguments,\n // required there for just resolving a function no matter if a partial or not.\n let classTypeArguments = prototype.classTypeArguments;\n if (classTypeArguments) prototype.applyClassTypeArguments(contextualTypeArguments);\n\n resolvedTypeArguments = this.resolveTypeArguments( // reports\n assert(prototype.declaration.typeParameters),\n typeArgumentNodes,\n contextualTypeArguments,\n reportNode,\n reportMode\n );\n if (!resolvedTypeArguments) return null;\n\n // Otherwise make sure that no type arguments have been specified\n } else {\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return null;\n }\n }\n\n // Continue with concrete types\n return this.resolveFunction(\n prototype,\n resolvedTypeArguments,\n contextualTypeArguments,\n reportMode\n );\n }\n\n /** Resolves a class prototype using the specified concrete type arguments. */\n resolveClass(\n prototype: ClassPrototype,\n typeArguments: Type[] | null,\n contextualTypeArguments: Map = makeMap(),\n reportMode: ReportMode = ReportMode.REPORT\n ): Class | null {\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\n\n // Check if this exact instance has already been resolved\n var instance = prototype.instances.get(instanceKey);\n if (instance) return instance;\n\n // Insert contextual type arguments for this operation. Internally, this method is always\n // called with matching type parameter / argument counts.\n var declaration = prototype.declaration;\n if (typeArguments) {\n let typeParameters = declaration.typeParameters;\n let expectedTypeArguments = typeParameters.length;\n let actualTypeArguments = typeArguments.length;\n assert(actualTypeArguments == expectedTypeArguments);\n for (let i = 0; i < actualTypeArguments; ++i) {\n contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\n }\n } else {\n assert(declaration.typeParameters.length == 0);\n }\n\n // Resolve base class if applicable\n var baseClass: Class | null = null;\n if (declaration.extendsType) {\n let baseClassType = this.resolveType(\n declaration.extendsType,\n contextualTypeArguments,\n reportMode\n );\n if (!baseClassType) return null;\n if (!(baseClass = baseClassType.classReference)) {\n if (reportMode == ReportMode.REPORT) {\n this.program.error(\n DiagnosticCode.A_class_may_only_extend_another_class,\n declaration.extendsType.range\n );\n }\n return null;\n }\n if (baseClass.hasDecorator(DecoratorFlags.SEALED)) {\n if (reportMode == ReportMode.REPORT) {\n this.program.error(\n DiagnosticCode.Class_0_is_sealed_and_cannot_be_extended,\n declaration.extendsType.range, baseClass.internalName\n );\n }\n return null;\n }\n if (baseClass.hasDecorator(DecoratorFlags.UNMANAGED) != prototype.hasDecorator(DecoratorFlags.UNMANAGED)) {\n if (reportMode == ReportMode.REPORT) {\n this.program.error(\n DiagnosticCode.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa,\n Range.join(declaration.name.range, declaration.extendsType.range)\n );\n }\n return null;\n }\n }\n\n // Construct the instance and remember that it has been resolved already\n var simpleName = prototype.simpleName;\n var internalName = prototype.internalName;\n if (instanceKey.length) {\n simpleName += \"<\" + instanceKey + \">\";\n internalName += \"<\" + instanceKey + \">\";\n }\n instance = new Class(prototype, simpleName, internalName, typeArguments, baseClass);\n instance.contextualTypeArguments = contextualTypeArguments;\n prototype.instances.set(instanceKey, instance);\n this.program.instancesLookup.set(internalName, instance);\n\n // Inherit base class members and set up the initial memory offset for own fields\n var memoryOffset: u32 = 0;\n if (baseClass) {\n if (baseClass.members) {\n if (!instance.members) instance.members = new Map();\n for (let inheritedMember of baseClass.members.values()) {\n instance.members.set(inheritedMember.simpleName, inheritedMember);\n }\n }\n memoryOffset = baseClass.currentMemoryOffset;\n }\n\n // Resolve constructor by first applying the class type arguments\n var constructorPrototype = prototype.constructorPrototype;\n if (constructorPrototype) {\n let constructorPartial = this.resolveFunctionPartially(\n constructorPrototype,\n typeArguments,\n reportMode\n );\n if (!constructorPartial) return null;\n instance.constructorInstance = this.resolveFunction(\n constructorPartial,\n null,\n makeMap(),\n reportMode\n );\n }\n\n // Resolve instance members\n if (prototype.instanceMembers) {\n for (let member of prototype.instanceMembers.values()) {\n switch (member.kind) {\n\n // Lay out fields in advance\n case ElementKind.FIELD_PROTOTYPE: {\n let fieldDeclaration = (member).declaration;\n if (!instance.members) instance.members = new Map();\n else if (instance.members.has(member.simpleName)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n fieldDeclaration.name.range,\n member.simpleName\n );\n break;\n }\n let fieldType: Type | null = null;\n // TODO: handle duplicate non-private fields\n if (!fieldDeclaration.type) {\n if (baseClass !== null && baseClass.members !== null) {\n let baseField = baseClass.members.get((member).simpleName);\n if (baseField && !baseField.is(CommonFlags.PRIVATE)) {\n assert(baseField.kind == ElementKind.FIELD);\n fieldType = (baseField).type;\n }\n }\n if (!fieldType) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_expected,\n fieldDeclaration.name.range.atEnd\n );\n }\n }\n } else {\n fieldType = this.resolveType(\n fieldDeclaration.type,\n instance.contextualTypeArguments,\n reportMode\n );\n }\n if (!fieldType) break;\n let fieldInstance = new Field(\n member,\n internalName + INSTANCE_DELIMITER + (member).simpleName,\n fieldType,\n fieldDeclaration,\n instance\n );\n switch (fieldType.byteSize) { // align\n case 1: break;\n case 2: { if (memoryOffset & 1) ++memoryOffset; break; }\n case 4: { if (memoryOffset & 3) memoryOffset = (memoryOffset | 3) + 1; break; }\n case 8: { if (memoryOffset & 7) memoryOffset = (memoryOffset | 7) + 1; break; }\n default: assert(false);\n }\n fieldInstance.memoryOffset = memoryOffset;\n memoryOffset += fieldType.byteSize;\n instance.members.set(member.simpleName, fieldInstance);\n break;\n }\n\n // Partially resolve methods as these might have type arguments on their own\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (!instance.members) instance.members = new Map();\n let partialPrototype = this.resolveFunctionPartially(\n member,\n typeArguments,\n reportMode\n );\n if (!partialPrototype) return null;\n partialPrototype.internalName = internalName + INSTANCE_DELIMITER + partialPrototype.simpleName;\n instance.members.set(member.simpleName, partialPrototype);\n break;\n }\n\n // Clone properties and partially resolve the wrapped accessors for consistence with other methods\n case ElementKind.PROPERTY: {\n if (!instance.members) instance.members = new Map();\n let getterPrototype = assert((member).getterPrototype); // must be present\n let setterPrototype = (member).setterPrototype; // might be present\n let instanceProperty = new Property(\n this.program,\n member.simpleName,\n internalName + INSTANCE_DELIMITER + member.simpleName,\n prototype\n );\n let partialGetterPrototype = this.resolveFunctionPartially(\n getterPrototype,\n typeArguments,\n reportMode\n );\n if (!partialGetterPrototype) return null;\n partialGetterPrototype\n .internalName = internalName + INSTANCE_DELIMITER + partialGetterPrototype.simpleName;\n instanceProperty.getterPrototype = partialGetterPrototype;\n if (setterPrototype) {\n let partialSetterPrototype = this.resolveFunctionPartially(\n setterPrototype,\n typeArguments,\n reportMode\n );\n if (!partialSetterPrototype) return null;\n partialSetterPrototype\n .internalName = internalName + INSTANCE_DELIMITER + partialSetterPrototype.simpleName;\n instanceProperty.setterPrototype = partialSetterPrototype;\n }\n instance.members.set(member.simpleName, instanceProperty);\n break;\n }\n default: assert(false);\n }\n }\n }\n\n // Finalize memory offset\n instance.currentMemoryOffset = memoryOffset;\n\n // Fully resolve operator overloads (don't have type parameters on their own)\n for (let [kind, overloadPrototype] of prototype.overloadPrototypes) {\n assert(kind != OperatorKind.INVALID);\n let operatorInstance: Function | null;\n if (overloadPrototype.is(CommonFlags.INSTANCE)) {\n let operatorPartial = this.resolveFunctionPartially(\n overloadPrototype,\n typeArguments,\n reportMode\n );\n if (!operatorPartial) continue;\n operatorInstance = this.resolveFunction(\n operatorPartial,\n null,\n makeMap(),\n reportMode\n );\n } else {\n operatorInstance = this.resolveFunction(\n overloadPrototype,\n null,\n makeMap(),\n reportMode\n );\n }\n if (!operatorInstance) continue;\n let overloads = instance.overloads;\n if (!overloads) instance.overloads = overloads = new Map();\n overloads.set(kind, operatorInstance);\n }\n return instance;\n }\n\n /** Resolves a class prototype by first resolving the specified type arguments. */\n resolveClassInclTypeArguments(\n prototype: ClassPrototype,\n typeArgumentNodes: CommonTypeNode[] | null,\n contextualTypeArguments: Map,\n reportNode: Node,\n reportMode: ReportMode = ReportMode.REPORT\n ): Class | null {\n var resolvedTypeArguments: Type[] | null = null;\n\n // Resolve type arguments if generic\n if (prototype.is(CommonFlags.GENERIC)) {\n resolvedTypeArguments = this.resolveTypeArguments(\n assert(prototype.declaration.typeParameters),\n typeArgumentNodes,\n contextualTypeArguments,\n reportNode,\n reportMode\n );\n if (!resolvedTypeArguments) return null;\n\n // Otherwise make sure that no type arguments have been specified\n } else {\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return null;\n }\n }\n\n // Continue with concrete types\n return this.resolveClass(\n prototype,\n resolvedTypeArguments,\n contextualTypeArguments,\n reportMode\n );\n }\n}\n","/**\n * A decompiler that generates low-level AssemblyScript from WebAssembly binaries.\n * @module decompiler\n *//***/\n\nimport {\n Module,\n NativeType,\n ExpressionId,\n UnaryOp,\n BinaryOp,\n HostOp,\n FunctionRef,\n ExpressionRef,\n Index,\n getFunctionName,\n getFunctionBody,\n getFunctionParamCount,\n getFunctionParamType,\n getFunctionResultType,\n getExpressionId,\n getExpressionType,\n getBlockName,\n getBlockChildCount,\n getBlockChild,\n getIfCondition,\n getIfTrue,\n getIfFalse,\n getLoopName,\n getLoopBody,\n getBreakName,\n getBreakCondition,\n getGetLocalIndex,\n getSetLocalIndex,\n getSetLocalValue,\n getLoadOffset,\n getLoadPtr,\n getStoreOffset,\n getStorePtr,\n getStoreValue,\n getConstValueI32,\n getConstValueI64Low,\n getConstValueI64High,\n getConstValueF32,\n getConstValueF64,\n getUnaryOp,\n getUnaryValue,\n getBinaryOp,\n getBinaryLeft,\n getBinaryRight,\n getSelectThen,\n getSelectElse,\n getSelectCondition,\n getDropValue,\n getReturnValue,\n getHostOp,\n getHostOperand\n} from \"./module\";\n\n// TODO :-)\n\nexport class Decompiler {\n\n static decompile(module: Module): string {\n var decompiler = new Decompiler();\n decompiler.decompile(module);\n return decompiler.finish();\n }\n\n text: string[] = [];\n functionId: i32 = 0;\n\n constructor() { }\n\n /** Decompiles a module to an AST that can then be serialized. */\n decompile(module: Module): void {\n throw new Error(\"not implemented\");\n }\n\n decompileFunction(func: FunctionRef): void {\n var name = getFunctionName(func) || \"$\" + this.functionId.toString(10);\n var body = getFunctionBody(func);\n this.push(\"function \");\n this.push(name);\n this.push(\"(\");\n for (let i: Index = 0, k: Index = getFunctionParamCount(func); i < k; ++i) {\n if (i > 0) this.push(\", \");\n this.push(\"$\");\n this.push(i.toString(10));\n this.push(\": \");\n this.push(nativeTypeToType(getFunctionParamType(func, i)));\n }\n this.push(\"): \");\n this.push(nativeTypeToType(getFunctionResultType(func)));\n this.push(\" \");\n if (getExpressionId(body) != ExpressionId.Block) {\n this.push(\"{\\n\");\n }\n this.decompileExpression(body);\n if (getExpressionId(body) != ExpressionId.Block) {\n this.push(\"\\n}\\n\");\n }\n ++this.functionId;\n }\n\n decompileExpression(expr: ExpressionRef): void {\n var id = getExpressionId(expr);\n var type = getExpressionType(expr);\n\n var nested: ExpressionRef;\n var string: string | null;\n var i: Index, k: Index;\n\n switch (id) {\n case ExpressionId.Block: { // TODO: magic\n if ((string = getBlockName(expr)) != null) {\n this.push(string);\n this.push(\": \");\n }\n this.push(\"{\\n\");\n k = getBlockChildCount(expr);\n for (i = 0; i < k; ++i) {\n this.decompileExpression(getBlockChild(expr, i));\n }\n this.push(\"}\\n\");\n return;\n }\n case ExpressionId.If: {\n if (type == NativeType.None) {\n this.push(\"if (\");\n this.decompileExpression(getIfCondition(expr));\n this.push(\") \");\n this.decompileExpression(getIfTrue(expr));\n if (nested = getIfFalse(expr)) {\n this.push(\" else \");\n this.decompileExpression(nested);\n }\n } else {\n this.decompileExpression(getIfCondition(expr));\n this.push(\" ? \");\n this.decompileExpression(getIfTrue(expr));\n this.push(\" : \");\n this.decompileExpression(getIfFalse(expr));\n }\n return;\n }\n case ExpressionId.Loop: {\n if ((string = getLoopName(expr)) != null) {\n this.push(string);\n this.push(\": \");\n }\n this.push(\"do \");\n this.decompileExpression(getLoopBody(expr));\n this.push(\"while (0);\\n\");\n }\n case ExpressionId.Break: {\n if (nested = getBreakCondition(expr)) {\n this.push(\"if (\");\n this.decompileExpression(nested);\n this.push(\") \");\n }\n if ((string = getBreakName(expr)) != null) {\n this.push(\"break \");\n this.push(string);\n this.push(\";\\n\");\n } else {\n this.push(\"break;\\n\");\n }\n return;\n }\n case ExpressionId.Switch:\n case ExpressionId.Call:\n case ExpressionId.CallIndirect: {\n throw new Error(\"not implemented\");\n }\n case ExpressionId.GetLocal: {\n this.push(\"$\");\n this.push(getGetLocalIndex(expr).toString(10));\n return;\n }\n case ExpressionId.SetLocal: {\n this.push(\"$\");\n this.push(getSetLocalIndex(expr).toString(10));\n this.push(\" = \");\n this.decompileExpression(getSetLocalValue(expr));\n return;\n }\n case ExpressionId.GetGlobal:\n case ExpressionId.SetGlobal: {\n throw new Error(\"not implemented\");\n }\n case ExpressionId.Load: {\n this.push(\"load<\");\n this.push(nativeTypeToType(type));\n this.push(\">(\");\n this.push(getLoadOffset(expr).toString(10));\n this.push(\" + \");\n this.decompileExpression(getLoadPtr(expr));\n this.push(\")\");\n return;\n }\n case ExpressionId.Store: {\n this.push(\"store<\");\n this.push(nativeTypeToType(type));\n this.push(\">(\");\n this.push(getStoreOffset(expr).toString(10));\n this.push(\" + \");\n this.decompileExpression(getStorePtr(expr));\n this.push(\", \");\n this.decompileExpression(getStoreValue(expr));\n this.push(\")\");\n return;\n }\n case ExpressionId.Const: {\n switch (type) {\n case NativeType.I32: {\n this.push(getConstValueI32(expr).toString(10));\n return;\n }\n case NativeType.I64: {\n this.push(\n i64_to_string(\n i64_new(\n getConstValueI64Low(expr),\n getConstValueI64High(expr)\n )\n )\n );\n return;\n }\n case NativeType.F32: {\n this.push(getConstValueF32(expr).toString(10));\n return;\n }\n case NativeType.F64: {\n this.push(getConstValueF64(expr).toString(10));\n return;\n }\n }\n break;\n }\n case ExpressionId.Unary: {\n switch (getUnaryOp(expr)) {\n case UnaryOp.ClzI32: {\n this.push(\"clz(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.CtzI32: {\n this.push(\"ctz(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.PopcntI32: {\n this.push(\"popcnt(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.NegF32:\n case UnaryOp.NegF64: {\n this.push(\"-\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.AbsF32: {\n this.push(\"abs(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.CeilF32: {\n this.push(\"ceil(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.FloorF32: {\n this.push(\"floor(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.TruncF32: {\n this.push(\"trunc(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.NearestF32: {\n this.push(\"nearest(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.SqrtF32: {\n this.push(\"sqrt(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.EqzI32:\n case UnaryOp.EqzI64: {\n this.push(\"!\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ClzI64: {\n this.push(\"clz(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.CtzI64: {\n this.push(\"ctz(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.PopcntI64: {\n this.push(\"popcnt(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.AbsF64: {\n this.push(\"abs(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.CeilF64: {\n this.push(\"ceil(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.FloorF64: {\n this.push(\"floor(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.TruncF64: {\n this.push(\"trunc(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.NearestF64: {\n this.push(\"nearest(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.SqrtF64: {\n this.push(\"sqrt(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.ExtendI32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ExtendU32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.WrapI64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF32ToI32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF32ToI64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF32ToU32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF32ToU64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF64ToI32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF64ToI64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF64ToU32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF64ToU64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ReinterpretF32: {\n this.push(\"reinterpret(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.ReinterpretF64: {\n this.push(\"reinterpret(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.ConvertI32ToF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertI32ToF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertU32ToF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertU32ToF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertI64ToF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertI64ToF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertU64ToF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertU64ToF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.PromoteF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.DemoteF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ReinterpretI32: {\n this.push(\"reinterpret(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.ReinterpretI64: {\n this.push(\"reinterpret(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n }\n break;\n }\n case ExpressionId.Binary: { // TODO: precedence\n switch (getBinaryOp(expr)) {\n case BinaryOp.AddI32:\n case BinaryOp.AddI64:\n case BinaryOp.AddF32:\n case BinaryOp.AddF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" + \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.SubI32:\n case BinaryOp.SubI64:\n case BinaryOp.SubF32:\n case BinaryOp.SubF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" - \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.MulI32:\n case BinaryOp.MulI64:\n case BinaryOp.MulF32:\n case BinaryOp.MulF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" * \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.DivI32:\n case BinaryOp.DivI64:\n case BinaryOp.DivF32:\n case BinaryOp.DivF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" / \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.DivU32: {\n this.push(\"(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" / \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.RemI32:\n case BinaryOp.RemI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" % \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.RemU32: {\n this.push(\"(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" / \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.AndI32:\n case BinaryOp.AndI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" & \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.OrI32:\n case BinaryOp.OrI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" | \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.XorI32:\n case BinaryOp.XorI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" ^ \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.ShlI32:\n case BinaryOp.ShlI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" << \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.ShrU32:\n case BinaryOp.ShrU64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >>> \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.ShrI32:\n case BinaryOp.ShrI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >> \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.RotlI32: {\n this.push(\"rotl(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.RotrI32: {\n this.push(\"rotr(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.EqI32:\n case BinaryOp.EqI64:\n case BinaryOp.EqF32:\n case BinaryOp.EqF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" == \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.NeI32:\n case BinaryOp.NeI64:\n case BinaryOp.NeF32:\n case BinaryOp.NeF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" != \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LtI32:\n case BinaryOp.LtI64:\n case BinaryOp.LtF32:\n case BinaryOp.LtF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" < \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LtU32: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" < \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LeI32:\n case BinaryOp.LeI64:\n case BinaryOp.LeF32:\n case BinaryOp.LeF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" <= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LeU32: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" <= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GtI32:\n case BinaryOp.GtI64:\n case BinaryOp.GtF32:\n case BinaryOp.GtF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" > \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GtU32: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" > \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GeI32:\n case BinaryOp.GeI64:\n case BinaryOp.GeF32:\n case BinaryOp.GeF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GeU32: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.DivU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" / \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.RemU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" % \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.RotlI64: {\n this.push(\"rotl(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.RotrI64: {\n this.push(\"rotr(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.LtU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" < \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LeU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" <= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GtU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" > \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GeU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.CopysignF32: {\n this.push(\"copysign(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.MinF32: {\n this.push(\"min(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.MaxF32: {\n this.push(\"max(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.CopysignF64: {\n this.push(\"copysign(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.MinF64: {\n this.push(\"min(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.MaxF64: {\n this.push(\"max(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n }\n return;\n }\n case ExpressionId.Select: {\n this.push(\"select<\");\n this.push(nativeTypeToType(type));\n this.push(\">(\");\n this.decompileExpression(getSelectThen(expr));\n this.push(\", \");\n this.decompileExpression(getSelectElse(expr));\n this.push(\", \");\n this.decompileExpression(getSelectCondition(expr));\n this.push(\")\");\n return;\n }\n case ExpressionId.Drop: {\n this.decompileExpression(getDropValue(expr));\n this.push(\";\\n\");\n return;\n }\n case ExpressionId.Return: {\n if (nested = getReturnValue(expr)) {\n this.push(\"return \");\n this.decompileExpression(nested);\n this.push(\";\\n\");\n } else {\n this.push(\"return;\\n\");\n }\n return;\n }\n case ExpressionId.Host: {\n switch (getHostOp(expr)) {\n case HostOp.CurrentMemory: {\n this.push(\"memory.size()\");\n return;\n }\n case HostOp.GrowMemory: {\n this.push(\"memory.grow(\");\n this.decompileExpression(getHostOperand(expr, 0));\n this.push(\")\");\n return;\n }\n }\n break;\n }\n case ExpressionId.Nop: {\n this.push(\";\\n\");\n return;\n }\n case ExpressionId.Unreachable: {\n this.push(\"unreachable()\");\n return;\n }\n case ExpressionId.AtomicCmpxchg:\n case ExpressionId.AtomicRMW:\n case ExpressionId.AtomicWait:\n case ExpressionId.AtomicWake:\n }\n throw new Error(\"not implemented\");\n }\n\n private push(text: string): void {\n // mostly here so we can add debugging if necessary\n this.text.push(text);\n }\n\n finish(): string {\n var ret = this.text.join(\"\");\n this.text = [];\n return ret;\n }\n}\n\nfunction nativeTypeToType(type: NativeType): string {\n switch (type) {\n case NativeType.None: return \"void\";\n case NativeType.I32: return \"i32\";\n case NativeType.I64: return \"i64\";\n case NativeType.F32: return \"f32\";\n case NativeType.F64: return \"f64\";\n case NativeType.V128: return \"v128\";\n case NativeType.Unreachable: throw new Error(\"unreachable type\");\n case NativeType.Auto: throw new Error(\"auto type\");\n default: throw new Error(\"unexpected type\");\n }\n}\n","/**\n * Definition builders for WebIDL and TypeScript.\n * @module definitions\n *//***/\n\nimport {\n CommonFlags\n} from \"./common\";\n\nimport {\n Program,\n Element,\n ElementKind,\n Global,\n Enum,\n EnumValue,\n Field,\n Function,\n FunctionPrototype,\n Class,\n ClassPrototype,\n Namespace,\n ConstantValueKind,\n Interface,\n Property\n} from \"./program\";\n\nimport {\n Type,\n TypeKind,\n TypeFlags\n} from \"./types\";\n\nimport {\n indent\n} from \"./util\";\n\n/** Walker base class. */\nabstract class ExportsWalker {\n\n /** Program reference. */\n program: Program;\n /** Whether to include private members */\n includePrivate: bool;\n /** Elements still to do. */\n todo: Element[] = [];\n /** Already seen elements. */\n seen: Set = new Set();\n\n /** Constructs a new Element walker. */\n constructor(program: Program, includePrivate: bool = false) {\n this.program = program;\n this.includePrivate;\n }\n\n /** Walks all exports and calls the respective handlers. */\n walk(): void {\n for (let moduleExport of this.program.moduleLevelExports.values()) {\n // FIXME: doesn't honor the actual externally visible name\n this.visitElement(moduleExport.element);\n }\n var todo = this.todo;\n for (let i = 0; i < todo.length; ) this.visitElement(todo[i]);\n }\n\n /** Visits an element.*/\n visitElement(element: Element): void {\n if (element.is(CommonFlags.PRIVATE) && !this.includePrivate) return;\n if (this.seen.has(element)) return;\n this.seen.add(element);\n switch (element.kind) {\n case ElementKind.GLOBAL: {\n if (element.is(CommonFlags.COMPILED)) this.visitGlobal(element);\n break;\n }\n case ElementKind.ENUM: {\n if (element.is(CommonFlags.COMPILED)) this.visitEnum(element);\n break;\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n this.visitFunctionInstances(element);\n break;\n }\n case ElementKind.CLASS_PROTOTYPE: {\n this.visitClassInstances(element);\n break;\n }\n case ElementKind.FIELD: {\n if ((element).is(CommonFlags.COMPILED)) this.visitField(element);\n break;\n }\n case ElementKind.PROPERTY: {\n let prop = element;\n let getter = prop.getterPrototype;\n if (getter) this.visitFunctionInstances(getter);\n let setter = prop.setterPrototype;\n if (setter) this.visitFunctionInstances(setter);\n break;\n }\n case ElementKind.NAMESPACE: {\n if (hasCompiledMember(element)) this.visitNamespace(element);\n break;\n }\n default: assert(false);\n }\n }\n\n private visitFunctionInstances(element: FunctionPrototype): void {\n for (let instances of element.instances.values()) {\n for (let instance of instances.values()) {\n if (instance.is(CommonFlags.COMPILED)) this.visitFunction(instance);\n }\n }\n }\n\n private visitClassInstances(element: ClassPrototype): void {\n for (let instance of element.instances.values()) {\n if (instance.is(CommonFlags.COMPILED)) this.visitClass(instance);\n }\n }\n\n abstract visitGlobal(element: Global): void;\n abstract visitEnum(element: Enum): void;\n abstract visitFunction(element: Function): void;\n abstract visitClass(element: Class): void;\n abstract visitInterface(element: Interface): void;\n abstract visitField(element: Field): void;\n abstract visitNamespace(element: Element): void;\n}\n\n/** A WebIDL definitions builder. */\nexport class IDLBuilder extends ExportsWalker {\n\n /** Builds WebIDL definitions for the specified program. */\n static build(program: Program): string {\n return new IDLBuilder(program).build();\n }\n\n private sb: string[] = [];\n private indentLevel: i32 = 0;\n\n /** Constructs a new WebIDL builder. */\n constructor(program: Program, includePrivate: bool = false) {\n super(program, includePrivate);\n }\n\n visitGlobal(element: Global): void {\n var sb = this.sb;\n var isConst = element.is(CommonFlags.INLINED);\n indent(sb, this.indentLevel);\n if (isConst) sb.push(\"const \");\n sb.push(this.typeToString(element.type));\n sb.push(\" \");\n sb.push(element.simpleName);\n if (isConst) {\n switch (element.constantValueKind) {\n case ConstantValueKind.INTEGER: {\n sb.push(\" = \");\n sb.push(i64_to_string(element.constantIntegerValue));\n break;\n }\n case ConstantValueKind.FLOAT: {\n sb.push(\" = \");\n sb.push(element.constantFloatValue.toString());\n break;\n }\n default: assert(false);\n }\n }\n sb.push(\";\\n\");\n }\n\n visitEnum(element: Enum): void {\n var sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"interface \");\n sb.push(element.simpleName);\n sb.push(\" {\\n\");\n var members = element.members;\n if (members) {\n for (let [name, member] of members) {\n if (member.kind == ElementKind.ENUMVALUE) {\n let isConst = (member).is(CommonFlags.INLINED);\n indent(sb, this.indentLevel);\n if (isConst) sb.push(\"const \");\n else sb.push(\"readonly \");\n sb.push(\"unsigned long \");\n sb.push(name);\n if (isConst) {\n sb.push(\" = \");\n sb.push((member).constantValue.toString(10));\n }\n sb.push(\";\\n\");\n }\n }\n for (let member of members.values()) {\n if (member.kind != ElementKind.ENUMVALUE) this.visitElement(member);\n }\n }\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n visitFunction(element: Function): void {\n var sb = this.sb;\n var signature = element.signature;\n indent(sb, this.indentLevel);\n sb.push(this.typeToString(signature.returnType));\n sb.push(\" \");\n sb.push(element.simpleName);\n sb.push(\"(\");\n var parameters = signature.parameterTypes;\n var numParameters = parameters.length;\n // var requiredParameters = signature.requiredParameters;\n for (let i = 0; i < numParameters; ++i) {\n if (i) sb.push(\", \");\n // if (i >= requiredParameters) sb.push(\"optional \");\n sb.push(this.typeToString(parameters[i]));\n sb.push(\" \");\n sb.push(signature.getParameterName(i));\n }\n sb.push(\");\\n\");\n var members = element.members;\n if (members && members.size) {\n indent(sb, this.indentLevel);\n sb.push(\"interface \");\n sb.push(element.simpleName);\n sb.push(\" {\\n\");\n for (let member of members.values()) this.visitElement(member);\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n }\n\n visitClass(element: Class): void {\n var sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"interface \");\n sb.push(element.simpleName);\n sb.push(\" {\\n\");\n // TODO\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n visitInterface(element: Interface): void {\n this.visitClass(element);\n }\n\n visitField(element: Field): void {\n // TODO\n }\n\n visitNamespace(element: Namespace): void {\n var sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"interface \");\n sb.push(element.simpleName);\n sb.push(\" {\\n\");\n var members = element.members;\n if (members) {\n for (let member of members.values()) this.visitElement(member);\n }\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n typeToString(type: Type): string {\n switch (type.kind) {\n case TypeKind.I8: return \"byte\";\n case TypeKind.I16: return \"short\";\n case TypeKind.I32: return \"long\";\n case TypeKind.I64: return \"long long\";\n case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"long long\" : \"long\";\n case TypeKind.U8: return \"octet\";\n case TypeKind.U16: return \"unsigned short\";\n case TypeKind.U32: return \"unsigned long\";\n // ^ TODO: function types\n case TypeKind.U64: return \"unsigned long long\";\n case TypeKind.USIZE: return this.program.options.isWasm64 ? \"unsigned long long\" : \"unsigned long\";\n // ^ TODO: class types\n case TypeKind.BOOL: return \"boolean\";\n case TypeKind.F32: return \"unrestricted float\";\n case TypeKind.F64: return \"unrestricted double\";\n case TypeKind.VOID: return \"void\";\n default: {\n assert(false);\n return \"\";\n }\n }\n }\n\n build(): string {\n var sb = this.sb;\n sb.push(\"interface ASModule {\\n\");\n ++this.indentLevel;\n this.walk();\n --this.indentLevel;\n sb.push(\"}\\n\");\n return sb.join(\"\");\n }\n}\n\n/** A TypeScript definitions builder. */\nexport class TSDBuilder extends ExportsWalker {\n\n /** Builds TypeScript definitions for the specified program. */\n static build(program: Program): string {\n return new TSDBuilder(program).build();\n }\n\n private sb: string[] = [];\n private indentLevel: i32 = 0;\n\n /** Constructs a new WebIDL builder. */\n constructor(program: Program, includePrivate: bool = false) {\n super(program, includePrivate);\n }\n\n visitGlobal(element: Global): void {\n var sb = this.sb;\n var isConst = element.is(CommonFlags.INLINED);\n indent(sb, this.indentLevel);\n if (element.is(CommonFlags.STATIC)) {\n if (isConst) sb.push(\"static readonly \");\n else sb.push(\"static \");\n } else {\n if (isConst) sb.push(\"const \");\n else sb.push(\"var \");\n }\n sb.push(element.simpleName);\n sb.push(\": \");\n sb.push(this.typeToString(element.type));\n sb.push(\";\\n\");\n this.visitNamespace(element);\n }\n\n visitEnum(element: Enum): void {\n var sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"enum \");\n sb.push(element.simpleName);\n sb.push(\" {\\n\");\n var members = element.members;\n if (members) {\n let numMembers = members.size;\n for (let [name, member] of members) {\n if (member.kind == ElementKind.ENUMVALUE) {\n indent(sb, this.indentLevel);\n sb.push(name);\n if (member.is(CommonFlags.INLINED)) {\n sb.push(\" = \");\n sb.push((member).constantValue.toString(10));\n }\n sb.push(\",\\n\");\n --numMembers;\n }\n }\n if (numMembers) this.visitNamespace(element);\n }\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n visitFunction(element: Function): void {\n if (element.isAny(CommonFlags.PRIVATE | CommonFlags.SET)) return;\n var sb = this.sb;\n var signature = element.signature;\n indent(sb, this.indentLevel);\n if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\n if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\n if (element.is(CommonFlags.GET)) {\n sb.push(element.prototype.declaration.name.text); // 'get:funcName' internally\n sb.push(\": \");\n sb.push(this.typeToString(signature.returnType));\n sb.push(\";\\n\");\n return;\n } else {\n if (!element.isAny(CommonFlags.STATIC | CommonFlags.INSTANCE)) sb.push(\"function \");\n sb.push(element.simpleName);\n }\n sb.push(\"(\");\n var parameters = signature.parameterTypes;\n var numParameters = parameters.length;\n // var requiredParameters = signature.requiredParameters;\n for (let i = 0; i < numParameters; ++i) {\n if (i) sb.push(\", \");\n // if (i >= requiredParameters) sb.push(\"optional \");\n sb.push(signature.getParameterName(i));\n sb.push(\": \");\n sb.push(this.typeToString(parameters[i]));\n }\n if (element.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.SET)) {\n sb.push(\")\");\n } else {\n sb.push(\"): \");\n sb.push(this.typeToString(signature.returnType));\n }\n sb.push(\";\\n\");\n this.visitNamespace(element);\n }\n\n visitClass(element: Class): void {\n var sb = this.sb;\n var isInterface = element.kind == ElementKind.INTERFACE;\n indent(sb, this.indentLevel++);\n if (isInterface) {\n sb.push(\"interface \");\n } else {\n if (element.is(CommonFlags.ABSTRACT)) sb.push(\"abstract \");\n sb.push(\"class \");\n }\n sb.push(element.simpleName);\n var base = element.base;\n if (base && base.is(CommonFlags.COMPILED | CommonFlags.MODULE_EXPORT)) {\n sb.push(\" extends \");\n sb.push(base.simpleName); // TODO: fqn\n }\n sb.push(\" {\\n\");\n var members = element.prototype.members; // static\n if (members) {\n for (let member of members.values()) {\n this.visitElement(member);\n }\n }\n var ctor = element.constructorInstance;\n if (ctor) this.visitFunction(ctor);\n members = element.members; // instance\n if (members) {\n for (let member of members.values()) this.visitElement(member);\n }\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n visitInterface(element: Interface): void {\n this.visitClass(element);\n }\n\n visitField(element: Field): void {\n if (element.is(CommonFlags.PRIVATE)) return;\n var sb = this.sb;\n indent(sb, this.indentLevel);\n if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\n if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\n if (element.is(CommonFlags.READONLY)) sb.push(\"readonly \");\n sb.push(element.simpleName);\n sb.push(\": \");\n sb.push(this.typeToString(element.type));\n sb.push(\";\\n\");\n }\n\n visitNamespace(element: Element): void {\n var members = element.members;\n if (members && members.size) {\n let sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"namespace \");\n sb.push(element.simpleName);\n sb.push(\" {\\n\");\n for (let member of members.values()) this.visitElement(member);\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n }\n\n typeToString(type: Type): string {\n if (type.is(TypeFlags.REFERENCE)){\n return type.toString();\n }\n switch (type.kind) {\n case TypeKind.I8: return \"i8\";\n case TypeKind.I16: return \"i16\";\n case TypeKind.I32: return \"i32\";\n case TypeKind.I64: return \"I64\";\n case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"I64\" : \"i32\";\n case TypeKind.U8: return \"u8\";\n case TypeKind.U16: return \"u16\";\n case TypeKind.U32: return \"u32\";\n // ^ TODO: function types\n case TypeKind.U64: return \"U64\";\n case TypeKind.USIZE: return this.program.options.isWasm64 ? \"U64\" : \"u32\";\n // ^ TODO: class types\n case TypeKind.BOOL: return \"bool\";\n case TypeKind.F32: return \"f32\";\n case TypeKind.F64: return \"f64\";\n case TypeKind.V128: return \"v128\";\n case TypeKind.VOID: return \"void\";\n default: {\n assert(false);\n return \"\";\n }\n }\n }\n\n build(): string {\n var sb = this.sb;\n sb.push(\"declare namespace ASModule {\\n\");\n sb.push(\" type i8 = number;\\n\");\n sb.push(\" type i16 = number;\\n\");\n sb.push(\" type i32 = number;\\n\");\n sb.push(\" type u8 = number;\\n\");\n sb.push(\" type u16 = number;\\n\");\n sb.push(\" type u32 = number;\\n\");\n sb.push(\" type f32 = number;\\n\");\n sb.push(\" type f64 = number;\\n\");\n sb.push(\" type bool = any;\\n\");\n ++this.indentLevel;\n this.walk();\n --this.indentLevel;\n sb.push(\"}\\n\");\n sb.push(\"export default ASModule;\\n\");\n return this.sb.join(\"\");\n }\n}\n\n// helpers\n\n/** Tests if a namespace-like element has at least one compiled member. */\nfunction hasCompiledMember(element: Element): bool {\n var members = element.members;\n if (members) {\n for (let member of members.values()) {\n switch (member.kind) {\n case ElementKind.FUNCTION_PROTOTYPE: {\n for (let instances of (member).instances.values()) {\n for (let instance of instances.values()) {\n if (instance.is(CommonFlags.COMPILED)) return true;\n }\n }\n break;\n }\n case ElementKind.CLASS_PROTOTYPE: {\n for (let instance of (member).instances.values()) {\n if (instance.is(CommonFlags.COMPILED)) return true;\n }\n break;\n }\n default: {\n if (member.is(CommonFlags.COMPILED) || hasCompiledMember(member)) return true;\n break;\n }\n }\n }\n }\n return false;\n}\n","/**\n * A TypeScript parser for the AssemblyScript subset.\n * @module parser\n *//***/\n\nimport {\n CommonFlags,\n LIBRARY_PREFIX,\n PATH_DELIMITER\n} from \"./common\";\n\nimport {\n Program\n} from \"./program\";\n\nimport {\n Tokenizer,\n Token,\n Range,\n CommentHandler,\n IdentifierHandling\n} from \"./tokenizer\";\n\nimport {\n DiagnosticCode,\n DiagnosticEmitter\n} from \"./diagnostics\";\n\nimport {\n normalizePath\n} from \"./util\";\n\nimport {\n Node,\n NodeKind,\n Source,\n SourceKind,\n CommonTypeNode,\n TypeNode,\n SignatureNode,\n\n Expression,\n AssertionKind,\n CallExpression,\n ClassExpression,\n FunctionExpression,\n IdentifierExpression,\n StringLiteralExpression,\n\n Statement,\n BlockStatement,\n BreakStatement,\n ClassDeclaration,\n ContinueStatement,\n DeclarationStatement,\n DecoratorNode,\n DoStatement,\n EnumDeclaration,\n EnumValueDeclaration,\n ExportImportStatement,\n ExportMember,\n ExportStatement,\n ExpressionStatement,\n ForStatement,\n FunctionDeclaration,\n IfStatement,\n ImportDeclaration,\n ImportStatement,\n NamespaceDeclaration,\n ParameterNode,\n ParameterKind,\n ReturnStatement,\n SwitchCase,\n SwitchStatement,\n ThrowStatement,\n TryStatement,\n TypeDeclaration,\n TypeParameterNode,\n VariableStatement,\n VariableDeclaration,\n VoidStatement,\n WhileStatement,\n\n mangleInternalPath,\n nodeIsCallable,\n nodeIsGenericCallable,\n IndexSignatureDeclaration\n} from \"./ast\";\n\n/** Parser interface. */\nexport class Parser extends DiagnosticEmitter {\n\n /** Program being created. */\n program: Program;\n /** Source file names to be requested next. */\n backlog: string[] = new Array();\n /** Source file names already seen, that is processed or backlogged. */\n seenlog: Set = new Set();\n /** Source file names already completely processed. */\n donelog: Set = new Set();\n /** Optional handler to intercept comments while tokenizing. */\n onComment: CommentHandler | null = null;\n\n /** Constructs a new parser. */\n constructor() {\n super();\n this.program = new Program(this.diagnostics);\n }\n\n /** Parses a file and adds its definitions to the program. */\n parseFile(\n text: string,\n path: string,\n isEntry: bool\n ): void {\n var normalizedPath = normalizePath(path);\n var internalPath = mangleInternalPath(normalizedPath);\n\n // check if already processed\n if (this.donelog.has(internalPath)) return;\n this.donelog.add(internalPath); // do not parse again\n this.seenlog.add(internalPath); // do not request again\n\n // create the source element\n var source = new Source(\n normalizedPath,\n text,\n isEntry\n ? SourceKind.ENTRY\n : path.startsWith(LIBRARY_PREFIX) && path.indexOf(PATH_DELIMITER, LIBRARY_PREFIX.length) < 0\n ? SourceKind.LIBRARY\n : SourceKind.DEFAULT\n );\n var program = this.program;\n program.sources.push(source);\n\n // tokenize and parse\n var tn = new Tokenizer(source, program.diagnostics);\n tn.onComment = this.onComment;\n source.tokenizer = tn;\n var statements = source.statements;\n while (!tn.skip(Token.ENDOFFILE)) {\n let statement = this.parseTopLevelStatement(tn);\n if (statement) {\n statement.parent = source;\n statements.push(statement);\n }\n }\n tn.finish();\n }\n\n /** Parses a top-level statement. */\n parseTopLevelStatement(\n tn: Tokenizer,\n namespace: Node | null = null\n ): Statement | null {\n var flags = CommonFlags.NONE;\n var startPos: i32 = -1;\n\n // check decorators\n var decorators: DecoratorNode[] | null = null;\n while (tn.skip(Token.AT)) {\n if (startPos < 0) startPos = tn.tokenPos;\n let decorator = this.parseDecorator(tn);\n if (!decorator) {\n this.skipStatement(tn);\n continue;\n }\n if (!decorators) decorators = [];\n decorators.push(decorator);\n }\n\n // check modifiers\n var exportStart: i32 = 0;\n var exportEnd: i32 = 0;\n if (tn.skip(Token.EXPORT)) {\n if (tn.skip(Token.DEFAULT)) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n tn.range()\n );\n }\n if (startPos < 0) startPos = tn.tokenPos;\n flags |= CommonFlags.EXPORT;\n exportStart = tn.tokenPos;\n exportEnd = tn.pos;\n }\n\n var declareStart: i32 = 0;\n var declareEnd: i32 = 0;\n var contextIsAmbient = namespace != null && namespace.is(CommonFlags.AMBIENT);\n if (tn.skip(Token.DECLARE)) {\n if (startPos < 0) startPos = tn.tokenPos;\n if (contextIsAmbient) {\n this.error(\n DiagnosticCode.A_declare_modifier_cannot_be_used_in_an_already_ambient_context,\n tn.range()\n ); // recoverable\n }\n flags |= CommonFlags.DECLARE | CommonFlags.AMBIENT;\n } else if (contextIsAmbient) {\n flags |= CommonFlags.AMBIENT;\n }\n\n // parse the statement\n var statement: Statement | null = null;\n\n // handle declarations\n var first = tn.peek();\n if (startPos < 0) startPos = tn.nextTokenPos;\n switch (first) {\n case Token.CONST: {\n tn.next();\n flags |= CommonFlags.CONST;\n if (tn.skip(Token.ENUM)) {\n statement = this.parseEnum(tn, flags, decorators, startPos);\n break;\n } else {\n statement = this.parseVariable(tn, flags, decorators, startPos);\n decorators = null;\n }\n break;\n }\n case Token.LET: flags |= CommonFlags.LET;\n case Token.VAR: {\n tn.next();\n statement = this.parseVariable(tn, flags, decorators, startPos);\n decorators = null;\n break;\n }\n case Token.ENUM: {\n tn.next();\n statement = this.parseEnum(tn, flags, decorators, startPos);\n decorators = null;\n break;\n }\n case Token.FUNCTION: {\n tn.next();\n statement = this.parseFunction(tn, flags, decorators, startPos);\n decorators = null;\n break;\n }\n case Token.ABSTRACT: {\n let state = tn.mark();\n tn.next();\n if (!tn.skip(Token.CLASS)) {\n tn.reset(state);\n statement = this.parseStatement(tn, true);\n break;\n } else {\n tn.discard(state);\n }\n flags |= CommonFlags.ABSTRACT;\n // fall through\n }\n case Token.CLASS:\n case Token.INTERFACE: {\n tn.next();\n statement = this.parseClassOrInterface(tn, flags, decorators, startPos);\n decorators = null;\n break;\n }\n case Token.NAMESPACE: {\n let state = tn.mark();\n tn.next();\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\n tn.discard(state);\n statement = this.parseNamespace(tn, flags, decorators, startPos);\n decorators = null;\n } else {\n tn.reset(state);\n statement = this.parseStatement(tn, true);\n }\n break;\n }\n case Token.IMPORT: {\n tn.next();\n flags |= CommonFlags.IMPORT;\n if (flags & CommonFlags.EXPORT) {\n statement = this.parseExportImport(tn, startPos);\n } else {\n statement = this.parseImport(tn);\n }\n break;\n }\n case Token.TYPE: { // also identifier\n let state = tn.mark();\n tn.next();\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\n tn.discard(state);\n statement = this.parseTypeDeclaration(tn, flags, decorators, startPos);\n decorators = null;\n } else {\n tn.reset(state);\n statement = this.parseStatement(tn, true);\n }\n break;\n }\n default: {\n\n // handle plain exports\n if (flags & CommonFlags.EXPORT) {\n statement = this.parseExport(tn, flags, startPos);\n\n // handle non-declaration statements\n } else {\n if (exportEnd) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(exportStart, exportEnd), \"export\"\n ); // recoverable\n }\n if (declareEnd) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(declareStart, declareEnd), \"declare\"\n ); // recoverable\n }\n if (!namespace) {\n statement = this.parseStatement(tn, true);\n } // TODO: else?\n }\n break;\n }\n }\n\n // check for decorators that weren't consumed\n if (decorators) {\n for (let i = 0, k = decorators.length; i < k; ++i) {\n this.error(\n DiagnosticCode.Decorators_are_not_valid_here,\n decorators[i].range\n );\n }\n }\n return statement;\n }\n\n /** Obtains the next file to parse. */\n nextFile(): string | null {\n var backlog = this.backlog;\n return backlog.length ? backlog.shift() : null;\n }\n\n /** Finishes parsing and returns the program. */\n finish(): Program {\n if (this.backlog.length) throw new Error(\"backlog is not empty\");\n this.backlog = [];\n this.seenlog.clear();\n this.donelog.clear();\n return this.program;\n }\n\n /** Parses a type. */\n parseType(\n tn: Tokenizer,\n acceptParenthesized: bool = true,\n suppressErrors: bool = false\n ): CommonTypeNode | null {\n\n // NOTE: this parses our limited subset\n var token = tn.next();\n var startPos = tn.tokenPos;\n\n var type: CommonTypeNode;\n\n // '(' ...\n if (token == Token.OPENPAREN) {\n\n // '(' FunctionSignature ')' '|' 'null'?\n let isNullableSignature = tn.skip(Token.OPENPAREN);\n // FunctionSignature?\n let signature = this.tryParseSignature(tn);\n if (signature) {\n if (isNullableSignature) {\n if (!tn.skip(Token.CLOSEPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n if (!tn.skip(Token.BAR)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"|\"\n );\n return null;\n }\n if (!tn.skip(Token.NULL)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"null\"\n );\n }\n signature.isNullable = true;\n }\n return signature;\n } else if (isNullableSignature || this.tryParseSignatureIsSignature) {\n this.error(\n DiagnosticCode.Unexpected_token,\n tn.range()\n );\n return null;\n }\n\n // Type (',' Type)* ')'\n if (acceptParenthesized) {\n let innerType = this.parseType(tn, false, suppressErrors);\n if (!innerType) return null;\n if (!tn.skip(Token.CLOSEPAREN)) {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"}\"\n );\n }\n return null;\n }\n type = innerType;\n type.range.start = startPos;\n type.range.end = tn.pos;\n } else {\n this.error(\n DiagnosticCode.Unexpected_token,\n tn.range()\n );\n return null;\n }\n\n // 'void'\n } else if (token == Token.VOID) {\n type = Node.createType(\n Node.createIdentifierExpression(\"void\", tn.range()), [], false, tn.range(startPos, tn.pos)\n );\n\n // 'this'\n } else if (token == Token.THIS) {\n type = Node.createType(\n Node.createThisExpression(tn.range()), [], false, tn.range(startPos, tn.pos)\n );\n\n // 'true'\n } else if (token == Token.TRUE || token == Token.FALSE) {\n type = Node.createType(\n Node.createIdentifierExpression(\"bool\", tn.range()), [], false, tn.range(startPos, tn.pos)\n );\n\n // StringLiteral\n } else if (token == Token.STRINGLITERAL) {\n tn.readString();\n type = Node.createType(\n Node.createIdentifierExpression(\"string\", tn.range()), [], false, tn.range(startPos, tn.pos)\n );\n\n // Identifier\n } else if (token == Token.IDENTIFIER) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let parameters = new Array();\n let nullable = false;\n\n // Identifier ('.' Identifier)+\n while (tn.skip(Token.DOT)) {\n if (tn.skip(Token.IDENTIFIER)) {\n // TODO: this works for now, but the representation isn't great\n identifier = Node.createIdentifierExpression(\n identifier.text + \".\" + tn.readIdentifier(),\n tn.range(identifier.range.start, tn.pos)\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range(tn.pos)\n );\n return null;\n }\n }\n\n // Name\n if (tn.skip(Token.LESSTHAN)) {\n do {\n let parameter = this.parseType(tn, true, suppressErrors);\n if (!parameter) return null;\n parameters.push(parameter);\n } while (tn.skip(Token.COMMA));\n if (!tn.skip(Token.GREATERTHAN)) {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \">\"\n );\n }\n return null;\n }\n }\n // ... | null\n while (tn.skip(Token.BAR)) {\n if (tn.skip(Token.NULL)) {\n nullable = true;\n } else {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"null\"\n );\n }\n return null;\n }\n }\n type = Node.createType(identifier, parameters, nullable, tn.range(startPos, tn.pos));\n\n } else {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n // ... [][]\n while (tn.skip(Token.OPENBRACKET)) {\n let bracketStart = tn.tokenPos;\n if (!tn.skip(Token.CLOSEBRACKET)) {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"]\"\n );\n }\n return null;\n }\n let bracketRange = tn.range(bracketStart, tn.pos);\n\n // ...[] | null\n let nullable = false;\n if (tn.skip(Token.BAR)) {\n if (tn.skip(Token.NULL)) {\n nullable = true;\n } else {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"null\"\n );\n }\n return null;\n }\n }\n type = Node.createType(\n Node.createIdentifierExpression(\"Array\", bracketRange),\n [ type ],\n nullable,\n tn.range(startPos, tn.pos)\n );\n if (nullable) break;\n }\n\n return type;\n }\n\n // Indicates whether tryParseSignature determined that it is handling a Signature\n private tryParseSignatureIsSignature: bool = false;\n\n /** Parses a function signature, as used in type declarations. */\n tryParseSignature(\n tn: Tokenizer\n ): SignatureNode | null {\n\n // at '(': ('...'? Identifier '?'? ':' Type (',' '...'? Identifier '?'? ':' Type)* )? ')' '=>' Type\n\n var state = tn.mark();\n var startPos = tn.tokenPos;\n var parameters: ParameterNode[] | null = null;\n var thisType: TypeNode | null = null;\n var isSignature: bool = false;\n\n if (tn.skip(Token.CLOSEPAREN)) {\n isSignature = true;\n tn.discard(state);\n parameters = [];\n\n } else {\n isSignature = false; // not yet known\n do {\n let kind = ParameterKind.DEFAULT;\n if (tn.skip(Token.DOT_DOT_DOT)) {\n isSignature = true;\n tn.discard(state);\n kind = ParameterKind.REST;\n }\n if (tn.skip(Token.THIS)) {\n if (tn.skip(Token.COLON)) {\n isSignature = true;\n tn.discard(state);\n let t = this.parseType(tn, false);\n if (!t) return null;\n if (t.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n t.range\n );\n this.tryParseSignatureIsSignature = true;\n return null;\n }\n thisType = t;\n } else {\n tn.reset(state);\n this.tryParseSignatureIsSignature = false;\n return null;\n }\n } else if (tn.skipIdentifier()) {\n let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range(tn.tokenPos, tn.pos));\n if (tn.skip(Token.QUESTION)) {\n isSignature = true;\n tn.discard(state);\n if (kind == ParameterKind.REST) {\n this.error(\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\n tn.range()\n ); // recoverable\n } else {\n kind = ParameterKind.OPTIONAL;\n }\n }\n if (tn.skip(Token.COLON)) {\n isSignature = true;\n tn.discard(state);\n let type = this.parseType(tn); // not suppressing errors because known\n if (!type) {\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n let param = new ParameterNode();\n param.parameterKind = kind;\n param.name = name;\n param.type = type;\n if (!parameters) parameters = [ param ];\n else parameters.push(param);\n } else {\n if (isSignature) {\n this.error(\n DiagnosticCode.Type_expected,\n tn.range()\n ); // recoverable\n }\n }\n } else {\n if (isSignature) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n } else {\n tn.reset(state);\n }\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n } while (tn.skip(Token.COMMA));\n if (!tn.skip(Token.CLOSEPAREN)) {\n if (isSignature) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n } else {\n tn.reset(state);\n }\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n }\n\n var returnType: CommonTypeNode | null;\n if (tn.skip(Token.EQUALS_GREATERTHAN)) {\n isSignature = true;\n tn.discard(state);\n returnType = this.parseType(tn);\n if (!returnType) {\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n } else {\n if (isSignature) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"=>\"\n );\n } else {\n tn.reset(state);\n }\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n this.tryParseSignatureIsSignature = true;\n return Node.createSignature(\n parameters || [],\n returnType,\n thisType,\n false,\n tn.range(startPos, tn.pos)\n );\n }\n\n // statements\n\n parseDecorator(\n tn: Tokenizer\n ): DecoratorNode | null {\n\n // at '@': Identifier ('.' Identifier)* '(' Arguments\n\n var startPos = tn.tokenPos;\n if (tn.skipIdentifier()) {\n let name = tn.readIdentifier();\n let expression: Expression = Node.createIdentifierExpression(name, tn.range(startPos, tn.pos));\n while (tn.skip(Token.DOT)) {\n if (tn.skipIdentifier()) {\n name = tn.readIdentifier();\n expression = Node.createPropertyAccessExpression(\n expression,\n Node.createIdentifierExpression(name, tn.range()),\n tn.range(startPos, tn.pos)\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n }\n let args: Expression[] | null;\n if (tn.skip(Token.OPENPAREN)) {\n args = this.parseArguments(tn);\n if (args) {\n return Node.createDecorator(expression, args, tn.range(startPos, tn.pos));\n }\n } else {\n return Node.createDecorator(expression, null, tn.range(startPos, tn.pos));\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseVariable(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): VariableStatement | null {\n\n // at ('const' | 'let' | 'var'): VariableDeclaration (',' VariableDeclaration)* ';'?\n\n var members = new Array();\n do {\n let member = this.parseVariableDeclaration(tn, flags, decorators);\n if (!member) return null;\n members.push(member);\n } while (tn.skip(Token.COMMA));\n\n var ret = Node.createVariableStatement(members, decorators, flags, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseVariableDeclaration(\n tn: Tokenizer,\n parentFlags: CommonFlags,\n parentDecorators: DecoratorNode[] | null\n ): VariableDeclaration | null {\n\n // before: Identifier (':' Type)? ('=' Expression)?\n\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n var flags = parentFlags;\n if (tn.skip(Token.EXCLAMATION)) {\n flags |= CommonFlags.DEFINITE_ASSIGNMENT;\n }\n\n var type: CommonTypeNode | null = null;\n if (tn.skip(Token.COLON)) {\n type = this.parseType(tn);\n }\n\n var initializer: Expression | null = null;\n if (tn.skip(Token.EQUALS)) {\n if (flags & CommonFlags.AMBIENT) {\n this.error(\n DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,\n tn.range()\n ); // recoverable\n }\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!initializer) return null;\n } else {\n if (flags & CommonFlags.CONST) {\n if (!(flags & CommonFlags.AMBIENT)) {\n this.error(\n DiagnosticCode._const_declarations_must_be_initialized,\n identifier.range\n ); // recoverable\n }\n } else if (!type) { // neither type nor initializer\n this.error(\n DiagnosticCode.Type_expected,\n tn.range(tn.pos)\n ); // recoverable\n }\n }\n var range = Range.join(identifier.range, tn.range());\n if ((flags & CommonFlags.DEFINITE_ASSIGNMENT) && initializer) {\n this.error(\n DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,\n range);\n }\n return Node.createVariableDeclaration(\n identifier,\n type,\n initializer,\n parentDecorators,\n flags,\n range\n );\n }\n\n parseEnum(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): EnumDeclaration | null {\n\n // at 'enum': Identifier '{' (EnumValueDeclaration (',' EnumValueDeclaration )*)? '}' ';'?\n\n if (tn.next() != Token.IDENTIFIER) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n if (tn.next() != Token.OPENBRACE) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n return null;\n }\n var members = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let member = this.parseEnumValue(tn, CommonFlags.NONE);\n if (!member) return null;\n members.push(member);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACE)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n return null;\n }\n }\n }\n var ret = Node.createEnumDeclaration(\n identifier,\n members,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseEnumValue(\n tn: Tokenizer,\n parentFlags: CommonFlags\n ): EnumValueDeclaration | null {\n\n // before: Identifier ('=' Expression)?\n\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n var value: Expression | null = null;\n if (tn.skip(Token.EQUALS)) {\n value = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!value) return null;\n }\n return Node.createEnumValueDeclaration(\n identifier,\n value,\n parentFlags,\n Range.join(identifier.range, tn.range())\n );\n }\n\n parseReturn(\n tn: Tokenizer\n ): ReturnStatement | null {\n\n // at 'return': Expression | (';' | '}' | ...'\\n')\n\n var expr: Expression | null = null;\n if (\n tn.peek(true) != Token.SEMICOLON &&\n tn.nextToken != Token.CLOSEBRACE &&\n !tn.nextTokenOnNewLine\n ) {\n if (!(expr = this.parseExpression(tn))) return null;\n }\n\n var ret = Node.createReturnStatement(expr, tn.range());\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseTypeParameters(\n tn: Tokenizer\n ): TypeParameterNode[] | null {\n\n // at '<': TypeParameter (',' TypeParameter)* '>'\n\n var typeParameters = new Array();\n var seenOptional = false;\n while (!tn.skip(Token.GREATERTHAN)) {\n let typeParameter = this.parseTypeParameter(tn);\n if (!typeParameter) return null;\n if (typeParameter.defaultType !== null) {\n seenOptional = true;\n } else if (seenOptional) {\n this.error(\n DiagnosticCode.Required_type_parameters_may_not_follow_optional_type_parameters,\n typeParameter.range\n );\n typeParameter.defaultType = null;\n }\n typeParameters.push(typeParameter);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.GREATERTHAN)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \">\"\n );\n return null;\n }\n }\n }\n if (typeParameters.length === 0) {\n this.error(\n DiagnosticCode.Type_parameter_list_cannot_be_empty,\n tn.range()\n ); // recoverable\n }\n return typeParameters;\n }\n\n parseTypeParameter(\n tn: Tokenizer\n ): TypeParameterNode | null {\n\n // before: Identifier ('extends' Type)? ('=' Type)?\n\n if (tn.next() == Token.IDENTIFIER) {\n let identifier = Node.createIdentifierExpression(\n tn.readIdentifier(),\n tn.range()\n );\n let extendsType: TypeNode | null = null;\n if (tn.skip(Token.EXTENDS)) {\n let t = this.parseType(tn);\n if (!t) return null;\n if (t.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n t.range\n );\n return null;\n }\n extendsType = t;\n }\n let defaultType: TypeNode | null = null;\n if (tn.skip(Token.EQUALS)) {\n let t = this.parseType(tn);\n if (!t) return null;\n if (t.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n t.range\n );\n return null;\n }\n defaultType = t;\n }\n return Node.createTypeParameter(\n identifier,\n extendsType,\n defaultType,\n Range.join(identifier.range, tn.range())\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n private parseParametersThis: TypeNode | null = null;\n\n parseParameters(\n tn: Tokenizer,\n isConstructor: bool = false\n ): ParameterNode[] | null {\n\n // at '(': (Parameter (',' Parameter)*)? ')'\n\n var parameters = new Array();\n var seenRest: ParameterNode | null = null;\n var seenOptional = false;\n var reportedRest = false;\n var thisType: CommonTypeNode | null = null;\n\n // check if there is a leading `this` parameter\n this.parseParametersThis = null;\n if (tn.skip(Token.THIS)) {\n if (tn.skip(Token.COLON)) {\n thisType = this.parseType(tn); // reports\n if (!thisType) return null;\n if (thisType.kind == NodeKind.TYPE) {\n this.parseParametersThis = thisType;\n } else {\n this.error(\n DiagnosticCode.Operation_not_supported,\n thisType.range\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n return null;\n }\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEPAREN)) {\n return parameters;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n }\n }\n\n while (!tn.skip(Token.CLOSEPAREN)) {\n let param = this.parseParameter(tn, isConstructor); // reports\n if (!param) return null;\n if (seenRest && !reportedRest) {\n this.error(\n DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,\n seenRest.name.range\n );\n reportedRest = true;\n }\n switch (param.parameterKind) {\n default: {\n if (seenOptional) {\n this.error(\n DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,\n param.name.range\n );\n }\n break;\n }\n case ParameterKind.OPTIONAL: {\n seenOptional = true;\n break;\n }\n case ParameterKind.REST: {\n seenRest = param;\n break;\n }\n }\n parameters.push(param);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEPAREN)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n }\n }\n return parameters;\n }\n\n parseParameter(\n tn: Tokenizer,\n isConstructor: bool = false\n ): ParameterNode | null {\n\n // before: ('public' | 'private' | 'protected' | '...')? Identifier '?'? (':' Type)? ('=' Expression)?\n\n var isRest = false;\n var isOptional = false;\n var startRange: Range | null = null;\n var accessFlags: CommonFlags = CommonFlags.NONE;\n if (isConstructor) {\n if (tn.skip(Token.PUBLIC)) {\n startRange = tn.range();\n accessFlags |= CommonFlags.PUBLIC;\n } else if (tn.skip(Token.PROTECTED)) {\n startRange = tn.range();\n accessFlags |= CommonFlags.PROTECTED;\n } else if (tn.skip(Token.PRIVATE)) {\n startRange = tn.range();\n accessFlags |= CommonFlags.PRIVATE;\n }\n if (tn.peek() == Token.READONLY) {\n let state = tn.mark();\n tn.next();\n if (tn.peek() != Token.COLON) { // modifier\n tn.discard(state);\n if (!startRange) startRange = tn.range();\n accessFlags |= CommonFlags.READONLY;\n } else { // identifier\n tn.reset(state);\n }\n }\n }\n if (tn.skip(Token.DOT_DOT_DOT)) {\n if (accessFlags) {\n this.error(\n DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,\n tn.range()\n );\n } else {\n startRange = tn.range();\n }\n isRest = true;\n }\n if (tn.skipIdentifier()) {\n if (!isRest) startRange = tn.range();\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let type: CommonTypeNode | null = null;\n if (isOptional = tn.skip(Token.QUESTION)) {\n if (isRest) {\n this.error(\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\n identifier.range\n );\n }\n }\n if (tn.skip(Token.COLON)) {\n type = this.parseType(tn);\n if (!type) return null;\n } else {\n type = Node.createOmittedType(tn.range(tn.pos));\n }\n let initializer: Expression | null = null;\n if (tn.skip(Token.EQUALS)) {\n if (isRest) {\n this.error(\n DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,\n identifier.range\n );\n }\n if (isOptional) {\n this.error(\n DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,\n identifier.range\n );\n } else {\n isOptional = true;\n }\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!initializer) return null;\n }\n let param = Node.createParameter(\n identifier,\n type,\n initializer,\n isRest\n ? ParameterKind.REST\n : isOptional\n ? ParameterKind.OPTIONAL\n : ParameterKind.DEFAULT,\n Range.join(startRange, tn.range())\n );\n param.flags |= accessFlags;\n return param;\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseFunction(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): FunctionDeclaration | null {\n\n // at 'function':\n // Identifier\n // ('<' TypeParameters)?\n // '(' Parameters (':' Type)?\n // '{' Statement* '}'\n // ';'?\n\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range(tn.pos)\n );\n return null;\n }\n\n var name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n var signatureStart: i32 = -1;\n\n var typeParameters: TypeParameterNode[] | null = null;\n if (tn.skip(Token.LESSTHAN)) {\n signatureStart = tn.tokenPos;\n typeParameters = this.parseTypeParameters(tn);\n if (!typeParameters) return null;\n flags |= CommonFlags.GENERIC;\n }\n\n if (!tn.skip(Token.OPENPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"(\"\n );\n return null;\n }\n\n if (signatureStart < 0) {\n signatureStart = tn.tokenPos;\n }\n\n var parameters = this.parseParameters(tn);\n if (!parameters) return null;\n var thisType = this.parseParametersThis;\n\n var isSetter = (flags & CommonFlags.SET) != 0;\n if (isSetter) {\n if (parameters.length != 1) {\n this.error(\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\n name.range\n ); // recoverable\n }\n if (parameters.length && parameters[0].initializer) {\n this.error(\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\n name.range\n ); // recoverable\n }\n }\n\n if (flags & CommonFlags.GET) {\n if (parameters.length) {\n this.error(\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\n name.range\n ); // recoverable\n }\n }\n\n var returnType: CommonTypeNode | null = null;\n if (tn.skip(Token.COLON)) {\n returnType = this.parseType(tn, true, isSetter);\n if (!returnType) return null;\n }\n\n if (!returnType) {\n returnType = Node.createOmittedType(\n tn.range(tn.pos)\n );\n if (!isSetter) {\n this.error(\n DiagnosticCode.Type_expected,\n returnType.range\n ); // recoverable\n }\n }\n\n var signature = Node.createSignature(\n parameters,\n returnType,\n thisType,\n false,\n tn.range(signatureStart, tn.pos)\n );\n\n var body: Statement | null = null;\n if (tn.skip(Token.OPENBRACE)) {\n if (flags & CommonFlags.AMBIENT) {\n this.error(\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\n tn.range()\n ); // recoverable\n }\n\n body = this.parseBlockStatement(tn, false);\n if (!body) return null;\n } else if (!(flags & CommonFlags.AMBIENT)) {\n this.error(\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\n tn.range(tn.pos)\n );\n }\n\n var ret = Node.createFunctionDeclaration(\n name,\n typeParameters,\n signature,\n body,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseFunctionExpression(tn: Tokenizer): FunctionExpression | null {\n var startPos = tn.tokenPos;\n var name: IdentifierExpression;\n var isArrow = false;\n\n // either at 'function':\n // Identifier?\n // '(' Parameters (':' Type)?\n // Statement\n\n if (tn.token == Token.FUNCTION) {\n if (tn.skipIdentifier()) {\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else { // empty name\n name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\n }\n if (!tn.skip(Token.OPENPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"(\"\n );\n return null;\n }\n\n // or at '(' of arrow function:\n // Parameters (':' Type)?\n // Statement\n\n } else {\n isArrow = true;\n assert(tn.token == Token.OPENPAREN);\n name = Node.createEmptyIdentifierExpression(tn.range(tn.tokenPos));\n }\n\n // TODO: type parameters? doesn't seem worth it.\n\n var signatureStart = tn.pos;\n var parameters = this.parseParameters(tn);\n if (!parameters) return null;\n\n return this.parseFunctionExpressionCommon(tn, name, parameters, isArrow, startPos, signatureStart);\n }\n\n private parseFunctionExpressionCommon(\n tn: Tokenizer,\n name: IdentifierExpression,\n parameters: ParameterNode[],\n isArrow: bool,\n startPos: i32 = -1,\n signatureStart: i32 = -1\n ): FunctionExpression | null {\n if (startPos < 0) startPos = name.range.start;\n if (signatureStart < 0) signatureStart = startPos;\n\n var returnType: CommonTypeNode | null = null;\n if (tn.skip(Token.COLON)) {\n returnType = this.parseType(tn);\n if (!returnType) return null;\n } else {\n returnType = Node.createOmittedType(tn.range(tn.pos));\n this.error(\n DiagnosticCode.Type_expected,\n returnType.range\n ); // recoverable\n }\n\n if (isArrow) {\n if (!tn.skip(Token.EQUALS_GREATERTHAN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"=>\"\n );\n return null;\n }\n }\n\n var signature = Node.createSignature(\n parameters,\n returnType,\n null, // TODO?\n false,\n tn.range(signatureStart, tn.pos)\n );\n\n var body: Statement | null;\n if (isArrow) {\n body = this.parseStatement(tn, false);\n } else {\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"{\"\n );\n return null;\n }\n body = this.parseBlockStatement(tn, false);\n }\n if (!body) return null;\n\n var declaration = Node.createFunctionDeclaration(\n name,\n null,\n signature,\n body,\n null,\n isArrow ? CommonFlags.ARROW : CommonFlags.NONE,\n tn.range(startPos, tn.pos)\n );\n return Node.createFunctionExpression(declaration);\n }\n\n parseClassOrInterface(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): ClassDeclaration | null {\n\n // at ('class' | 'interface'):\n // Identifier\n // ('<' TypeParameters)?\n // ('extends' Type)?\n // ('implements' Type (',' Type)*)?\n // '{' ClassMember* '}'\n\n var isInterface = tn.token == Token.INTERFACE;\n\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n\n var identifier = Node.createIdentifierExpression(\n tn.readIdentifier(),\n tn.range()\n );\n\n var typeParameters: TypeParameterNode[] | null;\n if (tn.skip(Token.LESSTHAN)) {\n typeParameters = this.parseTypeParameters(tn);\n if (!typeParameters) return null;\n flags |= CommonFlags.GENERIC;\n } else {\n typeParameters = [];\n }\n\n var extendsType: TypeNode | null = null;\n if (tn.skip(Token.EXTENDS)) {\n let t = this.parseType(tn);\n if (!t) return null;\n if (t.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n t.range\n );\n return null;\n }\n extendsType = t;\n }\n\n var implementsTypes: TypeNode[] | null = null;\n if (tn.skip(Token.IMPLEMENTS)) {\n if (isInterface) {\n this.error(\n DiagnosticCode.Interface_declaration_cannot_have_implements_clause,\n tn.range()\n ); // recoverable\n }\n do {\n let type = this.parseType(tn);\n if (!type) return null;\n if (!isInterface) {\n if (!implementsTypes) implementsTypes = [];\n implementsTypes.push(type);\n }\n } while (tn.skip(Token.COMMA));\n }\n\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n return null;\n }\n\n var members = new Array();\n var declaration: ClassDeclaration;\n if (isInterface) {\n assert(!implementsTypes);\n declaration = Node.createInterfaceDeclaration(\n identifier,\n typeParameters,\n extendsType,\n members,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n } else {\n declaration = Node.createClassDeclaration(\n identifier,\n typeParameters,\n extendsType,\n implementsTypes,\n members,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n }\n if (!tn.skip(Token.CLOSEBRACE)) {\n do {\n let member = this.parseClassMember(tn, declaration);\n if (!member) return null;\n member.parent = declaration;\n members.push(member);\n } while (!tn.skip(Token.CLOSEBRACE));\n }\n return declaration;\n }\n\n parseClassExpression(tn: Tokenizer): ClassExpression | null {\n\n // at 'class': Identifier? '{' ... '}'\n\n var startPos = tn.tokenPos;\n var name: IdentifierExpression;\n\n if (tn.skipIdentifier()) {\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\n }\n\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"{\"\n );\n return null;\n }\n\n var members = new Array();\n var declaration = Node.createClassDeclaration(\n name,\n [],\n null,\n null,\n members,\n null,\n CommonFlags.NONE,\n tn.range(startPos, tn.pos)\n );\n if (!tn.skip(Token.CLOSEBRACE)) {\n do {\n let member = this.parseClassMember(tn, declaration);\n if (!member) return null;\n member.parent = declaration;\n members.push(member);\n } while (!tn.skip(Token.CLOSEBRACE));\n }\n return Node.createClassExpression(declaration);\n }\n\n parseClassMember(\n tn: Tokenizer,\n parent: ClassDeclaration\n ): DeclarationStatement | null {\n\n // before:\n // ('public' | 'private' | 'protected')?\n // ('static' | 'abstract')?\n // 'readonly'?\n // ('get' | 'set')?\n // Identifier ...\n\n var startPos = tn.pos;\n var isInterface = parent.kind == NodeKind.INTERFACEDECLARATION;\n\n var decorators = new Array();\n if (tn.skip(Token.AT)) {\n do {\n let decorator = this.parseDecorator(tn);\n if (!decorator) break;\n decorators.push(decorator);\n } while (tn.skip(Token.AT));\n if (isInterface) {\n this.error(\n DiagnosticCode.Decorators_are_not_valid_here,\n Range.join(decorators[0].range, decorators[decorators.length - 1].range)\n );\n }\n }\n\n // inherit ambient status\n var flags = parent.flags & CommonFlags.AMBIENT;\n\n // implemented methods are virtual\n if (isInterface) flags |= CommonFlags.VIRTUAL;\n\n var accessStart = 0;\n var accessEnd = 0;\n if (tn.skip(Token.PUBLIC)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"public\"\n );\n }\n flags |= CommonFlags.PUBLIC;\n accessStart = tn.tokenPos;\n accessEnd = tn.pos;\n } else if (tn.skip(Token.PRIVATE)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"private\"\n );\n }\n flags |= CommonFlags.PRIVATE;\n accessStart = tn.tokenPos;\n accessEnd = tn.pos;\n } else if (tn.skip(Token.PROTECTED)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"protected\"\n );\n }\n flags |= CommonFlags.PROTECTED;\n accessStart = tn.tokenPos;\n accessEnd = tn.pos;\n }\n\n var staticStart = 0;\n var staticEnd = 0;\n var abstractStart = 0;\n var abstractEnd = 0;\n if (tn.skip(Token.STATIC)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"static\"\n );\n }\n flags |= CommonFlags.STATIC;\n staticStart = tn.tokenPos;\n staticEnd = tn.pos;\n } else {\n flags |= CommonFlags.INSTANCE;\n if (tn.skip(Token.ABSTRACT)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"abstract\"\n );\n }\n flags |= CommonFlags.ABSTRACT;\n abstractStart = tn.tokenPos;\n abstractEnd = tn.pos;\n }\n if (parent.flags & CommonFlags.GENERIC) flags |= CommonFlags.GENERIC_CONTEXT;\n }\n\n var readonlyStart: i32 = 0;\n var readonlyEnd: i32 = 0;\n if (tn.skip(Token.READONLY)) {\n flags |= CommonFlags.READONLY;\n readonlyStart = tn.tokenPos;\n readonlyEnd = tn.pos;\n }\n\n // check if accessor: ('get' | 'set') ^\\n Identifier\n var state = tn.mark();\n var isConstructor = false;\n var isGetter = false;\n var getStart: i32 = 0;\n var getEnd: i32 = 0;\n var isSetter = false;\n var setStart: i32 = 0;\n var setEnd: i32 = 0;\n if (!isInterface) {\n if (tn.skip(Token.GET)) {\n if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\n flags |= CommonFlags.GET;\n isGetter = true;\n setStart = tn.tokenPos;\n setEnd = tn.pos;\n if (flags & CommonFlags.READONLY) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\n ); // recoverable\n }\n } else {\n tn.reset(state);\n }\n } else if (tn.skip(Token.SET)) {\n if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\n flags |= CommonFlags.SET;\n isSetter = true;\n setStart = tn.tokenPos;\n setEnd = tn.pos;\n if (flags & CommonFlags.READONLY) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\n ); // recoverable\n }\n } else {\n tn.reset(state);\n }\n } else if (tn.skip(Token.CONSTRUCTOR)) {\n flags |= CommonFlags.CONSTRUCTOR;\n isConstructor = true;\n if (flags & CommonFlags.STATIC) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(staticStart, staticEnd), \"static\"\n ); // recoverable\n }\n if (flags & CommonFlags.ABSTRACT) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(abstractStart, abstractEnd), \"abstract\"\n ); // recoverable\n }\n if (flags & CommonFlags.READONLY) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\n ); // recoverable\n }\n }\n }\n\n var name: IdentifierExpression;\n if (isConstructor) {\n name = Node.createConstructorExpression(tn.range());\n } else {\n if (!(isGetter || isSetter) && tn.skip(Token.OPENBRACKET)) {\n // TODO: also handle symbols, which might have some of these modifiers\n if (flags & CommonFlags.PUBLIC) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(accessStart, accessEnd), \"public\"\n ); // recoverable\n } else if (flags & CommonFlags.PROTECTED) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(accessStart, accessEnd), \"protected\"\n ); // recoverable\n } else if (flags & CommonFlags.PRIVATE) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(accessStart, accessEnd), \"protected\"\n ); // recoverable\n }\n if (flags & CommonFlags.STATIC) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(staticStart, staticEnd), \"static\"\n ); // recoverable\n }\n if (flags & CommonFlags.ABSTRACT) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(abstractStart, abstractEnd), \"abstract\"\n ); // recoverable\n }\n if (flags & CommonFlags.READONLY) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\n ); // recoverable\n }\n let retIndex = this.parseIndexSignatureDeclaration(tn, decorators);\n if (!retIndex) return null;\n tn.skip(Token.SEMICOLON);\n return retIndex;\n }\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n }\n var typeParameters: TypeParameterNode[] | null = null;\n if (tn.skip(Token.LESSTHAN)) {\n let typeParametersStart = tn.tokenPos;\n typeParameters = this.parseTypeParameters(tn);\n if (!typeParameters) return null;\n if (isConstructor) {\n this.error(\n DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,\n tn.range(typeParametersStart, tn.pos)\n ); // recoverable\n } else if (isGetter || isSetter) {\n this.error(\n DiagnosticCode.An_accessor_cannot_have_type_parameters,\n tn.range(typeParametersStart, tn.pos)\n ); // recoverable\n } else {\n flags |= CommonFlags.GENERIC;\n }\n }\n\n // method: '(' Parameters (':' Type)? '{' Statement* '}' ';'?\n if (tn.skip(Token.OPENPAREN)) {\n let signatureStart = tn.tokenPos;\n let parameters = this.parseParameters(tn, isConstructor);\n if (!parameters) return null;\n let thisType = this.parseParametersThis;\n if (isConstructor) {\n for (let i = 0, k = parameters.length; i < k; ++i) {\n let parameter = parameters[i];\n if (parameter.isAny(\n CommonFlags.PUBLIC |\n CommonFlags.PROTECTED |\n CommonFlags.PRIVATE |\n CommonFlags.READONLY\n )) {\n let implicitFieldDeclaration = Node.createFieldDeclaration(\n parameter.name,\n parameter.type,\n null, // initialized via parameter\n null,\n parameter.flags | CommonFlags.INSTANCE,\n parameter.range\n );\n implicitFieldDeclaration.parameterIndex = i;\n implicitFieldDeclaration.parent = parent;\n parameter.implicitFieldDeclaration = implicitFieldDeclaration;\n parent.members.push(implicitFieldDeclaration);\n }\n }\n } else if (isGetter) {\n if (parameters.length) {\n this.error(\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\n name.range\n );\n }\n } else if (isSetter) {\n if (parameters.length != 1) {\n this.error(\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\n name.range\n );\n }\n if (parameters.length && parameters[0].initializer) {\n this.error(\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\n name.range\n );\n }\n }\n\n let returnType: CommonTypeNode | null = null;\n if (tn.skip(Token.COLON)) {\n if (name.kind == NodeKind.CONSTRUCTOR) {\n this.error(\n DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration,\n tn.range()\n );\n } else if (isSetter) {\n this.error(\n DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation,\n tn.range()\n );\n }\n returnType = this.parseType(tn, name.kind == NodeKind.CONSTRUCTOR || isSetter);\n if (!returnType) return null;\n } else {\n returnType = Node.createOmittedType(tn.range(tn.pos));\n if (!isSetter && name.kind != NodeKind.CONSTRUCTOR) {\n this.error(\n DiagnosticCode.Type_expected,\n returnType.range\n ); // recoverable\n }\n }\n\n let signature = Node.createSignature(\n parameters,\n returnType,\n thisType,\n false,\n tn.range(signatureStart, tn.pos)\n );\n\n let body: Statement | null = null;\n if (tn.skip(Token.OPENBRACE)) {\n if (flags & CommonFlags.AMBIENT) {\n this.error(\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\n tn.range()\n ); // recoverable\n } else if (flags & CommonFlags.ABSTRACT) {\n this.error(\n DiagnosticCode.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract,\n tn.range(), name.text\n ); // recoverable\n }\n body = this.parseBlockStatement(tn, false);\n if (!body) return null;\n } else if (!(flags & CommonFlags.AMBIENT) && !isInterface) {\n this.error(\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\n tn.range()\n ); // recoverable\n }\n\n let retMethod = Node.createMethodDeclaration(\n name,\n typeParameters,\n signature,\n body,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return retMethod;\n\n } else if (isConstructor) {\n this.error(\n DiagnosticCode.Constructor_implementation_is_missing,\n name.range\n );\n\n } else if (isGetter || isSetter) {\n this.error(\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\n name.range\n );\n\n // field: (':' Type)? ('=' Expression)? ';'?\n } else {\n if (flags & CommonFlags.ABSTRACT) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(abstractStart, abstractEnd), \"abstract\"\n ); // recoverable\n }\n\n if (flags & CommonFlags.GET) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(getStart, getEnd), \"get\"\n ); // recoverable\n }\n\n if (flags & CommonFlags.SET) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(setStart, setEnd), \"set\"\n ); // recoverable\n }\n\n let type: CommonTypeNode | null = null;\n if (tn.skip(Token.QUESTION)) {\n this.error(\n DiagnosticCode.Optional_properties_are_not_supported,\n tn.range(startPos, tn.pos)\n );\n }\n if (tn.skip(Token.EXCLAMATION)) {\n flags |= CommonFlags.DEFINITE_ASSIGNMENT;\n }\n if (tn.skip(Token.COLON)) {\n type = this.parseType(tn);\n if (!type) return null;\n } else {\n this.error(\n DiagnosticCode.Type_expected,\n tn.range()\n ); // recoverable\n }\n let initializer: Expression | null = null;\n if (tn.skip(Token.EQUALS)) {\n initializer = this.parseExpression(tn);\n if (!initializer) return null;\n }\n let range = tn.range(startPos, tn.pos);\n if ((flags & CommonFlags.DEFINITE_ASSIGNMENT) && ((flags & CommonFlags.STATIC) || isInterface || initializer)) {\n this.error(\n DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,\n range\n );\n }\n let retField = Node.createFieldDeclaration(\n name,\n type,\n initializer,\n decorators,\n flags,\n range\n );\n tn.skip(Token.SEMICOLON);\n return retField;\n }\n return null;\n }\n\n parseIndexSignatureDeclaration(tn: Tokenizer, decorators: DecoratorNode[]): IndexSignatureDeclaration | null {\n\n // at: '[': 'key' ':' Type ']' ':' Type\n\n if (decorators.length) {\n this.error(\n DiagnosticCode.Decorators_are_not_valid_here,\n Range.join(decorators[0].range, decorators[decorators.length - 1].range)\n ); // recoverable\n }\n\n var start = tn.tokenPos;\n if (tn.skipIdentifier()) {\n let id = tn.readIdentifier();\n if (id == \"key\") {\n if (tn.skip(Token.COLON)) {\n let keyType = this.parseType(tn);\n if (!keyType) return null;\n if (keyType.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Type_expected,\n tn.range()\n );\n return null;\n }\n if (tn.skip(Token.CLOSEBRACKET)) {\n if (tn.skip(Token.COLON)) {\n let valueType = this.parseType(tn);\n if (!valueType) return null;\n return Node.createIndexSignatureDeclaration(keyType, valueType, tn.range(start, tn.pos));\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"]\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"key\"\n );\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseNamespace(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): NamespaceDeclaration | null {\n\n // at 'namespace': Identifier '{' (Variable | Function)* '}'\n\n if (tn.skipIdentifier()) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n if (tn.skip(Token.OPENBRACE)) {\n let members = new Array();\n let ns = Node.createNamespaceDeclaration(\n identifier,\n members,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n while (!tn.skip(Token.CLOSEBRACE)) {\n let member = this.parseTopLevelStatement(tn, ns);\n if (!member) return null;\n member.parent = ns;\n members.push(member);\n }\n tn.skip(Token.SEMICOLON);\n return ns;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseExport(\n tn: Tokenizer,\n flags: CommonFlags,\n startPos: i32\n ): ExportStatement | null {\n\n // at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?\n\n var path: StringLiteralExpression | null = null;\n if (tn.skip(Token.OPENBRACE)) {\n let members = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let member = this.parseExportMember(tn);\n if (!member) return null;\n members.push(member);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACE)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n return null;\n }\n }\n }\n if (tn.skip(Token.FROM)) {\n if (tn.skip(Token.STRINGLITERAL)) {\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\n } else {\n this.error(\n DiagnosticCode.String_literal_expected,\n tn.range()\n );\n return null;\n }\n }\n let ret = Node.createExportStatement(members, path, flags, tn.range(startPos, tn.pos));\n let internalPath = ret.internalPath;\n if (internalPath !== null && !this.seenlog.has(internalPath)) {\n this.backlog.push(internalPath);\n this.seenlog.add(internalPath);\n }\n tn.skip(Token.SEMICOLON);\n return ret;\n } else if (tn.skip(Token.ASTERISK)) {\n if (tn.skip(Token.FROM)) {\n if (tn.skip(Token.STRINGLITERAL)) {\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\n let ret = Node.createExportStatement(null, path, flags, tn.range(startPos, tn.pos));\n let internalPath = assert(ret.internalPath);\n let source = tn.source;\n if (!source.exportPaths) source.exportPaths = new Set();\n source.exportPaths.add(internalPath);\n if (!this.seenlog.has(internalPath)) {\n this.backlog.push(internalPath);\n this.seenlog.add(internalPath);\n }\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode.String_literal_expected,\n tn.range()\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"from\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n }\n return null;\n }\n\n parseExportMember(\n tn: Tokenizer\n ): ExportMember | null {\n\n // before: Identifier ('as' Identifier)?\n\n if (tn.skipIdentifier()) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let asIdentifier: IdentifierExpression | null = null;\n if (tn.skip(Token.AS)) {\n if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n }\n return Node.createExportMember(\n identifier,\n asIdentifier,\n asIdentifier\n ? Range.join(identifier.range, asIdentifier.range)\n : identifier.range\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseImport(\n tn: Tokenizer\n ): ImportStatement | null {\n\n // at 'import':\n // ('{' (ImportMember (',' ImportMember)* '}') | ('*' 'as' Identifier)?\n // 'from' StringLiteral ';'?\n\n var startPos = tn.tokenPos;\n var members: ImportDeclaration[] | null = null;\n var namespaceName: IdentifierExpression | null = null;\n var skipFrom = false;\n if (tn.skip(Token.OPENBRACE)) {\n members = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let member = this.parseImportDeclaration(tn);\n if (!member) return null;\n members.push(member);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACE)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n return null;\n }\n }\n }\n } else if (tn.skip(Token.ASTERISK)) {\n if (tn.skip(Token.AS)) {\n if (tn.skipIdentifier()) {\n namespaceName = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"as\"\n );\n return null;\n }\n } else {\n skipFrom = true;\n }\n\n if (skipFrom || tn.skip(Token.FROM)) {\n if (tn.skip(Token.STRINGLITERAL)) {\n let path = Node.createStringLiteralExpression(tn.readString(), tn.range());\n let ret: ImportStatement;\n if (namespaceName) {\n assert(!members);\n ret = Node.createImportStatementWithWildcard(namespaceName, path, tn.range(startPos, tn.pos));\n } else {\n ret = Node.createImportStatement(members, path, tn.range(startPos, tn.pos));\n }\n let internalPath = ret.internalPath;\n if (!this.seenlog.has(internalPath)) {\n this.backlog.push(internalPath);\n this.seenlog.add(internalPath);\n }\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode.String_literal_expected,\n tn.range()\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"from\"\n );\n }\n return null;\n }\n\n parseImportDeclaration(\n tn: Tokenizer\n ): ImportDeclaration | null {\n\n // before: Identifier ('as' Identifier)?\n\n if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let asIdentifier: IdentifierExpression | null = null;\n if (tn.skip(Token.AS)) {\n if (tn.skipIdentifier()) {\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n }\n return Node.createImportDeclaration(\n identifier,\n asIdentifier,\n asIdentifier\n ? Range.join(identifier.range, asIdentifier.range)\n : identifier.range\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseExportImport(\n tn: Tokenizer,\n startPos: i32\n ): ExportImportStatement | null {\n\n // at 'export' 'import': Identifier ('=' Identifier)? ';'?\n\n if (tn.skipIdentifier()) {\n let asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n if (tn.skip(Token.EQUALS)) {\n if (tn.skipIdentifier()) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let ret = Node.createExportImportStatement(identifier, asIdentifier, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"=\"\n );\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseStatement(\n tn: Tokenizer,\n topLevel: bool = false\n ): Statement | null {\n\n // at previous token\n\n var state = tn.mark();\n var token = tn.next();\n var statement: Statement | null = null;\n switch (token) {\n case Token.BREAK: {\n statement = this.parseBreak(tn);\n break;\n }\n case Token.CONST: {\n statement = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\n break;\n }\n case Token.CONTINUE: {\n statement = this.parseContinue(tn);\n break;\n }\n case Token.DO: {\n statement = this.parseDoStatement(tn);\n break;\n }\n case Token.FOR: {\n statement = this.parseForStatement(tn);\n break;\n }\n case Token.IF: {\n statement = this.parseIfStatement(tn);\n break;\n }\n case Token.LET: {\n statement = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\n break;\n }\n case Token.VAR: {\n statement = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\n break;\n }\n case Token.OPENBRACE: {\n statement = this.parseBlockStatement(tn, topLevel);\n break;\n }\n case Token.RETURN: {\n if (topLevel) {\n this.error(\n DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body,\n tn.range()\n ); // recoverable\n }\n statement = this.parseReturn(tn);\n break;\n }\n case Token.SEMICOLON: {\n return Node.createEmptyStatement(tn.range(tn.tokenPos));\n }\n case Token.SWITCH: {\n statement = this.parseSwitchStatement(tn);\n break;\n }\n case Token.THROW: {\n statement = this.parseThrowStatement(tn);\n break;\n }\n case Token.TRY: {\n statement = this.parseTryStatement(tn);\n break;\n }\n case Token.VOID: {\n statement = this.parseVoidStatement(tn);\n break;\n }\n case Token.WHILE: {\n statement = this.parseWhileStatement(tn);\n break;\n }\n case Token.TYPE: { // also identifier\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\n statement = this.parseTypeDeclaration(tn, CommonFlags.NONE, null, tn.tokenPos);\n break;\n }\n // fall-through\n }\n default: {\n tn.reset(state);\n statement = this.parseExpressionStatement(tn);\n break;\n }\n }\n if (!statement) { // has been reported\n tn.reset(state);\n this.skipStatement(tn);\n } else {\n tn.discard(state);\n }\n return statement;\n }\n\n parseBlockStatement(\n tn: Tokenizer,\n topLevel: bool\n ): BlockStatement | null {\n\n // at '{': Statement* '}' ';'?\n\n var startPos = tn.tokenPos;\n var statements = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let state = tn.mark();\n let statement = this.parseStatement(tn, topLevel);\n if (!statement) {\n if (tn.token == Token.ENDOFFILE) return null;\n tn.reset(state);\n this.skipStatement(tn);\n } else {\n tn.discard(state);\n statements.push(statement);\n }\n }\n var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseBreak(\n tn: Tokenizer\n ): BreakStatement | null {\n\n // at 'break': Identifier? ';'?\n\n var identifier: IdentifierExpression | null = null;\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\n tn.next(IdentifierHandling.PREFER);\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n }\n var ret = Node.createBreakStatement(identifier, tn.range());\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseContinue(\n tn: Tokenizer\n ): ContinueStatement | null {\n\n // at 'continue': Identifier? ';'?\n\n var identifier: IdentifierExpression | null = null;\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\n tn.next(IdentifierHandling.PREFER);\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n }\n var ret = Node.createContinueStatement(identifier, tn.range());\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseDoStatement(\n tn: Tokenizer\n ): DoStatement | null {\n\n // at 'do': Statement 'while' '(' Expression ')' ';'?\n\n var startPos = tn.tokenPos;\n var statement = this.parseStatement(tn);\n if (!statement) return null;\n\n if (tn.skip(Token.WHILE)) {\n\n if (tn.skip(Token.OPENPAREN)) {\n let condition = this.parseExpression(tn);\n if (!condition) return null;\n\n if (tn.skip(Token.CLOSEPAREN)) {\n let ret = Node.createDoStatement(statement, condition, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"while\"\n );\n }\n return null;\n }\n\n parseExpressionStatement(\n tn: Tokenizer\n ): ExpressionStatement | null {\n\n // at previous token\n\n var expr = this.parseExpression(tn);\n if (!expr) return null;\n\n var ret = Node.createExpressionStatement(expr);\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseForStatement(\n tn: Tokenizer\n ): ForStatement | null {\n\n // at 'for': '(' Statement? Expression? ';' Expression? ')' Statement\n\n var startPos = tn.tokenPos;\n\n if (tn.skip(Token.OPENPAREN)) {\n let initializer: Statement | null = null;\n\n if (tn.skip(Token.CONST)) {\n initializer = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\n } else if (tn.skip(Token.LET)) {\n initializer = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\n } else if (tn.skip(Token.VAR)) {\n initializer = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\n\n } else if (!tn.skip(Token.SEMICOLON)) {\n initializer = this.parseExpressionStatement(tn);\n if (!initializer) return null;\n }\n\n if (tn.token == Token.SEMICOLON) {\n let condition: ExpressionStatement | null = null;\n if (!tn.skip(Token.SEMICOLON)) {\n condition = this.parseExpressionStatement(tn);\n if (!condition) return null;\n }\n\n if (tn.token == Token.SEMICOLON) {\n let incrementor: Expression | null = null;\n if (!tn.skip(Token.CLOSEPAREN)) {\n incrementor = this.parseExpression(tn);\n if (!incrementor) return null;\n\n if (!tn.skip(Token.CLOSEPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n }\n\n let statement = this.parseStatement(tn);\n if (!statement) return null;\n\n return Node.createForStatement(\n initializer,\n condition\n ? condition.expression\n : null,\n incrementor,\n statement,\n tn.range(startPos, tn.pos)\n );\n\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \";\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \";\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n return null;\n }\n\n parseIfStatement(\n tn: Tokenizer\n ): IfStatement | null {\n\n // at 'if': '(' Expression ')' Statement ('else' Statement)?\n\n var startPos = tn.tokenPos;\n if (tn.skip(Token.OPENPAREN)) {\n let condition = this.parseExpression(tn);\n if (!condition) return null;\n if (tn.skip(Token.CLOSEPAREN)) {\n let statement = this.parseStatement(tn);\n if (!statement) return null;\n let elseStatement: Statement | null = null;\n if (tn.skip(Token.ELSE)) {\n elseStatement = this.parseStatement(tn);\n if (!elseStatement) return null;\n }\n return Node.createIfStatement(\n condition,\n statement,\n elseStatement,\n tn.range(startPos, tn.pos)\n );\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n return null;\n }\n\n parseSwitchStatement(\n tn: Tokenizer\n ): SwitchStatement | null {\n\n // at 'switch': '(' Expression ')' '{' SwitchCase* '}' ';'?\n\n var startPos = tn.tokenPos;\n if (tn.skip(Token.OPENPAREN)) {\n let condition = this.parseExpression(tn);\n if (!condition) return null;\n if (tn.skip(Token.CLOSEPAREN)) {\n if (tn.skip(Token.OPENBRACE)) {\n let cases = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let case_ = this.parseSwitchCase(tn);\n if (!case_) return null;\n cases.push(case_);\n }\n let ret = Node.createSwitchStatement(condition, cases, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n return null;\n }\n\n parseSwitchCase(\n tn: Tokenizer\n ): SwitchCase | null {\n\n var startPos = tn.tokenPos;\n var statements: Statement[],\n statement: Statement | null;\n\n // 'case' Expression ':' Statement*\n\n if (tn.skip(Token.CASE)) {\n let label = this.parseExpression(tn);\n if (!label) return null;\n if (tn.skip(Token.COLON)) {\n statements = new Array();\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\n statement = this.parseStatement(tn);\n if (!statement) return null;\n statements.push(statement);\n }\n return Node.createSwitchCase(label, statements, tn.range(startPos, tn.pos));\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n }\n\n // 'default' ':' Statement*\n\n } else if (tn.skip(Token.DEFAULT)) {\n if (tn.skip(Token.COLON)) {\n statements = new Array();\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\n statement = this.parseStatement(tn);\n if (!statement) return null;\n statements.push(statement);\n }\n return Node.createSwitchCase(null, statements, tn.range(startPos, tn.pos));\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._case_or_default_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseThrowStatement(\n tn: Tokenizer\n ): ThrowStatement | null {\n\n // at 'throw': Expression ';'?\n\n var startPos = tn.tokenPos;\n var expression = this.parseExpression(tn);\n if (!expression) return null;\n var ret = Node.createThrowStatement(expression, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseTryStatement(\n tn: Tokenizer\n ): TryStatement | null {\n\n // at 'try':\n // '{' Statement* '}'\n // ('catch' '(' VariableMember ')' '{' Statement* '}')?\n // ('finally' '{' Statement* '}'? ';'?\n\n var startPos = tn.tokenPos;\n var stmt: Statement | null;\n if (tn.skip(Token.OPENBRACE)) {\n let statements = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n stmt = this.parseStatement(tn);\n if (!stmt) return null;\n statements.push(stmt);\n }\n let catchVariable: IdentifierExpression | null = null;\n let catchStatements: Statement[] | null = null;\n let finallyStatements: Statement[] | null = null;\n if (tn.skip(Token.CATCH)) {\n if (!tn.skip(Token.OPENPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n return null;\n }\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n catchVariable = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n if (!tn.skip(Token.CLOSEPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n return null;\n }\n catchStatements = [];\n while (!tn.skip(Token.CLOSEBRACE)) {\n stmt = this.parseStatement(tn);\n if (!stmt) return null;\n catchStatements.push(stmt);\n }\n }\n if (tn.skip(Token.FINALLY)) {\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n return null;\n }\n finallyStatements = [];\n while (!tn.skip(Token.CLOSEBRACE)) {\n stmt = this.parseStatement(tn);\n if (!stmt) return null;\n finallyStatements.push(stmt);\n }\n }\n if (!(catchStatements || finallyStatements)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"catch\"\n );\n return null;\n }\n let ret = Node.createTryStatement(\n statements,\n catchVariable,\n catchStatements,\n finallyStatements,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n }\n return null;\n }\n\n parseTypeDeclaration(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): TypeDeclaration | null {\n\n // at 'type': Identifier ('<' TypeParameters '>')? '=' Type ';'?\n\n if (tn.skipIdentifier()) {\n let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let typeParameters: TypeParameterNode[] | null = null;\n if (tn.skip(Token.LESSTHAN)) {\n typeParameters = this.parseTypeParameters(tn);\n if (!typeParameters) return null;\n flags |= CommonFlags.GENERIC;\n }\n if (tn.skip(Token.EQUALS)) {\n let type = this.parseType(tn);\n if (!type) return null;\n let ret = Node.createTypeDeclaration(\n name,\n typeParameters,\n type,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"=\"\n );\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseVoidStatement(\n tn: Tokenizer\n ): VoidStatement | null {\n\n // at 'void': Expression ';'?\n\n var startPos = tn.tokenPos;\n var expression = this.parseExpression(tn, Precedence.GROUPING);\n if (!expression) return null;\n var ret = Node.createVoidStatement(expression, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseWhileStatement(\n tn: Tokenizer\n ): WhileStatement | null {\n\n // at 'while': '(' Expression ')' Statement ';'?\n\n var startPos = tn.tokenPos;\n if (tn.skip(Token.OPENPAREN)) {\n let expression = this.parseExpression(tn);\n if (!expression) return null;\n if (tn.skip(Token.CLOSEPAREN)) {\n let statement = this.parseStatement(tn);\n if (!statement) return null;\n let ret = Node.createWhileStatement(expression, statement, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n return null;\n }\n\n // expressions\n // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing\n\n parseExpressionStart(\n tn: Tokenizer\n ): Expression | null {\n\n var token = tn.next(IdentifierHandling.PREFER);\n var startPos = tn.tokenPos;\n var precedence = determinePrecedenceStart(token);\n if (precedence != Precedence.NONE) {\n let operand: Expression | null;\n\n // TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)\n\n // NewExpression\n if (token == Token.NEW) {\n operand = this.parseExpression(tn, Precedence.CALL);\n if (!operand) return null;\n if (operand.kind == NodeKind.CALL) {\n return Node.createNewExpression(\n (operand).expression,\n (operand).typeArguments,\n (operand).arguments,\n tn.range(startPos, tn.pos)\n );\n } else {\n this.error(\n DiagnosticCode.Operation_not_supported,\n tn.range()\n );\n }\n return null;\n } else {\n operand = this.parseExpression(tn, precedence);\n if (!operand) return null;\n }\n\n // UnaryPrefixExpression\n if (token == Token.PLUS_PLUS || token == Token.MINUS_MINUS) {\n if (\n operand.kind != NodeKind.IDENTIFIER &&\n operand.kind != NodeKind.ELEMENTACCESS &&\n operand.kind != NodeKind.PROPERTYACCESS\n ) {\n this.error(\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\n operand.range\n );\n }\n }\n return Node.createUnaryPrefixExpression(token, operand, tn.range(startPos, tn.pos));\n }\n\n var expr: Expression | null = null;\n switch (token) {\n\n case Token.NULL: return Node.createNullExpression(tn.range());\n case Token.TRUE: return Node.createTrueExpression(tn.range());\n case Token.FALSE: return Node.createFalseExpression(tn.range());\n\n // ParenthesizedExpression\n // FunctionExpression\n case Token.OPENPAREN: {\n\n // determine whether this is a function expression\n if (tn.skip(Token.CLOSEPAREN)) { // must be a function expression (fast route)\n return this.parseFunctionExpressionCommon(\n tn,\n Node.createEmptyIdentifierExpression(tn.range(startPos)),\n [],\n true\n );\n }\n let state = tn.mark();\n let again = true;\n do {\n switch (tn.next(IdentifierHandling.PREFER)) {\n\n // function expression\n case Token.DOT_DOT_DOT: {\n tn.reset(state);\n return this.parseFunctionExpression(tn);\n }\n // can be both\n case Token.IDENTIFIER: {\n tn.readIdentifier();\n switch (tn.next()) {\n\n // if we got here, check for arrow\n case Token.CLOSEPAREN: {\n if (\n !tn.skip(Token.COLON) &&\n !tn.skip(Token.EQUALS_GREATERTHAN)\n ) {\n again = false;\n break;\n }\n // fall-through\n }\n // function expression\n case Token.COLON: { // type annotation\n tn.reset(state);\n return this.parseFunctionExpression(tn);\n }\n // optional parameter or parenthesized\n case Token.QUESTION: {\n if (\n tn.skip(Token.COLON) || // optional parameter with type\n tn.skip(Token.COMMA) || // optional parameter without type\n tn.skip(Token.CLOSEPAREN) // last optional parameter without type\n ) {\n tn.reset(state);\n return this.parseFunctionExpression(tn);\n }\n again = false; // parenthesized\n break;\n }\n case Token.COMMA: {\n break; // continue\n }\n // parenthesized expression\n // case Token.EQUALS: // missing type annotation for simplicity\n default: {\n again = false;\n break;\n }\n }\n break;\n }\n // parenthesized expression\n default: {\n again = false;\n break;\n }\n }\n } while (again);\n tn.reset(state);\n\n // parse parenthesized\n expr = this.parseExpression(tn);\n if (!expr) return null;\n if (!tn.skip(Token.CLOSEPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n return Node.createParenthesizedExpression(expr, tn.range(startPos, tn.pos));\n }\n // ArrayLiteralExpression\n case Token.OPENBRACKET: {\n let elementExpressions = new Array();\n while (!tn.skip(Token.CLOSEBRACKET)) {\n if (tn.peek() == Token.COMMA) {\n expr = null; // omitted\n } else {\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!expr) return null;\n }\n elementExpressions.push(expr);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACKET)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"]\"\n );\n return null;\n }\n }\n }\n return Node.createArrayLiteralExpression(elementExpressions, tn.range(startPos, tn.pos));\n }\n // ObjectLiteralExpression\n case Token.OPENBRACE: {\n let startPos = tn.tokenPos;\n let names = new Array();\n let values = new Array();\n let name: IdentifierExpression;\n while (!tn.skip(Token.CLOSEBRACE)) {\n if (!tn.skipIdentifier()) {\n if (!tn.skip(Token.STRINGLITERAL)) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range(),\n );\n return null;\n }\n name = Node.createIdentifierExpression(tn.readString(), tn.range());\n name.set(CommonFlags.QUOTED);\n } else {\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n }\n names.push(name);\n if (tn.skip(Token.COLON)) {\n let value = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!value) return null;\n values.push(value);\n } else if (!name.is(CommonFlags.QUOTED)) {\n values.push(name);\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n return null;\n }\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACE)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n return null;\n }\n }\n }\n return Node.createObjectLiteralExpression(names, values, tn.range(startPos, tn.pos));\n }\n // AssertionExpression (unary prefix)\n case Token.LESSTHAN: {\n let toType = this.parseType(tn);\n if (!toType) return null;\n if (!tn.skip(Token.GREATERTHAN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \">\"\n );\n return null;\n }\n expr = this.parseExpression(tn, Precedence.CALL);\n if (!expr) return null;\n return Node.createAssertionExpression(\n AssertionKind.PREFIX,\n expr,\n toType,\n tn.range(startPos, tn.pos)\n );\n }\n case Token.IDENTIFIER: {\n return Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));\n }\n case Token.THIS: {\n return Node.createThisExpression(tn.range(startPos, tn.pos));\n }\n case Token.CONSTRUCTOR: {\n return Node.createConstructorExpression(tn.range(startPos, tn.pos));\n }\n case Token.SUPER: {\n if (tn.peek() != Token.DOT && tn.nextToken != Token.OPENPAREN) {\n this.error(\n DiagnosticCode._super_must_be_followed_by_an_argument_list_or_member_access,\n tn.range()\n );\n }\n return Node.createSuperExpression(tn.range(startPos, tn.pos));\n }\n case Token.STRINGLITERAL: {\n return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos));\n }\n case Token.INTEGERLITERAL: {\n return Node.createIntegerLiteralExpression(tn.readInteger(), tn.range(startPos, tn.pos));\n }\n case Token.FLOATLITERAL: {\n return Node.createFloatLiteralExpression(tn.readFloat(), tn.range(startPos, tn.pos));\n }\n // RegexpLiteralExpression\n // note that this also continues on invalid ones so the surrounding AST remains intact\n case Token.SLASH: {\n let regexpPattern = tn.readRegexpPattern(); // also reports\n if (!tn.skip(Token.SLASH)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"/\"\n );\n return null;\n }\n return Node.createRegexpLiteralExpression(\n regexpPattern,\n tn.readRegexpFlags(), // also reports\n tn.range(startPos, tn.pos)\n );\n }\n case Token.FUNCTION: {\n return this.parseFunctionExpression(tn);\n }\n case Token.CLASS: {\n return this.parseClassExpression(tn);\n }\n default: {\n if (token == Token.ENDOFFILE) {\n this.error(\n DiagnosticCode.Unexpected_end_of_text,\n tn.range(startPos)\n );\n } else {\n this.error(\n DiagnosticCode.Expression_expected,\n tn.range()\n );\n }\n return null;\n }\n }\n }\n\n tryParseTypeArgumentsBeforeArguments(\n tn: Tokenizer\n ): CommonTypeNode[] | null {\n\n // at '<': Type (',' Type)* '>' '('\n\n var state = tn.mark();\n if (!tn.skip(Token.LESSTHAN)) return null;\n var typeArguments = new Array();\n do {\n if (tn.peek() === Token.GREATERTHAN) {\n break;\n }\n let type = this.parseType(tn, true, true);\n if (!type) {\n tn.reset(state);\n return null;\n }\n typeArguments.push(type);\n } while (tn.skip(Token.COMMA));\n if (tn.skip(Token.GREATERTHAN) && tn.skip(Token.OPENPAREN)) {\n return typeArguments;\n }\n tn.reset(state);\n return null;\n }\n\n parseArguments(\n tn: Tokenizer\n ): Expression[] | null {\n\n // at '(': (Expression (',' Expression)*)? ')'\n\n var args = new Array();\n while (!tn.skip(Token.CLOSEPAREN)) {\n let expr = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!expr) return null;\n args.push(expr);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEPAREN)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n }\n }\n return args;\n }\n\n parseExpression(\n tn: Tokenizer,\n precedence: Precedence = Precedence.COMMA\n ): Expression | null {\n assert(precedence != Precedence.NONE);\n\n var expr = this.parseExpressionStart(tn);\n if (!expr) return null;\n expr = this.maybeParseCallExpression(tn, expr); // simple call like on an Identifier\n\n var startPos = expr.range.start;\n var token: Token;\n var next: Expression | null = null;\n var nextPrecedence: Precedence;\n while (\n (nextPrecedence = determinePrecedence(token = tn.peek())) >= precedence\n ) { // precedence climbing\n tn.next();\n switch (token) {\n // AssertionExpression\n case Token.AS: {\n let toType = this.parseType(tn); // reports\n if (!toType) return null;\n expr = Node.createAssertionExpression(\n AssertionKind.AS,\n expr,\n toType,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n case Token.EXCLAMATION: {\n expr = Node.createAssertionExpression(\n AssertionKind.NONNULL,\n expr,\n null,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // InstanceOfExpression\n case Token.INSTANCEOF: {\n let isType = this.parseType(tn); // reports\n if (!isType) return null;\n expr = Node.createInstanceOfExpression(\n expr,\n isType,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // ElementAccessExpression\n case Token.OPENBRACKET: {\n next = this.parseExpression(tn); // reports\n if (!next) return null;\n if (!tn.skip(Token.CLOSEBRACKET)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"]\"\n );\n return null;\n }\n expr = Node.createElementAccessExpression(\n expr,\n next,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // UnaryPostfixExpression\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS: {\n if (\n expr.kind != NodeKind.IDENTIFIER &&\n expr.kind != NodeKind.ELEMENTACCESS &&\n expr.kind != NodeKind.PROPERTYACCESS\n ) {\n this.error(\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\n expr.range\n );\n }\n expr = Node.createUnaryPostfixExpression(\n token,\n expr,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // TernaryExpression\n case Token.QUESTION: {\n let ifThen = this.parseExpression(tn);\n if (!ifThen) return null;\n if (!tn.skip(Token.COLON)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n return null;\n }\n let ifElse = this.parseExpression(tn, precedence > Precedence.COMMA\n ? Precedence.COMMA + 1\n : Precedence.COMMA\n );\n if (!ifElse) return null;\n expr = Node.createTernaryExpression(\n expr,\n ifThen,\n ifElse,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // CommaExpression\n case Token.COMMA: {\n let commaExprs: Expression[] = [ expr ];\n do {\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!expr) return null;\n commaExprs.push(expr);\n } while (tn.skip(Token.COMMA));\n expr = Node.createCommaExpression(commaExprs, tn.range(startPos, tn.pos));\n break;\n }\n default: {\n\n // PropertyAccessExpression\n if (token == Token.DOT) {\n if (tn.skipIdentifier()) {\n next = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n next = this.parseExpression(tn,\n isRightAssociative(token)\n ? nextPrecedence\n : nextPrecedence + 1\n );\n if (!next) return null;\n }\n if (next.kind == NodeKind.IDENTIFIER) { // expr '.' Identifier\n expr = Node.createPropertyAccessExpression(\n expr,\n next,\n tn.range(startPos, tn.pos)\n );\n } else if (next.kind == NodeKind.CALL) { // expr '.' CallExpression\n expr = this.joinPropertyCall(tn, startPos, expr, next);\n if (!expr) return null;\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n next.range\n );\n return null;\n }\n\n // BinaryExpression\n } else {\n next = this.parseExpression(tn,\n isRightAssociative(token)\n ? nextPrecedence\n : nextPrecedence + 1\n );\n if (!next) return null;\n expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));\n }\n break;\n }\n }\n expr = this.maybeParseCallExpression(tn, expr); // compound call like on an ElementAccess\n }\n return expr;\n }\n\n private joinPropertyCall(\n tn: Tokenizer,\n startPos: i32,\n expr: Expression,\n call: CallExpression\n ): Expression | null {\n var callee = call.expression;\n switch (callee.kind) {\n case NodeKind.IDENTIFIER: { // join property access and use as call target\n call.expression = Node.createPropertyAccessExpression(\n expr,\n callee,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n case NodeKind.CALL: { // join call target und wrap the original call around it\n let inner = this.joinPropertyCall(tn, startPos, expr, callee);\n if (!inner) return null;\n call.expression = inner;\n call.range = tn.range(startPos, tn.pos);\n break;\n }\n default: {\n this.error(\n DiagnosticCode.Identifier_expected,\n call.range\n );\n return null;\n }\n }\n return call;\n }\n\n private maybeParseCallExpression(\n tn: Tokenizer,\n expr: Expression\n ): Expression {\n if (nodeIsCallable(expr.kind)) {\n let typeArguments: CommonTypeNode[] | null = null;\n while (\n tn.skip(Token.OPENPAREN)\n ||\n nodeIsGenericCallable(expr.kind) && (typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null\n ) {\n let args = this.parseArguments(tn);\n if (!args) break;\n expr = Node.createCallExpression( // is again callable\n expr,\n typeArguments,\n args,\n tn.range(expr.range.start, tn.pos)\n );\n }\n }\n return expr;\n }\n\n /** Skips over a statement on errors in an attempt to reduce unnecessary diagnostic noise. */\n skipStatement(tn: Tokenizer): void {\n tn.peek(true);\n if (tn.nextTokenOnNewLine) tn.next(); // if reset() to the previous line\n do {\n let nextToken = tn.peek(true);\n if (\n nextToken == Token.ENDOFFILE || // next step should handle this\n nextToken == Token.SEMICOLON // end of the statement for sure\n ) {\n tn.next();\n break;\n }\n if (tn.nextTokenOnNewLine) break; // end of the statement maybe\n switch (tn.next()) {\n case Token.IDENTIFIER: {\n tn.readIdentifier();\n break;\n }\n case Token.STRINGLITERAL: {\n tn.readString();\n break;\n }\n case Token.INTEGERLITERAL: {\n tn.readInteger();\n break;\n }\n case Token.FLOATLITERAL: {\n tn.readFloat();\n break;\n }\n }\n } while (true);\n }\n\n /** Skips over a block on errors in an attempt to reduce unnecessary diagnostic noise. */\n skipBlock(tn: Tokenizer): void {\n // at '{': ... '}'\n var depth = 1;\n var again = true;\n do {\n switch (tn.next()) {\n case Token.ENDOFFILE: {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n again = false;\n break;\n }\n case Token.OPENBRACE: {\n ++depth;\n break;\n }\n case Token.CLOSEBRACE: {\n --depth;\n if (!depth) again = false;\n break;\n }\n case Token.IDENTIFIER: {\n tn.readIdentifier();\n break;\n }\n case Token.STRINGLITERAL: {\n tn.readString();\n break;\n }\n case Token.INTEGERLITERAL: {\n tn.readInteger();\n break;\n }\n case Token.FLOATLITERAL: {\n tn.readFloat();\n break;\n }\n }\n } while (again);\n }\n}\n\n/** Operator precedence from least to largest. */\nexport const enum Precedence {\n NONE,\n COMMA,\n SPREAD,\n YIELD,\n ASSIGNMENT,\n CONDITIONAL,\n LOGICAL_OR,\n LOGICAL_AND,\n BITWISE_OR,\n BITWISE_XOR,\n BITWISE_AND,\n EQUALITY,\n RELATIONAL,\n SHIFT,\n ADDITIVE,\n MULTIPLICATIVE,\n EXPONENTIATED,\n UNARY_PREFIX,\n UNARY_POSTFIX,\n CALL,\n MEMBERACCESS,\n GROUPING\n}\n\n/** Determines the precedence of a starting token. */\nfunction determinePrecedenceStart(kind: Token): Precedence {\n switch (kind) {\n case Token.DOT_DOT_DOT: return Precedence.SPREAD;\n case Token.YIELD: return Precedence.YIELD;\n case Token.EXCLAMATION:\n case Token.TILDE:\n case Token.PLUS:\n case Token.MINUS:\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS:\n case Token.TYPEOF:\n case Token.VOID:\n case Token.DELETE: return Precedence.UNARY_PREFIX;\n case Token.NEW: return Precedence.MEMBERACCESS;\n }\n return Precedence.NONE;\n}\n\n/** Determines the precende of a non-starting token. */\nfunction determinePrecedence(kind: Token): Precedence {\n switch (kind) {\n case Token.COMMA: return Precedence.COMMA;\n case Token.EQUALS:\n case Token.PLUS_EQUALS:\n case Token.MINUS_EQUALS:\n case Token.ASTERISK_ASTERISK_EQUALS:\n case Token.ASTERISK_EQUALS:\n case Token.SLASH_EQUALS:\n case Token.PERCENT_EQUALS:\n case Token.LESSTHAN_LESSTHAN_EQUALS:\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\n case Token.AMPERSAND_EQUALS:\n case Token.CARET_EQUALS:\n case Token.BAR_EQUALS: return Precedence.ASSIGNMENT;\n case Token.QUESTION: return Precedence.CONDITIONAL;\n case Token.BAR_BAR: return Precedence.LOGICAL_OR;\n case Token.AMPERSAND_AMPERSAND: return Precedence.LOGICAL_AND;\n case Token.BAR: return Precedence.BITWISE_OR;\n case Token.CARET: return Precedence.BITWISE_XOR;\n case Token.AMPERSAND: return Precedence.BITWISE_AND;\n case Token.EQUALS_EQUALS:\n case Token.EXCLAMATION_EQUALS:\n case Token.EQUALS_EQUALS_EQUALS:\n case Token.EXCLAMATION_EQUALS_EQUALS: return Precedence.EQUALITY;\n case Token.AS:\n case Token.IN:\n case Token.INSTANCEOF:\n case Token.LESSTHAN:\n case Token.GREATERTHAN:\n case Token.LESSTHAN_EQUALS:\n case Token.GREATERTHAN_EQUALS: return Precedence.RELATIONAL;\n case Token.LESSTHAN_LESSTHAN:\n case Token.GREATERTHAN_GREATERTHAN:\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return Precedence.SHIFT;\n case Token.PLUS:\n case Token.MINUS: return Precedence.ADDITIVE;\n case Token.ASTERISK:\n case Token.SLASH:\n case Token.PERCENT: return Precedence.MULTIPLICATIVE;\n case Token.ASTERISK_ASTERISK: return Precedence.EXPONENTIATED;\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS: return Precedence.UNARY_POSTFIX;\n case Token.DOT:\n case Token.NEW:\n case Token.OPENBRACKET:\n case Token.EXCLAMATION: return Precedence.MEMBERACCESS;\n }\n return Precedence.NONE;\n}\n\n/** Determines whether a non-starting token is right associative. */\nfunction isRightAssociative(kind: Token): bool {\n switch (kind) {\n case Token.EQUALS:\n case Token.PLUS_EQUALS:\n case Token.MINUS_EQUALS:\n case Token.ASTERISK_ASTERISK_EQUALS:\n case Token.ASTERISK_EQUALS:\n case Token.SLASH_EQUALS:\n case Token.PERCENT_EQUALS:\n case Token.LESSTHAN_LESSTHAN_EQUALS:\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\n case Token.AMPERSAND_EQUALS:\n case Token.CARET_EQUALS:\n case Token.BAR_EQUALS:\n case Token.QUESTION:\n case Token.ASTERISK_ASTERISK: return true;\n default: return false;\n }\n}\n","/**\n * JavaScript glue code.\n * @module glue/js\n * @preferred\n *//***/\n\n/// \n\nimport \"./binaryen\"; // must be first so portable can pick up the memory implementation\nimport \"../../../std/portable/index\";\nimport \"./float\";\nimport \"./i64\";\n\nimport { Module } from \"../../module\";\n\nModule.prototype.toText = function(this: Module) {\n return binaryen.wrapModule(this.ref).emitStackIR();\n};\n\nModule.prototype.toAsmjs = function(this: Module) {\n return binaryen.wrapModule(this.ref).emitAsmjs();\n};\n","// Copy Binaryen exports to global scope\n\nconst binaryen = global.Binaryen || require(\"binaryen\");\nglobal.binaryen = binaryen;\n\nfor (var key in binaryen) {\n if (key.startsWith(\"_Binaryen\") || key.startsWith(\"_Relooper\")) global[key] = binaryen[key];\n}\n\n// Utilize Binaryen's heap\n\nglobal.__memory_allocate = binaryen._malloc;\nglobal.__memory_free = binaryen._free;\nglobal.__memory_copy = binaryen._memmove;\nglobal.__store = function(ptr, val) { binaryen.HEAPU8[ptr] = val; };\nglobal.__load = function(ptr) { return binaryen.HEAPU8[ptr]; };\n","module.exports = __WEBPACK_EXTERNAL_MODULE__18__;","/** @module std/portable *//***/\n\nvar globalScope = typeof window !== \"undefined\" && window || typeof global !== \"undefined\" && global || self;\n\nglobalScope.ASC_TARGET = 0; // JS\nglobalScope.ASC_NO_TREESHAKING = false;\nglobalScope.ASC_NO_ASSERT = false;\nglobalScope.ASC_MEMORY_BASE = 0;\nglobalScope.ASC_OPTIMIZE_LEVEL = 3;\nglobalScope.ASC_SHRINK_LEVEL = 0;\nglobalScope.ASC_FEATURE_MUTABLE_GLOBAL = false;\nglobalScope.ASC_FEATURE_SIGN_EXTENSION = false;\nglobalScope.ASC_FEATURE_BULK_MEMORY = false;\nglobalScope.ASC_FEATURE_SIMD = false;\nglobalScope.ASC_FEATURE_THREADS = false;\n\nvar F64 = new Float64Array(1);\nvar U64 = new Uint32Array(F64.buffer);\n\nObject.defineProperties(\n globalScope[\"i8\"] = function i8(value) { return value << 24 >> 24; }\n, {\n \"MIN_VALUE\": { value: -128, writable: false },\n \"MAX_VALUE\": { value: 127, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"i16\"] = function i16(value) { return value << 16 >> 16; }\n, {\n \"MIN_VALUE\": { value: -32768, writable: false },\n \"MAX_VALUE\": { value: 32767, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"i32\"] = globalScope[\"isize\"] = function i32(value) { return value | 0; }\n, {\n \"MIN_VALUE\": { value: -2147483648, writable: false },\n \"MAX_VALUE\": { value: 2147483647, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"u8\"] = function u8(value) { return value & 0xff; }\n, {\n \"MIN_VALUE\": { value: 0, writable: false },\n \"MAX_VALUE\": { value: 255, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"u16\"] = function u16(value) { return value & 0xffff; }\n, {\n \"MIN_VALUE\": { value: 0, writable: false },\n \"MAX_VALUE\": { value: 65535, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"u32\"] = globalScope[\"usize\"] = function u32(value) { return value >>> 0; }\n, {\n \"MIN_VALUE\": { value: 0, writable: false },\n \"MAX_VALUE\": { value: 4294967295, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"bool\"] = function bool(value) { return !!value; }\n, {\n \"MIN_VALUE\": { value: false, writable: false },\n \"MAX_VALUE\": { value: true, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"f32\"] = function f32(value) { return Math.fround(value); }\n, {\n \"EPSILON\": { value: Math.fround(1.1920929e-07), writable: false },\n \"MIN_VALUE\": { value: Math.fround(1.4012985e-45), writable: false },\n \"MAX_VALUE\": { value: Math.fround(3.4028235e+38), writable: false },\n \"MIN_NORMAL_VALUE\": { value: Math.fround(1.17549435e-38), writable: false },\n \"MIN_SAFE_INTEGER\": { value: -16777215, writable: false },\n \"MAX_SAFE_INTEGER\": { value: 16777215, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"f64\"] = function f64(value) { return +value; }\n, {\n \"EPSILON\": { value: 2.2204460492503131e-16, writable: false },\n \"MIN_VALUE\": { value: 5e-324, writable: false },\n \"MAX_VALUE\": { value: 1.7976931348623157e+308, writable: false },\n \"MIN_NORMAL_VALUE\": { value: 2.2250738585072014e-308 , writable: false },\n \"MIN_SAFE_INTEGER\": { value: -9007199254740991, writable: false },\n \"MAX_SAFE_INTEGER\": { value: 9007199254740991, writable: false }\n});\n\nglobalScope[\"clz\"] = Math.clz32;\n\nglobalScope[\"ctz\"] = function ctz(value) {\n var c = Math.clz32(value & -value);\n return value ? 31 - c : c;\n};\n\nglobalScope[\"popcnt\"] = function popcnt(value) {\n value -= value >>> 1 & 0x55555555;\n value = (value & 0x33333333) + (value >>> 2 & 0x33333333);\n return (((value + (value >>> 4)) & 0x0F0F0F0F) * 0x01010101) >>> 24;\n};\n\nglobalScope[\"rotl\"] = function rotl(value, shift) {\n shift &= 31;\n return (value << shift) | (value >>> (32 - shift));\n};\n\nglobalScope[\"rotr\"] = function rotr(value, shift) {\n shift &= 31;\n return (value >>> shift) | (value << (32 - shift));\n};\n\nglobalScope[\"abs\"] = Math.abs;\n\nglobalScope[\"max\"] = Math.max;\n\nglobalScope[\"min\"] = Math.min;\n\nglobalScope[\"ceil\"] = Math.ceil;\n\nglobalScope[\"floor\"] = Math.floor;\n\n// Adopt code from https://github.com/rfk/wasm-polyfill\nglobalScope[\"nearest\"] = function nearest(value) {\n if (Math.abs(value - Math.trunc(value)) === 0.5) {\n return 2.0 * Math.round(value * 0.5);\n }\n return Math.round(value);\n};\n\nglobalScope[\"select\"] = function select(ifTrue, ifFalse, condition) {\n return condition ? ifTrue : ifFalse;\n};\n\nglobalScope[\"sqrt\"] = Math.sqrt;\n\nglobalScope[\"trunc\"] = Math.trunc;\n\nglobalScope[\"copysign\"] = function copysign(x, y) {\n return Math.abs(x) * Math.sign(y);\n};\n\nglobalScope[\"bswap\"] = function bswap(value) {\n var a = value >> 8 & 0x00FF00FF;\n var b = (value & 0x00FF00FF) << 8;\n value = a | b;\n a = value >> 16 & 0x0000FFFF;\n b = (value & 0x0000FFFF) << 16;\n return a | b;\n};\n\nglobalScope[\"bswap16\"] = function bswap16(value) {\n return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);\n};\n\nfunction UnreachableError() {\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, UnreachableError);\n } else {\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\n }\n}\nUnreachableError.prototype = Object.create(Error.prototype);\nUnreachableError.prototype.name = \"UnreachableError\";\nUnreachableError.prototype.message = \"unreachable\";\n\nglobalScope[\"unreachable\"] = function unreachable() {\n throw new UnreachableError();\n};\n\nfunction AssertionError(message) {\n this.message = message || \"assertion failed\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AssertionError);\n } else {\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\n }\n}\nAssertionError.prototype = Object.create(Error.prototype);\nAssertionError.prototype.name = \"AssertionError\";\n\nglobalScope[\"assert\"] = function assert(isTrueish, message) {\n if (isTrueish) return isTrueish;\n throw new AssertionError(message);\n};\n\nglobalScope[\"changetype\"] = function changetype(value) {\n return value;\n};\n\nglobalScope[\"parseI32\"] = function parseI32(str, radix) {\n return parseInt(str, undefined) | 0;\n};\n\nString[\"fromCharCodes\"] = function fromCharCodes(arr) {\n return String.fromCharCode.apply(String, arr);\n};\n\nString[\"fromCodePoints\"] = function fromCodePoints(arr) {\n return String.fromCodePoint.apply(String, arr);\n};\n\nglobalScope[\"isInteger\"] = Number.isInteger;\n\nglobalScope[\"isFloat\"] = function isFloat(arg) {\n return typeof arg === \"number\";\n};\n\nglobalScope[\"isReference\"] = function isReference(arg) {\n return typeof arg === \"object\" || typeof arg === \"string\";\n};\n\nglobalScope[\"isString\"] = function isString(arg) {\n return typeof arg === \"string\" || arg instanceof String;\n};\n\nglobalScope[\"isArray\"] = Array.isArray;\n\nglobalScope[\"isDefined\"] = function isDefined(expr) {\n return typeof expr !== \"undefined\";\n}\n\nglobalScope[\"isConstant\"] = function isConstant(expr) {\n return false;\n};\n\nglobalScope[\"unchecked\"] = function unchecked(expr) {\n return expr;\n};\n\nglobalScope[\"fmod\"] = function fmod(x, y) {\n return x % y;\n};\n\nglobalScope[\"fmodf\"] = function fmodf(x, y) {\n return Math.fround(x % y);\n};\n\nglobalScope[\"JSMath\"] = Math;\nglobalScope[\"JSMath\"].signbit = function signbit(x) {\n F64[0] = x; return Boolean((U64[1] >>> 31) & (x == x));\n}\n\nglobalScope[\"memory\"] = (() => {\n var HEAP = new Uint8Array(0);\n var HEAP_OFFSET = 0;\n return {\n allocate: globalScope[\"__memory_allocate\"] || function allocate(size) {\n if (!(size >>>= 0)) return 0;\n if (HEAP_OFFSET + size > HEAP.length) {\n var oldHeap = HEAP;\n HEAP = new Uint8Array(Math.max(65536, HEAP.length + size, HEAP.length * 2));\n HEAP.set(oldHeap);\n }\n var ptr = HEAP_OFFSET;\n if ((HEAP_OFFSET += size) & 7) HEAP_OFFSET = (HEAP_OFFSET | 7) + 1;\n return ptr;\n },\n fill: globalScope[\"__memory_fill\"] || function fill(dest, value, size) {\n HEAP.fill(value, dest, dest + size);\n },\n free: globalScope[\"__memory_free\"] || function free(ptr) { },\n copy: globalScope[\"__memory_copy\"] || function copy(dest, src, size) {\n HEAP.copyWithin(dest, src, src + size);\n },\n reset: globalScope[\"__memory_reset\"] || function reset() {\n HEAP = new Uint8Array(0);\n HEAP_OFFSET = 0;\n }\n };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[(ptr | 0) + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[(ptr | 0) + (offset | 0)];\n};\n","const F64 = new Float64Array(1);\nconst F32 = new Float32Array(F64.buffer);\nconst I32 = new Int32Array(F64.buffer);\n\nglobal.f32_as_i32 = function(value) {\n F32[0] = value;\n return I32[0];\n};\n\nglobal.i32_as_f32 = function(value) {\n I32[0] = value;\n return F32[0];\n};\n\nglobal.f64_as_i64 = function(value) {\n F64[0] = value;\n return i64_new(I32[0], I32[1]);\n};\n\nglobal.i64_as_f64 = function(value) {\n I32[0] = i64_low(value);\n I32[1] = i64_high(value);\n return F64[0];\n};\n","const Long = global.Long || require(\"long\");\n\nglobal.i64_zero = Long.ZERO;\n\nglobal.i64_one = Long.ONE;\n\nglobal.i64_new = function(lo, hi) {\n return Long.fromBits(lo, hi);\n};\n\nglobal.i64_low = function(value) {\n return value.low;\n};\n\nglobal.i64_high = function(value) {\n return value.high;\n};\n\nglobal.i64_add = function(left, right) {\n return left.add(right);\n};\n\nglobal.i64_sub = function(left, right) {\n return left.sub(right);\n};\n\nglobal.i64_mul = function(left, right) {\n return left.mul(right);\n};\n\nglobal.i64_div = function(left, right) {\n return left.div(right);\n};\n\nglobal.i64_div_u = function(left, right) {\n return left.toUnsigned().div(right.toUnsigned()).toSigned();\n};\n\nglobal.i64_rem = function(left, right) {\n return left.mod(right);\n};\n\nglobal.i64_rem_u = function(left, right) {\n return left.toUnsigned().mod(right.toUnsigned()).toSigned();\n};\n\nglobal.i64_and = function(left, right) {\n return left.and(right);\n};\n\nglobal.i64_or = function(left, right) {\n return left.or(right);\n};\n\nglobal.i64_xor = function(left, right) {\n return left.xor(right);\n};\n\nglobal.i64_shl = function(left, right) {\n return left.shl(right);\n};\n\nglobal.i64_shr = function(left, right) {\n return left.shr(right);\n};\n\nglobal.i64_shr_u = function(left, right) {\n return left.shru(right);\n};\n\nglobal.i64_not = function(value) {\n return value.not();\n};\n\nglobal.i64_eq = function(left, right) {\n return left.eq(right);\n};\n\nglobal.i64_ne = function(left, right) {\n return left.ne(right);\n};\n\nglobal.i64_align = function(value, alignment) {\n assert(alignment && (alignment & (alignment - 1)) == 0);\n var mask = Long.fromInt(alignment - 1);\n return value.add(mask).and(mask.not());\n};\n\nglobal.i64_is_i8 = function(value) {\n return value.high === 0 && (value.low >= 0 && value.low <= i8.MAX_VALUE)\n || value.high === -1 && (value.low >= i8.MIN_VALUE && value.low < 0);\n};\n\nglobal.i64_is_i16 = function(value) {\n return value.high === 0 && (value.low >= 0 && value.low <= i16.MAX_VALUE)\n || value.high === -1 && (value.low >= i16.MIN_VALUE && value.low < 0);\n};\n\nglobal.i64_is_i32 = function(value) {\n return (value.high === 0 && value.low >= 0)\n || (value.high === -1 && value.low < 0);\n};\n\nglobal.i64_is_u8 = function(value) {\n return value.high === 0 && value.low >= 0 && value.low <= u8.MAX_VALUE;\n};\n\nglobal.i64_is_u16 = function(value) {\n return value.high === 0 && value.low >= 0 && value.low <= u16.MAX_VALUE;\n};\n\nglobal.i64_is_u32 = function(value) {\n return value.high === 0;\n};\n\nglobal.i64_is_bool = function(value) {\n return value.high === 0 && (value.low === 0 || value.low === 1);\n};\n\nconst minSafeF32 = Long.fromNumber(f32.MIN_SAFE_INTEGER);\nconst maxSafeF32 = Long.fromNumber(f32.MAX_SAFE_INTEGER);\n\nglobal.i64_is_f32 = function(value) {\n return value.gte(minSafeF32) && value.lte(maxSafeF32);\n};\n\nconst minSafeF64 = Long.fromNumber(f64.MIN_SAFE_INTEGER);\nconst maxSafeF64 = Long.fromNumber(f64.MAX_SAFE_INTEGER);\n\nglobal.i64_is_f64 = function(value) {\n return value.gte(minSafeF64) && value.lte(maxSafeF64);\n};\n\nglobal.i64_to_f32 = function(value) {\n return global.Math.fround(value.toNumber());\n};\n\nglobal.i64_to_f64 = function(value) {\n return value.toNumber();\n};\n\nglobal.i64_to_string = function(value, unsigned) {\n return (unsigned ? value.toUnsigned() : value).toString(10);\n};\n","module.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n ])), {}).exports;\r\n} catch (e) {\r\n // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n * See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n /**\r\n * The low 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.low = low | 0;\r\n\r\n /**\r\n * The high 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.high = high | 0;\r\n\r\n /**\r\n * Whether unsigned or not.\r\n * @type {boolean}\r\n */\r\n this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations. For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative). Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n var obj, cachedObj, cache;\r\n if (unsigned) {\r\n value >>>= 0;\r\n if (cache = (0 <= value && value < 256)) {\r\n cachedObj = UINT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n if (cache)\r\n UINT_CACHE[value] = obj;\r\n return obj;\r\n } else {\r\n value |= 0;\r\n if (cache = (-128 <= value && value < 128)) {\r\n cachedObj = INT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n if (cache)\r\n INT_CACHE[value] = obj;\r\n return obj;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n if (isNaN(value))\r\n return unsigned ? UZERO : ZERO;\r\n if (unsigned) {\r\n if (value < 0)\r\n return UZERO;\r\n if (value >= TWO_PWR_64_DBL)\r\n return MAX_UNSIGNED_VALUE;\r\n } else {\r\n if (value <= -TWO_PWR_63_DBL)\r\n return MIN_VALUE;\r\n if (value + 1 >= TWO_PWR_63_DBL)\r\n return MAX_VALUE;\r\n }\r\n if (value < 0)\r\n return fromNumber(-value, unsigned).neg();\r\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n * assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n if (str.length === 0)\r\n throw Error('empty string');\r\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n return ZERO;\r\n if (typeof unsigned === 'number') {\r\n // For goog.math.long compatibility\r\n radix = unsigned,\r\n unsigned = false;\r\n } else {\r\n unsigned = !! unsigned;\r\n }\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n\r\n var p;\r\n if ((p = str.indexOf('-')) > 0)\r\n throw Error('interior hyphen');\r\n else if (p === 0) {\r\n return fromString(str.substring(1), unsigned, radix).neg();\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n var result = ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i),\r\n value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = fromNumber(pow_dbl(radix, size));\r\n result = result.mul(power).add(fromNumber(value));\r\n } else {\r\n result = result.mul(radixToPower);\r\n result = result.add(fromNumber(value));\r\n }\r\n }\r\n result.unsigned = unsigned;\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n if (typeof val === 'number')\r\n return fromNumber(val, unsigned);\r\n if (typeof val === 'string')\r\n return fromString(val, unsigned);\r\n // Throws for non-objects, converts non-instanceof Long:\r\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n if (this.unsigned)\r\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n if (this.isZero())\r\n return '0';\r\n if (this.isNegative()) { // Unsigned Longs are never negative\r\n if (this.eq(MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = fromNumber(radix),\r\n div = this.div(radixLong),\r\n rem1 = div.mul(radixLong).sub(this);\r\n return div.toString(radix) + rem1.toInt().toString(radix);\r\n } else\r\n return '-' + this.neg().toString(radix);\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower),\r\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n digits = intval.toString(radix);\r\n rem = remDiv;\r\n if (rem.isZero())\r\n return digits + result;\r\n else {\r\n while (digits.length < 6)\r\n digits = '0' + digits;\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n if (this.isNegative()) // Unsigned Longs are never negative\r\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n var val = this.high != 0 ? this.high : this.low;\r\n for (var bit = 31; bit > 0; bit--)\r\n if ((val & (1 << bit)) != 0)\r\n break;\r\n return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n return false;\r\n return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.eq(other))\r\n return 0;\r\n var thisNeg = this.isNegative(),\r\n otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg)\r\n return -1;\r\n if (!thisNeg && otherNeg)\r\n return 1;\r\n // At this point the sign bits are the same\r\n if (!this.unsigned)\r\n return this.sub(other).isNegative() ? -1 : 1;\r\n // Both are positive if at least one is unsigned\r\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n if (!this.unsigned && this.eq(MIN_VALUE))\r\n return MIN_VALUE;\r\n return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n if (!isLong(addend))\r\n addend = fromValue(addend);\r\n\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = addend.high >>> 16;\r\n var b32 = addend.high & 0xFFFF;\r\n var b16 = addend.low >>> 16;\r\n var b00 = addend.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n if (!isLong(subtrahend))\r\n subtrahend = fromValue(subtrahend);\r\n return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n if (this.isZero())\r\n return ZERO;\r\n if (!isLong(multiplier))\r\n multiplier = fromValue(multiplier);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = wasm.mul(this.low,\r\n this.high,\r\n multiplier.low,\r\n multiplier.high);\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (multiplier.isZero())\r\n return ZERO;\r\n if (this.eq(MIN_VALUE))\r\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n if (multiplier.eq(MIN_VALUE))\r\n return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n if (this.isNegative()) {\r\n if (multiplier.isNegative())\r\n return this.neg().mul(multiplier.neg());\r\n else\r\n return this.neg().mul(multiplier).neg();\r\n } else if (multiplier.isNegative())\r\n return this.mul(multiplier.neg()).neg();\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = multiplier.high >>> 16;\r\n var b32 = multiplier.high & 0xFFFF;\r\n var b16 = multiplier.low >>> 16;\r\n var b00 = multiplier.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n * unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n if (divisor.isZero())\r\n throw Error('division by zero');\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n // guard against signed division overflow: the largest\r\n // negative number / -1 would be 1 larger than the largest\r\n // positive number, due to two's complement.\r\n if (!this.unsigned &&\r\n this.high === -0x80000000 &&\r\n divisor.low === -1 && divisor.high === -1) {\r\n // be consistent with non-wasm code path\r\n return this;\r\n }\r\n var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (this.isZero())\r\n return this.unsigned ? UZERO : ZERO;\r\n var approx, rem, res;\r\n if (!this.unsigned) {\r\n // This section is only relevant for signed longs and is derived from the\r\n // closure library as a whole.\r\n if (this.eq(MIN_VALUE)) {\r\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n else if (divisor.eq(MIN_VALUE))\r\n return ONE;\r\n else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shr(1);\r\n approx = halfThis.div(divisor).shl(1);\r\n if (approx.eq(ZERO)) {\r\n return divisor.isNegative() ? ONE : NEG_ONE;\r\n } else {\r\n rem = this.sub(divisor.mul(approx));\r\n res = approx.add(rem.div(divisor));\r\n return res;\r\n }\r\n }\r\n } else if (divisor.eq(MIN_VALUE))\r\n return this.unsigned ? UZERO : ZERO;\r\n if (this.isNegative()) {\r\n if (divisor.isNegative())\r\n return this.neg().div(divisor.neg());\r\n return this.neg().div(divisor).neg();\r\n } else if (divisor.isNegative())\r\n return this.div(divisor.neg()).neg();\r\n res = ZERO;\r\n } else {\r\n // The algorithm below has not been made for unsigned longs. It's therefore\r\n // required to take special care of the MSB prior to running it.\r\n if (!divisor.unsigned)\r\n divisor = divisor.toUnsigned();\r\n if (divisor.gt(this))\r\n return UZERO;\r\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n return UONE;\r\n res = UZERO;\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n rem = this;\r\n while (rem.gte(divisor)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n approxRes = fromNumber(approx),\r\n approxRem = approxRes.mul(divisor);\r\n while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n approx -= delta;\r\n approxRes = fromNumber(approx, this.unsigned);\r\n approxRem = approxRes.mul(divisor);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero())\r\n approxRes = ONE;\r\n\r\n res = res.add(approxRes);\r\n rem = rem.sub(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n else\r\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n else\r\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n numBits &= 63;\r\n if (numBits === 0)\r\n return this;\r\n else {\r\n var high = this.high;\r\n if (numBits < 32) {\r\n var low = this.low;\r\n return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n } else if (numBits === 32)\r\n return fromBits(high, 0, this.unsigned);\r\n else\r\n return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n if (!this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n if (this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n lo & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo >>> 16 & 0xff,\r\n lo >>> 24 ,\r\n hi & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi >>> 16 & 0xff,\r\n hi >>> 24\r\n ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n hi >>> 24 ,\r\n hi >>> 16 & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi & 0xff,\r\n lo >>> 24 ,\r\n lo >>> 16 & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo & 0xff\r\n ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n return new Long(\r\n bytes[0] |\r\n bytes[1] << 8 |\r\n bytes[2] << 16 |\r\n bytes[3] << 24,\r\n bytes[4] |\r\n bytes[5] << 8 |\r\n bytes[6] << 16 |\r\n bytes[7] << 24,\r\n unsigned\r\n );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n return new Long(\r\n bytes[4] << 24 |\r\n bytes[5] << 16 |\r\n bytes[6] << 8 |\r\n bytes[7],\r\n bytes[0] << 24 |\r\n bytes[1] << 16 |\r\n bytes[2] << 8 |\r\n bytes[3],\r\n unsigned\r\n );\r\n};\r\n","/**\n * Built-in elements providing WebAssembly core functionality.\n * @module builtins\n *//***/\n\n import {\n Compiler,\n ConversionKind,\n WrapMode,\n Feature\n} from \"./compiler\";\n\nimport {\n DiagnosticCode\n} from \"./diagnostics\";\n\nimport {\n Node,\n NodeKind,\n Expression,\n LiteralKind,\n LiteralExpression,\n StringLiteralExpression,\n CallExpression\n} from \"./ast\";\n\nimport {\n Type,\n TypeKind,\n TypeFlags\n} from \"./types\";\n\nimport {\n BinaryOp,\n UnaryOp,\n HostOp,\n NativeType,\n ExpressionRef,\n ExpressionId,\n getExpressionId,\n getExpressionType,\n getConstValueI64High,\n getConstValueI64Low,\n getConstValueI32,\n AtomicRMWOp\n} from \"./module\";\n\nimport {\n ElementKind,\n FunctionPrototype,\n Class,\n Field,\n OperatorKind,\n FlowFlags,\n Global,\n DecoratorFlags,\n Element\n} from \"./program\";\n\nimport {\n ReportMode\n} from \"./resolver\";\n\nimport {\n CommonFlags\n} from \"./common\";\n\n/** Compiles a call to a built-in function. */\nexport function compileCall(\n compiler: Compiler,\n prototype: FunctionPrototype,\n typeArguments: Type[] | null,\n operands: Expression[],\n contextualType: Type,\n reportNode: CallExpression\n): ExpressionRef {\n var module = compiler.module;\n\n var arg0: ExpressionRef,\n arg1: ExpressionRef,\n arg2: ExpressionRef,\n ret: ExpressionRef;\n\n // NOTE that some implementations below make use of the select expression where straight-forward.\n // whether worth or not should probably be tested once it's known if/how embedders handle it.\n // search: createSelect\n\n switch (prototype.internalName) {\n\n // types\n\n case \"isInteger\": { // isInteger() / isInteger(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return type.is(TypeFlags.INTEGER) && !type.is(TypeFlags.REFERENCE)\n ? module.createI32(1)\n : module.createI32(0);\n }\n case \"isFloat\": { // isFloat() / isFloat(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return type.is(TypeFlags.FLOAT)\n ? module.createI32(1)\n : module.createI32(0);\n }\n case \"isSigned\": { // isSigned() / isSigned(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return type.is(TypeFlags.SIGNED)\n ? module.createI32(1)\n : module.createI32(0);\n }\n case \"isReference\": { // isReference() / isReference(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return type.is(TypeFlags.REFERENCE)\n ? module.createI32(1)\n : module.createI32(0);\n }\n case \"isString\": { // isString() / isString(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n let classType = type.classReference;\n if (classType) {\n let stringInstance = compiler.program.stringInstance;\n if (stringInstance && classType.isAssignableTo(stringInstance)) return module.createI32(1);\n }\n return module.createI32(0);\n }\n case \"isArray\": { // isArray() / isArray(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n let classType = type.classReference;\n return (\n classType !== null && classType.prototype.extends(compiler.program.arrayPrototype)\n ) ? module.createI32(1) : module.createI32(0);\n }\n case \"isDefined\": { // isDefined(expression) -> bool\n compiler.currentType = Type.bool;\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n let element = compiler.resolver.resolveExpression(\n operands[0],\n compiler.currentFlow,\n Type.void,\n ReportMode.SWALLOW\n );\n return module.createI32(element ? 1 : 0);\n }\n case \"isConstant\": { // isConstant(expression) -> bool\n compiler.currentType = Type.bool;\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n let expr = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\n compiler.currentType = Type.bool;\n return module.createI32(getExpressionId(expr) == ExpressionId.Const ? 1 : 0);\n }\n case \"isManaged\": { // isManaged() -> bool\n if (!compiler.program.hasGC) {\n compiler.currentType = Type.bool;\n return module.createI32(0);\n }\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n let classType = type.classReference;\n return classType !== null && !classType.hasDecorator(DecoratorFlags.UNMANAGED)\n ? module.createI32(1)\n : module.createI32(0);\n }\n\n // math\n\n case \"clz\": { // clz(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16: {\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\n break;\n }\n case TypeKind.BOOL: // usually overflows\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.ClzI64\n : UnaryOp.ClzI32,\n arg0\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createUnary(UnaryOp.ClzI64, arg0);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"ctz\": { // ctz(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.NONE, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16: {\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\n break;\n }\n case TypeKind.BOOL: // usually overflows\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.CtzI64\n : UnaryOp.CtzI32,\n arg0\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createUnary(UnaryOp.CtzI64, arg0);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"popcnt\": { // popcnt(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16: {\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\n break;\n }\n case TypeKind.BOOL: // usually overflows\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.PopcntI64\n : UnaryOp.PopcntI32,\n arg0\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createUnary(UnaryOp.PopcntI64, arg0);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"rotl\": { // rotl(value: T, shift: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n ret = compiler.ensureSmallIntegerWrap(\n module.createBinary(BinaryOp.RotlI32, arg0, arg1),\n compiler.currentType\n );\n // fall-through\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createBinary(BinaryOp.RotlI32, arg0, arg1);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.RotlI64\n : BinaryOp.RotlI32,\n arg0,\n arg1\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createBinary(BinaryOp.RotlI64, arg0, arg1);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret; // possibly overflows\n }\n case \"rotr\": { // rotr(value: T, shift: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n ret = compiler.ensureSmallIntegerWrap(\n module.createBinary(BinaryOp.RotrI32, arg0, arg1),\n compiler.currentType\n );\n break;\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createBinary(BinaryOp.RotrI32, arg0, arg1);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.RotrI64\n : BinaryOp.RotrI32,\n arg0,\n arg1\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createBinary(BinaryOp.RotrI64, arg0, arg1);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret; // possibly overflowws\n }\n case \"abs\": { // abs(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n let flow = compiler.currentFlow;\n\n // possibly overflows, e.g. abs(-128) == 128\n let tempLocal1 = flow.getTempLocal(Type.i32, false);\n let tempLocalIndex2 = flow.getAndFreeTempLocal(Type.i32, false).index;\n let tempLocalIndex1 = tempLocal1.index;\n\n // (x + (x >> 31)) ^ (x >> 31)\n ret = module.createBinary(BinaryOp.XorI32,\n module.createBinary(BinaryOp.AddI32,\n module.createTeeLocal(\n tempLocalIndex2,\n module.createBinary(BinaryOp.ShrI32,\n module.createTeeLocal(tempLocalIndex1, arg0),\n module.createI32(31)\n )\n ),\n module.createGetLocal(tempLocalIndex1, NativeType.I32)\n ),\n module.createGetLocal(tempLocalIndex2, NativeType.I32)\n );\n\n flow.freeTempLocal(tempLocal1);\n break;\n }\n case TypeKind.ISIZE: {\n let options = compiler.options;\n let flow = compiler.currentFlow;\n let wasm64 = options.isWasm64;\n\n let tempLocal1 = flow.getTempLocal(options.usizeType, false);\n let tempLocalIndex2 = flow.getAndFreeTempLocal(options.usizeType, false).index;\n let tempLocalIndex1 = tempLocal1.index;\n\n ret = module.createBinary(wasm64 ? BinaryOp.XorI64 : BinaryOp.XorI32,\n module.createBinary(wasm64 ? BinaryOp.AddI64 : BinaryOp.AddI32,\n module.createTeeLocal(\n tempLocalIndex2,\n module.createBinary(wasm64 ? BinaryOp.ShrI64 : BinaryOp.ShrI32,\n module.createTeeLocal(tempLocalIndex1, arg0),\n wasm64 ? module.createI64(63) : module.createI32(31)\n )\n ),\n module.createGetLocal(tempLocalIndex1, options.nativeSizeType)\n ),\n module.createGetLocal(tempLocalIndex2, options.nativeSizeType)\n );\n\n flow.freeTempLocal(tempLocal1);\n break;\n }\n case TypeKind.I64: {\n let flow = compiler.currentFlow;\n\n let tempLocal1 = flow.getTempLocal(Type.i64, false);\n let tempLocalIndex2 = flow.getAndFreeTempLocal(Type.i64, false).index;\n let tempLocalIndex1 = tempLocal1.index;\n\n // (x + (x >> 63)) ^ (x >> 63)\n ret = module.createBinary(BinaryOp.XorI64,\n module.createBinary(BinaryOp.AddI64,\n module.createTeeLocal(\n tempLocalIndex2,\n module.createBinary(BinaryOp.ShrI64,\n module.createTeeLocal(tempLocalIndex1, arg0),\n module.createI64(63)\n )\n ),\n module.createGetLocal(tempLocalIndex1, NativeType.I64)\n ),\n module.createGetLocal(tempLocalIndex2, NativeType.I64)\n );\n\n flow.freeTempLocal(tempLocal1);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.U64:\n case TypeKind.BOOL: {\n ret = arg0;\n break;\n }\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.AbsF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.AbsF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n ret = module.createUnreachable();\n break;\n }\n default: { // void\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"max\": { // max(left: T, right: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n let tempLocal1 = flow.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg1, compiler.currentType)\n );\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal0.index, NativeType.I32),\n module.createGetLocal(tempLocal1.index, NativeType.I32)\n )\n );\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n let tempLocal1 = flow.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg1, compiler.currentType)\n );\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.GtU32,\n module.createGetLocal(tempLocal0.index, NativeType.I32),\n module.createGetLocal(tempLocal1.index, NativeType.I32)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal0.index, NativeType.I64),\n module.createGetLocal(tempLocal1.index, NativeType.I64)\n )\n );\n break;\n }\n case TypeKind.U64: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.GtU64,\n module.createGetLocal(tempLocal0.index, NativeType.I64),\n module.createGetLocal(tempLocal1.index, NativeType.I64)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\n )\n );\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtU64\n : BinaryOp.GtU32,\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\n )\n );\n break;\n }\n case TypeKind.F32: {\n ret = module.createBinary(BinaryOp.MaxF32, arg0, arg1);\n break;\n }\n case TypeKind.F64: {\n ret = module.createBinary(BinaryOp.MaxF64, arg0, arg1);\n break;\n }\n default: { // void\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"min\": { // min(left: T, right: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n let tempLocal1 = flow.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg1, compiler.currentType)\n );\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.LtI32,\n module.createGetLocal(tempLocal0.index, NativeType.I32),\n module.createGetLocal(tempLocal1.index, NativeType.I32)\n )\n );\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n let tempLocal1 = flow.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg1, compiler.currentType)\n );\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.LtU32,\n module.createGetLocal(tempLocal0.index, NativeType.I32),\n module.createGetLocal(tempLocal1.index, NativeType.I32)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.LtI64,\n module.createGetLocal(tempLocal0.index, NativeType.I64),\n module.createGetLocal(tempLocal1.index, NativeType.I64)\n )\n );\n break;\n }\n case TypeKind.U64: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.LtU64,\n module.createGetLocal(tempLocal0.index, NativeType.I64),\n module.createGetLocal(tempLocal1.index, NativeType.I64)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.LtI64\n : BinaryOp.LtI32,\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\n )\n );\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.LtU64\n : BinaryOp.LtU32,\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\n )\n );\n break;\n }\n case TypeKind.F32: {\n ret = module.createBinary(BinaryOp.MinF32, arg0, arg1);\n break;\n }\n case TypeKind.F64: {\n ret = module.createBinary(BinaryOp.MinF64, arg0, arg1);\n break;\n }\n default: { // void\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"ceil\": { // ceil(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n default: { // any integer\n ret = arg0;\n break;\n }\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.CeilF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.CeilF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"floor\": { // floor(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n default: { // any integer\n ret = arg0;\n break;\n }\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.FloorF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.FloorF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"copysign\": { // copysign(left: T, right: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\n switch (compiler.currentType.kind) { // TODO: does an integer version make sense?\n case TypeKind.F32: {\n ret = module.createBinary(BinaryOp.CopysignF32, arg0, arg1);\n break;\n }\n case TypeKind.F64: {\n ret = module.createBinary(BinaryOp.CopysignF64, arg0, arg1);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"nearest\": { // nearest(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n default: { // any integer\n ret = arg0;\n break;\n }\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.NearestF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.NearestF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"reinterpret\": { // reinterpret(value: *) -> T\n if (operands.length != 1) {\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n switch (typeArguments[0].kind) {\n case TypeKind.I32:\n case TypeKind.U32: {\n arg0 = compiler.compileExpression(operands[0], Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\n ret = module.createUnary(UnaryOp.ReinterpretF32, arg0);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.IMPLICIT, WrapMode.NONE);\n ret = module.createUnary(UnaryOp.ReinterpretF64, arg0);\n break;\n }\n case TypeKind.USIZE: {\n if (typeArguments[0].is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n compiler.currentType = typeArguments[0];\n return module.createUnreachable();\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.isWasm64\n ? Type.f64\n : Type.f32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n ret = module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.ReinterpretF64\n : UnaryOp.ReinterpretF32,\n arg0\n );\n break;\n }\n case TypeKind.F32: {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\n ret = module.createUnary(UnaryOp.ReinterpretI32, arg0);\n break;\n }\n case TypeKind.F64: {\n arg0 = compiler.compileExpression(operands[0], Type.i64, ConversionKind.IMPLICIT, WrapMode.NONE);\n ret = module.createUnary(UnaryOp.ReinterpretI64, arg0);\n break;\n }\n default: { // small integers and void\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n compiler.currentType = typeArguments[0];\n return ret;\n }\n case \"sqrt\": { // sqrt(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) { // TODO: integer versions (that return f64 or convert)?\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.SqrtF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.SqrtF64, arg0);\n break;\n }\n // case TypeKind.VOID:\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"trunc\": { // trunc(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments && typeArguments.length) {\n compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n default: { // any integer\n ret = arg0;\n break;\n }\n // TODO: truncate to contextual type directly (if not void etc.)?\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.TruncF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.TruncF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n\n // memory access\n\n case \"load\": { // load(offset: usize, constantOffset?: usize) -> *\n if (operands.length < 1 || operands.length > 2) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 1) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n let offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n compiler.currentType = typeArguments[0];\n return module.createLoad(\n typeArguments[0].byteSize,\n typeArguments[0].is(TypeFlags.SIGNED | TypeFlags.INTEGER),\n arg0,\n typeArguments[0].is(TypeFlags.INTEGER) &&\n contextualType.is(TypeFlags.INTEGER) &&\n contextualType.size > typeArguments[0].size\n ? (compiler.currentType = contextualType).toNativeType()\n : (compiler.currentType = typeArguments[0]).toNativeType(),\n offset\n );\n }\n case \"store\": { // store(offset: usize, value: *, constantOffset?: usize) -> void\n compiler.currentType = Type.void;\n if (operands.length < 2 || operands.length > 3) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 2) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n let type: Type;\n if (\n typeArguments[0].is(TypeFlags.INTEGER) &&\n (\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\n )\n ) {\n arg1 = compiler.convertExpression(\n arg1,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[1]\n );\n type = typeArguments[0];\n } else {\n type = compiler.currentType;\n }\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n compiler.currentType = Type.void;\n return module.createStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\n }\n case \"atomic.load\": { // load(offset: usize, constantOffset?: usize) -> *\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\n if (operands.length < 1 || operands.length > 2) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 1) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n let offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n compiler.currentType = typeArguments[0];\n return module.createAtomicLoad(\n typeArguments[0].byteSize,\n arg0,\n typeArguments[0].is(TypeFlags.INTEGER) &&\n contextualType.is(TypeFlags.INTEGER) &&\n contextualType.size > typeArguments[0].size\n ? (compiler.currentType = contextualType).toNativeType()\n : (compiler.currentType = typeArguments[0]).toNativeType(),\n offset\n );\n }\n case \"atomic.store\": { // store(offset: usize, value: *, constantOffset?: usize) -> void\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\n compiler.currentType = Type.void;\n if (operands.length < 2 || operands.length > 3) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 2) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n let type: Type;\n if (\n typeArguments[0].is(TypeFlags.INTEGER) &&\n (\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\n )\n ) {\n arg1 = compiler.convertExpression(\n arg1,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[1]\n );\n type = typeArguments[0];\n } else {\n type = compiler.currentType;\n }\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n compiler.currentType = Type.void;\n return module.createAtomicStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\n }\n case \"atomic.add\": // add(ptr: usize, value: T, constantOffset?: usize): T;\n case \"atomic.sub\": // sub(ptr: usize, value: T, constantOffset?: usize): T;\n case \"atomic.and\": // and(ptr: usize, value: T, constantOffset?: usize): T;\n case \"atomic.or\": // or(ptr: usize, value: T, constantOffset?: usize): T;\n case \"atomic.xor\": // xor(ptr: usize, value: T, constantOffset?: usize): T;\n case \"atomic.xchg\": // xchg(ptr: usize, value: T, constantOffset?: usize): T;\n {\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\n if (operands.length < 2 || operands.length > 3) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 2) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n\n let type: Type;\n if (\n typeArguments[0].is(TypeFlags.INTEGER) &&\n (\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\n )\n ) {\n arg1 = compiler.convertExpression(\n arg1,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[1]\n );\n type = typeArguments[0];\n } else {\n type = compiler.currentType;\n }\n\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n let RMWOp: AtomicRMWOp | null = null;\n switch (prototype.simpleName) {\n case \"add\": { RMWOp = AtomicRMWOp.Add; break; }\n case \"sub\": { RMWOp = AtomicRMWOp.Sub; break; }\n case \"and\": { RMWOp = AtomicRMWOp.And; break; }\n case \"or\": { RMWOp = AtomicRMWOp.Or; break; }\n case \"xor\": { RMWOp = AtomicRMWOp.Xor; break; }\n case \"xchg\": { RMWOp = AtomicRMWOp.Xchg; break; }\n }\n compiler.currentType = typeArguments[0];\n if (RMWOp !== null) {\n return module.createAtomicRMW(\n RMWOp, typeArguments[0].byteSize, offset, arg0, arg1, type.toNativeType()\n );\n } else {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n }\n case \"atomic.cmpxchg\": { // cmpxchg(ptr: usize, expected:T, replacement: T, constantOffset?: usize): T;\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\n if (operands.length < 3 || operands.length > 4) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 3) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg2 = compiler.compileExpression(\n operands[2],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n\n let type: Type;\n if (\n typeArguments[0].is(TypeFlags.INTEGER) &&\n (\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\n )\n ) {\n arg1 = compiler.convertExpression(\n arg1,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[1]\n );\n arg2 = compiler.convertExpression(\n arg2,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[2]\n );\n type = typeArguments[0];\n } else {\n type = compiler.currentType;\n }\n\n let offset = operands.length == 4 ? evaluateConstantOffset(compiler, operands[3]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n compiler.currentType = typeArguments[0];\n return module.createAtomicCmpxchg(\n typeArguments[0].byteSize, offset, arg0, arg1, arg2, type.toNativeType()\n );\n }\n case \"atomic.wait\": { // wait(ptr: usize, expected:T, timeout: i64): i32;\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\n let hasError = typeArguments == null;\n if (operands.length != 3) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n hasError = true;\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n hasError = true;\n }\n\n if (!typeArguments || hasError) {\n return module.createUnreachable();\n }\n\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg2 = compiler.compileExpression(\n operands[2],\n Type.i64,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n\n let type: Type = typeArguments[0];\n if (\n typeArguments[0].is(TypeFlags.INTEGER) &&\n (\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\n )\n ) {\n arg1 = compiler.convertExpression(\n arg1,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[1]\n );\n arg2 = compiler.convertExpression(\n arg2,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[2]\n );\n }\n\n return module.createAtomicWait(\n arg0, arg1, arg2, type.toNativeType()\n );\n }\n case \"atomic.notify\": { // notify(ptr: usize, count: u32): u32;\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\n let hasError = typeArguments == null;\n if (operands.length != 2) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n hasError = true;\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n hasError = true;\n }\n\n if (!typeArguments || hasError) {\n return module.createUnreachable();\n }\n\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n Type.i32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n\n return module.createAtomicWake(\n arg0, arg1\n );\n }\n case \"sizeof\": { // sizeof() -> usize\n compiler.currentType = compiler.options.usizeType;\n if (operands.length != 0) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n let byteSize = (typeArguments)[0].byteSize;\n if (compiler.options.isWasm64) {\n // implicitly wrap if contextual type is a 32-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\n compiler.currentType = Type.u32;\n ret = module.createI32(byteSize);\n } else {\n ret = module.createI64(byteSize, 0);\n }\n } else {\n // implicitly extend if contextual type is a 64-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\n compiler.currentType = Type.u64;\n ret = module.createI64(byteSize, 0);\n } else {\n ret = module.createI32(byteSize);\n }\n }\n return ret;\n }\n case \"alignof\": { // alignof() -> usize\n compiler.currentType = compiler.options.usizeType;\n if (operands.length != 0) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n let byteSize = (typeArguments)[0].byteSize;\n let alignLog2: i32;\n switch (byteSize) {\n case 1: { alignLog2 = 0; break; }\n case 2: { alignLog2 = 1; break; }\n case 4: { alignLog2 = 2; break; }\n case 8: { alignLog2 = 3; break; }\n default: { assert(false); return module.createUnreachable(); }\n }\n if (compiler.options.isWasm64) {\n // implicitly wrap if contextual type is a 32-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\n compiler.currentType = Type.u32;\n ret = module.createI32(alignLog2);\n } else {\n ret = module.createI64(alignLog2, 0);\n }\n } else {\n // implicitly extend if contextual type is a 64-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\n compiler.currentType = Type.u64;\n ret = module.createI64(alignLog2, 0);\n } else {\n ret = module.createI32(alignLog2);\n }\n }\n return ret;\n }\n case \"offsetof\": { // offsetof(fieldName?: string) -> usize\n compiler.currentType = compiler.options.usizeType;\n if (operands.length > 1) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n let classType = typeArguments[0].classReference;\n if (!classType) {\n compiler.error( // TODO: better error\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return module.createUnreachable();\n }\n let offset: i32;\n if (operands.length) {\n if (\n operands[0].kind != NodeKind.LITERAL ||\n (operands[0]).literalKind != LiteralKind.STRING\n ) {\n compiler.error(\n DiagnosticCode.String_literal_expected,\n operands[0].range\n );\n return module.createUnreachable();\n }\n let fieldName = (operands[0]).value;\n let field = classType.members ? classType.members.get(fieldName) : null;\n if (!(field && field.kind == ElementKind.FIELD)) {\n compiler.error(\n DiagnosticCode.Type_0_has_no_property_1,\n operands[0].range, classType.internalName, fieldName\n );\n return module.createUnreachable();\n }\n offset = (field).memoryOffset;\n } else {\n offset = classType.currentMemoryOffset;\n }\n if (compiler.options.isWasm64) {\n // implicitly wrap if contextual type is a 32-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\n compiler.currentType = Type.u32;\n return module.createI32(offset);\n } else {\n return module.createI64(offset);\n }\n } else {\n // implicitly extend if contextual type is a 64-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\n compiler.currentType = Type.u64;\n return module.createI64(offset);\n } else {\n return module.createI32(offset);\n }\n }\n }\n\n // control flow\n\n case \"select\": { // select(ifTrue: T, ifFalse: T, condition: bool) -> T\n if (operands.length != 3) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\n }\n let type = compiler.currentType;\n arg1 = compiler.compileExpression(operands[1], type, ConversionKind.IMPLICIT, WrapMode.NONE);\n arg2 = compiler.makeIsTrueish(\n compiler.compileExpressionRetainType(operands[2], Type.bool, WrapMode.NONE),\n compiler.currentType\n );\n compiler.currentType = type;\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n ret = module.createSelect(arg0, arg1, arg2);\n break;\n }\n default: { // any other value type\n ret = module.createSelect(arg0, arg1, arg2);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case \"unreachable\": { // unreachable() -> *\n if (operands.length != 0) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return module.createUnreachable();\n }\n\n // host operations\n\n case \"memory.size\": { // memory.size() -> i32\n compiler.currentType = Type.i32;\n if (operands.length != 0) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return module.createHost(HostOp.CurrentMemory);\n }\n case \"memory.grow\": { // memory.grow(pages: i32) -> i32\n compiler.currentType = Type.i32;\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n arg0 = module.createUnreachable();\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return module.createHost(HostOp.GrowMemory, null, [ arg0 ]);\n }\n // see: https://github.com/WebAssembly/bulk-memory-operations\n case \"memory.copy\": { // memory.copy(dest: usize, src: usize: n: usize) -> void\n if (!compiler.options.hasFeature(Feature.BULK_MEMORY)) {\n let instance = compiler.resolver.resolveFunction(prototype, null); // reports\n compiler.currentType = Type.void;\n if (!instance) return module.createUnreachable();\n return compiler.compileCallDirect(instance, operands, reportNode);\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 3) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n compiler.currentType = Type.void;\n return module.createUnreachable();\n }\n let usizeType = compiler.options.usizeType;\n arg0 = compiler.compileExpression(\n operands[0],\n usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg2 = compiler.compileExpression(\n operands[2],\n usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n compiler.currentType = Type.void;\n return module.createMemoryCopy(arg0, arg1, arg2);\n }\n case \"memory.fill\": { // memory.fill(dest: usize, value: u8, n: usize) -> void\n if (!compiler.options.hasFeature(Feature.BULK_MEMORY)) {\n let instance = compiler.resolver.resolveFunction(prototype, null); // reports\n compiler.currentType = Type.void;\n if (!instance) return module.createUnreachable();\n return compiler.compileCallDirect(instance, operands, reportNode);\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 3) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n compiler.currentType = Type.void;\n return module.createUnreachable();\n }\n let usizeType = compiler.options.usizeType;\n arg0 = compiler.compileExpression(\n operands[0],\n usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n Type.u32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg2 = compiler.compileExpression(\n operands[2],\n usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n compiler.currentType = Type.void;\n return module.createMemoryFill(arg0, arg1, arg2);\n }\n\n // other\n\n case \"changetype\": { // changetype(value: *) -> T\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = typeArguments[0];\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpressionRetainType(\n operands[0],\n typeArguments[0],\n WrapMode.NONE\n );\n compiler.currentType = typeArguments[0];\n if (compiler.currentType.size != typeArguments[0].size) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return module.createUnreachable();\n }\n // if (reportNode.range.source.sourceKind != SourceKind.STDLIB)\n // compiler.warning(DiagnosticCode.Operation_is_unsafe, reportNode.range);\n return arg0; // any usize to any usize\n }\n case \"assert\": { // assert(isTrueish: T, message?: string) -> T with T != null\n if (operands.length < 1 || operands.length > 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n if (operands.length < 1) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n } else if (operands.length > 2) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.bool, WrapMode.WRAP);\n }\n\n let type = compiler.currentType;\n compiler.currentType = type.nonNullableType;\n\n // just return ifTrueish if assertions are disabled, or simplify if dropped anyway\n if (compiler.options.noAssert) {\n if (contextualType == Type.void) {\n compiler.currentType = Type.void;\n return module.createNop();\n }\n return arg0;\n }\n\n let abort = compileAbort(compiler, operands.length == 2 ? operands[1] : null, reportNode);\n\n compiler.currentType = type.nonNullableType;\n\n if (contextualType == Type.void) { // simplify if dropped anyway\n switch (compiler.currentType.kind) {\n default: { // any integer up to 32-bits incl. bool\n ret = module.createIf(\n module.createUnary(UnaryOp.EqzI32,\n arg0\n ),\n abort\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createIf(\n module.createUnary(UnaryOp.EqzI64,\n arg0\n ),\n abort\n );\n break;\n }\n case TypeKind.ISIZE:\n case TypeKind.USIZE: {\n ret = module.createIf(\n module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.EqzI64\n : UnaryOp.EqzI32,\n arg0\n ),\n abort\n );\n break;\n }\n // TODO: also check for NaN in float assertions, as in `Boolean(NaN) -> false`?\n case TypeKind.F32: {\n ret = module.createIf(\n module.createBinary(BinaryOp.EqF32,\n arg0,\n module.createF32(0)\n ),\n abort\n );\n break;\n }\n case TypeKind.F64: {\n ret = module.createIf(\n module.createBinary(BinaryOp.EqF64,\n arg0,\n module.createF64(0)\n ),\n abort\n );\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = abort;\n break;\n }\n }\n compiler.currentType = Type.void;\n } else {\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n let flow = compiler.currentFlow;\n let tempLocal = flow.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n ret = module.createIf(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createGetLocal(tempLocal.index, NativeType.I32),\n abort\n );\n break;\n }\n case TypeKind.I32:\n case TypeKind.U32:\n default: {\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.i32, false);\n ret = module.createIf(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createGetLocal(tempLocal.index, NativeType.I32),\n abort\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.i64, false);\n ret = module.createIf(\n module.createUnary(UnaryOp.EqzI64,\n module.createTeeLocal(tempLocal.index, arg0)\n ),\n abort,\n module.createGetLocal(tempLocal.index, NativeType.I64)\n );\n break;\n }\n case TypeKind.ISIZE:\n case TypeKind.USIZE: {\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createIf(\n module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.EqzI64\n : UnaryOp.EqzI32,\n module.createTeeLocal(tempLocal.index, arg0)\n ),\n abort,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n );\n break;\n }\n case TypeKind.F32: {\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.f32, false);\n ret = module.createIf(\n module.createBinary(BinaryOp.EqF32,\n module.createTeeLocal(tempLocal.index, arg0),\n module.createF32(0)\n ),\n abort,\n module.createGetLocal(tempLocal.index, NativeType.F32)\n );\n break;\n }\n case TypeKind.F64: {\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.f64, false);\n ret = module.createIf(\n module.createBinary(BinaryOp.EqF64,\n module.createTeeLocal(tempLocal.index, arg0),\n module.createF64(0)\n ),\n abort,\n module.createGetLocal(tempLocal.index, NativeType.F64)\n );\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = abort;\n break;\n }\n }\n }\n return ret;\n }\n case \"unchecked\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n let flow = compiler.currentFlow;\n flow.set(FlowFlags.UNCHECKED_CONTEXT);\n ret = compiler.compileExpressionRetainType(operands[0], contextualType, WrapMode.NONE);\n flow.unset(FlowFlags.UNCHECKED_CONTEXT);\n return ret;\n }\n case \"call_indirect\": { // call_indirect(target: Function | u32, ...args: *[]) -> T\n if (operands.length < 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n let returnType: Type;\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n returnType = typeArguments[0];\n } else {\n returnType = contextualType;\n }\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\n if (compiler.currentType.kind != TypeKind.U32) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n operands[0].range\n );\n return module.createUnreachable();\n }\n let numOperands = operands.length - 1;\n let operandExprs = new Array(numOperands);\n let signatureParts = new Array(numOperands + 1);\n let nativeReturnType = returnType.toNativeType();\n let nativeParamTypes = new Array(numOperands);\n for (let i = 0; i < numOperands; ++i) {\n operandExprs[i] = compiler.compileExpressionRetainType(operands[1 + i], Type.i32, WrapMode.NONE);\n let operandType = compiler.currentType;\n signatureParts[i] = operandType.toSignatureString();\n nativeParamTypes[i] = operandType.toNativeType();\n }\n signatureParts[numOperands] = returnType.toSignatureString();\n let typeName = signatureParts.join(\"\");\n let typeRef = module.getFunctionTypeBySignature(nativeReturnType, nativeParamTypes);\n if (!typeRef) typeRef = module.addFunctionType(typeName, nativeReturnType, nativeParamTypes);\n compiler.currentType = returnType;\n // of course this can easily result in a 'RuntimeError: function signature mismatch' trap and\n // thus must be used with care. it exists because it *might* be useful in specific scenarios.\n return module.createCallIndirect(arg0, operandExprs, typeName);\n }\n case \"instantiate\": {\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n let classInstance = typeArguments[0].classReference;\n if (!classInstance) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return module.createUnreachable();\n }\n return compiler.compileInstantiate(classInstance, operands, reportNode);\n }\n\n // user-defined diagnostic macros\n\n case \"ERROR\": {\n compiler.error(\n DiagnosticCode.User_defined_0,\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\n );\n return module.createUnreachable();\n }\n case \"WARNING\": {\n compiler.warning(\n DiagnosticCode.User_defined_0,\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\n );\n return module.createNop();\n }\n case \"INFO\": {\n compiler.info(\n DiagnosticCode.User_defined_0,\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\n );\n return module.createNop();\n }\n\n // conversions\n\n case \"i8\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.i8;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.i8,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"i16\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.i16;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.i16,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"i32\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.i32;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.i32,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"i64\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.i64;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.i64,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"isize\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = compiler.options.isWasm64\n ? Type.isize64\n : Type.isize32;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n compiler.options.isWasm64\n ? Type.isize64\n : Type.isize32,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"u8\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.u8;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.u8,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"u16\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.u16;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.u16,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"u32\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.u32;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.u32,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"u64\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.u64;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.u64,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"usize\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = compiler.options.usizeType;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"bool\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.bool;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.bool,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"f32\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.f32;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.f32,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case \"f64\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.f64;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.f64,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n\n // gc\n\n case \"iterateRoots\": {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.void;\n return module.createUnreachable();\n }\n let expr = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\n let type = compiler.currentType;\n let signatureReference = type.signatureReference;\n compiler.currentType = Type.void;\n if (\n !type.is(TypeFlags.REFERENCE) ||\n !signatureReference ||\n signatureReference.parameterTypes.length != 1 ||\n signatureReference.parameterTypes[0] != compiler.options.usizeType\n ) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n reportNode.range, type.toString(), \"(ref: usize) => void\"\n );\n return module.createUnreachable();\n }\n compiler.currentType = Type.void;\n // just emit a call even if the function doesn't yet exist\n compiler.needsIterateRoots = true;\n return module.createCall(\"~iterateRoots\", [ expr ], NativeType.None);\n }\n }\n var expr = deferASMCall(compiler, prototype, operands, contextualType, reportNode);\n if (expr) {\n if (typeArguments && typeArguments.length) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return expr;\n }\n compiler.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.expression.range, prototype.internalName\n );\n return module.createUnreachable();\n}\n\n/** Defers an inline-assembler-like call to a built-in function. */\nfunction deferASMCall(\n compiler: Compiler,\n prototype: FunctionPrototype,\n operands: Expression[],\n contextualType: Type,\n reportNode: CallExpression\n): ExpressionRef {\n /* tslint:disable:max-line-length */\n switch (prototype.internalName) {\n\n // TODO: Operators can't be just deferred (don't have a corresponding generic built-in)\n // add, sub, mul, div_s, div_u, rem_s, rem_u\n // and, or, xor, shl, shr_u, shr_s\n // eq, eqz, ne, lt_s, lt_u, le_s, le_u, gt_s, gt_u, ge_s, ge_u\n\n case \"i32.clz\": return deferASM(\"clz\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.clz\": return deferASM(\"clz\", compiler, Type.i64, operands, Type.i64, reportNode);\n\n case \"i32.ctz\": return deferASM(\"ctz\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.ctz\": return deferASM(\"ctz\", compiler, Type.i64, operands, Type.i64, reportNode);\n\n case \"i32.popcnt\": return deferASM(\"popcnt\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.popcnt\": return deferASM(\"popcnt\", compiler, Type.i64, operands, Type.i64, reportNode);\n\n case \"i32.rotl\": return deferASM(\"rotl\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.rotl\": return deferASM(\"rotl\", compiler, Type.i64, operands, Type.i64, reportNode);\n\n case \"i32.rotr\": return deferASM(\"rotr\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.rotr\": return deferASM(\"rotr\", compiler, Type.i64, operands, Type.i64, reportNode);\n\n case \"f32.abs\": return deferASM(\"abs\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.abs\": return deferASM(\"abs\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.max\": return deferASM(\"max\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.max\": return deferASM(\"max\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.min\": return deferASM(\"min\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.min\": return deferASM(\"min\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.ceil\": return deferASM(\"ceil\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.ceil\": return deferASM(\"ceil\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.floor\": return deferASM(\"floor\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.floor\": return deferASM(\"floor\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.copysign\": return deferASM(\"copysign\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.copysign\": return deferASM(\"copysign\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.nearest\": return deferASM(\"nearest\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.nearest\": return deferASM(\"nearest\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"i32.reinterpret_f32\": return deferASM(\"reinterpret\", compiler, Type.i32, operands, Type.f32, reportNode);\n case \"i64.reinterpret_f64\": return deferASM(\"reinterpret\", compiler, Type.i64, operands, Type.f64, reportNode);\n case \"f32.reinterpret_i32\": return deferASM(\"reinterpret\", compiler, Type.f32, operands, Type.i32, reportNode);\n case \"f64.reinterpret_i64\": return deferASM(\"reinterpret\", compiler, Type.f64, operands, Type.i64, reportNode);\n\n case \"f32.sqrt\": return deferASM(\"sqrt\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.sqrt\": return deferASM(\"sqrt\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"f32.trunc\": return deferASM(\"trunc\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.trunc\": return deferASM(\"trunc\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"i32.load8_s\": return deferASM(\"load\", compiler, Type.i8, operands, Type.i32, reportNode);\n case \"i32.load8_u\": return deferASM(\"load\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.load16_s\": return deferASM(\"load\", compiler, Type.i16, operands, Type.i32, reportNode);\n case \"i32.load16_u\": return deferASM(\"load\", compiler, Type.u16, operands, Type.u32, reportNode);\n case \"i32.load\": return deferASM(\"load\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.load8_s\": return deferASM(\"load\", compiler, Type.i8, operands, Type.i64, reportNode);\n case \"i64.load8_u\": return deferASM(\"load\", compiler, Type.u8, operands, Type.u64, reportNode);\n case \"i64.load16_s\": return deferASM(\"load\", compiler, Type.i16, operands, Type.i64, reportNode);\n case \"i64.load16_u\": return deferASM(\"load\", compiler, Type.u16, operands, Type.u64, reportNode);\n case \"i64.load32_s\": return deferASM(\"load\", compiler, Type.i32, operands, Type.i64, reportNode);\n case \"i64.load32_u\": return deferASM(\"load\", compiler, Type.u32, operands, Type.u64, reportNode);\n case \"i64.load\": return deferASM(\"load\", compiler, Type.i64, operands, Type.i64, reportNode);\n case \"f32.load\": return deferASM(\"load\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.load\": return deferASM(\"load\", compiler, Type.f64, operands, Type.f64, reportNode);\n\n case \"i32.store8\": return deferASM(\"store\", compiler, Type.i8, operands, Type.i32, reportNode);\n case \"i32.store16\": return deferASM(\"store\", compiler, Type.i16, operands, Type.i32, reportNode);\n case \"i32.store\": return deferASM(\"store\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.store8\": return deferASM(\"store\", compiler, Type.i8, operands, Type.i64, reportNode);\n case \"i64.store16\": return deferASM(\"store\", compiler, Type.i16, operands, Type.i64, reportNode);\n case \"i64.store32\": return deferASM(\"store\", compiler, Type.i32, operands, Type.i64, reportNode);\n case \"i64.store\": return deferASM(\"store\", compiler, Type.i64, operands, Type.i64, reportNode);\n case \"f32.store\": return deferASM(\"store\", compiler, Type.f32, operands, Type.f32, reportNode);\n case \"f64.store\": return deferASM(\"store\", compiler, Type.f64, operands, Type.f64, reportNode);\n }\n if (compiler.options.hasFeature(Feature.THREADS)) {\n switch (prototype.internalName) {\n case \"i32.atomic.load8_u\": return deferASM(\"atomic.load\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.atomic.load16_u\": return deferASM(\"atomic.load\", compiler, Type.u16, operands, Type.u32, reportNode);\n case \"i32.atomic.load\": return deferASM(\"atomic.load\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.atomic.load8_u\": return deferASM(\"atomic.load\", compiler, Type.u8, operands, Type.u64, reportNode);\n case \"i64.atomic.load16_u\": return deferASM(\"atomic.load\", compiler, Type.u16, operands, Type.u64, reportNode);\n case \"i64.atomic.load32_u\": return deferASM(\"atomic.load\", compiler, Type.u32, operands, Type.u64, reportNode);\n case \"i64.atomic.load\": return deferASM(\"atomic.load\", compiler, Type.i64, operands, Type.i64, reportNode);\n\n case \"i32.atomic.store8\": return deferASM(\"atomic.store\", compiler, Type.i8, operands, Type.i32, reportNode);\n case \"i32.atomic.store16\": return deferASM(\"atomic.store\", compiler, Type.i16, operands, Type.i32, reportNode);\n case \"i32.atomic.store\": return deferASM(\"atomic.store\", compiler, Type.i32, operands, Type.i32, reportNode);\n case \"i64.atomic.store8\": return deferASM(\"atomic.store\", compiler, Type.i8, operands, Type.i64, reportNode);\n case \"i64.atomic.store16\": return deferASM(\"atomic.store\", compiler, Type.i16, operands, Type.i64, reportNode);\n case \"i64.atomic.store32\": return deferASM(\"atomic.store\", compiler, Type.i32, operands, Type.i64, reportNode);\n case \"i64.atomic.store\": return deferASM(\"atomic.store\", compiler, Type.i64, operands, Type.i64, reportNode);\n\n case \"i32.atomic.rmw8_u.add\": return deferASM(\"atomic.add\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw16_u.add\": return deferASM(\"atomic.add\", compiler, Type.u16, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw.add\": return deferASM(\"atomic.add\", compiler, Type.u32, operands, Type.u32, reportNode);\n case \"i64.atomic.rmw8_u.add\": return deferASM(\"atomic.add\", compiler, Type.u8, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw16_u.add\": return deferASM(\"atomic.add\", compiler, Type.u16, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw32_u.add\": return deferASM(\"atomic.add\", compiler, Type.u32, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw.add\": return deferASM(\"atomic.add\", compiler, Type.u64, operands, Type.u64, reportNode);\n\n case \"i32.atomic.rmw8_u.sub\": return deferASM(\"atomic.sub\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw16_u.sub\": return deferASM(\"atomic.sub\", compiler, Type.u16, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw.sub\": return deferASM(\"atomic.sub\", compiler, Type.u32, operands, Type.u32, reportNode);\n case \"i64.atomic.rmw8_u.sub\": return deferASM(\"atomic.sub\", compiler, Type.u8, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw16_u.sub\": return deferASM(\"atomic.sub\", compiler, Type.u16, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw32_u.sub\": return deferASM(\"atomic.sub\", compiler, Type.u32, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw.sub\": return deferASM(\"atomic.sub\", compiler, Type.u64, operands, Type.u64, reportNode);\n\n case \"i32.atomic.rmw8_u.and\": return deferASM(\"atomic.and\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw16_u.and\": return deferASM(\"atomic.and\", compiler, Type.u16, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw.and\": return deferASM(\"atomic.and\", compiler, Type.u32, operands, Type.u32, reportNode);\n case \"i64.atomic.rmw8_u.and\": return deferASM(\"atomic.and\", compiler, Type.u8, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw16_u.and\": return deferASM(\"atomic.and\", compiler, Type.u16, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw32_u.and\": return deferASM(\"atomic.and\", compiler, Type.u32, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw.and\": return deferASM(\"atomic.and\", compiler, Type.u64, operands, Type.u64, reportNode);\n\n case \"i32.atomic.rmw8_u.or\": return deferASM(\"atomic.or\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw16_u.or\": return deferASM(\"atomic.or\", compiler, Type.u16, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw.or\": return deferASM(\"atomic.or\", compiler, Type.u32, operands, Type.u32, reportNode);\n case \"i64.atomic.rmw8_u.or\": return deferASM(\"atomic.or\", compiler, Type.u8, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw16_u.or\": return deferASM(\"atomic.or\", compiler, Type.u16, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw32_u.or\": return deferASM(\"atomic.or\", compiler, Type.u32, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw.or\": return deferASM(\"atomic.or\", compiler, Type.u64, operands, Type.u64, reportNode);\n\n case \"i32.atomic.rmw8_u.xor\": return deferASM(\"atomic.xor\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw16_u.xor\": return deferASM(\"atomic.xor\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw.xor\": return deferASM(\"atomic.xor\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i64.atomic.rmw8_u.xor\": return deferASM(\"atomic.xor\", compiler, Type.u8, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw16_u.xor\": return deferASM(\"atomic.xor\", compiler, Type.u16, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw32_u.xor\": return deferASM(\"atomic.xor\", compiler, Type.u32, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw.xor\": return deferASM(\"atomic.xor\", compiler, Type.u64, operands, Type.u64, reportNode);\n\n case \"i32.atomic.rmw8_u.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw16_u.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i64.atomic.rmw8_u.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u8, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw16_u.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u16, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw32_u.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u32, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw.xchg\": return deferASM(\"atomic.xchg\", compiler, Type.u64, operands, Type.u64, reportNode);\n\n case \"i32.atomic.rmw8_u.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw16_u.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i32.atomic.rmw.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u8, operands, Type.u32, reportNode);\n case \"i64.atomic.rmw8_u.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u8, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw16_u.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u16, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw32_u.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u32, operands, Type.u64, reportNode);\n case \"i64.atomic.rmw.cmpxchg\": return deferASM(\"atomic.cmpxchg\", compiler, Type.u64, operands, Type.u64, reportNode);\n\n case \"i32.wait\": return deferASM(\"atomic.wait\", compiler, Type.i32, operands, Type.u32, reportNode);\n case \"i64.wait\": return deferASM(\"atomic.wait\", compiler, Type.i64, operands, Type.i64, reportNode);\n case \"i32.notify\": return deferASM(\"atomic.notify\", compiler, Type.i32, operands, Type.u32, reportNode);\n case \"i64.notify\": return deferASM(\"atomic.notify\", compiler, Type.i64, operands, Type.i64, reportNode);\n }\n }\n /* tslint:enable:max-line-length */\n return 0;\n}\n\n/** A helper for deferring inline-assembler-like calls to built-in functions. */\nfunction deferASM(\n name: string,\n compiler: Compiler,\n typeArgument: Type,\n operands: Expression[],\n valueType: Type,\n reportNode: CallExpression\n): ExpressionRef {\n // Built-in wasm functions can be namespaced like atomic.{OPERATION}\n // Split name by '.' to find member function prototype\n // FIXME: This is slower than it needs to be due to the way resolving works atm\n var names = name.split(\".\");\n var prototype: Element = assert(compiler.program.elementsLookup.get(names[0]));\n if (names.length > 1) {\n for (let i = 1; i < names.length; i++) {\n const subName = names[i];\n if (prototype && prototype.members) {\n prototype = assert(prototype.members.get(subName));\n }\n }\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n return compileCall(compiler, prototype, [ typeArgument ], operands, valueType, reportNode);\n}\n\n/** Evaluates the constant type of a type argument *or* expression. */\nfunction evaluateConstantType(\n compiler: Compiler,\n typeArguments: Type[] | null,\n operands: Expression[],\n reportNode: Node\n): Type | null {\n if (operands.length == 0) { // requires type argument\n if (!typeArguments || typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return null;\n }\n return typeArguments[0];\n }\n if (operands.length == 1) { // optional type argument\n if (typeArguments) {\n if (typeArguments.length == 1) {\n compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n if (typeArguments.length) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return null;\n }\n compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\n }\n } else {\n compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\n }\n return compiler.currentType;\n }\n if (typeArguments && typeArguments.length > 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return null;\n}\n\n/** Evaluates a `constantOffset` argument.*/\nfunction evaluateConstantOffset(compiler: Compiler, expression: Expression): i32 {\n var expr: ExpressionRef;\n var value: i32;\n if (compiler.options.isWasm64) {\n expr = compiler.precomputeExpression(expression, Type.usize64, ConversionKind.IMPLICIT, WrapMode.NONE);\n if (\n getExpressionId(expr) != ExpressionId.Const ||\n getExpressionType(expr) != NativeType.I64 ||\n getConstValueI64High(expr) != 0 ||\n (value = getConstValueI64Low(expr)) < 0\n ) {\n compiler.error(\n DiagnosticCode.Expression_must_be_a_compile_time_constant,\n expression.range\n );\n value = -1;\n }\n } else {\n expr = compiler.precomputeExpression(expression, Type.usize32, ConversionKind.IMPLICIT, WrapMode.NONE);\n if (\n getExpressionId(expr) != ExpressionId.Const ||\n getExpressionType(expr) != NativeType.I32 ||\n (value = getConstValueI32(expr)) < 0\n ) {\n compiler.error(\n DiagnosticCode.Expression_must_be_a_compile_time_constant,\n expression.range\n );\n value = -1;\n }\n }\n return value;\n}\n\n/** Compiles an abort wired to the conditionally imported 'abort' function. */\nexport function compileAbort(\n compiler: Compiler,\n message: Expression | null,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n var module = compiler.module;\n\n var stringType = program.typesLookup.get(\"string\");\n if (!stringType) return module.createUnreachable();\n\n var abortInstance = program.abortInstance;\n if (!(abortInstance && compiler.compileFunction(abortInstance))) return module.createUnreachable();\n\n var messageArg = message != null\n ? compiler.compileExpression(message, stringType, ConversionKind.IMPLICIT, WrapMode.NONE)\n : stringType.toNativeZero(module);\n\n var filenameArg = compiler.ensureStaticString(reportNode.range.source.normalizedPath);\n\n compiler.currentType = Type.void;\n return module.createBlock(null, [\n module.createCall(\n abortInstance.internalName, [\n messageArg,\n filenameArg,\n module.createI32(reportNode.range.line),\n module.createI32(reportNode.range.column)\n ],\n NativeType.None\n ),\n module.createUnreachable()\n ]);\n}\n\n/** Compiles the iterateRoots function if requires. */\nexport function compileIterateRoots(compiler: Compiler): void {\n var module = compiler.module;\n var exprs = new Array();\n\n for (let element of compiler.program.elementsLookup.values()) {\n if (element.kind != ElementKind.GLOBAL) continue;\n let global = element;\n let classReference = global.type.classReference;\n if (\n global.is(CommonFlags.COMPILED) &&\n classReference !== null &&\n !classReference.hasDecorator(DecoratorFlags.UNMANAGED)\n ) {\n if (global.is(CommonFlags.INLINED)) {\n let value = global.constantIntegerValue;\n exprs.push(\n module.createCallIndirect(\n module.createGetLocal(0, NativeType.I32),\n [\n compiler.options.isWasm64\n ? module.createI64(i64_low(value), i64_high(value))\n : module.createI32(i64_low(value))\n ],\n \"i_\"\n )\n );\n } else {\n exprs.push(\n module.createCallIndirect(\n module.createGetLocal(0, NativeType.I32),\n [\n module.createGetGlobal(\n global.internalName,\n compiler.options.nativeSizeType\n )\n ],\n \"i_\"\n )\n );\n }\n }\n }\n var typeRef = compiler.ensureFunctionType([ Type.i32 ], Type.void);\n module.addFunction(\"~iterateRoots\", typeRef, [],\n exprs.length\n ? module.createBlock(null, exprs)\n : module.createNop()\n );\n}\n\n/** Ensures that the specified class's GC hook exists and returns its function table index. */\nexport function ensureGCHook(\n compiler: Compiler,\n classInstance: Class\n): u32 {\n var program = compiler.program;\n assert(classInstance.type.isManaged(program));\n\n // check if the GC hook has already been created\n {\n let existingIndex = classInstance.gcHookIndex;\n if (existingIndex != -1) return existingIndex;\n }\n\n // check if the class implements a custom GC function (only valid for internals)\n var members = classInstance.members;\n if (classInstance.prototype.declaration.range.source.isLibrary) {\n if (members !== null && members.has(\"__gc\")) {\n let gcPrototype = assert(members.get(\"__gc\"));\n assert(gcPrototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n let gcInstance = assert(program.resolver.resolveFunction(gcPrototype, null));\n assert(gcInstance.is(CommonFlags.PRIVATE | CommonFlags.INSTANCE));\n assert(!gcInstance.isAny(CommonFlags.AMBIENT | CommonFlags.VIRTUAL));\n assert(gcInstance.signature.parameterTypes.length == 0);\n assert(gcInstance.signature.returnType == Type.void);\n gcInstance.internalName = classInstance.internalName + \"~gc\";\n assert(compiler.compileFunction(gcInstance));\n let index = compiler.ensureFunctionTableEntry(gcInstance);\n classInstance.gcHookIndex = index;\n return index;\n }\n }\n\n var module = compiler.module;\n var options = compiler.options;\n var nativeSizeType = options.nativeSizeType;\n var nativeSizeSize = options.usizeType.byteSize;\n var body = new Array();\n\n // nothing to mark if 'this' is null\n body.push(\n module.createIf(\n module.createUnary(\n options.isWasm64\n ? UnaryOp.EqzI64\n : UnaryOp.EqzI32,\n module.createGetLocal(0, nativeSizeType)\n ),\n module.createReturn()\n )\n );\n\n // remember the function index so we don't recurse infinitely\n var functionTable = compiler.functionTable;\n var gcHookIndex = functionTable.length;\n functionTable.push(\"\");\n classInstance.gcHookIndex = gcHookIndex;\n\n // if the class extends a base class, call its hook first (calls mark)\n var baseInstance = classInstance.base;\n if (baseInstance) {\n assert(baseInstance.type.isManaged(program));\n body.push(\n module.createCallIndirect(\n module.createI32(\n ensureGCHook(compiler, baseInstance.type.classReference)\n ),\n [\n module.createGetLocal(0, nativeSizeType)\n ],\n nativeSizeType == NativeType.I64 ? \"I_\" : \"i_\"\n )\n );\n\n // if this class is the top-most base class, mark the instance\n } else {\n body.push(\n module.createCall(assert(program.gcMarkInstance).internalName, [\n module.createGetLocal(0, nativeSizeType)\n ], NativeType.None)\n );\n }\n\n // mark instances assigned to own fields that are again references\n if (members) {\n for (let member of members.values()) {\n if (member.kind == ElementKind.FIELD) {\n if ((member).parent === classInstance) {\n let type = (member).type;\n if (type.isManaged(program)) {\n let offset = (member).memoryOffset;\n assert(offset >= 0);\n body.push(\n module.createCall(assert(program.gcMarkInstance).internalName, [\n module.createLoad(\n nativeSizeSize,\n false,\n module.createGetLocal(0, nativeSizeType),\n nativeSizeType,\n offset\n )\n ], NativeType.None)\n );\n }\n }\n }\n }\n }\n\n // add the function to the module and return its table index\n var funcName = classInstance.internalName + \"~gc\";\n module.addFunction(\n funcName,\n compiler.ensureFunctionType(null, Type.void, options.usizeType),\n null,\n module.createBlock(null, body)\n );\n functionTable[gcHookIndex] = funcName;\n return gcHookIndex;\n}\n","/** @module util *//***/\n\n/** Tests if the bit at the specified index is set within a 64-bit map. */\nexport function bitsetIs(map: I64, index: i32): bool {\n assert(index >= 0 && index < 64);\n return i64_ne(\n i64_and(\n map,\n i64_shl(\n i64_one,\n i64_new(index)\n )\n ),\n i64_zero\n );\n}\n\n/** Sets or unsets the bit at the specified index within a 64-bit map and returns the new map. */\nexport function bitsetSet(map: I64, index: i32, isSet: bool): I64 {\n assert(index >= 0 && index < 64);\n return isSet\n ? i64_or(\n map,\n i64_shl(\n i64_one,\n i64_new(index)\n )\n )\n : i64_and(\n map,\n i64_not(\n i64_shl(\n i64_one,\n i64_new(index)\n )\n )\n );\n}\n","/** @module util *//***/\n\n/** An enum of named character codes. */\nexport const enum CharCode {\n\n NULL = 0,\n LINEFEED = 0x0A,\n CARRIAGERETURN = 0x0D,\n LINESEPARATOR = 0x2028,\n PARAGRAPHSEPARATOR = 0x2029,\n NEXTLINE = 0x0085,\n\n SPACE = 0x20,\n NONBREAKINGSPACE = 0xA0,\n ENQUAD = 0x2000,\n EMQUAD = 0x2001,\n ENSPACE = 0x2002,\n EMSPACE = 0x2003,\n THREEPEREMSPACE = 0x2004,\n FOURPEREMSPACE = 0x2005,\n SIXPEREMSPACE = 0x2006,\n FIGURESPACE = 0x2007,\n PUNCTUATIONSPACE = 0x2008,\n THINSPACE = 0x2009,\n HAIRSPACE = 0x200A,\n ZEROWIDTHSPACE = 0x200B,\n NARROWNOBREAKSPACE = 0x202F,\n IDEOGRAPHICSPACE = 0x3000,\n MATHEMATICALSPACE = 0x205F,\n OGHAM = 0x1680,\n\n _ = 0x5F,\n\n _0 = 0x30,\n _1 = 0x31,\n _2 = 0x32,\n _3 = 0x33,\n _4 = 0x34,\n _5 = 0x35,\n _6 = 0x36,\n _7 = 0x37,\n _8 = 0x38,\n _9 = 0x39,\n\n a = 0x61,\n b = 0x62,\n c = 0x63,\n d = 0x64,\n e = 0x65,\n f = 0x66,\n g = 0x67,\n h = 0x68,\n i = 0x69,\n j = 0x6A,\n k = 0x6B,\n l = 0x6C,\n m = 0x6D,\n n = 0x6E,\n o = 0x6F,\n p = 0x70,\n q = 0x71,\n r = 0x72,\n s = 0x73,\n t = 0x74,\n u = 0x75,\n v = 0x76,\n w = 0x77,\n x = 0x78,\n y = 0x79,\n z = 0x7A,\n\n A = 0x41,\n B = 0x42,\n C = 0x43,\n D = 0x44,\n E = 0x45,\n F = 0x46,\n G = 0x47,\n H = 0x48,\n I = 0x49,\n J = 0x4A,\n K = 0x4B,\n L = 0x4C,\n M = 0x4D,\n N = 0x4E,\n O = 0x4F,\n P = 0x50,\n Q = 0x51,\n R = 0x52,\n S = 0x53,\n T = 0x54,\n U = 0x55,\n V = 0x56,\n W = 0x57,\n X = 0x58,\n Y = 0x59,\n Z = 0x5a,\n\n AMPERSAND = 0x26,\n ASTERISK = 0x2A,\n AT = 0x40,\n BACKSLASH = 0x5C,\n BACKTICK = 0x60,\n BAR = 0x7C,\n CARET = 0x5E,\n CLOSEBRACE = 0x7D,\n CLOSEBRACKET = 0x5D,\n CLOSEPAREN = 0x29,\n COLON = 0x3A,\n COMMA = 0x2C,\n DOLLAR = 0x24,\n DOT = 0x2E,\n DOUBLEQUOTE = 0x22,\n EQUALS = 0x3D,\n EXCLAMATION = 0x21,\n GREATERTHAN = 0x3E,\n HASH = 0x23,\n LESSTHAN = 0x3C,\n MINUS = 0x2D,\n OPENBRACE = 0x7B,\n OPENBRACKET = 0x5B,\n OPENPAREN = 0x28,\n PERCENT = 0x25,\n PLUS = 0x2B,\n QUESTION = 0x3F,\n SEMICOLON = 0x3B,\n SINGLEQUOTE = 0x27,\n SLASH = 0x2F,\n TILDE = 0x7E,\n\n BACKSPACE = 0x08,\n FORMFEED = 0x0C,\n BYTEORDERMARK = 0xFEFF,\n TAB = 0x09,\n VERTICALTAB = 0x0B\n}\n\n/** Tests if the specified character code is some sort of line break. */\nexport function isLineBreak(c: CharCode): bool {\n switch (c) {\n case CharCode.LINEFEED:\n case CharCode.CARRIAGERETURN:\n case CharCode.LINESEPARATOR:\n case CharCode.PARAGRAPHSEPARATOR: {\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\n/** Tests if the specified character code is some sort of white space. */\nexport function isWhiteSpace(c: i32): bool {\n switch (c) {\n case CharCode.SPACE:\n case CharCode.TAB:\n case CharCode.VERTICALTAB:\n case CharCode.FORMFEED:\n case CharCode.NONBREAKINGSPACE:\n case CharCode.NEXTLINE:\n case CharCode.OGHAM:\n case CharCode.NARROWNOBREAKSPACE:\n case CharCode.MATHEMATICALSPACE:\n case CharCode.IDEOGRAPHICSPACE:\n case CharCode.BYTEORDERMARK: {\n return true;\n }\n default: {\n return c >= CharCode.ENQUAD && c <= CharCode.ZEROWIDTHSPACE;\n }\n }\n}\n\n/** Tests if the specified character code is a valid decimal digit. */\nexport function isDecimalDigit(c: i32): bool {\n return c >= CharCode._0 && c <= CharCode._9;\n}\n\n/** Tests if the specified character code is a valid octal digit. */\nexport function isOctalDigit(c: i32): bool {\n return c >= CharCode._0 && c <= CharCode._7;\n}\n\n/** Tests if the specified character code is a valid start of an identifier. */\nexport function isIdentifierStart(c: i32): bool {\n return c >= CharCode.A && c <= CharCode.Z\n || c >= CharCode.a && c <= CharCode.z\n || c == CharCode.DOLLAR\n || c == CharCode._\n || c > 0x7f && isUnicodeIdentifierStart(c);\n}\n\n/** Tests if the specified character code is a valid keyword character. */\nexport function isKeywordCharacter(c: i32): bool {\n return c >= CharCode.a && c <= CharCode.z;\n}\n\n/** Tests if the specified character code is a valid part of an identifier. */\nexport function isIdentifierPart(c: i32): bool {\n return c >= CharCode.A && c <= CharCode.Z\n || c >= CharCode.a && c <= CharCode.z\n || c >= CharCode._0 && c <= CharCode._9\n || c == CharCode.DOLLAR\n || c == CharCode._\n || c > 0x7f && isUnicodeIdentifierPart(c);\n}\n\n// storing as u16 to save memory\nconst unicodeIdentifierStart: u16[] = [\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\n 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906,\n 908, 908, 910, 929, 931,\n 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514,\n 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774,\n 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969,\n 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088,\n 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384,\n 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474,\n 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\n 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\n 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705,\n 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784,\n 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873,\n 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958,\n 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986,\n 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125,\n 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240,\n 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333,\n 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\n 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634,\n 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725,\n 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\n 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840,\n 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186,\n 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293,\n 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798,\n 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\n 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872,\n 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016,\n 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389,\n 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688,\n 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141,\n 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424,\n 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025,\n 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130,\n 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\n 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505,\n 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584,\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520,\n 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670,\n 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720,\n 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329,\n 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540,\n 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893,\n 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538,\n 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888,\n 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015,\n 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\n 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520,\n 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695,\n 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739,\n 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798,\n 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243,\n 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285,\n 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323,\n 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\n 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\n 65479, 65482, 65487, 65490, 65495, 65498, 65500,\n];\nconst unicodeIdentifierPart: u16[] = [\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\n 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906,\n 908, 908, 910, 929, 931,\n 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415,\n 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520,\n 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788,\n 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112,\n 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423,\n 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482,\n 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525,\n 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602,\n 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632,\n 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693,\n 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757,\n 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821,\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884,\n 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929,\n 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972,\n 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018,\n 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088,\n 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157,\n 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216,\n 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\n 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340,\n 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424,\n 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515,\n 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570,\n 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720,\n 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751,\n 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789,\n 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895,\n 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028,\n 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304,\n 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744,\n 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808,\n 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108,\n 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902,\n 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099,\n 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272,\n 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516,\n 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783,\n 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155,\n 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676,\n 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027,\n 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134,\n 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205,\n 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417,\n 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477,\n 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\n 8521, 8526, 8526, 8544, 8584,\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559,\n 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686,\n 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728,\n 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335,\n 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\n 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799,\n 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512,\n 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783,\n 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072,\n 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309,\n 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584,\n 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741,\n 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808,\n 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203,\n 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275,\n 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321,\n 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008,\n 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140,\n 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382,\n 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,\n];\n\nfunction lookupInUnicodeMap(code: u16, map: u16[]): bool {\n if (code < map[0]) return false;\n\n var lo = 0;\n var hi = map.length;\n var mid: i32;\n\n while (lo + 1 < hi) {\n mid = lo + (hi - lo) / 2;\n mid -= mid % 2;\n if (map[mid] <= code && code <= map[mid + 1]) {\n return true;\n }\n if (code < map[mid]) {\n hi = mid;\n } else {\n lo = mid + 2;\n }\n }\n return false;\n}\n\nfunction isUnicodeIdentifierStart(code: i32): bool {\n return code < 0 || code > 0xffff ? false\n : lookupInUnicodeMap(code as u16, unicodeIdentifierStart);\n}\n\nfunction isUnicodeIdentifierPart(code: i32): bool {\n return code < 0 || code > 0xffff ? false\n : lookupInUnicodeMap(code as u16, unicodeIdentifierPart);\n}\n","export function makeArray(original: Array | null = null): Array {\n if (original) {\n let cloned = new Array(original.length);\n for (let i = 0, k = original.length; i < k; ++i) unchecked(cloned[i] = original[i]);\n return cloned;\n }\n return new Array();\n}\n\nexport function makeSet(original: Set | null = null): Set {\n if (original) {\n let cloned = new Set();\n for (let v of original) cloned.add(v);\n return cloned;\n }\n return new Set();\n}\n\nexport function makeMap(original: Map | null = null): Map {\n if (original) {\n let cloned = new Map();\n for (let [k, v] of original) cloned.set(k, v);\n return cloned;\n }\n return new Map();\n}\n","/** @module util *//***/\n\nimport {\n CharCode\n} from \"./charcode\";\n\nconst separator = CharCode.SLASH;\n\n/**\n * Normalizes the specified path, removing interior placeholders.\n * Expects a posix-compatible relative path (not Windows compatible).\n */\nexport function normalizePath(path: string): string {\n var pos = 0;\n var len = path.length;\n\n // trim leading './'\n while (pos + 1 < len &&\n path.charCodeAt(pos) == CharCode.DOT &&\n path.charCodeAt(pos + 1) == separator\n ) {\n pos += 2;\n }\n\n if (pos > 0 || len < path.length) {\n path = path.substring(pos, len);\n len -= pos;\n pos = 0;\n }\n\n var atEnd: bool;\n while (pos + 1 < len) {\n atEnd = false;\n\n // we are only interested in '/.' sequences ...\n if (\n path.charCodeAt(pos) == separator &&\n path.charCodeAt(pos + 1) == CharCode.DOT\n ) {\n // '/.' ( '/' | $ )\n atEnd = pos + 2 == len;\n if (atEnd ||\n pos + 2 < len &&\n path.charCodeAt(pos + 2) == separator\n ) {\n path = atEnd\n ? path.substring(0, pos)\n : path.substring(0, pos) + path.substring(pos + 2);\n len -= 2;\n continue;\n }\n\n // '/.' ( './' | '.' $ )\n atEnd = pos + 3 == len;\n if (atEnd && path.charCodeAt(pos + 2) == CharCode.DOT ||\n pos + 3 < len &&\n path.charCodeAt(pos + 2) == CharCode.DOT &&\n path.charCodeAt(pos + 3) == separator\n ) {\n // find preceeding '/'\n let ipos = pos;\n while (--ipos >= 0) {\n if (path.charCodeAt(ipos) == separator) {\n if (pos - ipos != 3 ||\n path.charCodeAt(ipos + 1) != CharCode.DOT ||\n path.charCodeAt(ipos + 2) != CharCode.DOT\n ) { // exclude '..' itself\n path = atEnd\n ? path.substring(0, ipos)\n : path.substring(0, ipos) + path.substring(pos + 3);\n len -= pos + 3 - ipos;\n pos = ipos - 1; // incremented again at end of loop\n }\n break;\n }\n }\n\n // if there's no preceeding '/', trim start if non-empty\n if (ipos < 0 && pos > 0) {\n if (pos != 2 ||\n path.charCodeAt(0) != CharCode.DOT ||\n path.charCodeAt(1) != CharCode.DOT\n ) { // exclude '..' itself\n path = path.substring(pos + 4);\n len = path.length;\n continue;\n }\n }\n }\n }\n pos++;\n }\n return len > 0 ? path : \".\";\n}\n\n/** Resolves the specified path relative to the specified origin. */\nexport function resolvePath(normalizedPath: string, origin: string): string {\n if (normalizedPath.startsWith(\"std/\")) {\n return normalizedPath;\n }\n return normalizePath(\n dirname(origin) + String.fromCharCode(separator) + normalizedPath\n );\n}\n\n/** Obtains the directory portion of a normalized path. */\nexport function dirname(normalizedPath: string): string {\n var pos = normalizedPath.length;\n while (--pos > 0) {\n if (normalizedPath.charCodeAt(pos) == separator) {\n return normalizedPath.substring(0, pos);\n }\n }\n return \".\";\n}\n","/** @module util *//***/\n\nconst indentX1 = \" \";\nconst indentX2 = \" \";\nconst indentX4 = \" \";\n\n/** Creates an indentation matching the number of specified levels. */\nexport function indent(sb: string[], level: i32): void {\n while (level >= 4) {\n sb.push(indentX4);\n level -= 4;\n }\n if (level >= 2) {\n sb.push(indentX2);\n level -= 2;\n }\n if (level) {\n sb.push(indentX1);\n }\n}\n","/** @module util *//***/\n\n/** Reads an 8-bit integer from the specified buffer. */\nexport function readI8(buffer: Uint8Array, offset: i32): i32 {\n return buffer[offset];\n}\n\n/** Writes an 8-bit integer to the specified buffer. */\nexport function writeI8(value: i32, buffer: Uint8Array, offset: i32): void {\n buffer[offset] = value;\n}\n\n/** Reads a 16-bit integer from the specified buffer. */\nexport function readI16(buffer: Uint8Array, offset: i32): i32 {\n return buffer[offset ]\n | buffer[offset + 1] << 8;\n}\n\n/** Writes a 16-bit integer to the specified buffer. */\nexport function writeI16(value: i32, buffer: Uint8Array, offset: i32): void {\n buffer[offset ] = value;\n buffer[offset + 1] = value >>> 8;\n}\n\n/** Reads a 32-bit integer from the specified buffer. */\nexport function readI32(buffer: Uint8Array, offset: i32): i32 {\n return buffer[offset ]\n | buffer[offset + 1] << 8\n | buffer[offset + 2] << 16\n | buffer[offset + 3] << 24;\n}\n\n/** Writes a 32-bit integer to the specified buffer. */\nexport function writeI32(value: i32, buffer: Uint8Array, offset: i32): void {\n buffer[offset ] = value;\n buffer[offset + 1] = value >>> 8;\n buffer[offset + 2] = value >>> 16;\n buffer[offset + 3] = value >>> 24;\n}\n\n/** Reads a 64-bit integer from the specified buffer. */\nexport function readI64(buffer: Uint8Array, offset: i32): I64 {\n var lo = readI32(buffer, offset);\n var hi = readI32(buffer, offset + 4);\n return i64_new(lo, hi);\n}\n\n/** Writes a 64-bit integer to the specified buffer. */\nexport function writeI64(value: I64, buffer: Uint8Array, offset: i32): void {\n writeI32(i64_low(value), buffer, offset);\n writeI32(i64_high(value), buffer, offset + 4);\n}\n\n/** Reads a 32-bit float from the specified buffer. */\nexport function readF32(buffer: Uint8Array, offset: i32): f32 {\n return i32_as_f32(readI32(buffer, offset));\n}\n\n/** Writes a 32-bit float to the specified buffer. */\nexport function writeF32(value: f32, buffer: Uint8Array, offset: i32): void {\n writeI32(f32_as_i32(value), buffer, offset);\n}\n\n/** Reads a 64-bit float from the specified buffer. */\nexport function readF64(buffer: Uint8Array, offset: i32): f64 {\n return i64_as_f64(readI64(buffer, offset));\n}\n\n/** Writes a 64-bit float to the specified buffer. */\nexport function writeF64(value: f64, buffer: Uint8Array, offset: i32): void {\n var valueI64 = f64_as_i64(value);\n writeI32(i64_low(valueI64), buffer, offset);\n writeI32(i64_high(valueI64), buffer, offset + 4);\n}\n","/**\n * Low-level C-like compiler API.\n * @module index\n *//***/\n\nimport {\n Compiler,\n Options,\n Target,\n Feature\n} from \"./compiler\";\n\nimport {\n Decompiler\n} from \"./decompiler\";\n\nimport {\n IDLBuilder,\n TSDBuilder\n} from \"./definitions\";\n\nimport {\n DiagnosticMessage,\n DiagnosticCategory,\n formatDiagnosticMessage\n} from \"./diagnostics\";\n\nimport {\n Module\n} from \"./module\";\n\nimport {\n Parser\n} from \"./parser\";\n\nimport {\n Program\n} from \"./program\";\n\n/** Parses a source file. If `parser` has been omitted a new one is created. */\nexport function parseFile(text: string, path: string, isEntry: bool = false,\n parser: Parser | null = null\n): Parser {\n if (!parser) parser = new Parser();\n parser.parseFile(text, path, isEntry);\n return parser;\n}\n\n/** Obtains the next required file's path. Returns `null` once complete. */\nexport function nextFile(parser: Parser): string | null {\n return parser.nextFile();\n}\n\n/** Obtains the next diagnostic message. Returns `null` once complete. */\nexport function nextDiagnostic(parser: Parser): DiagnosticMessage | null {\n var program = parser.program;\n return program.diagnosticsOffset < program.diagnostics.length\n ? program.diagnostics[program.diagnosticsOffset++]\n : null;\n}\n\n/** Formats a diagnostic message to a string. */\nexport { formatDiagnosticMessage as formatDiagnostic };\n\n/** Tests whether a diagnostic is informatory. */\nexport function isInfo(message: DiagnosticMessage): bool {\n return message.category == DiagnosticCategory.INFO;\n}\n\n/** Tests whether a diagnostic is a warning. */\nexport function isWarning(message: DiagnosticMessage): bool {\n return message.category == DiagnosticCategory.WARNING;\n}\n\n/** Tests whether a diagnostic is an error. */\nexport function isError(message: DiagnosticMessage): bool {\n return message.category == DiagnosticCategory.ERROR;\n}\n\n/** Creates a new set of compiler options. */\nexport function createOptions(): Options {\n return new Options();\n}\n\n/** Sets the `target` option. */\nexport function setTarget(options: Options, target: Target): void {\n options.target = target;\n}\n\n/** Sets the `noTreeShaking` option. */\nexport function setNoTreeShaking(options: Options, noTreeShaking: bool): void {\n options.noTreeShaking = noTreeShaking;\n}\n\n/** Sets the `noAssert` option. */\nexport function setNoAssert(options: Options, noAssert: bool): void {\n options.noAssert = noAssert;\n}\n\n/** Sets the `importMemory` option. */\nexport function setImportMemory(options: Options, importMemory: bool): void {\n options.importMemory = importMemory;\n}\n\n/** Sets the `importTable` option. */\nexport function setImportTable(options: Options, importTable: bool): void {\n options.importTable = importTable;\n}\n\n/** Sets the `sourceMap` option. */\nexport function setSourceMap(options: Options, sourceMap: bool): void {\n options.sourceMap = sourceMap;\n}\n\n/** Sets the `memoryBase` option. */\nexport function setMemoryBase(options: Options, memoryBase: u32): void {\n options.memoryBase = memoryBase;\n}\n\n/** Sets a 'globalAliases' value. */\nexport function setGlobalAlias(options: Options, name: string, alias: string): void {\n var globalAliases = options.globalAliases;\n if (!globalAliases) options.globalAliases = globalAliases = new Map();\n globalAliases.set(name, alias);\n}\n\n/** Sign extension operations. */\nexport const FEATURE_SIGN_EXTENSION = Feature.SIGN_EXTENSION;\n/** Mutable global imports and exports. */\nexport const FEATURE_MUTABLE_GLOBAL = Feature.MUTABLE_GLOBAL;\n/** Bulk memory operations. */\nexport const FEATURE_BULK_MEMORY = Feature.BULK_MEMORY;\n/** SIMD types and operations. */\nexport const FEATURE_SIMD = Feature.SIMD;\n/** Threading and atomic operations. */\nexport const FEATURE_THREADS = Feature.THREADS;\n\n/** Enables a specific feature. */\nexport function enableFeature(options: Options, feature: Feature): void {\n options.features |= feature;\n}\n\n/** Gives the compiler a hint at the optimize levels that will be used later on. */\nexport function setOptimizeLevelHints(options: Options, optimizeLevel: i32, shrinkLevel: i32): void {\n options.optimizeLevelHint = optimizeLevel;\n options.shrinkLevelHint = shrinkLevel;\n}\n\n/** Finishes parsing. */\nexport function finishParsing(parser: Parser): Program {\n return parser.finish();\n}\n\n/** Compiles the sources computed by the parser to a module. */\nexport function compileProgram(program: Program, options: Options | null = null): Module {\n return new Compiler(program, options).compile();\n}\n\n/** Decompiles a module to its (low level) source. */\nexport function decompileModule(module: Module): string {\n var decompiler = new Decompiler();\n decompiler.decompile(module);\n return decompiler.finish();\n}\n\n/** Builds WebIDL definitions for the specified program. */\nexport function buildIDL(program: Program): string {\n return IDLBuilder.build(program);\n}\n\n/** Builds TypeScript definitions for the specified program. */\nexport function buildTSD(program: Program): string {\n return TSDBuilder.build(program);\n}\n\n/** Prefix indicating a library file. */\nexport { LIBRARY_PREFIX } from \"./common\";\n\n// Full API\nexport * from \"./ast\";\n// export * from \"./binary\";\nexport * from \"./common\";\nexport * from \"./compiler\";\nexport * from \"./decompiler\";\nexport * from \"./definitions\";\nexport * from \"./diagnosticMessages.generated\";\nexport * from \"./diagnostics\";\nexport * from \"./module\";\nexport * from \"./parser\";\nexport * from \"./program\";\nexport * from \"./resolver\";\nexport * from \"./tokenizer\";\nexport * from \"./types\";\nexport * from \"./util\";\n"],"sourceRoot":""} \ No newline at end of file From a5bffda6298c95e87e4c399506673a31eadd686d Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Tue, 19 Feb 2019 09:51:37 -0500 Subject: [PATCH 35/46] Added stdout redirection --- lib/host/src/host.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/host/src/host.ts b/lib/host/src/host.ts index df514e1767..5a107280d0 100644 --- a/lib/host/src/host.ts +++ b/lib/host/src/host.ts @@ -1,6 +1,11 @@ import {ASImport} from "./ASImport"; export class Host extends ASImport { + + constructor(public stdout: (out:string) => void = console.log){ + super() + } + debug (): void { // tslint:disable-next-line debugger; @@ -20,14 +25,14 @@ export class Host extends ASImport { let output = str.map((v: any, i:number, a: any[]): string => v + (space as any).repeat(len - v.length + 1) + "|"); let dash = "-"; let line = (dash as any).repeat(len+2); - console.log([line,output.join('\n'+line+'\n'),line].join("\n")); + this.stdout([line,output.join('\n'+line+'\n'),line].join("\n")); } _log_str(x: number): void { - return console.log(this.memory.getString(x)) + return this.stdout(this.memory.getString(x)) } - _logi(x: number): void { console.log(x) } + _logi(x: number): void { this.stdout(x.toString()) } - _logf(x:number): void { console.log(x) } + _logf(x:number): void { this.stdout(x.toString()) } } From 50185296ac6354f8c7a5da77a324b94808d32a6c Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Tue, 19 Feb 2019 09:54:48 -0500 Subject: [PATCH 36/46] update compiled js and types --- lib/host/lib/host.d.ts | 2 ++ lib/host/lib/host.js | 37 ++++++++++++++++++------------------- 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/lib/host/lib/host.d.ts b/lib/host/lib/host.d.ts index 2990fc76c9..1ec73fd7ac 100644 --- a/lib/host/lib/host.d.ts +++ b/lib/host/lib/host.d.ts @@ -1,5 +1,7 @@ import { ASImport } from "./ASImport"; export declare class Host extends ASImport { + stdout: (out: string) => void; + constructor(stdout?: (out: string) => void); debug(): void; _log(start: number, sizeof: number): void; _log_str(x: number): void; diff --git a/lib/host/lib/host.js b/lib/host/lib/host.js index 8d52038c9a..a5b2fcf899 100644 --- a/lib/host/lib/host.js +++ b/lib/host/lib/host.js @@ -2,6 +2,10 @@ Object.defineProperty(exports, "__esModule", { value: true }); const ASImport_1 = require("./ASImport"); class Host extends ASImport_1.ASImport { + constructor(stdout = console.log) { + super(); + this.stdout = stdout; + } debug() { // tslint:disable-next-line debugger; @@ -9,28 +13,23 @@ class Host extends ASImport_1.ASImport { _log(start, sizeof) { let begin = start >> 2; let size = sizeof >> 2; - if (size == 1) { - console.log(start); - } - else { - let str = []; - let len = 0; - for (let i = begin; i < begin + size; i++) { - let line = `| ${i} | ${this.memory.I32[i] >> 2}`; - len = Math.max(len, line.length); - str.push(line); - } - let space = " "; - let output = str.map((v, i, a) => v + space.repeat(len - v.length + 1) + "|"); - let dash = "-"; - let line = dash.repeat(len + 2); - console.log([line, output.join('\n' + line + '\n'), line].join("\n")); + let str = []; + let len = 0; + for (let i = begin; i < begin + size; i++) { + let line = `| ${i} | ${this.memory.I32[i] >> 2}`; + len = Math.max(len, line.length); + str.push(line); } + let space = " "; + let output = str.map((v, i, a) => v + space.repeat(len - v.length + 1) + "|"); + let dash = "-"; + let line = dash.repeat(len + 2); + this.stdout([line, output.join('\n' + line + '\n'), line].join("\n")); } _log_str(x) { - return console.log(this.memory.getString(x)); + return this.stdout(this.memory.getString(x)); } - _logi(x) { console.log(x); } - _logf(x) { console.log(x); } + _logi(x) { this.stdout(x.toString()); } + _logf(x) { this.stdout(x.toString()); } } exports.Host = Host; From 19941936178efd98cba021b6872d97b3204a018d Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Tue, 19 Feb 2019 11:22:02 -0500 Subject: [PATCH 37/46] Made stdout static --- lib/host/src/host.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/host/src/host.ts b/lib/host/src/host.ts index 5a107280d0..120632b3db 100644 --- a/lib/host/src/host.ts +++ b/lib/host/src/host.ts @@ -1,10 +1,7 @@ import {ASImport} from "./ASImport"; export class Host extends ASImport { - - constructor(public stdout: (out:string) => void = console.log){ - super() - } + static stdout : (out:string) => void = console.log; debug (): void { // tslint:disable-next-line @@ -25,14 +22,15 @@ export class Host extends ASImport { let output = str.map((v: any, i:number, a: any[]): string => v + (space as any).repeat(len - v.length + 1) + "|"); let dash = "-"; let line = (dash as any).repeat(len+2); - this.stdout([line,output.join('\n'+line+'\n'),line].join("\n")); + Host.stdout([line,output.join('\n'+line+'\n'),line].join("\n")); } _log_str(x: number): void { - return this.stdout(this.memory.getString(x)) + let memory = this.memory; + return Host.stdout(memory.getString(x)) } - _logi(x: number): void { this.stdout(x.toString()) } + _logi(x: number): void { Host.stdout(x.toString()) } - _logf(x:number): void { this.stdout(x.toString()) } + _logf(x:number): void { Host.stdout(x.toString()) } } From f4b3ab1a0788e8307160b051c356686d20a53f68 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Tue, 19 Feb 2019 11:26:29 -0500 Subject: [PATCH 38/46] Forgot js and types --- lib/host/lib/host.d.ts | 3 +-- lib/host/lib/host.js | 14 ++++++-------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/host/lib/host.d.ts b/lib/host/lib/host.d.ts index 1ec73fd7ac..27207e4ceb 100644 --- a/lib/host/lib/host.d.ts +++ b/lib/host/lib/host.d.ts @@ -1,7 +1,6 @@ import { ASImport } from "./ASImport"; export declare class Host extends ASImport { - stdout: (out: string) => void; - constructor(stdout?: (out: string) => void); + static stdout: (out: string) => void; debug(): void; _log(start: number, sizeof: number): void; _log_str(x: number): void; diff --git a/lib/host/lib/host.js b/lib/host/lib/host.js index a5b2fcf899..157017d39a 100644 --- a/lib/host/lib/host.js +++ b/lib/host/lib/host.js @@ -2,10 +2,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); const ASImport_1 = require("./ASImport"); class Host extends ASImport_1.ASImport { - constructor(stdout = console.log) { - super(); - this.stdout = stdout; - } debug() { // tslint:disable-next-line debugger; @@ -24,12 +20,14 @@ class Host extends ASImport_1.ASImport { let output = str.map((v, i, a) => v + space.repeat(len - v.length + 1) + "|"); let dash = "-"; let line = dash.repeat(len + 2); - this.stdout([line, output.join('\n' + line + '\n'), line].join("\n")); + Host.stdout([line, output.join('\n' + line + '\n'), line].join("\n")); } _log_str(x) { - return this.stdout(this.memory.getString(x)); + let memory = this.memory; + return Host.stdout(memory.getString(x)); } - _logi(x) { this.stdout(x.toString()); } - _logf(x) { this.stdout(x.toString()); } + _logi(x) { Host.stdout(x.toString()); } + _logf(x) { Host.stdout(x.toString()); } } +Host.stdout = console.log; exports.Host = Host; From cdd09e8d1f056e7cd0e90e22bd4e15cf4f844919 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Tue, 19 Feb 2019 12:13:07 -0500 Subject: [PATCH 39/46] pass string pointer --- lib/host/lib/host.d.ts | 2 +- lib/host/lib/host.js | 3 +-- lib/host/src/host.ts | 5 ++--- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/host/lib/host.d.ts b/lib/host/lib/host.d.ts index 27207e4ceb..07d09017e0 100644 --- a/lib/host/lib/host.d.ts +++ b/lib/host/lib/host.d.ts @@ -1,6 +1,6 @@ import { ASImport } from "./ASImport"; export declare class Host extends ASImport { - static stdout: (out: string) => void; + static stdout: (out: string | number) => void; debug(): void; _log(start: number, sizeof: number): void; _log_str(x: number): void; diff --git a/lib/host/lib/host.js b/lib/host/lib/host.js index 157017d39a..50377da700 100644 --- a/lib/host/lib/host.js +++ b/lib/host/lib/host.js @@ -23,8 +23,7 @@ class Host extends ASImport_1.ASImport { Host.stdout([line, output.join('\n' + line + '\n'), line].join("\n")); } _log_str(x) { - let memory = this.memory; - return Host.stdout(memory.getString(x)); + return Host.stdout(x); } _logi(x) { Host.stdout(x.toString()); } _logf(x) { Host.stdout(x.toString()); } diff --git a/lib/host/src/host.ts b/lib/host/src/host.ts index 120632b3db..16cdca7a2f 100644 --- a/lib/host/src/host.ts +++ b/lib/host/src/host.ts @@ -1,7 +1,7 @@ import {ASImport} from "./ASImport"; export class Host extends ASImport { - static stdout : (out:string) => void = console.log; + static stdout : (out:string|number) => void = console.log; debug (): void { // tslint:disable-next-line @@ -26,8 +26,7 @@ export class Host extends ASImport { } _log_str(x: number): void { - let memory = this.memory; - return Host.stdout(memory.getString(x)) + return Host.stdout(x) } _logi(x: number): void { Host.stdout(x.toString()) } From 8739db19429ed99a4e5ddf4c6cdfa6de3be48c3e Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Sun, 24 Feb 2019 11:02:34 -0500 Subject: [PATCH 40/46] Made more files public when installed via git --- package.json | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 3d6724c7d4..6e0fab3af7 100644 --- a/package.json +++ b/package.json @@ -53,12 +53,7 @@ "docs": "typedoc --tsconfig tsconfig-docs.json --mode modules --name \"AssemblyScript Compiler API\" --out ./docs/api --ignoreCompilerErrors --excludeNotExported --excludePrivate --excludeExternals --exclude **/std/** --includeDeclarations --readme src/README.md" }, "files": [ - "lib/loader/index.d.ts", - "lib/loader/index.js", - "lib/loader/README.md", - "lib/host/assembly/index.ts", - "lib/host/lib/index.js", - "lib/host/lib/index.d.ts", + "lib/", "bin/", "cli/", "dist/", @@ -71,6 +66,7 @@ "README.md", "src/", "std/", - "tsconfig-base.json" + "tsconfig-base.json", + "tslint.json" ] } From 2da3b63f1c0dce84ee68cc109f478779555de45d Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Wed, 5 Dec 2018 08:37:28 -0500 Subject: [PATCH 41/46] Allow asynchronous file read/writes for cli. --- cli/asc.js | 103 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 70 insertions(+), 33 deletions(-) diff --git a/cli/asc.js b/cli/asc.js index 151a6c1322..85b9cbb586 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -92,33 +92,41 @@ exports.definitionFiles = exports.isBundle ? BUNDLE_DEFINITIONS : (() => { // se })(); /** Convenience function that parses and compiles source strings directly. */ -exports.compileString = (sources, options) => { +exports.compileString = async (sources, options) => { if (typeof sources === "string") sources = { "input.ts": sources }; const output = Object.create({ stdout: createMemoryStream(), stderr: createMemoryStream() }); - var argv = [ - "--binaryFile", "binary", - "--textFile", "text", - ]; + debugger; + var argv = []; Object.keys(options || {}).forEach(key => { - var val = options[key]; - if (Array.isArray(val)) val.forEach(val => argv.push("--" + key, String(val))); - else argv.push("--" + key, String(val)); + if (key != "readFile" && key != 'writeFile'){ + var val = options[key]; + debugger; + if (Array.isArray(val)) val.forEach(val => argv.push("--" + key, String(val))); + else argv.push("--" + key, String(val)); + } }); - exports.main(argv.concat(Object.keys(sources)), { + await exports.main(argv.concat(Object.keys(sources)), { stdout: output.stdout, stderr: output.stderr, - readFile: name => sources.hasOwnProperty(name) ? sources[name] : null, - writeFile: (name, contents) => output[name] = contents, + readFile: async (name) => { + try { + return await options.readFile(name); + }catch (e){ + return null; + } + }, + writeFile: async (name, contents) => await options.writeFile(name, contents), listFiles: () => [] }); + debugger; return output; } /** Runs the command line utility using the specified arguments array. */ -exports.main = function main(argv, options, callback) { +exports.main = async function main(argv, options, callback) { if (typeof options === "function") { callback = options; options = {}; @@ -226,7 +234,7 @@ exports.main = function main(argv, options, callback) { // Begin parsing var parser = null; - + debugger; // Include library files if (!args.noLib) { Object.keys(exports.libraryFiles).forEach(libPath => { @@ -268,7 +276,7 @@ exports.main = function main(argv, options, callback) { } for (let j = 0, l = libFiles.length; j < l; ++j) { let libPath = libFiles[j]; - let libText = readFile(libPath, libDir); + let libText = await readFile(path.join(libDir, libPath)); if (libText === null) return callback(Error("Library file '" + libPath + "' not found.")); stats.parseCount++; stats.parseTime += measure(() => { @@ -283,9 +291,33 @@ exports.main = function main(argv, options, callback) { } } - // Parses the backlog of imported files after including entry files - function parseBacklog() { - var sourcePath, sourceText; + // Include entry files + for (let i = 0, k = argv.length; i < k; ++i) { + const filename = argv[i]; + if (filename == "undefined") continue; + + let sourcePath = String(filename).replace(/\\/g, "/").replace(/(\.ts|\/)$/, ""); + + // Try entryPath.ts, then entryPath/index.ts + let sourceText = await readFile(path.join(baseDir, sourcePath) + ".ts"); + if (sourceText === null) { + sourceText = await readFile(path.join(baseDir, sourcePath, "index.ts")); + if (sourceText === null) { + return callback(Error("Entry file '" + sourcePath + ".ts' not found.")); + } else { + sourcePath += "/index.ts"; + } + } else { + sourcePath += ".ts"; + } + debugger; + + stats.parseCount++; + stats.parseTime += measure(() => { + parser = assemblyscript.parseFile(sourceText, sourcePath, true, parser); + }); + + // Process backlog while ((sourcePath = parser.nextFile()) != null) { // Load library file if explicitly requested @@ -300,12 +332,13 @@ exports.main = function main(argv, options, callback) { sourcePath = exports.libraryPrefix + indexName + ".ts"; } else { for (let i = 0, k = customLibDirs.length; i < k; ++i) { - sourceText = readFile(plainName + ".ts", customLibDirs[i]); + const dir = customLibDirs[i]; + sourceText = await readFile(path.join(dir, plainName + ".ts")); if (sourceText !== null) { sourcePath = exports.libraryPrefix + plainName + ".ts"; break; } else { - sourceText = readFile(indexName + ".ts", customLibDirs[i]); + sourceText = await readFile(path.join(dir, indexName + ".ts")); if (sourceText !== null) { sourcePath = exports.libraryPrefix + indexName + ".ts"; break; @@ -318,11 +351,11 @@ exports.main = function main(argv, options, callback) { } else { const plainName = sourcePath; const indexName = sourcePath + "/index"; - sourceText = readFile(plainName + ".ts", baseDir); + sourceText = await readFile(path.join(baseDir, plainName + ".ts")); if (sourceText !== null) { sourcePath = plainName + ".ts"; } else { - sourceText = readFile(indexName + ".ts", baseDir); + sourceText = await readFile(path.join(baseDir, indexName + ".ts")); if (sourceText !== null) { sourcePath = indexName + ".ts"; } else if (!plainName.startsWith(".")) { @@ -335,12 +368,12 @@ exports.main = function main(argv, options, callback) { } else { for (let i = 0, k = customLibDirs.length; i < k; ++i) { const dir = customLibDirs[i]; - sourceText = readFile(plainName + ".ts", customLibDirs[i]); + sourceText = await readFile(path.join(dir, plainName + ".ts")); if (sourceText !== null) { sourcePath = exports.libraryPrefix + plainName + ".ts"; break; } else { - sourceText = readFile(indexName + ".ts", customLibDirs[i]); + sourceText = await readFile(path.join(dir, indexName + ".ts")); if (sourceText !== null) { sourcePath = exports.libraryPrefix + indexName + ".ts"; break; @@ -555,7 +588,7 @@ exports.main = function main(argv, options, callback) { args.binaryFile = args.outFile; } } - + debugger; // Write binary if (args.binaryFile != null) { let sourceMapURL = args.sourceMap != null @@ -571,7 +604,7 @@ exports.main = function main(argv, options, callback) { }); if (args.binaryFile.length) { - writeFile(args.binaryFile, wasm.output, baseDir); + await writeFile(path.join(baseDir, args.binaryFile), wasm.output); } else { writeStdout(wasm.output); hasStdout = true; @@ -583,7 +616,7 @@ exports.main = function main(argv, options, callback) { if (args.binaryFile.length) { let sourceMap = JSON.parse(wasm.sourceMap); sourceMap.sourceRoot = exports.sourceMapRoot; - sourceMap.sources.forEach((name, index) => { + sourceMap.sources.forEach(async (name, index) => { let text = null; if (name.startsWith(exports.libraryPrefix)) { let stdName = name.substring(exports.libraryPrefix.length).replace(/\.ts$/, ""); @@ -591,12 +624,15 @@ exports.main = function main(argv, options, callback) { text = exports.libraryFiles[stdName]; } else { for (let i = 0, k = customLibDirs.length; i < k; ++i) { - text = readFile(name.substring(exports.libraryPrefix.length), customLibDirs[i]); + text = await readFile(path.join( + customLibDirs[i], + name.substring(exports.libraryPrefix.length)) + ); if (text !== null) break; } } } else { - text = readFile(name, baseDir); + text = await readFile(path.join(baseDir, name)); } if (text === null) { return callback(Error("Source file '" + name + "' not found.")); @@ -604,7 +640,8 @@ exports.main = function main(argv, options, callback) { if (!sourceMap.sourceContents) sourceMap.sourceContents = []; sourceMap.sourceContents[index] = text; }); - writeFile(path.join( + await writeFile(path.join( + baseDir, path.dirname(args.binaryFile), path.basename(sourceMapURL) ).replace(/^\.\//, ""), JSON.stringify(sourceMap), baseDir); @@ -622,7 +659,7 @@ exports.main = function main(argv, options, callback) { stats.emitTime += measure(() => { asm = module.toAsmjs(); }); - writeFile(args.asmjsFile, asm, baseDir); + await writeFile(path.join(baseDir, args.asmjsFile), asm); } else if (!hasStdout) { stats.emitCount++; stats.emitTime += measure(() => { @@ -642,7 +679,7 @@ exports.main = function main(argv, options, callback) { stats.emitTime += measure(() => { idl = assemblyscript.buildIDL(program); }); - writeFile(args.idlFile, idl, baseDir); + await writeFile(path.join(baseDir, args.idlFile), idl); } else if (!hasStdout) { stats.emitCount++; stats.emitTime += measure(() => { @@ -662,7 +699,7 @@ exports.main = function main(argv, options, callback) { stats.emitTime += measure(() => { tsd = assemblyscript.buildTSD(program); }); - writeFile(args.tsdFile, tsd, baseDir); + await writeFile(path.join(baseDir, args.tsdFile), tsd); } else if (!hasStdout) { stats.emitCount++; stats.emitTime += measure(() => { @@ -682,7 +719,7 @@ exports.main = function main(argv, options, callback) { stats.emitTime += measure(() => { wat = module.toText(); }); - writeFile(args.textFile, wat, baseDir); + await writeFile(path.join(baseDir, args.textFile), wat); } else if (!hasStdout) { stats.emitCount++; stats.emitTime += measure(() => { From a88a5b946da3572c2eaf42d40e842a5481617ff6 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Mon, 14 Jan 2019 14:32:52 -0500 Subject: [PATCH 42/46] Compiler emits an empty program. --- bin/asc | 9 ++- cli/asc.js | 188 +++++++++++++++++++++------------------------- tests/compiler.js | 25 +++--- 3 files changed, 107 insertions(+), 115 deletions(-) diff --git a/bin/asc b/bin/asc index 89ac616d4c..64ee56b994 100755 --- a/bin/asc +++ b/bin/asc @@ -1,3 +1,10 @@ #!/usr/bin/env node const asc = module.exports = require("../cli/asc.js"); -if (/\basc$/.test(process.argv[1])) process.exitCode = asc.main(process.argv.slice(2)); + +async function main(){ + if (/\basc$/.test(process.argv[1])) { + console.log(process.argv.slice(2)); + process.exitCode = await asc.main(process.argv.slice(2)); + } +} +main(); diff --git a/cli/asc.js b/cli/asc.js index 85b9cbb586..c08e0ccdb6 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -98,12 +98,10 @@ exports.compileString = async (sources, options) => { stdout: createMemoryStream(), stderr: createMemoryStream() }); - debugger; var argv = []; Object.keys(options || {}).forEach(key => { if (key != "readFile" && key != 'writeFile'){ var val = options[key]; - debugger; if (Array.isArray(val)) val.forEach(val => argv.push("--" + key, String(val))); else argv.push("--" + key, String(val)); } @@ -121,7 +119,6 @@ exports.compileString = async (sources, options) => { writeFile: async (name, contents) => await options.writeFile(name, contents), listFiles: () => [] }); - debugger; return output; } @@ -133,7 +130,6 @@ exports.main = async function main(argv, options, callback) { } else if (!options) { options = {}; } - const stdout = options.stdout || process.stdout; const stderr = options.stderr || process.stderr; const readFile = options.readFile || readFileNode; @@ -237,6 +233,7 @@ exports.main = async function main(argv, options, callback) { debugger; // Include library files if (!args.noLib) { + debugger; Object.keys(exports.libraryFiles).forEach(libPath => { if (libPath.indexOf("/") >= 0) return; // in sub-directory: imported on demand stats.parseCount++; @@ -291,116 +288,95 @@ exports.main = async function main(argv, options, callback) { } } - // Include entry files - for (let i = 0, k = argv.length; i < k; ++i) { - const filename = argv[i]; - if (filename == "undefined") continue; - - let sourcePath = String(filename).replace(/\\/g, "/").replace(/(\.ts|\/)$/, ""); - - // Try entryPath.ts, then entryPath/index.ts - let sourceText = await readFile(path.join(baseDir, sourcePath) + ".ts"); - if (sourceText === null) { - sourceText = await readFile(path.join(baseDir, sourcePath, "index.ts")); - if (sourceText === null) { - return callback(Error("Entry file '" + sourcePath + ".ts' not found.")); - } else { - sourcePath += "/index.ts"; - } - } else { - sourcePath += ".ts"; - } - debugger; - - stats.parseCount++; - stats.parseTime += measure(() => { - parser = assemblyscript.parseFile(sourceText, sourcePath, true, parser); - }); - - // Process backlog - while ((sourcePath = parser.nextFile()) != null) { - - // Load library file if explicitly requested - if (sourcePath.startsWith(exports.libraryPrefix)) { - const plainName = sourcePath.substring(exports.libraryPrefix.length); - const indexName = sourcePath.substring(exports.libraryPrefix.length) + "/index"; - if (exports.libraryFiles.hasOwnProperty(plainName)) { - sourceText = exports.libraryFiles[plainName]; - sourcePath = exports.libraryPrefix + plainName + ".ts"; - } else if (exports.libraryFiles.hasOwnProperty(indexName)) { - sourceText = exports.libraryFiles[indexName]; - sourcePath = exports.libraryPrefix + indexName + ".ts"; - } else { - for (let i = 0, k = customLibDirs.length; i < k; ++i) { - const dir = customLibDirs[i]; - sourceText = await readFile(path.join(dir, plainName + ".ts")); - if (sourceText !== null) { - sourcePath = exports.libraryPrefix + plainName + ".ts"; - break; - } else { - sourceText = await readFile(path.join(dir, indexName + ".ts")); + // Parses the backlog of imported files after including entry files + async function parseBacklog() { + var sourcePath, sourceText; + // Process backlog + while ((sourcePath = parser.nextFile()) != null) { + console.log(`parsing backlog: ${sourcePath}`); + + // Load library file if explicitly requested + if (sourcePath.startsWith(exports.libraryPrefix)) { + const plainName = sourcePath.substring(exports.libraryPrefix.length); + const indexName = sourcePath.substring(exports.libraryPrefix.length) + "/index"; + if (exports.libraryFiles.hasOwnProperty(plainName)) { + sourceText = exports.libraryFiles[plainName]; + sourcePath = exports.libraryPrefix + plainName + ".ts"; + } else if (exports.libraryFiles.hasOwnProperty(indexName)) { + sourceText = exports.libraryFiles[indexName]; + sourcePath = exports.libraryPrefix + indexName + ".ts"; + } else { + for (let i = 0, k = customLibDirs.length; i < k; ++i) { + const dir = customLibDirs[i]; + sourceText = await readFile(path.join(dir, plainName + ".ts")); if (sourceText !== null) { - sourcePath = exports.libraryPrefix + indexName + ".ts"; + sourcePath = exports.libraryPrefix + plainName + ".ts"; break; + } else { + sourceText = await readFile(path.join(dir, indexName + ".ts")); + if (sourceText !== null) { + sourcePath = exports.libraryPrefix + indexName + ".ts"; + break; + } } } } - } - // Otherwise try nextFile.ts, nextFile/index.ts, ~lib/nextFile.ts, ~lib/nextFile/index.ts - } else { - const plainName = sourcePath; - const indexName = sourcePath + "/index"; - sourceText = await readFile(path.join(baseDir, plainName + ".ts")); - if (sourceText !== null) { - sourcePath = plainName + ".ts"; + // Otherwise try nextFile.ts, nextFile/index.ts, ~lib/nextFile.ts, ~lib/nextFile/index.ts } else { - sourceText = await readFile(path.join(baseDir, indexName + ".ts")); + const plainName = sourcePath; + const indexName = sourcePath + "/index"; + sourceText = await readFile(path.join(baseDir, plainName + ".ts")); if (sourceText !== null) { - sourcePath = indexName + ".ts"; - } else if (!plainName.startsWith(".")) { - if (exports.libraryFiles.hasOwnProperty(plainName)) { - sourceText = exports.libraryFiles[plainName]; - sourcePath = exports.libraryPrefix + plainName + ".ts"; - } else if (exports.libraryFiles.hasOwnProperty(indexName)) { - sourceText = exports.libraryFiles[indexName]; - sourcePath = exports.libraryPrefix + indexName + ".ts"; - } else { - for (let i = 0, k = customLibDirs.length; i < k; ++i) { - const dir = customLibDirs[i]; - sourceText = await readFile(path.join(dir, plainName + ".ts")); - if (sourceText !== null) { - sourcePath = exports.libraryPrefix + plainName + ".ts"; - break; - } else { - sourceText = await readFile(path.join(dir, indexName + ".ts")); + sourcePath = plainName + ".ts"; + } else { + sourceText = await readFile(path.join(baseDir, indexName + ".ts")); + if (sourceText !== null) { + sourcePath = indexName + ".ts"; + } else if (!plainName.startsWith(".")) { + if (exports.libraryFiles.hasOwnProperty(plainName)) { + sourceText = exports.libraryFiles[plainName]; + sourcePath = exports.libraryPrefix + plainName + ".ts"; + } else if (exports.libraryFiles.hasOwnProperty(indexName)) { + sourceText = exports.libraryFiles[indexName]; + sourcePath = exports.libraryPrefix + indexName + ".ts"; + } else { + for (let i = 0, k = customLibDirs.length; i < k; ++i) { + const dir = customLibDirs[i]; + sourceText = await readFile(path.join(dir, plainName + ".ts")); if (sourceText !== null) { - sourcePath = exports.libraryPrefix + indexName + ".ts"; + sourcePath = exports.libraryPrefix + plainName + ".ts"; break; + } else { + sourceText = await readFile(path.join(dir, indexName + ".ts")); + if (sourceText !== null) { + sourcePath = exports.libraryPrefix + indexName + ".ts"; + break; + } } } } } } } + if (sourceText == null) { + return callback(Error("Import file '" + sourcePath + ".ts' not found.")); + } + console.log(`has source text ${sourceText.length}`) + stats.parseCount++; + stats.parseTime += measure(() => { + assemblyscript.parseFile(sourceText, sourcePath, false, parser); + }); } - if (sourceText == null) { - return callback(Error("Import file '" + sourcePath + ".ts' not found.")); + if (checkDiagnostics(parser, stderr)) { + return callback(Error("Parse error")); } - stats.parseCount++; - stats.parseTime += measure(() => { - assemblyscript.parseFile(sourceText, sourcePath, false, parser); - }); - } - if (checkDiagnostics(parser, stderr)) { - return callback(Error("Parse error")); - } } // Include entry files for (let i = 0, k = argv.length; i < k; ++i) { const filename = argv[i]; - + if (filename == "undefined") continue; let sourcePath = String(filename).replace(/\\/g, "/").replace(/(\.ts|\/)$/, ""); // Try entryPath.ts, then entryPath/index.ts @@ -420,18 +396,19 @@ exports.main = async function main(argv, options, callback) { stats.parseTime += measure(() => { parser = assemblyscript.parseFile(sourceText, sourcePath, true, parser); }); - let code = parseBacklog(); + let code = await parseBacklog(); if (code) return code; } applyTransform("afterParse", parser); { - let code = parseBacklog(); + let code = await parseBacklog(); if (code) return code; } // Finish parsing const program = assemblyscript.finishParsing(parser); + debugger; // Set up optimization levels var optimizeLevel = 0; @@ -493,13 +470,15 @@ exports.main = async function main(argv, options, callback) { assemblyscript.enableFeature(compilerOptions, flag); } } - + console.log(program.sources); var module; stats.compileCount++; (() => { try { stats.compileTime += measure(() => { module = assemblyscript.compileProgram(program, compilerOptions); + console.log(compilerOptions); + console.log(module.toText()); }); } catch (e) { return callback(e); @@ -588,7 +567,6 @@ exports.main = async function main(argv, options, callback) { args.binaryFile = args.outFile; } } - debugger; // Write binary if (args.binaryFile != null) { let sourceMapURL = args.sourceMap != null @@ -736,28 +714,33 @@ exports.main = async function main(argv, options, callback) { } return callback(null); - function readFileNode(filename, baseDir) { + async function readFileNode(filename, baseDir) { try { let text; + let _path = baseDir ? path.join(baseDir, filename) : filename; + console.log(`Reading ${_path}, ${filename}, ${baseDir}`); stats.readCount++; stats.readTime += measure(() => { - text = fs.readFileSync(path.join(baseDir, filename), { encoding: "utf8" }); + text = fs.readFileSync(_path, { encoding: "utf8" }); }); + debugger; return text; } catch (e) { + console.log(e) return null; } } - function writeFileNode(filename, contents, baseDir) { + async function writeFileNode(filename, contents, baseDir) { try { + let _path = baseDir ? path.join(baseDir, filename) : filename; stats.writeCount++; stats.writeTime += measure(() => { - mkdirp(path.join(baseDir, path.dirname(filename))); + mkdirp(path.dirname(_path)); if (typeof contents === "string") { - fs.writeFileSync(path.join(baseDir, filename), contents, { encoding: "utf8" } ); + fs.writeFileSync(_path, contents, { encoding: "utf8" } ); } else { - fs.writeFileSync(path.join(baseDir, filename), contents); + fs.writeFileSync(_path, contents); } }); return true; @@ -767,10 +750,11 @@ exports.main = async function main(argv, options, callback) { } function listFilesNode(dirname, baseDir) { + let _path = dirname ? path.join(baseDir, dirname): dirname; var files; try { stats.readTime += measure(() => { - files = fs.readdirSync(path.join(baseDir, dirname)).filter(file => /^(?!.*\.d\.ts$).*\.ts$/.test(file)); + files = fs.readdirSync(_path).filter(file => /^(?!.*\.d\.ts$).*\.ts$/.test(file)); }); return files; } catch (e) { diff --git a/tests/compiler.js b/tests/compiler.js index a5aa1cf792..56dff8d82f 100644 --- a/tests/compiler.js +++ b/tests/compiler.js @@ -78,7 +78,7 @@ function getExpectedErrors(filePath) { } // TODO: asc's callback is synchronous here. This might change. -tests.forEach(filename => { +Promise.all(tests.map( async (filename) => { console.log(colorsUtil.white("Testing compiler/" + filename) + "\n"); const expectedErrors = getExpectedErrors(path.join(basedir, filename)); @@ -101,12 +101,13 @@ tests.forEach(filename => { "--debug", "--textFile" // -> stdout ]; + console.log(basedir) if (args.createBinary) cmd.push("--binaryFile", basename + ".untouched.wasm"); - asc.main(cmd, { + await asc.main(cmd, { stdout: stdout, stderr: stderr - }, err => { + }, async (err) => { console.log(); if (expectedErrors) { @@ -168,10 +169,10 @@ tests.forEach(filename => { ]; if (args.create) cmd.push("--textFile", basename + ".optimized.wat"); - asc.main(cmd, { + await asc.main(cmd, { stdout: stdout, stderr: stderr - }, err => { + }, async (err) => { console.log(); if (err) stderr.write(err.stack + os.EOL); @@ -259,10 +260,10 @@ tests.forEach(filename => { console.log(); }); }); -}); - -if (failedTests.length) { - process.exitCode = 1; - console.log(colorsUtil.red("ERROR: ") + failedTests.length + " compiler tests failed: " + failedTests.join(", ")); -} else - console.log("[ " + colorsUtil.white("SUCCESS") + " ]"); +})).then(() =>{ + if (failedTests.length) { + process.exitCode = 1; + console.log(colorsUtil.red("ERROR: ") + failedTests.length + " compiler tests failed: " + failedTests.join(", ")); + } else + console.log("[ " + colorsUtil.white("SUCCESS") + " ]"); +}) From cfb9ac0856b4203a8151e2e309ccfe7818422443 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Mon, 14 Jan 2019 14:52:15 -0500 Subject: [PATCH 43/46] Forgot two awaits. And cleaned up print statements. --- bin/asc | 1 - cli/asc.js | 15 ++------------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/bin/asc b/bin/asc index 64ee56b994..14ff9d2b39 100755 --- a/bin/asc +++ b/bin/asc @@ -3,7 +3,6 @@ const asc = module.exports = require("../cli/asc.js"); async function main(){ if (/\basc$/.test(process.argv[1])) { - console.log(process.argv.slice(2)); process.exitCode = await asc.main(process.argv.slice(2)); } } diff --git a/cli/asc.js b/cli/asc.js index c08e0ccdb6..9aa2269c75 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -230,10 +230,8 @@ exports.main = async function main(argv, options, callback) { // Begin parsing var parser = null; - debugger; // Include library files if (!args.noLib) { - debugger; Object.keys(exports.libraryFiles).forEach(libPath => { if (libPath.indexOf("/") >= 0) return; // in sub-directory: imported on demand stats.parseCount++; @@ -293,8 +291,6 @@ exports.main = async function main(argv, options, callback) { var sourcePath, sourceText; // Process backlog while ((sourcePath = parser.nextFile()) != null) { - console.log(`parsing backlog: ${sourcePath}`); - // Load library file if explicitly requested if (sourcePath.startsWith(exports.libraryPrefix)) { const plainName = sourcePath.substring(exports.libraryPrefix.length); @@ -362,7 +358,6 @@ exports.main = async function main(argv, options, callback) { if (sourceText == null) { return callback(Error("Import file '" + sourcePath + ".ts' not found.")); } - console.log(`has source text ${sourceText.length}`) stats.parseCount++; stats.parseTime += measure(() => { assemblyscript.parseFile(sourceText, sourcePath, false, parser); @@ -380,9 +375,9 @@ exports.main = async function main(argv, options, callback) { let sourcePath = String(filename).replace(/\\/g, "/").replace(/(\.ts|\/)$/, ""); // Try entryPath.ts, then entryPath/index.ts - let sourceText = readFile(sourcePath + ".ts", baseDir); + let sourceText = await readFile(sourcePath + ".ts", baseDir); if (sourceText === null) { - sourceText = readFile(sourcePath + "/index.ts", baseDir); + sourceText = await readFile(sourcePath + "/index.ts", baseDir); if (sourceText === null) { return callback(Error("Entry file '" + sourcePath + ".ts' not found.")); } else { @@ -408,7 +403,6 @@ exports.main = async function main(argv, options, callback) { // Finish parsing const program = assemblyscript.finishParsing(parser); - debugger; // Set up optimization levels var optimizeLevel = 0; @@ -470,15 +464,12 @@ exports.main = async function main(argv, options, callback) { assemblyscript.enableFeature(compilerOptions, flag); } } - console.log(program.sources); var module; stats.compileCount++; (() => { try { stats.compileTime += measure(() => { module = assemblyscript.compileProgram(program, compilerOptions); - console.log(compilerOptions); - console.log(module.toText()); }); } catch (e) { return callback(e); @@ -718,12 +709,10 @@ exports.main = async function main(argv, options, callback) { try { let text; let _path = baseDir ? path.join(baseDir, filename) : filename; - console.log(`Reading ${_path}, ${filename}, ${baseDir}`); stats.readCount++; stats.readTime += measure(() => { text = fs.readFileSync(_path, { encoding: "utf8" }); }); - debugger; return text; } catch (e) { console.log(e) From 92f5029e35ddbb5144c7e233e8588ae75a17cb29 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Mon, 14 Jan 2019 16:19:55 -0500 Subject: [PATCH 44/46] Fixed up compileString and added test. --- cli/asc.d.ts | 8 ++++---- cli/asc.js | 16 ++++++++++++++-- tests/stringCompile.ts | 23 +++++++++++++++++++++++ 3 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 tests/stringCompile.ts diff --git a/cli/asc.d.ts b/cli/asc.d.ts index 8c745f9743..83bf7a8086 100644 --- a/cli/asc.d.ts +++ b/cli/asc.d.ts @@ -69,7 +69,7 @@ interface CompilerOptions { } /** Convenience function that parses and compiles source strings directly. */ -export function compileString(sources: { [key: string]: string } | string, options?: CompilerOptions): { +export function compileString(sources: { [key: string]: string } | string, options?: CompilerOptions): Promise<{ /** Standard output. */ stdout: OutputStream, /** Standard error. */ @@ -78,11 +78,11 @@ export function compileString(sources: { [key: string]: string } | string, optio binary: Uint8Array | null, /** Emitted text format. */ text: string | null -} +}> /** Runs the command line utility using the specified arguments array. */ -export function main(argv: string[], options: CompilerOptions, callback?: (err: Error | null) => number): number; -export function main(argv: string[], callback?: (err: Error | null) => number): number; +export function main(argv: string[], options: CompilerOptions, callback?: (err: Error | null) => number): Promise; +export function main(argv: string[], callback?: (err: Error | null) => number): Promise; /** Checks diagnostics emitted so far for errors. */ export function checkDiagnostics(emitter: any, stderr?: OutputStream): boolean; diff --git a/cli/asc.js b/cli/asc.js index 9aa2269c75..f77ebab124 100644 --- a/cli/asc.js +++ b/cli/asc.js @@ -98,7 +98,11 @@ exports.compileString = async (sources, options) => { stdout: createMemoryStream(), stderr: createMemoryStream() }); - var argv = []; + var argv = [ + "--binaryFile", "binary", + "--textFile", "text" + ]; + options = options || {}; Object.keys(options || {}).forEach(key => { if (key != "readFile" && key != 'writeFile'){ var val = options[key]; @@ -106,6 +110,11 @@ exports.compileString = async (sources, options) => { else argv.push("--" + key, String(val)); } }); + + options.readFile = options.readFile ? options.readFile : (name) => sources.hasOwnProperty(name) ? sources[name] : null; + + options.writeFile = options.writeFile ? options.writeFile : (name, contents) => output[name] = contents; + await exports.main(argv.concat(Object.keys(sources)), { stdout: output.stdout, stderr: output.stderr, @@ -113,10 +122,13 @@ exports.compileString = async (sources, options) => { try { return await options.readFile(name); }catch (e){ + console.err(e); return null; } }, - writeFile: async (name, contents) => await options.writeFile(name, contents), + writeFile: async (name, contents) => { + await options.writeFile(path.basename(name), contents) + }, listFiles: () => [] }); return output; diff --git a/tests/stringCompile.ts b/tests/stringCompile.ts new file mode 100644 index 0000000000..6c8e7f3d52 --- /dev/null +++ b/tests/stringCompile.ts @@ -0,0 +1,23 @@ + +import * as asc from "../cli/asc"; +import * as assert from "assert"; +import * as loader from "../lib/loader"; + +let source =` +let x = 42; +let y = x + x; + +export function getY(): i32 { + return y; +} +`; +async function main() { + let mod = await asc.compileString(source) + if (mod.stderr) console.log(mod.stderr.toString()) + assert(mod.binary); + let instance: any = loader.instantiateBuffer(mod.binary); + assert(instance.getY()==84); + +} + +main(); From b8307f0afb82bd8a05c4791fb8d6f68e58d743f3 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Mon, 14 Jan 2019 16:25:17 -0500 Subject: [PATCH 45/46] Fixed test to use asnyc. --- tests/browser-asc.js | 130 ++++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 64 deletions(-) diff --git a/tests/browser-asc.js b/tests/browser-asc.js index 2744d047ef..f97f6473c7 100644 --- a/tests/browser-asc.js +++ b/tests/browser-asc.js @@ -8,76 +8,78 @@ const stderr = asc.createMemoryStream(); const files = { "module.ts": `import "allocator/arena";` }; console.log("# asc --version"); +async function main() { + await asc.main([ + "--version" + ], { + stdout: stdout, + stderr: stderr + }, err => { + console.log(">>> STDOUT >>>"); + process.stdout.write(stdout.toString()); + stdout.reset(); + console.log(">>> STDERR >>>"); + process.stdout.write(stderr.toString()); + stderr.reset(); + }); -asc.main([ - "--version" -], { - stdout: stdout, - stderr: stderr -}, err => { - console.log(">>> STDOUT >>>"); - process.stdout.write(stdout.toString()); - stdout.reset(); - console.log(">>> STDERR >>>"); - process.stdout.write(stderr.toString()); - stderr.reset(); -}); + console.log("\n# asc --help"); + + await asc.main([ + "--help" + ], { + stdout: stdout, + stderr: stderr + }, err => { + console.log(">>> STDOUT >>>"); + process.stdout.write(stdout.toString()); + stdout.reset(); + console.log(">>> STDERR >>>"); + process.stdout.write(stderr.toString()); + stderr.reset(); + }); -console.log("\n# asc --help"); + console.log("\n# asc module.ts --textFile"); + + await asc.main([ + "module.ts", + "--textFile" + ], { + stdout: stdout, + stderr: stderr, + readFile: (name, baseDir) => { + console.log("readFile: " + name + ", baseDir=" + baseDir); + if (files.hasOwnProperty(name)) return files[name]; + return null; + }, + writeFile: (name, data, baseDir) => { + console.log("writeFile: " + name + ", baseDir=" + baseDir); + }, + listFiles: (dirname, baseDir) => { + console.log("listFiles: " + dirname + ", baseDir=" + baseDir); + return []; + } + }, err => { + if (err) { + console.log(">>> THROWN >>>"); + console.log(err); + } + }); -asc.main([ - "--help" -], { - stdout: stdout, - stderr: stderr -}, err => { console.log(">>> STDOUT >>>"); process.stdout.write(stdout.toString()); - stdout.reset(); console.log(">>> STDERR >>>"); process.stdout.write(stderr.toString()); - stderr.reset(); -}); - -console.log("\n# asc module.ts --textFile"); - -asc.main([ - "module.ts", - "--textFile" -], { - stdout: stdout, - stderr: stderr, - readFile: (name, baseDir) => { - console.log("readFile: " + name + ", baseDir=" + baseDir); - if (files.hasOwnProperty(name)) return files[name]; - return null; - }, - writeFile: (name, data, baseDir) => { - console.log("writeFile: " + name + ", baseDir=" + baseDir); - }, - listFiles: (dirname, baseDir) => { - console.log("listFiles: " + dirname + ", baseDir=" + baseDir); - return []; - } -}, err => { - if (err) { - console.log(">>> THROWN >>>"); - console.log(err); - } -}); - -console.log(">>> STDOUT >>>"); -process.stdout.write(stdout.toString()); -console.log(">>> STDERR >>>"); -process.stdout.write(stderr.toString()); -console.log("\n# asc.compileString"); + console.log("\n# asc.compileString"); -const output = asc.compileString(`import "allocator/arena";`, { optimizeLevel: 2 }); -console.log(">>> .stdout >>>"); -process.stdout.write(output.stdout.toString()); -console.log(">>> .stderr >>>"); -process.stdout.write(output.stderr.toString()); -console.log(">>> .text >>>"); -process.stdout.write(output.text); -console.log(">>> .binary >>> " + output.binary.length + " bytes"); + const output = await asc.compileString(`import "allocator/arena";`, { optimizeLevel: 2 }); + console.log(">>> .stdout >>>"); + process.stdout.write(output.stdout.toString()); + console.log(">>> .stderr >>>"); + process.stdout.write(output.stderr.toString()); + console.log(">>> .text >>>"); + process.stdout.write(output.text); + console.log(">>> .binary >>> " + output.binary.length + " bytes"); +} +main(); From c76310302753cc812fe26bfda969e431b4741971 Mon Sep 17 00:00:00 2001 From: Willem Wyndham Date: Mon, 25 Feb 2019 14:49:14 -0500 Subject: [PATCH 46/46] test --- dist/asc.js | 2 +- dist/asc.js.map | 2 +- dist/assemblyscript.js | 4 ++-- dist/assemblyscript.js.map | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dist/asc.js b/dist/asc.js index 325588a50d..4dd966a2d2 100644 --- a/dist/asc.js +++ b/dist/asc.js @@ -1,2 +1,2 @@ -!function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n(function(){try{return require("assemblyscript")}catch(e){}}()):"function"==typeof define&&define.amd?define(["assemblyscript"],n):"object"==typeof exports?exports.asc=n(function(){try{return require("assemblyscript")}catch(e){}}()):e.asc=n(e.assemblyscript)}("undefined"!=typeof self?self:this,function(__WEBPACK_EXTERNAL_MODULE__10__){return function(e){var n={};function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var i in e)t.d(r,i,function(n){return e[n]}.bind(null,i));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=4)}([function(e,n,t){var r,i;n.nextTick=function(e){setTimeout(e,0)},n.platform=n.arch=n.execPath=n.title="browser",n.pid=1,n.browser=!0,n.env={},n.argv=[],n.binding=function(e){throw new Error("No such module. (Possibly not yet loaded)")},i="/",n.cwd=function(){return i},n.chdir=function(e){r||(r=t(1)),i=r.resolve(e,i)},n.exit=n.kill=n.umask=n.dlopen=n.uptime=n.memoryUsage=n.uvCounters=function(){},n.features={}},function(e,n,t){(function(e){function t(e,n){for(var t=0,r=e.length-1;r>=0;r--){var i=e[r];"."===i?e.splice(r,1):".."===i?(e.splice(r,1),t++):t&&(e.splice(r,1),t--)}if(n)for(;t--;t)e.unshift("..");return e}var r=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,i=function(e){return r.exec(e).slice(1)};function a(e,n){if(e.filter)return e.filter(n);for(var t=[],r=0;r=-1&&!r;i--){var s=i>=0?arguments[i]:e.cwd();if("string"!=typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(n=s+"/"+n,r="/"===s.charAt(0))}return(r?"/":"")+(n=t(a(n.split("/"),function(e){return!!e}),!r).join("/"))||"."},n.normalize=function(e){var r=n.isAbsolute(e),i="/"===s(e,-1);return(e=t(a(e.split("/"),function(e){return!!e}),!r).join("/"))||r||(e="."),e&&i&&(e+="/"),(r?"/":"")+e},n.isAbsolute=function(e){return"/"===e.charAt(0)},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(a(e,function(e,n){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},n.relative=function(e,t){function r(e){for(var n=0;n=0&&""===e[t];t--);return n>t?[]:e.slice(n,t-n+1)}e=n.resolve(e).substr(1),t=n.resolve(t).substr(1);for(var i=r(e.split("/")),a=r(t.split("/")),s=Math.min(i.length,a.length),o=s,l=0;l{try{assemblyscript=__webpack_require__(10)}catch(e){try{__webpack_require__(!function(){var e=new Error("Cannot find module 'ts-node'");throw e.code="MODULE_NOT_FOUND",e}()).register({project:path.join(".","..","src","tsconfig.json")}),__webpack_require__(!function(){var e=new Error("Cannot find module '../src/glue/js'");throw e.code="MODULE_NOT_FOUND",e}()),assemblyscript=__webpack_require__(!function(){var e=new Error("Cannot find module '../src'");throw e.code="MODULE_NOT_FOUND",e}()),isDev=!0}catch(e_ts){try{assemblyscript=eval("require('./assemblyscript')")}catch(e){throw e.stack=e_ts.stack+"\n---\n"+e.stack,e}}}})(),exports.isBundle=!0,exports.isDev=isDev,exports.version=exports.isBundle?"0.6.0":__webpack_require__(!function(){var e=new Error("Cannot find module '../package.json'");throw e.code="MODULE_NOT_FOUND",e}()).version,exports.options=__webpack_require__(11),exports.sourceMapRoot="assemblyscript:///",exports.libraryPrefix=assemblyscript.LIBRARY_PREFIX,exports.defaultOptimizeLevel=2,exports.defaultShrinkLevel=1,exports.libraryFiles=exports.isBundle?Object({"allocator/arena":'/**\n * Arena Memory Allocator\n *\n * Provides a `memory.reset` function to reset the heap to its initial state. A user has to make\n * sure that there are no more references to cleared memory afterwards. Always aligns to 8 bytes.\n *\n * @module std/assembly/allocator/arena\n *//***/\n\nimport { AL_MASK, MAX_SIZE_32 } from "../internal/allocator";\n\nvar startOffset: usize = (HEAP_BASE + AL_MASK) & ~AL_MASK;\nvar offset: usize = startOffset;\n\n// Memory allocator interface\n\n@global export function __memory_allocate(size: usize): usize {\n if (size > MAX_SIZE_32) unreachable();\n var ptr = offset;\n var newPtr = (ptr + max(size, 1) + AL_MASK) & ~AL_MASK;\n var pagesBefore = memory.size();\n if (newPtr > pagesBefore << 16) {\n let pagesNeeded = ((newPtr - ptr + 0xffff) & ~0xffff) >>> 16;\n let pagesWanted = max(pagesBefore, pagesNeeded); // double memory\n if (memory.grow(pagesWanted) < 0) {\n if (memory.grow(pagesNeeded) < 0) {\n unreachable(); // out of memory\n }\n }\n }\n offset = newPtr;\n return ptr;\n}\n\n@global export function __memory_free(ptr: usize): void { /* nop */ }\n\n@global export function __memory_reset(): void {\n offset = startOffset;\n}\n',"allocator/buddy":'/**\n * Buddy Memory Allocator.\n * @module std/assembly/allocator/buddy\n *//***/\n\n/*\n Copyright 2018 Evan Wallace\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the "Software"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n*/// see: https://github.com/evanw/buddy-malloc\n\n/*\n * This file implements a buddy memory allocator, which is an allocator that\n * allocates memory within a fixed linear address range. It spans the address\n * range with a binary tree that tracks free space. Both "malloc" and "free"\n * are O(log N) time where N is the maximum possible number of allocations.\n *\n * The "buddy" term comes from how the tree is used. When memory is allocated,\n * nodes in the tree are split recursively until a node of the appropriate size\n * is reached. Every split results in two child nodes, each of which is the\n * buddy of the other. When a node is freed, the node and its buddy can be\n * merged again if the buddy is also free. This makes the memory available\n * for larger allocations again.\n */\n\n/*\n * Every allocation needs an 8-byte header to store the allocation size while\n * staying 8-byte aligned. The address returned by "malloc" is the address\n * right after this header (i.e. the size occupies the 8 bytes before the\n * returned address).\n */\nconst HEADER_SIZE: usize = 8;\n\n/*\n * The minimum allocation size is 16 bytes because we have an 8-byte header and\n * we need to stay 8-byte aligned.\n */\nconst MIN_ALLOC_LOG2: usize = 4;\nconst MIN_ALLOC: usize = 1 << MIN_ALLOC_LOG2;\n\n/*\n * The maximum allocation size is currently set to 2gb. This is the total size\n * of the heap. It\'s technically also the maximum allocation size because the\n * heap could consist of a single allocation of this size. But of course real\n * heaps will have multiple allocations, so the real maximum allocation limit\n * is at most 1gb.\n */\nconst MAX_ALLOC_LOG2: usize = 30; // 31;\nconst MAX_ALLOC: usize = 1 << MAX_ALLOC_LOG2;\n\n/*\n * Allocations are done in powers of two starting from MIN_ALLOC and ending at\n * MAX_ALLOC inclusive. Each allocation size has a bucket that stores the free\n * list for that allocation size.\n *\n * Given a bucket index, the size of the allocations in that bucket can be\n * found with "(size_t)1 << (MAX_ALLOC_LOG2 - bucket)".\n */\nconst BUCKET_COUNT: usize = MAX_ALLOC_LOG2 - MIN_ALLOC_LOG2 + 1;\n\n/*\n * Free lists are stored as circular doubly-linked lists. Every possible\n * allocation size has an associated free list that is threaded through all\n * currently free blocks of that size. That means MIN_ALLOC must be at least\n * "sizeof(list_t)". MIN_ALLOC is currently 16 bytes, so this will be true for\n * both 32-bit and 64-bit.\n */\n@unmanaged\nclass List {\n prev: List;\n next: List;\n static readonly SIZE: usize = 2 * sizeof();\n}\n\n/*\n * Each bucket corresponds to a certain allocation size and stores a free list\n * for that size. The bucket at index 0 corresponds to an allocation size of\n * MAX_ALLOC (i.e. the whole address space).\n */\nvar BUCKETS_START: usize = HEAP_BASE;\nvar BUCKETS_END: usize = BUCKETS_START + BUCKET_COUNT * List.SIZE;\n\nfunction buckets$get(index: usize): List {\n assert(index < BUCKET_COUNT);\n return changetype(BUCKETS_START + index * List.SIZE);\n}\n\n/*\n * We could initialize the allocator by giving it one free block the size of\n * the entire address space. However, this would cause us to instantly reserve\n * half of the entire address space on the first allocation, since the first\n * split would store a free list entry at the start of the right child of the\n * root. Instead, we have the tree start out small and grow the size of the\n * tree as we use more memory. The size of the tree is tracked by this value.\n */\nvar bucket_limit: usize;\n\n/*\n * This array represents a linearized binary tree of bits. Every possible\n * allocation larger than MIN_ALLOC has a node in this tree (and therefore a\n * bit in this array).\n *\n * Given the index for a node, lineraized binary trees allow you to traverse to\n * the parent node or the child nodes just by doing simple arithmetic on the\n * index:\n *\n * - Move to parent: index = (index - 1) / 2;\n * - Move to left child: index = index * 2 + 1;\n * - Move to right child: index = index * 2 + 2;\n * - Move to sibling: index = ((index - 1) ^ 1) + 1;\n *\n * Each node in this tree can be in one of several states:\n *\n * - UNUSED (both children are UNUSED)\n * - SPLIT (one child is UNUSED and the other child isn\'t)\n * - USED (neither children are UNUSED)\n *\n * These states take two bits to store. However, it turns out we have enough\n * information to distinguish between UNUSED and USED from context, so we only\n * need to store SPLIT or not, which only takes a single bit.\n *\n * Note that we don\'t need to store any nodes for allocations of size MIN_ALLOC\n * since we only ever care about parent nodes.\n */\nconst SPLIT_COUNT: usize = (1 << (BUCKET_COUNT - 1)) / 8;\nvar NODE_IS_SPLIT_START: usize = BUCKETS_END;\nvar NODE_IS_SPLIT_END: usize = NODE_IS_SPLIT_START + SPLIT_COUNT * sizeof();\n\nfunction node_is_split$get(index: usize): i32 {\n assert(index < SPLIT_COUNT);\n return load(NODE_IS_SPLIT_START + index);\n}\n\nfunction node_is_split$set(index: usize, state: i32): void {\n assert(index < SPLIT_COUNT);\n store(NODE_IS_SPLIT_START + index, state);\n}\n\n/*\n * This is the starting address of the address range for this allocator. Every\n * returned allocation will be an offset of this pointer from 0 to MAX_ALLOC.\n */\nvar base_ptr: usize;\n\n/*\n * This is the maximum address that has ever been used by the allocator. It\'s\n * used to know when to call "brk" to request more memory from the kernel.\n */\nvar max_ptr: usize;\n\n/*\n * Make sure all addresses before "new_value" are valid and can be used. Memory\n * is allocated in a 2gb address range but that memory is not reserved up\n * front. It\'s only reserved when it\'s needed by calling this function. This\n * will return false if the memory could not be reserved.\n */\nfunction update_max_ptr(new_value: usize): i32 {\n if (new_value > max_ptr) {\n // if (brk(new_value)) {\n // return 0;\n // }\n let oldPages = memory.size();\n let newPages = (((new_value + 0xffff) & ~0xffff) >>> 16);\n assert(newPages > oldPages);\n if (memory.grow(newPages - oldPages) < 0) {\n return 0;\n }\n // max_ptr = new_value;\n max_ptr = newPages << 16;\n }\n return 1;\n}\n\n/*\n * Initialize a list to empty. Because these are circular lists, an "empty"\n * list is an entry where both links point to itself. This makes insertion\n * and removal simpler because they don\'t need any branches.\n */\nfunction list_init(list: List): void {\n list.prev = list;\n list.next = list;\n}\n\n/*\n * Append the provided entry to the end of the list. This assumes the entry\n * isn\'t in a list already because it overwrites the linked list pointers.\n */\nfunction list_push(list: List, entry: List): void {\n var prev = list.prev;\n entry.prev = prev;\n entry.next = list;\n prev.next = entry;\n list.prev = entry;\n}\n\n/*\n * Remove the provided entry from whichever list it\'s currently in. This\n * assumes that the entry is in a list. You don\'t need to provide the list\n * because the lists are circular, so the list\'s pointers will automatically\n * be updated if the first or last entries are removed.\n */\nfunction list_remove(entry: List): void {\n var prev = entry.prev;\n var next = entry.next;\n prev.next = next;\n next.prev = prev;\n}\n\n/*\n * Remove and return the first entry in the list or NULL if the list is empty.\n */\nfunction list_pop(list: List): List | null {\n var back = list.prev;\n if (back == list) return null;\n list_remove(back);\n return back;\n}\n\n/*\n * This maps from the index of a node to the address of memory that node\n * represents. The bucket can be derived from the index using a loop but is\n * required to be provided here since having them means we can avoid the loop\n * and have this function return in constant time.\n */\nfunction ptr_for_node(index: usize, bucket: usize): usize {\n return base_ptr + ((index - (1 << bucket) + 1) << (MAX_ALLOC_LOG2 - bucket));\n}\n\n/*\n * This maps from an address of memory to the node that represents that\n * address. There are often many nodes that all map to the same address, so\n * the bucket is needed to uniquely identify a node.\n */\nfunction node_for_ptr(ptr: usize, bucket: usize): usize {\n return ((ptr - base_ptr) >> (MAX_ALLOC_LOG2 - bucket)) + (1 << bucket) - 1;\n}\n\n/*\n * Given the index of a node, this returns the "is split" flag of the parent.\n */\nfunction parent_is_split(index: usize): bool {\n index = (index - 1) / 2;\n return ((node_is_split$get(index / 8) >>> (index % 8)) & 1) == 1;\n}\n\n/*\n * Given the index of a node, this flips the "is split" flag of the parent.\n */\nfunction flip_parent_is_split(index: usize): void {\n index = (index - 1) / 2;\n var indexDiv8 = index / 8;\n node_is_split$set(indexDiv8,\n node_is_split$get(indexDiv8) ^ (1 << (index % 8))\n );\n}\n\n/*\n * Given the requested size passed to "malloc", this function returns the index\n * of the smallest bucket that can fit that size.\n */\nfunction bucket_for_request(request: usize): usize {\n var bucket = BUCKET_COUNT - 1;\n var size = MIN_ALLOC;\n\n while (size < request) {\n bucket--;\n size *= 2;\n }\n\n return bucket;\n}\n\n/*\n * The tree is always rooted at the current bucket limit. This call grows the\n * tree by repeatedly doubling it in size until the root lies at the provided\n * bucket index. Each doubling lowers the bucket limit by 1.\n */\nfunction lower_bucket_limit(bucket: usize): u32 {\n while (bucket < bucket_limit) {\n let root = node_for_ptr(base_ptr, bucket_limit);\n let right_child: usize;\n\n /*\n * If the parent isn\'t SPLIT, that means the node at the current bucket\n * limit is UNUSED and our address space is entirely free. In that case,\n * clear the root free list, increase the bucket limit, and add a single\n * block with the newly-expanded address space to the new root free list.\n */\n if (!parent_is_split(root)) {\n list_remove(changetype(base_ptr));\n list_init(buckets$get(--bucket_limit));\n list_push(buckets$get(bucket_limit), changetype(base_ptr));\n continue;\n }\n\n /*\n * Otherwise, the tree is currently in use. Create a parent node for the\n * current root node in the SPLIT state with a right child on the free\n * list. Make sure to reserve the memory for the free list entry before\n * writing to it. Note that we do not need to flip the "is split" flag for\n * our current parent because it\'s already on (we know because we just\n * checked it above).\n */\n right_child = ptr_for_node(root + 1, bucket_limit);\n if (!update_max_ptr(right_child + List.SIZE)) {\n return 0;\n }\n list_push(buckets$get(bucket_limit), changetype(right_child));\n list_init(buckets$get(--bucket_limit));\n\n /*\n * Set the grandparent\'s SPLIT flag so if we need to lower the bucket limit\n * again, we\'ll know that the new root node we just added is in use.\n */\n root = (root - 1) / 2;\n if (root != 0) {\n flip_parent_is_split(root);\n }\n }\n\n return 1;\n}\n\n// Memory allocator interface\n\n@global export function __memory_allocate(request: usize): usize {\n var original_bucket: usize, bucket: usize;\n\n /*\n * Make sure it\'s possible for an allocation of this size to succeed. There\'s\n * a hard-coded limit on the maximum allocation size because of the way this\n * allocator works.\n */\n if (request > MAX_ALLOC - HEADER_SIZE) unreachable();\n\n /*\n * Initialize our global state if this is the first call to "malloc". At the\n * beginning, the tree has a single node that represents the smallest\n * possible allocation size. More memory will be reserved later as needed.\n */\n if (base_ptr == 0) {\n // base_ptr = max_ptr = (uint8_t *)sbrk(0);\n base_ptr = (NODE_IS_SPLIT_END + 7) & ~7; // must be aligned\n max_ptr = memory.size() << 16; // must grow first\n bucket_limit = BUCKET_COUNT - 1;\n if (!update_max_ptr(base_ptr + List.SIZE)) {\n return 0;\n }\n list_init(buckets$get(BUCKET_COUNT - 1));\n list_push(buckets$get(BUCKET_COUNT - 1), changetype(base_ptr));\n }\n\n /*\n * Find the smallest bucket that will fit this request. This doesn\'t check\n * that there\'s space for the request yet.\n */\n bucket = bucket_for_request(request + HEADER_SIZE);\n original_bucket = bucket;\n\n /*\n * Search for a bucket with a non-empty free list that\'s as large or larger\n * than what we need. If there isn\'t an exact match, we\'ll need to split a\n * larger one to get a match.\n */\n while (bucket + 1 != 0) {\n let size: usize, bytes_needed: usize, i: usize;\n let ptr: usize;\n\n /*\n * We may need to grow the tree to be able to fit an allocation of this\n * size. Try to grow the tree and stop here if we can\'t.\n */\n if (!lower_bucket_limit(bucket)) {\n return 0;\n }\n\n /*\n * Try to pop a block off the free list for this bucket. If the free list\n * is empty, we\'re going to have to split a larger block instead.\n */\n ptr = changetype(list_pop(buckets$get(bucket)));\n if (!ptr) {\n /*\n * If we\'re not at the root of the tree or it\'s impossible to grow the\n * tree any more, continue on to the next bucket.\n */\n if (bucket != bucket_limit || bucket == 0) {\n bucket--;\n continue;\n }\n\n /*\n * Otherwise, grow the tree one more level and then pop a block off the\n * free list again. Since we know the root of the tree is used (because\n * the free list was empty), this will add a parent above this node in\n * the SPLIT state and then add the new right child node to the free list\n * for this bucket. Popping the free list will give us this right child.\n */\n if (!lower_bucket_limit(bucket - 1)) {\n return 0;\n }\n ptr = changetype(list_pop(buckets$get(bucket)));\n }\n\n /*\n * Try to expand the address space first before going any further. If we\n * have run out of space, put this block back on the free list and fail.\n */\n size = 1 << (MAX_ALLOC_LOG2 - bucket);\n bytes_needed = bucket < original_bucket ? size / 2 + List.SIZE : size;\n if (!update_max_ptr(ptr + bytes_needed)) {\n list_push(buckets$get(bucket), changetype(ptr));\n return 0;\n }\n\n /*\n * If we got a node off the free list, change the node from UNUSED to USED.\n * This involves flipping our parent\'s "is split" bit because that bit is\n * the exclusive-or of the UNUSED flags of both children, and our UNUSED\n * flag (which isn\'t ever stored explicitly) has just changed.\n *\n * Note that we shouldn\'t ever need to flip the "is split" bit of our\n * grandparent because we know our buddy is USED so it\'s impossible for our\n * grandparent to be UNUSED (if our buddy chunk was UNUSED, our parent\n * wouldn\'t ever have been split in the first place).\n */\n i = node_for_ptr(ptr, bucket);\n if (i != 0) {\n flip_parent_is_split(i);\n }\n\n /*\n * If the node we got is larger than we need, split it down to the correct\n * size and put the new unused child nodes on the free list in the\n * corresponding bucket. This is done by repeatedly moving to the left\n * child, splitting the parent, and then adding the right child to the free\n * list.\n */\n while (bucket < original_bucket) {\n i = i * 2 + 1;\n bucket++;\n flip_parent_is_split(i);\n list_push(\n buckets$get(bucket),\n changetype(ptr_for_node(i + 1, bucket))\n );\n }\n\n /*\n * Now that we have a memory address, write the block header (just the size\n * of the allocation) and return the address immediately after the header.\n */\n store(ptr, request);\n return ptr + HEADER_SIZE;\n }\n\n return 0;\n}\n\n@global export function __memory_free(ptr: usize): void {\n var bucket: usize, i: usize;\n\n /*\n * Ignore any attempts to free a NULL pointer.\n */\n if (!ptr) {\n return;\n }\n\n /*\n * We were given the address returned by "malloc" so get back to the actual\n * address of the node by subtracting off the size of the block header. Then\n * look up the index of the node corresponding to this address.\n */\n ptr = ptr - HEADER_SIZE;\n bucket = bucket_for_request(load(ptr) + HEADER_SIZE);\n i = node_for_ptr(ptr, bucket);\n\n /*\n * Traverse up to the root node, flipping USED blocks to UNUSED and merging\n * UNUSED buddies together into a single UNUSED parent.\n */\n while (i != 0) {\n /*\n * Change this node from UNUSED to USED. This involves flipping our\n * parent\'s "is split" bit because that bit is the exclusive-or of the\n * UNUSED flags of both children, and our UNUSED flag (which isn\'t ever\n * stored explicitly) has just changed.\n */\n flip_parent_is_split(i);\n\n /*\n * If the parent is now SPLIT, that means our buddy is USED, so don\'t merge\n * with it. Instead, stop the iteration here and add ourselves to the free\n * list for our bucket.\n *\n * Also stop here if we\'re at the current root node, even if that root node\n * is now UNUSED. Root nodes don\'t have a buddy so we can\'t merge with one.\n */\n if (parent_is_split(i) || bucket == bucket_limit) {\n break;\n }\n\n /*\n * If we get here, we know our buddy is UNUSED. In this case we should\n * merge with that buddy and continue traversing up to the root node. We\n * need to remove the buddy from its free list here but we don\'t need to\n * add the merged parent to its free list yet. That will be done once after\n * this loop is finished.\n */\n list_remove(changetype(ptr_for_node(((i - 1) ^ 1) + 1, bucket)));\n i = (i - 1) / 2;\n bucket--;\n }\n\n /*\n * Add ourselves to the free list for our bucket. We add to the back of the\n * list because "malloc" takes from the back of the list and we want a "free"\n * followed by a "malloc" of the same size to ideally use the same address\n * for better memory locality.\n */\n list_push(buckets$get(bucket), changetype(ptr_for_node(i, bucket)));\n}\n',"allocator/emscripten":"/**\n * Emscripten Memory Allocator.\n *\n * Uses Emscripten's exported _malloc and _free implementations, i.e., when linking with\n * Emscripten-compiled programs that already provide these. Differs from 'system' in that their\n * names are prefixed with an underscore.\n *\n * @module std/assembly/allocator/emscripten\n *//***/\n\ndeclare function _malloc(size: usize): usize;\ndeclare function _free(ptr: usize): void;\n\n// Memory allocator interface\n\n@global export function __memory_allocate(size: usize): usize {\n return _malloc(size);\n}\n\n@global export function __memory_free(ptr: usize): void {\n _free(ptr);\n}\n","allocator/system":"/**\n * System Memory Allocator.\n *\n * Uses the environment's malloc and free implementations, i.e., when linking with other C-like\n * programs that already provide these.\n *\n * @module std/assembly/allocator/system\n *//***/\n\ndeclare function malloc(size: usize): usize;\ndeclare function free(ptr: usize): void;\n\n// Memory allocator interface\n\n@global export function __memory_allocate(size: usize): usize {\n return malloc(size);\n}\n\n@global export function __memory_free(ptr: usize): void {\n free(ptr);\n}\n","allocator/tlsf":"/**\n * Two-Level Segregate Fit Memory Allocator.\n *\n * A general purpose dynamic memory allocator specifically designed to meet real-time requirements.\n * Always aligns to 8 bytes.\n *\n * @module std/assembly/allocator/tlsf\n *//***/\n\n// ╒══════════════ Block size interpretation (32-bit) ═════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┼─┴─┴─┴─┴─╫─┴─┴─┤\n// │ | FL │ SB = SL + AL │ ◄─ usize\n// └───────────────────────────────────────────────┴─────────╨─────┘\n// FL: first level, SL: second level, AL: alignment, SB: small block\n\nimport {\n AL_BITS,\n AL_SIZE,\n AL_MASK\n} from \"../internal/allocator\";\n\nconst SL_BITS: u32 = 5;\nconst SL_SIZE: usize = 1 << SL_BITS;\n\nconst SB_BITS: usize = (SL_BITS + AL_BITS);\nconst SB_SIZE: usize = 1 << SB_BITS;\n\nconst FL_BITS: u32 = (sizeof() == sizeof()\n ? 30 // ^= up to 1GB per block\n : 32 // ^= up to 4GB per block\n) - SB_BITS;\n\n// ╒════════════════ Block structure layout (32-bit) ══════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┼─┼─┤\n// │ size │L│F│ ◄─┐ info\n// ╞═══════════════════════════════════════════════════════════╧═╧═╡ │ ┐\n// │ if free: ◄ prev │ ◄─┤ usize\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ if free: next ► │ ◄─┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ ... unused free space >= 0 ... │ │ = 0\n// ├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤ │\n// │ if free: jump ▲ │ ◄─┘\n// └───────────────────────────────────────────────────────────────┘ MIN SIZE ┘\n// F: FREE, L: LEFT_FREE\n\n/** Tag indicating that this block is free. */\nconst FREE: usize = 1 << 0;\n/** Tag indicating that this block's left block is free. */\nconst LEFT_FREE: usize = 1 << 1;\n/** Mask to obtain all tags. */\nconst TAGS: usize = FREE | LEFT_FREE;\n\n/** Block structure. */\n@unmanaged\nclass Block {\n\n /** Info field holding this block's size and tags. */\n info: usize;\n\n /** End offset of the {@link Block#info} field. User data starts here. */\n static readonly INFO: usize = (sizeof() + AL_MASK) & ~AL_MASK;\n\n /** Previous free block, if any. Only valid if free. */\n prev: Block | null;\n /** Next free block, if any. Only valid if free. */\n next: Block | null;\n\n /** Minimum size of a block, excluding {@link Block#info}. */\n static readonly MIN_SIZE: usize = (3 * sizeof() + AL_MASK) & ~AL_MASK;// prev + next + jump\n\n /** Maximum size of a used block, excluding {@link Block#info}. */\n static readonly MAX_SIZE: usize = 1 << (FL_BITS + SB_BITS);\n\n /** Gets this block's left (free) block in memory. */\n get left(): Block {\n assert(this.info & LEFT_FREE); // must be free to contain a jump\n return assert(\n load(changetype(this) - sizeof())\n ); // can't be null\n }\n\n /** Gets this block's right block in memory. */\n get right(): Block {\n assert(this.info & ~TAGS); // can't skip beyond the tail block\n return assert(\n changetype(\n changetype(this) + Block.INFO + (this.info & ~TAGS)\n )\n ); // can't be null\n }\n}\n\n// ╒════════════════ Root structure layout (32-bit) ═══════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┤ ┐\n// │ 0 | flMap S│ ◄────┐\n// ╞═══════════════════════════════════════════════════════════════╡ │\n// │ slMap[0] S │ ◄─┐ │\n// ├───────────────────────────────────────────────────────────────┤ │ │\n// │ slMap[1] │ ◄─┤ │\n// ├───────────────────────────────────────────────────────────────┤ u32 │\n// │ ... │ ◄─┤ │\n// ├───────────────────────────────────────────────────────────────┤ │ │\n// │ slMap[22] P │ ◄─┘ │\n// ╞═══════════════════════════════════════════════════════════════╡ usize\n// │ head[0] │ ◄────┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ ... │ ◄────┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ head[736] │ ◄────┤\n// ╞═══════════════════════════════════════════════════════════════╡ │\n// │ tailRef │ ◄────┘\n// └───────────────────────────────────────────────────────────────┘ SIZE ┘\n// S: Small blocks map, P: Possibly padded if 64-bit\n\nassert((1 << SL_BITS) <= 32); // second level must fit into 32 bits\n\n/** Root structure. */\n@unmanaged\nclass Root {\n\n /** First level bitmap. */\n flMap: usize = 0;\n\n /** Start offset of second level maps. */\n private static readonly SL_START: usize = sizeof();\n\n // Using *one* SL map per *FL bit*\n\n /** Gets the second level map for the specified first level. */\n getSLMap(fl: usize): u32 {\n assert(fl < FL_BITS); // fl out of range\n return load(changetype(this) + fl * 4, Root.SL_START);\n }\n\n /** Sets the second level map for the specified first level. */\n setSLMap(fl: usize, value: u32): void {\n assert(fl < FL_BITS); // fl out of range\n store(changetype(this) + fl * 4, value, Root.SL_START);\n }\n\n /** End offset of second level maps. */\n private static readonly SL_END: usize = Root.SL_START + FL_BITS * 4;\n\n // Using *number bits per SL* heads per *FL bit*\n\n /** Start offset of FL/SL heads. */\n private static readonly HL_START: usize = (Root.SL_END + AL_MASK) & ~AL_MASK;\n\n /** Gets the head of the specified first and second level index. */\n getHead(fl: usize, sl: u32): Block | null {\n assert(fl < FL_BITS); // fl out of range\n assert(sl < SL_SIZE); // sl out of range\n return changetype(load(\n changetype(this) + (fl * SL_SIZE + sl) * sizeof()\n , Root.HL_START));\n }\n\n /** Sets the head of the specified first and second level index. */\n setHead(fl: usize, sl: u32, value: Block | null): void {\n assert(fl < FL_BITS); // fl out of range\n assert(sl < SL_SIZE); // sl out of range\n store(\n changetype(this) + (fl * SL_SIZE + sl) * sizeof()\n , changetype(value)\n , Root.HL_START);\n }\n\n /** End offset of FL/SL heads. */\n private static readonly HL_END: usize = (\n Root.HL_START + FL_BITS * SL_SIZE * sizeof()\n );\n\n get tailRef(): usize { return load(0, Root.HL_END); }\n set tailRef(value: usize) { store(0, value, Root.HL_END); }\n\n /** Total size of the {@link Root} structure. */\n static readonly SIZE: usize = Root.HL_END + sizeof();\n\n /** Inserts a previously used block back into the free list. */\n insert(block: Block): void {\n // check as much as possible here to prevent invalid free blocks\n assert(block); // cannot be null\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free\n var size: usize;\n assert(\n (size = block.info & ~TAGS) >= Block.MIN_SIZE && size < Block.MAX_SIZE\n ); // must be valid, not necessary to compute yet if noAssert=true\n\n var right: Block = assert(block.right); // can't be null\n var rightInfo = right.info;\n\n // merge with right block if also free\n if (rightInfo & FREE) {\n this.remove(right);\n block.info = (blockInfo += Block.INFO + (rightInfo & ~TAGS));\n right = block.right;\n rightInfo = right.info;\n // jump is set below\n }\n\n // merge with left block if also free\n if (blockInfo & LEFT_FREE) {\n let left: Block = assert(block.left); // can't be null\n let leftInfo = left.info;\n assert(leftInfo & FREE); // must be free according to tags\n this.remove(left);\n left.info = (leftInfo += Block.INFO + (blockInfo & ~TAGS));\n block = left;\n blockInfo = leftInfo;\n // jump is set below\n }\n\n right.info = rightInfo | LEFT_FREE;\n this.setJump(block, right);\n // right is no longer used now, hence rightInfo is not synced\n\n size = blockInfo & ~TAGS;\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n\n // mapping_insert\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n\n // perform insertion\n var head = this.getHead(fl, sl);\n block.prev = null;\n block.next = head;\n if (head) head.prev = block;\n this.setHead(fl, sl, block);\n\n // update first and second level maps\n this.flMap |= (1 << fl);\n this.setSLMap(fl, this.getSLMap(fl) | (1 << sl));\n }\n\n /**\n * Removes a free block from FL/SL maps. Does not alter left/jump because it\n * is likely that splitting is performed afterwards, invalidating any changes\n * again.\n */\n private remove(block: Block): void {\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free\n var size = blockInfo & ~TAGS;\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n\n // mapping_insert\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n\n // link previous and next free block\n var prev = block.prev;\n var next = block.next;\n if (prev) prev.next = next;\n if (next) next.prev = prev;\n\n // update head if we are removing it\n if (block == this.getHead(fl, sl)) {\n this.setHead(fl, sl, next);\n\n // clear second level map if head is empty now\n if (!next) {\n let slMap = this.getSLMap(fl);\n this.setSLMap(fl, slMap &= ~(1 << sl));\n\n // clear first level map if second level is empty now\n if (!slMap) this.flMap &= ~(1 << fl);\n }\n }\n }\n\n /** Searches for a free block of at least the specified size. */\n search(size: usize): Block | null {\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE);\n\n // mapping_search\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n // (*) size += (1 << (fls(size) - SL_BITS)) - 1;\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n // (*) instead of rounding up, use next second level list for better fit\n if (sl < SL_SIZE - 1) ++sl;\n else ++fl, sl = 0;\n }\n\n // search second level\n var slMap = this.getSLMap(fl) & (~0 << sl);\n var head: Block | null;\n if (!slMap) {\n // search next larger first level\n let flMap = this.flMap & (~0 << (fl + 1));\n if (!flMap) {\n head = null;\n } else {\n fl = ffs(flMap);\n slMap = assert(this.getSLMap(fl)); // can't be zero if fl points here\n head = this.getHead(fl, ffs(slMap));\n }\n } else {\n head = this.getHead(fl, ffs(slMap));\n }\n return head;\n }\n\n /** Links a free left with its right block in memory. */\n private setJump(left: Block, right: Block): void {\n assert(left.info & FREE); // must be free\n assert(left.right == right); // right block must match\n assert(right.info & LEFT_FREE); // right block must be tagged as LEFT_FREE\n store(\n changetype(right) - sizeof()\n , left); // last word in left block's (free) data region\n }\n\n /**\n * Uses the specified free block, removing it from internal maps and\n * splitting it if possible, and returns its data pointer.\n */\n use(block: Block, size: usize): usize {\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free so we can use it\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n assert(!(size & AL_MASK)); // size must be aligned so the new block is\n\n this.remove(block);\n\n // split if the block can hold another MIN_SIZE block\n var remaining = (blockInfo & ~TAGS) - size;\n if (remaining >= Block.INFO + Block.MIN_SIZE) {\n block.info = size | (blockInfo & LEFT_FREE); // also discards FREE\n\n let spare = changetype(\n changetype(block) + Block.INFO + size\n );\n spare.info = (remaining - Block.INFO) | FREE; // not LEFT_FREE\n this.insert(spare); // also sets jump\n\n // otherwise tag block as no longer FREE and right as no longer LEFT_FREE\n } else {\n block.info = blockInfo & ~FREE;\n let right: Block = assert(block.right); // can't be null (tail)\n right.info &= ~LEFT_FREE;\n }\n\n return changetype(block) + Block.INFO;\n }\n\n /** Adds more memory to the pool. */\n addMemory(start: usize, end: usize): bool {\n assert(start <= end);\n assert(!(start & AL_MASK)); // must be aligned\n assert(!(end & AL_MASK)); // must be aligned\n\n var tailRef = this.tailRef;\n var tailInfo: usize = 0;\n if (tailRef) {\n assert(start >= tailRef + sizeof()); // starts after tail\n\n // merge with current tail if adjacent\n if (start - Block.INFO == tailRef) {\n start -= Block.INFO;\n tailInfo = changetype(tailRef).info;\n }\n\n } else {\n assert(start >= changetype(this) + Root.SIZE); // starts after root\n }\n\n // check if size is large enough for a free block and the tail block\n var size = end - start;\n if (size < Block.INFO + Block.MIN_SIZE + Block.INFO) {\n return false;\n }\n\n // left size is total minus its own and the zero-length tail's header\n var leftSize = size - 2 * Block.INFO;\n var left = changetype(start);\n left.info = leftSize | FREE | (tailInfo & LEFT_FREE);\n left.prev = null;\n left.next = null;\n\n // tail is a zero-length used block\n var tail = changetype(start + size - Block.INFO);\n tail.info = 0 | LEFT_FREE;\n this.tailRef = changetype(tail);\n\n this.insert(left); // also merges with free left before tail / sets jump\n\n return true;\n }\n}\n\n/** Determines the first (LSB to MSB) set bit's index of a word. */\nfunction ffs(word: T): T {\n assert(word != 0); // word cannot be 0\n return ctz(word); // differs from ffs only for 0\n}\n\n/** Determines the last (LSB to MSB) set bit's index of a word. */\nfunction fls(word: T): T {\n assert(word != 0); // word cannot be 0\n const inv: T = (sizeof() << 3) - 1;\n return inv - clz(word);\n}\n\n/** Reference to the initialized {@link Root} structure, once initialized. */\nvar ROOT: Root = changetype(0);\n\n// Memory allocator interface\n\n/** Allocates a chunk of memory. */\n@global export function __memory_allocate(size: usize): usize {\n\n // initialize if necessary\n var root = ROOT;\n if (!root) {\n let rootOffset = (HEAP_BASE + AL_MASK) & ~AL_MASK;\n let pagesBefore = memory.size();\n let pagesNeeded = ((((rootOffset + Root.SIZE) + 0xffff) & ~0xffff) >>> 16);\n if (pagesNeeded > pagesBefore && memory.grow(pagesNeeded - pagesBefore) < 0) unreachable();\n ROOT = root = changetype(rootOffset);\n root.tailRef = 0;\n root.flMap = 0;\n for (let fl: usize = 0; fl < FL_BITS; ++fl) {\n root.setSLMap(fl, 0);\n for (let sl: u32 = 0; sl < SL_SIZE; ++sl) {\n root.setHead(fl, sl, null);\n }\n }\n root.addMemory((rootOffset + Root.SIZE + AL_MASK) & ~AL_MASK, memory.size() << 16);\n }\n\n // search for a suitable block\n if (size > Block.MAX_SIZE) unreachable();\n\n // 32-bit MAX_SIZE is 1 << 30 and itself aligned, hence the following can't overflow MAX_SIZE\n size = max((size + AL_MASK) & ~AL_MASK, Block.MIN_SIZE);\n\n var block = root.search(size);\n if (!block) {\n\n // request more memory\n let pagesBefore = memory.size();\n let pagesNeeded = (((size + 0xffff) & ~0xffff) >>> 16);\n let pagesWanted = max(pagesBefore, pagesNeeded); // double memory\n if (memory.grow(pagesWanted) < 0) {\n if (memory.grow(pagesNeeded) < 0) {\n unreachable(); // out of memory\n }\n }\n let pagesAfter = memory.size();\n root.addMemory(pagesBefore << 16, pagesAfter << 16);\n block = assert(root.search(size)); // must be found now\n }\n\n assert((block.info & ~TAGS) >= size);\n return root.use(block, size);\n}\n\n/** Frees the chunk of memory at the specified address. */\n@global export function __memory_free(data: usize): void {\n if (data) {\n let root = ROOT;\n if (root) {\n let block = changetype(data - Block.INFO);\n let blockInfo = block.info;\n assert(!(blockInfo & FREE)); // must be used\n block.info = blockInfo | FREE;\n root.insert(changetype(data - Block.INFO));\n }\n }\n}\n\n@global export function __memory_reset(): void {\n unreachable();\n}\n",array:'import {\n MAX_BLENGTH,\n HEADER_SIZE,\n allocateUnsafe,\n reallocateUnsafe,\n LOAD,\n STORE\n} from "./internal/arraybuffer";\n\nimport {\n allocateUnsafe as allocateUnsafeString,\n freeUnsafe as freeUnsafeString,\n copyUnsafe as copyUnsafeString\n} from "./internal/string";\n\nimport {\n COMPARATOR,\n SORT\n} from "./internal/sort";\n\nimport {\n itoa,\n dtoa,\n itoa_stream,\n dtoa_stream,\n MAX_DOUBLE_LENGTH\n} from "./internal/number";\n\nimport {\n isArray as builtin_isArray\n} from "./builtins";\n\nexport class Array {\n [key: number]: T; // compatibility only\n\n /* @internal */ buffer_: ArrayBuffer;\n /* @internal */ length_: i32;\n\n @inline static isArray(value: U): bool {\n return builtin_isArray(value) && value !== null;\n }\n\n constructor(length: i32 = 0) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length > MAX_LENGTH) throw new RangeError("Invalid array length");\n var byteLength = length << alignof();\n var buffer = allocateUnsafe(byteLength);\n this.buffer_ = buffer;\n this.length_ = length;\n memory.fill(\n changetype(buffer) + HEADER_SIZE,\n 0,\n byteLength\n );\n }\n\n @inline\n get length(): i32 {\n return this.length_;\n }\n\n set length(length: i32) {\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n if (length > capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length > MAX_LENGTH) throw new RangeError("Invalid array length");\n buffer = reallocateUnsafe(buffer, length << alignof());\n this.buffer_ = buffer;\n }\n this.length_ = length;\n }\n\n every(callbackfn: (element: T, index: i32, array: Array) => bool): bool {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n if (!callbackfn(LOAD(this.buffer_, index), index, this)) return false;\n }\n return true;\n }\n\n findIndex(predicate: (element: T, index: i32, array: Array) => bool): i32 {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n if (predicate(LOAD(this.buffer_, index), index, this)) return index;\n }\n return -1;\n }\n\n @operator("[]")\n private __get(index: i32): T {\n var buffer = this.buffer_;\n return index < (buffer.byteLength >>> alignof())\n ? LOAD(buffer, index)\n : unreachable();\n }\n\n @operator("{}")\n private __unchecked_get(index: i32): T {\n return LOAD(this.buffer_, index);\n }\n\n @operator("[]=")\n private __set(index: i32, value: T): void {\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n if (index >= capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (index >= MAX_LENGTH) throw new Error("Invalid array length");\n buffer = reallocateUnsafe(buffer, (index + 1) << alignof());\n this.buffer_ = buffer;\n this.length_ = index + 1;\n }\n STORE(buffer, index, value);\n if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line\n }\n\n @operator("{}=")\n private __unchecked_set(index: i32, value: T): void {\n STORE(this.buffer_, index, value);\n if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line\n }\n\n fill(value: T, start: i32 = 0, end: i32 = i32.MAX_VALUE): this {\n var buffer = this.buffer_;\n var len = this.length_;\n\n start = start < 0 ? max(len + start, 0) : min(start, len);\n end = end < 0 ? max(len + end, 0) : min(end, len);\n\n if (sizeof() == 1) {\n if (start < end) {\n memory.fill(\n changetype(buffer) + start + HEADER_SIZE,\n value,\n (end - start)\n );\n }\n } else {\n for (; start < end; ++start) {\n STORE(buffer, start, value);\n }\n }\n return this;\n }\n\n @inline\n includes(searchElement: T, fromIndex: i32 = 0): bool {\n return this.indexOf(searchElement, fromIndex) >= 0;\n }\n\n indexOf(searchElement: T, fromIndex: i32 = 0): i32 {\n var length = this.length_;\n if (length == 0 || fromIndex >= length) return -1;\n if (fromIndex < 0) fromIndex = max(length + fromIndex, 0);\n var buffer = this.buffer_;\n while (fromIndex < length) {\n if (LOAD(buffer, fromIndex) == searchElement) return fromIndex;\n ++fromIndex;\n }\n return -1;\n }\n\n lastIndexOf(searchElement: T, fromIndex: i32 = this.length_): i32 {\n var length = this.length_;\n if (length == 0) return -1;\n if (fromIndex < 0) fromIndex = length + fromIndex; // no need to clamp\n else if (fromIndex >= length) fromIndex = length - 1;\n var buffer = this.buffer_;\n while (fromIndex >= 0) { // ^\n if (LOAD(buffer, fromIndex) == searchElement) return fromIndex;\n --fromIndex;\n }\n return -1;\n }\n\n push(element: T): i32 {\n var length = this.length_;\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n var newLength = length + 1; // safe only if length is checked\n if (length >= capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length >= MAX_LENGTH) throw new Error("Invalid array length");\n buffer = reallocateUnsafe(buffer, newLength << alignof());\n this.buffer_ = buffer;\n }\n this.length_ = newLength;\n STORE(buffer, length, element);\n if (isManaged()) __gc_link(changetype(this), changetype(element)); // tslint:disable-line\n return newLength;\n }\n\n concat(items: Array): Array {\n var thisLen = this.length_;\n var otherLen = select(0, items.length_, items === null);\n var outLen = thisLen + otherLen;\n var out = new Array(outLen);\n\n if (thisLen) {\n memory.copy(\n changetype(out.buffer_) + HEADER_SIZE,\n changetype(this.buffer_) + HEADER_SIZE,\n thisLen << alignof()\n );\n }\n if (otherLen) {\n memory.copy(\n changetype(out.buffer_) + HEADER_SIZE + (thisLen << alignof()),\n changetype(items.buffer_) + HEADER_SIZE,\n otherLen << alignof()\n );\n }\n return out;\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): this {\n var buffer = this.buffer_;\n var len = this.length_;\n\n end = min(end, len);\n var to = target < 0 ? max(len + target, 0) : min(target, len);\n var from = start < 0 ? max(len + start, 0) : min(start, len);\n var last = end < 0 ? max(len + end, 0) : min(end, len);\n var count = min(last - from, len - to);\n\n if (from < to && to < (from + count)) {\n from += count - 1;\n to += count - 1;\n while (count) {\n STORE(buffer, to, LOAD(buffer, from));\n --from, --to, --count;\n }\n } else {\n memory.copy(\n changetype(buffer) + HEADER_SIZE + (to << alignof()),\n changetype(buffer) + HEADER_SIZE + (from << alignof()),\n count << alignof()\n );\n }\n return this;\n }\n\n pop(): T {\n var length = this.length_;\n if (length < 1) throw new RangeError("Array is empty");\n var element = LOAD(this.buffer_, --length);\n this.length_ = length;\n return element;\n }\n\n forEach(callbackfn: (value: T, index: i32, array: Array) => void): void {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n callbackfn(LOAD(this.buffer_, index), index, this);\n }\n }\n\n map(callbackfn: (value: T, index: i32, array: Array) => U): Array {\n var length = this.length_;\n var result = new Array(length);\n var buffer = result.buffer_;\n for (let index = 0; index < min(length, this.length_); ++index) {\n STORE(buffer, index, callbackfn(LOAD(this.buffer_, index), index, this));\n }\n return result;\n }\n\n filter(callbackfn: (value: T, index: i32, array: Array) => bool): Array {\n var result = new Array();\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n let value = LOAD(this.buffer_, index);\n if (callbackfn(value, index, this)) result.push(value);\n }\n return result;\n }\n\n reduce(\n callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U,\n initialValue: U\n ): U {\n var accum = initialValue;\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n accum = callbackfn(accum, LOAD(this.buffer_, index), index, this);\n }\n return accum;\n }\n\n reduceRight(\n callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U,\n initialValue: U\n ): U {\n var accum = initialValue;\n for (let index = this.length_ - 1; index >= 0; --index) {\n accum = callbackfn(accum, LOAD(this.buffer_, index), index, this);\n }\n return accum;\n }\n\n shift(): T {\n var length = this.length_;\n if (length < 1) throw new RangeError("Array is empty");\n var buffer = this.buffer_;\n var element = LOAD(buffer, 0);\n var lastIndex = length - 1;\n memory.copy(\n changetype(buffer) + HEADER_SIZE,\n changetype(buffer) + HEADER_SIZE + sizeof(),\n lastIndex << alignof()\n );\n STORE(buffer, lastIndex, null);\n this.length_ = lastIndex;\n return element;\n }\n\n some(callbackfn: (element: T, index: i32, array: Array) => bool): bool {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n if (callbackfn(LOAD(this.buffer_, index), index, this)) return true;\n }\n return false;\n }\n\n unshift(element: T): i32 {\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n var length = this.length_;\n var newLength = length + 1; // safe only if length is checked\n if (length >= capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length >= MAX_LENGTH) throw new Error("Invalid array length");\n buffer = reallocateUnsafe(buffer, newLength << alignof());\n capacity = buffer.byteLength >>> alignof();\n this.buffer_ = buffer;\n }\n memory.copy(\n changetype(buffer) + HEADER_SIZE + sizeof(),\n changetype(buffer) + HEADER_SIZE,\n (capacity - 1) << alignof()\n );\n STORE(buffer, 0, element);\n this.length_ = newLength;\n if (isManaged()) __gc_link(changetype(this), changetype(element)); // tslint:disable-line\n return newLength;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Array {\n var len = this.length_;\n begin = begin < 0 ? max(begin + len, 0) : min(begin, len);\n end = end < 0 ? max(end + len, 0) : min(end, len);\n len = end - begin;\n var sliced = new Array(len);\n if (len) {\n memory.copy(\n changetype(sliced.buffer_) + HEADER_SIZE,\n changetype(this.buffer_) + HEADER_SIZE + (begin << alignof()),\n len << alignof()\n );\n }\n return sliced;\n }\n\n splice(start: i32, deleteCount: i32 = i32.MAX_VALUE): Array {\n var length = this.length_;\n start = start < 0 ? max(length + start, 0) : min(start, length);\n deleteCount = max(min(deleteCount, length - start), 0);\n var buffer = this.buffer_;\n var spliced = new Array(deleteCount);\n var source = changetype(buffer) + HEADER_SIZE + (start << alignof());\n memory.copy(\n changetype(spliced.buffer_) + HEADER_SIZE,\n source,\n deleteCount << alignof()\n );\n var offset = start + deleteCount;\n if (length != offset) {\n memory.copy(\n source,\n changetype(buffer) + HEADER_SIZE + (offset << alignof()),\n (length - offset) << alignof()\n );\n }\n this.length_ = length - deleteCount;\n return spliced;\n }\n\n reverse(): Array {\n var buffer = this.buffer_;\n for (let front = 0, back = this.length_ - 1; front < back; ++front, --back) {\n let temp = LOAD(buffer, front);\n STORE(buffer, front, LOAD(buffer, back));\n STORE(buffer, back, temp);\n }\n return this;\n }\n\n sort(comparator: (a: T, b: T) => i32 = COMPARATOR()): this {\n // TODO remove this when flow will allow trackcing null\n assert(comparator); // The comparison function must be a function\n\n var length = this.length_;\n if (length <= 1) return this;\n var buffer = this.buffer_;\n if (length == 2) {\n let a = LOAD(buffer, 1); // a = arr[1]\n let b = LOAD(buffer, 0); // b = arr[0]\n if (comparator(a, b) < 0) {\n STORE(buffer, 1, b); // arr[1] = b;\n STORE(buffer, 0, a); // arr[0] = a;\n }\n return this;\n }\n SORT(buffer, 0, length, comparator);\n return this;\n }\n\n join(separator: string = ","): string {\n var lastIndex = this.length_ - 1;\n if (lastIndex < 0) return "";\n var result = "";\n var value: T;\n var buffer = this.buffer_;\n var sepLen = separator.length;\n var hasSeparator = sepLen != 0;\n if (value instanceof bool) {\n if (!lastIndex) return select("true", "false", LOAD(buffer, 0));\n\n let valueLen = 5; // max possible length of element len("false")\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n valueLen = 4 + (!value);\n copyUnsafeString(result, offset, select("true", "false", value), 0, valueLen);\n offset += valueLen;\n if (hasSeparator) {\n copyUnsafeString(result, offset, changetype(separator), 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n valueLen = 4 + (!value);\n copyUnsafeString(result, offset, select("true", "false", value), 0, valueLen);\n offset += valueLen;\n\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else if (isInteger()) {\n if (!lastIndex) return changetype(itoa(LOAD(buffer, 0)));\n\n const valueLen = (sizeof() <= 4 ? 10 : 20) + isSigned();\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n offset += itoa_stream(changetype(result), offset, value);\n if (hasSeparator) {\n copyUnsafeString(result, offset, separator, 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n offset += itoa_stream(changetype(result), offset, value);\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else if (isFloat()) {\n if (!lastIndex) return changetype(dtoa(LOAD(buffer, 0)));\n\n const valueLen = MAX_DOUBLE_LENGTH;\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n offset += dtoa_stream(changetype(result), offset, value);\n if (hasSeparator) {\n copyUnsafeString(result, offset, separator, 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n offset += dtoa_stream(changetype(result), offset, value);\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else if (isString()) {\n if (!lastIndex) return LOAD(buffer, 0);\n\n let estLen = 0;\n for (let i = 0, len = lastIndex + 1; i < len; ++i) {\n estLen += LOAD(buffer, i).length;\n }\n let offset = 0;\n let result = allocateUnsafeString(estLen + sepLen * lastIndex);\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n if (value) {\n let valueLen = value.length; // tslint:disable-line:no-unsafe-any\n copyUnsafeString(result, offset, value, 0, valueLen); // tslint:disable-line:no-unsafe-any\n offset += valueLen; // tslint:disable-line:no-unsafe-any\n }\n if (hasSeparator) {\n copyUnsafeString(result, offset, separator, 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n if (value) {\n let valueLen = value.length; // tslint:disable-line:no-unsafe-any\n copyUnsafeString(result, offset, value, 0, valueLen); // tslint:disable-line:no-unsafe-any\n }\n return result;\n } else if (isArray()) {\n if (!lastIndex) {\n value = LOAD(buffer, 0);\n return value ? value.join(separator) : ""; // tslint:disable-line:no-unsafe-any\n }\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n if (value) result += value.join(separator); // tslint:disable-line:no-unsafe-any\n if (hasSeparator) result += separator;\n }\n value = LOAD(buffer, lastIndex);\n if (value) result += value.join(separator); // tslint:disable-line:no-unsafe-any\n return result;\n } else if (isReference()) { // References\n if (!lastIndex) return "[object Object]";\n const valueLen = 15; // max possible length of element len("[object Object]")\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n if (value) {\n copyUnsafeString(result, offset, changetype("[object Object]"), 0, valueLen);\n offset += valueLen;\n }\n if (hasSeparator) {\n copyUnsafeString(result, offset, changetype(separator), 0, sepLen);\n offset += sepLen;\n }\n }\n if (LOAD(buffer, lastIndex)) {\n copyUnsafeString(result, offset, changetype("[object Object]"), 0, valueLen);\n offset += valueLen;\n }\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else {\n assert(false); // Unsupported generic typename\n }\n }\n\n @inline\n toString(): string {\n return this.join();\n }\n\n private __gc(): void {\n var buffer = this.buffer_;\n __gc_mark(changetype(buffer)); // tslint:disable-line\n if (isManaged()) {\n let offset: usize = 0;\n let end = this.length_ << alignof();\n while (offset < end) {\n __gc_mark(load(changetype(buffer) + offset, HEADER_SIZE)); // tslint:disable-line\n offset += sizeof();\n }\n }\n }\n}\n',arraybuffer:'import {\n HEADER_SIZE,\n MAX_BLENGTH,\n allocateUnsafe\n} from "./internal/arraybuffer";\n\nimport {\n Uint8ClampedArray,\n Uint8Array,\n Int8Array,\n Uint16Array,\n Int16Array,\n Uint32Array,\n Int32Array,\n Uint64Array,\n Int64Array\n} from "./typedarray";\n\nimport {\n DataView\n} from "./dataview";\n\n@sealed\nexport class ArrayBuffer {\n\n readonly byteLength: i32; // capped to [0, MAX_LENGTH]\n\n @inline static isView(value: T): bool {\n if (value === null) return false;\n if (value instanceof Uint8ClampedArray) return true;\n if (value instanceof Uint8Array) return true;\n if (value instanceof Int8Array) return true;\n if (value instanceof Uint16Array) return true;\n if (value instanceof Int16Array) return true;\n if (value instanceof Uint32Array) return true;\n if (value instanceof Int32Array) return true;\n if (value instanceof Uint64Array) return true;\n if (value instanceof Int64Array) return true;\n if (value instanceof DataView) return true;\n return false;\n }\n\n // @unsafe\n @inline get data(): usize { return changetype(this) + HEADER_SIZE; }\n\n constructor(length: i32, unsafe: bool = false) {\n if (length > MAX_BLENGTH) throw new RangeError("Invalid array buffer length");\n var buffer = allocateUnsafe(length);\n if (!unsafe) memory.fill(changetype(buffer) + HEADER_SIZE, 0, length);\n return buffer;\n }\n\n slice(begin: i32 = 0, end: i32 = MAX_BLENGTH): ArrayBuffer {\n var len = this.byteLength;\n if (begin < 0) begin = max(len + begin, 0);\n else begin = min(begin, len);\n if (end < 0) end = max(len + end, 0);\n else end = min(end, len);\n var newLen = max(end - begin, 0);\n var buffer = allocateUnsafe(newLen);\n memory.copy(changetype(buffer) + HEADER_SIZE, changetype(this) + HEADER_SIZE + begin, newLen);\n return buffer;\n }\n\n toString(): string {\n return "[object ArrayBuffer]";\n }\n}\n',"bindings/Date":"export declare function UTC(\n // NOTE: Using i32 below saves us a f64.convert_s instruction and moves the responsibility for\n // converting the value to the WASM/JS boundary.\n year: i32,\n month: i32,\n day: i32,\n hour: i32,\n minute: i32,\n second: i32,\n millisecond: f64\n): f64;\nexport declare function now(): f64;\n","bindings/Math":"export declare const E: f64;\nexport declare const LN2: f64;\nexport declare const LN10: f64;\nexport declare const LOG2E: f64;\nexport declare const LOG10E: f64;\nexport declare const PI: f64;\nexport declare const SQRT1_2: f64;\nexport declare const SQRT2: f64;\n\nexport declare function abs(x: f64): f64;\nexport declare function acos(x: f64): f64;\nexport declare function acosh(x: f64): f64;\nexport declare function asin(x: f64): f64;\nexport declare function asinh(x: f64): f64;\nexport declare function atan(x: f64): f64;\nexport declare function atan2(y: f64, x: f64): f64;\nexport declare function atanh(x: f64): f64;\nexport declare function cbrt(x: f64): f64;\nexport declare function ceil(x: f64): f64;\nexport declare function clz32(x: f64): f64;\nexport declare function cos(x: f64): f64;\nexport declare function cosh(x: f64): f64;\nexport declare function exp(x: f64): f64;\nexport declare function expm1(x: f64): f64;\nexport declare function floor(x: f64): f64;\nexport declare function fround(x: f64): f32;\nexport declare function hypot(value1: f64, value2: f64): f64; // TODO: rest\nexport declare function imul(a: f64, b: f64): f64;\nexport declare function log(x: f64): f64;\nexport declare function log10(x: f64): f64;\nexport declare function log1p(x: f64): f64;\nexport declare function log2(x: f64): f64;\nexport declare function max(value1: f64, value2: f64): f64; // TODO: rest\nexport declare function min(value1: f64, value2: f64): f64; // TODO: rest\nexport declare function pow(base: f64, exponent: f64): f64;\nexport declare function random(): f64;\nexport declare function round(x: f64): f64;\nexport declare function sign(x: f64): f64;\nexport declare function sin(x: f64): f64;\nexport declare function sinh(x: f64): f64;\nexport declare function sqrt(x: f64): f64;\nexport declare function tan(x: f64): f64;\nexport declare function tanh(x: f64): f64;\nexport declare function trunc(x: f64): f64;\n",builtins:"/* tslint:disable */\n\n@builtin @inline export const NaN: f64 = 0 / 0;\n@builtin @inline export const Infinity: f64 = 1 / 0;\n\n@builtin export declare function isInteger(value?: T): bool;\n@builtin export declare function isFloat(value?: T): bool;\n@builtin export declare function isSigned(value?: T): bool;\n@builtin export declare function isReference(value?: T): bool;\n@builtin export declare function isString(value?: T): bool;\n@builtin export declare function isArray(value?: T): bool;\n@builtin export declare function isDefined(expression: void): bool;\n@builtin export declare function isConstant(expression: void): bool;\n@builtin export declare function isManaged(value?: T): bool;\n@inline export function isNaN(value: T): bool { return value != value; }\n@inline export function isFinite(value: T): bool { return value - value == 0; }\n\n@builtin export declare function clz(value: T): T;\n@builtin export declare function ctz(value: T): T;\n@builtin export declare function popcnt(value: T): T;\n@builtin export declare function rotl(value: T, shift: T): T;\n@builtin export declare function rotr(value: T, shift: T): T;\n@builtin export declare function abs(value: T): T;\n@builtin export declare function max(left: T, right: T): T;\n@builtin export declare function min(left: T, right: T): T;\n@builtin export declare function ceil(value: T): T;\n@builtin export declare function floor(value: T): T;\n@builtin export declare function copysign(left: T, right: T): T;\n@builtin export declare function nearest(value: T): T;\n@builtin export declare function reinterpret(value: void): T;\n@builtin export declare function sqrt(value: T): T;\n@builtin export declare function trunc(value: T): T;\n@builtin export declare function load(offset: usize, constantOffset?: usize): T;\n@builtin export declare function store(offset: usize, value: void, constantOffset?: usize): void;\n@builtin export declare function sizeof(): usize; // | u32 / u64\n@builtin export declare function alignof(): usize; // | u32 / u64\n@builtin export declare function offsetof(fieldName?: string): usize; // | u32 / u64\n@builtin export declare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n@builtin export declare function unreachable(): void;\n@builtin export declare function changetype(value: void): T;\n@builtin export declare function assert(isTrueish: T, message?: string): T;\n@builtin export declare function unchecked(expr: T): T;\n@builtin export declare function call_indirect(target: void, ...args: void[]): T;\n@builtin export declare function instantiate(...args: void[]): T;\n\nexport namespace atomic {\n @builtin export declare function load(offset: usize, constantOffset?: usize): T;\n @builtin export declare function store(offset: usize, value: void, constantOffset?: usize): void;\n @builtin export declare function add(ptr: usize, value: T, constantOffset?: usize): T;\n @builtin export declare function sub(ptr: usize, value: T, constantOffset?: usize): T;\n @builtin export declare function and(ptr: usize, value: T, constantOffset?: usize): T;\n @builtin export declare function or(ptr: usize, value: T, constantOffset?: usize): T;\n @builtin export declare function xor(ptr: usize, value: T, constantOffset?: usize): T;\n @builtin export declare function xchg(ptr: usize, value: T, constantOffset?: usize): T;\n @builtin export declare function cmpxchg(ptr: usize, expected:T, replacement: T, constantOffset?: usize): T;\n @builtin export declare function wait(ptr: usize, expected:T, timeout:i64): i32;\n @builtin export declare function notify(ptr: usize, count: u32): u32;\n}\n\n@builtin export declare function i8(value: void): i8;\nexport namespace i8 {\n @lazy export const MIN_VALUE: i8 = -128;\n @lazy export const MAX_VALUE: i8 = 127;\n}\n\n@builtin export declare function i16(value: void): i16;\nexport namespace i16 {\n @lazy export const MIN_VALUE: i16 = -32768;\n @lazy export const MAX_VALUE: i16 = 32767;\n}\n\n@builtin export declare function i32(value: void): i32;\nexport namespace i32 {\n @lazy export const MIN_VALUE: i32 = -2147483648;\n @lazy export const MAX_VALUE: i32 = 2147483647;\n @builtin export declare function clz(value: i32): i32;\n @builtin export declare function ctz(value: i32): i32;\n @builtin export declare function popcnt(value: i32): i32;\n @builtin export declare function rotl(value: i32, shift: i32): i32;\n @builtin export declare function rotr(value: i32, shift: i32): i32;\n @builtin export declare function reinterpret_f32(value: f32): i32;\n @builtin export declare function load8_s(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load8_u(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load16_s(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load16_u(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function store8(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function store16(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function store(offset: usize, value: i32, constantOffset?: usize): void;\n \n export namespace atomic {\n @builtin export declare function load8_s(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load8_u(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load16_s(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load16_u(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function store8(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function store16(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function store(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function wait(ptr: usize, expected:i32, timeout:i64): i32;\n @builtin export declare function notify(ptr: usize, count:u32): u32;\n\n export namespace rmw8_u {\n @builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, constantOffset?: usize): i32;\n }\n\n export namespace rmw16_u {\n @builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, constantOffset?: usize): i32;\n }\n\n export namespace rmw {\n @builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, constantOffset?: usize): i32;\n }\n }\n}\n\n@builtin export declare function i64(value: void): i64;\nexport namespace i64 {\n @lazy export const MIN_VALUE: i64 = -9223372036854775808;\n @lazy export const MAX_VALUE: i64 = 9223372036854775807;\n @builtin export declare function clz(value: i64): i64;\n @builtin export declare function ctz(value: i64): i64;\n @builtin export declare function load8_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load8_u(offset: usize, constantOffset?: usize): u64;\n @builtin export declare function load16_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load16_u(offset: usize, constantOffset?: usize): u64;\n @builtin export declare function load32_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load32_u(offset: usize, constantOffset?: usize): u64;\n @builtin export declare function load(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function popcnt(value: i64): i64;\n @builtin export declare function rotl(value: i64, shift: i64): i64;\n @builtin export declare function rotr(value: i64, shift: i64): i64;\n @builtin export declare function reinterpret_f64(value: f64): i64;\n @builtin export declare function store8(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store16(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store32(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store(offset: usize, value: i64, constantOffset?: usize): void;\n\n namespace atomic {\n @builtin export declare function load8_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load8_u(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load16_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load16_u(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function store8(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store16(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function wait(ptr: usize, expected:i64, timeout:i64): i32;\n @builtin export declare function notify(ptr: usize, count:u32): u32;\n\n export namespace rmw8_u {\n @builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;\n }\n\n export namespace rmw16_u {\n @builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;\n }\n\n export namespace rmw32_u {\n @builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;\n }\n\n export namespace rmw {\n @builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;\n }\n } \n}\n\n@builtin export declare function isize(value: void): isize;\nexport namespace isize {\n @lazy export const MIN_VALUE: isize = sizeof() == sizeof()\n ? -2147483648\n : -9223372036854775808;\n @lazy export const MAX_VALUE: isize = sizeof() == sizeof()\n ? 2147483647\n : 9223372036854775807;\n}\n\n@builtin export declare function u8(value: void): u8;\nexport namespace u8 {\n @lazy export const MIN_VALUE: u8 = 0;\n @lazy export const MAX_VALUE: u8 = 255;\n}\n\n@builtin export declare function u16(value: void): u16;\nexport namespace u16 {\n @lazy export const MIN_VALUE: u16 = 0;\n @lazy export const MAX_VALUE: u16 = 65535;\n}\n\n@builtin export declare function u32(value: void): u32;\nexport namespace u32 {\n @lazy export const MIN_VALUE: u32 = 0;\n @lazy export const MAX_VALUE: u32 = 4294967295;\n}\n\n@builtin export declare function u64(value: void): u64;\nexport namespace u64 {\n @lazy export const MIN_VALUE: u64 = 0;\n @lazy export const MAX_VALUE: u64 = 18446744073709551615;\n}\n\n@builtin export declare function usize(value: void): usize;\nexport namespace usize {\n @lazy export const MIN_VALUE: usize = 0;\n @lazy export const MAX_VALUE: usize = sizeof() == sizeof()\n ? 4294967295\n : 18446744073709551615;\n}\n\n@builtin export declare function bool(value: void): bool;\nexport namespace bool {\n @lazy export const MIN_VALUE: bool = false;\n @lazy export const MAX_VALUE: bool = true;\n}\n\n@builtin export declare function f32(value: void): f32;\nexport namespace f32 {\n @lazy export const EPSILON = reinterpret(0x34000000); // 0x1p-23f\n @lazy export const MIN_VALUE = reinterpret(0x00000001); // 0x0.000001p+0f\n @lazy export const MAX_VALUE = reinterpret(0x7F7FFFFF); // 0x1.fffffep+127f\n @lazy export const MIN_NORMAL_VALUE = reinterpret(0x00800000); // 0x1p-126f\n @lazy export const MIN_SAFE_INTEGER: f32 = -16777215;\n @lazy export const MAX_SAFE_INTEGER: f32 = 16777215;\n @builtin export declare function abs(value: f32): f32;\n @builtin export declare function ceil(value: f32): f32;\n @builtin export declare function copysign(x: f32, y: f32): f32;\n @builtin export declare function floor(value: f32): f32;\n @builtin export declare function load(offset: usize, constantOffset?: usize): f32;\n @builtin export declare function max(left: f32, right: f32): f32;\n @builtin export declare function min(left: f32, right: f32): f32;\n @builtin export declare function nearest(value: f32): f32;\n @builtin export declare function reinterpret_i32(value: i32): f32;\n @builtin export declare function sqrt(value: f32): f32;\n @builtin export declare function store(offset: usize, value: f32, constantOffset?: usize): void;\n @builtin export declare function trunc(value: f32): f32;\n}\n\n@builtin export declare function f64(value: void): f64;\nexport namespace f64 {\n @lazy export const EPSILON = reinterpret(0x3CB0000000000000); // 0x1p-52\n @lazy export const MIN_VALUE = reinterpret(0x0000000000000001); // 0x0.0000000000001p+0\n @lazy export const MAX_VALUE = reinterpret(0x7FEFFFFFFFFFFFFF); // 0x1.fffffffffffffp+1023\n @lazy export const MIN_NORMAL_VALUE = reinterpret(0x0010000000000000); // 0x1p-1022\n @lazy export const MIN_SAFE_INTEGER: f64 = -9007199254740991;\n @lazy export const MAX_SAFE_INTEGER: f64 = 9007199254740991;\n @builtin export declare function abs(value: f64): f64;\n @builtin export declare function ceil(value: f64): f64;\n @builtin export declare function copysign(x: f64, y: f64): f64;\n @builtin export declare function floor(value: f64): f64;\n @builtin export declare function load(offset: usize, constantOffset?: usize): f64;\n @builtin export declare function max(left: f64, right: f64): f64;\n @builtin export declare function min(left: f64, right: f64): f64;\n @builtin export declare function nearest(value: f64): f64;\n @builtin export declare function reinterpret_i64(value: i64): f64;\n @builtin export declare function sqrt(value: f64): f64;\n @builtin export declare function store(offset: usize, value: f64, constantOffset?: usize): void;\n @builtin export declare function trunc(value: f64): f64;\n}\n\n@builtin export declare function start(): void;\n","collector/itcm":'/**\n * Incremental Tri-Color-Marking Garbage Collector.\n *\n * @module std/assembly/collector/itcm\n *//***/\n\n// Largely based on Bach Le\'s μgc, see: https://github.com/bullno1/ugc\n\n@inline const TRACE = false;\n\n/** Size of a managed object header. */\n@inline export const HEADER_SIZE: usize = (offsetof() + AL_MASK) & ~AL_MASK;\n\nimport { AL_MASK, MAX_SIZE_32 } from "../internal/allocator";\nimport { iterateRoots } from "../gc";\n\n/** Collector states. */\nconst enum State {\n /** Not yet initialized. */\n INIT = 0,\n /** Currently transitioning from SWEEP to MARK state. */\n IDLE = 1,\n /** Currently marking reachable objects. */\n MARK = 2,\n /** Currently sweeping unreachable objects. */\n SWEEP = 3\n}\n\n/** Current collector state. */\nvar state = State.INIT;\n/** Current white color value. */\nvar white = 0;\n\n// From and to spaces\nvar fromSpace: ManagedObjectList;\nvar toSpace: ManagedObjectList;\nvar iter: ManagedObject;\n\n// ╒═══════════════ Managed object layout (32-bit) ════════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┼─┼─┴─┤ ┐\n// │ next │0│ C │ ◄─┐ = nextWithColor\n// ├─────────────────────────────────────────────────────────┴─┴───┤ │ usize\n// │ prev │ ◄─┘\n// ├───────────────────────────────────────────────────────────────┤\n// │ hookFn │\n// ╞═══════════════════════════════════════════════════════════════╡ SIZE ┘ ◄─ user-space reference\n// │ ... data ... │\n// └───────────────────────────────────────────────────────────────┘\n// C: color\n\n/** Represents a managed object in memory, consisting of a header followed by the object\'s data. */\n@unmanaged class ManagedObject {\n\n /** Pointer to the next object with color flags stored in the alignment bits. */\n nextWithColor: usize;\n\n /** Pointer to the previous object. */\n prev: ManagedObject;\n\n /** Class-specific hook function called with the user-space reference. */\n hookFn: (ref: usize) => void;\n\n /** Gets the pointer to the next object. */\n get next(): ManagedObject {\n return changetype(this.nextWithColor & ~3);\n }\n\n /** Sets the pointer to the next object. */\n set next(obj: ManagedObject) {\n this.nextWithColor = changetype(obj) | (this.nextWithColor & 3);\n }\n\n /** Gets this object\'s color. */\n get color(): i32 {\n return this.nextWithColor & 3;\n }\n\n /** Sets this object\'s color. */\n set color(color: i32) {\n this.nextWithColor = (this.nextWithColor & ~3) | color;\n }\n\n /** Unlinks this object from its list. */\n unlink(): void {\n var next = this.next;\n var prev = this.prev;\n if (TRACE) trace(" unlink", 3, objToRef(prev), objToRef(this), objToRef(next));\n next.prev = prev;\n prev.next = next;\n }\n\n /** Marks this object as gray, that is reachable with unscanned children. */\n makeGray(): void {\n if (TRACE) trace(" makeGray", 1, objToRef(this));\n const gray = 2;\n if (this == iter) iter = this.prev;\n this.unlink();\n toSpace.push(this);\n this.nextWithColor = (this.nextWithColor & ~3) | gray;\n }\n}\n\n/** A list of managed objects. Used for the from and to spaces. */\n@unmanaged class ManagedObjectList extends ManagedObject {\n\n /** Inserts an object. */\n push(obj: ManagedObject): void {\n var prev = this.prev;\n if (TRACE) trace(" push", 3, objToRef(prev), objToRef(obj), objToRef(this));\n obj.next = this;\n obj.prev = prev;\n prev.next = obj;\n this.prev = obj;\n }\n\n /** Clears this list. */\n clear(): void {\n if (TRACE) trace(" clear", 1, objToRef(this));\n this.nextWithColor = changetype(this);\n this.prev = this;\n }\n}\n\n/** Performs a single step according to the current state. */\nfunction step(): void {\n var obj: ManagedObject;\n switch (state) {\n case State.INIT: {\n if (TRACE) trace("gc~step/INIT");\n fromSpace = changetype(memory.allocate(HEADER_SIZE));\n fromSpace.hookFn = changetype<(ref: usize) => void>(-1); // would error\n fromSpace.clear();\n toSpace = changetype(memory.allocate(HEADER_SIZE));\n toSpace.hookFn = changetype<(ref: usize) => void>(-1); // would error\n toSpace.clear();\n iter = toSpace;\n state = State.IDLE;\n if (TRACE) trace("gc~state = IDLE");\n // fall-through\n }\n case State.IDLE: {\n if (TRACE) trace("gc~step/IDLE");\n iterateRoots(__gc_mark);\n state = State.MARK;\n if (TRACE) trace("gc~state = MARK");\n break;\n }\n case State.MARK: {\n obj = iter.next;\n if (obj !== toSpace) {\n if (TRACE) trace("gc~step/MARK iterate", 1, objToRef(obj));\n iter = obj;\n obj.color = !white;\n // if (TRACE) {\n // trace(" next/prev/hook", 3,\n // changetype(obj.next),\n // changetype(obj.prev),\n // changetype(obj.hookFn)\n // );\n // }\n obj.hookFn(objToRef(obj));\n } else {\n if (TRACE) trace("gc~step/MARK finish");\n iterateRoots(__gc_mark);\n obj = iter.next;\n if (obj === toSpace) {\n let from = fromSpace;\n fromSpace = toSpace;\n toSpace = from;\n white = !white;\n iter = from.next;\n state = State.SWEEP;\n if (TRACE) trace("gc~state = SWEEP");\n }\n }\n break;\n }\n case State.SWEEP: {\n obj = iter;\n if (obj !== toSpace) {\n if (TRACE) trace("gc~step/SWEEP free", 1, objToRef(obj));\n iter = obj.next;\n if (changetype(obj) >= HEAP_BASE) memory.free(changetype(obj));\n } else {\n if (TRACE) trace("gc~step/SWEEP finish");\n toSpace.clear();\n state = State.IDLE;\n if (TRACE) trace("gc~state = IDLE");\n }\n break;\n }\n }\n}\n\n@inline function refToObj(ref: usize): ManagedObject {\n return changetype(ref - HEADER_SIZE);\n}\n\n@inline function objToRef(obj: ManagedObject): usize {\n return changetype(obj) + HEADER_SIZE;\n}\n\n// Garbage collector interface\n\n@global export function __gc_allocate(\n size: usize,\n markFn: (ref: usize) => void\n): usize {\n if (TRACE) trace("gc.allocate", 1, size);\n if (size > MAX_SIZE_32 - HEADER_SIZE) unreachable();\n step(); // also makes sure it\'s initialized\n var obj = changetype(memory.allocate(HEADER_SIZE + size));\n obj.hookFn = markFn;\n obj.color = white;\n fromSpace.push(obj);\n return objToRef(obj);\n}\n\n@global export function __gc_link(parentRef: usize, childRef: usize): void {\n if (TRACE) trace("gc.link", 2, parentRef, childRef);\n var parent = refToObj(parentRef);\n if (parent.color == !white && refToObj(childRef).color == white) parent.makeGray();\n}\n\n@global export function __gc_mark(ref: usize): void {\n if (TRACE) trace("gc.mark", 1, ref);\n if (ref) {\n let obj = refToObj(ref);\n if (obj.color == white) obj.makeGray();\n }\n}\n\n@global export function __gc_collect(): void {\n if (TRACE) trace("gc.collect");\n // begin collecting if not yet collecting\n switch (state) {\n case State.INIT:\n case State.IDLE: step();\n }\n // finish the cycle\n while (state != State.IDLE) step();\n}\n',dataview:'import {\n HEADER_SIZE,\n MAX_BLENGTH\n} from "./internal/arraybuffer";\n\nexport class DataView {\n\n constructor(\n readonly buffer: ArrayBuffer,\n readonly byteOffset: i32 = 0,\n readonly byteLength: i32 = i32.MIN_VALUE // FIXME\n ) {\n if (byteLength === i32.MIN_VALUE) byteLength = buffer.byteLength - byteOffset; // FIXME\n if (byteOffset > MAX_BLENGTH) throw new RangeError("Invalid byteOffset");\n if (byteLength > MAX_BLENGTH) throw new RangeError("Invalid byteLength");\n if (byteOffset + byteLength > buffer.byteLength) throw new RangeError("Invalid length");\n }\n\n getFloat32(byteOffset: i32, littleEndian: boolean = false): f32 {\n checkOffset(byteOffset, 4, this.byteLength);\n return littleEndian\n ? load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n : reinterpret(\n bswap(\n load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n )\n );\n }\n\n getFloat64(byteOffset: i32, littleEndian: boolean = false): f64 {\n checkOffset(byteOffset, 8, this.byteLength);\n return littleEndian\n ? load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n : reinterpret(\n bswap(\n load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n )\n );\n }\n\n getInt8(byteOffset: i32): i8 {\n checkOffset(byteOffset, 1, this.byteLength);\n return load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n }\n\n getInt16(byteOffset: i32, littleEndian: boolean = false): i16 {\n checkOffset(byteOffset, 2, this.byteLength);\n var result: i16 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getInt32(byteOffset: i32, littleEndian: boolean = false): i32 {\n checkOffset(byteOffset, 4, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getUint8(byteOffset: i32): u8 {\n checkOffset(byteOffset, 1, this.byteLength);\n return load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n }\n\n getUint16(byteOffset: i32, littleEndian: boolean = false): u16 {\n checkOffset(byteOffset, 2, this.byteLength);\n var result: u16 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getUint32(byteOffset: i32, littleEndian: boolean = false): u32 {\n checkOffset(byteOffset, 4, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n setFloat32(byteOffset: i32, value: f32, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 4, this.byteLength);\n if (littleEndian) {\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n } else {\n store(changetype(this.buffer) + this.byteOffset + byteOffset,\n bswap(\n reinterpret(value)\n ),\n HEADER_SIZE\n );\n }\n }\n\n setFloat64(byteOffset: i32, value: f64, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 8, this.byteLength);\n if (littleEndian) {\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n } else {\n store(changetype(this.buffer) + this.byteOffset + byteOffset,\n bswap(\n reinterpret(value)\n ),\n HEADER_SIZE\n );\n }\n }\n\n setInt8(byteOffset: i32, value: i8): void {\n checkOffset(byteOffset, 1, this.byteLength);\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n }\n\n setInt16(byteOffset: i32, value: i16, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 2, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setInt32(byteOffset: i32, value: i32, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 4, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setUint8(byteOffset: i32, value: u8): void {\n checkOffset(byteOffset, 1, this.byteLength);\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n }\n\n setUint16(byteOffset: i32, value: u16, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 2, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setUint32(byteOffset: i32, value: u32, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 4, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n // Non-standard additions that make sense in WebAssembly, but won\'t work in JS:\n\n getInt64(byteOffset: i32, littleEndian: boolean = false): i64 {\n checkOffset(byteOffset, 8, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getUint64(byteOffset: i32, littleEndian: boolean = false): u64 {\n checkOffset(byteOffset, 8, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n setInt64(byteOffset: i32, value: i64, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 8, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setUint64(byteOffset: i32, value: u64, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 8, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n toString(): string {\n return "[object DataView]";\n }\n}\n\n@inline function checkOffset(byteOffset: i32, n: i32, byteLength: i32): void {\n // n and byteLength must be known to be in bounds\n if (byteOffset > MAX_BLENGTH || byteOffset + n > byteLength) throw new Error("Offset out of bounds");\n}\n',date:'import {\n UTC as Date_UTC,\n now as Date_now\n} from "./bindings/Date";\n\nexport class Date {\n\n @inline static UTC(\n year: i32,\n month: i32 = 0,\n day: i32 = 1,\n hour: i32 = 0,\n minute: i32 = 0,\n second: i32 = 0,\n millisecond: i64 = 0\n ): i64 {\n return Date_UTC(year, month, day, hour, minute, second, millisecond);\n }\n\n @inline static now(): i64 {\n return Date_now();\n }\n\n private value: i64;\n\n constructor(value: i64) {\n this.value = value;\n }\n\n getTime(): i64 {\n return this.value;\n }\n\n setTime(value: i64): i64 {\n this.value = value;\n return value;\n }\n}\n',diagnostics:"/* tslint:disable */\n\n@builtin export declare function ERROR(message?: void): void;\n@builtin export declare function WARNING(message?: void): void;\n@builtin export declare function INFO(message?: void): void;\n",env:"declare function abort(\n message?: string | null,\n fileName?: string | null,\n lineNumber?: u32,\n columnNumber?: u32\n): void;\n\ndeclare function trace(\n message: string,\n n?: i32,\n a0?: f64,\n a1?: f64,\n a2?: f64,\n a3?: f64,\n a4?: f64\n): void;\n",error:'export class Error {\n\n name: string = "Error";\n stack: string = ""; // TODO\n\n constructor(\n public message: string = ""\n ) {}\n\n toString(): string {\n var message = this.message;\n return message.length\n ? this.name + ": " + message\n : this.name;\n }\n}\n\nexport class RangeError extends Error {\n constructor(message: string = "") {\n super(message);\n this.name = "RangeError";\n }\n}\n\nexport class TypeError extends Error {\n constructor(message: string = "") {\n super(message);\n this.name = "TypeError";\n }\n}\n\nexport class SyntaxError extends Error {\n constructor(message: string = "") {\n super(message);\n this.name = "SyntaxError";\n }\n}\n',gc:"/* tslint:disable */\n\n@builtin export declare function iterateRoots(fn: (ref: usize) => void): void;\n\nexport namespace gc {\n\n export function collect(): void {\n if (isDefined(__gc_collect)) { __gc_collect(); return; }\n WARNING(\"Calling 'gc.collect' requires a garbage collector to be present.\");\n unreachable();\n }\n}\n","internal/allocator":"/** Number of alignment bits. */\n@inline export const AL_BITS: u32 = 3;\n/** Number of possible alignment values. */\n@inline export const AL_SIZE: usize = 1 << AL_BITS;\n/** Mask to obtain just the alignment bits. */\n@inline export const AL_MASK: usize = AL_SIZE - 1;\n/** Maximum 32-bit allocation size. */\n@inline export const MAX_SIZE_32: usize = 1 << 30; // 1GB\n","internal/arraybuffer":'import {\n AL_MASK,\n MAX_SIZE_32\n } from "./allocator";\n\n/** Size of an ArrayBuffer header. */\n@inline export const HEADER_SIZE: usize = (offsetof() + AL_MASK) & ~AL_MASK;\n/** Maximum byte length of an ArrayBuffer. */\n@inline export const MAX_BLENGTH: i32 = MAX_SIZE_32 - HEADER_SIZE;\n\nfunction computeSize(byteLength: i32): usize {\n // round up to power of 2, with HEADER_SIZE=8:\n // 0 -> 2^3 = 8\n // 1..8 -> 2^4 = 16\n // 9..24 -> 2^5 = 32\n // ...\n // MAX_LENGTH -> 2^30 = 0x40000000 (MAX_SIZE_32)\n return 1 << (32 - clz(byteLength + HEADER_SIZE - 1));\n}\n\n// Low-level utility\n\nfunction __gc(ref: usize): void {}\n\nexport function allocateUnsafe(byteLength: i32): ArrayBuffer {\n assert(byteLength <= MAX_BLENGTH);\n var buffer: usize;\n if (isManaged()) {\n buffer = __gc_allocate(computeSize(byteLength), __gc); // tslint:disable-line\n } else {\n buffer = memory.allocate(computeSize(byteLength));\n }\n store(buffer, byteLength, offsetof("byteLength"));\n return changetype(buffer);\n}\n\nexport function reallocateUnsafe(buffer: ArrayBuffer, newByteLength: i32): ArrayBuffer {\n var oldByteLength = buffer.byteLength;\n if (newByteLength > oldByteLength) {\n assert(newByteLength <= MAX_BLENGTH);\n if (newByteLength <= (computeSize(oldByteLength) - HEADER_SIZE)) { // fast path: zero out additional space\n store(changetype(buffer), newByteLength, offsetof("byteLength"));\n } else { // slow path: copy to new buffer\n let newBuffer = allocateUnsafe(newByteLength);\n memory.copy(\n changetype(newBuffer) + HEADER_SIZE,\n changetype(buffer) + HEADER_SIZE,\n oldByteLength\n );\n if (!isManaged()) {\n memory.free(changetype(buffer));\n }\n buffer = newBuffer;\n }\n memory.fill(\n changetype(buffer) + HEADER_SIZE + oldByteLength,\n 0,\n (newByteLength - oldByteLength)\n );\n } else if (newByteLength < oldByteLength) { // fast path: override size\n // TBD: worth to copy and release if size is significantly less than before?\n assert(newByteLength >= 0);\n store(changetype(buffer), newByteLength, offsetof("byteLength"));\n }\n return buffer;\n}\n\n// The helpers below use two different types in order to emit loads and stores that load respectively\n// store one type to/from memory while returning/taking the desired output/input type. This allows to\n// emit instructions like\n//\n// * `i32.load8` ^= `load(...)` that reads an i8 but returns an i32, or\n// * `i64.load32_s` ^= `load(...)`) that reads a 32-bit as a 64-bit integer\n//\n// without having to emit an additional instruction for conversion purposes. The second parameter\n// can be omitted for references and other loads and stores that simply return the exact type.\n\n@inline export function LOAD(buffer: ArrayBuffer, index: i32, byteOffset: i32 = 0): TOut {\n return load(changetype(buffer) + (index << alignof()) + byteOffset, HEADER_SIZE);\n}\n\n@inline export function STORE(buffer: ArrayBuffer, index: i32, value: TIn, byteOffset: i32 = 0): void {\n store(changetype(buffer) + (index << alignof()) + byteOffset, value, HEADER_SIZE);\n}\n',"internal/hash":'import {\n HEADER_SIZE\n} from "./string";\n\n/** Computes the 32-bit hash of a value of any type. */\n@inline\nexport function HASH(key: T): u32 {\n // branch-level tree-shaking makes this a `(return (call ...))`\n if (isString(key)) {\n return hashStr(key);\n } else if (isReference()) {\n if (sizeof() == 4) return hash32(changetype(key));\n if (sizeof() == 8) return hash64(changetype(key));\n } else if (isFloat()) {\n if (sizeof() == 4) return hash32(reinterpret(key));\n if (sizeof() == 8) return hash64(reinterpret(key));\n } else {\n if (sizeof() == 1) return hash8 (key);\n if (sizeof() == 2) return hash16(key);\n if (sizeof() == 4) return hash32(key);\n if (sizeof() == 8) return hash64(key);\n }\n unreachable();\n}\n\n// FNV-1a 32-bit as a starting point, see: http://isthe.com/chongo/tech/comp/fnv/\n\n@inline const FNV_OFFSET: u32 = 2166136261;\n@inline const FNV_PRIME: u32 = 16777619;\n\nfunction hash8(key: u32): u32 {\n return (FNV_OFFSET ^ key) * FNV_PRIME;\n}\n\nfunction hash16(key: u32): u32 {\n var v = FNV_OFFSET;\n v = (v ^ ( key & 0xff)) * FNV_PRIME;\n v = (v ^ ( key >> 8 )) * FNV_PRIME;\n return v;\n}\n\nfunction hash32(key: u32): u32 {\n var v = FNV_OFFSET;\n v = (v ^ ( key & 0xff)) * FNV_PRIME;\n v = (v ^ ((key >> 8) & 0xff)) * FNV_PRIME;\n v = (v ^ ((key >> 16) & 0xff)) * FNV_PRIME;\n v = (v ^ ( key >> 24 )) * FNV_PRIME;\n return v;\n}\n\nfunction hash64(key: u64): u32 {\n var l = key;\n var h = (key >>> 32);\n var v = FNV_OFFSET;\n v = (v ^ ( l & 0xff)) * FNV_PRIME;\n v = (v ^ ((l >> 8) & 0xff)) * FNV_PRIME;\n v = (v ^ ((l >> 16) & 0xff)) * FNV_PRIME;\n v = (v ^ ( l >> 24 )) * FNV_PRIME;\n v = (v ^ ( h & 0xff)) * FNV_PRIME;\n v = (v ^ ((h >> 8) & 0xff)) * FNV_PRIME;\n v = (v ^ ((h >> 16) & 0xff)) * FNV_PRIME;\n v = (v ^ ( h >> 24 )) * FNV_PRIME;\n return v;\n}\n\nfunction hashStr(key: string): u32 {\n var v = FNV_OFFSET;\n for (let i: usize = 0, k: usize = key.length << 1; i < k; ++i) {\n v = (v ^ load(changetype(key) + i, HEADER_SIZE)) * FNV_PRIME;\n }\n return v;\n}\n',"internal/memory":"// this function will go away once `memory.copy` becomes an intrinsic\nexport function memcpy(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memcpy.c\n var w: u32, x: u32;\n\n // copy 1 byte each until src is aligned to 4 bytes\n while (n && (src & 3)) {\n store(dest++, load(src++));\n n--;\n }\n\n // if dst is aligned to 4 bytes as well, copy 4 bytes each\n if ((dest & 3) == 0) {\n while (n >= 16) {\n store(dest , load(src ));\n store(dest + 4, load(src + 4));\n store(dest + 8, load(src + 8));\n store(dest + 12, load(src + 12));\n src += 16; dest += 16; n -= 16;\n }\n if (n & 8) {\n store(dest , load(src ));\n store(dest + 4, load(src + 4));\n dest += 8; src += 8;\n }\n if (n & 4) {\n store(dest, load(src));\n dest += 4; src += 4;\n }\n if (n & 2) { // drop to 2 bytes each\n store(dest, load(src));\n dest += 2; src += 2;\n }\n if (n & 1) { // drop to 1 byte\n store(dest++, load(src++));\n }\n return;\n }\n\n // if dst is not aligned to 4 bytes, use alternating shifts to copy 4 bytes each\n // doing shifts if faster when copying enough bytes (here: 32 or more)\n if (n >= 32) {\n switch (dest & 3) {\n // known to be != 0\n case 1: {\n w = load(src);\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n n -= 3;\n while (n >= 17) {\n x = load(src + 1);\n store(dest, w >> 24 | x << 8);\n w = load(src + 5);\n store(dest + 4, x >> 24 | w << 8);\n x = load(src + 9);\n store(dest + 8, w >> 24 | x << 8);\n w = load(src + 13);\n store(dest + 12, x >> 24 | w << 8);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n case 2: {\n w = load(src);\n store(dest++, load(src++));\n store(dest++, load(src++));\n n -= 2;\n while (n >= 18) {\n x = load(src + 2);\n store(dest, w >> 16 | x << 16);\n w = load(src + 6);\n store(dest + 4, x >> 16 | w << 16);\n x = load(src + 10);\n store(dest + 8, w >> 16 | x << 16);\n w = load(src + 14);\n store(dest + 12, x >> 16 | w << 16);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n case 3: {\n w = load(src);\n store(dest++, load(src++));\n n -= 1;\n while (n >= 19) {\n x = load(src + 3);\n store(dest, w >> 8 | x << 24);\n w = load(src + 7);\n store(dest + 4, x >> 8 | w << 24);\n x = load(src + 11);\n store(dest + 8, w >> 8 | x << 24);\n w = load(src + 15);\n store(dest + 12, x >> 8 | w << 24);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n }\n }\n\n // copy remaining bytes one by one\n if (n & 16) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 8) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 4) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 2) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 1) {\n store(dest++, load(src++));\n }\n}\n\n// this function will go away once `memory.copy` becomes an intrinsic\nexport function memmove(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memmove.c\n if (dest === src) return;\n if (src + n <= dest || dest + n <= src) {\n memcpy(dest, src, n);\n return;\n }\n if (dest < src) {\n if ((src & 7) == (dest & 7)) {\n while (dest & 7) {\n if (!n) return;\n --n;\n store(dest++, load(src++));\n }\n while (n >= 8) {\n store(dest, load(src));\n n -= 8;\n dest += 8;\n src += 8;\n }\n }\n while (n) {\n store(dest++, load(src++));\n --n;\n }\n } else {\n if ((src & 7) == (dest & 7)) {\n while ((dest + n) & 7) {\n if (!n) return;\n store(dest + --n, load(src + n));\n }\n while (n >= 8) {\n n -= 8;\n store(dest + n, load(src + n));\n }\n }\n while (n) {\n store(dest + --n, load(src + n));\n }\n }\n}\n\n// this function will go away once `memory.fill` becomes an intrinsic\nexport function memset(dest: usize, c: u8, n: usize): void { // see: musl/src/string/memset\n\n // fill head and tail with minimal branching\n if (!n) return;\n store(dest, c);\n store(dest + n - 1, c);\n if (n <= 2) return;\n\n store(dest + 1, c);\n store(dest + 2, c);\n store(dest + n - 2, c);\n store(dest + n - 3, c);\n if (n <= 6) return;\n store(dest + 3, c);\n store(dest + n - 4, c);\n if (n <= 8) return;\n\n // advance pointer to align it at 4-byte boundary\n var k: usize = -dest & 3;\n dest += k;\n n -= k;\n n &= -4;\n\n var c32: u32 = -1 / 255 * c;\n\n // fill head/tail up to 28 bytes each in preparation\n store(dest, c32);\n store(dest + n - 4, c32);\n if (n <= 8) return;\n store(dest + 4, c32);\n store(dest + 8, c32);\n store(dest + n - 12, c32);\n store(dest + n - 8, c32);\n if (n <= 24) return;\n store(dest + 12, c32);\n store(dest + 16, c32);\n store(dest + 20, c32);\n store(dest + 24, c32);\n store(dest + n - 28, c32);\n store(dest + n - 24, c32);\n store(dest + n - 20, c32);\n store(dest + n - 16, c32);\n\n // align to a multiple of 8\n k = 24 + (dest & 4);\n dest += k;\n n -= k;\n\n // copy 32 bytes each\n var c64: u64 = c32 | (c32 << 32);\n while (n >= 32) {\n store(dest, c64);\n store(dest + 8, c64);\n store(dest + 16, c64);\n store(dest + 24, c64);\n n -= 32;\n dest += 32;\n }\n}\n\nexport function memcmp(vl: usize, vr: usize, n: usize): i32 { // see: musl/src/string/memcmp.c\n if (vl == vr) return 0;\n while (n != 0 && load(vl) == load(vr)) {\n n--; vl++; vr++;\n }\n return n ? load(vl) - load(vr) : 0;\n}\n","internal/number":'import {\n CharCode,\n allocateUnsafe as allocateUnsafeString,\n freeUnsafe as freeUnsafeString,\n HEADER_SIZE as STRING_HEADER_SIZE\n} from "./string";\n\nimport {\n LOAD\n} from "./arraybuffer";\n\n@inline export const MAX_DOUBLE_LENGTH = 28;\n\n@lazy @inline const POWERS10: u32[] = [\n 1,\n 10,\n 100,\n 1000,\n 10000,\n 100000,\n 1000000,\n 10000000,\n 100000000,\n 1000000000\n];\n\n/*\n Lookup table for pairwise char codes in range [0-99]\n\n "00", "01", "02", "03", "04", "05", "06", "07", "08", "09",\n "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",\n "20", "21", "22", "23", "24", "25", "26", "27", "28", "29",\n "30", "31", "32", "33", "34", "35", "36", "37", "38", "39",\n "40", "41", "42", "43", "44", "45", "46", "47", "48", "49",\n "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",\n "60", "61", "62", "63", "64", "65", "66", "67", "68", "69",\n "70", "71", "72", "73", "74", "75", "76", "77", "78", "79",\n "80", "81", "82", "83", "84", "85", "86", "87", "88", "89",\n "90", "91", "92", "93", "94", "95", "96", "97", "98", "99"\n*/\n@lazy @inline const DIGITS: u32[] = [\n 0x00300030, 0x00310030, 0x00320030, 0x00330030, 0x00340030,\n 0x00350030, 0x00360030, 0x00370030, 0x00380030, 0x00390030,\n 0x00300031, 0x00310031, 0x00320031, 0x00330031, 0x00340031,\n 0x00350031, 0x00360031, 0x00370031, 0x00380031, 0x00390031,\n 0x00300032, 0x00310032, 0x00320032, 0x00330032, 0x00340032,\n 0x00350032, 0x00360032, 0x00370032, 0x00380032, 0x00390032,\n 0x00300033, 0x00310033, 0x00320033, 0x00330033, 0x00340033,\n 0x00350033, 0x00360033, 0x00370033, 0x00380033, 0x00390033,\n 0x00300034, 0x00310034, 0x00320034, 0x00330034, 0x00340034,\n 0x00350034, 0x00360034, 0x00370034, 0x00380034, 0x00390034,\n 0x00300035, 0x00310035, 0x00320035, 0x00330035, 0x00340035,\n 0x00350035, 0x00360035, 0x00370035, 0x00380035, 0x00390035,\n 0x00300036, 0x00310036, 0x00320036, 0x00330036, 0x00340036,\n 0x00350036, 0x00360036, 0x00370036, 0x00380036, 0x00390036,\n 0x00300037, 0x00310037, 0x00320037, 0x00330037, 0x00340037,\n 0x00350037, 0x00360037, 0x00370037, 0x00380037, 0x00390037,\n 0x00300038, 0x00310038, 0x00320038, 0x00330038, 0x00340038,\n 0x00350038, 0x00360038, 0x00370038, 0x00380038, 0x00390038,\n 0x00300039, 0x00310039, 0x00320039, 0x00330039, 0x00340039,\n 0x00350039, 0x00360039, 0x00370039, 0x00380039, 0x00390039\n];\n\n@lazy @inline const EXP_POWERS: i16[] = [\n -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980,\n -954, -927, -901, -874, -847, -821, -794, -768, -741, -715,\n -688, -661, -635, -608, -582, -555, -529, -502, -475, -449,\n -422, -396, -369, -343, -316, -289, -263, -236, -210, -183,\n -157, -130, -103, -77, -50, -24, 3, 30, 56, 83,\n 109, 136, 162, 189, 216, 242, 269, 295, 322, 348,\n 375, 402, 428, 455, 481, 508, 534, 561, 588, 614,\n 641, 667, 694, 720, 747, 774, 800, 827, 853, 880,\n 907, 933, 960, 986, 1013, 1039, 1066\n];\n\n// 1e-348, 1e-340, ..., 1e340\n@lazy @inline const FRC_POWERS: u64[] = [\n 0xFA8FD5A0081C0288, 0xBAAEE17FA23EBF76, 0x8B16FB203055AC76, 0xCF42894A5DCE35EA,\n 0x9A6BB0AA55653B2D, 0xE61ACF033D1A45DF, 0xAB70FE17C79AC6CA, 0xFF77B1FCBEBCDC4F,\n 0xBE5691EF416BD60C, 0x8DD01FAD907FFC3C, 0xD3515C2831559A83, 0x9D71AC8FADA6C9B5,\n 0xEA9C227723EE8BCB, 0xAECC49914078536D, 0x823C12795DB6CE57, 0xC21094364DFB5637,\n 0x9096EA6F3848984F, 0xD77485CB25823AC7, 0xA086CFCD97BF97F4, 0xEF340A98172AACE5,\n 0xB23867FB2A35B28E, 0x84C8D4DFD2C63F3B, 0xC5DD44271AD3CDBA, 0x936B9FCEBB25C996,\n 0xDBAC6C247D62A584, 0xA3AB66580D5FDAF6, 0xF3E2F893DEC3F126, 0xB5B5ADA8AAFF80B8,\n 0x87625F056C7C4A8B, 0xC9BCFF6034C13053, 0x964E858C91BA2655, 0xDFF9772470297EBD,\n 0xA6DFBD9FB8E5B88F, 0xF8A95FCF88747D94, 0xB94470938FA89BCF, 0x8A08F0F8BF0F156B,\n 0xCDB02555653131B6, 0x993FE2C6D07B7FAC, 0xE45C10C42A2B3B06, 0xAA242499697392D3,\n 0xFD87B5F28300CA0E, 0xBCE5086492111AEB, 0x8CBCCC096F5088CC, 0xD1B71758E219652C,\n 0x9C40000000000000, 0xE8D4A51000000000, 0xAD78EBC5AC620000, 0x813F3978F8940984,\n 0xC097CE7BC90715B3, 0x8F7E32CE7BEA5C70, 0xD5D238A4ABE98068, 0x9F4F2726179A2245,\n 0xED63A231D4C4FB27, 0xB0DE65388CC8ADA8, 0x83C7088E1AAB65DB, 0xC45D1DF942711D9A,\n 0x924D692CA61BE758, 0xDA01EE641A708DEA, 0xA26DA3999AEF774A, 0xF209787BB47D6B85,\n 0xB454E4A179DD1877, 0x865B86925B9BC5C2, 0xC83553C5C8965D3D, 0x952AB45CFA97A0B3,\n 0xDE469FBD99A05FE3, 0xA59BC234DB398C25, 0xF6C69A72A3989F5C, 0xB7DCBF5354E9BECE,\n 0x88FCF317F22241E2, 0xCC20CE9BD35C78A5, 0x98165AF37B2153DF, 0xE2A0B5DC971F303A,\n 0xA8D9D1535CE3B396, 0xFB9B7CD9A4A7443C, 0xBB764C4CA7A44410, 0x8BAB8EEFB6409C1A,\n 0xD01FEF10A657842C, 0x9B10A4E5E9913129, 0xE7109BFBA19C0C9D, 0xAC2820D9623BF429,\n 0x80444B5E7AA7CF85, 0xBF21E44003ACDD2D, 0x8E679C2F5E44FF8F, 0xD433179D9C8CB841,\n 0x9E19DB92B4E31BA9, 0xEB96BF6EBADF77D9, 0xAF87023B9BF0EE6B\n];\n\n// Count number of decimals for u32 values\n// In our case input value always non-zero so we can simplify some parts\nexport function decimalCount32(value: u32): u32 {\n if (ASC_SHRINK_LEVEL >= 1) {\n let l: u32 = 32 - clz(value); // log2\n let t = l * 1233 >>> 12; // log10\n\n let lutbuf = POWERS10.buffer_;\n let power = LOAD(lutbuf, t);\n t -= (value < power);\n return t + 1;\n } else {\n if (value < 100000) {\n if (value < 100) {\n return select(1, 2, value < 10);\n } else {\n let m = select(4, 5, value < 10000);\n return select(3, m, value < 1000);\n }\n } else {\n if (value < 10000000) {\n return select(6, 7, value < 1000000);\n } else {\n let m = select(9, 10, value < 1000000000);\n return select(8, m, value < 100000000);\n }\n }\n }\n}\n\n// Count number of decimals for u64 values\n// In our case input value always greater than 2^32-1 so we can skip some parts\nexport function decimalCount64(value: u64): u32 {\n if (ASC_SHRINK_LEVEL >= 1) {\n let l: u32 = 64 - clz(value); // log2\n let t = l * 1233 >>> 12; // log10\n\n let lutbuf = POWERS10.buffer_;\n let power = LOAD(lutbuf, t - 10);\n t -= (value < 10000000000 * power);\n return t + 1;\n } else {\n if (value < 1000000000000000) {\n if (value < 1000000000000) {\n return select(11, 12, value < 100000000000);\n } else {\n let m = select(14, 15, value < 100000000000000);\n return select(13, m, value < 10000000000000);\n }\n } else {\n if (value < 100000000000000000) {\n return select(16, 17, value < 10000000000000000);\n } else {\n let m = select(19, 20, value < 10000000000000000000);\n return select(18, m, value < 1000000000000000000);\n }\n }\n }\n}\n\nfunction utoa32_lut(buffer: usize, num: u32, offset: usize): void {\n var lutbuf = DIGITS.buffer_;\n\n while (num >= 10000) {\n // in most VMs i32/u32 div and modulo by constant can be shared and simplificate\n let t = num / 10000;\n let r = num % 10000;\n num = t;\n\n let d1 = r / 100;\n let d2 = r % 100;\n\n let digits1 = LOAD(lutbuf, d1);\n let digits2 = LOAD(lutbuf, d2);\n\n offset -= 4;\n store(buffer + (offset << 1), digits1 | (digits2 << 32), STRING_HEADER_SIZE);\n }\n\n if (num >= 100) {\n let t = num / 100;\n let d1 = num % 100;\n num = t;\n offset -= 2;\n let digits = LOAD(lutbuf, d1);\n store(buffer + (offset << 1), digits, STRING_HEADER_SIZE);\n }\n\n if (num >= 10) {\n offset -= 2;\n let digits = LOAD(lutbuf, num);\n store(buffer + (offset << 1), digits, STRING_HEADER_SIZE);\n } else {\n offset -= 1;\n let digit = CharCode._0 + num;\n store(buffer + (offset << 1), digit, STRING_HEADER_SIZE);\n }\n}\n\nfunction utoa64_lut(buffer: usize, num: u64, offset: usize): void {\n var lutbuf = DIGITS.buffer_;\n\n while (num >= 100000000) {\n let t = num / 100000000;\n let r = (num - t * 100000000);\n num = t;\n\n let b = r / 10000;\n let c = r % 10000;\n\n let b1 = b / 100;\n let b2 = b % 100;\n let c1 = c / 100;\n let c2 = c % 100;\n\n let digits1 = LOAD(lutbuf, c1);\n let digits2 = LOAD(lutbuf, c2);\n\n offset -= 4;\n store(buffer + (offset << 1), digits1 | (digits2 << 32), STRING_HEADER_SIZE);\n\n digits1 = LOAD(lutbuf, b1);\n digits2 = LOAD(lutbuf, b2);\n\n offset -= 4;\n store(buffer + (offset << 1), digits1 | (digits2 << 32), STRING_HEADER_SIZE);\n }\n\n utoa32_lut(buffer, num, offset);\n}\n\nfunction utoa_simple(buffer: usize, num: T, offset: usize): void {\n do {\n let t = num / 10;\n let r = (num % 10);\n num = t;\n offset -= 1;\n store(buffer + (offset << 1), CharCode._0 + r, STRING_HEADER_SIZE);\n } while (num);\n}\n\n@inline\nexport function utoa32_core(buffer: usize, num: u32, offset: u32): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n utoa_simple(buffer, num, offset);\n } else {\n utoa32_lut(buffer, num, offset);\n }\n}\n\n@inline\nexport function utoa64_core(buffer: usize, num: u64, offset: u32): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n utoa_simple(buffer, num, offset);\n } else {\n utoa64_lut(buffer, num, offset);\n }\n}\n\nexport function utoa32(value: u32): String {\n if (!value) return "0";\n\n var decimals = decimalCount32(value);\n var buffer = allocateUnsafeString(decimals);\n\n utoa32_core(changetype(buffer), value, decimals);\n return buffer;\n}\n\nexport function itoa32(value: i32): String {\n if (!value) return "0";\n\n var sign = value < 0;\n if (sign) value = -value;\n\n var decimals = decimalCount32(value) + sign;\n var buffer = allocateUnsafeString(decimals);\n\n utoa32_core(changetype(buffer), value, decimals);\n if (sign) store(changetype(buffer), CharCode.MINUS, STRING_HEADER_SIZE);\n\n return buffer;\n}\n\nexport function utoa64(value: u64): String {\n if (!value) return "0";\n\n var buffer: String;\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n let decimals = decimalCount32(val32);\n buffer = allocateUnsafeString(decimals);\n utoa32_core(changetype(buffer), val32, decimals);\n } else {\n let decimals = decimalCount64(value);\n buffer = allocateUnsafeString(decimals);\n utoa64_core(changetype(buffer), value, decimals);\n }\n return buffer;\n}\n\nexport function itoa64(value: i64): String {\n if (!value) return "0";\n\n var sign = value < 0;\n if (sign) value = -value;\n\n var buffer: String;\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n let decimals = decimalCount32(val32) + sign;\n buffer = allocateUnsafeString(decimals);\n utoa32_core(changetype(buffer), val32, decimals);\n } else {\n let decimals = decimalCount64(value) + sign;\n buffer = allocateUnsafeString(decimals);\n utoa64_core(changetype(buffer), value, decimals);\n }\n if (sign) store(changetype(buffer), CharCode.MINUS, STRING_HEADER_SIZE);\n\n return buffer;\n}\n\nexport function itoa(value: T): String {\n if (!isInteger()) {\n assert(false); // unexpecteble non-integer generic type\n } else {\n if (isSigned()) {\n if (sizeof() <= 4) {\n return itoa32(value);\n } else {\n return itoa64(value);\n }\n } else {\n if (sizeof() <= 4) {\n return utoa32(value);\n } else {\n return utoa64(value);\n }\n }\n }\n}\n\n@lazy var _K: i32 = 0;\n// @lazy var _frc: u64 = 0;\n@lazy var _exp: i32 = 0;\n@lazy var _frc_minus: u64 = 0;\n@lazy var _frc_plus: u64 = 0;\n@lazy var _frc_pow: u64 = 0;\n@lazy var _exp_pow: i32 = 0;\n\n@inline\nfunction umul64f(u: u64, v: u64): u64 {\n var u0 = u & 0xFFFFFFFF;\n var v0 = v & 0xFFFFFFFF;\n\n var u1 = u >> 32;\n var v1 = v >> 32;\n\n var l = u0 * v0;\n var t = u1 * v0 + (l >> 32);\n var w = u0 * v1 + (t & 0xFFFFFFFF);\n\n w += 0x7FFFFFFF; // rounding\n\n t >>= 32;\n w >>= 32;\n\n return u1 * v1 + t + w;\n}\n\n@inline\nfunction umul64e(e1: i32, e2: i32): i32 {\n return e1 + e2 + 64; // where 64 is significand size\n}\n\n@inline\nfunction normalizedBoundaries(f: u64, e: i32): void {\n var frc = (f << 1) + 1;\n var exp = e - 1;\n var off = clz(frc);\n frc <<= off;\n exp -= off;\n\n var m = 1 + (f == 0x0010000000000000);\n\n _frc_plus = frc;\n _frc_minus = ((f << m) - 1) << e - m - exp;\n _exp = exp;\n}\n\n@inline\nfunction grisuRound(buffer: usize, len: i32, delta: u64, rest: u64, ten_kappa: u64, wp_w: u64): void {\n var lastp = buffer + ((len - 1) << 1);\n var digit = load(lastp, STRING_HEADER_SIZE);\n while (\n rest < wp_w &&\n delta - rest >= ten_kappa && (\n rest + ten_kappa < wp_w ||\n wp_w - rest > rest + ten_kappa - wp_w\n )\n ) {\n --digit;\n rest += ten_kappa;\n }\n store(lastp, digit, STRING_HEADER_SIZE);\n}\n\n@inline\nfunction getCachedPower(minExp: i32): void {\n const c = reinterpret(0x3FD34413509F79FE); // 1 / lg(10) = 0.30102999566398114\n var dk = (-61 - minExp) * c + 347;\t // dk must be positive, so can do ceiling in positive\n var k = dk;\n k += (k != dk); // conversion with ceil\n\n var index = (k >> 3) + 1;\n _K = 348 - (index << 3);\t// decimal exponent no need lookup table\n var frcPowers = FRC_POWERS.buffer_;\n var expPowers = EXP_POWERS.buffer_;\n _frc_pow = LOAD(frcPowers, index);\n _exp_pow = LOAD(expPowers, index);\n}\n\n@inline\nfunction grisu2(value: f64, buffer: usize, sign: i32): i32 {\n\n // frexp routine\n var uv = reinterpret(value);\n var exp = ((uv & 0x7FF0000000000000) >>> 52);\n var sid = uv & 0x000FFFFFFFFFFFFF;\n var frc = ((exp != 0) << 52) + sid;\n exp = select(exp, 1, exp != 0) - (0x3FF + 52);\n\n normalizedBoundaries(frc, exp);\n getCachedPower(_exp);\n\n // normalize\n var off = clz(frc);\n frc <<= off;\n exp -= off;\n\n var frc_pow = _frc_pow;\n var exp_pow = _exp_pow;\n\n var w_frc = umul64f(frc, frc_pow);\n var w_exp = umul64e(exp, exp_pow);\n\n var wp_frc = umul64f(_frc_plus, frc_pow) - 1;\n var wp_exp = umul64e(_exp, exp_pow);\n\n var wm_frc = umul64f(_frc_minus, frc_pow) + 1;\n var delta = wp_frc - wm_frc;\n\n return genDigits(buffer, w_frc, w_exp, wp_frc, wp_exp, delta, sign);\n}\n\nfunction genDigits(buffer: usize, w_frc: u64, w_exp: i32, mp_frc: u64, mp_exp: i32, delta: u64, sign: i32): i32 {\n var one_exp = -mp_exp;\n var one_frc = (1) << one_exp;\n var mask = one_frc - 1;\n\n var wp_w_frc = mp_frc - w_frc;\n var wp_w_exp = mp_exp;\n\n var p1 = (mp_frc >> one_exp);\n var p2 = mp_frc & mask;\n\n var kappa = decimalCount32(p1);\n var len = sign;\n\n var powers10 = POWERS10.buffer_;\n\n while (kappa > 0) {\n let d: u32;\n switch (kappa) {\n case 10: { d = p1 / 1000000000; p1 %= 1000000000; break; }\n case 9: { d = p1 / 100000000; p1 %= 100000000; break; }\n case 8: { d = p1 / 10000000; p1 %= 10000000; break; }\n case 7: { d = p1 / 1000000; p1 %= 1000000; break; }\n case 6: { d = p1 / 100000; p1 %= 100000; break; }\n case 5: { d = p1 / 10000; p1 %= 10000; break; }\n case 4: { d = p1 / 1000; p1 %= 1000; break; }\n case 3: { d = p1 / 100; p1 %= 100; break; }\n case 2: { d = p1 / 10; p1 %= 10; break; }\n case 1: { d = p1; p1 = 0; break; }\n default: { d = 0; break; }\n }\n\n if (d | len) store(buffer + (len++ << 1), CharCode._0 + d, STRING_HEADER_SIZE);\n\n --kappa;\n let tmp = ((p1) << one_exp) + p2;\n if (tmp <= delta) {\n _K += kappa;\n grisuRound(buffer, len, delta, tmp, LOAD(powers10, kappa) << one_exp, wp_w_frc);\n return len;\n }\n }\n\n while (1) {\n p2 *= 10;\n delta *= 10;\n\n let d = p2 >> one_exp;\n if (d | len) store(buffer + (len++ << 1), CharCode._0 + d, STRING_HEADER_SIZE);\n\n p2 &= mask;\n --kappa;\n if (p2 < delta) {\n _K += kappa;\n wp_w_frc *= LOAD(powers10, -kappa);\n grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc);\n return len;\n }\n }\n\n return len;\n}\n\n@inline\nfunction genExponent(buffer: usize, k: i32): i32 {\n var sign = k < 0;\n if (sign) k = -k;\n var decimals = decimalCount32(k) + 1;\n utoa32_core(buffer, k, decimals);\n store(buffer, select(CharCode.MINUS, CharCode.PLUS, sign), STRING_HEADER_SIZE);\n return decimals;\n}\n\nfunction prettify(buffer: usize, length: i32, k: i32): i32 {\n if (!k) {\n store(buffer + (length << 1), CharCode.DOT | (CharCode._0 << 16), STRING_HEADER_SIZE);\n return length + 2;\n }\n\n var kk = length + k;\n if (length <= kk && kk <= 21) {\n // 1234e7 -> 12340000000\n for (let i = length; i < kk; ++i) {\n store(buffer + (i << 1), CharCode._0, STRING_HEADER_SIZE);\n }\n store(buffer + (kk << 1), CharCode.DOT | (CharCode._0 << 16), STRING_HEADER_SIZE);\n return kk + 2;\n } else if (kk > 0 && kk <= 21) {\n // 1234e-2 -> 12.34\n let ptr = buffer + (kk << 1);\n memory.copy(\n ptr + STRING_HEADER_SIZE + 2,\n ptr + STRING_HEADER_SIZE,\n -k << 1\n );\n store(buffer + (kk << 1), CharCode.DOT, STRING_HEADER_SIZE);\n return length + 1;\n } else if (-6 < kk && kk <= 0) {\n // 1234e-6 -> 0.001234\n let offset = 2 - kk;\n memory.copy(\n buffer + STRING_HEADER_SIZE + (offset << 1),\n buffer + STRING_HEADER_SIZE,\n length << 1\n );\n store(buffer, CharCode._0 | (CharCode.DOT << 16), STRING_HEADER_SIZE);\n for (let i = 2; i < offset; ++i) {\n store(buffer + (i << 1), CharCode._0, STRING_HEADER_SIZE);\n }\n return length + offset;\n } else if (length == 1) {\n // 1e30\n store(buffer, CharCode.e, STRING_HEADER_SIZE + 2);\n length = genExponent(buffer + 4, kk - 1);\n return length + 2;\n } else {\n let len = length << 1;\n memory.copy(\n buffer + STRING_HEADER_SIZE + 4,\n buffer + STRING_HEADER_SIZE + 2,\n len - 2\n );\n store(buffer, CharCode.DOT, STRING_HEADER_SIZE + 2);\n store(buffer + len, CharCode.e, STRING_HEADER_SIZE + 2);\n length += genExponent(buffer + len + 4, kk - 1);\n return length + 2;\n }\n}\n\nexport function dtoa_core(buffer: usize, value: f64): i32 {\n var sign = (value < 0);\n if (sign) {\n value = -value;\n store(buffer, CharCode.MINUS, STRING_HEADER_SIZE);\n }\n // assert(value > 0 && value <= 1.7976931348623157e308);\n var len = grisu2(value, buffer, sign);\n len = prettify(buffer + (sign << 1), len - sign, _K);\n return len + sign;\n}\n\nexport function dtoa(value: f64): String {\n if (value == 0) return "0.0";\n if (!isFinite(value)) {\n if (isNaN(value)) return "NaN";\n return select("-Infinity", "Infinity", value < 0);\n }\n var buffer = allocateUnsafeString(MAX_DOUBLE_LENGTH);\n var length = dtoa_core(changetype(buffer), value);\n var result = buffer.substring(0, length);\n freeUnsafeString(buffer);\n return result;\n}\n\nexport function itoa_stream(buffer: usize, offset: usize, value: T): u32 {\n buffer += (offset << 1);\n if (!value) {\n store(buffer, CharCode._0, STRING_HEADER_SIZE);\n return 1;\n }\n var decimals: u32 = 0;\n if (isSigned()) {\n let sign = value < 0;\n if (sign) value = -value;\n if (sizeof() <= 4) {\n decimals = decimalCount32(value) + sign;\n utoa32_core(buffer, value, decimals);\n } else {\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n decimals = decimalCount32(val32) + sign;\n utoa32_core(buffer, val32, decimals);\n } else {\n decimals = decimalCount64(value) + sign;\n utoa64_core(buffer, value, decimals);\n }\n }\n if (sign) store(buffer, CharCode.MINUS, STRING_HEADER_SIZE);\n } else {\n if (sizeof() <= 4) {\n decimals = decimalCount32(value);\n utoa32_core(buffer, value, decimals);\n } else {\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n decimals = decimalCount32(val32);\n utoa32_core(buffer, val32, decimals);\n } else {\n decimals = decimalCount64(value);\n utoa64_core(buffer, value, decimals);\n }\n }\n }\n return decimals;\n}\n\nexport function dtoa_stream(buffer: usize, offset: usize, value: f64): u32 {\n buffer += (offset << 1);\n if (value == 0.0) {\n store(buffer, CharCode._0, STRING_HEADER_SIZE + 0);\n store(buffer, CharCode.DOT, STRING_HEADER_SIZE + 2);\n store(buffer, CharCode._0, STRING_HEADER_SIZE + 4);\n return 3;\n }\n if (!isFinite(value)) {\n if (isNaN(value)) {\n store(buffer, CharCode.N, STRING_HEADER_SIZE + 0);\n store(buffer, CharCode.a, STRING_HEADER_SIZE + 2);\n store(buffer, CharCode.N, STRING_HEADER_SIZE + 4);\n return 3;\n } else {\n let sign = (value < 0);\n let len = 8 + sign;\n let source = changetype(select("-Infinity", "Infinity", sign));\n memory.copy(buffer + STRING_HEADER_SIZE, source + STRING_HEADER_SIZE, len << 1);\n return len;\n }\n }\n return dtoa_core(buffer, value);\n}\n',"internal/sort":"import {\n LOAD,\n STORE\n} from \"./arraybuffer\";\n\nimport {\n compareUnsafe\n} from \"./string\";\n\n/** Obtains the default comparator for the specified value type. */\n@inline\nexport function COMPARATOR(): (a: T, b: T) => i32 {\n if (isInteger()) {\n if (isSigned() && sizeof() <= 4) {\n return (a: T, b: T): i32 => ((a - b));\n } else {\n return (a: T, b: T): i32 => ((a > b) - (a < b));\n }\n } else if (isFloat()) {\n if (sizeof() == 4) {\n return (a: T, b: T): i32 => {\n var ia = reinterpret(a);\n var ib = reinterpret(b);\n ia ^= (ia >> 31) >>> 1;\n ib ^= (ib >> 31) >>> 1;\n return (ia > ib) - (ia < ib);\n };\n } else {\n return (a: T, b: T): i32 => {\n var ia = reinterpret(a);\n var ib = reinterpret(b);\n ia ^= (ia >> 63) >>> 1;\n ib ^= (ib >> 63) >>> 1;\n return (ia > ib) - (ia < ib);\n };\n }\n } else if (isString()) {\n return (a: T, b: T): i32 => {\n if (a === b || a === null || b === null) return 0;\n var alen = (a).length;\n var blen = (b).length;\n if (!alen && !blen) return 0;\n if (!alen) return -1;\n if (!blen) return 1;\n return compareUnsafe(a, 0, b, 0, min(alen, blen));\n };\n } else {\n return (a: T, b: T): i32 => ((a > b) - (a < b));\n }\n}\n\n@inline\nexport function SORT(\n buffer: ArrayBuffer,\n byteOffset: i32,\n length: i32,\n comparator: (a: T, b: T) => i32\n): void {\n if (isReference()) {\n // TODO replace this to faster stable sort (TimSort) when it implemented\n insertionSort(buffer, byteOffset, length, comparator);\n } else {\n if (length < 256) {\n insertionSort(buffer, byteOffset, length, comparator);\n } else {\n weakHeapSort(buffer, byteOffset, length, comparator);\n }\n }\n}\n\n/** Sorts an Array with the 'Insertion Sort' algorithm. */\nfunction insertionSort(\n buffer: ArrayBuffer,\n byteOffset: i32,\n length: i32,\n comparator: (a: T, b: T) => i32\n): void {\n for (let i = 0; i < length; i++) {\n let a = LOAD(buffer, i, byteOffset); // a = arr[i]\n let j = i - 1;\n while (j >= 0) {\n let b = LOAD(buffer, j, byteOffset); // b = arr[j]\n if (comparator(a, b) < 0) {\n STORE(buffer, j-- + 1, b, byteOffset); // arr[j + 1] = b\n } else break;\n }\n STORE(buffer, j + 1, a, byteOffset); // arr[j + 1] = a\n }\n}\n\n/** Sorts an Array with the 'Weak Heap Sort' algorithm. */\nfunction weakHeapSort(\n buffer: ArrayBuffer,\n byteOffset: i32,\n length: i32,\n comparator: (a: T, b: T) => i32\n): void {\n const shift32 = alignof();\n\n var bitsetSize = (length + 31) >> 5 << shift32;\n var bitset = memory.allocate(bitsetSize); // indexed in 32-bit chunks below\n memory.fill(bitset, 0, bitsetSize);\n\n // see: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.21.1863&rep=rep1&type=pdf\n\n for (let i = length - 1; i > 0; i--) {\n let j = i;\n while ((j & 1) == (load(bitset + (j >> 6 << shift32)) >> (j >> 1 & 31) & 1)) j >>= 1;\n\n let p = j >> 1;\n let a = LOAD(buffer, p, byteOffset); // a = arr[p]\n let b = LOAD(buffer, i, byteOffset); // b = arr[i]\n if (comparator(a, b) < 0) {\n store(\n bitset + (i >> 5 << shift32),\n load(bitset + (i >> 5 << shift32)) ^ (1 << (i & 31))\n );\n STORE(buffer, i, a, byteOffset); // arr[i] = a\n STORE(buffer, p, b, byteOffset); // arr[p] = b\n }\n }\n\n for (let i = length - 1; i >= 2; i--) {\n let a = LOAD(buffer, 0, byteOffset);\n STORE(buffer, 0, LOAD(buffer, i, byteOffset), byteOffset);\n STORE(buffer, i, a, byteOffset);\n\n let x = 1, y: i32;\n while ((y = (x << 1) + ((load(bitset + (x >> 5 << shift32)) >> (x & 31)) & 1)) < i) x = y;\n\n while (x > 0) {\n a = LOAD(buffer, 0, byteOffset); // a = arr[0]\n let b = LOAD(buffer, x, byteOffset); // b = arr[x]\n\n if (comparator(a, b) < 0) {\n store(\n bitset + (x >> 5 << shift32),\n load(bitset + (x >> 5 << shift32)) ^ (1 << (x & 31))\n );\n STORE(buffer, x, a, byteOffset); // arr[x] = a\n STORE(buffer, 0, b, byteOffset); // arr[0] = b\n }\n x >>= 1;\n }\n }\n\n memory.free(bitset);\n\n var t = LOAD(buffer, 1, byteOffset); // t = arr[1]\n STORE(buffer, 1, LOAD(buffer, 0, byteOffset), byteOffset);\n STORE(buffer, 0, t, byteOffset); // arr[0] = t\n}\n","internal/string":'import { MAX_SIZE_32 } from "./allocator";\nimport { String } from "../string";\n\n/** Size of a String header. */\n@inline export const HEADER_SIZE = (offsetof() + 1) & ~1; // 2 byte aligned\n/** Maximum length of a String. */\n@inline export const MAX_LENGTH = (MAX_SIZE_32 - HEADER_SIZE) >>> 1;\n\n// Low-level utility\n\nfunction __gc(ref: usize): void {}\n\nexport function allocateUnsafe(length: i32): String {\n assert(length > 0 && length <= MAX_LENGTH);\n var buffer: usize;\n if (isManaged()) {\n buffer = __gc_allocate(HEADER_SIZE + (length << 1), __gc); // tslint:disable-line\n } else {\n buffer = memory.allocate(HEADER_SIZE + (length << 1));\n }\n store(buffer, length);\n return changetype(buffer);\n}\n\n@inline\nexport function freeUnsafe(buffer: String): void {\n if (!isManaged()) {\n assert(buffer);\n memory.free(changetype(buffer));\n }\n}\n\nexport function copyUnsafe(dest: String, destOffset: usize, src: String, srcOffset: usize, len: usize): void {\n memory.copy(\n changetype(dest) + (destOffset << 1) + HEADER_SIZE,\n changetype(src) + (srcOffset << 1) + HEADER_SIZE,\n len << 1\n );\n}\n\nexport function compareUnsafe(str1: String, offset1: usize, str2: String, offset2: usize, len: usize): i32 {\n var cmp: i32 = 0;\n var ptr1 = changetype(str1) + (offset1 << 1);\n var ptr2 = changetype(str2) + (offset2 << 1);\n while (len && !(cmp = load(ptr1, HEADER_SIZE) - load(ptr2, HEADER_SIZE))) {\n --len, ptr1 += 2, ptr2 += 2;\n }\n return cmp;\n}\n\nexport function repeatUnsafe(dest: String, destOffset: usize, src: String, count: i32): void {\n var length = src.length;\n if (ASC_SHRINK_LEVEL > 1) {\n let strLen = length << 1;\n let to = changetype(dest) + HEADER_SIZE + (destOffset << 1);\n let from = changetype(src) + HEADER_SIZE;\n for (let i = 0, len = strLen * count; i < len; i += strLen) {\n memory.copy(to + i, from, strLen);\n }\n } else {\n switch (length) {\n case 0: break;\n case 1: {\n let cc = load(changetype(src), HEADER_SIZE);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 1), cc, HEADER_SIZE);\n }\n break;\n }\n case 2: {\n let cc = load(changetype(src), HEADER_SIZE);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 2), cc, HEADER_SIZE);\n }\n break;\n }\n case 3: {\n let cc1 = load(changetype(src), HEADER_SIZE + 0);\n let cc2 = load(changetype(src), HEADER_SIZE + 4);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 2), cc1, HEADER_SIZE + 0);\n store(out + (i << 1), cc2, HEADER_SIZE + 4);\n }\n break;\n }\n case 4: {\n let cc = load(changetype(src), HEADER_SIZE);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 3), cc, HEADER_SIZE);\n }\n break;\n }\n default: {\n let strLen = length << 1;\n let to = changetype(dest) + HEADER_SIZE + (destOffset << 1);\n let from = changetype(src) + HEADER_SIZE;\n for (let i = 0, len = strLen * count; i < len; i += strLen) {\n memory.copy(to + i, from, strLen);\n }\n break;\n }\n }\n }\n}\n\n// Helpers\n\n@inline export const enum CharCode {\n PLUS = 0x2B,\n MINUS = 0x2D,\n DOT = 0x2E,\n _0 = 0x30,\n _1 = 0x31,\n _2 = 0x32,\n _3 = 0x33,\n _4 = 0x34,\n _5 = 0x35,\n _6 = 0x36,\n _7 = 0x37,\n _8 = 0x38,\n _9 = 0x39,\n A = 0x41,\n B = 0x42,\n E = 0x45,\n N = 0x4E,\n O = 0x4F,\n X = 0x58,\n Z = 0x5a,\n a = 0x61,\n b = 0x62,\n e = 0x65,\n n = 0x6E,\n o = 0x6F,\n x = 0x78,\n z = 0x7A\n}\n\nexport function isWhiteSpaceOrLineTerminator(c: u16): bool {\n switch (c) {\n case 9: // \n case 10: // \n case 13: // \n case 11: // \n case 12: // \n case 32: // \n case 160: // \n case 8232: // \n case 8233: // \n case 65279: return true; // \n default: return false;\n }\n}\n\n/** Parses a string to an integer (usually), using the specified radix. */\nexport function parse(str: String, radix: i32 = 0): T {\n var len: i32 = str.length;\n if (!len) return NaN;\n\n var ptr = changetype(str) /* + HEAD -> offset */;\n var code = load(ptr, HEADER_SIZE);\n\n // determine sign\n var sign: T;\n if (code == CharCode.MINUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = 1;\n } else {\n sign = 1;\n }\n\n // determine radix\n if (!radix) {\n if (code == CharCode._0 && len > 2) {\n switch (load(ptr + 2, HEADER_SIZE)) {\n case CharCode.B:\n case CharCode.b: {\n ptr += 4; len -= 2;\n radix = 2;\n break;\n }\n case CharCode.O:\n case CharCode.o: {\n ptr += 4; len -= 2;\n radix = 8;\n break;\n }\n case CharCode.X:\n case CharCode.x: {\n ptr += 4; len -= 2;\n radix = 16;\n break;\n }\n default: radix = 10;\n }\n } else radix = 10;\n } else if (radix < 2 || radix > 36) {\n return NaN;\n }\n\n // calculate value\n var num: T = 0;\n while (len--) {\n code = load(ptr, HEADER_SIZE);\n if (code >= CharCode._0 && code <= CharCode._9) {\n code -= CharCode._0;\n } else if (code >= CharCode.A && code <= CharCode.Z) {\n code -= CharCode.A - 10;\n } else if (code >= CharCode.a && code <= CharCode.z) {\n code -= CharCode.a - 10;\n } else break;\n if (code >= radix) break;\n num = (num * radix) + code;\n ptr += 2;\n }\n return sign * num;\n}\n',"internal/typedarray":'import {\n HEADER_SIZE as AB_HEADER_SIZE,\n MAX_BLENGTH as AB_MAX_BLENGTH,\n allocateUnsafe,\n LOAD,\n STORE\n} from "./arraybuffer";\n\nimport {\n SORT as SORT_IMPL\n} from "./sort";\n\n/** Typed array base class. Not a global object. */\nexport abstract class TypedArray {\n [key: number]: T; // compatibility only\n\n readonly buffer: ArrayBuffer;\n readonly byteOffset: i32;\n readonly byteLength: i32;\n\n constructor(length: i32) {\n const MAX_LENGTH = AB_MAX_BLENGTH / sizeof();\n if (length > MAX_LENGTH) throw new RangeError("Invalid typed array length");\n var byteLength = length << alignof();\n var buffer = allocateUnsafe(byteLength);\n memory.fill(changetype(buffer) + AB_HEADER_SIZE, 0, byteLength);\n this.buffer = buffer;\n this.byteOffset = 0;\n this.byteLength = byteLength;\n }\n\n @inline\n get length(): i32 {\n return this.byteLength >>> alignof();\n }\n\n @operator("[]")\n protected __get(index: i32): T {\n if (index >= (this.byteLength >>> alignof())) throw new Error("Index out of bounds");\n return LOAD(this.buffer, index, this.byteOffset);\n }\n\n @inline @operator("{}")\n protected __unchecked_get(index: i32): T {\n return LOAD(this.buffer, index, this.byteOffset);\n }\n\n @operator("[]=")\n protected __set(index: i32, value: native): void {\n if (index >= (this.byteLength >>> alignof())) throw new Error("Index out of bounds");\n STORE>(this.buffer, index, value, this.byteOffset);\n }\n\n @inline @operator("{}=")\n protected __unchecked_set(index: i32, value: native): void {\n STORE>(this.buffer, index, value, this.byteOffset);\n }\n\n // copyWithin(target: i32, start: i32, end: i32 = this.length): this\n}\n\n@inline\nexport function FILL, T extends number>(\n array: TArray,\n value: native,\n start: i32,\n end: i32\n): TArray {\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n var len = array.length;\n start = start < 0 ? max(len + start, 0) : min(start, len);\n end = end < 0 ? max(len + end, 0) : min(end, len);\n if (sizeof() == 1) {\n if (start < end) {\n memory.fill(\n changetype(buffer) + start + byteOffset + AB_HEADER_SIZE,\n value,\n (end - start)\n );\n }\n } else {\n for (; start < end; ++start) {\n STORE>(buffer, start, value, byteOffset);\n }\n }\n return array;\n}\n\n@inline\nexport function SORT, T>(\n array: TArray,\n comparator: (a: T, b: T) => i32\n): TArray {\n var byteOffset = array.byteOffset;\n var length = array.length;\n if (length <= 1) return array;\n var buffer = array.buffer;\n if (length == 2) {\n let a = LOAD(buffer, 1, byteOffset);\n let b = LOAD(buffer, 0, byteOffset);\n if (comparator(a, b) < 0) {\n STORE(buffer, 1, b, byteOffset);\n STORE(buffer, 0, a, byteOffset);\n }\n return array;\n }\n SORT_IMPL(buffer, byteOffset, length, comparator);\n return array;\n}\n\n@inline\nexport function SUBARRAY, T>(\n array: TArray,\n begin: i32,\n end: i32\n): TArray {\n var length = array.length;\n if (begin < 0) begin = max(length + begin, 0);\n else begin = min(begin, length);\n if (end < 0) end = max(length + end, begin);\n else end = max(min(end, length), begin);\n var slice = memory.allocate(offsetof());\n store(slice, array.buffer, offsetof("buffer"));\n store(slice, array.byteOffset + (begin << alignof()), offsetof("byteOffset"));\n store(slice, (end - begin) << alignof(), offsetof("byteLength"));\n return changetype(slice);\n}\n\n@inline\nexport function REDUCE, T, TRet>(\n array: TArray,\n callbackfn: (accumulator: TRet, value: T, index: i32, array: TArray) => TRet,\n initialValue: TRet\n): TRet {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n initialValue = callbackfn(\n initialValue,\n LOAD(buffer, i, byteOffset),\n i,\n array,\n );\n }\n return initialValue;\n}\n\n@inline\nexport function REDUCE_RIGHT, T, TRet>(\n array: TArray,\n callbackfn: (accumulator: TRet, value: T, index: i32, array: TArray) => TRet,\n initialValue: TRet\n): TRet {\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = array.length - 1; i >= 0; i--) {\n initialValue = callbackfn(\n initialValue,\n LOAD(buffer, i, byteOffset),\n i,\n array,\n );\n }\n return initialValue;\n}\n\n@inline\nexport function MAP, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, self: TArray) => T,\n): TArray {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n var result = instantiate(length);\n var resultBuffer = result.buffer;\n for (let i = 0; i < length; i++) {\n STORE>(resultBuffer, i, >callbackfn(LOAD(buffer, i, byteOffset), i, array));\n }\n\n return result;\n}\n\n@inline\nexport function FIND_INDEX, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, array: TArray) => bool,\n): i32 {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n if (callbackfn(LOAD(buffer, i, byteOffset), i, array)) {\n return i;\n }\n }\n return -1;\n}\n\n@inline\nexport function SOME, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, array: TArray) => bool,\n): bool {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n if (callbackfn(LOAD(buffer, i, byteOffset), i, array)) {\n return true;\n }\n }\n return false;\n}\n\n@inline\nexport function EVERY, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, array: TArray) => bool,\n): bool {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n if (callbackfn(LOAD(buffer, i, byteOffset), i, array)) {\n continue;\n }\n return false;\n }\n return true;\n}\n',iterator:"export abstract class Iterable {\n // ?\n}\n\n@sealed\nexport abstract class Iterator {\n\n // private constructor(iterable: Iterable) {\n // }\n\n // TODO: these need to evaluate the classId at the respective reference in order to obtain the\n // next value, i.e. arrays work differently than maps. we'd then have:\n //\n // ╒═══════════════════ Iterator layout (32-bit) ══════════════════╕\n // 3 2 1\n // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n // ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┤\n // │ index │\n // ├─────────────────────────────────────────────────────────┬───┬─┤\n // │ reference │ 0 │D│\n // └─────────────────────────────────────────────────────────┴───┴─┘\n // D: Done flag\n\n // get value(this: u64): T {\n // ?\n // }\n\n // next(this: u64): Iterator {\n // ?\n // }\n\n done(this: u64): bool {\n return (this & 1);\n }\n}\n",map:'import {\n HEADER_SIZE as HEADER_SIZE_AB\n} from "./internal/arraybuffer";\n\nimport {\n HASH\n} from "./internal/hash";\n\n// A deterministic hash map based on CloseTable from https://github.com/jorendorff/dht\n\n@inline const INITIAL_CAPACITY = 4;\n@inline const FILL_FACTOR: f64 = 8 / 3;\n@inline const FREE_FACTOR: f64 = 3 / 4;\n\n/** Structure of a map entry. */\n@unmanaged class MapEntry {\n key: K;\n value: V;\n taggedNext: usize; // LSB=1 indicates EMPTY\n}\n\n/** Empty bit. */\n@inline const EMPTY: usize = 1 << 0;\n\n/** Size of a bucket. */\n@inline const BUCKET_SIZE = sizeof();\n\n/** Computes the alignment of an entry. */\n@inline function ENTRY_ALIGN(): usize {\n // can align to 4 instead of 8 if 32-bit and K/V is <= 32-bits\n const maxkv = sizeof() > sizeof() ? sizeof() : sizeof();\n const align = (maxkv > sizeof() ? maxkv : sizeof()) - 1;\n return align;\n}\n\n/** Computes the aligned size of an entry. */\n@inline function ENTRY_SIZE(): usize {\n const align = ENTRY_ALIGN();\n const size = (offsetof>() + align) & ~align;\n return size;\n}\n\nexport class Map {\n\n // buckets holding references to the respective first entry within\n private buckets: ArrayBuffer; // usize[bucketsMask + 1]\n private bucketsMask: u32;\n\n // entries in insertion order\n private entries: ArrayBuffer; // MapEntry[entriesCapacity]\n private entriesCapacity: i32;\n private entriesOffset: i32;\n private entriesCount: i32;\n\n get size(): i32 { return this.entriesCount; }\n\n constructor() { this.clear(); }\n\n clear(): void {\n const bucketsSize = INITIAL_CAPACITY * BUCKET_SIZE;\n this.buckets = new ArrayBuffer(bucketsSize);\n this.bucketsMask = INITIAL_CAPACITY - 1;\n const entriesSize = INITIAL_CAPACITY * ENTRY_SIZE();\n this.entries = new ArrayBuffer(entriesSize, true);\n this.entriesCapacity = INITIAL_CAPACITY;\n this.entriesOffset = 0;\n this.entriesCount = 0;\n }\n\n private find(key: K, hashCode: u32): MapEntry | null {\n var entry = load>(\n changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE,\n HEADER_SIZE_AB\n );\n while (entry) {\n if (!(entry.taggedNext & EMPTY) && entry.key == key) return entry;\n entry = changetype>(entry.taggedNext & ~EMPTY);\n }\n return null;\n }\n\n has(key: K): bool {\n return this.find(key, HASH(key)) !== null;\n }\n\n get(key: K): V {\n var entry = this.find(key, HASH(key));\n return entry ? entry.value : unreachable();\n }\n\n set(key: K, value: V): void {\n var hashCode = HASH(key);\n var entry = this.find(key, hashCode);\n if (entry) {\n entry.value = value;\n } else {\n // check if rehashing is necessary\n if (this.entriesOffset == this.entriesCapacity) {\n this.rehash(\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ? this.bucketsMask // just rehash if 1/4+ entries are empty\n : (this.bucketsMask << 1) | 1 // grow capacity to next 2^N\n );\n }\n // append new entry\n let entries = this.entries;\n entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + this.entriesOffset++ * ENTRY_SIZE()\n );\n entry.key = key;\n entry.value = value;\n ++this.entriesCount;\n // link with previous entry in bucket\n let bucketPtrBase = changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE;\n entry.taggedNext = load(bucketPtrBase, HEADER_SIZE_AB);\n store(bucketPtrBase, changetype(entry), HEADER_SIZE_AB);\n if (isManaged()) __gc_link(changetype(this), changetype(key)); // tslint:disable-line\n if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line\n }\n }\n\n delete(key: K): bool {\n var entry = this.find(key, HASH(key));\n if (!entry) return false;\n entry.taggedNext |= EMPTY;\n --this.entriesCount;\n // check if rehashing is appropriate\n var halfBucketsMask = this.bucketsMask >> 1;\n if (\n halfBucketsMask + 1 >= max(INITIAL_CAPACITY, this.entriesCount) &&\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ) this.rehash(halfBucketsMask);\n return true;\n }\n\n private rehash(newBucketsMask: u32): void {\n var newBucketsCapacity = (newBucketsMask + 1);\n var newBuckets = new ArrayBuffer(newBucketsCapacity * BUCKET_SIZE);\n var newEntriesCapacity = (newBucketsCapacity * FILL_FACTOR);\n var newEntries = new ArrayBuffer(newEntriesCapacity * ENTRY_SIZE(), true);\n\n // copy old entries to new entries\n var oldPtr = changetype(this.entries) + HEADER_SIZE_AB;\n var oldEnd = oldPtr + this.entriesOffset * ENTRY_SIZE();\n var newPtr = changetype(newEntries) + HEADER_SIZE_AB;\n while (oldPtr != oldEnd) {\n let oldEntry = changetype>(oldPtr);\n if (!(oldEntry.taggedNext & EMPTY)) {\n let newEntry = changetype>(newPtr);\n newEntry.key = oldEntry.key;\n newEntry.value = oldEntry.value;\n let newBucketIndex = HASH(oldEntry.key) & newBucketsMask;\n let newBucketPtrBase = changetype(newBuckets) + newBucketIndex * BUCKET_SIZE;\n newEntry.taggedNext = load(newBucketPtrBase, HEADER_SIZE_AB);\n store(newBucketPtrBase, newPtr, HEADER_SIZE_AB);\n newPtr += ENTRY_SIZE();\n }\n oldPtr += ENTRY_SIZE();\n }\n\n this.buckets = newBuckets;\n this.bucketsMask = newBucketsMask;\n this.entries = newEntries;\n this.entriesCapacity = newEntriesCapacity;\n this.entriesOffset = this.entriesCount;\n }\n\n toString(): string {\n return "[object Map]";\n }\n\n private __gc(): void {\n __gc_mark(changetype(this.buckets)); // tslint:disable-line\n var entries = this.entries;\n __gc_mark(changetype(entries)); // tslint:disable-line\n if (isManaged() || isManaged()) {\n let offset: usize = 0;\n let end: usize = this.entriesOffset * ENTRY_SIZE();\n while (offset < end) {\n let entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + offset * ENTRY_SIZE()\n );\n if (!(entry.taggedNext & EMPTY)) {\n if (isManaged()) __gc_mark(changetype(entry.key)); // tslint:disable-line\n if (isManaged()) __gc_mark(changetype(entry.value)); // tslint:disable-line\n }\n offset += ENTRY_SIZE();\n }\n }\n }\n}\n',math:'import * as JSMath from "./bindings/Math";\nexport { JSMath };\n\nimport {\n abs as builtin_abs,\n ceil as builtin_ceil,\n clz as builtin_clz,\n copysign as builtin_copysign,\n floor as builtin_floor,\n max as builtin_max,\n min as builtin_min,\n sqrt as builtin_sqrt,\n trunc as builtin_trunc\n} from "./builtins";\n\n// SUN COPYRIGHT NOTICE\n//\n// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n// Developed at SunPro, a Sun Microsystems, Inc. business.\n// Permission to use, copy, modify, and distribute this software\n// is freely granted, provided that this notice is preserved.\n//\n// Applies to all functions marked with a comment referring here.\n\n// TODO: sin, cos, tan\n\nfunction R(z: f64): f64 { // Rational approximation of (asin(x)-x)/x^3\n const // see: musl/src/math/asin.c and SUN COPYRIGHT NOTICE above\n pS0 = reinterpret(0x3FC5555555555555), // 1.66666666666666657415e-01\n pS1 = reinterpret(0xBFD4D61203EB6F7D), // -3.25565818622400915405e-01\n pS2 = reinterpret(0x3FC9C1550E884455), // 2.01212532134862925881e-01\n pS3 = reinterpret(0xBFA48228B5688F3B), // -4.00555345006794114027e-02\n pS4 = reinterpret(0x3F49EFE07501B288), // 7.91534994289814532176e-04\n pS5 = reinterpret(0x3F023DE10DFDF709), // 3.47933107596021167570e-05\n qS1 = reinterpret(0xC0033A271C8A2D4B), // -2.40339491173441421878e+00\n qS2 = reinterpret(0x40002AE59C598AC8), // 2.02094576023350569471e+00\n qS3 = reinterpret(0xBFE6066C1B8D0159), // -6.88283971605453293030e-01\n qS4 = reinterpret(0x3FB3B8C5B12E9282); // 7.70381505559019352791e-02\n var p = z * (pS0 + z * (pS1 + z * (pS2 + z * (pS3 + z * (pS4 + z * pS5)))));\n var q = 1.0 + z * (qS1 + z * (qS2 + z * (qS3 + z * qS4)));\n return p / q;\n}\n\n@inline function expo2(x: f64): f64 { // exp(x)/2 for x >= log(DBL_MAX)\n const // see: musl/src/math/__expo2.c\n k = 2043,\n kln2 = reinterpret(0x40962066151ADD8B); // 0x1.62066151add8bp+10\n var scale = reinterpret(((0x3FF + k / 2) << 20) << 32);\n return NativeMath.exp(x - kln2) * scale * scale;\n}\n\n@lazy var random_seeded = false;\n@lazy var random_state0_64: u64;\n@lazy var random_state1_64: u64;\n@lazy var random_state0_32: u32;\n@lazy var random_state1_32: u32;\n\nfunction murmurHash3(h: u64): u64 { // Force all bits of a hash block to avalanche\n h ^= h >> 33; // see: https://github.com/aappleby/smhasher\n h *= 0xFF51AFD7ED558CCD;\n h ^= h >> 33;\n h *= 0xC4CEB9FE1A85EC53;\n h ^= h >> 33;\n return h;\n}\n\nfunction splitMix32(h: u32): u32 {\n h += 0x6D2B79F5;\n h = (h ^ (h >> 15)) * (h | 1);\n h ^= h + (h ^ (h >> 7)) * (h | 61);\n return h ^ (h >> 14);\n}\n\nexport namespace NativeMath {\n\n @lazy export const E = reinterpret(0x4005BF0A8B145769); // 2.7182818284590452354\n @lazy export const LN2 = reinterpret(0x3FE62E42FEFA39EF); // 0.69314718055994530942\n @lazy export const LN10 = reinterpret(0x40026BB1BBB55516); // 2.30258509299404568402\n @lazy export const LOG2E = reinterpret(0x3FF71547652B82FE); // 1.4426950408889634074\n @lazy export const LOG10E = reinterpret(0x3FDBCB7B1526E50E); // 0.43429448190325182765\n @lazy export const PI = reinterpret(0x400921FB54442D18); // 3.14159265358979323846\n @lazy export const SQRT1_2 = reinterpret(0x3FE6A09E667F3BCD); // 0.70710678118654752440\n @lazy export const SQRT2 = reinterpret(0x3FF6A09E667F3BCD); // 1.41421356237309504880\n\n @inline\n export function abs(x: f64): f64 {\n return builtin_abs(x);\n }\n\n export function acos(x: f64): f64 { // see: musl/src/math/acos.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n pio2_lo = reinterpret(0x3C91A62633145C07), // 6.12323399573676603587e-17\n Ox1p_120f = reinterpret(0x03800000);\n var hx = (reinterpret(x) >> 32);\n var ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3FF00000) {\n let lx = reinterpret(x);\n if ((ix - 0x3FF00000 | lx) == 0) {\n if (hx >> 31) return 2 * pio2_hi + Ox1p_120f;\n return 0;\n }\n return 0 / (x - x);\n }\n if (ix < 0x3FE00000) {\n if (ix <= 0x3C600000) return pio2_hi + Ox1p_120f;\n return pio2_hi - (x - (pio2_lo - x * R(x * x)));\n }\n var s: f64, w: f64, z: f64;\n if (hx >> 31) {\n // z = (1.0 + x) * 0.5;\n z = 0.5 + x * 0.5;\n s = builtin_sqrt(z);\n w = R(z) * s - pio2_lo;\n return 2 * (pio2_hi - (s + w));\n }\n // z = (1.0 - x) * 0.5;\n z = 0.5 - x * 0.5;\n s = builtin_sqrt(z);\n var df = reinterpret(reinterpret(s) & 0xFFFFFFFF00000000);\n var c = (z - df * df) / (s + df);\n w = R(z) * s + c;\n return 2 * (df + w);\n }\n\n export function acosh(x: f64): f64 { // see: musl/src/math/acosh.c\n const s = reinterpret(0x3FE62E42FEFA39EF);\n var e = reinterpret(x) >> 52 & 0x7FF;\n if (e < 0x3FF + 1) return log1p(x - 1 + builtin_sqrt((x - 1) * (x - 1) + 2 * (x - 1)));\n if (e < 0x3FF + 26) return log(2 * x - 1 / (x + builtin_sqrt(x * x - 1)));\n return log(x) + s;\n }\n\n export function asin(x: f64): f64 { // see: musl/src/math/asin.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n pio2_lo = reinterpret(0x3C91A62633145C07), // 6.12323399573676603587e-17\n Ox1p_120f = reinterpret(0x03800000);\n var hx = (reinterpret(x) >> 32);\n var ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3FF00000) {\n let lx = reinterpret(x);\n if ((ix - 0x3FF00000 | lx) == 0) return x * pio2_hi + Ox1p_120f;\n return 0 / (x - x);\n }\n if (ix < 0x3FE00000) {\n if (ix < 0x3E500000 && ix >= 0x00100000) return x;\n return x + x * R(x * x);\n }\n // var z = (1.0 - builtin_abs(x)) * 0.5;\n var z = 0.5 - builtin_abs(x) * 0.5;\n var s = builtin_sqrt(z);\n var r = R(z);\n if (ix >= 0x3FEF3333) x = pio2_hi - (2 * (s + s * r) - pio2_lo);\n else {\n let f = reinterpret(reinterpret(s) & 0xFFFFFFFF00000000);\n let c = (z - f * f) / (s + f);\n x = 0.5 * pio2_hi - (2 * s * r - (pio2_lo - 2 * c) - (0.5 * pio2_hi - 2 * f));\n }\n if (hx >> 31) return -x;\n return x;\n }\n\n export function asinh(x: f64): f64 { // see: musl/src/math/asinh.c\n const c = reinterpret(0x3FE62E42FEFA39EF); // 0.693147180559945309417232121458176568\n var u = reinterpret(x);\n var e = u >> 52 & 0x7FF;\n var y = reinterpret(u & 0x7FFFFFFFFFFFFFFF);\n if (e >= 0x3FF + 26) y = log(y) + c;\n else if (e >= 0x3FF + 1) y = log(2 * y + 1 / (builtin_sqrt(y * y + 1) + y));\n else if (e >= 0x3FF - 26) y = log1p(y + y * y / (builtin_sqrt(y * y + 1) + 1));\n return builtin_copysign(y, x);\n }\n\n export function atan(x: f64): f64 { // see musl/src/math/atan.c and SUN COPYRIGHT NOTICE above\n const\n atanhi0 = reinterpret(0x3FDDAC670561BB4F), // 4.63647609000806093515e-01\n atanhi1 = reinterpret(0x3FE921FB54442D18), // 7.85398163397448278999e-01\n atanhi2 = reinterpret(0x3FEF730BD281F69B), // 9.82793723247329054082e-01\n atanhi3 = reinterpret(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n atanlo0 = reinterpret(0x3C7A2B7F222F65E2), // 2.26987774529616870924e-17\n atanlo1 = reinterpret(0x3C81A62633145C07), // 3.06161699786838301793e-17\n atanlo2 = reinterpret(0x3C7007887AF0CBBD), // 1.39033110312309984516e-17\n atanlo3 = reinterpret(0x3C91A62633145C07), // 6.12323399573676603587e-17\n aT0 = reinterpret(0x3FD555555555550D), // 3.33333333333329318027e-01\n aT1 = reinterpret(0xBFC999999998EBC4), // -1.99999999998764832476e-01\n aT2 = reinterpret(0x3FC24924920083FF), // 1.42857142725034663711e-01\n aT3 = reinterpret(0xBFBC71C6FE231671), // -1.11111104054623557880e-01,\n aT4 = reinterpret(0x3FB745CDC54C206E), // 9.09088713343650656196e-02\n aT5 = reinterpret(0xBFB3B0F2AF749A6D), // -7.69187620504482999495e-02\n aT6 = reinterpret(0x3FB10D66A0D03D51), // 6.66107313738753120669e-02\n aT7 = reinterpret(0xBFADDE2D52DEFD9A), // -5.83357013379057348645e-02\n aT8 = reinterpret(0x3FA97B4B24760DEB), // 4.97687799461593236017e-02\n aT9 = reinterpret(0xBFA2B4442C6A6C2F), // -3.65315727442169155270e-02\n aT10 = reinterpret(0x3F90AD3AE322DA11), // 1.62858201153657823623e-02\n Ox1p_120f = reinterpret(0x03800000);\n var ix = (reinterpret(x) >> 32);\n var sx = x;\n ix &= 0x7FFFFFFF;\n var z: f64;\n if (ix >= 0x44100000) {\n if (isNaN(x)) return x;\n z = atanhi3 + Ox1p_120f;\n return builtin_copysign(z, sx);\n }\n var id: i32;\n if (ix < 0x3FDC0000) {\n if (ix < 0x3E400000) return x;\n id = -1;\n } else {\n x = builtin_abs(x);\n if (ix < 0x3FF30000) {\n if (ix < 0x3FE60000) {\n id = 0;\n x = (2.0 * x - 1.0) / (2.0 + x);\n } else {\n id = 1;\n x = (x - 1.0) / (x + 1.0);\n }\n } else {\n if (ix < 0x40038000) {\n id = 2;\n x = (x - 1.5) / (1.0 + 1.5 * x);\n } else {\n id = 3;\n x = -1.0 / x;\n }\n }\n }\n z = x * x;\n var w = z * z;\n var s1 = z * (aT0 + w * (aT2 + w * (aT4 + w * (aT6 + w * (aT8 + w * aT10)))));\n var s2 = w * (aT1 + w * (aT3 + w * (aT5 + w * (aT7 + w * aT9))));\n var s3 = x * (s1 + s2);\n if (id < 0) return x - s3;\n switch (id) {\n case 0: { z = atanhi0 - ((s3 - atanlo0) - x); break; }\n case 1: { z = atanhi1 - ((s3 - atanlo1) - x); break; }\n case 2: { z = atanhi2 - ((s3 - atanlo2) - x); break; }\n case 3: { z = atanhi3 - ((s3 - atanlo3) - x); break; }\n default: unreachable();\n }\n return builtin_copysign(z, sx);\n }\n\n export function atanh(x: f64): f64 { // see: musl/src/math/atanh.c\n var u = reinterpret(x);\n var e = u >> 52 & 0x7FF;\n var s = u >> 63;\n u &= 0x7FFFFFFFFFFFFFFF;\n var y = reinterpret(u);\n if (e < 0x3FF - 1) {\n if (e >= 0x3FF - 32) y = 0.5 * log1p(2 * y + 2 * y * y / (1 - y));\n } else {\n y = 0.5 * log1p(2 * (y / (1 - y)));\n }\n return builtin_copysign(y, x);\n }\n\n export function atan2(y: f64, x: f64): f64 { // see: musl/src/math/atan2.c and SUN COPYRIGHT NOTICE above\n const pi_lo = reinterpret(0x3CA1A62633145C07); // 1.2246467991473531772E-16\n if (isNaN(x) || isNaN(y)) return x + y;\n var u = reinterpret(x);\n var ix = (u >> 32);\n var lx = u;\n u = reinterpret(y);\n var iy = (u >> 32);\n var ly = u;\n if ((ix - 0x3FF00000 | lx) == 0) return atan(y);\n var m = ((iy >> 31) & 1) | ((ix >> 30) & 2);\n ix = ix & 0x7FFFFFFF;\n iy = iy & 0x7FFFFFFF;\n if ((iy | ly) == 0) {\n switch (m) {\n case 0:\n case 1: return y;\n case 2: return PI;\n case 3: return -PI;\n }\n }\n if ((ix | lx) == 0) return m & 1 ? -PI / 2 : PI / 2;\n if (ix == 0x7FF00000) {\n if (iy == 0x7FF00000) {\n switch (m) {\n case 0: return PI / 4;\n case 1: return -PI / 4;\n case 2: return 3 * PI / 4;\n case 3: return -3 * PI / 4;\n }\n } else {\n switch (m) {\n case 0: return 0.0;\n case 1: return -0.0;\n case 2: return PI;\n case 3: return -PI;\n }\n }\n }\n var z: f64;\n if (ix + (64 << 20) < iy || iy == 0x7FF00000) return m & 1 ? -PI / 2 : PI / 2;\n if ((m & 2) && iy + (64 << 20) < ix) z = 0;\n else z = atan(builtin_abs(y / x));\n switch (m) {\n case 0: return z;\n case 1: return -z;\n case 2: return PI - (z - pi_lo);\n case 3: return (z - pi_lo) - PI;\n }\n unreachable();\n return 0;\n }\n\n export function cbrt(x: f64): f64 { // see: musl/src/math/cbrt.c and SUN COPYRIGHT NOTICE above\n const\n B1 = 715094163,\n B2 = 696219795,\n P0 = reinterpret(0x3FFE03E60F61E692), // 1.87595182427177009643\n P1 = reinterpret(0xBFFE28E092F02420), // -1.88497979543377169875\n P2 = reinterpret(0x3FF9F1604A49D6C2), // 1.621429720105354466140\n P3 = reinterpret(0xBFE844CBBEE751D9), // -0.758397934778766047437\n P4 = reinterpret(0x3FC2B000D4E4EDD7), // 0.145996192886612446982\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32) & 0x7FFFFFFF;\n if (hx >= 0x7FF00000) return x + x;\n if (hx < 0x00100000) {\n u = reinterpret(x * Ox1p54);\n hx = (u >> 32) & 0x7FFFFFFF;\n if (hx == 0) return x;\n hx = hx / 3 + B2;\n } else {\n hx = hx / 3 + B1;\n }\n u &= 1 << 63;\n u |= hx << 32;\n var t = reinterpret(u);\n var r = (t * t) * (t / x);\n t = t * ((P0 + r * (P1 + r * P2)) + ((r * r) * r) * (P3 + r * P4));\n t = reinterpret((reinterpret(t) + 0x80000000) & 0xFFFFFFFFC0000000);\n var s = t * t;\n r = x / s;\n r = (r - t) / (2 * t + r);\n t = t + t * r;\n return t;\n }\n\n @inline\n export function ceil(x: f64): f64 {\n return builtin_ceil(x);\n }\n\n export function clz32(x: f64): f64 {\n if (!isFinite(x)) return 32;\n /*\n * Wasm (MVP) and JS have different approaches for double->int conversions.\n *\n * For emulate JS conversion behavior and avoid trapping from wasm we should modulate by MAX_INT\n * our float-point arguments before actual convertion to integers.\n */\n return builtin_clz(\n (x - 4294967296 * builtin_floor(x * (1.0 / 4294967296)))\n );\n }\n\n export function cos(x: f64): f64 { // TODO\n unreachable();\n return 0;\n }\n\n export function cosh(x: f64): f64 { // see: musl/src/math/cosh.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFFFFFFFFFF;\n x = reinterpret(u);\n var w = (u >> 32);\n var t: f64;\n if (w < 0x3FE62E42) {\n if (w < 0x3FF00000 - (26 << 20)) return 1;\n t = expm1(x);\n // return 1 + t * t / (2 * (1 + t));\n return 1 + t * t / (2 + 2 * t);\n }\n if (w < 0x40862E42) {\n t = exp(x);\n return 0.5 * (t + 1 / t);\n }\n t = expo2(x);\n return t;\n }\n\n export function exp(x: f64): f64 { // see: musl/src/math/exp.c and SUN COPYRIGHT NOTICE above\n const\n ln2hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n invln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n P1 = reinterpret(0x3FC555555555553E), // 1.66666666666666019037e-01\n P2 = reinterpret(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03\n P3 = reinterpret(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05\n P4 = reinterpret(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06\n P5 = reinterpret(0x3E66376972BEA4D0), // 4.13813679705723846039e-08\n overflow = reinterpret(0x40862E42FEFA39EF), // 709.782712893383973096\n underflow = reinterpret(0xC0874910D52D3051), // -745.13321910194110842\n Ox1p1023 = reinterpret(0x7FE0000000000000);\n var hx = (reinterpret(x) >> 32);\n var sign_ = (hx >> 31);\n hx &= 0x7FFFFFFF;\n if (hx >= 0x4086232B) {\n if (isNaN(x)) return x;\n if (x > overflow) return x * Ox1p1023;\n if (x < underflow) return 0;\n }\n var hi: f64, lo: f64 = 0;\n var k = 0;\n if (hx > 0x3FD62E42) {\n if (hx >= 0x3FF0A2B2) {\n k = (invln2 * x + builtin_copysign(0.5, x));\n } else {\n k = 1 - (sign_ << 1);\n }\n hi = x - k * ln2hi;\n lo = k * ln2lo;\n x = hi - lo;\n } else if (hx > 0x3E300000) {\n hi = x;\n } else return 1.0 + x;\n var xs = x * x;\n // var c = x - xp2 * (P1 + xp2 * (P2 + xp2 * (P3 + xp2 * (P4 + xp2 * P5))));\n var xq = xs * xs;\n var c = x - (xs * P1 + xq * ((P2 + xs * P3) + xq * (P4 + xs * P5)));\n var y = 1.0 + (x * c / (2 - c) - lo + hi);\n if (k == 0) return y;\n return scalbn(y, k);\n }\n\n export function expm1(x: f64): f64 { // see: musl/src/math/expm1.c and SUN COPYRIGHT NOTICE above\n const\n o_threshold = reinterpret(0x40862E42FEFA39EF), // 7.09782712893383973096e+02\n ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n invln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n Q1 = reinterpret(0xBFA11111111110F4), // -3.33333333333331316428e-02\n Q2 = reinterpret(0x3F5A01A019FE5585), // 1.58730158725481460165e-03\n Q3 = reinterpret(0xBF14CE199EAADBB7), // -7.93650757867487942473e-05\n Q4 = reinterpret(0x3ED0CFCA86E65239), // 4.00821782732936239552e-06\n Q5 = reinterpret(0xBE8AFDB76E09C32D), // -2.01099218183624371326e-07\n Ox1p1023 = reinterpret(0x7FE0000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32 & 0x7FFFFFFF);\n var k = 0, sign_ = (u >> 63);\n if (hx >= 0x4043687A) {\n if (isNaN(x)) return x;\n if (sign_) return -1;\n if (x > o_threshold) return x * Ox1p1023;\n }\n var c = 0.0, t: f64;\n if (hx > 0x3FD62E42) {\n k = select(\n 1 - (sign_ << 1),\n (invln2 * x + builtin_copysign(0.5, x)),\n hx < 0x3FF0A2B2\n );\n t = k;\n let hi = x - t * ln2_hi;\n let lo = t * ln2_lo;\n x = hi - lo;\n c = (hi - x) - lo;\n } else if (hx < 0x3C900000) return x;\n var hfx = 0.5 * x;\n var hxs = x * hfx;\n // var r1 = 1.0 + hxs * (Q1 + hxs * (Q2 + hxs * (Q3 + hxs * (Q4 + hxs * Q5))));\n var hxq = hxs * hxs;\n var r1 = (1.0 + hxs * Q1) + hxq * ((Q2 + hxs * Q3) + hxq * (Q4 + hxs * Q5));\n t = 3.0 - r1 * hfx;\n var e = hxs * ((r1 - t) / (6.0 - x * t));\n if (k == 0) return x - (x * e - hxs);\n e = x * (e - c) - c;\n e -= hxs;\n if (k == -1) return 0.5 * (x - e) - 0.5;\n if (k == 1) {\n if (x < -0.25) return -2.0 * (e - (x + 0.5));\n return 1.0 + 2.0 * (x - e);\n }\n u = (0x3FF + k) << 52;\n var twopk = reinterpret(u);\n var y: f64;\n if (k < 0 || k > 56) {\n y = x - e + 1.0;\n if (k == 1024) y = y * 2.0 * Ox1p1023;\n else y = y * twopk;\n return y - 1.0;\n }\n u = (0x3FF - k) << 52;\n y = reinterpret(u);\n if (k < 20) y = (1 - y) - e;\n else y = 1 - (e + y);\n return (x + y) * twopk;\n }\n\n @inline\n export function floor(x: f64): f64 {\n return builtin_floor(x);\n }\n\n @inline\n export function fround(x: f64): f32 {\n return x;\n }\n\n export function hypot(x: f64, y: f64): f64 { // see: musl/src/math/hypot.c\n const\n SPLIT = reinterpret(0x41A0000000000000) + 1, // 0x1p27 + 1\n Ox1p700 = reinterpret(0x6BB0000000000000),\n Ox1p_700 = reinterpret(0x1430000000000000);\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n ux &= 0x7FFFFFFFFFFFFFFF;\n uy &= 0x7FFFFFFFFFFFFFFF;\n if (ux < uy) {\n let ut = ux;\n ux = uy;\n uy = ut;\n }\n var ex = (ux >> 52);\n var ey = (uy >> 52);\n y = reinterpret(uy);\n if (ey == 0x7FF) return y;\n x = reinterpret(ux);\n if (ex == 0x7FF || uy == 0) return x;\n if (ex - ey > 64) return x + y;\n var z = 1.0;\n if (ex > 0x3FF + 510) {\n z = Ox1p700;\n x *= Ox1p_700;\n y *= Ox1p_700;\n } else if (ey < 0x3FF - 450) {\n z = Ox1p_700;\n x *= Ox1p700;\n y *= Ox1p700;\n }\n var c = x * SPLIT;\n var h = x - c + c;\n var l = x - h;\n var hx = x * x;\n var lx = h * h - hx + (2 * h + l) * l;\n c = y * SPLIT;\n h = y - c + c;\n l = y - h;\n var hy = y * y;\n var ly = h * h - hy + (2 * h + l) * l;\n return z * builtin_sqrt(ly + lx + hy + hx);\n }\n\n export function imul(x: f64, y: f64): f64 {\n /*\n * Wasm (MVP) and JS have different approaches for double->int conversions.\n *\n * For emulate JS conversion behavior and avoid trapping from wasm we should modulate by MAX_INT\n * our float-point arguments before actual convertion to integers.\n */\n if (!isFinite(x + y)) return 0;\n const inv32 = 1.0 / 4294967296;\n return (\n (x - 4294967296 * builtin_floor(x * inv32)) *\n (y - 4294967296 * builtin_floor(y * inv32))\n );\n }\n\n export function log(x: f64): f64 { // see: musl/src/math/log.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 0;\n if (hx < 0x00100000 || (hx >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (hx >> 31) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret(x);\n hx = (u >> 32);\n } else if (hx >= 0x7FF00000) return x;\n else if (hx == 0x3FF00000 && u << 32 == 0) return 0;\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret(u);\n var f = x - 1.0;\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var dk = k;\n return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi;\n }\n\n export function log10(x: f64): f64 { // see: musl/src/math/log10.c and SUN COPYRIGHT NOTICE above\n const\n ivln10hi = reinterpret(0x3FDBCB7B15200000), // 4.34294481878168880939e-01\n ivln10lo = reinterpret(0x3DBB9438CA9AADD5), // 2.50829467116452752298e-11\n log10_2hi = reinterpret(0x3FD34413509F6000), // 3.01029995663611771306e-01\n log10_2lo = reinterpret(0x3D59FEF311F12B36), // 3.69423907715893078616e-13\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 0;\n if (hx < 0x00100000 || (hx >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (hx >> 31) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret(x);\n hx = (u >> 32);\n } else if (hx >= 0x7FF00000) return x;\n else if (hx == 0x3FF00000 && u << 32 == 0) return 0;\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret(u);\n var f = x - 1.0;\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var hi = f - hfsq;\n u = reinterpret(hi);\n u &= 0xFFFFFFFF00000000;\n hi = reinterpret(u);\n var lo = f - hi - hfsq + s * (hfsq + r);\n var val_hi = hi * ivln10hi;\n var dk = k;\n var y = dk * log10_2hi;\n var val_lo = dk * log10_2lo + (lo + hi) * ivln10lo + lo * ivln10hi;\n w = y + val_hi;\n val_lo += (y - w) + val_hi;\n return val_lo + w;\n }\n\n export function log1p(x: f64): f64 { // see: musl/src/math/log1p.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244); // 1.479819860511658591e-01\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 1;\n var c = 0.0, f = 0.0;\n if (hx < 0x3FDA827A || (hx >> 31)) {\n if (hx >= 0xBFF00000) {\n if (x == -1) return x / 0.0;\n return (x - x) / 0.0;\n }\n if (hx << 1 < 0x3CA00000 << 1) return x;\n if (hx <= 0xBFD2BEC4) {\n k = 0;\n c = 0;\n f = x;\n }\n } else if (hx >= 0x7FF00000) return x;\n if (k) {\n u = reinterpret(1 + x);\n let hu = (u >> 32);\n hu += 0x3FF00000 - 0x3FE6A09E;\n k = (hu >> 20) - 0x3FF;\n if (k < 54) {\n let uf = reinterpret(u);\n c = k >= 2 ? 1 - (uf - x) : x - (uf - 1);\n c /= uf;\n } else c = 0;\n hu = (hu & 0x000FFFFF) + 0x3FE6A09E;\n u = hu << 32 | (u & 0xFFFFFFFF);\n f = reinterpret(u) - 1;\n }\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var dk = k;\n return s * (hfsq + r) + (dk * ln2_lo + c) - hfsq + f + dk * ln2_hi;\n }\n\n export function log2(x: f64): f64 { // see: musl/src/math/log2.c and SUN COPYRIGHT NOTICE above\n const\n ivln2hi = reinterpret(0x3FF7154765200000), // 1.44269504072144627571e+00\n ivln2lo = reinterpret(0x3DE705FC2EEFA200), // 1.67517131648865118353e-10\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 0;\n if (hx < 0x00100000 || (hx >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (hx >> 31) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret(x);\n hx = (u >> 32);\n } else if (hx >= 0x7FF00000) return x;\n else if (hx == 0x3FF00000 && u << 32 == 0) return 0;\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret(u);\n var f = x - 1.0;\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var hi = f - hfsq;\n u = reinterpret(hi);\n u &= 0xFFFFFFFF00000000;\n hi = reinterpret(u);\n var lo = f - hi - hfsq + s * (hfsq + r);\n var val_hi = hi * ivln2hi;\n var val_lo = (lo + hi) * ivln2lo + lo * ivln2hi;\n var y = k;\n w = y + val_hi;\n val_lo += (y - w) + val_hi;\n val_hi = w;\n return val_lo + val_hi;\n }\n\n @inline\n export function max(value1: f64, value2: f64): f64 {\n return builtin_max(value1, value2);\n }\n\n @inline\n export function min(value1: f64, value2: f64): f64 {\n return builtin_min(value1, value2);\n }\n\n export function pow(x: f64, y: f64): f64 { // see: musl/src/math/pow.c and SUN COPYRIGHT NOTICE above\n const\n dp_h1 = reinterpret(0x3FE2B80340000000), // 5.84962487220764160156e-01\n dp_l1 = reinterpret(0x3E4CFDEB43CFD006), // 1.35003920212974897128e-08\n two53 = reinterpret(0x4340000000000000), // 9007199254740992.0\n huge = reinterpret(0x7E37E43C8800759C), // 1e+300\n tiny = reinterpret(0x01A56E1FC2F8F359), // 1e-300\n L1 = reinterpret(0x3FE3333333333303), // 5.99999999999994648725e-01\n L2 = reinterpret(0x3FDB6DB6DB6FABFF), // 4.28571428578550184252e-01\n L3 = reinterpret(0x3FD55555518F264D), // 3.33333329818377432918e-01\n L4 = reinterpret(0x3FD17460A91D4101), // 2.72728123808534006489e-01\n L5 = reinterpret(0x3FCD864A93C9DB65), // 2.30660745775561754067e-01\n L6 = reinterpret(0x3FCA7E284A454EEF), // 2.06975017800338417784e-01\n P1 = reinterpret(0x3FC555555555553E), // 1.66666666666666019037e-01\n P2 = reinterpret(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03\n P3 = reinterpret(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05\n P4 = reinterpret(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06\n P5 = reinterpret(0x3E66376972BEA4D0), // 4.13813679705723846039e-08\n lg2 = reinterpret(0x3FE62E42FEFA39EF), // 6.93147180559945286227e-01\n lg2_h = reinterpret(0x3FE62E4300000000), // 6.93147182464599609375e-01\n lg2_l = reinterpret(0xBE205C610CA86C39), // -1.90465429995776804525e-09\n ovt = reinterpret(0x3C971547652B82FE), // 8.0085662595372944372e-017\n cp = reinterpret(0x3FEEC709DC3A03FD), // 9.61796693925975554329e-01\n cp_h = reinterpret(0x3FEEC709E0000000), // 9.61796700954437255859e-01\n cp_l = reinterpret(0xBE3E2FE0145B01F5), // -7.02846165095275826516e-09\n ivln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n ivln2_h = reinterpret(0x3FF7154760000000), // 1.44269502162933349609e+00\n ivln2_l = reinterpret(0x3E54AE0BF85DDF44), // 1.92596299112661746887e-08\n inv3 = reinterpret(0x3FD5555555555555); // 0.3333333333333333333333\n var u_ = reinterpret(x);\n var hx = (u_ >> 32);\n var lx = u_;\n u_ = reinterpret(y);\n var hy = (u_ >> 32);\n var ly = u_;\n var ix = hx & 0x7FFFFFFF;\n var iy = hy & 0x7FFFFFFF;\n if ((iy | ly) == 0) return 1.0; // x**0 = 1, even if x is NaN\n // if (hx == 0x3FF00000 && lx == 0) return 1.0; // C: 1**y = 1, even if y is NaN, JS: NaN\n if ( // NaN if either arg is NaN\n ix > 0x7FF00000 || (ix == 0x7FF00000 && lx != 0) ||\n iy > 0x7FF00000 || (iy == 0x7FF00000 && ly != 0)\n ) return x + y;\n var yisint = 0, k: i32;\n if (hx < 0) {\n if (iy >= 0x43400000) yisint = 2;\n else if (iy >= 0x3FF00000) {\n k = (iy >> 20) - 0x3FF;\n let kcond = k > 20;\n let offset = select(52, 20, kcond) - k;\n let Ly = select(ly, iy, kcond);\n let jj = Ly >> offset;\n if ((jj << offset) == Ly) yisint = 2 - (jj & 1);\n }\n }\n if (ly == 0) {\n if (iy == 0x7FF00000) { // y is +-inf\n if (((ix - 0x3FF00000) | lx) == 0) return NaN; // C: (-1)**+-inf is 1, JS: NaN\n else if (ix >= 0x3FF00000) return hy >= 0 ? y : 0.0; // (|x|>1)**+-inf = inf,0\n else return hy >= 0 ? 0.0 : -y; // (|x|<1)**+-inf = 0,inf\n }\n if (iy == 0x3FF00000) {\n if (hy >= 0) return x;\n return 1 / x;\n }\n if (hy == 0x40000000) return x * x;\n if (hy == 0x3FE00000) {\n if (hx >= 0) return builtin_sqrt(x);\n }\n }\n var ax = builtin_abs(x), z: f64;\n if (lx == 0) {\n if (ix == 0 || ix == 0x7FF00000 || ix == 0x3FF00000) {\n z = ax;\n if (hy < 0) z = 1.0 / z;\n if (hx < 0) {\n if (((ix - 0x3FF00000) | yisint) == 0) {\n let d = z - z;\n z = d / d;\n } else if (yisint == 1) z = -z;\n }\n return z;\n }\n }\n var s = 1.0;\n if (hx < 0) {\n if (yisint == 0) {\n let d = x - x;\n return d / d;\n }\n if (yisint == 1) s = -1.0;\n }\n var t1: f64, t2: f64, p_h: f64, p_l: f64, r: f64, t: f64, u: f64, v: f64, w: f64;\n var j: i32, n: i32;\n if (iy > 0x41E00000) {\n if (iy > 0x43F00000) {\n if (ix <= 0x3FEFFFFF) return hy < 0 ? huge * huge : tiny * tiny;\n if (ix >= 0x3FF00000) return hy > 0 ? huge * huge : tiny * tiny;\n }\n if (ix < 0x3FEFFFFF) return hy < 0 ? s * huge * huge : s * tiny * tiny;\n if (ix > 0x3FF00000) return hy > 0 ? s * huge * huge : s * tiny * tiny;\n t = ax - 1.0;\n w = (t * t) * (0.5 - t * (inv3 - t * 0.25));\n u = ivln2_h * t;\n v = t * ivln2_l - w * ivln2;\n t1 = u + v;\n t1 = reinterpret(reinterpret(t1) & 0xFFFFFFFF00000000);\n t2 = v - (t1 - u);\n } else {\n let ss: f64, s2: f64, s_h: f64, s_l: f64, t_h: f64, t_l: f64;\n n = 0;\n if (ix < 0x00100000) {\n ax *= two53;\n n -= 53;\n ix = (reinterpret(ax) >> 32);\n }\n n += (ix >> 20) - 0x3FF;\n j = ix & 0x000FFFFF;\n ix = j | 0x3FF00000;\n if (j <= 0x3988E) k = 0;\n else if (j < 0xBB67A) k = 1;\n else {\n k = 0;\n n += 1;\n ix -= 0x00100000;\n }\n ax = reinterpret(reinterpret(ax) & 0xFFFFFFFF | (ix << 32));\n let bp = select(1.5, 1.0, k); // k ? 1.5 : 1.0\n u = ax - bp;\n v = 1.0 / (ax + bp);\n ss = u * v;\n s_h = ss;\n s_h = reinterpret(reinterpret(s_h) & 0xFFFFFFFF00000000);\n t_h = reinterpret((((ix >> 1) | 0x20000000) + 0x00080000 + (k << 18)) << 32);\n t_l = ax - (t_h - bp);\n s_l = v * ((u - s_h * t_h) - s_h * t_l);\n s2 = ss * ss;\n r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6)))));\n r += s_l * (s_h + ss);\n s2 = s_h * s_h;\n t_h = 3.0 + s2 + r;\n t_h = reinterpret(reinterpret(t_h) & 0xFFFFFFFF00000000);\n t_l = r - ((t_h - 3.0) - s2);\n u = s_h * t_h;\n v = s_l * t_h + t_l * ss;\n p_h = u + v;\n p_h = reinterpret(reinterpret(p_h) & 0xFFFFFFFF00000000);\n p_l = v - (p_h - u);\n let z_h = cp_h * p_h;\n let dp_l = select(dp_l1, 0.0, k);\n let z_l = cp_l * p_h + p_l * cp + dp_l;\n t = n;\n let dp_h = select(dp_h1, 0.0, k);\n t1 = ((z_h + z_l) + dp_h) + t;\n t1 = reinterpret(reinterpret(t1) & 0xFFFFFFFF00000000);\n t2 = z_l - (((t1 - t) - dp_h) - z_h);\n }\n var y1 = y;\n y1 = reinterpret(reinterpret(y1) & 0xFFFFFFFF00000000);\n p_l = (y - y1) * t1 + y * t2;\n p_h = y1 * t1;\n z = p_l + p_h;\n u_ = reinterpret(z);\n j = (u_ >> 32);\n var i = u_;\n if (j >= 0x40900000) {\n if (((j - 0x40900000) | i) != 0) return s * huge * huge;\n if (p_l + ovt > z - p_h) return s * huge * huge;\n } else if ((j & 0x7FFFFFFF) >= 0x4090CC00) {\n if (((j - 0xC090CC00) | i) != 0) return s * tiny * tiny;\n if (p_l <= z - p_h) return s * tiny * tiny;\n }\n i = j & 0x7FFFFFFF;\n k = (i >> 20) - 0x3FF;\n n = 0;\n if (i > 0x3FE00000) {\n n = j + (0x00100000 >> (k + 1));\n k = ((n & 0x7FFFFFFF) >> 20) - 0x3FF;\n t = 0.0;\n t = reinterpret((n & ~(0x000FFFFF >> k)) << 32);\n n = ((n & 0x000FFFFF) | 0x00100000) >> (20 - k);\n if (j < 0) n = -n;\n p_h -= t;\n }\n t = p_l + p_h;\n t = reinterpret(reinterpret(t) & 0xFFFFFFFF00000000);\n u = t * lg2_h;\n v = (p_l - (t - p_h)) * lg2 + t * lg2_l;\n z = u + v;\n w = v - (z - u);\n t = z * z;\n t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));\n r = (z * t1) / (t1 - 2.0) - (w + z * w);\n z = 1.0 - (r - z);\n j = (reinterpret(z) >> 32);\n j += n << 20;\n if ((j >> 20) <= 0) z = scalbn(z, n);\n else z = reinterpret(reinterpret(z) & 0xFFFFFFFF | (j << 32));\n return s * z;\n }\n\n export function seedRandom(value: i64): void {\n assert(value);\n random_seeded = true;\n random_state0_64 = murmurHash3(value);\n random_state1_64 = murmurHash3(~random_state0_64);\n random_state0_32 = splitMix32(value);\n random_state1_32 = splitMix32(random_state0_32);\n }\n\n export function random(): f64 { // see: v8/src/base/random-number-generator.cc\n if (!random_seeded) throw new Error("PRNG must be seeded.");\n var s1 = random_state0_64;\n var s0 = random_state1_64;\n random_state0_64 = s0;\n s1 ^= s1 << 23;\n s1 ^= s1 >> 17;\n s1 ^= s0;\n s1 ^= s0 >> 26;\n random_state1_64 = s1;\n var r = ((s0 + s1) & 0x000FFFFFFFFFFFFF) | 0x3FF0000000000000;\n return reinterpret(r) - 1;\n }\n\n @inline\n export function round(x: f64): f64 {\n return builtin_copysign(builtin_floor(x + 0.5), x);\n }\n\n @inline\n export function sign(x: f64): f64 {\n if (ASC_SHRINK_LEVEL > 0) {\n return builtin_abs(x) > 0 ? builtin_copysign(1, x) : x;\n } else {\n return x > 0 ? 1 : x < 0 ? -1 : x;\n }\n }\n\n @inline\n export function signbit(x: f64): bool {\n // In ECMAScript all NaN values are indistinguishable from each other\n // so we need handle NaN and negative NaN in similar way\n return ((reinterpret(x) >>> 63) & (x == x));\n }\n\n export function sin(x: f64): f64 { // TODO\n unreachable();\n return 0;\n }\n\n export function sinh(x: f64): f64 { // see: musl/src/math/sinh.c\n var u = reinterpret(x) & 0x7FFFFFFFFFFFFFFF;\n var absx = reinterpret(u);\n var w = (u >> 32);\n var t: f64;\n var h = builtin_copysign(0.5, x);\n if (w < 0x40862E42) {\n t = expm1(absx);\n if (w < 0x3FF00000) {\n if (w < 0x3FF00000 - (26 << 20)) return x;\n return h * (2 * t - t * t / (t + 1));\n }\n return h * (t + t / (t + 1));\n }\n t = 2 * h * expo2(absx);\n return t;\n }\n\n @inline\n export function sqrt(x: f64): f64 {\n return builtin_sqrt(x);\n }\n\n export function tan(x: f64): f64 { // TODO\n unreachable();\n return 0;\n }\n\n export function tanh(x: f64): f64 { // see: musl/src/math/tanh.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFFFFFFFFFF;\n var y = reinterpret(u);\n var w = (u >> 32);\n var t: f64;\n if (w > 0x3FE193EA) {\n if (w > 0x40340000) {\n t = 1 - 0 / y;\n } else {\n t = expm1(2 * y);\n t = 1 - 2 / (t + 2);\n }\n } else if (w > 0x3FD058AE) {\n t = expm1(2 * y);\n t = t / (t + 2);\n } else if (w >= 0x00100000) {\n t = expm1(-2 * y);\n t = -t / (t + 2);\n } else t = y;\n return builtin_copysign(t, x);\n }\n\n @inline\n export function trunc(x: f64): f64 {\n return builtin_trunc(x);\n }\n\n export function scalbn(x: f64, n: i32): f64 { // see: https://git.musl-libc.org/cgit/musl/tree/src/math/scalbn.c\n const\n Ox1p53 = reinterpret(0x4340000000000000),\n Ox1p1023 = reinterpret(0x7FE0000000000000),\n Ox1p_1022 = reinterpret(0x0010000000000000);\n var y = x;\n if (n > 1023) {\n y *= Ox1p1023;\n n -= 1023;\n if (n > 1023) {\n y *= Ox1p1023;\n n = builtin_min(n - 1023, 1023);\n }\n } else if (n < -1022) {\n /* make sure final n < -53 to avoid double\n\t\t rounding in the subnormal range */\n y *= Ox1p_1022 * Ox1p53;\n n += 1022 - 53;\n if (n < -1022) {\n y *= Ox1p_1022 * Ox1p53;\n n = builtin_max(n + 1022 - 53, -1022);\n }\n }\n return y * reinterpret((0x3FF + n) << 52);\n }\n\n export function mod(x: f64, y: f64): f64 { // see: musl/src/math/fmod.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 52 & 0x7FF);\n var ey = (uy >> 52 & 0x7FF);\n var sx = ux >> 63;\n var uy1 = uy << 1;\n if (uy1 == 0 || ex == 0x7FF || isNaN(y)) {\n let m = x * y;\n return m / m;\n }\n var ux1 = ux << 1;\n if (ux1 <= uy1) {\n if (ux1 == uy1) return 0 * x;\n return x;\n }\n if (!ex) {\n ex -= builtin_clz(ux << 12);\n ux <<= -ex + 1;\n } else {\n ux &= -1 >> 12;\n ux |= 1 << 52;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 12);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 12;\n uy |= 1 << 52;\n }\n while (ex > ey) {\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n ux <<= 1;\n --ex;\n }\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n // for (; !(ux >> 52); ux <<= 1) --ex;\n var shift = builtin_clz(ux << 11);\n ex -= shift;\n ux <<= shift;\n if (ex > 0) {\n ux -= 1 << 52;\n ux |= ex << 52;\n } else {\n ux >>= -ex + 1;\n }\n ux |= sx << 63;\n return reinterpret(ux);\n }\n\n export function rem(x: f64, y: f64): f64 { // see: musl/src/math/remquo.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 52 & 0x7FF);\n var ey = (uy >> 52 & 0x7FF);\n var sx = (ux >> 63);\n if (uy << 1 == 0 || ex == 0x7FF || isNaN(y)) {\n let m = x * y;\n return m / m;\n }\n if (ux << 1 == 0) return x;\n var uxi = ux;\n if (!ex) {\n ex -= builtin_clz(uxi << 12);\n uxi <<= -ex + 1;\n } else {\n uxi &= -1 >> 12;\n uxi |= 1 << 52;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 12);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 12;\n uy |= 1 << 52;\n }\n var q: u32 = 0;\n do {\n if (ex < ey) {\n if (ex + 1 == ey) break; // goto end\n return x;\n }\n while (ex > ey) {\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n uxi <<= 1;\n q <<= 1;\n --ex;\n }\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n if (uxi == 0) ex = -60;\n else {\n let shift = builtin_clz(uxi << 11);\n ex -= shift;\n uxi <<= shift;\n }\n break;\n } while (false);\n // end:\n if (ex > 0) {\n uxi -= 1 << 52;\n uxi |= ex << 52;\n } else {\n uxi >>= -ex + 1;\n }\n x = reinterpret(uxi);\n y = builtin_abs(y);\n var x2 = x + x;\n if (ex == ey || (ex + 1 == ey && (x2 > y || (x2 == y && (q & 1))))) {\n x -= y;\n // ++q;\n }\n return sx ? -x : x;\n }\n}\n\nfunction Rf(z: f32): f32 { // Rational approximation of (asin(x)-x)/x^3\n const // see: musl/src/math/asinf.c and SUN COPYRIGHT NOTICE above\n pS0 = reinterpret(0x3E2AAA75), // 1.6666586697e-01f\n pS1 = reinterpret(0xBD2F13BA), // -4.2743422091e-02f\n pS2 = reinterpret(0xBC0DD36B), // -8.6563630030e-03f\n qS1 = reinterpret(0xBF34E5AE); // -7.0662963390e-01f\n var p = z * (pS0 + z * (pS1 + z * pS2));\n var q: f32 = 1 + z * qS1;\n return p / q;\n}\n\n@inline function expo2f(x: f32): f32 { // exp(x)/2 for x >= log(DBL_MAX)\n const // see: musl/src/math/__expo2f.c\n k = 235,\n kln2 = reinterpret(0x4322E3BC); // 0x1.45c778p+7f\n var scale = reinterpret((0x7F + (k >> 1)) << 23);\n return NativeMathf.exp(x - kln2) * scale * scale;\n}\n\nexport namespace NativeMathf {\n\n @lazy export const E = NativeMath.E;\n @lazy export const LN2 = NativeMath.LN2;\n @lazy export const LN10 = NativeMath.LN10;\n @lazy export const LOG2E = NativeMath.LOG2E;\n @lazy export const LOG10E = NativeMath.LOG10E;\n @lazy export const PI = NativeMath.PI;\n @lazy export const SQRT1_2 = NativeMath.SQRT1_2;\n @lazy export const SQRT2 = NativeMath.SQRT2;\n\n @inline\n export function abs(x: f32): f32 {\n return builtin_abs(x);\n }\n\n export function acos(x: f32): f32 { // see: musl/src/math/acosf.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret(0x3FC90FDA), // 1.5707962513e+00f\n pio2_lo = reinterpret(0x33A22168), // 7.5497894159e-08f\n Ox1p_120f = reinterpret(0x03800000);\n var hx = reinterpret(x);\n var ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3F800000) {\n if (ix == 0x3F800000) {\n if (hx >> 31) return 2 * pio2_hi + Ox1p_120f;\n return 0;\n }\n return 0 / (x - x);\n }\n if (ix < 0x3F000000) {\n if (ix <= 0x32800000) return pio2_hi + Ox1p_120f;\n return pio2_hi - (x - (pio2_lo - x * Rf(x * x)));\n }\n var z: f32, w: f32, s: f32;\n if (hx >> 31) {\n // z = (1 + x) * 0.5;\n z = 0.5 + x * 0.5;\n s = builtin_sqrt(z);\n w = Rf(z) * s - pio2_lo;\n return 2 * (pio2_hi - (s + w));\n }\n // z = (1 - x) * 0.5;\n z = 0.5 - x * 0.5;\n s = builtin_sqrt(z);\n hx = reinterpret(s);\n var df = reinterpret(hx & 0xFFFFF000);\n var c = (z - df * df) / (s + df);\n w = Rf(z) * s + c;\n return 2 * (df + w);\n }\n\n export function acosh(x: f32): f32 { // see: musl/src/math/acoshf.c\n const s = reinterpret(0x3F317218); // 0.693147180559945309417232121458176568f\n var u = reinterpret(x);\n var a = u & 0x7FFFFFFF;\n if (a < 0x3F800000 + (1 << 23)) {\n let xm1 = x - 1;\n return log1p(xm1 + builtin_sqrt(xm1 * (xm1 + 2)));\n }\n if (a < 0x3F800000 + (12 << 23)) return log(2 * x - 1 / (x + builtin_sqrt(x * x - 1)));\n return log(x) + s;\n }\n\n export function asin(x: f32): f32 { // see: musl/src/math/asinf.c and SUN COPYRIGHT NOTICE above\n const\n pio2 = reinterpret(0x3FC90FDB), // 1.570796326794896558e+00f\n Ox1p_120f = reinterpret(0x03800000);\n var sx = x;\n var hx = reinterpret(x) & 0x7FFFFFFF;\n if (hx >= 0x3F800000) {\n if (hx == 0x3F800000) return x * pio2 + Ox1p_120f;\n return 0 / (x - x);\n }\n if (hx < 0x3F000000) {\n if (hx < 0x39800000 && hx >= 0x00800000) return x;\n return x + x * Rf(x * x);\n }\n // var z: f32 = (1 - builtin_abs(x)) * 0.5;\n var z: f32 = 0.5 - builtin_abs(x) * 0.5;\n var s = builtin_sqrt(z); // sic\n x = (pio2 - 2 * (s + s * Rf(z)));\n return builtin_copysign(x, sx);\n }\n\n export function asinh(x: f32): f32 { // see: musl/src/math/asinhf.c\n const c = reinterpret(0x3F317218); // 0.693147180559945309417232121458176568f\n var u = reinterpret(x) & 0x7FFFFFFF;\n var y = reinterpret(u);\n if (u >= 0x3F800000 + (12 << 23)) y = log(y) + c;\n else if (u >= 0x3F800000 + (1 << 23)) y = log(2 * y + 1 / (builtin_sqrt(y * y + 1) + y));\n else if (u >= 0x3F800000 - (12 << 23)) y = log1p(y + y * y / (builtin_sqrt(y * y + 1) + 1));\n return builtin_copysign(y, x);\n }\n\n export function atan(x: f32): f32 { // see: musl/src/math/atanf.c and SUN COPYRIGHT NOTICE above\n const\n atanhi0 = reinterpret(0x3EED6338), // 4.6364760399e-01f\n atanhi1 = reinterpret(0x3F490FDA), // 7.8539812565e-01f\n atanhi2 = reinterpret(0x3F7B985E), // 9.8279368877e-01f\n atanhi3 = reinterpret(0x3FC90FDA), // 1.5707962513e+00f\n atanlo0 = reinterpret(0x31AC3769), // 5.0121582440e-09f\n atanlo1 = reinterpret(0x33222168), // 3.7748947079e-08f\n atanlo2 = reinterpret(0x33140FB4), // 3.4473217170e-08f\n atanlo3 = reinterpret(0x33A22168), // 7.5497894159e-08f\n aT0 = reinterpret(0x3EAAAAA9), // 3.3333328366e-01f\n aT1 = reinterpret(0xBE4CCA98), // -1.9999158382e-01f\n aT2 = reinterpret(0x3E11F50D), // 1.4253635705e-01f\n aT3 = reinterpret(0xBDDA1247), // -1.0648017377e-01f\n aT4 = reinterpret(0x3D7CAC25), // 6.1687607318e-02f\n Ox1p_120f = reinterpret(0x03800000);\n var ix = reinterpret(x);\n var sx = x;\n ix &= 0x7FFFFFFF;\n var z: f32;\n if (ix >= 0x4C800000) {\n if (isNaN(x)) return x;\n z = atanhi3 + Ox1p_120f;\n return builtin_copysign(z, sx);\n }\n var id: i32;\n if (ix < 0x3EE00000) {\n if (ix < 0x39800000) return x;\n id = -1;\n } else {\n x = builtin_abs(x);\n if (ix < 0x3F980000) {\n if (ix < 0x3F300000) {\n id = 0;\n x = (2.0 * x - 1.0) / (2.0 + x);\n } else {\n id = 1;\n x = (x - 1.0) / (x + 1.0);\n }\n } else {\n if (ix < 0x401C0000) {\n id = 2;\n x = (x - 1.5) / (1.0 + 1.5 * x);\n } else {\n id = 3;\n x = -1.0 / x;\n }\n }\n }\n z = x * x;\n var w = z * z;\n var s1 = z * (aT0 + w * (aT2 + w * aT4));\n var s2 = w * (aT1 + w * aT3);\n var s3 = x * (s1 + s2);\n if (id < 0) return x - s3;\n switch (id) {\n case 0: { z = atanhi0 - ((s3 - atanlo0) - x); break; }\n case 1: { z = atanhi1 - ((s3 - atanlo1) - x); break; }\n case 2: { z = atanhi2 - ((s3 - atanlo2) - x); break; }\n case 3: { z = atanhi3 - ((s3 - atanlo3) - x); break; }\n default: unreachable();\n }\n return builtin_copysign(z, sx);\n }\n\n export function atanh(x: f32): f32 { // see: musl/src/math/atanhf.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFF;\n var y = reinterpret(u);\n if (u < 0x3F800000 - (1 << 23)) {\n if (u >= 0x3F800000 - (32 << 23)) y = 0.5 * log1p(2 * y * (1.0 + y / (1 - y)));\n } else y = 0.5 * log1p(2 * (y / (1 - y)));\n return builtin_copysign(y, x);\n }\n\n export function atan2(y: f32, x: f32): f32 { // see: musl/src/math/atan2f.c and SUN COPYRIGHT NOTICE above\n const\n pi = reinterpret(0x40490FDB), // 3.1415927410e+00f\n pi_lo = reinterpret(0xB3BBBD2E); // -8.7422776573e-08f\n if (isNaN(x) || isNaN(y)) return x + y;\n var ix = reinterpret(x);\n var iy = reinterpret(y);\n if (ix == 0x3F800000) return atan(y);\n var m = (((iy >> 31) & 1) | ((ix >> 30) & 2));\n ix &= 0x7FFFFFFF;\n iy &= 0x7FFFFFFF;\n if (iy == 0) {\n switch (m) {\n case 0:\n case 1: return y;\n case 2: return pi;\n case 3: return -pi;\n }\n }\n if (ix == 0) return m & 1 ? -pi / 2 : pi / 2;\n if (ix == 0x7F800000) {\n if (iy == 0x7F800000) {\n switch (m) {\n case 0: return pi / 4;\n case 1: return -pi / 4;\n case 2: return 3 * pi / 4;\n case 3: return -3 * pi / 4;\n }\n } else {\n switch (m) {\n case 0: return 0;\n case 1: return -0;\n case 2: return pi;\n case 3: return -pi;\n }\n }\n }\n if (ix + (26 << 23) < iy || iy == 0x7F800000) return m & 1 ? -pi / 2 : pi / 2;\n var z: f32;\n if ((m & 2) && iy + (26 << 23) < ix) z = 0.0;\n else z = atan(builtin_abs(y / x));\n switch (m) {\n case 0: return z;\n case 1: return -z;\n case 2: return pi - (z - pi_lo);\n case 3: return (z - pi_lo) - pi;\n }\n unreachable();\n return 0;\n }\n\n export function cbrt(x: f32): f32 { // see: musl/src/math/cbrtf.c and SUN COPYRIGHT NOTICE above\n const\n B1 = 709958130,\n B2 = 642849266,\n Ox1p24f = reinterpret(0x4B800000);\n var u = reinterpret(x);\n var hx = u & 0x7FFFFFFF;\n if (hx >= 0x7F800000) return x + x;\n if (hx < 0x00800000) {\n if (hx == 0) return x;\n u = reinterpret(x * Ox1p24f);\n hx = u & 0x7FFFFFFF;\n hx = hx / 3 + B2;\n } else {\n hx = hx / 3 + B1;\n }\n u &= 0x80000000;\n u |= hx;\n var t = reinterpret(u);\n var r = t * t * t;\n t = t * (x + x + r) / (x + r + r);\n r = t * t * t;\n t = t * (x + x + r) / (x + r + r);\n return t;\n }\n\n @inline\n export function ceil(x: f32): f32 {\n return builtin_ceil(x);\n }\n\n export function clz32(x: f32): f32 {\n if (!isFinite(x)) return 32;\n return builtin_clz(\n (x - 4294967296 * builtin_floor(x * (1.0 / 4294967296)))\n );\n }\n\n export function cos(x: f32): f32 { // TODO\n unreachable();\n return 0;\n }\n\n export function cosh(x: f32): f32 { // see: musl/src/math/coshf.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFF;\n x = reinterpret(u);\n if (u < 0x3F317217) {\n if (u < 0x3F800000 - (12 << 23)) return 1;\n let t = expm1(x);\n // return 1 + t * t / (2 * (1 + t));\n return 1 + t * t / (2 + 2 * t);\n }\n if (u < 0x42B17217) {\n let t = exp(x);\n // return 0.5 * (t + 1 / t);\n return 0.5 * t + 0.5 / t;\n }\n return expo2f(x);\n }\n\n @inline\n export function floor(x: f32): f32 {\n return builtin_floor(x);\n }\n\n export function exp(x: f32): f32 { // see: musl/src/math/expf.c and SUN COPYRIGHT NOTICE above\n const\n ln2hi = reinterpret(0x3F317200), // 6.9314575195e-1f\n ln2lo = reinterpret(0x35BFBE8E), // 1.4286067653e-6f\n invln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+0f\n P1 = reinterpret(0x3E2AAA8F), // 1.6666625440e-1f\n P2 = reinterpret(0xBB355215), // -2.7667332906e-3f\n Ox1p127f = reinterpret(0x7F000000);\n var hx = reinterpret(x);\n var sign_ = (hx >> 31);\n hx &= 0x7FFFFFFF;\n if (hx >= 0x42AEAC50) {\n if (hx >= 0x42B17218) {\n if (!sign_) return x * Ox1p127f;\n else if (hx >= 0x42CFF1B5) return 0;\n }\n }\n var hi: f32, lo: f32;\n var k: i32;\n if (hx > 0x3EB17218) {\n if (hx > 0x3F851592) {\n k = (invln2 * x + builtin_copysign(0.5, x));\n } else {\n k = 1 - (sign_ << 1);\n }\n hi = x - k * ln2hi;\n lo = k * ln2lo;\n x = hi - lo;\n } else if (hx > 0x39000000) {\n k = 0;\n hi = x;\n lo = 0;\n } else {\n return 1 + x;\n }\n var xx = x * x;\n var c = x - xx * (P1 + xx * P2);\n var y: f32 = 1 + (x * c / (2 - c) - lo + hi);\n if (k == 0) return y;\n return scalbn(y, k);\n }\n\n export function expm1(x: f32): f32 { // see: musl/src/math/expm1f.c and SUN COPYRIGHT NOTICE above\n const\n o_threshold = reinterpret(0x42B17180), // 8.8721679688e+01f\n ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01f\n ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06f\n invln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+00f\n Q1 = reinterpret(0xBD088868), // -3.3333212137e-02f\n Q2 = reinterpret(0x3ACF3010), // 1.5807170421e-03f\n Ox1p127f = reinterpret(0x7F000000);\n var u = reinterpret(x);\n var hx = u & 0x7FFFFFFF;\n var sign_ = (u >> 31);\n if (hx >= 0x4195B844) {\n if (hx > 0x7F800000) return x;\n if (sign_) return -1;\n if (x > o_threshold) {\n x *= Ox1p127f;\n return x;\n }\n }\n var c: f32 = 0.0, t: f32, k: i32;\n if (hx > 0x3EB17218) {\n k = select(\n 1 - (sign_ << 1),\n (invln2 * x + builtin_copysign(0.5, x)),\n hx < 0x3F851592\n );\n t = k;\n let hi = x - t * ln2_hi;\n let lo = t * ln2_lo;\n x = hi - lo;\n c = (hi - x) - lo;\n } else if (hx < 0x33000000) {\n return x;\n } else k = 0;\n var hfx: f32 = 0.5 * x;\n var hxs: f32 = x * hfx;\n var r1: f32 = 1.0 + hxs * (Q1 + hxs * Q2);\n t = 3.0 - r1 * hfx;\n var e = hxs * ((r1 - t) / (6.0 - x * t));\n if (k == 0) return x - (x * e - hxs);\n e = x * (e - c) - c;\n e -= hxs;\n if (k == -1) return 0.5 * (x - e) - 0.5;\n if (k == 1) {\n if (x < -0.25) return -2.0 * (e - (x + 0.5));\n return 1.0 + 2.0 * (x - e);\n }\n u = (0x7F + k) << 23;\n var twopk = reinterpret(u);\n var y: f32;\n if (k < 0 || k > 56) {\n y = x - e + 1.0;\n if (k == 128) y = y * 2.0 * Ox1p127f;\n else y = y * twopk;\n return y - 1.0;\n }\n u = (0x7F - k) << 23;\n y = reinterpret(u);\n if (k < 20) y = (1 - y) - e;\n else y = 1 - (e + y);\n return (x + y) * twopk;\n }\n\n @inline\n export function fround(x: f32): f32 {\n return x;\n }\n\n export function hypot(x: f32, y: f32): f32 { // see: musl/src/math/hypotf.c\n const\n Ox1p90f = reinterpret(0x6C800000),\n Ox1p_90f = reinterpret(0x12800000);\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n ux &= 0x7FFFFFFF;\n uy &= 0x7FFFFFFF;\n if (ux < uy) {\n let ut = ux;\n ux = uy;\n uy = ut;\n }\n x = reinterpret(ux);\n y = reinterpret(uy);\n if (uy == 0xFF << 23) return y;\n if (ux >= 0xFF << 23 || uy == 0 || ux - uy >= 25 << 23) return x + y;\n var z: f32 = 1;\n if (ux >= (0x7F + 60) << 23) {\n z = Ox1p90f;\n x *= Ox1p_90f;\n y *= Ox1p_90f;\n } else if (uy < (0x7F - 60) << 23) {\n z = Ox1p_90f;\n x *= Ox1p90f;\n y *= Ox1p90f;\n }\n return z * builtin_sqrt((x * x + y * y));\n }\n\n @inline\n export function imul(x: f32, y: f32): f32 {\n /*\n * Wasm (MVP) and JS have different approaches for double->int conversions.\n *\n * For emulate JS conversion behavior and avoid trapping from wasm we should modulate by MAX_INT\n * our float-point arguments before actual convertion to integers.\n */\n if (!isFinite(x + y)) return 0;\n const inv32 = 1.0 / 4294967296;\n return (\n (x - 4294967296 * builtin_floor(x * inv32)) *\n (y - 4294967296 * builtin_floor(y * inv32))\n );\n }\n\n export function log(x: f32): f32 { // see: musl/src/math/logf.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01f\n ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06f\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f\n Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f\n Ox1p25f = reinterpret(0x4C000000);\n var u = reinterpret(x);\n var k = 0;\n if (u < 0x00800000 || (u >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (u >> 31) return (x - x) / 0;\n k -= 25;\n x *= Ox1p25f;\n u = reinterpret(x);\n } else if (u >= 0x7F800000) return x;\n else if (u == 0x3F800000) return 0;\n u += 0x3F800000 - 0x3F3504F3;\n k += (u >> 23) - 0x7F;\n u = (u & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret(u);\n var f = x - 1.0;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq = 0.5 * f * f;\n var dk = k;\n return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi;\n }\n\n export function log10(x: f32): f32 { // see: musl/src/math/log10f.c and SUN COPYRIGHT NOTICE above\n const\n ivln10hi = reinterpret(0x3EDE6000), // 4.3432617188e-01f\n ivln10lo = reinterpret(0xB804EAD9), // -3.1689971365e-05f\n log10_2hi = reinterpret(0x3E9A2080), // 3.0102920532e-01f\n log10_2lo = reinterpret(0x355427DB), // 7.9034151668e-07f\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f, 0.24279078841f\n Ox1p25f = reinterpret(0x4C000000);\n var ix = reinterpret(x);\n var k = 0;\n if (ix < 0x00800000 || (ix >> 31)) {\n if (ix << 1 == 0) return -1 / (x * x);\n if (ix >> 31) return (x - x) / 0.0;\n k -= 25;\n x *= Ox1p25f;\n ix = reinterpret(x);\n } else if (ix >= 0x7F800000) return x;\n else if (ix == 0x3F800000) return 0;\n ix += 0x3F800000 - 0x3F3504F3;\n k += (ix >> 23) - 0x7F;\n ix = (ix & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret(ix);\n var f = x - 1.0;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq: f32 = 0.5 * f * f;\n var hi = f - hfsq;\n ix = reinterpret(hi);\n ix &= 0xFFFFF000;\n hi = reinterpret(ix);\n var lo = f - hi - hfsq + s * (hfsq + r);\n var dk = k;\n return dk * log10_2lo + (lo + hi) * ivln10lo + lo * ivln10hi + hi * ivln10hi + dk * log10_2hi;\n }\n\n export function log1p(x: f32): f32 { // see: musl/src/math/log1pf.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01\n ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret(0x3E789E26); // 0xf89e26.0p-26f, 0.24279078841f\n var ix = reinterpret(x);\n var c: f32 = 0, f: f32 = 0;\n var k: i32 = 1;\n if (ix < 0x3ED413D0 || (ix >> 31)) {\n if (ix >= 0xBF800000) {\n if (x == -1) return x / 0.0;\n return (x - x) / 0.0;\n }\n if (ix << 1 < 0x33800000 << 1) return x;\n if (ix <= 0xBE95F619) {\n k = 0;\n c = 0;\n f = x;\n }\n } else if (ix >= 0x7F800000) return x;\n if (k) {\n let uf: f32 = 1 + x;\n let iu = reinterpret(uf);\n iu += 0x3F800000 - 0x3F3504F3;\n k = (iu >> 23) - 0x7F;\n if (k < 25) {\n c = k >= 2 ? 1 - (uf - x) : x - (uf - 1);\n c /= uf;\n } else c = 0;\n iu = (iu & 0x007FFFFF) + 0x3F3504F3;\n f = reinterpret(iu) - 1;\n }\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq: f32 = 0.5 * f * f;\n var dk = k;\n return s * (hfsq + r) + (dk * ln2_lo + c) - hfsq + f + dk * ln2_hi;\n }\n\n export function log2(x: f32): f32 { // see: musl/src/math/log2f.c and SUN COPYRIGHT NOTICE above\n const\n ivln2hi = reinterpret(0x3FB8B000), // 1.4428710938e+00f\n ivln2lo = reinterpret(0xB9389AD4), // -1.7605285393e-04\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f, 0.24279078841f\n Ox1p25f = reinterpret(0x4C000000);\n var ix = reinterpret(x);\n var k: i32 = 0;\n if (ix < 0x00800000 || (ix >> 31)) {\n if (ix << 1 == 0) return -1 / (x * x);\n if (ix >> 31) return (x - x) / 0.0;\n k -= 25;\n x *= Ox1p25f;\n ix = reinterpret(x);\n } else if (ix >= 0x7F800000) return x;\n else if (ix == 0x3F800000) return 0;\n ix += 0x3F800000 - 0x3F3504F3;\n k += (ix >> 23) - 0x7F;\n ix = (ix & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret(ix);\n var f = x - 1.0;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq: f32 = 0.5 * f * f;\n var hi = f - hfsq;\n var u = reinterpret(hi);\n u &= 0xFFFFF000;\n hi = reinterpret(u);\n var lo: f32 = f - hi - hfsq + s * (hfsq + r);\n var dk = k;\n return (lo + hi) * ivln2lo + lo * ivln2hi + hi * ivln2hi + dk;\n }\n\n @inline\n export function max(value1: f32, value2: f32): f32 {\n return builtin_max(value1, value2);\n }\n\n @inline\n export function min(value1: f32, value2: f32): f32 {\n return builtin_min(value1, value2);\n }\n\n export function pow(x: f32, y: f32): f32 { // see: musl/src/math/powf.c and SUN COPYRIGHT NOTICE above\n const\n dp_h1 = reinterpret(0x3F15C000), // 5.84960938e-01f\n dp_l1 = reinterpret(0x35D1CFDC), // 1.56322085e-06f\n two24 = reinterpret(0x4B800000), // 16777216f\n huge = reinterpret(0x7149F2CA), // 1.0e+30f\n tiny = reinterpret(0x0DA24260), // 1.0e-30f\n L1 = reinterpret(0x3F19999A), // 6.0000002384e-01f\n L2 = reinterpret(0x3EDB6DB7), // 4.2857143283e-01f\n L3 = reinterpret(0x3EAAAAAB), // 3.3333334327e-01f\n L4 = reinterpret(0x3E8BA305), // 2.7272811532e-01f\n L5 = reinterpret(0x3E6C3255), // 2.3066075146e-01f\n L6 = reinterpret(0x3E53F142), // 2.0697501302e-01f\n P1 = reinterpret(0x3E2AAAAB), // 1.6666667163e-01f\n P2 = reinterpret(0xBB360B61), // -2.7777778450e-03f\n P3 = reinterpret(0x388AB355), // 6.6137559770e-05f\n P4 = reinterpret(0xB5DDEA0E), // -1.6533901999e-06f\n P5 = reinterpret(0x3331BB4C), // 4.1381369442e-08f\n lg2 = reinterpret(0x3F317218), // 6.9314718246e-01f\n lg2_h = reinterpret(0x3F317200), // 6.93145752e-01f\n lg2_l = reinterpret(0x35BFBE8C), // 1.42860654e-06f\n ovt = reinterpret(0x3338AA3C), // 4.2995665694e-08f\n cp = reinterpret(0x3F76384F), // 9.6179670095e-01\n cp_h = reinterpret(0x3F764000), // 9.6191406250e-01\n cp_l = reinterpret(0xB8F623C6), // -1.1736857402e-04\n ivln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+00\n ivln2_h = reinterpret(0x3FB8AA00), // 1.4426879883e+00\n ivln2_l = reinterpret(0x36ECA570), // 7.0526075433e-06\n inv3 = reinterpret(0x3EAAAAAB); // 0.333333333333\n var hx = reinterpret(x);\n var hy = reinterpret(y);\n var ix = hx & 0x7FFFFFFF;\n var iy = hy & 0x7FFFFFFF;\n if (iy == 0) return 1.0; // x**0 = 1, even if x is NaN\n // if (hx == 0x3F800000) return 1.0; // C: 1**y = 1, even if y is NaN, JS: NaN\n if (ix > 0x7F800000 || iy > 0x7F800000) return x + y; // NaN if either arg is NaN\n var yisint = 0, j: i32, k: i32;\n if (hx < 0) {\n if (iy >= 0x4B800000) yisint = 2;\n else if (iy >= 0x3F800000) {\n k = (iy >> 23) - 0x7F;\n let ki = 23 - k;\n j = iy >> ki;\n if ((j << ki) == iy) yisint = 2 - (j & 1);\n }\n }\n if (iy == 0x7F800000) { // y is +-inf\n if (ix == 0x3F800000) return NaN; // C: (-1)**+-inf is 1, JS: NaN\n else if (ix > 0x3F800000) return hy >= 0 ? y : 0.0; // (|x|>1)**+-inf = inf,0\n else return hy >= 0 ? 0.0 : -y; // (|x|<1)**+-inf = 0,inf\n }\n if (iy == 0x3F800000) return hy >= 0 ? x : 1.0 / x;\n if (hy == 0x40000000) return x * x;\n if (hy == 0x3F000000) {\n if (hx >= 0) return builtin_sqrt(x);\n }\n var ax = builtin_abs(x);\n var z: f32;\n if (ix == 0x7F800000 || ix == 0 || ix == 0x3F800000) {\n z = ax;\n if (hy < 0) z = 1.0 / z;\n if (hx < 0) {\n if (((ix - 0x3F800000) | yisint) == 0) {\n let d = z - z;\n z = d / d;\n }\n else if (yisint == 1) z = -z;\n }\n return z;\n }\n var sn = 1.0;\n if (hx < 0) {\n if (yisint == 0) {\n let d = x - x;\n return d / d;\n }\n if (yisint == 1) sn = -1.0;\n }\n var t1: f32, t2: f32, r: f32, s: f32, t: f32, u: f32, v: f32, w: f32, p_h: f32, p_l: f32;\n var n: i32, is: i32;\n if (iy > 0x4D000000) {\n if (ix < 0x3F7FFFF8) return hy < 0 ? sn * huge * huge : sn * tiny * tiny;\n if (ix > 0x3F800007) return hy > 0 ? sn * huge * huge : sn * tiny * tiny;\n t = ax - 1;\n w = (t * t) * (0.5 - t * (inv3 - t * 0.25));\n u = ivln2_h * t;\n v = t * ivln2_l - w * ivln2;\n t1 = u + v;\n is = reinterpret(t1);\n t1 = reinterpret(is & 0xFFFFF000);\n t2 = v - (t1 - u);\n } else {\n let s2: f32, s_h: f32, s_l: f32, t_h: f32, t_l: f32;\n n = 0;\n if (ix < 0x00800000) {\n ax *= two24;\n n -= 24;\n ix = reinterpret(ax);\n }\n n += (ix >> 23) - 0x7F;\n j = ix & 0x007FFFFF;\n ix = j | 0x3F800000;\n if (j <= 0x1CC471) k = 0;\n else if (j < 0x5DB3D7) k = 1;\n else {\n k = 0;\n n += 1;\n ix -= 0x00800000;\n }\n ax = reinterpret(ix);\n let bp = select(1.5, 1.0, k); // k ? 1.5 : 1.0\n u = ax - bp;\n v = 1.0 / (ax + bp);\n s = u * v;\n s_h = s;\n is = reinterpret(s_h);\n s_h = reinterpret(is & 0xFFFFF000);\n is = ((ix >> 1) & 0xFFFFF000) | 0x20000000;\n t_h = reinterpret(is + 0x00400000 + (k << 21));\n t_l = ax - (t_h - bp);\n s_l = v * ((u - s_h * t_h) - s_h * t_l);\n s2 = s * s;\n r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6)))));\n r += s_l * (s_h + s);\n s2 = s_h * s_h;\n t_h = 3.0 + s2 + r;\n is = reinterpret(t_h);\n t_h = reinterpret(is & 0xFFFFF000);\n t_l = r - ((t_h - 3.0) - s2);\n u = s_h * t_h;\n v = s_l * t_h + t_l * s;\n p_h = u + v;\n is = reinterpret(p_h);\n p_h = reinterpret(is & 0xFFFFF000);\n p_l = v - (p_h - u);\n let z_h = cp_h * p_h;\n let dp_l = select(dp_l1, 0.0, k);\n let z_l = cp_l * p_h + p_l * cp + dp_l;\n t = n;\n let dp_h = select(dp_h1, 0.0, k);\n t1 = (((z_h + z_l) + dp_h) + t);\n is = reinterpret(t1);\n t1 = reinterpret(is & 0xFFFFF000);\n t2 = z_l - (((t1 - t) - dp_h) - z_h);\n }\n is = reinterpret(y);\n var y1 = reinterpret(is & 0xFFFFF000);\n p_l = (y - y1) * t1 + y * t2;\n p_h = y1 * t1;\n z = p_l + p_h;\n j = reinterpret(z);\n if (j > 0x43000000) {\n return sn * huge * huge;\n } else if (j == 0x43000000) {\n if (p_l + ovt > z - p_h) return sn * huge * huge;\n } else if ((j & 0x7FFFFFFF) > 0x43160000) {\n return sn * tiny * tiny;\n } else if (j == 0xC3160000) {\n if (p_l <= z - p_h) return sn * tiny * tiny;\n }\n var i = j & 0x7FFFFFFF;\n k = (i >> 23) - 0x7F;\n n = 0;\n if (i > 0x3F000000) {\n n = j + (0x00800000 >> (k + 1));\n k = ((n & 0x7FFFFFFF) >> 23) - 0x7F;\n t = reinterpret(n & ~(0x007FFFFF >> k));\n n = ((n & 0x007FFFFF) | 0x00800000) >> (23 - k);\n if (j < 0) n = -n;\n p_h -= t;\n }\n t = p_l + p_h;\n is = reinterpret(t);\n t = reinterpret(is & 0xFFFF8000);\n u = t * lg2_h;\n v = (p_l - (t - p_h)) * lg2 + t * lg2_l;\n z = u + v;\n w = v - (z - u);\n t = z * z;\n t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));\n r = (z * t1) / (t1 - 2.0) - (w + z * w);\n z = 1.0 - (r - z);\n j = reinterpret(z);\n j += n << 23;\n if ((j >> 23) <= 0) z = scalbn(z, n);\n else z = reinterpret(j);\n return sn * z;\n }\n\n @inline\n export function seedRandom(value: i64): void {\n NativeMath.seedRandom(value);\n }\n\n // Using xoroshiro64starstar from http://xoshiro.di.unimi.it/xoroshiro64starstar.c\n export function random(): f32 {\n if (!random_seeded) throw new Error("PRNG must be seeded.");\n\n var s0 = random_state0_32;\n var s1 = random_state1_32;\n var r = rotl(s0 * 0x9E3779BB, 5) * 5;\n\n s1 ^= s0;\n random_state0_32 = rotl(s0, 26) ^ s1 ^ (s1 << 9);\n random_state1_32 = rotl(s1, 13);\n\n return reinterpret((r >> 9) | (127 << 23)) - 1.0;\n }\n\n @inline\n export function round(x: f32): f32 {\n return builtin_copysign(builtin_floor(x + 0.5), x);\n }\n\n @inline\n export function sign(x: f32): f32 {\n if (ASC_SHRINK_LEVEL > 0) {\n return builtin_abs(x) > 0 ? builtin_copysign(1, x) : x;\n } else {\n return x > 0 ? 1 : x < 0 ? -1 : x;\n }\n }\n\n @inline\n export function signbit(x: f32): bool {\n return ((reinterpret(x) >>> 31) & (x == x));\n }\n\n export function sin(x: f32): f32 { // TODO\n unreachable();\n return 0;\n }\n\n export function sinh(x: f32): f32 { // see: musl/src/math/sinhf.c\n var u = reinterpret(x) & 0x7FFFFFFF;\n var absx = reinterpret(u);\n var t: f32;\n var h = builtin_copysign(0.5, x);\n if (u < 0x42B17217) {\n t = expm1(absx);\n if (u < 0x3F800000) {\n if (u < 0x3F800000 - (12 << 23)) return x;\n return h * (2 * t - t * t / (t + 1));\n }\n return h * (t + t / (t + 1));\n }\n t = 2 * h * expo2f(absx);\n return t;\n }\n\n @inline\n export function sqrt(x: f32): f32 {\n return builtin_sqrt(x);\n }\n\n export function tan(x: f32): f32 { // TODO\n unreachable();\n return 0;\n }\n\n export function tanh(x: f32): f32 { // see: musl/src/math/tanhf.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFF;\n var y = reinterpret(u);\n var t: f32;\n if (u > 0x3F0C9F54) {\n if (u > 0x41200000) t = 1 + 0 / y;\n else {\n t = expm1(2 * y);\n t = 1 - 2 / (t + 2);\n }\n } else if (u > 0x3E82C578) {\n t = expm1(2 * y);\n t = t / (t + 2);\n } else if (u >= 0x00800000) {\n t = expm1(-2 * y);\n t = -t / (t + 2);\n } else t = y;\n return builtin_copysign(t, x);\n }\n\n @inline\n export function trunc(x: f32): f32 {\n return builtin_trunc(x);\n }\n\n export function scalbn(x: f32, n: i32): f32 { // see: https://git.musl-libc.org/cgit/musl/tree/src/math/scalbnf.c\n const\n Ox1p24f = reinterpret(0x4B800000),\n Ox1p127f = reinterpret(0x7F000000),\n Ox1p_126f = reinterpret(0x00800000);\n var y = x;\n if (n > 127) {\n y *= Ox1p127f;\n n -= 127;\n if (n > 127) {\n y *= Ox1p127f;\n n = builtin_min(n - 127, 127);\n }\n } else if (n < -126) {\n y *= Ox1p_126f * Ox1p24f;\n n += 126 - 24;\n if (n < -126) {\n y *= Ox1p_126f * Ox1p24f;\n n = builtin_max(n + 126 - 24, -126);\n }\n }\n return y * reinterpret((0x7F + n) << 23);\n }\n\n export function mod(x: f32, y: f32): f32 { // see: musl/src/math/fmodf.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 23 & 0xFF);\n var ey = (uy >> 23 & 0xFF);\n var sx = ux & 0x80000000;\n var uy1 = uy << 1;\n if (uy1 == 0 || ex == 0xFF || isNaN(y)) {\n let m = x * y;\n return m / m;\n }\n var ux1 = ux << 1;\n if (ux1 <= uy1) {\n if (ux1 == uy1) return 0 * x;\n return x;\n }\n if (!ex) {\n ex -= builtin_clz(ux << 9);\n ux <<= -ex + 1;\n } else {\n ux &= -1 >> 9;\n ux |= 1 << 23;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 9);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 9;\n uy |= 1 << 23;\n }\n while (ex > ey) {\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n ux <<= 1;\n --ex;\n }\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n // for (; !(ux >> 23); ux <<= 1) --ex;\n var shift = builtin_clz(ux << 8);\n ex -= shift;\n ux <<= shift;\n if (ex > 0) {\n ux -= 1 << 23;\n ux |= ex << 23;\n } else {\n ux >>= -ex + 1;\n }\n ux |= sx;\n return reinterpret(ux);\n }\n\n export function rem(x: f32, y: f32): f32 { // see: musl/src/math/remquof.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 23 & 0xFF);\n var ey = (uy >> 23 & 0xFF);\n var sx = (ux >> 31);\n var uxi = ux;\n if (uy << 1 == 0 || ex == 0xFF || isNaN(y)) return (x * y) / (x * y);\n if (ux << 1 == 0) return x;\n if (!ex) {\n ex -= builtin_clz(uxi << 9);\n uxi <<= -ex + 1;\n } else {\n uxi &= -1 >> 9;\n uxi |= 1 << 23;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 9);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 9;\n uy |= 1 << 23;\n }\n var q = 0;\n do {\n if (ex < ey) {\n if (ex + 1 == ey) break; // goto end\n return x;\n }\n while (ex > ey) {\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n uxi <<= 1;\n q <<= 1;\n --ex;\n }\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n if (uxi == 0) ex = -30;\n else {\n let shift = builtin_clz(uxi << 8);\n ex -= shift;\n uxi <<= shift;\n }\n break;\n } while (false);\n // end\n if (ex > 0) {\n uxi -= 1 << 23;\n uxi |= ex << 23;\n } else {\n uxi >>= -ex + 1;\n }\n x = reinterpret(uxi);\n y = builtin_abs(y);\n var x2 = x + x;\n if (ex == ey || (ex + 1 == ey && (x2 > y || (x2 == y && (q & 1))))) {\n x -= y;\n // q++;\n }\n return sx ? -x : x;\n }\n}\n\nexport function ipow32(x: i32, e: i32): i32 {\n var out = 1;\n if (ASC_SHRINK_LEVEL < 1) {\n if (e < 0) return 0;\n\n switch (e) {\n case 0: return 1;\n case 1: return x;\n case 2: return x * x;\n }\n\n let log = 32 - clz(e);\n if (log <= 5) {\n // 32 = 2 ^ 5, so need only five cases.\n // But some extra cases needs for properly overflowing\n switch (log) {\n case 5: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 4: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 3: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 2: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 1: {\n if (e & 1) out *= x;\n }\n }\n return out;\n }\n }\n\n while (e > 0) {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n return out;\n}\n\nexport function ipow64(x: i64, e: i32): i64 {\n var out: i64 = 1;\n if (ASC_SHRINK_LEVEL < 1) {\n if (e < 0) return 0;\n switch (e) {\n case 0: return 1;\n case 1: return x;\n case 2: return x * x;\n }\n\n let log = 32 - clz(e);\n if (log <= 6) {\n // 64 = 2 ^ 6, so need only six cases.\n // But some extra cases needs for properly overflowing\n switch (log) {\n case 6: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 5: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 4: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 3: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 2: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 1: {\n if (e & 1) out *= x;\n }\n }\n return out;\n }\n }\n\n while (e > 0) {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n return out;\n}\n\nexport function ipow32f(x: f32, e: i32): f32 {\n var sign = e >> 31;\n e = (e + sign) ^ sign; // abs(e)\n var out: f32 = 1;\n while (e) {\n out *= select(x, 1.0, e & 1);\n e >>= 1;\n x *= x;\n }\n return sign ? 1.0 / out : out;\n}\n\nexport function ipow64f(x: f64, e: i32): f64 {\n var sign = e >> 31;\n e = (e + sign) ^ sign; // abs(e)\n var out = 1.0;\n while (e) {\n out *= select(x, 1.0, e & 1);\n e >>= 1;\n x *= x;\n }\n return sign ? 1.0 / out : out;\n}\n',memory:'import { memcmp, memmove, memset } from "./internal/memory";\n\n@builtin export declare const HEAP_BASE: usize; // tslint:disable-line\n\n/* tslint:disable */\n\nexport namespace memory {\n\n @builtin export declare function size(): i32;\n\n @builtin export declare function grow(pages: i32): i32;\n\n @builtin @inline\n export function fill(dest: usize, c: u8, n: usize): void { // see: musl/src/string/memset\n memset(dest, c, n); // fallback if "bulk-memory" isn\'t enabled\n }\n\n @builtin @inline\n export function copy(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memmove.c\n memmove(dest, src, n); // fallback if "bulk-memory" isn\'t enabled\n }\n\n @inline export function compare(vl: usize, vr: usize, n: usize): i32 { // see: musl/src/string/memcmp.c\n return memcmp(vl, vr, n);\n }\n\n // Passive segments\n\n // export function init(segmentIndex: u32, srcOffset: usize, dstOffset: usize, n: usize): void {\n // __memory_init(segmentIndex, srcOffset, dstOffset);\n // }\n\n // export function drop(segmentIndex: u32): void {\n // __memory_drop(segmentIndex);\n // }\n\n // Allocator\n\n @inline export function allocate(size: usize): usize {\n if (isDefined(__memory_allocate)) return __memory_allocate(size);\n WARNING("Calling \'memory.allocate\' requires a memory manager to be present.");\n return unreachable();\n }\n\n @inline export function free(ptr: usize): void {\n if (isDefined(__memory_free)) { __memory_free(ptr); return; }\n WARNING("Calling \'memory.free\' requires a memory manager to be present.");\n unreachable();\n }\n\n @inline export function reset(): void {\n if (isDefined(__memory_reset)) { __memory_reset(); return; }\n unreachable();\n }\n}\n',number:'import {\n itoa,\n dtoa\n} from "./internal/number";\n\nimport {\n isNaN as builtin_isNaN,\n isFinite as builtin_isFinite\n} from "./builtins";\n\n@sealed\nexport abstract class I8 {\n\n @lazy static readonly MIN_VALUE: i8 = i8.MIN_VALUE;\n @lazy static readonly MAX_VALUE: i8 = i8.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i8 {\n return parseI32(value, radix);\n }\n\n toString(this: i8): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class I16 {\n\n @lazy static readonly MIN_VALUE: i16 = i16.MIN_VALUE;\n @lazy static readonly MAX_VALUE: i16 = i16.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i16 {\n return parseI32(value, radix);\n }\n\n toString(this: i16): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class I32 {\n\n @lazy static readonly MIN_VALUE: i32 = i32.MIN_VALUE;\n @lazy static readonly MAX_VALUE: i32 = i32.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i32 {\n return parseI32(value, radix);\n }\n\n toString(this: i32): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class I64 {\n\n @lazy static readonly MIN_VALUE: i64 = i64.MIN_VALUE;\n @lazy static readonly MAX_VALUE: i64 = i64.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i64 {\n return parseI64(value, radix);\n }\n\n toString(this: i64): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class Isize {\n\n @lazy static readonly MIN_VALUE: isize = isize.MIN_VALUE;\n @lazy static readonly MAX_VALUE: isize = isize.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): isize {\n return parseI64(value, radix);\n }\n\n toString(this: isize): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U8 {\n\n @lazy static readonly MIN_VALUE: u8 = u8.MIN_VALUE;\n @lazy static readonly MAX_VALUE: u8 = u8.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u8 {\n return parseI32(value, radix);\n }\n\n toString(this: u8): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U16 {\n\n @lazy static readonly MIN_VALUE: u16 = u16.MIN_VALUE;\n @lazy static readonly MAX_VALUE: u16 = u16.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u16 {\n return parseI32(value, radix);\n }\n\n toString(this: u16): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U32 {\n\n @lazy static readonly MIN_VALUE: u32 = u32.MIN_VALUE;\n @lazy static readonly MAX_VALUE: u32 = u32.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u32 {\n return parseI32(value, radix);\n }\n\n toString(this: u32): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U64 {\n\n @lazy static readonly MIN_VALUE: u64 = u64.MIN_VALUE;\n @lazy static readonly MAX_VALUE: u64 = u64.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u64 {\n return parseI64(value, radix);\n }\n\n toString(this: u64): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class Usize {\n\n @lazy static readonly MIN_VALUE: usize = usize.MIN_VALUE;\n @lazy static readonly MAX_VALUE: usize = usize.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): usize {\n return parseI64(value, radix);\n }\n\n toString(this: usize): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class Bool {\n\n @lazy static readonly MIN_VALUE: bool = bool.MIN_VALUE;\n @lazy static readonly MAX_VALUE: bool = bool.MAX_VALUE;\n\n toString(this: bool): String {\n // TODO: radix?\n return this ? "true" : "false";\n }\n}\n\nexport { Bool as Boolean };\n\n@sealed\nexport abstract class F32 {\n\n @lazy static readonly EPSILON: f32 = f32.EPSILON;\n @lazy static readonly MIN_VALUE: f32 = f32.MIN_VALUE;\n @lazy static readonly MAX_VALUE: f32 = f32.MAX_VALUE;\n @lazy static readonly MIN_SAFE_INTEGER: f32 = f32.MIN_SAFE_INTEGER;\n @lazy static readonly MAX_SAFE_INTEGER: f32 = f32.MAX_SAFE_INTEGER;\n @lazy static readonly POSITIVE_INFINITY: f32 = Infinity;\n @lazy static readonly NEGATIVE_INFINITY: f32 = -Infinity;\n @lazy static readonly NaN: f32 = NaN;\n\n static isNaN(value: f32): bool {\n return isNaN(value);\n }\n\n static isFinite(value: f32): bool {\n return isFinite(value);\n }\n\n static isSafeInteger(value: f32): bool {\n return abs(value) <= f32.MAX_SAFE_INTEGER && trunc(value) == value;\n }\n\n static isInteger(value: f32): bool {\n return isFinite(value) && trunc(value) == value;\n }\n\n static parseInt(value: string, radix: i32 = 0): f32 {\n return parseI64(value, radix);\n }\n\n static parseFloat(value: string): f32 {\n return parseFloat(value);\n }\n\n toString(this: f32): String {\n // TODO: radix\n return dtoa(this);\n }\n}\n\n@sealed\nexport abstract class F64 {\n\n @lazy static readonly EPSILON: f64 = f64.EPSILON;\n @lazy static readonly MIN_VALUE: f64 = f64.MIN_VALUE;\n @lazy static readonly MAX_VALUE: f64 = f64.MAX_VALUE;\n @lazy static readonly MIN_SAFE_INTEGER: f64 = f64.MIN_SAFE_INTEGER;\n @lazy static readonly MAX_SAFE_INTEGER: f64 = f64.MAX_SAFE_INTEGER;\n @lazy static readonly POSITIVE_INFINITY: f64 = Infinity;\n @lazy static readonly NEGATIVE_INFINITY: f64 = -Infinity;\n @lazy static readonly NaN: f64 = NaN;\n\n static isNaN(value: f64): bool {\n return builtin_isNaN(value);\n }\n\n static isFinite(value: f64): bool {\n return builtin_isFinite(value);\n }\n\n static isSafeInteger(value: f64): bool {\n return abs(value) <= f64.MAX_SAFE_INTEGER && trunc(value) == value;\n }\n\n static isInteger(value: f64): bool {\n return builtin_isFinite(value) && trunc(value) == value;\n }\n\n static parseInt(value: string, radix: i32 = 0): f64 {\n return parseI64(value, radix);\n }\n\n static parseFloat(value: string): f64 {\n return parseFloat(value);\n }\n\n toString(this: f64): String {\n // TODO: radix\n return dtoa(this);\n }\n}\n\nexport { F64 as Number };\n',polyfills:"export function bswap(value: T): T {\n if (isInteger()) {\n if (sizeof() == 2) {\n return ((value << 8) | ((value >> 8) & 0x00FF));\n }\n if (sizeof() == 4) {\n return (\n rotl(value & 0xFF00FF00, 8) |\n rotr(value & 0x00FF00FF, 8)\n );\n }\n if (sizeof() == 8) {\n let a = (value >> 8) & 0x00FF00FF00FF00FF;\n let b = (value & 0x00FF00FF00FF00FF) << 8;\n let v = a | b;\n\n a = (v >> 16) & 0x0000FFFF0000FFFF;\n b = (v & 0x0000FFFF0000FFFF) << 16;\n\n return rotr(a | b, 32);\n }\n return value;\n }\n assert(false);\n return value;\n}\n\n@inline\nexport function bswap16(value: T): T {\n if (isInteger() && sizeof() <= 4) {\n if (sizeof() == 2) {\n return ((value << 8) | ((value >> 8) & 0x00FF));\n } else if (sizeof() == 4) {\n return (((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000));\n }\n return value;\n }\n assert(false);\n return value;\n}\n",regexp:'export class RegExp {\n\n // @binding(CALL_NEW, [ STRING, STRING], OBJECT_HANDLE)\n constructor(pattern: string, flags: string = "") { throw new Error("unreachable"); }\n\n // @binding(CALL_THIS, [ STRING ], PASS_THRU)\n test(search: string): bool { throw new Error("unreachable"); }\n\n // @binding(CALL_THIS, [], STRING)\n toString(): string { throw new Error("unreachable"); }\n\n}\n',set:'import {\n HEADER_SIZE as HEADER_SIZE_AB\n} from "./internal/arraybuffer";\n\nimport {\n HASH\n} from "./internal/hash";\n\n// A deterministic hash set based on CloseTable from https://github.com/jorendorff/dht\n\n@inline const INITIAL_CAPACITY = 4;\n@inline const FILL_FACTOR: f64 = 8 / 3;\n@inline const FREE_FACTOR: f64 = 3 / 4;\n\n/** Structure of a set entry. */\n@unmanaged class SetEntry {\n key: K;\n taggedNext: usize; // LSB=1 indicates EMPTY\n}\n\n/** Empty bit. */\n@inline const EMPTY: usize = 1 << 0;\n\n/** Size of a bucket. */\n@inline const BUCKET_SIZE = sizeof();\n\n/** Computes the alignment of an entry. */\n@inline function ENTRY_ALIGN(): usize {\n // can align to 4 instead of 8 if 32-bit and K is <= 32-bits\n const align = (sizeof() > sizeof() ? sizeof() : sizeof()) - 1;\n return align;\n}\n\n/** Computes the aligned size of an entry. */\n@inline function ENTRY_SIZE(): usize {\n const align = ENTRY_ALIGN();\n const size = (offsetof>() + align) & ~align;\n return size;\n}\n\nexport class Set {\n\n // buckets holding references to the respective first entry within\n private buckets: ArrayBuffer; // usize[bucketsMask + 1]\n private bucketsMask: u32;\n\n // entries in insertion order\n private entries: ArrayBuffer; // SetEntry[entriesCapacity]\n private entriesCapacity: i32;\n private entriesOffset: i32;\n private entriesCount: i32;\n\n get size(): i32 { return this.entriesCount; }\n\n constructor() { this.clear(); }\n\n clear(): void {\n const bucketsSize = INITIAL_CAPACITY * BUCKET_SIZE;\n this.buckets = new ArrayBuffer(bucketsSize);\n this.bucketsMask = INITIAL_CAPACITY - 1;\n const entriesSize = INITIAL_CAPACITY * ENTRY_SIZE();\n this.entries = new ArrayBuffer(entriesSize, true);\n this.entriesCapacity = INITIAL_CAPACITY;\n this.entriesOffset = 0;\n this.entriesCount = 0;\n }\n\n private find(key: K, hashCode: u32): SetEntry | null {\n var entry = load>(\n changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE,\n HEADER_SIZE_AB\n );\n while (entry) {\n if (!(entry.taggedNext & EMPTY) && entry.key == key) return entry;\n entry = changetype>(entry.taggedNext & ~EMPTY);\n }\n return null;\n }\n\n has(key: K): bool {\n return this.find(key, HASH(key)) !== null;\n }\n\n add(key: K): void {\n var hashCode = HASH(key);\n var entry = this.find(key, hashCode);\n if (!entry) {\n // check if rehashing is necessary\n if (this.entriesOffset == this.entriesCapacity) {\n this.rehash(\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ? this.bucketsMask // just rehash if 1/4+ entries are empty\n : (this.bucketsMask << 1) | 1 // grow capacity to next 2^N\n );\n }\n // append new entry\n let entries = this.entries;\n entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + this.entriesOffset++ * ENTRY_SIZE()\n );\n entry.key = key;\n ++this.entriesCount;\n // link with previous entry in bucket\n let bucketPtrBase = changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE;\n entry.taggedNext = load(bucketPtrBase, HEADER_SIZE_AB);\n store(bucketPtrBase, changetype(entry), HEADER_SIZE_AB);\n if (isManaged()) __gc_link(changetype(this), changetype(key)); // tslint:disable-line\n }\n }\n\n delete(key: K): bool {\n var entry = this.find(key, HASH(key));\n if (!entry) return false;\n entry.taggedNext |= EMPTY;\n --this.entriesCount;\n // check if rehashing is appropriate\n var halfBucketsMask = this.bucketsMask >> 1;\n if (\n halfBucketsMask + 1 >= max(INITIAL_CAPACITY, this.entriesCount) &&\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ) this.rehash(halfBucketsMask);\n return true;\n }\n\n private rehash(newBucketsMask: u32): void {\n var newBucketsCapacity = (newBucketsMask + 1);\n var newBuckets = new ArrayBuffer(newBucketsCapacity * BUCKET_SIZE);\n var newEntriesCapacity = (newBucketsCapacity * FILL_FACTOR);\n var newEntries = new ArrayBuffer(newEntriesCapacity * ENTRY_SIZE(), true);\n\n // copy old entries to new entries\n var oldPtr = changetype(this.entries) + HEADER_SIZE_AB;\n var oldEnd = oldPtr + this.entriesOffset * ENTRY_SIZE();\n var newPtr = changetype(newEntries) + HEADER_SIZE_AB;\n while (oldPtr != oldEnd) {\n let oldEntry = changetype>(oldPtr);\n if (!(oldEntry.taggedNext & EMPTY)) {\n let newEntry = changetype>(newPtr);\n newEntry.key = oldEntry.key;\n let newBucketIndex = HASH(oldEntry.key) & newBucketsMask;\n let newBucketPtrBase = changetype(newBuckets) + newBucketIndex * BUCKET_SIZE;\n newEntry.taggedNext = load(newBucketPtrBase, HEADER_SIZE_AB);\n store(newBucketPtrBase, newPtr, HEADER_SIZE_AB);\n newPtr += ENTRY_SIZE();\n }\n oldPtr += ENTRY_SIZE();\n }\n\n this.buckets = newBuckets;\n this.bucketsMask = newBucketsMask;\n this.entries = newEntries;\n this.entriesCapacity = newEntriesCapacity;\n this.entriesOffset = this.entriesCount;\n }\n\n toString(): string {\n return "[object Set]";\n }\n\n private __gc(): void {\n __gc_mark(changetype(this.buckets)); // tslint:disable-line\n var entries = this.entries;\n __gc_mark(changetype(entries)); // tslint:disable-line\n if (isManaged()) {\n let offset: usize = 0;\n let end: usize = this.entriesOffset * ENTRY_SIZE();\n while (offset < end) {\n let entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + offset * ENTRY_SIZE()\n );\n if (!(entry.taggedNext & EMPTY)) __gc_mark(changetype(entry.key)); // tslint:disable-line\n offset += ENTRY_SIZE();\n }\n }\n }\n}\n',string:'import {\n HEADER_SIZE,\n MAX_LENGTH,\n allocateUnsafe,\n compareUnsafe,\n repeatUnsafe,\n copyUnsafe,\n isWhiteSpaceOrLineTerminator,\n CharCode,\n parse\n} from "./internal/string";\n\nimport {\n STORE\n} from "./internal/arraybuffer";\n\n@sealed\nexport class String {\n\n readonly length: i32; // capped to [0, MAX_LENGTH]\n\n // TODO Add and handle second argument\n static fromCharCode(code: i32): String {\n var out = allocateUnsafe(1);\n store(\n changetype(out),\n code,\n HEADER_SIZE\n );\n return out;\n }\n\n static fromCodePoint(code: i32): String {\n assert(code <= 0x10FFFF);\n var sur = code > 0xFFFF;\n var out = allocateUnsafe(sur + 1);\n if (!sur) {\n store(\n changetype(out),\n code,\n HEADER_SIZE\n );\n } else {\n code -= 0x10000;\n let hi: u32 = (code >>> 10) + 0xD800;\n let lo: u32 = (code & 0x3FF) + 0xDC00;\n store(\n changetype(out),\n (hi << 16) | lo,\n HEADER_SIZE\n );\n }\n return out;\n }\n\n @operator("[]")\n charAt(pos: i32): String {\n assert(this !== null);\n\n if (pos >= this.length) return changetype("");\n\n var out = allocateUnsafe(1);\n store(\n changetype(out),\n load(\n changetype(this) + (pos << 1),\n HEADER_SIZE\n ),\n HEADER_SIZE\n );\n return out;\n }\n\n charCodeAt(pos: i32): i32 {\n assert(this !== null);\n if (pos >= this.length) return -1; // (NaN)\n\n return load(\n changetype(this) + (pos << 1),\n HEADER_SIZE\n );\n }\n\n codePointAt(pos: i32): i32 {\n assert(this !== null);\n if (pos >= this.length) return -1; // (undefined)\n\n var first = load(\n changetype(this) + (pos << 1),\n HEADER_SIZE\n );\n if (first < 0xD800 || first > 0xDBFF || pos + 1 == this.length) {\n return first;\n }\n var second = load(\n changetype(this) + ((pos + 1) << 1),\n HEADER_SIZE\n );\n if (second < 0xDC00 || second > 0xDFFF) return first;\n return ((first - 0xD800) << 10) + (second - 0xDC00) + 0x10000;\n }\n\n @operator("+")\n private static __concat(left: String, right: String): String {\n if (!changetype(left)) left = changetype("null");\n return left.concat(right);\n }\n\n concat(other: String): String {\n assert(this !== null);\n if (other === null) other = changetype("null");\n\n var thisLen: isize = this.length;\n var otherLen: isize = other.length;\n var outLen: usize = thisLen + otherLen;\n if (outLen == 0) return changetype("");\n var out = allocateUnsafe(outLen);\n copyUnsafe(out, 0, this, 0, thisLen);\n copyUnsafe(out, thisLen, other, 0, otherLen);\n return out;\n }\n\n endsWith(searchString: String, endPosition: i32 = MAX_LENGTH): bool {\n assert(this !== null);\n if (searchString === null) return false;\n var end = min(max(endPosition, 0), this.length);\n var searchLength: isize = searchString.length;\n var start: isize = end - searchLength;\n if (start < 0) return false;\n return !compareUnsafe(this, start, searchString, 0, searchLength);\n }\n\n @operator("==")\n private static __eq(left: String, right: String): bool {\n if (left === right) return true;\n if (left === null || right === null) return false;\n\n var leftLength = left.length;\n if (leftLength != right.length) return false;\n\n return !compareUnsafe(left, 0, right, 0, leftLength);\n }\n\n @operator("!=")\n private static __ne(left: String, right: String): bool {\n return !this.__eq(left, right);\n }\n\n @operator(">")\n private static __gt(left: String, right: String): bool {\n if (left === right || left === null || right === null) return false;\n\n var leftLength = left.length;\n var rightLength = right.length;\n\n if (!leftLength) return false;\n if (!rightLength) return true;\n\n var length = min(leftLength, rightLength);\n return compareUnsafe(left, 0, right, 0, length) > 0;\n }\n\n @operator(">=")\n private static __gte(left: String, right: String): bool {\n return !this.__lt(left, right);\n }\n\n @operator("<")\n private static __lt(left: String, right: String): bool {\n if (left === right || left === null || right === null) return false;\n\n var leftLength = left.length;\n var rightLength = right.length;\n\n if (!rightLength) return false;\n if (!leftLength) return true;\n\n var length = min(leftLength, rightLength);\n return compareUnsafe(left, 0, right, 0, length) < 0;\n }\n\n @operator("<=")\n private static __lte(left: String, right: String): bool {\n return !this.__gt(left, right);\n }\n\n @inline\n includes(searchString: String, position: i32 = 0): bool {\n return this.indexOf(searchString, position) != -1;\n }\n\n indexOf(searchString: String, fromIndex: i32 = 0): i32 {\n assert(this !== null);\n if (searchString === null) searchString = changetype("null");\n\n var searchLen: isize = searchString.length;\n if (!searchLen) return 0;\n var len: isize = this.length;\n if (!len) return -1;\n var start = min(max(fromIndex, 0), len);\n len -= searchLen;\n for (let k: isize = start; k <= len; ++k) {\n if (!compareUnsafe(this, k, searchString, 0, searchLen)) return k;\n }\n return -1;\n }\n\n lastIndexOf(searchString: String, fromIndex: i32 = i32.MAX_VALUE): i32 {\n assert(this !== null);\n if (searchString === null) searchString = changetype("null");\n\n var len: isize = this.length;\n var searchLen: isize = searchString.length;\n if (!searchLen) return len;\n if (!len) return -1;\n var start = min(max(fromIndex, 0), len - searchLen);\n for (let k = start; k >= 0; --k) {\n if (!compareUnsafe(this, k, searchString, 0, searchLen)) return k;\n }\n return -1;\n }\n\n startsWith(searchString: String, position: i32 = 0): bool {\n assert(this !== null);\n if (searchString === null) searchString = changetype("null");\n\n var pos: isize = position;\n var len: isize = this.length;\n var start = min(max(pos, 0), len);\n var searchLength: isize = searchString.length;\n if (searchLength + start > len) return false;\n return !compareUnsafe(this, start, searchString, 0, searchLength);\n }\n\n substr(start: i32, length: i32 = i32.MAX_VALUE): String {\n assert(this !== null);\n var intStart: isize = start;\n var end: isize = length;\n var size: isize = this.length;\n if (intStart < 0) intStart = max(size + intStart, 0);\n var resultLength = min(max(end, 0), size - intStart);\n if (resultLength <= 0) return changetype("");\n var out = allocateUnsafe(resultLength);\n copyUnsafe(out, 0, this, intStart, resultLength);\n return out;\n }\n\n substring(start: i32, end: i32 = i32.MAX_VALUE): String {\n assert(this !== null);\n var len = this.length;\n var finalStart = min(max(start, 0), len);\n var finalEnd = min(max(end, 0), len);\n var from = min(finalStart, finalEnd);\n var to = max(finalStart, finalEnd);\n len = to - from;\n if (!len) return changetype("");\n if (!from && to == this.length) return this;\n var out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, from, len);\n return out;\n }\n\n trim(): String {\n assert(this !== null);\n var length: usize = this.length;\n\n while (\n length &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (length << 1), HEADER_SIZE)\n )\n ) {\n --length;\n }\n var start: usize = 0;\n while (\n start < length &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (start << 1), HEADER_SIZE)\n )\n ) {\n ++start, --length;\n }\n if (!length) return changetype("");\n if (!start && length == this.length) return this;\n var out = allocateUnsafe(length);\n copyUnsafe(out, 0, this, start, length);\n return out;\n }\n\n @inline\n trimLeft(): String {\n return this.trimStart();\n }\n\n @inline\n trimRight(): String {\n return this.trimEnd();\n }\n\n trimStart(): String {\n assert(this !== null);\n var start: isize = 0;\n var len: isize = this.length;\n while (\n start < len &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (start << 1), HEADER_SIZE)\n )\n ) {\n ++start;\n }\n if (!start) return this;\n var outLen = len - start;\n if (!outLen) return changetype("");\n var out = allocateUnsafe(outLen);\n copyUnsafe(out, 0, this, start, outLen);\n return out;\n }\n\n trimEnd(): String {\n assert(this !== null);\n var len: isize = this.length;\n while (\n len > 0 &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (len << 1), HEADER_SIZE)\n )\n ) {\n --len;\n }\n if (len <= 0) return changetype("");\n if (len == this.length) return this;\n var out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, 0, len);\n return out;\n }\n\n padStart(targetLength: i32, padString: String = changetype(" ")): String {\n assert(this !== null);\n var length = this.length;\n var padLen = padString.length;\n if (targetLength < length || !padLen) return this;\n var len = targetLength - length;\n var out = allocateUnsafe(targetLength);\n if (len > padLen) {\n let count = (len - 1) / padLen;\n let base = count * padLen;\n let rest = len - base;\n repeatUnsafe(out, 0, padString, count);\n if (rest) copyUnsafe(out, base, padString, 0, rest);\n } else {\n copyUnsafe(out, 0, padString, 0, len);\n }\n if (length) copyUnsafe(out, len, this, 0, length);\n return out;\n }\n\n padEnd(targetLength: i32, padString: String = changetype(" ")): String {\n assert(this !== null);\n var length = this.length;\n var padLen = padString.length;\n if (targetLength < length || !padLen) return this;\n var len = targetLength - length;\n var out = allocateUnsafe(targetLength);\n if (length) copyUnsafe(out, 0, this, 0, length);\n if (len > padLen) {\n let count = (len - 1) / padLen;\n let base = count * padLen;\n let rest = len - base;\n repeatUnsafe(out, length, padString, count);\n if (rest) copyUnsafe(out, base + length, padString, 0, rest);\n } else {\n copyUnsafe(out, length, padString, 0, len);\n }\n return out;\n }\n\n repeat(count: i32 = 0): String {\n assert(this !== null);\n var length = this.length;\n\n // Most browsers can\'t handle strings 1 << 28 chars or longer\n if (count < 0 || length * count > (1 << 28)) {\n throw new RangeError("Invalid count value");\n }\n\n if (count == 0 || !length) return changetype("");\n if (count == 1) return this;\n\n var result = allocateUnsafe(length * count);\n repeatUnsafe(result, 0, this, count);\n return result;\n }\n\n slice(beginIndex: i32, endIndex: i32 = i32.MAX_VALUE): String {\n var length = this.length;\n var begin = (beginIndex < 0) ? max(beginIndex + length, 0) : min(beginIndex, length);\n var end = (endIndex < 0) ? max(endIndex + length, 0) : min(endIndex, length);\n var len = end - begin;\n if (len <= 0) return changetype("");\n var out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, begin, len);\n return out;\n }\n\n split(separator: String = null, limit: i32 = i32.MAX_VALUE): String[] {\n assert(this !== null);\n if (!limit) return new Array();\n if (separator === null) return [this];\n var length: isize = this.length;\n var sepLen: isize = separator.length;\n if (limit < 0) limit = i32.MAX_VALUE;\n if (!sepLen) {\n if (!length) return new Array();\n // split by chars\n length = min(length, limit);\n let result = new Array(length);\n let buffer = result.buffer_;\n for (let i: isize = 0; i < length; ++i) {\n let char = allocateUnsafe(1);\n store(\n changetype(char),\n load(\n changetype(this) + (i << 1),\n HEADER_SIZE\n ),\n HEADER_SIZE\n );\n STORE(buffer, i, char);\n }\n return result;\n } else if (!length) {\n let result = new Array(1);\n unchecked(result[0] = changetype(""));\n return result;\n }\n var result = new Array();\n var end = 0, start = 0, i = 0;\n while ((end = this.indexOf(separator, start)) != -1) {\n let len = end - start;\n if (len > 0) {\n let out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, start, len);\n result.push(out);\n } else {\n result.push(changetype(""));\n }\n if (++i == limit) return result;\n start = end + sepLen;\n }\n if (!start) {\n let result = new Array(1);\n unchecked(result[0] = this);\n return result;\n }\n var len = length - start;\n if (len > 0) {\n let out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, start, len);\n result.push(out);\n } else {\n result.push(changetype(""));\n }\n return result;\n }\n\n toString(): String {\n return this;\n }\n\n get lengthUTF8(): i32 {\n var len = 1; // null terminated\n var pos: usize = 0;\n var end = this.length;\n while (pos < end) {\n let c = load(changetype(this) + (pos << 1), HEADER_SIZE);\n if (c < 128) {\n len += 1; ++pos;\n } else if (c < 2048) {\n len += 2; ++pos;\n } else {\n if (\n (c & 0xFC00) == 0xD800 && pos + 1 < end &&\n (load(changetype(this) + ((pos + 1) << 1), HEADER_SIZE) & 0xFC00) == 0xDC00\n ) {\n len += 4; pos += 2;\n } else {\n len += 3; ++pos;\n }\n }\n }\n return len;\n }\n\n static fromUTF8(ptr: usize, len: usize): String {\n if (len < 1) return changetype("");\n var ptrPos = 0;\n var buf = memory.allocate(len << 1);\n var bufPos = 0;\n while (ptrPos < len) {\n let cp = load(ptr + ptrPos++);\n if (cp < 128) {\n store(buf + bufPos, cp);\n bufPos += 2;\n } else if (cp > 191 && cp < 224) {\n assert(ptrPos + 1 <= len);\n store(buf + bufPos, (cp & 31) << 6 | load(ptr + ptrPos++) & 63);\n bufPos += 2;\n } else if (cp > 239 && cp < 365) {\n assert(ptrPos + 3 <= len);\n cp = (\n (cp & 7) << 18 |\n (load(ptr + ptrPos++) & 63) << 12 |\n (load(ptr + ptrPos++) & 63) << 6 |\n load(ptr + ptrPos++) & 63\n ) - 0x10000;\n store(buf + bufPos, 0xD800 + (cp >> 10));\n bufPos += 2;\n store(buf + bufPos, 0xDC00 + (cp & 1023));\n bufPos += 2;\n } else {\n assert(ptrPos + 2 <= len);\n store(buf + bufPos,\n (cp & 15) << 12 |\n (load(ptr + ptrPos++) & 63) << 6 |\n load(ptr + ptrPos++) & 63\n );\n bufPos += 2;\n }\n }\n assert(ptrPos == len);\n var str = allocateUnsafe((bufPos >> 1));\n memory.copy(changetype(str) + HEADER_SIZE, buf, bufPos);\n memory.free(buf);\n return str;\n }\n\n toUTF8(): usize {\n var buf = memory.allocate(this.lengthUTF8);\n var pos: usize = 0;\n var end = this.length;\n var off: usize = 0;\n while (pos < end) {\n let c1 = load(changetype(this) + (pos << 1), HEADER_SIZE);\n if (c1 < 128) {\n store(buf + off, c1);\n ++off; ++pos;\n } else if (c1 < 2048) {\n let ptr = buf + off;\n store(ptr, c1 >> 6 | 192);\n store(ptr, c1 & 63 | 128, 1);\n off += 2; ++pos;\n } else {\n let ptr = buf + off;\n if ((c1 & 0xFC00) == 0xD800 && pos + 1 < end) {\n let c2 = load(changetype(this) + ((pos + 1) << 1), HEADER_SIZE);\n if ((c2 & 0xFC00) == 0xDC00) {\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\n store(ptr, c1 >> 18 | 240);\n store(ptr, c1 >> 12 & 63 | 128, 1);\n store(ptr, c1 >> 6 & 63 | 128, 2);\n store(ptr, c1 & 63 | 128, 3);\n off += 4; pos += 2;\n continue;\n }\n }\n store(ptr, c1 >> 12 | 224);\n store(ptr, c1 >> 6 & 63 | 128, 1);\n store(ptr, c1 & 63 | 128, 2);\n off += 3; ++pos;\n }\n }\n store(buf + off, 0);\n return buf;\n }\n}\n\nexport type string = String;\n\nexport function parseInt(str: String, radix: i32 = 0): f64 {\n return parse(str, radix);\n}\n\nexport function parseI32(str: String, radix: i32 = 0): i32 {\n return parse(str, radix);\n}\n\nexport function parseI64(str: String, radix: i32 = 0): i64 {\n return parse(str, radix);\n}\n\n// FIXME: naive implementation\nexport function parseFloat(str: String): f64 {\n var len: i32 = str.length;\n if (!len) return NaN;\n\n var ptr = changetype(str) /* + HEAD -> offset */;\n var code = load(ptr, HEADER_SIZE);\n\n // determine sign\n var sign: f64;\n if (code == CharCode.MINUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = 1;\n } else {\n sign = 1;\n }\n\n // calculate value\n var num: f64 = 0;\n while (len--) {\n code = load(ptr, HEADER_SIZE);\n if (code == CharCode.DOT) {\n ptr += 2;\n let fac: f64 = 0.1; // precision :(\n while (len--) {\n code = load(ptr, HEADER_SIZE);\n if (code == CharCode.E || code == CharCode.e) {\n assert(false); // TODO\n }\n code -= CharCode._0;\n if (code > 9) break;\n num += code * fac;\n fac *= 0.1;\n ptr += 2;\n }\n break;\n }\n code -= CharCode._0;\n if (code >= 10) break;\n num = (num * 10) + code;\n ptr += 2;\n }\n return sign * num;\n}\n',symbol:'import { Map } from "./map";\n\n@lazy var stringToId: Map;\n@lazy var idToString: Map;\n@lazy var nextId: usize = 12; // Symbol.unscopables + 1\n\n@unmanaged export class symbol {\n toString(): string {\n var id = changetype(this);\n var str = "";\n switch (id) {\n case 1: { str = "hasInstance"; break; }\n case 2: { str = "isConcatSpreadable"; break; }\n case 3: { str = "isRegExp"; break; }\n case 4: { str = "match"; break; }\n case 5: { str = "replace"; break; }\n case 6: { str = "search"; break; }\n case 7: { str = "species"; break; }\n case 8: { str = "split"; break; }\n case 9: { str = "toPrimitive"; break; }\n case 10: { str = "toStringTag"; break; }\n case 11: { str = "unscopables"; break; }\n default: {\n if (idToString !== null && idToString.has(id)) str = idToString.get(id);\n break;\n }\n }\n return "Symbol(" + str + ")";\n }\n}\n\nexport function Symbol(description: string | null = null): symbol {\n var id = nextId++;\n if (!id) unreachable(); // out of ids\n return changetype(id);\n}\n\nexport namespace Symbol {\n\n // well-known symbols\n @lazy export const hasInstance = changetype(1);\n @lazy export const isConcatSpreadable = changetype(2);\n @lazy export const isRegExp = changetype(3);\n @lazy export const iterator = changetype(3);\n @lazy export const match = changetype(4);\n @lazy export const replace = changetype(5);\n @lazy export const search = changetype(6);\n @lazy export const species = changetype(7);\n @lazy export const split = changetype(8);\n @lazy export const toPrimitive = changetype(9);\n @lazy export const toStringTag = changetype(10);\n @lazy export const unscopables = changetype(11);\n\n /* tslint:disable */// not valid TS\n export function for(key: string): symbol {\n if (!stringToId) { stringToId = new Map(); idToString = new Map(); }\n else if (stringToId.has(key)) return changetype(stringToId.get(key));\n var id = nextId++;\n if (!id) unreachable(); // out of ids\n stringToId.set(key, id);\n idToString.set(id, key);\n return changetype(id);\n }\n /* tslint:enable */\n\n export function keyFor(sym: symbol): string | null {\n return idToString !== null && idToString.has(changetype(sym))\n ? idToString.get(changetype(sym))\n : null;\n }\n}\n',table:"export namespace table {\n\n // export function copy(dst: u32, src: u32, n: u32): void {\n // __table_copy(dst, src, n);\n // }\n\n // Passive elements\n\n // export function init(elementIndex: u32, srcOffset: u32, dstOffset: u32, n: u32): void {\n // __table_init(elementIndex, srcOffset, dstOffset, n);\n // }\n\n // export function drop(elementIndex: u32): void {\n // __table_drop(elementIndex);\n // }\n}\n",typedarray:"import {\n TypedArray,\n FILL,\n SORT,\n SUBARRAY,\n REDUCE,\n REDUCE_RIGHT,\n MAP,\n FIND_INDEX,\n SOME,\n EVERY,\n} from \"./internal/typedarray\";\n\nimport {\n COMPARATOR\n} from \"./internal/sort\";\n\nexport class Int8Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int8Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i8, b: i8) => i32 = COMPARATOR()): Int8Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int8Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i8, index: i32, array: Int8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i8, index: i32, array: Int8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i8, index: i32, self: Int8Array) => i8): Int8Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i8, index: i32, self: Int8Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i8, index: i32, self: Int8Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i8, index: i32, self: Int8Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint8Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u8, b: u8) => i32 = COMPARATOR()): Uint8Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint8Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u8, index: i32, array: Uint8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u8, index: i32, array: Uint8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u8, index: i32, self: Uint8Array) => u8): Uint8Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u8, index: i32, self: Uint8Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u8, index: i32, self: Uint8Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u8, index: i32, self: Uint8Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint8ClampedArray extends Uint8Array {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n @inline @operator(\"[]=\")\n protected __set(index: i32, value: i32): void {\n super.__set(index, max(min(value, 255), 0));\n }\n\n @inline @operator(\"{}=\")\n protected __unchecked_set(index: i32, value: i32): void {\n super.__unchecked_set(index, max(min(value, 255), 0));\n }\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8ClampedArray {\n return changetype(super.fill(value, start, end)); // safe because '.fill' reuses 'this'\n }\n\n sort(comparator: (a: u8, b: u8) => i32 = COMPARATOR()): Uint8ClampedArray {\n return changetype(super.sort(comparator)); // safe because '.sort' reuses 'this'\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint8ClampedArray {\n return SUBARRAY(this, begin, end);\n }\n\n map(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => u8): Uint8ClampedArray {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Int16Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int16Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i16, b: i16) => i32 = COMPARATOR()): Int16Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int16Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i16, index: i32, array: Int16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i16, index: i32, array: Int16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i16, index: i32, self: Int16Array) => i16): Int16Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i16, index: i32, self: Int16Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i16, index: i32, self: Int16Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i16, index: i32, self: Int16Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint16Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint16Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u16, b: u16) => i32 = COMPARATOR()): Uint16Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint16Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u16, index: i32, array: Uint16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u16, index: i32, array: Uint16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u16, index: i32, self: Uint16Array) => u16): Uint16Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u16, index: i32, self: Uint16Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u16, index: i32, self: Uint16Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u16, index: i32, self: Uint16Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Int32Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int32Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i32, b: i32) => i32 = COMPARATOR()): Int32Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int32Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i32, index: i32, array: Int32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i32, index: i32, array: Int32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i32, index: i32, self: Int32Array) => i32): Int32Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i32, index: i32, self: Int32Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i32, index: i32, self: Int32Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i32, index: i32, self: Int32Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint32Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint32Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u32, b: u32) => i32 = COMPARATOR()): Uint32Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint32Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u32, index: i32, array: Uint32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u32, index: i32, array: Uint32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u32, index: i32, self: Uint32Array) => u32): Uint32Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u32, index: i32, self: Uint32Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u32, index: i32, self: Uint32Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u32, index: i32, self: Uint32Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Int64Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int64Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i64, b: i64) => i32 = COMPARATOR()): Int64Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int64Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i64, index: i32, array: Int64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i64, index: i32, array: Int64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i64, index: i32, self: Int64Array) => i64): Int64Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i64, index: i32, self: Int64Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i64, index: i32, self: Int64Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i64, index: i32, self: Int64Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint64Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint64Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u64, b: u64) => i32 = COMPARATOR()): Uint64Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint64Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u64, index: i32, array: Uint64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u64, index: i32, array: Uint64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u64, index: i32, self: Uint64Array) => u64): Uint64Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u64, index: i32, self: Uint64Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u64, index: i32, self: Uint64Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u64, index: i32, self: Uint64Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Float32Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: f32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Float32Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: f32, b: f32) => i32 = COMPARATOR()): Float32Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Float32Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: f32, index: i32, array: Float32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: f32, index: i32, array: Float32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: f32, index: i32, self: Float32Array) => f32): Float32Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: f32, index: i32, self: Float32Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: f32, index: i32, self: Float32Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: f32, index: i32, self: Float32Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Float64Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: f64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Float64Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: f64, b: f64) => i32 = COMPARATOR()): Float64Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Float64Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: f64, index: i32, array: Float64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: f64, index: i32, array: Float64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: f64, index: i32, self: Float64Array) => f64): Float64Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: f64, index: i32, self: Float64Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: f64, index: i32, self: Float64Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: f64, index: i32, self: Float64Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n",vector:"@sealed\nexport abstract class V128 {\n}\n"}):(()=>{const e=path.join(".","..","std","assembly"),n=__webpack_require__(!function(){var e=new Error("Cannot find module 'glob'");throw e.code="MODULE_NOT_FOUND",e}()).sync("**/!(*.d).ts",{cwd:e}),t={};return n.forEach(n=>t[n.replace(/\.ts$/,"")]=fs.readFileSync(path.join(e,n),"utf8")),t})(),exports.definitionFiles=exports.isBundle?Object({assembly:'/**\n * Environment definitions for compiling AssemblyScript to WebAssembly using asc.\n * @module std/assembly\n *//***/\n\n/// \n\n// Types\n\n/** An 8-bit signed integer. */\ndeclare type i8 = number;\n/** A 16-bit signed integer. */\ndeclare type i16 = number;\n/** A 32-bit signed integer. */\ndeclare type i32 = number;\n/** A 64-bit signed integer. */\ndeclare type i64 = number;\n/** A 32-bit signed integer when targeting 32-bit WebAssembly or a 64-bit signed integer when targeting 64-bit WebAssembly. */\ndeclare type isize = number;\n/** An 8-bit unsigned integer. */\ndeclare type u8 = number;\n/** A 16-bit unsigned integer. */\ndeclare type u16 = number;\n/** A 32-bit unsigned integer. */\ndeclare type u32 = number;\n/** A 64-bit unsigned integer. */\ndeclare type u64 = number;\n/** A 32-bit unsigned integer when targeting 32-bit WebAssembly or a 64-bit unsigned integer when targeting 64-bit WebAssembly. */\ndeclare type usize = number;\n/** A 1-bit unsigned integer. */\ndeclare type bool = boolean | number;\n/** A 32-bit float. */\ndeclare type f32 = number;\n/** A 64-bit float. */\ndeclare type f64 = number;\n\n// Compiler hints\n\n/** Compiler target. 0 = JS, 1 = WASM32, 2 = WASM64. */\ndeclare const ASC_TARGET: i32;\n/** Provided noAssert option. */\ndeclare const ASC_NO_ASSERT: bool;\n/** Provided memoryBase option. */\ndeclare const ASC_MEMORY_BASE: i32;\n/** Provided optimizeLevel option. */\ndeclare const ASC_OPTIMIZE_LEVEL: i32;\n/** Provided shrinkLevel option. */\ndeclare const ASC_SHRINK_LEVEL: i32;\n/** Whether the mutable global feature is enabled. */\ndeclare const ASC_FEATURE_MUTABLE_GLOBAL: bool;\n/** Whether the sign extension feature is enabled. */\ndeclare const ASC_FEATURE_SIGN_EXTENSION: bool;\n\n// Builtins\n\n/** Performs the sign-agnostic count leading zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered leading if the value is zero. */\ndeclare function clz(value: T): T;\n/** Performs the sign-agnostic count tailing zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered trailing if the value is zero. */\ndeclare function ctz(value: T): T;\n/** Performs the sign-agnostic count number of one bits operation on a 32-bit or 64-bit integer. */\ndeclare function popcnt(value: T): T;\n/** Performs the sign-agnostic rotate left operation on a 32-bit or 64-bit integer. */\ndeclare function rotl(value: T, shift: T): T;\n/** Performs the sign-agnostic rotate right operation on a 32-bit or 64-bit integer. */\ndeclare function rotr(value: T, shift: T): T;\n/** Computes the absolute value of an integer or float. */\ndeclare function abs(value: T): T;\n/** Determines the maximum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function max(left: T, right: T): T;\n/** Determines the minimum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function min(left: T, right: T): T;\n/** Performs the ceiling operation on a 32-bit or 64-bit float. */\ndeclare function ceil(value: T): T;\n/** Composes a 32-bit or 64-bit float from the magnitude of `x` and the sign of `y`. */\ndeclare function copysign(x: T, y: T): T;\n/** Performs the floor operation on a 32-bit or 64-bit float. */\ndeclare function floor(value: T): T;\n/** Rounds to the nearest integer tied to even of a 32-bit or 64-bit float. */\ndeclare function nearest(value: T): T;\n/** Reinterprets the bits of the specified value as type `T`. Valid reinterpretations are u32/i32 to/from f32 and u64/i64 to/from f64. */\ndeclare function reinterpret(value: number): T;\n/** Selects one of two pre-evaluated values depending on the condition. */\ndeclare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n/** Calculates the square root of a 32-bit or 64-bit float. */\ndeclare function sqrt(value: T): T;\n/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */\ndeclare function trunc(value: T): T;\n/** Loads a value of the specified type from memory. Equivalent to dereferncing a pointer in other languages. */\ndeclare function load(ptr: usize, constantOffset?: usize): T;\n/** Stores a value of the specified type to memory. Equivalent to dereferencing a pointer in other languages when assigning a value. */\ndeclare function store(ptr: usize, value: any, constantOffset?: usize): void;\n/** Emits an unreachable operation that results in a runtime error when executed. Both a statement and an expression of any type. */\ndeclare function unreachable(): any; // sic\n\n/** NaN (not a number) as a 32-bit or 64-bit float depending on context. */\ndeclare const NaN: f32 | f64;\n/** Positive infinity as a 32-bit or 64-bit float depending on context. */\ndeclare const Infinity: f32 | f64;\n/** Heap base offset. */\ndeclare const HEAP_BASE: usize;\n/** Determines the byte size of the specified underlying core type. Compiles to a constant. */\ndeclare function sizeof(): usize;\n/** Determines the alignment (log2) of the specified underlying core type. Compiles to a constant. */\ndeclare function alignof(): usize;\n/** Determines the offset of the specified field within the given class type. Returns the class type\'s end offset if field name has been omitted. Compiles to a constant. */\ndeclare function offsetof(fieldName?: string): usize;\n/** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/\ndeclare function changetype(value: any): T;\n/** Explicitly requests no bounds checks on the provided expression. Useful for array accesses. */\ndeclare function unchecked(value: T): T;\n/** Emits a `call_indirect` instruction, calling the specified function in the function table by index with the specified arguments. Does result in a runtime error if the arguments do not match the called function. */\ndeclare function call_indirect(target: Function | u32, ...args: any[]): T;\n/** Instantiates a new instance of `T` using the specified constructor arguments. */\ndeclare function instantiate(...args: any[]): T;\n/** Tests if a 32-bit or 64-bit float is `NaN`. */\ndeclare function isNaN(value: T): bool;\n/** Tests if a 32-bit or 64-bit float is finite, that is not `NaN` or +/-`Infinity`. */\ndeclare function isFinite(value: T): bool;\n/** Tests if the specified type *or* expression is of an integer type and not a reference. Compiles to a constant. */\ndeclare function isInteger(value?: any): value is number;\n/** Tests if the specified type *or* expression is of a float type. Compiles to a constant. */\ndeclare function isFloat(value?: any): value is number;\n/** Tests if the specified type *or* expression can represent negative numbers. Compiles to a constant. */\ndeclare function isSigned(value?: any): value is number;\n/** Tests if the specified type *or* expression is of a reference type. Compiles to a constant. */\ndeclare function isReference(value?: any): value is object | string;\n/** Tests if the specified type *or* expression can be used as a string. Compiles to a constant. */\ndeclare function isString(value?: any): value is string | String;\n/** Tests if the specified type *or* expression can be used as an array. Compiles to a constant. */\ndeclare function isArray(value?: any): value is Array;\n/** Tests if the specified expression resolves to a defined element. Compiles to a constant. */\ndeclare function isDefined(expression: any): bool;\n/** Tests if the specified expression evaluates to a constant value. Compiles to a constant. */\ndeclare function isConstant(expression: any): bool;\n/** Tests if the specified type *or* expression is of a managed type. Compiles to a constant. */\ndeclare function isManaged(value?: any): bool;\n/** Traps if the specified value is not true-ish, otherwise returns the (non-nullable) value. */\ndeclare function assert(isTrueish: T, message?: string): T & object; // any better way to model `: T != null`?\n/** Parses an integer string to a 64-bit float. */\ndeclare function parseInt(str: string, radix?: i32): f64;\n/** Parses an integer string to a 32-bit integer. */\ndeclare function parseI32(str: string, radix?: i32): i32;\n/** Parses an integer string to a 64-bit integer. */\ndeclare function parseI64(str: string, radix?: i32): i64;\n/** Parses a string to a 64-bit float. */\ndeclare function parseFloat(str: string): f64;\n/** Returns the 64-bit floating-point remainder of `x/y`. */\ndeclare function fmod(x: f64, y: f64): f64;\n/** Returns the 32-bit floating-point remainder of `x/y`. */\ndeclare function fmodf(x: f32, y: f32): f32;\n\n/** Converts any other numeric value to an 8-bit signed integer. */\ndeclare function i8(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace i8 {\n /** Smallest representable value. */\n export const MIN_VALUE: i8;\n /** Largest representable value. */\n export const MAX_VALUE: i8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i8;\n}\n/** Converts any other numeric value to a 16-bit signed integer. */\ndeclare function i16(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace i16 {\n /** Smallest representable value. */\n export const MIN_VALUE: i16;\n /** Largest representable value. */\n export const MAX_VALUE: i16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i16;\n}\n/** Converts any other numeric value to a 32-bit signed integer. */\ndeclare function i32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i32;\ndeclare namespace i32 {\n /** Smallest representable value. */\n export const MIN_VALUE: i32;\n /** Largest representable value. */\n export const MAX_VALUE: i32;\n /** Loads an 8-bit signed integer from memory and returns it as a 32-bit integer. */\n export function load8_s(offset: usize, constantOffset?: usize): i32;\n /** Loads an 8-bit unsigned integer from memory and returns it as a 32-bit integer. */\n export function load8_u(offset: usize, constantOffset?: usize): i32;\n /** Loads a 16-bit signed integer from memory and returns it as a 32-bit integer. */\n export function load16_s(offset: usize, constantOffset?: usize): i32;\n /** Loads a 16-bit unsigned integer from memory and returns it as a 32-bit integer. */\n export function load16_u(offset: usize, constantOffset?: usize): i32;\n /** Loads a 32-bit integer from memory. */\n export function load(offset: usize, constantOffset?: usize): i32;\n /** Stores a 32-bit integer to memory as an 8-bit integer. */\n export function store8(offset: usize, value: i32, constantOffset?: usize): void;\n /** Stores a 32-bit integer to memory as a 16-bit integer. */\n export function store16(offset: usize, value: i32, constantOffset?: usize): void;\n /** Stores a 32-bit integer to memory. */\n export function store(offset: usize, value: i32, constantOffset?: usize): void;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i32;\n}\n/** Converts any other numeric value to a 64-bit signed integer. */\ndeclare function i64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i64;\ndeclare namespace i64 {\n /** Smallest representable value. */\n export const MIN_VALUE: i64;\n /** Largest representable value. */\n export const MAX_VALUE: i64;\n /** Loads an 8-bit signed integer from memory and returns it as a 64-bit signed integer. */\n export function load8_s(offset: usize, constantOffset?: usize): i64;\n /** Loads an 8-bit unsigned integer from memory and returns it as a 64-bit unsigned integer. */\n export function load8_u(offset: usize, constantOffset?: usize): u64;\n /** Loads a 16-bit signed integer from memory and returns it as a 64-bit signed integer. */\n export function load16_s(offset: usize, constantOffset?: usize): i64;\n /** Loads a 16-bit unsigned integer from memory and returns it as a 64-bit unsigned integer. */\n export function load16_u(offset: usize, constantOffset?: usize): u64;\n /** Loads a 32-bit signed integer from memory and returns it as a 64-bit signed integer. */\n export function load32_s(offset: usize, constantOffset?: usize): i64;\n /** Loads a 32-bit unsigned integer from memory and returns it as a 64-bit unsigned integer. */\n export function load32_u(offset: usize, constantOffset?: usize): u64;\n /** Loads a 64-bit unsigned integer from memory. */\n export function load(offset: usize, constantOffset?: usize): i64;\n /** Stores a 64-bit integer to memory as an 8-bit integer. */\n export function store8(offset: usize, value: i64, constantOffset?: usize): void;\n /** Stores a 64-bit integer to memory as a 16-bit integer. */\n export function store16(offset: usize, value: i64, constantOffset?: usize): void;\n /** Stores a 64-bit integer to memory as a 32-bit integer. */\n export function store32(offset: usize, value: i64, constantOffset?: usize): void;\n /** Stores a 64-bit integer to memory. */\n export function store(offset: usize, value: i64, constantOffset?: usize): void;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i64;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) signed integer. */\ndeclare var isize: typeof i32 | typeof i64;\n/** Converts any other numeric value to an 8-bit unsigned integer. */\ndeclare function u8(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace u8 {\n /** Smallest representable value. */\n export const MIN_VALUE: u8;\n /** Largest representable value. */\n export const MAX_VALUE: u8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u8;\n}\n/** Converts any other numeric value to a 16-bit unsigned integer. */\ndeclare function u16(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace u16 {\n /** Smallest representable value. */\n export const MIN_VALUE: u16;\n /** Largest representable value. */\n export const MAX_VALUE: u16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u16;\n}\n/** Converts any other numeric value to a 32-bit unsigned integer. */\ndeclare function u32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i32;\ndeclare namespace u32 {\n /** Smallest representable value. */\n export const MIN_VALUE: u32;\n /** Largest representable value. */\n export const MAX_VALUE: u32;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u64;\n}\n/** Converts any other numeric value to a 64-bit unsigned integer. */\ndeclare function u64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i64;\ndeclare namespace u64 {\n /** Smallest representable value. */\n export const MIN_VALUE: u64;\n /** Largest representable value. */\n export const MAX_VALUE: u64;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): u64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u64;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) unsigned integer. */\ndeclare var usize: typeof u32 | typeof u64;\n/** Converts any other numeric value to a 1-bit unsigned integer. */\ndeclare function bool(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): bool;\ndeclare namespace bool {\n /** Smallest representable value. */\n export const MIN_VALUE: bool;\n /** Largest representable value. */\n export const MAX_VALUE: bool;\n}\n/** Converts any other numeric value to a 32-bit float. */\ndeclare function f32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): f32;\ndeclare namespace f32 {\n /** Smallest representable value. */\n export const MIN_VALUE: f32;\n /** Largest representable value. */\n export const MAX_VALUE: f32;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f32;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f32;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f32;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f32;\n /** Returns the floating-point remainder of `x / y` (rounded towards zero). */\n export function mod(x: f32, y: f32): f32;\n /** Returns the floating-point remainder of `x / y` (rounded to nearest). */\n export function rem(x: f32, y: f32): f32;\n /** Loads a 32-bit float from memory. */\n export function load(offset: usize, constantOffset?: usize): f32;\n /** Stores a 32-bit float to memory. */\n export function store(offset: usize, value: f32, constantOffset?: usize): void;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n export function isNaN(value: f32): bool;\n /** Returns true if passed value is finite. */\n export function isFinite(value: f32): bool;\n /** Returns true if the value passed is a safe integer. */\n export function isSafeInteger(value: f32): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n export function isInteger(value: f32): bool;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): f32;\n /** Converts a string to an integer. */\n export function parseInt(string: string, radix?: i32): f32;\n}\n/** Converts any other numeric value to a 64-bit float. */\ndeclare function f64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): f64;\ndeclare namespace f64 {\n /** Smallest representable value. */\n export const MIN_VALUE: f64;\n /** Largest representable value. */\n export const MAX_VALUE: f64;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f64;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f64;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f64;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f64;\n /** Loads a 64-bit float from memory. */\n export function load(offset: usize, constantOffset?: usize): f64;\n /** Stores a 64-bit float to memory. */\n export function store(offset: usize, value: f64, constantOffset?: usize): void;\n}\n/** Macro type evaluating to the underlying native WebAssembly type. */\ndeclare type native = T;\n\n/** Pseudo-class representing the backing class of integer types. */\ndeclare class _Integer {\n /** Smallest representable value. */\n static readonly MIN_VALUE: number;\n /** Largest representable value. */\n static readonly MAX_VALUE: number;\n /** Converts a string to an integer of this type. */\n static parseInt(value: string, radix?: number): number;\n /** Converts this integer to a string. */\n toString(): string;\n}\n\n/** Pseudo-class representing the backing class of floating-point types. */\ndeclare class _Float {\n /** Difference between 1 and the smallest representable value greater than 1. */\n static readonly EPSILON: f32 | f64;\n /** Smallest representable value. */\n static readonly MIN_VALUE: f32 | f64;\n /** Largest representable value. */\n static readonly MAX_VALUE: f32 | f64;\n /** Smallest safely representable integer value. */\n static readonly MIN_SAFE_INTEGER: f32 | f64;\n /** Largest safely representable integer value. */\n static readonly MAX_SAFE_INTEGER: f32 | f64;\n /** Value representing positive infinity. */\n static readonly POSITIVE_INFINITY: f32 | f64;\n /** Value representing negative infinity. */\n static readonly NEGATIVE_INFINITY: f32 | f64;\n /** Value representing \'not a number\'. */\n static readonly NaN: f32 | f64;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n static isNaN(value: f32 | f64): bool;\n /** Returns true if passed value is finite. */\n static isFinite(value: f32 | f64): bool;\n /** Returns true if the value passed is a safe integer. */\n static isSafeInteger(value: f32 | f64): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n static isInteger(value: f32 | f64): bool;\n /** Converts A string to an integer. */\n static parseInt(value: string, radix?: i32): f32 | f64;\n /** Converts a string to a floating-point number. */\n static parseFloat(value: string): f32 | f64;\n /** Converts this floating-point number to a string. */\n toString(this: f64): string;\n}\n\n/** Backing class of signed 8-bit integers. */\ndeclare const I8: typeof _Integer;\n/** Backing class of signed 16-bit integers. */\ndeclare const I16: typeof _Integer;\n/** Backing class of signed 32-bit integers. */\ndeclare const I32: typeof _Integer;\n/** Backing class of signed 64-bit integers. */\ndeclare const I64: typeof _Integer;\n/** Backing class of signed size integers. */\ndeclare const Isize: typeof _Integer;\n/** Backing class of unsigned 8-bit integers. */\ndeclare const U8: typeof _Integer;\n/** Backing class of unsigned 16-bit integers. */\ndeclare const U16: typeof _Integer;\n/** Backing class of unsigned 32-bit integers. */\ndeclare const U32: typeof _Integer;\n/** Backing class of unsigned 64-bit integers. */\ndeclare const U64: typeof _Integer;\n/** Backing class of unsigned size integers. */\ndeclare const Usize: typeof _Integer;\n/** Backing class of 32-bit floating-point values. */\ndeclare const F32: typeof _Float;\n/** Backing class of 64-bit floating-point values. */\ndeclare const F64: typeof _Float;\n\n// User-defined diagnostic macros\n\n/** Emits a user-defined diagnostic error when encountered. */\ndeclare function ERROR(message?: any): void;\n/** Emits a user-defined diagnostic warning when encountered. */\ndeclare function WARNING(message?: any): void;\n/** Emits a user-defined diagnostic info when encountered. */\ndeclare function INFO(message?: any): void;\n\n// Polyfills\n\n/** Performs the sign-agnostic reverse bytes **/\ndeclare function bswap(value: T): T;\n/** Performs the sign-agnostic reverse bytes only for last 16-bit **/\ndeclare function bswap16(value: T): T;\n\n// Standard library\n\n/** Memory operations. */\ndeclare namespace memory {\n /** Returns the current memory size in units of pages. One page is 64kb. */\n export function size(): i32;\n /** Grows linear memory by a given unsigned delta of pages. One page is 64kb. Returns the previous memory size in units of pages or `-1` on failure. */\n export function grow(value: i32): i32;\n /** Sets n bytes beginning at the specified destination in memory to the specified byte value. */\n export function fill(dst: usize, value: u8, count: usize): void;\n /** Copies n bytes from the specified source to the specified destination in memory. These regions may overlap. */\n export function copy(dst: usize, src: usize, n: usize): void;\n /** Copies elements from a passive element segment to a table. */\n // export function init(segmentIndex: u32, srcOffset: usize, dstOffset: usize, n: usize): void;\n /** Prevents further use of a passive element segment. */\n // export function drop(segmentIndex: u32): void;\n /** Copies elements from one region of a table to another region. */\n export function allocate(size: usize): usize;\n /** Disposes a chunk of memory by its pointer. */\n export function free(ptr: usize): void;\n /** Compares two chunks of memory. Returns `0` if equal, otherwise the difference of the first differing bytes. */\n export function compare(vl: usize, vr: usize, n: usize): i32;\n /** Resets the allocator to its initial state, if supported. */\n export function reset(): void;\n}\n\n/** Garbage collector operations. */\ndeclare namespace gc {\n /** Allocates a managed object identified by its visitor function. */\n export function allocate(size: usize, visitFn: (ref: usize) => void): usize;\n /** Performs a full garbage collection cycle. */\n export function collect(): void;\n}\n\n/** Table operations. */\ndeclare namespace table {\n /** Copies elements from a passive element segment to a table. */\n // export function init(elementIndex: u32, srcOffset: u32, dstOffset: u32, n: u32): void;\n /** Prevents further use of a passive element segment. */\n // export function drop(elementIndex: u32): void;\n /** Copies elements from one region of a table to another region. */\n // export function copy(dest: u32, src: u32, n: u32): void;\n}\n\n/** Class representing a generic, fixed-length raw binary data buffer. */\ndeclare class ArrayBuffer {\n /** The size, in bytes, of the array. */\n readonly byteLength: i32;\n /** Unsafe pointer to the start of the data in memory. */\n readonly data: usize;\n /** Returns true if value is one of the ArrayBuffer views, such as typed array or a DataView **/\n static isView(value: T): bool;\n /** Constructs a new array buffer of the given length in bytes. */\n constructor(length: i32, unsafe?: bool);\n /** Returns a copy of this array buffer\'s bytes from begin, inclusive, up to end, exclusive. */\n slice(begin?: i32, end?: i32): ArrayBuffer;\n /** Returns a string representation of ArrayBuffer. */\n toString(): string;\n}\n\n/** The `DataView` view provides a low-level interface for reading and writing multiple number types in a binary `ArrayBuffer`, without having to care about the platform\'s endianness. */\ndeclare class DataView {\n /** The `buffer` accessor property represents the `ArrayBuffer` or `SharedArrayBuffer` referenced by the `DataView` at construction time. */\n readonly buffer: ArrayBuffer;\n /** The `byteLength` accessor property represents the length (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteLength: i32;\n /** The `byteOffset` accessor property represents the offset (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteOffset: i32;\n /** Constructs a new `DataView` with the given properties */\n constructor(buffer: ArrayBuffer, byteOffset?: i32, byteLength?: i32);\n /** The `getFloat32()` method gets a signed 32-bit float (float) at the specified byte offset from the start of the `DataView`. */\n getFloat32(byteOffset: i32, littleEndian?: boolean): f32;\n /** The `getFloat64()` method gets a signed 64-bit float (double) at the specified byte offset from the start of the `DataView`. */\n getFloat64(byteOffset: i32, littleEndian?: boolean): f64;\n /** The `getInt8()` method gets a signed 8-bit integer (byte) at the specified byte offset from the start of the `DataView`. */\n getInt8(byteOffset: i32): i8;\n /** The `getInt16()` method gets a signed 16-bit integer (short) at the specified byte offset from the start of the `DataView`. */\n getInt16(byteOffset: i32, littleEndian?: boolean): i16;\n /** The `getInt32()` method gets a signed 32-bit integer (long) at the specified byte offset from the start of the `DataView`. */\n getInt32(byteOffset: i32, littleEndian?: boolean): i32;\n /** The `getInt64()` method gets a signed 64-bit integer (long long) at the specified byte offset from the start of the `DataView`. */\n getInt64(byteOffset: i32, littleEndian?: boolean): i64;\n /** The `getUint8()` method gets an unsigned 8-bit integer (unsigned byte) at the specified byte offset from the start of the `DataView`. */\n getUint8(byteOffset: i32): u8;\n /** The `getUint16()` method gets an unsigned 16-bit integer (unsigned short) at the specified byte offset from the start of the `DataView`. */\n getUint16(byteOffset: i32, littleEndian?: boolean): u16;\n /** The `getUint32()` method gets an unsigned 32-bit integer (unsigned long) at the specified byte offset from the start of the `DataView`. */\n getUint32(byteOffset: i32, littleEndian?: boolean): u32;\n /** The `getUint64()` method gets an unsigned 64-bit integer (unsigned long long) at the specified byte offset from the start of the `DataView`. */\n getUint64(byteOffset: i32, littleEndian?: boolean): u64;\n /** The `setFloat32()` method stores a signed 32-bit float (float) value at the specified byte offset from the start of the `DataView`. */\n setFloat32(byteOffset: i32, value: f32, littleEndian?: boolean): void;\n /** The `setFloat64()` method stores a signed 64-bit float (double) value at the specified byte offset from the start of the `DataView`. */\n setFloat64(byteOffset: i32, value: f64, littleEndian?: boolean): void;\n /** The `setInt8()` method stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setInt8(byteOffset: i32, value: i8): void;\n /** The `setInt16()` method stores a signed 16-bit integer (short) value at the specified byte offset from the start of the `DataView`. */\n setInt16(byteOffset: i32, value: i16, littleEndian?: boolean): void;\n /** The `setInt32()` method stores a signed 32-bit integer (long) value at the specified byte offset from the start of the `DataView`. */\n setInt32(byteOffset: i32, value: i32, littleEndian?: boolean): void;\n /** The `setInt64()` method stores a signed 64-bit integer (long long) value at the specified byte offset from the start of the `DataView`. */\n setInt64(byteOffset: i32, value: i64, littleEndian?: boolean): void;\n /** The `setUint8()` method stores an unsigned 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setUint8(byteOffset: i32, value: u8): void;\n /** The `setUint16()` method stores an unsigned 16-bit integer (unsigned short) value at the specified byte offset from the start of the `DataView`. */\n setUint16(byteOffset: i32, value: u16, littleEndian?: boolean): void;\n /** The `setUint32()` method stores an unsigned 32-bit integer (unsigned long) value at the specified byte offset from the start of the `DataView`. */\n setUint32(byteOffset: i32, value: u32, littleEndian?: boolean): void;\n /** The `setUint64()` method stores an unsigned 64-bit integer (unsigned long long) value at the specified byte offset from the start of the `DataView`. */\n setUint64(byteOffset: i32, value: u64, littleEndian?: boolean): void;\n /** Returns a string representation of DataView. */\n toString(): string;\n}\n\n/** Interface for a typed view on an array buffer. */\ninterface ArrayBufferView {\n [key: number]: T;\n /** The {@link ArrayBuffer} referenced by this view. */\n readonly buffer: ArrayBuffer;\n /** The offset in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteOffset: i32;\n /** The length in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteLength: i32;\n}\n\n/* @internal */\ndeclare abstract class TypedArray implements ArrayBufferView {\n [key: number]: T;\n /** Number of bytes per element. */\n static readonly BYTES_PER_ELEMENT: usize;\n /** Constructs a new typed array. */\n constructor(length: i32);\n /** The {@link ArrayBuffer} referenced by this view. */\n readonly buffer: ArrayBuffer;\n /** The offset in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteOffset: i32;\n /** The length in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteLength: i32;\n /** The length (in elements). */\n readonly length: i32;\n /** Returns a new TypedArray of this type on the same ArrayBuffer from begin inclusive to end exclusive. */\n subarray(begin?: i32, end?: i32): this;\n /** The reduce() method applies a function against an accumulator and each value of the typed array (from left-to-right) has to reduce it to a single value. This method has the same algorithm as Array.prototype.reduce(). */\n reduce(\n callbackfn: (accumulator: W, value: T, index: i32, self: this) => W,\n initialValue: W,\n ): W;\n /** The reduceRight() method applies a function against an accumulator and each value of the typed array (from left-to-right) has to reduce it to a single value, starting from the end of the array. This method has the same algorithm as Array.prototype.reduceRight(). */\n reduceRight(\n callbackfn: (accumulator: W, value: T, index: i32, self: this) => W,\n initialValue: W,\n ): W;\n /** The some() method tests whether some element in the typed array passes the test implemented by the provided function. This method has the same algorithm as Array.prototype.some().*/\n some(callbackfn: (value: T, index: i32, self: this) => bool): bool;\n /** The map() method creates a new typed array with the results of calling a provided function on every element in this typed array. This method has the same algorithm as Array.prototype.map().*/\n map(callbackfn: (value: T, index: i32, self: this) => T): this;\n /** The sort() method sorts the elements of a typed array numerically in place and returns the typed array. This method has the same algorithm as Array.prototype.sort(), except that sorts the values numerically instead of as strings. TypedArray is one of the typed array types here. */\n sort(callback?: (a: T, b: T) => i32): this;\n /** The fill() method fills all the elements of a typed array from a start index to an end index with a static value. This method has the same algorithm as Array.prototype.fill(). */\n fill(value: T, start?: i32, end?: i32): this;\n /** The findIndex() method returns an index in the typed array, if an element in the typed array satisfies the provided testing function. Otherwise -1 is returned. See also the find() [not implemented] method, which returns the value of a found element in the typed array instead of its index. */\n findIndex(callbackfn: (value: T, index: i32, self: this) => bool): i32;\n /** The every() method tests whether all elements in the typed array pass the test implemented by the provided function. This method has the same algorithm as Array.prototype.every(). */\n every(callbackfn: (value: T, index: i32, self: this) => bool): i32;\n}\n\n/** An array of twos-complement 8-bit signed integers. */\ndeclare class Int8Array extends TypedArray {}\n/** An array of 8-bit unsigned integers. */\ndeclare class Uint8Array extends TypedArray {}\n/** A clamped array of 8-bit unsigned integers. */\ndeclare class Uint8ClampedArray extends TypedArray {}\n/** An array of twos-complement 16-bit signed integers. */\ndeclare class Int16Array extends TypedArray {}\n/** An array of 16-bit unsigned integers. */\ndeclare class Uint16Array extends TypedArray {}\n/** An array of twos-complement 32-bit signed integers. */\ndeclare class Int32Array extends TypedArray {}\n/** An array of 32-bit unsigned integers. */\ndeclare class Uint32Array extends TypedArray {}\n/** An array of twos-complement 64-bit signed integers. */\ndeclare class Int64Array extends TypedArray {}\n/** An array of 64-bit unsigned integers. */\ndeclare class Uint64Array extends TypedArray {}\n/** An array of 32-bit floating point numbers. */\ndeclare class Float32Array extends TypedArray {}\n/** An array of 64-bit floating point numbers. */\ndeclare class Float64Array extends TypedArray {}\n\n/** Class representing a sequence of values of type `T`. */\ndeclare class Array {\n\n static isArray(value: any): value is Array;\n\n [key: number]: T;\n /** Current length of the array. */\n length: i32;\n /** Constructs a new array. */\n constructor(capacity?: i32);\n\n fill(value: T, start?: i32, end?: i32): this;\n every(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n findIndex(predicate: (element: T, index: i32, array?: Array) => bool): i32;\n includes(searchElement: T, fromIndex?: i32): bool;\n indexOf(searchElement: T, fromIndex?: i32): i32;\n lastIndexOf(searchElement: T, fromIndex?: i32): i32;\n push(element: T): i32;\n concat(items: T[]): T[];\n copyWithin(target: i32, start: i32, end?: i32): this;\n pop(): T;\n forEach(callbackfn: (value: T, index: i32, array: Array) => void): void;\n map(callbackfn: (value: T, index: i32, array: Array) => U): Array;\n filter(callbackfn: (value: T, index: i32, array: Array) => bool): Array;\n reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n reduceRight(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n shift(): T;\n some(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n unshift(element: T): i32;\n slice(from: i32, to?: i32): Array;\n splice(start: i32, deleteCount?: i32): Array;\n sort(comparator?: (a: T, b: T) => i32): this;\n join(separator?: string): string;\n reverse(): T[];\n toString(): string;\n}\n\n/** Class representing a sequence of characters. */\ndeclare class String {\n\n static fromCharCode(ls: i32, hs?: i32): string;\n static fromCharCodes(arr: u16[]): string;\n static fromCodePoint(code: i32): string;\n static fromCodePoints(arr: i32[]): string;\n\n readonly length: i32;\n readonly lengthUTF8: i32;\n\n charAt(index: u32): string;\n charCodeAt(index: u32): u16;\n concat(other: string): string;\n endsWith(other: string): bool;\n indexOf(other: string, fromIndex?: i32): u32;\n lastIndexOf(other: string, fromIndex?: i32): i32;\n includes(other: string): bool;\n startsWith(other: string): bool;\n substr(start: u32, length?: u32): string;\n substring(start: u32, end?: u32): string;\n trim(): string;\n trimLeft(): string;\n trimRight(): string;\n trimStart(): string;\n trimEnd(): string;\n padStart(targetLength: i32, padString?: string): string;\n padEnd(targetLength: i32, padString?: string): string;\n repeat(count?: i32): string;\n slice(beginIndex: i32, endIndex?: i32): string;\n split(separator?: string, limit?: i32): string[];\n toString(): string;\n static fromUTF8(ptr: usize, len: usize): string;\n toUTF8(): usize;\n}\n\n/** Class for representing a runtime error. Base class of all errors. */\ndeclare class Error {\n\n /** Error name. */\n name: string;\n\n /** Message provided on construction. */\n message: string;\n\n /** Stack trace. */\n stack?: string;\n\n /** Constructs a new error, optionally with a message. */\n constructor(message?: string);\n\n /** Method returns a string representing the specified Error class. */\n toString(): string;\n}\n\n/** Class for indicating an error when a value is not in the set or range of allowed values. */\ndeclare class RangeError extends Error { }\n\n/** Class for indicating an error when a value is not of the expected type. */\ndeclare class TypeError extends Error { }\n\n/** Class for indicating an error when trying to interpret syntactically invalid code. */\ndeclare class SyntaxError extends Error { }\n\ninterface Boolean {}\ninterface Function {}\ninterface IArguments {}\ninterface Number {}\ninterface Object {}\ninterface RegExp {}\n\ndeclare class Map {\n readonly size: i32;\n has(key: K): bool;\n set(key: K, value: V): void;\n get(key: K): V;\n delete(key: K): bool;\n clear(): void;\n toString(): string;\n}\n\ndeclare class Set {\n readonly size: i32;\n has(value: T): bool;\n add(value: T): void;\n delete(value: T): bool;\n clear(): void;\n toString(): string;\n}\n\ninterface SymbolConstructor {\n readonly hasInstance: symbol;\n readonly isConcatSpreadable: symbol;\n readonly isRegExp: symbol;\n readonly iterator: symbol;\n readonly match: symbol;\n readonly replace: symbol;\n readonly search: symbol;\n readonly species: symbol;\n readonly split: symbol;\n readonly toPrimitive: symbol;\n readonly toStringTag: symbol;\n readonly unscopables: symbol;\n (description?: string | null): symbol;\n for(key: string): symbol;\n keyFor(sym: symbol): string | null;\n}\n\ndeclare const Symbol: SymbolConstructor;\n\ninterface IMath {\n /** The base of natural logarithms, e, approximately 2.718. */\n readonly E: T;\n /** The natural logarithm of 2, approximately 0.693. */\n readonly LN2: T;\n /** The natural logarithm of 10, approximately 2.302. */\n readonly LN10: T;\n /** The base 2 logarithm of e, approximately 1.442. */\n readonly LOG2E: T;\n /** The base 10 logarithm of e, approximately 0.434. */\n readonly LOG10E: T;\n /** The ratio of the circumference of a circle to its diameter, approximately 3.14159. */\n readonly PI: T;\n /** The square root of 1/2, approximately 0.707. */\n readonly SQRT1_2: T;\n /** The square root of 2, approximately 1.414. */\n readonly SQRT2: T;\n /** Returns the absolute value of `x`. */\n abs(x: T): T;\n /** Returns the arccosine (in radians) of `x`. */\n acos(x: T): T;\n /** Returns the hyperbolic arc-cosine of `x`. */\n acosh(x: T): T;\n /** Returns the arcsine (in radians) of `x` */\n asin(x: T): T;\n /** Returns the hyperbolic arcsine of `x`. */\n asinh(x: T): T;\n /** Returns the arctangent (in radians) of `x`. */\n atan(x: T): T;\n /** Returns the arctangent of the quotient of its arguments. */\n atan2(y: T, x: T): T;\n /** Returns the hyperbolic arctangent of `x`. */\n atanh(x: T): T;\n /** Returns the cube root of `x`. */\n cbrt(x: T): T;\n /** Returns the smallest integer greater than or equal to `x`. */\n ceil(x: T): T;\n /** Returns the number of leading zero bits in the 32-bit binary representation of `x`. */\n clz32(x: T): T;\n /** Returns the cosine (in radians) of `x`. */\n cos(x: T): T;\n /** Returns the hyperbolic cosine of `x`. */\n cosh(x: T): T;\n /** Returns e to the power of `x`. */\n exp(x: T): T;\n /** Returns e to the power of `x`, minus 1. */\n expm1(x: T): T;\n /** Returns the largest integer less than or equal to `x`. */\n floor(x: T): T;\n /** Returns the nearest 32-bit single precision float representation of `x`. */\n fround(x: T): f32;\n /** Returns the square root of the sum of squares of its arguments. */\n hypot(value1: T, value2: T): T; // TODO: rest\n /** Returns the result of the C-like 32-bit multiplication of `a` and `b`. */\n imul(a: T, b: T): T;\n /** Returns the natural logarithm (base e) of `x`. */\n log(x: T): T;\n /** Returns the base 10 logarithm of `x`. */\n log10(x: T): T;\n /** Returns the natural logarithm (base e) of 1 + `x`. */\n log1p(x: T): T;\n /** Returns the base 2 logarithm of `x`. */\n log2(x: T): T;\n /** Returns the largest-valued number of its arguments. */\n max(value1: T, value2: T): T; // TODO: rest\n /** Returns the lowest-valued number of its arguments. */\n min(value1: T, value2: T): T; // TODO: rest\n /** Returns `base` to the power of `exponent`. */\n pow(base: T, exponent: T): T;\n /** Returns a pseudo-random number in the range from 0.0 inclusive up to but not including 1.0. */\n random(): T;\n /** Returns the value of `x` rounded to the nearest integer. */\n round(x: T): T;\n /** Returns the sign of `x`, indicating whether the number is positive, negative or zero. */\n sign(x: T): T;\n /** Returns whether the sign bit of `x` is set */\n signbit(x: T): bool;\n /** Returns the sine of `x`. */\n sin(x: T): T;\n /** Returns the hyperbolic sine of `x`. */\n sinh(x: T): T;\n /** Returns the square root of `x`. */\n sqrt(x: T): T;\n /** Returns the tangent of `x`. */\n tan(x: T): T;\n /** Returns the hyperbolic tangent of `x`. */\n tanh(x: T): T;\n /** Returns the integer part of `x` by removing any fractional digits. */\n trunc(x: T): T;\n}\n\ninterface INativeMath extends IMath {\n /** Seeds the random number generator. */\n seedRandom(value: i64): void;\n /** Returns the floating-point remainder of `x / y` (rounded towards zero). */\n mod(x: T, y: T): T;\n /** Returns the floating-point remainder of `x / y` (rounded to nearest). */\n rem(x: T, y: T): T;\n}\n\n/** Double precision math imported from JavaScript. */\ndeclare const JSMath: IMath;\n/** Double precision math implemented natively. */\ndeclare const NativeMath: INativeMath;\n/** Single precision math implemented natively. */\ndeclare const NativeMathf: INativeMath;\n/** Alias of {@link NativeMath} or {@link JSMath} respectively. Defaults to `NativeMath`. */\ndeclare const Math: IMath;\n/** Alias of {@link NativeMathf} or {@link JSMath} respectively. Defaults to `NativeMathf`. */\ndeclare const Mathf: IMath;\n\ndeclare class Date {\n /** Returns the UTC timestamp in milliseconds of the specified date. */\n static UTC(\n year: i32,\n month: i32,\n day: i32,\n hour: i32,\n minute: i32,\n second: i32,\n millisecond: i32\n ): i64;\n /** Returns the current UTC timestamp in milliseconds. */\n static now(): i64;\n /** Constructs a new date object from an UTC timestamp in milliseconds. */\n constructor(value: i64);\n /** Returns the UTC timestamp of this date in milliseconds. */\n getTime(): i64;\n /** Sets the UTC timestamp of this date in milliseconds. */\n setTime(value: i64): i64;\n}\n\n/** Environmental tracing function for debugging purposes. */\ndeclare function trace(msg: string, n?: i32, a0?: f64, a1?: f64, a2?: f64, a3?: f64, a4?: f64): void;\n\n// Decorators\n\ninterface TypedPropertyDescriptor {\n configurable?: boolean;\n enumerable?: boolean;\n writable?: boolean;\n value?: T;\n get?(): T;\n set?(value: T): void;\n}\n\n/** Annotates an element as a program global. */\ndeclare function global(\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n): TypedPropertyDescriptor | void;\n\n/** Annotates a method as a binary operator overload for the specified `token`. */\ndeclare function operator(token:\n "[]" | "[]=" | "{}" | "{}=" | "==" | "!=" | ">" | "<" | "<=" | ">=" |\n ">>" | ">>>" | "<<" | "&" | "|" | "^" | "+" | "-" | "*" | "**" | "/" | "%"\n): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n) => TypedPropertyDescriptor | void;\n\ndeclare namespace operator {\n /** Annotates a method as a binary operator overload for the specified `token`. */\n export function binary(token:\n "[]" | "[]=" | "{}" | "{}=" | "==" | "!=" | ">" | "<" | "<=" | ">=" |\n ">>" | ">>>" | "<<" | "&" | "|" | "^" | "+" | "-" | "*" | "**" | "/" | "%"\n ): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n ) => TypedPropertyDescriptor | void;\n /** Annotates a method as an unary prefix operator overload for the specified `token`. */\n export function prefix(token: "!" | "~" | "+" | "-" | "++" | "--"): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n ) => TypedPropertyDescriptor | void;\n /** Annotates a method as an unary postfix operator overload for the specified `token`. */\n export function postfix(token: "++" | "--"): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n ) => TypedPropertyDescriptor | void;\n}\n\n/** Annotates a class as being unmanaged with limited capabilities. */\ndeclare function unmanaged(constructor: Function): void;\n\n/** Annotates a class as being sealed / non-derivable. */\ndeclare function sealed(constructor: Function): void;\n\n/** Annotates a method, function or constant global as always inlined. */\ndeclare function inline(\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n): TypedPropertyDescriptor | void;\n\n/** Annotates an explicit external name of a function or global. */\ndeclare function external(namespace: string, name: string): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n) => TypedPropertyDescriptor | void;\n\n/** Annotates a global for lazy compilation. */\ndeclare function lazy(\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n): TypedPropertyDescriptor | void;\n\n/** Annotates a function as the explicit start function. */\ndeclare function start(\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n): TypedPropertyDescriptor | void;\n',portable:"/**\n * Environment definitions for compiling AssemblyScript to JavaScript using tsc.\n *\n * Note that semantic differences require additional explicit conversions for full compatibility.\n * For example, when casting an i32 to an u8, doing `(someI32 & 0xff)` will yield the same\n * result when compiling to WebAssembly or JS while `someI32` alone does nothing in JS.\n *\n * Note that i64's are not portable (JS numbers are IEEE754 doubles with a maximum safe integer\n * value of 2^53-1) and instead require a compatibility layer to work in JS as well, as for example\n * {@link glue/js/i64} respectively {@link glue/wasm/i64}.\n *\n * @module std/portable\n *//***/\n\n/// \n\n// Types\n\ndeclare type bool = boolean;\ndeclare type i8 = number;\ndeclare type i16 = number;\ndeclare type i32 = number;\ndeclare type isize = number;\ndeclare type u8 = number;\ndeclare type u16 = number;\ndeclare type u32 = number;\ndeclare type usize = number;\ndeclare type f32 = number;\ndeclare type f64 = number;\n\n// Compiler hints\n\n/** Compiler target. 0 = JS, 1 = WASM32, 2 = WASM64. */\ndeclare const ASC_TARGET: i32;\n/** Provided noAssert option. */\ndeclare const ASC_NO_ASSERT: bool;\n/** Provided memoryBase option. */\ndeclare const ASC_MEMORY_BASE: i32;\n/** Provided optimizeLevel option. */\ndeclare const ASC_OPTIMIZE_LEVEL: i32;\n/** Provided shrinkLevel option. */\ndeclare const ASC_SHRINK_LEVEL: i32;\n/** Whether the mutable global feature is enabled. */\ndeclare const ASC_FEATURE_MUTABLE_GLOBAL: bool;\n/** Whether the sign extension feature is enabled. */\ndeclare const ASC_FEATURE_SIGN_EXTENSION: bool;\n\n// Builtins\n\n/** Performs the sign-agnostic count leading zero bits operation on a 32-bit integer. All zero bits are considered leading if the value is zero. */\ndeclare function clz(value: T): T;\n/** Performs the sign-agnostic count tailing zero bits operation on a 32-bit integer. All zero bits are considered trailing if the value is zero. */\ndeclare function ctz(value: T): T;\n/** Performs the sign-agnostic count number of one bits operation on a 32-bit integer. */\ndeclare function popcnt(value: T): T;\n/** Performs the sign-agnostic rotate left operation on a 32-bit integer. */\ndeclare function rotl(value: T, shift: T): T;\n/** Performs the sign-agnostic rotate right operation on a 32-bit integer. */\ndeclare function rotr(value: T, shift: T): T;\n/** Computes the absolute value of an integer or float. */\ndeclare function abs(value: T): T;\n/** Determines the maximum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function max(left: T, right: T): T;\n/** Determines the minimum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function min(left: T, right: T): T;\n/** Composes a 32-bit or 64-bit float from the magnitude of `x` and the sign of `y`. */\ndeclare function copysign(x: T, y: T): T;\n/** Performs the ceiling operation on a 32-bit or 64-bit float. */\ndeclare function ceil(value: T): T;\n/** Performs the floor operation on a 32-bit or 64-bit float. */\ndeclare function floor(value: T): T;\n/** Rounds to the nearest integer tied to even of a 32-bit or 64-bit float. */\ndeclare function nearest(value: T): T;\n/** Selects one of two pre-evaluated values depending on the condition. */\ndeclare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n/** Calculates the square root of a 32-bit or 64-bit float. */\ndeclare function sqrt(value: T): T;\n/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */\ndeclare function trunc(value: T): T;\n/** Loads a value of the specified type from memory. Type must be `u8`. */\ndeclare function load(ptr: usize, constantOffset?: usize): T;\n/** Stores a value of the specified type to memory. Type must be `u8`. */\ndeclare function store(ptr: usize, value: T, constantOffset?: usize): void;\n/** Emits an unreachable operation that results in a runtime error when executed. */\ndeclare function unreachable(): any; // sic\n\n/** NaN (not a number) as a 32-bit or 64-bit float depending on context. */\ndeclare const NaN: f32 | f64;\n/** Positive infinity as a 32-bit or 64-bit float depending on context. */\ndeclare const Infinity: f32 | f64;\n/** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/\ndeclare function changetype(value: any): T;\n/** Explicitly requests no bounds checks on the provided expression. Useful for array accesses. */\ndeclare function unchecked(value: T): T;\n/** Tests if a 32-bit or 64-bit float is `NaN`. */\ndeclare function isNaN(value: T): bool;\n/** Tests if a 32-bit or 64-bit float is finite, that is not `NaN` or +/-`Infinity`. */\ndeclare function isFinite(value: T): bool;\n/** Tests if the specified value is a valid integer. Can't distinguish an integer from an integral float. */\ndeclare function isInteger(value: any): value is number;\n/** Tests if the specified value is a valid float. Can't distinguish a float from an integer. */\ndeclare function isFloat(value: any): value is number;\n/** Tests if the specified value is of a reference type. */\ndeclare function isReference(value: any): value is object | string;\n/** Tests if the specified value can be used as a string. */\ndeclare function isString(value: any): value is string | String;\n/** Tests if the specified value can be used as an array. */\ndeclare function isArray(value: any): value is Array;\n/** Tests if the specified expression resolves to a defined element. */\ndeclare function isDefined(expression: any): bool;\n/** Tests if the specified expression evaluates to a constant value. */\ndeclare function isConstant(expression: any): bool;\n/** Traps if the specified value is not true-ish, otherwise returns the value. */\ndeclare function assert(isTrueish: T | null, message?: string): T;\n/** Parses an integer string to a 64-bit float. */\ndeclare function parseInt(str: string, radix?: i32): f64;\n/** Parses an integer string to a 32-bit integer. */\ndeclare function parseI32(str: string, radix?: i32): i32;\n/** Parses a floating point string to a 64-bit float. */\ndeclare function parseFloat(str: string): f64;\n/** Returns the 64-bit floating-point remainder of `x/y`. */\ndeclare function fmod(x: f64, y: f64): f64;\n/** Returns the 32-bit floating-point remainder of `x/y`. */\ndeclare function fmodf(x: f32, y: f32): f32;\n\n/** Converts any other numeric value to an 8-bit signed integer. */\ndeclare function i8(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace i8 {\n /** Smallest representable value. */\n export const MIN_VALUE: i8;\n /** Largest representable value. */\n export const MAX_VALUE: i8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i8;\n}\n/** Converts any other numeric value to a 16-bit signed integer. */\ndeclare function i16(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace i16 {\n /** Smallest representable value. */\n export const MIN_VALUE: i16;\n /** Largest representable value. */\n export const MAX_VALUE: i16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i16;\n}\n/** Converts any other numeric value to a 32-bit signed integer. */\ndeclare function i32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i32;\ndeclare namespace i32 {\n /** Smallest representable value. */\n export const MIN_VALUE: i32;\n /** Largest representable value. */\n export const MAX_VALUE: i32;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i32;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) signed integer. */\ndeclare function isize(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): isize;\ndeclare namespace isize {\n /** Smallest representable value. */\n export const MIN_VALUE: isize;\n /** Largest representable value. */\n export const MAX_VALUE: isize;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): isize;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): isize;\n}\n/** Converts any other numeric value to an 8-bit unsigned integer. */\ndeclare function u8(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace u8 {\n /** Smallest representable value. */\n export const MIN_VALUE: u8;\n /** Largest representable value. */\n export const MAX_VALUE: u8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u8;\n}\n/** Converts any other numeric value to a 16-bit unsigned integer. */\ndeclare function u16(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace u16 {\n /** Smallest representable value. */\n export const MIN_VALUE: u16;\n /** Largest representable value. */\n export const MAX_VALUE: u16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u16;\n}\n/** Converts any other numeric value to a 32-bit unsigned integer. */\ndeclare function u32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i32;\ndeclare namespace u32 {\n /** Smallest representable value. */\n export const MIN_VALUE: u32;\n /** Largest representable value. */\n export const MAX_VALUE: u32;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u32;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) unsigned integer. */\ndeclare function usize(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): isize;\ndeclare namespace usize {\n /** Smallest representable value. */\n export const MIN_VALUE: usize;\n /** Largest representable value. */\n export const MAX_VALUE: usize;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): usize;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): usize;\n}\n/** Converts any other numeric value to a 1-bit unsigned integer. */\ndeclare function bool(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): bool;\ndeclare namespace bool {\n /** Smallest representable value. */\n export const MIN_VALUE: bool;\n /** Largest representable value. */\n export const MAX_VALUE: bool;\n}\n/** Converts any other numeric value to a 32-bit float. */\ndeclare function f32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): f32;\ndeclare namespace f32 {\n /** Smallest representable value. */\n export const MIN_VALUE: f32;\n /** Largest representable value. */\n export const MAX_VALUE: f32;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f32;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f32;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f32;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f32;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n export function isNaN(value: f32): bool;\n /** Returns true if passed value is finite. */\n export function isFinite(value: f32): bool;\n /** Returns true if the value passed is a safe integer. */\n export function isSafeInteger(value: f32): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n export function isInteger(value: f32): bool;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): f32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): f32;\n}\n/** Converts any other numeric value to a 64-bit float. */\ndeclare function f64(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): f64;\ndeclare namespace f64 {\n /** Smallest representable value. */\n export const MIN_VALUE: f64;\n /** Largest representable value. */\n export const MAX_VALUE: f64;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f64;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f64;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f64;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f64;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n export function isNaN(value: f32): bool;\n /** Returns true if passed value is finite. */\n export function isFinite(value: f32): bool;\n /** Returns true if the value passed is a safe integer. */\n export function isSafeInteger(value: f64): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n export function isInteger(value: f64): bool;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): f64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): f64;\n}\n\n// Polyfills\n\n/** [Polyfill] Performs the sign-agnostic reverse bytes **/\ndeclare function bswap(value: T): T;\n/** [Polyfill] Performs the sign-agnostic reverse bytes only for last 16-bit **/\ndeclare function bswap16(value: T): T;\n\n// Standard library\n\n/** Memory operations. */\ndeclare namespace memory {\n /** Allocates a chunk of memory of the specified size and returns a pointer to it. */\n function allocate(size: usize): usize;\n /** Disposes a chunk of memory by its pointer. */\n function free(ptr: usize): void;\n /** Copies n bytes from the specified source to the specified destination in memory. These regions may overlap. */\n function copy(dst: usize, src: usize, n: usize): void;\n /** Fills size bytes from from the specified destination by same value in memory. */\n function fill(dst: usize, value: u8, size: usize): void;\n /** Resets the allocator to its initial state, if supported. */\n function reset(): void;\n}\n\n/** Class representing a generic, fixed-length raw binary data buffer. */\ndeclare class ArrayBuffer {\n /** The size, in bytes, of the array. */\n readonly byteLength: i32;\n /** Returns true if value is one of the ArrayBuffer views, such as typed array or a DataView **/\n static isView(value: T): bool;\n /** Constructs a new array buffer of the given length in bytes. */\n constructor(length: i32);\n /** Returns a copy of this array buffer's bytes from begin, inclusive, up to end, exclusive. */\n slice(begin?: i32, end?: i32): ArrayBuffer;\n /** Returns a string representation of ArrayBuffer. */\n toString(): string;\n}\n\n/** The `DataView` view provides a low-level interface for reading and writing multiple number types in a binary `ArrayBuffer`, without having to care about the platform's endianness. */\ndeclare class DataView {\n /** The `buffer` accessor property represents the `ArrayBuffer` or `SharedArrayBuffer` referenced by the `DataView` at construction time. */\n readonly buffer: ArrayBuffer;\n /** The `byteLength` accessor property represents the length (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteLength: i32;\n /** The `byteOffset` accessor property represents the offset (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteOffset: i32;\n /** Constructs a new `DataView` with the given properties */\n constructor(buffer: ArrayBuffer, byteOffset?: i32, byteLength?: i32);\n /** The `getFloat32()` method gets a signed 32-bit float (float) at the specified byte offset from the start of the `DataView`. */\n getFloat32(byteOffset: i32, littleEndian?: boolean): f32;\n /** The `getFloat64()` method gets a signed 64-bit float (double) at the specified byte offset from the start of the `DataView`. */\n getFloat64(byteOffset: i32, littleEndian?: boolean): f64;\n /** The `getInt8()` method gets a signed 8-bit integer (byte) at the specified byte offset from the start of the `DataView`. */\n getInt8(byteOffset: i32): i8;\n /** The `getInt16()` method gets a signed 16-bit integer (short) at the specified byte offset from the start of the `DataView`. */\n getInt16(byteOffset: i32, littleEndian?: boolean): i16;\n /** The `getInt32()` method gets a signed 32-bit integer (long) at the specified byte offset from the start of the `DataView`. */\n getInt32(byteOffset: i32, littleEndian?: boolean): i32;\n /** The `getUint8()` method gets an unsigned 8-bit integer (unsigned byte) at the specified byte offset from the start of the `DataView`. */\n getUint8(byteOffset: i32): u8;\n /** The `getUint16()` method gets an unsigned 16-bit integer (unsigned short) at the specified byte offset from the start of the `DataView`. */\n getUint16(byteOffset: i32, littleEndian?: boolean): u16;\n /** The `getUint32()` method gets an unsigned 32-bit integer (unsigned long) at the specified byte offset from the start of the `DataView`. */\n getUint32(byteOffset: i32, littleEndian?: boolean): u32;\n /** The `setFloat32()` method stores a signed 32-bit float (float) value at the specified byte offset from the start of the `DataView`. */\n setFloat32(byteOffset: i32, value: f32, littleEndian?: boolean): void;\n /** The `setFloat64()` method stores a signed 64-bit float (double) value at the specified byte offset from the start of the `DataView`. */\n setFloat64(byteOffset: i32, value: f64, littleEndian?: boolean): void;\n /** The `setInt8()` method stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setInt8(byteOffset: i32, value: i8): void;\n /** The `setInt16()` method stores a signed 16-bit integer (short) value at the specified byte offset from the start of the `DataView`. */\n setInt16(byteOffset: i32, value: i16, littleEndian?: boolean): void;\n /** The `setInt32()` method stores a signed 32-bit integer (long) value at the specified byte offset from the start of the `DataView`. */\n setInt32(byteOffset: i32, value: i32, littleEndian?: boolean): void;\n /** The `setUint8()` method stores an unsigned 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setUint8(byteOffset: i32, value: u8): void;\n /** The `setUint16()` method stores an unsigned 16-bit integer (unsigned short) value at the specified byte offset from the start of the `DataView`. */\n setUint16(byteOffset: i32, value: u16, littleEndian?: boolean): void;\n /** The `setUint32()` method stores an unsigned 32-bit integer (unsigned long) value at the specified byte offset from the start of the `DataView`. */\n setUint32(byteOffset: i32, value: u32, littleEndian?: boolean): void;\n /** Returns a string representation of DataView. */\n toString(): string;\n}\n\ndeclare class Array {\n\n static isArray(value: any): value is Array;\n\n [key: number]: T;\n length: i32;\n constructor(capacity?: i32);\n\n fill(value: T, start?: i32, end?: i32): this;\n every(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n findIndex(predicate: (element: T, index: i32, array?: Array) => bool): i32;\n includes(searchElement: T, fromIndex?: i32): bool;\n indexOf(searchElement: T, fromIndex?: i32): i32;\n lastIndexOf(searchElement: T, fromIndex?: i32): i32;\n push(element: T): i32;\n concat(items: T[]): T[];\n copyWithin(target: i32, start: i32, end?: i32): this;\n pop(): T;\n forEach(callbackfn: (value: T, index: i32, array: Array) => void): void;\n map(callbackfn: (value: T, index: i32, array: Array) => U): Array;\n filter(callbackfn: (value: T, index: i32, array: Array) => bool): Array;\n reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n reduceRight(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n shift(): T;\n some(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n unshift(element: T): i32;\n slice(from?: i32, to?: i32): Array;\n splice(start: i32, deleteCount?: i32): Array;\n sort(comparator?: (a: T, b: T) => i32): this;\n join(separator?: string): string;\n reverse(): T[];\n toString(): string;\n}\n\ndeclare class Uint8Array extends Array {}\ndeclare class Uint8ClampedArray extends Array {}\ndeclare class Uint16Array extends Array {}\ndeclare class Uint32Array extends Array {}\ndeclare class Int8Array extends Array {}\ndeclare class Int16Array extends Array {}\ndeclare class Int32Array extends Array {}\ndeclare class Float32Array extends Array {}\ndeclare class Float64Array extends Array {}\n\n/** Interface for a typed view on an array buffer. */\ninterface ArrayBufferView {\n [key: number]: T;\n /** The {@link ArrayBuffer} referenced by this view. */\n readonly buffer: ArrayBuffer;\n /** The offset in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteOffset: i32;\n /** The length in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteLength: i32;\n}\n\ndeclare class String {\n\n static fromCharCode(ls: i32, hs?: i32): string;\n static fromCharCodes(arr: u16[]): string;\n static fromCodePoint(code: i32): string;\n static fromCodePoints(arr: i32[]): string;\n\n readonly length: i32;\n\n private constructor();\n\n charAt(index: i32): string;\n charCodeAt(index: i32): i32;\n concat(other: string): string;\n indexOf(other: string, fromIndex?: i32): i32;\n lastIndexOf(other: string, fromIndex?: i32): i32;\n includes(other: string): bool;\n startsWith(other: string): bool;\n endsWith(other: string): bool;\n substr(start: u32, length?: u32): string;\n substring(from: i32, to?: i32): string;\n trim(): string;\n trimLeft(): string;\n trimRight(): string;\n trimStart(): string;\n trimEnd(): string;\n padStart(targetLength: i32, padString?: string): string;\n padEnd(targetLength: i32, padString?: string): string;\n replace(search: string, replacement: string): string;\n repeat(count?: i32): string;\n slice(beginIndex: i32, endIndex?: i32): string;\n split(separator?: string, limit?: i32): string[];\n toString(): string;\n}\n\ninterface Boolean {}\n\ndeclare class Number {\n private constructor();\n toString(radix?: i32): string;\n}\n\ninterface Object {}\n\ninterface Function {}\n\ninterface RegExp {}\n\ninterface IArguments {}\n\n/** Class for representing a runtime error. Base class of all errors. */\ndeclare class Error {\n\n /** Error name. */\n name: string;\n\n /** Message provided on construction. */\n message: string;\n\n /** Stack trace. */\n stack?: string;\n\n /** Constructs a new error, optionally with a message. */\n constructor(message?: string);\n\n /** Method returns a string representing the specified Error class. */\n toString(): string;\n}\n\n/** Class for indicating an error when a value is not in the set or range of allowed values. */\ndeclare class RangeError extends Error { }\n\n/** Class for indicating an error when a value is not of the expected type. */\ndeclare class TypeError extends Error { }\n\n/** Class for indicating an error when trying to interpret syntactically invalid code. */\ndeclare class SyntaxError extends Error { }\n\ndeclare class Set {\n constructor(entries?: T[]);\n readonly size: i32;\n has(value: T): bool;\n add(value: T): void;\n delete(value: T): bool;\n clear(): void;\n toString(): string;\n [Symbol.iterator](): Iterator;\n}\n\ndeclare class Map {\n constructor(entries?: [K, V][]);\n readonly size: i32;\n set(key: K, value: V): void;\n has(key: K): bool;\n get(key: K): V | null;\n clear(): void;\n entries(): Iterable<[K, V]>;\n keys(): Iterable;\n values(): Iterable;\n delete(key: K): bool;\n toString(): string;\n [Symbol.iterator](): Iterator<[K,V]>;\n}\n\ninterface SymbolConstructor {\n readonly hasInstance: symbol;\n readonly isConcatSpreadable: symbol;\n readonly isRegExp: symbol;\n readonly iterator: symbol;\n readonly match: symbol;\n readonly replace: symbol;\n readonly search: symbol;\n readonly species: symbol;\n readonly split: symbol;\n readonly toPrimitive: symbol;\n readonly toStringTag: symbol;\n readonly unscopables: symbol;\n (description?: string | null): symbol;\n for(key: string): symbol;\n keyFor(sym: symbol): string | null;\n}\ndeclare const Symbol: SymbolConstructor;\n\ninterface Iterable {\n [Symbol.iterator](): Iterator;\n}\n\ninterface Iterator {}\n\ninterface IMath {\n readonly E: f64;\n readonly LN2: f64;\n readonly LN10: f64;\n readonly LOG2E: f64;\n readonly LOG10E: f64;\n readonly PI: f64;\n readonly SQRT1_2: f64;\n readonly SQRT2: f64;\n abs(x: f64): f64;\n acos(x: f64): f64;\n acosh(x: f64): f64;\n asin(x: f64): f64;\n asinh(x: f64): f64;\n atan(x: f64): f64;\n atan2(y: f64, x: f64): f64;\n atanh(x: f64): f64;\n cbrt(x: f64): f64;\n ceil(x: f64): f64;\n clz32(x: f64): i32;\n cos(x: f64): f64;\n cosh(x: f64): f64;\n exp(x: f64): f64;\n expm1(x: f64): f64;\n floor(x: f64): f64;\n fround(x: f64): f32;\n hypot(value1: f64, value2: f64): f64; // TODO: see std/math\n imul(a: f64, b: f64): i32;\n log(x: f64): f64;\n log10(x: f64): f64;\n log1p(x: f64): f64;\n log2(x: f64): f64;\n max(value1: f64, value2: f64): f64; // TODO: see std/math\n min(value1: f64, value2: f64): f64; // TODO: see std/math\n pow(base: f64, exponent: f64): f64;\n random(): f64;\n round(x: f64): f64;\n sign(x: f64): f64;\n signbit(x: f64): bool;\n sin(x: f64): f64;\n sinh(x: f64): f64;\n sqrt(x: f64): f64;\n tan(x: f64): f64;\n tanh(x: f64): f64;\n trunc(x: f64): f64;\n}\n\ndeclare const Math: IMath;\ndeclare const Mathf: IMath;\ndeclare const JSMath: IMath;\n\ndeclare class Date {\n /** Returns the UTC timestamp in milliseconds of the specified date. */\n static UTC(\n year: i32,\n month: i32,\n day: i32,\n hour: i32,\n minute: i32,\n second: i32,\n millisecond: i32\n ): number;\n /** Returns the current UTC timestamp in milliseconds. */\n static now(): number;\n /** Constructs a new date object from an UTC timestamp in milliseconds. */\n constructor(value: number);\n /** Returns the UTC timestamp of this date in milliseconds. */\n getTime(): number;\n /** Sets the UTC timestamp of this date in milliseconds. */\n setTime(value: number): number;\n}\n\ndeclare namespace console {\n /** @deprecated */\n function log(message: string): void;\n}\n"}):(()=>{const e=path.join(".","..","std");return{assembly:fs.readFileSync(path.join(e,"assembly","index.d.ts"),"utf8"),portable:fs.readFileSync(path.join(e,"portable","index.d.ts"),"utf8")}})(),exports.compileString=((e,n)=>{"string"==typeof e&&(e={"input.ts":e});const t=Object.create({stdout:createMemoryStream(),stderr:createMemoryStream()});var r=["--binaryFile","binary","--textFile","text"];return Object.keys(n||{}).forEach(e=>{var t=n[e];Array.isArray(t)?t.forEach(n=>r.push("--"+e,String(n))):r.push("--"+e,String(t))}),exports.main(r.concat(Object.keys(e)),{stdout:t.stdout,stderr:t.stderr,readFile:n=>e.hasOwnProperty(n)?e[n]:null,writeFile:(e,n)=>t[e]=n,listFiles:()=>[]}),t}),exports.main=function(e,n,t){"function"==typeof n?(t=n,n={}):n||(n={});const r=n.stdout||process.stdout,i=n.stderr||process.stderr,a=n.readFile||F,s=n.writeFile||z,o=n.listFiles||S,l=n.stats||createStats();if(!r)throw Error("'options.stdout' must be specified");if(!i)throw Error("'options.stderr' must be specified");const f=optionsUtil.parse(e,exports.options),u=f.options;if(e=f.arguments,u.noColors?colorsUtil.stdout.supported=colorsUtil.stderr.supported=!1:(colorsUtil.stdout=colorsUtil.from(r),colorsUtil.stderr=colorsUtil.from(i)),f.unknown.length&&f.unknown.forEach(e=>{i.write(colorsUtil.stderr.yellow("WARN: ")+"Unknown option '"+e+"'"+EOL)}),f.trailing.length&&i.write(colorsUtil.stderr.yellow("WARN: ")+"Unsupported trailing arguments: "+f.trailing.join(" ")+EOL),t||(t=function(e){var n=0;return e&&(i.write(colorsUtil.stderr.red("ERROR: ")+e.stack.replace(/^ERROR: /i,"")+EOL),n=1),n}),u.version)return r.write("Version "+exports.version+(isDev?"-dev":"")+EOL),t(null);if(u.help||!e.length){var c=u.help?r:i,p=u.help?colorsUtil.stdout:colorsUtil.stderr;return c.write([p.white("SYNTAX")," "+p.cyan("asc")+" [entryFile ...] [options]","",p.white("EXAMPLES")," "+p.cyan("asc")+" hello.ts"," "+p.cyan("asc")+" hello.ts -b hello.wasm -t hello.wat"," "+p.cyan("asc")+" hello1.ts hello2.ts -b -O > hello.wasm","",p.white("OPTIONS")].concat(optionsUtil.help(exports.options,24,EOL)).join(EOL)+EOL),t(null)}if(!fs.readFileSync){if(a===F)throw Error("'options.readFile' must be specified");if(s===z)throw Error("'options.writeFile' must be specified");if(o===S)throw Error("'options.listFiles' must be specified")}const d=u.baseDir?path.resolve(u.baseDir):".",h=[];u.transform&&u.transform.forEach(e=>h.push(__webpack_require__(12)(path.isAbsolute(e=e.trim())?e:path.join(process.cwd(),e))));var x=null;u.noLib?(l.parseCount++,l.parseTime+=measure(()=>{x=assemblyscript.parseFile(exports.libraryFiles.builtins,exports.libraryPrefix+"builtins.ts",!1,x)})):Object.keys(exports.libraryFiles).forEach(e=>{e.indexOf("/")>=0||(l.parseCount++,l.parseTime+=measure(()=>{x=assemblyscript.parseFile(exports.libraryFiles[e],exports.libraryPrefix+e+".ts",!1,x)}))});const b=[];if(u.lib){let e=u.lib;"string"==typeof e&&(e=e.split(",")),Array.prototype.push.apply(b,e.map(e=>e.trim()));for(let e=0,n=b.length;e{x=assemblyscript.parseFile(s,exports.libraryPrefix+i,!1,x)})}}}function y(){for(var e,n;null!=(e=x.nextFile());){if(e.startsWith(exports.libraryPrefix)){const t=e.substring(exports.libraryPrefix.length),r=e.substring(exports.libraryPrefix.length)+"/index";if(exports.libraryFiles.hasOwnProperty(t))n=exports.libraryFiles[t],e=exports.libraryPrefix+t+".ts";else if(exports.libraryFiles.hasOwnProperty(r))n=exports.libraryFiles[r],e=exports.libraryPrefix+r+".ts";else for(let i=0,s=b.length;i{assemblyscript.parseFile(n,e,!1,x)})}if(checkDiagnostics(x,i))return t(Error("Parse error"))}for(let n=0,r=e.length;n{x=assemblyscript.parseFile(s,i,!0,x)});let o=y();if(o)return o}!function(e,...n){h.forEach(t=>{"function"==typeof t[e]&&t[e](...n)})}("afterParse",x);{let e=y();if(e)return e}const g=assemblyscript.finishParsing(x);var m=0,v=0;u.optimize&&(m=exports.defaultOptimizeLevel,v=exports.defaultShrinkLevel),"number"==typeof u.optimizeLevel&&(m=u.optimizeLevel),"number"==typeof u.shrinkLevel&&(v=u.shrinkLevel),m=Math.min(Math.max(m,0),3),v=Math.min(Math.max(v,0),2);const E=assemblyscript.createOptions();if(assemblyscript.setTarget(E,0),assemblyscript.setNoAssert(E,u.noAssert),assemblyscript.setImportMemory(E,u.importMemory),assemblyscript.setSharedMemory(E,u.sharedMemory),assemblyscript.setImportTable(E,u.importTable),assemblyscript.setMemoryBase(E,u.memoryBase>>>0),assemblyscript.setSourceMap(E,null!=u.sourceMap),assemblyscript.setOptimizeLevelHints(E,m,v),u.noLib||(assemblyscript.setGlobalAlias(E,"Math","NativeMath"),assemblyscript.setGlobalAlias(E,"Mathf","NativeMathf"),assemblyscript.setGlobalAlias(E,"abort","~lib/env/abort"),assemblyscript.setGlobalAlias(E,"trace","~lib/env/trace")),u.use){let e=u.use;for(let n=0,r=e.length;n{try{l.compileTime+=measure(()=>{_=assemblyscript.compileProgram(g,E)})}catch(e){return t(e)}})(),checkDiagnostics(x,i))return _&&_.dispose(),t(Error("Compile error"));if(u.validate&&(l.validateCount++,l.validateTime+=measure(()=>{if(!_.validate())return _.dispose(),t(Error("Validate error"))})),"clamp"===u.trapMode)l.optimizeCount++,l.optimizeTime+=measure(()=>{_.runPasses(["trap-mode-clamp"])});else if("js"===u.trapMode)l.optimizeCount++,l.optimizeTime+=measure(()=>{_.runPasses(["trap-mode-js"])});else if("allow"!==u.trapMode)return _.dispose(),t(Error("Unsupported trap mode"));(m>=3||v>=2)&&(m=4),_.setOptimizeLevel(m),_.setShrinkLevel(v),_.setDebugInfo(u.debug);var A=[];if(u.runPasses&&("string"==typeof u.runPasses&&(u.runPasses=u.runPasses.split(",")),u.runPasses.length&&u.runPasses.forEach(e=>{A.indexOf(e)<0&&A.push(e)})),(m>0||v>0)&&(l.optimizeCount++,l.optimizeTime+=measure(()=>{_.optimize()})),A.length&&(l.optimizeCount++,l.optimizeTime+=measure(()=>{_.runPasses(A.map(e=>e.trim()))})),!u.noEmit){let e=!1,n=!1;if(null!=u.outFile&&(/\.was?t$/.test(u.outFile)&&null==u.textFile?u.textFile=u.outFile:/\.js$/.test(u.outFile)&&null==u.asmjsFile?u.asmjsFile=u.outFile:null==u.binaryFile&&(u.binaryFile=u.outFile)),null!=u.binaryFile){let r,o=null!=u.sourceMap?u.sourceMap.length?u.sourceMap:path.basename(u.binaryFile)+".map":null;if(l.emitCount++,l.emitTime+=measure(()=>{r=_.toBinary(o)}),u.binaryFile.length?s(u.binaryFile,r.output,d):(I(r.output),e=!0),n=!0,null!=r.sourceMap)if(u.binaryFile.length){let e=JSON.parse(r.sourceMap);e.sourceRoot=exports.sourceMapRoot,e.sources.forEach((n,r)=>{let i=null;if(n.startsWith(exports.libraryPrefix)){let e=n.substring(exports.libraryPrefix.length).replace(/\.ts$/,"");if(exports.libraryFiles.hasOwnProperty(e))i=exports.libraryFiles[e];else for(let e=0,t=b.length;e{t=_.toAsmjs()}),s(u.asmjsFile,t,d)):e||(l.emitCount++,l.emitTime+=measure(()=>{t=_.toAsmjs()}),I(t),e=!0),n=!0}if(null!=u.idlFile){let t;u.idlFile.length?(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildIDL(g)}),s(u.idlFile,t,d)):e||(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildIDL(g)}),I(t),e=!0),n=!0}if(null!=u.tsdFile){let t;u.tsdFile.length?(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildTSD(g)}),s(u.tsdFile,t,d)):e||(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildTSD(g)}),I(t),e=!0),n=!0}if(null!=u.textFile||!n){let n;u.textFile&&u.textFile.length?(l.emitCount++,l.emitTime+=measure(()=>{n=_.toText()}),s(u.textFile,n,d)):e||(l.emitCount++,l.emitTime+=measure(()=>{n=_.toText()}),I(n))}}return _.dispose(),u.measure&&printStats(l,i),t(null);function F(e,n){try{let t;return l.readCount++,l.readTime+=measure(()=>{t=fs.readFileSync(path.join(n,e),{encoding:"utf8"})}),t}catch(e){return null}}function z(e,n,t){try{return l.writeCount++,l.writeTime+=measure(()=>{mkdirp(path.join(t,path.dirname(e))),"string"==typeof n?fs.writeFileSync(path.join(t,e),n,{encoding:"utf8"}):fs.writeFileSync(path.join(t,e),n)}),!0}catch(e){return!1}}function S(e,n){var t;try{return l.readTime+=measure(()=>{t=fs.readdirSync(path.join(n,e)).filter(e=>/^(?!.*\.d\.ts$).*\.ts$/.test(e))}),t}catch(e){return[]}}function I(e){I.used||(l.writeCount++,I.used=!0),l.writeTime+=measure(()=>{"string"==typeof e?r.write(e,{encoding:"utf8"}):r.write(e)})}},exports.checkDiagnostics=checkDiagnostics,exports.createStats=createStats,process.hrtime||(process.hrtime=__webpack_require__(13)),exports.measure=measure,exports.formatTime=formatTime,exports.printStats=printStats;var allocBuffer=void 0!==global&&global.Buffer?global.Buffer.allocUnsafe||function(e){return new global.Buffer(e)}:function(e){return new Uint8Array(e)};function createMemoryStream(e){var n=[];return n.write=function(n){if(e&&e(n),"string"==typeof n){let e=allocBuffer(utf8.length(n));utf8.write(n,e,0),n=e}this.push(n)},n.reset=function(){n.length=0},n.toBuffer=function(){for(var e=0,n=0,t=this.length;n191&&r<224?a[s++]=(31&r)<<6|63&e[n++]:r>239&&r<365?(r=((7&r)<<18|(63&e[n++])<<12|(63&e[n++])<<6|63&e[n++])-65536,a[s++]=55296+(r>>10),a[s++]=56320+(1023&r)):a[s++]=(15&r)<<12|(63&e[n++])<<6|63&e[n++],s>8191&&((i||(i=[])).push(String.fromCharCode.apply(String,a)),s=0);return i?(s&&i.push(String.fromCharCode.apply(String,a.slice(0,s))),i.join("")):String.fromCharCode.apply(String,a.slice(0,s))},r.write=function(e,n,t){for(var r,i,a=t,s=0;s>6|192,n[t++]=63&r|128):55296==(64512&r)&&56320==(64512&(i=e.charCodeAt(s+1)))?(r=65536+((1023&r)<<10)+(1023&i),++s,n[t++]=r>>18|240,n[t++]=r>>12&63|128,n[t++]=r>>6&63|128,n[t++]=63&r|128):(n[t++]=r>>12|224,n[t++]=r>>6&63|128,n[t++]=63&r|128);return t-a}},function(e,n,t){(function(e){var t=void 0!==e&&e||{},r=t.env&&"CI"in t.env;function i(e,t){var i=t||{};return i.supported=e&&!!e.isTTY||r,i.gray=(e=>i.supported?n.GRAY+e+n.RESET:e),i.red=(e=>i.supported?n.RED+e+n.RESET:e),i.green=(e=>i.supported?n.GREEN+e+n.RESET:e),i.yellow=(e=>i.supported?n.YELLOW+e+n.RESET:e),i.blue=(e=>i.supported?n.BLUE+e+n.RESET:e),i.magenta=(e=>i.supported?n.MAGENTA+e+n.RESET:e),i.cyan=(e=>i.supported?n.CYAN+e+n.RESET:e),i.white=(e=>i.supported?n.WHITE+e+n.RESET:e),i}n.stdout=i(t.stdout,n),n.stderr=i(t.stderr),n.from=i,n.GRAY="",n.RED="",n.GREEN="",n.YELLOW="",n.BLUE="",n.MAGENTA="",n.CYAN="",n.WHITE="",n.RESET=""}).call(this,t(0))},function(e,n){n.parse=function(e,n){var t={},r=[],arguments=[],i=[],a={};Object.keys(n).forEach(e=>{var r=n[e];null!=r.alias&&("string"==typeof r.alias?a[r.alias]=e:Array.isArray(r.alias)&&r.alias.forEach(n=>a[n]=e)),null!=r.default&&(t[e]=r.default)});for(var s=0,o=(e=e.slice()).length;st[e]=o.value[e])}else r.push(i)}for(;s{var s=e[n];if(null!=s.description){for(var o="";o.length{for(let n=0;n=0;r--){var i=e[r];"."===i?e.splice(r,1):".."===i?(e.splice(r,1),t++):t&&(e.splice(r,1),t--)}if(n)for(;t--;t)e.unshift("..");return e}var r=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,i=function(e){return r.exec(e).slice(1)};function a(e,n){if(e.filter)return e.filter(n);for(var t=[],r=0;r=-1&&!r;i--){var s=i>=0?arguments[i]:e.cwd();if("string"!=typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(n=s+"/"+n,r="/"===s.charAt(0))}return(r?"/":"")+(n=t(a(n.split("/"),function(e){return!!e}),!r).join("/"))||"."},n.normalize=function(e){var r=n.isAbsolute(e),i="/"===s(e,-1);return(e=t(a(e.split("/"),function(e){return!!e}),!r).join("/"))||r||(e="."),e&&i&&(e+="/"),(r?"/":"")+e},n.isAbsolute=function(e){return"/"===e.charAt(0)},n.join=function(){var e=Array.prototype.slice.call(arguments,0);return n.normalize(a(e,function(e,n){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e}).join("/"))},n.relative=function(e,t){function r(e){for(var n=0;n=0&&""===e[t];t--);return n>t?[]:e.slice(n,t-n+1)}e=n.resolve(e).substr(1),t=n.resolve(t).substr(1);for(var i=r(e.split("/")),a=r(t.split("/")),s=Math.min(i.length,a.length),o=s,l=0;l{try{assemblyscript=__webpack_require__(10)}catch(e){try{__webpack_require__(!function(){var e=new Error("Cannot find module 'ts-node'");throw e.code="MODULE_NOT_FOUND",e}()).register({project:path.join(".","..","src","tsconfig.json")}),__webpack_require__(!function(){var e=new Error("Cannot find module '../src/glue/js'");throw e.code="MODULE_NOT_FOUND",e}()),assemblyscript=__webpack_require__(!function(){var e=new Error("Cannot find module '../src'");throw e.code="MODULE_NOT_FOUND",e}()),isDev=!0}catch(e_ts){try{assemblyscript=eval("require('./assemblyscript')")}catch(e){throw e.stack=e_ts.stack+"\n---\n"+e.stack,e}}}})(),exports.isBundle=!0,exports.isDev=isDev,exports.version=exports.isBundle?"0.6.0":__webpack_require__(!function(){var e=new Error("Cannot find module '../package.json'");throw e.code="MODULE_NOT_FOUND",e}()).version,exports.options=__webpack_require__(11),exports.sourceMapRoot="assemblyscript:///",exports.libraryPrefix=assemblyscript.LIBRARY_PREFIX,exports.defaultOptimizeLevel=2,exports.defaultShrinkLevel=1,exports.libraryFiles=exports.isBundle?Object({"allocator/arena":'/**\n * Arena Memory Allocator\n *\n * Provides a `memory.reset` function to reset the heap to its initial state. A user has to make\n * sure that there are no more references to cleared memory afterwards. Always aligns to 8 bytes.\n *\n * @module std/assembly/allocator/arena\n *//***/\n\nimport { AL_MASK, MAX_SIZE_32 } from "../internal/allocator";\n\nvar startOffset: usize = (HEAP_BASE + AL_MASK) & ~AL_MASK;\nvar offset: usize = startOffset;\n\n// Memory allocator interface\n\n@global export function __memory_allocate(size: usize): usize {\n if (size > MAX_SIZE_32) unreachable();\n var ptr = offset;\n var newPtr = (ptr + max(size, 1) + AL_MASK) & ~AL_MASK;\n var pagesBefore = memory.size();\n if (newPtr > pagesBefore << 16) {\n let pagesNeeded = ((newPtr - ptr + 0xffff) & ~0xffff) >>> 16;\n let pagesWanted = max(pagesBefore, pagesNeeded); // double memory\n if (memory.grow(pagesWanted) < 0) {\n if (memory.grow(pagesNeeded) < 0) {\n unreachable(); // out of memory\n }\n }\n }\n offset = newPtr;\n return ptr;\n}\n\n@global export function __memory_free(ptr: usize): void { /* nop */ }\n\n@global export function __memory_reset(): void {\n offset = startOffset;\n}\n',"allocator/buddy":'/**\n * Buddy Memory Allocator.\n * @module std/assembly/allocator/buddy\n *//***/\n\n/*\n Copyright 2018 Evan Wallace\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the "Software"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n\n*/// see: https://github.com/evanw/buddy-malloc\n\n/*\n * This file implements a buddy memory allocator, which is an allocator that\n * allocates memory within a fixed linear address range. It spans the address\n * range with a binary tree that tracks free space. Both "malloc" and "free"\n * are O(log N) time where N is the maximum possible number of allocations.\n *\n * The "buddy" term comes from how the tree is used. When memory is allocated,\n * nodes in the tree are split recursively until a node of the appropriate size\n * is reached. Every split results in two child nodes, each of which is the\n * buddy of the other. When a node is freed, the node and its buddy can be\n * merged again if the buddy is also free. This makes the memory available\n * for larger allocations again.\n */\n\n/*\n * Every allocation needs an 8-byte header to store the allocation size while\n * staying 8-byte aligned. The address returned by "malloc" is the address\n * right after this header (i.e. the size occupies the 8 bytes before the\n * returned address).\n */\nconst HEADER_SIZE: usize = 8;\n\n/*\n * The minimum allocation size is 16 bytes because we have an 8-byte header and\n * we need to stay 8-byte aligned.\n */\nconst MIN_ALLOC_LOG2: usize = 4;\nconst MIN_ALLOC: usize = 1 << MIN_ALLOC_LOG2;\n\n/*\n * The maximum allocation size is currently set to 2gb. This is the total size\n * of the heap. It\'s technically also the maximum allocation size because the\n * heap could consist of a single allocation of this size. But of course real\n * heaps will have multiple allocations, so the real maximum allocation limit\n * is at most 1gb.\n */\nconst MAX_ALLOC_LOG2: usize = 30; // 31;\nconst MAX_ALLOC: usize = 1 << MAX_ALLOC_LOG2;\n\n/*\n * Allocations are done in powers of two starting from MIN_ALLOC and ending at\n * MAX_ALLOC inclusive. Each allocation size has a bucket that stores the free\n * list for that allocation size.\n *\n * Given a bucket index, the size of the allocations in that bucket can be\n * found with "(size_t)1 << (MAX_ALLOC_LOG2 - bucket)".\n */\nconst BUCKET_COUNT: usize = MAX_ALLOC_LOG2 - MIN_ALLOC_LOG2 + 1;\n\n/*\n * Free lists are stored as circular doubly-linked lists. Every possible\n * allocation size has an associated free list that is threaded through all\n * currently free blocks of that size. That means MIN_ALLOC must be at least\n * "sizeof(list_t)". MIN_ALLOC is currently 16 bytes, so this will be true for\n * both 32-bit and 64-bit.\n */\n@unmanaged\nclass List {\n prev: List;\n next: List;\n static readonly SIZE: usize = 2 * sizeof();\n}\n\n/*\n * Each bucket corresponds to a certain allocation size and stores a free list\n * for that size. The bucket at index 0 corresponds to an allocation size of\n * MAX_ALLOC (i.e. the whole address space).\n */\nvar BUCKETS_START: usize = HEAP_BASE;\nvar BUCKETS_END: usize = BUCKETS_START + BUCKET_COUNT * List.SIZE;\n\nfunction buckets$get(index: usize): List {\n assert(index < BUCKET_COUNT);\n return changetype(BUCKETS_START + index * List.SIZE);\n}\n\n/*\n * We could initialize the allocator by giving it one free block the size of\n * the entire address space. However, this would cause us to instantly reserve\n * half of the entire address space on the first allocation, since the first\n * split would store a free list entry at the start of the right child of the\n * root. Instead, we have the tree start out small and grow the size of the\n * tree as we use more memory. The size of the tree is tracked by this value.\n */\nvar bucket_limit: usize;\n\n/*\n * This array represents a linearized binary tree of bits. Every possible\n * allocation larger than MIN_ALLOC has a node in this tree (and therefore a\n * bit in this array).\n *\n * Given the index for a node, lineraized binary trees allow you to traverse to\n * the parent node or the child nodes just by doing simple arithmetic on the\n * index:\n *\n * - Move to parent: index = (index - 1) / 2;\n * - Move to left child: index = index * 2 + 1;\n * - Move to right child: index = index * 2 + 2;\n * - Move to sibling: index = ((index - 1) ^ 1) + 1;\n *\n * Each node in this tree can be in one of several states:\n *\n * - UNUSED (both children are UNUSED)\n * - SPLIT (one child is UNUSED and the other child isn\'t)\n * - USED (neither children are UNUSED)\n *\n * These states take two bits to store. However, it turns out we have enough\n * information to distinguish between UNUSED and USED from context, so we only\n * need to store SPLIT or not, which only takes a single bit.\n *\n * Note that we don\'t need to store any nodes for allocations of size MIN_ALLOC\n * since we only ever care about parent nodes.\n */\nconst SPLIT_COUNT: usize = (1 << (BUCKET_COUNT - 1)) / 8;\nvar NODE_IS_SPLIT_START: usize = BUCKETS_END;\nvar NODE_IS_SPLIT_END: usize = NODE_IS_SPLIT_START + SPLIT_COUNT * sizeof();\n\nfunction node_is_split$get(index: usize): i32 {\n assert(index < SPLIT_COUNT);\n return load(NODE_IS_SPLIT_START + index);\n}\n\nfunction node_is_split$set(index: usize, state: i32): void {\n assert(index < SPLIT_COUNT);\n store(NODE_IS_SPLIT_START + index, state);\n}\n\n/*\n * This is the starting address of the address range for this allocator. Every\n * returned allocation will be an offset of this pointer from 0 to MAX_ALLOC.\n */\nvar base_ptr: usize;\n\n/*\n * This is the maximum address that has ever been used by the allocator. It\'s\n * used to know when to call "brk" to request more memory from the kernel.\n */\nvar max_ptr: usize;\n\n/*\n * Make sure all addresses before "new_value" are valid and can be used. Memory\n * is allocated in a 2gb address range but that memory is not reserved up\n * front. It\'s only reserved when it\'s needed by calling this function. This\n * will return false if the memory could not be reserved.\n */\nfunction update_max_ptr(new_value: usize): i32 {\n if (new_value > max_ptr) {\n // if (brk(new_value)) {\n // return 0;\n // }\n let oldPages = memory.size();\n let newPages = (((new_value + 0xffff) & ~0xffff) >>> 16);\n assert(newPages > oldPages);\n if (memory.grow(newPages - oldPages) < 0) {\n return 0;\n }\n // max_ptr = new_value;\n max_ptr = newPages << 16;\n }\n return 1;\n}\n\n/*\n * Initialize a list to empty. Because these are circular lists, an "empty"\n * list is an entry where both links point to itself. This makes insertion\n * and removal simpler because they don\'t need any branches.\n */\nfunction list_init(list: List): void {\n list.prev = list;\n list.next = list;\n}\n\n/*\n * Append the provided entry to the end of the list. This assumes the entry\n * isn\'t in a list already because it overwrites the linked list pointers.\n */\nfunction list_push(list: List, entry: List): void {\n var prev = list.prev;\n entry.prev = prev;\n entry.next = list;\n prev.next = entry;\n list.prev = entry;\n}\n\n/*\n * Remove the provided entry from whichever list it\'s currently in. This\n * assumes that the entry is in a list. You don\'t need to provide the list\n * because the lists are circular, so the list\'s pointers will automatically\n * be updated if the first or last entries are removed.\n */\nfunction list_remove(entry: List): void {\n var prev = entry.prev;\n var next = entry.next;\n prev.next = next;\n next.prev = prev;\n}\n\n/*\n * Remove and return the first entry in the list or NULL if the list is empty.\n */\nfunction list_pop(list: List): List | null {\n var back = list.prev;\n if (back == list) return null;\n list_remove(back);\n return back;\n}\n\n/*\n * This maps from the index of a node to the address of memory that node\n * represents. The bucket can be derived from the index using a loop but is\n * required to be provided here since having them means we can avoid the loop\n * and have this function return in constant time.\n */\nfunction ptr_for_node(index: usize, bucket: usize): usize {\n return base_ptr + ((index - (1 << bucket) + 1) << (MAX_ALLOC_LOG2 - bucket));\n}\n\n/*\n * This maps from an address of memory to the node that represents that\n * address. There are often many nodes that all map to the same address, so\n * the bucket is needed to uniquely identify a node.\n */\nfunction node_for_ptr(ptr: usize, bucket: usize): usize {\n return ((ptr - base_ptr) >> (MAX_ALLOC_LOG2 - bucket)) + (1 << bucket) - 1;\n}\n\n/*\n * Given the index of a node, this returns the "is split" flag of the parent.\n */\nfunction parent_is_split(index: usize): bool {\n index = (index - 1) / 2;\n return ((node_is_split$get(index / 8) >>> (index % 8)) & 1) == 1;\n}\n\n/*\n * Given the index of a node, this flips the "is split" flag of the parent.\n */\nfunction flip_parent_is_split(index: usize): void {\n index = (index - 1) / 2;\n var indexDiv8 = index / 8;\n node_is_split$set(indexDiv8,\n node_is_split$get(indexDiv8) ^ (1 << (index % 8))\n );\n}\n\n/*\n * Given the requested size passed to "malloc", this function returns the index\n * of the smallest bucket that can fit that size.\n */\nfunction bucket_for_request(request: usize): usize {\n var bucket = BUCKET_COUNT - 1;\n var size = MIN_ALLOC;\n\n while (size < request) {\n bucket--;\n size *= 2;\n }\n\n return bucket;\n}\n\n/*\n * The tree is always rooted at the current bucket limit. This call grows the\n * tree by repeatedly doubling it in size until the root lies at the provided\n * bucket index. Each doubling lowers the bucket limit by 1.\n */\nfunction lower_bucket_limit(bucket: usize): u32 {\n while (bucket < bucket_limit) {\n let root = node_for_ptr(base_ptr, bucket_limit);\n let right_child: usize;\n\n /*\n * If the parent isn\'t SPLIT, that means the node at the current bucket\n * limit is UNUSED and our address space is entirely free. In that case,\n * clear the root free list, increase the bucket limit, and add a single\n * block with the newly-expanded address space to the new root free list.\n */\n if (!parent_is_split(root)) {\n list_remove(changetype(base_ptr));\n list_init(buckets$get(--bucket_limit));\n list_push(buckets$get(bucket_limit), changetype(base_ptr));\n continue;\n }\n\n /*\n * Otherwise, the tree is currently in use. Create a parent node for the\n * current root node in the SPLIT state with a right child on the free\n * list. Make sure to reserve the memory for the free list entry before\n * writing to it. Note that we do not need to flip the "is split" flag for\n * our current parent because it\'s already on (we know because we just\n * checked it above).\n */\n right_child = ptr_for_node(root + 1, bucket_limit);\n if (!update_max_ptr(right_child + List.SIZE)) {\n return 0;\n }\n list_push(buckets$get(bucket_limit), changetype(right_child));\n list_init(buckets$get(--bucket_limit));\n\n /*\n * Set the grandparent\'s SPLIT flag so if we need to lower the bucket limit\n * again, we\'ll know that the new root node we just added is in use.\n */\n root = (root - 1) / 2;\n if (root != 0) {\n flip_parent_is_split(root);\n }\n }\n\n return 1;\n}\n\n// Memory allocator interface\n\n@global export function __memory_allocate(request: usize): usize {\n var original_bucket: usize, bucket: usize;\n\n /*\n * Make sure it\'s possible for an allocation of this size to succeed. There\'s\n * a hard-coded limit on the maximum allocation size because of the way this\n * allocator works.\n */\n if (request > MAX_ALLOC - HEADER_SIZE) unreachable();\n\n /*\n * Initialize our global state if this is the first call to "malloc". At the\n * beginning, the tree has a single node that represents the smallest\n * possible allocation size. More memory will be reserved later as needed.\n */\n if (base_ptr == 0) {\n // base_ptr = max_ptr = (uint8_t *)sbrk(0);\n base_ptr = (NODE_IS_SPLIT_END + 7) & ~7; // must be aligned\n max_ptr = memory.size() << 16; // must grow first\n bucket_limit = BUCKET_COUNT - 1;\n if (!update_max_ptr(base_ptr + List.SIZE)) {\n return 0;\n }\n list_init(buckets$get(BUCKET_COUNT - 1));\n list_push(buckets$get(BUCKET_COUNT - 1), changetype(base_ptr));\n }\n\n /*\n * Find the smallest bucket that will fit this request. This doesn\'t check\n * that there\'s space for the request yet.\n */\n bucket = bucket_for_request(request + HEADER_SIZE);\n original_bucket = bucket;\n\n /*\n * Search for a bucket with a non-empty free list that\'s as large or larger\n * than what we need. If there isn\'t an exact match, we\'ll need to split a\n * larger one to get a match.\n */\n while (bucket + 1 != 0) {\n let size: usize, bytes_needed: usize, i: usize;\n let ptr: usize;\n\n /*\n * We may need to grow the tree to be able to fit an allocation of this\n * size. Try to grow the tree and stop here if we can\'t.\n */\n if (!lower_bucket_limit(bucket)) {\n return 0;\n }\n\n /*\n * Try to pop a block off the free list for this bucket. If the free list\n * is empty, we\'re going to have to split a larger block instead.\n */\n ptr = changetype(list_pop(buckets$get(bucket)));\n if (!ptr) {\n /*\n * If we\'re not at the root of the tree or it\'s impossible to grow the\n * tree any more, continue on to the next bucket.\n */\n if (bucket != bucket_limit || bucket == 0) {\n bucket--;\n continue;\n }\n\n /*\n * Otherwise, grow the tree one more level and then pop a block off the\n * free list again. Since we know the root of the tree is used (because\n * the free list was empty), this will add a parent above this node in\n * the SPLIT state and then add the new right child node to the free list\n * for this bucket. Popping the free list will give us this right child.\n */\n if (!lower_bucket_limit(bucket - 1)) {\n return 0;\n }\n ptr = changetype(list_pop(buckets$get(bucket)));\n }\n\n /*\n * Try to expand the address space first before going any further. If we\n * have run out of space, put this block back on the free list and fail.\n */\n size = 1 << (MAX_ALLOC_LOG2 - bucket);\n bytes_needed = bucket < original_bucket ? size / 2 + List.SIZE : size;\n if (!update_max_ptr(ptr + bytes_needed)) {\n list_push(buckets$get(bucket), changetype(ptr));\n return 0;\n }\n\n /*\n * If we got a node off the free list, change the node from UNUSED to USED.\n * This involves flipping our parent\'s "is split" bit because that bit is\n * the exclusive-or of the UNUSED flags of both children, and our UNUSED\n * flag (which isn\'t ever stored explicitly) has just changed.\n *\n * Note that we shouldn\'t ever need to flip the "is split" bit of our\n * grandparent because we know our buddy is USED so it\'s impossible for our\n * grandparent to be UNUSED (if our buddy chunk was UNUSED, our parent\n * wouldn\'t ever have been split in the first place).\n */\n i = node_for_ptr(ptr, bucket);\n if (i != 0) {\n flip_parent_is_split(i);\n }\n\n /*\n * If the node we got is larger than we need, split it down to the correct\n * size and put the new unused child nodes on the free list in the\n * corresponding bucket. This is done by repeatedly moving to the left\n * child, splitting the parent, and then adding the right child to the free\n * list.\n */\n while (bucket < original_bucket) {\n i = i * 2 + 1;\n bucket++;\n flip_parent_is_split(i);\n list_push(\n buckets$get(bucket),\n changetype(ptr_for_node(i + 1, bucket))\n );\n }\n\n /*\n * Now that we have a memory address, write the block header (just the size\n * of the allocation) and return the address immediately after the header.\n */\n store(ptr, request);\n return ptr + HEADER_SIZE;\n }\n\n return 0;\n}\n\n@global export function __memory_free(ptr: usize): void {\n var bucket: usize, i: usize;\n\n /*\n * Ignore any attempts to free a NULL pointer.\n */\n if (!ptr) {\n return;\n }\n\n /*\n * We were given the address returned by "malloc" so get back to the actual\n * address of the node by subtracting off the size of the block header. Then\n * look up the index of the node corresponding to this address.\n */\n ptr = ptr - HEADER_SIZE;\n bucket = bucket_for_request(load(ptr) + HEADER_SIZE);\n i = node_for_ptr(ptr, bucket);\n\n /*\n * Traverse up to the root node, flipping USED blocks to UNUSED and merging\n * UNUSED buddies together into a single UNUSED parent.\n */\n while (i != 0) {\n /*\n * Change this node from UNUSED to USED. This involves flipping our\n * parent\'s "is split" bit because that bit is the exclusive-or of the\n * UNUSED flags of both children, and our UNUSED flag (which isn\'t ever\n * stored explicitly) has just changed.\n */\n flip_parent_is_split(i);\n\n /*\n * If the parent is now SPLIT, that means our buddy is USED, so don\'t merge\n * with it. Instead, stop the iteration here and add ourselves to the free\n * list for our bucket.\n *\n * Also stop here if we\'re at the current root node, even if that root node\n * is now UNUSED. Root nodes don\'t have a buddy so we can\'t merge with one.\n */\n if (parent_is_split(i) || bucket == bucket_limit) {\n break;\n }\n\n /*\n * If we get here, we know our buddy is UNUSED. In this case we should\n * merge with that buddy and continue traversing up to the root node. We\n * need to remove the buddy from its free list here but we don\'t need to\n * add the merged parent to its free list yet. That will be done once after\n * this loop is finished.\n */\n list_remove(changetype(ptr_for_node(((i - 1) ^ 1) + 1, bucket)));\n i = (i - 1) / 2;\n bucket--;\n }\n\n /*\n * Add ourselves to the free list for our bucket. We add to the back of the\n * list because "malloc" takes from the back of the list and we want a "free"\n * followed by a "malloc" of the same size to ideally use the same address\n * for better memory locality.\n */\n list_push(buckets$get(bucket), changetype(ptr_for_node(i, bucket)));\n}\n',"allocator/emscripten":"/**\n * Emscripten Memory Allocator.\n *\n * Uses Emscripten's exported _malloc and _free implementations, i.e., when linking with\n * Emscripten-compiled programs that already provide these. Differs from 'system' in that their\n * names are prefixed with an underscore.\n *\n * @module std/assembly/allocator/emscripten\n *//***/\n\ndeclare function _malloc(size: usize): usize;\ndeclare function _free(ptr: usize): void;\n\n// Memory allocator interface\n\n@global export function __memory_allocate(size: usize): usize {\n return _malloc(size);\n}\n\n@global export function __memory_free(ptr: usize): void {\n _free(ptr);\n}\n","allocator/system":"/**\n * System Memory Allocator.\n *\n * Uses the environment's malloc and free implementations, i.e., when linking with other C-like\n * programs that already provide these.\n *\n * @module std/assembly/allocator/system\n *//***/\n\ndeclare function malloc(size: usize): usize;\ndeclare function free(ptr: usize): void;\n\n// Memory allocator interface\n\n@global export function __memory_allocate(size: usize): usize {\n return malloc(size);\n}\n\n@global export function __memory_free(ptr: usize): void {\n free(ptr);\n}\n","allocator/tlsf":"/**\n * Two-Level Segregate Fit Memory Allocator.\n *\n * A general purpose dynamic memory allocator specifically designed to meet real-time requirements.\n * Always aligns to 8 bytes.\n *\n * @module std/assembly/allocator/tlsf\n *//***/\n\n// ╒══════════════ Block size interpretation (32-bit) ═════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┼─┴─┴─┴─┴─╫─┴─┴─┤\n// │ | FL │ SB = SL + AL │ ◄─ usize\n// └───────────────────────────────────────────────┴─────────╨─────┘\n// FL: first level, SL: second level, AL: alignment, SB: small block\n\nimport {\n AL_BITS,\n AL_SIZE,\n AL_MASK\n} from \"../internal/allocator\";\n\nconst SL_BITS: u32 = 5;\nconst SL_SIZE: usize = 1 << SL_BITS;\n\nconst SB_BITS: usize = (SL_BITS + AL_BITS);\nconst SB_SIZE: usize = 1 << SB_BITS;\n\nconst FL_BITS: u32 = (sizeof() == sizeof()\n ? 30 // ^= up to 1GB per block\n : 32 // ^= up to 4GB per block\n) - SB_BITS;\n\n// ╒════════════════ Block structure layout (32-bit) ══════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┼─┼─┤\n// │ size │L│F│ ◄─┐ info\n// ╞═══════════════════════════════════════════════════════════╧═╧═╡ │ ┐\n// │ if free: ◄ prev │ ◄─┤ usize\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ if free: next ► │ ◄─┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ ... unused free space >= 0 ... │ │ = 0\n// ├ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┤ │\n// │ if free: jump ▲ │ ◄─┘\n// └───────────────────────────────────────────────────────────────┘ MIN SIZE ┘\n// F: FREE, L: LEFT_FREE\n\n/** Tag indicating that this block is free. */\nconst FREE: usize = 1 << 0;\n/** Tag indicating that this block's left block is free. */\nconst LEFT_FREE: usize = 1 << 1;\n/** Mask to obtain all tags. */\nconst TAGS: usize = FREE | LEFT_FREE;\n\n/** Block structure. */\n@unmanaged\nclass Block {\n\n /** Info field holding this block's size and tags. */\n info: usize;\n\n /** End offset of the {@link Block#info} field. User data starts here. */\n static readonly INFO: usize = (sizeof() + AL_MASK) & ~AL_MASK;\n\n /** Previous free block, if any. Only valid if free. */\n prev: Block | null;\n /** Next free block, if any. Only valid if free. */\n next: Block | null;\n\n /** Minimum size of a block, excluding {@link Block#info}. */\n static readonly MIN_SIZE: usize = (3 * sizeof() + AL_MASK) & ~AL_MASK;// prev + next + jump\n\n /** Maximum size of a used block, excluding {@link Block#info}. */\n static readonly MAX_SIZE: usize = 1 << (FL_BITS + SB_BITS);\n\n /** Gets this block's left (free) block in memory. */\n get left(): Block {\n assert(this.info & LEFT_FREE); // must be free to contain a jump\n return assert(\n load(changetype(this) - sizeof())\n ); // can't be null\n }\n\n /** Gets this block's right block in memory. */\n get right(): Block {\n assert(this.info & ~TAGS); // can't skip beyond the tail block\n return assert(\n changetype(\n changetype(this) + Block.INFO + (this.info & ~TAGS)\n )\n ); // can't be null\n }\n}\n\n// ╒════════════════ Root structure layout (32-bit) ═══════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┤ ┐\n// │ 0 | flMap S│ ◄────┐\n// ╞═══════════════════════════════════════════════════════════════╡ │\n// │ slMap[0] S │ ◄─┐ │\n// ├───────────────────────────────────────────────────────────────┤ │ │\n// │ slMap[1] │ ◄─┤ │\n// ├───────────────────────────────────────────────────────────────┤ u32 │\n// │ ... │ ◄─┤ │\n// ├───────────────────────────────────────────────────────────────┤ │ │\n// │ slMap[22] P │ ◄─┘ │\n// ╞═══════════════════════════════════════════════════════════════╡ usize\n// │ head[0] │ ◄────┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ ... │ ◄────┤\n// ├───────────────────────────────────────────────────────────────┤ │\n// │ head[736] │ ◄────┤\n// ╞═══════════════════════════════════════════════════════════════╡ │\n// │ tailRef │ ◄────┘\n// └───────────────────────────────────────────────────────────────┘ SIZE ┘\n// S: Small blocks map, P: Possibly padded if 64-bit\n\nassert((1 << SL_BITS) <= 32); // second level must fit into 32 bits\n\n/** Root structure. */\n@unmanaged\nclass Root {\n\n /** First level bitmap. */\n flMap: usize = 0;\n\n /** Start offset of second level maps. */\n private static readonly SL_START: usize = sizeof();\n\n // Using *one* SL map per *FL bit*\n\n /** Gets the second level map for the specified first level. */\n getSLMap(fl: usize): u32 {\n assert(fl < FL_BITS); // fl out of range\n return load(changetype(this) + fl * 4, Root.SL_START);\n }\n\n /** Sets the second level map for the specified first level. */\n setSLMap(fl: usize, value: u32): void {\n assert(fl < FL_BITS); // fl out of range\n store(changetype(this) + fl * 4, value, Root.SL_START);\n }\n\n /** End offset of second level maps. */\n private static readonly SL_END: usize = Root.SL_START + FL_BITS * 4;\n\n // Using *number bits per SL* heads per *FL bit*\n\n /** Start offset of FL/SL heads. */\n private static readonly HL_START: usize = (Root.SL_END + AL_MASK) & ~AL_MASK;\n\n /** Gets the head of the specified first and second level index. */\n getHead(fl: usize, sl: u32): Block | null {\n assert(fl < FL_BITS); // fl out of range\n assert(sl < SL_SIZE); // sl out of range\n return changetype(load(\n changetype(this) + (fl * SL_SIZE + sl) * sizeof()\n , Root.HL_START));\n }\n\n /** Sets the head of the specified first and second level index. */\n setHead(fl: usize, sl: u32, value: Block | null): void {\n assert(fl < FL_BITS); // fl out of range\n assert(sl < SL_SIZE); // sl out of range\n store(\n changetype(this) + (fl * SL_SIZE + sl) * sizeof()\n , changetype(value)\n , Root.HL_START);\n }\n\n /** End offset of FL/SL heads. */\n private static readonly HL_END: usize = (\n Root.HL_START + FL_BITS * SL_SIZE * sizeof()\n );\n\n get tailRef(): usize { return load(0, Root.HL_END); }\n set tailRef(value: usize) { store(0, value, Root.HL_END); }\n\n /** Total size of the {@link Root} structure. */\n static readonly SIZE: usize = Root.HL_END + sizeof();\n\n /** Inserts a previously used block back into the free list. */\n insert(block: Block): void {\n // check as much as possible here to prevent invalid free blocks\n assert(block); // cannot be null\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free\n var size: usize;\n assert(\n (size = block.info & ~TAGS) >= Block.MIN_SIZE && size < Block.MAX_SIZE\n ); // must be valid, not necessary to compute yet if noAssert=true\n\n var right: Block = assert(block.right); // can't be null\n var rightInfo = right.info;\n\n // merge with right block if also free\n if (rightInfo & FREE) {\n this.remove(right);\n block.info = (blockInfo += Block.INFO + (rightInfo & ~TAGS));\n right = block.right;\n rightInfo = right.info;\n // jump is set below\n }\n\n // merge with left block if also free\n if (blockInfo & LEFT_FREE) {\n let left: Block = assert(block.left); // can't be null\n let leftInfo = left.info;\n assert(leftInfo & FREE); // must be free according to tags\n this.remove(left);\n left.info = (leftInfo += Block.INFO + (blockInfo & ~TAGS));\n block = left;\n blockInfo = leftInfo;\n // jump is set below\n }\n\n right.info = rightInfo | LEFT_FREE;\n this.setJump(block, right);\n // right is no longer used now, hence rightInfo is not synced\n\n size = blockInfo & ~TAGS;\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n\n // mapping_insert\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n\n // perform insertion\n var head = this.getHead(fl, sl);\n block.prev = null;\n block.next = head;\n if (head) head.prev = block;\n this.setHead(fl, sl, block);\n\n // update first and second level maps\n this.flMap |= (1 << fl);\n this.setSLMap(fl, this.getSLMap(fl) | (1 << sl));\n }\n\n /**\n * Removes a free block from FL/SL maps. Does not alter left/jump because it\n * is likely that splitting is performed afterwards, invalidating any changes\n * again.\n */\n private remove(block: Block): void {\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free\n var size = blockInfo & ~TAGS;\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n\n // mapping_insert\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n }\n\n // link previous and next free block\n var prev = block.prev;\n var next = block.next;\n if (prev) prev.next = next;\n if (next) next.prev = prev;\n\n // update head if we are removing it\n if (block == this.getHead(fl, sl)) {\n this.setHead(fl, sl, next);\n\n // clear second level map if head is empty now\n if (!next) {\n let slMap = this.getSLMap(fl);\n this.setSLMap(fl, slMap &= ~(1 << sl));\n\n // clear first level map if second level is empty now\n if (!slMap) this.flMap &= ~(1 << fl);\n }\n }\n }\n\n /** Searches for a free block of at least the specified size. */\n search(size: usize): Block | null {\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE);\n\n // mapping_search\n var fl: usize, sl: u32;\n if (size < SB_SIZE) {\n fl = 0;\n sl = (size / AL_SIZE);\n } else {\n // (*) size += (1 << (fls(size) - SL_BITS)) - 1;\n fl = fls(size);\n sl = ((size >> (fl - SL_BITS)) ^ (1 << SL_BITS));\n fl -= SB_BITS - 1;\n // (*) instead of rounding up, use next second level list for better fit\n if (sl < SL_SIZE - 1) ++sl;\n else ++fl, sl = 0;\n }\n\n // search second level\n var slMap = this.getSLMap(fl) & (~0 << sl);\n var head: Block | null;\n if (!slMap) {\n // search next larger first level\n let flMap = this.flMap & (~0 << (fl + 1));\n if (!flMap) {\n head = null;\n } else {\n fl = ffs(flMap);\n slMap = assert(this.getSLMap(fl)); // can't be zero if fl points here\n head = this.getHead(fl, ffs(slMap));\n }\n } else {\n head = this.getHead(fl, ffs(slMap));\n }\n return head;\n }\n\n /** Links a free left with its right block in memory. */\n private setJump(left: Block, right: Block): void {\n assert(left.info & FREE); // must be free\n assert(left.right == right); // right block must match\n assert(right.info & LEFT_FREE); // right block must be tagged as LEFT_FREE\n store(\n changetype(right) - sizeof()\n , left); // last word in left block's (free) data region\n }\n\n /**\n * Uses the specified free block, removing it from internal maps and\n * splitting it if possible, and returns its data pointer.\n */\n use(block: Block, size: usize): usize {\n var blockInfo = block.info;\n assert(blockInfo & FREE); // must be free so we can use it\n assert(size >= Block.MIN_SIZE && size < Block.MAX_SIZE); // must be valid\n assert(!(size & AL_MASK)); // size must be aligned so the new block is\n\n this.remove(block);\n\n // split if the block can hold another MIN_SIZE block\n var remaining = (blockInfo & ~TAGS) - size;\n if (remaining >= Block.INFO + Block.MIN_SIZE) {\n block.info = size | (blockInfo & LEFT_FREE); // also discards FREE\n\n let spare = changetype(\n changetype(block) + Block.INFO + size\n );\n spare.info = (remaining - Block.INFO) | FREE; // not LEFT_FREE\n this.insert(spare); // also sets jump\n\n // otherwise tag block as no longer FREE and right as no longer LEFT_FREE\n } else {\n block.info = blockInfo & ~FREE;\n let right: Block = assert(block.right); // can't be null (tail)\n right.info &= ~LEFT_FREE;\n }\n\n return changetype(block) + Block.INFO;\n }\n\n /** Adds more memory to the pool. */\n addMemory(start: usize, end: usize): bool {\n assert(start <= end);\n assert(!(start & AL_MASK)); // must be aligned\n assert(!(end & AL_MASK)); // must be aligned\n\n var tailRef = this.tailRef;\n var tailInfo: usize = 0;\n if (tailRef) {\n assert(start >= tailRef + sizeof()); // starts after tail\n\n // merge with current tail if adjacent\n if (start - Block.INFO == tailRef) {\n start -= Block.INFO;\n tailInfo = changetype(tailRef).info;\n }\n\n } else {\n assert(start >= changetype(this) + Root.SIZE); // starts after root\n }\n\n // check if size is large enough for a free block and the tail block\n var size = end - start;\n if (size < Block.INFO + Block.MIN_SIZE + Block.INFO) {\n return false;\n }\n\n // left size is total minus its own and the zero-length tail's header\n var leftSize = size - 2 * Block.INFO;\n var left = changetype(start);\n left.info = leftSize | FREE | (tailInfo & LEFT_FREE);\n left.prev = null;\n left.next = null;\n\n // tail is a zero-length used block\n var tail = changetype(start + size - Block.INFO);\n tail.info = 0 | LEFT_FREE;\n this.tailRef = changetype(tail);\n\n this.insert(left); // also merges with free left before tail / sets jump\n\n return true;\n }\n}\n\n/** Determines the first (LSB to MSB) set bit's index of a word. */\nfunction ffs(word: T): T {\n assert(word != 0); // word cannot be 0\n return ctz(word); // differs from ffs only for 0\n}\n\n/** Determines the last (LSB to MSB) set bit's index of a word. */\nfunction fls(word: T): T {\n assert(word != 0); // word cannot be 0\n const inv: T = (sizeof() << 3) - 1;\n return inv - clz(word);\n}\n\n/** Reference to the initialized {@link Root} structure, once initialized. */\nvar ROOT: Root = changetype(0);\n\n// Memory allocator interface\n\n/** Allocates a chunk of memory. */\n@global export function __memory_allocate(size: usize): usize {\n\n // initialize if necessary\n var root = ROOT;\n if (!root) {\n let rootOffset = (HEAP_BASE + AL_MASK) & ~AL_MASK;\n let pagesBefore = memory.size();\n let pagesNeeded = ((((rootOffset + Root.SIZE) + 0xffff) & ~0xffff) >>> 16);\n if (pagesNeeded > pagesBefore && memory.grow(pagesNeeded - pagesBefore) < 0) unreachable();\n ROOT = root = changetype(rootOffset);\n root.tailRef = 0;\n root.flMap = 0;\n for (let fl: usize = 0; fl < FL_BITS; ++fl) {\n root.setSLMap(fl, 0);\n for (let sl: u32 = 0; sl < SL_SIZE; ++sl) {\n root.setHead(fl, sl, null);\n }\n }\n root.addMemory((rootOffset + Root.SIZE + AL_MASK) & ~AL_MASK, memory.size() << 16);\n }\n\n // search for a suitable block\n if (size > Block.MAX_SIZE) unreachable();\n\n // 32-bit MAX_SIZE is 1 << 30 and itself aligned, hence the following can't overflow MAX_SIZE\n size = max((size + AL_MASK) & ~AL_MASK, Block.MIN_SIZE);\n\n var block = root.search(size);\n if (!block) {\n\n // request more memory\n let pagesBefore = memory.size();\n let pagesNeeded = (((size + 0xffff) & ~0xffff) >>> 16);\n let pagesWanted = max(pagesBefore, pagesNeeded); // double memory\n if (memory.grow(pagesWanted) < 0) {\n if (memory.grow(pagesNeeded) < 0) {\n unreachable(); // out of memory\n }\n }\n let pagesAfter = memory.size();\n root.addMemory(pagesBefore << 16, pagesAfter << 16);\n block = assert(root.search(size)); // must be found now\n }\n\n assert((block.info & ~TAGS) >= size);\n return root.use(block, size);\n}\n\n/** Frees the chunk of memory at the specified address. */\n@global export function __memory_free(data: usize): void {\n if (data) {\n let root = ROOT;\n if (root) {\n let block = changetype(data - Block.INFO);\n let blockInfo = block.info;\n assert(!(blockInfo & FREE)); // must be used\n block.info = blockInfo | FREE;\n root.insert(changetype(data - Block.INFO));\n }\n }\n}\n\n@global export function __memory_reset(): void {\n unreachable();\n}\n",array:'import {\n MAX_BLENGTH,\n HEADER_SIZE,\n allocateUnsafe,\n reallocateUnsafe,\n LOAD,\n STORE\n} from "./internal/arraybuffer";\n\nimport {\n allocateUnsafe as allocateUnsafeString,\n freeUnsafe as freeUnsafeString,\n copyUnsafe as copyUnsafeString\n} from "./internal/string";\n\nimport {\n COMPARATOR,\n SORT\n} from "./internal/sort";\n\nimport {\n itoa,\n dtoa,\n itoa_stream,\n dtoa_stream,\n MAX_DOUBLE_LENGTH\n} from "./internal/number";\n\nimport {\n isArray as builtin_isArray\n} from "./builtins";\n\nexport class Array {\n [key: number]: T; // compatibility only\n\n /* @internal */ buffer_: ArrayBuffer;\n /* @internal */ length_: i32;\n\n @inline static isArray(value: U): bool {\n return builtin_isArray(value) && value !== null;\n }\n\n constructor(length: i32 = 0) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length > MAX_LENGTH) throw new RangeError("Invalid array length");\n var byteLength = length << alignof();\n var buffer = allocateUnsafe(byteLength);\n this.buffer_ = buffer;\n this.length_ = length;\n memory.fill(\n changetype(buffer) + HEADER_SIZE,\n 0,\n byteLength\n );\n }\n\n @inline\n get length(): i32 {\n return this.length_;\n }\n\n set length(length: i32) {\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n if (length > capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length > MAX_LENGTH) throw new RangeError("Invalid array length");\n buffer = reallocateUnsafe(buffer, length << alignof());\n this.buffer_ = buffer;\n }\n this.length_ = length;\n }\n\n every(callbackfn: (element: T, index: i32, array: Array) => bool): bool {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n if (!callbackfn(LOAD(this.buffer_, index), index, this)) return false;\n }\n return true;\n }\n\n findIndex(predicate: (element: T, index: i32, array: Array) => bool): i32 {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n if (predicate(LOAD(this.buffer_, index), index, this)) return index;\n }\n return -1;\n }\n\n @operator("[]")\n private __get(index: i32): T {\n var buffer = this.buffer_;\n return index < (buffer.byteLength >>> alignof())\n ? LOAD(buffer, index)\n : unreachable();\n }\n\n @operator("{}")\n private __unchecked_get(index: i32): T {\n return LOAD(this.buffer_, index);\n }\n\n @operator("[]=")\n private __set(index: i32, value: T): void {\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n if (index >= capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (index >= MAX_LENGTH) throw new Error("Invalid array length");\n buffer = reallocateUnsafe(buffer, (index + 1) << alignof());\n this.buffer_ = buffer;\n this.length_ = index + 1;\n }\n STORE(buffer, index, value);\n if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line\n }\n\n @operator("{}=")\n private __unchecked_set(index: i32, value: T): void {\n STORE(this.buffer_, index, value);\n if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line\n }\n\n fill(value: T, start: i32 = 0, end: i32 = i32.MAX_VALUE): this {\n var buffer = this.buffer_;\n var len = this.length_;\n\n start = start < 0 ? max(len + start, 0) : min(start, len);\n end = end < 0 ? max(len + end, 0) : min(end, len);\n\n if (sizeof() == 1) {\n if (start < end) {\n memory.fill(\n changetype(buffer) + start + HEADER_SIZE,\n value,\n (end - start)\n );\n }\n } else {\n for (; start < end; ++start) {\n STORE(buffer, start, value);\n }\n }\n return this;\n }\n\n @inline\n includes(searchElement: T, fromIndex: i32 = 0): bool {\n return this.indexOf(searchElement, fromIndex) >= 0;\n }\n\n indexOf(searchElement: T, fromIndex: i32 = 0): i32 {\n var length = this.length_;\n if (length == 0 || fromIndex >= length) return -1;\n if (fromIndex < 0) fromIndex = max(length + fromIndex, 0);\n var buffer = this.buffer_;\n while (fromIndex < length) {\n if (LOAD(buffer, fromIndex) == searchElement) return fromIndex;\n ++fromIndex;\n }\n return -1;\n }\n\n lastIndexOf(searchElement: T, fromIndex: i32 = this.length_): i32 {\n var length = this.length_;\n if (length == 0) return -1;\n if (fromIndex < 0) fromIndex = length + fromIndex; // no need to clamp\n else if (fromIndex >= length) fromIndex = length - 1;\n var buffer = this.buffer_;\n while (fromIndex >= 0) { // ^\n if (LOAD(buffer, fromIndex) == searchElement) return fromIndex;\n --fromIndex;\n }\n return -1;\n }\n\n push(element: T): i32 {\n var length = this.length_;\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n var newLength = length + 1; // safe only if length is checked\n if (length >= capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length >= MAX_LENGTH) throw new Error("Invalid array length");\n buffer = reallocateUnsafe(buffer, newLength << alignof());\n this.buffer_ = buffer;\n }\n this.length_ = newLength;\n STORE(buffer, length, element);\n if (isManaged()) __gc_link(changetype(this), changetype(element)); // tslint:disable-line\n return newLength;\n }\n\n concat(items: Array): Array {\n var thisLen = this.length_;\n var otherLen = select(0, items.length_, items === null);\n var outLen = thisLen + otherLen;\n var out = new Array(outLen);\n\n if (thisLen) {\n memory.copy(\n changetype(out.buffer_) + HEADER_SIZE,\n changetype(this.buffer_) + HEADER_SIZE,\n thisLen << alignof()\n );\n }\n if (otherLen) {\n memory.copy(\n changetype(out.buffer_) + HEADER_SIZE + (thisLen << alignof()),\n changetype(items.buffer_) + HEADER_SIZE,\n otherLen << alignof()\n );\n }\n return out;\n }\n\n copyWithin(target: i32, start: i32, end: i32 = i32.MAX_VALUE): this {\n var buffer = this.buffer_;\n var len = this.length_;\n\n end = min(end, len);\n var to = target < 0 ? max(len + target, 0) : min(target, len);\n var from = start < 0 ? max(len + start, 0) : min(start, len);\n var last = end < 0 ? max(len + end, 0) : min(end, len);\n var count = min(last - from, len - to);\n\n if (from < to && to < (from + count)) {\n from += count - 1;\n to += count - 1;\n while (count) {\n STORE(buffer, to, LOAD(buffer, from));\n --from, --to, --count;\n }\n } else {\n memory.copy(\n changetype(buffer) + HEADER_SIZE + (to << alignof()),\n changetype(buffer) + HEADER_SIZE + (from << alignof()),\n count << alignof()\n );\n }\n return this;\n }\n\n pop(): T {\n var length = this.length_;\n if (length < 1) throw new RangeError("Array is empty");\n var element = LOAD(this.buffer_, --length);\n this.length_ = length;\n return element;\n }\n\n forEach(callbackfn: (value: T, index: i32, array: Array) => void): void {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n callbackfn(LOAD(this.buffer_, index), index, this);\n }\n }\n\n map(callbackfn: (value: T, index: i32, array: Array) => U): Array {\n var length = this.length_;\n var result = new Array(length);\n var buffer = result.buffer_;\n for (let index = 0; index < min(length, this.length_); ++index) {\n STORE(buffer, index, callbackfn(LOAD(this.buffer_, index), index, this));\n }\n return result;\n }\n\n filter(callbackfn: (value: T, index: i32, array: Array) => bool): Array {\n var result = new Array();\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n let value = LOAD(this.buffer_, index);\n if (callbackfn(value, index, this)) result.push(value);\n }\n return result;\n }\n\n reduce(\n callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U,\n initialValue: U\n ): U {\n var accum = initialValue;\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n accum = callbackfn(accum, LOAD(this.buffer_, index), index, this);\n }\n return accum;\n }\n\n reduceRight(\n callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U,\n initialValue: U\n ): U {\n var accum = initialValue;\n for (let index = this.length_ - 1; index >= 0; --index) {\n accum = callbackfn(accum, LOAD(this.buffer_, index), index, this);\n }\n return accum;\n }\n\n shift(): T {\n var length = this.length_;\n if (length < 1) throw new RangeError("Array is empty");\n var buffer = this.buffer_;\n var element = LOAD(buffer, 0);\n var lastIndex = length - 1;\n memory.copy(\n changetype(buffer) + HEADER_SIZE,\n changetype(buffer) + HEADER_SIZE + sizeof(),\n lastIndex << alignof()\n );\n STORE(buffer, lastIndex, null);\n this.length_ = lastIndex;\n return element;\n }\n\n some(callbackfn: (element: T, index: i32, array: Array) => bool): bool {\n for (let index = 0, length = this.length_; index < min(length, this.length_); ++index) {\n if (callbackfn(LOAD(this.buffer_, index), index, this)) return true;\n }\n return false;\n }\n\n unshift(element: T): i32 {\n var buffer = this.buffer_;\n var capacity = buffer.byteLength >>> alignof();\n var length = this.length_;\n var newLength = length + 1; // safe only if length is checked\n if (length >= capacity) {\n const MAX_LENGTH = MAX_BLENGTH >>> alignof();\n if (length >= MAX_LENGTH) throw new Error("Invalid array length");\n buffer = reallocateUnsafe(buffer, newLength << alignof());\n capacity = buffer.byteLength >>> alignof();\n this.buffer_ = buffer;\n }\n memory.copy(\n changetype(buffer) + HEADER_SIZE + sizeof(),\n changetype(buffer) + HEADER_SIZE,\n (capacity - 1) << alignof()\n );\n STORE(buffer, 0, element);\n this.length_ = newLength;\n if (isManaged()) __gc_link(changetype(this), changetype(element)); // tslint:disable-line\n return newLength;\n }\n\n slice(begin: i32 = 0, end: i32 = i32.MAX_VALUE): Array {\n var len = this.length_;\n begin = begin < 0 ? max(begin + len, 0) : min(begin, len);\n end = end < 0 ? max(end + len, 0) : min(end, len);\n len = end - begin;\n var sliced = new Array(len);\n if (len) {\n memory.copy(\n changetype(sliced.buffer_) + HEADER_SIZE,\n changetype(this.buffer_) + HEADER_SIZE + (begin << alignof()),\n len << alignof()\n );\n }\n return sliced;\n }\n\n splice(start: i32, deleteCount: i32 = i32.MAX_VALUE): Array {\n var length = this.length_;\n start = start < 0 ? max(length + start, 0) : min(start, length);\n deleteCount = max(min(deleteCount, length - start), 0);\n var buffer = this.buffer_;\n var spliced = new Array(deleteCount);\n var source = changetype(buffer) + HEADER_SIZE + (start << alignof());\n memory.copy(\n changetype(spliced.buffer_) + HEADER_SIZE,\n source,\n deleteCount << alignof()\n );\n var offset = start + deleteCount;\n if (length != offset) {\n memory.copy(\n source,\n changetype(buffer) + HEADER_SIZE + (offset << alignof()),\n (length - offset) << alignof()\n );\n }\n this.length_ = length - deleteCount;\n return spliced;\n }\n\n reverse(): Array {\n var buffer = this.buffer_;\n for (let front = 0, back = this.length_ - 1; front < back; ++front, --back) {\n let temp = LOAD(buffer, front);\n STORE(buffer, front, LOAD(buffer, back));\n STORE(buffer, back, temp);\n }\n return this;\n }\n\n sort(comparator: (a: T, b: T) => i32 = COMPARATOR()): this {\n // TODO remove this when flow will allow trackcing null\n assert(comparator); // The comparison function must be a function\n\n var length = this.length_;\n if (length <= 1) return this;\n var buffer = this.buffer_;\n if (length == 2) {\n let a = LOAD(buffer, 1); // a = arr[1]\n let b = LOAD(buffer, 0); // b = arr[0]\n if (comparator(a, b) < 0) {\n STORE(buffer, 1, b); // arr[1] = b;\n STORE(buffer, 0, a); // arr[0] = a;\n }\n return this;\n }\n SORT(buffer, 0, length, comparator);\n return this;\n }\n\n join(separator: string = ","): string {\n var lastIndex = this.length_ - 1;\n if (lastIndex < 0) return "";\n var result = "";\n var value: T;\n var buffer = this.buffer_;\n var sepLen = separator.length;\n var hasSeparator = sepLen != 0;\n if (value instanceof bool) {\n if (!lastIndex) return select("true", "false", LOAD(buffer, 0));\n\n let valueLen = 5; // max possible length of element len("false")\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n valueLen = 4 + (!value);\n copyUnsafeString(result, offset, select("true", "false", value), 0, valueLen);\n offset += valueLen;\n if (hasSeparator) {\n copyUnsafeString(result, offset, changetype(separator), 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n valueLen = 4 + (!value);\n copyUnsafeString(result, offset, select("true", "false", value), 0, valueLen);\n offset += valueLen;\n\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else if (isInteger()) {\n if (!lastIndex) return changetype(itoa(LOAD(buffer, 0)));\n\n const valueLen = (sizeof() <= 4 ? 10 : 20) + isSigned();\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n offset += itoa_stream(changetype(result), offset, value);\n if (hasSeparator) {\n copyUnsafeString(result, offset, separator, 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n offset += itoa_stream(changetype(result), offset, value);\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else if (isFloat()) {\n if (!lastIndex) return changetype(dtoa(LOAD(buffer, 0)));\n\n const valueLen = MAX_DOUBLE_LENGTH;\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n offset += dtoa_stream(changetype(result), offset, value);\n if (hasSeparator) {\n copyUnsafeString(result, offset, separator, 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n offset += dtoa_stream(changetype(result), offset, value);\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else if (isString()) {\n if (!lastIndex) return LOAD(buffer, 0);\n\n let estLen = 0;\n for (let i = 0, len = lastIndex + 1; i < len; ++i) {\n estLen += LOAD(buffer, i).length;\n }\n let offset = 0;\n let result = allocateUnsafeString(estLen + sepLen * lastIndex);\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n if (value) {\n let valueLen = value.length; // tslint:disable-line:no-unsafe-any\n copyUnsafeString(result, offset, value, 0, valueLen); // tslint:disable-line:no-unsafe-any\n offset += valueLen; // tslint:disable-line:no-unsafe-any\n }\n if (hasSeparator) {\n copyUnsafeString(result, offset, separator, 0, sepLen);\n offset += sepLen;\n }\n }\n value = LOAD(buffer, lastIndex);\n if (value) {\n let valueLen = value.length; // tslint:disable-line:no-unsafe-any\n copyUnsafeString(result, offset, value, 0, valueLen); // tslint:disable-line:no-unsafe-any\n }\n return result;\n } else if (isArray()) {\n if (!lastIndex) {\n value = LOAD(buffer, 0);\n return value ? value.join(separator) : ""; // tslint:disable-line:no-unsafe-any\n }\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n if (value) result += value.join(separator); // tslint:disable-line:no-unsafe-any\n if (hasSeparator) result += separator;\n }\n value = LOAD(buffer, lastIndex);\n if (value) result += value.join(separator); // tslint:disable-line:no-unsafe-any\n return result;\n } else if (isReference()) { // References\n if (!lastIndex) return "[object Object]";\n const valueLen = 15; // max possible length of element len("[object Object]")\n let estLen = (valueLen + sepLen) * lastIndex + valueLen;\n let result = allocateUnsafeString(estLen);\n let offset = 0;\n for (let i = 0; i < lastIndex; ++i) {\n value = LOAD(buffer, i);\n if (value) {\n copyUnsafeString(result, offset, changetype("[object Object]"), 0, valueLen);\n offset += valueLen;\n }\n if (hasSeparator) {\n copyUnsafeString(result, offset, changetype(separator), 0, sepLen);\n offset += sepLen;\n }\n }\n if (LOAD(buffer, lastIndex)) {\n copyUnsafeString(result, offset, changetype("[object Object]"), 0, valueLen);\n offset += valueLen;\n }\n let out = result;\n if (estLen > offset) {\n out = result.substring(0, offset);\n freeUnsafeString(result);\n }\n return out;\n } else {\n assert(false); // Unsupported generic typename\n }\n }\n\n @inline\n toString(): string {\n return this.join();\n }\n\n private __gc(): void {\n var buffer = this.buffer_;\n __gc_mark(changetype(buffer)); // tslint:disable-line\n if (isManaged()) {\n let offset: usize = 0;\n let end = this.length_ << alignof();\n while (offset < end) {\n __gc_mark(load(changetype(buffer) + offset, HEADER_SIZE)); // tslint:disable-line\n offset += sizeof();\n }\n }\n }\n}\n',arraybuffer:'import {\n HEADER_SIZE,\n MAX_BLENGTH,\n allocateUnsafe\n} from "./internal/arraybuffer";\n\nimport {\n Uint8ClampedArray,\n Uint8Array,\n Int8Array,\n Uint16Array,\n Int16Array,\n Uint32Array,\n Int32Array,\n Uint64Array,\n Int64Array\n} from "./typedarray";\n\nimport {\n DataView\n} from "./dataview";\n\n@sealed\nexport class ArrayBuffer {\n\n readonly byteLength: i32; // capped to [0, MAX_LENGTH]\n\n @inline static isView(value: T): bool {\n if (value === null) return false;\n if (value instanceof Uint8ClampedArray) return true;\n if (value instanceof Uint8Array) return true;\n if (value instanceof Int8Array) return true;\n if (value instanceof Uint16Array) return true;\n if (value instanceof Int16Array) return true;\n if (value instanceof Uint32Array) return true;\n if (value instanceof Int32Array) return true;\n if (value instanceof Uint64Array) return true;\n if (value instanceof Int64Array) return true;\n if (value instanceof DataView) return true;\n return false;\n }\n\n // @unsafe\n @inline get data(): usize { return changetype(this) + HEADER_SIZE; }\n\n constructor(length: i32, unsafe: bool = false) {\n if (length > MAX_BLENGTH) throw new RangeError("Invalid array buffer length");\n var buffer = allocateUnsafe(length);\n if (!unsafe) memory.fill(changetype(buffer) + HEADER_SIZE, 0, length);\n return buffer;\n }\n\n slice(begin: i32 = 0, end: i32 = MAX_BLENGTH): ArrayBuffer {\n var len = this.byteLength;\n if (begin < 0) begin = max(len + begin, 0);\n else begin = min(begin, len);\n if (end < 0) end = max(len + end, 0);\n else end = min(end, len);\n var newLen = max(end - begin, 0);\n var buffer = allocateUnsafe(newLen);\n memory.copy(changetype(buffer) + HEADER_SIZE, changetype(this) + HEADER_SIZE + begin, newLen);\n return buffer;\n }\n\n toString(): string {\n return "[object ArrayBuffer]";\n }\n}\n',"bindings/Date":"export declare function UTC(\n // NOTE: Using i32 below saves us a f64.convert_s instruction and moves the responsibility for\n // converting the value to the WASM/JS boundary.\n year: i32,\n month: i32,\n day: i32,\n hour: i32,\n minute: i32,\n second: i32,\n millisecond: f64\n): f64;\nexport declare function now(): f64;\n","bindings/Math":"export declare const E: f64;\nexport declare const LN2: f64;\nexport declare const LN10: f64;\nexport declare const LOG2E: f64;\nexport declare const LOG10E: f64;\nexport declare const PI: f64;\nexport declare const SQRT1_2: f64;\nexport declare const SQRT2: f64;\n\nexport declare function abs(x: f64): f64;\nexport declare function acos(x: f64): f64;\nexport declare function acosh(x: f64): f64;\nexport declare function asin(x: f64): f64;\nexport declare function asinh(x: f64): f64;\nexport declare function atan(x: f64): f64;\nexport declare function atan2(y: f64, x: f64): f64;\nexport declare function atanh(x: f64): f64;\nexport declare function cbrt(x: f64): f64;\nexport declare function ceil(x: f64): f64;\nexport declare function clz32(x: f64): f64;\nexport declare function cos(x: f64): f64;\nexport declare function cosh(x: f64): f64;\nexport declare function exp(x: f64): f64;\nexport declare function expm1(x: f64): f64;\nexport declare function floor(x: f64): f64;\nexport declare function fround(x: f64): f32;\nexport declare function hypot(value1: f64, value2: f64): f64; // TODO: rest\nexport declare function imul(a: f64, b: f64): f64;\nexport declare function log(x: f64): f64;\nexport declare function log10(x: f64): f64;\nexport declare function log1p(x: f64): f64;\nexport declare function log2(x: f64): f64;\nexport declare function max(value1: f64, value2: f64): f64; // TODO: rest\nexport declare function min(value1: f64, value2: f64): f64; // TODO: rest\nexport declare function pow(base: f64, exponent: f64): f64;\nexport declare function random(): f64;\nexport declare function round(x: f64): f64;\nexport declare function sign(x: f64): f64;\nexport declare function sin(x: f64): f64;\nexport declare function sinh(x: f64): f64;\nexport declare function sqrt(x: f64): f64;\nexport declare function tan(x: f64): f64;\nexport declare function tanh(x: f64): f64;\nexport declare function trunc(x: f64): f64;\n",builtins:"/* tslint:disable */\n\n@builtin @inline export const NaN: f64 = 0 / 0;\n@builtin @inline export const Infinity: f64 = 1 / 0;\n\n@builtin export declare function isInteger(value?: T): bool;\n@builtin export declare function isFloat(value?: T): bool;\n@builtin export declare function isSigned(value?: T): bool;\n@builtin export declare function isReference(value?: T): bool;\n@builtin export declare function isString(value?: T): bool;\n@builtin export declare function isArray(value?: T): bool;\n@builtin export declare function isFunction(value?: T): bool;\n@builtin export declare function isNullable(value?: T): bool;\n@builtin export declare function isDefined(expression: void): bool;\n@builtin export declare function isConstant(expression: void): bool;\n@builtin export declare function isManaged(value?: T): bool;\n@inline export function isNaN(value: T): bool { return value != value; }\n@inline export function isFinite(value: T): bool { return value - value == 0; }\n\n@builtin export declare function clz(value: T): T;\n@builtin export declare function ctz(value: T): T;\n@builtin export declare function popcnt(value: T): T;\n@builtin export declare function rotl(value: T, shift: T): T;\n@builtin export declare function rotr(value: T, shift: T): T;\n@builtin export declare function abs(value: T): T;\n@builtin export declare function max(left: T, right: T): T;\n@builtin export declare function min(left: T, right: T): T;\n@builtin export declare function ceil(value: T): T;\n@builtin export declare function floor(value: T): T;\n@builtin export declare function copysign(left: T, right: T): T;\n@builtin export declare function nearest(value: T): T;\n@builtin export declare function reinterpret(value: void): T;\n@builtin export declare function sqrt(value: T): T;\n@builtin export declare function trunc(value: T): T;\n@builtin export declare function load(offset: usize, constantOffset?: usize): T;\n@builtin export declare function store(offset: usize, value: void, constantOffset?: usize): void;\n@builtin export declare function sizeof(): usize; // | u32 / u64\n@builtin export declare function alignof(): usize; // | u32 / u64\n@builtin export declare function offsetof(fieldName?: string): usize; // | u32 / u64\n@builtin export declare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n@builtin export declare function unreachable(): void;\n@builtin export declare function changetype(value: void): T;\n@builtin export declare function assert(isTrueish: T, message?: string): T;\n@builtin export declare function unchecked(expr: T): T;\n@builtin export declare function call_indirect(target: void, ...args: void[]): T;\n@builtin export declare function instantiate(...args: void[]): T;\n\nexport namespace atomic {\n @builtin export declare function load(offset: usize, constantOffset?: usize): T;\n @builtin export declare function store(offset: usize, value: void, constantOffset?: usize): void;\n @builtin export declare function add(ptr: usize, value: T, constantOffset?: usize): T;\n @builtin export declare function sub(ptr: usize, value: T, constantOffset?: usize): T;\n @builtin export declare function and(ptr: usize, value: T, constantOffset?: usize): T;\n @builtin export declare function or(ptr: usize, value: T, constantOffset?: usize): T;\n @builtin export declare function xor(ptr: usize, value: T, constantOffset?: usize): T;\n @builtin export declare function xchg(ptr: usize, value: T, constantOffset?: usize): T;\n @builtin export declare function cmpxchg(ptr: usize, expected:T, replacement: T, constantOffset?: usize): T;\n @builtin export declare function wait(ptr: usize, expected:T, timeout:i64): i32;\n @builtin export declare function notify(ptr: usize, count: u32): u32;\n}\n\n@builtin export declare function i8(value: void): i8;\nexport namespace i8 {\n @lazy export const MIN_VALUE: i8 = -128;\n @lazy export const MAX_VALUE: i8 = 127;\n}\n\n@builtin export declare function i16(value: void): i16;\nexport namespace i16 {\n @lazy export const MIN_VALUE: i16 = -32768;\n @lazy export const MAX_VALUE: i16 = 32767;\n}\n\n@builtin export declare function i32(value: void): i32;\nexport namespace i32 {\n @lazy export const MIN_VALUE: i32 = -2147483648;\n @lazy export const MAX_VALUE: i32 = 2147483647;\n @builtin export declare function clz(value: i32): i32;\n @builtin export declare function ctz(value: i32): i32;\n @builtin export declare function popcnt(value: i32): i32;\n @builtin export declare function rotl(value: i32, shift: i32): i32;\n @builtin export declare function rotr(value: i32, shift: i32): i32;\n @builtin export declare function reinterpret_f32(value: f32): i32;\n @builtin export declare function load8_s(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load8_u(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load16_s(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load16_u(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function store8(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function store16(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function store(offset: usize, value: i32, constantOffset?: usize): void;\n \n export namespace atomic {\n @builtin export declare function load8_s(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load8_u(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load16_s(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load16_u(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function load(offset: usize, constantOffset?: usize): i32;\n @builtin export declare function store8(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function store16(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function store(offset: usize, value: i32, constantOffset?: usize): void;\n @builtin export declare function wait(ptr: usize, expected:i32, timeout:i64): i32;\n @builtin export declare function notify(ptr: usize, count:u32): u32;\n\n export namespace rmw8_u {\n @builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, constantOffset?: usize): i32;\n }\n\n export namespace rmw16_u {\n @builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, constantOffset?: usize): i32;\n }\n\n export namespace rmw {\n @builtin export declare function add(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function sub(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function and(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function or(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function xor(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function xchg(offset: usize, value: i32, constantOffset?: usize): i32;\n @builtin export declare function cmpxchg(offset: usize, expected:i32, replacement: i32, constantOffset?: usize): i32;\n }\n }\n}\n\n@builtin export declare function i64(value: void): i64;\nexport namespace i64 {\n @lazy export const MIN_VALUE: i64 = -9223372036854775808;\n @lazy export const MAX_VALUE: i64 = 9223372036854775807;\n @builtin export declare function clz(value: i64): i64;\n @builtin export declare function ctz(value: i64): i64;\n @builtin export declare function load8_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load8_u(offset: usize, constantOffset?: usize): u64;\n @builtin export declare function load16_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load16_u(offset: usize, constantOffset?: usize): u64;\n @builtin export declare function load32_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load32_u(offset: usize, constantOffset?: usize): u64;\n @builtin export declare function load(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function popcnt(value: i64): i64;\n @builtin export declare function rotl(value: i64, shift: i64): i64;\n @builtin export declare function rotr(value: i64, shift: i64): i64;\n @builtin export declare function reinterpret_f64(value: f64): i64;\n @builtin export declare function store8(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store16(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store32(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store(offset: usize, value: i64, constantOffset?: usize): void;\n\n namespace atomic {\n @builtin export declare function load8_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load8_u(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load16_s(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load16_u(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function load(offset: usize, constantOffset?: usize): i64;\n @builtin export declare function store8(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store16(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function store(offset: usize, value: i64, constantOffset?: usize): void;\n @builtin export declare function wait(ptr: usize, expected:i64, timeout:i64): i32;\n @builtin export declare function notify(ptr: usize, count:u32): u32;\n\n export namespace rmw8_u {\n @builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;\n }\n\n export namespace rmw16_u {\n @builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;\n }\n\n export namespace rmw32_u {\n @builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;\n }\n\n export namespace rmw {\n @builtin export declare function add(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function sub(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function and(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function or(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xor(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function xchg(offset: usize, value: i64, constantOffset?: usize): i64;\n @builtin export declare function cmpxchg(offset: usize, expected:i64, replacement: i64, constantOffset?: usize): i64;\n }\n } \n}\n\n@builtin export declare function isize(value: void): isize;\nexport namespace isize {\n @lazy export const MIN_VALUE: isize = sizeof() == sizeof()\n ? -2147483648\n : -9223372036854775808;\n @lazy export const MAX_VALUE: isize = sizeof() == sizeof()\n ? 2147483647\n : 9223372036854775807;\n}\n\n@builtin export declare function u8(value: void): u8;\nexport namespace u8 {\n @lazy export const MIN_VALUE: u8 = 0;\n @lazy export const MAX_VALUE: u8 = 255;\n}\n\n@builtin export declare function u16(value: void): u16;\nexport namespace u16 {\n @lazy export const MIN_VALUE: u16 = 0;\n @lazy export const MAX_VALUE: u16 = 65535;\n}\n\n@builtin export declare function u32(value: void): u32;\nexport namespace u32 {\n @lazy export const MIN_VALUE: u32 = 0;\n @lazy export const MAX_VALUE: u32 = 4294967295;\n}\n\n@builtin export declare function u64(value: void): u64;\nexport namespace u64 {\n @lazy export const MIN_VALUE: u64 = 0;\n @lazy export const MAX_VALUE: u64 = 18446744073709551615;\n}\n\n@builtin export declare function usize(value: void): usize;\nexport namespace usize {\n @lazy export const MIN_VALUE: usize = 0;\n @lazy export const MAX_VALUE: usize = sizeof() == sizeof()\n ? 4294967295\n : 18446744073709551615;\n}\n\n@builtin export declare function bool(value: void): bool;\nexport namespace bool {\n @lazy export const MIN_VALUE: bool = false;\n @lazy export const MAX_VALUE: bool = true;\n}\n\n@builtin export declare function f32(value: void): f32;\nexport namespace f32 {\n @lazy export const EPSILON = reinterpret(0x34000000); // 0x1p-23f\n @lazy export const MIN_VALUE = reinterpret(0x00000001); // 0x0.000001p+0f\n @lazy export const MAX_VALUE = reinterpret(0x7F7FFFFF); // 0x1.fffffep+127f\n @lazy export const MIN_NORMAL_VALUE = reinterpret(0x00800000); // 0x1p-126f\n @lazy export const MIN_SAFE_INTEGER: f32 = -16777215;\n @lazy export const MAX_SAFE_INTEGER: f32 = 16777215;\n @builtin export declare function abs(value: f32): f32;\n @builtin export declare function ceil(value: f32): f32;\n @builtin export declare function copysign(x: f32, y: f32): f32;\n @builtin export declare function floor(value: f32): f32;\n @builtin export declare function load(offset: usize, constantOffset?: usize): f32;\n @builtin export declare function max(left: f32, right: f32): f32;\n @builtin export declare function min(left: f32, right: f32): f32;\n @builtin export declare function nearest(value: f32): f32;\n @builtin export declare function reinterpret_i32(value: i32): f32;\n @builtin export declare function sqrt(value: f32): f32;\n @builtin export declare function store(offset: usize, value: f32, constantOffset?: usize): void;\n @builtin export declare function trunc(value: f32): f32;\n}\n\n@builtin export declare function f64(value: void): f64;\nexport namespace f64 {\n @lazy export const EPSILON = reinterpret(0x3CB0000000000000); // 0x1p-52\n @lazy export const MIN_VALUE = reinterpret(0x0000000000000001); // 0x0.0000000000001p+0\n @lazy export const MAX_VALUE = reinterpret(0x7FEFFFFFFFFFFFFF); // 0x1.fffffffffffffp+1023\n @lazy export const MIN_NORMAL_VALUE = reinterpret(0x0010000000000000); // 0x1p-1022\n @lazy export const MIN_SAFE_INTEGER: f64 = -9007199254740991;\n @lazy export const MAX_SAFE_INTEGER: f64 = 9007199254740991;\n @builtin export declare function abs(value: f64): f64;\n @builtin export declare function ceil(value: f64): f64;\n @builtin export declare function copysign(x: f64, y: f64): f64;\n @builtin export declare function floor(value: f64): f64;\n @builtin export declare function load(offset: usize, constantOffset?: usize): f64;\n @builtin export declare function max(left: f64, right: f64): f64;\n @builtin export declare function min(left: f64, right: f64): f64;\n @builtin export declare function nearest(value: f64): f64;\n @builtin export declare function reinterpret_i64(value: i64): f64;\n @builtin export declare function sqrt(value: f64): f64;\n @builtin export declare function store(offset: usize, value: f64, constantOffset?: usize): void;\n @builtin export declare function trunc(value: f64): f64;\n}\n\n@builtin export declare function start(): void;\n","collector/itcm":'/**\n * Incremental Tri-Color-Marking Garbage Collector.\n *\n * @module std/assembly/collector/itcm\n *//***/\n\n// Largely based on Bach Le\'s μgc, see: https://github.com/bullno1/ugc\n\n@inline const TRACE = false;\n\n/** Size of a managed object header. */\n@inline export const HEADER_SIZE: usize = (offsetof() + AL_MASK) & ~AL_MASK;\n\nimport { AL_MASK, MAX_SIZE_32 } from "../internal/allocator";\nimport { iterateRoots } from "../gc";\n\n/** Collector states. */\nconst enum State {\n /** Not yet initialized. */\n INIT = 0,\n /** Currently transitioning from SWEEP to MARK state. */\n IDLE = 1,\n /** Currently marking reachable objects. */\n MARK = 2,\n /** Currently sweeping unreachable objects. */\n SWEEP = 3\n}\n\n/** Current collector state. */\nvar state = State.INIT;\n/** Current white color value. */\nvar white = 0;\n\n// From and to spaces\nvar fromSpace: ManagedObjectList;\nvar toSpace: ManagedObjectList;\nvar iter: ManagedObject;\n\n// ╒═══════════════ Managed object layout (32-bit) ════════════════╕\n// 3 2 1\n// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n// ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┼─┼─┴─┤ ┐\n// │ next │0│ C │ ◄─┐ = nextWithColor\n// ├─────────────────────────────────────────────────────────┴─┴───┤ │ usize\n// │ prev │ ◄─┘\n// ├───────────────────────────────────────────────────────────────┤\n// │ hookFn │\n// ╞═══════════════════════════════════════════════════════════════╡ SIZE ┘ ◄─ user-space reference\n// │ ... data ... │\n// └───────────────────────────────────────────────────────────────┘\n// C: color\n\n/** Represents a managed object in memory, consisting of a header followed by the object\'s data. */\n@unmanaged class ManagedObject {\n\n /** Pointer to the next object with color flags stored in the alignment bits. */\n nextWithColor: usize;\n\n /** Pointer to the previous object. */\n prev: ManagedObject;\n\n /** Class-specific hook function called with the user-space reference. */\n hookFn: (ref: usize) => void;\n\n /** Gets the pointer to the next object. */\n get next(): ManagedObject {\n return changetype(this.nextWithColor & ~3);\n }\n\n /** Sets the pointer to the next object. */\n set next(obj: ManagedObject) {\n this.nextWithColor = changetype(obj) | (this.nextWithColor & 3);\n }\n\n /** Gets this object\'s color. */\n get color(): i32 {\n return this.nextWithColor & 3;\n }\n\n /** Sets this object\'s color. */\n set color(color: i32) {\n this.nextWithColor = (this.nextWithColor & ~3) | color;\n }\n\n /** Unlinks this object from its list. */\n unlink(): void {\n var next = this.next;\n var prev = this.prev;\n if (TRACE) trace(" unlink", 3, objToRef(prev), objToRef(this), objToRef(next));\n next.prev = prev;\n prev.next = next;\n }\n\n /** Marks this object as gray, that is reachable with unscanned children. */\n makeGray(): void {\n if (TRACE) trace(" makeGray", 1, objToRef(this));\n const gray = 2;\n if (this == iter) iter = this.prev;\n this.unlink();\n toSpace.push(this);\n this.nextWithColor = (this.nextWithColor & ~3) | gray;\n }\n}\n\n/** A list of managed objects. Used for the from and to spaces. */\n@unmanaged class ManagedObjectList extends ManagedObject {\n\n /** Inserts an object. */\n push(obj: ManagedObject): void {\n var prev = this.prev;\n if (TRACE) trace(" push", 3, objToRef(prev), objToRef(obj), objToRef(this));\n obj.next = this;\n obj.prev = prev;\n prev.next = obj;\n this.prev = obj;\n }\n\n /** Clears this list. */\n clear(): void {\n if (TRACE) trace(" clear", 1, objToRef(this));\n this.nextWithColor = changetype(this);\n this.prev = this;\n }\n}\n\n/** Performs a single step according to the current state. */\nfunction step(): void {\n var obj: ManagedObject;\n switch (state) {\n case State.INIT: {\n if (TRACE) trace("gc~step/INIT");\n fromSpace = changetype(memory.allocate(HEADER_SIZE));\n fromSpace.hookFn = changetype<(ref: usize) => void>(-1); // would error\n fromSpace.clear();\n toSpace = changetype(memory.allocate(HEADER_SIZE));\n toSpace.hookFn = changetype<(ref: usize) => void>(-1); // would error\n toSpace.clear();\n iter = toSpace;\n state = State.IDLE;\n if (TRACE) trace("gc~state = IDLE");\n // fall-through\n }\n case State.IDLE: {\n if (TRACE) trace("gc~step/IDLE");\n iterateRoots(__gc_mark);\n state = State.MARK;\n if (TRACE) trace("gc~state = MARK");\n break;\n }\n case State.MARK: {\n obj = iter.next;\n if (obj !== toSpace) {\n if (TRACE) trace("gc~step/MARK iterate", 1, objToRef(obj));\n iter = obj;\n obj.color = !white;\n // if (TRACE) {\n // trace(" next/prev/hook", 3,\n // changetype(obj.next),\n // changetype(obj.prev),\n // changetype(obj.hookFn)\n // );\n // }\n obj.hookFn(objToRef(obj));\n } else {\n if (TRACE) trace("gc~step/MARK finish");\n iterateRoots(__gc_mark);\n obj = iter.next;\n if (obj === toSpace) {\n let from = fromSpace;\n fromSpace = toSpace;\n toSpace = from;\n white = !white;\n iter = from.next;\n state = State.SWEEP;\n if (TRACE) trace("gc~state = SWEEP");\n }\n }\n break;\n }\n case State.SWEEP: {\n obj = iter;\n if (obj !== toSpace) {\n if (TRACE) trace("gc~step/SWEEP free", 1, objToRef(obj));\n iter = obj.next;\n if (changetype(obj) >= HEAP_BASE) memory.free(changetype(obj));\n } else {\n if (TRACE) trace("gc~step/SWEEP finish");\n toSpace.clear();\n state = State.IDLE;\n if (TRACE) trace("gc~state = IDLE");\n }\n break;\n }\n }\n}\n\n@inline function refToObj(ref: usize): ManagedObject {\n return changetype(ref - HEADER_SIZE);\n}\n\n@inline function objToRef(obj: ManagedObject): usize {\n return changetype(obj) + HEADER_SIZE;\n}\n\n// Garbage collector interface\n\n@global export function __gc_allocate(\n size: usize,\n markFn: (ref: usize) => void\n): usize {\n if (TRACE) trace("gc.allocate", 1, size);\n if (size > MAX_SIZE_32 - HEADER_SIZE) unreachable();\n step(); // also makes sure it\'s initialized\n var obj = changetype(memory.allocate(HEADER_SIZE + size));\n obj.hookFn = markFn;\n obj.color = white;\n fromSpace.push(obj);\n return objToRef(obj);\n}\n\n@global export function __gc_link(parentRef: usize, childRef: usize): void {\n if (TRACE) trace("gc.link", 2, parentRef, childRef);\n var parent = refToObj(parentRef);\n if (parent.color == !white && refToObj(childRef).color == white) parent.makeGray();\n}\n\n@global export function __gc_mark(ref: usize): void {\n if (TRACE) trace("gc.mark", 1, ref);\n if (ref) {\n let obj = refToObj(ref);\n if (obj.color == white) obj.makeGray();\n }\n}\n\n@global export function __gc_collect(): void {\n if (TRACE) trace("gc.collect");\n // begin collecting if not yet collecting\n switch (state) {\n case State.INIT:\n case State.IDLE: step();\n }\n // finish the cycle\n while (state != State.IDLE) step();\n}\n',dataview:'import {\n HEADER_SIZE,\n MAX_BLENGTH\n} from "./internal/arraybuffer";\n\nexport class DataView {\n\n constructor(\n readonly buffer: ArrayBuffer,\n readonly byteOffset: i32 = 0,\n readonly byteLength: i32 = i32.MIN_VALUE // FIXME\n ) {\n if (byteLength === i32.MIN_VALUE) byteLength = buffer.byteLength - byteOffset; // FIXME\n if (byteOffset > MAX_BLENGTH) throw new RangeError("Invalid byteOffset");\n if (byteLength > MAX_BLENGTH) throw new RangeError("Invalid byteLength");\n if (byteOffset + byteLength > buffer.byteLength) throw new RangeError("Invalid length");\n }\n\n getFloat32(byteOffset: i32, littleEndian: boolean = false): f32 {\n checkOffset(byteOffset, 4, this.byteLength);\n return littleEndian\n ? load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n : reinterpret(\n bswap(\n load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n )\n );\n }\n\n getFloat64(byteOffset: i32, littleEndian: boolean = false): f64 {\n checkOffset(byteOffset, 8, this.byteLength);\n return littleEndian\n ? load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n : reinterpret(\n bswap(\n load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE)\n )\n );\n }\n\n getInt8(byteOffset: i32): i8 {\n checkOffset(byteOffset, 1, this.byteLength);\n return load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n }\n\n getInt16(byteOffset: i32, littleEndian: boolean = false): i16 {\n checkOffset(byteOffset, 2, this.byteLength);\n var result: i16 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getInt32(byteOffset: i32, littleEndian: boolean = false): i32 {\n checkOffset(byteOffset, 4, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getUint8(byteOffset: i32): u8 {\n checkOffset(byteOffset, 1, this.byteLength);\n return load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n }\n\n getUint16(byteOffset: i32, littleEndian: boolean = false): u16 {\n checkOffset(byteOffset, 2, this.byteLength);\n var result: u16 = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getUint32(byteOffset: i32, littleEndian: boolean = false): u32 {\n checkOffset(byteOffset, 4, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n setFloat32(byteOffset: i32, value: f32, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 4, this.byteLength);\n if (littleEndian) {\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n } else {\n store(changetype(this.buffer) + this.byteOffset + byteOffset,\n bswap(\n reinterpret(value)\n ),\n HEADER_SIZE\n );\n }\n }\n\n setFloat64(byteOffset: i32, value: f64, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 8, this.byteLength);\n if (littleEndian) {\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n } else {\n store(changetype(this.buffer) + this.byteOffset + byteOffset,\n bswap(\n reinterpret(value)\n ),\n HEADER_SIZE\n );\n }\n }\n\n setInt8(byteOffset: i32, value: i8): void {\n checkOffset(byteOffset, 1, this.byteLength);\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n }\n\n setInt16(byteOffset: i32, value: i16, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 2, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setInt32(byteOffset: i32, value: i32, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 4, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setUint8(byteOffset: i32, value: u8): void {\n checkOffset(byteOffset, 1, this.byteLength);\n store(changetype(this.buffer) + this.byteOffset + byteOffset, value, HEADER_SIZE);\n }\n\n setUint16(byteOffset: i32, value: u16, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 2, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setUint32(byteOffset: i32, value: u32, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 4, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n // Non-standard additions that make sense in WebAssembly, but won\'t work in JS:\n\n getInt64(byteOffset: i32, littleEndian: boolean = false): i64 {\n checkOffset(byteOffset, 8, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n getUint64(byteOffset: i32, littleEndian: boolean = false): u64 {\n checkOffset(byteOffset, 8, this.byteLength);\n var result = load(changetype(this.buffer) + this.byteOffset + byteOffset, HEADER_SIZE);\n return littleEndian ? result : bswap(result);\n }\n\n setInt64(byteOffset: i32, value: i64, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 8, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n setUint64(byteOffset: i32, value: u64, littleEndian: boolean = false): void {\n checkOffset(byteOffset, 8, this.byteLength);\n store(\n changetype(this.buffer) + this.byteOffset + byteOffset,\n littleEndian ? value : bswap(value),\n HEADER_SIZE\n );\n }\n\n toString(): string {\n return "[object DataView]";\n }\n}\n\n@inline function checkOffset(byteOffset: i32, n: i32, byteLength: i32): void {\n // n and byteLength must be known to be in bounds\n if (byteOffset > MAX_BLENGTH || byteOffset + n > byteLength) throw new Error("Offset out of bounds");\n}\n',date:'import {\n UTC as Date_UTC,\n now as Date_now\n} from "./bindings/Date";\n\nexport class Date {\n\n @inline static UTC(\n year: i32,\n month: i32 = 0,\n day: i32 = 1,\n hour: i32 = 0,\n minute: i32 = 0,\n second: i32 = 0,\n millisecond: i64 = 0\n ): i64 {\n return Date_UTC(year, month, day, hour, minute, second, millisecond);\n }\n\n @inline static now(): i64 {\n return Date_now();\n }\n\n private value: i64;\n\n constructor(value: i64) {\n this.value = value;\n }\n\n getTime(): i64 {\n return this.value;\n }\n\n setTime(value: i64): i64 {\n this.value = value;\n return value;\n }\n}\n',diagnostics:"/* tslint:disable */\n\n@builtin export declare function ERROR(message?: void): void;\n@builtin export declare function WARNING(message?: void): void;\n@builtin export declare function INFO(message?: void): void;\n",env:"declare function abort(\n message?: string | null,\n fileName?: string | null,\n lineNumber?: u32,\n columnNumber?: u32\n): void;\n\ndeclare function trace(\n message: string,\n n?: i32,\n a0?: f64,\n a1?: f64,\n a2?: f64,\n a3?: f64,\n a4?: f64\n): void;\n",error:'export class Error {\n\n name: string = "Error";\n stack: string = ""; // TODO\n\n constructor(\n public message: string = ""\n ) {}\n\n toString(): string {\n var message = this.message;\n return message.length\n ? this.name + ": " + message\n : this.name;\n }\n}\n\nexport class RangeError extends Error {\n constructor(message: string = "") {\n super(message);\n this.name = "RangeError";\n }\n}\n\nexport class TypeError extends Error {\n constructor(message: string = "") {\n super(message);\n this.name = "TypeError";\n }\n}\n\nexport class SyntaxError extends Error {\n constructor(message: string = "") {\n super(message);\n this.name = "SyntaxError";\n }\n}\n',gc:"/* tslint:disable */\n\n@builtin export declare function iterateRoots(fn: (ref: usize) => void): void;\n\nexport namespace gc {\n\n export function collect(): void {\n if (isDefined(__gc_collect)) { __gc_collect(); return; }\n WARNING(\"Calling 'gc.collect' requires a garbage collector to be present.\");\n unreachable();\n }\n}\n","internal/allocator":"/** Number of alignment bits. */\n@inline export const AL_BITS: u32 = 3;\n/** Number of possible alignment values. */\n@inline export const AL_SIZE: usize = 1 << AL_BITS;\n/** Mask to obtain just the alignment bits. */\n@inline export const AL_MASK: usize = AL_SIZE - 1;\n/** Maximum 32-bit allocation size. */\n@inline export const MAX_SIZE_32: usize = 1 << 30; // 1GB\n","internal/arraybuffer":'import {\n AL_MASK,\n MAX_SIZE_32\n } from "./allocator";\n\n/** Size of an ArrayBuffer header. */\n@inline export const HEADER_SIZE: usize = (offsetof() + AL_MASK) & ~AL_MASK;\n/** Maximum byte length of an ArrayBuffer. */\n@inline export const MAX_BLENGTH: i32 = MAX_SIZE_32 - HEADER_SIZE;\n\nfunction computeSize(byteLength: i32): usize {\n // round up to power of 2, with HEADER_SIZE=8:\n // 0 -> 2^3 = 8\n // 1..8 -> 2^4 = 16\n // 9..24 -> 2^5 = 32\n // ...\n // MAX_LENGTH -> 2^30 = 0x40000000 (MAX_SIZE_32)\n return 1 << (32 - clz(byteLength + HEADER_SIZE - 1));\n}\n\n// Low-level utility\n\nfunction __gc(ref: usize): void {}\n\nexport function allocateUnsafe(byteLength: i32): ArrayBuffer {\n assert(byteLength <= MAX_BLENGTH);\n var buffer: usize;\n if (isManaged()) {\n buffer = __gc_allocate(computeSize(byteLength), __gc); // tslint:disable-line\n } else {\n buffer = memory.allocate(computeSize(byteLength));\n }\n store(buffer, byteLength, offsetof("byteLength"));\n return changetype(buffer);\n}\n\nexport function reallocateUnsafe(buffer: ArrayBuffer, newByteLength: i32): ArrayBuffer {\n var oldByteLength = buffer.byteLength;\n if (newByteLength > oldByteLength) {\n assert(newByteLength <= MAX_BLENGTH);\n if (newByteLength <= (computeSize(oldByteLength) - HEADER_SIZE)) { // fast path: zero out additional space\n store(changetype(buffer), newByteLength, offsetof("byteLength"));\n } else { // slow path: copy to new buffer\n let newBuffer = allocateUnsafe(newByteLength);\n memory.copy(\n changetype(newBuffer) + HEADER_SIZE,\n changetype(buffer) + HEADER_SIZE,\n oldByteLength\n );\n if (!isManaged()) {\n memory.free(changetype(buffer));\n }\n buffer = newBuffer;\n }\n memory.fill(\n changetype(buffer) + HEADER_SIZE + oldByteLength,\n 0,\n (newByteLength - oldByteLength)\n );\n } else if (newByteLength < oldByteLength) { // fast path: override size\n // TBD: worth to copy and release if size is significantly less than before?\n assert(newByteLength >= 0);\n store(changetype(buffer), newByteLength, offsetof("byteLength"));\n }\n return buffer;\n}\n\n// The helpers below use two different types in order to emit loads and stores that load respectively\n// store one type to/from memory while returning/taking the desired output/input type. This allows to\n// emit instructions like\n//\n// * `i32.load8` ^= `load(...)` that reads an i8 but returns an i32, or\n// * `i64.load32_s` ^= `load(...)`) that reads a 32-bit as a 64-bit integer\n//\n// without having to emit an additional instruction for conversion purposes. The second parameter\n// can be omitted for references and other loads and stores that simply return the exact type.\n\n@inline export function LOAD(buffer: ArrayBuffer, index: i32, byteOffset: i32 = 0): TOut {\n return load(changetype(buffer) + (index << alignof()) + byteOffset, HEADER_SIZE);\n}\n\n@inline export function STORE(buffer: ArrayBuffer, index: i32, value: TIn, byteOffset: i32 = 0): void {\n store(changetype(buffer) + (index << alignof()) + byteOffset, value, HEADER_SIZE);\n}\n',"internal/hash":'import {\n HEADER_SIZE\n} from "./string";\n\n/** Computes the 32-bit hash of a value of any type. */\n@inline\nexport function HASH(key: T): u32 {\n // branch-level tree-shaking makes this a `(return (call ...))`\n if (isString(key)) {\n return hashStr(key);\n } else if (isReference()) {\n if (sizeof() == 4) return hash32(changetype(key));\n if (sizeof() == 8) return hash64(changetype(key));\n } else if (isFloat()) {\n if (sizeof() == 4) return hash32(reinterpret(key));\n if (sizeof() == 8) return hash64(reinterpret(key));\n } else {\n if (sizeof() == 1) return hash8 (key);\n if (sizeof() == 2) return hash16(key);\n if (sizeof() == 4) return hash32(key);\n if (sizeof() == 8) return hash64(key);\n }\n unreachable();\n}\n\n// FNV-1a 32-bit as a starting point, see: http://isthe.com/chongo/tech/comp/fnv/\n\n@inline const FNV_OFFSET: u32 = 2166136261;\n@inline const FNV_PRIME: u32 = 16777619;\n\nfunction hash8(key: u32): u32 {\n return (FNV_OFFSET ^ key) * FNV_PRIME;\n}\n\nfunction hash16(key: u32): u32 {\n var v = FNV_OFFSET;\n v = (v ^ ( key & 0xff)) * FNV_PRIME;\n v = (v ^ ( key >> 8 )) * FNV_PRIME;\n return v;\n}\n\nfunction hash32(key: u32): u32 {\n var v = FNV_OFFSET;\n v = (v ^ ( key & 0xff)) * FNV_PRIME;\n v = (v ^ ((key >> 8) & 0xff)) * FNV_PRIME;\n v = (v ^ ((key >> 16) & 0xff)) * FNV_PRIME;\n v = (v ^ ( key >> 24 )) * FNV_PRIME;\n return v;\n}\n\nfunction hash64(key: u64): u32 {\n var l = key;\n var h = (key >>> 32);\n var v = FNV_OFFSET;\n v = (v ^ ( l & 0xff)) * FNV_PRIME;\n v = (v ^ ((l >> 8) & 0xff)) * FNV_PRIME;\n v = (v ^ ((l >> 16) & 0xff)) * FNV_PRIME;\n v = (v ^ ( l >> 24 )) * FNV_PRIME;\n v = (v ^ ( h & 0xff)) * FNV_PRIME;\n v = (v ^ ((h >> 8) & 0xff)) * FNV_PRIME;\n v = (v ^ ((h >> 16) & 0xff)) * FNV_PRIME;\n v = (v ^ ( h >> 24 )) * FNV_PRIME;\n return v;\n}\n\nfunction hashStr(key: string): u32 {\n var v = FNV_OFFSET;\n for (let i: usize = 0, k: usize = key.length << 1; i < k; ++i) {\n v = (v ^ load(changetype(key) + i, HEADER_SIZE)) * FNV_PRIME;\n }\n return v;\n}\n',"internal/memory":"// this function will go away once `memory.copy` becomes an intrinsic\nexport function memcpy(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memcpy.c\n var w: u32, x: u32;\n\n // copy 1 byte each until src is aligned to 4 bytes\n while (n && (src & 3)) {\n store(dest++, load(src++));\n n--;\n }\n\n // if dst is aligned to 4 bytes as well, copy 4 bytes each\n if ((dest & 3) == 0) {\n while (n >= 16) {\n store(dest , load(src ));\n store(dest + 4, load(src + 4));\n store(dest + 8, load(src + 8));\n store(dest + 12, load(src + 12));\n src += 16; dest += 16; n -= 16;\n }\n if (n & 8) {\n store(dest , load(src ));\n store(dest + 4, load(src + 4));\n dest += 8; src += 8;\n }\n if (n & 4) {\n store(dest, load(src));\n dest += 4; src += 4;\n }\n if (n & 2) { // drop to 2 bytes each\n store(dest, load(src));\n dest += 2; src += 2;\n }\n if (n & 1) { // drop to 1 byte\n store(dest++, load(src++));\n }\n return;\n }\n\n // if dst is not aligned to 4 bytes, use alternating shifts to copy 4 bytes each\n // doing shifts if faster when copying enough bytes (here: 32 or more)\n if (n >= 32) {\n switch (dest & 3) {\n // known to be != 0\n case 1: {\n w = load(src);\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n n -= 3;\n while (n >= 17) {\n x = load(src + 1);\n store(dest, w >> 24 | x << 8);\n w = load(src + 5);\n store(dest + 4, x >> 24 | w << 8);\n x = load(src + 9);\n store(dest + 8, w >> 24 | x << 8);\n w = load(src + 13);\n store(dest + 12, x >> 24 | w << 8);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n case 2: {\n w = load(src);\n store(dest++, load(src++));\n store(dest++, load(src++));\n n -= 2;\n while (n >= 18) {\n x = load(src + 2);\n store(dest, w >> 16 | x << 16);\n w = load(src + 6);\n store(dest + 4, x >> 16 | w << 16);\n x = load(src + 10);\n store(dest + 8, w >> 16 | x << 16);\n w = load(src + 14);\n store(dest + 12, x >> 16 | w << 16);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n case 3: {\n w = load(src);\n store(dest++, load(src++));\n n -= 1;\n while (n >= 19) {\n x = load(src + 3);\n store(dest, w >> 8 | x << 24);\n w = load(src + 7);\n store(dest + 4, x >> 8 | w << 24);\n x = load(src + 11);\n store(dest + 8, w >> 8 | x << 24);\n w = load(src + 15);\n store(dest + 12, x >> 8 | w << 24);\n src += 16; dest += 16; n -= 16;\n }\n break;\n }\n }\n }\n\n // copy remaining bytes one by one\n if (n & 16) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 8) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 4) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 2) {\n store(dest++, load(src++));\n store(dest++, load(src++));\n }\n if (n & 1) {\n store(dest++, load(src++));\n }\n}\n\n// this function will go away once `memory.copy` becomes an intrinsic\nexport function memmove(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memmove.c\n if (dest === src) return;\n if (src + n <= dest || dest + n <= src) {\n memcpy(dest, src, n);\n return;\n }\n if (dest < src) {\n if ((src & 7) == (dest & 7)) {\n while (dest & 7) {\n if (!n) return;\n --n;\n store(dest++, load(src++));\n }\n while (n >= 8) {\n store(dest, load(src));\n n -= 8;\n dest += 8;\n src += 8;\n }\n }\n while (n) {\n store(dest++, load(src++));\n --n;\n }\n } else {\n if ((src & 7) == (dest & 7)) {\n while ((dest + n) & 7) {\n if (!n) return;\n store(dest + --n, load(src + n));\n }\n while (n >= 8) {\n n -= 8;\n store(dest + n, load(src + n));\n }\n }\n while (n) {\n store(dest + --n, load(src + n));\n }\n }\n}\n\n// this function will go away once `memory.fill` becomes an intrinsic\nexport function memset(dest: usize, c: u8, n: usize): void { // see: musl/src/string/memset\n\n // fill head and tail with minimal branching\n if (!n) return;\n store(dest, c);\n store(dest + n - 1, c);\n if (n <= 2) return;\n\n store(dest + 1, c);\n store(dest + 2, c);\n store(dest + n - 2, c);\n store(dest + n - 3, c);\n if (n <= 6) return;\n store(dest + 3, c);\n store(dest + n - 4, c);\n if (n <= 8) return;\n\n // advance pointer to align it at 4-byte boundary\n var k: usize = -dest & 3;\n dest += k;\n n -= k;\n n &= -4;\n\n var c32: u32 = -1 / 255 * c;\n\n // fill head/tail up to 28 bytes each in preparation\n store(dest, c32);\n store(dest + n - 4, c32);\n if (n <= 8) return;\n store(dest + 4, c32);\n store(dest + 8, c32);\n store(dest + n - 12, c32);\n store(dest + n - 8, c32);\n if (n <= 24) return;\n store(dest + 12, c32);\n store(dest + 16, c32);\n store(dest + 20, c32);\n store(dest + 24, c32);\n store(dest + n - 28, c32);\n store(dest + n - 24, c32);\n store(dest + n - 20, c32);\n store(dest + n - 16, c32);\n\n // align to a multiple of 8\n k = 24 + (dest & 4);\n dest += k;\n n -= k;\n\n // copy 32 bytes each\n var c64: u64 = c32 | (c32 << 32);\n while (n >= 32) {\n store(dest, c64);\n store(dest + 8, c64);\n store(dest + 16, c64);\n store(dest + 24, c64);\n n -= 32;\n dest += 32;\n }\n}\n\nexport function memcmp(vl: usize, vr: usize, n: usize): i32 { // see: musl/src/string/memcmp.c\n if (vl == vr) return 0;\n while (n != 0 && load(vl) == load(vr)) {\n n--; vl++; vr++;\n }\n return n ? load(vl) - load(vr) : 0;\n}\n","internal/number":'import {\n CharCode,\n allocateUnsafe as allocateUnsafeString,\n freeUnsafe as freeUnsafeString,\n HEADER_SIZE as STRING_HEADER_SIZE\n} from "./string";\n\nimport {\n LOAD\n} from "./arraybuffer";\n\n@inline export const MAX_DOUBLE_LENGTH = 28;\n\n@lazy @inline const POWERS10: u32[] = [\n 1,\n 10,\n 100,\n 1000,\n 10000,\n 100000,\n 1000000,\n 10000000,\n 100000000,\n 1000000000\n];\n\n/*\n Lookup table for pairwise char codes in range [0-99]\n\n "00", "01", "02", "03", "04", "05", "06", "07", "08", "09",\n "10", "11", "12", "13", "14", "15", "16", "17", "18", "19",\n "20", "21", "22", "23", "24", "25", "26", "27", "28", "29",\n "30", "31", "32", "33", "34", "35", "36", "37", "38", "39",\n "40", "41", "42", "43", "44", "45", "46", "47", "48", "49",\n "50", "51", "52", "53", "54", "55", "56", "57", "58", "59",\n "60", "61", "62", "63", "64", "65", "66", "67", "68", "69",\n "70", "71", "72", "73", "74", "75", "76", "77", "78", "79",\n "80", "81", "82", "83", "84", "85", "86", "87", "88", "89",\n "90", "91", "92", "93", "94", "95", "96", "97", "98", "99"\n*/\n@lazy @inline const DIGITS: u32[] = [\n 0x00300030, 0x00310030, 0x00320030, 0x00330030, 0x00340030,\n 0x00350030, 0x00360030, 0x00370030, 0x00380030, 0x00390030,\n 0x00300031, 0x00310031, 0x00320031, 0x00330031, 0x00340031,\n 0x00350031, 0x00360031, 0x00370031, 0x00380031, 0x00390031,\n 0x00300032, 0x00310032, 0x00320032, 0x00330032, 0x00340032,\n 0x00350032, 0x00360032, 0x00370032, 0x00380032, 0x00390032,\n 0x00300033, 0x00310033, 0x00320033, 0x00330033, 0x00340033,\n 0x00350033, 0x00360033, 0x00370033, 0x00380033, 0x00390033,\n 0x00300034, 0x00310034, 0x00320034, 0x00330034, 0x00340034,\n 0x00350034, 0x00360034, 0x00370034, 0x00380034, 0x00390034,\n 0x00300035, 0x00310035, 0x00320035, 0x00330035, 0x00340035,\n 0x00350035, 0x00360035, 0x00370035, 0x00380035, 0x00390035,\n 0x00300036, 0x00310036, 0x00320036, 0x00330036, 0x00340036,\n 0x00350036, 0x00360036, 0x00370036, 0x00380036, 0x00390036,\n 0x00300037, 0x00310037, 0x00320037, 0x00330037, 0x00340037,\n 0x00350037, 0x00360037, 0x00370037, 0x00380037, 0x00390037,\n 0x00300038, 0x00310038, 0x00320038, 0x00330038, 0x00340038,\n 0x00350038, 0x00360038, 0x00370038, 0x00380038, 0x00390038,\n 0x00300039, 0x00310039, 0x00320039, 0x00330039, 0x00340039,\n 0x00350039, 0x00360039, 0x00370039, 0x00380039, 0x00390039\n];\n\n@lazy @inline const EXP_POWERS: i16[] = [\n -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980,\n -954, -927, -901, -874, -847, -821, -794, -768, -741, -715,\n -688, -661, -635, -608, -582, -555, -529, -502, -475, -449,\n -422, -396, -369, -343, -316, -289, -263, -236, -210, -183,\n -157, -130, -103, -77, -50, -24, 3, 30, 56, 83,\n 109, 136, 162, 189, 216, 242, 269, 295, 322, 348,\n 375, 402, 428, 455, 481, 508, 534, 561, 588, 614,\n 641, 667, 694, 720, 747, 774, 800, 827, 853, 880,\n 907, 933, 960, 986, 1013, 1039, 1066\n];\n\n// 1e-348, 1e-340, ..., 1e340\n@lazy @inline const FRC_POWERS: u64[] = [\n 0xFA8FD5A0081C0288, 0xBAAEE17FA23EBF76, 0x8B16FB203055AC76, 0xCF42894A5DCE35EA,\n 0x9A6BB0AA55653B2D, 0xE61ACF033D1A45DF, 0xAB70FE17C79AC6CA, 0xFF77B1FCBEBCDC4F,\n 0xBE5691EF416BD60C, 0x8DD01FAD907FFC3C, 0xD3515C2831559A83, 0x9D71AC8FADA6C9B5,\n 0xEA9C227723EE8BCB, 0xAECC49914078536D, 0x823C12795DB6CE57, 0xC21094364DFB5637,\n 0x9096EA6F3848984F, 0xD77485CB25823AC7, 0xA086CFCD97BF97F4, 0xEF340A98172AACE5,\n 0xB23867FB2A35B28E, 0x84C8D4DFD2C63F3B, 0xC5DD44271AD3CDBA, 0x936B9FCEBB25C996,\n 0xDBAC6C247D62A584, 0xA3AB66580D5FDAF6, 0xF3E2F893DEC3F126, 0xB5B5ADA8AAFF80B8,\n 0x87625F056C7C4A8B, 0xC9BCFF6034C13053, 0x964E858C91BA2655, 0xDFF9772470297EBD,\n 0xA6DFBD9FB8E5B88F, 0xF8A95FCF88747D94, 0xB94470938FA89BCF, 0x8A08F0F8BF0F156B,\n 0xCDB02555653131B6, 0x993FE2C6D07B7FAC, 0xE45C10C42A2B3B06, 0xAA242499697392D3,\n 0xFD87B5F28300CA0E, 0xBCE5086492111AEB, 0x8CBCCC096F5088CC, 0xD1B71758E219652C,\n 0x9C40000000000000, 0xE8D4A51000000000, 0xAD78EBC5AC620000, 0x813F3978F8940984,\n 0xC097CE7BC90715B3, 0x8F7E32CE7BEA5C70, 0xD5D238A4ABE98068, 0x9F4F2726179A2245,\n 0xED63A231D4C4FB27, 0xB0DE65388CC8ADA8, 0x83C7088E1AAB65DB, 0xC45D1DF942711D9A,\n 0x924D692CA61BE758, 0xDA01EE641A708DEA, 0xA26DA3999AEF774A, 0xF209787BB47D6B85,\n 0xB454E4A179DD1877, 0x865B86925B9BC5C2, 0xC83553C5C8965D3D, 0x952AB45CFA97A0B3,\n 0xDE469FBD99A05FE3, 0xA59BC234DB398C25, 0xF6C69A72A3989F5C, 0xB7DCBF5354E9BECE,\n 0x88FCF317F22241E2, 0xCC20CE9BD35C78A5, 0x98165AF37B2153DF, 0xE2A0B5DC971F303A,\n 0xA8D9D1535CE3B396, 0xFB9B7CD9A4A7443C, 0xBB764C4CA7A44410, 0x8BAB8EEFB6409C1A,\n 0xD01FEF10A657842C, 0x9B10A4E5E9913129, 0xE7109BFBA19C0C9D, 0xAC2820D9623BF429,\n 0x80444B5E7AA7CF85, 0xBF21E44003ACDD2D, 0x8E679C2F5E44FF8F, 0xD433179D9C8CB841,\n 0x9E19DB92B4E31BA9, 0xEB96BF6EBADF77D9, 0xAF87023B9BF0EE6B\n];\n\n// Count number of decimals for u32 values\n// In our case input value always non-zero so we can simplify some parts\nexport function decimalCount32(value: u32): u32 {\n if (ASC_SHRINK_LEVEL >= 1) {\n let l: u32 = 32 - clz(value); // log2\n let t = l * 1233 >>> 12; // log10\n\n let lutbuf = POWERS10.buffer_;\n let power = LOAD(lutbuf, t);\n t -= (value < power);\n return t + 1;\n } else {\n if (value < 100000) {\n if (value < 100) {\n return select(1, 2, value < 10);\n } else {\n let m = select(4, 5, value < 10000);\n return select(3, m, value < 1000);\n }\n } else {\n if (value < 10000000) {\n return select(6, 7, value < 1000000);\n } else {\n let m = select(9, 10, value < 1000000000);\n return select(8, m, value < 100000000);\n }\n }\n }\n}\n\n// Count number of decimals for u64 values\n// In our case input value always greater than 2^32-1 so we can skip some parts\nexport function decimalCount64(value: u64): u32 {\n if (ASC_SHRINK_LEVEL >= 1) {\n let l: u32 = 64 - clz(value); // log2\n let t = l * 1233 >>> 12; // log10\n\n let lutbuf = POWERS10.buffer_;\n let power = LOAD(lutbuf, t - 10);\n t -= (value < 10000000000 * power);\n return t + 1;\n } else {\n if (value < 1000000000000000) {\n if (value < 1000000000000) {\n return select(11, 12, value < 100000000000);\n } else {\n let m = select(14, 15, value < 100000000000000);\n return select(13, m, value < 10000000000000);\n }\n } else {\n if (value < 100000000000000000) {\n return select(16, 17, value < 10000000000000000);\n } else {\n let m = select(19, 20, value < 10000000000000000000);\n return select(18, m, value < 1000000000000000000);\n }\n }\n }\n}\n\nfunction utoa32_lut(buffer: usize, num: u32, offset: usize): void {\n var lutbuf = DIGITS.buffer_;\n\n while (num >= 10000) {\n // in most VMs i32/u32 div and modulo by constant can be shared and simplificate\n let t = num / 10000;\n let r = num % 10000;\n num = t;\n\n let d1 = r / 100;\n let d2 = r % 100;\n\n let digits1 = LOAD(lutbuf, d1);\n let digits2 = LOAD(lutbuf, d2);\n\n offset -= 4;\n store(buffer + (offset << 1), digits1 | (digits2 << 32), STRING_HEADER_SIZE);\n }\n\n if (num >= 100) {\n let t = num / 100;\n let d1 = num % 100;\n num = t;\n offset -= 2;\n let digits = LOAD(lutbuf, d1);\n store(buffer + (offset << 1), digits, STRING_HEADER_SIZE);\n }\n\n if (num >= 10) {\n offset -= 2;\n let digits = LOAD(lutbuf, num);\n store(buffer + (offset << 1), digits, STRING_HEADER_SIZE);\n } else {\n offset -= 1;\n let digit = CharCode._0 + num;\n store(buffer + (offset << 1), digit, STRING_HEADER_SIZE);\n }\n}\n\nfunction utoa64_lut(buffer: usize, num: u64, offset: usize): void {\n var lutbuf = DIGITS.buffer_;\n\n while (num >= 100000000) {\n let t = num / 100000000;\n let r = (num - t * 100000000);\n num = t;\n\n let b = r / 10000;\n let c = r % 10000;\n\n let b1 = b / 100;\n let b2 = b % 100;\n let c1 = c / 100;\n let c2 = c % 100;\n\n let digits1 = LOAD(lutbuf, c1);\n let digits2 = LOAD(lutbuf, c2);\n\n offset -= 4;\n store(buffer + (offset << 1), digits1 | (digits2 << 32), STRING_HEADER_SIZE);\n\n digits1 = LOAD(lutbuf, b1);\n digits2 = LOAD(lutbuf, b2);\n\n offset -= 4;\n store(buffer + (offset << 1), digits1 | (digits2 << 32), STRING_HEADER_SIZE);\n }\n\n utoa32_lut(buffer, num, offset);\n}\n\nfunction utoa_simple(buffer: usize, num: T, offset: usize): void {\n do {\n let t = num / 10;\n let r = (num % 10);\n num = t;\n offset -= 1;\n store(buffer + (offset << 1), CharCode._0 + r, STRING_HEADER_SIZE);\n } while (num);\n}\n\n@inline\nexport function utoa32_core(buffer: usize, num: u32, offset: u32): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n utoa_simple(buffer, num, offset);\n } else {\n utoa32_lut(buffer, num, offset);\n }\n}\n\n@inline\nexport function utoa64_core(buffer: usize, num: u64, offset: u32): void {\n if (ASC_SHRINK_LEVEL >= 1) {\n utoa_simple(buffer, num, offset);\n } else {\n utoa64_lut(buffer, num, offset);\n }\n}\n\nexport function utoa32(value: u32): String {\n if (!value) return "0";\n\n var decimals = decimalCount32(value);\n var buffer = allocateUnsafeString(decimals);\n\n utoa32_core(changetype(buffer), value, decimals);\n return buffer;\n}\n\nexport function itoa32(value: i32): String {\n if (!value) return "0";\n\n var sign = value < 0;\n if (sign) value = -value;\n\n var decimals = decimalCount32(value) + sign;\n var buffer = allocateUnsafeString(decimals);\n\n utoa32_core(changetype(buffer), value, decimals);\n if (sign) store(changetype(buffer), CharCode.MINUS, STRING_HEADER_SIZE);\n\n return buffer;\n}\n\nexport function utoa64(value: u64): String {\n if (!value) return "0";\n\n var buffer: String;\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n let decimals = decimalCount32(val32);\n buffer = allocateUnsafeString(decimals);\n utoa32_core(changetype(buffer), val32, decimals);\n } else {\n let decimals = decimalCount64(value);\n buffer = allocateUnsafeString(decimals);\n utoa64_core(changetype(buffer), value, decimals);\n }\n return buffer;\n}\n\nexport function itoa64(value: i64): String {\n if (!value) return "0";\n\n var sign = value < 0;\n if (sign) value = -value;\n\n var buffer: String;\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n let decimals = decimalCount32(val32) + sign;\n buffer = allocateUnsafeString(decimals);\n utoa32_core(changetype(buffer), val32, decimals);\n } else {\n let decimals = decimalCount64(value) + sign;\n buffer = allocateUnsafeString(decimals);\n utoa64_core(changetype(buffer), value, decimals);\n }\n if (sign) store(changetype(buffer), CharCode.MINUS, STRING_HEADER_SIZE);\n\n return buffer;\n}\n\nexport function itoa(value: T): String {\n if (!isInteger()) {\n assert(false); // unexpecteble non-integer generic type\n } else {\n if (isSigned()) {\n if (sizeof() <= 4) {\n return itoa32(value);\n } else {\n return itoa64(value);\n }\n } else {\n if (sizeof() <= 4) {\n return utoa32(value);\n } else {\n return utoa64(value);\n }\n }\n }\n}\n\n@lazy var _K: i32 = 0;\n// @lazy var _frc: u64 = 0;\n@lazy var _exp: i32 = 0;\n@lazy var _frc_minus: u64 = 0;\n@lazy var _frc_plus: u64 = 0;\n@lazy var _frc_pow: u64 = 0;\n@lazy var _exp_pow: i32 = 0;\n\n@inline\nfunction umul64f(u: u64, v: u64): u64 {\n var u0 = u & 0xFFFFFFFF;\n var v0 = v & 0xFFFFFFFF;\n\n var u1 = u >> 32;\n var v1 = v >> 32;\n\n var l = u0 * v0;\n var t = u1 * v0 + (l >> 32);\n var w = u0 * v1 + (t & 0xFFFFFFFF);\n\n w += 0x7FFFFFFF; // rounding\n\n t >>= 32;\n w >>= 32;\n\n return u1 * v1 + t + w;\n}\n\n@inline\nfunction umul64e(e1: i32, e2: i32): i32 {\n return e1 + e2 + 64; // where 64 is significand size\n}\n\n@inline\nfunction normalizedBoundaries(f: u64, e: i32): void {\n var frc = (f << 1) + 1;\n var exp = e - 1;\n var off = clz(frc);\n frc <<= off;\n exp -= off;\n\n var m = 1 + (f == 0x0010000000000000);\n\n _frc_plus = frc;\n _frc_minus = ((f << m) - 1) << e - m - exp;\n _exp = exp;\n}\n\n@inline\nfunction grisuRound(buffer: usize, len: i32, delta: u64, rest: u64, ten_kappa: u64, wp_w: u64): void {\n var lastp = buffer + ((len - 1) << 1);\n var digit = load(lastp, STRING_HEADER_SIZE);\n while (\n rest < wp_w &&\n delta - rest >= ten_kappa && (\n rest + ten_kappa < wp_w ||\n wp_w - rest > rest + ten_kappa - wp_w\n )\n ) {\n --digit;\n rest += ten_kappa;\n }\n store(lastp, digit, STRING_HEADER_SIZE);\n}\n\n@inline\nfunction getCachedPower(minExp: i32): void {\n const c = reinterpret(0x3FD34413509F79FE); // 1 / lg(10) = 0.30102999566398114\n var dk = (-61 - minExp) * c + 347;\t // dk must be positive, so can do ceiling in positive\n var k = dk;\n k += (k != dk); // conversion with ceil\n\n var index = (k >> 3) + 1;\n _K = 348 - (index << 3);\t// decimal exponent no need lookup table\n var frcPowers = FRC_POWERS.buffer_;\n var expPowers = EXP_POWERS.buffer_;\n _frc_pow = LOAD(frcPowers, index);\n _exp_pow = LOAD(expPowers, index);\n}\n\n@inline\nfunction grisu2(value: f64, buffer: usize, sign: i32): i32 {\n\n // frexp routine\n var uv = reinterpret(value);\n var exp = ((uv & 0x7FF0000000000000) >>> 52);\n var sid = uv & 0x000FFFFFFFFFFFFF;\n var frc = ((exp != 0) << 52) + sid;\n exp = select(exp, 1, exp != 0) - (0x3FF + 52);\n\n normalizedBoundaries(frc, exp);\n getCachedPower(_exp);\n\n // normalize\n var off = clz(frc);\n frc <<= off;\n exp -= off;\n\n var frc_pow = _frc_pow;\n var exp_pow = _exp_pow;\n\n var w_frc = umul64f(frc, frc_pow);\n var w_exp = umul64e(exp, exp_pow);\n\n var wp_frc = umul64f(_frc_plus, frc_pow) - 1;\n var wp_exp = umul64e(_exp, exp_pow);\n\n var wm_frc = umul64f(_frc_minus, frc_pow) + 1;\n var delta = wp_frc - wm_frc;\n\n return genDigits(buffer, w_frc, w_exp, wp_frc, wp_exp, delta, sign);\n}\n\nfunction genDigits(buffer: usize, w_frc: u64, w_exp: i32, mp_frc: u64, mp_exp: i32, delta: u64, sign: i32): i32 {\n var one_exp = -mp_exp;\n var one_frc = (1) << one_exp;\n var mask = one_frc - 1;\n\n var wp_w_frc = mp_frc - w_frc;\n var wp_w_exp = mp_exp;\n\n var p1 = (mp_frc >> one_exp);\n var p2 = mp_frc & mask;\n\n var kappa = decimalCount32(p1);\n var len = sign;\n\n var powers10 = POWERS10.buffer_;\n\n while (kappa > 0) {\n let d: u32;\n switch (kappa) {\n case 10: { d = p1 / 1000000000; p1 %= 1000000000; break; }\n case 9: { d = p1 / 100000000; p1 %= 100000000; break; }\n case 8: { d = p1 / 10000000; p1 %= 10000000; break; }\n case 7: { d = p1 / 1000000; p1 %= 1000000; break; }\n case 6: { d = p1 / 100000; p1 %= 100000; break; }\n case 5: { d = p1 / 10000; p1 %= 10000; break; }\n case 4: { d = p1 / 1000; p1 %= 1000; break; }\n case 3: { d = p1 / 100; p1 %= 100; break; }\n case 2: { d = p1 / 10; p1 %= 10; break; }\n case 1: { d = p1; p1 = 0; break; }\n default: { d = 0; break; }\n }\n\n if (d | len) store(buffer + (len++ << 1), CharCode._0 + d, STRING_HEADER_SIZE);\n\n --kappa;\n let tmp = ((p1) << one_exp) + p2;\n if (tmp <= delta) {\n _K += kappa;\n grisuRound(buffer, len, delta, tmp, LOAD(powers10, kappa) << one_exp, wp_w_frc);\n return len;\n }\n }\n\n while (1) {\n p2 *= 10;\n delta *= 10;\n\n let d = p2 >> one_exp;\n if (d | len) store(buffer + (len++ << 1), CharCode._0 + d, STRING_HEADER_SIZE);\n\n p2 &= mask;\n --kappa;\n if (p2 < delta) {\n _K += kappa;\n wp_w_frc *= LOAD(powers10, -kappa);\n grisuRound(buffer, len, delta, p2, one_frc, wp_w_frc);\n return len;\n }\n }\n\n return len;\n}\n\n@inline\nfunction genExponent(buffer: usize, k: i32): i32 {\n var sign = k < 0;\n if (sign) k = -k;\n var decimals = decimalCount32(k) + 1;\n utoa32_core(buffer, k, decimals);\n store(buffer, select(CharCode.MINUS, CharCode.PLUS, sign), STRING_HEADER_SIZE);\n return decimals;\n}\n\nfunction prettify(buffer: usize, length: i32, k: i32): i32 {\n if (!k) {\n store(buffer + (length << 1), CharCode.DOT | (CharCode._0 << 16), STRING_HEADER_SIZE);\n return length + 2;\n }\n\n var kk = length + k;\n if (length <= kk && kk <= 21) {\n // 1234e7 -> 12340000000\n for (let i = length; i < kk; ++i) {\n store(buffer + (i << 1), CharCode._0, STRING_HEADER_SIZE);\n }\n store(buffer + (kk << 1), CharCode.DOT | (CharCode._0 << 16), STRING_HEADER_SIZE);\n return kk + 2;\n } else if (kk > 0 && kk <= 21) {\n // 1234e-2 -> 12.34\n let ptr = buffer + (kk << 1);\n memory.copy(\n ptr + STRING_HEADER_SIZE + 2,\n ptr + STRING_HEADER_SIZE,\n -k << 1\n );\n store(buffer + (kk << 1), CharCode.DOT, STRING_HEADER_SIZE);\n return length + 1;\n } else if (-6 < kk && kk <= 0) {\n // 1234e-6 -> 0.001234\n let offset = 2 - kk;\n memory.copy(\n buffer + STRING_HEADER_SIZE + (offset << 1),\n buffer + STRING_HEADER_SIZE,\n length << 1\n );\n store(buffer, CharCode._0 | (CharCode.DOT << 16), STRING_HEADER_SIZE);\n for (let i = 2; i < offset; ++i) {\n store(buffer + (i << 1), CharCode._0, STRING_HEADER_SIZE);\n }\n return length + offset;\n } else if (length == 1) {\n // 1e30\n store(buffer, CharCode.e, STRING_HEADER_SIZE + 2);\n length = genExponent(buffer + 4, kk - 1);\n return length + 2;\n } else {\n let len = length << 1;\n memory.copy(\n buffer + STRING_HEADER_SIZE + 4,\n buffer + STRING_HEADER_SIZE + 2,\n len - 2\n );\n store(buffer, CharCode.DOT, STRING_HEADER_SIZE + 2);\n store(buffer + len, CharCode.e, STRING_HEADER_SIZE + 2);\n length += genExponent(buffer + len + 4, kk - 1);\n return length + 2;\n }\n}\n\nexport function dtoa_core(buffer: usize, value: f64): i32 {\n var sign = (value < 0);\n if (sign) {\n value = -value;\n store(buffer, CharCode.MINUS, STRING_HEADER_SIZE);\n }\n // assert(value > 0 && value <= 1.7976931348623157e308);\n var len = grisu2(value, buffer, sign);\n len = prettify(buffer + (sign << 1), len - sign, _K);\n return len + sign;\n}\n\nexport function dtoa(value: f64): String {\n if (value == 0) return "0.0";\n if (!isFinite(value)) {\n if (isNaN(value)) return "NaN";\n return select("-Infinity", "Infinity", value < 0);\n }\n var buffer = allocateUnsafeString(MAX_DOUBLE_LENGTH);\n var length = dtoa_core(changetype(buffer), value);\n var result = buffer.substring(0, length);\n freeUnsafeString(buffer);\n return result;\n}\n\nexport function itoa_stream(buffer: usize, offset: usize, value: T): u32 {\n buffer += (offset << 1);\n if (!value) {\n store(buffer, CharCode._0, STRING_HEADER_SIZE);\n return 1;\n }\n var decimals: u32 = 0;\n if (isSigned()) {\n let sign = value < 0;\n if (sign) value = -value;\n if (sizeof() <= 4) {\n decimals = decimalCount32(value) + sign;\n utoa32_core(buffer, value, decimals);\n } else {\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n decimals = decimalCount32(val32) + sign;\n utoa32_core(buffer, val32, decimals);\n } else {\n decimals = decimalCount64(value) + sign;\n utoa64_core(buffer, value, decimals);\n }\n }\n if (sign) store(buffer, CharCode.MINUS, STRING_HEADER_SIZE);\n } else {\n if (sizeof() <= 4) {\n decimals = decimalCount32(value);\n utoa32_core(buffer, value, decimals);\n } else {\n if (value <= u32.MAX_VALUE) {\n let val32 = value;\n decimals = decimalCount32(val32);\n utoa32_core(buffer, val32, decimals);\n } else {\n decimals = decimalCount64(value);\n utoa64_core(buffer, value, decimals);\n }\n }\n }\n return decimals;\n}\n\nexport function dtoa_stream(buffer: usize, offset: usize, value: f64): u32 {\n buffer += (offset << 1);\n if (value == 0.0) {\n store(buffer, CharCode._0, STRING_HEADER_SIZE + 0);\n store(buffer, CharCode.DOT, STRING_HEADER_SIZE + 2);\n store(buffer, CharCode._0, STRING_HEADER_SIZE + 4);\n return 3;\n }\n if (!isFinite(value)) {\n if (isNaN(value)) {\n store(buffer, CharCode.N, STRING_HEADER_SIZE + 0);\n store(buffer, CharCode.a, STRING_HEADER_SIZE + 2);\n store(buffer, CharCode.N, STRING_HEADER_SIZE + 4);\n return 3;\n } else {\n let sign = (value < 0);\n let len = 8 + sign;\n let source = changetype(select("-Infinity", "Infinity", sign));\n memory.copy(buffer + STRING_HEADER_SIZE, source + STRING_HEADER_SIZE, len << 1);\n return len;\n }\n }\n return dtoa_core(buffer, value);\n}\n',"internal/sort":"import {\n LOAD,\n STORE\n} from \"./arraybuffer\";\n\nimport {\n compareUnsafe\n} from \"./string\";\n\n/** Obtains the default comparator for the specified value type. */\n@inline\nexport function COMPARATOR(): (a: T, b: T) => i32 {\n if (isInteger()) {\n if (isSigned() && sizeof() <= 4) {\n return (a: T, b: T): i32 => ((a - b));\n } else {\n return (a: T, b: T): i32 => ((a > b) - (a < b));\n }\n } else if (isFloat()) {\n if (sizeof() == 4) {\n return (a: T, b: T): i32 => {\n var ia = reinterpret(a);\n var ib = reinterpret(b);\n ia ^= (ia >> 31) >>> 1;\n ib ^= (ib >> 31) >>> 1;\n return (ia > ib) - (ia < ib);\n };\n } else {\n return (a: T, b: T): i32 => {\n var ia = reinterpret(a);\n var ib = reinterpret(b);\n ia ^= (ia >> 63) >>> 1;\n ib ^= (ib >> 63) >>> 1;\n return (ia > ib) - (ia < ib);\n };\n }\n } else if (isString()) {\n return (a: T, b: T): i32 => {\n if (a === b || a === null || b === null) return 0;\n var alen = (a).length;\n var blen = (b).length;\n if (!alen && !blen) return 0;\n if (!alen) return -1;\n if (!blen) return 1;\n return compareUnsafe(a, 0, b, 0, min(alen, blen));\n };\n } else {\n return (a: T, b: T): i32 => ((a > b) - (a < b));\n }\n}\n\n@inline\nexport function SORT(\n buffer: ArrayBuffer,\n byteOffset: i32,\n length: i32,\n comparator: (a: T, b: T) => i32\n): void {\n if (isReference()) {\n // TODO replace this to faster stable sort (TimSort) when it implemented\n insertionSort(buffer, byteOffset, length, comparator);\n } else {\n if (length < 256) {\n insertionSort(buffer, byteOffset, length, comparator);\n } else {\n weakHeapSort(buffer, byteOffset, length, comparator);\n }\n }\n}\n\n/** Sorts an Array with the 'Insertion Sort' algorithm. */\nfunction insertionSort(\n buffer: ArrayBuffer,\n byteOffset: i32,\n length: i32,\n comparator: (a: T, b: T) => i32\n): void {\n for (let i = 0; i < length; i++) {\n let a = LOAD(buffer, i, byteOffset); // a = arr[i]\n let j = i - 1;\n while (j >= 0) {\n let b = LOAD(buffer, j, byteOffset); // b = arr[j]\n if (comparator(a, b) < 0) {\n STORE(buffer, j-- + 1, b, byteOffset); // arr[j + 1] = b\n } else break;\n }\n STORE(buffer, j + 1, a, byteOffset); // arr[j + 1] = a\n }\n}\n\n/** Sorts an Array with the 'Weak Heap Sort' algorithm. */\nfunction weakHeapSort(\n buffer: ArrayBuffer,\n byteOffset: i32,\n length: i32,\n comparator: (a: T, b: T) => i32\n): void {\n const shift32 = alignof();\n\n var bitsetSize = (length + 31) >> 5 << shift32;\n var bitset = memory.allocate(bitsetSize); // indexed in 32-bit chunks below\n memory.fill(bitset, 0, bitsetSize);\n\n // see: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.21.1863&rep=rep1&type=pdf\n\n for (let i = length - 1; i > 0; i--) {\n let j = i;\n while ((j & 1) == (load(bitset + (j >> 6 << shift32)) >> (j >> 1 & 31) & 1)) j >>= 1;\n\n let p = j >> 1;\n let a = LOAD(buffer, p, byteOffset); // a = arr[p]\n let b = LOAD(buffer, i, byteOffset); // b = arr[i]\n if (comparator(a, b) < 0) {\n store(\n bitset + (i >> 5 << shift32),\n load(bitset + (i >> 5 << shift32)) ^ (1 << (i & 31))\n );\n STORE(buffer, i, a, byteOffset); // arr[i] = a\n STORE(buffer, p, b, byteOffset); // arr[p] = b\n }\n }\n\n for (let i = length - 1; i >= 2; i--) {\n let a = LOAD(buffer, 0, byteOffset);\n STORE(buffer, 0, LOAD(buffer, i, byteOffset), byteOffset);\n STORE(buffer, i, a, byteOffset);\n\n let x = 1, y: i32;\n while ((y = (x << 1) + ((load(bitset + (x >> 5 << shift32)) >> (x & 31)) & 1)) < i) x = y;\n\n while (x > 0) {\n a = LOAD(buffer, 0, byteOffset); // a = arr[0]\n let b = LOAD(buffer, x, byteOffset); // b = arr[x]\n\n if (comparator(a, b) < 0) {\n store(\n bitset + (x >> 5 << shift32),\n load(bitset + (x >> 5 << shift32)) ^ (1 << (x & 31))\n );\n STORE(buffer, x, a, byteOffset); // arr[x] = a\n STORE(buffer, 0, b, byteOffset); // arr[0] = b\n }\n x >>= 1;\n }\n }\n\n memory.free(bitset);\n\n var t = LOAD(buffer, 1, byteOffset); // t = arr[1]\n STORE(buffer, 1, LOAD(buffer, 0, byteOffset), byteOffset);\n STORE(buffer, 0, t, byteOffset); // arr[0] = t\n}\n","internal/string":'import { MAX_SIZE_32 } from "./allocator";\nimport { String } from "../string";\n\n/** Size of a String header. */\n@inline export const HEADER_SIZE = (offsetof() + 1) & ~1; // 2 byte aligned\n/** Maximum length of a String. */\n@inline export const MAX_LENGTH = (MAX_SIZE_32 - HEADER_SIZE) >>> 1;\n\n// Low-level utility\n\nfunction __gc(ref: usize): void {}\n\nexport function allocateUnsafe(length: i32): String {\n assert(length > 0 && length <= MAX_LENGTH);\n var buffer: usize;\n if (isManaged()) {\n buffer = __gc_allocate(HEADER_SIZE + (length << 1), __gc); // tslint:disable-line\n } else {\n buffer = memory.allocate(HEADER_SIZE + (length << 1));\n }\n store(buffer, length);\n return changetype(buffer);\n}\n\n@inline\nexport function freeUnsafe(buffer: String): void {\n if (!isManaged()) {\n assert(buffer);\n memory.free(changetype(buffer));\n }\n}\n\nexport function copyUnsafe(dest: String, destOffset: usize, src: String, srcOffset: usize, len: usize): void {\n memory.copy(\n changetype(dest) + (destOffset << 1) + HEADER_SIZE,\n changetype(src) + (srcOffset << 1) + HEADER_SIZE,\n len << 1\n );\n}\n\nexport function compareUnsafe(str1: String, offset1: usize, str2: String, offset2: usize, len: usize): i32 {\n var cmp: i32 = 0;\n var ptr1 = changetype(str1) + (offset1 << 1);\n var ptr2 = changetype(str2) + (offset2 << 1);\n while (len && !(cmp = load(ptr1, HEADER_SIZE) - load(ptr2, HEADER_SIZE))) {\n --len, ptr1 += 2, ptr2 += 2;\n }\n return cmp;\n}\n\nexport function repeatUnsafe(dest: String, destOffset: usize, src: String, count: i32): void {\n var length = src.length;\n if (ASC_SHRINK_LEVEL > 1) {\n let strLen = length << 1;\n let to = changetype(dest) + HEADER_SIZE + (destOffset << 1);\n let from = changetype(src) + HEADER_SIZE;\n for (let i = 0, len = strLen * count; i < len; i += strLen) {\n memory.copy(to + i, from, strLen);\n }\n } else {\n switch (length) {\n case 0: break;\n case 1: {\n let cc = load(changetype(src), HEADER_SIZE);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 1), cc, HEADER_SIZE);\n }\n break;\n }\n case 2: {\n let cc = load(changetype(src), HEADER_SIZE);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 2), cc, HEADER_SIZE);\n }\n break;\n }\n case 3: {\n let cc1 = load(changetype(src), HEADER_SIZE + 0);\n let cc2 = load(changetype(src), HEADER_SIZE + 4);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 2), cc1, HEADER_SIZE + 0);\n store(out + (i << 1), cc2, HEADER_SIZE + 4);\n }\n break;\n }\n case 4: {\n let cc = load(changetype(src), HEADER_SIZE);\n let out = changetype(dest) + (destOffset << 1);\n for (let i = 0; i < count; ++i) {\n store(out + (i << 3), cc, HEADER_SIZE);\n }\n break;\n }\n default: {\n let strLen = length << 1;\n let to = changetype(dest) + HEADER_SIZE + (destOffset << 1);\n let from = changetype(src) + HEADER_SIZE;\n for (let i = 0, len = strLen * count; i < len; i += strLen) {\n memory.copy(to + i, from, strLen);\n }\n break;\n }\n }\n }\n}\n\n// Helpers\n\n@inline export const enum CharCode {\n PLUS = 0x2B,\n MINUS = 0x2D,\n DOT = 0x2E,\n _0 = 0x30,\n _1 = 0x31,\n _2 = 0x32,\n _3 = 0x33,\n _4 = 0x34,\n _5 = 0x35,\n _6 = 0x36,\n _7 = 0x37,\n _8 = 0x38,\n _9 = 0x39,\n A = 0x41,\n B = 0x42,\n E = 0x45,\n N = 0x4E,\n O = 0x4F,\n X = 0x58,\n Z = 0x5a,\n a = 0x61,\n b = 0x62,\n e = 0x65,\n n = 0x6E,\n o = 0x6F,\n x = 0x78,\n z = 0x7A\n}\n\nexport function isWhiteSpaceOrLineTerminator(c: u16): bool {\n switch (c) {\n case 9: // \n case 10: // \n case 13: // \n case 11: // \n case 12: // \n case 32: // \n case 160: // \n case 8232: // \n case 8233: // \n case 65279: return true; // \n default: return false;\n }\n}\n\n/** Parses a string to an integer (usually), using the specified radix. */\nexport function parse(str: String, radix: i32 = 0): T {\n var len: i32 = str.length;\n if (!len) return NaN;\n\n var ptr = changetype(str) /* + HEAD -> offset */;\n var code = load(ptr, HEADER_SIZE);\n\n // determine sign\n var sign: T;\n if (code == CharCode.MINUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = 1;\n } else {\n sign = 1;\n }\n\n // determine radix\n if (!radix) {\n if (code == CharCode._0 && len > 2) {\n switch (load(ptr + 2, HEADER_SIZE)) {\n case CharCode.B:\n case CharCode.b: {\n ptr += 4; len -= 2;\n radix = 2;\n break;\n }\n case CharCode.O:\n case CharCode.o: {\n ptr += 4; len -= 2;\n radix = 8;\n break;\n }\n case CharCode.X:\n case CharCode.x: {\n ptr += 4; len -= 2;\n radix = 16;\n break;\n }\n default: radix = 10;\n }\n } else radix = 10;\n } else if (radix < 2 || radix > 36) {\n return NaN;\n }\n\n // calculate value\n var num: T = 0;\n while (len--) {\n code = load(ptr, HEADER_SIZE);\n if (code >= CharCode._0 && code <= CharCode._9) {\n code -= CharCode._0;\n } else if (code >= CharCode.A && code <= CharCode.Z) {\n code -= CharCode.A - 10;\n } else if (code >= CharCode.a && code <= CharCode.z) {\n code -= CharCode.a - 10;\n } else break;\n if (code >= radix) break;\n num = (num * radix) + code;\n ptr += 2;\n }\n return sign * num;\n}\n',"internal/typedarray":'import {\n HEADER_SIZE as AB_HEADER_SIZE,\n MAX_BLENGTH as AB_MAX_BLENGTH,\n allocateUnsafe,\n LOAD,\n STORE\n} from "./arraybuffer";\n\nimport {\n SORT as SORT_IMPL\n} from "./sort";\n\n/** Typed array base class. Not a global object. */\nexport abstract class TypedArray {\n [key: number]: T; // compatibility only\n\n readonly buffer: ArrayBuffer;\n readonly byteOffset: i32;\n readonly byteLength: i32;\n\n constructor(length: i32) {\n const MAX_LENGTH = AB_MAX_BLENGTH / sizeof();\n if (length > MAX_LENGTH) throw new RangeError("Invalid typed array length");\n var byteLength = length << alignof();\n var buffer = allocateUnsafe(byteLength);\n memory.fill(changetype(buffer) + AB_HEADER_SIZE, 0, byteLength);\n this.buffer = buffer;\n this.byteOffset = 0;\n this.byteLength = byteLength;\n }\n\n @inline\n get length(): i32 {\n return this.byteLength >>> alignof();\n }\n\n @operator("[]")\n protected __get(index: i32): T {\n if (index >= (this.byteLength >>> alignof())) throw new Error("Index out of bounds");\n return LOAD(this.buffer, index, this.byteOffset);\n }\n\n @inline @operator("{}")\n protected __unchecked_get(index: i32): T {\n return LOAD(this.buffer, index, this.byteOffset);\n }\n\n @operator("[]=")\n protected __set(index: i32, value: native): void {\n if (index >= (this.byteLength >>> alignof())) throw new Error("Index out of bounds");\n STORE>(this.buffer, index, value, this.byteOffset);\n }\n\n @inline @operator("{}=")\n protected __unchecked_set(index: i32, value: native): void {\n STORE>(this.buffer, index, value, this.byteOffset);\n }\n\n // copyWithin(target: i32, start: i32, end: i32 = this.length): this\n}\n\n@inline\nexport function FILL, T extends number>(\n array: TArray,\n value: native,\n start: i32,\n end: i32\n): TArray {\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n var len = array.length;\n start = start < 0 ? max(len + start, 0) : min(start, len);\n end = end < 0 ? max(len + end, 0) : min(end, len);\n if (sizeof() == 1) {\n if (start < end) {\n memory.fill(\n changetype(buffer) + start + byteOffset + AB_HEADER_SIZE,\n value,\n (end - start)\n );\n }\n } else {\n for (; start < end; ++start) {\n STORE>(buffer, start, value, byteOffset);\n }\n }\n return array;\n}\n\n@inline\nexport function SORT, T>(\n array: TArray,\n comparator: (a: T, b: T) => i32\n): TArray {\n var byteOffset = array.byteOffset;\n var length = array.length;\n if (length <= 1) return array;\n var buffer = array.buffer;\n if (length == 2) {\n let a = LOAD(buffer, 1, byteOffset);\n let b = LOAD(buffer, 0, byteOffset);\n if (comparator(a, b) < 0) {\n STORE(buffer, 1, b, byteOffset);\n STORE(buffer, 0, a, byteOffset);\n }\n return array;\n }\n SORT_IMPL(buffer, byteOffset, length, comparator);\n return array;\n}\n\n@inline\nexport function SUBARRAY, T>(\n array: TArray,\n begin: i32,\n end: i32\n): TArray {\n var length = array.length;\n if (begin < 0) begin = max(length + begin, 0);\n else begin = min(begin, length);\n if (end < 0) end = max(length + end, begin);\n else end = max(min(end, length), begin);\n var slice = memory.allocate(offsetof());\n store(slice, array.buffer, offsetof("buffer"));\n store(slice, array.byteOffset + (begin << alignof()), offsetof("byteOffset"));\n store(slice, (end - begin) << alignof(), offsetof("byteLength"));\n return changetype(slice);\n}\n\n@inline\nexport function REDUCE, T, TRet>(\n array: TArray,\n callbackfn: (accumulator: TRet, value: T, index: i32, array: TArray) => TRet,\n initialValue: TRet\n): TRet {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n initialValue = callbackfn(\n initialValue,\n LOAD(buffer, i, byteOffset),\n i,\n array,\n );\n }\n return initialValue;\n}\n\n@inline\nexport function REDUCE_RIGHT, T, TRet>(\n array: TArray,\n callbackfn: (accumulator: TRet, value: T, index: i32, array: TArray) => TRet,\n initialValue: TRet\n): TRet {\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = array.length - 1; i >= 0; i--) {\n initialValue = callbackfn(\n initialValue,\n LOAD(buffer, i, byteOffset),\n i,\n array,\n );\n }\n return initialValue;\n}\n\n@inline\nexport function MAP, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, self: TArray) => T,\n): TArray {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n var result = instantiate(length);\n var resultBuffer = result.buffer;\n for (let i = 0; i < length; i++) {\n STORE>(resultBuffer, i, >callbackfn(LOAD(buffer, i, byteOffset), i, array));\n }\n\n return result;\n}\n\n@inline\nexport function FIND_INDEX, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, array: TArray) => bool,\n): i32 {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n if (callbackfn(LOAD(buffer, i, byteOffset), i, array)) {\n return i;\n }\n }\n return -1;\n}\n\n@inline\nexport function SOME, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, array: TArray) => bool,\n): bool {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n if (callbackfn(LOAD(buffer, i, byteOffset), i, array)) {\n return true;\n }\n }\n return false;\n}\n\n@inline\nexport function EVERY, T>(\n array: TArray,\n callbackfn: (value: T, index: i32, array: TArray) => bool,\n): bool {\n var length = array.length;\n var buffer = array.buffer;\n var byteOffset = array.byteOffset;\n for (let i = 0; i < length; i++) {\n if (callbackfn(LOAD(buffer, i, byteOffset), i, array)) {\n continue;\n }\n return false;\n }\n return true;\n}\n',iterator:"export abstract class Iterable {\n // ?\n}\n\n@sealed\nexport abstract class Iterator {\n\n // private constructor(iterable: Iterable) {\n // }\n\n // TODO: these need to evaluate the classId at the respective reference in order to obtain the\n // next value, i.e. arrays work differently than maps. we'd then have:\n //\n // ╒═══════════════════ Iterator layout (32-bit) ══════════════════╕\n // 3 2 1\n // 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 bits\n // ├─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┤\n // │ index │\n // ├─────────────────────────────────────────────────────────┬───┬─┤\n // │ reference │ 0 │D│\n // └─────────────────────────────────────────────────────────┴───┴─┘\n // D: Done flag\n\n // get value(this: u64): T {\n // ?\n // }\n\n // next(this: u64): Iterator {\n // ?\n // }\n\n done(this: u64): bool {\n return (this & 1);\n }\n}\n",map:'import {\n HEADER_SIZE as HEADER_SIZE_AB\n} from "./internal/arraybuffer";\n\nimport {\n HASH\n} from "./internal/hash";\n\n// A deterministic hash map based on CloseTable from https://github.com/jorendorff/dht\n\n@inline const INITIAL_CAPACITY = 4;\n@inline const FILL_FACTOR: f64 = 8 / 3;\n@inline const FREE_FACTOR: f64 = 3 / 4;\n\n/** Structure of a map entry. */\n@unmanaged class MapEntry {\n key: K;\n value: V;\n taggedNext: usize; // LSB=1 indicates EMPTY\n}\n\n/** Empty bit. */\n@inline const EMPTY: usize = 1 << 0;\n\n/** Size of a bucket. */\n@inline const BUCKET_SIZE = sizeof();\n\n/** Computes the alignment of an entry. */\n@inline function ENTRY_ALIGN(): usize {\n // can align to 4 instead of 8 if 32-bit and K/V is <= 32-bits\n const maxkv = sizeof() > sizeof() ? sizeof() : sizeof();\n const align = (maxkv > sizeof() ? maxkv : sizeof()) - 1;\n return align;\n}\n\n/** Computes the aligned size of an entry. */\n@inline function ENTRY_SIZE(): usize {\n const align = ENTRY_ALIGN();\n const size = (offsetof>() + align) & ~align;\n return size;\n}\n\nexport class Map {\n\n // buckets holding references to the respective first entry within\n private buckets: ArrayBuffer; // usize[bucketsMask + 1]\n private bucketsMask: u32;\n\n // entries in insertion order\n private entries: ArrayBuffer; // MapEntry[entriesCapacity]\n private entriesCapacity: i32;\n private entriesOffset: i32;\n private entriesCount: i32;\n\n get size(): i32 { return this.entriesCount; }\n\n constructor() { this.clear(); }\n\n clear(): void {\n const bucketsSize = INITIAL_CAPACITY * BUCKET_SIZE;\n this.buckets = new ArrayBuffer(bucketsSize);\n this.bucketsMask = INITIAL_CAPACITY - 1;\n const entriesSize = INITIAL_CAPACITY * ENTRY_SIZE();\n this.entries = new ArrayBuffer(entriesSize, true);\n this.entriesCapacity = INITIAL_CAPACITY;\n this.entriesOffset = 0;\n this.entriesCount = 0;\n }\n\n private find(key: K, hashCode: u32): MapEntry | null {\n var entry = load>(\n changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE,\n HEADER_SIZE_AB\n );\n while (entry) {\n if (!(entry.taggedNext & EMPTY) && entry.key == key) return entry;\n entry = changetype>(entry.taggedNext & ~EMPTY);\n }\n return null;\n }\n\n has(key: K): bool {\n return this.find(key, HASH(key)) !== null;\n }\n\n get(key: K): V {\n var entry = this.find(key, HASH(key));\n return entry ? entry.value : unreachable();\n }\n\n set(key: K, value: V): void {\n var hashCode = HASH(key);\n var entry = this.find(key, hashCode);\n if (entry) {\n entry.value = value;\n } else {\n // check if rehashing is necessary\n if (this.entriesOffset == this.entriesCapacity) {\n this.rehash(\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ? this.bucketsMask // just rehash if 1/4+ entries are empty\n : (this.bucketsMask << 1) | 1 // grow capacity to next 2^N\n );\n }\n // append new entry\n let entries = this.entries;\n entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + this.entriesOffset++ * ENTRY_SIZE()\n );\n entry.key = key;\n entry.value = value;\n ++this.entriesCount;\n // link with previous entry in bucket\n let bucketPtrBase = changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE;\n entry.taggedNext = load(bucketPtrBase, HEADER_SIZE_AB);\n store(bucketPtrBase, changetype(entry), HEADER_SIZE_AB);\n if (isManaged()) __gc_link(changetype(this), changetype(key)); // tslint:disable-line\n if (isManaged()) __gc_link(changetype(this), changetype(value)); // tslint:disable-line\n }\n }\n\n delete(key: K): bool {\n var entry = this.find(key, HASH(key));\n if (!entry) return false;\n entry.taggedNext |= EMPTY;\n --this.entriesCount;\n // check if rehashing is appropriate\n var halfBucketsMask = this.bucketsMask >> 1;\n if (\n halfBucketsMask + 1 >= max(INITIAL_CAPACITY, this.entriesCount) &&\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ) this.rehash(halfBucketsMask);\n return true;\n }\n\n private rehash(newBucketsMask: u32): void {\n var newBucketsCapacity = (newBucketsMask + 1);\n var newBuckets = new ArrayBuffer(newBucketsCapacity * BUCKET_SIZE);\n var newEntriesCapacity = (newBucketsCapacity * FILL_FACTOR);\n var newEntries = new ArrayBuffer(newEntriesCapacity * ENTRY_SIZE(), true);\n\n // copy old entries to new entries\n var oldPtr = changetype(this.entries) + HEADER_SIZE_AB;\n var oldEnd = oldPtr + this.entriesOffset * ENTRY_SIZE();\n var newPtr = changetype(newEntries) + HEADER_SIZE_AB;\n while (oldPtr != oldEnd) {\n let oldEntry = changetype>(oldPtr);\n if (!(oldEntry.taggedNext & EMPTY)) {\n let newEntry = changetype>(newPtr);\n newEntry.key = oldEntry.key;\n newEntry.value = oldEntry.value;\n let newBucketIndex = HASH(oldEntry.key) & newBucketsMask;\n let newBucketPtrBase = changetype(newBuckets) + newBucketIndex * BUCKET_SIZE;\n newEntry.taggedNext = load(newBucketPtrBase, HEADER_SIZE_AB);\n store(newBucketPtrBase, newPtr, HEADER_SIZE_AB);\n newPtr += ENTRY_SIZE();\n }\n oldPtr += ENTRY_SIZE();\n }\n\n this.buckets = newBuckets;\n this.bucketsMask = newBucketsMask;\n this.entries = newEntries;\n this.entriesCapacity = newEntriesCapacity;\n this.entriesOffset = this.entriesCount;\n }\n\n toString(): string {\n return "[object Map]";\n }\n\n private __gc(): void {\n __gc_mark(changetype(this.buckets)); // tslint:disable-line\n var entries = this.entries;\n __gc_mark(changetype(entries)); // tslint:disable-line\n if (isManaged() || isManaged()) {\n let offset: usize = 0;\n let end: usize = this.entriesOffset * ENTRY_SIZE();\n while (offset < end) {\n let entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + offset * ENTRY_SIZE()\n );\n if (!(entry.taggedNext & EMPTY)) {\n if (isManaged()) __gc_mark(changetype(entry.key)); // tslint:disable-line\n if (isManaged()) __gc_mark(changetype(entry.value)); // tslint:disable-line\n }\n offset += ENTRY_SIZE();\n }\n }\n }\n}\n',math:'import * as JSMath from "./bindings/Math";\nexport { JSMath };\n\nimport {\n abs as builtin_abs,\n ceil as builtin_ceil,\n clz as builtin_clz,\n copysign as builtin_copysign,\n floor as builtin_floor,\n max as builtin_max,\n min as builtin_min,\n sqrt as builtin_sqrt,\n trunc as builtin_trunc\n} from "./builtins";\n\n// SUN COPYRIGHT NOTICE\n//\n// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\n// Developed at SunPro, a Sun Microsystems, Inc. business.\n// Permission to use, copy, modify, and distribute this software\n// is freely granted, provided that this notice is preserved.\n//\n// Applies to all functions marked with a comment referring here.\n\n// TODO: sin, cos, tan\n\nfunction R(z: f64): f64 { // Rational approximation of (asin(x)-x)/x^3\n const // see: musl/src/math/asin.c and SUN COPYRIGHT NOTICE above\n pS0 = reinterpret(0x3FC5555555555555), // 1.66666666666666657415e-01\n pS1 = reinterpret(0xBFD4D61203EB6F7D), // -3.25565818622400915405e-01\n pS2 = reinterpret(0x3FC9C1550E884455), // 2.01212532134862925881e-01\n pS3 = reinterpret(0xBFA48228B5688F3B), // -4.00555345006794114027e-02\n pS4 = reinterpret(0x3F49EFE07501B288), // 7.91534994289814532176e-04\n pS5 = reinterpret(0x3F023DE10DFDF709), // 3.47933107596021167570e-05\n qS1 = reinterpret(0xC0033A271C8A2D4B), // -2.40339491173441421878e+00\n qS2 = reinterpret(0x40002AE59C598AC8), // 2.02094576023350569471e+00\n qS3 = reinterpret(0xBFE6066C1B8D0159), // -6.88283971605453293030e-01\n qS4 = reinterpret(0x3FB3B8C5B12E9282); // 7.70381505559019352791e-02\n var p = z * (pS0 + z * (pS1 + z * (pS2 + z * (pS3 + z * (pS4 + z * pS5)))));\n var q = 1.0 + z * (qS1 + z * (qS2 + z * (qS3 + z * qS4)));\n return p / q;\n}\n\n@inline function expo2(x: f64): f64 { // exp(x)/2 for x >= log(DBL_MAX)\n const // see: musl/src/math/__expo2.c\n k = 2043,\n kln2 = reinterpret(0x40962066151ADD8B); // 0x1.62066151add8bp+10\n var scale = reinterpret(((0x3FF + k / 2) << 20) << 32);\n return NativeMath.exp(x - kln2) * scale * scale;\n}\n\n@lazy var random_seeded = false;\n@lazy var random_state0_64: u64;\n@lazy var random_state1_64: u64;\n@lazy var random_state0_32: u32;\n@lazy var random_state1_32: u32;\n\nfunction murmurHash3(h: u64): u64 { // Force all bits of a hash block to avalanche\n h ^= h >> 33; // see: https://github.com/aappleby/smhasher\n h *= 0xFF51AFD7ED558CCD;\n h ^= h >> 33;\n h *= 0xC4CEB9FE1A85EC53;\n h ^= h >> 33;\n return h;\n}\n\nfunction splitMix32(h: u32): u32 {\n h += 0x6D2B79F5;\n h = (h ^ (h >> 15)) * (h | 1);\n h ^= h + (h ^ (h >> 7)) * (h | 61);\n return h ^ (h >> 14);\n}\n\nexport namespace NativeMath {\n\n @lazy export const E = reinterpret(0x4005BF0A8B145769); // 2.7182818284590452354\n @lazy export const LN2 = reinterpret(0x3FE62E42FEFA39EF); // 0.69314718055994530942\n @lazy export const LN10 = reinterpret(0x40026BB1BBB55516); // 2.30258509299404568402\n @lazy export const LOG2E = reinterpret(0x3FF71547652B82FE); // 1.4426950408889634074\n @lazy export const LOG10E = reinterpret(0x3FDBCB7B1526E50E); // 0.43429448190325182765\n @lazy export const PI = reinterpret(0x400921FB54442D18); // 3.14159265358979323846\n @lazy export const SQRT1_2 = reinterpret(0x3FE6A09E667F3BCD); // 0.70710678118654752440\n @lazy export const SQRT2 = reinterpret(0x3FF6A09E667F3BCD); // 1.41421356237309504880\n\n @inline\n export function abs(x: f64): f64 {\n return builtin_abs(x);\n }\n\n export function acos(x: f64): f64 { // see: musl/src/math/acos.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n pio2_lo = reinterpret(0x3C91A62633145C07), // 6.12323399573676603587e-17\n Ox1p_120f = reinterpret(0x03800000);\n var hx = (reinterpret(x) >> 32);\n var ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3FF00000) {\n let lx = reinterpret(x);\n if ((ix - 0x3FF00000 | lx) == 0) {\n if (hx >> 31) return 2 * pio2_hi + Ox1p_120f;\n return 0;\n }\n return 0 / (x - x);\n }\n if (ix < 0x3FE00000) {\n if (ix <= 0x3C600000) return pio2_hi + Ox1p_120f;\n return pio2_hi - (x - (pio2_lo - x * R(x * x)));\n }\n var s: f64, w: f64, z: f64;\n if (hx >> 31) {\n // z = (1.0 + x) * 0.5;\n z = 0.5 + x * 0.5;\n s = builtin_sqrt(z);\n w = R(z) * s - pio2_lo;\n return 2 * (pio2_hi - (s + w));\n }\n // z = (1.0 - x) * 0.5;\n z = 0.5 - x * 0.5;\n s = builtin_sqrt(z);\n var df = reinterpret(reinterpret(s) & 0xFFFFFFFF00000000);\n var c = (z - df * df) / (s + df);\n w = R(z) * s + c;\n return 2 * (df + w);\n }\n\n export function acosh(x: f64): f64 { // see: musl/src/math/acosh.c\n const s = reinterpret(0x3FE62E42FEFA39EF);\n var e = reinterpret(x) >> 52 & 0x7FF;\n if (e < 0x3FF + 1) return log1p(x - 1 + builtin_sqrt((x - 1) * (x - 1) + 2 * (x - 1)));\n if (e < 0x3FF + 26) return log(2 * x - 1 / (x + builtin_sqrt(x * x - 1)));\n return log(x) + s;\n }\n\n export function asin(x: f64): f64 { // see: musl/src/math/asin.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n pio2_lo = reinterpret(0x3C91A62633145C07), // 6.12323399573676603587e-17\n Ox1p_120f = reinterpret(0x03800000);\n var hx = (reinterpret(x) >> 32);\n var ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3FF00000) {\n let lx = reinterpret(x);\n if ((ix - 0x3FF00000 | lx) == 0) return x * pio2_hi + Ox1p_120f;\n return 0 / (x - x);\n }\n if (ix < 0x3FE00000) {\n if (ix < 0x3E500000 && ix >= 0x00100000) return x;\n return x + x * R(x * x);\n }\n // var z = (1.0 - builtin_abs(x)) * 0.5;\n var z = 0.5 - builtin_abs(x) * 0.5;\n var s = builtin_sqrt(z);\n var r = R(z);\n if (ix >= 0x3FEF3333) x = pio2_hi - (2 * (s + s * r) - pio2_lo);\n else {\n let f = reinterpret(reinterpret(s) & 0xFFFFFFFF00000000);\n let c = (z - f * f) / (s + f);\n x = 0.5 * pio2_hi - (2 * s * r - (pio2_lo - 2 * c) - (0.5 * pio2_hi - 2 * f));\n }\n if (hx >> 31) return -x;\n return x;\n }\n\n export function asinh(x: f64): f64 { // see: musl/src/math/asinh.c\n const c = reinterpret(0x3FE62E42FEFA39EF); // 0.693147180559945309417232121458176568\n var u = reinterpret(x);\n var e = u >> 52 & 0x7FF;\n var y = reinterpret(u & 0x7FFFFFFFFFFFFFFF);\n if (e >= 0x3FF + 26) y = log(y) + c;\n else if (e >= 0x3FF + 1) y = log(2 * y + 1 / (builtin_sqrt(y * y + 1) + y));\n else if (e >= 0x3FF - 26) y = log1p(y + y * y / (builtin_sqrt(y * y + 1) + 1));\n return builtin_copysign(y, x);\n }\n\n export function atan(x: f64): f64 { // see musl/src/math/atan.c and SUN COPYRIGHT NOTICE above\n const\n atanhi0 = reinterpret(0x3FDDAC670561BB4F), // 4.63647609000806093515e-01\n atanhi1 = reinterpret(0x3FE921FB54442D18), // 7.85398163397448278999e-01\n atanhi2 = reinterpret(0x3FEF730BD281F69B), // 9.82793723247329054082e-01\n atanhi3 = reinterpret(0x3FF921FB54442D18), // 1.57079632679489655800e+00\n atanlo0 = reinterpret(0x3C7A2B7F222F65E2), // 2.26987774529616870924e-17\n atanlo1 = reinterpret(0x3C81A62633145C07), // 3.06161699786838301793e-17\n atanlo2 = reinterpret(0x3C7007887AF0CBBD), // 1.39033110312309984516e-17\n atanlo3 = reinterpret(0x3C91A62633145C07), // 6.12323399573676603587e-17\n aT0 = reinterpret(0x3FD555555555550D), // 3.33333333333329318027e-01\n aT1 = reinterpret(0xBFC999999998EBC4), // -1.99999999998764832476e-01\n aT2 = reinterpret(0x3FC24924920083FF), // 1.42857142725034663711e-01\n aT3 = reinterpret(0xBFBC71C6FE231671), // -1.11111104054623557880e-01,\n aT4 = reinterpret(0x3FB745CDC54C206E), // 9.09088713343650656196e-02\n aT5 = reinterpret(0xBFB3B0F2AF749A6D), // -7.69187620504482999495e-02\n aT6 = reinterpret(0x3FB10D66A0D03D51), // 6.66107313738753120669e-02\n aT7 = reinterpret(0xBFADDE2D52DEFD9A), // -5.83357013379057348645e-02\n aT8 = reinterpret(0x3FA97B4B24760DEB), // 4.97687799461593236017e-02\n aT9 = reinterpret(0xBFA2B4442C6A6C2F), // -3.65315727442169155270e-02\n aT10 = reinterpret(0x3F90AD3AE322DA11), // 1.62858201153657823623e-02\n Ox1p_120f = reinterpret(0x03800000);\n var ix = (reinterpret(x) >> 32);\n var sx = x;\n ix &= 0x7FFFFFFF;\n var z: f64;\n if (ix >= 0x44100000) {\n if (isNaN(x)) return x;\n z = atanhi3 + Ox1p_120f;\n return builtin_copysign(z, sx);\n }\n var id: i32;\n if (ix < 0x3FDC0000) {\n if (ix < 0x3E400000) return x;\n id = -1;\n } else {\n x = builtin_abs(x);\n if (ix < 0x3FF30000) {\n if (ix < 0x3FE60000) {\n id = 0;\n x = (2.0 * x - 1.0) / (2.0 + x);\n } else {\n id = 1;\n x = (x - 1.0) / (x + 1.0);\n }\n } else {\n if (ix < 0x40038000) {\n id = 2;\n x = (x - 1.5) / (1.0 + 1.5 * x);\n } else {\n id = 3;\n x = -1.0 / x;\n }\n }\n }\n z = x * x;\n var w = z * z;\n var s1 = z * (aT0 + w * (aT2 + w * (aT4 + w * (aT6 + w * (aT8 + w * aT10)))));\n var s2 = w * (aT1 + w * (aT3 + w * (aT5 + w * (aT7 + w * aT9))));\n var s3 = x * (s1 + s2);\n if (id < 0) return x - s3;\n switch (id) {\n case 0: { z = atanhi0 - ((s3 - atanlo0) - x); break; }\n case 1: { z = atanhi1 - ((s3 - atanlo1) - x); break; }\n case 2: { z = atanhi2 - ((s3 - atanlo2) - x); break; }\n case 3: { z = atanhi3 - ((s3 - atanlo3) - x); break; }\n default: unreachable();\n }\n return builtin_copysign(z, sx);\n }\n\n export function atanh(x: f64): f64 { // see: musl/src/math/atanh.c\n var u = reinterpret(x);\n var e = u >> 52 & 0x7FF;\n var s = u >> 63;\n u &= 0x7FFFFFFFFFFFFFFF;\n var y = reinterpret(u);\n if (e < 0x3FF - 1) {\n if (e >= 0x3FF - 32) y = 0.5 * log1p(2 * y + 2 * y * y / (1 - y));\n } else {\n y = 0.5 * log1p(2 * (y / (1 - y)));\n }\n return builtin_copysign(y, x);\n }\n\n export function atan2(y: f64, x: f64): f64 { // see: musl/src/math/atan2.c and SUN COPYRIGHT NOTICE above\n const pi_lo = reinterpret(0x3CA1A62633145C07); // 1.2246467991473531772E-16\n if (isNaN(x) || isNaN(y)) return x + y;\n var u = reinterpret(x);\n var ix = (u >> 32);\n var lx = u;\n u = reinterpret(y);\n var iy = (u >> 32);\n var ly = u;\n if ((ix - 0x3FF00000 | lx) == 0) return atan(y);\n var m = ((iy >> 31) & 1) | ((ix >> 30) & 2);\n ix = ix & 0x7FFFFFFF;\n iy = iy & 0x7FFFFFFF;\n if ((iy | ly) == 0) {\n switch (m) {\n case 0:\n case 1: return y;\n case 2: return PI;\n case 3: return -PI;\n }\n }\n if ((ix | lx) == 0) return m & 1 ? -PI / 2 : PI / 2;\n if (ix == 0x7FF00000) {\n if (iy == 0x7FF00000) {\n switch (m) {\n case 0: return PI / 4;\n case 1: return -PI / 4;\n case 2: return 3 * PI / 4;\n case 3: return -3 * PI / 4;\n }\n } else {\n switch (m) {\n case 0: return 0.0;\n case 1: return -0.0;\n case 2: return PI;\n case 3: return -PI;\n }\n }\n }\n var z: f64;\n if (ix + (64 << 20) < iy || iy == 0x7FF00000) return m & 1 ? -PI / 2 : PI / 2;\n if ((m & 2) && iy + (64 << 20) < ix) z = 0;\n else z = atan(builtin_abs(y / x));\n switch (m) {\n case 0: return z;\n case 1: return -z;\n case 2: return PI - (z - pi_lo);\n case 3: return (z - pi_lo) - PI;\n }\n unreachable();\n return 0;\n }\n\n export function cbrt(x: f64): f64 { // see: musl/src/math/cbrt.c and SUN COPYRIGHT NOTICE above\n const\n B1 = 715094163,\n B2 = 696219795,\n P0 = reinterpret(0x3FFE03E60F61E692), // 1.87595182427177009643\n P1 = reinterpret(0xBFFE28E092F02420), // -1.88497979543377169875\n P2 = reinterpret(0x3FF9F1604A49D6C2), // 1.621429720105354466140\n P3 = reinterpret(0xBFE844CBBEE751D9), // -0.758397934778766047437\n P4 = reinterpret(0x3FC2B000D4E4EDD7), // 0.145996192886612446982\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32) & 0x7FFFFFFF;\n if (hx >= 0x7FF00000) return x + x;\n if (hx < 0x00100000) {\n u = reinterpret(x * Ox1p54);\n hx = (u >> 32) & 0x7FFFFFFF;\n if (hx == 0) return x;\n hx = hx / 3 + B2;\n } else {\n hx = hx / 3 + B1;\n }\n u &= 1 << 63;\n u |= hx << 32;\n var t = reinterpret(u);\n var r = (t * t) * (t / x);\n t = t * ((P0 + r * (P1 + r * P2)) + ((r * r) * r) * (P3 + r * P4));\n t = reinterpret((reinterpret(t) + 0x80000000) & 0xFFFFFFFFC0000000);\n var s = t * t;\n r = x / s;\n r = (r - t) / (2 * t + r);\n t = t + t * r;\n return t;\n }\n\n @inline\n export function ceil(x: f64): f64 {\n return builtin_ceil(x);\n }\n\n export function clz32(x: f64): f64 {\n if (!isFinite(x)) return 32;\n /*\n * Wasm (MVP) and JS have different approaches for double->int conversions.\n *\n * For emulate JS conversion behavior and avoid trapping from wasm we should modulate by MAX_INT\n * our float-point arguments before actual convertion to integers.\n */\n return builtin_clz(\n (x - 4294967296 * builtin_floor(x * (1.0 / 4294967296)))\n );\n }\n\n export function cos(x: f64): f64 { // TODO\n unreachable();\n return 0;\n }\n\n export function cosh(x: f64): f64 { // see: musl/src/math/cosh.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFFFFFFFFFF;\n x = reinterpret(u);\n var w = (u >> 32);\n var t: f64;\n if (w < 0x3FE62E42) {\n if (w < 0x3FF00000 - (26 << 20)) return 1;\n t = expm1(x);\n // return 1 + t * t / (2 * (1 + t));\n return 1 + t * t / (2 + 2 * t);\n }\n if (w < 0x40862E42) {\n t = exp(x);\n return 0.5 * (t + 1 / t);\n }\n t = expo2(x);\n return t;\n }\n\n export function exp(x: f64): f64 { // see: musl/src/math/exp.c and SUN COPYRIGHT NOTICE above\n const\n ln2hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n invln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n P1 = reinterpret(0x3FC555555555553E), // 1.66666666666666019037e-01\n P2 = reinterpret(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03\n P3 = reinterpret(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05\n P4 = reinterpret(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06\n P5 = reinterpret(0x3E66376972BEA4D0), // 4.13813679705723846039e-08\n overflow = reinterpret(0x40862E42FEFA39EF), // 709.782712893383973096\n underflow = reinterpret(0xC0874910D52D3051), // -745.13321910194110842\n Ox1p1023 = reinterpret(0x7FE0000000000000);\n var hx = (reinterpret(x) >> 32);\n var sign_ = (hx >> 31);\n hx &= 0x7FFFFFFF;\n if (hx >= 0x4086232B) {\n if (isNaN(x)) return x;\n if (x > overflow) return x * Ox1p1023;\n if (x < underflow) return 0;\n }\n var hi: f64, lo: f64 = 0;\n var k = 0;\n if (hx > 0x3FD62E42) {\n if (hx >= 0x3FF0A2B2) {\n k = (invln2 * x + builtin_copysign(0.5, x));\n } else {\n k = 1 - (sign_ << 1);\n }\n hi = x - k * ln2hi;\n lo = k * ln2lo;\n x = hi - lo;\n } else if (hx > 0x3E300000) {\n hi = x;\n } else return 1.0 + x;\n var xs = x * x;\n // var c = x - xp2 * (P1 + xp2 * (P2 + xp2 * (P3 + xp2 * (P4 + xp2 * P5))));\n var xq = xs * xs;\n var c = x - (xs * P1 + xq * ((P2 + xs * P3) + xq * (P4 + xs * P5)));\n var y = 1.0 + (x * c / (2 - c) - lo + hi);\n if (k == 0) return y;\n return scalbn(y, k);\n }\n\n export function expm1(x: f64): f64 { // see: musl/src/math/expm1.c and SUN COPYRIGHT NOTICE above\n const\n o_threshold = reinterpret(0x40862E42FEFA39EF), // 7.09782712893383973096e+02\n ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n invln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n Q1 = reinterpret(0xBFA11111111110F4), // -3.33333333333331316428e-02\n Q2 = reinterpret(0x3F5A01A019FE5585), // 1.58730158725481460165e-03\n Q3 = reinterpret(0xBF14CE199EAADBB7), // -7.93650757867487942473e-05\n Q4 = reinterpret(0x3ED0CFCA86E65239), // 4.00821782732936239552e-06\n Q5 = reinterpret(0xBE8AFDB76E09C32D), // -2.01099218183624371326e-07\n Ox1p1023 = reinterpret(0x7FE0000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32 & 0x7FFFFFFF);\n var k = 0, sign_ = (u >> 63);\n if (hx >= 0x4043687A) {\n if (isNaN(x)) return x;\n if (sign_) return -1;\n if (x > o_threshold) return x * Ox1p1023;\n }\n var c = 0.0, t: f64;\n if (hx > 0x3FD62E42) {\n k = select(\n 1 - (sign_ << 1),\n (invln2 * x + builtin_copysign(0.5, x)),\n hx < 0x3FF0A2B2\n );\n t = k;\n let hi = x - t * ln2_hi;\n let lo = t * ln2_lo;\n x = hi - lo;\n c = (hi - x) - lo;\n } else if (hx < 0x3C900000) return x;\n var hfx = 0.5 * x;\n var hxs = x * hfx;\n // var r1 = 1.0 + hxs * (Q1 + hxs * (Q2 + hxs * (Q3 + hxs * (Q4 + hxs * Q5))));\n var hxq = hxs * hxs;\n var r1 = (1.0 + hxs * Q1) + hxq * ((Q2 + hxs * Q3) + hxq * (Q4 + hxs * Q5));\n t = 3.0 - r1 * hfx;\n var e = hxs * ((r1 - t) / (6.0 - x * t));\n if (k == 0) return x - (x * e - hxs);\n e = x * (e - c) - c;\n e -= hxs;\n if (k == -1) return 0.5 * (x - e) - 0.5;\n if (k == 1) {\n if (x < -0.25) return -2.0 * (e - (x + 0.5));\n return 1.0 + 2.0 * (x - e);\n }\n u = (0x3FF + k) << 52;\n var twopk = reinterpret(u);\n var y: f64;\n if (k < 0 || k > 56) {\n y = x - e + 1.0;\n if (k == 1024) y = y * 2.0 * Ox1p1023;\n else y = y * twopk;\n return y - 1.0;\n }\n u = (0x3FF - k) << 52;\n y = reinterpret(u);\n if (k < 20) y = (1 - y) - e;\n else y = 1 - (e + y);\n return (x + y) * twopk;\n }\n\n @inline\n export function floor(x: f64): f64 {\n return builtin_floor(x);\n }\n\n @inline\n export function fround(x: f64): f32 {\n return x;\n }\n\n export function hypot(x: f64, y: f64): f64 { // see: musl/src/math/hypot.c\n const\n SPLIT = reinterpret(0x41A0000000000000) + 1, // 0x1p27 + 1\n Ox1p700 = reinterpret(0x6BB0000000000000),\n Ox1p_700 = reinterpret(0x1430000000000000);\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n ux &= 0x7FFFFFFFFFFFFFFF;\n uy &= 0x7FFFFFFFFFFFFFFF;\n if (ux < uy) {\n let ut = ux;\n ux = uy;\n uy = ut;\n }\n var ex = (ux >> 52);\n var ey = (uy >> 52);\n y = reinterpret(uy);\n if (ey == 0x7FF) return y;\n x = reinterpret(ux);\n if (ex == 0x7FF || uy == 0) return x;\n if (ex - ey > 64) return x + y;\n var z = 1.0;\n if (ex > 0x3FF + 510) {\n z = Ox1p700;\n x *= Ox1p_700;\n y *= Ox1p_700;\n } else if (ey < 0x3FF - 450) {\n z = Ox1p_700;\n x *= Ox1p700;\n y *= Ox1p700;\n }\n var c = x * SPLIT;\n var h = x - c + c;\n var l = x - h;\n var hx = x * x;\n var lx = h * h - hx + (2 * h + l) * l;\n c = y * SPLIT;\n h = y - c + c;\n l = y - h;\n var hy = y * y;\n var ly = h * h - hy + (2 * h + l) * l;\n return z * builtin_sqrt(ly + lx + hy + hx);\n }\n\n export function imul(x: f64, y: f64): f64 {\n /*\n * Wasm (MVP) and JS have different approaches for double->int conversions.\n *\n * For emulate JS conversion behavior and avoid trapping from wasm we should modulate by MAX_INT\n * our float-point arguments before actual convertion to integers.\n */\n if (!isFinite(x + y)) return 0;\n const inv32 = 1.0 / 4294967296;\n return (\n (x - 4294967296 * builtin_floor(x * inv32)) *\n (y - 4294967296 * builtin_floor(y * inv32))\n );\n }\n\n export function log(x: f64): f64 { // see: musl/src/math/log.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 0;\n if (hx < 0x00100000 || (hx >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (hx >> 31) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret(x);\n hx = (u >> 32);\n } else if (hx >= 0x7FF00000) return x;\n else if (hx == 0x3FF00000 && u << 32 == 0) return 0;\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret(u);\n var f = x - 1.0;\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var dk = k;\n return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi;\n }\n\n export function log10(x: f64): f64 { // see: musl/src/math/log10.c and SUN COPYRIGHT NOTICE above\n const\n ivln10hi = reinterpret(0x3FDBCB7B15200000), // 4.34294481878168880939e-01\n ivln10lo = reinterpret(0x3DBB9438CA9AADD5), // 2.50829467116452752298e-11\n log10_2hi = reinterpret(0x3FD34413509F6000), // 3.01029995663611771306e-01\n log10_2lo = reinterpret(0x3D59FEF311F12B36), // 3.69423907715893078616e-13\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 0;\n if (hx < 0x00100000 || (hx >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (hx >> 31) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret(x);\n hx = (u >> 32);\n } else if (hx >= 0x7FF00000) return x;\n else if (hx == 0x3FF00000 && u << 32 == 0) return 0;\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret(u);\n var f = x - 1.0;\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var hi = f - hfsq;\n u = reinterpret(hi);\n u &= 0xFFFFFFFF00000000;\n hi = reinterpret(u);\n var lo = f - hi - hfsq + s * (hfsq + r);\n var val_hi = hi * ivln10hi;\n var dk = k;\n var y = dk * log10_2hi;\n var val_lo = dk * log10_2lo + (lo + hi) * ivln10lo + lo * ivln10hi;\n w = y + val_hi;\n val_lo += (y - w) + val_hi;\n return val_lo + w;\n }\n\n export function log1p(x: f64): f64 { // see: musl/src/math/log1p.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3FE62E42FEE00000), // 6.93147180369123816490e-01\n ln2_lo = reinterpret(0x3DEA39EF35793C76), // 1.90821492927058770002e-10\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244); // 1.479819860511658591e-01\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 1;\n var c = 0.0, f = 0.0;\n if (hx < 0x3FDA827A || (hx >> 31)) {\n if (hx >= 0xBFF00000) {\n if (x == -1) return x / 0.0;\n return (x - x) / 0.0;\n }\n if (hx << 1 < 0x3CA00000 << 1) return x;\n if (hx <= 0xBFD2BEC4) {\n k = 0;\n c = 0;\n f = x;\n }\n } else if (hx >= 0x7FF00000) return x;\n if (k) {\n u = reinterpret(1 + x);\n let hu = (u >> 32);\n hu += 0x3FF00000 - 0x3FE6A09E;\n k = (hu >> 20) - 0x3FF;\n if (k < 54) {\n let uf = reinterpret(u);\n c = k >= 2 ? 1 - (uf - x) : x - (uf - 1);\n c /= uf;\n } else c = 0;\n hu = (hu & 0x000FFFFF) + 0x3FE6A09E;\n u = hu << 32 | (u & 0xFFFFFFFF);\n f = reinterpret(u) - 1;\n }\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var dk = k;\n return s * (hfsq + r) + (dk * ln2_lo + c) - hfsq + f + dk * ln2_hi;\n }\n\n export function log2(x: f64): f64 { // see: musl/src/math/log2.c and SUN COPYRIGHT NOTICE above\n const\n ivln2hi = reinterpret(0x3FF7154765200000), // 1.44269504072144627571e+00\n ivln2lo = reinterpret(0x3DE705FC2EEFA200), // 1.67517131648865118353e-10\n Lg1 = reinterpret(0x3FE5555555555593), // 6.666666666666735130e-01\n Lg2 = reinterpret(0x3FD999999997FA04), // 3.999999999940941908e-01\n Lg3 = reinterpret(0x3FD2492494229359), // 2.857142874366239149e-01\n Lg4 = reinterpret(0x3FCC71C51D8E78AF), // 2.222219843214978396e-01\n Lg5 = reinterpret(0x3FC7466496CB03DE), // 1.818357216161805012e-01\n Lg6 = reinterpret(0x3FC39A09D078C69F), // 1.531383769920937332e-01\n Lg7 = reinterpret(0x3FC2F112DF3E5244), // 1.479819860511658591e-01\n Ox1p54 = reinterpret(0x4350000000000000);\n var u = reinterpret(x);\n var hx = (u >> 32);\n var k = 0;\n if (hx < 0x00100000 || (hx >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (hx >> 31) return (x - x) / 0.0;\n k -= 54;\n x *= Ox1p54;\n u = reinterpret(x);\n hx = (u >> 32);\n } else if (hx >= 0x7FF00000) return x;\n else if (hx == 0x3FF00000 && u << 32 == 0) return 0;\n hx += 0x3FF00000 - 0x3FE6A09E;\n k += (hx >> 20) - 0x3FF;\n hx = (hx & 0x000FFFFF) + 0x3FE6A09E;\n u = hx << 32 | (u & 0xFFFFFFFF);\n x = reinterpret(u);\n var f = x - 1.0;\n var hfsq = 0.5 * f * f;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * (Lg4 + w * Lg6));\n var t2 = z * (Lg1 + w * (Lg3 + w * (Lg5 + w * Lg7)));\n var r = t2 + t1;\n var hi = f - hfsq;\n u = reinterpret(hi);\n u &= 0xFFFFFFFF00000000;\n hi = reinterpret(u);\n var lo = f - hi - hfsq + s * (hfsq + r);\n var val_hi = hi * ivln2hi;\n var val_lo = (lo + hi) * ivln2lo + lo * ivln2hi;\n var y = k;\n w = y + val_hi;\n val_lo += (y - w) + val_hi;\n val_hi = w;\n return val_lo + val_hi;\n }\n\n @inline\n export function max(value1: f64, value2: f64): f64 {\n return builtin_max(value1, value2);\n }\n\n @inline\n export function min(value1: f64, value2: f64): f64 {\n return builtin_min(value1, value2);\n }\n\n export function pow(x: f64, y: f64): f64 { // see: musl/src/math/pow.c and SUN COPYRIGHT NOTICE above\n const\n dp_h1 = reinterpret(0x3FE2B80340000000), // 5.84962487220764160156e-01\n dp_l1 = reinterpret(0x3E4CFDEB43CFD006), // 1.35003920212974897128e-08\n two53 = reinterpret(0x4340000000000000), // 9007199254740992.0\n huge = reinterpret(0x7E37E43C8800759C), // 1e+300\n tiny = reinterpret(0x01A56E1FC2F8F359), // 1e-300\n L1 = reinterpret(0x3FE3333333333303), // 5.99999999999994648725e-01\n L2 = reinterpret(0x3FDB6DB6DB6FABFF), // 4.28571428578550184252e-01\n L3 = reinterpret(0x3FD55555518F264D), // 3.33333329818377432918e-01\n L4 = reinterpret(0x3FD17460A91D4101), // 2.72728123808534006489e-01\n L5 = reinterpret(0x3FCD864A93C9DB65), // 2.30660745775561754067e-01\n L6 = reinterpret(0x3FCA7E284A454EEF), // 2.06975017800338417784e-01\n P1 = reinterpret(0x3FC555555555553E), // 1.66666666666666019037e-01\n P2 = reinterpret(0xBF66C16C16BEBD93), // -2.77777777770155933842e-03\n P3 = reinterpret(0x3F11566AAF25DE2C), // 6.61375632143793436117e-05\n P4 = reinterpret(0xBEBBBD41C5D26BF1), // -1.65339022054652515390e-06\n P5 = reinterpret(0x3E66376972BEA4D0), // 4.13813679705723846039e-08\n lg2 = reinterpret(0x3FE62E42FEFA39EF), // 6.93147180559945286227e-01\n lg2_h = reinterpret(0x3FE62E4300000000), // 6.93147182464599609375e-01\n lg2_l = reinterpret(0xBE205C610CA86C39), // -1.90465429995776804525e-09\n ovt = reinterpret(0x3C971547652B82FE), // 8.0085662595372944372e-017\n cp = reinterpret(0x3FEEC709DC3A03FD), // 9.61796693925975554329e-01\n cp_h = reinterpret(0x3FEEC709E0000000), // 9.61796700954437255859e-01\n cp_l = reinterpret(0xBE3E2FE0145B01F5), // -7.02846165095275826516e-09\n ivln2 = reinterpret(0x3FF71547652B82FE), // 1.44269504088896338700e+00\n ivln2_h = reinterpret(0x3FF7154760000000), // 1.44269502162933349609e+00\n ivln2_l = reinterpret(0x3E54AE0BF85DDF44), // 1.92596299112661746887e-08\n inv3 = reinterpret(0x3FD5555555555555); // 0.3333333333333333333333\n var u_ = reinterpret(x);\n var hx = (u_ >> 32);\n var lx = u_;\n u_ = reinterpret(y);\n var hy = (u_ >> 32);\n var ly = u_;\n var ix = hx & 0x7FFFFFFF;\n var iy = hy & 0x7FFFFFFF;\n if ((iy | ly) == 0) return 1.0; // x**0 = 1, even if x is NaN\n // if (hx == 0x3FF00000 && lx == 0) return 1.0; // C: 1**y = 1, even if y is NaN, JS: NaN\n if ( // NaN if either arg is NaN\n ix > 0x7FF00000 || (ix == 0x7FF00000 && lx != 0) ||\n iy > 0x7FF00000 || (iy == 0x7FF00000 && ly != 0)\n ) return x + y;\n var yisint = 0, k: i32;\n if (hx < 0) {\n if (iy >= 0x43400000) yisint = 2;\n else if (iy >= 0x3FF00000) {\n k = (iy >> 20) - 0x3FF;\n let kcond = k > 20;\n let offset = select(52, 20, kcond) - k;\n let Ly = select(ly, iy, kcond);\n let jj = Ly >> offset;\n if ((jj << offset) == Ly) yisint = 2 - (jj & 1);\n }\n }\n if (ly == 0) {\n if (iy == 0x7FF00000) { // y is +-inf\n if (((ix - 0x3FF00000) | lx) == 0) return NaN; // C: (-1)**+-inf is 1, JS: NaN\n else if (ix >= 0x3FF00000) return hy >= 0 ? y : 0.0; // (|x|>1)**+-inf = inf,0\n else return hy >= 0 ? 0.0 : -y; // (|x|<1)**+-inf = 0,inf\n }\n if (iy == 0x3FF00000) {\n if (hy >= 0) return x;\n return 1 / x;\n }\n if (hy == 0x40000000) return x * x;\n if (hy == 0x3FE00000) {\n if (hx >= 0) return builtin_sqrt(x);\n }\n }\n var ax = builtin_abs(x), z: f64;\n if (lx == 0) {\n if (ix == 0 || ix == 0x7FF00000 || ix == 0x3FF00000) {\n z = ax;\n if (hy < 0) z = 1.0 / z;\n if (hx < 0) {\n if (((ix - 0x3FF00000) | yisint) == 0) {\n let d = z - z;\n z = d / d;\n } else if (yisint == 1) z = -z;\n }\n return z;\n }\n }\n var s = 1.0;\n if (hx < 0) {\n if (yisint == 0) {\n let d = x - x;\n return d / d;\n }\n if (yisint == 1) s = -1.0;\n }\n var t1: f64, t2: f64, p_h: f64, p_l: f64, r: f64, t: f64, u: f64, v: f64, w: f64;\n var j: i32, n: i32;\n if (iy > 0x41E00000) {\n if (iy > 0x43F00000) {\n if (ix <= 0x3FEFFFFF) return hy < 0 ? huge * huge : tiny * tiny;\n if (ix >= 0x3FF00000) return hy > 0 ? huge * huge : tiny * tiny;\n }\n if (ix < 0x3FEFFFFF) return hy < 0 ? s * huge * huge : s * tiny * tiny;\n if (ix > 0x3FF00000) return hy > 0 ? s * huge * huge : s * tiny * tiny;\n t = ax - 1.0;\n w = (t * t) * (0.5 - t * (inv3 - t * 0.25));\n u = ivln2_h * t;\n v = t * ivln2_l - w * ivln2;\n t1 = u + v;\n t1 = reinterpret(reinterpret(t1) & 0xFFFFFFFF00000000);\n t2 = v - (t1 - u);\n } else {\n let ss: f64, s2: f64, s_h: f64, s_l: f64, t_h: f64, t_l: f64;\n n = 0;\n if (ix < 0x00100000) {\n ax *= two53;\n n -= 53;\n ix = (reinterpret(ax) >> 32);\n }\n n += (ix >> 20) - 0x3FF;\n j = ix & 0x000FFFFF;\n ix = j | 0x3FF00000;\n if (j <= 0x3988E) k = 0;\n else if (j < 0xBB67A) k = 1;\n else {\n k = 0;\n n += 1;\n ix -= 0x00100000;\n }\n ax = reinterpret(reinterpret(ax) & 0xFFFFFFFF | (ix << 32));\n let bp = select(1.5, 1.0, k); // k ? 1.5 : 1.0\n u = ax - bp;\n v = 1.0 / (ax + bp);\n ss = u * v;\n s_h = ss;\n s_h = reinterpret(reinterpret(s_h) & 0xFFFFFFFF00000000);\n t_h = reinterpret((((ix >> 1) | 0x20000000) + 0x00080000 + (k << 18)) << 32);\n t_l = ax - (t_h - bp);\n s_l = v * ((u - s_h * t_h) - s_h * t_l);\n s2 = ss * ss;\n r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6)))));\n r += s_l * (s_h + ss);\n s2 = s_h * s_h;\n t_h = 3.0 + s2 + r;\n t_h = reinterpret(reinterpret(t_h) & 0xFFFFFFFF00000000);\n t_l = r - ((t_h - 3.0) - s2);\n u = s_h * t_h;\n v = s_l * t_h + t_l * ss;\n p_h = u + v;\n p_h = reinterpret(reinterpret(p_h) & 0xFFFFFFFF00000000);\n p_l = v - (p_h - u);\n let z_h = cp_h * p_h;\n let dp_l = select(dp_l1, 0.0, k);\n let z_l = cp_l * p_h + p_l * cp + dp_l;\n t = n;\n let dp_h = select(dp_h1, 0.0, k);\n t1 = ((z_h + z_l) + dp_h) + t;\n t1 = reinterpret(reinterpret(t1) & 0xFFFFFFFF00000000);\n t2 = z_l - (((t1 - t) - dp_h) - z_h);\n }\n var y1 = y;\n y1 = reinterpret(reinterpret(y1) & 0xFFFFFFFF00000000);\n p_l = (y - y1) * t1 + y * t2;\n p_h = y1 * t1;\n z = p_l + p_h;\n u_ = reinterpret(z);\n j = (u_ >> 32);\n var i = u_;\n if (j >= 0x40900000) {\n if (((j - 0x40900000) | i) != 0) return s * huge * huge;\n if (p_l + ovt > z - p_h) return s * huge * huge;\n } else if ((j & 0x7FFFFFFF) >= 0x4090CC00) {\n if (((j - 0xC090CC00) | i) != 0) return s * tiny * tiny;\n if (p_l <= z - p_h) return s * tiny * tiny;\n }\n i = j & 0x7FFFFFFF;\n k = (i >> 20) - 0x3FF;\n n = 0;\n if (i > 0x3FE00000) {\n n = j + (0x00100000 >> (k + 1));\n k = ((n & 0x7FFFFFFF) >> 20) - 0x3FF;\n t = 0.0;\n t = reinterpret((n & ~(0x000FFFFF >> k)) << 32);\n n = ((n & 0x000FFFFF) | 0x00100000) >> (20 - k);\n if (j < 0) n = -n;\n p_h -= t;\n }\n t = p_l + p_h;\n t = reinterpret(reinterpret(t) & 0xFFFFFFFF00000000);\n u = t * lg2_h;\n v = (p_l - (t - p_h)) * lg2 + t * lg2_l;\n z = u + v;\n w = v - (z - u);\n t = z * z;\n t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));\n r = (z * t1) / (t1 - 2.0) - (w + z * w);\n z = 1.0 - (r - z);\n j = (reinterpret(z) >> 32);\n j += n << 20;\n if ((j >> 20) <= 0) z = scalbn(z, n);\n else z = reinterpret(reinterpret(z) & 0xFFFFFFFF | (j << 32));\n return s * z;\n }\n\n export function seedRandom(value: i64): void {\n assert(value);\n random_seeded = true;\n random_state0_64 = murmurHash3(value);\n random_state1_64 = murmurHash3(~random_state0_64);\n random_state0_32 = splitMix32(value);\n random_state1_32 = splitMix32(random_state0_32);\n }\n\n export function random(): f64 { // see: v8/src/base/random-number-generator.cc\n if (!random_seeded) throw new Error("PRNG must be seeded.");\n var s1 = random_state0_64;\n var s0 = random_state1_64;\n random_state0_64 = s0;\n s1 ^= s1 << 23;\n s1 ^= s1 >> 17;\n s1 ^= s0;\n s1 ^= s0 >> 26;\n random_state1_64 = s1;\n var r = ((s0 + s1) & 0x000FFFFFFFFFFFFF) | 0x3FF0000000000000;\n return reinterpret(r) - 1;\n }\n\n @inline\n export function round(x: f64): f64 {\n return builtin_copysign(builtin_floor(x + 0.5), x);\n }\n\n @inline\n export function sign(x: f64): f64 {\n if (ASC_SHRINK_LEVEL > 0) {\n return builtin_abs(x) > 0 ? builtin_copysign(1, x) : x;\n } else {\n return x > 0 ? 1 : x < 0 ? -1 : x;\n }\n }\n\n @inline\n export function signbit(x: f64): bool {\n // In ECMAScript all NaN values are indistinguishable from each other\n // so we need handle NaN and negative NaN in similar way\n return ((reinterpret(x) >>> 63) & (x == x));\n }\n\n export function sin(x: f64): f64 { // TODO\n unreachable();\n return 0;\n }\n\n export function sinh(x: f64): f64 { // see: musl/src/math/sinh.c\n var u = reinterpret(x) & 0x7FFFFFFFFFFFFFFF;\n var absx = reinterpret(u);\n var w = (u >> 32);\n var t: f64;\n var h = builtin_copysign(0.5, x);\n if (w < 0x40862E42) {\n t = expm1(absx);\n if (w < 0x3FF00000) {\n if (w < 0x3FF00000 - (26 << 20)) return x;\n return h * (2 * t - t * t / (t + 1));\n }\n return h * (t + t / (t + 1));\n }\n t = 2 * h * expo2(absx);\n return t;\n }\n\n @inline\n export function sqrt(x: f64): f64 {\n return builtin_sqrt(x);\n }\n\n export function tan(x: f64): f64 { // TODO\n unreachable();\n return 0;\n }\n\n export function tanh(x: f64): f64 { // see: musl/src/math/tanh.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFFFFFFFFFF;\n var y = reinterpret(u);\n var w = (u >> 32);\n var t: f64;\n if (w > 0x3FE193EA) {\n if (w > 0x40340000) {\n t = 1 - 0 / y;\n } else {\n t = expm1(2 * y);\n t = 1 - 2 / (t + 2);\n }\n } else if (w > 0x3FD058AE) {\n t = expm1(2 * y);\n t = t / (t + 2);\n } else if (w >= 0x00100000) {\n t = expm1(-2 * y);\n t = -t / (t + 2);\n } else t = y;\n return builtin_copysign(t, x);\n }\n\n @inline\n export function trunc(x: f64): f64 {\n return builtin_trunc(x);\n }\n\n export function scalbn(x: f64, n: i32): f64 { // see: https://git.musl-libc.org/cgit/musl/tree/src/math/scalbn.c\n const\n Ox1p53 = reinterpret(0x4340000000000000),\n Ox1p1023 = reinterpret(0x7FE0000000000000),\n Ox1p_1022 = reinterpret(0x0010000000000000);\n var y = x;\n if (n > 1023) {\n y *= Ox1p1023;\n n -= 1023;\n if (n > 1023) {\n y *= Ox1p1023;\n n = builtin_min(n - 1023, 1023);\n }\n } else if (n < -1022) {\n /* make sure final n < -53 to avoid double\n\t\t rounding in the subnormal range */\n y *= Ox1p_1022 * Ox1p53;\n n += 1022 - 53;\n if (n < -1022) {\n y *= Ox1p_1022 * Ox1p53;\n n = builtin_max(n + 1022 - 53, -1022);\n }\n }\n return y * reinterpret((0x3FF + n) << 52);\n }\n\n export function mod(x: f64, y: f64): f64 { // see: musl/src/math/fmod.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 52 & 0x7FF);\n var ey = (uy >> 52 & 0x7FF);\n var sx = ux >> 63;\n var uy1 = uy << 1;\n if (uy1 == 0 || ex == 0x7FF || isNaN(y)) {\n let m = x * y;\n return m / m;\n }\n var ux1 = ux << 1;\n if (ux1 <= uy1) {\n if (ux1 == uy1) return 0 * x;\n return x;\n }\n if (!ex) {\n ex -= builtin_clz(ux << 12);\n ux <<= -ex + 1;\n } else {\n ux &= -1 >> 12;\n ux |= 1 << 52;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 12);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 12;\n uy |= 1 << 52;\n }\n while (ex > ey) {\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n ux <<= 1;\n --ex;\n }\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n // for (; !(ux >> 52); ux <<= 1) --ex;\n var shift = builtin_clz(ux << 11);\n ex -= shift;\n ux <<= shift;\n if (ex > 0) {\n ux -= 1 << 52;\n ux |= ex << 52;\n } else {\n ux >>= -ex + 1;\n }\n ux |= sx << 63;\n return reinterpret(ux);\n }\n\n export function rem(x: f64, y: f64): f64 { // see: musl/src/math/remquo.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 52 & 0x7FF);\n var ey = (uy >> 52 & 0x7FF);\n var sx = (ux >> 63);\n if (uy << 1 == 0 || ex == 0x7FF || isNaN(y)) {\n let m = x * y;\n return m / m;\n }\n if (ux << 1 == 0) return x;\n var uxi = ux;\n if (!ex) {\n ex -= builtin_clz(uxi << 12);\n uxi <<= -ex + 1;\n } else {\n uxi &= -1 >> 12;\n uxi |= 1 << 52;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 12);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 12;\n uy |= 1 << 52;\n }\n var q: u32 = 0;\n do {\n if (ex < ey) {\n if (ex + 1 == ey) break; // goto end\n return x;\n }\n while (ex > ey) {\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n uxi <<= 1;\n q <<= 1;\n --ex;\n }\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n if (uxi == 0) ex = -60;\n else {\n let shift = builtin_clz(uxi << 11);\n ex -= shift;\n uxi <<= shift;\n }\n break;\n } while (false);\n // end:\n if (ex > 0) {\n uxi -= 1 << 52;\n uxi |= ex << 52;\n } else {\n uxi >>= -ex + 1;\n }\n x = reinterpret(uxi);\n y = builtin_abs(y);\n var x2 = x + x;\n if (ex == ey || (ex + 1 == ey && (x2 > y || (x2 == y && (q & 1))))) {\n x -= y;\n // ++q;\n }\n return sx ? -x : x;\n }\n}\n\nfunction Rf(z: f32): f32 { // Rational approximation of (asin(x)-x)/x^3\n const // see: musl/src/math/asinf.c and SUN COPYRIGHT NOTICE above\n pS0 = reinterpret(0x3E2AAA75), // 1.6666586697e-01f\n pS1 = reinterpret(0xBD2F13BA), // -4.2743422091e-02f\n pS2 = reinterpret(0xBC0DD36B), // -8.6563630030e-03f\n qS1 = reinterpret(0xBF34E5AE); // -7.0662963390e-01f\n var p = z * (pS0 + z * (pS1 + z * pS2));\n var q: f32 = 1 + z * qS1;\n return p / q;\n}\n\n@inline function expo2f(x: f32): f32 { // exp(x)/2 for x >= log(DBL_MAX)\n const // see: musl/src/math/__expo2f.c\n k = 235,\n kln2 = reinterpret(0x4322E3BC); // 0x1.45c778p+7f\n var scale = reinterpret((0x7F + (k >> 1)) << 23);\n return NativeMathf.exp(x - kln2) * scale * scale;\n}\n\nexport namespace NativeMathf {\n\n @lazy export const E = NativeMath.E;\n @lazy export const LN2 = NativeMath.LN2;\n @lazy export const LN10 = NativeMath.LN10;\n @lazy export const LOG2E = NativeMath.LOG2E;\n @lazy export const LOG10E = NativeMath.LOG10E;\n @lazy export const PI = NativeMath.PI;\n @lazy export const SQRT1_2 = NativeMath.SQRT1_2;\n @lazy export const SQRT2 = NativeMath.SQRT2;\n\n @inline\n export function abs(x: f32): f32 {\n return builtin_abs(x);\n }\n\n export function acos(x: f32): f32 { // see: musl/src/math/acosf.c and SUN COPYRIGHT NOTICE above\n const\n pio2_hi = reinterpret(0x3FC90FDA), // 1.5707962513e+00f\n pio2_lo = reinterpret(0x33A22168), // 7.5497894159e-08f\n Ox1p_120f = reinterpret(0x03800000);\n var hx = reinterpret(x);\n var ix = hx & 0x7FFFFFFF;\n if (ix >= 0x3F800000) {\n if (ix == 0x3F800000) {\n if (hx >> 31) return 2 * pio2_hi + Ox1p_120f;\n return 0;\n }\n return 0 / (x - x);\n }\n if (ix < 0x3F000000) {\n if (ix <= 0x32800000) return pio2_hi + Ox1p_120f;\n return pio2_hi - (x - (pio2_lo - x * Rf(x * x)));\n }\n var z: f32, w: f32, s: f32;\n if (hx >> 31) {\n // z = (1 + x) * 0.5;\n z = 0.5 + x * 0.5;\n s = builtin_sqrt(z);\n w = Rf(z) * s - pio2_lo;\n return 2 * (pio2_hi - (s + w));\n }\n // z = (1 - x) * 0.5;\n z = 0.5 - x * 0.5;\n s = builtin_sqrt(z);\n hx = reinterpret(s);\n var df = reinterpret(hx & 0xFFFFF000);\n var c = (z - df * df) / (s + df);\n w = Rf(z) * s + c;\n return 2 * (df + w);\n }\n\n export function acosh(x: f32): f32 { // see: musl/src/math/acoshf.c\n const s = reinterpret(0x3F317218); // 0.693147180559945309417232121458176568f\n var u = reinterpret(x);\n var a = u & 0x7FFFFFFF;\n if (a < 0x3F800000 + (1 << 23)) {\n let xm1 = x - 1;\n return log1p(xm1 + builtin_sqrt(xm1 * (xm1 + 2)));\n }\n if (a < 0x3F800000 + (12 << 23)) return log(2 * x - 1 / (x + builtin_sqrt(x * x - 1)));\n return log(x) + s;\n }\n\n export function asin(x: f32): f32 { // see: musl/src/math/asinf.c and SUN COPYRIGHT NOTICE above\n const\n pio2 = reinterpret(0x3FC90FDB), // 1.570796326794896558e+00f\n Ox1p_120f = reinterpret(0x03800000);\n var sx = x;\n var hx = reinterpret(x) & 0x7FFFFFFF;\n if (hx >= 0x3F800000) {\n if (hx == 0x3F800000) return x * pio2 + Ox1p_120f;\n return 0 / (x - x);\n }\n if (hx < 0x3F000000) {\n if (hx < 0x39800000 && hx >= 0x00800000) return x;\n return x + x * Rf(x * x);\n }\n // var z: f32 = (1 - builtin_abs(x)) * 0.5;\n var z: f32 = 0.5 - builtin_abs(x) * 0.5;\n var s = builtin_sqrt(z); // sic\n x = (pio2 - 2 * (s + s * Rf(z)));\n return builtin_copysign(x, sx);\n }\n\n export function asinh(x: f32): f32 { // see: musl/src/math/asinhf.c\n const c = reinterpret(0x3F317218); // 0.693147180559945309417232121458176568f\n var u = reinterpret(x) & 0x7FFFFFFF;\n var y = reinterpret(u);\n if (u >= 0x3F800000 + (12 << 23)) y = log(y) + c;\n else if (u >= 0x3F800000 + (1 << 23)) y = log(2 * y + 1 / (builtin_sqrt(y * y + 1) + y));\n else if (u >= 0x3F800000 - (12 << 23)) y = log1p(y + y * y / (builtin_sqrt(y * y + 1) + 1));\n return builtin_copysign(y, x);\n }\n\n export function atan(x: f32): f32 { // see: musl/src/math/atanf.c and SUN COPYRIGHT NOTICE above\n const\n atanhi0 = reinterpret(0x3EED6338), // 4.6364760399e-01f\n atanhi1 = reinterpret(0x3F490FDA), // 7.8539812565e-01f\n atanhi2 = reinterpret(0x3F7B985E), // 9.8279368877e-01f\n atanhi3 = reinterpret(0x3FC90FDA), // 1.5707962513e+00f\n atanlo0 = reinterpret(0x31AC3769), // 5.0121582440e-09f\n atanlo1 = reinterpret(0x33222168), // 3.7748947079e-08f\n atanlo2 = reinterpret(0x33140FB4), // 3.4473217170e-08f\n atanlo3 = reinterpret(0x33A22168), // 7.5497894159e-08f\n aT0 = reinterpret(0x3EAAAAA9), // 3.3333328366e-01f\n aT1 = reinterpret(0xBE4CCA98), // -1.9999158382e-01f\n aT2 = reinterpret(0x3E11F50D), // 1.4253635705e-01f\n aT3 = reinterpret(0xBDDA1247), // -1.0648017377e-01f\n aT4 = reinterpret(0x3D7CAC25), // 6.1687607318e-02f\n Ox1p_120f = reinterpret(0x03800000);\n var ix = reinterpret(x);\n var sx = x;\n ix &= 0x7FFFFFFF;\n var z: f32;\n if (ix >= 0x4C800000) {\n if (isNaN(x)) return x;\n z = atanhi3 + Ox1p_120f;\n return builtin_copysign(z, sx);\n }\n var id: i32;\n if (ix < 0x3EE00000) {\n if (ix < 0x39800000) return x;\n id = -1;\n } else {\n x = builtin_abs(x);\n if (ix < 0x3F980000) {\n if (ix < 0x3F300000) {\n id = 0;\n x = (2.0 * x - 1.0) / (2.0 + x);\n } else {\n id = 1;\n x = (x - 1.0) / (x + 1.0);\n }\n } else {\n if (ix < 0x401C0000) {\n id = 2;\n x = (x - 1.5) / (1.0 + 1.5 * x);\n } else {\n id = 3;\n x = -1.0 / x;\n }\n }\n }\n z = x * x;\n var w = z * z;\n var s1 = z * (aT0 + w * (aT2 + w * aT4));\n var s2 = w * (aT1 + w * aT3);\n var s3 = x * (s1 + s2);\n if (id < 0) return x - s3;\n switch (id) {\n case 0: { z = atanhi0 - ((s3 - atanlo0) - x); break; }\n case 1: { z = atanhi1 - ((s3 - atanlo1) - x); break; }\n case 2: { z = atanhi2 - ((s3 - atanlo2) - x); break; }\n case 3: { z = atanhi3 - ((s3 - atanlo3) - x); break; }\n default: unreachable();\n }\n return builtin_copysign(z, sx);\n }\n\n export function atanh(x: f32): f32 { // see: musl/src/math/atanhf.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFF;\n var y = reinterpret(u);\n if (u < 0x3F800000 - (1 << 23)) {\n if (u >= 0x3F800000 - (32 << 23)) y = 0.5 * log1p(2 * y * (1.0 + y / (1 - y)));\n } else y = 0.5 * log1p(2 * (y / (1 - y)));\n return builtin_copysign(y, x);\n }\n\n export function atan2(y: f32, x: f32): f32 { // see: musl/src/math/atan2f.c and SUN COPYRIGHT NOTICE above\n const\n pi = reinterpret(0x40490FDB), // 3.1415927410e+00f\n pi_lo = reinterpret(0xB3BBBD2E); // -8.7422776573e-08f\n if (isNaN(x) || isNaN(y)) return x + y;\n var ix = reinterpret(x);\n var iy = reinterpret(y);\n if (ix == 0x3F800000) return atan(y);\n var m = (((iy >> 31) & 1) | ((ix >> 30) & 2));\n ix &= 0x7FFFFFFF;\n iy &= 0x7FFFFFFF;\n if (iy == 0) {\n switch (m) {\n case 0:\n case 1: return y;\n case 2: return pi;\n case 3: return -pi;\n }\n }\n if (ix == 0) return m & 1 ? -pi / 2 : pi / 2;\n if (ix == 0x7F800000) {\n if (iy == 0x7F800000) {\n switch (m) {\n case 0: return pi / 4;\n case 1: return -pi / 4;\n case 2: return 3 * pi / 4;\n case 3: return -3 * pi / 4;\n }\n } else {\n switch (m) {\n case 0: return 0;\n case 1: return -0;\n case 2: return pi;\n case 3: return -pi;\n }\n }\n }\n if (ix + (26 << 23) < iy || iy == 0x7F800000) return m & 1 ? -pi / 2 : pi / 2;\n var z: f32;\n if ((m & 2) && iy + (26 << 23) < ix) z = 0.0;\n else z = atan(builtin_abs(y / x));\n switch (m) {\n case 0: return z;\n case 1: return -z;\n case 2: return pi - (z - pi_lo);\n case 3: return (z - pi_lo) - pi;\n }\n unreachable();\n return 0;\n }\n\n export function cbrt(x: f32): f32 { // see: musl/src/math/cbrtf.c and SUN COPYRIGHT NOTICE above\n const\n B1 = 709958130,\n B2 = 642849266,\n Ox1p24f = reinterpret(0x4B800000);\n var u = reinterpret(x);\n var hx = u & 0x7FFFFFFF;\n if (hx >= 0x7F800000) return x + x;\n if (hx < 0x00800000) {\n if (hx == 0) return x;\n u = reinterpret(x * Ox1p24f);\n hx = u & 0x7FFFFFFF;\n hx = hx / 3 + B2;\n } else {\n hx = hx / 3 + B1;\n }\n u &= 0x80000000;\n u |= hx;\n var t = reinterpret(u);\n var r = t * t * t;\n t = t * (x + x + r) / (x + r + r);\n r = t * t * t;\n t = t * (x + x + r) / (x + r + r);\n return t;\n }\n\n @inline\n export function ceil(x: f32): f32 {\n return builtin_ceil(x);\n }\n\n export function clz32(x: f32): f32 {\n if (!isFinite(x)) return 32;\n return builtin_clz(\n (x - 4294967296 * builtin_floor(x * (1.0 / 4294967296)))\n );\n }\n\n export function cos(x: f32): f32 { // TODO\n unreachable();\n return 0;\n }\n\n export function cosh(x: f32): f32 { // see: musl/src/math/coshf.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFF;\n x = reinterpret(u);\n if (u < 0x3F317217) {\n if (u < 0x3F800000 - (12 << 23)) return 1;\n let t = expm1(x);\n // return 1 + t * t / (2 * (1 + t));\n return 1 + t * t / (2 + 2 * t);\n }\n if (u < 0x42B17217) {\n let t = exp(x);\n // return 0.5 * (t + 1 / t);\n return 0.5 * t + 0.5 / t;\n }\n return expo2f(x);\n }\n\n @inline\n export function floor(x: f32): f32 {\n return builtin_floor(x);\n }\n\n export function exp(x: f32): f32 { // see: musl/src/math/expf.c and SUN COPYRIGHT NOTICE above\n const\n ln2hi = reinterpret(0x3F317200), // 6.9314575195e-1f\n ln2lo = reinterpret(0x35BFBE8E), // 1.4286067653e-6f\n invln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+0f\n P1 = reinterpret(0x3E2AAA8F), // 1.6666625440e-1f\n P2 = reinterpret(0xBB355215), // -2.7667332906e-3f\n Ox1p127f = reinterpret(0x7F000000);\n var hx = reinterpret(x);\n var sign_ = (hx >> 31);\n hx &= 0x7FFFFFFF;\n if (hx >= 0x42AEAC50) {\n if (hx >= 0x42B17218) {\n if (!sign_) return x * Ox1p127f;\n else if (hx >= 0x42CFF1B5) return 0;\n }\n }\n var hi: f32, lo: f32;\n var k: i32;\n if (hx > 0x3EB17218) {\n if (hx > 0x3F851592) {\n k = (invln2 * x + builtin_copysign(0.5, x));\n } else {\n k = 1 - (sign_ << 1);\n }\n hi = x - k * ln2hi;\n lo = k * ln2lo;\n x = hi - lo;\n } else if (hx > 0x39000000) {\n k = 0;\n hi = x;\n lo = 0;\n } else {\n return 1 + x;\n }\n var xx = x * x;\n var c = x - xx * (P1 + xx * P2);\n var y: f32 = 1 + (x * c / (2 - c) - lo + hi);\n if (k == 0) return y;\n return scalbn(y, k);\n }\n\n export function expm1(x: f32): f32 { // see: musl/src/math/expm1f.c and SUN COPYRIGHT NOTICE above\n const\n o_threshold = reinterpret(0x42B17180), // 8.8721679688e+01f\n ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01f\n ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06f\n invln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+00f\n Q1 = reinterpret(0xBD088868), // -3.3333212137e-02f\n Q2 = reinterpret(0x3ACF3010), // 1.5807170421e-03f\n Ox1p127f = reinterpret(0x7F000000);\n var u = reinterpret(x);\n var hx = u & 0x7FFFFFFF;\n var sign_ = (u >> 31);\n if (hx >= 0x4195B844) {\n if (hx > 0x7F800000) return x;\n if (sign_) return -1;\n if (x > o_threshold) {\n x *= Ox1p127f;\n return x;\n }\n }\n var c: f32 = 0.0, t: f32, k: i32;\n if (hx > 0x3EB17218) {\n k = select(\n 1 - (sign_ << 1),\n (invln2 * x + builtin_copysign(0.5, x)),\n hx < 0x3F851592\n );\n t = k;\n let hi = x - t * ln2_hi;\n let lo = t * ln2_lo;\n x = hi - lo;\n c = (hi - x) - lo;\n } else if (hx < 0x33000000) {\n return x;\n } else k = 0;\n var hfx: f32 = 0.5 * x;\n var hxs: f32 = x * hfx;\n var r1: f32 = 1.0 + hxs * (Q1 + hxs * Q2);\n t = 3.0 - r1 * hfx;\n var e = hxs * ((r1 - t) / (6.0 - x * t));\n if (k == 0) return x - (x * e - hxs);\n e = x * (e - c) - c;\n e -= hxs;\n if (k == -1) return 0.5 * (x - e) - 0.5;\n if (k == 1) {\n if (x < -0.25) return -2.0 * (e - (x + 0.5));\n return 1.0 + 2.0 * (x - e);\n }\n u = (0x7F + k) << 23;\n var twopk = reinterpret(u);\n var y: f32;\n if (k < 0 || k > 56) {\n y = x - e + 1.0;\n if (k == 128) y = y * 2.0 * Ox1p127f;\n else y = y * twopk;\n return y - 1.0;\n }\n u = (0x7F - k) << 23;\n y = reinterpret(u);\n if (k < 20) y = (1 - y) - e;\n else y = 1 - (e + y);\n return (x + y) * twopk;\n }\n\n @inline\n export function fround(x: f32): f32 {\n return x;\n }\n\n export function hypot(x: f32, y: f32): f32 { // see: musl/src/math/hypotf.c\n const\n Ox1p90f = reinterpret(0x6C800000),\n Ox1p_90f = reinterpret(0x12800000);\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n ux &= 0x7FFFFFFF;\n uy &= 0x7FFFFFFF;\n if (ux < uy) {\n let ut = ux;\n ux = uy;\n uy = ut;\n }\n x = reinterpret(ux);\n y = reinterpret(uy);\n if (uy == 0xFF << 23) return y;\n if (ux >= 0xFF << 23 || uy == 0 || ux - uy >= 25 << 23) return x + y;\n var z: f32 = 1;\n if (ux >= (0x7F + 60) << 23) {\n z = Ox1p90f;\n x *= Ox1p_90f;\n y *= Ox1p_90f;\n } else if (uy < (0x7F - 60) << 23) {\n z = Ox1p_90f;\n x *= Ox1p90f;\n y *= Ox1p90f;\n }\n return z * builtin_sqrt((x * x + y * y));\n }\n\n @inline\n export function imul(x: f32, y: f32): f32 {\n /*\n * Wasm (MVP) and JS have different approaches for double->int conversions.\n *\n * For emulate JS conversion behavior and avoid trapping from wasm we should modulate by MAX_INT\n * our float-point arguments before actual convertion to integers.\n */\n if (!isFinite(x + y)) return 0;\n const inv32 = 1.0 / 4294967296;\n return (\n (x - 4294967296 * builtin_floor(x * inv32)) *\n (y - 4294967296 * builtin_floor(y * inv32))\n );\n }\n\n export function log(x: f32): f32 { // see: musl/src/math/logf.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01f\n ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06f\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f\n Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f\n Ox1p25f = reinterpret(0x4C000000);\n var u = reinterpret(x);\n var k = 0;\n if (u < 0x00800000 || (u >> 31)) {\n if (u << 1 == 0) return -1 / (x * x);\n if (u >> 31) return (x - x) / 0;\n k -= 25;\n x *= Ox1p25f;\n u = reinterpret(x);\n } else if (u >= 0x7F800000) return x;\n else if (u == 0x3F800000) return 0;\n u += 0x3F800000 - 0x3F3504F3;\n k += (u >> 23) - 0x7F;\n u = (u & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret(u);\n var f = x - 1.0;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq = 0.5 * f * f;\n var dk = k;\n return s * (hfsq + r) + dk * ln2_lo - hfsq + f + dk * ln2_hi;\n }\n\n export function log10(x: f32): f32 { // see: musl/src/math/log10f.c and SUN COPYRIGHT NOTICE above\n const\n ivln10hi = reinterpret(0x3EDE6000), // 4.3432617188e-01f\n ivln10lo = reinterpret(0xB804EAD9), // -3.1689971365e-05f\n log10_2hi = reinterpret(0x3E9A2080), // 3.0102920532e-01f\n log10_2lo = reinterpret(0x355427DB), // 7.9034151668e-07f\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f, 0.24279078841f\n Ox1p25f = reinterpret(0x4C000000);\n var ix = reinterpret(x);\n var k = 0;\n if (ix < 0x00800000 || (ix >> 31)) {\n if (ix << 1 == 0) return -1 / (x * x);\n if (ix >> 31) return (x - x) / 0.0;\n k -= 25;\n x *= Ox1p25f;\n ix = reinterpret(x);\n } else if (ix >= 0x7F800000) return x;\n else if (ix == 0x3F800000) return 0;\n ix += 0x3F800000 - 0x3F3504F3;\n k += (ix >> 23) - 0x7F;\n ix = (ix & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret(ix);\n var f = x - 1.0;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq: f32 = 0.5 * f * f;\n var hi = f - hfsq;\n ix = reinterpret(hi);\n ix &= 0xFFFFF000;\n hi = reinterpret(ix);\n var lo = f - hi - hfsq + s * (hfsq + r);\n var dk = k;\n return dk * log10_2lo + (lo + hi) * ivln10lo + lo * ivln10hi + hi * ivln10hi + dk * log10_2hi;\n }\n\n export function log1p(x: f32): f32 { // see: musl/src/math/log1pf.c and SUN COPYRIGHT NOTICE above\n const\n ln2_hi = reinterpret(0x3F317180), // 6.9313812256e-01\n ln2_lo = reinterpret(0x3717F7D1), // 9.0580006145e-06\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret(0x3E789E26); // 0xf89e26.0p-26f, 0.24279078841f\n var ix = reinterpret(x);\n var c: f32 = 0, f: f32 = 0;\n var k: i32 = 1;\n if (ix < 0x3ED413D0 || (ix >> 31)) {\n if (ix >= 0xBF800000) {\n if (x == -1) return x / 0.0;\n return (x - x) / 0.0;\n }\n if (ix << 1 < 0x33800000 << 1) return x;\n if (ix <= 0xBE95F619) {\n k = 0;\n c = 0;\n f = x;\n }\n } else if (ix >= 0x7F800000) return x;\n if (k) {\n let uf: f32 = 1 + x;\n let iu = reinterpret(uf);\n iu += 0x3F800000 - 0x3F3504F3;\n k = (iu >> 23) - 0x7F;\n if (k < 25) {\n c = k >= 2 ? 1 - (uf - x) : x - (uf - 1);\n c /= uf;\n } else c = 0;\n iu = (iu & 0x007FFFFF) + 0x3F3504F3;\n f = reinterpret(iu) - 1;\n }\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq: f32 = 0.5 * f * f;\n var dk = k;\n return s * (hfsq + r) + (dk * ln2_lo + c) - hfsq + f + dk * ln2_hi;\n }\n\n export function log2(x: f32): f32 { // see: musl/src/math/log2f.c and SUN COPYRIGHT NOTICE above\n const\n ivln2hi = reinterpret(0x3FB8B000), // 1.4428710938e+00f\n ivln2lo = reinterpret(0xB9389AD4), // -1.7605285393e-04\n Lg1 = reinterpret(0x3F2AAAAA), // 0xaaaaaa.0p-24f, 0.66666662693f\n Lg2 = reinterpret(0x3ECCCE13), // 0xccce13.0p-25f, 0.40000972152f\n Lg3 = reinterpret(0x3E91E9EE), // 0x91e9ee.0p-25f, 0.28498786688f\n Lg4 = reinterpret(0x3E789E26), // 0xf89e26.0p-26f, 0.24279078841f\n Ox1p25f = reinterpret(0x4C000000);\n var ix = reinterpret(x);\n var k: i32 = 0;\n if (ix < 0x00800000 || (ix >> 31)) {\n if (ix << 1 == 0) return -1 / (x * x);\n if (ix >> 31) return (x - x) / 0.0;\n k -= 25;\n x *= Ox1p25f;\n ix = reinterpret(x);\n } else if (ix >= 0x7F800000) return x;\n else if (ix == 0x3F800000) return 0;\n ix += 0x3F800000 - 0x3F3504F3;\n k += (ix >> 23) - 0x7F;\n ix = (ix & 0x007FFFFF) + 0x3F3504F3;\n x = reinterpret(ix);\n var f = x - 1.0;\n var s = f / (2.0 + f);\n var z = s * s;\n var w = z * z;\n var t1 = w * (Lg2 + w * Lg4);\n var t2 = z * (Lg1 + w * Lg3);\n var r = t2 + t1;\n var hfsq: f32 = 0.5 * f * f;\n var hi = f - hfsq;\n var u = reinterpret(hi);\n u &= 0xFFFFF000;\n hi = reinterpret(u);\n var lo: f32 = f - hi - hfsq + s * (hfsq + r);\n var dk = k;\n return (lo + hi) * ivln2lo + lo * ivln2hi + hi * ivln2hi + dk;\n }\n\n @inline\n export function max(value1: f32, value2: f32): f32 {\n return builtin_max(value1, value2);\n }\n\n @inline\n export function min(value1: f32, value2: f32): f32 {\n return builtin_min(value1, value2);\n }\n\n export function pow(x: f32, y: f32): f32 { // see: musl/src/math/powf.c and SUN COPYRIGHT NOTICE above\n const\n dp_h1 = reinterpret(0x3F15C000), // 5.84960938e-01f\n dp_l1 = reinterpret(0x35D1CFDC), // 1.56322085e-06f\n two24 = reinterpret(0x4B800000), // 16777216f\n huge = reinterpret(0x7149F2CA), // 1.0e+30f\n tiny = reinterpret(0x0DA24260), // 1.0e-30f\n L1 = reinterpret(0x3F19999A), // 6.0000002384e-01f\n L2 = reinterpret(0x3EDB6DB7), // 4.2857143283e-01f\n L3 = reinterpret(0x3EAAAAAB), // 3.3333334327e-01f\n L4 = reinterpret(0x3E8BA305), // 2.7272811532e-01f\n L5 = reinterpret(0x3E6C3255), // 2.3066075146e-01f\n L6 = reinterpret(0x3E53F142), // 2.0697501302e-01f\n P1 = reinterpret(0x3E2AAAAB), // 1.6666667163e-01f\n P2 = reinterpret(0xBB360B61), // -2.7777778450e-03f\n P3 = reinterpret(0x388AB355), // 6.6137559770e-05f\n P4 = reinterpret(0xB5DDEA0E), // -1.6533901999e-06f\n P5 = reinterpret(0x3331BB4C), // 4.1381369442e-08f\n lg2 = reinterpret(0x3F317218), // 6.9314718246e-01f\n lg2_h = reinterpret(0x3F317200), // 6.93145752e-01f\n lg2_l = reinterpret(0x35BFBE8C), // 1.42860654e-06f\n ovt = reinterpret(0x3338AA3C), // 4.2995665694e-08f\n cp = reinterpret(0x3F76384F), // 9.6179670095e-01\n cp_h = reinterpret(0x3F764000), // 9.6191406250e-01\n cp_l = reinterpret(0xB8F623C6), // -1.1736857402e-04\n ivln2 = reinterpret(0x3FB8AA3B), // 1.4426950216e+00\n ivln2_h = reinterpret(0x3FB8AA00), // 1.4426879883e+00\n ivln2_l = reinterpret(0x36ECA570), // 7.0526075433e-06\n inv3 = reinterpret(0x3EAAAAAB); // 0.333333333333\n var hx = reinterpret(x);\n var hy = reinterpret(y);\n var ix = hx & 0x7FFFFFFF;\n var iy = hy & 0x7FFFFFFF;\n if (iy == 0) return 1.0; // x**0 = 1, even if x is NaN\n // if (hx == 0x3F800000) return 1.0; // C: 1**y = 1, even if y is NaN, JS: NaN\n if (ix > 0x7F800000 || iy > 0x7F800000) return x + y; // NaN if either arg is NaN\n var yisint = 0, j: i32, k: i32;\n if (hx < 0) {\n if (iy >= 0x4B800000) yisint = 2;\n else if (iy >= 0x3F800000) {\n k = (iy >> 23) - 0x7F;\n let ki = 23 - k;\n j = iy >> ki;\n if ((j << ki) == iy) yisint = 2 - (j & 1);\n }\n }\n if (iy == 0x7F800000) { // y is +-inf\n if (ix == 0x3F800000) return NaN; // C: (-1)**+-inf is 1, JS: NaN\n else if (ix > 0x3F800000) return hy >= 0 ? y : 0.0; // (|x|>1)**+-inf = inf,0\n else return hy >= 0 ? 0.0 : -y; // (|x|<1)**+-inf = 0,inf\n }\n if (iy == 0x3F800000) return hy >= 0 ? x : 1.0 / x;\n if (hy == 0x40000000) return x * x;\n if (hy == 0x3F000000) {\n if (hx >= 0) return builtin_sqrt(x);\n }\n var ax = builtin_abs(x);\n var z: f32;\n if (ix == 0x7F800000 || ix == 0 || ix == 0x3F800000) {\n z = ax;\n if (hy < 0) z = 1.0 / z;\n if (hx < 0) {\n if (((ix - 0x3F800000) | yisint) == 0) {\n let d = z - z;\n z = d / d;\n }\n else if (yisint == 1) z = -z;\n }\n return z;\n }\n var sn = 1.0;\n if (hx < 0) {\n if (yisint == 0) {\n let d = x - x;\n return d / d;\n }\n if (yisint == 1) sn = -1.0;\n }\n var t1: f32, t2: f32, r: f32, s: f32, t: f32, u: f32, v: f32, w: f32, p_h: f32, p_l: f32;\n var n: i32, is: i32;\n if (iy > 0x4D000000) {\n if (ix < 0x3F7FFFF8) return hy < 0 ? sn * huge * huge : sn * tiny * tiny;\n if (ix > 0x3F800007) return hy > 0 ? sn * huge * huge : sn * tiny * tiny;\n t = ax - 1;\n w = (t * t) * (0.5 - t * (inv3 - t * 0.25));\n u = ivln2_h * t;\n v = t * ivln2_l - w * ivln2;\n t1 = u + v;\n is = reinterpret(t1);\n t1 = reinterpret(is & 0xFFFFF000);\n t2 = v - (t1 - u);\n } else {\n let s2: f32, s_h: f32, s_l: f32, t_h: f32, t_l: f32;\n n = 0;\n if (ix < 0x00800000) {\n ax *= two24;\n n -= 24;\n ix = reinterpret(ax);\n }\n n += (ix >> 23) - 0x7F;\n j = ix & 0x007FFFFF;\n ix = j | 0x3F800000;\n if (j <= 0x1CC471) k = 0;\n else if (j < 0x5DB3D7) k = 1;\n else {\n k = 0;\n n += 1;\n ix -= 0x00800000;\n }\n ax = reinterpret(ix);\n let bp = select(1.5, 1.0, k); // k ? 1.5 : 1.0\n u = ax - bp;\n v = 1.0 / (ax + bp);\n s = u * v;\n s_h = s;\n is = reinterpret(s_h);\n s_h = reinterpret(is & 0xFFFFF000);\n is = ((ix >> 1) & 0xFFFFF000) | 0x20000000;\n t_h = reinterpret(is + 0x00400000 + (k << 21));\n t_l = ax - (t_h - bp);\n s_l = v * ((u - s_h * t_h) - s_h * t_l);\n s2 = s * s;\n r = s2 * s2 * (L1 + s2 * (L2 + s2 * (L3 + s2 * (L4 + s2 * (L5 + s2 * L6)))));\n r += s_l * (s_h + s);\n s2 = s_h * s_h;\n t_h = 3.0 + s2 + r;\n is = reinterpret(t_h);\n t_h = reinterpret(is & 0xFFFFF000);\n t_l = r - ((t_h - 3.0) - s2);\n u = s_h * t_h;\n v = s_l * t_h + t_l * s;\n p_h = u + v;\n is = reinterpret(p_h);\n p_h = reinterpret(is & 0xFFFFF000);\n p_l = v - (p_h - u);\n let z_h = cp_h * p_h;\n let dp_l = select(dp_l1, 0.0, k);\n let z_l = cp_l * p_h + p_l * cp + dp_l;\n t = n;\n let dp_h = select(dp_h1, 0.0, k);\n t1 = (((z_h + z_l) + dp_h) + t);\n is = reinterpret(t1);\n t1 = reinterpret(is & 0xFFFFF000);\n t2 = z_l - (((t1 - t) - dp_h) - z_h);\n }\n is = reinterpret(y);\n var y1 = reinterpret(is & 0xFFFFF000);\n p_l = (y - y1) * t1 + y * t2;\n p_h = y1 * t1;\n z = p_l + p_h;\n j = reinterpret(z);\n if (j > 0x43000000) {\n return sn * huge * huge;\n } else if (j == 0x43000000) {\n if (p_l + ovt > z - p_h) return sn * huge * huge;\n } else if ((j & 0x7FFFFFFF) > 0x43160000) {\n return sn * tiny * tiny;\n } else if (j == 0xC3160000) {\n if (p_l <= z - p_h) return sn * tiny * tiny;\n }\n var i = j & 0x7FFFFFFF;\n k = (i >> 23) - 0x7F;\n n = 0;\n if (i > 0x3F000000) {\n n = j + (0x00800000 >> (k + 1));\n k = ((n & 0x7FFFFFFF) >> 23) - 0x7F;\n t = reinterpret(n & ~(0x007FFFFF >> k));\n n = ((n & 0x007FFFFF) | 0x00800000) >> (23 - k);\n if (j < 0) n = -n;\n p_h -= t;\n }\n t = p_l + p_h;\n is = reinterpret(t);\n t = reinterpret(is & 0xFFFF8000);\n u = t * lg2_h;\n v = (p_l - (t - p_h)) * lg2 + t * lg2_l;\n z = u + v;\n w = v - (z - u);\n t = z * z;\n t1 = z - t * (P1 + t * (P2 + t * (P3 + t * (P4 + t * P5))));\n r = (z * t1) / (t1 - 2.0) - (w + z * w);\n z = 1.0 - (r - z);\n j = reinterpret(z);\n j += n << 23;\n if ((j >> 23) <= 0) z = scalbn(z, n);\n else z = reinterpret(j);\n return sn * z;\n }\n\n @inline\n export function seedRandom(value: i64): void {\n NativeMath.seedRandom(value);\n }\n\n // Using xoroshiro64starstar from http://xoshiro.di.unimi.it/xoroshiro64starstar.c\n export function random(): f32 {\n if (!random_seeded) throw new Error("PRNG must be seeded.");\n\n var s0 = random_state0_32;\n var s1 = random_state1_32;\n var r = rotl(s0 * 0x9E3779BB, 5) * 5;\n\n s1 ^= s0;\n random_state0_32 = rotl(s0, 26) ^ s1 ^ (s1 << 9);\n random_state1_32 = rotl(s1, 13);\n\n return reinterpret((r >> 9) | (127 << 23)) - 1.0;\n }\n\n @inline\n export function round(x: f32): f32 {\n return builtin_copysign(builtin_floor(x + 0.5), x);\n }\n\n @inline\n export function sign(x: f32): f32 {\n if (ASC_SHRINK_LEVEL > 0) {\n return builtin_abs(x) > 0 ? builtin_copysign(1, x) : x;\n } else {\n return x > 0 ? 1 : x < 0 ? -1 : x;\n }\n }\n\n @inline\n export function signbit(x: f32): bool {\n return ((reinterpret(x) >>> 31) & (x == x));\n }\n\n export function sin(x: f32): f32 { // TODO\n unreachable();\n return 0;\n }\n\n export function sinh(x: f32): f32 { // see: musl/src/math/sinhf.c\n var u = reinterpret(x) & 0x7FFFFFFF;\n var absx = reinterpret(u);\n var t: f32;\n var h = builtin_copysign(0.5, x);\n if (u < 0x42B17217) {\n t = expm1(absx);\n if (u < 0x3F800000) {\n if (u < 0x3F800000 - (12 << 23)) return x;\n return h * (2 * t - t * t / (t + 1));\n }\n return h * (t + t / (t + 1));\n }\n t = 2 * h * expo2f(absx);\n return t;\n }\n\n @inline\n export function sqrt(x: f32): f32 {\n return builtin_sqrt(x);\n }\n\n export function tan(x: f32): f32 { // TODO\n unreachable();\n return 0;\n }\n\n export function tanh(x: f32): f32 { // see: musl/src/math/tanhf.c\n var u = reinterpret(x);\n u &= 0x7FFFFFFF;\n var y = reinterpret(u);\n var t: f32;\n if (u > 0x3F0C9F54) {\n if (u > 0x41200000) t = 1 + 0 / y;\n else {\n t = expm1(2 * y);\n t = 1 - 2 / (t + 2);\n }\n } else if (u > 0x3E82C578) {\n t = expm1(2 * y);\n t = t / (t + 2);\n } else if (u >= 0x00800000) {\n t = expm1(-2 * y);\n t = -t / (t + 2);\n } else t = y;\n return builtin_copysign(t, x);\n }\n\n @inline\n export function trunc(x: f32): f32 {\n return builtin_trunc(x);\n }\n\n export function scalbn(x: f32, n: i32): f32 { // see: https://git.musl-libc.org/cgit/musl/tree/src/math/scalbnf.c\n const\n Ox1p24f = reinterpret(0x4B800000),\n Ox1p127f = reinterpret(0x7F000000),\n Ox1p_126f = reinterpret(0x00800000);\n var y = x;\n if (n > 127) {\n y *= Ox1p127f;\n n -= 127;\n if (n > 127) {\n y *= Ox1p127f;\n n = builtin_min(n - 127, 127);\n }\n } else if (n < -126) {\n y *= Ox1p_126f * Ox1p24f;\n n += 126 - 24;\n if (n < -126) {\n y *= Ox1p_126f * Ox1p24f;\n n = builtin_max(n + 126 - 24, -126);\n }\n }\n return y * reinterpret((0x7F + n) << 23);\n }\n\n export function mod(x: f32, y: f32): f32 { // see: musl/src/math/fmodf.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 23 & 0xFF);\n var ey = (uy >> 23 & 0xFF);\n var sx = ux & 0x80000000;\n var uy1 = uy << 1;\n if (uy1 == 0 || ex == 0xFF || isNaN(y)) {\n let m = x * y;\n return m / m;\n }\n var ux1 = ux << 1;\n if (ux1 <= uy1) {\n if (ux1 == uy1) return 0 * x;\n return x;\n }\n if (!ex) {\n ex -= builtin_clz(ux << 9);\n ux <<= -ex + 1;\n } else {\n ux &= -1 >> 9;\n ux |= 1 << 23;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 9);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 9;\n uy |= 1 << 23;\n }\n while (ex > ey) {\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n ux <<= 1;\n --ex;\n }\n if (ux >= uy) {\n if (ux == uy) return 0 * x;\n ux -= uy;\n }\n // for (; !(ux >> 23); ux <<= 1) --ex;\n var shift = builtin_clz(ux << 8);\n ex -= shift;\n ux <<= shift;\n if (ex > 0) {\n ux -= 1 << 23;\n ux |= ex << 23;\n } else {\n ux >>= -ex + 1;\n }\n ux |= sx;\n return reinterpret(ux);\n }\n\n export function rem(x: f32, y: f32): f32 { // see: musl/src/math/remquof.c\n var ux = reinterpret(x);\n var uy = reinterpret(y);\n var ex = (ux >> 23 & 0xFF);\n var ey = (uy >> 23 & 0xFF);\n var sx = (ux >> 31);\n var uxi = ux;\n if (uy << 1 == 0 || ex == 0xFF || isNaN(y)) return (x * y) / (x * y);\n if (ux << 1 == 0) return x;\n if (!ex) {\n ex -= builtin_clz(uxi << 9);\n uxi <<= -ex + 1;\n } else {\n uxi &= -1 >> 9;\n uxi |= 1 << 23;\n }\n if (!ey) {\n ey -= builtin_clz(uy << 9);\n uy <<= -ey + 1;\n } else {\n uy &= -1 >> 9;\n uy |= 1 << 23;\n }\n var q = 0;\n do {\n if (ex < ey) {\n if (ex + 1 == ey) break; // goto end\n return x;\n }\n while (ex > ey) {\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n uxi <<= 1;\n q <<= 1;\n --ex;\n }\n if (uxi >= uy) {\n uxi -= uy;\n ++q;\n }\n if (uxi == 0) ex = -30;\n else {\n let shift = builtin_clz(uxi << 8);\n ex -= shift;\n uxi <<= shift;\n }\n break;\n } while (false);\n // end\n if (ex > 0) {\n uxi -= 1 << 23;\n uxi |= ex << 23;\n } else {\n uxi >>= -ex + 1;\n }\n x = reinterpret(uxi);\n y = builtin_abs(y);\n var x2 = x + x;\n if (ex == ey || (ex + 1 == ey && (x2 > y || (x2 == y && (q & 1))))) {\n x -= y;\n // q++;\n }\n return sx ? -x : x;\n }\n}\n\nexport function ipow32(x: i32, e: i32): i32 {\n var out = 1;\n if (ASC_SHRINK_LEVEL < 1) {\n if (e < 0) return 0;\n\n switch (e) {\n case 0: return 1;\n case 1: return x;\n case 2: return x * x;\n }\n\n let log = 32 - clz(e);\n if (log <= 5) {\n // 32 = 2 ^ 5, so need only five cases.\n // But some extra cases needs for properly overflowing\n switch (log) {\n case 5: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 4: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 3: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 2: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 1: {\n if (e & 1) out *= x;\n }\n }\n return out;\n }\n }\n\n while (e > 0) {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n return out;\n}\n\nexport function ipow64(x: i64, e: i32): i64 {\n var out: i64 = 1;\n if (ASC_SHRINK_LEVEL < 1) {\n if (e < 0) return 0;\n switch (e) {\n case 0: return 1;\n case 1: return x;\n case 2: return x * x;\n }\n\n let log = 32 - clz(e);\n if (log <= 6) {\n // 64 = 2 ^ 6, so need only six cases.\n // But some extra cases needs for properly overflowing\n switch (log) {\n case 6: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 5: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 4: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 3: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 2: {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n case 1: {\n if (e & 1) out *= x;\n }\n }\n return out;\n }\n }\n\n while (e > 0) {\n if (e & 1) out *= x;\n e >>= 1;\n x *= x;\n }\n return out;\n}\n\nexport function ipow32f(x: f32, e: i32): f32 {\n var sign = e >> 31;\n e = (e + sign) ^ sign; // abs(e)\n var out: f32 = 1;\n while (e) {\n out *= select(x, 1.0, e & 1);\n e >>= 1;\n x *= x;\n }\n return sign ? 1.0 / out : out;\n}\n\nexport function ipow64f(x: f64, e: i32): f64 {\n var sign = e >> 31;\n e = (e + sign) ^ sign; // abs(e)\n var out = 1.0;\n while (e) {\n out *= select(x, 1.0, e & 1);\n e >>= 1;\n x *= x;\n }\n return sign ? 1.0 / out : out;\n}\n',memory:'import { memcmp, memmove, memset } from "./internal/memory";\n\n@builtin export declare const HEAP_BASE: usize; // tslint:disable-line\n\n/* tslint:disable */\n\nexport namespace memory {\n\n @builtin export declare function size(): i32;\n\n @builtin export declare function grow(pages: i32): i32;\n\n @builtin @inline\n export function fill(dest: usize, c: u8, n: usize): void { // see: musl/src/string/memset\n memset(dest, c, n); // fallback if "bulk-memory" isn\'t enabled\n }\n\n @builtin @inline\n export function copy(dest: usize, src: usize, n: usize): void { // see: musl/src/string/memmove.c\n memmove(dest, src, n); // fallback if "bulk-memory" isn\'t enabled\n }\n\n @inline export function compare(vl: usize, vr: usize, n: usize): i32 { // see: musl/src/string/memcmp.c\n return memcmp(vl, vr, n);\n }\n\n // Passive segments\n\n // export function init(segmentIndex: u32, srcOffset: usize, dstOffset: usize, n: usize): void {\n // __memory_init(segmentIndex, srcOffset, dstOffset);\n // }\n\n // export function drop(segmentIndex: u32): void {\n // __memory_drop(segmentIndex);\n // }\n\n // Allocator\n\n @inline export function allocate(size: usize): usize {\n if (isDefined(__memory_allocate)) return __memory_allocate(size);\n WARNING("Calling \'memory.allocate\' requires a memory manager to be present.");\n return unreachable();\n }\n\n @inline export function free(ptr: usize): void {\n if (isDefined(__memory_free)) { __memory_free(ptr); return; }\n WARNING("Calling \'memory.free\' requires a memory manager to be present.");\n unreachable();\n }\n\n @inline export function reset(): void {\n if (isDefined(__memory_reset)) { __memory_reset(); return; }\n unreachable();\n }\n}\n',number:'import {\n itoa,\n dtoa\n} from "./internal/number";\n\nimport {\n isNaN as builtin_isNaN,\n isFinite as builtin_isFinite\n} from "./builtins";\n\n@sealed\nexport abstract class I8 {\n\n @lazy static readonly MIN_VALUE: i8 = i8.MIN_VALUE;\n @lazy static readonly MAX_VALUE: i8 = i8.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i8 {\n return parseI32(value, radix);\n }\n\n toString(this: i8): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class I16 {\n\n @lazy static readonly MIN_VALUE: i16 = i16.MIN_VALUE;\n @lazy static readonly MAX_VALUE: i16 = i16.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i16 {\n return parseI32(value, radix);\n }\n\n toString(this: i16): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class I32 {\n\n @lazy static readonly MIN_VALUE: i32 = i32.MIN_VALUE;\n @lazy static readonly MAX_VALUE: i32 = i32.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i32 {\n return parseI32(value, radix);\n }\n\n toString(this: i32): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class I64 {\n\n @lazy static readonly MIN_VALUE: i64 = i64.MIN_VALUE;\n @lazy static readonly MAX_VALUE: i64 = i64.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): i64 {\n return parseI64(value, radix);\n }\n\n toString(this: i64): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class Isize {\n\n @lazy static readonly MIN_VALUE: isize = isize.MIN_VALUE;\n @lazy static readonly MAX_VALUE: isize = isize.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): isize {\n return parseI64(value, radix);\n }\n\n toString(this: isize): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U8 {\n\n @lazy static readonly MIN_VALUE: u8 = u8.MIN_VALUE;\n @lazy static readonly MAX_VALUE: u8 = u8.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u8 {\n return parseI32(value, radix);\n }\n\n toString(this: u8): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U16 {\n\n @lazy static readonly MIN_VALUE: u16 = u16.MIN_VALUE;\n @lazy static readonly MAX_VALUE: u16 = u16.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u16 {\n return parseI32(value, radix);\n }\n\n toString(this: u16): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U32 {\n\n @lazy static readonly MIN_VALUE: u32 = u32.MIN_VALUE;\n @lazy static readonly MAX_VALUE: u32 = u32.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u32 {\n return parseI32(value, radix);\n }\n\n toString(this: u32): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class U64 {\n\n @lazy static readonly MIN_VALUE: u64 = u64.MIN_VALUE;\n @lazy static readonly MAX_VALUE: u64 = u64.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): u64 {\n return parseI64(value, radix);\n }\n\n toString(this: u64): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class Usize {\n\n @lazy static readonly MIN_VALUE: usize = usize.MIN_VALUE;\n @lazy static readonly MAX_VALUE: usize = usize.MAX_VALUE;\n\n static parseInt(value: string, radix: i32 = 0): usize {\n return parseI64(value, radix);\n }\n\n toString(this: usize): String {\n // TODO: radix\n return itoa(this);\n }\n}\n\n@sealed\nexport abstract class Bool {\n\n @lazy static readonly MIN_VALUE: bool = bool.MIN_VALUE;\n @lazy static readonly MAX_VALUE: bool = bool.MAX_VALUE;\n\n toString(this: bool): String {\n // TODO: radix?\n return this ? "true" : "false";\n }\n}\n\nexport { Bool as Boolean };\n\n@sealed\nexport abstract class F32 {\n\n @lazy static readonly EPSILON: f32 = f32.EPSILON;\n @lazy static readonly MIN_VALUE: f32 = f32.MIN_VALUE;\n @lazy static readonly MAX_VALUE: f32 = f32.MAX_VALUE;\n @lazy static readonly MIN_SAFE_INTEGER: f32 = f32.MIN_SAFE_INTEGER;\n @lazy static readonly MAX_SAFE_INTEGER: f32 = f32.MAX_SAFE_INTEGER;\n @lazy static readonly POSITIVE_INFINITY: f32 = Infinity;\n @lazy static readonly NEGATIVE_INFINITY: f32 = -Infinity;\n @lazy static readonly NaN: f32 = NaN;\n\n static isNaN(value: f32): bool {\n return isNaN(value);\n }\n\n static isFinite(value: f32): bool {\n return isFinite(value);\n }\n\n static isSafeInteger(value: f32): bool {\n return abs(value) <= f32.MAX_SAFE_INTEGER && trunc(value) == value;\n }\n\n static isInteger(value: f32): bool {\n return isFinite(value) && trunc(value) == value;\n }\n\n static parseInt(value: string, radix: i32 = 0): f32 {\n return parseI64(value, radix);\n }\n\n static parseFloat(value: string): f32 {\n return parseFloat(value);\n }\n\n toString(this: f32): String {\n // TODO: radix\n return dtoa(this);\n }\n}\n\n@sealed\nexport abstract class F64 {\n\n @lazy static readonly EPSILON: f64 = f64.EPSILON;\n @lazy static readonly MIN_VALUE: f64 = f64.MIN_VALUE;\n @lazy static readonly MAX_VALUE: f64 = f64.MAX_VALUE;\n @lazy static readonly MIN_SAFE_INTEGER: f64 = f64.MIN_SAFE_INTEGER;\n @lazy static readonly MAX_SAFE_INTEGER: f64 = f64.MAX_SAFE_INTEGER;\n @lazy static readonly POSITIVE_INFINITY: f64 = Infinity;\n @lazy static readonly NEGATIVE_INFINITY: f64 = -Infinity;\n @lazy static readonly NaN: f64 = NaN;\n\n static isNaN(value: f64): bool {\n return builtin_isNaN(value);\n }\n\n static isFinite(value: f64): bool {\n return builtin_isFinite(value);\n }\n\n static isSafeInteger(value: f64): bool {\n return abs(value) <= f64.MAX_SAFE_INTEGER && trunc(value) == value;\n }\n\n static isInteger(value: f64): bool {\n return builtin_isFinite(value) && trunc(value) == value;\n }\n\n static parseInt(value: string, radix: i32 = 0): f64 {\n return parseI64(value, radix);\n }\n\n static parseFloat(value: string): f64 {\n return parseFloat(value);\n }\n\n toString(this: f64): String {\n // TODO: radix\n return dtoa(this);\n }\n}\n\nexport { F64 as Number };\n',polyfills:"export function bswap(value: T): T {\n if (isInteger()) {\n if (sizeof() == 2) {\n return ((value << 8) | ((value >> 8) & 0x00FF));\n }\n if (sizeof() == 4) {\n return (\n rotl(value & 0xFF00FF00, 8) |\n rotr(value & 0x00FF00FF, 8)\n );\n }\n if (sizeof() == 8) {\n let a = (value >> 8) & 0x00FF00FF00FF00FF;\n let b = (value & 0x00FF00FF00FF00FF) << 8;\n let v = a | b;\n\n a = (v >> 16) & 0x0000FFFF0000FFFF;\n b = (v & 0x0000FFFF0000FFFF) << 16;\n\n return rotr(a | b, 32);\n }\n return value;\n }\n assert(false);\n return value;\n}\n\n@inline\nexport function bswap16(value: T): T {\n if (isInteger() && sizeof() <= 4) {\n if (sizeof() == 2) {\n return ((value << 8) | ((value >> 8) & 0x00FF));\n } else if (sizeof() == 4) {\n return (((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000));\n }\n return value;\n }\n assert(false);\n return value;\n}\n",regexp:'export class RegExp {\n\n // @binding(CALL_NEW, [ STRING, STRING], OBJECT_HANDLE)\n constructor(pattern: string, flags: string = "") { throw new Error("unreachable"); }\n\n // @binding(CALL_THIS, [ STRING ], PASS_THRU)\n test(search: string): bool { throw new Error("unreachable"); }\n\n // @binding(CALL_THIS, [], STRING)\n toString(): string { throw new Error("unreachable"); }\n\n}\n',set:'import {\n HEADER_SIZE as HEADER_SIZE_AB\n} from "./internal/arraybuffer";\n\nimport {\n HASH\n} from "./internal/hash";\n\n// A deterministic hash set based on CloseTable from https://github.com/jorendorff/dht\n\n@inline const INITIAL_CAPACITY = 4;\n@inline const FILL_FACTOR: f64 = 8 / 3;\n@inline const FREE_FACTOR: f64 = 3 / 4;\n\n/** Structure of a set entry. */\n@unmanaged class SetEntry {\n key: K;\n taggedNext: usize; // LSB=1 indicates EMPTY\n}\n\n/** Empty bit. */\n@inline const EMPTY: usize = 1 << 0;\n\n/** Size of a bucket. */\n@inline const BUCKET_SIZE = sizeof();\n\n/** Computes the alignment of an entry. */\n@inline function ENTRY_ALIGN(): usize {\n // can align to 4 instead of 8 if 32-bit and K is <= 32-bits\n const align = (sizeof() > sizeof() ? sizeof() : sizeof()) - 1;\n return align;\n}\n\n/** Computes the aligned size of an entry. */\n@inline function ENTRY_SIZE(): usize {\n const align = ENTRY_ALIGN();\n const size = (offsetof>() + align) & ~align;\n return size;\n}\n\nexport class Set {\n\n // buckets holding references to the respective first entry within\n private buckets: ArrayBuffer; // usize[bucketsMask + 1]\n private bucketsMask: u32;\n\n // entries in insertion order\n private entries: ArrayBuffer; // SetEntry[entriesCapacity]\n private entriesCapacity: i32;\n private entriesOffset: i32;\n private entriesCount: i32;\n\n get size(): i32 { return this.entriesCount; }\n\n constructor() { this.clear(); }\n\n clear(): void {\n const bucketsSize = INITIAL_CAPACITY * BUCKET_SIZE;\n this.buckets = new ArrayBuffer(bucketsSize);\n this.bucketsMask = INITIAL_CAPACITY - 1;\n const entriesSize = INITIAL_CAPACITY * ENTRY_SIZE();\n this.entries = new ArrayBuffer(entriesSize, true);\n this.entriesCapacity = INITIAL_CAPACITY;\n this.entriesOffset = 0;\n this.entriesCount = 0;\n }\n\n private find(key: K, hashCode: u32): SetEntry | null {\n var entry = load>(\n changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE,\n HEADER_SIZE_AB\n );\n while (entry) {\n if (!(entry.taggedNext & EMPTY) && entry.key == key) return entry;\n entry = changetype>(entry.taggedNext & ~EMPTY);\n }\n return null;\n }\n\n has(key: K): bool {\n return this.find(key, HASH(key)) !== null;\n }\n\n add(key: K): void {\n var hashCode = HASH(key);\n var entry = this.find(key, hashCode);\n if (!entry) {\n // check if rehashing is necessary\n if (this.entriesOffset == this.entriesCapacity) {\n this.rehash(\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ? this.bucketsMask // just rehash if 1/4+ entries are empty\n : (this.bucketsMask << 1) | 1 // grow capacity to next 2^N\n );\n }\n // append new entry\n let entries = this.entries;\n entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + this.entriesOffset++ * ENTRY_SIZE()\n );\n entry.key = key;\n ++this.entriesCount;\n // link with previous entry in bucket\n let bucketPtrBase = changetype(this.buckets) + (hashCode & this.bucketsMask) * BUCKET_SIZE;\n entry.taggedNext = load(bucketPtrBase, HEADER_SIZE_AB);\n store(bucketPtrBase, changetype(entry), HEADER_SIZE_AB);\n if (isManaged()) __gc_link(changetype(this), changetype(key)); // tslint:disable-line\n }\n }\n\n delete(key: K): bool {\n var entry = this.find(key, HASH(key));\n if (!entry) return false;\n entry.taggedNext |= EMPTY;\n --this.entriesCount;\n // check if rehashing is appropriate\n var halfBucketsMask = this.bucketsMask >> 1;\n if (\n halfBucketsMask + 1 >= max(INITIAL_CAPACITY, this.entriesCount) &&\n this.entriesCount < (this.entriesCapacity * FREE_FACTOR)\n ) this.rehash(halfBucketsMask);\n return true;\n }\n\n private rehash(newBucketsMask: u32): void {\n var newBucketsCapacity = (newBucketsMask + 1);\n var newBuckets = new ArrayBuffer(newBucketsCapacity * BUCKET_SIZE);\n var newEntriesCapacity = (newBucketsCapacity * FILL_FACTOR);\n var newEntries = new ArrayBuffer(newEntriesCapacity * ENTRY_SIZE(), true);\n\n // copy old entries to new entries\n var oldPtr = changetype(this.entries) + HEADER_SIZE_AB;\n var oldEnd = oldPtr + this.entriesOffset * ENTRY_SIZE();\n var newPtr = changetype(newEntries) + HEADER_SIZE_AB;\n while (oldPtr != oldEnd) {\n let oldEntry = changetype>(oldPtr);\n if (!(oldEntry.taggedNext & EMPTY)) {\n let newEntry = changetype>(newPtr);\n newEntry.key = oldEntry.key;\n let newBucketIndex = HASH(oldEntry.key) & newBucketsMask;\n let newBucketPtrBase = changetype(newBuckets) + newBucketIndex * BUCKET_SIZE;\n newEntry.taggedNext = load(newBucketPtrBase, HEADER_SIZE_AB);\n store(newBucketPtrBase, newPtr, HEADER_SIZE_AB);\n newPtr += ENTRY_SIZE();\n }\n oldPtr += ENTRY_SIZE();\n }\n\n this.buckets = newBuckets;\n this.bucketsMask = newBucketsMask;\n this.entries = newEntries;\n this.entriesCapacity = newEntriesCapacity;\n this.entriesOffset = this.entriesCount;\n }\n\n toString(): string {\n return "[object Set]";\n }\n\n private __gc(): void {\n __gc_mark(changetype(this.buckets)); // tslint:disable-line\n var entries = this.entries;\n __gc_mark(changetype(entries)); // tslint:disable-line\n if (isManaged()) {\n let offset: usize = 0;\n let end: usize = this.entriesOffset * ENTRY_SIZE();\n while (offset < end) {\n let entry = changetype>(\n changetype(entries) + HEADER_SIZE_AB + offset * ENTRY_SIZE()\n );\n if (!(entry.taggedNext & EMPTY)) __gc_mark(changetype(entry.key)); // tslint:disable-line\n offset += ENTRY_SIZE();\n }\n }\n }\n}\n',string:'import {\n HEADER_SIZE,\n MAX_LENGTH,\n allocateUnsafe,\n compareUnsafe,\n repeatUnsafe,\n copyUnsafe,\n isWhiteSpaceOrLineTerminator,\n CharCode,\n parse\n} from "./internal/string";\n\nimport {\n STORE\n} from "./internal/arraybuffer";\n\n@sealed\nexport class String {\n\n readonly length: i32; // capped to [0, MAX_LENGTH]\n\n // TODO Add and handle second argument\n static fromCharCode(code: i32): String {\n var out = allocateUnsafe(1);\n store(\n changetype(out),\n code,\n HEADER_SIZE\n );\n return out;\n }\n\n static fromCodePoint(code: i32): String {\n assert(code <= 0x10FFFF);\n var sur = code > 0xFFFF;\n var out = allocateUnsafe(sur + 1);\n if (!sur) {\n store(\n changetype(out),\n code,\n HEADER_SIZE\n );\n } else {\n code -= 0x10000;\n let hi: u32 = (code >>> 10) + 0xD800;\n let lo: u32 = (code & 0x3FF) + 0xDC00;\n store(\n changetype(out),\n (hi << 16) | lo,\n HEADER_SIZE\n );\n }\n return out;\n }\n\n @operator("[]")\n charAt(pos: i32): String {\n assert(this !== null);\n\n if (pos >= this.length) return changetype("");\n\n var out = allocateUnsafe(1);\n store(\n changetype(out),\n load(\n changetype(this) + (pos << 1),\n HEADER_SIZE\n ),\n HEADER_SIZE\n );\n return out;\n }\n\n charCodeAt(pos: i32): i32 {\n assert(this !== null);\n if (pos >= this.length) return -1; // (NaN)\n\n return load(\n changetype(this) + (pos << 1),\n HEADER_SIZE\n );\n }\n\n codePointAt(pos: i32): i32 {\n assert(this !== null);\n if (pos >= this.length) return -1; // (undefined)\n\n var first = load(\n changetype(this) + (pos << 1),\n HEADER_SIZE\n );\n if (first < 0xD800 || first > 0xDBFF || pos + 1 == this.length) {\n return first;\n }\n var second = load(\n changetype(this) + ((pos + 1) << 1),\n HEADER_SIZE\n );\n if (second < 0xDC00 || second > 0xDFFF) return first;\n return ((first - 0xD800) << 10) + (second - 0xDC00) + 0x10000;\n }\n\n @operator("+")\n private static __concat(left: String, right: String): String {\n if (!changetype(left)) left = changetype("null");\n return left.concat(right);\n }\n\n concat(other: String): String {\n assert(this !== null);\n if (other === null) other = changetype("null");\n\n var thisLen: isize = this.length;\n var otherLen: isize = other.length;\n var outLen: usize = thisLen + otherLen;\n if (outLen == 0) return changetype("");\n var out = allocateUnsafe(outLen);\n copyUnsafe(out, 0, this, 0, thisLen);\n copyUnsafe(out, thisLen, other, 0, otherLen);\n return out;\n }\n\n endsWith(searchString: String, endPosition: i32 = MAX_LENGTH): bool {\n assert(this !== null);\n if (searchString === null) return false;\n var end = min(max(endPosition, 0), this.length);\n var searchLength: isize = searchString.length;\n var start: isize = end - searchLength;\n if (start < 0) return false;\n return !compareUnsafe(this, start, searchString, 0, searchLength);\n }\n\n @operator("==")\n private static __eq(left: String, right: String): bool {\n if (left === right) return true;\n if (left === null || right === null) return false;\n\n var leftLength = left.length;\n if (leftLength != right.length) return false;\n\n return !compareUnsafe(left, 0, right, 0, leftLength);\n }\n\n @operator("!=")\n private static __ne(left: String, right: String): bool {\n return !this.__eq(left, right);\n }\n\n @operator(">")\n private static __gt(left: String, right: String): bool {\n if (left === right || left === null || right === null) return false;\n\n var leftLength = left.length;\n var rightLength = right.length;\n\n if (!leftLength) return false;\n if (!rightLength) return true;\n\n var length = min(leftLength, rightLength);\n return compareUnsafe(left, 0, right, 0, length) > 0;\n }\n\n @operator(">=")\n private static __gte(left: String, right: String): bool {\n return !this.__lt(left, right);\n }\n\n @operator("<")\n private static __lt(left: String, right: String): bool {\n if (left === right || left === null || right === null) return false;\n\n var leftLength = left.length;\n var rightLength = right.length;\n\n if (!rightLength) return false;\n if (!leftLength) return true;\n\n var length = min(leftLength, rightLength);\n return compareUnsafe(left, 0, right, 0, length) < 0;\n }\n\n @operator("<=")\n private static __lte(left: String, right: String): bool {\n return !this.__gt(left, right);\n }\n\n @inline\n includes(searchString: String, position: i32 = 0): bool {\n return this.indexOf(searchString, position) != -1;\n }\n\n indexOf(searchString: String, fromIndex: i32 = 0): i32 {\n assert(this !== null);\n if (searchString === null) searchString = changetype("null");\n\n var searchLen: isize = searchString.length;\n if (!searchLen) return 0;\n var len: isize = this.length;\n if (!len) return -1;\n var start = min(max(fromIndex, 0), len);\n len -= searchLen;\n for (let k: isize = start; k <= len; ++k) {\n if (!compareUnsafe(this, k, searchString, 0, searchLen)) return k;\n }\n return -1;\n }\n\n lastIndexOf(searchString: String, fromIndex: i32 = i32.MAX_VALUE): i32 {\n assert(this !== null);\n if (searchString === null) searchString = changetype("null");\n\n var len: isize = this.length;\n var searchLen: isize = searchString.length;\n if (!searchLen) return len;\n if (!len) return -1;\n var start = min(max(fromIndex, 0), len - searchLen);\n for (let k = start; k >= 0; --k) {\n if (!compareUnsafe(this, k, searchString, 0, searchLen)) return k;\n }\n return -1;\n }\n\n startsWith(searchString: String, position: i32 = 0): bool {\n assert(this !== null);\n if (searchString === null) searchString = changetype("null");\n\n var pos: isize = position;\n var len: isize = this.length;\n var start = min(max(pos, 0), len);\n var searchLength: isize = searchString.length;\n if (searchLength + start > len) return false;\n return !compareUnsafe(this, start, searchString, 0, searchLength);\n }\n\n substr(start: i32, length: i32 = i32.MAX_VALUE): String {\n assert(this !== null);\n var intStart: isize = start;\n var end: isize = length;\n var size: isize = this.length;\n if (intStart < 0) intStart = max(size + intStart, 0);\n var resultLength = min(max(end, 0), size - intStart);\n if (resultLength <= 0) return changetype("");\n var out = allocateUnsafe(resultLength);\n copyUnsafe(out, 0, this, intStart, resultLength);\n return out;\n }\n\n substring(start: i32, end: i32 = i32.MAX_VALUE): String {\n assert(this !== null);\n var len = this.length;\n var finalStart = min(max(start, 0), len);\n var finalEnd = min(max(end, 0), len);\n var from = min(finalStart, finalEnd);\n var to = max(finalStart, finalEnd);\n len = to - from;\n if (!len) return changetype("");\n if (!from && to == this.length) return this;\n var out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, from, len);\n return out;\n }\n\n trim(): String {\n assert(this !== null);\n var length: usize = this.length;\n\n while (\n length &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (length << 1), HEADER_SIZE)\n )\n ) {\n --length;\n }\n var start: usize = 0;\n while (\n start < length &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (start << 1), HEADER_SIZE)\n )\n ) {\n ++start, --length;\n }\n if (!length) return changetype("");\n if (!start && length == this.length) return this;\n var out = allocateUnsafe(length);\n copyUnsafe(out, 0, this, start, length);\n return out;\n }\n\n @inline\n trimLeft(): String {\n return this.trimStart();\n }\n\n @inline\n trimRight(): String {\n return this.trimEnd();\n }\n\n trimStart(): String {\n assert(this !== null);\n var start: isize = 0;\n var len: isize = this.length;\n while (\n start < len &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (start << 1), HEADER_SIZE)\n )\n ) {\n ++start;\n }\n if (!start) return this;\n var outLen = len - start;\n if (!outLen) return changetype("");\n var out = allocateUnsafe(outLen);\n copyUnsafe(out, 0, this, start, outLen);\n return out;\n }\n\n trimEnd(): String {\n assert(this !== null);\n var len: isize = this.length;\n while (\n len > 0 &&\n isWhiteSpaceOrLineTerminator(\n load(changetype(this) + (len << 1), HEADER_SIZE)\n )\n ) {\n --len;\n }\n if (len <= 0) return changetype("");\n if (len == this.length) return this;\n var out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, 0, len);\n return out;\n }\n\n padStart(targetLength: i32, padString: String = changetype(" ")): String {\n assert(this !== null);\n var length = this.length;\n var padLen = padString.length;\n if (targetLength < length || !padLen) return this;\n var len = targetLength - length;\n var out = allocateUnsafe(targetLength);\n if (len > padLen) {\n let count = (len - 1) / padLen;\n let base = count * padLen;\n let rest = len - base;\n repeatUnsafe(out, 0, padString, count);\n if (rest) copyUnsafe(out, base, padString, 0, rest);\n } else {\n copyUnsafe(out, 0, padString, 0, len);\n }\n if (length) copyUnsafe(out, len, this, 0, length);\n return out;\n }\n\n padEnd(targetLength: i32, padString: String = changetype(" ")): String {\n assert(this !== null);\n var length = this.length;\n var padLen = padString.length;\n if (targetLength < length || !padLen) return this;\n var len = targetLength - length;\n var out = allocateUnsafe(targetLength);\n if (length) copyUnsafe(out, 0, this, 0, length);\n if (len > padLen) {\n let count = (len - 1) / padLen;\n let base = count * padLen;\n let rest = len - base;\n repeatUnsafe(out, length, padString, count);\n if (rest) copyUnsafe(out, base + length, padString, 0, rest);\n } else {\n copyUnsafe(out, length, padString, 0, len);\n }\n return out;\n }\n\n repeat(count: i32 = 0): String {\n assert(this !== null);\n var length = this.length;\n\n // Most browsers can\'t handle strings 1 << 28 chars or longer\n if (count < 0 || length * count > (1 << 28)) {\n throw new RangeError("Invalid count value");\n }\n\n if (count == 0 || !length) return changetype("");\n if (count == 1) return this;\n\n var result = allocateUnsafe(length * count);\n repeatUnsafe(result, 0, this, count);\n return result;\n }\n\n slice(beginIndex: i32, endIndex: i32 = i32.MAX_VALUE): String {\n var length = this.length;\n var begin = (beginIndex < 0) ? max(beginIndex + length, 0) : min(beginIndex, length);\n var end = (endIndex < 0) ? max(endIndex + length, 0) : min(endIndex, length);\n var len = end - begin;\n if (len <= 0) return changetype("");\n var out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, begin, len);\n return out;\n }\n\n split(separator: String = null, limit: i32 = i32.MAX_VALUE): String[] {\n assert(this !== null);\n if (!limit) return new Array();\n if (separator === null) return [this];\n var length: isize = this.length;\n var sepLen: isize = separator.length;\n if (limit < 0) limit = i32.MAX_VALUE;\n if (!sepLen) {\n if (!length) return new Array();\n // split by chars\n length = min(length, limit);\n let result = new Array(length);\n let buffer = result.buffer_;\n for (let i: isize = 0; i < length; ++i) {\n let char = allocateUnsafe(1);\n store(\n changetype(char),\n load(\n changetype(this) + (i << 1),\n HEADER_SIZE\n ),\n HEADER_SIZE\n );\n STORE(buffer, i, char);\n }\n return result;\n } else if (!length) {\n let result = new Array(1);\n unchecked(result[0] = changetype(""));\n return result;\n }\n var result = new Array();\n var end = 0, start = 0, i = 0;\n while ((end = this.indexOf(separator, start)) != -1) {\n let len = end - start;\n if (len > 0) {\n let out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, start, len);\n result.push(out);\n } else {\n result.push(changetype(""));\n }\n if (++i == limit) return result;\n start = end + sepLen;\n }\n if (!start) {\n let result = new Array(1);\n unchecked(result[0] = this);\n return result;\n }\n var len = length - start;\n if (len > 0) {\n let out = allocateUnsafe(len);\n copyUnsafe(out, 0, this, start, len);\n result.push(out);\n } else {\n result.push(changetype(""));\n }\n return result;\n }\n\n toString(): String {\n return this;\n }\n\n get lengthUTF8(): i32 {\n var len = 1; // null terminated\n var pos: usize = 0;\n var end = this.length;\n while (pos < end) {\n let c = load(changetype(this) + (pos << 1), HEADER_SIZE);\n if (c < 128) {\n len += 1; ++pos;\n } else if (c < 2048) {\n len += 2; ++pos;\n } else {\n if (\n (c & 0xFC00) == 0xD800 && pos + 1 < end &&\n (load(changetype(this) + ((pos + 1) << 1), HEADER_SIZE) & 0xFC00) == 0xDC00\n ) {\n len += 4; pos += 2;\n } else {\n len += 3; ++pos;\n }\n }\n }\n return len;\n }\n\n static fromUTF8(ptr: usize, len: usize): String {\n if (len < 1) return changetype("");\n var ptrPos = 0;\n var buf = memory.allocate(len << 1);\n var bufPos = 0;\n while (ptrPos < len) {\n let cp = load(ptr + ptrPos++);\n if (cp < 128) {\n store(buf + bufPos, cp);\n bufPos += 2;\n } else if (cp > 191 && cp < 224) {\n assert(ptrPos + 1 <= len);\n store(buf + bufPos, (cp & 31) << 6 | load(ptr + ptrPos++) & 63);\n bufPos += 2;\n } else if (cp > 239 && cp < 365) {\n assert(ptrPos + 3 <= len);\n cp = (\n (cp & 7) << 18 |\n (load(ptr + ptrPos++) & 63) << 12 |\n (load(ptr + ptrPos++) & 63) << 6 |\n load(ptr + ptrPos++) & 63\n ) - 0x10000;\n store(buf + bufPos, 0xD800 + (cp >> 10));\n bufPos += 2;\n store(buf + bufPos, 0xDC00 + (cp & 1023));\n bufPos += 2;\n } else {\n assert(ptrPos + 2 <= len);\n store(buf + bufPos,\n (cp & 15) << 12 |\n (load(ptr + ptrPos++) & 63) << 6 |\n load(ptr + ptrPos++) & 63\n );\n bufPos += 2;\n }\n }\n assert(ptrPos == len);\n var str = allocateUnsafe((bufPos >> 1));\n memory.copy(changetype(str) + HEADER_SIZE, buf, bufPos);\n memory.free(buf);\n return str;\n }\n\n toUTF8(): usize {\n var buf = memory.allocate(this.lengthUTF8);\n var pos: usize = 0;\n var end = this.length;\n var off: usize = 0;\n while (pos < end) {\n let c1 = load(changetype(this) + (pos << 1), HEADER_SIZE);\n if (c1 < 128) {\n store(buf + off, c1);\n ++off; ++pos;\n } else if (c1 < 2048) {\n let ptr = buf + off;\n store(ptr, c1 >> 6 | 192);\n store(ptr, c1 & 63 | 128, 1);\n off += 2; ++pos;\n } else {\n let ptr = buf + off;\n if ((c1 & 0xFC00) == 0xD800 && pos + 1 < end) {\n let c2 = load(changetype(this) + ((pos + 1) << 1), HEADER_SIZE);\n if ((c2 & 0xFC00) == 0xDC00) {\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\n store(ptr, c1 >> 18 | 240);\n store(ptr, c1 >> 12 & 63 | 128, 1);\n store(ptr, c1 >> 6 & 63 | 128, 2);\n store(ptr, c1 & 63 | 128, 3);\n off += 4; pos += 2;\n continue;\n }\n }\n store(ptr, c1 >> 12 | 224);\n store(ptr, c1 >> 6 & 63 | 128, 1);\n store(ptr, c1 & 63 | 128, 2);\n off += 3; ++pos;\n }\n }\n store(buf + off, 0);\n return buf;\n }\n}\n\nexport type string = String;\n\nexport function parseInt(str: String, radix: i32 = 0): f64 {\n return parse(str, radix);\n}\n\nexport function parseI32(str: String, radix: i32 = 0): i32 {\n return parse(str, radix);\n}\n\nexport function parseI64(str: String, radix: i32 = 0): i64 {\n return parse(str, radix);\n}\n\n// FIXME: naive implementation\nexport function parseFloat(str: String): f64 {\n var len: i32 = str.length;\n if (!len) return NaN;\n\n var ptr = changetype(str) /* + HEAD -> offset */;\n var code = load(ptr, HEADER_SIZE);\n\n // determine sign\n var sign: f64;\n if (code == CharCode.MINUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = -1;\n } else if (code == CharCode.PLUS) {\n if (!--len) return NaN;\n code = load(ptr += 2, HEADER_SIZE);\n sign = 1;\n } else {\n sign = 1;\n }\n\n // calculate value\n var num: f64 = 0;\n while (len--) {\n code = load(ptr, HEADER_SIZE);\n if (code == CharCode.DOT) {\n ptr += 2;\n let fac: f64 = 0.1; // precision :(\n while (len--) {\n code = load(ptr, HEADER_SIZE);\n if (code == CharCode.E || code == CharCode.e) {\n assert(false); // TODO\n }\n code -= CharCode._0;\n if (code > 9) break;\n num += code * fac;\n fac *= 0.1;\n ptr += 2;\n }\n break;\n }\n code -= CharCode._0;\n if (code >= 10) break;\n num = (num * 10) + code;\n ptr += 2;\n }\n return sign * num;\n}\n',symbol:'import { Map } from "./map";\n\n@lazy var stringToId: Map;\n@lazy var idToString: Map;\n@lazy var nextId: usize = 12; // Symbol.unscopables + 1\n\n@unmanaged export class symbol {\n toString(): string {\n var id = changetype(this);\n var str = "";\n switch (id) {\n case 1: { str = "hasInstance"; break; }\n case 2: { str = "isConcatSpreadable"; break; }\n case 3: { str = "isRegExp"; break; }\n case 4: { str = "match"; break; }\n case 5: { str = "replace"; break; }\n case 6: { str = "search"; break; }\n case 7: { str = "species"; break; }\n case 8: { str = "split"; break; }\n case 9: { str = "toPrimitive"; break; }\n case 10: { str = "toStringTag"; break; }\n case 11: { str = "unscopables"; break; }\n default: {\n if (idToString !== null && idToString.has(id)) str = idToString.get(id);\n break;\n }\n }\n return "Symbol(" + str + ")";\n }\n}\n\nexport function Symbol(description: string | null = null): symbol {\n var id = nextId++;\n if (!id) unreachable(); // out of ids\n return changetype(id);\n}\n\nexport namespace Symbol {\n\n // well-known symbols\n @lazy export const hasInstance = changetype(1);\n @lazy export const isConcatSpreadable = changetype(2);\n @lazy export const isRegExp = changetype(3);\n @lazy export const iterator = changetype(3);\n @lazy export const match = changetype(4);\n @lazy export const replace = changetype(5);\n @lazy export const search = changetype(6);\n @lazy export const species = changetype(7);\n @lazy export const split = changetype(8);\n @lazy export const toPrimitive = changetype(9);\n @lazy export const toStringTag = changetype(10);\n @lazy export const unscopables = changetype(11);\n\n /* tslint:disable */// not valid TS\n export function for(key: string): symbol {\n if (!stringToId) { stringToId = new Map(); idToString = new Map(); }\n else if (stringToId.has(key)) return changetype(stringToId.get(key));\n var id = nextId++;\n if (!id) unreachable(); // out of ids\n stringToId.set(key, id);\n idToString.set(id, key);\n return changetype(id);\n }\n /* tslint:enable */\n\n export function keyFor(sym: symbol): string | null {\n return idToString !== null && idToString.has(changetype(sym))\n ? idToString.get(changetype(sym))\n : null;\n }\n}\n',table:"export namespace table {\n\n // export function copy(dst: u32, src: u32, n: u32): void {\n // __table_copy(dst, src, n);\n // }\n\n // Passive elements\n\n // export function init(elementIndex: u32, srcOffset: u32, dstOffset: u32, n: u32): void {\n // __table_init(elementIndex, srcOffset, dstOffset, n);\n // }\n\n // export function drop(elementIndex: u32): void {\n // __table_drop(elementIndex);\n // }\n}\n",typedarray:"import {\n TypedArray,\n FILL,\n SORT,\n SUBARRAY,\n REDUCE,\n REDUCE_RIGHT,\n MAP,\n FIND_INDEX,\n SOME,\n EVERY,\n} from \"./internal/typedarray\";\n\nimport {\n COMPARATOR\n} from \"./internal/sort\";\n\nfunction clampToByte(value: i32): i32 {\n return ~(value >> 31) & (((255 - value) >> 31) | value); // & 255\n}\n\nexport class Int8Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int8Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i8, b: i8) => i32 = COMPARATOR()): Int8Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int8Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i8, index: i32, array: Int8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i8, index: i32, array: Int8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i8, index: i32, self: Int8Array) => i8): Int8Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i8, index: i32, self: Int8Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i8, index: i32, self: Int8Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i8, index: i32, self: Int8Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint8Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u8, b: u8) => i32 = COMPARATOR()): Uint8Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint8Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u8, index: i32, array: Uint8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u8, index: i32, array: Uint8Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u8, index: i32, self: Uint8Array) => u8): Uint8Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u8, index: i32, self: Uint8Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u8, index: i32, self: Uint8Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u8, index: i32, self: Uint8Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint8ClampedArray extends Uint8Array {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n @inline @operator(\"[]=\")\n protected __set(index: i32, value: i32): void {\n super.__set(index, clampToByte(value));\n }\n\n @inline @operator(\"{}=\")\n protected __unchecked_set(index: i32, value: i32): void {\n super.__unchecked_set(index, clampToByte(value));\n }\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint8ClampedArray {\n return changetype(super.fill(value, start, end)); // safe because '.fill' reuses 'this'\n }\n\n sort(comparator: (a: u8, b: u8) => i32 = COMPARATOR()): Uint8ClampedArray {\n return changetype(super.sort(comparator)); // safe because '.sort' reuses 'this'\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint8ClampedArray {\n return SUBARRAY(this, begin, end);\n }\n\n map(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => u8): Uint8ClampedArray {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u8, index: i32, self: Uint8ClampedArray) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Int16Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int16Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i16, b: i16) => i32 = COMPARATOR()): Int16Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int16Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i16, index: i32, array: Int16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i16, index: i32, array: Int16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i16, index: i32, self: Int16Array) => i16): Int16Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i16, index: i32, self: Int16Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i16, index: i32, self: Int16Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i16, index: i32, self: Int16Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint16Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint16Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u16, b: u16) => i32 = COMPARATOR()): Uint16Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint16Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u16, index: i32, array: Uint16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u16, index: i32, array: Uint16Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u16, index: i32, self: Uint16Array) => u16): Uint16Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u16, index: i32, self: Uint16Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u16, index: i32, self: Uint16Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u16, index: i32, self: Uint16Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Int32Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int32Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i32, b: i32) => i32 = COMPARATOR()): Int32Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int32Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i32, index: i32, array: Int32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i32, index: i32, array: Int32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i32, index: i32, self: Int32Array) => i32): Int32Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i32, index: i32, self: Int32Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i32, index: i32, self: Int32Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i32, index: i32, self: Int32Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint32Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint32Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u32, b: u32) => i32 = COMPARATOR()): Uint32Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint32Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u32, index: i32, array: Uint32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u32, index: i32, array: Uint32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u32, index: i32, self: Uint32Array) => u32): Uint32Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u32, index: i32, self: Uint32Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u32, index: i32, self: Uint32Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u32, index: i32, self: Uint32Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Int64Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: i64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Int64Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: i64, b: i64) => i32 = COMPARATOR()): Int64Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Int64Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: i64, index: i32, array: Int64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: i64, index: i32, array: Int64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: i64, index: i32, self: Int64Array) => i64): Int64Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: i64, index: i32, self: Int64Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: i64, index: i32, self: Int64Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: i64, index: i32, self: Int64Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Uint64Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: u64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Uint64Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: u64, b: u64) => i32 = COMPARATOR()): Uint64Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Uint64Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: u64, index: i32, array: Uint64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: u64, index: i32, array: Uint64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: u64, index: i32, self: Uint64Array) => u64): Uint64Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: u64, index: i32, self: Uint64Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: u64, index: i32, self: Uint64Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: u64, index: i32, self: Uint64Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Float32Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: f32, start: i32 = 0, end: i32 = i32.MAX_VALUE): Float32Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: f32, b: f32) => i32 = COMPARATOR()): Float32Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Float32Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: f32, index: i32, array: Float32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: f32, index: i32, array: Float32Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: f32, index: i32, self: Float32Array) => f32): Float32Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: f32, index: i32, self: Float32Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: f32, index: i32, self: Float32Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: f32, index: i32, self: Float32Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n\nexport class Float64Array extends TypedArray {\n @lazy static readonly BYTES_PER_ELEMENT: usize = sizeof();\n\n fill(value: f64, start: i32 = 0, end: i32 = i32.MAX_VALUE): Float64Array {\n return FILL(this, value, start, end);\n }\n\n sort(comparator: (a: f64, b: f64) => i32 = COMPARATOR()): Float64Array {\n return SORT(this, comparator);\n }\n\n subarray(begin: i32 = 0, end: i32 = 0x7fffffff): Float64Array {\n return SUBARRAY(this, begin, end);\n }\n\n reduce(\n callbackfn: (accumulator: T, value: f64, index: i32, array: Float64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE(this, callbackfn, initialValue);\n }\n\n reduceRight(\n callbackfn: (accumulator: T, value: f64, index: i32, array: Float64Array) => T,\n initialValue: T,\n ): T {\n return REDUCE_RIGHT(this, callbackfn, initialValue);\n }\n\n map(callbackfn: (value: f64, index: i32, self: Float64Array) => f64): Float64Array {\n return MAP(this, callbackfn);\n }\n\n findIndex(callbackfn: (value: f64, index: i32, self: Float64Array) => bool): i32 {\n return FIND_INDEX(this, callbackfn);\n }\n\n some(callbackfn: (value: f64, index: i32, self: Float64Array) => bool): bool {\n return SOME(this, callbackfn);\n }\n\n every(callbackfn: (value: f64, index: i32, self: Float64Array) => bool): bool {\n return EVERY(this, callbackfn);\n }\n}\n",vector:"@sealed\nexport abstract class V128 {\n}\n"}):(()=>{const e=path.join(".","..","std","assembly"),n=__webpack_require__(!function(){var e=new Error("Cannot find module 'glob'");throw e.code="MODULE_NOT_FOUND",e}()).sync("**/!(*.d).ts",{cwd:e}),t={};return n.forEach(n=>t[n.replace(/\.ts$/,"")]=fs.readFileSync(path.join(e,n),"utf8")),t})(),exports.definitionFiles=exports.isBundle?Object({assembly:'/**\n * Environment definitions for compiling AssemblyScript to WebAssembly using asc.\n * @module std/assembly\n *//***/\n\n/// \n\n// Types\n\n/** An 8-bit signed integer. */\ndeclare type i8 = number;\n/** A 16-bit signed integer. */\ndeclare type i16 = number;\n/** A 32-bit signed integer. */\ndeclare type i32 = number;\n/** A 64-bit signed integer. */\ndeclare type i64 = number;\n/** A 32-bit signed integer when targeting 32-bit WebAssembly or a 64-bit signed integer when targeting 64-bit WebAssembly. */\ndeclare type isize = number;\n/** An 8-bit unsigned integer. */\ndeclare type u8 = number;\n/** A 16-bit unsigned integer. */\ndeclare type u16 = number;\n/** A 32-bit unsigned integer. */\ndeclare type u32 = number;\n/** A 64-bit unsigned integer. */\ndeclare type u64 = number;\n/** A 32-bit unsigned integer when targeting 32-bit WebAssembly or a 64-bit unsigned integer when targeting 64-bit WebAssembly. */\ndeclare type usize = number;\n/** A 1-bit unsigned integer. */\ndeclare type bool = boolean | number;\n/** A 32-bit float. */\ndeclare type f32 = number;\n/** A 64-bit float. */\ndeclare type f64 = number;\n\n// Compiler hints\n\n/** Compiler target. 0 = JS, 1 = WASM32, 2 = WASM64. */\ndeclare const ASC_TARGET: i32;\n/** Provided noAssert option. */\ndeclare const ASC_NO_ASSERT: bool;\n/** Provided memoryBase option. */\ndeclare const ASC_MEMORY_BASE: i32;\n/** Provided optimizeLevel option. */\ndeclare const ASC_OPTIMIZE_LEVEL: i32;\n/** Provided shrinkLevel option. */\ndeclare const ASC_SHRINK_LEVEL: i32;\n/** Whether the mutable global feature is enabled. */\ndeclare const ASC_FEATURE_MUTABLE_GLOBAL: bool;\n/** Whether the sign extension feature is enabled. */\ndeclare const ASC_FEATURE_SIGN_EXTENSION: bool;\n\n// Builtins\n\n/** Performs the sign-agnostic count leading zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered leading if the value is zero. */\ndeclare function clz(value: T): T;\n/** Performs the sign-agnostic count tailing zero bits operation on a 32-bit or 64-bit integer. All zero bits are considered trailing if the value is zero. */\ndeclare function ctz(value: T): T;\n/** Performs the sign-agnostic count number of one bits operation on a 32-bit or 64-bit integer. */\ndeclare function popcnt(value: T): T;\n/** Performs the sign-agnostic rotate left operation on a 32-bit or 64-bit integer. */\ndeclare function rotl(value: T, shift: T): T;\n/** Performs the sign-agnostic rotate right operation on a 32-bit or 64-bit integer. */\ndeclare function rotr(value: T, shift: T): T;\n/** Computes the absolute value of an integer or float. */\ndeclare function abs(value: T): T;\n/** Determines the maximum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function max(left: T, right: T): T;\n/** Determines the minimum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function min(left: T, right: T): T;\n/** Performs the ceiling operation on a 32-bit or 64-bit float. */\ndeclare function ceil(value: T): T;\n/** Composes a 32-bit or 64-bit float from the magnitude of `x` and the sign of `y`. */\ndeclare function copysign(x: T, y: T): T;\n/** Performs the floor operation on a 32-bit or 64-bit float. */\ndeclare function floor(value: T): T;\n/** Rounds to the nearest integer tied to even of a 32-bit or 64-bit float. */\ndeclare function nearest(value: T): T;\n/** Reinterprets the bits of the specified value as type `T`. Valid reinterpretations are u32/i32 to/from f32 and u64/i64 to/from f64. */\ndeclare function reinterpret(value: number): T;\n/** Selects one of two pre-evaluated values depending on the condition. */\ndeclare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n/** Calculates the square root of a 32-bit or 64-bit float. */\ndeclare function sqrt(value: T): T;\n/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */\ndeclare function trunc(value: T): T;\n/** Loads a value of the specified type from memory. Equivalent to dereferncing a pointer in other languages. */\ndeclare function load(ptr: usize, constantOffset?: usize): T;\n/** Stores a value of the specified type to memory. Equivalent to dereferencing a pointer in other languages when assigning a value. */\ndeclare function store(ptr: usize, value: any, constantOffset?: usize): void;\n/** Emits an unreachable operation that results in a runtime error when executed. Both a statement and an expression of any type. */\ndeclare function unreachable(): any; // sic\n\n/** NaN (not a number) as a 32-bit or 64-bit float depending on context. */\ndeclare const NaN: f32 | f64;\n/** Positive infinity as a 32-bit or 64-bit float depending on context. */\ndeclare const Infinity: f32 | f64;\n/** Heap base offset. */\ndeclare const HEAP_BASE: usize;\n/** Determines the byte size of the specified underlying core type. Compiles to a constant. */\ndeclare function sizeof(): usize;\n/** Determines the alignment (log2) of the specified underlying core type. Compiles to a constant. */\ndeclare function alignof(): usize;\n/** Determines the offset of the specified field within the given class type. Returns the class type\'s end offset if field name has been omitted. Compiles to a constant. */\ndeclare function offsetof(fieldName?: string): usize;\n/** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/\ndeclare function changetype(value: any): T;\n/** Explicitly requests no bounds checks on the provided expression. Useful for array accesses. */\ndeclare function unchecked(value: T): T;\n/** Emits a `call_indirect` instruction, calling the specified function in the function table by index with the specified arguments. Does result in a runtime error if the arguments do not match the called function. */\ndeclare function call_indirect(target: Function | u32, ...args: any[]): T;\n/** Instantiates a new instance of `T` using the specified constructor arguments. */\ndeclare function instantiate(...args: any[]): T;\n/** Tests if a 32-bit or 64-bit float is `NaN`. */\ndeclare function isNaN(value: T): bool;\n/** Tests if a 32-bit or 64-bit float is finite, that is not `NaN` or +/-`Infinity`. */\ndeclare function isFinite(value: T): bool;\n/** Tests if the specified type *or* expression is of an integer type and not a reference. Compiles to a constant. */\ndeclare function isInteger(value?: any): value is number;\n/** Tests if the specified type *or* expression is of a float type. Compiles to a constant. */\ndeclare function isFloat(value?: any): value is number;\n/** Tests if the specified type *or* expression can represent negative numbers. Compiles to a constant. */\ndeclare function isSigned(value?: any): value is number;\n/** Tests if the specified type *or* expression is of a reference type. Compiles to a constant. */\ndeclare function isReference(value?: any): value is object | string;\n/** Tests if the specified type *or* expression can be used as a string. Compiles to a constant. */\ndeclare function isString(value?: any): value is string | String;\n/** Tests if the specified type *or* expression can be used as an array. Compiles to a constant. */\ndeclare function isArray(value?: any): value is Array;\n/** Tests if the specified type *or* expression is of a function type. Compiles to a constant. */\ndeclare function isFunction(value?: any): value is (...args: any) => any;\n/** Tests if the specified type *or* expression is of a nullable reference type. Compiles to a constant. */\ndeclare function isNullable(value?: any): bool;\n/** Tests if the specified expression resolves to a defined element. Compiles to a constant. */\ndeclare function isDefined(expression: any): bool;\n/** Tests if the specified expression evaluates to a constant value. Compiles to a constant. */\ndeclare function isConstant(expression: any): bool;\n/** Tests if the specified type *or* expression is of a managed type. Compiles to a constant. */\ndeclare function isManaged(value?: any): bool;\n/** Traps if the specified value is not true-ish, otherwise returns the (non-nullable) value. */\ndeclare function assert(isTrueish: T, message?: string): T & object; // any better way to model `: T != null`?\n/** Parses an integer string to a 64-bit float. */\ndeclare function parseInt(str: string, radix?: i32): f64;\n/** Parses an integer string to a 32-bit integer. */\ndeclare function parseI32(str: string, radix?: i32): i32;\n/** Parses an integer string to a 64-bit integer. */\ndeclare function parseI64(str: string, radix?: i32): i64;\n/** Parses a string to a 64-bit float. */\ndeclare function parseFloat(str: string): f64;\n/** Returns the 64-bit floating-point remainder of `x/y`. */\ndeclare function fmod(x: f64, y: f64): f64;\n/** Returns the 32-bit floating-point remainder of `x/y`. */\ndeclare function fmodf(x: f32, y: f32): f32;\n\n/** Converts any other numeric value to an 8-bit signed integer. */\ndeclare function i8(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace i8 {\n /** Smallest representable value. */\n export const MIN_VALUE: i8;\n /** Largest representable value. */\n export const MAX_VALUE: i8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i8;\n}\n/** Converts any other numeric value to a 16-bit signed integer. */\ndeclare function i16(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace i16 {\n /** Smallest representable value. */\n export const MIN_VALUE: i16;\n /** Largest representable value. */\n export const MAX_VALUE: i16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i16;\n}\n/** Converts any other numeric value to a 32-bit signed integer. */\ndeclare function i32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i32;\ndeclare namespace i32 {\n /** Smallest representable value. */\n export const MIN_VALUE: i32;\n /** Largest representable value. */\n export const MAX_VALUE: i32;\n /** Loads an 8-bit signed integer from memory and returns it as a 32-bit integer. */\n export function load8_s(offset: usize, constantOffset?: usize): i32;\n /** Loads an 8-bit unsigned integer from memory and returns it as a 32-bit integer. */\n export function load8_u(offset: usize, constantOffset?: usize): i32;\n /** Loads a 16-bit signed integer from memory and returns it as a 32-bit integer. */\n export function load16_s(offset: usize, constantOffset?: usize): i32;\n /** Loads a 16-bit unsigned integer from memory and returns it as a 32-bit integer. */\n export function load16_u(offset: usize, constantOffset?: usize): i32;\n /** Loads a 32-bit integer from memory. */\n export function load(offset: usize, constantOffset?: usize): i32;\n /** Stores a 32-bit integer to memory as an 8-bit integer. */\n export function store8(offset: usize, value: i32, constantOffset?: usize): void;\n /** Stores a 32-bit integer to memory as a 16-bit integer. */\n export function store16(offset: usize, value: i32, constantOffset?: usize): void;\n /** Stores a 32-bit integer to memory. */\n export function store(offset: usize, value: i32, constantOffset?: usize): void;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i32;\n}\n/** Converts any other numeric value to a 64-bit signed integer. */\ndeclare function i64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i64;\ndeclare namespace i64 {\n /** Smallest representable value. */\n export const MIN_VALUE: i64;\n /** Largest representable value. */\n export const MAX_VALUE: i64;\n /** Loads an 8-bit signed integer from memory and returns it as a 64-bit signed integer. */\n export function load8_s(offset: usize, constantOffset?: usize): i64;\n /** Loads an 8-bit unsigned integer from memory and returns it as a 64-bit unsigned integer. */\n export function load8_u(offset: usize, constantOffset?: usize): u64;\n /** Loads a 16-bit signed integer from memory and returns it as a 64-bit signed integer. */\n export function load16_s(offset: usize, constantOffset?: usize): i64;\n /** Loads a 16-bit unsigned integer from memory and returns it as a 64-bit unsigned integer. */\n export function load16_u(offset: usize, constantOffset?: usize): u64;\n /** Loads a 32-bit signed integer from memory and returns it as a 64-bit signed integer. */\n export function load32_s(offset: usize, constantOffset?: usize): i64;\n /** Loads a 32-bit unsigned integer from memory and returns it as a 64-bit unsigned integer. */\n export function load32_u(offset: usize, constantOffset?: usize): u64;\n /** Loads a 64-bit unsigned integer from memory. */\n export function load(offset: usize, constantOffset?: usize): i64;\n /** Stores a 64-bit integer to memory as an 8-bit integer. */\n export function store8(offset: usize, value: i64, constantOffset?: usize): void;\n /** Stores a 64-bit integer to memory as a 16-bit integer. */\n export function store16(offset: usize, value: i64, constantOffset?: usize): void;\n /** Stores a 64-bit integer to memory as a 32-bit integer. */\n export function store32(offset: usize, value: i64, constantOffset?: usize): void;\n /** Stores a 64-bit integer to memory. */\n export function store(offset: usize, value: i64, constantOffset?: usize): void;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i64;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) signed integer. */\ndeclare var isize: typeof i32 | typeof i64;\n/** Converts any other numeric value to an 8-bit unsigned integer. */\ndeclare function u8(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace u8 {\n /** Smallest representable value. */\n export const MIN_VALUE: u8;\n /** Largest representable value. */\n export const MAX_VALUE: u8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u8;\n}\n/** Converts any other numeric value to a 16-bit unsigned integer. */\ndeclare function u16(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i8;\ndeclare namespace u16 {\n /** Smallest representable value. */\n export const MIN_VALUE: u16;\n /** Largest representable value. */\n export const MAX_VALUE: u16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u16;\n}\n/** Converts any other numeric value to a 32-bit unsigned integer. */\ndeclare function u32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i32;\ndeclare namespace u32 {\n /** Smallest representable value. */\n export const MIN_VALUE: u32;\n /** Largest representable value. */\n export const MAX_VALUE: u32;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u64;\n}\n/** Converts any other numeric value to a 64-bit unsigned integer. */\ndeclare function u64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): i64;\ndeclare namespace u64 {\n /** Smallest representable value. */\n export const MIN_VALUE: u64;\n /** Largest representable value. */\n export const MAX_VALUE: u64;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): u64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u64;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) unsigned integer. */\ndeclare var usize: typeof u32 | typeof u64;\n/** Converts any other numeric value to a 1-bit unsigned integer. */\ndeclare function bool(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): bool;\ndeclare namespace bool {\n /** Smallest representable value. */\n export const MIN_VALUE: bool;\n /** Largest representable value. */\n export const MAX_VALUE: bool;\n}\n/** Converts any other numeric value to a 32-bit float. */\ndeclare function f32(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): f32;\ndeclare namespace f32 {\n /** Smallest representable value. */\n export const MIN_VALUE: f32;\n /** Largest representable value. */\n export const MAX_VALUE: f32;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f32;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f32;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f32;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f32;\n /** Returns the floating-point remainder of `x / y` (rounded towards zero). */\n export function mod(x: f32, y: f32): f32;\n /** Returns the floating-point remainder of `x / y` (rounded to nearest). */\n export function rem(x: f32, y: f32): f32;\n /** Loads a 32-bit float from memory. */\n export function load(offset: usize, constantOffset?: usize): f32;\n /** Stores a 32-bit float to memory. */\n export function store(offset: usize, value: f32, constantOffset?: usize): void;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n export function isNaN(value: f32): bool;\n /** Returns true if passed value is finite. */\n export function isFinite(value: f32): bool;\n /** Returns true if the value passed is a safe integer. */\n export function isSafeInteger(value: f32): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n export function isInteger(value: f32): bool;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): f32;\n /** Converts a string to an integer. */\n export function parseInt(string: string, radix?: i32): f32;\n}\n/** Converts any other numeric value to a 64-bit float. */\ndeclare function f64(value: i8 | i16 | i32 | i64 | isize | u8 | u16 | u32 | u64 | usize | bool | f32 | f64): f64;\ndeclare namespace f64 {\n /** Smallest representable value. */\n export const MIN_VALUE: f64;\n /** Largest representable value. */\n export const MAX_VALUE: f64;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f64;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f64;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f64;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f64;\n /** Loads a 64-bit float from memory. */\n export function load(offset: usize, constantOffset?: usize): f64;\n /** Stores a 64-bit float to memory. */\n export function store(offset: usize, value: f64, constantOffset?: usize): void;\n}\n/** Macro type evaluating to the underlying native WebAssembly type. */\ndeclare type native = T;\n\n/** Pseudo-class representing the backing class of integer types. */\ndeclare class _Integer {\n /** Smallest representable value. */\n static readonly MIN_VALUE: number;\n /** Largest representable value. */\n static readonly MAX_VALUE: number;\n /** Converts a string to an integer of this type. */\n static parseInt(value: string, radix?: number): number;\n /** Converts this integer to a string. */\n toString(): string;\n}\n\n/** Pseudo-class representing the backing class of floating-point types. */\ndeclare class _Float {\n /** Difference between 1 and the smallest representable value greater than 1. */\n static readonly EPSILON: f32 | f64;\n /** Smallest representable value. */\n static readonly MIN_VALUE: f32 | f64;\n /** Largest representable value. */\n static readonly MAX_VALUE: f32 | f64;\n /** Smallest safely representable integer value. */\n static readonly MIN_SAFE_INTEGER: f32 | f64;\n /** Largest safely representable integer value. */\n static readonly MAX_SAFE_INTEGER: f32 | f64;\n /** Value representing positive infinity. */\n static readonly POSITIVE_INFINITY: f32 | f64;\n /** Value representing negative infinity. */\n static readonly NEGATIVE_INFINITY: f32 | f64;\n /** Value representing \'not a number\'. */\n static readonly NaN: f32 | f64;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n static isNaN(value: f32 | f64): bool;\n /** Returns true if passed value is finite. */\n static isFinite(value: f32 | f64): bool;\n /** Returns true if the value passed is a safe integer. */\n static isSafeInteger(value: f32 | f64): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n static isInteger(value: f32 | f64): bool;\n /** Converts A string to an integer. */\n static parseInt(value: string, radix?: i32): f32 | f64;\n /** Converts a string to a floating-point number. */\n static parseFloat(value: string): f32 | f64;\n /** Converts this floating-point number to a string. */\n toString(this: f64): string;\n}\n\n/** Backing class of signed 8-bit integers. */\ndeclare const I8: typeof _Integer;\n/** Backing class of signed 16-bit integers. */\ndeclare const I16: typeof _Integer;\n/** Backing class of signed 32-bit integers. */\ndeclare const I32: typeof _Integer;\n/** Backing class of signed 64-bit integers. */\ndeclare const I64: typeof _Integer;\n/** Backing class of signed size integers. */\ndeclare const Isize: typeof _Integer;\n/** Backing class of unsigned 8-bit integers. */\ndeclare const U8: typeof _Integer;\n/** Backing class of unsigned 16-bit integers. */\ndeclare const U16: typeof _Integer;\n/** Backing class of unsigned 32-bit integers. */\ndeclare const U32: typeof _Integer;\n/** Backing class of unsigned 64-bit integers. */\ndeclare const U64: typeof _Integer;\n/** Backing class of unsigned size integers. */\ndeclare const Usize: typeof _Integer;\n/** Backing class of 32-bit floating-point values. */\ndeclare const F32: typeof _Float;\n/** Backing class of 64-bit floating-point values. */\ndeclare const F64: typeof _Float;\n\n// User-defined diagnostic macros\n\n/** Emits a user-defined diagnostic error when encountered. */\ndeclare function ERROR(message?: any): void;\n/** Emits a user-defined diagnostic warning when encountered. */\ndeclare function WARNING(message?: any): void;\n/** Emits a user-defined diagnostic info when encountered. */\ndeclare function INFO(message?: any): void;\n\n// Polyfills\n\n/** Performs the sign-agnostic reverse bytes **/\ndeclare function bswap(value: T): T;\n/** Performs the sign-agnostic reverse bytes only for last 16-bit **/\ndeclare function bswap16(value: T): T;\n\n// Standard library\n\n/** Memory operations. */\ndeclare namespace memory {\n /** Returns the current memory size in units of pages. One page is 64kb. */\n export function size(): i32;\n /** Grows linear memory by a given unsigned delta of pages. One page is 64kb. Returns the previous memory size in units of pages or `-1` on failure. */\n export function grow(value: i32): i32;\n /** Sets n bytes beginning at the specified destination in memory to the specified byte value. */\n export function fill(dst: usize, value: u8, count: usize): void;\n /** Copies n bytes from the specified source to the specified destination in memory. These regions may overlap. */\n export function copy(dst: usize, src: usize, n: usize): void;\n /** Copies elements from a passive element segment to a table. */\n // export function init(segmentIndex: u32, srcOffset: usize, dstOffset: usize, n: usize): void;\n /** Prevents further use of a passive element segment. */\n // export function drop(segmentIndex: u32): void;\n /** Copies elements from one region of a table to another region. */\n export function allocate(size: usize): usize;\n /** Disposes a chunk of memory by its pointer. */\n export function free(ptr: usize): void;\n /** Compares two chunks of memory. Returns `0` if equal, otherwise the difference of the first differing bytes. */\n export function compare(vl: usize, vr: usize, n: usize): i32;\n /** Resets the allocator to its initial state, if supported. */\n export function reset(): void;\n}\n\n/** Garbage collector operations. */\ndeclare namespace gc {\n /** Allocates a managed object identified by its visitor function. */\n export function allocate(size: usize, visitFn: (ref: usize) => void): usize;\n /** Performs a full garbage collection cycle. */\n export function collect(): void;\n}\n\n/** Table operations. */\ndeclare namespace table {\n /** Copies elements from a passive element segment to a table. */\n // export function init(elementIndex: u32, srcOffset: u32, dstOffset: u32, n: u32): void;\n /** Prevents further use of a passive element segment. */\n // export function drop(elementIndex: u32): void;\n /** Copies elements from one region of a table to another region. */\n // export function copy(dest: u32, src: u32, n: u32): void;\n}\n\n/** Class representing a generic, fixed-length raw binary data buffer. */\ndeclare class ArrayBuffer {\n /** The size, in bytes, of the array. */\n readonly byteLength: i32;\n /** Unsafe pointer to the start of the data in memory. */\n readonly data: usize;\n /** Returns true if value is one of the ArrayBuffer views, such as typed array or a DataView **/\n static isView(value: T): bool;\n /** Constructs a new array buffer of the given length in bytes. */\n constructor(length: i32, unsafe?: bool);\n /** Returns a copy of this array buffer\'s bytes from begin, inclusive, up to end, exclusive. */\n slice(begin?: i32, end?: i32): ArrayBuffer;\n /** Returns a string representation of ArrayBuffer. */\n toString(): string;\n}\n\n/** The `DataView` view provides a low-level interface for reading and writing multiple number types in a binary `ArrayBuffer`, without having to care about the platform\'s endianness. */\ndeclare class DataView {\n /** The `buffer` accessor property represents the `ArrayBuffer` or `SharedArrayBuffer` referenced by the `DataView` at construction time. */\n readonly buffer: ArrayBuffer;\n /** The `byteLength` accessor property represents the length (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteLength: i32;\n /** The `byteOffset` accessor property represents the offset (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteOffset: i32;\n /** Constructs a new `DataView` with the given properties */\n constructor(buffer: ArrayBuffer, byteOffset?: i32, byteLength?: i32);\n /** The `getFloat32()` method gets a signed 32-bit float (float) at the specified byte offset from the start of the `DataView`. */\n getFloat32(byteOffset: i32, littleEndian?: boolean): f32;\n /** The `getFloat64()` method gets a signed 64-bit float (double) at the specified byte offset from the start of the `DataView`. */\n getFloat64(byteOffset: i32, littleEndian?: boolean): f64;\n /** The `getInt8()` method gets a signed 8-bit integer (byte) at the specified byte offset from the start of the `DataView`. */\n getInt8(byteOffset: i32): i8;\n /** The `getInt16()` method gets a signed 16-bit integer (short) at the specified byte offset from the start of the `DataView`. */\n getInt16(byteOffset: i32, littleEndian?: boolean): i16;\n /** The `getInt32()` method gets a signed 32-bit integer (long) at the specified byte offset from the start of the `DataView`. */\n getInt32(byteOffset: i32, littleEndian?: boolean): i32;\n /** The `getInt64()` method gets a signed 64-bit integer (long long) at the specified byte offset from the start of the `DataView`. */\n getInt64(byteOffset: i32, littleEndian?: boolean): i64;\n /** The `getUint8()` method gets an unsigned 8-bit integer (unsigned byte) at the specified byte offset from the start of the `DataView`. */\n getUint8(byteOffset: i32): u8;\n /** The `getUint16()` method gets an unsigned 16-bit integer (unsigned short) at the specified byte offset from the start of the `DataView`. */\n getUint16(byteOffset: i32, littleEndian?: boolean): u16;\n /** The `getUint32()` method gets an unsigned 32-bit integer (unsigned long) at the specified byte offset from the start of the `DataView`. */\n getUint32(byteOffset: i32, littleEndian?: boolean): u32;\n /** The `getUint64()` method gets an unsigned 64-bit integer (unsigned long long) at the specified byte offset from the start of the `DataView`. */\n getUint64(byteOffset: i32, littleEndian?: boolean): u64;\n /** The `setFloat32()` method stores a signed 32-bit float (float) value at the specified byte offset from the start of the `DataView`. */\n setFloat32(byteOffset: i32, value: f32, littleEndian?: boolean): void;\n /** The `setFloat64()` method stores a signed 64-bit float (double) value at the specified byte offset from the start of the `DataView`. */\n setFloat64(byteOffset: i32, value: f64, littleEndian?: boolean): void;\n /** The `setInt8()` method stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setInt8(byteOffset: i32, value: i8): void;\n /** The `setInt16()` method stores a signed 16-bit integer (short) value at the specified byte offset from the start of the `DataView`. */\n setInt16(byteOffset: i32, value: i16, littleEndian?: boolean): void;\n /** The `setInt32()` method stores a signed 32-bit integer (long) value at the specified byte offset from the start of the `DataView`. */\n setInt32(byteOffset: i32, value: i32, littleEndian?: boolean): void;\n /** The `setInt64()` method stores a signed 64-bit integer (long long) value at the specified byte offset from the start of the `DataView`. */\n setInt64(byteOffset: i32, value: i64, littleEndian?: boolean): void;\n /** The `setUint8()` method stores an unsigned 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setUint8(byteOffset: i32, value: u8): void;\n /** The `setUint16()` method stores an unsigned 16-bit integer (unsigned short) value at the specified byte offset from the start of the `DataView`. */\n setUint16(byteOffset: i32, value: u16, littleEndian?: boolean): void;\n /** The `setUint32()` method stores an unsigned 32-bit integer (unsigned long) value at the specified byte offset from the start of the `DataView`. */\n setUint32(byteOffset: i32, value: u32, littleEndian?: boolean): void;\n /** The `setUint64()` method stores an unsigned 64-bit integer (unsigned long long) value at the specified byte offset from the start of the `DataView`. */\n setUint64(byteOffset: i32, value: u64, littleEndian?: boolean): void;\n /** Returns a string representation of DataView. */\n toString(): string;\n}\n\n/** Interface for a typed view on an array buffer. */\ninterface ArrayBufferView {\n [key: number]: T;\n /** The {@link ArrayBuffer} referenced by this view. */\n readonly buffer: ArrayBuffer;\n /** The offset in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteOffset: i32;\n /** The length in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteLength: i32;\n}\n\n/* @internal */\ndeclare abstract class TypedArray implements ArrayBufferView {\n [key: number]: T;\n /** Number of bytes per element. */\n static readonly BYTES_PER_ELEMENT: usize;\n /** Constructs a new typed array. */\n constructor(length: i32);\n /** The {@link ArrayBuffer} referenced by this view. */\n readonly buffer: ArrayBuffer;\n /** The offset in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteOffset: i32;\n /** The length in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteLength: i32;\n /** The length (in elements). */\n readonly length: i32;\n /** Returns a new TypedArray of this type on the same ArrayBuffer from begin inclusive to end exclusive. */\n subarray(begin?: i32, end?: i32): this;\n /** The reduce() method applies a function against an accumulator and each value of the typed array (from left-to-right) has to reduce it to a single value. This method has the same algorithm as Array.prototype.reduce(). */\n reduce(\n callbackfn: (accumulator: W, value: T, index: i32, self: this) => W,\n initialValue: W,\n ): W;\n /** The reduceRight() method applies a function against an accumulator and each value of the typed array (from left-to-right) has to reduce it to a single value, starting from the end of the array. This method has the same algorithm as Array.prototype.reduceRight(). */\n reduceRight(\n callbackfn: (accumulator: W, value: T, index: i32, self: this) => W,\n initialValue: W,\n ): W;\n /** The some() method tests whether some element in the typed array passes the test implemented by the provided function. This method has the same algorithm as Array.prototype.some().*/\n some(callbackfn: (value: T, index: i32, self: this) => bool): bool;\n /** The map() method creates a new typed array with the results of calling a provided function on every element in this typed array. This method has the same algorithm as Array.prototype.map().*/\n map(callbackfn: (value: T, index: i32, self: this) => T): this;\n /** The sort() method sorts the elements of a typed array numerically in place and returns the typed array. This method has the same algorithm as Array.prototype.sort(), except that sorts the values numerically instead of as strings. TypedArray is one of the typed array types here. */\n sort(callback?: (a: T, b: T) => i32): this;\n /** The fill() method fills all the elements of a typed array from a start index to an end index with a static value. This method has the same algorithm as Array.prototype.fill(). */\n fill(value: T, start?: i32, end?: i32): this;\n /** The findIndex() method returns an index in the typed array, if an element in the typed array satisfies the provided testing function. Otherwise -1 is returned. See also the find() [not implemented] method, which returns the value of a found element in the typed array instead of its index. */\n findIndex(callbackfn: (value: T, index: i32, self: this) => bool): i32;\n /** The every() method tests whether all elements in the typed array pass the test implemented by the provided function. This method has the same algorithm as Array.prototype.every(). */\n every(callbackfn: (value: T, index: i32, self: this) => bool): i32;\n}\n\n/** An array of twos-complement 8-bit signed integers. */\ndeclare class Int8Array extends TypedArray {}\n/** An array of 8-bit unsigned integers. */\ndeclare class Uint8Array extends TypedArray {}\n/** A clamped array of 8-bit unsigned integers. */\ndeclare class Uint8ClampedArray extends TypedArray {}\n/** An array of twos-complement 16-bit signed integers. */\ndeclare class Int16Array extends TypedArray {}\n/** An array of 16-bit unsigned integers. */\ndeclare class Uint16Array extends TypedArray {}\n/** An array of twos-complement 32-bit signed integers. */\ndeclare class Int32Array extends TypedArray {}\n/** An array of 32-bit unsigned integers. */\ndeclare class Uint32Array extends TypedArray {}\n/** An array of twos-complement 64-bit signed integers. */\ndeclare class Int64Array extends TypedArray {}\n/** An array of 64-bit unsigned integers. */\ndeclare class Uint64Array extends TypedArray {}\n/** An array of 32-bit floating point numbers. */\ndeclare class Float32Array extends TypedArray {}\n/** An array of 64-bit floating point numbers. */\ndeclare class Float64Array extends TypedArray {}\n\n/** Class representing a sequence of values of type `T`. */\ndeclare class Array {\n\n static isArray(value: any): value is Array;\n\n [key: number]: T;\n /** Current length of the array. */\n length: i32;\n /** Constructs a new array. */\n constructor(capacity?: i32);\n\n fill(value: T, start?: i32, end?: i32): this;\n every(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n findIndex(predicate: (element: T, index: i32, array?: Array) => bool): i32;\n includes(searchElement: T, fromIndex?: i32): bool;\n indexOf(searchElement: T, fromIndex?: i32): i32;\n lastIndexOf(searchElement: T, fromIndex?: i32): i32;\n push(element: T): i32;\n concat(items: T[]): T[];\n copyWithin(target: i32, start: i32, end?: i32): this;\n pop(): T;\n forEach(callbackfn: (value: T, index: i32, array: Array) => void): void;\n map(callbackfn: (value: T, index: i32, array: Array) => U): Array;\n filter(callbackfn: (value: T, index: i32, array: Array) => bool): Array;\n reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n reduceRight(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n shift(): T;\n some(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n unshift(element: T): i32;\n slice(from: i32, to?: i32): Array;\n splice(start: i32, deleteCount?: i32): Array;\n sort(comparator?: (a: T, b: T) => i32): this;\n join(separator?: string): string;\n reverse(): T[];\n toString(): string;\n}\n\n/** Class representing a sequence of characters. */\ndeclare class String {\n\n static fromCharCode(ls: i32, hs?: i32): string;\n static fromCharCodes(arr: u16[]): string;\n static fromCodePoint(code: i32): string;\n static fromCodePoints(arr: i32[]): string;\n\n readonly length: i32;\n readonly lengthUTF8: i32;\n\n charAt(index: u32): string;\n charCodeAt(index: u32): u16;\n concat(other: string): string;\n endsWith(other: string): bool;\n indexOf(other: string, fromIndex?: i32): u32;\n lastIndexOf(other: string, fromIndex?: i32): i32;\n includes(other: string): bool;\n startsWith(other: string): bool;\n substr(start: u32, length?: u32): string;\n substring(start: u32, end?: u32): string;\n trim(): string;\n trimLeft(): string;\n trimRight(): string;\n trimStart(): string;\n trimEnd(): string;\n padStart(targetLength: i32, padString?: string): string;\n padEnd(targetLength: i32, padString?: string): string;\n repeat(count?: i32): string;\n slice(beginIndex: i32, endIndex?: i32): string;\n split(separator?: string, limit?: i32): string[];\n toString(): string;\n static fromUTF8(ptr: usize, len: usize): string;\n toUTF8(): usize;\n}\n\n/** Class for representing a runtime error. Base class of all errors. */\ndeclare class Error {\n\n /** Error name. */\n name: string;\n\n /** Message provided on construction. */\n message: string;\n\n /** Stack trace. */\n stack?: string;\n\n /** Constructs a new error, optionally with a message. */\n constructor(message?: string);\n\n /** Method returns a string representing the specified Error class. */\n toString(): string;\n}\n\n/** Class for indicating an error when a value is not in the set or range of allowed values. */\ndeclare class RangeError extends Error { }\n\n/** Class for indicating an error when a value is not of the expected type. */\ndeclare class TypeError extends Error { }\n\n/** Class for indicating an error when trying to interpret syntactically invalid code. */\ndeclare class SyntaxError extends Error { }\n\ninterface Boolean {}\ninterface Function {}\ninterface IArguments {}\ninterface Number {}\ninterface Object {}\ninterface RegExp {}\n\ndeclare class Map {\n readonly size: i32;\n has(key: K): bool;\n set(key: K, value: V): void;\n get(key: K): V;\n delete(key: K): bool;\n clear(): void;\n toString(): string;\n}\n\ndeclare class Set {\n readonly size: i32;\n has(value: T): bool;\n add(value: T): void;\n delete(value: T): bool;\n clear(): void;\n toString(): string;\n}\n\ninterface SymbolConstructor {\n readonly hasInstance: symbol;\n readonly isConcatSpreadable: symbol;\n readonly isRegExp: symbol;\n readonly iterator: symbol;\n readonly match: symbol;\n readonly replace: symbol;\n readonly search: symbol;\n readonly species: symbol;\n readonly split: symbol;\n readonly toPrimitive: symbol;\n readonly toStringTag: symbol;\n readonly unscopables: symbol;\n (description?: string | null): symbol;\n for(key: string): symbol;\n keyFor(sym: symbol): string | null;\n}\n\ndeclare const Symbol: SymbolConstructor;\n\ninterface IMath {\n /** The base of natural logarithms, e, approximately 2.718. */\n readonly E: T;\n /** The natural logarithm of 2, approximately 0.693. */\n readonly LN2: T;\n /** The natural logarithm of 10, approximately 2.302. */\n readonly LN10: T;\n /** The base 2 logarithm of e, approximately 1.442. */\n readonly LOG2E: T;\n /** The base 10 logarithm of e, approximately 0.434. */\n readonly LOG10E: T;\n /** The ratio of the circumference of a circle to its diameter, approximately 3.14159. */\n readonly PI: T;\n /** The square root of 1/2, approximately 0.707. */\n readonly SQRT1_2: T;\n /** The square root of 2, approximately 1.414. */\n readonly SQRT2: T;\n /** Returns the absolute value of `x`. */\n abs(x: T): T;\n /** Returns the arccosine (in radians) of `x`. */\n acos(x: T): T;\n /** Returns the hyperbolic arc-cosine of `x`. */\n acosh(x: T): T;\n /** Returns the arcsine (in radians) of `x` */\n asin(x: T): T;\n /** Returns the hyperbolic arcsine of `x`. */\n asinh(x: T): T;\n /** Returns the arctangent (in radians) of `x`. */\n atan(x: T): T;\n /** Returns the arctangent of the quotient of its arguments. */\n atan2(y: T, x: T): T;\n /** Returns the hyperbolic arctangent of `x`. */\n atanh(x: T): T;\n /** Returns the cube root of `x`. */\n cbrt(x: T): T;\n /** Returns the smallest integer greater than or equal to `x`. */\n ceil(x: T): T;\n /** Returns the number of leading zero bits in the 32-bit binary representation of `x`. */\n clz32(x: T): T;\n /** Returns the cosine (in radians) of `x`. */\n cos(x: T): T;\n /** Returns the hyperbolic cosine of `x`. */\n cosh(x: T): T;\n /** Returns e to the power of `x`. */\n exp(x: T): T;\n /** Returns e to the power of `x`, minus 1. */\n expm1(x: T): T;\n /** Returns the largest integer less than or equal to `x`. */\n floor(x: T): T;\n /** Returns the nearest 32-bit single precision float representation of `x`. */\n fround(x: T): f32;\n /** Returns the square root of the sum of squares of its arguments. */\n hypot(value1: T, value2: T): T; // TODO: rest\n /** Returns the result of the C-like 32-bit multiplication of `a` and `b`. */\n imul(a: T, b: T): T;\n /** Returns the natural logarithm (base e) of `x`. */\n log(x: T): T;\n /** Returns the base 10 logarithm of `x`. */\n log10(x: T): T;\n /** Returns the natural logarithm (base e) of 1 + `x`. */\n log1p(x: T): T;\n /** Returns the base 2 logarithm of `x`. */\n log2(x: T): T;\n /** Returns the largest-valued number of its arguments. */\n max(value1: T, value2: T): T; // TODO: rest\n /** Returns the lowest-valued number of its arguments. */\n min(value1: T, value2: T): T; // TODO: rest\n /** Returns `base` to the power of `exponent`. */\n pow(base: T, exponent: T): T;\n /** Returns a pseudo-random number in the range from 0.0 inclusive up to but not including 1.0. */\n random(): T;\n /** Returns the value of `x` rounded to the nearest integer. */\n round(x: T): T;\n /** Returns the sign of `x`, indicating whether the number is positive, negative or zero. */\n sign(x: T): T;\n /** Returns whether the sign bit of `x` is set */\n signbit(x: T): bool;\n /** Returns the sine of `x`. */\n sin(x: T): T;\n /** Returns the hyperbolic sine of `x`. */\n sinh(x: T): T;\n /** Returns the square root of `x`. */\n sqrt(x: T): T;\n /** Returns the tangent of `x`. */\n tan(x: T): T;\n /** Returns the hyperbolic tangent of `x`. */\n tanh(x: T): T;\n /** Returns the integer part of `x` by removing any fractional digits. */\n trunc(x: T): T;\n}\n\ninterface INativeMath extends IMath {\n /** Seeds the random number generator. */\n seedRandom(value: i64): void;\n /** Returns the floating-point remainder of `x / y` (rounded towards zero). */\n mod(x: T, y: T): T;\n /** Returns the floating-point remainder of `x / y` (rounded to nearest). */\n rem(x: T, y: T): T;\n}\n\n/** Double precision math imported from JavaScript. */\ndeclare const JSMath: IMath;\n/** Double precision math implemented natively. */\ndeclare const NativeMath: INativeMath;\n/** Single precision math implemented natively. */\ndeclare const NativeMathf: INativeMath;\n/** Alias of {@link NativeMath} or {@link JSMath} respectively. Defaults to `NativeMath`. */\ndeclare const Math: IMath;\n/** Alias of {@link NativeMathf} or {@link JSMath} respectively. Defaults to `NativeMathf`. */\ndeclare const Mathf: IMath;\n\ndeclare class Date {\n /** Returns the UTC timestamp in milliseconds of the specified date. */\n static UTC(\n year: i32,\n month: i32,\n day: i32,\n hour: i32,\n minute: i32,\n second: i32,\n millisecond: i32\n ): i64;\n /** Returns the current UTC timestamp in milliseconds. */\n static now(): i64;\n /** Constructs a new date object from an UTC timestamp in milliseconds. */\n constructor(value: i64);\n /** Returns the UTC timestamp of this date in milliseconds. */\n getTime(): i64;\n /** Sets the UTC timestamp of this date in milliseconds. */\n setTime(value: i64): i64;\n}\n\n/** Environmental tracing function for debugging purposes. */\ndeclare function trace(msg: string, n?: i32, a0?: f64, a1?: f64, a2?: f64, a3?: f64, a4?: f64): void;\n\n// Decorators\n\ninterface TypedPropertyDescriptor {\n configurable?: boolean;\n enumerable?: boolean;\n writable?: boolean;\n value?: T;\n get?(): T;\n set?(value: T): void;\n}\n\n/** Annotates an element as a program global. */\ndeclare function global(\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n): TypedPropertyDescriptor | void;\n\n/** Annotates a method as a binary operator overload for the specified `token`. */\ndeclare function operator(token:\n "[]" | "[]=" | "{}" | "{}=" | "==" | "!=" | ">" | "<" | "<=" | ">=" |\n ">>" | ">>>" | "<<" | "&" | "|" | "^" | "+" | "-" | "*" | "**" | "/" | "%"\n): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n) => TypedPropertyDescriptor | void;\n\ndeclare namespace operator {\n /** Annotates a method as a binary operator overload for the specified `token`. */\n export function binary(token:\n "[]" | "[]=" | "{}" | "{}=" | "==" | "!=" | ">" | "<" | "<=" | ">=" |\n ">>" | ">>>" | "<<" | "&" | "|" | "^" | "+" | "-" | "*" | "**" | "/" | "%"\n ): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n ) => TypedPropertyDescriptor | void;\n /** Annotates a method as an unary prefix operator overload for the specified `token`. */\n export function prefix(token: "!" | "~" | "+" | "-" | "++" | "--"): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n ) => TypedPropertyDescriptor | void;\n /** Annotates a method as an unary postfix operator overload for the specified `token`. */\n export function postfix(token: "++" | "--"): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n ) => TypedPropertyDescriptor | void;\n}\n\n/** Annotates a class as being unmanaged with limited capabilities. */\ndeclare function unmanaged(constructor: Function): void;\n\n/** Annotates a class as being sealed / non-derivable. */\ndeclare function sealed(constructor: Function): void;\n\n/** Annotates a method, function or constant global as always inlined. */\ndeclare function inline(\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n): TypedPropertyDescriptor | void;\n\n/** Annotates an explicit external name of a function or global. */\ndeclare function external(namespace: string, name: string): (\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n) => TypedPropertyDescriptor | void;\n\n/** Annotates a global for lazy compilation. */\ndeclare function lazy(\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n): TypedPropertyDescriptor | void;\n\n/** Annotates a function as the explicit start function. */\ndeclare function start(\n target: any,\n propertyKey: string,\n descriptor: TypedPropertyDescriptor\n): TypedPropertyDescriptor | void;\n',portable:"/**\n * Environment definitions for compiling AssemblyScript to JavaScript using tsc.\n *\n * Note that semantic differences require additional explicit conversions for full compatibility.\n * For example, when casting an i32 to an u8, doing `(someI32 & 0xff)` will yield the same\n * result when compiling to WebAssembly or JS while `someI32` alone does nothing in JS.\n *\n * Note that i64's are not portable (JS numbers are IEEE754 doubles with a maximum safe integer\n * value of 2^53-1) and instead require a compatibility layer to work in JS as well, as for example\n * {@link glue/js/i64} respectively {@link glue/wasm/i64}.\n *\n * @module std/portable\n *//***/\n\n/// \n\n// Types\n\ndeclare type bool = boolean;\ndeclare type i8 = number;\ndeclare type i16 = number;\ndeclare type i32 = number;\ndeclare type isize = number;\ndeclare type u8 = number;\ndeclare type u16 = number;\ndeclare type u32 = number;\ndeclare type usize = number;\ndeclare type f32 = number;\ndeclare type f64 = number;\n\n// Compiler hints\n\n/** Compiler target. 0 = JS, 1 = WASM32, 2 = WASM64. */\ndeclare const ASC_TARGET: i32;\n/** Provided noAssert option. */\ndeclare const ASC_NO_ASSERT: bool;\n/** Provided memoryBase option. */\ndeclare const ASC_MEMORY_BASE: i32;\n/** Provided optimizeLevel option. */\ndeclare const ASC_OPTIMIZE_LEVEL: i32;\n/** Provided shrinkLevel option. */\ndeclare const ASC_SHRINK_LEVEL: i32;\n/** Whether the mutable global feature is enabled. */\ndeclare const ASC_FEATURE_MUTABLE_GLOBAL: bool;\n/** Whether the sign extension feature is enabled. */\ndeclare const ASC_FEATURE_SIGN_EXTENSION: bool;\n\n// Builtins\n\n/** Performs the sign-agnostic count leading zero bits operation on a 32-bit integer. All zero bits are considered leading if the value is zero. */\ndeclare function clz(value: T): T;\n/** Performs the sign-agnostic count tailing zero bits operation on a 32-bit integer. All zero bits are considered trailing if the value is zero. */\ndeclare function ctz(value: T): T;\n/** Performs the sign-agnostic count number of one bits operation on a 32-bit integer. */\ndeclare function popcnt(value: T): T;\n/** Performs the sign-agnostic rotate left operation on a 32-bit integer. */\ndeclare function rotl(value: T, shift: T): T;\n/** Performs the sign-agnostic rotate right operation on a 32-bit integer. */\ndeclare function rotr(value: T, shift: T): T;\n/** Computes the absolute value of an integer or float. */\ndeclare function abs(value: T): T;\n/** Determines the maximum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function max(left: T, right: T): T;\n/** Determines the minimum of two integers or floats. If either operand is `NaN`, returns `NaN`. */\ndeclare function min(left: T, right: T): T;\n/** Composes a 32-bit or 64-bit float from the magnitude of `x` and the sign of `y`. */\ndeclare function copysign(x: T, y: T): T;\n/** Performs the ceiling operation on a 32-bit or 64-bit float. */\ndeclare function ceil(value: T): T;\n/** Performs the floor operation on a 32-bit or 64-bit float. */\ndeclare function floor(value: T): T;\n/** Rounds to the nearest integer tied to even of a 32-bit or 64-bit float. */\ndeclare function nearest(value: T): T;\n/** Selects one of two pre-evaluated values depending on the condition. */\ndeclare function select(ifTrue: T, ifFalse: T, condition: bool): T;\n/** Calculates the square root of a 32-bit or 64-bit float. */\ndeclare function sqrt(value: T): T;\n/** Rounds to the nearest integer towards zero of a 32-bit or 64-bit float. */\ndeclare function trunc(value: T): T;\n/** Loads a value of the specified type from memory. Type must be `u8`. */\ndeclare function load(ptr: usize, constantOffset?: usize): T;\n/** Stores a value of the specified type to memory. Type must be `u8`. */\ndeclare function store(ptr: usize, value: T, constantOffset?: usize): void;\n/** Emits an unreachable operation that results in a runtime error when executed. */\ndeclare function unreachable(): any; // sic\n\n/** NaN (not a number) as a 32-bit or 64-bit float depending on context. */\ndeclare const NaN: f32 | f64;\n/** Positive infinity as a 32-bit or 64-bit float depending on context. */\ndeclare const Infinity: f32 | f64;\n/** Changes the type of any value of `usize` kind to another one of `usize` kind. Useful for casting class instances to their pointer values and vice-versa. Beware that this is unsafe.*/\ndeclare function changetype(value: any): T;\n/** Explicitly requests no bounds checks on the provided expression. Useful for array accesses. */\ndeclare function unchecked(value: T): T;\n/** Tests if a 32-bit or 64-bit float is `NaN`. */\ndeclare function isNaN(value: T): bool;\n/** Tests if a 32-bit or 64-bit float is finite, that is not `NaN` or +/-`Infinity`. */\ndeclare function isFinite(value: T): bool;\n/** Tests if the specified value is a valid integer. Can't distinguish an integer from an integral float. */\ndeclare function isInteger(value: any): value is number;\n/** Tests if the specified value is a valid float. Can't distinguish a float from an integer. */\ndeclare function isFloat(value: any): value is number;\n/** Tests if the specified value is of a reference type. */\ndeclare function isReference(value: any): value is object | string;\n/** Tests if the specified value can be used as a string. */\ndeclare function isString(value: any): value is string | String;\n/** Tests if the specified value can be used as an array. */\ndeclare function isArray(value: any): value is Array;\n/** Tests if the specified expression resolves to a defined element. */\ndeclare function isDefined(expression: any): bool;\n/** Tests if the specified expression evaluates to a constant value. */\ndeclare function isConstant(expression: any): bool;\n/** Traps if the specified value is not true-ish, otherwise returns the value. */\ndeclare function assert(isTrueish: T | null, message?: string): T;\n/** Parses an integer string to a 64-bit float. */\ndeclare function parseInt(str: string, radix?: i32): f64;\n/** Parses an integer string to a 32-bit integer. */\ndeclare function parseI32(str: string, radix?: i32): i32;\n/** Parses a floating point string to a 64-bit float. */\ndeclare function parseFloat(str: string): f64;\n/** Returns the 64-bit floating-point remainder of `x/y`. */\ndeclare function fmod(x: f64, y: f64): f64;\n/** Returns the 32-bit floating-point remainder of `x/y`. */\ndeclare function fmodf(x: f32, y: f32): f32;\n\n/** Converts any other numeric value to an 8-bit signed integer. */\ndeclare function i8(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace i8 {\n /** Smallest representable value. */\n export const MIN_VALUE: i8;\n /** Largest representable value. */\n export const MAX_VALUE: i8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i8;\n}\n/** Converts any other numeric value to a 16-bit signed integer. */\ndeclare function i16(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace i16 {\n /** Smallest representable value. */\n export const MIN_VALUE: i16;\n /** Largest representable value. */\n export const MAX_VALUE: i16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i16;\n}\n/** Converts any other numeric value to a 32-bit signed integer. */\ndeclare function i32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i32;\ndeclare namespace i32 {\n /** Smallest representable value. */\n export const MIN_VALUE: i32;\n /** Largest representable value. */\n export const MAX_VALUE: i32;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): i32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): i32;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) signed integer. */\ndeclare function isize(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): isize;\ndeclare namespace isize {\n /** Smallest representable value. */\n export const MIN_VALUE: isize;\n /** Largest representable value. */\n export const MAX_VALUE: isize;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): isize;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): isize;\n}\n/** Converts any other numeric value to an 8-bit unsigned integer. */\ndeclare function u8(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace u8 {\n /** Smallest representable value. */\n export const MIN_VALUE: u8;\n /** Largest representable value. */\n export const MAX_VALUE: u8;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u8;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u8;\n}\n/** Converts any other numeric value to a 16-bit unsigned integer. */\ndeclare function u16(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i8;\ndeclare namespace u16 {\n /** Smallest representable value. */\n export const MIN_VALUE: u16;\n /** Largest representable value. */\n export const MAX_VALUE: u16;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u16;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u16;\n}\n/** Converts any other numeric value to a 32-bit unsigned integer. */\ndeclare function u32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): i32;\ndeclare namespace u32 {\n /** Smallest representable value. */\n export const MIN_VALUE: u32;\n /** Largest representable value. */\n export const MAX_VALUE: u32;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): u32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): u32;\n}\n/** Converts any other numeric value to a 32-bit (in WASM32) respectivel 64-bit (in WASM64) unsigned integer. */\ndeclare function usize(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): isize;\ndeclare namespace usize {\n /** Smallest representable value. */\n export const MIN_VALUE: usize;\n /** Largest representable value. */\n export const MAX_VALUE: usize;\n /** Converts a string to a floating-point number and cast to target integer after. */\n export function parseFloat(string: string): usize;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): usize;\n}\n/** Converts any other numeric value to a 1-bit unsigned integer. */\ndeclare function bool(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): bool;\ndeclare namespace bool {\n /** Smallest representable value. */\n export const MIN_VALUE: bool;\n /** Largest representable value. */\n export const MAX_VALUE: bool;\n}\n/** Converts any other numeric value to a 32-bit float. */\ndeclare function f32(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): f32;\ndeclare namespace f32 {\n /** Smallest representable value. */\n export const MIN_VALUE: f32;\n /** Largest representable value. */\n export const MAX_VALUE: f32;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f32;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f32;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f32;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f32;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n export function isNaN(value: f32): bool;\n /** Returns true if passed value is finite. */\n export function isFinite(value: f32): bool;\n /** Returns true if the value passed is a safe integer. */\n export function isSafeInteger(value: f32): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n export function isInteger(value: f32): bool;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): f32;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): f32;\n}\n/** Converts any other numeric value to a 64-bit float. */\ndeclare function f64(value: i8 | i16 | i32 | isize | u8 | u16 | u32 | usize | bool | f32 | f64): f64;\ndeclare namespace f64 {\n /** Smallest representable value. */\n export const MIN_VALUE: f64;\n /** Largest representable value. */\n export const MAX_VALUE: f64;\n /** Smallest normalized positive value. */\n export const MIN_POSITIVE_VALUE: f64;\n /** Smallest safely representable integer value. */\n export const MIN_SAFE_INTEGER: f64;\n /** Largest safely representable integer value. */\n export const MAX_SAFE_INTEGER: f64;\n /** Difference between 1 and the smallest representable value greater than 1. */\n export const EPSILON: f64;\n /** Returns a boolean value that indicates whether a value is the reserved value NaN (not a number). */\n export function isNaN(value: f32): bool;\n /** Returns true if passed value is finite. */\n export function isFinite(value: f32): bool;\n /** Returns true if the value passed is a safe integer. */\n export function isSafeInteger(value: f64): bool;\n /** Returns true if the value passed is an integer, false otherwise. */\n export function isInteger(value: f64): bool;\n /** Converts a string to a floating-point number. */\n export function parseFloat(string: string): f64;\n /** Converts A string to an integer. */\n export function parseInt(string: string, radix?: i32): f64;\n}\n\n// Polyfills\n\n/** [Polyfill] Performs the sign-agnostic reverse bytes **/\ndeclare function bswap(value: T): T;\n/** [Polyfill] Performs the sign-agnostic reverse bytes only for last 16-bit **/\ndeclare function bswap16(value: T): T;\n\n// Standard library\n\n/** Memory operations. */\ndeclare namespace memory {\n /** Allocates a chunk of memory of the specified size and returns a pointer to it. */\n function allocate(size: usize): usize;\n /** Disposes a chunk of memory by its pointer. */\n function free(ptr: usize): void;\n /** Copies n bytes from the specified source to the specified destination in memory. These regions may overlap. */\n function copy(dst: usize, src: usize, n: usize): void;\n /** Fills size bytes from from the specified destination by same value in memory. */\n function fill(dst: usize, value: u8, size: usize): void;\n /** Resets the allocator to its initial state, if supported. */\n function reset(): void;\n}\n\n/** Class representing a generic, fixed-length raw binary data buffer. */\ndeclare class ArrayBuffer {\n /** The size, in bytes, of the array. */\n readonly byteLength: i32;\n /** Returns true if value is one of the ArrayBuffer views, such as typed array or a DataView **/\n static isView(value: T): bool;\n /** Constructs a new array buffer of the given length in bytes. */\n constructor(length: i32);\n /** Returns a copy of this array buffer's bytes from begin, inclusive, up to end, exclusive. */\n slice(begin?: i32, end?: i32): ArrayBuffer;\n /** Returns a string representation of ArrayBuffer. */\n toString(): string;\n}\n\n/** The `DataView` view provides a low-level interface for reading and writing multiple number types in a binary `ArrayBuffer`, without having to care about the platform's endianness. */\ndeclare class DataView {\n /** The `buffer` accessor property represents the `ArrayBuffer` or `SharedArrayBuffer` referenced by the `DataView` at construction time. */\n readonly buffer: ArrayBuffer;\n /** The `byteLength` accessor property represents the length (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteLength: i32;\n /** The `byteOffset` accessor property represents the offset (in bytes) of this view from the start of its `ArrayBuffer` or `SharedArrayBuffer`. */\n readonly byteOffset: i32;\n /** Constructs a new `DataView` with the given properties */\n constructor(buffer: ArrayBuffer, byteOffset?: i32, byteLength?: i32);\n /** The `getFloat32()` method gets a signed 32-bit float (float) at the specified byte offset from the start of the `DataView`. */\n getFloat32(byteOffset: i32, littleEndian?: boolean): f32;\n /** The `getFloat64()` method gets a signed 64-bit float (double) at the specified byte offset from the start of the `DataView`. */\n getFloat64(byteOffset: i32, littleEndian?: boolean): f64;\n /** The `getInt8()` method gets a signed 8-bit integer (byte) at the specified byte offset from the start of the `DataView`. */\n getInt8(byteOffset: i32): i8;\n /** The `getInt16()` method gets a signed 16-bit integer (short) at the specified byte offset from the start of the `DataView`. */\n getInt16(byteOffset: i32, littleEndian?: boolean): i16;\n /** The `getInt32()` method gets a signed 32-bit integer (long) at the specified byte offset from the start of the `DataView`. */\n getInt32(byteOffset: i32, littleEndian?: boolean): i32;\n /** The `getUint8()` method gets an unsigned 8-bit integer (unsigned byte) at the specified byte offset from the start of the `DataView`. */\n getUint8(byteOffset: i32): u8;\n /** The `getUint16()` method gets an unsigned 16-bit integer (unsigned short) at the specified byte offset from the start of the `DataView`. */\n getUint16(byteOffset: i32, littleEndian?: boolean): u16;\n /** The `getUint32()` method gets an unsigned 32-bit integer (unsigned long) at the specified byte offset from the start of the `DataView`. */\n getUint32(byteOffset: i32, littleEndian?: boolean): u32;\n /** The `setFloat32()` method stores a signed 32-bit float (float) value at the specified byte offset from the start of the `DataView`. */\n setFloat32(byteOffset: i32, value: f32, littleEndian?: boolean): void;\n /** The `setFloat64()` method stores a signed 64-bit float (double) value at the specified byte offset from the start of the `DataView`. */\n setFloat64(byteOffset: i32, value: f64, littleEndian?: boolean): void;\n /** The `setInt8()` method stores a signed 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setInt8(byteOffset: i32, value: i8): void;\n /** The `setInt16()` method stores a signed 16-bit integer (short) value at the specified byte offset from the start of the `DataView`. */\n setInt16(byteOffset: i32, value: i16, littleEndian?: boolean): void;\n /** The `setInt32()` method stores a signed 32-bit integer (long) value at the specified byte offset from the start of the `DataView`. */\n setInt32(byteOffset: i32, value: i32, littleEndian?: boolean): void;\n /** The `setUint8()` method stores an unsigned 8-bit integer (byte) value at the specified byte offset from the start of the `DataView`. */\n setUint8(byteOffset: i32, value: u8): void;\n /** The `setUint16()` method stores an unsigned 16-bit integer (unsigned short) value at the specified byte offset from the start of the `DataView`. */\n setUint16(byteOffset: i32, value: u16, littleEndian?: boolean): void;\n /** The `setUint32()` method stores an unsigned 32-bit integer (unsigned long) value at the specified byte offset from the start of the `DataView`. */\n setUint32(byteOffset: i32, value: u32, littleEndian?: boolean): void;\n /** Returns a string representation of DataView. */\n toString(): string;\n}\n\ndeclare class Array {\n\n static isArray(value: any): value is Array;\n\n [key: number]: T;\n length: i32;\n constructor(capacity?: i32);\n\n fill(value: T, start?: i32, end?: i32): this;\n every(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n findIndex(predicate: (element: T, index: i32, array?: Array) => bool): i32;\n includes(searchElement: T, fromIndex?: i32): bool;\n indexOf(searchElement: T, fromIndex?: i32): i32;\n lastIndexOf(searchElement: T, fromIndex?: i32): i32;\n push(element: T): i32;\n concat(items: T[]): T[];\n copyWithin(target: i32, start: i32, end?: i32): this;\n pop(): T;\n forEach(callbackfn: (value: T, index: i32, array: Array) => void): void;\n map(callbackfn: (value: T, index: i32, array: Array) => U): Array;\n filter(callbackfn: (value: T, index: i32, array: Array) => bool): Array;\n reduce(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n reduceRight(callbackfn: (previousValue: U, currentValue: T, currentIndex: i32, array: Array) => U, initialValue: U): U;\n shift(): T;\n some(callbackfn: (element: T, index: i32, array?: Array) => bool): bool;\n unshift(element: T): i32;\n slice(from?: i32, to?: i32): Array;\n splice(start: i32, deleteCount?: i32): Array;\n sort(comparator?: (a: T, b: T) => i32): this;\n join(separator?: string): string;\n reverse(): T[];\n toString(): string;\n}\n\ndeclare class Uint8Array extends Array {}\ndeclare class Uint8ClampedArray extends Array {}\ndeclare class Uint16Array extends Array {}\ndeclare class Uint32Array extends Array {}\ndeclare class Int8Array extends Array {}\ndeclare class Int16Array extends Array {}\ndeclare class Int32Array extends Array {}\ndeclare class Float32Array extends Array {}\ndeclare class Float64Array extends Array {}\n\n/** Interface for a typed view on an array buffer. */\ninterface ArrayBufferView {\n [key: number]: T;\n /** The {@link ArrayBuffer} referenced by this view. */\n readonly buffer: ArrayBuffer;\n /** The offset in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteOffset: i32;\n /** The length in bytes from the start of the referenced {@link ArrayBuffer}. */\n readonly byteLength: i32;\n}\n\ndeclare class String {\n\n static fromCharCode(ls: i32, hs?: i32): string;\n static fromCharCodes(arr: u16[]): string;\n static fromCodePoint(code: i32): string;\n static fromCodePoints(arr: i32[]): string;\n\n readonly length: i32;\n\n private constructor();\n\n charAt(index: i32): string;\n charCodeAt(index: i32): i32;\n concat(other: string): string;\n indexOf(other: string, fromIndex?: i32): i32;\n lastIndexOf(other: string, fromIndex?: i32): i32;\n includes(other: string): bool;\n startsWith(other: string): bool;\n endsWith(other: string): bool;\n substr(start: u32, length?: u32): string;\n substring(from: i32, to?: i32): string;\n trim(): string;\n trimLeft(): string;\n trimRight(): string;\n trimStart(): string;\n trimEnd(): string;\n padStart(targetLength: i32, padString?: string): string;\n padEnd(targetLength: i32, padString?: string): string;\n replace(search: string, replacement: string): string;\n repeat(count?: i32): string;\n slice(beginIndex: i32, endIndex?: i32): string;\n split(separator?: string, limit?: i32): string[];\n toString(): string;\n}\n\ninterface Boolean {}\n\ndeclare class Number {\n private constructor();\n toString(radix?: i32): string;\n}\n\ninterface Object {}\n\ninterface Function {}\n\ninterface RegExp {}\n\ninterface IArguments {}\n\n/** Class for representing a runtime error. Base class of all errors. */\ndeclare class Error {\n\n /** Error name. */\n name: string;\n\n /** Message provided on construction. */\n message: string;\n\n /** Stack trace. */\n stack?: string;\n\n /** Constructs a new error, optionally with a message. */\n constructor(message?: string);\n\n /** Method returns a string representing the specified Error class. */\n toString(): string;\n}\n\n/** Class for indicating an error when a value is not in the set or range of allowed values. */\ndeclare class RangeError extends Error { }\n\n/** Class for indicating an error when a value is not of the expected type. */\ndeclare class TypeError extends Error { }\n\n/** Class for indicating an error when trying to interpret syntactically invalid code. */\ndeclare class SyntaxError extends Error { }\n\ndeclare class Set {\n constructor(entries?: T[]);\n readonly size: i32;\n has(value: T): bool;\n add(value: T): void;\n delete(value: T): bool;\n clear(): void;\n toString(): string;\n [Symbol.iterator](): Iterator;\n}\n\ndeclare class Map {\n constructor(entries?: [K, V][]);\n readonly size: i32;\n set(key: K, value: V): void;\n has(key: K): bool;\n get(key: K): V | null;\n clear(): void;\n entries(): Iterable<[K, V]>;\n keys(): Iterable;\n values(): Iterable;\n delete(key: K): bool;\n toString(): string;\n [Symbol.iterator](): Iterator<[K,V]>;\n}\n\ninterface SymbolConstructor {\n readonly hasInstance: symbol;\n readonly isConcatSpreadable: symbol;\n readonly isRegExp: symbol;\n readonly iterator: symbol;\n readonly match: symbol;\n readonly replace: symbol;\n readonly search: symbol;\n readonly species: symbol;\n readonly split: symbol;\n readonly toPrimitive: symbol;\n readonly toStringTag: symbol;\n readonly unscopables: symbol;\n (description?: string | null): symbol;\n for(key: string): symbol;\n keyFor(sym: symbol): string | null;\n}\ndeclare const Symbol: SymbolConstructor;\n\ninterface Iterable {\n [Symbol.iterator](): Iterator;\n}\n\ninterface Iterator {}\n\ninterface IMath {\n readonly E: f64;\n readonly LN2: f64;\n readonly LN10: f64;\n readonly LOG2E: f64;\n readonly LOG10E: f64;\n readonly PI: f64;\n readonly SQRT1_2: f64;\n readonly SQRT2: f64;\n abs(x: f64): f64;\n acos(x: f64): f64;\n acosh(x: f64): f64;\n asin(x: f64): f64;\n asinh(x: f64): f64;\n atan(x: f64): f64;\n atan2(y: f64, x: f64): f64;\n atanh(x: f64): f64;\n cbrt(x: f64): f64;\n ceil(x: f64): f64;\n clz32(x: f64): i32;\n cos(x: f64): f64;\n cosh(x: f64): f64;\n exp(x: f64): f64;\n expm1(x: f64): f64;\n floor(x: f64): f64;\n fround(x: f64): f32;\n hypot(value1: f64, value2: f64): f64; // TODO: see std/math\n imul(a: f64, b: f64): i32;\n log(x: f64): f64;\n log10(x: f64): f64;\n log1p(x: f64): f64;\n log2(x: f64): f64;\n max(value1: f64, value2: f64): f64; // TODO: see std/math\n min(value1: f64, value2: f64): f64; // TODO: see std/math\n pow(base: f64, exponent: f64): f64;\n random(): f64;\n round(x: f64): f64;\n sign(x: f64): f64;\n signbit(x: f64): bool;\n sin(x: f64): f64;\n sinh(x: f64): f64;\n sqrt(x: f64): f64;\n tan(x: f64): f64;\n tanh(x: f64): f64;\n trunc(x: f64): f64;\n}\n\ndeclare const Math: IMath;\ndeclare const Mathf: IMath;\ndeclare const JSMath: IMath;\n\ndeclare class Date {\n /** Returns the UTC timestamp in milliseconds of the specified date. */\n static UTC(\n year: i32,\n month: i32,\n day: i32,\n hour: i32,\n minute: i32,\n second: i32,\n millisecond: i32\n ): number;\n /** Returns the current UTC timestamp in milliseconds. */\n static now(): number;\n /** Constructs a new date object from an UTC timestamp in milliseconds. */\n constructor(value: number);\n /** Returns the UTC timestamp of this date in milliseconds. */\n getTime(): number;\n /** Sets the UTC timestamp of this date in milliseconds. */\n setTime(value: number): number;\n}\n\ndeclare namespace console {\n /** @deprecated */\n function log(message: string): void;\n}\n"}):(()=>{const e=path.join(".","..","std");return{assembly:fs.readFileSync(path.join(e,"assembly","index.d.ts"),"utf8"),portable:fs.readFileSync(path.join(e,"portable","index.d.ts"),"utf8")}})(),exports.compileString=(async(e,n)=>{"string"==typeof e&&(e={"input.ts":e});const t=Object.create({stdout:createMemoryStream(),stderr:createMemoryStream()});var r=["--binaryFile","binary","--textFile","text"];return n=n||{},Object.keys(n||{}).forEach(e=>{if("readFile"!=e&&"writeFile"!=e){var t=n[e];Array.isArray(t)?t.forEach(n=>r.push("--"+e,String(n))):r.push("--"+e,String(t))}}),n.readFile=n.readFile?n.readFile:n=>e.hasOwnProperty(n)?e[n]:null,n.writeFile=n.writeFile?n.writeFile:(e,n)=>t[e]=n,await exports.main(r.concat(Object.keys(e)),{stdout:t.stdout,stderr:t.stderr,readFile:async e=>{try{return await n.readFile(e)}catch(e){return console.err(e),null}},writeFile:async(e,t)=>{await n.writeFile(path.basename(e),t)},listFiles:()=>[]}),t}),exports.main=async function(e,n,t){"function"==typeof n?(t=n,n={}):n||(n={});const r=n.stdout||process.stdout,i=n.stderr||process.stderr,a=n.readFile||F,s=n.writeFile||z,o=n.listFiles||S,l=n.stats||createStats();if(!r)throw Error("'options.stdout' must be specified");if(!i)throw Error("'options.stderr' must be specified");const f=optionsUtil.parse(e,exports.options),u=f.options;if(e=f.arguments,u.noColors?colorsUtil.stdout.supported=colorsUtil.stderr.supported=!1:(colorsUtil.stdout=colorsUtil.from(r),colorsUtil.stderr=colorsUtil.from(i)),f.unknown.length&&f.unknown.forEach(e=>{i.write(colorsUtil.stderr.yellow("WARN: ")+"Unknown option '"+e+"'"+EOL)}),f.trailing.length&&i.write(colorsUtil.stderr.yellow("WARN: ")+"Unsupported trailing arguments: "+f.trailing.join(" ")+EOL),t||(t=function(e){var n=0;return e&&(i.write(colorsUtil.stderr.red("ERROR: ")+e.stack.replace(/^ERROR: /i,"")+EOL),n=1),n}),u.version)return r.write("Version "+exports.version+(isDev?"-dev":"")+EOL),t(null);if(u.help||!e.length){var c=u.help?r:i,p=u.help?colorsUtil.stdout:colorsUtil.stderr;return c.write([p.white("SYNTAX")," "+p.cyan("asc")+" [entryFile ...] [options]","",p.white("EXAMPLES")," "+p.cyan("asc")+" hello.ts"," "+p.cyan("asc")+" hello.ts -b hello.wasm -t hello.wat"," "+p.cyan("asc")+" hello1.ts hello2.ts -b -O > hello.wasm","",p.white("OPTIONS")].concat(optionsUtil.help(exports.options,24,EOL)).join(EOL)+EOL),t(null)}if(!fs.readFileSync){if(a===F)throw Error("'options.readFile' must be specified");if(s===z)throw Error("'options.writeFile' must be specified");if(o===S)throw Error("'options.listFiles' must be specified")}const d=u.baseDir?path.resolve(u.baseDir):".",h=[];u.transform&&u.transform.forEach(e=>h.push(__webpack_require__(12)(path.isAbsolute(e=e.trim())?e:path.join(process.cwd(),e))));var x=null;u.noLib?(l.parseCount++,l.parseTime+=measure(()=>{x=assemblyscript.parseFile(exports.libraryFiles.builtins,exports.libraryPrefix+"builtins.ts",!1,x)})):Object.keys(exports.libraryFiles).forEach(e=>{e.indexOf("/")>=0||(l.parseCount++,l.parseTime+=measure(()=>{x=assemblyscript.parseFile(exports.libraryFiles[e],exports.libraryPrefix+e+".ts",!1,x)}))});const b=[];if(u.lib){let e=u.lib;"string"==typeof e&&(e=e.split(",")),Array.prototype.push.apply(b,e.map(e=>e.trim()));for(let e=0,n=b.length;e{x=assemblyscript.parseFile(s,exports.libraryPrefix+i,!1,x)})}}}async function y(){for(var e,n;null!=(e=x.nextFile());){if(e.startsWith(exports.libraryPrefix)){const t=e.substring(exports.libraryPrefix.length),r=e.substring(exports.libraryPrefix.length)+"/index";if(exports.libraryFiles.hasOwnProperty(t))n=exports.libraryFiles[t],e=exports.libraryPrefix+t+".ts";else if(exports.libraryFiles.hasOwnProperty(r))n=exports.libraryFiles[r],e=exports.libraryPrefix+r+".ts";else for(let i=0,s=b.length;i{assemblyscript.parseFile(n,e,!1,x)})}if(checkDiagnostics(x,i))return t(Error("Parse error"))}for(let n=0,r=e.length;n{x=assemblyscript.parseFile(s,i,!0,x)});let o=await y();if(o)return o}!function(e,...n){h.forEach(t=>{"function"==typeof t[e]&&t[e](...n)})}("afterParse",x);{let e=await y();if(e)return e}const g=assemblyscript.finishParsing(x);var m=0,v=0;u.optimize&&(m=exports.defaultOptimizeLevel,v=exports.defaultShrinkLevel),"number"==typeof u.optimizeLevel&&(m=u.optimizeLevel),"number"==typeof u.shrinkLevel&&(v=u.shrinkLevel),m=Math.min(Math.max(m,0),3),v=Math.min(Math.max(v,0),2);const E=assemblyscript.createOptions();if(assemblyscript.setTarget(E,0),assemblyscript.setNoAssert(E,u.noAssert),assemblyscript.setImportMemory(E,u.importMemory),assemblyscript.setSharedMemory(E,u.sharedMemory),assemblyscript.setImportTable(E,u.importTable),assemblyscript.setMemoryBase(E,u.memoryBase>>>0),assemblyscript.setSourceMap(E,null!=u.sourceMap),assemblyscript.setOptimizeLevelHints(E,m,v),u.noLib||(assemblyscript.setGlobalAlias(E,"Math","NativeMath"),assemblyscript.setGlobalAlias(E,"Mathf","NativeMathf"),assemblyscript.setGlobalAlias(E,"abort","~lib/env/abort"),assemblyscript.setGlobalAlias(E,"trace","~lib/env/trace")),u.use){let e=u.use;for(let n=0,r=e.length;n{try{l.compileTime+=measure(()=>{_=assemblyscript.compileProgram(g,E)})}catch(e){return t(e)}})(),checkDiagnostics(x,i))return _&&_.dispose(),t(Error("Compile error"));if(u.validate&&(l.validateCount++,l.validateTime+=measure(()=>{if(!_.validate())return _.dispose(),t(Error("Validate error"))})),"clamp"===u.trapMode)l.optimizeCount++,l.optimizeTime+=measure(()=>{_.runPasses(["trap-mode-clamp"])});else if("js"===u.trapMode)l.optimizeCount++,l.optimizeTime+=measure(()=>{_.runPasses(["trap-mode-js"])});else if("allow"!==u.trapMode)return _.dispose(),t(Error("Unsupported trap mode"));(m>=3||v>=2)&&(m=4),_.setOptimizeLevel(m),_.setShrinkLevel(v),_.setDebugInfo(u.debug);var A=[];if(u.runPasses&&("string"==typeof u.runPasses&&(u.runPasses=u.runPasses.split(",")),u.runPasses.length&&u.runPasses.forEach(e=>{A.indexOf(e)<0&&A.push(e)})),(m>0||v>0)&&(l.optimizeCount++,l.optimizeTime+=measure(()=>{_.optimize()})),A.length&&(l.optimizeCount++,l.optimizeTime+=measure(()=>{_.runPasses(A.map(e=>e.trim()))})),!u.noEmit){let e=!1,n=!1;if(null!=u.outFile&&(/\.was?t$/.test(u.outFile)&&null==u.textFile?u.textFile=u.outFile:/\.js$/.test(u.outFile)&&null==u.asmjsFile?u.asmjsFile=u.outFile:null==u.binaryFile&&(u.binaryFile=u.outFile)),null!=u.binaryFile){let r,o=null!=u.sourceMap?u.sourceMap.length?u.sourceMap:path.basename(u.binaryFile)+".map":null;if(l.emitCount++,l.emitTime+=measure(()=>{r=_.toBinary(o)}),u.binaryFile.length?await s(path.join(d,u.binaryFile),r.output):(I(r.output),e=!0),n=!0,null!=r.sourceMap)if(u.binaryFile.length){let e=JSON.parse(r.sourceMap);e.sourceRoot=exports.sourceMapRoot,e.sources.forEach(async(n,r)=>{let i=null;if(n.startsWith(exports.libraryPrefix)){let e=n.substring(exports.libraryPrefix.length).replace(/\.ts$/,"");if(exports.libraryFiles.hasOwnProperty(e))i=exports.libraryFiles[e];else for(let e=0,t=b.length;e{t=_.toAsmjs()}),await s(path.join(d,u.asmjsFile),t)):e||(l.emitCount++,l.emitTime+=measure(()=>{t=_.toAsmjs()}),I(t),e=!0),n=!0}if(null!=u.idlFile){let t;u.idlFile.length?(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildIDL(g)}),await s(path.join(d,u.idlFile),t)):e||(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildIDL(g)}),I(t),e=!0),n=!0}if(null!=u.tsdFile){let t;u.tsdFile.length?(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildTSD(g)}),await s(path.join(d,u.tsdFile),t)):e||(l.emitCount++,l.emitTime+=measure(()=>{t=assemblyscript.buildTSD(g)}),I(t),e=!0),n=!0}if(null!=u.textFile||!n){let n;u.textFile&&u.textFile.length?(l.emitCount++,l.emitTime+=measure(()=>{n=_.toText()}),await s(path.join(d,u.textFile),n)):e||(l.emitCount++,l.emitTime+=measure(()=>{n=_.toText()}),I(n))}}return _.dispose(),u.measure&&printStats(l,i),t(null);async function F(e,n){try{let t,r=n?path.join(n,e):e;return l.readCount++,l.readTime+=measure(()=>{t=fs.readFileSync(r,{encoding:"utf8"})}),t}catch(e){return console.log(e),null}}async function z(e,n,t){try{let r=t?path.join(t,e):e;return l.writeCount++,l.writeTime+=measure(()=>{mkdirp(path.dirname(r)),"string"==typeof n?fs.writeFileSync(r,n,{encoding:"utf8"}):fs.writeFileSync(r,n)}),!0}catch(e){return!1}}function S(e,n){let t=e?path.join(n,e):e;var r;try{return l.readTime+=measure(()=>{r=fs.readdirSync(t).filter(e=>/^(?!.*\.d\.ts$).*\.ts$/.test(e))}),r}catch(e){return[]}}function I(e){I.used||(l.writeCount++,I.used=!0),l.writeTime+=measure(()=>{"string"==typeof e?r.write(e,{encoding:"utf8"}):r.write(e)})}},exports.checkDiagnostics=checkDiagnostics,exports.createStats=createStats,process.hrtime||(process.hrtime=__webpack_require__(13)),exports.measure=measure,exports.formatTime=formatTime,exports.printStats=printStats;var allocBuffer=void 0!==global&&global.Buffer?global.Buffer.allocUnsafe||function(e){return new global.Buffer(e)}:function(e){return new Uint8Array(e)};function createMemoryStream(e){var n=[];return n.write=function(n){if(e&&e(n),"string"==typeof n){let e=allocBuffer(utf8.length(n));utf8.write(n,e,0),n=e}this.push(n)},n.reset=function(){n.length=0},n.toBuffer=function(){for(var e=0,n=0,t=this.length;n191&&r<224?a[s++]=(31&r)<<6|63&e[n++]:r>239&&r<365?(r=((7&r)<<18|(63&e[n++])<<12|(63&e[n++])<<6|63&e[n++])-65536,a[s++]=55296+(r>>10),a[s++]=56320+(1023&r)):a[s++]=(15&r)<<12|(63&e[n++])<<6|63&e[n++],s>8191&&((i||(i=[])).push(String.fromCharCode.apply(String,a)),s=0);return i?(s&&i.push(String.fromCharCode.apply(String,a.slice(0,s))),i.join("")):String.fromCharCode.apply(String,a.slice(0,s))},r.write=function(e,n,t){for(var r,i,a=t,s=0;s>6|192,n[t++]=63&r|128):55296==(64512&r)&&56320==(64512&(i=e.charCodeAt(s+1)))?(r=65536+((1023&r)<<10)+(1023&i),++s,n[t++]=r>>18|240,n[t++]=r>>12&63|128,n[t++]=r>>6&63|128,n[t++]=63&r|128):(n[t++]=r>>12|224,n[t++]=r>>6&63|128,n[t++]=63&r|128);return t-a}},function(e,n,t){(function(e){var t=void 0!==e&&e||{},r=t.env&&"CI"in t.env;function i(e,t){var i=t||{};return i.supported=e&&!!e.isTTY||r,i.gray=(e=>i.supported?n.GRAY+e+n.RESET:e),i.red=(e=>i.supported?n.RED+e+n.RESET:e),i.green=(e=>i.supported?n.GREEN+e+n.RESET:e),i.yellow=(e=>i.supported?n.YELLOW+e+n.RESET:e),i.blue=(e=>i.supported?n.BLUE+e+n.RESET:e),i.magenta=(e=>i.supported?n.MAGENTA+e+n.RESET:e),i.cyan=(e=>i.supported?n.CYAN+e+n.RESET:e),i.white=(e=>i.supported?n.WHITE+e+n.RESET:e),i}n.stdout=i(t.stdout,n),n.stderr=i(t.stderr),n.from=i,n.GRAY="",n.RED="",n.GREEN="",n.YELLOW="",n.BLUE="",n.MAGENTA="",n.CYAN="",n.WHITE="",n.RESET=""}).call(this,t(0))},function(e,n){n.parse=function(e,n){var t={},r=[],arguments=[],i=[],a={};Object.keys(n).forEach(e=>{var r=n[e];null!=r.alias&&("string"==typeof r.alias?a[r.alias]=e:Array.isArray(r.alias)&&r.alias.forEach(n=>a[n]=e)),null!=r.default&&(t[e]=r.default)});for(var s=0,o=(e=e.slice()).length;st[e]=o.value[e])}else r.push(i)}for(;s{var s=e[n];if(null!=s.description){for(var o="";o.length{for(let n=0;n 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\r\n * Compiler frontend for node.js\r\n *\r\n * Uses the low-level API exported from src/index.ts so it works with the compiler compiled to\r\n * JavaScript as well as the compiler compiled to WebAssembly (eventually). Runs the sources\r\n * directly through ts-node if distribution files are not present (indicated by a `-dev` version).\r\n *\r\n * Can also be packaged as a bundle suitable for in-browser use with the standard library injected\r\n * in the build step. See dist/asc.js for the bundle and webpack.config.js for building details.\r\n *\r\n * @module cli/asc\r\n */\r\n\r\n// Use \".\" instead of \"/\" as cwd in browsers\r\nif (process.browser) process.cwd = function() { return \".\"; };\r\n\r\nconst fs = require(\"fs\");\r\nconst path = require(\"path\");\r\nconst utf8 = require(\"@protobufjs/utf8\");\r\nconst colorsUtil = require(\"./util/colors\");\r\nconst optionsUtil = require(\"./util/options\");\r\nconst mkdirp = require(\"./util/mkdirp\");\r\nconst EOL = process.platform === \"win32\" ? \"\\r\\n\" : \"\\n\";\r\n\r\n// Emscripten adds an `uncaughtException` listener to Binaryen that results in an additional\r\n// useless code fragment on top of an actual error. suppress this:\r\nif (process.removeAllListeners) process.removeAllListeners(\"uncaughtException\");\r\n\r\n// Use distribution files if present, otherwise run the sources directly\r\nvar assemblyscript, isDev = false;\r\n(() => {\r\n try { // `asc` on the command line\r\n assemblyscript = require(\"../dist/assemblyscript.js\");\r\n } catch (e) {\r\n try { // `asc` on the command line without dist files\r\n require(\"ts-node\").register({ project: path.join(__dirname, \"..\", \"src\", \"tsconfig.json\") });\r\n require(\"../src/glue/js\");\r\n assemblyscript = require(\"../src\");\r\n isDev = true;\r\n } catch (e_ts) {\r\n try { // `require(\"dist/asc.js\")` in explicit browser tests\r\n assemblyscript = eval(\"require('./assemblyscript')\");\r\n } catch (e) {\r\n // combine both errors that lead us here\r\n e.stack = e_ts.stack + \"\\n---\\n\" + e.stack;\r\n throw e;\r\n }\r\n }\r\n }\r\n})();\r\n\r\n/** Whether this is a webpack bundle or not. */\r\nexports.isBundle = typeof BUNDLE_VERSION === \"string\";\r\n\r\n/** Whether asc runs the sources directly or not. */\r\nexports.isDev = isDev;\r\n\r\n/** AssemblyScript version. */\r\nexports.version = exports.isBundle ? BUNDLE_VERSION : require(\"../package.json\").version;\r\n\r\n/** Available CLI options. */\r\nexports.options = require(\"./asc.json\");\r\n\r\n/** Common root used in source maps. */\r\nexports.sourceMapRoot = \"assemblyscript:///\";\r\n\r\n/** Prefix used for library files. */\r\nexports.libraryPrefix = assemblyscript.LIBRARY_PREFIX;\r\n\r\n/** Default Binaryen optimization level. */\r\nexports.defaultOptimizeLevel = 2;\r\n\r\n/** Default Binaryen shrink level. */\r\nexports.defaultShrinkLevel = 1;\r\n\r\n/** Bundled library files. */\r\nexports.libraryFiles = exports.isBundle ? BUNDLE_LIBRARY : (() => { // set up if not a bundle\r\n const libDir = path.join(__dirname, \"..\", \"std\", \"assembly\");\r\n const libFiles = require(\"glob\").sync(\"**/!(*.d).ts\", { cwd: libDir });\r\n const bundled = {};\r\n libFiles.forEach(file => bundled[file.replace(/\\.ts$/, \"\")] = fs.readFileSync(path.join(libDir, file), \"utf8\" ));\r\n return bundled;\r\n})();\r\n\r\n/** Bundled definition files. */\r\nexports.definitionFiles = exports.isBundle ? BUNDLE_DEFINITIONS : (() => { // set up if not a bundle\r\n const stdDir = path.join(__dirname, \"..\", \"std\");\r\n return {\r\n \"assembly\": fs.readFileSync(path.join(stdDir, \"assembly\", \"index.d.ts\"), \"utf8\"),\r\n \"portable\": fs.readFileSync(path.join(stdDir, \"portable\", \"index.d.ts\"), \"utf8\")\r\n };\r\n})();\r\n\r\n/** Convenience function that parses and compiles source strings directly. */\r\nexports.compileString = (sources, options) => {\r\n if (typeof sources === \"string\") sources = { \"input.ts\": sources };\r\n const output = Object.create({\r\n stdout: createMemoryStream(),\r\n stderr: createMemoryStream()\r\n });\r\n var argv = [\r\n \"--binaryFile\", \"binary\",\r\n \"--textFile\", \"text\",\r\n ];\r\n Object.keys(options || {}).forEach(key => {\r\n var val = options[key];\r\n if (Array.isArray(val)) val.forEach(val => argv.push(\"--\" + key, String(val)));\r\n else argv.push(\"--\" + key, String(val));\r\n });\r\n exports.main(argv.concat(Object.keys(sources)), {\r\n stdout: output.stdout,\r\n stderr: output.stderr,\r\n readFile: name => sources.hasOwnProperty(name) ? sources[name] : null,\r\n writeFile: (name, contents) => output[name] = contents,\r\n listFiles: () => []\r\n });\r\n return output;\r\n}\r\n\r\n/** Runs the command line utility using the specified arguments array. */\r\nexports.main = function main(argv, options, callback) {\r\n if (typeof options === \"function\") {\r\n callback = options;\r\n options = {};\r\n } else if (!options) {\r\n options = {};\r\n }\r\n\r\n const stdout = options.stdout || process.stdout;\r\n const stderr = options.stderr || process.stderr;\r\n const readFile = options.readFile || readFileNode;\r\n const writeFile = options.writeFile || writeFileNode;\r\n const listFiles = options.listFiles || listFilesNode;\r\n const stats = options.stats || createStats();\r\n\r\n // Output must be specified if not present in the environment\r\n if (!stdout) throw Error(\"'options.stdout' must be specified\");\r\n if (!stderr) throw Error(\"'options.stderr' must be specified\");\r\n\r\n const opts = optionsUtil.parse(argv, exports.options);\r\n const args = opts.options;\r\n argv = opts.arguments;\r\n if (args.noColors) {\r\n colorsUtil.stdout.supported =\r\n colorsUtil.stderr.supported = false;\r\n } else {\r\n colorsUtil.stdout = colorsUtil.from(stdout);\r\n colorsUtil.stderr = colorsUtil.from(stderr);\r\n }\r\n\r\n // Check for unknown arguments\r\n if (opts.unknown.length) {\r\n opts.unknown.forEach(arg => {\r\n stderr.write(colorsUtil.stderr.yellow(\"WARN: \") + \"Unknown option '\" + arg + \"'\" + EOL);\r\n });\r\n }\r\n\r\n // Check for trailing arguments\r\n if (opts.trailing.length) {\r\n stderr.write(colorsUtil.stderr.yellow(\"WARN: \") + \"Unsupported trailing arguments: \" + opts.trailing.join(\" \") + EOL);\r\n }\r\n\r\n // Use default callback if none is provided\r\n if (!callback) callback = function defaultCallback(err) {\r\n var code = 0;\r\n if (err) {\r\n stderr.write(colorsUtil.stderr.red(\"ERROR: \") + err.stack.replace(/^ERROR: /i, \"\") + EOL);\r\n code = 1;\r\n }\r\n return code;\r\n };\r\n\r\n // Just print the version if requested\r\n if (args.version) {\r\n stdout.write(\"Version \" + exports.version + (isDev ? \"-dev\" : \"\") + EOL);\r\n return callback(null);\r\n }\r\n // Print the help message if requested or no source files are provided\r\n if (args.help || !argv.length) {\r\n var out = args.help ? stdout : stderr;\r\n var color = args.help ? colorsUtil.stdout : colorsUtil.stderr;\r\n out.write([\r\n color.white(\"SYNTAX\"),\r\n \" \" + color.cyan(\"asc\") + \" [entryFile ...] [options]\",\r\n \"\",\r\n color.white(\"EXAMPLES\"),\r\n \" \" + color.cyan(\"asc\") + \" hello.ts\",\r\n \" \" + color.cyan(\"asc\") + \" hello.ts -b hello.wasm -t hello.wat\",\r\n \" \" + color.cyan(\"asc\") + \" hello1.ts hello2.ts -b -O > hello.wasm\",\r\n \"\",\r\n color.white(\"OPTIONS\"),\r\n ].concat(\r\n optionsUtil.help(exports.options, 24, EOL)\r\n ).join(EOL) + EOL);\r\n return callback(null);\r\n }\r\n\r\n // I/O must be specified if not present in the environment\r\n if (!fs.readFileSync) {\r\n if (readFile === readFileNode) throw Error(\"'options.readFile' must be specified\");\r\n if (writeFile === writeFileNode) throw Error(\"'options.writeFile' must be specified\");\r\n if (listFiles === listFilesNode) throw Error(\"'options.listFiles' must be specified\");\r\n }\r\n\r\n // Set up base directory\r\n const baseDir = args.baseDir ? path.resolve(args.baseDir) : \".\";\r\n\r\n // Set up transforms\r\n const transforms = [];\r\n if (args.transform) {\r\n args.transform.forEach(transform =>\r\n transforms.push(\r\n require(\r\n path.isAbsolute(transform = transform.trim())\r\n ? transform\r\n : path.join(process.cwd(), transform)\r\n )\r\n )\r\n );\r\n }\r\n function applyTransform(name, ...args) {\r\n transforms.forEach(transform => {\r\n if (typeof transform[name] === \"function\") transform[name](...args);\r\n });\r\n }\r\n\r\n // Begin parsing\r\n var parser = null;\r\n\r\n // Include library files\r\n if (!args.noLib) {\r\n Object.keys(exports.libraryFiles).forEach(libPath => {\r\n if (libPath.indexOf(\"/\") >= 0) return; // in sub-directory: imported on demand\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n parser = assemblyscript.parseFile(\r\n exports.libraryFiles[libPath],\r\n exports.libraryPrefix + libPath + \".ts\",\r\n false,\r\n parser\r\n );\r\n });\r\n });\r\n } else { // always include builtins\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n parser = assemblyscript.parseFile(\r\n exports.libraryFiles[\"builtins\"],\r\n exports.libraryPrefix + \"builtins.ts\",\r\n false,\r\n parser\r\n );\r\n });\r\n }\r\n const customLibDirs = [];\r\n if (args.lib) {\r\n let lib = args.lib;\r\n if (typeof lib === \"string\") lib = lib.split(\",\");\r\n Array.prototype.push.apply(customLibDirs, lib.map(lib => lib.trim()));\r\n for (let i = 0, k = customLibDirs.length; i < k; ++i) { // custom\r\n let libDir = customLibDirs[i];\r\n let libFiles;\r\n if (libDir.endsWith(\".ts\")) {\r\n libFiles = [ path.basename(libDir) ];\r\n libDir = path.dirname(libDir);\r\n } else {\r\n libFiles = listFiles(libDir);\r\n }\r\n for (let j = 0, l = libFiles.length; j < l; ++j) {\r\n let libPath = libFiles[j];\r\n let libText = readFile(libPath, libDir);\r\n if (libText === null) return callback(Error(\"Library file '\" + libPath + \"' not found.\"));\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n parser = assemblyscript.parseFile(\r\n libText,\r\n exports.libraryPrefix + libPath,\r\n false,\r\n parser\r\n );\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Parses the backlog of imported files after including entry files\r\n function parseBacklog() {\r\n var sourcePath, sourceText;\r\n while ((sourcePath = parser.nextFile()) != null) {\r\n\r\n // Load library file if explicitly requested\r\n if (sourcePath.startsWith(exports.libraryPrefix)) {\r\n const plainName = sourcePath.substring(exports.libraryPrefix.length);\r\n const indexName = sourcePath.substring(exports.libraryPrefix.length) + \"/index\";\r\n if (exports.libraryFiles.hasOwnProperty(plainName)) {\r\n sourceText = exports.libraryFiles[plainName];\r\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\r\n } else if (exports.libraryFiles.hasOwnProperty(indexName)) {\r\n sourceText = exports.libraryFiles[indexName];\r\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\r\n } else {\r\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\r\n sourceText = readFile(plainName + \".ts\", customLibDirs[i]);\r\n if (sourceText !== null) {\r\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\r\n break;\r\n } else {\r\n sourceText = readFile(indexName + \".ts\", customLibDirs[i]);\r\n if (sourceText !== null) {\r\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Otherwise try nextFile.ts, nextFile/index.ts, ~lib/nextFile.ts, ~lib/nextFile/index.ts\r\n } else {\r\n const plainName = sourcePath;\r\n const indexName = sourcePath + \"/index\";\r\n sourceText = readFile(plainName + \".ts\", baseDir);\r\n if (sourceText !== null) {\r\n sourcePath = plainName + \".ts\";\r\n } else {\r\n sourceText = readFile(indexName + \".ts\", baseDir);\r\n if (sourceText !== null) {\r\n sourcePath = indexName + \".ts\";\r\n } else if (!plainName.startsWith(\".\")) {\r\n if (exports.libraryFiles.hasOwnProperty(plainName)) {\r\n sourceText = exports.libraryFiles[plainName];\r\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\r\n } else if (exports.libraryFiles.hasOwnProperty(indexName)) {\r\n sourceText = exports.libraryFiles[indexName];\r\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\r\n } else {\r\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\r\n const dir = customLibDirs[i];\r\n sourceText = readFile(plainName + \".ts\", customLibDirs[i]);\r\n if (sourceText !== null) {\r\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\r\n break;\r\n } else {\r\n sourceText = readFile(indexName + \".ts\", customLibDirs[i]);\r\n if (sourceText !== null) {\r\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (sourceText == null) {\r\n return callback(Error(\"Import file '\" + sourcePath + \".ts' not found.\"));\r\n }\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n assemblyscript.parseFile(sourceText, sourcePath, false, parser);\r\n });\r\n }\r\n if (checkDiagnostics(parser, stderr)) {\r\n return callback(Error(\"Parse error\"));\r\n }\r\n }\r\n\r\n // Include entry files\r\n for (let i = 0, k = argv.length; i < k; ++i) {\r\n const filename = argv[i];\r\n\r\n let sourcePath = String(filename).replace(/\\\\/g, \"/\").replace(/(\\.ts|\\/)$/, \"\");\r\n\r\n // Try entryPath.ts, then entryPath/index.ts\r\n let sourceText = readFile(sourcePath + \".ts\", baseDir);\r\n if (sourceText === null) {\r\n sourceText = readFile(sourcePath + \"/index.ts\", baseDir);\r\n if (sourceText === null) {\r\n return callback(Error(\"Entry file '\" + sourcePath + \".ts' not found.\"));\r\n } else {\r\n sourcePath += \"/index.ts\";\r\n }\r\n } else {\r\n sourcePath += \".ts\";\r\n }\r\n\r\n stats.parseCount++;\r\n stats.parseTime += measure(() => {\r\n parser = assemblyscript.parseFile(sourceText, sourcePath, true, parser);\r\n });\r\n let code = parseBacklog();\r\n if (code) return code;\r\n }\r\n\r\n applyTransform(\"afterParse\", parser);\r\n {\r\n let code = parseBacklog();\r\n if (code) return code;\r\n }\r\n\r\n // Finish parsing\r\n const program = assemblyscript.finishParsing(parser);\r\n\r\n // Set up optimization levels\r\n var optimizeLevel = 0;\r\n var shrinkLevel = 0;\r\n if (args.optimize) {\r\n optimizeLevel = exports.defaultOptimizeLevel;\r\n shrinkLevel = exports.defaultShrinkLevel;\r\n }\r\n if (typeof args.optimizeLevel === \"number\") {\r\n optimizeLevel = args.optimizeLevel;\r\n }\r\n if (typeof args.shrinkLevel === \"number\") {\r\n shrinkLevel = args.shrinkLevel;\r\n }\r\n optimizeLevel = Math.min(Math.max(optimizeLevel, 0), 3);\r\n shrinkLevel = Math.min(Math.max(shrinkLevel, 0), 2);\r\n\r\n // Begin compilation\r\n const compilerOptions = assemblyscript.createOptions();\r\n assemblyscript.setTarget(compilerOptions, 0);\r\n assemblyscript.setNoAssert(compilerOptions, args.noAssert);\r\n assemblyscript.setImportMemory(compilerOptions, args.importMemory);\r\n assemblyscript.setSharedMemory(compilerOptions, args.sharedMemory);\r\n assemblyscript.setImportTable(compilerOptions, args.importTable);\r\n assemblyscript.setMemoryBase(compilerOptions, args.memoryBase >>> 0);\r\n assemblyscript.setSourceMap(compilerOptions, args.sourceMap != null);\r\n assemblyscript.setOptimizeLevelHints(compilerOptions, optimizeLevel, shrinkLevel);\r\n\r\n if (!args.noLib) {\r\n // Initialize default aliases\r\n assemblyscript.setGlobalAlias(compilerOptions, \"Math\", \"NativeMath\");\r\n assemblyscript.setGlobalAlias(compilerOptions, \"Mathf\", \"NativeMathf\");\r\n assemblyscript.setGlobalAlias(compilerOptions, \"abort\", \"~lib/env/abort\");\r\n assemblyscript.setGlobalAlias(compilerOptions, \"trace\", \"~lib/env/trace\");\r\n }\r\n\r\n // Add or override aliases if specified\r\n if (args.use) {\r\n let aliases = args.use;\r\n for (let i = 0, k = aliases.length; i < k; ++i) {\r\n let part = aliases[i];\r\n let p = part.indexOf(\"=\");\r\n if (p < 0) return callback(Error(\"Global alias '\" + part + \"' is invalid.\"));\r\n let name = part.substring(0, p).trim();\r\n let alias = part.substring(p + 1).trim();\r\n if (!name.length) return callback(Error(\"Global alias '\" + part + \"' is invalid.\"));\r\n assemblyscript.setGlobalAlias(compilerOptions, name, alias);\r\n }\r\n }\r\n\r\n // Enable additional features if specified\r\n var features = args.enable;\r\n if (features != null) {\r\n if (typeof features === \"string\") features = features.split(\",\");\r\n for (let i = 0, k = features.length; i < k; ++i) {\r\n let name = features[i].trim();\r\n let flag = assemblyscript[\"FEATURE_\" + name.replace(/\\-/g, \"_\").toUpperCase()];\r\n if (!flag) return callback(Error(\"Feature '\" + name + \"' is unknown.\"));\r\n assemblyscript.enableFeature(compilerOptions, flag);\r\n }\r\n }\r\n\r\n var module;\r\n stats.compileCount++;\r\n (() => {\r\n try {\r\n stats.compileTime += measure(() => {\r\n module = assemblyscript.compileProgram(program, compilerOptions);\r\n });\r\n } catch (e) {\r\n return callback(e);\r\n }\r\n })();\r\n if (checkDiagnostics(parser, stderr)) {\r\n if (module) module.dispose();\r\n return callback(Error(\"Compile error\"));\r\n }\r\n\r\n // Validate the module if requested\r\n if (args.validate) {\r\n stats.validateCount++;\r\n stats.validateTime += measure(() => {\r\n if (!module.validate()) {\r\n module.dispose();\r\n return callback(Error(\"Validate error\"));\r\n }\r\n });\r\n }\r\n\r\n // Set Binaryen-specific options\r\n if (args.trapMode === \"clamp\") {\r\n stats.optimizeCount++;\r\n stats.optimizeTime += measure(() => {\r\n module.runPasses([ \"trap-mode-clamp\" ]);\r\n });\r\n } else if (args.trapMode === \"js\") {\r\n stats.optimizeCount++;\r\n stats.optimizeTime += measure(() => {\r\n module.runPasses([ \"trap-mode-js\" ]);\r\n });\r\n } else if (args.trapMode !== \"allow\") {\r\n module.dispose();\r\n return callback(Error(\"Unsupported trap mode\"));\r\n }\r\n\r\n // Implicitly run costly non-LLVM optimizations on -O3 or -Oz\r\n // see: https://github.com/WebAssembly/binaryen/pull/1596\r\n if (optimizeLevel >= 3 || shrinkLevel >= 2) optimizeLevel = 4;\r\n\r\n module.setOptimizeLevel(optimizeLevel);\r\n module.setShrinkLevel(shrinkLevel);\r\n module.setDebugInfo(args.debug);\r\n\r\n var runPasses = [];\r\n if (args.runPasses) {\r\n if (typeof args.runPasses === \"string\") {\r\n args.runPasses = args.runPasses.split(\",\");\r\n }\r\n if (args.runPasses.length) {\r\n args.runPasses.forEach(pass => {\r\n if (runPasses.indexOf(pass) < 0)\r\n runPasses.push(pass);\r\n });\r\n }\r\n }\r\n\r\n // Optimize the module if requested\r\n if (optimizeLevel > 0 || shrinkLevel > 0) {\r\n stats.optimizeCount++;\r\n stats.optimizeTime += measure(() => {\r\n module.optimize();\r\n });\r\n }\r\n\r\n // Run additional passes if requested\r\n if (runPasses.length) {\r\n stats.optimizeCount++;\r\n stats.optimizeTime += measure(() => {\r\n module.runPasses(runPasses.map(pass => pass.trim()));\r\n });\r\n }\r\n\r\n // Prepare output\r\n if (!args.noEmit) {\r\n let hasStdout = false;\r\n let hasOutput = false;\r\n\r\n if (args.outFile != null) {\r\n if (/\\.was?t$/.test(args.outFile) && args.textFile == null) {\r\n args.textFile = args.outFile;\r\n } else if (/\\.js$/.test(args.outFile) && args.asmjsFile == null) {\r\n args.asmjsFile = args.outFile;\r\n } else if (args.binaryFile == null) {\r\n args.binaryFile = args.outFile;\r\n }\r\n }\r\n\r\n // Write binary\r\n if (args.binaryFile != null) {\r\n let sourceMapURL = args.sourceMap != null\r\n ? args.sourceMap.length\r\n ? args.sourceMap\r\n : path.basename(args.binaryFile) + \".map\"\r\n : null;\r\n\r\n let wasm;\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n wasm = module.toBinary(sourceMapURL)\r\n });\r\n\r\n if (args.binaryFile.length) {\r\n writeFile(args.binaryFile, wasm.output, baseDir);\r\n } else {\r\n writeStdout(wasm.output);\r\n hasStdout = true;\r\n }\r\n hasOutput = true;\r\n\r\n // Post-process source map\r\n if (wasm.sourceMap != null) {\r\n if (args.binaryFile.length) {\r\n let sourceMap = JSON.parse(wasm.sourceMap);\r\n sourceMap.sourceRoot = exports.sourceMapRoot;\r\n sourceMap.sources.forEach((name, index) => {\r\n let text = null;\r\n if (name.startsWith(exports.libraryPrefix)) {\r\n let stdName = name.substring(exports.libraryPrefix.length).replace(/\\.ts$/, \"\");\r\n if (exports.libraryFiles.hasOwnProperty(stdName)) {\r\n text = exports.libraryFiles[stdName];\r\n } else {\r\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\r\n text = readFile(name.substring(exports.libraryPrefix.length), customLibDirs[i]);\r\n if (text !== null) break;\r\n }\r\n }\r\n } else {\r\n text = readFile(name, baseDir);\r\n }\r\n if (text === null) {\r\n return callback(Error(\"Source file '\" + name + \"' not found.\"));\r\n }\r\n if (!sourceMap.sourceContents) sourceMap.sourceContents = [];\r\n sourceMap.sourceContents[index] = text;\r\n });\r\n writeFile(path.join(\r\n path.dirname(args.binaryFile),\r\n path.basename(sourceMapURL)\r\n ).replace(/^\\.\\//, \"\"), JSON.stringify(sourceMap), baseDir);\r\n } else {\r\n stderr.write(\"Skipped source map (stdout already occupied)\" + EOL);\r\n }\r\n }\r\n }\r\n\r\n // Write asm.js\r\n if (args.asmjsFile != null) {\r\n let asm;\r\n if (args.asmjsFile.length) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n asm = module.toAsmjs();\r\n });\r\n writeFile(args.asmjsFile, asm, baseDir);\r\n } else if (!hasStdout) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n asm = module.toAsmjs();\r\n });\r\n writeStdout(asm);\r\n hasStdout = true;\r\n }\r\n hasOutput = true;\r\n }\r\n\r\n // Write WebIDL\r\n if (args.idlFile != null) {\r\n let idl;\r\n if (args.idlFile.length) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n idl = assemblyscript.buildIDL(program);\r\n });\r\n writeFile(args.idlFile, idl, baseDir);\r\n } else if (!hasStdout) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n idl = assemblyscript.buildIDL(program);\r\n });\r\n writeStdout(idl);\r\n hasStdout = true;\r\n }\r\n hasOutput = true;\r\n }\r\n\r\n // Write TypeScript definition\r\n if (args.tsdFile != null) {\r\n let tsd;\r\n if (args.tsdFile.length) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n tsd = assemblyscript.buildTSD(program);\r\n });\r\n writeFile(args.tsdFile, tsd, baseDir);\r\n } else if (!hasStdout) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n tsd = assemblyscript.buildTSD(program);\r\n });\r\n writeStdout(tsd);\r\n hasStdout = true;\r\n }\r\n hasOutput = true;\r\n }\r\n\r\n // Write text (must be last)\r\n if (args.textFile != null || !hasOutput) {\r\n let wat;\r\n if (args.textFile && args.textFile.length) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n wat = module.toText();\r\n });\r\n writeFile(args.textFile, wat, baseDir);\r\n } else if (!hasStdout) {\r\n stats.emitCount++;\r\n stats.emitTime += measure(() => {\r\n wat = module.toText()\r\n });\r\n writeStdout(wat);\r\n }\r\n }\r\n }\r\n\r\n module.dispose();\r\n if (args.measure) {\r\n printStats(stats, stderr);\r\n }\r\n return callback(null);\r\n\r\n function readFileNode(filename, baseDir) {\r\n try {\r\n let text;\r\n stats.readCount++;\r\n stats.readTime += measure(() => {\r\n text = fs.readFileSync(path.join(baseDir, filename), { encoding: \"utf8\" });\r\n });\r\n return text;\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n function writeFileNode(filename, contents, baseDir) {\r\n try {\r\n stats.writeCount++;\r\n stats.writeTime += measure(() => {\r\n mkdirp(path.join(baseDir, path.dirname(filename)));\r\n if (typeof contents === \"string\") {\r\n fs.writeFileSync(path.join(baseDir, filename), contents, { encoding: \"utf8\" } );\r\n } else {\r\n fs.writeFileSync(path.join(baseDir, filename), contents);\r\n }\r\n });\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n }\r\n\r\n function listFilesNode(dirname, baseDir) {\r\n var files;\r\n try {\r\n stats.readTime += measure(() => {\r\n files = fs.readdirSync(path.join(baseDir, dirname)).filter(file => /^(?!.*\\.d\\.ts$).*\\.ts$/.test(file));\r\n });\r\n return files;\r\n } catch (e) {\r\n return [];\r\n }\r\n }\r\n\r\n function writeStdout(contents) {\r\n if (!writeStdout.used) {\r\n stats.writeCount++;\r\n writeStdout.used = true;\r\n }\r\n stats.writeTime += measure(() => {\r\n if (typeof contents === \"string\") {\r\n stdout.write(contents, { encoding: \"utf8\" });\r\n } else {\r\n stdout.write(contents);\r\n }\r\n });\r\n }\r\n}\r\n\r\n/** Checks diagnostics emitted so far for errors. */\r\nfunction checkDiagnostics(emitter, stderr) {\r\n var diagnostic;\r\n var hasErrors = false;\r\n while ((diagnostic = assemblyscript.nextDiagnostic(emitter)) != null) {\r\n if (stderr) {\r\n stderr.write(\r\n assemblyscript.formatDiagnostic(diagnostic, stderr.isTTY, true) +\r\n EOL + EOL\r\n );\r\n }\r\n if (assemblyscript.isError(diagnostic)) hasErrors = true;\r\n }\r\n return hasErrors;\r\n}\r\n\r\nexports.checkDiagnostics = checkDiagnostics;\r\n\r\n/** Creates an empty set of stats. */\r\nfunction createStats() {\r\n return {\r\n readTime: 0,\r\n readCount: 0,\r\n writeTime: 0,\r\n writeCount: 0,\r\n parseTime: 0,\r\n parseCount: 0,\r\n compileTime: 0,\r\n compileCount: 0,\r\n emitTime: 0,\r\n emitCount: 0,\r\n validateTime: 0,\r\n validateCount: 0,\r\n optimizeTime: 0,\r\n optimizeCount: 0\r\n };\r\n}\r\n\r\nexports.createStats = createStats;\r\n\r\nif (!process.hrtime) process.hrtime = require(\"browser-process-hrtime\");\r\n\r\n/** Measures the execution time of the specified function. */\r\nfunction measure(fn) {\r\n const start = process.hrtime();\r\n fn();\r\n const times = process.hrtime(start);\r\n return times[0] * 1e9 + times[1];\r\n}\r\n\r\nexports.measure = measure;\r\n\r\n/** Formats a high resolution time to a human readable string. */\r\nfunction formatTime(time) {\r\n return time ? (time / 1e6).toFixed(3) + \" ms\" : \"N/A\";\r\n}\r\n\r\nexports.formatTime = formatTime;\r\n\r\n/** Formats and prints out the contents of a set of stats. */\r\nfunction printStats(stats, output) {\r\n function format(time, count) {\r\n return formatTime(time);\r\n }\r\n (output || process.stdout).write([\r\n \"I/O Read : \" + format(stats.readTime, stats.readCount),\r\n \"I/O Write : \" + format(stats.writeTime, stats.writeCount),\r\n \"Parse : \" + format(stats.parseTime, stats.parseCount),\r\n \"Compile : \" + format(stats.compileTime, stats.compileCount),\r\n \"Emit : \" + format(stats.emitTime, stats.emitCount),\r\n \"Validate : \" + format(stats.validateTime, stats.validateCount),\r\n \"Optimize : \" + format(stats.optimizeTime, stats.optimizeCount)\r\n ].join(EOL) + EOL);\r\n}\r\n\r\nexports.printStats = printStats;\r\n\r\nvar allocBuffer = typeof global !== \"undefined\" && global.Buffer\r\n ? global.Buffer.allocUnsafe || function(len) { return new global.Buffer(len); }\r\n : function(len) { return new Uint8Array(len) };\r\n\r\n/** Creates a memory stream that can be used in place of stdout/stderr. */\r\nfunction createMemoryStream(fn) {\r\n var stream = [];\r\n stream.write = function(chunk) {\r\n if (fn) fn(chunk);\r\n if (typeof chunk === \"string\") {\r\n let buffer = allocBuffer(utf8.length(chunk));\r\n utf8.write(chunk, buffer, 0);\r\n chunk = buffer;\r\n }\r\n this.push(chunk);\r\n };\r\n stream.reset = function() {\r\n stream.length = 0;\r\n };\r\n stream.toBuffer = function() {\r\n var offset = 0, i = 0, k = this.length;\r\n while (i < k) offset += this[i++].length;\r\n var buffer = allocBuffer(offset);\r\n offset = i = 0;\r\n while (i < k) {\r\n buffer.set(this[i], offset);\r\n offset += this[i].length;\r\n ++i;\r\n }\r\n return buffer;\r\n };\r\n stream.toString = function() {\r\n var buffer = this.toBuffer();\r\n return utf8.read(buffer, 0, buffer.length);\r\n };\r\n return stream;\r\n}\r\n\r\nexports.createMemoryStream = createMemoryStream;\r\n\r\n/** Compatible TypeScript compiler options for syntax highlighting etc. */\r\nexports.tscOptions = {\r\n alwaysStrict: true,\r\n noImplicitAny: true,\r\n noImplicitReturns: true,\r\n noImplicitThis: true,\r\n noEmitOnError: true,\r\n strictNullChecks: true,\r\n experimentalDecorators: true,\r\n target: \"esnext\",\r\n module: \"commonjs\",\r\n noLib: true,\r\n types: [],\r\n allowJs: false\r\n};\r\n","\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n var len = 0,\r\n c = 0;\r\n for (var i = 0; i < string.length; ++i) {\r\n c = string.charCodeAt(i);\r\n if (c < 128)\r\n len += 1;\r\n else if (c < 2048)\r\n len += 2;\r\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n ++i;\r\n len += 4;\r\n } else\r\n len += 3;\r\n }\r\n return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null,\r\n chunk = [],\r\n i = 0, // char offset\r\n t; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128)\r\n chunk[i++] = t;\r\n else if (t > 191 && t < 224)\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n } else\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n var start = offset,\r\n c1, // character 1\r\n c2; // character 2\r\n for (var i = 0; i < string.length; ++i) {\r\n c1 = string.charCodeAt(i);\r\n if (c1 < 128) {\r\n buffer[offset++] = c1;\r\n } else if (c1 < 2048) {\r\n buffer[offset++] = c1 >> 6 | 192;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n ++i;\r\n buffer[offset++] = c1 >> 18 | 240;\r\n buffer[offset++] = c1 >> 12 & 63 | 128;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else {\r\n buffer[offset++] = c1 >> 12 | 224;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n }\r\n }\r\n return offset - start;\r\n};\r\n","var proc = typeof process !== \"undefined\" && process || {};\r\nvar isCI = proc.env && \"CI\" in proc.env; // doesn't work when bundled because 'process' is a mock\r\n\r\nfunction from(stream, base) {\r\n var colors = base || {};\r\n colors.supported = (stream && !!stream.isTTY) || isCI;\r\n colors.gray = text => colors.supported ? exports.GRAY + text + exports.RESET : text;\r\n colors.red = text => colors.supported ? exports.RED + text + exports.RESET : text;\r\n colors.green = text => colors.supported ? exports.GREEN + text + exports.RESET : text;\r\n colors.yellow = text => colors.supported ? exports.YELLOW + text + exports.RESET : text;\r\n colors.blue = text => colors.supported ? exports.BLUE + text + exports.RESET : text;\r\n colors.magenta = text => colors.supported ? exports.MAGENTA + text + exports.RESET : text;\r\n colors.cyan = text => colors.supported ? exports.CYAN + text + exports.RESET : text;\r\n colors.white = text => colors.supported ? exports.WHITE + text + exports.RESET : text;\r\n return colors;\r\n}\r\n\r\nexports.stdout = from(proc.stdout, exports);\r\nexports.stderr = from(proc.stderr);\r\nexports.from = from;\r\n\r\nexports.GRAY = \"\\u001b[90m\";\r\nexports.RED = \"\\u001b[91m\";\r\nexports.GREEN = \"\\u001b[92m\";\r\nexports.YELLOW = \"\\u001b[93m\";\r\nexports.BLUE = \"\\u001b[94m\";\r\nexports.MAGENTA = \"\\u001b[95m\";\r\nexports.CYAN = \"\\u001b[96m\";\r\nexports.WHITE = \"\\u001b[97m\";\r\nexports.RESET = \"\\u001b[0m\";\r\n","// type | meaning\r\n// -----|---------------\r\n// b | boolean\r\n// i | integer\r\n// f | float\r\n// s | string\r\n// I | integer array\r\n// F | float array\r\n// S | string array\r\n\r\n/** Parses the specified command line arguments according to the given configuration. */\r\nfunction parse(argv, config) {\r\n var options = {};\r\n var unknown = [];\r\n var arguments = [];\r\n var trailing = [];\r\n\r\n // make an alias map and initialize defaults\r\n var aliases = {};\r\n Object.keys(config).forEach(key => {\r\n var option = config[key];\r\n if (option.alias != null) {\r\n if (typeof option.alias === \"string\") aliases[option.alias] = key;\r\n else if (Array.isArray(option.alias)) option.alias.forEach(alias => aliases[alias] = key);\r\n }\r\n if (option.default != null) options[key] = option.default;\r\n });\r\n\r\n // iterate over argv\r\n for (var i = 0, k = (argv = argv.slice()).length; i < k; ++i) {\r\n let arg = argv[i];\r\n if (arg == \"--\") { ++i; break; }\r\n let match = /^(?:(\\-\\w)(?:=(.*))?|(\\-\\-\\w{2,})(?:=(.*))?)$/.exec(arg), option, key;\r\n if (match) {\r\n if (config[arg]) option = config[key = arg]; // exact\r\n else if (match[1] != null) { // alias\r\n option = config[key = aliases[match[1].substring(1)]];\r\n if (option && match[2] != null) argv[i--] = match[2];\r\n } else if (match[3] != null) { // full\r\n option = config[key = match[3].substring(2)];\r\n if (option && match[4] != null) argv[i--] = match[4];\r\n }\r\n } else {\r\n if (arg.charCodeAt(0) == 45) option = config[key = arg]; // exact\r\n else { arguments.push(arg); continue; } // argument\r\n }\r\n if (option) {\r\n if (option.type == null || option.type === \"b\") options[key] = true; // flag\r\n else {\r\n if (i + 1 < argv.length && argv[i + 1].charCodeAt(0) != 45) { // present\r\n switch (option.type) {\r\n case \"i\": options[key] = parseInt(argv[++i], 10); break;\r\n case \"I\": options[key] = (options[key] || []).concat(parseInt(argv[++i], 10)); break;\r\n case \"f\": options[key] = parseFloat(argv[++i]); break;\r\n case \"F\": options[key] = (options[key] || []).concat(parseFloat(argv[++i])); break;\r\n case \"s\": options[key] = String(argv[++i]); break;\r\n case \"S\": options[key] = (options[key] || []).concat(argv[++i].split(\",\")); break;\r\n default: unknown.push(arg); --i;\r\n }\r\n } else { // omitted\r\n switch (option.type) {\r\n case \"i\":\r\n case \"f\": options[key] = option.default || 0; break;\r\n case \"s\": options[key] = option.default || \"\"; break;\r\n case \"I\":\r\n case \"F\":\r\n case \"S\": options[key] = options.default || []; break;\r\n default: unknown.push(arg);\r\n }\r\n }\r\n }\r\n if (option.value) Object.keys(option.value).forEach(k => options[k] = option.value[k]);\r\n } else unknown.push(arg);\r\n }\r\n while (i < k) trailing.push(argv[i++]); // trailing\r\n\r\n return { options, unknown, arguments, trailing };\r\n}\r\n\r\nexports.parse = parse;\r\n\r\n/** Generates the help text for the specified configuration. */\r\nfunction help(config, options) {\r\n if (!options) options = {};\r\n var indent = options.indent || 2;\r\n var padding = options.padding || 24;\r\n var eol = options.eol || \"\\n\";\r\n var sb = [];\r\n Object.keys(config).forEach(key => {\r\n var option = config[key];\r\n if (option.description == null) return;\r\n var text = \"\";\r\n while (text.length < indent) text += \" \";\r\n text += \"--\" + key;\r\n if (option.alias) text += \", -\" + option.alias;\r\n while (text.length < padding) text += \" \";\r\n if (Array.isArray(option.description)) {\r\n sb.push(text + option.description[0] + option.description.slice(1).map(line => {\r\n for (let i = 0; i < padding; ++i) line = \" \" + line;\r\n return eol + line;\r\n }).join(\"\"));\r\n } else sb.push(text + option.description);\r\n });\r\n return sb.join(eol);\r\n}\r\n\r\nexports.help = help;\r\n","/*\r\nCopyright 2010 James Halliday (mail@substack.net)\r\n\r\nThis project is free software released under the MIT/X11 license:\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\nvar path = require(\"path\");\r\nvar fs = require(\"fs\");\r\nvar _0777 = parseInt(\"0777\", 8);\r\n\r\nmodule.exports = function mkdirp(p, opts, made) {\r\n if (!opts || typeof opts !== \"object\") {\r\n opts = { mode: opts };\r\n }\r\n var mode = opts.mode;\r\n if (mode === undefined) {\r\n mode = _0777 & (~process.umask());\r\n }\r\n if (!made) made = null;\r\n p = path.resolve(p);\r\n try {\r\n fs.mkdirSync(p, mode);\r\n made = made || p;\r\n } catch (err0) {\r\n switch (err0.code) {\r\n case \"ENOENT\":\r\n made = mkdirp(path.dirname(p), opts, made);\r\n mkdirp(p, opts, made);\r\n break;\r\n default:\r\n var stat;\r\n try {\r\n stat = fs.statSync(p);\r\n } catch (err1) {\r\n throw err0;\r\n }\r\n if (!stat.isDirectory()) throw err0;\r\n break;\r\n }\r\n }\r\n return made;\r\n};\r\n","if(typeof __WEBPACK_EXTERNAL_MODULE__10__ === 'undefined') {var e = new Error(\"Cannot find module 'assemblyscript'\"); e.code = 'MODULE_NOT_FOUND'; throw e;}\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__10__;","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 12;","module.exports = process.hrtime || hrtime\n\n// polyfil for window.performance.now\nvar performance = global.performance || {}\nvar performanceNow =\n performance.now ||\n performance.mozNow ||\n performance.msNow ||\n performance.oNow ||\n performance.webkitNow ||\n function(){ return (new Date()).getTime() }\n\n// generate timestamp or delta\n// see http://nodejs.org/api/process.html#process_process_hrtime\nfunction hrtime(previousTimestamp){\n var clocktime = performanceNow.call(performance)*1e-3\n var seconds = Math.floor(clocktime)\n var nanoseconds = Math.floor((clocktime%1)*1e9)\n if (previousTimestamp) {\n seconds = seconds - previousTimestamp[0]\n nanoseconds = nanoseconds - previousTimestamp[1]\n if (nanoseconds<0) {\n seconds--\n nanoseconds += 1e9\n }\n }\n return [seconds,nanoseconds]\n}"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://asc/webpack/universalModuleDefinition","webpack://asc/webpack/bootstrap","webpack://asc/../node_modules/node-libs-browser/mock/process.js","webpack://asc/../node_modules/path-browserify/index.js","webpack://asc/../node_modules/webpack/buildin/global.js","webpack://asc/./asc.js","webpack://asc/../node_modules/@protobufjs/utf8/index.js","webpack://asc/./util/colors.js","webpack://asc/./util/options.js","webpack://asc/./util/mkdirp.js","webpack://asc/external \"assemblyscript\"","webpack://asc/. sync","webpack://asc/../node_modules/browser-process-hrtime/index.js"],"names":["root","factory","exports","module","require","e","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE__10__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","path","cwd","nextTick","fn","setTimeout","platform","arch","execPath","title","pid","browser","env","argv","binding","Error","chdir","dir","resolve","exit","kill","umask","dlopen","uptime","memoryUsage","uvCounters","features","process","normalizeArray","parts","allowAboveRoot","up","length","last","splice","unshift","splitPathRe","splitPath","filename","exec","slice","filter","xs","f","res","push","resolvedPath","resolvedAbsolute","arguments","TypeError","charAt","split","join","normalize","isAbsolute","trailingSlash","substr","paths","Array","index","relative","from","to","trim","arr","start","end","fromParts","toParts","Math","min","samePartsLength","outputParts","concat","sep","delimiter","dirname","result","basename","ext","extname","str","len","g","Function","window","global","fs","utf8","colorsUtil","optionsUtil","mkdirp","EOL","removeAllListeners","assemblyscript","isDev","checkDiagnostics","emitter","stderr","diagnostic","hasErrors","nextDiagnostic","write","formatDiagnostic","isTTY","isError","createStats","readTime","readCount","writeTime","writeCount","parseTime","parseCount","compileTime","compileCount","emitTime","emitCount","validateTime","validateCount","optimizeTime","optimizeCount","measure","hrtime","times","formatTime","time","toFixed","printStats","stats","output","format","count","stdout","code","register","project","e_ts","eval","stack","isBundle","version","options","sourceMapRoot","libraryPrefix","LIBRARY_PREFIX","defaultOptimizeLevel","defaultShrinkLevel","libraryFiles","allocator/arena","allocator/buddy","allocator/emscripten","allocator/system","allocator/tlsf","array","arraybuffer","bindings/Date","bindings/Math","builtins","collector/itcm","dataview","date","diagnostics","error","gc","internal/allocator","internal/arraybuffer","internal/hash","internal/memory","internal/number","internal/sort","internal/string","internal/typedarray","iterator","map","math","memory","number","polyfills","regexp","set","string","symbol","table","typedarray","vector","libDir","libFiles","sync","bundled","forEach","file","replace","readFileSync","definitionFiles","assembly","portable","stdDir","compileString","async","sources","input.ts","createMemoryStream","keys","val","isArray","String","readFile","writeFile","contents","main","console","err","listFiles","callback","readFileNode","writeFileNode","listFilesNode","opts","parse","args","noColors","supported","unknown","arg","yellow","trailing","red","help","out","color","white","cyan","baseDir","transforms","transform","parser","noLib","parseFile","libPath","indexOf","customLibDirs","lib","apply","k","endsWith","j","libText","parseBacklog","sourcePath","sourceText","nextFile","startsWith","plainName","substring","indexName","applyTransform","program","finishParsing","optimizeLevel","shrinkLevel","optimize","max","compilerOptions","createOptions","setTarget","setNoAssert","noAssert","setImportMemory","importMemory","setSharedMemory","sharedMemory","setImportTable","importTable","setMemoryBase","memoryBase","setSourceMap","sourceMap","setOptimizeLevelHints","setGlobalAlias","use","aliases","part","alias","enable","flag","toUpperCase","enableFeature","compileProgram","dispose","validate","trapMode","runPasses","setOptimizeLevel","setShrinkLevel","setDebugInfo","debug","pass","noEmit","hasStdout","hasOutput","outFile","test","textFile","asmjsFile","binaryFile","wasm","sourceMapURL","toBinary","writeStdout","JSON","sourceRoot","text","stdName","sourceContents","stringify","asm","toAsmjs","idlFile","idl","buildIDL","tsdFile","tsd","buildTSD","wat","toText","_path","encoding","log","writeFileSync","files","readdirSync","used","allocBuffer","Buffer","allocUnsafe","Uint8Array","stream","chunk","buffer","reset","toBuffer","offset","toString","read","tscOptions","alwaysStrict","noImplicitAny","noImplicitReturns","noImplicitThis","noEmitOnError","strictNullChecks","experimentalDecorators","target","types","allowJs","charCodeAt","fromCharCode","c1","c2","proc","isCI","base","colors","gray","GRAY","RESET","RED","green","GREEN","YELLOW","blue","BLUE","magenta","MAGENTA","CYAN","WHITE","config","option","default","match","type","parseInt","parseFloat","indent","padding","eol","sb","description","line","_0777","made","undefined","mkdirSync","err0","stat","statSync","err1","isDirectory","webpackEmptyContext","req","id","previousTimestamp","clocktime","performanceNow","performance","seconds","floor","nanoseconds","now","mozNow","msNow","oNow","webkitNow","Date","getTime"],"mappings":"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","file":"asc.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory((function webpackLoadOptionalExternalModule() { try { return require(\"assemblyscript\"); } catch(e) {} }()));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"assemblyscript\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"asc\"] = factory((function webpackLoadOptionalExternalModule() { try { return require(\"assemblyscript\"); } catch(e) {} }()));\n\telse\n\t\troot[\"asc\"] = factory(root[\"assemblyscript\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE__10__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n","exports.nextTick = function nextTick(fn) {\n\tsetTimeout(fn, 0);\n};\n\nexports.platform = exports.arch = \nexports.execPath = exports.title = 'browser';\nexports.pid = 1;\nexports.browser = true;\nexports.env = {};\nexports.argv = [];\n\nexports.binding = function (name) {\n\tthrow new Error('No such module. (Possibly not yet loaded)')\n};\n\n(function () {\n var cwd = '/';\n var path;\n exports.cwd = function () { return cwd };\n exports.chdir = function (dir) {\n if (!path) path = require('path');\n cwd = path.resolve(dir, cwd);\n };\n})();\n\nexports.exit = exports.kill = \nexports.umask = exports.dlopen = \nexports.uptime = exports.memoryUsage = \nexports.uvCounters = function() {};\nexports.features = {};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\n * Compiler frontend for node.js\n *\n * Uses the low-level API exported from src/index.ts so it works with the compiler compiled to\n * JavaScript as well as the compiler compiled to WebAssembly (eventually). Runs the sources\n * directly through ts-node if distribution files are not present (indicated by a `-dev` version).\n *\n * Can also be packaged as a bundle suitable for in-browser use with the standard library injected\n * in the build step. See dist/asc.js for the bundle and webpack.config.js for building details.\n *\n * @module cli/asc\n */\n\n// Use \".\" instead of \"/\" as cwd in browsers\nif (process.browser) process.cwd = function() { return \".\"; };\n\nconst fs = require(\"fs\");\nconst path = require(\"path\");\nconst utf8 = require(\"@protobufjs/utf8\");\nconst colorsUtil = require(\"./util/colors\");\nconst optionsUtil = require(\"./util/options\");\nconst mkdirp = require(\"./util/mkdirp\");\nconst EOL = process.platform === \"win32\" ? \"\\r\\n\" : \"\\n\";\n\n// Emscripten adds an `uncaughtException` listener to Binaryen that results in an additional\n// useless code fragment on top of an actual error. suppress this:\nif (process.removeAllListeners) process.removeAllListeners(\"uncaughtException\");\n\n// Use distribution files if present, otherwise run the sources directly\nvar assemblyscript, isDev = false;\n(() => {\n try { // `asc` on the command line\n assemblyscript = require(\"../dist/assemblyscript.js\");\n } catch (e) {\n try { // `asc` on the command line without dist files\n require(\"ts-node\").register({ project: path.join(__dirname, \"..\", \"src\", \"tsconfig.json\") });\n require(\"../src/glue/js\");\n assemblyscript = require(\"../src\");\n isDev = true;\n } catch (e_ts) {\n try { // `require(\"dist/asc.js\")` in explicit browser tests\n assemblyscript = eval(\"require('./assemblyscript')\");\n } catch (e) {\n // combine both errors that lead us here\n e.stack = e_ts.stack + \"\\n---\\n\" + e.stack;\n throw e;\n }\n }\n }\n})();\n\n/** Whether this is a webpack bundle or not. */\nexports.isBundle = typeof BUNDLE_VERSION === \"string\";\n\n/** Whether asc runs the sources directly or not. */\nexports.isDev = isDev;\n\n/** AssemblyScript version. */\nexports.version = exports.isBundle ? BUNDLE_VERSION : require(\"../package.json\").version;\n\n/** Available CLI options. */\nexports.options = require(\"./asc.json\");\n\n/** Common root used in source maps. */\nexports.sourceMapRoot = \"assemblyscript:///\";\n\n/** Prefix used for library files. */\nexports.libraryPrefix = assemblyscript.LIBRARY_PREFIX;\n\n/** Default Binaryen optimization level. */\nexports.defaultOptimizeLevel = 2;\n\n/** Default Binaryen shrink level. */\nexports.defaultShrinkLevel = 1;\n\n/** Bundled library files. */\nexports.libraryFiles = exports.isBundle ? BUNDLE_LIBRARY : (() => { // set up if not a bundle\n const libDir = path.join(__dirname, \"..\", \"std\", \"assembly\");\n const libFiles = require(\"glob\").sync(\"**/!(*.d).ts\", { cwd: libDir });\n const bundled = {};\n libFiles.forEach(file => bundled[file.replace(/\\.ts$/, \"\")] = fs.readFileSync(path.join(libDir, file), \"utf8\" ));\n return bundled;\n})();\n\n/** Bundled definition files. */\nexports.definitionFiles = exports.isBundle ? BUNDLE_DEFINITIONS : (() => { // set up if not a bundle\n const stdDir = path.join(__dirname, \"..\", \"std\");\n return {\n \"assembly\": fs.readFileSync(path.join(stdDir, \"assembly\", \"index.d.ts\"), \"utf8\"),\n \"portable\": fs.readFileSync(path.join(stdDir, \"portable\", \"index.d.ts\"), \"utf8\")\n };\n})();\n\n/** Convenience function that parses and compiles source strings directly. */\nexports.compileString = async (sources, options) => {\n if (typeof sources === \"string\") sources = { \"input.ts\": sources };\n const output = Object.create({\n stdout: createMemoryStream(),\n stderr: createMemoryStream()\n });\n var argv = [\n \"--binaryFile\", \"binary\",\n \"--textFile\", \"text\"\n ];\n options = options || {};\n Object.keys(options || {}).forEach(key => {\n if (key != \"readFile\" && key != 'writeFile'){\n var val = options[key];\n if (Array.isArray(val)) val.forEach(val => argv.push(\"--\" + key, String(val)));\n else argv.push(\"--\" + key, String(val));\n }\n });\n\n options.readFile = options.readFile ? options.readFile : (name) => sources.hasOwnProperty(name) ? sources[name] : null;\n\n options.writeFile = options.writeFile ? options.writeFile : (name, contents) => output[name] = contents;\n\n await exports.main(argv.concat(Object.keys(sources)), {\n stdout: output.stdout,\n stderr: output.stderr,\n readFile: async (name) => {\n try {\n return await options.readFile(name);\n }catch (e){\n console.err(e);\n return null;\n }\n },\n writeFile: async (name, contents) => {\n await options.writeFile(path.basename(name), contents)\n },\n listFiles: () => []\n });\n return output;\n}\n\n/** Runs the command line utility using the specified arguments array. */\nexports.main = async function main(argv, options, callback) {\n if (typeof options === \"function\") {\n callback = options;\n options = {};\n } else if (!options) {\n options = {};\n }\n const stdout = options.stdout || process.stdout;\n const stderr = options.stderr || process.stderr;\n const readFile = options.readFile || readFileNode;\n const writeFile = options.writeFile || writeFileNode;\n const listFiles = options.listFiles || listFilesNode;\n const stats = options.stats || createStats();\n\n // Output must be specified if not present in the environment\n if (!stdout) throw Error(\"'options.stdout' must be specified\");\n if (!stderr) throw Error(\"'options.stderr' must be specified\");\n\n const opts = optionsUtil.parse(argv, exports.options);\n const args = opts.options;\n argv = opts.arguments;\n if (args.noColors) {\n colorsUtil.stdout.supported =\n colorsUtil.stderr.supported = false;\n } else {\n colorsUtil.stdout = colorsUtil.from(stdout);\n colorsUtil.stderr = colorsUtil.from(stderr);\n }\n\n // Check for unknown arguments\n if (opts.unknown.length) {\n opts.unknown.forEach(arg => {\n stderr.write(colorsUtil.stderr.yellow(\"WARN: \") + \"Unknown option '\" + arg + \"'\" + EOL);\n });\n }\n\n // Check for trailing arguments\n if (opts.trailing.length) {\n stderr.write(colorsUtil.stderr.yellow(\"WARN: \") + \"Unsupported trailing arguments: \" + opts.trailing.join(\" \") + EOL);\n }\n\n // Use default callback if none is provided\n if (!callback) callback = function defaultCallback(err) {\n var code = 0;\n if (err) {\n stderr.write(colorsUtil.stderr.red(\"ERROR: \") + err.stack.replace(/^ERROR: /i, \"\") + EOL);\n code = 1;\n }\n return code;\n };\n\n // Just print the version if requested\n if (args.version) {\n stdout.write(\"Version \" + exports.version + (isDev ? \"-dev\" : \"\") + EOL);\n return callback(null);\n }\n // Print the help message if requested or no source files are provided\n if (args.help || !argv.length) {\n var out = args.help ? stdout : stderr;\n var color = args.help ? colorsUtil.stdout : colorsUtil.stderr;\n out.write([\n color.white(\"SYNTAX\"),\n \" \" + color.cyan(\"asc\") + \" [entryFile ...] [options]\",\n \"\",\n color.white(\"EXAMPLES\"),\n \" \" + color.cyan(\"asc\") + \" hello.ts\",\n \" \" + color.cyan(\"asc\") + \" hello.ts -b hello.wasm -t hello.wat\",\n \" \" + color.cyan(\"asc\") + \" hello1.ts hello2.ts -b -O > hello.wasm\",\n \"\",\n color.white(\"OPTIONS\"),\n ].concat(\n optionsUtil.help(exports.options, 24, EOL)\n ).join(EOL) + EOL);\n return callback(null);\n }\n\n // I/O must be specified if not present in the environment\n if (!fs.readFileSync) {\n if (readFile === readFileNode) throw Error(\"'options.readFile' must be specified\");\n if (writeFile === writeFileNode) throw Error(\"'options.writeFile' must be specified\");\n if (listFiles === listFilesNode) throw Error(\"'options.listFiles' must be specified\");\n }\n\n // Set up base directory\n const baseDir = args.baseDir ? path.resolve(args.baseDir) : \".\";\n\n // Set up transforms\n const transforms = [];\n if (args.transform) {\n args.transform.forEach(transform =>\n transforms.push(\n require(\n path.isAbsolute(transform = transform.trim())\n ? transform\n : path.join(process.cwd(), transform)\n )\n )\n );\n }\n function applyTransform(name, ...args) {\n transforms.forEach(transform => {\n if (typeof transform[name] === \"function\") transform[name](...args);\n });\n }\n\n // Begin parsing\n var parser = null;\n // Include library files\n if (!args.noLib) {\n Object.keys(exports.libraryFiles).forEach(libPath => {\n if (libPath.indexOf(\"/\") >= 0) return; // in sub-directory: imported on demand\n stats.parseCount++;\n stats.parseTime += measure(() => {\n parser = assemblyscript.parseFile(\n exports.libraryFiles[libPath],\n exports.libraryPrefix + libPath + \".ts\",\n false,\n parser\n );\n });\n });\n } else { // always include builtins\n stats.parseCount++;\n stats.parseTime += measure(() => {\n parser = assemblyscript.parseFile(\n exports.libraryFiles[\"builtins\"],\n exports.libraryPrefix + \"builtins.ts\",\n false,\n parser\n );\n });\n }\n const customLibDirs = [];\n if (args.lib) {\n let lib = args.lib;\n if (typeof lib === \"string\") lib = lib.split(\",\");\n Array.prototype.push.apply(customLibDirs, lib.map(lib => lib.trim()));\n for (let i = 0, k = customLibDirs.length; i < k; ++i) { // custom\n let libDir = customLibDirs[i];\n let libFiles;\n if (libDir.endsWith(\".ts\")) {\n libFiles = [ path.basename(libDir) ];\n libDir = path.dirname(libDir);\n } else {\n libFiles = listFiles(libDir);\n }\n for (let j = 0, l = libFiles.length; j < l; ++j) {\n let libPath = libFiles[j];\n let libText = await readFile(path.join(libDir, libPath));\n if (libText === null) return callback(Error(\"Library file '\" + libPath + \"' not found.\"));\n stats.parseCount++;\n stats.parseTime += measure(() => {\n parser = assemblyscript.parseFile(\n libText,\n exports.libraryPrefix + libPath,\n false,\n parser\n );\n });\n }\n }\n }\n\n // Parses the backlog of imported files after including entry files\n async function parseBacklog() {\n var sourcePath, sourceText;\n // Process backlog\n while ((sourcePath = parser.nextFile()) != null) {\n // Load library file if explicitly requested\n if (sourcePath.startsWith(exports.libraryPrefix)) {\n const plainName = sourcePath.substring(exports.libraryPrefix.length);\n const indexName = sourcePath.substring(exports.libraryPrefix.length) + \"/index\";\n if (exports.libraryFiles.hasOwnProperty(plainName)) {\n sourceText = exports.libraryFiles[plainName];\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\n } else if (exports.libraryFiles.hasOwnProperty(indexName)) {\n sourceText = exports.libraryFiles[indexName];\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\n } else {\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\n const dir = customLibDirs[i];\n sourceText = await readFile(path.join(dir, plainName + \".ts\"));\n if (sourceText !== null) {\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\n break;\n } else {\n sourceText = await readFile(path.join(dir, indexName + \".ts\"));\n if (sourceText !== null) {\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\n break;\n }\n }\n }\n }\n\n // Otherwise try nextFile.ts, nextFile/index.ts, ~lib/nextFile.ts, ~lib/nextFile/index.ts\n } else {\n const plainName = sourcePath;\n const indexName = sourcePath + \"/index\";\n sourceText = await readFile(path.join(baseDir, plainName + \".ts\"));\n if (sourceText !== null) {\n sourcePath = plainName + \".ts\";\n } else {\n sourceText = await readFile(path.join(baseDir, indexName + \".ts\"));\n if (sourceText !== null) {\n sourcePath = indexName + \".ts\";\n } else if (!plainName.startsWith(\".\")) {\n if (exports.libraryFiles.hasOwnProperty(plainName)) {\n sourceText = exports.libraryFiles[plainName];\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\n } else if (exports.libraryFiles.hasOwnProperty(indexName)) {\n sourceText = exports.libraryFiles[indexName];\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\n } else {\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\n const dir = customLibDirs[i];\n sourceText = await readFile(path.join(dir, plainName + \".ts\"));\n if (sourceText !== null) {\n sourcePath = exports.libraryPrefix + plainName + \".ts\";\n break;\n } else {\n sourceText = await readFile(path.join(dir, indexName + \".ts\"));\n if (sourceText !== null) {\n sourcePath = exports.libraryPrefix + indexName + \".ts\";\n break;\n }\n }\n }\n }\n }\n }\n }\n if (sourceText == null) {\n return callback(Error(\"Import file '\" + sourcePath + \".ts' not found.\"));\n }\n stats.parseCount++;\n stats.parseTime += measure(() => {\n assemblyscript.parseFile(sourceText, sourcePath, false, parser);\n });\n }\n if (checkDiagnostics(parser, stderr)) {\n return callback(Error(\"Parse error\"));\n }\n }\n\n // Include entry files\n for (let i = 0, k = argv.length; i < k; ++i) {\n const filename = argv[i];\n if (filename == \"undefined\") continue;\n let sourcePath = String(filename).replace(/\\\\/g, \"/\").replace(/(\\.ts|\\/)$/, \"\");\n\n // Try entryPath.ts, then entryPath/index.ts\n let sourceText = await readFile(sourcePath + \".ts\", baseDir);\n if (sourceText === null) {\n sourceText = await readFile(sourcePath + \"/index.ts\", baseDir);\n if (sourceText === null) {\n return callback(Error(\"Entry file '\" + sourcePath + \".ts' not found.\"));\n } else {\n sourcePath += \"/index.ts\";\n }\n } else {\n sourcePath += \".ts\";\n }\n\n stats.parseCount++;\n stats.parseTime += measure(() => {\n parser = assemblyscript.parseFile(sourceText, sourcePath, true, parser);\n });\n let code = await parseBacklog();\n if (code) return code;\n }\n\n applyTransform(\"afterParse\", parser);\n {\n let code = await parseBacklog();\n if (code) return code;\n }\n\n // Finish parsing\n const program = assemblyscript.finishParsing(parser);\n\n // Set up optimization levels\n var optimizeLevel = 0;\n var shrinkLevel = 0;\n if (args.optimize) {\n optimizeLevel = exports.defaultOptimizeLevel;\n shrinkLevel = exports.defaultShrinkLevel;\n }\n if (typeof args.optimizeLevel === \"number\") {\n optimizeLevel = args.optimizeLevel;\n }\n if (typeof args.shrinkLevel === \"number\") {\n shrinkLevel = args.shrinkLevel;\n }\n optimizeLevel = Math.min(Math.max(optimizeLevel, 0), 3);\n shrinkLevel = Math.min(Math.max(shrinkLevel, 0), 2);\n\n // Begin compilation\n const compilerOptions = assemblyscript.createOptions();\n assemblyscript.setTarget(compilerOptions, 0);\n assemblyscript.setNoAssert(compilerOptions, args.noAssert);\n assemblyscript.setImportMemory(compilerOptions, args.importMemory);\n assemblyscript.setSharedMemory(compilerOptions, args.sharedMemory);\n assemblyscript.setImportTable(compilerOptions, args.importTable);\n assemblyscript.setMemoryBase(compilerOptions, args.memoryBase >>> 0);\n assemblyscript.setSourceMap(compilerOptions, args.sourceMap != null);\n assemblyscript.setOptimizeLevelHints(compilerOptions, optimizeLevel, shrinkLevel);\n\n if (!args.noLib) {\n // Initialize default aliases\n assemblyscript.setGlobalAlias(compilerOptions, \"Math\", \"NativeMath\");\n assemblyscript.setGlobalAlias(compilerOptions, \"Mathf\", \"NativeMathf\");\n assemblyscript.setGlobalAlias(compilerOptions, \"abort\", \"~lib/env/abort\");\n assemblyscript.setGlobalAlias(compilerOptions, \"trace\", \"~lib/env/trace\");\n }\n\n // Add or override aliases if specified\n if (args.use) {\n let aliases = args.use;\n for (let i = 0, k = aliases.length; i < k; ++i) {\n let part = aliases[i];\n let p = part.indexOf(\"=\");\n if (p < 0) return callback(Error(\"Global alias '\" + part + \"' is invalid.\"));\n let name = part.substring(0, p).trim();\n let alias = part.substring(p + 1).trim();\n if (!name.length) return callback(Error(\"Global alias '\" + part + \"' is invalid.\"));\n assemblyscript.setGlobalAlias(compilerOptions, name, alias);\n }\n }\n\n // Enable additional features if specified\n var features = args.enable;\n if (features != null) {\n if (typeof features === \"string\") features = features.split(\",\");\n for (let i = 0, k = features.length; i < k; ++i) {\n let name = features[i].trim();\n let flag = assemblyscript[\"FEATURE_\" + name.replace(/\\-/g, \"_\").toUpperCase()];\n if (!flag) return callback(Error(\"Feature '\" + name + \"' is unknown.\"));\n assemblyscript.enableFeature(compilerOptions, flag);\n }\n }\n var module;\n stats.compileCount++;\n (() => {\n try {\n stats.compileTime += measure(() => {\n module = assemblyscript.compileProgram(program, compilerOptions);\n });\n } catch (e) {\n return callback(e);\n }\n })();\n if (checkDiagnostics(parser, stderr)) {\n if (module) module.dispose();\n return callback(Error(\"Compile error\"));\n }\n\n // Validate the module if requested\n if (args.validate) {\n stats.validateCount++;\n stats.validateTime += measure(() => {\n if (!module.validate()) {\n module.dispose();\n return callback(Error(\"Validate error\"));\n }\n });\n }\n\n // Set Binaryen-specific options\n if (args.trapMode === \"clamp\") {\n stats.optimizeCount++;\n stats.optimizeTime += measure(() => {\n module.runPasses([ \"trap-mode-clamp\" ]);\n });\n } else if (args.trapMode === \"js\") {\n stats.optimizeCount++;\n stats.optimizeTime += measure(() => {\n module.runPasses([ \"trap-mode-js\" ]);\n });\n } else if (args.trapMode !== \"allow\") {\n module.dispose();\n return callback(Error(\"Unsupported trap mode\"));\n }\n\n // Implicitly run costly non-LLVM optimizations on -O3 or -Oz\n // see: https://github.com/WebAssembly/binaryen/pull/1596\n if (optimizeLevel >= 3 || shrinkLevel >= 2) optimizeLevel = 4;\n\n module.setOptimizeLevel(optimizeLevel);\n module.setShrinkLevel(shrinkLevel);\n module.setDebugInfo(args.debug);\n\n var runPasses = [];\n if (args.runPasses) {\n if (typeof args.runPasses === \"string\") {\n args.runPasses = args.runPasses.split(\",\");\n }\n if (args.runPasses.length) {\n args.runPasses.forEach(pass => {\n if (runPasses.indexOf(pass) < 0)\n runPasses.push(pass);\n });\n }\n }\n\n // Optimize the module if requested\n if (optimizeLevel > 0 || shrinkLevel > 0) {\n stats.optimizeCount++;\n stats.optimizeTime += measure(() => {\n module.optimize();\n });\n }\n\n // Run additional passes if requested\n if (runPasses.length) {\n stats.optimizeCount++;\n stats.optimizeTime += measure(() => {\n module.runPasses(runPasses.map(pass => pass.trim()));\n });\n }\n\n // Prepare output\n if (!args.noEmit) {\n let hasStdout = false;\n let hasOutput = false;\n\n if (args.outFile != null) {\n if (/\\.was?t$/.test(args.outFile) && args.textFile == null) {\n args.textFile = args.outFile;\n } else if (/\\.js$/.test(args.outFile) && args.asmjsFile == null) {\n args.asmjsFile = args.outFile;\n } else if (args.binaryFile == null) {\n args.binaryFile = args.outFile;\n }\n }\n // Write binary\n if (args.binaryFile != null) {\n let sourceMapURL = args.sourceMap != null\n ? args.sourceMap.length\n ? args.sourceMap\n : path.basename(args.binaryFile) + \".map\"\n : null;\n\n let wasm;\n stats.emitCount++;\n stats.emitTime += measure(() => {\n wasm = module.toBinary(sourceMapURL)\n });\n\n if (args.binaryFile.length) {\n await writeFile(path.join(baseDir, args.binaryFile), wasm.output);\n } else {\n writeStdout(wasm.output);\n hasStdout = true;\n }\n hasOutput = true;\n\n // Post-process source map\n if (wasm.sourceMap != null) {\n if (args.binaryFile.length) {\n let sourceMap = JSON.parse(wasm.sourceMap);\n sourceMap.sourceRoot = exports.sourceMapRoot;\n sourceMap.sources.forEach(async (name, index) => {\n let text = null;\n if (name.startsWith(exports.libraryPrefix)) {\n let stdName = name.substring(exports.libraryPrefix.length).replace(/\\.ts$/, \"\");\n if (exports.libraryFiles.hasOwnProperty(stdName)) {\n text = exports.libraryFiles[stdName];\n } else {\n for (let i = 0, k = customLibDirs.length; i < k; ++i) {\n text = await readFile(path.join(\n customLibDirs[i],\n name.substring(exports.libraryPrefix.length))\n );\n if (text !== null) break;\n }\n }\n } else {\n text = await readFile(path.join(baseDir, name));\n }\n if (text === null) {\n return callback(Error(\"Source file '\" + name + \"' not found.\"));\n }\n if (!sourceMap.sourceContents) sourceMap.sourceContents = [];\n sourceMap.sourceContents[index] = text;\n });\n await writeFile(path.join(\n baseDir,\n path.dirname(args.binaryFile),\n path.basename(sourceMapURL)\n ).replace(/^\\.\\//, \"\"), JSON.stringify(sourceMap), baseDir);\n } else {\n stderr.write(\"Skipped source map (stdout already occupied)\" + EOL);\n }\n }\n }\n\n // Write asm.js\n if (args.asmjsFile != null) {\n let asm;\n if (args.asmjsFile.length) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n asm = module.toAsmjs();\n });\n await writeFile(path.join(baseDir, args.asmjsFile), asm);\n } else if (!hasStdout) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n asm = module.toAsmjs();\n });\n writeStdout(asm);\n hasStdout = true;\n }\n hasOutput = true;\n }\n\n // Write WebIDL\n if (args.idlFile != null) {\n let idl;\n if (args.idlFile.length) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n idl = assemblyscript.buildIDL(program);\n });\n await writeFile(path.join(baseDir, args.idlFile), idl);\n } else if (!hasStdout) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n idl = assemblyscript.buildIDL(program);\n });\n writeStdout(idl);\n hasStdout = true;\n }\n hasOutput = true;\n }\n\n // Write TypeScript definition\n if (args.tsdFile != null) {\n let tsd;\n if (args.tsdFile.length) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n tsd = assemblyscript.buildTSD(program);\n });\n await writeFile(path.join(baseDir, args.tsdFile), tsd);\n } else if (!hasStdout) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n tsd = assemblyscript.buildTSD(program);\n });\n writeStdout(tsd);\n hasStdout = true;\n }\n hasOutput = true;\n }\n\n // Write text (must be last)\n if (args.textFile != null || !hasOutput) {\n let wat;\n if (args.textFile && args.textFile.length) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n wat = module.toText();\n });\n await writeFile(path.join(baseDir, args.textFile), wat);\n } else if (!hasStdout) {\n stats.emitCount++;\n stats.emitTime += measure(() => {\n wat = module.toText()\n });\n writeStdout(wat);\n }\n }\n }\n\n module.dispose();\n if (args.measure) {\n printStats(stats, stderr);\n }\n return callback(null);\n\n async function readFileNode(filename, baseDir) {\n try {\n let text;\n let _path = baseDir ? path.join(baseDir, filename) : filename;\n stats.readCount++;\n stats.readTime += measure(() => {\n text = fs.readFileSync(_path, { encoding: \"utf8\" });\n });\n return text;\n } catch (e) {\n console.log(e)\n return null;\n }\n }\n\n async function writeFileNode(filename, contents, baseDir) {\n try {\n let _path = baseDir ? path.join(baseDir, filename) : filename;\n stats.writeCount++;\n stats.writeTime += measure(() => {\n mkdirp(path.dirname(_path));\n if (typeof contents === \"string\") {\n fs.writeFileSync(_path, contents, { encoding: \"utf8\" } );\n } else {\n fs.writeFileSync(_path, contents);\n }\n });\n return true;\n } catch (e) {\n return false;\n }\n }\n\n function listFilesNode(dirname, baseDir) {\n let _path = dirname ? path.join(baseDir, dirname): dirname;\n var files;\n try {\n stats.readTime += measure(() => {\n files = fs.readdirSync(_path).filter(file => /^(?!.*\\.d\\.ts$).*\\.ts$/.test(file));\n });\n return files;\n } catch (e) {\n return [];\n }\n }\n\n function writeStdout(contents) {\n if (!writeStdout.used) {\n stats.writeCount++;\n writeStdout.used = true;\n }\n stats.writeTime += measure(() => {\n if (typeof contents === \"string\") {\n stdout.write(contents, { encoding: \"utf8\" });\n } else {\n stdout.write(contents);\n }\n });\n }\n}\n\n/** Checks diagnostics emitted so far for errors. */\nfunction checkDiagnostics(emitter, stderr) {\n var diagnostic;\n var hasErrors = false;\n while ((diagnostic = assemblyscript.nextDiagnostic(emitter)) != null) {\n if (stderr) {\n stderr.write(\n assemblyscript.formatDiagnostic(diagnostic, stderr.isTTY, true) +\n EOL + EOL\n );\n }\n if (assemblyscript.isError(diagnostic)) hasErrors = true;\n }\n return hasErrors;\n}\n\nexports.checkDiagnostics = checkDiagnostics;\n\n/** Creates an empty set of stats. */\nfunction createStats() {\n return {\n readTime: 0,\n readCount: 0,\n writeTime: 0,\n writeCount: 0,\n parseTime: 0,\n parseCount: 0,\n compileTime: 0,\n compileCount: 0,\n emitTime: 0,\n emitCount: 0,\n validateTime: 0,\n validateCount: 0,\n optimizeTime: 0,\n optimizeCount: 0\n };\n}\n\nexports.createStats = createStats;\n\nif (!process.hrtime) process.hrtime = require(\"browser-process-hrtime\");\n\n/** Measures the execution time of the specified function. */\nfunction measure(fn) {\n const start = process.hrtime();\n fn();\n const times = process.hrtime(start);\n return times[0] * 1e9 + times[1];\n}\n\nexports.measure = measure;\n\n/** Formats a high resolution time to a human readable string. */\nfunction formatTime(time) {\n return time ? (time / 1e6).toFixed(3) + \" ms\" : \"N/A\";\n}\n\nexports.formatTime = formatTime;\n\n/** Formats and prints out the contents of a set of stats. */\nfunction printStats(stats, output) {\n function format(time, count) {\n return formatTime(time);\n }\n (output || process.stdout).write([\n \"I/O Read : \" + format(stats.readTime, stats.readCount),\n \"I/O Write : \" + format(stats.writeTime, stats.writeCount),\n \"Parse : \" + format(stats.parseTime, stats.parseCount),\n \"Compile : \" + format(stats.compileTime, stats.compileCount),\n \"Emit : \" + format(stats.emitTime, stats.emitCount),\n \"Validate : \" + format(stats.validateTime, stats.validateCount),\n \"Optimize : \" + format(stats.optimizeTime, stats.optimizeCount)\n ].join(EOL) + EOL);\n}\n\nexports.printStats = printStats;\n\nvar allocBuffer = typeof global !== \"undefined\" && global.Buffer\n ? global.Buffer.allocUnsafe || function(len) { return new global.Buffer(len); }\n : function(len) { return new Uint8Array(len) };\n\n/** Creates a memory stream that can be used in place of stdout/stderr. */\nfunction createMemoryStream(fn) {\n var stream = [];\n stream.write = function(chunk) {\n if (fn) fn(chunk);\n if (typeof chunk === \"string\") {\n let buffer = allocBuffer(utf8.length(chunk));\n utf8.write(chunk, buffer, 0);\n chunk = buffer;\n }\n this.push(chunk);\n };\n stream.reset = function() {\n stream.length = 0;\n };\n stream.toBuffer = function() {\n var offset = 0, i = 0, k = this.length;\n while (i < k) offset += this[i++].length;\n var buffer = allocBuffer(offset);\n offset = i = 0;\n while (i < k) {\n buffer.set(this[i], offset);\n offset += this[i].length;\n ++i;\n }\n return buffer;\n };\n stream.toString = function() {\n var buffer = this.toBuffer();\n return utf8.read(buffer, 0, buffer.length);\n };\n return stream;\n}\n\nexports.createMemoryStream = createMemoryStream;\n\n/** Compatible TypeScript compiler options for syntax highlighting etc. */\nexports.tscOptions = {\n alwaysStrict: true,\n noImplicitAny: true,\n noImplicitReturns: true,\n noImplicitThis: true,\n noEmitOnError: true,\n strictNullChecks: true,\n experimentalDecorators: true,\n target: \"esnext\",\n module: \"commonjs\",\n noLib: true,\n types: [],\n allowJs: false\n};\n","\"use strict\";\r\n\r\n/**\r\n * A minimal UTF8 implementation for number arrays.\r\n * @memberof util\r\n * @namespace\r\n */\r\nvar utf8 = exports;\r\n\r\n/**\r\n * Calculates the UTF8 byte length of a string.\r\n * @param {string} string String\r\n * @returns {number} Byte length\r\n */\r\nutf8.length = function utf8_length(string) {\r\n var len = 0,\r\n c = 0;\r\n for (var i = 0; i < string.length; ++i) {\r\n c = string.charCodeAt(i);\r\n if (c < 128)\r\n len += 1;\r\n else if (c < 2048)\r\n len += 2;\r\n else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r\n ++i;\r\n len += 4;\r\n } else\r\n len += 3;\r\n }\r\n return len;\r\n};\r\n\r\n/**\r\n * Reads UTF8 bytes as a string.\r\n * @param {Uint8Array} buffer Source buffer\r\n * @param {number} start Source start\r\n * @param {number} end Source end\r\n * @returns {string} String read\r\n */\r\nutf8.read = function utf8_read(buffer, start, end) {\r\n var len = end - start;\r\n if (len < 1)\r\n return \"\";\r\n var parts = null,\r\n chunk = [],\r\n i = 0, // char offset\r\n t; // temporary\r\n while (start < end) {\r\n t = buffer[start++];\r\n if (t < 128)\r\n chunk[i++] = t;\r\n else if (t > 191 && t < 224)\r\n chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r\n else if (t > 239 && t < 365) {\r\n t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r\n chunk[i++] = 0xD800 + (t >> 10);\r\n chunk[i++] = 0xDC00 + (t & 1023);\r\n } else\r\n chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r\n if (i > 8191) {\r\n (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r\n i = 0;\r\n }\r\n }\r\n if (parts) {\r\n if (i)\r\n parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r\n return parts.join(\"\");\r\n }\r\n return String.fromCharCode.apply(String, chunk.slice(0, i));\r\n};\r\n\r\n/**\r\n * Writes a string as UTF8 bytes.\r\n * @param {string} string Source string\r\n * @param {Uint8Array} buffer Destination buffer\r\n * @param {number} offset Destination offset\r\n * @returns {number} Bytes written\r\n */\r\nutf8.write = function utf8_write(string, buffer, offset) {\r\n var start = offset,\r\n c1, // character 1\r\n c2; // character 2\r\n for (var i = 0; i < string.length; ++i) {\r\n c1 = string.charCodeAt(i);\r\n if (c1 < 128) {\r\n buffer[offset++] = c1;\r\n } else if (c1 < 2048) {\r\n buffer[offset++] = c1 >> 6 | 192;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r\n c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r\n ++i;\r\n buffer[offset++] = c1 >> 18 | 240;\r\n buffer[offset++] = c1 >> 12 & 63 | 128;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n } else {\r\n buffer[offset++] = c1 >> 12 | 224;\r\n buffer[offset++] = c1 >> 6 & 63 | 128;\r\n buffer[offset++] = c1 & 63 | 128;\r\n }\r\n }\r\n return offset - start;\r\n};\r\n","var proc = typeof process !== \"undefined\" && process || {};\nvar isCI = proc.env && \"CI\" in proc.env; // doesn't work when bundled because 'process' is a mock\n\nfunction from(stream, base) {\n var colors = base || {};\n colors.supported = (stream && !!stream.isTTY) || isCI;\n colors.gray = text => colors.supported ? exports.GRAY + text + exports.RESET : text;\n colors.red = text => colors.supported ? exports.RED + text + exports.RESET : text;\n colors.green = text => colors.supported ? exports.GREEN + text + exports.RESET : text;\n colors.yellow = text => colors.supported ? exports.YELLOW + text + exports.RESET : text;\n colors.blue = text => colors.supported ? exports.BLUE + text + exports.RESET : text;\n colors.magenta = text => colors.supported ? exports.MAGENTA + text + exports.RESET : text;\n colors.cyan = text => colors.supported ? exports.CYAN + text + exports.RESET : text;\n colors.white = text => colors.supported ? exports.WHITE + text + exports.RESET : text;\n return colors;\n}\n\nexports.stdout = from(proc.stdout, exports);\nexports.stderr = from(proc.stderr);\nexports.from = from;\n\nexports.GRAY = \"\\u001b[90m\";\nexports.RED = \"\\u001b[91m\";\nexports.GREEN = \"\\u001b[92m\";\nexports.YELLOW = \"\\u001b[93m\";\nexports.BLUE = \"\\u001b[94m\";\nexports.MAGENTA = \"\\u001b[95m\";\nexports.CYAN = \"\\u001b[96m\";\nexports.WHITE = \"\\u001b[97m\";\nexports.RESET = \"\\u001b[0m\";\n","// type | meaning\n// -----|---------------\n// b | boolean\n// i | integer\n// f | float\n// s | string\n// I | integer array\n// F | float array\n// S | string array\n\n/** Parses the specified command line arguments according to the given configuration. */\nfunction parse(argv, config) {\n var options = {};\n var unknown = [];\n var arguments = [];\n var trailing = [];\n\n // make an alias map and initialize defaults\n var aliases = {};\n Object.keys(config).forEach(key => {\n var option = config[key];\n if (option.alias != null) {\n if (typeof option.alias === \"string\") aliases[option.alias] = key;\n else if (Array.isArray(option.alias)) option.alias.forEach(alias => aliases[alias] = key);\n }\n if (option.default != null) options[key] = option.default;\n });\n\n // iterate over argv\n for (var i = 0, k = (argv = argv.slice()).length; i < k; ++i) {\n let arg = argv[i];\n if (arg == \"--\") { ++i; break; }\n let match = /^(?:(\\-\\w)(?:=(.*))?|(\\-\\-\\w{2,})(?:=(.*))?)$/.exec(arg), option, key;\n if (match) {\n if (config[arg]) option = config[key = arg]; // exact\n else if (match[1] != null) { // alias\n option = config[key = aliases[match[1].substring(1)]];\n if (option && match[2] != null) argv[i--] = match[2];\n } else if (match[3] != null) { // full\n option = config[key = match[3].substring(2)];\n if (option && match[4] != null) argv[i--] = match[4];\n }\n } else {\n if (arg.charCodeAt(0) == 45) option = config[key = arg]; // exact\n else { arguments.push(arg); continue; } // argument\n }\n if (option) {\n if (option.type == null || option.type === \"b\") options[key] = true; // flag\n else {\n if (i + 1 < argv.length && argv[i + 1].charCodeAt(0) != 45) { // present\n switch (option.type) {\n case \"i\": options[key] = parseInt(argv[++i], 10); break;\n case \"I\": options[key] = (options[key] || []).concat(parseInt(argv[++i], 10)); break;\n case \"f\": options[key] = parseFloat(argv[++i]); break;\n case \"F\": options[key] = (options[key] || []).concat(parseFloat(argv[++i])); break;\n case \"s\": options[key] = String(argv[++i]); break;\n case \"S\": options[key] = (options[key] || []).concat(argv[++i].split(\",\")); break;\n default: unknown.push(arg); --i;\n }\n } else { // omitted\n switch (option.type) {\n case \"i\":\n case \"f\": options[key] = option.default || 0; break;\n case \"s\": options[key] = option.default || \"\"; break;\n case \"I\":\n case \"F\":\n case \"S\": options[key] = options.default || []; break;\n default: unknown.push(arg);\n }\n }\n }\n if (option.value) Object.keys(option.value).forEach(k => options[k] = option.value[k]);\n } else unknown.push(arg);\n }\n while (i < k) trailing.push(argv[i++]); // trailing\n\n return { options, unknown, arguments, trailing };\n}\n\nexports.parse = parse;\n\n/** Generates the help text for the specified configuration. */\nfunction help(config, options) {\n if (!options) options = {};\n var indent = options.indent || 2;\n var padding = options.padding || 24;\n var eol = options.eol || \"\\n\";\n var sb = [];\n Object.keys(config).forEach(key => {\n var option = config[key];\n if (option.description == null) return;\n var text = \"\";\n while (text.length < indent) text += \" \";\n text += \"--\" + key;\n if (option.alias) text += \", -\" + option.alias;\n while (text.length < padding) text += \" \";\n if (Array.isArray(option.description)) {\n sb.push(text + option.description[0] + option.description.slice(1).map(line => {\n for (let i = 0; i < padding; ++i) line = \" \" + line;\n return eol + line;\n }).join(\"\"));\n } else sb.push(text + option.description);\n });\n return sb.join(eol);\n}\n\nexports.help = help;\n","/*\nCopyright 2010 James Halliday (mail@substack.net)\n\nThis project is free software released under the MIT/X11 license:\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\nvar path = require(\"path\");\nvar fs = require(\"fs\");\nvar _0777 = parseInt(\"0777\", 8);\n\nmodule.exports = function mkdirp(p, opts, made) {\n if (!opts || typeof opts !== \"object\") {\n opts = { mode: opts };\n }\n var mode = opts.mode;\n if (mode === undefined) {\n mode = _0777 & (~process.umask());\n }\n if (!made) made = null;\n p = path.resolve(p);\n try {\n fs.mkdirSync(p, mode);\n made = made || p;\n } catch (err0) {\n switch (err0.code) {\n case \"ENOENT\":\n made = mkdirp(path.dirname(p), opts, made);\n mkdirp(p, opts, made);\n break;\n default:\n var stat;\n try {\n stat = fs.statSync(p);\n } catch (err1) {\n throw err0;\n }\n if (!stat.isDirectory()) throw err0;\n break;\n }\n }\n return made;\n};\n","if(typeof __WEBPACK_EXTERNAL_MODULE__10__ === 'undefined') {var e = new Error(\"Cannot find module 'assemblyscript'\"); e.code = 'MODULE_NOT_FOUND'; throw e;}\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__10__;","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 12;","module.exports = process.hrtime || hrtime\n\n// polyfil for window.performance.now\nvar performance = global.performance || {}\nvar performanceNow =\n performance.now ||\n performance.mozNow ||\n performance.msNow ||\n performance.oNow ||\n performance.webkitNow ||\n function(){ return (new Date()).getTime() }\n\n// generate timestamp or delta\n// see http://nodejs.org/api/process.html#process_process_hrtime\nfunction hrtime(previousTimestamp){\n var clocktime = performanceNow.call(performance)*1e-3\n var seconds = Math.floor(clocktime)\n var nanoseconds = Math.floor((clocktime%1)*1e9)\n if (previousTimestamp) {\n seconds = seconds - previousTimestamp[0]\n nanoseconds = nanoseconds - previousTimestamp[1]\n if (nanoseconds<0) {\n seconds--\n nanoseconds += 1e9\n }\n }\n return [seconds,nanoseconds]\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/assemblyscript.js b/dist/assemblyscript.js index 9c3d2cbfa7..ac75f30ae5 100644 --- a/dist/assemblyscript.js +++ b/dist/assemblyscript.js @@ -1,3 +1,3 @@ -!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("binaryen")):"function"==typeof define&&define.amd?define(["binaryen"],t):"object"==typeof exports?exports.assemblyscript=t(require("binaryen")):e.assemblyscript=t(e.binaryen)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=16)}([function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NONE=0]="NONE",e[e.IMPORT=1]="IMPORT",e[e.EXPORT=2]="EXPORT",e[e.DECLARE=4]="DECLARE",e[e.CONST=8]="CONST",e[e.LET=16]="LET",e[e.STATIC=32]="STATIC",e[e.READONLY=64]="READONLY",e[e.ABSTRACT=128]="ABSTRACT",e[e.PUBLIC=256]="PUBLIC",e[e.PRIVATE=512]="PRIVATE",e[e.PROTECTED=1024]="PROTECTED",e[e.GET=2048]="GET",e[e.SET=4096]="SET",e[e.DEFINITE_ASSIGNMENT=8192]="DEFINITE_ASSIGNMENT",e[e.AMBIENT=16384]="AMBIENT",e[e.GENERIC=32768]="GENERIC",e[e.GENERIC_CONTEXT=65536]="GENERIC_CONTEXT",e[e.INSTANCE=131072]="INSTANCE",e[e.CONSTRUCTOR=262144]="CONSTRUCTOR",e[e.ARROW=524288]="ARROW",e[e.MODULE_EXPORT=1048576]="MODULE_EXPORT",e[e.MODULE_IMPORT=2097152]="MODULE_IMPORT",e[e.RESOLVED=4194304]="RESOLVED",e[e.COMPILED=8388608]="COMPILED",e[e.INLINED=16777216]="INLINED",e[e.SCOPED=33554432]="SCOPED",e[e.TRAMPOLINE=67108864]="TRAMPOLINE",e[e.VIRTUAL=134217728]="VIRTUAL",e[e.MAIN=268435456]="MAIN",e[e.QUOTED=536870912]="QUOTED"}(t.CommonFlags||(t.CommonFlags={})),t.PATH_DELIMITER="/",t.PARENT_SUBST="..",t.GETTER_PREFIX="get:",t.SETTER_PREFIX="set:",t.INSTANCE_DELIMITER="#",t.STATIC_DELIMITER=".",t.INNER_DELIMITER="~",t.LIBRARY_SUBST="~lib",t.LIBRARY_PREFIX=t.LIBRARY_SUBST+t.PATH_DELIMITER,t.INDEX_SUFFIX=t.PATH_DELIMITER+"index",function(e){e.EMPTY="",e.i8="i8",e.i16="i16",e.i32="i32",e.i64="i64",e.isize="isize",e.u8="u8",e.u16="u16",e.u32="u32",e.u64="u64",e.usize="usize",e.bool="bool",e.f32="f32",e.f64="f64",e.v128="v128",e.void_="void",e.number="number",e.boolean="boolean",e.string="string",e.native="native",e.null_="null",e.true_="true",e.false_="false",e.this_="this",e.super_="super",e.constructor="constructor"}(t.CommonSymbols||(t.CommonSymbols={})),function(e){e.ASC_TARGET="ASC_TARGET",e.ASC_NO_TREESHAKING="ASC_NO_TREESHAKING",e.ASC_NO_ASSERT="ASC_NO_ASSERT",e.ASC_MEMORY_BASE="ASC_MEMORY_BASE",e.ASC_OPTIMIZE_LEVEL="ASC_OPTIMIZE_LEVEL",e.ASC_SHRINK_LEVEL="ASC_SHRINK_LEVEL",e.ASC_FEATURE_MUTABLE_GLOBAL="ASC_FEATURE_MUTABLE_GLOBAL",e.ASC_FEATURE_SIGN_EXTENSION="ASC_FEATURE_SIGN_EXTENSION",e.ASC_FEATURE_BULK_MEMORY="ASC_FEATURE_BULK_MEMORY",e.ASC_FEATURE_SIMD="ASC_FEATURE_SIMD",e.I8="I8",e.I16="I16",e.I32="I32",e.I64="I64",e.Isize="Isize",e.U8="U8",e.U16="U16",e.U32="U32",e.U64="U64",e.Usize="Usize",e.Bool="Bool",e.F32="F32",e.F64="F64",e.V128="V128",e.String="String",e.Array="Array",e.ArrayBuffer="ArrayBuffer",e.Math="Math",e.Mathf="Mathf",e.memory="memory",e.allocate="allocate",e.abort="abort",e.main="main",e.length="length",e.byteLength="byteLength",e.pow="pow",e.mod="mod"}(t.LibrarySymbols||(t.LibrarySymbols={}))},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,i=r(11),a=r(2),o=r(11);function s(e){switch(e){case n.INFO:return"INFO";case n.WARNING:return"WARNING";case n.ERROR:return"ERROR";default:return assert(!1),""}}function c(e){switch(e){case n.INFO:return t.COLOR_BLUE;case n.WARNING:return t.COLOR_YELLOW;case n.ERROR:return t.COLOR_RED;default:return assert(!1),""}}t.DiagnosticCode=o.DiagnosticCode,t.diagnosticCodeToString=o.diagnosticCodeToString,function(e){e[e.INFO=0]="INFO",e[e.WARNING=1]="WARNING",e[e.ERROR=2]="ERROR"}(n=t.DiagnosticCategory||(t.DiagnosticCategory={})),t.diagnosticCategoryToString=s,t.COLOR_BLUE="",t.COLOR_YELLOW="",t.COLOR_RED="",t.COLOR_RESET="",t.diagnosticCategoryToColor=c;var l=function(){function e(e,t,r){this.range=null,this.relatedRange=null,this.code=e,this.category=t,this.message=r}return e.create=function(t,r,n,a,o){void 0===n&&(n=null),void 0===a&&(a=null),void 0===o&&(o=null);var s=i.diagnosticCodeToString(t);return null!=n&&(s=s.replace("{0}",n)),null!=a&&(s=s.replace("{1}",a)),null!=o&&(s=s.replace("{2}",o)),new e(t,r,s)},e.createInfo=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.INFO,r,i)},e.createWarning=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.WARNING,r,i)},e.createError=function(t,r,i){return void 0===r&&(r=null),void 0===i&&(i=null),e.create(t,n.ERROR,r,i)},e.prototype.withRange=function(e){return this.range=e,this},e.prototype.withRelatedRange=function(e){return this.relatedRange=e,this},e.prototype.toString=function(){return this.range?s(this.category)+" "+this.code.toString(10)+': "'+this.message+'" in '+this.range.source.normalizedPath+":"+this.range.line.toString(10)+":"+this.range.column.toString(10):s(this.category)+" "+this.code.toString(10)+": "+this.message},e}();function p(e,r){void 0===r&&(r=!1);for(var n=e.source.text,i=n.length,o=e.start,s=e.end;o>0&&!a.isLineBreak(n.charCodeAt(o-1));)o--;for(;s=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},o=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return o};Object.defineProperty(t,"__esModule",{value:!0});var s,c=r(0),l=r(1),p=r(6),u=r(5),_=r(9),h=r(12),d=function(){return function(e,t,r,n,i){this.localFile=e,this.localIdentifier=t,this.foreignIdentifier=r,this.foreignPath=n,this.foreignPathAlt=i}}(),y=function(){return function(e,t,r,n){this.localIdentifier=e,this.foreignIdentifier=t,this.foreignPath=r,this.foreignPathAlt=n}}(),m=function(){return function(e,t,r){this.foreignPath=e,this.foreignPathAlt=t,this.pathLiteral=r}}();function g(e,t){switch(assert(t.length),e){case u.DecoratorKind.OPERATOR:case u.DecoratorKind.OPERATOR_BINARY:switch(t.charCodeAt(0)){case 91:if("[]"==t)return s.INDEXED_GET;if("[]="==t)return s.INDEXED_SET;break;case 123:if("{}"==t)return s.UNCHECKED_INDEXED_GET;if("{}="==t)return s.UNCHECKED_INDEXED_SET;break;case 43:if("+"==t)return s.ADD;break;case 45:if("-"==t)return s.SUB;break;case 42:if("*"==t)return s.MUL;if("**"==t)return s.POW;break;case 47:if("/"==t)return s.DIV;break;case 37:if("%"==t)return s.REM;break;case 38:if("&"==t)return s.BITWISE_AND;break;case 124:if("|"==t)return s.BITWISE_OR;break;case 94:if("^"==t)return s.BITWISE_XOR;break;case 61:if("=="==t)return s.EQ;break;case 33:if("!="==t)return s.NE;break;case 62:if(">"==t)return s.GT;if(">="==t)return s.GE;if(">>"==t)return s.BITWISE_SHR;if(">>>"==t)return s.BITWISE_SHR_U;break;case 60:if("<"==t)return s.LT;if("<="==t)return s.LE;if("<<"==t)return s.BITWISE_SHL}break;case u.DecoratorKind.OPERATOR_PREFIX:switch(t.charCodeAt(0)){case 43:if("+"==t)return s.PLUS;if("++"==t)return s.PREFIX_INC;break;case 45:if("-"==t)return s.MINUS;if("--"==t)return s.PREFIX_DEC;break;case 33:if("!"==t)return s.NOT;break;case 126:if("~"==t)return s.BITWISE_NOT}break;case u.DecoratorKind.OPERATOR_POSTFIX:switch(t.charCodeAt(0)){case 43:if("++"==t)return s.POSTFIX_INC;break;case 45:if("--"==t)return s.POSTFIX_DEC}}return s.INVALID}!function(e){e[e.INVALID=0]="INVALID",e[e.INDEXED_GET=1]="INDEXED_GET",e[e.INDEXED_SET=2]="INDEXED_SET",e[e.UNCHECKED_INDEXED_GET=3]="UNCHECKED_INDEXED_GET",e[e.UNCHECKED_INDEXED_SET=4]="UNCHECKED_INDEXED_SET",e[e.ADD=5]="ADD",e[e.SUB=6]="SUB",e[e.MUL=7]="MUL",e[e.DIV=8]="DIV",e[e.REM=9]="REM",e[e.POW=10]="POW",e[e.BITWISE_AND=11]="BITWISE_AND",e[e.BITWISE_OR=12]="BITWISE_OR",e[e.BITWISE_XOR=13]="BITWISE_XOR",e[e.BITWISE_SHL=14]="BITWISE_SHL",e[e.BITWISE_SHR=15]="BITWISE_SHR",e[e.BITWISE_SHR_U=16]="BITWISE_SHR_U",e[e.EQ=17]="EQ",e[e.NE=18]="NE",e[e.GT=19]="GT",e[e.GE=20]="GE",e[e.LT=21]="LT",e[e.LE=22]="LE",e[e.PLUS=23]="PLUS",e[e.MINUS=24]="MINUS",e[e.NOT=25]="NOT",e[e.BITWISE_NOT=26]="BITWISE_NOT",e[e.PREFIX_INC=27]="PREFIX_INC",e[e.PREFIX_DEC=28]="PREFIX_DEC",e[e.POSTFIX_INC=29]="POSTFIX_INC",e[e.POSTFIX_DEC=30]="POSTFIX_DEC"}(s=t.OperatorKind||(t.OperatorKind={}));var T,f,E=function(e){function t(t){void 0===t&&(t=null);var r=e.call(this,t)||this;r.sources=[],r.diagnosticsOffset=0,r.explicitStartFunction=null,r.filesByName=new Map,r.elementsByName=new Map,r.elementsByDeclaration=new Map,r.instancesByName=new Map,r.typeClasses=new Map,r.arrayBufferInstance=null,r.arrayPrototype=null,r.stringInstance=null,r.abortInstance=null,r.memoryAllocateInstance=null,r.hasGC=!1,r.gcAllocateInstance=null,r.gcLinkInstance=null,r.gcMarkInstance=null,r.gcHeaderSize=0,r.gcHookOffset=0,r.nativeDummySignature=null;var n=new u.Source(c.LIBRARY_SUBST,"[native code]",u.SourceKind.LIBRARY);r.nativeSource=n;var i=new A(r,n);return r.nativeFile=i,r.filesByName.set(i.internalName,i),r.resolver=new _.Resolver(r),r}return i(t,e),t.prototype.makeNativeVariableDeclaration=function(e,t){void 0===t&&(t=c.CommonFlags.NONE);var r=this.nativeSource.range;return u.Node.createVariableDeclaration(u.Node.createIdentifierExpression(e,r),null,null,null,t,r)},t.prototype.makeNativeTypeDeclaration=function(e,t){void 0===t&&(t=c.CommonFlags.NONE);var r=this.nativeSource.range,n=u.Node.createIdentifierExpression(e,r);return u.Node.createTypeDeclaration(n,null,u.Node.createOmittedType(r),null,t,r)},t.prototype.makeNativeFunctionDeclaration=function(e,t){void 0===t&&(t=c.CommonFlags.NONE);var r=this.nativeSource.range;return u.Node.createFunctionDeclaration(u.Node.createIdentifierExpression(e,r),null,this.nativeDummySignature||(this.nativeDummySignature=u.Node.createSignature([],u.Node.createType(u.Node.createSimpleTypeName(c.CommonSymbols.void_,r),null,!1,r),null,!1,r)),null,null,t,r)},t.prototype.makeNativeNamespaceDeclaration=function(e,t){void 0===t&&(t=c.CommonFlags.NONE);var r=this.nativeSource.range;return u.Node.createNamespaceDeclaration(u.Node.createIdentifierExpression(e,r),[],null,t,r)},t.prototype.makeNativeFunction=function(e,t,r,n,i){return void 0===r&&(r=this.nativeFile),void 0===n&&(n=c.CommonFlags.NONE),void 0===i&&(i=f.NONE),new D(e,new B(e,r,this.makeNativeFunctionDeclaration(e,n),i),t)},t.prototype.getElementByDeclaration=function(e){var t=this.elementsByDeclaration;return assert(t.has(e)),t.get(e)},t.prototype.initialize=function(e){var t,r,n,i,s,_,h,d,y,m,g,E;this.options=e,this.registerNativeType(c.CommonSymbols.i8,p.Type.i8),this.registerNativeType(c.CommonSymbols.i16,p.Type.i16),this.registerNativeType(c.CommonSymbols.i32,p.Type.i32),this.registerNativeType(c.CommonSymbols.i64,p.Type.i64),this.registerNativeType(c.CommonSymbols.isize,e.isizeType),this.registerNativeType(c.CommonSymbols.u8,p.Type.u8),this.registerNativeType(c.CommonSymbols.u16,p.Type.u16),this.registerNativeType(c.CommonSymbols.u32,p.Type.u32),this.registerNativeType(c.CommonSymbols.u64,p.Type.u64),this.registerNativeType(c.CommonSymbols.usize,e.usizeType),this.registerNativeType(c.CommonSymbols.bool,p.Type.bool),this.registerNativeType(c.CommonSymbols.f32,p.Type.f32),this.registerNativeType(c.CommonSymbols.f64,p.Type.f64),this.registerNativeType(c.CommonSymbols.void_,p.Type.void),this.registerNativeType(c.CommonSymbols.number,p.Type.f64),this.registerNativeType(c.CommonSymbols.boolean,p.Type.bool),this.nativeFile.add(c.CommonSymbols.native,new N(c.CommonSymbols.native,this.nativeFile,this.makeNativeTypeDeclaration(c.CommonSymbols.native,c.CommonFlags.EXPORT|c.CommonFlags.GENERIC),f.BUILTIN)),e.hasFeature(8)&&this.registerNativeType(c.CommonSymbols.v128,p.Type.v128),this.registerConstantInteger(c.LibrarySymbols.ASC_TARGET,p.Type.i32,i64_new(e.isWasm64?2:1)),this.registerConstantInteger(c.LibrarySymbols.ASC_NO_ASSERT,p.Type.bool,i64_new(e.noAssert?1:0,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_MEMORY_BASE,p.Type.i32,i64_new(e.memoryBase,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_OPTIMIZE_LEVEL,p.Type.i32,i64_new(e.optimizeLevelHint,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_SHRINK_LEVEL,p.Type.i32,i64_new(e.shrinkLevelHint,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_FEATURE_MUTABLE_GLOBAL,p.Type.bool,i64_new(e.hasFeature(2)?1:0,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_FEATURE_SIGN_EXTENSION,p.Type.bool,i64_new(e.hasFeature(1)?1:0,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_FEATURE_BULK_MEMORY,p.Type.bool,i64_new(e.hasFeature(4)?1:0,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_FEATURE_SIMD,p.Type.bool,i64_new(e.hasFeature(8)?1:0,0));for(var I=new Array,v=new Map,S=new Map,C=new Array,O=new Array,x=0,k=this.sources.length;x=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i,a,o=r(10);!function(e){e[e.None=_BinaryenTypeNone()]="None",e[e.I32=_BinaryenTypeInt32()]="I32",e[e.I64=_BinaryenTypeInt64()]="I64",e[e.F32=_BinaryenTypeFloat32()]="F32",e[e.F64=_BinaryenTypeFloat64()]="F64",e[e.V128=_BinaryenTypeVec128()]="V128",e[e.Unreachable=_BinaryenTypeUnreachable()]="Unreachable",e[e.Auto=_BinaryenTypeAuto()]="Auto"}(i=t.NativeType||(t.NativeType={})),function(e){e[e.Invalid=_BinaryenInvalidId()]="Invalid",e[e.Block=_BinaryenBlockId()]="Block",e[e.If=_BinaryenIfId()]="If",e[e.Loop=_BinaryenLoopId()]="Loop",e[e.Break=_BinaryenBreakId()]="Break",e[e.Switch=_BinaryenSwitchId()]="Switch",e[e.Call=_BinaryenCallId()]="Call",e[e.CallIndirect=_BinaryenCallIndirectId()]="CallIndirect",e[e.GetLocal=_BinaryenGetLocalId()]="GetLocal",e[e.SetLocal=_BinaryenSetLocalId()]="SetLocal",e[e.GetGlobal=_BinaryenGetGlobalId()]="GetGlobal",e[e.SetGlobal=_BinaryenSetGlobalId()]="SetGlobal",e[e.Load=_BinaryenLoadId()]="Load",e[e.Store=_BinaryenStoreId()]="Store",e[e.Const=_BinaryenConstId()]="Const",e[e.Unary=_BinaryenUnaryId()]="Unary",e[e.Binary=_BinaryenBinaryId()]="Binary",e[e.Select=_BinaryenSelectId()]="Select",e[e.Drop=_BinaryenDropId()]="Drop",e[e.Return=_BinaryenReturnId()]="Return",e[e.Host=_BinaryenHostId()]="Host",e[e.Nop=_BinaryenNopId()]="Nop",e[e.Unreachable=_BinaryenUnreachableId()]="Unreachable",e[e.AtomicCmpxchg=_BinaryenAtomicCmpxchgId()]="AtomicCmpxchg",e[e.AtomicRMW=_BinaryenAtomicRMWId()]="AtomicRMW",e[e.AtomicWait=_BinaryenAtomicWaitId()]="AtomicWait",e[e.AtomicWake=_BinaryenAtomicWakeId()]="AtomicWake",e[e.SIMDExtract=_BinaryenSIMDExtractId()]="SIMDExtract",e[e.SIMDReplace=_BinaryenSIMDReplaceId()]="SIMDReplace",e[e.SIMDShuffle=_BinaryenSIMDShuffleId()]="SIMDShuffle",e[e.SIMDBitselect=_BinaryenSIMDBitselectId()]="SIMDBitselect",e[e.SIMDShift=_BinaryenSIMDShiftId()]="SIMDShift",e[e.MemoryInit=_BinaryenMemoryInitId()]="MemoryInit",e[e.DataDrop=_BinaryenDataDropId()]="DataDrop",e[e.MemoryCopy=_BinaryenMemoryCopyId()]="MemoryCopy",e[e.MemoryFill=_BinaryenMemoryFillId()]="MemoryFill"}(a=t.ExpressionId||(t.ExpressionId={})),function(e){e[e.ClzI32=_BinaryenClzInt32()]="ClzI32",e[e.CtzI32=_BinaryenCtzInt32()]="CtzI32",e[e.PopcntI32=_BinaryenPopcntInt32()]="PopcntI32",e[e.NegF32=_BinaryenNegFloat32()]="NegF32",e[e.AbsF32=_BinaryenAbsFloat32()]="AbsF32",e[e.CeilF32=_BinaryenCeilFloat32()]="CeilF32",e[e.FloorF32=_BinaryenFloorFloat32()]="FloorF32",e[e.TruncF32=_BinaryenTruncFloat32()]="TruncF32",e[e.NearestF32=_BinaryenNearestFloat32()]="NearestF32",e[e.SqrtF32=_BinaryenSqrtFloat32()]="SqrtF32",e[e.EqzI32=_BinaryenEqZInt32()]="EqzI32",e[e.ClzI64=_BinaryenClzInt64()]="ClzI64",e[e.CtzI64=_BinaryenCtzInt64()]="CtzI64",e[e.PopcntI64=_BinaryenPopcntInt64()]="PopcntI64",e[e.NegF64=_BinaryenNegFloat64()]="NegF64",e[e.AbsF64=_BinaryenAbsFloat64()]="AbsF64",e[e.CeilF64=_BinaryenCeilFloat64()]="CeilF64",e[e.FloorF64=_BinaryenFloorFloat64()]="FloorF64",e[e.TruncF64=_BinaryenTruncFloat64()]="TruncF64",e[e.NearestF64=_BinaryenNearestFloat64()]="NearestF64",e[e.SqrtF64=_BinaryenSqrtFloat64()]="SqrtF64",e[e.EqzI64=_BinaryenEqZInt64()]="EqzI64",e[e.ExtendI32=_BinaryenExtendSInt32()]="ExtendI32",e[e.ExtendU32=_BinaryenExtendUInt32()]="ExtendU32",e[e.WrapI64=_BinaryenWrapInt64()]="WrapI64",e[e.TruncF32ToI32=_BinaryenTruncSFloat32ToInt32()]="TruncF32ToI32",e[e.TruncF32ToI64=_BinaryenTruncSFloat32ToInt64()]="TruncF32ToI64",e[e.TruncF32ToU32=_BinaryenTruncUFloat32ToInt32()]="TruncF32ToU32",e[e.TruncF32ToU64=_BinaryenTruncUFloat32ToInt64()]="TruncF32ToU64",e[e.TruncF64ToI32=_BinaryenTruncSFloat64ToInt32()]="TruncF64ToI32",e[e.TruncF64ToI64=_BinaryenTruncSFloat64ToInt64()]="TruncF64ToI64",e[e.TruncF64ToU32=_BinaryenTruncUFloat64ToInt32()]="TruncF64ToU32",e[e.TruncF64ToU64=_BinaryenTruncUFloat64ToInt64()]="TruncF64ToU64",e[e.ReinterpretF32=_BinaryenReinterpretFloat32()]="ReinterpretF32",e[e.ReinterpretF64=_BinaryenReinterpretFloat64()]="ReinterpretF64",e[e.ConvertI32ToF32=_BinaryenConvertSInt32ToFloat32()]="ConvertI32ToF32",e[e.ConvertI32ToF64=_BinaryenConvertSInt32ToFloat64()]="ConvertI32ToF64",e[e.ConvertU32ToF32=_BinaryenConvertUInt32ToFloat32()]="ConvertU32ToF32",e[e.ConvertU32ToF64=_BinaryenConvertUInt32ToFloat64()]="ConvertU32ToF64",e[e.ConvertI64ToF32=_BinaryenConvertSInt64ToFloat32()]="ConvertI64ToF32",e[e.ConvertI64ToF64=_BinaryenConvertSInt64ToFloat64()]="ConvertI64ToF64",e[e.ConvertU64ToF32=_BinaryenConvertUInt64ToFloat32()]="ConvertU64ToF32",e[e.ConvertU64ToF64=_BinaryenConvertUInt64ToFloat64()]="ConvertU64ToF64",e[e.PromoteF32=_BinaryenPromoteFloat32()]="PromoteF32",e[e.DemoteF64=_BinaryenDemoteFloat64()]="DemoteF64",e[e.ReinterpretI32=_BinaryenReinterpretInt32()]="ReinterpretI32",e[e.ReinterpretI64=_BinaryenReinterpretInt64()]="ReinterpretI64",e[e.ExtendI8ToI32=_BinaryenExtendS8Int32()]="ExtendI8ToI32",e[e.ExtendI16ToI32=_BinaryenExtendS16Int32()]="ExtendI16ToI32",e[e.ExtendI8ToI64=_BinaryenExtendS8Int64()]="ExtendI8ToI64",e[e.ExtendI16ToI64=_BinaryenExtendS16Int64()]="ExtendI16ToI64",e[e.ExtendI32ToI64=_BinaryenExtendS32Int64()]="ExtendI32ToI64"}(t.UnaryOp||(t.UnaryOp={})),function(e){e[e.AddI32=_BinaryenAddInt32()]="AddI32",e[e.SubI32=_BinaryenSubInt32()]="SubI32",e[e.MulI32=_BinaryenMulInt32()]="MulI32",e[e.DivI32=_BinaryenDivSInt32()]="DivI32",e[e.DivU32=_BinaryenDivUInt32()]="DivU32",e[e.RemI32=_BinaryenRemSInt32()]="RemI32",e[e.RemU32=_BinaryenRemUInt32()]="RemU32",e[e.AndI32=_BinaryenAndInt32()]="AndI32",e[e.OrI32=_BinaryenOrInt32()]="OrI32",e[e.XorI32=_BinaryenXorInt32()]="XorI32",e[e.ShlI32=_BinaryenShlInt32()]="ShlI32",e[e.ShrU32=_BinaryenShrUInt32()]="ShrU32",e[e.ShrI32=_BinaryenShrSInt32()]="ShrI32",e[e.RotlI32=_BinaryenRotLInt32()]="RotlI32",e[e.RotrI32=_BinaryenRotRInt32()]="RotrI32",e[e.EqI32=_BinaryenEqInt32()]="EqI32",e[e.NeI32=_BinaryenNeInt32()]="NeI32",e[e.LtI32=_BinaryenLtSInt32()]="LtI32",e[e.LtU32=_BinaryenLtUInt32()]="LtU32",e[e.LeI32=_BinaryenLeSInt32()]="LeI32",e[e.LeU32=_BinaryenLeUInt32()]="LeU32",e[e.GtI32=_BinaryenGtSInt32()]="GtI32",e[e.GtU32=_BinaryenGtUInt32()]="GtU32",e[e.GeI32=_BinaryenGeSInt32()]="GeI32",e[e.GeU32=_BinaryenGeUInt32()]="GeU32",e[e.AddI64=_BinaryenAddInt64()]="AddI64",e[e.SubI64=_BinaryenSubInt64()]="SubI64",e[e.MulI64=_BinaryenMulInt64()]="MulI64",e[e.DivI64=_BinaryenDivSInt64()]="DivI64",e[e.DivU64=_BinaryenDivUInt64()]="DivU64",e[e.RemI64=_BinaryenRemSInt64()]="RemI64",e[e.RemU64=_BinaryenRemUInt64()]="RemU64",e[e.AndI64=_BinaryenAndInt64()]="AndI64",e[e.OrI64=_BinaryenOrInt64()]="OrI64",e[e.XorI64=_BinaryenXorInt64()]="XorI64",e[e.ShlI64=_BinaryenShlInt64()]="ShlI64",e[e.ShrU64=_BinaryenShrUInt64()]="ShrU64",e[e.ShrI64=_BinaryenShrSInt64()]="ShrI64",e[e.RotlI64=_BinaryenRotLInt64()]="RotlI64",e[e.RotrI64=_BinaryenRotRInt64()]="RotrI64",e[e.EqI64=_BinaryenEqInt64()]="EqI64",e[e.NeI64=_BinaryenNeInt64()]="NeI64",e[e.LtI64=_BinaryenLtSInt64()]="LtI64",e[e.LtU64=_BinaryenLtUInt64()]="LtU64",e[e.LeI64=_BinaryenLeSInt64()]="LeI64",e[e.LeU64=_BinaryenLeUInt64()]="LeU64",e[e.GtI64=_BinaryenGtSInt64()]="GtI64",e[e.GtU64=_BinaryenGtUInt64()]="GtU64",e[e.GeI64=_BinaryenGeSInt64()]="GeI64",e[e.GeU64=_BinaryenGeUInt64()]="GeU64",e[e.AddF32=_BinaryenAddFloat32()]="AddF32",e[e.SubF32=_BinaryenSubFloat32()]="SubF32",e[e.MulF32=_BinaryenMulFloat32()]="MulF32",e[e.DivF32=_BinaryenDivFloat32()]="DivF32",e[e.CopysignF32=_BinaryenCopySignFloat32()]="CopysignF32",e[e.MinF32=_BinaryenMinFloat32()]="MinF32",e[e.MaxF32=_BinaryenMaxFloat32()]="MaxF32",e[e.EqF32=_BinaryenEqFloat32()]="EqF32",e[e.NeF32=_BinaryenNeFloat32()]="NeF32",e[e.LtF32=_BinaryenLtFloat32()]="LtF32",e[e.LeF32=_BinaryenLeFloat32()]="LeF32",e[e.GtF32=_BinaryenGtFloat32()]="GtF32",e[e.GeF32=_BinaryenGeFloat32()]="GeF32",e[e.AddF64=_BinaryenAddFloat64()]="AddF64",e[e.SubF64=_BinaryenSubFloat64()]="SubF64",e[e.MulF64=_BinaryenMulFloat64()]="MulF64",e[e.DivF64=_BinaryenDivFloat64()]="DivF64",e[e.CopysignF64=_BinaryenCopySignFloat64()]="CopysignF64",e[e.MinF64=_BinaryenMinFloat64()]="MinF64",e[e.MaxF64=_BinaryenMaxFloat64()]="MaxF64",e[e.EqF64=_BinaryenEqFloat64()]="EqF64",e[e.NeF64=_BinaryenNeFloat64()]="NeF64",e[e.LtF64=_BinaryenLtFloat64()]="LtF64",e[e.LeF64=_BinaryenLeFloat64()]="LeF64",e[e.GtF64=_BinaryenGtFloat64()]="GtF64",e[e.GeF64=_BinaryenGeFloat64()]="GeF64"}(t.BinaryOp||(t.BinaryOp={})),function(e){e[e.CurrentMemory=_BinaryenCurrentMemory()]="CurrentMemory",e[e.GrowMemory=_BinaryenGrowMemory()]="GrowMemory"}(t.HostOp||(t.HostOp={})),function(e){e[e.Add=_BinaryenAtomicRMWAdd()]="Add",e[e.Sub=_BinaryenAtomicRMWSub()]="Sub",e[e.And=_BinaryenAtomicRMWAnd()]="And",e[e.Or=_BinaryenAtomicRMWOr()]="Or",e[e.Xor=_BinaryenAtomicRMWXor()]="Xor",e[e.Xchg=_BinaryenAtomicRMWXchg()]="Xchg"}(t.AtomicRMWOp||(t.AtomicRMWOp={})),function(e){e[e.SplatVecI8x16=_BinaryenSplatVecI8x16()]="SplatVecI8x16",e[e.SplatVecI16x8=_BinaryenSplatVecI16x8()]="SplatVecI16x8",e[e.SplatVecI32x4=_BinaryenSplatVecI32x4()]="SplatVecI32x4",e[e.SplatVecI64x2=_BinaryenSplatVecI64x2()]="SplatVecI64x2",e[e.SplatVecF32x4=_BinaryenSplatVecF32x4()]="SplatVecF32x4",e[e.SplatVecF64x2=_BinaryenSplatVecF64x2()]="SplatVecF64x2",e[e.NotVec128=_BinaryenNotVec128()]="NotVec128",e[e.NegVecI8x16=_BinaryenNegVecI8x16()]="NegVecI8x16",e[e.AnyTrueVecI8x16=_BinaryenAnyTrueVecI8x16()]="AnyTrueVecI8x16",e[e.AllTrueVecI8x16=_BinaryenAllTrueVecI8x16()]="AllTrueVecI8x16",e[e.NegVecI16x8=_BinaryenNegVecI16x8()]="NegVecI16x8",e[e.AnyTrueVecI16x8=_BinaryenAnyTrueVecI16x8()]="AnyTrueVecI16x8",e[e.AllTrueVecI16x8=_BinaryenAllTrueVecI16x8()]="AllTrueVecI16x8",e[e.NegVecI32x4=_BinaryenNegVecI32x4()]="NegVecI32x4",e[e.AnyTrueVecI32x4=_BinaryenAnyTrueVecI32x4()]="AnyTrueVecI32x4",e[e.AllTrueVecI32x4=_BinaryenAllTrueVecI32x4()]="AllTrueVecI32x4",e[e.NegVecI64x2=_BinaryenNegVecI64x2()]="NegVecI64x2",e[e.AnyTrueVecI64x2=_BinaryenAnyTrueVecI64x2()]="AnyTrueVecI64x2",e[e.AllTrueVecI64x2=_BinaryenAllTrueVecI64x2()]="AllTrueVecI64x2",e[e.AbsVecF32x4=_BinaryenAbsVecF32x4()]="AbsVecF32x4",e[e.NegVecF32x4=_BinaryenNegVecF32x4()]="NegVecF32x4",e[e.SqrtVecF32x4=_BinaryenSqrtVecF32x4()]="SqrtVecF32x4",e[e.AbsVecF64x2=_BinaryenAbsVecF64x2()]="AbsVecF64x2",e[e.NegVecF64x2=_BinaryenNegVecF64x2()]="NegVecF64x2",e[e.SqrtVecF64x2=_BinaryenSqrtVecF64x2()]="SqrtVecF64x2",e[e.TruncSatSVecF32x4ToVecI32x4=_BinaryenTruncSatSVecF32x4ToVecI32x4()]="TruncSatSVecF32x4ToVecI32x4",e[e.TruncSatUVecF32x4ToVecI32x4=_BinaryenTruncSatUVecF32x4ToVecI32x4()]="TruncSatUVecF32x4ToVecI32x4",e[e.TruncSatSVecF64x2ToVecI64x2=_BinaryenTruncSatSVecF64x2ToVecI64x2()]="TruncSatSVecF64x2ToVecI64x2",e[e.TruncSatUVecF64x2ToVecI64x2=_BinaryenTruncSatUVecF64x2ToVecI64x2()]="TruncSatUVecF64x2ToVecI64x2",e[e.ConvertSVecI32x4ToVecF32x4=_BinaryenConvertSVecI32x4ToVecF32x4()]="ConvertSVecI32x4ToVecF32x4",e[e.ConvertUVecI32x4ToVecF32x4=_BinaryenConvertUVecI32x4ToVecF32x4()]="ConvertUVecI32x4ToVecF32x4",e[e.ConvertSVecI64x2ToVecF64x2=_BinaryenConvertSVecI64x2ToVecF64x2()]="ConvertSVecI64x2ToVecF64x2",e[e.ConvertUVecI64x2ToVecF64x2=_BinaryenConvertUVecI64x2ToVecF64x2()]="ConvertUVecI64x2ToVecF64x2",e[e.EqVecI8x16=_BinaryenEqVecI8x16()]="EqVecI8x16",e[e.NeVecI8x16=_BinaryenNeVecI8x16()]="NeVecI8x16",e[e.LtSVecI8x16=_BinaryenLtSVecI8x16()]="LtSVecI8x16",e[e.LtUVecI8x16=_BinaryenLtUVecI8x16()]="LtUVecI8x16",e[e.LeSVecI8x16=_BinaryenLeSVecI8x16()]="LeSVecI8x16",e[e.LeUVecI8x16=_BinaryenLeUVecI8x16()]="LeUVecI8x16",e[e.GtSVecI8x16=_BinaryenGtSVecI8x16()]="GtSVecI8x16",e[e.GtUVecI8x16=_BinaryenGtUVecI8x16()]="GtUVecI8x16",e[e.GeSVecI8x16=_BinaryenGeSVecI8x16()]="GeSVecI8x16",e[e.GeUVecI8x16=_BinaryenGeUVecI8x16()]="GeUVecI8x16",e[e.EqVecI16x8=_BinaryenEqVecI16x8()]="EqVecI16x8",e[e.NeVecI16x8=_BinaryenNeVecI16x8()]="NeVecI16x8",e[e.LtSVecI16x8=_BinaryenLtSVecI16x8()]="LtSVecI16x8",e[e.LtUVecI16x8=_BinaryenLtUVecI16x8()]="LtUVecI16x8",e[e.LeSVecI16x8=_BinaryenLeSVecI16x8()]="LeSVecI16x8",e[e.LeUVecI16x8=_BinaryenLeUVecI16x8()]="LeUVecI16x8",e[e.GtSVecI16x8=_BinaryenGtSVecI16x8()]="GtSVecI16x8",e[e.GtUVecI16x8=_BinaryenGtUVecI16x8()]="GtUVecI16x8",e[e.GeSVecI16x8=_BinaryenGeSVecI16x8()]="GeSVecI16x8",e[e.GeUVecI16x8=_BinaryenGeUVecI16x8()]="GeUVecI16x8",e[e.EqVecI32x4=_BinaryenEqVecI32x4()]="EqVecI32x4",e[e.NeVecI32x4=_BinaryenNeVecI32x4()]="NeVecI32x4",e[e.LtSVecI32x4=_BinaryenLtSVecI32x4()]="LtSVecI32x4",e[e.LtUVecI32x4=_BinaryenLtUVecI32x4()]="LtUVecI32x4",e[e.LeSVecI32x4=_BinaryenLeSVecI32x4()]="LeSVecI32x4",e[e.LeUVecI32x4=_BinaryenLeUVecI32x4()]="LeUVecI32x4",e[e.GtSVecI32x4=_BinaryenGtSVecI32x4()]="GtSVecI32x4",e[e.GtUVecI32x4=_BinaryenGtUVecI32x4()]="GtUVecI32x4",e[e.GeSVecI32x4=_BinaryenGeSVecI32x4()]="GeSVecI32x4",e[e.GeUVecI32x4=_BinaryenGeUVecI32x4()]="GeUVecI32x4",e[e.EqVecF32x4=_BinaryenEqVecF32x4()]="EqVecF32x4",e[e.NeVecF32x4=_BinaryenNeVecF32x4()]="NeVecF32x4",e[e.LtVecF32x4=_BinaryenLtVecF32x4()]="LtVecF32x4",e[e.LeVecF32x4=_BinaryenLeVecF32x4()]="LeVecF32x4",e[e.GtVecF32x4=_BinaryenGtVecF32x4()]="GtVecF32x4",e[e.GeVecF32x4=_BinaryenGeVecF32x4()]="GeVecF32x4",e[e.EqVecF64x2=_BinaryenEqVecF64x2()]="EqVecF64x2",e[e.NeVecF64x2=_BinaryenNeVecF64x2()]="NeVecF64x2",e[e.LtVecF64x2=_BinaryenLtVecF64x2()]="LtVecF64x2",e[e.LeVecF64x2=_BinaryenLeVecF64x2()]="LeVecF64x2",e[e.GtVecF64x2=_BinaryenGtVecF64x2()]="GtVecF64x2",e[e.GeVecF64x2=_BinaryenGeVecF64x2()]="GeVecF64x2",e[e.AndVec128=_BinaryenAndVec128()]="AndVec128",e[e.OrVec128=_BinaryenOrVec128()]="OrVec128",e[e.XorVec128=_BinaryenXorVec128()]="XorVec128",e[e.AddVecI8x16=_BinaryenAddVecI8x16()]="AddVecI8x16",e[e.AddSatSVecI8x16=_BinaryenAddSatSVecI8x16()]="AddSatSVecI8x16",e[e.AddSatUVecI8x16=_BinaryenAddSatUVecI8x16()]="AddSatUVecI8x16",e[e.SubVecI8x16=_BinaryenSubVecI8x16()]="SubVecI8x16",e[e.SubSatSVecI8x16=_BinaryenSubSatSVecI8x16()]="SubSatSVecI8x16",e[e.SubSatUVecI8x16=_BinaryenSubSatUVecI8x16()]="SubSatUVecI8x16",e[e.MulVecI8x16=_BinaryenMulVecI8x16()]="MulVecI8x16",e[e.AddVecI16x8=_BinaryenAddVecI16x8()]="AddVecI16x8",e[e.AddSatSVecI16x8=_BinaryenAddSatSVecI16x8()]="AddSatSVecI16x8",e[e.AddSatUVecI16x8=_BinaryenAddSatUVecI16x8()]="AddSatUVecI16x8",e[e.SubVecI16x8=_BinaryenSubVecI16x8()]="SubVecI16x8",e[e.SubSatSVecI16x8=_BinaryenSubSatSVecI16x8()]="SubSatSVecI16x8",e[e.SubSatUVecI16x8=_BinaryenSubSatUVecI16x8()]="SubSatUVecI16x8",e[e.MulVecI16x8=_BinaryenMulVecI16x8()]="MulVecI16x8",e[e.AddVecI32x4=_BinaryenAddVecI32x4()]="AddVecI32x4",e[e.SubVecI32x4=_BinaryenSubVecI32x4()]="SubVecI32x4",e[e.MulVecI32x4=_BinaryenMulVecI32x4()]="MulVecI32x4",e[e.AddVecI64x2=_BinaryenAddVecI64x2()]="AddVecI64x2",e[e.SubVecI64x2=_BinaryenSubVecI64x2()]="SubVecI64x2",e[e.AddVecF32x4=_BinaryenAddVecF32x4()]="AddVecF32x4",e[e.SubVecF32x4=_BinaryenSubVecF32x4()]="SubVecF32x4",e[e.MulVecF32x4=_BinaryenMulVecF32x4()]="MulVecF32x4",e[e.DivVecF32x4=_BinaryenDivVecF32x4()]="DivVecF32x4",e[e.MinVecF32x4=_BinaryenMinVecF32x4()]="MinVecF32x4",e[e.MaxVecF32x4=_BinaryenMaxVecF32x4()]="MaxVecF32x4",e[e.AddVecF64x2=_BinaryenAddVecF64x2()]="AddVecF64x2",e[e.SubVecF64x2=_BinaryenSubVecF64x2()]="SubVecF64x2",e[e.MulVecF64x2=_BinaryenMulVecF64x2()]="MulVecF64x2",e[e.DivVecF64x2=_BinaryenDivVecF64x2()]="DivVecF64x2",e[e.MinVecF64x2=_BinaryenMinVecF64x2()]="MinVecF64x2",e[e.MaxVecF64x2=_BinaryenMaxVecF64x2()]="MaxVecF64x2"}(t.SIMDOp||(t.SIMDOp={}));var s=function(){function e(){}return e.create=function(t,r){var n=new e;return n.buffer=t,n.offset=r,n},e}();t.MemorySegment=s;var c=function(){function e(){this.hasTemporaryFunction=!1,this.cachedPrecomputeNames=0,this.cachedStrings=new Map}return e.create=function(){var t=new e;return t.ref=_BinaryenModuleCreate(),t.lit=memory.allocate(_BinaryenSizeofLiteral()),t},e.createFrom=function(t){var r=p(t);try{var n=new e;return n.ref=_BinaryenModuleRead(r,t.length),n.lit=memory.allocate(_BinaryenSizeofLiteral()),n}finally{memory.free(changetype(r))}},e.prototype.addFunctionType=function(e,t,r){var n=this.allocStringCached(e),i=u(r);try{return _BinaryenAddFunctionType(this.ref,n,t,i,r?r.length:0)}finally{memory.free(i)}},e.prototype.getFunctionTypeBySignature=function(e,t){var r=u(t);try{return _BinaryenGetFunctionTypeBySignature(this.ref,e,r,t?t.length:0)}finally{memory.free(r)}},e.prototype.removeFunctionType=function(e){var t=this.allocStringCached(e);_BinaryenRemoveFunctionType(this.ref,t)},e.prototype.createI32=function(e){var t=this.lit;return _BinaryenLiteralInt32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createI64=function(e,t){void 0===t&&(t=0);var r=this.lit;return _BinaryenLiteralInt64(r,e,t),_BinaryenConst(this.ref,r)},e.prototype.createF32=function(e){var t=this.lit;return _BinaryenLiteralFloat32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createF64=function(e){var t=this.lit;return _BinaryenLiteralFloat64(t,e),_BinaryenConst(this.ref,t)},e.prototype.createV128=function(e){assert(16==e.length);for(var t=this.lit,r=0;r<16;++r)store(t+r,e[r]);return _BinaryenLiteralVec128(t,t),_BinaryenConst(this.ref,t)},e.prototype.createUnary=function(e,t){return _BinaryenUnary(this.ref,e,t)},e.prototype.createBinary=function(e,t,r){return _BinaryenBinary(this.ref,e,t,r)},e.prototype.createHost=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=null);var n=this.allocStringCached(t),i=_(r);try{return _BinaryenHost(this.ref,e,n,i,r?r.length:0)}finally{memory.free(i)}},e.prototype.createGetLocal=function(e,t){return _BinaryenGetLocal(this.ref,e,t)},e.prototype.createTeeLocal=function(e,t){return _BinaryenTeeLocal(this.ref,e,t)},e.prototype.createGetGlobal=function(e,t){var r=this.allocStringCached(e);return _BinaryenGetGlobal(this.ref,r,t)},e.prototype.createLoad=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenLoad(this.ref,e,t?1:0,i,e,n,r)},e.prototype.createStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenStore(this.ref,e,i,e,t,r,n)},e.prototype.createAtomicLoad=function(e,t,r,n){return void 0===n&&(n=0),_BinaryenAtomicLoad(this.ref,e,n,r,t)},e.prototype.createAtomicStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenAtomicStore(this.ref,e,i,t,r,n)},e.prototype.createAtomicRMW=function(e,t,r,n,i,a){return _BinaryenAtomicRMW(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicCmpxchg=function(e,t,r,n,i,a){return _BinaryenAtomicCmpxchg(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicWait=function(e,t,r,n){return _BinaryenAtomicWait(this.ref,e,t,r,n)},e.prototype.createAtomicWake=function(e,t){return _BinaryenAtomicWake(this.ref,e,t)},e.prototype.createSetLocal=function(e,t){return _BinaryenSetLocal(this.ref,e,t)},e.prototype.createSetGlobal=function(e,t){var r=this.allocStringCached(e);return _BinaryenSetGlobal(this.ref,r,t)},e.prototype.createBlock=function(e,t,r){void 0===r&&(r=i.None);var n=this.allocStringCached(e),a=_(t);try{return _BinaryenBlock(this.ref,n,a,t.length,r)}finally{memory.free(a)}},e.prototype.createBreak=function(e,t,r){void 0===t&&(t=0),void 0===r&&(r=0);var n=this.allocStringCached(e);return _BinaryenBreak(this.ref,n,t,r)},e.prototype.createDrop=function(e){return _BinaryenDrop(this.ref,e)},e.prototype.createLoop=function(e,t){var r=this.allocStringCached(e);return _BinaryenLoop(this.ref,r,t)},e.prototype.createIf=function(e,t,r){return void 0===r&&(r=0),_BinaryenIf(this.ref,e,t,r)},e.prototype.createNop=function(){return _BinaryenNop(this.ref)},e.prototype.createReturn=function(e){return void 0===e&&(e=0),_BinaryenReturn(this.ref,e)},e.prototype.createSelect=function(e,t,r){return _BinaryenSelect(this.ref,r,e,t)},e.prototype.createSwitch=function(e,t,r,n){void 0===n&&(n=0);for(var i=e.length,a=new Array(i),o=0;o=0;--d)memory.free(l[d])}},e.prototype.setFunctionTable=function(e,t,r){for(var n=r.length,i=new Array(n),a=0;a=0;--i)memory.free(n[i])}},e.prototype.precomputeExpression=function(e){var t=_BinaryenGetOptimizeLevel(),r=_BinaryenGetShrinkLevel(),n=_BinaryenGetDebugInfo();_BinaryenSetOptimizeLevel(4),_BinaryenSetShrinkLevel(0),_BinaryenSetDebugInfo(!1);var i=_BinaryenExpressionGetType(e),a=this.addTemporaryFunction(i,null,e),o=this.cachedPrecomputeNames;return o||(this.cachedPrecomputeNames=o=u([this.allocStringCached("precompute")])),_BinaryenFunctionRunPasses(a,this.ref,o,1),e=_BinaryenFunctionGetBody(a),this.removeTemporaryFunction(),_BinaryenSetOptimizeLevel(t),_BinaryenSetShrinkLevel(r),_BinaryenSetDebugInfo(n),e},e.prototype.validate=function(){return 1==_BinaryenModuleValidate(this.ref)},e.prototype.interpret=function(){_BinaryenModuleInterpret(this.ref)},e.prototype.toBinary=function(e){var t=this.lit;assert(_BinaryenSizeofLiteral()>=12);var r=h(e),n=0,i=0;try{_BinaryenModuleAllocateAndWrite(t,this.ref,r),n=d(t);var a=d(t+4);i=d(t+8);var o=new m;return o.output=function(e,t){for(var r=new Uint8Array(t),n=0;n>8&255),store(r+2,a>>16&255),store(r+3,a>>>24),r+=4}return t}function _(e){return u(e)}function h(e){if(null==e)return 0;for(var t=memory.allocate(function(e){for(var t=0,r=0,n=e.length;r=55296&&i<=57343&&r+1=55296&&a<=57343&&n+1>>6),store(r++,128|63&a)):a<=65535?(store(r++,224|a>>>12),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=2097151?(store(r++,240|a>>>18),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=67108863?(store(r++,248|a>>>24),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):(store(r++,252|a>>>30),store(r++,128|a>>>24&63),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a))}return store(r,0),t}function d(e){return load(e)|load(e+1)<<8|load(e+2)<<16|load(e+3)<<24}function y(e){if(!e)return null;for(var t,r,n,i,a,o=new Array;t=load(e++);)128&t?(r=63&load(e++),192!=(224&t)?(n=63&load(e++),224==(240&t)?t=(15&t)<<12|r<<6|n:(i=63&load(e++),240==(248&t)?t=(7&t)<<18|r<<12|n<<6|i:(a=63&load(e++),t=248==(252&t)?(3&t)<<24|r<<18|n<<12|i<<6|a:(1&t)<<30|r<<24|n<<18|i<<12|a<<6|63&load(e++))),o.push(t)):o.push((31&t)<<6|r)):o.push(t);return String.fromCodePoints(o)}t.Relooper=l,t.readString=y;var m=function(){return function(){}}();t.BinaryModule=m,t.needsExplicitUnreachable=function e(t){switch(_BinaryenExpressionGetType(t)){case i.I32:case i.I64:case i.F32:case i.F64:return!1}switch(_BinaryenExpressionGetId(t)){case a.Unreachable:case a.Return:return!1;case a.Break:return 0!=_BinaryenBreakGetCondition(t);case a.Block:if(!_BinaryenBlockGetName(t)){var r=_BinaryenBlockGetNumChildren(t);return r>0&&e(_BinaryenBlockGetChild(t,r-1))}}return!0}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var a=r(0),o=r(7);t.Token=o.Token,t.Range=o.Range;var s,c=r(2);!function(e){e[e.SOURCE=0]="SOURCE",e[e.TYPE=1]="TYPE",e[e.TYPENAME=2]="TYPENAME",e[e.TYPEPARAMETER=3]="TYPEPARAMETER",e[e.PARAMETER=4]="PARAMETER",e[e.SIGNATURE=5]="SIGNATURE",e[e.IDENTIFIER=6]="IDENTIFIER",e[e.ASSERTION=7]="ASSERTION",e[e.BINARY=8]="BINARY",e[e.CALL=9]="CALL",e[e.CLASS=10]="CLASS",e[e.COMMA=11]="COMMA",e[e.ELEMENTACCESS=12]="ELEMENTACCESS",e[e.FALSE=13]="FALSE",e[e.FUNCTION=14]="FUNCTION",e[e.INSTANCEOF=15]="INSTANCEOF",e[e.LITERAL=16]="LITERAL",e[e.NEW=17]="NEW",e[e.NULL=18]="NULL",e[e.PARENTHESIZED=19]="PARENTHESIZED",e[e.PROPERTYACCESS=20]="PROPERTYACCESS",e[e.TERNARY=21]="TERNARY",e[e.SUPER=22]="SUPER",e[e.THIS=23]="THIS",e[e.TRUE=24]="TRUE",e[e.CONSTRUCTOR=25]="CONSTRUCTOR",e[e.UNARYPOSTFIX=26]="UNARYPOSTFIX",e[e.UNARYPREFIX=27]="UNARYPREFIX",e[e.BLOCK=28]="BLOCK",e[e.BREAK=29]="BREAK",e[e.CONTINUE=30]="CONTINUE",e[e.DO=31]="DO",e[e.EMPTY=32]="EMPTY",e[e.EXPORT=33]="EXPORT",e[e.EXPORTIMPORT=34]="EXPORTIMPORT",e[e.EXPRESSION=35]="EXPRESSION",e[e.FOR=36]="FOR",e[e.IF=37]="IF",e[e.IMPORT=38]="IMPORT",e[e.RETURN=39]="RETURN",e[e.SWITCH=40]="SWITCH",e[e.THROW=41]="THROW",e[e.TRY=42]="TRY",e[e.VARIABLE=43]="VARIABLE",e[e.VOID=44]="VOID",e[e.WHILE=45]="WHILE",e[e.CLASSDECLARATION=46]="CLASSDECLARATION",e[e.ENUMDECLARATION=47]="ENUMDECLARATION",e[e.ENUMVALUEDECLARATION=48]="ENUMVALUEDECLARATION",e[e.FIELDDECLARATION=49]="FIELDDECLARATION",e[e.FUNCTIONDECLARATION=50]="FUNCTIONDECLARATION",e[e.IMPORTDECLARATION=51]="IMPORTDECLARATION",e[e.INDEXSIGNATUREDECLARATION=52]="INDEXSIGNATUREDECLARATION",e[e.INTERFACEDECLARATION=53]="INTERFACEDECLARATION",e[e.METHODDECLARATION=54]="METHODDECLARATION",e[e.NAMESPACEDECLARATION=55]="NAMESPACEDECLARATION",e[e.TYPEDECLARATION=56]="TYPEDECLARATION",e[e.VARIABLEDECLARATION=57]="VARIABLEDECLARATION",e[e.DECORATOR=58]="DECORATOR",e[e.EXPORTMEMBER=59]="EXPORTMEMBER",e[e.SWITCHCASE=60]="SWITCHCASE",e[e.COMMENT=61]="COMMENT"}(s=t.NodeKind||(t.NodeKind={})),t.nodeIsConstantValue=function(e){switch(e){case s.LITERAL:case s.NULL:case s.TRUE:case s.FALSE:return!0}return!1},t.nodeIsCallable=function(e){switch(e){case s.IDENTIFIER:case s.ASSERTION:case s.CALL:case s.ELEMENTACCESS:case s.PARENTHESIZED:case s.PROPERTYACCESS:case s.SUPER:return!0}return!1},t.nodeIsGenericCallable=function(e){switch(e){case s.IDENTIFIER:case s.PROPERTYACCESS:return!0}return!1};var l=function(){function e(){}return e.createTypeName=function(e,t){var r=new u;return r.range=t,r.identifier=e,r.next=null,r},e.createSimpleTypeName=function(t,r){return e.createTypeName(e.createIdentifierExpression(t,r),r)},e.createType=function(e,t,r,n){var i=new _;return i.range=n,i.name=e,i.typeArguments=t,i.isNullable=r,i},e.createOmittedType=function(t){return e.createType(e.createSimpleTypeName("",t),null,!1,t)},e.createTypeParameter=function(e,t,r,n){var i=new h;return i.range=n,i.name=e,i.extendsType=t,i.defaultType=r,i},e.createParameter=function(e,t,r,n,i){var a=new d;return a.range=i,a.name=e,a.type=t,a.initializer=r,a.parameterKind=n,a},e.createSignature=function(e,t,r,n,i){var a=new m;return a.range=i,a.parameters=e,a.returnType=t,a.explicitThisType=r,a.isNullable=n,a},e.createDecorator=function(e,t,r){var n=new T;return n.range=r,n.name=e,n.arguments=t,n.decoratorKind=g(e),n},e.createComment=function(e,t,r){var n=new f;return n.range=r,n.commentKind=t,n.text=e,n},e.createIdentifierExpression=function(e,t,r){void 0===r&&(r=!1);var n=new v;return n.range=t,n.text=e,n.symbol=e,n.isQuoted=r,n},e.createEmptyIdentifierExpression=function(e){var t=new v;return t.range=e,t.text="",t},e.createArrayLiteralExpression=function(e,t){var r=new S;return r.range=t,r.elementExpressions=e,r},e.createAssertionExpression=function(e,t,r,n){var i=new A;return i.range=n,i.assertionKind=e,i.expression=t,i.toType=r,i},e.createBinaryExpression=function(e,t,r,n){var i=new N;return i.range=n,i.operator=e,i.left=t,i.right=r,i},e.createCallExpression=function(e,t,r,n){var i=new C;return i.range=n,i.expression=e,i.typeArguments=t,i.arguments=r,i},e.createClassExpression=function(e){var t=new O;return t.range=e.range,t.declaration=e,t},e.createCommaExpression=function(e,t){var r=new x;return r.range=t,r.expressions=e,r},e.createConstructorExpression=function(e){var t=new k;return t.range=e,t},e.createElementAccessExpression=function(e,t,r){var n=new L;return n.range=r,n.expression=e,n.elementExpression=t,n},e.createFalseExpression=function(e){var t=new X;return t.range=e,t},e.createFloatLiteralExpression=function(e,t){var r=new R;return r.range=t,r.value=e,r},e.createFunctionExpression=function(e){var t=new F;return t.range=e.range,t.declaration=e,t},e.createInstanceOfExpression=function(e,t,r){var n=new B;return n.range=r,n.expression=e,n.isType=t,n},e.createIntegerLiteralExpression=function(e,t){var r=new D;return r.range=t,r.value=e,r},e.createNewExpression=function(e,t,r,n){var i=new U;return i.range=n,i.expression=e,i.typeArguments=t,i.arguments=r,i},e.createNullExpression=function(e){var t=new P;return t.range=e,t},e.createObjectLiteralExpression=function(e,t,r){var n=new w;return n.range=r,n.names=e,n.values=t,n},e.createParenthesizedExpression=function(e,t){var r=new M;return r.range=t,r.expression=e,r},e.createPropertyAccessExpression=function(e,t,r){var n=new G;return n.range=r,n.expression=e,n.property=t,n},e.createRegexpLiteralExpression=function(e,t,r){var n=new V;return n.range=r,n.pattern=e,n.patternFlags=t,n},e.createTernaryExpression=function(e,t,r,n){var i=new K;return i.range=n,i.condition=e,i.ifThen=t,i.ifElse=r,i},e.createStringLiteralExpression=function(e,t){var r=new z;return r.range=t,r.value=e,r},e.createSuperExpression=function(e){var t=new H;return t.range=e,t},e.createThisExpression=function(e){var t=new Y;return t.range=e,t},e.createTrueExpression=function(e){var t=new W;return t.range=e,t},e.createUnaryPostfixExpression=function(e,t,r){var n=new q;return n.range=r,n.operator=e,n.operand=t,n},e.createUnaryPrefixExpression=function(e,t,r){var n=new j;return n.range=r,n.operator=e,n.operand=t,n},e.createBlockStatement=function(e,t){var r=new ne;return r.range=t,r.statements=e,r},e.createBreakStatement=function(e,t){var r=new ie;return r.range=t,r.label=e,r},e.createClassDeclaration=function(e,t,r,n,i,a,o,s){var c=new ae;return c.range=s,c.flags=o,c.name=e,c.typeParameters=t,c.extendsType=r,c.implementsTypes=n,c.members=i,c.decorators=a,c},e.createContinueStatement=function(e,t){var r=new oe;return r.range=t,r.label=e,r},e.createDoStatement=function(e,t,r){var n=new se;return n.range=r,n.statement=e,n.condition=t,n},e.createEmptyStatement=function(e){var t=new ce;return t.range=e,t},e.createEnumDeclaration=function(e,t,r,n,i){var a=new le;return a.range=i,a.flags=n,a.name=e,a.values=t,a.decorators=r,a},e.createEnumValueDeclaration=function(e,t,r,n){var i=new pe;return i.range=n,i.flags=r,i.name=e,i.value=t,i},e.createExportStatement=function(e,t,r,n){var i=new he;if(i.range=n,i.members=e,i.path=t,t){var a=c.normalizePath(t.value);t.value.startsWith(".")?i.normalizedPath=c.resolvePath(a,n.source.normalizedPath):i.normalizedPath=a,i.internalPath=Be(i.normalizedPath)}else i.normalizedPath=null,i.internalPath=null;return i.isDeclare=r,i},e.createExportImportStatement=function(e,t,r){var n=new ue;return n.range=r,n.name=e,n.externalName=t,n},e.createExportMember=function(e,t,r){var n=new _e;return n.range=r,n.localName=e,t||(t=e),n.exportedName=t,n},e.createExpressionStatement=function(e){var t=new de;return t.range=e.range,t.expression=e,t},e.createIfStatement=function(e,t,r,n){var i=new Te;return i.range=n,i.condition=e,i.ifTrue=t,i.ifFalse=r,i},e.createImportStatement=function(e,t,r){var n=new Ee;n.range=r,n.declarations=e,n.namespaceName=null,n.path=t;var i=c.normalizePath(t.value);return t.value.startsWith(".")?n.normalizedPath=c.resolvePath(i,r.source.normalizedPath):(i.startsWith(a.LIBRARY_PREFIX)||(i=a.LIBRARY_PREFIX+i),n.normalizedPath=i),n.internalPath=Be(n.normalizedPath),n},e.createImportStatementWithWildcard=function(e,t,r){var n=new Ee;return n.range=r,n.declarations=null,n.namespaceName=e,n.path=t,n.normalizedPath=c.resolvePath(c.normalizePath(t.value),r.source.normalizedPath),n.internalPath=Be(n.normalizedPath),n},e.createImportDeclaration=function(e,t,r){var n=new fe;return n.range=r,n.foreignName=e,t||(t=e),n.name=t,n},e.createInterfaceDeclaration=function(e,t,r,n,i,a,o){var s=new Ie;return s.range=o,s.flags=a,s.name=e,s.typeParameters=t,s.extendsType=r,s.members=n,s.decorators=i,s},e.createFieldDeclaration=function(e,t,r,n,i,a){var o=new ye;return o.range=a,o.flags=i,o.name=e,o.type=t,o.initializer=r,o.decorators=n,o},e.createForStatement=function(e,t,r,n,i){var a=new me;return a.range=i,a.initializer=e,a.condition=t,a.incrementor=r,a.statement=n,a},e.createFunctionDeclaration=function(e,t,r,n,i,a,o){var s=new ge;return s.range=o,s.flags=a,s.name=e,s.typeParameters=t,s.signature=r,s.body=n,s.decorators=i,s},e.createIndexSignatureDeclaration=function(e,t,r){var n=new te;return n.range=r,n.keyType=e,n.valueType=t,n},e.createMethodDeclaration=function(e,t,r,n,i,a,o){var s=new ve;return s.range=o,s.flags=a,s.name=e,s.typeParameters=t,s.signature=r,s.body=n,s.decorators=i,s},e.createNamespaceDeclaration=function(e,t,r,n,i){var a=new be;return a.range=i,a.flags=n,a.name=e,a.members=t,a.decorators=r,a},e.createReturnStatement=function(e,t){var r=new Se;return r.range=t,r.value=e,r},e.createSwitchStatement=function(e,t,r){var n=new Ne;return n.range=r,n.condition=e,n.cases=t,n},e.createSwitchCase=function(e,t,r){var n=new Ae;return n.range=r,n.label=e,n.statements=t,n},e.createThrowStatement=function(e,t){var r=new Ce;return r.range=t,r.value=e,r},e.createTryStatement=function(e,t,r,n,i){var a=new Oe;return a.range=i,a.statements=e,a.catchVariable=t,a.catchStatements=r,a.finallyStatements=n,a},e.createTypeDeclaration=function(e,t,r,n,i,a){var o=new xe;return o.range=a,o.flags=i,o.name=e,o.typeParameters=t,o.type=r,o.decorators=n,o},e.createVariableStatement=function(e,t,r){var n=new Le;return n.range=r,n.declarations=e,n.decorators=t,n},e.createVariableDeclaration=function(e,t,r,n,i,a){var o=new ke;return o.range=a,o.flags=i,o.name=e,o.type=t,o.initializer=r,o.decorators=n,o},e.createVoidStatement=function(e,t){var r=new Re;return r.range=t,r.expression=e,r},e.createWhileStatement=function(e,t,r){var n=new Fe;return n.range=r,n.condition=e,n.statement=t,n},e}();t.Node=l;var p=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}(l);t.CommonTypeNode=p;var u=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPENAME,t}return i(t,e),t}(l);t.TypeName=u;var _=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPE,t}return i(t,e),t}(p);t.TypeNode=_;var h=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEPARAMETER,t}return i(t,e),t}(l);t.TypeParameterNode=h,function(e){e[e.DEFAULT=0]="DEFAULT",e[e.OPTIONAL=1]="OPTIONAL",e[e.REST=2]="REST"}(t.ParameterKind||(t.ParameterKind={}));var d=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.PARAMETER,t.implicitFieldDeclaration=null,t.flags=a.CommonFlags.NONE,t}return i(t,e),t.prototype.is=function(e){return(this.flags&e)==e},t.prototype.isAny=function(e){return 0!=(this.flags&e)},t.prototype.set=function(e){this.flags|=e},t}(l);t.ParameterNode=d;var y,m=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SIGNATURE,t}return i(t,e),t}(p);function g(e){if(e.kind==s.IDENTIFIER){var t=e.text;switch(assert(t.length),t.charCodeAt(0)){case 98:if("builtin"==t)return y.BUILTIN;break;case 101:if("external"==t)return y.EXTERNAL;break;case 103:if("global"==t)return y.GLOBAL;break;case 105:if("inline"==t)return y.INLINE;break;case 108:if("lazy"==t)return y.LAZY;break;case 111:if("operator"==t)return y.OPERATOR;break;case 115:if("sealed"==t)return y.SEALED;if("start"==t)return y.START;break;case 117:if("unmanaged"==t)return y.UNMANAGED}}else if(e.kind==s.PROPERTYACCESS&&e.expression.kind==s.IDENTIFIER){t=e.expression.text;assert(t.length);var r=e.property.text;if(assert(r.length),"operator"==t)switch(r.charCodeAt(0)){case 98:if("binary"==r)return y.OPERATOR_BINARY;break;case 112:switch(r){case"prefix":return y.OPERATOR_PREFIX;case"postfix":return y.OPERATOR_POSTFIX}}}return y.CUSTOM}t.SignatureNode=m,function(e){e[e.CUSTOM=0]="CUSTOM",e[e.GLOBAL=1]="GLOBAL",e[e.OPERATOR=2]="OPERATOR",e[e.OPERATOR_BINARY=3]="OPERATOR_BINARY",e[e.OPERATOR_PREFIX=4]="OPERATOR_PREFIX",e[e.OPERATOR_POSTFIX=5]="OPERATOR_POSTFIX",e[e.UNMANAGED=6]="UNMANAGED",e[e.SEALED=7]="SEALED",e[e.INLINE=8]="INLINE",e[e.EXTERNAL=9]="EXTERNAL",e[e.BUILTIN=10]="BUILTIN",e[e.LAZY=11]="LAZY",e[e.START=12]="START"}(y=t.DecoratorKind||(t.DecoratorKind={})),t.decoratorNameToKind=g;var T=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DECORATOR,t}return i(t,e),t}(l);t.DecoratorNode=T,function(e){e[e.LINE=0]="LINE",e[e.TRIPLE=1]="TRIPLE",e[e.BLOCK=2]="BLOCK"}(t.CommentKind||(t.CommentKind={}));var f=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.COMMENT,t}return i(t,e),t}(l);t.CommentNode=f;var E=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}(l);t.Expression=E;var I,v=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IDENTIFIER,t}return i(t,e),t}(E);t.IdentifierExpression=v,function(e){e[e.FLOAT=0]="FLOAT",e[e.INTEGER=1]="INTEGER",e[e.STRING=2]="STRING",e[e.REGEXP=3]="REGEXP",e[e.ARRAY=4]="ARRAY",e[e.OBJECT=5]="OBJECT"}(I=t.LiteralKind||(t.LiteralKind={}));var b=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.LITERAL,t}return i(t,e),t}(E);t.LiteralExpression=b;var S=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=I.ARRAY,t}return i(t,e),t}(b);t.ArrayLiteralExpression=S,function(e){e[e.PREFIX=0]="PREFIX",e[e.AS=1]="AS",e[e.NONNULL=2]="NONNULL"}(t.AssertionKind||(t.AssertionKind={}));var A=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ASSERTION,t}return i(t,e),t}(E);t.AssertionExpression=A;var N=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BINARY,t}return i(t,e),t}(E);t.BinaryExpression=N;var C=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CALL,t}return i(t,e),t}(E);t.CallExpression=C;var O=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASS,t}return i(t,e),t}(E);t.ClassExpression=O;var x=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.COMMA,t}return i(t,e),t}(E);t.CommaExpression=x;var k=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONSTRUCTOR,t.text="constructor",t.symbol=a.CommonSymbols.constructor,t}return i(t,e),t}(v);t.ConstructorExpression=k;var L=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ELEMENTACCESS,t}return i(t,e),t}(E);t.ElementAccessExpression=L;var R=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=I.FLOAT,t}return i(t,e),t}(b);t.FloatLiteralExpression=R;var F=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTION,t}return i(t,e),t}(E);t.FunctionExpression=F;var B=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INSTANCEOF,t}return i(t,e),t}(E);t.InstanceOfExpression=B;var D=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=I.INTEGER,t}return i(t,e),t}(b);t.IntegerLiteralExpression=D;var U=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NEW,t}return i(t,e),t}(C);t.NewExpression=U;var P=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NULL,t.text="null",t.symbol=a.CommonSymbols.null_,t}return i(t,e),t}(v);t.NullExpression=P;var w=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=I.OBJECT,t}return i(t,e),t}(b);t.ObjectLiteralExpression=w;var M=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.PARENTHESIZED,t}return i(t,e),t}(E);t.ParenthesizedExpression=M;var G=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.PROPERTYACCESS,t}return i(t,e),t}(E);t.PropertyAccessExpression=G;var V=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=I.REGEXP,t}return i(t,e),t}(b);t.RegexpLiteralExpression=V;var K=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TERNARY,t}return i(t,e),t}(E);t.TernaryExpression=K;var z=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=I.STRING,t}return i(t,e),t}(b);t.StringLiteralExpression=z;var H=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SUPER,t.text="super",t.symbol=a.CommonSymbols.super_,t}return i(t,e),t}(v);t.SuperExpression=H;var Y=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THIS,t.text="this",t.symbol=a.CommonSymbols.this_,t}return i(t,e),t}(v);t.ThisExpression=Y;var W=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRUE,t.text="true",t.symbol=a.CommonSymbols.true_,t}return i(t,e),t}(v);t.TrueExpression=W;var X=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FALSE,t.text="false",t.symbol=a.CommonSymbols.false_,t}return i(t,e),t}(v);t.FalseExpression=X;var Q=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}(E);t.UnaryExpression=Q;var q=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.UNARYPOSTFIX,t}return i(t,e),t}(Q);t.UnaryPostfixExpression=q;var j=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.UNARYPREFIX,t}return i(t,e),t}(Q);t.UnaryPrefixExpression=j;var Z,J=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}(l);t.Statement=J,function(e){e[e.DEFAULT=0]="DEFAULT",e[e.ENTRY=1]="ENTRY",e[e.LIBRARY=2]="LIBRARY"}(Z=t.SourceKind||(t.SourceKind={}));var $=function(e){function t(t,r,n){var i=e.call(this)||this;i.kind=s.SOURCE,i.parent=null,i.tokenizer=null,i.debugInfoIndex=-1,i.exportPaths=null,i.sourceKind=n,i.normalizedPath=t;var c=Be(i.normalizedPath);i.internalPath=c;var l=c.lastIndexOf(a.PATH_DELIMITER);return i.simplePath=l>=0?c.substring(l+1):c,i.statements=new Array,i.range=new o.Range(i,0,r.length),i.text=r,i}return i(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==Z.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==Z.LIBRARY},enumerable:!0,configurable:!0}),t}(l);t.Source=$;var ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.decorators=null,t.flags=a.CommonFlags.NONE,t}return i(t,e),t.prototype.is=function(e){return(this.flags&e)==e},t.prototype.isAny=function(e){return 0!=(this.flags&e)},t.prototype.set=function(e){this.flags|=e},t}(J);t.DeclarationStatement=ee;var te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INDEXSIGNATUREDECLARATION,t}return i(t,e),t}(ee);t.IndexSignatureDeclaration=te;var re=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}(ee);t.VariableLikeDeclarationStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BLOCK,t}return i(t,e),t}(J);t.BlockStatement=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BREAK,t}return i(t,e),t}(J);t.BreakStatement=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASSDECLARATION,t}return i(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(ee);t.ClassDeclaration=ae;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONTINUE,t}return i(t,e),t}(J);t.ContinueStatement=oe;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DO,t}return i(t,e),t}(J);t.DoStatement=se;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EMPTY,t}return i(t,e),t}(J);t.EmptyStatement=ce;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMDECLARATION,t}return i(t,e),t}(ee);t.EnumDeclaration=le;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMVALUEDECLARATION,t}return i(t,e),t}(re);t.EnumValueDeclaration=pe;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTIMPORT,t}return i(t,e),t}(l);t.ExportImportStatement=ue;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTMEMBER,t}return i(t,e),t}(l);t.ExportMember=_e;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORT,t}return i(t,e),t}(J);t.ExportStatement=he;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPRESSION,t}return i(t,e),t}(J);t.ExpressionStatement=de;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FIELDDECLARATION,t.parameterIndex=-1,t}return i(t,e),t}(re);t.FieldDeclaration=ye;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FOR,t}return i(t,e),t}(J);t.ForStatement=me;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTIONDECLARATION,t}return i(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t.prototype.clone=function(){return l.createFunctionDeclaration(this.name,this.typeParameters,this.signature,this.body,this.decorators,this.flags,this.range)},t}(ee);t.FunctionDeclaration=ge;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IF,t}return i(t,e),t}(J);t.IfStatement=Te;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORTDECLARATION,t}return i(t,e),t}(ee);t.ImportDeclaration=fe;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORT,t}return i(t,e),t}(J);t.ImportStatement=Ee;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INTERFACEDECLARATION,t}return i(t,e),t}(ae);t.InterfaceDeclaration=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.METHODDECLARATION,t}return i(t,e),t}(ge);t.MethodDeclaration=ve;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NAMESPACEDECLARATION,t}return i(t,e),t}(ee);t.NamespaceDeclaration=be;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.RETURN,t}return i(t,e),t}(J);t.ReturnStatement=Se;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCHCASE,t}return i(t,e),t}(l);t.SwitchCase=Ae;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCH,t}return i(t,e),t}(J);t.SwitchStatement=Ne;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THROW,t}return i(t,e),t}(J);t.ThrowStatement=Ce;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRY,t}return i(t,e),t}(J);t.TryStatement=Oe;var xe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEDECLARATION,t}return i(t,e),t}(ee);t.TypeDeclaration=xe;var ke=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLEDECLARATION,t}return i(t,e),t}(re);t.VariableDeclaration=ke;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLE,t}return i(t,e),t}(J);t.VariableStatement=Le;var Re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VOID,t}return i(t,e),t}(J);t.VoidStatement=Re;var Fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.WHILE,t}return i(t,e),t}(J);function Be(e){return e.endsWith(".ts")&&(e=e.substring(0,e.length-3)),e}t.WhileStatement=Fe,t.findDecorator=function(e,t){if(t)for(var r=0,n=t.length;r>>e.size-t},e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.asClass=function(t){assert(9==this.kind&&!this.classReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.classReference=t,r},e.prototype.asFunction=function(t){assert(7==this.kind&&!this.signatureReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.signatureReference=t,r},e.prototype.asNullable=function(){return assert(this.is(256)),this.cachedNullableType||(assert(!this.is(512)),this.cachedNullableType=new e(this.kind,512|this.flags,this.size),this.cachedNullableType.nonNullableType=this,this.cachedNullableType.classReference=this.classReference,this.cachedNullableType.signatureReference=this.signatureReference),this.cachedNullableType},e.prototype.isAssignableTo=function(t,r){var n,i,a,o;if(void 0===r&&(r=!1),this.is(256)){if(t.is(256)&&(!this.is(512)||t.is(512)))if(n=this.classReference){if(i=t.classReference)return n.isAssignableTo(i)}else if((a=this.signatureReference)&&(o=t.signatureReference))return a.isAssignableTo(o)}else if(!t.is(256))if(this.is(4))if(t.is(4)){if(!r||this==e.bool||this.is(1)==t.is(1))return this.size<=t.size}else{if(11==t.kind)return this.size<=23;if(12==t.kind)return this.size<=52}else if(this.is(8)){if(t.is(8))return this.size<=t.size}else if(this.is(1024)&&t.is(1024))return this.size==t.size;return!1},e.commonCompatible=function(e,t,r){return t.isAssignableTo(e,r)?e:e.isAssignableTo(t,r)?t:null},e.prototype.toString=function(e){if(void 0===e&&(e=!1),!e&&this.is(256)){var t=this.classReference;if(t)return this.is(512)?t.name+" | null":t.name;var r=this.signatureReference;if(r)return this.is(512)?"("+r.toString(!0)+") | null":r.toString(!0);assert(!1)}switch(this.kind){case 0:return"i8";case 1:return"i16";case 2:return"i32";case 3:return"i64";case 4:return"isize";case 5:return"u8";case 6:return"u16";case 7:return"u32";case 8:return"u64";case 9:return"usize";case 10:return"bool";case 11:return"f32";case 12:return"f64";case 13:return"v128";default:assert(!1);case 14:return"void"}},e.prototype.toNativeType=function(){switch(this.kind){default:return i.NativeType.I32;case 3:case 8:return i.NativeType.I64;case 4:case 9:return 64==this.size?i.NativeType.I64:i.NativeType.I32;case 11:return i.NativeType.F32;case 12:return i.NativeType.F64;case 13:return i.NativeType.V128;case 14:return i.NativeType.None}},e.prototype.toNativeZero=function(e){switch(this.kind){case 14:assert(!1);default:return e.createI32(0);case 4:case 9:if(64!=this.size)return e.createI32(0);case 3:case 8:return e.createI64(0);case 11:return e.createF32(0);case 12:return e.createF64(0);case 13:return e.createV128(a)}},e.prototype.toNativeOne=function(e){switch(this.kind){case 13:case 14:assert(!1);default:return e.createI32(1);case 4:case 9:if(64!=this.size)return e.createI32(1);case 3:case 8:return e.createI64(1);case 11:return e.createF32(1);case 12:return e.createF64(1)}},e.prototype.toNativeNegOne=function(e){switch(this.kind){case 13:case 14:assert(!1);default:return e.createI32(-1);case 4:case 9:if(64!=this.size)return e.createI32(-1);case 3:case 8:return e.createI64(-1,-1);case 11:return e.createF32(-1);case 12:return e.createF64(-1)}},e.prototype.toSignatureString=function(){switch(this.kind){default:return"i";case 3:case 8:return"I";case 4:case 9:return 64==this.size?"I":"i";case 11:return"f";case 12:return"F";case 13:return"v";case 14:return"_"}},e.i8=new e(0,165,8),e.i16=new e(1,165,16),e.i32=new e(2,133,32),e.i64=new e(3,197,64),e.isize32=new e(4,149,32),e.isize64=new e(4,213,64),e.u8=new e(5,166,8),e.u16=new e(6,166,16),e.u32=new e(7,134,32),e.u64=new e(8,198,64),e.usize32=new e(9,150,32),e.usize64=new e(9,214,64),e.bool=new e(10,166,1),e.f32=new e(11,137,32),e.f64=new e(12,201,64),e.v128=new e(13,1152,128),e.void=new e(14,0,0),e}();t.Type=o,t.typesToNativeTypes=function(e){for(var t=e.length,r=new Array(t),n=0;ne?t[e]:l(e)},e.prototype.isAssignableTo=function(e){var t=this.thisType,r=e.thisType;if(t){if(!r||!t.isAssignableTo(r))return!1}else if(r)return!1;if(this.hasRest!=e.hasRest)return!1;var n=this.parameterTypes,i=e.parameterTypes,a=n.length;if(a!=i.length)return!1;for(var o=0;o=c&&u!=p?t.push("?: "):t.push(": "),t.push(i[u].toString());return t.push(") => "),t.push(this.returnType.toString()),t.join("")},e}();t.Signature=s;var c=null;function l(e){c||(c=[]);for(var t=c.length;t<=e;++t)c.push("arg$"+t.toString(10));return c[e-1]}t.getDefaultParameterName=l},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var a,o,s=r(1),c=r(5),l=r(2);function p(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return a.ABSTRACT;case"as":return a.AS;case"async":return a.ASYNC;case"await":return a.AWAIT}break;case 98:switch(e){case"break":return a.BREAK}break;case 99:switch(e){case"case":return a.CASE;case"catch":return a.CATCH;case"class":return a.CLASS;case"continue":return a.CONTINUE;case"const":return a.CONST;case"constructor":return a.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return a.DEBUGGER;case"declare":return a.DECLARE;case"default":return a.DEFAULT;case"delete":return a.DELETE;case"do":return a.DO}break;case 101:switch(e){case"else":return a.ELSE;case"enum":return a.ENUM;case"export":return a.EXPORT;case"extends":return a.EXTENDS}break;case 102:switch(e){case"false":return a.FALSE;case"finally":return a.FINALLY;case"for":return a.FOR;case"from":return a.FROM;case"function":return a.FUNCTION}break;case 103:switch(e){case"get":return a.GET}break;case 105:switch(e){case"if":return a.IF;case"implements":return a.IMPLEMENTS;case"import":return a.IMPORT;case"in":return a.IN;case"instanceof":return a.INSTANCEOF;case"interface":return a.INTERFACE;case"is":return a.IS}break;case 107:switch(e){case"keyof":return a.KEYOF}break;case 108:switch(e){case"let":return a.LET}break;case 109:switch(e){case"module":return a.MODULE}break;case 110:switch(e){case"namespace":return a.NAMESPACE;case"new":return a.NEW;case"null":return a.NULL}break;case 111:switch(e){case"of":return a.OF}break;case 112:switch(e){case"package":return a.PACKAGE;case"private":return a.PRIVATE;case"protected":return a.PROTECTED;case"public":return a.PUBLIC}break;case 114:switch(e){case"readonly":return a.READONLY;case"return":return a.RETURN}break;case 115:switch(e){case"set":return a.SET;case"static":return a.STATIC;case"super":return a.SUPER;case"switch":return a.SWITCH}break;case 116:switch(e){case"this":return a.THIS;case"throw":return a.THROW;case"true":return a.TRUE;case"try":return a.TRY;case"type":return a.TYPE;case"typeof":return a.TYPEOF}break;case 118:switch(e){case"var":return a.VAR;case"void":return a.VOID}break;case 119:switch(e){case"while":return a.WHILE;case"with":return a.WITH}break;case 121:switch(e){case"yield":return a.YIELD}}return a.INVALID}function u(e){switch(e){case a.ABSTRACT:case a.AS:case a.CONSTRUCTOR:case a.DECLARE:case a.DELETE:case a.FROM:case a.FOR:case a.GET:case a.IS:case a.KEYOF:case a.MODULE:case a.NAMESPACE:case a.READONLY:case a.SET:case a.TYPE:case a.VOID:return!0;default:return!1}}!function(e){e[e.ABSTRACT=0]="ABSTRACT",e[e.AS=1]="AS",e[e.ASYNC=2]="ASYNC",e[e.AWAIT=3]="AWAIT",e[e.BREAK=4]="BREAK",e[e.CASE=5]="CASE",e[e.CATCH=6]="CATCH",e[e.CLASS=7]="CLASS",e[e.CONST=8]="CONST",e[e.CONTINUE=9]="CONTINUE",e[e.CONSTRUCTOR=10]="CONSTRUCTOR",e[e.DEBUGGER=11]="DEBUGGER",e[e.DECLARE=12]="DECLARE",e[e.DEFAULT=13]="DEFAULT",e[e.DELETE=14]="DELETE",e[e.DO=15]="DO",e[e.ELSE=16]="ELSE",e[e.ENUM=17]="ENUM",e[e.EXPORT=18]="EXPORT",e[e.EXTENDS=19]="EXTENDS",e[e.FALSE=20]="FALSE",e[e.FINALLY=21]="FINALLY",e[e.FOR=22]="FOR",e[e.FROM=23]="FROM",e[e.FUNCTION=24]="FUNCTION",e[e.GET=25]="GET",e[e.IF=26]="IF",e[e.IMPLEMENTS=27]="IMPLEMENTS",e[e.IMPORT=28]="IMPORT",e[e.IN=29]="IN",e[e.INSTANCEOF=30]="INSTANCEOF",e[e.INTERFACE=31]="INTERFACE",e[e.IS=32]="IS",e[e.KEYOF=33]="KEYOF",e[e.LET=34]="LET",e[e.MODULE=35]="MODULE",e[e.NAMESPACE=36]="NAMESPACE",e[e.NEW=37]="NEW",e[e.NULL=38]="NULL",e[e.OF=39]="OF",e[e.PACKAGE=40]="PACKAGE",e[e.PRIVATE=41]="PRIVATE",e[e.PROTECTED=42]="PROTECTED",e[e.PUBLIC=43]="PUBLIC",e[e.READONLY=44]="READONLY",e[e.RETURN=45]="RETURN",e[e.SET=46]="SET",e[e.STATIC=47]="STATIC",e[e.SUPER=48]="SUPER",e[e.SWITCH=49]="SWITCH",e[e.THIS=50]="THIS",e[e.THROW=51]="THROW",e[e.TRUE=52]="TRUE",e[e.TRY=53]="TRY",e[e.TYPE=54]="TYPE",e[e.TYPEOF=55]="TYPEOF",e[e.VAR=56]="VAR",e[e.VOID=57]="VOID",e[e.WHILE=58]="WHILE",e[e.WITH=59]="WITH",e[e.YIELD=60]="YIELD",e[e.OPENBRACE=61]="OPENBRACE",e[e.CLOSEBRACE=62]="CLOSEBRACE",e[e.OPENPAREN=63]="OPENPAREN",e[e.CLOSEPAREN=64]="CLOSEPAREN",e[e.OPENBRACKET=65]="OPENBRACKET",e[e.CLOSEBRACKET=66]="CLOSEBRACKET",e[e.DOT=67]="DOT",e[e.DOT_DOT_DOT=68]="DOT_DOT_DOT",e[e.SEMICOLON=69]="SEMICOLON",e[e.COMMA=70]="COMMA",e[e.LESSTHAN=71]="LESSTHAN",e[e.GREATERTHAN=72]="GREATERTHAN",e[e.LESSTHAN_EQUALS=73]="LESSTHAN_EQUALS",e[e.GREATERTHAN_EQUALS=74]="GREATERTHAN_EQUALS",e[e.EQUALS_EQUALS=75]="EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS=76]="EXCLAMATION_EQUALS",e[e.EQUALS_EQUALS_EQUALS=77]="EQUALS_EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS_EQUALS=78]="EXCLAMATION_EQUALS_EQUALS",e[e.EQUALS_GREATERTHAN=79]="EQUALS_GREATERTHAN",e[e.PLUS=80]="PLUS",e[e.MINUS=81]="MINUS",e[e.ASTERISK_ASTERISK=82]="ASTERISK_ASTERISK",e[e.ASTERISK=83]="ASTERISK",e[e.SLASH=84]="SLASH",e[e.PERCENT=85]="PERCENT",e[e.PLUS_PLUS=86]="PLUS_PLUS",e[e.MINUS_MINUS=87]="MINUS_MINUS",e[e.LESSTHAN_LESSTHAN=88]="LESSTHAN_LESSTHAN",e[e.GREATERTHAN_GREATERTHAN=89]="GREATERTHAN_GREATERTHAN",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN=90]="GREATERTHAN_GREATERTHAN_GREATERTHAN",e[e.AMPERSAND=91]="AMPERSAND",e[e.BAR=92]="BAR",e[e.CARET=93]="CARET",e[e.EXCLAMATION=94]="EXCLAMATION",e[e.TILDE=95]="TILDE",e[e.AMPERSAND_AMPERSAND=96]="AMPERSAND_AMPERSAND",e[e.BAR_BAR=97]="BAR_BAR",e[e.QUESTION=98]="QUESTION",e[e.COLON=99]="COLON",e[e.EQUALS=100]="EQUALS",e[e.PLUS_EQUALS=101]="PLUS_EQUALS",e[e.MINUS_EQUALS=102]="MINUS_EQUALS",e[e.ASTERISK_EQUALS=103]="ASTERISK_EQUALS",e[e.ASTERISK_ASTERISK_EQUALS=104]="ASTERISK_ASTERISK_EQUALS",e[e.SLASH_EQUALS=105]="SLASH_EQUALS",e[e.PERCENT_EQUALS=106]="PERCENT_EQUALS",e[e.LESSTHAN_LESSTHAN_EQUALS=107]="LESSTHAN_LESSTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_EQUALS=108]="GREATERTHAN_GREATERTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS=109]="GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS",e[e.AMPERSAND_EQUALS=110]="AMPERSAND_EQUALS",e[e.BAR_EQUALS=111]="BAR_EQUALS",e[e.CARET_EQUALS=112]="CARET_EQUALS",e[e.AT=113]="AT",e[e.IDENTIFIER=114]="IDENTIFIER",e[e.STRINGLITERAL=115]="STRINGLITERAL",e[e.INTEGERLITERAL=116]="INTEGERLITERAL",e[e.FLOATLITERAL=117]="FLOATLITERAL",e[e.INVALID=118]="INVALID",e[e.ENDOFFILE=119]="ENDOFFILE"}(a=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(o=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=p,t.tokenIsAlsoIdentifier=u,t.operatorTokenToString=function(e){switch(e){case a.DELETE:return"delete";case a.IN:return"in";case a.INSTANCEOF:return"instanceof";case a.NEW:return"new";case a.TYPEOF:return"typeof";case a.VOID:return"void";case a.YIELD:return"yield";case a.DOT_DOT_DOT:return"...";case a.COMMA:return",";case a.LESSTHAN:return"<";case a.GREATERTHAN:return">";case a.LESSTHAN_EQUALS:return"<=";case a.GREATERTHAN_EQUALS:return">=";case a.EQUALS_EQUALS:return"==";case a.EXCLAMATION_EQUALS:return"!=";case a.EQUALS_EQUALS_EQUALS:return"===";case a.EXCLAMATION_EQUALS_EQUALS:return"!==";case a.PLUS:return"+";case a.MINUS:return"-";case a.ASTERISK_ASTERISK:return"**";case a.ASTERISK:return"*";case a.SLASH:return"/";case a.PERCENT:return"%";case a.PLUS_PLUS:return"++";case a.MINUS_MINUS:return"--";case a.LESSTHAN_LESSTHAN:return"<<";case a.GREATERTHAN_GREATERTHAN:return">>";case a.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case a.AMPERSAND:return"&";case a.BAR:return"|";case a.CARET:return"^";case a.EXCLAMATION:return"!";case a.TILDE:return"~";case a.AMPERSAND_AMPERSAND:return"&&";case a.BAR_BAR:return"||";case a.EQUALS:return"=";case a.PLUS_EQUALS:return"+=";case a.MINUS_EQUALS:return"-=";case a.ASTERISK_EQUALS:return"*=";case a.ASTERISK_ASTERISK_EQUALS:return"**=";case a.SLASH_EQUALS:return"/=";case a.PERCENT_EQUALS:return"%=";case a.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case a.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case a.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case a.AMPERSAND_EQUALS:return"&=";case a.BAR_EQUALS:return"|=";case a.CARET_EQUALS:return"^=";default:return assert(!1),""}};var _=function(){function e(e,t,r){this.debugInfoRef=0,this.source=e,this.start=t,this.end=r}return e.join=function(t,r){if(t.source!=r.source)throw new Error("source mismatch");return new e(t.source,t.startr.end?t.end:r.end)},Object.defineProperty(e.prototype,"atStart",{get:function(){return new e(this.source,this.start,this.start)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"atEnd",{get:function(){return new e(this.source,this.end,this.end)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"line",{get:function(){for(var e=this.source.text,t=1,r=this.start;r>=0;--r)10==e.charCodeAt(r)&&t++;return t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"column",{get:function(){for(var e=this.source.text,t=0,r=this.start-1;r>=0&&10!=e.charCodeAt(r);--r)++t;return t},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return this.source.text.substring(this.start,this.end)},e}();t.Range=_;var h=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,r)||this;n.end=0,n.pos=0,n.token=-1,n.tokenPos=0,n.nextToken=-1,n.nextTokenPos=0,n.nextTokenOnNewLine=!1,n.onComment=null,n.source=t,n.pos=0,n.end=t.text.length,n.diagnostics=r||new Array;var i=t.text;if(n.pos1&&this.pos2&&this.pos1&&this.pos1&&this.pos1&&this.pos2&&this.pos1&&this.pos1&&this.pos1&&this.pos2&&this.pos+11&&this.pos1&&this.pos2&&this.pos1&&this.pos2&&this.pos1&&this.pos2&&this.pos3&&this.pos1&&this.pos1&&this.pos=this.end){n+=e.substring(r,this.pos),this.error(s.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.end));break}var i=e.charCodeAt(this.pos);if(i==t){n+=e.substring(r,this.pos++);break}if(92!=i){if(l.isLineBreak(i)){n+=e.substring(r,this.pos),this.error(s.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.pos));break}++this.pos}else n+=e.substring(r,this.pos),n+=this.readEscapeSequence(),r=this.pos}return n},t.prototype.readEscapeSequence=function(){if(++this.pos>=this.end)return this.error(s.DiagnosticCode.Unexpected_end_of_text,this.range(this.end)),"";var e=this.source.text,t=e.charCodeAt(this.pos++);switch(t){case 48:return"\0";case 98:return"\b";case 116:return"\t";case 110:return"\n";case 118:return"\v";case 102:return"\f";case 114:return"\r";case 39:return"'";case 34:return'"';case 117:return this.pos=this.end){this.error(s.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.end));break}if(92!=e.charCodeAt(this.pos)){var n=e.charCodeAt(this.pos);if(47==n&&!r)break;if(l.isLineBreak(n)){this.error(s.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.pos));break}++this.pos,r=!1}else++this.pos,r=!0}return e.substring(t,this.pos)},t.prototype.readRegexpFlags=function(){for(var e=this.source.text,t=this.pos,r=0;this.pos57)&&95!=r)break;t++}return!0},t.prototype.readInteger=function(){var e=this.source.text;if(48==e.charCodeAt(this.pos)&&this.pos+2=48&&o<=57)r=i64_add(i64_mul(r,n),i64_new(o-48,0));else if(o>=65&&o<=70)r=i64_add(i64_mul(r,n),i64_new(10+o-65,0));else if(o>=97&&o<=102)r=i64_add(i64_mul(r,n),i64_new(10+o-97,0));else{if(95!=o)break;i==a&&this.error(i==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(s.DiagnosticCode.Hexadecimal_digit_expected,this.range(t)):i==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readDecimalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(10,0),i=t;this.pos=48&&o<=57)r=i64_add(i64_mul(r,n),i64_new(o-48,0));else{if(95!=o)break;i==a&&this.error(i==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(s.DiagnosticCode.Digit_expected,this.range(t)):i==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readOctalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(8,0),i=t;this.pos=48&&o<=55)r=i64_add(i64_mul(r,n),i64_new(o-48,0));else{if(95!=o)break;i==a&&this.error(i==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}++this.pos}return this.pos==t?this.error(s.DiagnosticCode.Octal_digit_expected,this.range(t)):i==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readBinaryInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0,0),n=i64_new(2,0),i=i64_new(1,0),a=t;this.pos=48&&n<=57)t=16*t+n-48;else if(n>=65&&n<=70)t=16*t+10+n-65;else{if(!(n>=97&&n<=102))return this.error(s.DiagnosticCode.Hexadecimal_digit_expected,this.range(this.pos-1,this.pos)),"";t=16*t+10+n-97}if(0==--e)break}return e?(this.error(s.DiagnosticCode.Unexpected_end_of_text,this.range(this.pos)),""):String.fromCharCode(t)},t.prototype.readExtendedUnicodeEscape=function(){var e=this.pos,t=this.readHexInteger(),r=i64_low(t),n=!1;assert(!i64_high(t)),r>1114111&&(this.error(s.DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,this.range(e,this.pos)),n=!0);var i=this.source.text;return this.pos>=this.end?(this.error(s.DiagnosticCode.Unexpected_end_of_text,this.range(e,this.end)),n=!0):125==i.charCodeAt(this.pos)?++this.pos:(this.error(s.DiagnosticCode.Unterminated_Unicode_escape_sequence,this.range(e,this.pos)),n=!0),n?"":r<65536?String.fromCharCode(r):String.fromCharCode(55296+((r-65536)/1024|0),(r-65536)%1024+56320)},t.prototype.finish=function(){},t}(s.DiagnosticEmitter);t.Tokenizer=h;var d=function(){return function(){}}();t.State=d;var y=null},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},o=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return o};Object.defineProperty(t,"__esModule",{value:!0});var s,c=r(1),l=r(3),p=r(5),u=r(6),_=r(0),h=r(2),d=r(7);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var y=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.program=t,r}return i(t,e),t.prototype.resolveType=function(e,t,r,n){if(void 0===r&&(r=null),void 0===n&&(n=s.REPORT),e.kind==p.NodeKind.SIGNATURE){var i=e.explicitThisType,a=null;if(i&&!(a=this.resolveType(i,t,r,n)))return null;for(var o=e.parameters,d=o.length,y=new Array(d),m=new Array(d),g=0,T=!1,f=0;fl)return this.error(c.DiagnosticCode.Expected_0_type_arguments_but_got_1,_?p.Range.join(t[0].range,t[_-1].range):assert(i).range,(_");var U=new l.Function(D,e,B,r);return e.setResolvedInstance(o,U),U},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i,a){void 0===a&&(a=s.REPORT);var o=e.parent.kind==l.ElementKind.PROPERTY_PROTOTYPE?e.parent.parent:e.parent,p=null;if(e.is(_.CommonFlags.GENERIC)){if(e.is(_.CommonFlags.INSTANCE)){assert(o.kind==l.ElementKind.CLASS);var u=o.typeArguments;if(u){var h=assert(o.prototype.typeParameterNodes),d=u.length;assert(d==h.length);for(var y=0;y"),(f=new l.Class(C,e,t,A)).contextualTypeArguments=r,e.setResolvedInstance(T,f);var O=0;if(A){if(V=A.members){(w=f.members)||(f.members=w=new Map);try{for(var x=a(V),k=x.next();!k.done;k=x.next()){var L=o(k.value,2),R=L[0],F=L[1];w.set(R,F)}}catch(e){i={error:e}}finally{try{k&&!k.done&&(p=x.return)&&p.call(x)}finally{if(i)throw i.error}}}O=A.currentMemoryOffset}var B=e.instanceMembers;if(B)try{for(var D=a(B.values()),U=D.next();!U.done;U=D.next()){var P=U.value;switch(P.kind){case l.ElementKind.FIELD_PROTOTYPE:var w;if(w=f.members){if(w.has(P.name)){this.error(c.DiagnosticCode.Duplicate_identifier_0,P.identifierNode.range,P.name);break}}else f.members=w=new Map;var M=P.typeNode,G=null;if(M)G=this.resolveType(M,e.parent,f.contextualTypeArguments,n);else{var V;if(A)if((V=A.members)&&V.has(P.name)){var K=V.get(P.name);K.is(_.CommonFlags.PRIVATE)||(assert(K.kind==l.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(c.DiagnosticCode.Type_expected,P.identifierNode.range.atEnd)}if(!G)break;var z=new l.Field(P,f,G);switch(G.byteSize){case 1:break;case 2:1&O&&++O;break;case 4:3&O&&(O=1+(3|O));break;case 8:7&O&&(O=1+(7|O));break;default:assert(!1)}z.memoryOffset=O,O+=G.byteSize,f.add(P.name,z);break;case l.ElementKind.FUNCTION_PROTOTYPE:var H=P.toBound(f);f.add(H.name,H);break;case l.ElementKind.PROPERTY_PROTOTYPE:var Y=new l.Property(P,f),W=P.getterPrototype;if(W){var X=this.resolveFunction(W.toBound(f),null,h.makeMap(f.contextualTypeArguments),n);X&&(Y.getterInstance=X,Y.setType(X.signature.returnType))}var Q=P.setterPrototype;if(Q){var q=this.resolveFunction(Q.toBound(f),null,h.makeMap(f.contextualTypeArguments),n);q&&(Y.setterInstance=q,Y.is(_.CommonFlags.RESOLVED)||(assert(1==q.signature.parameterTypes.length),Y.setType(q.signature.parameterTypes[0])))}f.add(Y.name,Y);break;default:assert(!1)}}}catch(e){d={error:e}}finally{try{U&&!U.done&&(y=D.return)&&y.call(D)}finally{if(d)throw d.error}}f.currentMemoryOffset=O;var j=f.lookupInSelf(_.CommonSymbols.constructor);if(j&&j.parent===f){assert(j.kind==l.ElementKind.FUNCTION_PROTOTYPE);var Z=this.resolveFunction(j,null,f.contextualTypeArguments,n);Z&&(f.constructorInstance=Z)}try{for(var J=a(e.overloadPrototypes),$=J.next();!$.done;$=J.next()){var ee=o($.value,2),te=ee[0],re=ee[1];assert(te!=l.OperatorKind.INVALID);var ne=void 0;if(re.is(_.CommonFlags.INSTANCE)){H=re.toBound(f);ne=this.resolveFunction(H,null,h.makeMap(),n)}else ne=this.resolveFunction(re,null,h.makeMap(),n);if(ne){var ie=f.overloads;ie||(f.overloads=ie=new Map),ie.set(te,ne)}}}catch(e){m={error:e}}finally{try{$&&!$.done&&(g=J.return)&&g.call(J)}finally{if(m)throw m.error}}return f},t.prototype.resolveClassInclTypeArguments=function(e,t,r,n,i,a){void 0===a&&(a=s.REPORT);var o=null;if(e.is(_.CommonFlags.GENERIC)){if(!(o=this.resolveTypeArguments(assert(e.typeParameterNodes),t,r,n,i,a)))return null}else if(null!==t&&t.length)return a==s.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,i.range,e.internalName),null;return this.resolveClass(e,o,n,a)},t}(c.DiagnosticEmitter);t.Resolver=y},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},o=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return o};Object.defineProperty(t,"__esModule",{value:!0});var s,c=r(24),l=r(1),p=r(4),u=r(0),_=r(3),h=r(12),d=r(9),y=r(7),m=r(5),g=r(6),T=r(2);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(s=t.Target||(t.Target={}));var f=function(){function e(){this.target=s.WASM32,this.noAssert=!1,this.importMemory=!1,this.sharedMemory=0,this.importTable=!1,this.sourceMap=!1,this.memoryBase=0,this.globalAliases=null,this.features=0,this.optimizeLevelHint=0,this.shrinkLevelHint=0}return Object.defineProperty(e.prototype,"isWasm64",{get:function(){return this.target==s.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==s.WASM64?g.Type.usize64:g.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==s.WASM64?g.Type.isize64:g.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==s.WASM64?p.NativeType.I64:p.NativeType.I32},enumerable:!0,configurable:!0}),e.prototype.hasFeature=function(e){return 0!=(this.features&e)},e}();t.Options=f,function(e){e[e.NONE=0]="NONE",e[e.SIGN_EXTENSION=1]="SIGN_EXTENSION",e[e.MUTABLE_GLOBAL=2]="MUTABLE_GLOBAL",e[e.BULK_MEMORY=4]="BULK_MEMORY",e[e.SIMD=8]="SIMD",e[e.THREADS=16]="THREADS"}(t.Feature||(t.Feature={})),function(e){e[e.NONE=0]="NONE",e[e.IMPLICIT=1]="IMPLICIT",e[e.EXPLICIT=2]="EXPLICIT"}(t.ConversionKind||(t.ConversionKind={})),function(e){e[e.NONE=0]="NONE",e[e.WRAP=1]="WRAP"}(t.WrapMode||(t.WrapMode={}));var E,I,v,b=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,t.diagnostics)||this;return n.currentInlineFunctions=[],n.currentEnum=null,n.currentType=g.Type.void,n.memorySegments=[],n.stringSegments=new Map,n.functionTable=["null"],n.argcVar=0,n.argcSet=0,n.needsIterateRoots=!1,n.f32ModInstance=null,n.f64ModInstance=null,n.f32PowInstance=null,n.f64PowInstance=null,n.program=t,n.resolver=t.resolver,r||(r=new f),n.options=r,n.memoryOffset=i64_new(max(r.memoryBase,8)),n.module=p.Module.create(),n}return i(t,e),t.compile=function(e,r){return void 0===r&&(r=null),new t(e,r).compile()},t.prototype.compile=function(){var e,t,r,n,i=this.options,o=this.module,s=this.program;s.initialize(i);var l=s.makeNativeFunction("start",new g.Signature([],g.Type.void));l.internalName="start";var u=new Array;this.currentFlow=l.flow,this.currentBody=u,i.isWasm64?o.addGlobal(c.BuiltinSymbols.HEAP_BASE,p.NativeType.I64,!0,o.createI64(0,0)):o.addGlobal(c.BuiltinSymbols.HEAP_BASE,p.NativeType.I32,!1,o.createI32(0));var _=s.filesByName;try{for(var h=a(_.values()),d=h.next();!d.done;d=h.next()){(S=d.value).source.isEntry&&(this.compileFile(S),this.compileExports(S))}}catch(t){e={error:t}}finally{try{d&&!d.done&&(t=h.return)&&t.call(h)}finally{if(e)throw e.error}}var y=s.explicitStartFunction;if(u.length||y){var m=l.signature,T=o.addFunction(l.internalName,this.ensureFunctionType(m.parameterTypes,m.returnType,m.thisType),g.typesToNativeTypes(l.additionalLocals),o.createBlock(null,u));l.finalize(o,T),y||o.setStart(T)}var f=this.memoryOffset;f=i64_align(f,i.usizeType.byteSize),this.memoryOffset=f,o.removeGlobal(c.BuiltinSymbols.HEAP_BASE),i.isWasm64?o.addGlobal(c.BuiltinSymbols.HEAP_BASE,p.NativeType.I64,!1,o.createI64(i64_low(f),i64_high(f))):o.addGlobal(c.BuiltinSymbols.HEAP_BASE,p.NativeType.I32,!1,o.createI32(i64_low(f)));var E=i.hasFeature(16)&&i.sharedMemory>0;o.setMemory(this.options.memoryBase||this.memorySegments.length?i64_low(i64_shr_u(i64_align(f,65536),i64_new(16,0))):0,E?i.sharedMemory:p.Module.UNLIMITED_MEMORY,this.memorySegments,i.target,"memory"),i.importMemory&&o.addMemoryImport("0","env","memory",E);var I=this.functionTable;o.setFunctionTable(I.length,4294967295,I),o.addTableExport("0","table"),o.addFunction("null",this.ensureFunctionType(null,g.Type.void),null,o.createBlock(null,[])),i.importTable&&o.addTableImport("0","env","table");try{for(var v=a(this.program.filesByName.values()),b=v.next();!b.done;b=v.next()){var S;(S=b.value).source.isEntry&&this.makeModuleExports(S)}}catch(e){r={error:e}}finally{try{b&&!b.done&&(n=v.return)&&n.call(v)}finally{if(r)throw r.error}}return this.needsIterateRoots&&c.compileIterateRoots(this),o},t.prototype.makeModuleExports=function(e){var t,r,n=e.exports;if(n)try{for(var i=a(n),s=i.next();!s.done;s=i.next()){var c=o(s.value,2),l=c[0],p=c[1];this.makeModuleExport(l,p)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}var u=e.exportsStar;if(u)for(var _=0,h=u.length;_1?c.createBlock(null,n):n[0]),r.push(c.createCall(t.internalName,null,p.NativeType.None))}}},t.prototype.compileGlobal=function(e){if(e.is(u.CommonFlags.COMPILED))return!0;e.set(u.CommonFlags.COMPILED);var t=this.module,r=0,n=e.typeNode,i=e.initializerNode;if(!e.is(u.CommonFlags.RESOLVED))if(n){var a=this.resolver.resolveType(n,e.parent);if(!a)return!1;if(a==g.Type.void)return this.error(l.DiagnosticCode.Type_expected,n.range),!1;e.setType(a)}else{if(!i)return this.error(l.DiagnosticCode.Type_expected,e.identifierNode.range.atEnd),!1;var o=this.currentFlow;if(e.hasDecorator(_.DecoratorFlags.LAZY)&&(this.currentFlow=e.file.startFunction.flow),r=this.compileExpressionRetainType(i,g.Type.void,1),this.currentFlow=o,this.currentType==g.Type.void)return this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,i.range,this.currentType.toString(),""),!1;e.setType(this.currentType)}if(e.is(u.CommonFlags.AMBIENT)&&e.hasDecorator(_.DecoratorFlags.BUILTIN))return!0;var s=e.type.toNativeType(),c=e.is(u.CommonFlags.CONST)||e.is(u.CommonFlags.STATIC|u.CommonFlags.READONLY);if(e.is(u.CommonFlags.AMBIENT))return c||this.options.hasFeature(2)?(e.set(u.CommonFlags.MODULE_IMPORT),S(e,e.declaration),t.addGlobalImport(e.internalName,E,I,s),e.set(u.CommonFlags.COMPILED),!0):(this.error(l.DiagnosticCode.Operation_not_supported,e.declaration.range),!1);var h=!1;if(i){if(!r){o=this.currentFlow;e.hasDecorator(_.DecoratorFlags.LAZY)&&(this.currentFlow=e.file.startFunction.flow),r=this.compileExpression(i,e.type,1,1),this.currentFlow=o}if(p.getExpressionId(r)!=p.ExpressionId.Const&&(c?(r=t.precomputeExpression(r),p.getExpressionId(r)!=p.ExpressionId.Const&&(this.warning(l.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,i.range),h=!0)):h=!0),e.hasDecorator(_.DecoratorFlags.INLINE)&&!h){switch(assert(p.getExpressionId(r)==p.ExpressionId.Const),p.getExpressionType(r)){case p.NativeType.I32:e.constantValueKind=1,e.constantIntegerValue=i64_new(p.getConstValueI32(r),0);break;case p.NativeType.I64:e.constantValueKind=1,e.constantIntegerValue=i64_new(p.getConstValueI64Low(r),p.getConstValueI64High(r));break;case p.NativeType.F32:e.constantValueKind=2,e.constantFloatValue=p.getConstValueF32(r);break;case p.NativeType.F64:e.constantValueKind=2,e.constantFloatValue=p.getConstValueF64(r);break;default:return assert(!1),!1}e.set(u.CommonFlags.INLINED)}}else r=e.type.toNativeZero(t);var d=e.internalName;return h?(e.hasDecorator(_.DecoratorFlags.INLINE)&&this.error(l.DiagnosticCode.Decorator_0_is_not_valid_here,e.identifierNode.range,"inline"),t.addGlobal(d,s,!0,e.type.toNativeZero(t)),this.currentBody.push(t.createSetGlobal(d,r))):e.hasDecorator(_.DecoratorFlags.INLINE)||t.addGlobal(d,s,!c,r),!0},t.prototype.compileEnum=function(e){var t,r;if(e.is(u.CommonFlags.COMPILED))return!0;e.set(u.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var i=null,o=!1,s=e.is(u.CommonFlags.CONST)||e.hasDecorator(_.DecoratorFlags.INLINE);if(e.members)try{for(var c=a(e.members.values()),h=c.next();!h.done;h=c.next()){var d=h.value;if(d.kind==_.ElementKind.ENUMVALUE){var y=!1,m=d,T=m.valueNode;m.set(u.CommonFlags.COMPILED);var f=this.currentFlow;e.hasDecorator(_.DecoratorFlags.LAZY)&&(this.currentFlow=e.file.startFunction.flow);var E=void 0;T?(E=this.compileExpression(T,g.Type.i32,1,0),p.getExpressionId(E)!=p.ExpressionId.Const&&(e.is(u.CommonFlags.CONST)?(E=n.precomputeExpression(E),p.getExpressionId(E)!=p.ExpressionId.Const&&(this.error(l.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,T.range),y=!0)):y=!0)):null==i?E=n.createI32(0):(o&&this.error(l.DiagnosticCode.Enum_member_must_have_initializer,d.identifierNode.range.atEnd),E=n.createBinary(p.BinaryOp.AddI32,n.createGetGlobal(i.internalName,p.NativeType.I32),n.createI32(1)),E=n.precomputeExpression(E),p.getExpressionId(E)!=p.ExpressionId.Const&&(e.is(u.CommonFlags.CONST)&&this.error(l.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,d.declaration.range),y=!0)),this.currentFlow=f,y?(n.addGlobal(m.internalName,p.NativeType.I32,!0,n.createI32(0)),this.currentBody.push(n.createSetGlobal(m.internalName,E)),o=!0):(s?(m.setConstantIntegerValue(i64_new(p.getConstValueI32(E)),g.Type.i32),m.is(u.CommonFlags.MODULE_EXPORT)&&n.addGlobal(m.internalName,p.NativeType.I32,!1,E)):n.addGlobal(m.internalName,p.NativeType.I32,!0,E),o=!1),i=m}}}catch(e){t={error:e}}finally{try{h&&!h.done&&(r=c.return)&&r.call(c)}finally{if(t)throw t.error}}return this.currentEnum=null,!0},t.prototype.compileFunctionUsingTypeArguments=function(e,t,r,n){if(void 0===r&&(r=T.makeMap()),void 0===n&&(n=null),e.hasDecorator(_.DecoratorFlags.BUILTIN))return null;var i=this.resolver.resolveFunctionInclTypeArguments(e,t,e.parent,r,n||e.declaration);return i&&this.compileFunction(i)?i:null},t.prototype.ensureFunctionType=function(e,t,r){void 0===r&&(r=null);var n,i=e?e.length:0,a=0;if(r?((n=new Array(1+i))[0]=r.toNativeType(),a=1):n=new Array(i),e)for(var o=0;o=0)return e.functionTableIndex;var t=this.functionTable,r=t.length;return!e.is(u.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters=0?"case"+u.toString(10):"break")+"|"+a);var d=t.createBlock("case0|"+a,c,p.NativeType.None),y=!0,m=!0,T=!0,f=!0;for(_=0;_=0&&(y&&i.set(1),m&&i.set(2),T&&i.set(4),f&&i.set(32)),d},t.prototype.compileThrowStatement=function(e){var t=this.currentFlow;return t.set(4),t.set(1),c.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileVariableStatement=function(e){for(var t=e.declarations,r=t.length,n=this.currentFlow,i=new Array,a=this.resolver,o=0;o");continue}h=this.currentType}var y=!1;if(s.is(u.CommonFlags.CONST))if(d)if(d=this.module.precomputeExpression(d),p.getExpressionId(d)==p.ExpressionId.Const){var m=new _.Local(c,-1,h,n.parentFunction);switch(p.getExpressionType(d)){case p.NativeType.I32:m.setConstantIntegerValue(i64_new(p.getConstValueI32(d),0),h);break;case p.NativeType.I64:m.setConstantIntegerValue(i64_new(p.getConstValueI64Low(d),p.getConstValueI64High(d)),h);break;case p.NativeType.F32:m.setConstantFloatValue(p.getConstValueF32(d),h);break;case p.NativeType.F64:m.setConstantFloatValue(p.getConstValueF64(d),h);break;default:return assert(!1),this.module.createUnreachable()}var T=n.scopedLocals;if(T){if(T.has(c))return this.error(l.DiagnosticCode.Duplicate_identifier_0,s.name.range,c),this.module.createUnreachable()}else n.scopedLocals=T=new Map;T.set(c,m),y=!0}else this.warning(l.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,s.range);else this.error(l.DiagnosticCode._const_declarations_must_be_initialized,s.range);if(!y){m=void 0;if(s.isAny(u.CommonFlags.LET|u.CommonFlags.CONST)||n.is(4096))m=n.addScopedLocal(c,h,!1,s.name);else{if(n.lookupLocal(c)){this.error(l.DiagnosticCode.Duplicate_identifier_0,s.name.range,c);continue}m=n.parentFunction.addLocal(h,c,s)}d?(i.push(this.compileAssignmentWithValue(s.name,d)),m.type.is(36)&&n.setLocalWrapped(m.index,!n.canOverflow(d,h))):m.type.is(36)&&n.setLocalWrapped(m.index,!0)}}return i.length?1==i.length?i[0]:this.module.createBlock(null,i,p.NativeType.None):0},t.prototype.compileVoidStatement=function(e){return this.compileExpression(e.expression,g.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.currentFlow,n=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,g.Type.bool,0),this.currentType),i=t.precomputeExpression(n);if(p.getExpressionId(i)==p.ExpressionId.Const&&p.getExpressionType(i)==p.NativeType.I32){if(!p.getConstValueI32(i))return t.createNop()}else n=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,g.Type.bool,0),this.currentType);var a=r.pushBreakLabel(),o=r.fork();this.currentFlow=o;var s="break|"+a;o.breakLabel=s;var c="continue|"+a;o.continueLabel=c;var l=this.compileStatement(e.statement),u=o.isAny(29);return o.freeScopedLocals(),r.popBreakLabel(),this.currentFlow=r,o.unset(1560),r.inheritConditional(o),t.createBlock(s,[t.createLoop(c,t.createIf(n,u?l:t.createBlock(null,[l,t.createBreak(c)],p.NativeType.None)))])},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(u.CommonFlags.INLINED));var n=e.type;switch(!r&&n.is(4)&&t.is(4)&&n.size>i:0);case 5:case 6:case 10:var a=e.type.computeSmallIntegerMask(g.Type.i32);return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue)&a:0);case 2:case 7:return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 4:case 9:if(!e.program.options.isWasm64)return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 3:case 8:return 1==e.constantValueKind?this.module.createI64(i64_low(e.constantIntegerValue),i64_high(e.constantIntegerValue)):this.module.createI64(0);case 12:if(!e.hasDecorator(_.DecoratorFlags.BUILTIN)||t!=g.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=g.Type.f32;case 11:return this.module.createF32(e.constantFloatValue);default:return assert(!1),this.module.createUnreachable()}},t.prototype.compileExpression=function(e,t,r,n){var i;switch(this.currentType=t,e.kind){case m.NodeKind.ASSERTION:i=this.compileAssertionExpression(e,t);break;case m.NodeKind.BINARY:i=this.compileBinaryExpression(e,t);break;case m.NodeKind.CALL:i=this.compileCallExpression(e,t);break;case m.NodeKind.COMMA:i=this.compileCommaExpression(e,t);break;case m.NodeKind.ELEMENTACCESS:i=this.compileElementAccessExpression(e,t);break;case m.NodeKind.FUNCTION:i=this.compileFunctionExpression(e,t);break;case m.NodeKind.IDENTIFIER:case m.NodeKind.FALSE:case m.NodeKind.NULL:case m.NodeKind.THIS:case m.NodeKind.SUPER:case m.NodeKind.TRUE:i=this.compileIdentifierExpression(e,t,0==r);break;case m.NodeKind.INSTANCEOF:i=this.compileInstanceOfExpression(e,t);break;case m.NodeKind.LITERAL:i=this.compileLiteralExpression(e,t);break;case m.NodeKind.NEW:i=this.compileNewExpression(e,t);break;case m.NodeKind.PARENTHESIZED:i=this.compileParenthesizedExpression(e,t);break;case m.NodeKind.PROPERTYACCESS:i=this.compilePropertyAccessExpression(e,t,0==r);break;case m.NodeKind.TERNARY:i=this.compileTernaryExpression(e,t);break;case m.NodeKind.UNARYPOSTFIX:i=this.compileUnaryPostfixExpression(e,t);break;case m.NodeKind.UNARYPREFIX:i=this.compileUnaryPrefixExpression(e,t);break;default:this.error(l.DiagnosticCode.Operation_not_supported,e.range),i=this.module.createUnreachable()}var a=this.currentType;return 0!=r&&a!=t?(i=this.convertExpression(i,a,t,r,n,e),this.currentType=t):1==n&&(i=this.ensureSmallIntegerWrap(i,a)),this.options.sourceMap&&this.addDebugLocation(i,e.range),i},t.prototype.compileExpressionRetainType=function(e,t,r){return this.compileExpression(e,t==g.Type.void?g.Type.i32:t,0,r)},t.prototype.precomputeExpression=function(e,t,r,n){return this.module.precomputeExpression(this.compileExpression(e,t,r,n))},t.prototype.convertExpression=function(e,t,r,n,i,a){assert(0!=n);var o=this.module;return 14==t.kind?(assert(14!=r.kind),this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,a.range,t.toString(),r.toString()),o.createUnreachable()):14==r.kind?o.createDrop(e):(t.isAssignableTo(r)||1==n&&this.error(l.DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,a.range,t.toString(),r.toString()),t.is(8)?r.is(8)?11==t.kind?12==r.kind&&(e=o.createUnary(p.UnaryOp.PromoteF32,e)):11==r.kind&&(e=o.createUnary(p.UnaryOp.DemoteF64,e)):r.is(4)?11==t.kind?r==g.Type.bool?(e=o.createBinary(p.BinaryOp.NeF32,e,o.createF32(0)),i=0):e=r.is(1)?r.is(64)?o.createUnary(p.UnaryOp.TruncF32ToI64,e):o.createUnary(p.UnaryOp.TruncF32ToI32,e):r.is(64)?o.createUnary(p.UnaryOp.TruncF32ToU64,e):o.createUnary(p.UnaryOp.TruncF32ToU32,e):r==g.Type.bool?(e=o.createBinary(p.BinaryOp.NeF64,e,o.createF64(0)),i=0):e=r.is(1)?r.is(64)?o.createUnary(p.UnaryOp.TruncF64ToI64,e):o.createUnary(p.UnaryOp.TruncF64ToI32,e):r.is(64)?o.createUnary(p.UnaryOp.TruncF64ToU64,e):o.createUnary(p.UnaryOp.TruncF64ToU32,e):(assert(0==r.flags,"void type expected"),e=o.createDrop(e)):t.is(4)&&r.is(8)?e=11==r.kind?t.is(64)?o.createUnary(t.is(1)?p.UnaryOp.ConvertI64ToF32:p.UnaryOp.ConvertU64ToF32,e):o.createUnary(t.is(1)?p.UnaryOp.ConvertI32ToF32:p.UnaryOp.ConvertU32ToF32,e):t.is(64)?o.createUnary(t.is(1)?p.UnaryOp.ConvertI64ToF64:p.UnaryOp.ConvertU64ToF64,e):o.createUnary(t.is(1)?p.UnaryOp.ConvertI32ToF64:p.UnaryOp.ConvertU32ToF64,e):t.is(64)?r==g.Type.bool?(e=o.createBinary(p.BinaryOp.NeI64,e,o.createI64(0)),i=0):r.is(64)||(e=o.createUnary(p.UnaryOp.WrapI64,e)):r.is(64)?(e=o.createUnary(t.is(1)?p.UnaryOp.ExtendI32:p.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d),o.kind){case 0:case 1:case 2:s=c.createBinary(p.BinaryOp.GtI32,r,i);break;case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.GtI64:p.BinaryOp.GtI32,r,i);break;case 3:s=c.createBinary(p.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:s=c.createBinary(p.BinaryOp.GtU32,r,i);break;case 9:s=c.createBinary(this.options.isWasm64?p.BinaryOp.GtU64:p.BinaryOp.GtU32,r,i);break;case 8:s=c.createBinary(p.BinaryOp.GtU64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.GtF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.GtF64,r,i);break;default:assert(!1),s=c.createUnreachable()}this.currentType=g.Type.bool;break;case y.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.LE)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!0)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d),o.kind){case 0:case 1:case 2:s=c.createBinary(p.BinaryOp.LeI32,r,i);break;case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.LeI64:p.BinaryOp.LeI32,r,i);break;case 3:s=c.createBinary(p.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:s=c.createBinary(p.BinaryOp.LeU32,r,i);break;case 9:s=c.createBinary(this.options.isWasm64?p.BinaryOp.LeU64:p.BinaryOp.LeU32,r,i);break;case 8:s=c.createBinary(p.BinaryOp.LeU64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.LeF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.LeF64,r,i);break;default:assert(!1),s=c.createUnreachable()}this.currentType=g.Type.bool;break;case y.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.GE)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!0)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d),o.kind){case 0:case 1:case 2:s=c.createBinary(p.BinaryOp.GeI32,r,i);break;case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.GeI64:p.BinaryOp.GeI32,r,i);break;case 3:s=c.createBinary(p.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:s=c.createBinary(p.BinaryOp.GeU32,r,i);break;case 9:s=c.createBinary(this.options.isWasm64?p.BinaryOp.GeU64:p.BinaryOp.GeU32,r,i);break;case 8:s=c.createBinary(p.BinaryOp.GeU64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.GeF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.GeF64,r,i);break;default:assert(!1),s=c.createUnreachable()}this.currentType=g.Type.bool;break;case y.Token.EQUALS_EQUALS_EQUALS:case y.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,T==y.Token.EQUALS_EQUALS&&this.currentType.is(256))if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.EQ)){s=this.compileBinaryOverload(b,h,r,d,e);break}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,y.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d),o.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:s=c.createBinary(p.BinaryOp.EqI32,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.EqI64:p.BinaryOp.EqI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.EqI64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.EqF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.EqF64,r,i);break;default:assert(!1),s=c.createUnreachable()}this.currentType=g.Type.bool;break;case y.Token.EXCLAMATION_EQUALS_EQUALS:case y.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,T==y.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.NE)){s=this.compileBinaryOverload(b,h,r,d,e);break}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,y.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d),o.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:s=c.createBinary(p.BinaryOp.NeI32,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.NeI64:p.BinaryOp.NeI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.NeI64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.NeF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.NeF64,r,i);break;default:assert(!1),s=c.createUnreachable()}this.currentType=g.Type.bool;break;case y.Token.EQUALS:return this.compileAssignment(h,d,t);case y.Token.PLUS_EQUALS:m=!0;case y.Token.PLUS:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.ADD)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0);else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,0,h),i=this.convertExpression(i,a,a=o,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:s=c.createBinary(p.BinaryOp.AddI32,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.AddI64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.AddF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.AddF64,r,i);break;default:assert(!1),s=c.createUnreachable()}break;case y.Token.MINUS_EQUALS:m=!0;case y.Token.MINUS:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.SUB)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,0,h),i=this.convertExpression(i,a,a=o,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:s=c.createBinary(p.BinaryOp.SubI32,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.SubI64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.SubF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.SubF64,r,i);break;default:assert(!1),s=c.createUnreachable()}break;case y.Token.ASTERISK_EQUALS:m=!0;case y.Token.ASTERISK:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.MUL)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1);else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,0,h),i=this.convertExpression(i,a,a=o,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:s=c.createBinary(p.BinaryOp.MulI32,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.MulI64:p.BinaryOp.MulI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.MulI64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.MulF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.MulF64,r,i);break;default:assert(!1),s=c.createUnreachable()}break;case y.Token.ASTERISK_ASTERISK_EQUALS:m=!0;case y.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.POW)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}var f=void 0;if(11==this.currentType.kind){if(i=this.compileExpression(d,g.Type.f32,1,0),a=this.currentType,!(f=this.f32PowInstance)){if(!(E=this.program.lookupGlobal(u.LibrarySymbols.Mathf))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),s=c.createUnreachable();break}if(!(I=E.members?E.members.get(u.LibrarySymbols.pow):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),s=c.createUnreachable();break}assert(I.kind==_.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=f=this.resolver.resolveFunction(I,null)}}else if(r=this.convertExpression(r,this.currentType,g.Type.f64,1,0,h),n=this.currentType,i=this.compileExpression(d,g.Type.f64,1,0),a=this.currentType,!(f=this.f64PowInstance)){if(!(E=this.program.lookupGlobal(u.LibrarySymbols.Math))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),s=c.createUnreachable();break}if(!(I=E.members?E.members.get(u.LibrarySymbols.pow):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),s=c.createUnreachable();break}assert(I.kind==_.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=f=this.resolver.resolveFunction(I,null)}s=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):c.createUnreachable();break;case y.Token.SLASH_EQUALS:m=!0;case y.Token.SLASH:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.DIV)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d)}switch(this.currentType.kind){case 0:case 1:case 2:s=c.createBinary(p.BinaryOp.DivI32,r,i);break;case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.DivI64:p.BinaryOp.DivI32,r,i);break;case 3:s=c.createBinary(p.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:s=c.createBinary(p.BinaryOp.DivU32,r,i);break;case 9:s=c.createBinary(this.options.isWasm64?p.BinaryOp.DivU64:p.BinaryOp.DivU32,r,i);break;case 8:s=c.createBinary(p.BinaryOp.DivU64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.DivF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.DivF64,r,i);break;default:assert(!1),s=c.createUnreachable()}break;case y.Token.PERCENT_EQUALS:m=!0;case y.Token.PERCENT:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.REM)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d)}switch(this.currentType.kind){case 0:case 1:case 2:s=c.createBinary(p.BinaryOp.RemI32,r,i);break;case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.RemI64:p.BinaryOp.RemI32,r,i);break;case 3:s=c.createBinary(p.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:s=c.createBinary(p.BinaryOp.RemU32,r,i);break;case 9:s=c.createBinary(this.options.isWasm64?p.BinaryOp.RemU64:p.BinaryOp.RemU32,r,i);break;case 8:s=c.createBinary(p.BinaryOp.RemU64,r,i);break;case 11:if(!(f=this.f32ModInstance)){if(!(E=this.program.lookupGlobal(u.LibrarySymbols.Mathf))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),s=c.createUnreachable();break}if(!(I=E.members?E.members.get(u.LibrarySymbols.mod):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),s=c.createUnreachable();break}assert(I.kind==_.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=f=this.resolver.resolveFunction(I,null)}s=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):c.createUnreachable();break;case 12:if(!(f=this.f64ModInstance)){var E,I;if(!(E=this.program.lookupGlobal(u.LibrarySymbols.Math))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),s=c.createUnreachable();break}if(!(I=E.members?E.members.get(u.LibrarySymbols.mod):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),s=c.createUnreachable();break}assert(I.kind==_.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=f=this.resolver.resolveFunction(I,null)}s=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):c.createUnreachable();break;default:assert(!1),s=c.createUnreachable()}break;case y.Token.LESSTHAN_LESSTHAN_EQUALS:m=!0;case y.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(h,t.intType,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.BITWISE_SHL)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(d,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:s=c.createBinary(p.BinaryOp.ShlI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.ShlI64,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.ShlI64:p.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,y.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),s=c.createUnreachable()}break;case y.Token.GREATERTHAN_GREATERTHAN_EQUALS:m=!0;case y.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(h,t.intType,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.BITWISE_SHR)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:s=c.createBinary(p.BinaryOp.ShrI32,r,i);break;case 3:s=c.createBinary(p.BinaryOp.ShrI64,r,i);break;case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrI64:p.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:s=c.createBinary(p.BinaryOp.ShrU32,r,i);break;case 8:s=c.createBinary(p.BinaryOp.ShrU64,r,i);break;case 9:s=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrU64:p.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,y.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),s=c.createUnreachable()}break;case y.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:m=!0;case y.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(h,t.intType,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.BITWISE_SHR_U)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:s=c.createBinary(p.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:s=c.createBinary(p.BinaryOp.ShrU32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.ShrU64,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrU64:p.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,y.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),s=c.createUnreachable()}break;case y.Token.AMPERSAND_EQUALS:m=!0;case y.Token.AMPERSAND:if(r=this.compileExpressionRetainType(h,t.intType,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.BITWISE_AND)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,0,h),i=this.convertExpression(i,a,a=o,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:s=c.createBinary(p.BinaryOp.AndI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.AndI64,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.AndI64:p.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,y.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),s=c.createUnreachable()}break;case y.Token.BAR_EQUALS:m=!0;case y.Token.BAR:if(r=this.compileExpressionRetainType(h,t.intType,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.BITWISE_OR)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,0,h),i=this.convertExpression(i,a,a=o,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:s=c.createBinary(p.BinaryOp.OrI32,r,i);break;case 2:case 7:s=c.createBinary(p.BinaryOp.OrI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.OrI64,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.OrI64:p.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,y.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),s=c.createUnreachable()}break;case y.Token.CARET_EQUALS:m=!0;case y.Token.CARET:if(r=this.compileExpressionRetainType(h,t.intType,0),n=this.currentType,this.currentType.is(256)){var v,b;if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.BITWISE_XOR)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,0,h),i=this.convertExpression(i,a,a=o,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:s=c.createBinary(p.BinaryOp.XorI32,r,i);break;case 2:case 7:s=c.createBinary(p.BinaryOp.XorI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.XorI64,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.XorI64:p.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,y.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),s=c.createUnreachable()}break;case y.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,i=this.compileExpression(d,n,1,0),a=this.currentType,s=c.cloneExpression(r,!0,0))this.makeIsTrueish(r,this.currentType),s=c.createIf(this.makeIsTrueish(r,this.currentType),i,s);else{var S=(A=this.currentFlow).getAndFreeTempLocal(this.currentType,!A.canOverflow(r,this.currentType));s=c.createIf(this.makeIsTrueish(c.createTeeLocal(S.index,r),this.currentType),i,c.createGetLocal(assert(S).index,this.currentType.toNativeType()))}break;case y.Token.BAR_BAR:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,i=this.compileExpression(d,n,1,0),a=this.currentType,s=this.module.cloneExpression(r,!0,0))s=this.module.createIf(this.makeIsTrueish(r,this.currentType),s,i);else{var A;S=(A=this.currentFlow).getAndFreeTempLocal(this.currentType,!A.canOverflow(r,this.currentType));s=c.createIf(this.makeIsTrueish(c.createTeeLocal(S.index,r),this.currentType),c.createGetLocal(assert(S).index,this.currentType.toNativeType()),i)}break;default:assert(!1),s=this.module.createUnreachable()}return m?this.compileAssignmentWithValue(h,s,t!=g.Type.void):s},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(u.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a)},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,o=0;if(e.is(u.CommonFlags.INSTANCE)){var s=assert(e.parent);assert(s.kind==_.ElementKind.CLASS),o=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,o)},t.prototype.compileAssignment=function(e,t,r){var n,i=this.program.resolver,a=this.currentFlow,o=i.resolveExpression(e,a);if(!o)return this.module.createUnreachable();switch(o.kind){case _.ElementKind.GLOBAL:if(!this.compileGlobal(o))return this.module.createUnreachable();assert(o.type!=g.Type.void);case _.ElementKind.LOCAL:case _.ElementKind.FIELD:n=o.type;break;case _.ElementKind.PROPERTY_PROTOTYPE:var s=o.setterPrototype;if(!s)return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,o.internalName),this.module.createUnreachable();if(!(c=this.resolver.resolveFunction(s,null,T.makeMap(),d.ReportMode.REPORT)))return this.module.createUnreachable();assert(1==c.signature.parameterTypes.length),n=c.signature.parameterTypes[0];break;case _.ElementKind.PROPERTY:var c;if(!(c=o.setterInstance))return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,o.internalName),this.module.createUnreachable();assert(1==c.signature.parameterTypes.length),n=c.signature.parameterTypes[0];break;case _.ElementKind.CLASS:if(i.currentElementExpression){var p=a.is(8192),u=o.lookupOverload(_.OperatorKind.INDEXED_SET,p);if(!u)return o.lookupOverload(_.OperatorKind.INDEXED_GET,p)?this.error(l.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,o.internalName):this.error(l.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,o.internalName),this.module.createUnreachable();assert(2==u.signature.parameterTypes.length),n=u.signature.parameterTypes[1];break}default:return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=g.Type.void);var h=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,h,r!=g.Type.void)},t.prototype.compileAssignmentWithValue=function(e,t,r){void 0===r&&(r=!1);var n=this.module,i=this.currentFlow,a=this.resolver.resolveExpression(e,i);if(!a)return n.createUnreachable();switch(a.kind){case _.ElementKind.LOCAL:var o=a.type;return assert(o!=g.Type.void),this.currentType=r?o:g.Type.void,a.is(u.CommonFlags.CONST)?(this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable()):(o.is(36)&&i.setLocalWrapped(a.index,!i.canOverflow(t,o)),r?n.createTeeLocal(a.index,t):n.createSetLocal(a.index,t));case _.ElementKind.GLOBAL:if(!this.compileGlobal(a))return n.createUnreachable();o=a.type;if(assert(o!=g.Type.void),this.currentType=r?o:g.Type.void,a.is(u.CommonFlags.CONST))return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();if(t=this.ensureSmallIntegerWrap(t,o),r){var s=o.toNativeType(),c=a.internalName;return n.createBlock(null,[n.createSetGlobal(c,t),n.createGetGlobal(c,s)],s)}return n.createSetGlobal(a.internalName,t);case _.ElementKind.FIELD:var p=a.initializerNode;if(a.is(u.CommonFlags.READONLY)&&!i.actualFunction.is(u.CommonFlags.CONSTRUCTOR)&&!p)return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();var h=assert(this.resolver.currentThisExpression),y=this.compileExpressionRetainType(h,this.options.usizeType,0);o=a.type;this.currentType=r?o:g.Type.void;s=o.toNativeType();if(10==o.kind&&(t=this.ensureSmallIntegerWrap(t,o)),r){var m=this.currentFlow,f=m.getAndFreeTempLocal(o,!m.canOverflow(t,o)).index;return n.createBlock(null,[n.createSetLocal(f,t),n.createStore(o.byteSize,y,n.createGetLocal(f,s),s,a.memoryOffset),n.createGetLocal(f,s)],s)}return n.createStore(o.byteSize,y,t,s,a.memoryOffset);case _.ElementKind.PROPERTY_PROTOTYPE:var E=a.setterPrototype;if(!E)return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();if(!(b=this.resolver.resolveFunction(E,null,T.makeMap(),d.ReportMode.REPORT)))return n.createUnreachable();if(!r)return this.makeCallDirect(b,[t]);var I=assert(a.getterPrototype);if(!(A=this.resolver.resolveFunction(I,null,T.makeMap(),d.ReportMode.REPORT)))return n.createUnreachable();var v=(B=A.signature.returnType).toNativeType();return n.createBlock(null,[this.makeCallDirect(b,[t]),this.makeCallDirect(A)],v);case _.ElementKind.PROPERTY:var b;if(!(b=a.setterInstance))return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();if(!r){var S=this.compileExpressionRetainType(assert(this.resolver.currentThisExpression),this.options.usizeType,0);return this.makeCallDirect(b,[S,t])}var A;v=(B=(A=assert(a.getterInstance)).signature.returnType).toNativeType(),y=this.compileExpressionRetainType(assert(this.resolver.currentThisExpression),this.options.usizeType,0),f=i.getAndFreeTempLocal(B,!1).index;return n.createBlock(null,[this.makeCallDirect(b,[n.createTeeLocal(f,y),t]),this.makeCallDirect(A,[n.createGetLocal(f,v)])],v);case _.ElementKind.CLASS:var N=this.resolver.currentElementExpression;if(N){var C=i.is(8192),O=a.lookupOverload(_.OperatorKind.INDEXED_GET,C);if(!O)return this.error(l.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,a.internalName),n.createUnreachable();var x=a.lookupOverload(_.OperatorKind.INDEXED_SET,C);if(!x)return this.error(l.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,a.internalName),this.currentType=r?O.signature.returnType:g.Type.void,n.createUnreachable();var k=a.type,L=(h=assert(this.resolver.currentThisExpression),y=this.compileExpressionRetainType(h,this.options.usizeType,0),this.compileExpression(N,g.Type.i32,1,0));if(r){var R=i.getTempLocal(k,!1),F=i.getAndFreeTempLocal(this.currentType,!1),B=O.signature.returnType;return i.freeTempLocal(R),n.createBlock(null,[this.makeCallDirect(x,[n.createTeeLocal(R.index,y),n.createTeeLocal(F.index,L),t]),this.makeCallDirect(O,[n.createGetLocal(R.index,R.type.toNativeType()),n.createGetLocal(F.index,F.type.toNativeType())])],B.toNativeType())}return this.makeCallDirect(x,[y,L,t])}}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileCallExpression=function(e,t){var r=this.module,n=this.currentFlow;if(e.expression.kind==m.NodeKind.SUPER){var i=this.currentFlow,a=i.actualFunction;if(!a.is(u.CommonFlags.CONSTRUCTOR))return this.error(l.DiagnosticCode.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors,e.range),r.createUnreachable();var o=assert(a.parent);assert(o.kind==_.ElementKind.CLASS);var s=assert(o.base),c=assert(i.lookupLocal(u.CommonSymbols.this_)),h=this.options.nativeSizeType,d=[r.createSetLocal(c.index,this.compileCallDirect(this.ensureConstructor(s,e),e.arguments,e,r.createIf(r.createGetLocal(c.index,h),r.createGetLocal(c.index,h),this.makeAllocation(o))))];return this.makeFieldInitialization(o,d),i.isAny(2080)?(this.error(l.DiagnosticCode._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class,e.range),r.createUnreachable()):(i.set(96),this.currentType=g.Type.void,r.createBlock(null,d))}var y,f,E=this.resolver.resolveExpression(e.expression,n);if(!E)return r.createUnreachable();switch(E.kind){case _.ElementKind.FUNCTION_PROTOTYPE:var I=E,v=e.typeArguments;if(I.hasDecorator(_.DecoratorFlags.BUILTIN))return this.compileCallExpressionBuiltin(I,e,t);var b=null;if(v){if(!I.is(u.CommonFlags.GENERIC))return this.error(l.DiagnosticCode.Type_0_is_not_generic,e.expression.range,I.internalName),r.createUnreachable();b=this.resolver.resolveFunctionInclTypeArguments(I,v,n.actualFunction.parent,T.makeMap(n.contextualTypeArguments),e)}else{if(I.is(u.CommonFlags.GENERIC)){for(var S=new Map,A=assert(I.typeParameterNodes),N=A.length,C=0;Co&&!i)||(this.error(l.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,o.toString(),t.toString()),!1)},t.prototype.compileCallDirect=function(e,t,r,n){void 0===n&&(n=0);var i=t.length,a=e.signature;if(!this.checkCallSignature(a,i,0!=n,r))return this.module.createUnreachable();if(e.hasDecorator(_.DecoratorFlags.INLINE)){if(assert(!e.is(u.CommonFlags.TRAMPOLINE)),!this.currentInlineFunctions.includes(e)){this.currentInlineFunctions.push(e);var o=this.compileCallInlinePrechecked(e,t,n);return this.currentInlineFunctions.pop(),o}this.warning(l.DiagnosticCode.Function_0_cannot_be_inlined_into_itself,r.range,e.internalName)}var s=n?i+1:i,c=new Array(s),p=0;n&&(c[0]=n,p=1);for(var h=a.parameterTypes,d=0;d=i);var s=this.module;if(!this.compileFunction(e))return s.createUnreachable();var c=e.signature.returnType,l=e.is(u.CommonFlags.MODULE_IMPORT);if(r=a),this.ensureFunctionType(e.parameterTypes,e.returnType,e.thisType);var c=this.module;if(n=0),this.currentType=N,this.module.createGetLocal(C,N.toNativeType());case _.ElementKind.GLOBAL:if(!this.compileGlobal(A))return this.module.createUnreachable();var O=A.type;return assert(O!=g.Type.void),A.is(u.CommonFlags.INLINED)?this.compileInlineConstant(A,t,r):(this.currentType=O,this.module.createGetGlobal(A.internalName,O.toNativeType()));case _.ElementKind.ENUMVALUE:return A.is(u.CommonFlags.COMPILED)?(this.currentType=g.Type.i32,A.is(u.CommonFlags.INLINED)?(assert(1==A.constantValueKind),this.module.createI32(i64_low(A.constantIntegerValue))):this.module.createGetGlobal(A.internalName,p.NativeType.I32)):(this.error(l.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=g.Type.i32,this.module.createUnreachable());case _.ElementKind.FUNCTION_PROTOTYPE:var x=this.resolver.resolveFunction(A,null,T.makeMap(i.contextualTypeArguments));if(!x||!this.compileFunction(x))return n.createUnreachable();var k=this.ensureFunctionTableEntry(x);return this.currentType=x.signature.type,this.module.createI32(k)}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileInstanceOfExpression=function(e,t){var r=this.module,n=this.compileExpressionRetainType(e.expression,this.options.usizeType,0),i=this.currentType,a=this.resolver.resolveType(e.isType,this.currentFlow.actualFunction);return this.currentType=g.Type.bool,a?a.is(256)?i.is(512)&&!a.is(512)&&i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?p.BinaryOp.NeI64:p.BinaryOp.NeI32,n,i.toNativeZero(r)):r.createI32(i.isAssignableTo(a)?1:0):r.createI32(i==a?1:0):r.createUnreachable()},t.prototype.compileLiteralExpression=function(e,t,r){void 0===r&&(r=!1);var n=this.module;switch(e.literalKind){case m.LiteralKind.ARRAY:assert(!r);var i=t.classReference;return i&&i.prototype==this.program.arrayPrototype?this.compileArrayLiteral(assert(i.typeArguments)[0],e.elementExpressions,!1,e):(this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case m.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==g.Type.f32?n.createF32(a):(this.currentType=g.Type.f64,n.createF64(a));case m.LiteralKind.INTEGER:var o=e.value;r&&(o=i64_sub(i64_new(0),o));var s=this.resolver.determineIntegerLiteralType(o,t);switch(this.currentType=s,s.kind){case 4:if(!this.options.isWasm64)return n.createI32(i64_low(o));case 3:return n.createI64(i64_low(o),i64_high(o));case 9:if(!this.options.isWasm64)return n.createI32(i64_low(o));case 8:return n.createI64(i64_low(o),i64_high(o));case 11:return n.createF32(i64_to_f32(o));case 12:return n.createF64(i64_to_f64(o));default:return n.createI32(i64_low(o))}case m.LiteralKind.STRING:return assert(!r),this.compileStringLiteral(e);case m.LiteralKind.OBJECT:return assert(!r),this.compileObjectLiteral(e,t)}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.currentType=t,n.createUnreachable()},t.prototype.ensureStaticString=function(e){var t,r=this.program,n=r.hasGC,i=r.gcHeaderSize,a=assert(r.stringInstance),o=this.stringSegments;if(o.has(e))t=o.get(e);else{var s=e.length,l=a.currentMemoryOffset+1&-2,p=l+2*s,_=void 0,h=void 0;n?(_=new Uint8Array(i+p),h=i,T.writeI32(c.ensureGCHook(this,a),_,r.gcHookOffset)):(_=new Uint8Array(p),h=0),T.writeI32(s,_,h+a.offsetof(u.LibrarySymbols.length)),h+=l;for(var d=0;d",t.toString()),r.createUnreachable();var i=n.constructorInstance;if(i){if(i.signature.requiredParameters)return this.error(l.DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,e.range,n.toString()),r.createUnreachable();if(i.is(u.CommonFlags.PRIVATE))return this.error(l.DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable();if(i.is(u.CommonFlags.PROTECTED))return this.error(l.DiagnosticCode.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable()}var a=e.names,o=a.length,s=e.values,c=n.members,p=!1,h=new Array(o+2),d=this.currentFlow.getTempLocal(this.options.usizeType);assert(o==s.length);for(var y=0,m=o;yE)for(y=E;y=0);var c=this.compileExpressionRetainType(assert(this.resolver.currentThisExpression),this.options.usizeType,0);return this.currentType=a.type,n.createLoad(a.type.byteSize,a.type.is(5),c,a.type.toNativeType(),a.memoryOffset);case _.ElementKind.PROPERTY_PROTOTYPE:var h=a.getterPrototype;if(h){var d=this.resolver.resolveFunction(h,null);if(d)return this.compileCallDirect(d,[],e,0)}return n.createUnreachable();case _.ElementKind.PROPERTY:var y=assert(a.getterInstance);return this.compileCallDirect(y,[],e,this.compileExpressionRetainType(assert(this.resolver.currentThisExpression),this.options.usizeType,0));case _.ElementKind.FUNCTION_PROTOTYPE:return this.error(l.DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,e.range,a.name),n.createUnreachable()}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileGetter=function(e,t){var r=e.getterPrototype;if(r){var n=this.resolver.resolveFunction(r,null);if(!n)return this.module.createUnreachable();var i=n.signature;if(!this.checkCallSignature(i,0,n.is(u.CommonFlags.INSTANCE),t))return this.module.createUnreachable();if(n.is(u.CommonFlags.INSTANCE)){var a=assert(n.parent);assert(a.kind==_.ElementKind.CLASS);var o=assert(this.resolver.currentThisExpression),s=this.compileExpressionRetainType(o,this.options.usizeType,0);//!!! -return this.currentType=i.returnType,this.compileCallDirect(n,[],t,s)}return this.currentType=i.returnType,this.compileCallDirect(n,[],t,0)}return this.error(l.DiagnosticCode.Property_0_does_not_exist_on_type_1,t.range,e.name,e.parent.toString()),this.module.createUnreachable()},t.prototype.compileTernaryExpression=function(e,t){var r=e.ifThen,n=e.ifElse,i=this.currentFlow,a=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,g.Type.bool,0),this.currentType),o=this.module.precomputeExpression(a);if(p.getExpressionId(o)==p.ExpressionId.Const&&p.getExpressionType(o)==p.NativeType.I32)return p.getConstValueI32(o)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);a=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,g.Type.bool,0),this.currentType);var s=i.fork();this.currentFlow=s;var c=this.compileExpressionRetainType(r,t,0),u=this.currentType;s.freeScopedLocals();var _=i.fork();this.currentFlow=_;var h=this.compileExpressionRetainType(n,t,0),d=this.currentType;_.freeScopedLocals(),this.currentFlow=i,i.inheritMutual(s,_);var y=g.Type.commonCompatible(u,d,!1);return y?(c=this.convertExpression(c,u,y,1,0,r),h=this.convertExpression(h,d,y,1,0,n),this.currentType=y,this.module.createIf(a,c,h)):(this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,e.range,u.toString(),d.toString()),this.currentType=t,this.module.createUnreachable())},t.prototype.compileUnaryPostfixExpression=function(e,t){var r=this.module,n=this.currentFlow,i=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0);if(p.getExpressionId(i)==p.ExpressionId.Unreachable)return i;var a,o=this.currentType,s=null;switch(t!=g.Type.void&&(s=n.getTempLocal(o,!1),i=r.createTeeLocal(s.index,i)),e.operator){case y.Token.PLUS_PLUS:switch(o.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(p.BinaryOp.AddI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){if(u=this.currentType.classReference)if(h=u.lookupOverload(_.OperatorKind.POSTFIX_INC)){a=this.compileUnaryOverload(h,e.operand,i,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:var c=this.options;a=r.createBinary(c.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,i,o.toNativeOne(r));break;case 3:case 8:a=r.createBinary(p.BinaryOp.AddI64,i,r.createI64(1));break;case 11:a=r.createBinary(p.BinaryOp.AddF32,i,r.createF32(1));break;case 12:a=r.createBinary(p.BinaryOp.AddF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;case y.Token.MINUS_MINUS:switch(o.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(p.BinaryOp.SubI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){var u,h;if(u=this.currentType.classReference)if(h=u.lookupOverload(_.OperatorKind.POSTFIX_DEC)){a=this.compileUnaryOverload(h,e.operand,i,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:c=this.options;a=r.createBinary(c.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,i,o.toNativeOne(r));break;case 3:case 8:a=r.createBinary(p.BinaryOp.SubI64,i,r.createI64(1));break;case 11:a=r.createBinary(p.BinaryOp.SubF32,i,r.createF32(1));break;case 12:a=r.createBinary(p.BinaryOp.SubF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;default:return assert(!1),r.createUnreachable()}if(!s)return this.currentType=g.Type.void,this.compileAssignmentWithValue(e.operand,a,!1);var d=this.compileAssignmentWithValue(e.operand,a,!1);this.currentType=s.type,n.freeTempLocal(s);var m=s.type.toNativeType();return r.createBlock(null,[d,r.createGetLocal(s.index,m)],m)},t.prototype.compileUnaryPrefixExpression=function(e,t){var r,n=this.module,i=!1;switch(e.operator){case y.Token.PLUS:if(r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(o=a.lookupOverload(_.OperatorKind.PLUS)){r=this.compileUnaryOverload(o,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case y.Token.MINUS:if(e.operand.kind==m.NodeKind.LITERAL&&(e.operand.literalKind==m.LiteralKind.INTEGER||e.operand.literalKind==m.LiteralKind.FLOAT)){r=this.compileLiteralExpression(e.operand,t,!0),this.options.sourceMap&&this.addDebugLocation(r,e.range);break}if(r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(o=a.lookupOverload(_.OperatorKind.MINUS)){r=this.compileUnaryOverload(o,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(p.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(p.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(p.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case y.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(o=a.lookupOverload(_.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(o,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(p.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(p.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case y.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(o=a.lookupOverload(_.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(o,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(p.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(p.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case y.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(o=a.lookupOverload(_.OperatorKind.NOT)){r=this.compileUnaryOverload(o,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=g.Type.bool;break;case y.Token.TILDE:if(r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t.is(8)?g.Type.i64:t,0,0),this.currentType.is(256)){var a,o;if(a=this.currentType.classReference)if(o=a.lookupOverload(_.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(o,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(r=this.convertExpression(r,this.currentType,this.currentType.intType,1,0,e.operand),this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.XorI64:p.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case y.Token.TYPEOF:return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=g.Type.void):r},t.prototype.ensureSmallIntegerWrap=function(e,t){var r=this.module,n=this.currentFlow;switch(t.kind){case 0:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(p.UnaryOp.ExtendI8ToI32,e):r.createBinary(p.BinaryOp.ShrI32,r.createBinary(p.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(p.UnaryOp.ExtendI16ToI32,e):r.createBinary(p.BinaryOp.ShrI32,r.createBinary(p.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.NeI32,e,r.createI32(0)))}return e},t.prototype.makeIsFalseish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return r.createUnary(p.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(p.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?p.UnaryOp.EqzI64:p.UnaryOp.EqzI32,e);case 11:return r.createBinary(p.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(p.BinaryOp.EqF64,e,r.createF64(0));default:return assert(!1),r.createI32(1)}},t.prototype.makeIsTrueish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return e;case 3:case 8:return r.createBinary(p.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(p.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(p.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(p.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocation=function(e){var t=this.program;assert(e.program==t);var r=this.module,n=this.options;if(t.hasGC&&e.type.isManaged(t)){var i=assert(t.gcAllocateInstance);return this.compileFunction(i)?(this.currentType=e.type,r.createCall(i.internalName,[n.isWasm64?r.createI64(e.currentMemoryOffset):r.createI32(e.currentMemoryOffset),r.createI32(c.ensureGCHook(this,e))],n.nativeSizeType)):r.createUnreachable()}return(i=t.memoryAllocateInstance)&&this.compileFunction(i)?(this.currentType=e.type,r.createCall(i.internalName,[n.isWasm64?r.createI64(e.currentMemoryOffset):r.createI32(e.currentMemoryOffset)],n.nativeSizeType)):r.createUnreachable()},t.prototype.makeFieldInitialization=function(e,t){var r,n;void 0===t&&(t=[]);var i=e.members;if(!i)return[];var o=this.module,s=this.currentFlow,c=s.is(4096),l=c?assert(s.lookupLocal(u.CommonSymbols.this_)).index:0,p=this.options.nativeSizeType;try{for(var h=a(i.values()),d=h.next();!d.done;d=h.next()){var y=d.value;if(y.kind==_.ElementKind.FIELD&&y.parent==e){var m=y;assert(!m.isAny(u.CommonFlags.CONST));var g=m.type,T=g.toNativeType(),f=m.prototype.initializerNode;if(f)t.push(o.createStore(g.byteSize,o.createGetLocal(l,p),this.compileExpression(f,g,1,0),T,m.memoryOffset));else{var E=m.prototype.parameterIndex;t.push(o.createStore(g.byteSize,o.createGetLocal(l,p),E>=0?o.createGetLocal(c?assert(s.lookupLocal(m.name)).index:1+E,T):g.toNativeZero(o),T,m.memoryOffset))}}}}catch(e){r={error:e}}finally{try{d&&!d.done&&(n=h.return)&&n.call(h)}finally{if(r)throw r.error}}return t},t.prototype.addDebugLocation=function(e,t){var r=this.currentFlow.parentFunction,n=t.source;n.debugInfoIndex<0&&(n.debugInfoIndex=this.module.addDebugInfoFile(n.normalizedPath)),t.debugInfoRef=e,r.debugLocations.push(t)},t}(l.DiagnosticEmitter);function S(e,t){if(E=t.range.source.simplePath,I=_.mangleInternalName(e.name,e.parent,e.is(u.CommonFlags.INSTANCE),!0),e.hasDecorator(_.DecoratorFlags.EXTERNAL)){var r=e.program,n=assert(m.findDecorator(m.DecoratorKind.EXTERNAL,t.decorators)),i=n.arguments;if(i&&i.length){var a=i[0];a.kind==m.NodeKind.LITERAL&&a.literalKind==m.LiteralKind.STRING?(I=a.value,i.length>=2&&((a=i[1]).kind==m.NodeKind.LITERAL&&a.literalKind==m.LiteralKind.STRING?(E=I,I=a.value,i.length>2&&r.error(l.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(l.DiagnosticCode.String_literal_expected,a.range))):r.error(l.DiagnosticCode.String_literal_expected,a.range)}else r.error(l.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=b,function(e){e.started="~lib/started",e.argc="~lib/argc",e.setargc="~lib/setargc"}(v||(v={}))},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.Operation_not_supported=100]="Operation_not_supported",e[e.Operation_is_unsafe=101]="Operation_is_unsafe",e[e.User_defined_0=102]="User_defined_0",e[e.Conversion_from_type_0_to_1_requires_an_explicit_cast=200]="Conversion_from_type_0_to_1_requires_an_explicit_cast",e[e.Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit=201]="Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit",e[e.Type_0_cannot_be_changed_to_type_1=202]="Type_0_cannot_be_changed_to_type_1",e[e.Type_0_cannot_be_reinterpreted_as_type_1=203]="Type_0_cannot_be_reinterpreted_as_type_1",e[e.Basic_type_0_cannot_be_nullable=204]="Basic_type_0_cannot_be_nullable",e[e.Cannot_export_a_mutable_global=205]="Cannot_export_a_mutable_global",e[e.Compiling_constant_with_non_constant_initializer_as_mutable=206]="Compiling_constant_with_non_constant_initializer_as_mutable",e[e.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa=207]="Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa",e[e.Unmanaged_classes_cannot_implement_interfaces=208]="Unmanaged_classes_cannot_implement_interfaces",e[e.Invalid_regular_expression_flags=209]="Invalid_regular_expression_flags",e[e.Implementation_0_must_match_the_signature_1=210]="Implementation_0_must_match_the_signature_1",e[e.Class_0_is_sealed_and_cannot_be_extended=211]="Class_0_is_sealed_and_cannot_be_extended",e[e.Decorator_0_is_not_valid_here=212]="Decorator_0_is_not_valid_here",e[e.Duplicate_decorator=213]="Duplicate_decorator",e[e.An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf=214]="An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf",e[e.Optional_parameter_must_have_an_initializer=215]="Optional_parameter_must_have_an_initializer",e[e.Constructor_of_class_0_must_not_require_any_arguments=216]="Constructor_of_class_0_must_not_require_any_arguments",e[e.Function_0_cannot_be_inlined_into_itself=217]="Function_0_cannot_be_inlined_into_itself",e[e.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set=218]="Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set",e[e.Optional_properties_are_not_supported=219]="Optional_properties_are_not_supported",e[e.Expression_must_be_a_compile_time_constant=220]="Expression_must_be_a_compile_time_constant",e[e.Module_cannot_have_multiple_start_functions=221]="Module_cannot_have_multiple_start_functions",e[e.Unterminated_string_literal=1002]="Unterminated_string_literal",e[e.Identifier_expected=1003]="Identifier_expected",e[e._0_expected=1005]="_0_expected",e[e.A_file_cannot_have_a_reference_to_itself=1006]="A_file_cannot_have_a_reference_to_itself",e[e.Trailing_comma_not_allowed=1009]="Trailing_comma_not_allowed",e[e.Unexpected_token=1012]="Unexpected_token",e[e.A_rest_parameter_must_be_last_in_a_parameter_list=1014]="A_rest_parameter_must_be_last_in_a_parameter_list",e[e.Parameter_cannot_have_question_mark_and_initializer=1015]="Parameter_cannot_have_question_mark_and_initializer",e[e.A_required_parameter_cannot_follow_an_optional_parameter=1016]="A_required_parameter_cannot_follow_an_optional_parameter",e[e.Statements_are_not_allowed_in_ambient_contexts=1036]="Statements_are_not_allowed_in_ambient_contexts",e[e.Initializers_are_not_allowed_in_ambient_contexts=1039]="Initializers_are_not_allowed_in_ambient_contexts",e[e._0_modifier_cannot_be_used_here=1042]="_0_modifier_cannot_be_used_here",e[e.A_rest_parameter_cannot_be_optional=1047]="A_rest_parameter_cannot_be_optional",e[e.A_rest_parameter_cannot_have_an_initializer=1048]="A_rest_parameter_cannot_have_an_initializer",e[e.A_set_accessor_must_have_exactly_one_parameter=1049]="A_set_accessor_must_have_exactly_one_parameter",e[e.A_set_accessor_parameter_cannot_have_an_initializer=1052]="A_set_accessor_parameter_cannot_have_an_initializer",e[e.A_get_accessor_cannot_have_parameters=1054]="A_get_accessor_cannot_have_parameters",e[e.Enum_member_must_have_initializer=1061]="Enum_member_must_have_initializer",e[e.Type_parameters_cannot_appear_on_a_constructor_declaration=1092]="Type_parameters_cannot_appear_on_a_constructor_declaration",e[e.Type_annotation_cannot_appear_on_a_constructor_declaration=1093]="Type_annotation_cannot_appear_on_a_constructor_declaration",e[e.An_accessor_cannot_have_type_parameters=1094]="An_accessor_cannot_have_type_parameters",e[e.A_set_accessor_cannot_have_a_return_type_annotation=1095]="A_set_accessor_cannot_have_a_return_type_annotation",e[e.Type_parameter_list_cannot_be_empty=1098]="Type_parameter_list_cannot_be_empty",e[e.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement=1104]="A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement",e[e.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement=1105]="A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement",e[e.A_return_statement_can_only_be_used_within_a_function_body=1108]="A_return_statement_can_only_be_used_within_a_function_body",e[e.Expression_expected=1109]="Expression_expected",e[e.Type_expected=1110]="Type_expected",e[e.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement=1113]="A_default_clause_cannot_appear_more_than_once_in_a_switch_statement",e[e.Duplicate_label_0=1114]="Duplicate_label_0",e[e.Octal_literals_are_not_allowed_in_strict_mode=1121]="Octal_literals_are_not_allowed_in_strict_mode",e[e.Digit_expected=1124]="Digit_expected",e[e.Hexadecimal_digit_expected=1125]="Hexadecimal_digit_expected",e[e.Unexpected_end_of_text=1126]="Unexpected_end_of_text",e[e.Invalid_character=1127]="Invalid_character",e[e._case_or_default_expected=1130]="_case_or_default_expected",e[e._super_must_be_followed_by_an_argument_list_or_member_access=1034]="_super_must_be_followed_by_an_argument_list_or_member_access",e[e.A_declare_modifier_cannot_be_used_in_an_already_ambient_context=1038]="A_declare_modifier_cannot_be_used_in_an_already_ambient_context",e[e.Type_argument_expected=1140]="Type_argument_expected",e[e.String_literal_expected=1141]="String_literal_expected",e[e.Line_break_not_permitted_here=1142]="Line_break_not_permitted_here",e[e.Declaration_expected=1146]="Declaration_expected",e[e._const_declarations_must_be_initialized=1155]="_const_declarations_must_be_initialized",e[e.Unterminated_regular_expression_literal=1161]="Unterminated_regular_expression_literal",e[e.Interface_declaration_cannot_have_implements_clause=1176]="Interface_declaration_cannot_have_implements_clause",e[e.Binary_digit_expected=1177]="Binary_digit_expected",e[e.Octal_digit_expected=1178]="Octal_digit_expected",e[e.An_implementation_cannot_be_declared_in_ambient_contexts=1183]="An_implementation_cannot_be_declared_in_ambient_contexts",e[e.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive=1198]="An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive",e[e.Unterminated_Unicode_escape_sequence=1199]="Unterminated_Unicode_escape_sequence",e[e.Decorators_are_not_valid_here=1206]="Decorators_are_not_valid_here",e[e._abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration=1242]="_abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration",e[e.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract=1245]="Method_0_cannot_have_an_implementation_because_it_is_marked_abstract",e[e.A_definite_assignment_assertion_is_not_permitted_in_this_context=1255]="A_definite_assignment_assertion_is_not_permitted_in_this_context",e[e.A_class_may_only_extend_another_class=1311]="A_class_may_only_extend_another_class",e[e.A_parameter_property_cannot_be_declared_using_a_rest_parameter=1317]="A_parameter_property_cannot_be_declared_using_a_rest_parameter",e[e.Duplicate_identifier_0=2300]="Duplicate_identifier_0",e[e.Cannot_find_name_0=2304]="Cannot_find_name_0",e[e.Module_0_has_no_exported_member_1=2305]="Module_0_has_no_exported_member_1",e[e.Generic_type_0_requires_1_type_argument_s=2314]="Generic_type_0_requires_1_type_argument_s",e[e.Type_0_is_not_generic=2315]="Type_0_is_not_generic",e[e.Type_0_is_not_assignable_to_type_1=2322]="Type_0_is_not_assignable_to_type_1",e[e.Index_signature_is_missing_in_type_0=2329]="Index_signature_is_missing_in_type_0",e[e._this_cannot_be_referenced_in_current_location=2332]="_this_cannot_be_referenced_in_current_location",e[e._super_can_only_be_referenced_in_a_derived_class=2335]="_super_can_only_be_referenced_in_a_derived_class",e[e.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors=2337]="Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors",e[e.Property_0_does_not_exist_on_type_1=2339]="Property_0_does_not_exist_on_type_1",e[e.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures=2349]="Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures",e[e.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature=2351]="Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature",e[e.A_function_whose_declared_type_is_not_void_must_return_a_value=2355]="A_function_whose_declared_type_is_not_void_must_return_a_value",e[e.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access=2357]="The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access",e[e.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access=2364]="The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access",e[e.Operator_0_cannot_be_applied_to_types_1_and_2=2365]="Operator_0_cannot_be_applied_to_types_1_and_2",e[e.A_super_call_must_be_the_first_statement_in_the_constructor=2376]="A_super_call_must_be_the_first_statement_in_the_constructor",e[e.Constructors_for_derived_classes_must_contain_a_super_call=2377]="Constructors_for_derived_classes_must_contain_a_super_call",e[e._get_and_set_accessor_must_have_the_same_type=2380]="_get_and_set_accessor_must_have_the_same_type",e[e.Constructor_implementation_is_missing=2390]="Constructor_implementation_is_missing",e[e.Function_implementation_is_missing_or_not_immediately_following_the_declaration=2391]="Function_implementation_is_missing_or_not_immediately_following_the_declaration",e[e.Multiple_constructor_implementations_are_not_allowed=2392]="Multiple_constructor_implementations_are_not_allowed",e[e.Duplicate_function_implementation=2393]="Duplicate_function_implementation",e[e.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local=2395]="Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local",e[e.A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged=2434]="A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged",e[e.Type_0_has_no_property_1=2460]="Type_0_has_no_property_1",e[e.The_0_operator_cannot_be_applied_to_type_1=2469]="The_0_operator_cannot_be_applied_to_type_1",e[e.In_const_enum_declarations_member_initializer_must_be_constant_expression=2474]="In_const_enum_declarations_member_initializer_must_be_constant_expression",e[e.Export_declaration_conflicts_with_exported_declaration_of_0=2484]="Export_declaration_conflicts_with_exported_declaration_of_0",e[e.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property=2540]="Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property",e[e.The_target_of_an_assignment_must_be_a_variable_or_a_property_access=2541]="The_target_of_an_assignment_must_be_a_variable_or_a_property_access",e[e.Index_signature_in_type_0_only_permits_reading=2542]="Index_signature_in_type_0_only_permits_reading",e[e.Expected_0_arguments_but_got_1=2554]="Expected_0_arguments_but_got_1",e[e.Expected_at_least_0_arguments_but_got_1=2555]="Expected_at_least_0_arguments_but_got_1",e[e.Expected_0_type_arguments_but_got_1=2558]="Expected_0_type_arguments_but_got_1",e[e.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums=2651]="A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums",e[e.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration=2673]="Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration",e[e.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration=2674]="Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration",e[e.Namespace_0_has_no_exported_member_1=2694]="Namespace_0_has_no_exported_member_1",e[e.Required_type_parameters_may_not_follow_optional_type_parameters=2706]="Required_type_parameters_may_not_follow_optional_type_parameters",e[e.Duplicate_property_0=2718]="Duplicate_property_0",e[e.File_0_not_found=6054]="File_0_not_found",e[e.Numeric_separators_are_not_allowed_here=6188]="Numeric_separators_are_not_allowed_here",e[e.Multiple_consecutive_numeric_separators_are_not_permitted=6189]="Multiple_consecutive_numeric_separators_are_not_permitted",e[e._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class=17009]="_super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class",e[e._super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class=17011]="_super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class"}(t.DiagnosticCode||(t.DiagnosticCode={})),t.diagnosticCodeToString=function(e){switch(e){case 100:return"Operation not supported.";case 101:return"Operation is unsafe.";case 102:return"User-defined: {0}";case 200:return"Conversion from type '{0}' to '{1}' requires an explicit cast.";case 201:return"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.";case 202:return"Type '{0}' cannot be changed to type '{1}'.";case 203:return"Type '{0}' cannot be reinterpreted as type '{1}'.";case 204:return"Basic type '{0}' cannot be nullable.";case 205:return"Cannot export a mutable global.";case 206:return"Compiling constant with non-constant initializer as mutable.";case 207:return"Unmanaged classes cannot extend managed classes and vice-versa.";case 208:return"Unmanaged classes cannot implement interfaces.";case 209:return"Invalid regular expression flags.";case 210:return"Implementation '{0}' must match the signature '{1}'.";case 211:return"Class '{0}' is sealed and cannot be extended.";case 212:return"Decorator '{0}' is not valid here.";case 213:return"Duplicate decorator.";case 214:return"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.";case 215:return"Optional parameter must have an initializer.";case 216:return"Constructor of class '{0}' must not require any arguments.";case 217:return"Function '{0}' cannot be inlined into itself.";case 218:return"Cannot access method '{0}' without calling it as it requires 'this' to be set.";case 219:return"Optional properties are not supported.";case 220:return"Expression must be a compile-time constant.";case 221:return"Module cannot have multiple start functions.";case 1002:return"Unterminated string literal.";case 1003:return"Identifier expected.";case 1005:return"'{0}' expected.";case 1006:return"A file cannot have a reference to itself.";case 1009:return"Trailing comma not allowed.";case 1012:return"Unexpected token.";case 1014:return"A rest parameter must be last in a parameter list.";case 1015:return"Parameter cannot have question mark and initializer.";case 1016:return"A required parameter cannot follow an optional parameter.";case 1036:return"Statements are not allowed in ambient contexts.";case 1039:return"Initializers are not allowed in ambient contexts.";case 1042:return"'{0}' modifier cannot be used here.";case 1047:return"A rest parameter cannot be optional.";case 1048:return"A rest parameter cannot have an initializer.";case 1049:return"A 'set' accessor must have exactly one parameter.";case 1052:return"A 'set' accessor parameter cannot have an initializer.";case 1054:return"A 'get' accessor cannot have parameters.";case 1061:return"Enum member must have initializer.";case 1092:return"Type parameters cannot appear on a constructor declaration.";case 1093:return"Type annotation cannot appear on a constructor declaration.";case 1094:return"An accessor cannot have type parameters.";case 1095:return"A 'set' accessor cannot have a return type annotation.";case 1098:return"Type parameter list cannot be empty.";case 1104:return"A 'continue' statement can only be used within an enclosing iteration statement.";case 1105:return"A 'break' statement can only be used within an enclosing iteration or switch statement.";case 1108:return"A 'return' statement can only be used within a function body.";case 1109:return"Expression expected.";case 1110:return"Type expected.";case 1113:return"A 'default' clause cannot appear more than once in a 'switch' statement.";case 1114:return"Duplicate label '{0}'.";case 1121:return"Octal literals are not allowed in strict mode.";case 1124:return"Digit expected.";case 1125:return"Hexadecimal digit expected.";case 1126:return"Unexpected end of text.";case 1127:return"Invalid character.";case 1130:return"'case' or 'default' expected.";case 1034:return"'super' must be followed by an argument list or member access.";case 1038:return"A 'declare' modifier cannot be used in an already ambient context.";case 1140:return"Type argument expected.";case 1141:return"String literal expected.";case 1142:return"Line break not permitted here.";case 1146:return"Declaration expected.";case 1155:return"'const' declarations must be initialized.";case 1161:return"Unterminated regular expression literal.";case 1176:return"Interface declaration cannot have 'implements' clause.";case 1177:return"Binary digit expected.";case 1178:return"Octal digit expected.";case 1183:return"An implementation cannot be declared in ambient contexts.";case 1198:return"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.";case 1199:return"Unterminated Unicode escape sequence.";case 1206:return"Decorators are not valid here.";case 1242:return"'abstract' modifier can only appear on a class, method, or property declaration.";case 1245:return"Method '{0}' cannot have an implementation because it is marked abstract.";case 1255:return"A definite assignment assertion '!' is not permitted in this context.";case 1311:return"A class may only extend another class.";case 1317:return"A parameter property cannot be declared using a rest parameter.";case 2300:return"Duplicate identifier '{0}'.";case 2304:return"Cannot find name '{0}'.";case 2305:return"Module '{0}' has no exported member '{1}'.";case 2314:return"Generic type '{0}' requires {1} type argument(s).";case 2315:return"Type '{0}' is not generic.";case 2322:return"Type '{0}' is not assignable to type '{1}'.";case 2329:return"Index signature is missing in type '{0}'.";case 2332:return"'this' cannot be referenced in current location.";case 2335:return"'super' can only be referenced in a derived class.";case 2337:return"Super calls are not permitted outside constructors or in nested functions inside constructors.";case 2339:return"Property '{0}' does not exist on type '{1}'.";case 2349:return"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.";case 2351:return"Cannot use 'new' with an expression whose type lacks a construct signature.";case 2355:return"A function whose declared type is not 'void' must return a value.";case 2357:return"The operand of an increment or decrement operator must be a variable or a property access.";case 2364:return"The left-hand side of an assignment expression must be a variable or a property access.";case 2365:return"Operator '{0}' cannot be applied to types '{1}' and '{2}'.";case 2376:return"A 'super' call must be the first statement in the constructor.";case 2377:return"Constructors for derived classes must contain a 'super' call.";case 2380:return"'get' and 'set' accessor must have the same type.";case 2390:return"Constructor implementation is missing.";case 2391:return"Function implementation is missing or not immediately following the declaration.";case 2392:return"Multiple constructor implementations are not allowed.";case 2393:return"Duplicate function implementation.";case 2395:return"Individual declarations in merged declaration '{0}' must be all exported or all local.";case 2434:return"A namespace declaration cannot be located prior to a class or function with which it is merged.";case 2460:return"Type '{0}' has no property '{1}'.";case 2469:return"The '{0}' operator cannot be applied to type '{1}'.";case 2474:return"In 'const' enum declarations member initializer must be constant expression.";case 2484:return"Export declaration conflicts with exported declaration of '{0}'.";case 2540:return"Cannot assign to '{0}' because it is a constant or a read-only property.";case 2541:return"The target of an assignment must be a variable or a property access.";case 2542:return"Index signature in type '{0}' only permits reading.";case 2554:return"Expected {0} arguments, but got {1}.";case 2555:return"Expected at least {0} arguments, but got {1}.";case 2558:return"Expected {0} type arguments, but got {1}.";case 2651:return"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.";case 2673:return"Constructor of class '{0}' is private and only accessible within the class declaration.";case 2674:return"Constructor of class '{0}' is protected and only accessible within the class declaration.";case 2694:return"Namespace '{0}' has no exported member '{1}'.";case 2706:return"Required type parameters may not follow optional type parameters.";case 2718:return"Duplicate property '{0}'.";case 6054:return"File '{0}' not found.";case 6188:return"Numeric separators are not allowed here.";case 6189:return"Multiple consecutive numeric separators are not permitted.";case 17009:return"'super' must be called before accessing 'this' in the constructor of a derived class.";case 17011:return"'super' must be called before accessing a property of 'super' in the constructor of a derived class.";default:return""}}},function(e,t,r){"use strict";var n=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i=r(6),a=r(3),o=r(4),s=r(0),c=r(1),l=r(2);!function(e){e[e.NONE=0]="NONE",e[e.RETURNS=1]="RETURNS",e[e.RETURNS_WRAPPED=2]="RETURNS_WRAPPED",e[e.THROWS=4]="THROWS",e[e.BREAKS=8]="BREAKS",e[e.CONTINUES=16]="CONTINUES",e[e.ALLOCATES=32]="ALLOCATES",e[e.CALLS_SUPER=64]="CALLS_SUPER",e[e.CONDITIONALLY_RETURNS=128]="CONDITIONALLY_RETURNS",e[e.CONDITIONALLY_THROWS=256]="CONDITIONALLY_THROWS",e[e.CONDITIONALLY_BREAKS=512]="CONDITIONALLY_BREAKS",e[e.CONDITIONALLY_CONTINUES=1024]="CONDITIONALLY_CONTINUES",e[e.CONDITIONALLY_ALLOCATES=2048]="CONDITIONALLY_ALLOCATES",e[e.INLINE_CONTEXT=4096]="INLINE_CONTEXT",e[e.UNCHECKED_CONTEXT=8192]="UNCHECKED_CONTEXT",e[e.ANY_TERMINATING=29]="ANY_TERMINATING",e[e.ANY_CATEGORICAL=127]="ANY_CATEGORICAL",e[e.ANY_CONDITIONAL=3968]="ANY_CONDITIONAL"}(t.FlowFlags||(t.FlowFlags={}));var p=function(){function e(){this.scopedLocals=null}return e.create=function(t){var r=new e;return r.parent=null,r.flags=0,r.parentFunction=t,r.continueLabel=null,r.breakLabel=null,r.returnType=t.signature.returnType,r.contextualTypeArguments=t.contextualTypeArguments,r.wrappedLocals=i64_new(0),r.wrappedLocalsExt=null,r.inlineFunction=null,r.inlineReturnLabel=null,r},e.createInline=function(t,r){var n=e.create(t);return n.set(4096),n.inlineFunction=r,n.inlineReturnLabel=r.internalName+"|inlined."+(r.nextInlineId++).toString(10),n.returnType=r.signature.returnType,n.contextualTypeArguments=r.contextualTypeArguments,n},Object.defineProperty(e.prototype,"actualFunction",{get:function(){return this.inlineFunction||this.parentFunction},enumerable:!0,configurable:!0}),e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.set=function(e){this.flags|=e},e.prototype.unset=function(e){this.flags&=~e},e.prototype.fork=function(){var t=new e;return t.parent=this,t.flags=this.flags,t.parentFunction=this.parentFunction,t.continueLabel=this.continueLabel,t.breakLabel=this.breakLabel,t.returnType=this.returnType,t.contextualTypeArguments=this.contextualTypeArguments,t.wrappedLocals=this.wrappedLocals,t.wrappedLocalsExt=this.wrappedLocalsExt?this.wrappedLocalsExt.slice():null,t.inlineFunction=this.inlineFunction,t.inlineReturnLabel=this.inlineReturnLabel,t},e.prototype.getTempLocal=function(e,t){void 0===t&&(t=!1);var r,n,i=this.parentFunction;switch(e.toNativeType()){case o.NativeType.I32:r=i.tempI32s;break;case o.NativeType.I64:r=i.tempI64s;break;case o.NativeType.F32:r=i.tempF32s;break;case o.NativeType.F64:r=i.tempF64s;break;default:throw new Error("concrete type expected")}return r&&r.length?((n=r.pop()).type=e,n.flags=s.CommonFlags.NONE):n=i.addLocal(e),e.is(36)&&this.setLocalWrapped(n.index,t),n},e.prototype.freeTempLocal=function(e){if(!e.is(s.CommonFlags.INLINED)){assert(e.index>=0);var t,r=this.parentFunction;switch(assert(null!=e.type),e.type.toNativeType()){case o.NativeType.I32:t=r.tempI32s||(r.tempI32s=[]);break;case o.NativeType.I64:t=r.tempI64s||(r.tempI64s=[]);break;case o.NativeType.F32:t=r.tempF32s||(r.tempF32s=[]);break;case o.NativeType.F64:t=r.tempF64s||(r.tempF64s=[]);break;default:throw new Error("concrete type expected")}assert(e.index>=0),t.push(e)}},e.prototype.getAndFreeTempLocal=function(e,t){var r,n,i=this.parentFunction;switch(e.toNativeType()){case o.NativeType.I32:r=i.tempI32s||(i.tempI32s=[]);break;case o.NativeType.I64:r=i.tempI64s||(i.tempI64s=[]);break;case o.NativeType.F32:r=i.tempF32s||(i.tempF32s=[]);break;case o.NativeType.F64:r=i.tempF64s||(i.tempF64s=[]);break;default:throw new Error("concrete type expected")}return r.length?(n=r[r.length-1]).type=e:(n=i.addLocal(e),r.push(n)),e.is(36)&&this.setLocalWrapped(n.index,t),n},e.prototype.addScopedLocal=function(e,t,r,n){void 0===n&&(n=null);var i=this.getTempLocal(t,!1);if(this.scopedLocals){var a=this.scopedLocals.get(e);if(a)return n&&this.parentFunction.program.error(c.DiagnosticCode.Duplicate_identifier_0,n.range),a}else this.scopedLocals=new Map;return i.set(s.CommonFlags.SCOPED),this.scopedLocals.set(e,i),t.is(36)&&this.setLocalWrapped(i.index,r),i},e.prototype.addScopedAlias=function(e,t,r,n){if(void 0===n&&(n=null),this.scopedLocals){var i=this.scopedLocals.get(e);if(i)return n&&this.parentFunction.program.error(c.DiagnosticCode.Duplicate_identifier_0,n.range),i}else this.scopedLocals=new Map;assert(r1?e.breakLabel=t[r-2].toString(10):(e.breakLabel=null,e.breakStack=null)},e.prototype.inherit=function(e){this.flags|=4095&e.flags,this.wrappedLocals=e.wrappedLocals,this.wrappedLocalsExt=e.wrappedLocalsExt},e.prototype.inheritConditional=function(e){e.is(1)&&this.set(128),e.is(4)&&this.set(256),e.is(8)&&e.breakLabel==this.breakLabel&&this.set(512),e.is(16)&&e.continueLabel==this.continueLabel&&this.set(1024),e.is(32)&&this.set(2048)},e.prototype.inheritMutual=function(e,t){this.flags|=e.flags&t.flags&127,this.flags|=3968&e.flags,this.flags|=3968&t.flags,this.wrappedLocals=i64_and(e.wrappedLocals,t.wrappedLocals);var r=e.wrappedLocalsExt,n=t.wrappedLocalsExt;if(null!=r&&null!=n){var i=this.wrappedLocalsExt,a=min(r.length,n.length);if(a){if(i)for(;i.lengthc):this.canOverflow(o.getBinaryLeft(e),t)&&!(o.getExpressionId(r=o.getBinaryRight(e))==o.ExpressionId.Const&&o.getConstValueI32(r)>=c);case o.BinaryOp.DivU32:case o.BinaryOp.RemI32:case o.BinaryOp.RemU32:return this.canOverflow(o.getBinaryLeft(e),t)||this.canOverflow(o.getBinaryRight(e),t)}break;case o.ExpressionId.Unary:switch(o.getUnaryOp(e)){case o.UnaryOp.EqzI32:case o.UnaryOp.EqzI64:return!1;case o.UnaryOp.ClzI32:case o.UnaryOp.CtzI32:case o.UnaryOp.PopcntI32:return t.size<7}break;case o.ExpressionId.Const:var l=0;switch(o.getExpressionType(e)){case o.NativeType.I32:l=o.getConstValueI32(e);break;case o.NativeType.I64:l=o.getConstValueI64Low(e);break;case o.NativeType.F32:l=i32(o.getConstValueF32(e));break;case o.NativeType.F64:l=i32(o.getConstValueF64(e));break;default:assert(!1)}switch(t.kind){case 0:return li8.MAX_VALUE;case 1:return li16.MAX_VALUE;case 5:return l<0||l>u8.MAX_VALUE;case 6:return l<0||l>u16.MAX_VALUE;case 10:return 0!=(-2&l)}break;case o.ExpressionId.Load:var p=void 0;switch(o.getLoadBytes(e)){case 1:p=o.isLoadSigned(e)?i.Type.i8:i.Type.u8;break;case 2:p=o.isLoadSigned(e)?i.Type.i16:i.Type.u16;break;default:p=o.isLoadSigned(e)?i.Type.i32:i.Type.u32}return u(p,t);case o.ExpressionId.Block:if(!o.getBlockName(e)){var _=assert(o.getBlockChildCount(e)),h=o.getBlockChild(e,_-1);return this.canOverflow(h,t)}break;case o.ExpressionId.If:return this.canOverflow(o.getIfTrue(e),t)||this.canOverflow(assert(o.getIfFalse(e)),t);case o.ExpressionId.Select:return this.canOverflow(o.getSelectThen(e),t)||this.canOverflow(o.getSelectElse(e),t);case o.ExpressionId.Call:var d=this.parentFunction.program,y=assert(d.instancesByName.get(assert(o.getCallTarget(e))));assert(y.kind==a.ElementKind.FUNCTION);var m=y.signature.returnType;return!y.flow.is(2)||u(m,t);case o.ExpressionId.Unreachable:return!1}return!0},e}();function u(e,t){return!e.is(4)||e.size>t.size||e.is(1)!=t.is(1)}t.Flow=p},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4),i=function(){function e(){this.text=[],this.functionId=0}return e.decompile=function(t){var r=new e;return r.decompile(t),r.finish()},e.prototype.decompile=function(e){throw new Error("not implemented")},e.prototype.decompileFunction=function(e){var t=n.getFunctionName(e)||"$"+this.functionId.toString(10),r=n.getFunctionBody(e);this.push("function "),this.push(t),this.push("(");for(var i=0,o=n.getFunctionParamCount(e);i0&&this.push(", "),this.push("$"),this.push(i.toString(10)),this.push(": "),this.push(a(n.getFunctionParamType(e,i)));this.push("): "),this.push(a(n.getFunctionResultType(e))),this.push(" "),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("{\n"),this.decompileExpression(r),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("\n}\n"),++this.functionId},e.prototype.decompileExpression=function(e){var t,r,i,o,s=n.getExpressionId(e),c=n.getExpressionType(e);switch(s){case n.ExpressionId.Block:for(null!=(r=n.getBlockName(e))&&(this.push(r),this.push(": ")),this.push("{\n"),o=n.getBlockChildCount(e),i=0;i("),this.push(n.getLoadOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getLoadPtr(e)),void this.push(")");case n.ExpressionId.Store:return this.push("store<"),this.push(a(c)),this.push(">("),this.push(n.getStoreOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getStorePtr(e)),this.push(", "),this.decompileExpression(n.getStoreValue(e)),void this.push(")");case n.ExpressionId.Const:switch(c){case n.NativeType.I32:return void this.push(n.getConstValueI32(e).toString(10));case n.NativeType.I64:return void this.push(i64_to_string(i64_new(n.getConstValueI64Low(e),n.getConstValueI64High(e))));case n.NativeType.F32:return void this.push(n.getConstValueF32(e).toString(10));case n.NativeType.F64:return void this.push(n.getConstValueF64(e).toString(10))}break;case n.ExpressionId.Unary:switch(n.getUnaryOp(e)){case n.UnaryOp.ClzI32:return this.push("clz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI32:return this.push("ctz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI32:return this.push("popcnt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NegF32:case n.UnaryOp.NegF64:return this.push("-"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.AbsF32:return this.push("abs("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF32:return this.push("ceil("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF32:return this.push("floor("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF32:return this.push("trunc("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF32:return this.push("nearest("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF32:return this.push("sqrt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.EqzI32:case n.UnaryOp.EqzI64:return this.push("!"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ClzI64:return this.push("clz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI64:return this.push("ctz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI64:return this.push("popcnt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.AbsF64:return this.push("abs("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF64:return this.push("ceil("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF64:return this.push("floor("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF64:return this.push("trunc("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF64:return this.push("nearest("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF64:return this.push("sqrt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ExtendI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ExtendU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.WrapI64:case n.UnaryOp.TruncF32ToI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToI64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretF32:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretF64:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ConvertI32ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI32ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.PromoteF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.DemoteF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretI32:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretI64:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")")}break;case n.ExpressionId.Binary:switch(n.getBinaryOp(e)){case n.BinaryOp.AddI32:case n.BinaryOp.AddI64:case n.BinaryOp.AddF32:case n.BinaryOp.AddF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" + "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.SubI32:case n.BinaryOp.SubI64:case n.BinaryOp.SubF32:case n.BinaryOp.SubF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" - "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.MulI32:case n.BinaryOp.MulI64:case n.BinaryOp.MulF32:case n.BinaryOp.MulF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" * "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivI32:case n.BinaryOp.DivI64:case n.BinaryOp.DivF32:case n.BinaryOp.DivF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU32:return this.push("("),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RemI32:case n.BinaryOp.RemI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU32:return this.push("("),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.AndI32:case n.BinaryOp.AndI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" & "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.OrI32:case n.BinaryOp.OrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" | "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.XorI32:case n.BinaryOp.XorI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" ^ "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShlI32:case n.BinaryOp.ShlI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" << "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrU32:case n.BinaryOp.ShrU64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >>> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrI32:case n.BinaryOp.ShrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI32:return this.push("rotl("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI32:return this.push("rotr("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.EqI32:case n.BinaryOp.EqI64:case n.BinaryOp.EqF32:case n.BinaryOp.EqF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" == "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.NeI32:case n.BinaryOp.NeI64:case n.BinaryOp.NeF32:case n.BinaryOp.NeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" != "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtI32:case n.BinaryOp.LtI64:case n.BinaryOp.LtF32:case n.BinaryOp.LtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeI32:case n.BinaryOp.LeI64:case n.BinaryOp.LeF32:case n.BinaryOp.LeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtI32:case n.BinaryOp.GtI64:case n.BinaryOp.GtF32:case n.BinaryOp.GtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeI32:case n.BinaryOp.GeI64:case n.BinaryOp.GeF32:case n.BinaryOp.GeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI64:return this.push("rotl("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI64:return this.push("rotr("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.LtU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.CopysignF32:return this.push("copysign("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF32:return this.push("min("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF32:return this.push("max("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.CopysignF64:return this.push("copysign("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF64:return this.push("min("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF64:return this.push("max("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")")}return;case n.ExpressionId.Select:return this.push("select<"),this.push(a(c)),this.push(">("),this.decompileExpression(n.getSelectThen(e)),this.push(", "),this.decompileExpression(n.getSelectElse(e)),this.push(", "),this.decompileExpression(n.getSelectCondition(e)),void this.push(")");case n.ExpressionId.Drop:return this.decompileExpression(n.getDropValue(e)),void this.push(";\n");case n.ExpressionId.Return:return void((t=n.getReturnValue(e))?(this.push("return "),this.decompileExpression(t),this.push(";\n")):this.push("return;\n"));case n.ExpressionId.Host:switch(n.getHostOp(e)){case n.HostOp.CurrentMemory:return void this.push("memory.size()");case n.HostOp.GrowMemory:return this.push("memory.grow("),this.decompileExpression(n.getHostOperand(e,0)),void this.push(")")}break;case n.ExpressionId.Nop:return void this.push(";\n");case n.ExpressionId.Unreachable:return void this.push("unreachable()");case n.ExpressionId.AtomicCmpxchg:case n.ExpressionId.AtomicRMW:case n.ExpressionId.AtomicWait:case n.ExpressionId.AtomicWake:}throw new Error("not implemented")},e.prototype.push=function(e){this.text.push(e)},e.prototype.finish=function(){var e=this.text.join("");return this.text=[],e},e}();function a(e){switch(e){case n.NativeType.None:return"void";case n.NativeType.I32:return"i32";case n.NativeType.I64:return"i64";case n.NativeType.F32:return"f32";case n.NativeType.F64:return"f64";case n.NativeType.V128:return"v128";case n.NativeType.Unreachable:throw new Error("unreachable type");case n.NativeType.Auto:throw new Error("auto type");default:throw new Error("unexpected type")}}t.Decompiler=i},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},o=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return o};Object.defineProperty(t,"__esModule",{value:!0});var s=r(0),c=r(3),l=r(2),p=function(){function e(e,t){void 0===t&&(t=!1),this.todo=[],this.seen=new Set,this.program=e,this.includePrivate}return e.prototype.walk=function(){var e,t,r,n;try{for(var i=a(this.program.filesByName.values()),o=i.next();!o.done;o=i.next()){var s=o.value.members;if(s)try{for(var c=a(s.values()),l=c.next();!l.done;l=c.next()){var p=l.value;this.visitElement(p)}}catch(e){r={error:e}}finally{try{l&&!l.done&&(n=c.return)&&n.call(c)}finally{if(r)throw r.error}}}}catch(t){e={error:t}}finally{try{o&&!o.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}for(var u=this.todo;0"),null}for(;e.skip(s.Token.BAR);){if(!e.skip(s.Token.NULL))return r||this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;y=!0}n=p.Node.createType(_,d,y,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var T=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(c.DiagnosticCode._0_expected,e.range(),"]"),null;var f=e.range(T,e.pos);y=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(c.DiagnosticCode._0_expected,e.range(),"null"),null;y=!0}if(n=p.Node.createType(p.Node.createSimpleTypeName("Array",f),[n],y,e.range(a,e.pos)),y)break}return n},t.prototype.tryParseSignature=function(e){var t,r=e.mark(),n=e.tokenPos,i=null,a=null,o=!1;if(e.skip(s.Token.CLOSEPAREN))o=!0,e.discard(r),i=[];else{o=!1;do{var l=p.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(o=!0,e.discard(r),l=p.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;o=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return o?this.error(c.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=o,null;var _=p.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(o=!0,e.discard(r),l==p.ParameterKind.REST?this.error(c.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):l=p.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){o=!0,e.discard(r);var h=this.parseType(e);if(!h)return this.tryParseSignatureIsSignature=o,null;var d=new p.ParameterNode;d.parameterKind=l,d.name=_,d.type=h,i?i.push(d):i=[d]}else o&&this.error(c.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return o?this.error(c.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=o,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(o=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,p.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=o,null)):(o?this.error(c.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=o,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=p.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=p.Node.createPropertyAccessExpression(n,p.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return p.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return p.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(c.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseVariable=function(e,t,r,n){var i=new Array;do{var a=this.parseVariableDeclaration(e,t,r);if(!a)return null;i.push(a)}while(e.skip(s.Token.COMMA));var o=p.Node.createVariableStatement(i,r,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),o},t.prototype.parseVariableDeclaration=function(e,t,r){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var n=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),i=t;e.skip(s.Token.EXCLAMATION)&&(i|=a.CommonFlags.DEFINITE_ASSIGNMENT);var o=null;e.skip(s.Token.COLON)&&(o=this.parseType(e));var l=null;if(e.skip(s.Token.EQUALS)){if(i&a.CommonFlags.AMBIENT&&this.error(c.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(l=this.parseExpression(e,2)))return null}else i&a.CommonFlags.CONST?i&a.CommonFlags.AMBIENT||this.error(c.DiagnosticCode._const_declarations_must_be_initialized,n.range):o||this.error(c.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return i&a.CommonFlags.DEFINITE_ASSIGNMENT&&l&&this.error(c.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),p.Node.createVariableDeclaration(n,o,l,r,i,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(c.DiagnosticCode._0_expected,e.range(),"{"),null;for(var o=new Array;!e.skip(s.Token.CLOSEBRACE);){var l=this.parseEnumValue(e,a.CommonFlags.NONE);if(!l)return null;if(o.push(l),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(c.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=p.Node.createEnumDeclaration(i,o,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),u},t.prototype.parseEnumValue=function(e,t){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:p.Node.createEnumValueDeclaration(r,n,t,s.Range.join(r.range,e.range()))},t.prototype.parseReturn=function(e){var t=null;if(e.peek(!0)!=s.Token.SEMICOLON&&e.nextToken!=s.Token.CLOSEBRACE&&!e.nextTokenOnNewLine&&!(t=this.parseExpression(e)))return null;var r=p.Node.createReturnStatement(t,e.range());return e.skip(s.Token.SEMICOLON),r},t.prototype.parseTypeParameters=function(e){for(var t=new Array,r=!1;!e.skip(s.Token.GREATERTHAN);){var n=this.parseTypeParameter(e);if(!n)return null;if(null!==n.defaultType?r=!0:r&&(this.error(c.DiagnosticCode.Required_type_parameters_may_not_follow_optional_type_parameters,n.range),n.defaultType=null),t.push(n),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.GREATERTHAN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(c.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,i.range),null;r=i}var n=null;if(e.skip(s.Token.EQUALS)){var i;if(!(i=this.parseType(e)))return null;if(i.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return p.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseParameters=function(e,t){void 0===t&&(t=!1);var r=new Array,n=null,i=!1,a=!1,o=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(c.DiagnosticCode._0_expected,e.range(),":"),null;if(!(o=this.parseType(e)))return null;if(o.kind==p.NodeKind.TYPE?this.parseParametersThis=o:this.error(c.DiagnosticCode.Operation_not_supported,o.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(c.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var l=this.parseParameter(e,t);if(!l)return null;switch(n&&!a&&(this.error(c.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),l.parameterKind){default:i&&this.error(c.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,l.name.range);break;case p.ParameterKind.OPTIONAL:i=!0;break;case p.ParameterKind.REST:n=l}if(r.push(l),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,i=null,o=a.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(i=e.range(),o|=a.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(i=e.range(),o|=a.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(i=e.range(),o|=a.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var l=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(l),i||(i=e.range()),o|=a.CommonFlags.READONLY):e.reset(l)}if(e.skip(s.Token.DOT_DOT_DOT)&&(o?this.error(c.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):i=e.range(),r=!0),e.skipIdentifier()){r||(i=e.range());var u=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),_=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(c.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(_=this.parseType(e)))return null}else _=p.Node.createOmittedType(e.range(e.pos));var h=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(c.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(c.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(h=this.parseExpression(e,2))))return null;var d=p.Node.createParameter(u,_,h,r?p.ParameterKind.REST:n?p.ParameterKind.OPTIONAL:p.ParameterKind.DEFAULT,s.Range.join(i,e.range()));return d.flags|=o,d}return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),o=-1,l=null;if(e.skip(s.Token.LESSTHAN)){if(o=e.tokenPos,!(l=this.parseTypeParameters(e)))return null;t|=a.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"("),null;o<0&&(o=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var _=this.parseParametersThis,h=0!=(t&a.CommonFlags.SET);h&&(1!=u.length&&this.error(c.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,i.range),u.length&&u[0].initializer&&this.error(c.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,i.range)),t&a.CommonFlags.GET&&u.length&&this.error(c.DiagnosticCode.A_get_accessor_cannot_have_parameters,i.range);var d=null;if(e.skip(s.Token.COLON)&&!(d=this.parseType(e,!0,h)))return null;d||(d=p.Node.createOmittedType(e.range(e.pos)),h||this.error(c.DiagnosticCode.Type_expected,d.range));var y=p.Node.createSignature(u,d,_,!1,e.range(o,e.pos)),m=null;if(e.skip(s.Token.OPENBRACE)){if(t&a.CommonFlags.AMBIENT&&this.error(c.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(m=this.parseBlockStatement(e,!1)))return null}else t&a.CommonFlags.AMBIENT||this.error(c.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var g=p.Node.createFunctionDeclaration(i,l,y,m,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),g},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=p.Node.createEmptyIdentifierExpression(e.range(e.tokenPos));var i=e.pos,a=this.parseParameters(e);return a?this.parseFunctionExpressionCommon(e,t,a,n,r,i):null},t.prototype.parseFunctionExpressionCommon=function(e,t,r,n,i,o){void 0===i&&(i=-1),void 0===o&&(o=-1),i<0&&(i=t.range.start),o<0&&(o=i);var l=null;if(e.skip(s.Token.COLON)){if(!(l=this.parseType(e)))return null}else l=p.Node.createOmittedType(e.range(e.pos)),this.error(c.DiagnosticCode.Type_expected,l.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,_=p.Node.createSignature(r,l,null,!1,e.range(o,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var h=p.Node.createFunctionDeclaration(t,null,_,u,null,n?a.CommonFlags.ARROW:a.CommonFlags.NONE,e.range(i,e.pos));return p.Node.createFunctionExpression(h)},t.prototype.parseClassOrInterface=function(e,t,r,n){var i=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var o=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),l=null;if(e.skip(s.Token.LESSTHAN)){if(!(l=this.parseTypeParameters(e)))return null;t|=a.CommonFlags.GENERIC}var u=null;if(e.skip(s.Token.EXTENDS)){var _=this.parseType(e);if(!_)return null;if(_.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,_.range),null;u=_}var h=null;if(e.skip(s.Token.IMPLEMENTS)){i&&this.error(c.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var d=this.parseType(e);if(!d)return null;i||(h||(h=[]),h.push(d))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(),"{"),null;var y,m=new Array;if(i?(assert(!h),y=p.Node.createInterfaceDeclaration(o,l,u,m,r,t,e.range(n,e.pos))):y=p.Node.createClassDeclaration(o,l,u,h,m,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var g=this.parseClassMember(e,y);g&&m.push(g)}while(!e.skip(s.Token.CLOSEBRACE));return y},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,i=p.Node.createClassDeclaration(t,[],null,null,n,null,a.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var o=this.parseClassMember(e,i);o&&n.push(o)}while(!e.skip(s.Token.CLOSEBRACE));return p.Node.createClassExpression(i)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==p.NodeKind.INTERFACEDECLARATION,i=new Array;if(e.skip(s.Token.AT)){do{var o=this.parseDecorator(e);if(!o)break;i.push(o)}while(e.skip(s.Token.AT));n&&this.error(c.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(i[0].range,i[i.length-1].range))}var l=t.flags&a.CommonFlags.AMBIENT;n&&(l|=a.CommonFlags.VIRTUAL);var u=0,_=0;e.skip(s.Token.PUBLIC)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),l|=a.CommonFlags.PUBLIC,u=e.tokenPos,_=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),l|=a.CommonFlags.PRIVATE,u=e.tokenPos,_=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),l|=a.CommonFlags.PROTECTED,u=e.tokenPos,_=e.pos);var h=0,d=0,y=0,m=0;e.skip(s.Token.STATIC)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),l|=a.CommonFlags.STATIC,h=e.tokenPos,d=e.pos):(l|=a.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),l|=a.CommonFlags.ABSTRACT,y=e.tokenPos,m=e.pos),t.flags&a.CommonFlags.GENERIC&&(l|=a.CommonFlags.GENERIC_CONTEXT));var g=0,T=0;e.skip(s.Token.READONLY)&&(l|=a.CommonFlags.READONLY,g=e.tokenPos,T=e.pos);var f,E=e.mark(),I=!1,v=!1,b=!1,S=0,A=0;if(n||(e.skip(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(E):(l|=a.CommonFlags.GET,v=!0,S=e.tokenPos,A=e.pos,l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(E):(l|=a.CommonFlags.SET,b=!0,S=e.tokenPos,A=e.pos,l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(l|=a.CommonFlags.CONSTRUCTOR)&a.CommonFlags.STATIC&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(h,d),"static"),l&a.CommonFlags.ABSTRACT&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,m),"abstract"),l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly"))),I)f=p.Node.createConstructorExpression(e.range());else{if(!v&&!b&&e.skip(s.Token.OPENBRACKET)){l&a.CommonFlags.PUBLIC?this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,_),"public"):l&a.CommonFlags.PROTECTED?this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,_),"protected"):l&a.CommonFlags.PRIVATE&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,_),"protected"),l&a.CommonFlags.STATIC&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(h,d),"static"),l&a.CommonFlags.ABSTRACT&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,m),"abstract"),l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly");var N=this.parseIndexSignatureDeclaration(e,i);return N?(e.skip(s.Token.SEMICOLON),N):null}if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;f=p.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var C=null;if(e.skip(s.Token.LESSTHAN)){var O=e.tokenPos;if(!(C=this.parseTypeParameters(e)))return null;I?this.error(c.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(O,e.pos)):v||b?this.error(c.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(O,e.pos)):l|=a.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var x=e.tokenPos,k=this.parseParameters(e,I);if(!k)return null;var L=this.parseParametersThis;if(I)for(var R=0,F=k.length;R"),null):null;case s.Token.IDENTIFIER:return p.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return p.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return p.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return e.peek()!=s.Token.DOT&&e.nextToken!=s.Token.OPENPAREN&&this.error(c.DiagnosticCode._super_must_be_followed_by_an_argument_list_or_member_access,e.range()),p.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return p.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return p.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return p.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var T=e.readRegexpPattern();return e.skip(s.Token.SLASH)?p.Node.createRegexpLiteralExpression(T,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(c.DiagnosticCode._0_expected,e.range(),"/"),null);case s.Token.FUNCTION:return this.parseFunctionExpression(e);case s.Token.CLASS:return this.parseClassExpression(e);default:return t==s.Token.ENDOFFILE?this.error(c.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(c.DiagnosticCode.Expression_expected,e.range()),null}},t.prototype.tryParseTypeArgumentsBeforeArguments=function(e){var t=e.mark();if(!e.skip(s.Token.LESSTHAN))return null;var r=new Array;do{if(e.peek()===s.Token.GREATERTHAN)break;var n=this.parseType(e,!0,!0);if(!n)return e.reset(t),null;r.push(n)}while(e.skip(s.Token.COMMA));return e.skip(s.Token.GREATERTHAN)&&e.skip(s.Token.OPENPAREN)?r:(e.reset(t),null)},t.prototype.parseArguments=function(e){for(var t=new Array;!e.skip(s.Token.CLOSEPAREN);){var r=this.parseExpression(e,2);if(!r)return null;if(t.push(r),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),")"),null}}return t},t.prototype.parseExpression=function(e,t){void 0===t&&(t=1),assert(0!=t);var r=this.parseExpressionStart(e);if(!r)return null;for(var n,i,a=(r=this.maybeParseCallExpression(e,r)).range.start,o=null;(i=_(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var l=this.parseType(e);if(!l)return null;r=p.Node.createAssertionExpression(p.AssertionKind.AS,r,l,e.range(a,e.pos));break;case s.Token.EXCLAMATION:r=p.Node.createAssertionExpression(p.AssertionKind.NONNULL,r,null,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var u=this.parseType(e);if(!u)return null;r=p.Node.createInstanceOfExpression(r,u,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(o=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(c.DiagnosticCode._0_expected,e.range(),"]"),null;r=p.Node.createElementAccessExpression(r,o,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=p.NodeKind.IDENTIFIER&&r.kind!=p.NodeKind.ELEMENTACCESS&&r.kind!=p.NodeKind.PROPERTYACCESS&&this.error(c.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=p.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var d=this.parseExpression(e);if(!d)return null;if(!e.skip(s.Token.COLON))return this.error(c.DiagnosticCode._0_expected,e.range(),":"),null;var y=this.parseExpression(e,t>1?2:1);if(!y)return null;r=p.Node.createTernaryExpression(r,d,y,e.range(a,e.pos));break;case s.Token.COMMA:var m=[r];do{if(!(r=this.parseExpression(e,2)))return null;m.push(r)}while(e.skip(s.Token.COMMA));r=p.Node.createCommaExpression(m,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())o=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(o=this.parseExpression(e,h(n)?i:i+1)))return null;if(o.kind==p.NodeKind.IDENTIFIER)r=p.Node.createPropertyAccessExpression(r,o,e.range(a,e.pos));else{if(o.kind!=p.NodeKind.CALL)return this.error(c.DiagnosticCode.Identifier_expected,o.range),null;if(!(r=this.joinPropertyCall(e,a,r,o)))return null}}else{if(!(o=this.parseExpression(e,h(n)?i:i+1)))return null;r=p.Node.createBinaryExpression(n,r,o,e.range(a,e.pos))}}r=this.maybeParseCallExpression(e,r)}return r},t.prototype.joinPropertyCall=function(e,t,r,n){var i=n.expression;switch(i.kind){case p.NodeKind.IDENTIFIER:n.expression=p.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case p.NodeKind.CALL:var a=this.joinPropertyCall(e,t,r,i);if(!a)return null;n.expression=a,n.range=e.range(t,e.pos);break;default:return this.error(c.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(p.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||p.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=p.Node.createCallExpression(t,r,n,e.range(t.range.start,e.pos))}return t},t.prototype.skipStatement=function(e){for(e.peek(!0),e.nextTokenOnNewLine&&e.next();;){var t=e.peek(!0);if(t==s.Token.ENDOFFILE||t==s.Token.SEMICOLON){e.next();break}if(e.nextTokenOnNewLine)break;switch(e.next()){case s.Token.IDENTIFIER:e.readIdentifier();break;case s.Token.STRINGLITERAL:e.readString();break;case s.Token.INTEGERLITERAL:e.readInteger();break;case s.Token.FLOATLITERAL:e.readFloat()}}},t.prototype.skipBlock=function(e){var t=1,r=!0;do{switch(e.next()){case s.Token.ENDOFFILE:this.error(c.DiagnosticCode._0_expected,e.range(),"}"),r=!1;break;case s.Token.OPENBRACE:++t;break;case s.Token.CLOSEBRACE:--t||(r=!1);break;case s.Token.IDENTIFIER:e.readIdentifier();break;case s.Token.STRINGLITERAL:e.readString();break;case s.Token.INTEGERLITERAL:e.readInteger();break;case s.Token.FLOATLITERAL:e.readFloat()}}while(r)},t}(c.DiagnosticEmitter);function _(e){switch(e){case s.Token.COMMA:return 1;case s.Token.EQUALS:case s.Token.PLUS_EQUALS:case s.Token.MINUS_EQUALS:case s.Token.ASTERISK_ASTERISK_EQUALS:case s.Token.ASTERISK_EQUALS:case s.Token.SLASH_EQUALS:case s.Token.PERCENT_EQUALS:case s.Token.LESSTHAN_LESSTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.AMPERSAND_EQUALS:case s.Token.CARET_EQUALS:case s.Token.BAR_EQUALS:return 4;case s.Token.QUESTION:return 5;case s.Token.BAR_BAR:return 6;case s.Token.AMPERSAND_AMPERSAND:return 7;case s.Token.BAR:return 8;case s.Token.CARET:return 9;case s.Token.AMPERSAND:return 10;case s.Token.EQUALS_EQUALS:case s.Token.EXCLAMATION_EQUALS:case s.Token.EQUALS_EQUALS_EQUALS:case s.Token.EXCLAMATION_EQUALS_EQUALS:return 11;case s.Token.AS:case s.Token.IN:case s.Token.INSTANCEOF:case s.Token.LESSTHAN:case s.Token.GREATERTHAN:case s.Token.LESSTHAN_EQUALS:case s.Token.GREATERTHAN_EQUALS:return 12;case s.Token.LESSTHAN_LESSTHAN:case s.Token.GREATERTHAN_GREATERTHAN:case s.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:return 13;case s.Token.PLUS:case s.Token.MINUS:return 14;case s.Token.ASTERISK:case s.Token.SLASH:case s.Token.PERCENT:return 15;case s.Token.ASTERISK_ASTERISK:return 16;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:return 18;case s.Token.DOT:case s.Token.NEW:case s.Token.OPENBRACKET:case s.Token.EXCLAMATION:return 20}return 0}function h(e){switch(e){case s.Token.EQUALS:case s.Token.PLUS_EQUALS:case s.Token.MINUS_EQUALS:case s.Token.ASTERISK_ASTERISK_EQUALS:case s.Token.ASTERISK_EQUALS:case s.Token.SLASH_EQUALS:case s.Token.PERCENT_EQUALS:case s.Token.LESSTHAN_LESSTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.AMPERSAND_EQUALS:case s.Token.CARET_EQUALS:case s.Token.BAR_EQUALS:case s.Token.QUESTION:case s.Token.ASTERISK_ASTERISK:return!0;default:return!1}}t.Parser=u,function(e){e[e.NONE=0]="NONE",e[e.COMMA=1]="COMMA",e[e.SPREAD=2]="SPREAD",e[e.YIELD=3]="YIELD",e[e.ASSIGNMENT=4]="ASSIGNMENT",e[e.CONDITIONAL=5]="CONDITIONAL",e[e.LOGICAL_OR=6]="LOGICAL_OR",e[e.LOGICAL_AND=7]="LOGICAL_AND",e[e.BITWISE_OR=8]="BITWISE_OR",e[e.BITWISE_XOR=9]="BITWISE_XOR",e[e.BITWISE_AND=10]="BITWISE_AND",e[e.EQUALITY=11]="EQUALITY",e[e.RELATIONAL=12]="RELATIONAL",e[e.SHIFT=13]="SHIFT",e[e.ADDITIVE=14]="ADDITIVE",e[e.MULTIPLICATIVE=15]="MULTIPLICATIVE",e[e.EXPONENTIATED=16]="EXPONENTIATED",e[e.UNARY_PREFIX=17]="UNARY_PREFIX",e[e.UNARY_POSTFIX=18]="UNARY_POSTFIX",e[e.CALL=19]="CALL",e[e.MEMBERACCESS=20]="MEMBERACCESS",e[e.GROUPING=21]="GROUPING"}(t.Precedence||(t.Precedence={}))},function(e,t,r){r(17),e.exports=r(31)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),r(18),r(20),r(21),r(22);var n=r(4);n.Module.prototype.toText=function(){return binaryen.wrapModule(this.ref).emitStackIR()},n.Module.prototype.toAsmjs=function(){return binaryen.wrapModule(this.ref).emitAsmjs()}},function(e,t,r){(function(e){const t=e.Binaryen||r(19);for(var n in e.binaryen=t,t)(n.startsWith("_Binaryen")||n.startsWith("_Relooper"))&&(e[n]=t[n]);e.__memory_allocate=t._malloc,e.__memory_free=t._free,e.__memory_copy=t._memmove,e.__store=function(e,r){t.HEAPU8[e]=r},e.__load=function(e){return t.HEAPU8[e]}}).call(this,r(8))},function(t,r){t.exports=e},function(e,t,r){(function(e){var t="undefined"!=typeof window&&window||void 0!==e&&e||self;t.ASC_TARGET=0,t.ASC_NO_ASSERT=!1,t.ASC_MEMORY_BASE=0,t.ASC_OPTIMIZE_LEVEL=3,t.ASC_SHRINK_LEVEL=0,t.ASC_FEATURE_MUTABLE_GLOBAL=!1,t.ASC_FEATURE_SIGN_EXTENSION=!1,t.ASC_FEATURE_BULK_MEMORY=!1,t.ASC_FEATURE_SIMD=!1,t.ASC_FEATURE_THREADS=!1;var r=new Float64Array(1),n=new Uint32Array(r.buffer);function i(){Error.captureStackTrace?Error.captureStackTrace(this,i):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}function a(e){this.message=e||"assertion failed",Error.captureStackTrace?Error.captureStackTrace(this,a):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}Object.defineProperties(t.i8=function(e){return e<<24>>24},{MIN_VALUE:{value:-128,writable:!1},MAX_VALUE:{value:127,writable:!1}}),Object.defineProperties(t.i16=function(e){return e<<16>>16},{MIN_VALUE:{value:-32768,writable:!1},MAX_VALUE:{value:32767,writable:!1}}),Object.defineProperties(t.i32=t.isize=function(e){return 0|e},{MIN_VALUE:{value:-2147483648,writable:!1},MAX_VALUE:{value:2147483647,writable:!1}}),Object.defineProperties(t.u8=function(e){return 255&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:255,writable:!1}}),Object.defineProperties(t.u16=function(e){return 65535&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:65535,writable:!1}}),Object.defineProperties(t.u32=t.usize=function(e){return e>>>0},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:4294967295,writable:!1}}),Object.defineProperties(t.bool=function(e){return!!e},{MIN_VALUE:{value:!1,writable:!1},MAX_VALUE:{value:!0,writable:!1}}),Object.defineProperties(t.f32=function(e){return Math.fround(e)},{EPSILON:{value:Math.fround(1.1920929e-7),writable:!1},MIN_VALUE:{value:Math.fround(1.4012985e-45),writable:!1},MAX_VALUE:{value:Math.fround(3.4028235e38),writable:!1},MIN_NORMAL_VALUE:{value:Math.fround(1.17549435e-38),writable:!1},MIN_SAFE_INTEGER:{value:-16777215,writable:!1},MAX_SAFE_INTEGER:{value:16777215,writable:!1}}),Object.defineProperties(t.f64=function(e){return+e},{EPSILON:{value:2.220446049250313e-16,writable:!1},MIN_VALUE:{value:5e-324,writable:!1},MAX_VALUE:{value:1.7976931348623157e308,writable:!1},MIN_NORMAL_VALUE:{value:2.2250738585072014e-308,writable:!1},MIN_SAFE_INTEGER:{value:-9007199254740991,writable:!1},MAX_SAFE_INTEGER:{value:9007199254740991,writable:!1}}),t.clz=Math.clz32,t.ctz=function(e){var t=Math.clz32(e&-e);return e?31-t:t},t.popcnt=function(e){return 16843009*((e=(858993459&(e-=e>>>1&1431655765))+(e>>>2&858993459))+(e>>>4)&252645135)>>>24},t.rotl=function(e,t){return e<<(t&=31)|e>>>32-t},t.rotr=function(e,t){return e>>>(t&=31)|e<<32-t},t.abs=Math.abs,t.max=Math.max,t.min=Math.min,t.ceil=Math.ceil,t.floor=Math.floor,t.nearest=function(e){return.5===Math.abs(e-Math.trunc(e))?2*Math.round(.5*e):Math.round(e)},t.select=function(e,t,r){return r?e:t},t.sqrt=Math.sqrt,t.trunc=Math.trunc,t.copysign=function(e,t){return Math.abs(e)*Math.sign(t)},t.bswap=function(e){var t=e>>8&16711935,r=(16711935&e)<<8;return(t=(e=t|r)>>16&65535)|(r=(65535&e)<<16)},t.bswap16=function(e){return e<<8&65280|e>>8&255|4294901760&e},i.prototype=Object.create(Error.prototype),i.prototype.name="UnreachableError",i.prototype.message="unreachable",t.unreachable=function(){throw new i},a.prototype=Object.create(Error.prototype),a.prototype.name="AssertionError",t.assert=function(e,t){if(e)return e;throw new a(t)},t.changetype=function(e){return e},t.parseI32=function(e,t){return 0|parseInt(e,void 0)},String.fromCharCodes=function(e){return String.fromCharCode.apply(String,e)},String.fromCodePoints=function(e){return String.fromCodePoint.apply(String,e)},t.isInteger=Number.isInteger,t.isFloat=function(e){return"number"==typeof e},t.isReference=function(e){return"object"==typeof e||"string"==typeof e},t.isString=function(e){return"string"==typeof e||e instanceof String},t.isArray=Array.isArray,t.isDefined=function(e){return void 0!==e},t.isConstant=function(e){return!1},t.unchecked=function(e){return e},t.fmod=function(e,t){return e%t},t.fmodf=function(e,t){return Math.fround(e%t)},t.JSMath=Math,t.JSMath.signbit=function(e){return r[0]=e,Boolean(n[1]>>>31&e==e)},t.memory=(()=>{var e=new Uint8Array(0),r=0;return{allocate:t.__memory_allocate||function(t){if(!(t>>>=0))return 0;if(r+t>e.length){var n=e;(e=new Uint8Array(Math.max(65536,e.length+t,2*e.length))).set(n)}var i=r;return 7&(r+=t)&&(r=1+(7|r)),i},fill:t.__memory_fill||function(t,r,n){e.fill(r,t,t+n)},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)},reset:t.__memory_reset||function(){e=new Uint8Array(0),r=0}}})(),t.store=t.__store||function(e,t,r){HEAP[(0|e)+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[(0|e)+(0|t)]}}).call(this,r(8))},function(e,t,r){(function(e){const t=new Float64Array(1),r=new Float32Array(t.buffer),n=new Int32Array(t.buffer);e.f32_as_i32=function(e){return r[0]=e,n[0]},e.i32_as_f32=function(e){return n[0]=e,r[0]},e.f64_as_i64=function(e){return t[0]=e,i64_new(n[0],n[1])},e.i64_as_f64=function(e){return n[0]=i64_low(e),n[1]=i64_high(e),t[0]}}).call(this,r(8))},function(e,t,r){(function(e){const t=e.Long||r(23);e.i64_zero=t.ZERO,e.i64_one=t.ONE,e.i64_new=function(e,r){return t.fromBits(e,r)},e.i64_low=function(e){return e.low},e.i64_high=function(e){return e.high},e.i64_add=function(e,t){return e.add(t)},e.i64_sub=function(e,t){return e.sub(t)},e.i64_mul=function(e,t){return e.mul(t)},e.i64_div=function(e,t){return e.div(t)},e.i64_div_u=function(e,t){return e.toUnsigned().div(t.toUnsigned()).toSigned()},e.i64_rem=function(e,t){return e.mod(t)},e.i64_rem_u=function(e,t){return e.toUnsigned().mod(t.toUnsigned()).toSigned()},e.i64_and=function(e,t){return e.and(t)},e.i64_or=function(e,t){return e.or(t)},e.i64_xor=function(e,t){return e.xor(t)},e.i64_shl=function(e,t){return e.shl(t)},e.i64_shr=function(e,t){return e.shr(t)},e.i64_shr_u=function(e,t){return e.shru(t)},e.i64_not=function(e){return e.not()},e.i64_eq=function(e,t){return e.eq(t)},e.i64_ne=function(e,t){return e.ne(t)},e.i64_align=function(e,r){assert(r&&0==(r&r-1));var n=t.fromInt(r-1);return e.add(n).and(n.not())},e.i64_is_i8=function(e){return 0===e.high&&e.low>=0&&e.low<=i8.MAX_VALUE||-1===e.high&&e.low>=i8.MIN_VALUE&&e.low<0},e.i64_is_i16=function(e){return 0===e.high&&e.low>=0&&e.low<=i16.MAX_VALUE||-1===e.high&&e.low>=i16.MIN_VALUE&&e.low<0},e.i64_is_i32=function(e){return 0===e.high&&e.low>=0||-1===e.high&&e.low<0},e.i64_is_u8=function(e){return 0===e.high&&e.low>=0&&e.low<=u8.MAX_VALUE},e.i64_is_u16=function(e){return 0===e.high&&e.low>=0&&e.low<=u16.MAX_VALUE},e.i64_is_u32=function(e){return 0===e.high},e.i64_is_bool=function(e){return 0===e.high&&(0===e.low||1===e.low)};const n=t.fromNumber(f32.MIN_SAFE_INTEGER),i=t.fromNumber(f32.MAX_SAFE_INTEGER);e.i64_is_f32=function(e){return e.gte(n)&&e.lte(i)};const a=t.fromNumber(f64.MIN_SAFE_INTEGER),o=t.fromNumber(f64.MAX_SAFE_INTEGER);e.i64_is_f64=function(e){return e.gte(a)&&e.lte(o)},e.i64_to_f32=function(t){return e.Math.fround(t.toNumber())},e.i64_to_f64=function(e){return e.toNumber()},e.i64_to_string=function(e,t){return(t?e.toUnsigned():e).toString(10)}}).call(this,r(8))},function(e,t){e.exports=n;var r=null;try{r=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function n(e,t,r){this.low=0|e,this.high=0|t,this.unsigned=!!r}function i(e){return!0===(e&&e.__isLong__)}n.prototype.__isLong__,Object.defineProperty(n.prototype,"__isLong__",{value:!0}),n.isLong=i;var a={},o={};function s(e,t){var r,n,i;return t?(i=0<=(e>>>=0)&&e<256)&&(n=o[e])?n:(r=l(e,(0|e)<0?-1:0,!0),i&&(o[e]=r),r):(i=-128<=(e|=0)&&e<128)&&(n=a[e])?n:(r=l(e,e<0?-1:0,!1),i&&(a[e]=r),r)}function c(e,t){if(isNaN(e))return t?T:g;if(t){if(e<0)return T;if(e>=d)return b}else{if(e<=-y)return S;if(e+1>=y)return v}return e<0?c(-e,t).neg():l(e%h|0,e/h|0,t)}function l(e,t,r){return new n(e,t,r)}n.fromInt=s,n.fromNumber=c,n.fromBits=l;var p=Math.pow;function u(e,t,r){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return g;if("number"==typeof t?(r=t,t=!1):t=!!t,(r=r||10)<2||360)throw Error("interior hyphen");if(0===n)return u(e.substring(1),t,r).neg();for(var i=c(p(r,8)),a=g,o=0;o>>0:this.low},A.toNumber=function(){return this.unsigned?(this.high>>>0)*h+(this.low>>>0):this.high*h+(this.low>>>0)},A.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((a=s).isZero())return l+o;for(;l.length<6;)l="0"+l;o=""+l+o}},A.getHighBits=function(){return this.high},A.getHighBitsUnsigned=function(){return this.high>>>0},A.getLowBits=function(){return this.low},A.getLowBitsUnsigned=function(){return this.low>>>0},A.getNumBitsAbs=function(){if(this.isNegative())return this.eq(S)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<=0},A.isOdd=function(){return 1==(1&this.low)},A.isEven=function(){return 0==(1&this.low)},A.equals=function(e){return i(e)||(e=_(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},A.eq=A.equals,A.notEquals=function(e){return!this.eq(e)},A.neq=A.notEquals,A.ne=A.notEquals,A.lessThan=function(e){return this.comp(e)<0},A.lt=A.lessThan,A.lessThanOrEqual=function(e){return this.comp(e)<=0},A.lte=A.lessThanOrEqual,A.le=A.lessThanOrEqual,A.greaterThan=function(e){return this.comp(e)>0},A.gt=A.greaterThan,A.greaterThanOrEqual=function(e){return this.comp(e)>=0},A.gte=A.greaterThanOrEqual,A.ge=A.greaterThanOrEqual,A.compare=function(e){if(i(e)||(e=_(e)),this.eq(e))return 0;var t=this.isNegative(),r=e.isNegative();return t&&!r?-1:!t&&r?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},A.comp=A.compare,A.negate=function(){return!this.unsigned&&this.eq(S)?S:this.not().add(f)},A.neg=A.negate,A.add=function(e){i(e)||(e=_(e));var t=this.high>>>16,r=65535&this.high,n=this.low>>>16,a=65535&this.low,o=e.high>>>16,s=65535&e.high,c=e.low>>>16,p=0,u=0,h=0,d=0;return h+=(d+=a+(65535&e.low))>>>16,u+=(h+=n+c)>>>16,p+=(u+=r+s)>>>16,p+=t+o,l((h&=65535)<<16|(d&=65535),(p&=65535)<<16|(u&=65535),this.unsigned)},A.subtract=function(e){return i(e)||(e=_(e)),this.add(e.neg())},A.sub=A.subtract,A.multiply=function(e){if(this.isZero())return g;if(i(e)||(e=_(e)),r)return l(r.mul(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned);if(e.isZero())return g;if(this.eq(S))return e.isOdd()?S:g;if(e.eq(S))return this.isOdd()?S:g;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(m)&&e.lt(m))return c(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,n=65535&this.high,a=this.low>>>16,o=65535&this.low,s=e.high>>>16,p=65535&e.high,u=e.low>>>16,h=65535&e.low,d=0,y=0,T=0,f=0;return T+=(f+=o*h)>>>16,y+=(T+=a*h)>>>16,T&=65535,y+=(T+=o*u)>>>16,d+=(y+=n*h)>>>16,y&=65535,d+=(y+=a*u)>>>16,y&=65535,d+=(y+=o*p)>>>16,d+=t*h+n*u+a*p+o*s,l((T&=65535)<<16|(f&=65535),(d&=65535)<<16|(y&=65535),this.unsigned)},A.mul=A.multiply,A.divide=function(e){if(i(e)||(e=_(e)),e.isZero())throw Error("division by zero");var t,n,a;if(r)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?l((this.unsigned?r.div_u:r.div_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?T:g;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return T;if(e.gt(this.shru(1)))return E;a=T}else{if(this.eq(S))return e.eq(f)||e.eq(I)?S:e.eq(S)?f:(t=this.shr(1).div(e).shl(1)).eq(g)?e.isNegative()?f:I:(n=this.sub(e.mul(t)),a=t.add(n.div(e)));if(e.eq(S))return this.unsigned?T:g;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();a=g}for(n=this;n.gte(e);){t=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var o=Math.ceil(Math.log(t)/Math.LN2),s=o<=48?1:p(2,o-48),u=c(t),h=u.mul(e);h.isNegative()||h.gt(n);)h=(u=c(t-=s,this.unsigned)).mul(e);u.isZero()&&(u=f),a=a.add(u),n=n.sub(h)}return a},A.div=A.divide,A.modulo=function(e){return i(e)||(e=_(e)),r?l((this.unsigned?r.rem_u:r.rem_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},A.mod=A.modulo,A.rem=A.modulo,A.not=function(){return l(~this.low,~this.high,this.unsigned)},A.and=function(e){return i(e)||(e=_(e)),l(this.low&e.low,this.high&e.high,this.unsigned)},A.or=function(e){return i(e)||(e=_(e)),l(this.low|e.low,this.high|e.high,this.unsigned)},A.xor=function(e){return i(e)||(e=_(e)),l(this.low^e.low,this.high^e.high,this.unsigned)},A.shiftLeft=function(e){return i(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?l(this.low<>>32-e,this.unsigned):l(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):l(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},A.shr=A.shiftRight,A.shiftRightUnsigned=function(e){if(i(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?l(this.low>>>e|t<<32-e,t>>>e,this.unsigned):l(32===e?t:t>>>e-32,0,this.unsigned)},A.shru=A.shiftRightUnsigned,A.shr_u=A.shiftRightUnsigned,A.toSigned=function(){return this.unsigned?l(this.low,this.high,!1):this},A.toUnsigned=function(){return this.unsigned?this:l(this.low,this.high,!0)},A.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},A.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},A.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},n.fromBytes=function(e,t,r){return r?n.fromBytesLE(e,t):n.fromBytesBE(e,t)},n.fromBytesLE=function(e,t){return new n(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},n.fromBytesBE=function(e,t){return new n(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},function(e,t,r){"use strict";var n=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i,a=r(1),o=r(5),s=r(6),c=r(4),l=r(3),p=r(9),u=r(0);function _(e,t,r,n,u,_){var g,T,f,E,I=e.module;switch(t.internalName){case i.isInteger:var v=d(e,r,n,_);return e.currentType=s.Type.bool,v?v.is(4)&&!v.is(256)?I.createI32(1):I.createI32(0):I.createUnreachable();case i.isFloat:v=d(e,r,n,_);return e.currentType=s.Type.bool,v?v.is(8)?I.createI32(1):I.createI32(0):I.createUnreachable();case i.isSigned:v=d(e,r,n,_);return e.currentType=s.Type.bool,v?v.is(1)?I.createI32(1):I.createI32(0):I.createUnreachable();case i.isReference:v=d(e,r,n,_);return e.currentType=s.Type.bool,v?v.is(256)?I.createI32(1):I.createI32(0):I.createUnreachable();case i.isString:v=d(e,r,n,_);if(e.currentType=s.Type.bool,!v)return I.createUnreachable();if(M=v.classReference){var b=e.program.stringInstance;if(b&&M.isAssignableTo(b))return I.createI32(1)}return I.createI32(0);case i.isArray:v=d(e,r,n,_);if(e.currentType=s.Type.bool,!v)return I.createUnreachable();var S=v.classReference;if(!S)return I.createI32(0);var A=S.prototype;return I.createI32(A.extends(e.program.arrayPrototype)?1:0);case i.isDefined:if(e.currentType=s.Type.bool,r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),1!=n.length)return e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();var N=e.resolver.resolveExpression(n[0],e.currentFlow,s.Type.void,p.ReportMode.SWALLOW);return I.createI32(N?1:0);case i.isConstant:if(e.currentType=s.Type.bool,r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),1!=n.length)return e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();var C=e.compileExpressionRetainType(n[0],s.Type.i32,0);return e.currentType=s.Type.bool,I.createI32(c.getExpressionId(C)==c.ExpressionId.Const?1:0);case i.isManaged:if(!e.program.hasGC)return e.currentType=s.Type.bool,I.createI32(0);v=d(e,r,n,_);return e.currentType=s.Type.bool,v?null===(M=v.classReference)||M.hasDecorator(l.DecoratorFlags.UNMANAGED)?I.createI32(0):I.createI32(1):I.createUnreachable();case i.clz:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=I.createUnary(c.UnaryOp.ClzI32,g);break;case 10:case 2:case 7:E=I.createUnary(c.UnaryOp.ClzI32,g);break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}case 4:E=I.createUnary(e.options.isWasm64?c.UnaryOp.ClzI64:c.UnaryOp.ClzI32,g);break;case 3:case 8:E=I.createUnary(c.UnaryOp.ClzI64,g);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.ctz:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],0,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=I.createUnary(c.UnaryOp.CtzI32,g);break;case 10:case 2:case 7:E=I.createUnary(c.UnaryOp.CtzI32,g);break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}case 4:E=I.createUnary(e.options.isWasm64?c.UnaryOp.CtzI64:c.UnaryOp.CtzI32,g);break;case 3:case 8:E=I.createUnary(c.UnaryOp.CtzI64,g);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.popcnt:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 0:case 1:case 5:case 6:E=I.createUnary(c.UnaryOp.PopcntI32,g);break;case 10:case 2:case 7:E=I.createUnary(c.UnaryOp.PopcntI32,g);break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}case 4:E=I.createUnary(e.options.isWasm64?c.UnaryOp.PopcntI64:c.UnaryOp.PopcntI32,g);break;case 3:case 8:E=I.createUnary(c.UnaryOp.PopcntI64,g);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.rotl:if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(T=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:E=e.ensureSmallIntegerWrap(I.createBinary(c.BinaryOp.RotlI32,g,T),e.currentType);case 2:case 7:E=I.createBinary(c.BinaryOp.RotlI32,g,T);break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}case 4:E=I.createBinary(e.options.isWasm64?c.BinaryOp.RotlI64:c.BinaryOp.RotlI32,g,T);break;case 3:case 8:E=I.createBinary(c.BinaryOp.RotlI64,g,T);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.rotr:if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(T=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:E=e.ensureSmallIntegerWrap(I.createBinary(c.BinaryOp.RotrI32,g,T),e.currentType);break;case 2:case 7:E=I.createBinary(c.BinaryOp.RotrI32,g,T);break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}case 4:E=I.createBinary(e.options.isWasm64?c.BinaryOp.RotrI64:c.BinaryOp.RotrI32,g,T);break;case 3:case 8:E=I.createBinary(c.BinaryOp.RotrI64,g,T);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.abs:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.f64,0,1);switch(e.currentType.kind){case 0:case 1:case 2:var O=(R=e.currentFlow).getTempLocal(s.Type.i32,!1),x=R.getAndFreeTempLocal(s.Type.i32,!1).index,k=O.index;E=I.createBinary(c.BinaryOp.XorI32,I.createBinary(c.BinaryOp.AddI32,I.createTeeLocal(x,I.createBinary(c.BinaryOp.ShrI32,I.createTeeLocal(k,g),I.createI32(31))),I.createGetLocal(k,c.NativeType.I32)),I.createGetLocal(x,c.NativeType.I32)),R.freeTempLocal(O);break;case 4:var L=e.options,R=e.currentFlow,F=L.isWasm64;O=R.getTempLocal(L.usizeType,!1),x=R.getAndFreeTempLocal(L.usizeType,!1).index,k=O.index;E=I.createBinary(F?c.BinaryOp.XorI64:c.BinaryOp.XorI32,I.createBinary(F?c.BinaryOp.AddI64:c.BinaryOp.AddI32,I.createTeeLocal(x,I.createBinary(F?c.BinaryOp.ShrI64:c.BinaryOp.ShrI32,I.createTeeLocal(k,g),F?I.createI64(63):I.createI32(31))),I.createGetLocal(k,L.nativeSizeType)),I.createGetLocal(x,L.nativeSizeType)),R.freeTempLocal(O);break;case 3:O=(R=e.currentFlow).getTempLocal(s.Type.i64,!1),x=R.getAndFreeTempLocal(s.Type.i64,!1).index,k=O.index;E=I.createBinary(c.BinaryOp.XorI64,I.createBinary(c.BinaryOp.AddI64,I.createTeeLocal(x,I.createBinary(c.BinaryOp.ShrI64,I.createTeeLocal(k,g),I.createI64(63))),I.createGetLocal(k,c.NativeType.I64)),I.createGetLocal(x,c.NativeType.I64)),R.freeTempLocal(O);break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}case 5:case 6:case 7:case 8:case 10:E=g;break;case 11:E=I.createUnary(c.UnaryOp.AbsF32,g);break;case 12:E=I.createUnary(c.UnaryOp.AbsF64,g);break;case 14:E=I.createUnreachable();break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.max:if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.f64,0,1);switch(T=e.compileExpression(n[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:var B=(R=e.currentFlow).getTempLocal(e.currentType,!R.canOverflow(g,e.currentType));O=R.getAndFreeTempLocal(e.currentType,!R.canOverflow(T,e.currentType));R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.GtI32,I.createGetLocal(B.index,c.NativeType.I32),I.createGetLocal(O.index,c.NativeType.I32)));break;case 5:case 6:case 7:case 10:B=(R=e.currentFlow).getTempLocal(e.currentType,!R.canOverflow(g,e.currentType)),O=R.getAndFreeTempLocal(e.currentType,!R.canOverflow(T,e.currentType));R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.GtU32,I.createGetLocal(B.index,c.NativeType.I32),I.createGetLocal(O.index,c.NativeType.I32)));break;case 3:B=(R=e.currentFlow).getTempLocal(s.Type.i64,!1),O=R.getAndFreeTempLocal(s.Type.i64,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.GtI64,I.createGetLocal(B.index,c.NativeType.I64),I.createGetLocal(O.index,c.NativeType.I64)));break;case 8:B=(R=e.currentFlow).getTempLocal(s.Type.i64,!1),O=R.getAndFreeTempLocal(s.Type.i64,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.GtU64,I.createGetLocal(B.index,c.NativeType.I64),I.createGetLocal(O.index,c.NativeType.I64)));break;case 4:B=(R=e.currentFlow).getTempLocal(e.options.usizeType,!1),O=R.getAndFreeTempLocal(e.options.usizeType,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(e.options.isWasm64?c.BinaryOp.GtI64:c.BinaryOp.GtI32,I.createGetLocal(B.index,e.options.nativeSizeType),I.createGetLocal(O.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}B=(R=e.currentFlow).getTempLocal(e.options.usizeType,!1),O=R.getAndFreeTempLocal(e.options.usizeType,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(e.options.isWasm64?c.BinaryOp.GtU64:c.BinaryOp.GtU32,I.createGetLocal(B.index,e.options.nativeSizeType),I.createGetLocal(O.index,e.options.nativeSizeType)));break;case 11:E=I.createBinary(c.BinaryOp.MaxF32,g,T);break;case 12:E=I.createBinary(c.BinaryOp.MaxF64,g,T);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.min:if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.f64,0,1);switch(T=e.compileExpression(n[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:B=(R=e.currentFlow).getTempLocal(e.currentType,!R.canOverflow(g,e.currentType)),O=R.getAndFreeTempLocal(e.currentType,!R.canOverflow(T,e.currentType));R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.LtI32,I.createGetLocal(B.index,c.NativeType.I32),I.createGetLocal(O.index,c.NativeType.I32)));break;case 5:case 6:case 7:case 10:B=(R=e.currentFlow).getTempLocal(e.currentType,!R.canOverflow(g,e.currentType)),O=R.getAndFreeTempLocal(e.currentType,!R.canOverflow(T,e.currentType));R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.LtU32,I.createGetLocal(B.index,c.NativeType.I32),I.createGetLocal(O.index,c.NativeType.I32)));break;case 3:B=(R=e.currentFlow).getTempLocal(s.Type.i64,!1),O=R.getAndFreeTempLocal(s.Type.i64,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.LtI64,I.createGetLocal(B.index,c.NativeType.I64),I.createGetLocal(O.index,c.NativeType.I64)));break;case 8:B=(R=e.currentFlow).getTempLocal(s.Type.i64,!1),O=R.getAndFreeTempLocal(s.Type.i64,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.LtU64,I.createGetLocal(B.index,c.NativeType.I64),I.createGetLocal(O.index,c.NativeType.I64)));break;case 4:B=(R=e.currentFlow).getTempLocal(e.options.usizeType,!1),O=R.getAndFreeTempLocal(e.options.usizeType,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(e.options.isWasm64?c.BinaryOp.LtI64:c.BinaryOp.LtI32,I.createGetLocal(B.index,e.options.nativeSizeType),I.createGetLocal(O.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}B=(R=e.currentFlow).getTempLocal(e.options.usizeType,!1),O=R.getAndFreeTempLocal(e.options.usizeType,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(e.options.isWasm64?c.BinaryOp.LtU64:c.BinaryOp.LtU32,I.createGetLocal(B.index,e.options.nativeSizeType),I.createGetLocal(O.index,e.options.nativeSizeType)));break;case 11:E=I.createBinary(c.BinaryOp.MinF32,g,T);break;case 12:E=I.createBinary(c.BinaryOp.MinF64,g,T);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.ceil:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}default:E=g;break;case 11:E=I.createUnary(c.UnaryOp.CeilF32,g);break;case 12:E=I.createUnary(c.UnaryOp.CeilF64,g);break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.floor:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}default:E=g;break;case 11:E=I.createUnary(c.UnaryOp.FloorF32,g);break;case 12:E=I.createUnary(c.UnaryOp.FloorF64,g);break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.copysign:if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(T=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 11:E=I.createBinary(c.BinaryOp.CopysignF32,g,T);break;case 12:E=I.createBinary(c.BinaryOp.CopysignF64,g,T);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.nearest:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}default:E=g;break;case 11:E=I.createUnary(c.UnaryOp.NearestF32,g);break;case 12:E=I.createUnary(c.UnaryOp.NearestF64,g);break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.reinterpret:if(1!=n.length)return r&&1==r.length||(r&&r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0")),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(!r||1!=r.length)return r&&r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable();switch(r[0].kind){case 2:case 7:g=e.compileExpression(n[0],s.Type.f32,1,0),E=I.createUnary(c.UnaryOp.ReinterpretF32,g);break;case 3:case 8:g=e.compileExpression(n[0],s.Type.f64,1,0),E=I.createUnary(c.UnaryOp.ReinterpretF64,g);break;case 9:if(r[0].is(256))return e.error(a.DiagnosticCode.Operation_not_supported,_.range),e.currentType=r[0],I.createUnreachable();case 4:g=e.compileExpression(n[0],e.options.isWasm64?s.Type.f64:s.Type.f32,1,0),E=I.createUnary(e.options.isWasm64?c.UnaryOp.ReinterpretF64:c.UnaryOp.ReinterpretF32,g);break;case 11:g=e.compileExpression(n[0],s.Type.i32,1,0),E=I.createUnary(c.UnaryOp.ReinterpretI32,g);break;case 12:g=e.compileExpression(n[0],s.Type.i64,1,0),E=I.createUnary(c.UnaryOp.ReinterpretI64,g);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return e.currentType=r[0],E;case i.sqrt:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 11:E=I.createUnary(c.UnaryOp.SqrtF32,g);break;case 12:E=I.createUnary(c.UnaryOp.SqrtF64,g);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.trunc:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r&&r.length){if(e.currentType=r[0],1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}default:E=g;break;case 11:E=I.createUnary(c.UnaryOp.TruncF32,g);break;case 12:E=I.createUnary(c.UnaryOp.TruncF64,g);break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.load:return n.length<1||n.length>2?(r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),n.length<1?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"1",n.length.toString(10)):e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable()):r&&1==r.length?(g=e.compileExpression(n[0],e.options.usizeType,1,0),(G=2==n.length?y(e,n[1]):0)<0?I.createUnreachable():(e.currentType=r[0],I.createLoad(r[0].byteSize,r[0].is(5),g,r[0].is(4)&&u.is(4)&&u.size>r[0].size?(e.currentType=u).toNativeType():(e.currentType=r[0]).toNativeType(),G))):(r&&r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable());case i.store:if(e.currentType=s.Type.void,n.length<2||n.length>3)return r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"2",n.length.toString(10)):e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),I.createUnreachable();if(!r||1!=r.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable();g=e.compileExpression(n[0],e.options.usizeType,1,0),T=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);v=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size2?(r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),n.length<1?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"1",n.length.toString(10)):e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable()):r&&1==r.length?(g=e.compileExpression(n[0],e.options.usizeType,1,0),(G=2==n.length?y(e,n[1]):0)<0?I.createUnreachable():(e.currentType=r[0],I.createAtomicLoad(r[0].byteSize,g,r[0].is(4)&&u.is(4)&&u.size>r[0].size?(e.currentType=u).toNativeType():(e.currentType=r[0]).toNativeType(),G))):(r&&r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable());case i.atomic_store:if(!e.options.hasFeature(16))break;if(e.currentType=s.Type.void,n.length<2||n.length>3)return r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"2",n.length.toString(10)):e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),I.createUnreachable();if(!r||1!=r.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable();g=e.compileExpression(n[0],e.options.usizeType,1,0),T=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);v=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size3)return r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"2",n.length.toString(10)):e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),I.createUnreachable();if(!r||1!=r.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable();g=e.compileExpression(n[0],e.options.usizeType,1,0),T=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);v=void 0;if(r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size4)return r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),n.length<3?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"2",n.length.toString(10)):e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),I.createUnreachable();if(!r||1!=r.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable();g=e.compileExpression(n[0],e.options.usizeType,1,0),T=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0),f=e.compileExpression(n[2],r[0],r[0].is(4)?0:1,0);v=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size1)return r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(!r||1!=r.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable();var M;if(!(M=r[0].classReference))return e.error(a.DiagnosticCode.Operation_not_supported,_.range),I.createUnreachable();var G=void 0;if(n.length){if(n[0].kind!=o.NodeKind.LITERAL||n[0].literalKind!=o.LiteralKind.STRING)return e.error(a.DiagnosticCode.String_literal_expected,n[0].range),I.createUnreachable();var V=n[0].value,K=M.members?M.members.get(V):null;if(!K||K.kind!=l.ElementKind.FIELD)return e.error(a.DiagnosticCode.Type_0_has_no_property_1,n[0].range,M.internalName,V),I.createUnreachable();G=K.memoryOffset}else G=M.currentMemoryOffset;return e.options.isWasm64?u.is(4)&&u.size<=32?(e.currentType=s.Type.u32,I.createI32(G)):I.createI64(G):u.is(4)&&64==u.size?(e.currentType=s.Type.u64,I.createI64(G)):I.createI32(G);case i.select:if(3!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpressionRetainType(n[0],s.Type.i32,0);v=e.currentType;switch(T=e.compileExpression(n[1],v,1,0),f=e.makeIsTrueish(e.compileExpressionRetainType(n[2],s.Type.bool,0),e.currentType),e.currentType=v,e.currentType.kind){case 0:case 1:case 5:case 6:case 10:default:E=I.createSelect(g,T,f);break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.unreachable:return 0!=n.length&&e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"0",n.length.toString(10)),r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),I.createUnreachable();case i.memory_size:return e.currentType=s.Type.i32,0!=n.length&&e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"0",n.length.toString(10)),r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),I.createHost(c.HostOp.CurrentMemory);case i.memory_grow:return e.currentType=s.Type.i32,1!=n.length?(e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"0",n.length.toString(10)),g=I.createUnreachable()):g=e.compileExpression(n[0],s.Type.i32,1,0),r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),I.createHost(c.HostOp.GrowMemory,null,[g]);case i.memory_copy:if(!e.options.hasFeature(4)){var z=e.resolver.resolveFunction(t,null);return e.currentType=s.Type.void,z?e.compileCallDirect(z,n,_):I.createUnreachable()}if(r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),3!=n.length)return e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),e.currentType=s.Type.void,I.createUnreachable();var H=e.options.usizeType;return g=e.compileExpression(n[0],H,1,0),T=e.compileExpression(n[1],H,1,0),f=e.compileExpression(n[2],H,1,0),e.currentType=s.Type.void,I.createMemoryCopy(g,T,f);case i.memory_fill:if(!e.options.hasFeature(4)){z=e.resolver.resolveFunction(t,null);return e.currentType=s.Type.void,z?e.compileCallDirect(z,n,_):I.createUnreachable()}if(r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),3!=n.length)return e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),e.currentType=s.Type.void,I.createUnreachable();H=e.options.usizeType;return g=e.compileExpression(n[0],H,1,0),T=e.compileExpression(n[1],s.Type.u32,1,0),f=e.compileExpression(n[2],H,1,0),e.currentType=s.Type.void,I.createMemoryFill(g,T,f);case i.changetype:return r&&1==r.length?1!=n.length?(e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),e.currentType=r[0],I.createUnreachable()):(g=e.compileExpressionRetainType(n[0],r[0],0),e.currentType=r[0],e.currentType.size!=r[0].size?(e.error(a.DiagnosticCode.Operation_not_supported,_.range),I.createUnreachable()):g):(r&&r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable());case i.assert:if(n.length<1||n.length>2)return r&&(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),n.length<1?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"1",n.length.toString(10)):n.length>2&&e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable();if(r){if(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpressionRetainType(n[0],s.Type.bool,1);v=e.currentType;if(e.currentType=v.nonNullableType,e.options.noAssert)return u==s.Type.void?(e.currentType=s.Type.void,I.createNop()):g;var Y=m(e,2==n.length?n[1]:null,_);if(e.currentType=v.nonNullableType,u==s.Type.void){switch(e.currentType.kind){default:E=I.createIf(I.createUnary(c.UnaryOp.EqzI32,g),Y);break;case 3:case 8:E=I.createIf(I.createUnary(c.UnaryOp.EqzI64,g),Y);break;case 4:case 9:E=I.createIf(I.createUnary(e.options.isWasm64?c.UnaryOp.EqzI64:c.UnaryOp.EqzI32,g),Y);break;case 11:E=I.createIf(I.createBinary(c.BinaryOp.EqF32,g,I.createF32(0)),Y);break;case 12:E=I.createIf(I.createBinary(c.BinaryOp.EqF64,g,I.createF64(0)),Y);break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=Y}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:var W=(R=e.currentFlow).getAndFreeTempLocal(e.currentType,!R.canOverflow(g,e.currentType));E=I.createIf(I.createTeeLocal(W.index,g),I.createGetLocal(W.index,c.NativeType.I32),Y);break;case 2:case 7:default:W=e.currentFlow.getAndFreeTempLocal(s.Type.i32,!1);E=I.createIf(I.createTeeLocal(W.index,g),I.createGetLocal(W.index,c.NativeType.I32),Y);break;case 3:case 8:W=e.currentFlow.getAndFreeTempLocal(s.Type.i64,!1);E=I.createIf(I.createUnary(c.UnaryOp.EqzI64,I.createTeeLocal(W.index,g)),Y,I.createGetLocal(W.index,c.NativeType.I64));break;case 4:case 9:W=e.currentFlow.getAndFreeTempLocal(e.options.usizeType,!1);E=I.createIf(I.createUnary(e.options.isWasm64?c.UnaryOp.EqzI64:c.UnaryOp.EqzI32,I.createTeeLocal(W.index,g)),Y,I.createGetLocal(W.index,e.options.nativeSizeType));break;case 11:W=e.currentFlow.getAndFreeTempLocal(s.Type.f32,!1);E=I.createIf(I.createBinary(c.BinaryOp.EqF32,I.createTeeLocal(W.index,g),I.createF32(0)),Y,I.createGetLocal(W.index,c.NativeType.F32));break;case 12:W=e.currentFlow.getAndFreeTempLocal(s.Type.f64,!1);E=I.createIf(I.createBinary(c.BinaryOp.EqF64,I.createTeeLocal(W.index,g),I.createF64(0)),Y,I.createGetLocal(W.index,c.NativeType.F64));break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=Y}return E;case i.unchecked:return r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),1!=n.length?(e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable()):((R=e.currentFlow).set(8192),E=e.compileExpressionRetainType(n[0],u,0),R.unset(8192),E);case i.call_indirect:if(n.length<1)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();var X=void 0;if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();X=r[0]}else X=u;if(g=e.compileExpressionRetainType(n[0],s.Type.u32,0),7!=e.currentType.kind)return e.error(a.DiagnosticCode.Operation_not_supported,n[0].range),I.createUnreachable();for(var Q=n.length-1,q=new Array(Q),j=new Array(Q+1),Z=X.toNativeType(),J=new Array(Q),$=0;$ void"),I.createUnreachable())}var oe=function(e,t,r,n,a){switch(t.internalName){case i.i32_clz:return h(i.clz,e,s.Type.i32,r,s.Type.i32,a);case i.i64_clz:return h(i.clz,e,s.Type.i64,r,s.Type.i64,a);case i.i32_ctz:return h(i.ctz,e,s.Type.i32,r,s.Type.i32,a);case i.i64_ctz:return h(i.ctz,e,s.Type.i64,r,s.Type.i64,a);case i.i32_popcnt:return h(i.popcnt,e,s.Type.i32,r,s.Type.i32,a);case i.i64_popcnt:return h(i.popcnt,e,s.Type.i64,r,s.Type.i64,a);case i.i32_rotl:return h(i.rotl,e,s.Type.i32,r,s.Type.i32,a);case i.i64_rotl:return h(i.rotl,e,s.Type.i64,r,s.Type.i64,a);case i.i32_rotr:return h(i.rotr,e,s.Type.i32,r,s.Type.i32,a);case i.i64_rotr:return h(i.rotr,e,s.Type.i64,r,s.Type.i64,a);case i.f32_abs:return h(i.abs,e,s.Type.f32,r,s.Type.f32,a);case i.f64_abs:return h(i.abs,e,s.Type.f64,r,s.Type.f64,a);case i.f32_max:return h(i.max,e,s.Type.f32,r,s.Type.f32,a);case i.f64_max:return h(i.max,e,s.Type.f64,r,s.Type.f64,a);case i.f32_min:return h(i.min,e,s.Type.f32,r,s.Type.f32,a);case i.f64_min:return h(i.min,e,s.Type.f64,r,s.Type.f64,a);case i.f32_ceil:return h(i.ceil,e,s.Type.f32,r,s.Type.f32,a);case i.f64_ceil:return h(i.ceil,e,s.Type.f64,r,s.Type.f64,a);case i.f32_floor:return h(i.floor,e,s.Type.f32,r,s.Type.f32,a);case i.f64_floor:return h(i.floor,e,s.Type.f64,r,s.Type.f64,a);case i.f32_copysign:return h(i.copysign,e,s.Type.f32,r,s.Type.f32,a);case i.f64_copysign:return h(i.copysign,e,s.Type.f64,r,s.Type.f64,a);case i.f32_nearest:return h(i.nearest,e,s.Type.f32,r,s.Type.f32,a);case i.f64_nearest:return h(i.nearest,e,s.Type.f64,r,s.Type.f64,a);case i.i32_reinterpret_f32:return h(i.reinterpret,e,s.Type.i32,r,s.Type.f32,a);case i.i64_reinterpret_f64:return h(i.reinterpret,e,s.Type.i64,r,s.Type.f64,a);case i.f32_reinterpret_i32:return h(i.reinterpret,e,s.Type.f32,r,s.Type.i32,a);case i.f64_reinterpret_i64:return h(i.reinterpret,e,s.Type.f64,r,s.Type.i64,a);case i.f32_sqrt:return h(i.sqrt,e,s.Type.f32,r,s.Type.f32,a);case i.f64_sqrt:return h(i.sqrt,e,s.Type.f64,r,s.Type.f64,a);case i.f32_trunc:return h(i.trunc,e,s.Type.f32,r,s.Type.f32,a);case i.f64_trunc:return h(i.trunc,e,s.Type.f64,r,s.Type.f64,a);case i.i32_load8_s:return h(i.load,e,s.Type.i8,r,s.Type.i32,a);case i.i32_load8_u:return h(i.load,e,s.Type.u8,r,s.Type.u32,a);case i.i32_load16_s:return h(i.load,e,s.Type.i16,r,s.Type.i32,a);case i.i32_load16_u:return h(i.load,e,s.Type.u16,r,s.Type.u32,a);case i.i32_load:return h(i.load,e,s.Type.i32,r,s.Type.i32,a);case i.i64_load8_s:return h(i.load,e,s.Type.i8,r,s.Type.i64,a);case i.i64_load8_u:return h(i.load,e,s.Type.u8,r,s.Type.u64,a);case i.i64_load16_s:return h(i.load,e,s.Type.i16,r,s.Type.i64,a);case i.i64_load16_u:return h(i.load,e,s.Type.u16,r,s.Type.u64,a);case i.i64_load32_s:return h(i.load,e,s.Type.i32,r,s.Type.i64,a);case i.i64_load32_u:return h(i.load,e,s.Type.u32,r,s.Type.u64,a);case i.i64_load:return h(i.load,e,s.Type.i64,r,s.Type.i64,a);case i.f32_load:return h(i.load,e,s.Type.f32,r,s.Type.f32,a);case i.f64_load:return h(i.load,e,s.Type.f64,r,s.Type.f64,a);case i.i32_store8:return h(i.store,e,s.Type.i8,r,s.Type.i32,a);case i.i32_store16:return h(i.store,e,s.Type.i16,r,s.Type.i32,a);case i.i32_store:return h(i.store,e,s.Type.i32,r,s.Type.i32,a);case i.i64_store8:return h(i.store,e,s.Type.i8,r,s.Type.i64,a);case i.i64_store16:return h(i.store,e,s.Type.i16,r,s.Type.i64,a);case i.i64_store32:return h(i.store,e,s.Type.i32,r,s.Type.i64,a);case i.i64_store:return h(i.store,e,s.Type.i64,r,s.Type.i64,a);case i.f32_store:return h(i.store,e,s.Type.f32,r,s.Type.f32,a);case i.f64_store:return h(i.store,e,s.Type.f64,r,s.Type.f64,a)}if(e.options.hasFeature(16))switch(t.internalName){case i.i32_atomic_load8_u:return h(i.atomic_load,e,s.Type.u8,r,s.Type.u32,a);case i.i32_atomic_load16_u:return h(i.atomic_load,e,s.Type.u16,r,s.Type.u32,a);case i.i32_atomic_load:return h(i.atomic_load,e,s.Type.i32,r,s.Type.i32,a);case i.i64_atomic_load8_u:return h(i.atomic_load,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_load16_u:return h(i.atomic_load,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_load32_u:return h(i.atomic_load,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_load:return h(i.atomic_load,e,s.Type.i64,r,s.Type.i64,a);case i.i32_atomic_store8:return h(i.atomic_store,e,s.Type.i8,r,s.Type.i32,a);case i.i32_atomic_store16:return h(i.atomic_store,e,s.Type.i16,r,s.Type.i32,a);case i.i32_atomic_store:return h(i.atomic_store,e,s.Type.i32,r,s.Type.i32,a);case i.i64_atomic_store8:return h(i.atomic_store,e,s.Type.i8,r,s.Type.i64,a);case i.i64_atomic_store16:return h(i.atomic_store,e,s.Type.i16,r,s.Type.i64,a);case i.i64_atomic_store32:return h(i.atomic_store,e,s.Type.i32,r,s.Type.i64,a);case i.i64_atomic_store:return h(i.atomic_store,e,s.Type.i64,r,s.Type.i64,a);case i.i32_atomic_rmw8_u_add:return h(i.atomic_add,e,s.Type.u8,r,s.Type.u32,a);case i.i32_atomic_rmw16_u_add:return h(i.atomic_add,e,s.Type.u16,r,s.Type.u32,a);case i.i32_atomic_rmw_add:return h(i.atomic_add,e,s.Type.u32,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_add:return h(i.atomic_add,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_add:return h(i.atomic_add,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_add:return h(i.atomic_add,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_add:return h(i.atomic_add,e,s.Type.u64,r,s.Type.u64,a);case i.i32_atomic_rmw8_u_sub:return h(i.atomic_sub,e,s.Type.u8,r,s.Type.u32,a);case i.i32_atomic_rmw16_u_sub:return h(i.atomic_sub,e,s.Type.u16,r,s.Type.u32,a);case i.i32_atomic_rmw_sub:return h(i.atomic_sub,e,s.Type.u32,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_sub:return h(i.atomic_sub,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_sub:return h(i.atomic_sub,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_sub:return h(i.atomic_sub,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_sub:return h(i.atomic_sub,e,s.Type.u64,r,s.Type.u64,a);case i.i32_atomic_rmw8_u_and:return h(i.atomic_and,e,s.Type.u8,r,s.Type.u32,a);case i.i32_atomic_rmw16_u_and:return h(i.atomic_and,e,s.Type.u16,r,s.Type.u32,a);case i.i32_atomic_rmw_and:return h(i.atomic_and,e,s.Type.u32,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_and:return h(i.atomic_and,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_and:return h(i.atomic_and,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_and:return h(i.atomic_and,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_and:return h(i.atomic_and,e,s.Type.u64,r,s.Type.u64,a);case i.i32_atomic_rmw8_u_or:return h(i.atomic_or,e,s.Type.u8,r,s.Type.u32,a);case i.i32_atomic_rmw16_u_or:return h(i.atomic_or,e,s.Type.u16,r,s.Type.u32,a);case i.i32_atomic_rmw_or:return h(i.atomic_or,e,s.Type.u32,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_or:return h(i.atomic_or,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_or:return h(i.atomic_or,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_or:return h(i.atomic_or,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_or:return h(i.atomic_or,e,s.Type.u64,r,s.Type.u64,a);case i.i32_atomic_rmw8_u_xor:case i.i32_atomic_rmw16_u_xor:case i.i32_atomic_rmw_xor:return h(i.atomic_xor,e,s.Type.u8,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_xor:return h(i.atomic_xor,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_xor:return h(i.atomic_xor,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_xor:return h(i.atomic_xor,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_xor:return h(i.atomic_xor,e,s.Type.u64,r,s.Type.u64,a);case i.i32_atomic_rmw8_u_xchg:case i.i32_atomic_rmw16_u_xchg:case i.i32_atomic_rmw_xchg:return h(i.atomic_xchg,e,s.Type.u8,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_xchg:return h(i.atomic_xchg,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_xchg:return h(i.atomic_xchg,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_xchg:return h(i.atomic_xchg,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_xchg:return h(i.atomic_xchg,e,s.Type.u64,r,s.Type.u64,a);case i.i32_atomic_rmw8_u_cmpxchg:case i.i32_atomic_rmw16_u_cmpxchg:case i.i32_atomic_rmw_cmpxchg:return h(i.atomic_cmpxchg,e,s.Type.u8,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_cmpxchg:return h(i.atomic_cmpxchg,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_cmpxchg:return h(i.atomic_cmpxchg,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_cmpxchg:return h(i.atomic_cmpxchg,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_cmpxchg:return h(i.atomic_cmpxchg,e,s.Type.u64,r,s.Type.u64,a);case i.i32_wait:return h(i.atomic_wait,e,s.Type.i32,r,s.Type.u32,a);case i.i64_wait:return h(i.atomic_wait,e,s.Type.i64,r,s.Type.i64,a);case i.i32_notify:return h(i.atomic_notify,e,s.Type.i32,r,s.Type.u32,a);case i.i64_notify:return h(i.atomic_notify,e,s.Type.i64,r,s.Type.i64,a)}return 0}(e,t,n,0,_);return oe?(r&&r.length&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),oe):(e.error(a.DiagnosticCode.Cannot_find_name_0,_.expression.range,t.internalName),I.createUnreachable())}function h(e,t,r,n,i,a){assert(t.program.elementsByName.has(e));var o=t.program.elementsByName.get(e);return assert(o.kind==l.ElementKind.FUNCTION_PROTOTYPE),_(t,o,[r],n,i,a)}function d(e,t,r,n){if(0==r.length)return t&&1==t.length?t[0]:(e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t?t.length.toString(10):"0"),null);if(1==r.length){if(t)if(1==t.length)e.compileExpression(r[0],t[0],1,0);else{if(t.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t.length.toString(10)),null;e.compileExpressionRetainType(r[0],s.Type.i32,0)}else e.compileExpressionRetainType(r[0],s.Type.i32,0);return e.currentType}return t&&t.length>1&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t.length.toString(10)),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"1",r.length.toString(10)),null}function y(e,t){var r,n;return e.options.isWasm64?(r=e.precomputeExpression(t,s.Type.usize64,1,0),(c.getExpressionId(r)!=c.ExpressionId.Const||c.getExpressionType(r)!=c.NativeType.I64||0!=c.getConstValueI64High(r)||(n=c.getConstValueI64Low(r))<0)&&(e.error(a.DiagnosticCode.Expression_must_be_a_compile_time_constant,t.range),n=-1)):(r=e.precomputeExpression(t,s.Type.usize32,1,0),(c.getExpressionId(r)!=c.ExpressionId.Const||c.getExpressionType(r)!=c.NativeType.I32||(n=c.getConstValueI32(r))<0)&&(e.error(a.DiagnosticCode.Expression_must_be_a_compile_time_constant,t.range),n=-1)),n}function m(e,t,r){var n=e.program,i=e.module,a=e.program.stringInstance;if(!a)return i.createUnreachable();var o=n.abortInstance;if(!o||!e.compileFunction(o))return i.createUnreachable();var l=null!=t?e.compileExpression(t,a.type,1,0):a.type.toNativeZero(i),p=e.ensureStaticString(r.range.source.normalizedPath);return e.currentType=s.Type.void,i.createBlock(null,[i.createCall(o.internalName,[l,p,i.createI32(r.range.line),i.createI32(r.range.column)],c.NativeType.None),i.createUnreachable()])}!function(e){e.isInteger="~lib/builtins/isInteger",e.isFloat="~lib/builtins/isFloat",e.isSigned="~lib/builtins/isSigned",e.isReference="~lib/builtins/isReference",e.isString="~lib/builtins/isString",e.isArray="~lib/builtins/isArray",e.isDefined="~lib/builtins/isDefined",e.isConstant="~lib/builtins/isConstant",e.isManaged="~lib/builtins/isManaged",e.clz="~lib/builtins/clz",e.ctz="~lib/builtins/ctz",e.popcnt="~lib/builtins/popcnt",e.rotl="~lib/builtins/rotl",e.rotr="~lib/builtins/rotr",e.abs="~lib/builtins/abs",e.max="~lib/builtins/max",e.min="~lib/builtins/min",e.ceil="~lib/builtins/ceil",e.floor="~lib/builtins/floor",e.copysign="~lib/builtins/copysign",e.nearest="~lib/builtins/nearest",e.reinterpret="~lib/builtins/reinterpret",e.sqrt="~lib/builtins/sqrt",e.trunc="~lib/builtins/trunc",e.load="~lib/builtins/load",e.store="~lib/builtins/store",e.atomic_load="~lib/builtins/atomic.load",e.atomic_store="~lib/builtins/atomic.store",e.atomic_add="~lib/builtins/atomic.add",e.atomic_sub="~lib/builtins/atomic.sub",e.atomic_and="~lib/builtins/atomic.and",e.atomic_or="~lib/builtins/atomic.or",e.atomic_xor="~lib/builtins/atomic.xor",e.atomic_xchg="~lib/builtins/atomic.xchg",e.atomic_cmpxchg="~lib/builtins/atomic.cmpxchg",e.atomic_wait="~lib/builtins/atomic.wait",e.atomic_notify="~lib/builtins/atomic.notify",e.sizeof="~lib/builtins/sizeof",e.alignof="~lib/builtins/alignof",e.offsetof="~lib/builtins/offsetof",e.select="~lib/builtins/select",e.unreachable="~lib/builtins/unreachable",e.changetype="~lib/builtins/changetype",e.assert="~lib/builtins/assert",e.unchecked="~lib/builtins/unchecked",e.call_indirect="~lib/builtins/call_indirect",e.instantiate="~lib/builtins/instantiate",e.i8="~lib/builtins/i8",e.i16="~lib/builtins/i16",e.i32="~lib/builtins/i32",e.i64="~lib/builtins/i64",e.isize="~lib/builtins/isize",e.u8="~lib/builtins/u8",e.u16="~lib/builtins/u16",e.u32="~lib/builtins/u32",e.u64="~lib/builtins/u64",e.usize="~lib/builtins/usize",e.bool="~lib/builtins/bool",e.f32="~lib/builtins/f32",e.f64="~lib/builtins/f64",e.v128="~lib/builtins/v128",e.void_="~lib/builtins/void",e.i32_clz="~lib/builtins/i32.clz",e.i64_clz="~lib/builtins/i64.clz",e.i32_ctz="~lib/builtins/i32.ctz",e.i64_ctz="~lib/builtins/i64.ctz",e.i32_popcnt="~lib/builtins/i32.popcnt",e.i64_popcnt="~lib/builtins/i64.popcnt",e.i32_rotl="~lib/builtins/i32.rotl",e.i64_rotl="~lib/builtins/i64.rotl",e.i32_rotr="~lib/builtins/i32.rotr",e.i64_rotr="~lib/builtins/i64.rotr",e.f32_abs="~lib/builtins/f32.abs",e.f64_abs="~lib/builtins/f64.abs",e.f32_max="~lib/builtins/f32.max",e.f64_max="~lib/builtins/f64.max",e.f32_min="~lib/builtins/f32.min",e.f64_min="~lib/builtins/f64.min",e.f32_ceil="~lib/builtins/f32.ceil",e.f64_ceil="~lib/builtins/f64.ceil",e.f32_floor="~lib/builtins/f32.floor",e.f64_floor="~lib/builtins/f64.floor",e.f32_copysign="~lib/builtins/f32.copysign",e.f64_copysign="~lib/builtins/f64.copysign",e.f32_nearest="~lib/builtins/f32.nearest",e.f64_nearest="~lib/builtins/f64.nearest",e.i32_reinterpret_f32="~lib/builtins/i32.reinterpret_f32",e.i64_reinterpret_f64="~lib/builtins/i64.reinterpret_f64",e.f32_reinterpret_i32="~lib/builtins/f32.reinterpret_i32",e.f64_reinterpret_i64="~lib/builtins/f64.reinterpret_i64",e.f32_sqrt="~lib/builtins/f32.sqrt",e.f64_sqrt="~lib/builtins/f64.sqrt",e.f32_trunc="~lib/builtins/f32.trunc",e.f64_trunc="~lib/builtins/f64.trunc",e.i32_load8_s="~lib/builtins/i32.load8_s",e.i32_load8_u="~lib/builtins/i32.load8_u",e.i32_load16_s="~lib/builtins/i32.load16_s",e.i32_load16_u="~lib/builtins/i32.load16_u",e.i32_load="~lib/builtins/i32.load",e.i64_load8_s="~lib/builtins/i64.load8_s",e.i64_load8_u="~lib/builtins/i64.load8_u",e.i64_load16_s="~lib/builtins/i64.load16_s",e.i64_load16_u="~lib/builtins/i64.load16_u",e.i64_load32_s="~lib/builtins/i64.load32_s",e.i64_load32_u="~lib/builtins/i64.load32_u",e.i64_load="~lib/builtins/i64.load",e.f32_load="~lib/builtins/f32.load",e.f64_load="~lib/builtins/f64.load",e.i32_store8="~lib/builtins/i32.store8",e.i32_store16="~lib/builtins/i32.store16",e.i32_store="~lib/builtins/i32.store",e.i64_store8="~lib/builtins/i64.store8",e.i64_store16="~lib/builtins/i64.store16",e.i64_store32="~lib/builtins/i64.store32",e.i64_store="~lib/builtins/i64.store",e.f32_store="~lib/builtins/f32.store",e.f64_store="~lib/builtins/f64.store",e.i32_atomic_load8_u="~lib/builtins/i32.atomic.load8_u",e.i32_atomic_load16_u="~lib/builtins/i32.atomic.load16_u",e.i32_atomic_load="~lib/builtins/i32.atomic.load",e.i64_atomic_load8_u="~lib/builtins/i64.atomic.load8_u",e.i64_atomic_load16_u="~lib/builtins/i64.atomic.load16_u",e.i64_atomic_load32_u="~lib/builtins/i64.atomic.load32_u",e.i64_atomic_load="~lib/builtins/i64.atomic.load",e.i32_atomic_store8="~lib/builtins/i32.atomic.store8",e.i32_atomic_store16="~lib/builtins/i32.atomic.store16",e.i32_atomic_store="~lib/builtins/i32.atomic.store",e.i64_atomic_store8="~lib/builtins/i64.atomic.store8",e.i64_atomic_store16="~lib/builtins/i64.atomic.store16",e.i64_atomic_store32="~lib/builtins/i64.atomic.store32",e.i64_atomic_store="~lib/builtins/i64.atomic.store",e.i32_atomic_rmw8_u_add="~lib/builtins/i32.atomic.rmw8_u.add",e.i32_atomic_rmw16_u_add="~lib/builtins/i32.atomic.rmw16_u.add",e.i32_atomic_rmw_add="~lib/builtins/i32.atomic.rmw.add",e.i64_atomic_rmw8_u_add="~lib/builtins/i64.atomic.rmw8_u.add",e.i64_atomic_rmw16_u_add="~lib/builtins/i64.atomic.rmw16_u.add",e.i64_atomic_rmw32_u_add="~lib/builtins/i64.atomic.rmw32_u.add",e.i64_atomic_rmw_add="~lib/builtins/i64.atomic.rmw.add",e.i32_atomic_rmw8_u_sub="~lib/builtins/i32.atomic.rmw8_u.sub",e.i32_atomic_rmw16_u_sub="~lib/builtins/i32.atomic.rmw16_u.sub",e.i32_atomic_rmw_sub="~lib/builtins/i32.atomic.rmw.sub",e.i64_atomic_rmw8_u_sub="~lib/builtins/i64.atomic.rmw8_u.sub",e.i64_atomic_rmw16_u_sub="~lib/builtins/i64.atomic.rmw16_u.sub",e.i64_atomic_rmw32_u_sub="~lib/builtins/i64.atomic.rmw32_u.sub",e.i64_atomic_rmw_sub="~lib/builtins/i64.atomic.rmw.sub",e.i32_atomic_rmw8_u_and="~lib/builtins/i32.atomic.rmw8_u.and",e.i32_atomic_rmw16_u_and="~lib/builtins/i32.atomic.rmw16_u.and",e.i32_atomic_rmw_and="~lib/builtins/i32.atomic.rmw.and",e.i64_atomic_rmw8_u_and="~lib/builtins/i64.atomic.rmw8_u.and",e.i64_atomic_rmw16_u_and="~lib/builtins/i64.atomic.rmw16_u.and",e.i64_atomic_rmw32_u_and="~lib/builtins/i64.atomic.rmw32_u.and",e.i64_atomic_rmw_and="~lib/builtins/i64.atomic.rmw.and",e.i32_atomic_rmw8_u_or="~lib/builtins/i32.atomic.rmw8_u.or",e.i32_atomic_rmw16_u_or="~lib/builtins/i32.atomic.rmw16_u.or",e.i32_atomic_rmw_or="~lib/builtins/i32.atomic.rmw.or",e.i64_atomic_rmw8_u_or="~lib/builtins/i64.atomic.rmw8_u.or",e.i64_atomic_rmw16_u_or="~lib/builtins/i64.atomic.rmw16_u.or",e.i64_atomic_rmw32_u_or="~lib/builtins/i64.atomic.rmw32_u.or",e.i64_atomic_rmw_or="~lib/builtins/i64.atomic.rmw.or",e.i32_atomic_rmw8_u_xor="~lib/builtins/i32.atomic.rmw8_u.xor",e.i32_atomic_rmw16_u_xor="~lib/builtins/i32.atomic.rmw16_u.xor",e.i32_atomic_rmw_xor="~lib/builtins/i32.atomic.rmw.xor",e.i64_atomic_rmw8_u_xor="~lib/builtins/i64.atomic.rmw8_u.xor",e.i64_atomic_rmw16_u_xor="~lib/builtins/i64.atomic.rmw16_u.xor",e.i64_atomic_rmw32_u_xor="~lib/builtins/i64.atomic.rmw32_u.xor",e.i64_atomic_rmw_xor="~lib/builtins/i64.atomic.rmw.xor",e.i32_atomic_rmw8_u_xchg="~lib/builtins/i32.atomic.rmw8_u.xchg",e.i32_atomic_rmw16_u_xchg="~lib/builtins/i32.atomic.rmw16_u.xchg",e.i32_atomic_rmw_xchg="~lib/builtins/i32.atomic.rmw.xchg",e.i64_atomic_rmw8_u_xchg="~lib/builtins/i64.atomic.rmw8_u.xchg",e.i64_atomic_rmw16_u_xchg="~lib/builtins/i64.atomic.rmw16_u.xchg",e.i64_atomic_rmw32_u_xchg="~lib/builtins/i64.atomic.rmw32_u.xchg",e.i64_atomic_rmw_xchg="~lib/builtins/i64.atomic.rmw.xchg",e.i32_atomic_rmw8_u_cmpxchg="~lib/builtins/i32.atomic.rmw8_u.cmpxchg",e.i32_atomic_rmw16_u_cmpxchg="~lib/builtins/i32.atomic.rmw16_u.cmpxchg",e.i32_atomic_rmw_cmpxchg="~lib/builtins/i32.atomic.rmw.cmpxchg",e.i64_atomic_rmw8_u_cmpxchg="~lib/builtins/i64.atomic.rmw8_u.cmpxchg",e.i64_atomic_rmw16_u_cmpxchg="~lib/builtins/i64.atomic.rmw16_u.cmpxchg",e.i64_atomic_rmw32_u_cmpxchg="~lib/builtins/i64.atomic.rmw32_u.cmpxchg",e.i64_atomic_rmw_cmpxchg="~lib/builtins/i64.atomic.rmw.cmpxchg",e.i32_wait="~lib/builtins/i32.wait",e.i64_wait="~lib/builtins/i64.wait",e.i32_notify="~lib/builtins/i32.notify",e.i64_notify="~lib/builtins/i64.notify",e.ERROR="~lib/diagnostics/ERROR",e.WARNING="~lib/diagnostics/WARNING",e.INFO="~lib/diagnostics/INFO",e.HEAP_BASE="~lib/memory/HEAP_BASE",e.memory_size="~lib/memory/memory.size",e.memory_grow="~lib/memory/memory.grow",e.memory_copy="~lib/memory/memory.copy",e.memory_fill="~lib/memory/memory.fill",e.iterateRoots="~lib/gc/iterateRoots"}(i=t.BuiltinSymbols||(t.BuiltinSymbols={})),t.compileCall=_,t.compileAbort=m,t.compileIterateRoots=function(e){var t,r,i=e.module,a=new Array;try{for(var o=n(e.program.elementsByName.values()),p=o.next();!p.done;p=o.next()){var _=p.value;if(_.kind==l.ElementKind.GLOBAL){var h=_,d=h.type.classReference;if(h.is(u.CommonFlags.COMPILED)&&null!==d&&!d.hasDecorator(l.DecoratorFlags.UNMANAGED))if(h.is(u.CommonFlags.INLINED)){var y=h.constantIntegerValue;a.push(i.createCallIndirect(i.createGetLocal(0,c.NativeType.I32),[e.options.isWasm64?i.createI64(i64_low(y),i64_high(y)):i.createI32(i64_low(y))],"i_"))}else a.push(i.createCallIndirect(i.createGetLocal(0,c.NativeType.I32),[i.createGetGlobal(h.internalName,e.options.nativeSizeType)],"i_"))}}}catch(e){t={error:e}}finally{try{p&&!p.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}var m=e.ensureFunctionType([s.Type.i32],s.Type.void);i.addFunction("~iterateRoots",m,[],a.length?i.createBlock(null,a):i.createNop())},t.ensureGCHook=function e(t,r){var i,a,o=t.program;assert(r.type.isManaged(o));var p=r.gcHookIndex;if(-1!=p)return p;var _=r.members;if(r.isDeclaredInLibrary&&null!==_&&_.has("__gc")){var h=assert(_.get("__gc"));assert(h.kind==l.ElementKind.FUNCTION_PROTOTYPE);var d=assert(o.resolver.resolveFunction(h,null));assert(d.is(u.CommonFlags.PRIVATE|u.CommonFlags.INSTANCE)),assert(!d.isAny(u.CommonFlags.AMBIENT|u.CommonFlags.VIRTUAL)),assert(0==d.signature.parameterTypes.length),assert(d.signature.returnType==s.Type.void),d.internalName=r.internalName+"~gc",assert(t.compileFunction(d));var y=t.ensureFunctionTableEntry(d);return r.gcHookIndex=y,y}var m=t.module,g=t.options,T=g.nativeSizeType,f=g.usizeType.byteSize,E=new Array;E.push(m.createIf(m.createUnary(g.isWasm64?c.UnaryOp.EqzI64:c.UnaryOp.EqzI32,m.createGetLocal(0,T)),m.createReturn()));var I=t.functionTable,v=I.length;I.push(""),r.gcHookIndex=v;var b=r.base;if(b?(assert(b.type.isManaged(o)),E.push(m.createCallIndirect(m.createI32(e(t,b.type.classReference)),[m.createGetLocal(0,T)],T==c.NativeType.I64?"I_":"i_"))):E.push(m.createCall(assert(o.gcMarkInstance).internalName,[m.createGetLocal(0,T)],c.NativeType.None)),_)try{for(var S=n(_.values()),A=S.next();!A.done;A=S.next()){var N=A.value;if(N.kind==l.ElementKind.FIELD&&N.parent===r&&N.type.isManaged(o)){var C=N.memoryOffset;assert(C>=0),E.push(m.createCall(assert(o.gcMarkInstance).internalName,[m.createLoad(f,!1,m.createGetLocal(0,T),T,C)],c.NativeType.None))}}}catch(e){i={error:e}}finally{try{A&&!A.done&&(a=S.return)&&a.call(S)}finally{if(i)throw i.error}}var O=r.internalName+"~gc";return m.addFunction(O,t.ensureFunctionType(null,s.Type.void,g.usizeType),null,m.createBlock(null,E)),I[v]=O,v}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.bitsetIs=function(e,t){return assert(t>=0&&t<64),i64_ne(i64_and(e,i64_shl(i64_one,i64_new(t))),i64_zero)},t.bitsetSet=function(e,t,r){return assert(t>=0&&t<64),r?i64_or(e,i64_shl(i64_one,i64_new(t))):i64_and(e,i64_not(i64_shl(i64_one,i64_new(t))))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NULL=0]="NULL",e[e.LINEFEED=10]="LINEFEED",e[e.CARRIAGERETURN=13]="CARRIAGERETURN",e[e.LINESEPARATOR=8232]="LINESEPARATOR",e[e.PARAGRAPHSEPARATOR=8233]="PARAGRAPHSEPARATOR",e[e.NEXTLINE=133]="NEXTLINE",e[e.SPACE=32]="SPACE",e[e.NONBREAKINGSPACE=160]="NONBREAKINGSPACE",e[e.ENQUAD=8192]="ENQUAD",e[e.EMQUAD=8193]="EMQUAD",e[e.ENSPACE=8194]="ENSPACE",e[e.EMSPACE=8195]="EMSPACE",e[e.THREEPEREMSPACE=8196]="THREEPEREMSPACE",e[e.FOURPEREMSPACE=8197]="FOURPEREMSPACE",e[e.SIXPEREMSPACE=8198]="SIXPEREMSPACE",e[e.FIGURESPACE=8199]="FIGURESPACE",e[e.PUNCTUATIONSPACE=8200]="PUNCTUATIONSPACE",e[e.THINSPACE=8201]="THINSPACE",e[e.HAIRSPACE=8202]="HAIRSPACE",e[e.ZEROWIDTHSPACE=8203]="ZEROWIDTHSPACE",e[e.NARROWNOBREAKSPACE=8239]="NARROWNOBREAKSPACE",e[e.IDEOGRAPHICSPACE=12288]="IDEOGRAPHICSPACE",e[e.MATHEMATICALSPACE=8287]="MATHEMATICALSPACE",e[e.OGHAM=5760]="OGHAM",e[e._=95]="_",e[e._0=48]="_0",e[e._1=49]="_1",e[e._2=50]="_2",e[e._3=51]="_3",e[e._4=52]="_4",e[e._5=53]="_5",e[e._6=54]="_6",e[e._7=55]="_7",e[e._8=56]="_8",e[e._9=57]="_9",e[e.a=97]="a",e[e.b=98]="b",e[e.c=99]="c",e[e.d=100]="d",e[e.e=101]="e",e[e.f=102]="f",e[e.g=103]="g",e[e.h=104]="h",e[e.i=105]="i",e[e.j=106]="j",e[e.k=107]="k",e[e.l=108]="l",e[e.m=109]="m",e[e.n=110]="n",e[e.o=111]="o",e[e.p=112]="p",e[e.q=113]="q",e[e.r=114]="r",e[e.s=115]="s",e[e.t=116]="t",e[e.u=117]="u",e[e.v=118]="v",e[e.w=119]="w",e[e.x=120]="x",e[e.y=121]="y",e[e.z=122]="z",e[e.A=65]="A",e[e.B=66]="B",e[e.C=67]="C",e[e.D=68]="D",e[e.E=69]="E",e[e.F=70]="F",e[e.G=71]="G",e[e.H=72]="H",e[e.I=73]="I",e[e.J=74]="J",e[e.K=75]="K",e[e.L=76]="L",e[e.M=77]="M",e[e.N=78]="N",e[e.O=79]="O",e[e.P=80]="P",e[e.Q=81]="Q",e[e.R=82]="R",e[e.S=83]="S",e[e.T=84]="T",e[e.U=85]="U",e[e.V=86]="V",e[e.W=87]="W",e[e.X=88]="X",e[e.Y=89]="Y",e[e.Z=90]="Z",e[e.AMPERSAND=38]="AMPERSAND",e[e.ASTERISK=42]="ASTERISK",e[e.AT=64]="AT",e[e.BACKSLASH=92]="BACKSLASH",e[e.BACKTICK=96]="BACKTICK",e[e.BAR=124]="BAR",e[e.CARET=94]="CARET",e[e.CLOSEBRACE=125]="CLOSEBRACE",e[e.CLOSEBRACKET=93]="CLOSEBRACKET",e[e.CLOSEPAREN=41]="CLOSEPAREN",e[e.COLON=58]="COLON",e[e.COMMA=44]="COMMA",e[e.DOLLAR=36]="DOLLAR",e[e.DOT=46]="DOT",e[e.DOUBLEQUOTE=34]="DOUBLEQUOTE",e[e.EQUALS=61]="EQUALS",e[e.EXCLAMATION=33]="EXCLAMATION",e[e.GREATERTHAN=62]="GREATERTHAN",e[e.HASH=35]="HASH",e[e.LESSTHAN=60]="LESSTHAN",e[e.MINUS=45]="MINUS",e[e.OPENBRACE=123]="OPENBRACE",e[e.OPENBRACKET=91]="OPENBRACKET",e[e.OPENPAREN=40]="OPENPAREN",e[e.PERCENT=37]="PERCENT",e[e.PLUS=43]="PLUS",e[e.QUESTION=63]="QUESTION",e[e.SEMICOLON=59]="SEMICOLON",e[e.SINGLEQUOTE=39]="SINGLEQUOTE",e[e.SLASH=47]="SLASH",e[e.TILDE=126]="TILDE",e[e.BACKSPACE=8]="BACKSPACE",e[e.FORMFEED=12]="FORMFEED",e[e.BYTEORDERMARK=65279]="BYTEORDERMARK",e[e.TAB=9]="TAB",e[e.VERTICALTAB=11]="VERTICALTAB"}(t.CharCode||(t.CharCode={})),t.isLineBreak=function(e){switch(e){case 10:case 13:case 8232:case 8233:return!0;default:return!1}},t.isWhiteSpace=function(e){switch(e){case 32:case 9:case 11:case 12:case 160:case 133:case 5760:case 8239:case 8287:case 12288:case 65279:return!0;default:return e>=8192&&e<=8203}},t.isDecimalDigit=function(e){return e>=48&&e<=57},t.isOctalDigit=function(e){return e>=48&&e<=55},t.isIdentifierStart=function(e){return e>=65&&e<=90||e>=97&&e<=122||36==e||95==e||e>127&&!((t=e)<0||t>65535)&&a(t,n);var t},t.isKeywordCharacter=function(e){return e>=97&&e<=122},t.isIdentifierPart=function(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||36==e||95==e||e>127&&!((t=e)<0||t>65535)&&a(t,i);var t};var n=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,880,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1162,1319,1329,1366,1369,1369,1377,1415,1488,1514,1520,1522,1568,1610,1646,1647,1649,1747,1749,1749,1765,1766,1774,1775,1786,1788,1791,1791,1808,1808,1810,1839,1869,1957,1969,1969,1994,2026,2036,2037,2042,2042,2048,2069,2074,2074,2084,2084,2088,2088,2112,2136,2208,2208,2210,2220,2308,2361,2365,2365,2384,2384,2392,2401,2417,2423,2425,2431,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2493,2493,2510,2510,2524,2525,2527,2529,2544,2545,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2649,2652,2654,2654,2674,2676,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2749,2749,2768,2768,2784,2785,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2877,2877,2908,2909,2911,2913,2929,2929,2947,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3024,3024,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3133,3160,3161,3168,3169,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3261,3261,3294,3294,3296,3297,3313,3314,3333,3340,3342,3344,3346,3386,3389,3389,3406,3406,3424,3425,3450,3455,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3585,3632,3634,3635,3648,3654,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3760,3762,3763,3773,3773,3776,3780,3782,3782,3804,3807,3840,3840,3904,3911,3913,3948,3976,3980,4096,4138,4159,4159,4176,4181,4186,4189,4193,4193,4197,4198,4206,4208,4213,4225,4238,4238,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5905,5920,5937,5952,5969,5984,5996,5998,6e3,6016,6067,6103,6103,6108,6108,6176,6263,6272,6312,6314,6314,6320,6389,6400,6428,6480,6509,6512,6516,6528,6571,6593,6599,6656,6678,6688,6740,6823,6823,6917,6963,6981,6987,7043,7072,7086,7087,7098,7141,7168,7203,7245,7247,7258,7293,7401,7404,7406,7409,7413,7414,7424,7615,7680,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8305,8305,8319,8319,8336,8348,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11502,11506,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11648,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11823,11823,12293,12295,12321,12329,12337,12341,12344,12348,12353,12438,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42527,42538,42539,42560,42606,42623,42647,42656,42735,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43009,43011,43013,43015,43018,43020,43042,43072,43123,43138,43187,43250,43255,43259,43259,43274,43301,43312,43334,43360,43388,43396,43442,43471,43471,43520,43560,43584,43586,43588,43595,43616,43638,43642,43642,43648,43695,43697,43697,43701,43702,43705,43709,43712,43712,43714,43714,43739,43741,43744,43754,43762,43764,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44002,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64285,64287,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65136,65140,65142,65276,65313,65338,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500],i=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,768,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1155,1159,1162,1319,1329,1366,1369,1369,1377,1415,1425,1469,1471,1471,1473,1474,1476,1477,1479,1479,1488,1514,1520,1522,1552,1562,1568,1641,1646,1747,1749,1756,1759,1768,1770,1788,1791,1791,1808,1866,1869,1969,1984,2037,2042,2042,2048,2093,2112,2139,2208,2208,2210,2220,2276,2302,2304,2403,2406,2415,2417,2423,2425,2431,2433,2435,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2492,2500,2503,2504,2507,2510,2519,2519,2524,2525,2527,2531,2534,2545,2561,2563,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2620,2620,2622,2626,2631,2632,2635,2637,2641,2641,2649,2652,2654,2654,2662,2677,2689,2691,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2748,2757,2759,2761,2763,2765,2768,2768,2784,2787,2790,2799,2817,2819,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2876,2884,2887,2888,2891,2893,2902,2903,2908,2909,2911,2915,2918,2927,2929,2929,2946,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3006,3010,3014,3016,3018,3021,3024,3024,3031,3031,3046,3055,3073,3075,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3140,3142,3144,3146,3149,3157,3158,3160,3161,3168,3171,3174,3183,3202,3203,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3260,3268,3270,3272,3274,3277,3285,3286,3294,3294,3296,3299,3302,3311,3313,3314,3330,3331,3333,3340,3342,3344,3346,3386,3389,3396,3398,3400,3402,3406,3415,3415,3424,3427,3430,3439,3450,3455,3458,3459,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3530,3530,3535,3540,3542,3542,3544,3551,3570,3571,3585,3642,3648,3662,3664,3673,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3769,3771,3773,3776,3780,3782,3782,3784,3789,3792,3801,3804,3807,3840,3840,3864,3865,3872,3881,3893,3893,3895,3895,3897,3897,3902,3911,3913,3948,3953,3972,3974,3991,3993,4028,4038,4038,4096,4169,4176,4253,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4957,4959,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5908,5920,5940,5952,5971,5984,5996,5998,6e3,6002,6003,6016,6099,6103,6103,6108,6109,6112,6121,6155,6157,6160,6169,6176,6263,6272,6314,6320,6389,6400,6428,6432,6443,6448,6459,6470,6509,6512,6516,6528,6571,6576,6601,6608,6617,6656,6683,6688,6750,6752,6780,6783,6793,6800,6809,6823,6823,6912,6987,6992,7001,7019,7027,7040,7155,7168,7223,7232,7241,7245,7293,7376,7378,7380,7414,7424,7654,7676,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8204,8205,8255,8256,8276,8276,8305,8305,8319,8319,8336,8348,8400,8412,8417,8417,8421,8432,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11647,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11744,11775,11823,11823,12293,12295,12321,12335,12337,12341,12344,12348,12353,12438,12441,12442,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42539,42560,42607,42612,42621,42623,42647,42655,42737,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43047,43072,43123,43136,43204,43216,43225,43232,43255,43259,43259,43264,43309,43312,43347,43360,43388,43392,43456,43471,43481,43520,43574,43584,43597,43600,43609,43616,43638,43642,43643,43648,43714,43739,43741,43744,43759,43762,43766,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44010,44012,44013,44016,44025,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65024,65039,65056,65062,65075,65076,65101,65103,65136,65140,65142,65276,65296,65305,65313,65338,65343,65343,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500];function a(e,t){if(e=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},i=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return o};Object.defineProperty(t,"__esModule",{value:!0}),t.makeArray=function(e){if(void 0===e&&(e=null),e){for(var t=new Array(e.length),r=0,n=e.length;r0||i=0;)if(e.charCodeAt(a)==n){r-a==3&&46==e.charCodeAt(a+1)&&46==e.charCodeAt(a+2)||(e=t?e.substring(0,a):e.substring(0,a)+e.substring(r+3),i-=r+3-a,r=a-1);break}if(a<0&&r>0&&(2!=r||46!=e.charCodeAt(0)||46!=e.charCodeAt(1))){i=(e=e.substring(r+4)).length;continue}}}r++}return i>0?e:"."}function a(e){for(var t=e.length;--t>0;)if(e.charCodeAt(t)==n)return e.substring(0,t);return"."}t.normalizePath=i,t.resolvePath=function(e,t){return e.startsWith("std/")?e:i(a(t)+String.fromCharCode(n)+e)},t.dirname=a},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=" ",i=" ",a=" ";t.indent=function(e,t){for(;t>=4;)e.push(a),t-=4;t>=2&&(e.push(i),t-=2),t&&e.push(n)}},function(e,t,r){"use strict";function n(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function i(e,t,r){t[r]=e,t[r+1]=e>>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function a(e,t){var r=n(e,t),i=n(e,t+4);return i64_new(r,i)}Object.defineProperty(t,"__esModule",{value:!0}),t.readI8=function(e,t){return e[t]},t.writeI8=function(e,t,r){t[r]=e},t.readI16=function(e,t){return e[t]|e[t+1]<<8},t.writeI16=function(e,t,r){t[r]=e,t[r+1]=e>>>8},t.readI32=n,t.writeI32=i,t.readI64=a,t.writeI64=function(e,t,r){i(i64_low(e),t,r),i(i64_high(e),t,r+4)},t.readF32=function(e,t){return i32_as_f32(n(e,t))},t.writeF32=function(e,t,r){i(f32_as_i32(e),t,r)},t.readF64=function(e,t){return i64_as_f64(a(e,t))},t.writeF64=function(e,t,r){var n=f64_as_i64(e);i(i64_low(n),t,r),i(i64_high(n),t,r+4)}},function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(10),a=r(13),o=r(14),s=r(1);t.formatDiagnostic=s.formatDiagnosticMessage;var c=r(15);t.parseFile=function(e,t,r,n){return void 0===r&&(r=!1),void 0===n&&(n=null),n||(n=new c.Parser),n.parseFile(e,t,r),n},t.nextFile=function(e){return e.nextFile()},t.nextDiagnostic=function(e){var t=e.program;return t.diagnosticsOffset0&&!a.isLineBreak(n.charCodeAt(o-1));)o--;for(;s=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},o=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return o};Object.defineProperty(t,"__esModule",{value:!0});var s,c=r(0),l=r(1),p=r(6),u=r(5),_=r(9),h=r(12),d=function(){return function(e,t,r,n,i){this.localFile=e,this.localIdentifier=t,this.foreignIdentifier=r,this.foreignPath=n,this.foreignPathAlt=i}}(),y=function(){return function(e,t,r,n){this.localIdentifier=e,this.foreignIdentifier=t,this.foreignPath=r,this.foreignPathAlt=n}}(),m=function(){return function(e,t,r){this.foreignPath=e,this.foreignPathAlt=t,this.pathLiteral=r}}();function g(e,t){switch(assert(t.length),e){case u.DecoratorKind.OPERATOR:case u.DecoratorKind.OPERATOR_BINARY:switch(t.charCodeAt(0)){case 91:if("[]"==t)return s.INDEXED_GET;if("[]="==t)return s.INDEXED_SET;break;case 123:if("{}"==t)return s.UNCHECKED_INDEXED_GET;if("{}="==t)return s.UNCHECKED_INDEXED_SET;break;case 43:if("+"==t)return s.ADD;break;case 45:if("-"==t)return s.SUB;break;case 42:if("*"==t)return s.MUL;if("**"==t)return s.POW;break;case 47:if("/"==t)return s.DIV;break;case 37:if("%"==t)return s.REM;break;case 38:if("&"==t)return s.BITWISE_AND;break;case 124:if("|"==t)return s.BITWISE_OR;break;case 94:if("^"==t)return s.BITWISE_XOR;break;case 61:if("=="==t)return s.EQ;break;case 33:if("!="==t)return s.NE;break;case 62:if(">"==t)return s.GT;if(">="==t)return s.GE;if(">>"==t)return s.BITWISE_SHR;if(">>>"==t)return s.BITWISE_SHR_U;break;case 60:if("<"==t)return s.LT;if("<="==t)return s.LE;if("<<"==t)return s.BITWISE_SHL}break;case u.DecoratorKind.OPERATOR_PREFIX:switch(t.charCodeAt(0)){case 43:if("+"==t)return s.PLUS;if("++"==t)return s.PREFIX_INC;break;case 45:if("-"==t)return s.MINUS;if("--"==t)return s.PREFIX_DEC;break;case 33:if("!"==t)return s.NOT;break;case 126:if("~"==t)return s.BITWISE_NOT}break;case u.DecoratorKind.OPERATOR_POSTFIX:switch(t.charCodeAt(0)){case 43:if("++"==t)return s.POSTFIX_INC;break;case 45:if("--"==t)return s.POSTFIX_DEC}}return s.INVALID}!function(e){e[e.INVALID=0]="INVALID",e[e.INDEXED_GET=1]="INDEXED_GET",e[e.INDEXED_SET=2]="INDEXED_SET",e[e.UNCHECKED_INDEXED_GET=3]="UNCHECKED_INDEXED_GET",e[e.UNCHECKED_INDEXED_SET=4]="UNCHECKED_INDEXED_SET",e[e.ADD=5]="ADD",e[e.SUB=6]="SUB",e[e.MUL=7]="MUL",e[e.DIV=8]="DIV",e[e.REM=9]="REM",e[e.POW=10]="POW",e[e.BITWISE_AND=11]="BITWISE_AND",e[e.BITWISE_OR=12]="BITWISE_OR",e[e.BITWISE_XOR=13]="BITWISE_XOR",e[e.BITWISE_SHL=14]="BITWISE_SHL",e[e.BITWISE_SHR=15]="BITWISE_SHR",e[e.BITWISE_SHR_U=16]="BITWISE_SHR_U",e[e.EQ=17]="EQ",e[e.NE=18]="NE",e[e.GT=19]="GT",e[e.GE=20]="GE",e[e.LT=21]="LT",e[e.LE=22]="LE",e[e.PLUS=23]="PLUS",e[e.MINUS=24]="MINUS",e[e.NOT=25]="NOT",e[e.BITWISE_NOT=26]="BITWISE_NOT",e[e.PREFIX_INC=27]="PREFIX_INC",e[e.PREFIX_DEC=28]="PREFIX_DEC",e[e.POSTFIX_INC=29]="POSTFIX_INC",e[e.POSTFIX_DEC=30]="POSTFIX_DEC"}(s=t.OperatorKind||(t.OperatorKind={}));var T,f,E=function(e){function t(t){void 0===t&&(t=null);var r=e.call(this,t)||this;r.sources=[],r.diagnosticsOffset=0,r.explicitStartFunction=null,r.filesByName=new Map,r.elementsByName=new Map,r.elementsByDeclaration=new Map,r.instancesByName=new Map,r.typeClasses=new Map,r.arrayBufferInstance=null,r.arrayPrototype=null,r.stringInstance=null,r.abortInstance=null,r.memoryAllocateInstance=null,r.hasGC=!1,r.gcAllocateInstance=null,r.gcLinkInstance=null,r.gcMarkInstance=null,r.gcHeaderSize=0,r.gcHookOffset=0,r.nativeDummySignature=null;var n=new u.Source(c.LIBRARY_SUBST,"[native code]",u.SourceKind.LIBRARY);r.nativeSource=n;var i=new A(r,n);return r.nativeFile=i,r.filesByName.set(i.internalName,i),r.resolver=new _.Resolver(r),r}return i(t,e),t.prototype.makeNativeVariableDeclaration=function(e,t){void 0===t&&(t=c.CommonFlags.NONE);var r=this.nativeSource.range;return u.Node.createVariableDeclaration(u.Node.createIdentifierExpression(e,r),null,null,null,t,r)},t.prototype.makeNativeTypeDeclaration=function(e,t){void 0===t&&(t=c.CommonFlags.NONE);var r=this.nativeSource.range,n=u.Node.createIdentifierExpression(e,r);return u.Node.createTypeDeclaration(n,null,u.Node.createOmittedType(r),null,t,r)},t.prototype.makeNativeFunctionDeclaration=function(e,t){void 0===t&&(t=c.CommonFlags.NONE);var r=this.nativeSource.range;return u.Node.createFunctionDeclaration(u.Node.createIdentifierExpression(e,r),null,this.nativeDummySignature||(this.nativeDummySignature=u.Node.createSignature([],u.Node.createType(u.Node.createSimpleTypeName(c.CommonSymbols.void_,r),null,!1,r),null,!1,r)),null,null,t,r)},t.prototype.makeNativeNamespaceDeclaration=function(e,t){void 0===t&&(t=c.CommonFlags.NONE);var r=this.nativeSource.range;return u.Node.createNamespaceDeclaration(u.Node.createIdentifierExpression(e,r),[],null,t,r)},t.prototype.makeNativeFunction=function(e,t,r,n,i){return void 0===r&&(r=this.nativeFile),void 0===n&&(n=c.CommonFlags.NONE),void 0===i&&(i=f.NONE),new D(e,new B(e,r,this.makeNativeFunctionDeclaration(e,n),i),t)},t.prototype.getElementByDeclaration=function(e){var t=this.elementsByDeclaration;return assert(t.has(e)),t.get(e)},t.prototype.initialize=function(e){var t,r,n,i,s,_,h,d,y,m,g,E;this.options=e,this.registerNativeType(c.CommonSymbols.i8,p.Type.i8),this.registerNativeType(c.CommonSymbols.i16,p.Type.i16),this.registerNativeType(c.CommonSymbols.i32,p.Type.i32),this.registerNativeType(c.CommonSymbols.i64,p.Type.i64),this.registerNativeType(c.CommonSymbols.isize,e.isizeType),this.registerNativeType(c.CommonSymbols.u8,p.Type.u8),this.registerNativeType(c.CommonSymbols.u16,p.Type.u16),this.registerNativeType(c.CommonSymbols.u32,p.Type.u32),this.registerNativeType(c.CommonSymbols.u64,p.Type.u64),this.registerNativeType(c.CommonSymbols.usize,e.usizeType),this.registerNativeType(c.CommonSymbols.bool,p.Type.bool),this.registerNativeType(c.CommonSymbols.f32,p.Type.f32),this.registerNativeType(c.CommonSymbols.f64,p.Type.f64),this.registerNativeType(c.CommonSymbols.void_,p.Type.void),this.registerNativeType(c.CommonSymbols.number,p.Type.f64),this.registerNativeType(c.CommonSymbols.boolean,p.Type.bool),this.nativeFile.add(c.CommonSymbols.native,new N(c.CommonSymbols.native,this.nativeFile,this.makeNativeTypeDeclaration(c.CommonSymbols.native,c.CommonFlags.EXPORT|c.CommonFlags.GENERIC),f.BUILTIN)),e.hasFeature(8)&&this.registerNativeType(c.CommonSymbols.v128,p.Type.v128),this.registerConstantInteger(c.LibrarySymbols.ASC_TARGET,p.Type.i32,i64_new(e.isWasm64?2:1)),this.registerConstantInteger(c.LibrarySymbols.ASC_NO_ASSERT,p.Type.bool,i64_new(e.noAssert?1:0,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_MEMORY_BASE,p.Type.i32,i64_new(e.memoryBase,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_OPTIMIZE_LEVEL,p.Type.i32,i64_new(e.optimizeLevelHint,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_SHRINK_LEVEL,p.Type.i32,i64_new(e.shrinkLevelHint,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_FEATURE_MUTABLE_GLOBAL,p.Type.bool,i64_new(e.hasFeature(2)?1:0,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_FEATURE_SIGN_EXTENSION,p.Type.bool,i64_new(e.hasFeature(1)?1:0,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_FEATURE_BULK_MEMORY,p.Type.bool,i64_new(e.hasFeature(4)?1:0,0)),this.registerConstantInteger(c.LibrarySymbols.ASC_FEATURE_SIMD,p.Type.bool,i64_new(e.hasFeature(8)?1:0,0));for(var I=new Array,v=new Map,S=new Map,C=new Array,O=new Array,x=0,k=this.sources.length;x=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i,a,o=r(10);!function(e){e[e.None=_BinaryenTypeNone()]="None",e[e.I32=_BinaryenTypeInt32()]="I32",e[e.I64=_BinaryenTypeInt64()]="I64",e[e.F32=_BinaryenTypeFloat32()]="F32",e[e.F64=_BinaryenTypeFloat64()]="F64",e[e.V128=_BinaryenTypeVec128()]="V128",e[e.Unreachable=_BinaryenTypeUnreachable()]="Unreachable",e[e.Auto=_BinaryenTypeAuto()]="Auto"}(i=t.NativeType||(t.NativeType={})),function(e){e[e.Invalid=_BinaryenInvalidId()]="Invalid",e[e.Block=_BinaryenBlockId()]="Block",e[e.If=_BinaryenIfId()]="If",e[e.Loop=_BinaryenLoopId()]="Loop",e[e.Break=_BinaryenBreakId()]="Break",e[e.Switch=_BinaryenSwitchId()]="Switch",e[e.Call=_BinaryenCallId()]="Call",e[e.CallIndirect=_BinaryenCallIndirectId()]="CallIndirect",e[e.GetLocal=_BinaryenGetLocalId()]="GetLocal",e[e.SetLocal=_BinaryenSetLocalId()]="SetLocal",e[e.GetGlobal=_BinaryenGetGlobalId()]="GetGlobal",e[e.SetGlobal=_BinaryenSetGlobalId()]="SetGlobal",e[e.Load=_BinaryenLoadId()]="Load",e[e.Store=_BinaryenStoreId()]="Store",e[e.Const=_BinaryenConstId()]="Const",e[e.Unary=_BinaryenUnaryId()]="Unary",e[e.Binary=_BinaryenBinaryId()]="Binary",e[e.Select=_BinaryenSelectId()]="Select",e[e.Drop=_BinaryenDropId()]="Drop",e[e.Return=_BinaryenReturnId()]="Return",e[e.Host=_BinaryenHostId()]="Host",e[e.Nop=_BinaryenNopId()]="Nop",e[e.Unreachable=_BinaryenUnreachableId()]="Unreachable",e[e.AtomicCmpxchg=_BinaryenAtomicCmpxchgId()]="AtomicCmpxchg",e[e.AtomicRMW=_BinaryenAtomicRMWId()]="AtomicRMW",e[e.AtomicWait=_BinaryenAtomicWaitId()]="AtomicWait",e[e.AtomicWake=_BinaryenAtomicWakeId()]="AtomicWake",e[e.SIMDExtract=_BinaryenSIMDExtractId()]="SIMDExtract",e[e.SIMDReplace=_BinaryenSIMDReplaceId()]="SIMDReplace",e[e.SIMDShuffle=_BinaryenSIMDShuffleId()]="SIMDShuffle",e[e.SIMDBitselect=_BinaryenSIMDBitselectId()]="SIMDBitselect",e[e.SIMDShift=_BinaryenSIMDShiftId()]="SIMDShift",e[e.MemoryInit=_BinaryenMemoryInitId()]="MemoryInit",e[e.DataDrop=_BinaryenDataDropId()]="DataDrop",e[e.MemoryCopy=_BinaryenMemoryCopyId()]="MemoryCopy",e[e.MemoryFill=_BinaryenMemoryFillId()]="MemoryFill"}(a=t.ExpressionId||(t.ExpressionId={})),function(e){e[e.ClzI32=_BinaryenClzInt32()]="ClzI32",e[e.CtzI32=_BinaryenCtzInt32()]="CtzI32",e[e.PopcntI32=_BinaryenPopcntInt32()]="PopcntI32",e[e.NegF32=_BinaryenNegFloat32()]="NegF32",e[e.AbsF32=_BinaryenAbsFloat32()]="AbsF32",e[e.CeilF32=_BinaryenCeilFloat32()]="CeilF32",e[e.FloorF32=_BinaryenFloorFloat32()]="FloorF32",e[e.TruncF32=_BinaryenTruncFloat32()]="TruncF32",e[e.NearestF32=_BinaryenNearestFloat32()]="NearestF32",e[e.SqrtF32=_BinaryenSqrtFloat32()]="SqrtF32",e[e.EqzI32=_BinaryenEqZInt32()]="EqzI32",e[e.ClzI64=_BinaryenClzInt64()]="ClzI64",e[e.CtzI64=_BinaryenCtzInt64()]="CtzI64",e[e.PopcntI64=_BinaryenPopcntInt64()]="PopcntI64",e[e.NegF64=_BinaryenNegFloat64()]="NegF64",e[e.AbsF64=_BinaryenAbsFloat64()]="AbsF64",e[e.CeilF64=_BinaryenCeilFloat64()]="CeilF64",e[e.FloorF64=_BinaryenFloorFloat64()]="FloorF64",e[e.TruncF64=_BinaryenTruncFloat64()]="TruncF64",e[e.NearestF64=_BinaryenNearestFloat64()]="NearestF64",e[e.SqrtF64=_BinaryenSqrtFloat64()]="SqrtF64",e[e.EqzI64=_BinaryenEqZInt64()]="EqzI64",e[e.ExtendI32=_BinaryenExtendSInt32()]="ExtendI32",e[e.ExtendU32=_BinaryenExtendUInt32()]="ExtendU32",e[e.WrapI64=_BinaryenWrapInt64()]="WrapI64",e[e.TruncF32ToI32=_BinaryenTruncSFloat32ToInt32()]="TruncF32ToI32",e[e.TruncF32ToI64=_BinaryenTruncSFloat32ToInt64()]="TruncF32ToI64",e[e.TruncF32ToU32=_BinaryenTruncUFloat32ToInt32()]="TruncF32ToU32",e[e.TruncF32ToU64=_BinaryenTruncUFloat32ToInt64()]="TruncF32ToU64",e[e.TruncF64ToI32=_BinaryenTruncSFloat64ToInt32()]="TruncF64ToI32",e[e.TruncF64ToI64=_BinaryenTruncSFloat64ToInt64()]="TruncF64ToI64",e[e.TruncF64ToU32=_BinaryenTruncUFloat64ToInt32()]="TruncF64ToU32",e[e.TruncF64ToU64=_BinaryenTruncUFloat64ToInt64()]="TruncF64ToU64",e[e.ReinterpretF32=_BinaryenReinterpretFloat32()]="ReinterpretF32",e[e.ReinterpretF64=_BinaryenReinterpretFloat64()]="ReinterpretF64",e[e.ConvertI32ToF32=_BinaryenConvertSInt32ToFloat32()]="ConvertI32ToF32",e[e.ConvertI32ToF64=_BinaryenConvertSInt32ToFloat64()]="ConvertI32ToF64",e[e.ConvertU32ToF32=_BinaryenConvertUInt32ToFloat32()]="ConvertU32ToF32",e[e.ConvertU32ToF64=_BinaryenConvertUInt32ToFloat64()]="ConvertU32ToF64",e[e.ConvertI64ToF32=_BinaryenConvertSInt64ToFloat32()]="ConvertI64ToF32",e[e.ConvertI64ToF64=_BinaryenConvertSInt64ToFloat64()]="ConvertI64ToF64",e[e.ConvertU64ToF32=_BinaryenConvertUInt64ToFloat32()]="ConvertU64ToF32",e[e.ConvertU64ToF64=_BinaryenConvertUInt64ToFloat64()]="ConvertU64ToF64",e[e.PromoteF32=_BinaryenPromoteFloat32()]="PromoteF32",e[e.DemoteF64=_BinaryenDemoteFloat64()]="DemoteF64",e[e.ReinterpretI32=_BinaryenReinterpretInt32()]="ReinterpretI32",e[e.ReinterpretI64=_BinaryenReinterpretInt64()]="ReinterpretI64",e[e.ExtendI8ToI32=_BinaryenExtendS8Int32()]="ExtendI8ToI32",e[e.ExtendI16ToI32=_BinaryenExtendS16Int32()]="ExtendI16ToI32",e[e.ExtendI8ToI64=_BinaryenExtendS8Int64()]="ExtendI8ToI64",e[e.ExtendI16ToI64=_BinaryenExtendS16Int64()]="ExtendI16ToI64",e[e.ExtendI32ToI64=_BinaryenExtendS32Int64()]="ExtendI32ToI64"}(t.UnaryOp||(t.UnaryOp={})),function(e){e[e.AddI32=_BinaryenAddInt32()]="AddI32",e[e.SubI32=_BinaryenSubInt32()]="SubI32",e[e.MulI32=_BinaryenMulInt32()]="MulI32",e[e.DivI32=_BinaryenDivSInt32()]="DivI32",e[e.DivU32=_BinaryenDivUInt32()]="DivU32",e[e.RemI32=_BinaryenRemSInt32()]="RemI32",e[e.RemU32=_BinaryenRemUInt32()]="RemU32",e[e.AndI32=_BinaryenAndInt32()]="AndI32",e[e.OrI32=_BinaryenOrInt32()]="OrI32",e[e.XorI32=_BinaryenXorInt32()]="XorI32",e[e.ShlI32=_BinaryenShlInt32()]="ShlI32",e[e.ShrU32=_BinaryenShrUInt32()]="ShrU32",e[e.ShrI32=_BinaryenShrSInt32()]="ShrI32",e[e.RotlI32=_BinaryenRotLInt32()]="RotlI32",e[e.RotrI32=_BinaryenRotRInt32()]="RotrI32",e[e.EqI32=_BinaryenEqInt32()]="EqI32",e[e.NeI32=_BinaryenNeInt32()]="NeI32",e[e.LtI32=_BinaryenLtSInt32()]="LtI32",e[e.LtU32=_BinaryenLtUInt32()]="LtU32",e[e.LeI32=_BinaryenLeSInt32()]="LeI32",e[e.LeU32=_BinaryenLeUInt32()]="LeU32",e[e.GtI32=_BinaryenGtSInt32()]="GtI32",e[e.GtU32=_BinaryenGtUInt32()]="GtU32",e[e.GeI32=_BinaryenGeSInt32()]="GeI32",e[e.GeU32=_BinaryenGeUInt32()]="GeU32",e[e.AddI64=_BinaryenAddInt64()]="AddI64",e[e.SubI64=_BinaryenSubInt64()]="SubI64",e[e.MulI64=_BinaryenMulInt64()]="MulI64",e[e.DivI64=_BinaryenDivSInt64()]="DivI64",e[e.DivU64=_BinaryenDivUInt64()]="DivU64",e[e.RemI64=_BinaryenRemSInt64()]="RemI64",e[e.RemU64=_BinaryenRemUInt64()]="RemU64",e[e.AndI64=_BinaryenAndInt64()]="AndI64",e[e.OrI64=_BinaryenOrInt64()]="OrI64",e[e.XorI64=_BinaryenXorInt64()]="XorI64",e[e.ShlI64=_BinaryenShlInt64()]="ShlI64",e[e.ShrU64=_BinaryenShrUInt64()]="ShrU64",e[e.ShrI64=_BinaryenShrSInt64()]="ShrI64",e[e.RotlI64=_BinaryenRotLInt64()]="RotlI64",e[e.RotrI64=_BinaryenRotRInt64()]="RotrI64",e[e.EqI64=_BinaryenEqInt64()]="EqI64",e[e.NeI64=_BinaryenNeInt64()]="NeI64",e[e.LtI64=_BinaryenLtSInt64()]="LtI64",e[e.LtU64=_BinaryenLtUInt64()]="LtU64",e[e.LeI64=_BinaryenLeSInt64()]="LeI64",e[e.LeU64=_BinaryenLeUInt64()]="LeU64",e[e.GtI64=_BinaryenGtSInt64()]="GtI64",e[e.GtU64=_BinaryenGtUInt64()]="GtU64",e[e.GeI64=_BinaryenGeSInt64()]="GeI64",e[e.GeU64=_BinaryenGeUInt64()]="GeU64",e[e.AddF32=_BinaryenAddFloat32()]="AddF32",e[e.SubF32=_BinaryenSubFloat32()]="SubF32",e[e.MulF32=_BinaryenMulFloat32()]="MulF32",e[e.DivF32=_BinaryenDivFloat32()]="DivF32",e[e.CopysignF32=_BinaryenCopySignFloat32()]="CopysignF32",e[e.MinF32=_BinaryenMinFloat32()]="MinF32",e[e.MaxF32=_BinaryenMaxFloat32()]="MaxF32",e[e.EqF32=_BinaryenEqFloat32()]="EqF32",e[e.NeF32=_BinaryenNeFloat32()]="NeF32",e[e.LtF32=_BinaryenLtFloat32()]="LtF32",e[e.LeF32=_BinaryenLeFloat32()]="LeF32",e[e.GtF32=_BinaryenGtFloat32()]="GtF32",e[e.GeF32=_BinaryenGeFloat32()]="GeF32",e[e.AddF64=_BinaryenAddFloat64()]="AddF64",e[e.SubF64=_BinaryenSubFloat64()]="SubF64",e[e.MulF64=_BinaryenMulFloat64()]="MulF64",e[e.DivF64=_BinaryenDivFloat64()]="DivF64",e[e.CopysignF64=_BinaryenCopySignFloat64()]="CopysignF64",e[e.MinF64=_BinaryenMinFloat64()]="MinF64",e[e.MaxF64=_BinaryenMaxFloat64()]="MaxF64",e[e.EqF64=_BinaryenEqFloat64()]="EqF64",e[e.NeF64=_BinaryenNeFloat64()]="NeF64",e[e.LtF64=_BinaryenLtFloat64()]="LtF64",e[e.LeF64=_BinaryenLeFloat64()]="LeF64",e[e.GtF64=_BinaryenGtFloat64()]="GtF64",e[e.GeF64=_BinaryenGeFloat64()]="GeF64"}(t.BinaryOp||(t.BinaryOp={})),function(e){e[e.CurrentMemory=_BinaryenCurrentMemory()]="CurrentMemory",e[e.GrowMemory=_BinaryenGrowMemory()]="GrowMemory"}(t.HostOp||(t.HostOp={})),function(e){e[e.Add=_BinaryenAtomicRMWAdd()]="Add",e[e.Sub=_BinaryenAtomicRMWSub()]="Sub",e[e.And=_BinaryenAtomicRMWAnd()]="And",e[e.Or=_BinaryenAtomicRMWOr()]="Or",e[e.Xor=_BinaryenAtomicRMWXor()]="Xor",e[e.Xchg=_BinaryenAtomicRMWXchg()]="Xchg"}(t.AtomicRMWOp||(t.AtomicRMWOp={})),function(e){e[e.SplatVecI8x16=_BinaryenSplatVecI8x16()]="SplatVecI8x16",e[e.SplatVecI16x8=_BinaryenSplatVecI16x8()]="SplatVecI16x8",e[e.SplatVecI32x4=_BinaryenSplatVecI32x4()]="SplatVecI32x4",e[e.SplatVecI64x2=_BinaryenSplatVecI64x2()]="SplatVecI64x2",e[e.SplatVecF32x4=_BinaryenSplatVecF32x4()]="SplatVecF32x4",e[e.SplatVecF64x2=_BinaryenSplatVecF64x2()]="SplatVecF64x2",e[e.NotVec128=_BinaryenNotVec128()]="NotVec128",e[e.NegVecI8x16=_BinaryenNegVecI8x16()]="NegVecI8x16",e[e.AnyTrueVecI8x16=_BinaryenAnyTrueVecI8x16()]="AnyTrueVecI8x16",e[e.AllTrueVecI8x16=_BinaryenAllTrueVecI8x16()]="AllTrueVecI8x16",e[e.NegVecI16x8=_BinaryenNegVecI16x8()]="NegVecI16x8",e[e.AnyTrueVecI16x8=_BinaryenAnyTrueVecI16x8()]="AnyTrueVecI16x8",e[e.AllTrueVecI16x8=_BinaryenAllTrueVecI16x8()]="AllTrueVecI16x8",e[e.NegVecI32x4=_BinaryenNegVecI32x4()]="NegVecI32x4",e[e.AnyTrueVecI32x4=_BinaryenAnyTrueVecI32x4()]="AnyTrueVecI32x4",e[e.AllTrueVecI32x4=_BinaryenAllTrueVecI32x4()]="AllTrueVecI32x4",e[e.NegVecI64x2=_BinaryenNegVecI64x2()]="NegVecI64x2",e[e.AnyTrueVecI64x2=_BinaryenAnyTrueVecI64x2()]="AnyTrueVecI64x2",e[e.AllTrueVecI64x2=_BinaryenAllTrueVecI64x2()]="AllTrueVecI64x2",e[e.AbsVecF32x4=_BinaryenAbsVecF32x4()]="AbsVecF32x4",e[e.NegVecF32x4=_BinaryenNegVecF32x4()]="NegVecF32x4",e[e.SqrtVecF32x4=_BinaryenSqrtVecF32x4()]="SqrtVecF32x4",e[e.AbsVecF64x2=_BinaryenAbsVecF64x2()]="AbsVecF64x2",e[e.NegVecF64x2=_BinaryenNegVecF64x2()]="NegVecF64x2",e[e.SqrtVecF64x2=_BinaryenSqrtVecF64x2()]="SqrtVecF64x2",e[e.TruncSatSVecF32x4ToVecI32x4=_BinaryenTruncSatSVecF32x4ToVecI32x4()]="TruncSatSVecF32x4ToVecI32x4",e[e.TruncSatUVecF32x4ToVecI32x4=_BinaryenTruncSatUVecF32x4ToVecI32x4()]="TruncSatUVecF32x4ToVecI32x4",e[e.TruncSatSVecF64x2ToVecI64x2=_BinaryenTruncSatSVecF64x2ToVecI64x2()]="TruncSatSVecF64x2ToVecI64x2",e[e.TruncSatUVecF64x2ToVecI64x2=_BinaryenTruncSatUVecF64x2ToVecI64x2()]="TruncSatUVecF64x2ToVecI64x2",e[e.ConvertSVecI32x4ToVecF32x4=_BinaryenConvertSVecI32x4ToVecF32x4()]="ConvertSVecI32x4ToVecF32x4",e[e.ConvertUVecI32x4ToVecF32x4=_BinaryenConvertUVecI32x4ToVecF32x4()]="ConvertUVecI32x4ToVecF32x4",e[e.ConvertSVecI64x2ToVecF64x2=_BinaryenConvertSVecI64x2ToVecF64x2()]="ConvertSVecI64x2ToVecF64x2",e[e.ConvertUVecI64x2ToVecF64x2=_BinaryenConvertUVecI64x2ToVecF64x2()]="ConvertUVecI64x2ToVecF64x2",e[e.EqVecI8x16=_BinaryenEqVecI8x16()]="EqVecI8x16",e[e.NeVecI8x16=_BinaryenNeVecI8x16()]="NeVecI8x16",e[e.LtSVecI8x16=_BinaryenLtSVecI8x16()]="LtSVecI8x16",e[e.LtUVecI8x16=_BinaryenLtUVecI8x16()]="LtUVecI8x16",e[e.LeSVecI8x16=_BinaryenLeSVecI8x16()]="LeSVecI8x16",e[e.LeUVecI8x16=_BinaryenLeUVecI8x16()]="LeUVecI8x16",e[e.GtSVecI8x16=_BinaryenGtSVecI8x16()]="GtSVecI8x16",e[e.GtUVecI8x16=_BinaryenGtUVecI8x16()]="GtUVecI8x16",e[e.GeSVecI8x16=_BinaryenGeSVecI8x16()]="GeSVecI8x16",e[e.GeUVecI8x16=_BinaryenGeUVecI8x16()]="GeUVecI8x16",e[e.EqVecI16x8=_BinaryenEqVecI16x8()]="EqVecI16x8",e[e.NeVecI16x8=_BinaryenNeVecI16x8()]="NeVecI16x8",e[e.LtSVecI16x8=_BinaryenLtSVecI16x8()]="LtSVecI16x8",e[e.LtUVecI16x8=_BinaryenLtUVecI16x8()]="LtUVecI16x8",e[e.LeSVecI16x8=_BinaryenLeSVecI16x8()]="LeSVecI16x8",e[e.LeUVecI16x8=_BinaryenLeUVecI16x8()]="LeUVecI16x8",e[e.GtSVecI16x8=_BinaryenGtSVecI16x8()]="GtSVecI16x8",e[e.GtUVecI16x8=_BinaryenGtUVecI16x8()]="GtUVecI16x8",e[e.GeSVecI16x8=_BinaryenGeSVecI16x8()]="GeSVecI16x8",e[e.GeUVecI16x8=_BinaryenGeUVecI16x8()]="GeUVecI16x8",e[e.EqVecI32x4=_BinaryenEqVecI32x4()]="EqVecI32x4",e[e.NeVecI32x4=_BinaryenNeVecI32x4()]="NeVecI32x4",e[e.LtSVecI32x4=_BinaryenLtSVecI32x4()]="LtSVecI32x4",e[e.LtUVecI32x4=_BinaryenLtUVecI32x4()]="LtUVecI32x4",e[e.LeSVecI32x4=_BinaryenLeSVecI32x4()]="LeSVecI32x4",e[e.LeUVecI32x4=_BinaryenLeUVecI32x4()]="LeUVecI32x4",e[e.GtSVecI32x4=_BinaryenGtSVecI32x4()]="GtSVecI32x4",e[e.GtUVecI32x4=_BinaryenGtUVecI32x4()]="GtUVecI32x4",e[e.GeSVecI32x4=_BinaryenGeSVecI32x4()]="GeSVecI32x4",e[e.GeUVecI32x4=_BinaryenGeUVecI32x4()]="GeUVecI32x4",e[e.EqVecF32x4=_BinaryenEqVecF32x4()]="EqVecF32x4",e[e.NeVecF32x4=_BinaryenNeVecF32x4()]="NeVecF32x4",e[e.LtVecF32x4=_BinaryenLtVecF32x4()]="LtVecF32x4",e[e.LeVecF32x4=_BinaryenLeVecF32x4()]="LeVecF32x4",e[e.GtVecF32x4=_BinaryenGtVecF32x4()]="GtVecF32x4",e[e.GeVecF32x4=_BinaryenGeVecF32x4()]="GeVecF32x4",e[e.EqVecF64x2=_BinaryenEqVecF64x2()]="EqVecF64x2",e[e.NeVecF64x2=_BinaryenNeVecF64x2()]="NeVecF64x2",e[e.LtVecF64x2=_BinaryenLtVecF64x2()]="LtVecF64x2",e[e.LeVecF64x2=_BinaryenLeVecF64x2()]="LeVecF64x2",e[e.GtVecF64x2=_BinaryenGtVecF64x2()]="GtVecF64x2",e[e.GeVecF64x2=_BinaryenGeVecF64x2()]="GeVecF64x2",e[e.AndVec128=_BinaryenAndVec128()]="AndVec128",e[e.OrVec128=_BinaryenOrVec128()]="OrVec128",e[e.XorVec128=_BinaryenXorVec128()]="XorVec128",e[e.AddVecI8x16=_BinaryenAddVecI8x16()]="AddVecI8x16",e[e.AddSatSVecI8x16=_BinaryenAddSatSVecI8x16()]="AddSatSVecI8x16",e[e.AddSatUVecI8x16=_BinaryenAddSatUVecI8x16()]="AddSatUVecI8x16",e[e.SubVecI8x16=_BinaryenSubVecI8x16()]="SubVecI8x16",e[e.SubSatSVecI8x16=_BinaryenSubSatSVecI8x16()]="SubSatSVecI8x16",e[e.SubSatUVecI8x16=_BinaryenSubSatUVecI8x16()]="SubSatUVecI8x16",e[e.MulVecI8x16=_BinaryenMulVecI8x16()]="MulVecI8x16",e[e.AddVecI16x8=_BinaryenAddVecI16x8()]="AddVecI16x8",e[e.AddSatSVecI16x8=_BinaryenAddSatSVecI16x8()]="AddSatSVecI16x8",e[e.AddSatUVecI16x8=_BinaryenAddSatUVecI16x8()]="AddSatUVecI16x8",e[e.SubVecI16x8=_BinaryenSubVecI16x8()]="SubVecI16x8",e[e.SubSatSVecI16x8=_BinaryenSubSatSVecI16x8()]="SubSatSVecI16x8",e[e.SubSatUVecI16x8=_BinaryenSubSatUVecI16x8()]="SubSatUVecI16x8",e[e.MulVecI16x8=_BinaryenMulVecI16x8()]="MulVecI16x8",e[e.AddVecI32x4=_BinaryenAddVecI32x4()]="AddVecI32x4",e[e.SubVecI32x4=_BinaryenSubVecI32x4()]="SubVecI32x4",e[e.MulVecI32x4=_BinaryenMulVecI32x4()]="MulVecI32x4",e[e.AddVecI64x2=_BinaryenAddVecI64x2()]="AddVecI64x2",e[e.SubVecI64x2=_BinaryenSubVecI64x2()]="SubVecI64x2",e[e.AddVecF32x4=_BinaryenAddVecF32x4()]="AddVecF32x4",e[e.SubVecF32x4=_BinaryenSubVecF32x4()]="SubVecF32x4",e[e.MulVecF32x4=_BinaryenMulVecF32x4()]="MulVecF32x4",e[e.DivVecF32x4=_BinaryenDivVecF32x4()]="DivVecF32x4",e[e.MinVecF32x4=_BinaryenMinVecF32x4()]="MinVecF32x4",e[e.MaxVecF32x4=_BinaryenMaxVecF32x4()]="MaxVecF32x4",e[e.AddVecF64x2=_BinaryenAddVecF64x2()]="AddVecF64x2",e[e.SubVecF64x2=_BinaryenSubVecF64x2()]="SubVecF64x2",e[e.MulVecF64x2=_BinaryenMulVecF64x2()]="MulVecF64x2",e[e.DivVecF64x2=_BinaryenDivVecF64x2()]="DivVecF64x2",e[e.MinVecF64x2=_BinaryenMinVecF64x2()]="MinVecF64x2",e[e.MaxVecF64x2=_BinaryenMaxVecF64x2()]="MaxVecF64x2"}(t.SIMDOp||(t.SIMDOp={}));var s=function(){function e(){}return e.create=function(t,r){var n=new e;return n.buffer=t,n.offset=r,n},e}();t.MemorySegment=s;var c=function(){function e(){this.hasTemporaryFunction=!1,this.cachedPrecomputeNames=0,this.cachedStrings=new Map}return e.create=function(){var t=new e;return t.ref=_BinaryenModuleCreate(),t.lit=memory.allocate(_BinaryenSizeofLiteral()),t},e.createFrom=function(t){var r=p(t);try{var n=new e;return n.ref=_BinaryenModuleRead(r,t.length),n.lit=memory.allocate(_BinaryenSizeofLiteral()),n}finally{memory.free(changetype(r))}},e.prototype.addFunctionType=function(e,t,r){var n=this.allocStringCached(e),i=u(r);try{return _BinaryenAddFunctionType(this.ref,n,t,i,r?r.length:0)}finally{memory.free(i)}},e.prototype.getFunctionTypeBySignature=function(e,t){var r=u(t);try{return _BinaryenGetFunctionTypeBySignature(this.ref,e,r,t?t.length:0)}finally{memory.free(r)}},e.prototype.removeFunctionType=function(e){var t=this.allocStringCached(e);_BinaryenRemoveFunctionType(this.ref,t)},e.prototype.createI32=function(e){var t=this.lit;return _BinaryenLiteralInt32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createI64=function(e,t){void 0===t&&(t=0);var r=this.lit;return _BinaryenLiteralInt64(r,e,t),_BinaryenConst(this.ref,r)},e.prototype.createF32=function(e){var t=this.lit;return _BinaryenLiteralFloat32(t,e),_BinaryenConst(this.ref,t)},e.prototype.createF64=function(e){var t=this.lit;return _BinaryenLiteralFloat64(t,e),_BinaryenConst(this.ref,t)},e.prototype.createV128=function(e){assert(16==e.length);for(var t=this.lit,r=0;r<16;++r)store(t+r,e[r]);return _BinaryenLiteralVec128(t,t),_BinaryenConst(this.ref,t)},e.prototype.createUnary=function(e,t){return _BinaryenUnary(this.ref,e,t)},e.prototype.createBinary=function(e,t,r){return _BinaryenBinary(this.ref,e,t,r)},e.prototype.createHost=function(e,t,r){void 0===t&&(t=null),void 0===r&&(r=null);var n=this.allocStringCached(t),i=_(r);try{return _BinaryenHost(this.ref,e,n,i,r?r.length:0)}finally{memory.free(i)}},e.prototype.createGetLocal=function(e,t){return _BinaryenGetLocal(this.ref,e,t)},e.prototype.createTeeLocal=function(e,t){return _BinaryenTeeLocal(this.ref,e,t)},e.prototype.createGetGlobal=function(e,t){var r=this.allocStringCached(e);return _BinaryenGetGlobal(this.ref,r,t)},e.prototype.createLoad=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenLoad(this.ref,e,t?1:0,i,e,n,r)},e.prototype.createStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenStore(this.ref,e,i,e,t,r,n)},e.prototype.createAtomicLoad=function(e,t,r,n){return void 0===n&&(n=0),_BinaryenAtomicLoad(this.ref,e,n,r,t)},e.prototype.createAtomicStore=function(e,t,r,n,i){return void 0===i&&(i=0),_BinaryenAtomicStore(this.ref,e,i,t,r,n)},e.prototype.createAtomicRMW=function(e,t,r,n,i,a){return _BinaryenAtomicRMW(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicCmpxchg=function(e,t,r,n,i,a){return _BinaryenAtomicCmpxchg(this.ref,e,t,r,n,i,a)},e.prototype.createAtomicWait=function(e,t,r,n){return _BinaryenAtomicWait(this.ref,e,t,r,n)},e.prototype.createAtomicWake=function(e,t){return _BinaryenAtomicWake(this.ref,e,t)},e.prototype.createSetLocal=function(e,t){return _BinaryenSetLocal(this.ref,e,t)},e.prototype.createSetGlobal=function(e,t){var r=this.allocStringCached(e);return _BinaryenSetGlobal(this.ref,r,t)},e.prototype.createBlock=function(e,t,r){void 0===r&&(r=i.None);var n=this.allocStringCached(e),a=_(t);try{return _BinaryenBlock(this.ref,n,a,t.length,r)}finally{memory.free(a)}},e.prototype.createBreak=function(e,t,r){void 0===t&&(t=0),void 0===r&&(r=0);var n=this.allocStringCached(e);return _BinaryenBreak(this.ref,n,t,r)},e.prototype.createDrop=function(e){return _BinaryenDrop(this.ref,e)},e.prototype.createLoop=function(e,t){var r=this.allocStringCached(e);return _BinaryenLoop(this.ref,r,t)},e.prototype.createIf=function(e,t,r){return void 0===r&&(r=0),_BinaryenIf(this.ref,e,t,r)},e.prototype.createNop=function(){return _BinaryenNop(this.ref)},e.prototype.createReturn=function(e){return void 0===e&&(e=0),_BinaryenReturn(this.ref,e)},e.prototype.createSelect=function(e,t,r){return _BinaryenSelect(this.ref,r,e,t)},e.prototype.createSwitch=function(e,t,r,n){void 0===n&&(n=0);for(var i=e.length,a=new Array(i),o=0;o=0;--d)memory.free(l[d])}},e.prototype.setFunctionTable=function(e,t,r){for(var n=r.length,i=new Array(n),a=0;a=0;--i)memory.free(n[i])}},e.prototype.precomputeExpression=function(e){var t=_BinaryenGetOptimizeLevel(),r=_BinaryenGetShrinkLevel(),n=_BinaryenGetDebugInfo();_BinaryenSetOptimizeLevel(4),_BinaryenSetShrinkLevel(0),_BinaryenSetDebugInfo(!1);var i=_BinaryenExpressionGetType(e),a=this.addTemporaryFunction(i,null,e),o=this.cachedPrecomputeNames;return o||(this.cachedPrecomputeNames=o=u([this.allocStringCached("precompute")])),_BinaryenFunctionRunPasses(a,this.ref,o,1),e=_BinaryenFunctionGetBody(a),this.removeTemporaryFunction(),_BinaryenSetOptimizeLevel(t),_BinaryenSetShrinkLevel(r),_BinaryenSetDebugInfo(n),e},e.prototype.validate=function(){return 1==_BinaryenModuleValidate(this.ref)},e.prototype.interpret=function(){_BinaryenModuleInterpret(this.ref)},e.prototype.toBinary=function(e){var t=this.lit;assert(_BinaryenSizeofLiteral()>=12);var r=h(e),n=0,i=0;try{_BinaryenModuleAllocateAndWrite(t,this.ref,r),n=d(t);var a=d(t+4);i=d(t+8);var o=new m;return o.output=function(e,t){for(var r=new Uint8Array(t),n=0;n>8&255),store(r+2,a>>16&255),store(r+3,a>>>24),r+=4}return t}function _(e){return u(e)}function h(e){if(null==e)return 0;for(var t=memory.allocate(function(e){for(var t=0,r=0,n=e.length;r=55296&&i<=57343&&r+1=55296&&a<=57343&&n+1>>6),store(r++,128|63&a)):a<=65535?(store(r++,224|a>>>12),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=2097151?(store(r++,240|a>>>18),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):a<=67108863?(store(r++,248|a>>>24),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a)):(store(r++,252|a>>>30),store(r++,128|a>>>24&63),store(r++,128|a>>>18&63),store(r++,128|a>>>12&63),store(r++,128|a>>>6&63),store(r++,128|63&a))}return store(r,0),t}function d(e){return load(e)|load(e+1)<<8|load(e+2)<<16|load(e+3)<<24}function y(e){if(!e)return null;for(var t,r,n,i,a,o=new Array;t=load(e++);)128&t?(r=63&load(e++),192!=(224&t)?(n=63&load(e++),224==(240&t)?t=(15&t)<<12|r<<6|n:(i=63&load(e++),240==(248&t)?t=(7&t)<<18|r<<12|n<<6|i:(a=63&load(e++),t=248==(252&t)?(3&t)<<24|r<<18|n<<12|i<<6|a:(1&t)<<30|r<<24|n<<18|i<<12|a<<6|63&load(e++))),o.push(t)):o.push((31&t)<<6|r)):o.push(t);return String.fromCodePoints(o)}t.Relooper=l,t.readString=y;var m=function(){return function(){}}();t.BinaryModule=m,t.needsExplicitUnreachable=function e(t){switch(_BinaryenExpressionGetType(t)){case i.I32:case i.I64:case i.F32:case i.F64:return!1}switch(_BinaryenExpressionGetId(t)){case a.Unreachable:case a.Return:return!1;case a.Break:return 0!=_BinaryenBreakGetCondition(t);case a.Block:if(!_BinaryenBlockGetName(t)){var r=_BinaryenBlockGetNumChildren(t);return r>0&&e(_BinaryenBlockGetChild(t,r-1))}}return!0}},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var a=r(0),o=r(7);t.Token=o.Token,t.Range=o.Range;var s,c=r(2);!function(e){e[e.SOURCE=0]="SOURCE",e[e.TYPE=1]="TYPE",e[e.TYPENAME=2]="TYPENAME",e[e.TYPEPARAMETER=3]="TYPEPARAMETER",e[e.PARAMETER=4]="PARAMETER",e[e.SIGNATURE=5]="SIGNATURE",e[e.IDENTIFIER=6]="IDENTIFIER",e[e.ASSERTION=7]="ASSERTION",e[e.BINARY=8]="BINARY",e[e.CALL=9]="CALL",e[e.CLASS=10]="CLASS",e[e.COMMA=11]="COMMA",e[e.ELEMENTACCESS=12]="ELEMENTACCESS",e[e.FALSE=13]="FALSE",e[e.FUNCTION=14]="FUNCTION",e[e.INSTANCEOF=15]="INSTANCEOF",e[e.LITERAL=16]="LITERAL",e[e.NEW=17]="NEW",e[e.NULL=18]="NULL",e[e.PARENTHESIZED=19]="PARENTHESIZED",e[e.PROPERTYACCESS=20]="PROPERTYACCESS",e[e.TERNARY=21]="TERNARY",e[e.SUPER=22]="SUPER",e[e.THIS=23]="THIS",e[e.TRUE=24]="TRUE",e[e.CONSTRUCTOR=25]="CONSTRUCTOR",e[e.UNARYPOSTFIX=26]="UNARYPOSTFIX",e[e.UNARYPREFIX=27]="UNARYPREFIX",e[e.BLOCK=28]="BLOCK",e[e.BREAK=29]="BREAK",e[e.CONTINUE=30]="CONTINUE",e[e.DO=31]="DO",e[e.EMPTY=32]="EMPTY",e[e.EXPORT=33]="EXPORT",e[e.EXPORTIMPORT=34]="EXPORTIMPORT",e[e.EXPRESSION=35]="EXPRESSION",e[e.FOR=36]="FOR",e[e.IF=37]="IF",e[e.IMPORT=38]="IMPORT",e[e.RETURN=39]="RETURN",e[e.SWITCH=40]="SWITCH",e[e.THROW=41]="THROW",e[e.TRY=42]="TRY",e[e.VARIABLE=43]="VARIABLE",e[e.VOID=44]="VOID",e[e.WHILE=45]="WHILE",e[e.CLASSDECLARATION=46]="CLASSDECLARATION",e[e.ENUMDECLARATION=47]="ENUMDECLARATION",e[e.ENUMVALUEDECLARATION=48]="ENUMVALUEDECLARATION",e[e.FIELDDECLARATION=49]="FIELDDECLARATION",e[e.FUNCTIONDECLARATION=50]="FUNCTIONDECLARATION",e[e.IMPORTDECLARATION=51]="IMPORTDECLARATION",e[e.INDEXSIGNATUREDECLARATION=52]="INDEXSIGNATUREDECLARATION",e[e.INTERFACEDECLARATION=53]="INTERFACEDECLARATION",e[e.METHODDECLARATION=54]="METHODDECLARATION",e[e.NAMESPACEDECLARATION=55]="NAMESPACEDECLARATION",e[e.TYPEDECLARATION=56]="TYPEDECLARATION",e[e.VARIABLEDECLARATION=57]="VARIABLEDECLARATION",e[e.DECORATOR=58]="DECORATOR",e[e.EXPORTMEMBER=59]="EXPORTMEMBER",e[e.SWITCHCASE=60]="SWITCHCASE",e[e.COMMENT=61]="COMMENT"}(s=t.NodeKind||(t.NodeKind={})),t.nodeIsConstantValue=function(e){switch(e){case s.LITERAL:case s.NULL:case s.TRUE:case s.FALSE:return!0}return!1},t.nodeIsCallable=function(e){switch(e){case s.IDENTIFIER:case s.ASSERTION:case s.CALL:case s.ELEMENTACCESS:case s.PARENTHESIZED:case s.PROPERTYACCESS:case s.SUPER:return!0}return!1},t.nodeIsGenericCallable=function(e){switch(e){case s.IDENTIFIER:case s.PROPERTYACCESS:return!0}return!1};var l=function(){function e(){}return e.createTypeName=function(e,t){var r=new u;return r.range=t,r.identifier=e,r.next=null,r},e.createSimpleTypeName=function(t,r){return e.createTypeName(e.createIdentifierExpression(t,r),r)},e.createType=function(e,t,r,n){var i=new _;return i.range=n,i.name=e,i.typeArguments=t,i.isNullable=r,i},e.createOmittedType=function(t){return e.createType(e.createSimpleTypeName("",t),null,!1,t)},e.createTypeParameter=function(e,t,r,n){var i=new h;return i.range=n,i.name=e,i.extendsType=t,i.defaultType=r,i},e.createParameter=function(e,t,r,n,i){var a=new d;return a.range=i,a.name=e,a.type=t,a.initializer=r,a.parameterKind=n,a},e.createSignature=function(e,t,r,n,i){var a=new m;return a.range=i,a.parameters=e,a.returnType=t,a.explicitThisType=r,a.isNullable=n,a},e.createDecorator=function(e,t,r){var n=new T;return n.range=r,n.name=e,n.arguments=t,n.decoratorKind=g(e),n},e.createComment=function(e,t,r){var n=new f;return n.range=r,n.commentKind=t,n.text=e,n},e.createIdentifierExpression=function(e,t,r){void 0===r&&(r=!1);var n=new v;return n.range=t,n.text=e,n.symbol=e,n.isQuoted=r,n},e.createEmptyIdentifierExpression=function(e){var t=new v;return t.range=e,t.text="",t},e.createArrayLiteralExpression=function(e,t){var r=new S;return r.range=t,r.elementExpressions=e,r},e.createAssertionExpression=function(e,t,r,n){var i=new A;return i.range=n,i.assertionKind=e,i.expression=t,i.toType=r,i},e.createBinaryExpression=function(e,t,r,n){var i=new N;return i.range=n,i.operator=e,i.left=t,i.right=r,i},e.createCallExpression=function(e,t,r,n){var i=new C;return i.range=n,i.expression=e,i.typeArguments=t,i.arguments=r,i},e.createClassExpression=function(e){var t=new O;return t.range=e.range,t.declaration=e,t},e.createCommaExpression=function(e,t){var r=new x;return r.range=t,r.expressions=e,r},e.createConstructorExpression=function(e){var t=new k;return t.range=e,t},e.createElementAccessExpression=function(e,t,r){var n=new L;return n.range=r,n.expression=e,n.elementExpression=t,n},e.createFalseExpression=function(e){var t=new X;return t.range=e,t},e.createFloatLiteralExpression=function(e,t){var r=new R;return r.range=t,r.value=e,r},e.createFunctionExpression=function(e){var t=new F;return t.range=e.range,t.declaration=e,t},e.createInstanceOfExpression=function(e,t,r){var n=new B;return n.range=r,n.expression=e,n.isType=t,n},e.createIntegerLiteralExpression=function(e,t){var r=new D;return r.range=t,r.value=e,r},e.createNewExpression=function(e,t,r,n){var i=new U;return i.range=n,i.expression=e,i.typeArguments=t,i.arguments=r,i},e.createNullExpression=function(e){var t=new P;return t.range=e,t},e.createObjectLiteralExpression=function(e,t,r){var n=new w;return n.range=r,n.names=e,n.values=t,n},e.createParenthesizedExpression=function(e,t){var r=new M;return r.range=t,r.expression=e,r},e.createPropertyAccessExpression=function(e,t,r){var n=new G;return n.range=r,n.expression=e,n.property=t,n},e.createRegexpLiteralExpression=function(e,t,r){var n=new V;return n.range=r,n.pattern=e,n.patternFlags=t,n},e.createTernaryExpression=function(e,t,r,n){var i=new K;return i.range=n,i.condition=e,i.ifThen=t,i.ifElse=r,i},e.createStringLiteralExpression=function(e,t){var r=new z;return r.range=t,r.value=e,r},e.createSuperExpression=function(e){var t=new H;return t.range=e,t},e.createThisExpression=function(e){var t=new Y;return t.range=e,t},e.createTrueExpression=function(e){var t=new W;return t.range=e,t},e.createUnaryPostfixExpression=function(e,t,r){var n=new q;return n.range=r,n.operator=e,n.operand=t,n},e.createUnaryPrefixExpression=function(e,t,r){var n=new j;return n.range=r,n.operator=e,n.operand=t,n},e.createBlockStatement=function(e,t){var r=new ne;return r.range=t,r.statements=e,r},e.createBreakStatement=function(e,t){var r=new ie;return r.range=t,r.label=e,r},e.createClassDeclaration=function(e,t,r,n,i,a,o,s){var c=new ae;return c.range=s,c.flags=o,c.name=e,c.typeParameters=t,c.extendsType=r,c.implementsTypes=n,c.members=i,c.decorators=a,c},e.createContinueStatement=function(e,t){var r=new oe;return r.range=t,r.label=e,r},e.createDoStatement=function(e,t,r){var n=new se;return n.range=r,n.statement=e,n.condition=t,n},e.createEmptyStatement=function(e){var t=new ce;return t.range=e,t},e.createEnumDeclaration=function(e,t,r,n,i){var a=new le;return a.range=i,a.flags=n,a.name=e,a.values=t,a.decorators=r,a},e.createEnumValueDeclaration=function(e,t,r,n){var i=new pe;return i.range=n,i.flags=r,i.name=e,i.value=t,i},e.createExportStatement=function(e,t,r,n){var i=new he;if(i.range=n,i.members=e,i.path=t,t){var a=c.normalizePath(t.value);t.value.startsWith(".")?i.normalizedPath=c.resolvePath(a,n.source.normalizedPath):i.normalizedPath=a,i.internalPath=Be(i.normalizedPath)}else i.normalizedPath=null,i.internalPath=null;return i.isDeclare=r,i},e.createExportImportStatement=function(e,t,r){var n=new ue;return n.range=r,n.name=e,n.externalName=t,n},e.createExportMember=function(e,t,r){var n=new _e;return n.range=r,n.localName=e,t||(t=e),n.exportedName=t,n},e.createExpressionStatement=function(e){var t=new de;return t.range=e.range,t.expression=e,t},e.createIfStatement=function(e,t,r,n){var i=new Te;return i.range=n,i.condition=e,i.ifTrue=t,i.ifFalse=r,i},e.createImportStatement=function(e,t,r){var n=new Ee;n.range=r,n.declarations=e,n.namespaceName=null,n.path=t;var i=c.normalizePath(t.value);return t.value.startsWith(".")?n.normalizedPath=c.resolvePath(i,r.source.normalizedPath):(i.startsWith(a.LIBRARY_PREFIX)||(i=a.LIBRARY_PREFIX+i),n.normalizedPath=i),n.internalPath=Be(n.normalizedPath),n},e.createImportStatementWithWildcard=function(e,t,r){var n=new Ee;return n.range=r,n.declarations=null,n.namespaceName=e,n.path=t,n.normalizedPath=c.resolvePath(c.normalizePath(t.value),r.source.normalizedPath),n.internalPath=Be(n.normalizedPath),n},e.createImportDeclaration=function(e,t,r){var n=new fe;return n.range=r,n.foreignName=e,t||(t=e),n.name=t,n},e.createInterfaceDeclaration=function(e,t,r,n,i,a,o){var s=new Ie;return s.range=o,s.flags=a,s.name=e,s.typeParameters=t,s.extendsType=r,s.members=n,s.decorators=i,s},e.createFieldDeclaration=function(e,t,r,n,i,a){var o=new ye;return o.range=a,o.flags=i,o.name=e,o.type=t,o.initializer=r,o.decorators=n,o},e.createForStatement=function(e,t,r,n,i){var a=new me;return a.range=i,a.initializer=e,a.condition=t,a.incrementor=r,a.statement=n,a},e.createFunctionDeclaration=function(e,t,r,n,i,a,o){var s=new ge;return s.range=o,s.flags=a,s.name=e,s.typeParameters=t,s.signature=r,s.body=n,s.decorators=i,s},e.createIndexSignatureDeclaration=function(e,t,r){var n=new te;return n.range=r,n.keyType=e,n.valueType=t,n},e.createMethodDeclaration=function(e,t,r,n,i,a,o){var s=new ve;return s.range=o,s.flags=a,s.name=e,s.typeParameters=t,s.signature=r,s.body=n,s.decorators=i,s},e.createNamespaceDeclaration=function(e,t,r,n,i){var a=new be;return a.range=i,a.flags=n,a.name=e,a.members=t,a.decorators=r,a},e.createReturnStatement=function(e,t){var r=new Se;return r.range=t,r.value=e,r},e.createSwitchStatement=function(e,t,r){var n=new Ne;return n.range=r,n.condition=e,n.cases=t,n},e.createSwitchCase=function(e,t,r){var n=new Ae;return n.range=r,n.label=e,n.statements=t,n},e.createThrowStatement=function(e,t){var r=new Ce;return r.range=t,r.value=e,r},e.createTryStatement=function(e,t,r,n,i){var a=new Oe;return a.range=i,a.statements=e,a.catchVariable=t,a.catchStatements=r,a.finallyStatements=n,a},e.createTypeDeclaration=function(e,t,r,n,i,a){var o=new xe;return o.range=a,o.flags=i,o.name=e,o.typeParameters=t,o.type=r,o.decorators=n,o},e.createVariableStatement=function(e,t,r){var n=new Le;return n.range=r,n.declarations=e,n.decorators=t,n},e.createVariableDeclaration=function(e,t,r,n,i,a){var o=new ke;return o.range=a,o.flags=i,o.name=e,o.type=t,o.initializer=r,o.decorators=n,o},e.createVoidStatement=function(e,t){var r=new Re;return r.range=t,r.expression=e,r},e.createWhileStatement=function(e,t,r){var n=new Fe;return n.range=r,n.condition=e,n.statement=t,n},e}();t.Node=l;var p=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}(l);t.CommonTypeNode=p;var u=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPENAME,t}return i(t,e),t}(l);t.TypeName=u;var _=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPE,t}return i(t,e),t}(p);t.TypeNode=_;var h=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEPARAMETER,t}return i(t,e),t}(l);t.TypeParameterNode=h,function(e){e[e.DEFAULT=0]="DEFAULT",e[e.OPTIONAL=1]="OPTIONAL",e[e.REST=2]="REST"}(t.ParameterKind||(t.ParameterKind={}));var d=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.PARAMETER,t.implicitFieldDeclaration=null,t.flags=a.CommonFlags.NONE,t}return i(t,e),t.prototype.is=function(e){return(this.flags&e)==e},t.prototype.isAny=function(e){return 0!=(this.flags&e)},t.prototype.set=function(e){this.flags|=e},t}(l);t.ParameterNode=d;var y,m=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SIGNATURE,t}return i(t,e),t}(p);function g(e){if(e.kind==s.IDENTIFIER){var t=e.text;switch(assert(t.length),t.charCodeAt(0)){case 98:if("builtin"==t)return y.BUILTIN;break;case 101:if("external"==t)return y.EXTERNAL;break;case 103:if("global"==t)return y.GLOBAL;break;case 105:if("inline"==t)return y.INLINE;break;case 108:if("lazy"==t)return y.LAZY;break;case 111:if("operator"==t)return y.OPERATOR;break;case 115:if("sealed"==t)return y.SEALED;if("start"==t)return y.START;break;case 117:if("unmanaged"==t)return y.UNMANAGED}}else if(e.kind==s.PROPERTYACCESS&&e.expression.kind==s.IDENTIFIER){t=e.expression.text;assert(t.length);var r=e.property.text;if(assert(r.length),"operator"==t)switch(r.charCodeAt(0)){case 98:if("binary"==r)return y.OPERATOR_BINARY;break;case 112:switch(r){case"prefix":return y.OPERATOR_PREFIX;case"postfix":return y.OPERATOR_POSTFIX}}}return y.CUSTOM}t.SignatureNode=m,function(e){e[e.CUSTOM=0]="CUSTOM",e[e.GLOBAL=1]="GLOBAL",e[e.OPERATOR=2]="OPERATOR",e[e.OPERATOR_BINARY=3]="OPERATOR_BINARY",e[e.OPERATOR_PREFIX=4]="OPERATOR_PREFIX",e[e.OPERATOR_POSTFIX=5]="OPERATOR_POSTFIX",e[e.UNMANAGED=6]="UNMANAGED",e[e.SEALED=7]="SEALED",e[e.INLINE=8]="INLINE",e[e.EXTERNAL=9]="EXTERNAL",e[e.BUILTIN=10]="BUILTIN",e[e.LAZY=11]="LAZY",e[e.START=12]="START"}(y=t.DecoratorKind||(t.DecoratorKind={})),t.decoratorNameToKind=g;var T=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DECORATOR,t}return i(t,e),t}(l);t.DecoratorNode=T,function(e){e[e.LINE=0]="LINE",e[e.TRIPLE=1]="TRIPLE",e[e.BLOCK=2]="BLOCK"}(t.CommentKind||(t.CommentKind={}));var f=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.COMMENT,t}return i(t,e),t}(l);t.CommentNode=f;var E=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}(l);t.Expression=E;var I,v=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IDENTIFIER,t}return i(t,e),t}(E);t.IdentifierExpression=v,function(e){e[e.FLOAT=0]="FLOAT",e[e.INTEGER=1]="INTEGER",e[e.STRING=2]="STRING",e[e.REGEXP=3]="REGEXP",e[e.ARRAY=4]="ARRAY",e[e.OBJECT=5]="OBJECT"}(I=t.LiteralKind||(t.LiteralKind={}));var b=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.LITERAL,t}return i(t,e),t}(E);t.LiteralExpression=b;var S=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=I.ARRAY,t}return i(t,e),t}(b);t.ArrayLiteralExpression=S,function(e){e[e.PREFIX=0]="PREFIX",e[e.AS=1]="AS",e[e.NONNULL=2]="NONNULL"}(t.AssertionKind||(t.AssertionKind={}));var A=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ASSERTION,t}return i(t,e),t}(E);t.AssertionExpression=A;var N=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BINARY,t}return i(t,e),t}(E);t.BinaryExpression=N;var C=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CALL,t}return i(t,e),t}(E);t.CallExpression=C;var O=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASS,t}return i(t,e),t}(E);t.ClassExpression=O;var x=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.COMMA,t}return i(t,e),t}(E);t.CommaExpression=x;var k=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONSTRUCTOR,t.text="constructor",t.symbol=a.CommonSymbols.constructor,t}return i(t,e),t}(v);t.ConstructorExpression=k;var L=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ELEMENTACCESS,t}return i(t,e),t}(E);t.ElementAccessExpression=L;var R=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=I.FLOAT,t}return i(t,e),t}(b);t.FloatLiteralExpression=R;var F=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTION,t}return i(t,e),t}(E);t.FunctionExpression=F;var B=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INSTANCEOF,t}return i(t,e),t}(E);t.InstanceOfExpression=B;var D=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=I.INTEGER,t}return i(t,e),t}(b);t.IntegerLiteralExpression=D;var U=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NEW,t}return i(t,e),t}(C);t.NewExpression=U;var P=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NULL,t.text="null",t.symbol=a.CommonSymbols.null_,t}return i(t,e),t}(v);t.NullExpression=P;var w=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=I.OBJECT,t}return i(t,e),t}(b);t.ObjectLiteralExpression=w;var M=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.PARENTHESIZED,t}return i(t,e),t}(E);t.ParenthesizedExpression=M;var G=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.PROPERTYACCESS,t}return i(t,e),t}(E);t.PropertyAccessExpression=G;var V=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=I.REGEXP,t}return i(t,e),t}(b);t.RegexpLiteralExpression=V;var K=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TERNARY,t}return i(t,e),t}(E);t.TernaryExpression=K;var z=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.literalKind=I.STRING,t}return i(t,e),t}(b);t.StringLiteralExpression=z;var H=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SUPER,t.text="super",t.symbol=a.CommonSymbols.super_,t}return i(t,e),t}(v);t.SuperExpression=H;var Y=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THIS,t.text="this",t.symbol=a.CommonSymbols.this_,t}return i(t,e),t}(v);t.ThisExpression=Y;var W=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRUE,t.text="true",t.symbol=a.CommonSymbols.true_,t}return i(t,e),t}(v);t.TrueExpression=W;var X=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FALSE,t.text="false",t.symbol=a.CommonSymbols.false_,t}return i(t,e),t}(v);t.FalseExpression=X;var Q=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}(E);t.UnaryExpression=Q;var q=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.UNARYPOSTFIX,t}return i(t,e),t}(Q);t.UnaryPostfixExpression=q;var j=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.UNARYPREFIX,t}return i(t,e),t}(Q);t.UnaryPrefixExpression=j;var Z,J=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}(l);t.Statement=J,function(e){e[e.DEFAULT=0]="DEFAULT",e[e.ENTRY=1]="ENTRY",e[e.LIBRARY=2]="LIBRARY"}(Z=t.SourceKind||(t.SourceKind={}));var $=function(e){function t(t,r,n){var i=e.call(this)||this;i.kind=s.SOURCE,i.parent=null,i.tokenizer=null,i.debugInfoIndex=-1,i.exportPaths=null,i.sourceKind=n,i.normalizedPath=t;var c=Be(i.normalizedPath);i.internalPath=c;var l=c.lastIndexOf(a.PATH_DELIMITER);return i.simplePath=l>=0?c.substring(l+1):c,i.statements=new Array,i.range=new o.Range(i,0,r.length),i.text=r,i}return i(t,e),Object.defineProperty(t.prototype,"isEntry",{get:function(){return this.sourceKind==Z.ENTRY},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"isLibrary",{get:function(){return this.sourceKind==Z.LIBRARY},enumerable:!0,configurable:!0}),t}(l);t.Source=$;var ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.decorators=null,t.flags=a.CommonFlags.NONE,t}return i(t,e),t.prototype.is=function(e){return(this.flags&e)==e},t.prototype.isAny=function(e){return 0!=(this.flags&e)},t.prototype.set=function(e){this.flags|=e},t}(J);t.DeclarationStatement=ee;var te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INDEXSIGNATUREDECLARATION,t}return i(t,e),t}(ee);t.IndexSignatureDeclaration=te;var re=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return i(t,e),t}(ee);t.VariableLikeDeclarationStatement=re;var ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BLOCK,t}return i(t,e),t}(J);t.BlockStatement=ne;var ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.BREAK,t}return i(t,e),t}(J);t.BreakStatement=ie;var ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CLASSDECLARATION,t}return i(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t}(ee);t.ClassDeclaration=ae;var oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.CONTINUE,t}return i(t,e),t}(J);t.ContinueStatement=oe;var se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.DO,t}return i(t,e),t}(J);t.DoStatement=se;var ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EMPTY,t}return i(t,e),t}(J);t.EmptyStatement=ce;var le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMDECLARATION,t}return i(t,e),t}(ee);t.EnumDeclaration=le;var pe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.ENUMVALUEDECLARATION,t}return i(t,e),t}(re);t.EnumValueDeclaration=pe;var ue=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTIMPORT,t}return i(t,e),t}(l);t.ExportImportStatement=ue;var _e=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORTMEMBER,t}return i(t,e),t}(l);t.ExportMember=_e;var he=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPORT,t}return i(t,e),t}(J);t.ExportStatement=he;var de=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.EXPRESSION,t}return i(t,e),t}(J);t.ExpressionStatement=de;var ye=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FIELDDECLARATION,t.parameterIndex=-1,t}return i(t,e),t}(re);t.FieldDeclaration=ye;var me=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FOR,t}return i(t,e),t}(J);t.ForStatement=me;var ge=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.FUNCTIONDECLARATION,t}return i(t,e),Object.defineProperty(t.prototype,"isGeneric",{get:function(){var e=this.typeParameters;return null!=e&&e.length>0},enumerable:!0,configurable:!0}),t.prototype.clone=function(){return l.createFunctionDeclaration(this.name,this.typeParameters,this.signature,this.body,this.decorators,this.flags,this.range)},t}(ee);t.FunctionDeclaration=ge;var Te=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IF,t}return i(t,e),t}(J);t.IfStatement=Te;var fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORTDECLARATION,t}return i(t,e),t}(ee);t.ImportDeclaration=fe;var Ee=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.IMPORT,t}return i(t,e),t}(J);t.ImportStatement=Ee;var Ie=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.INTERFACEDECLARATION,t}return i(t,e),t}(ae);t.InterfaceDeclaration=Ie;var ve=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.METHODDECLARATION,t}return i(t,e),t}(ge);t.MethodDeclaration=ve;var be=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.NAMESPACEDECLARATION,t}return i(t,e),t}(ee);t.NamespaceDeclaration=be;var Se=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.RETURN,t}return i(t,e),t}(J);t.ReturnStatement=Se;var Ae=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCHCASE,t}return i(t,e),t}(l);t.SwitchCase=Ae;var Ne=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.SWITCH,t}return i(t,e),t}(J);t.SwitchStatement=Ne;var Ce=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.THROW,t}return i(t,e),t}(J);t.ThrowStatement=Ce;var Oe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TRY,t}return i(t,e),t}(J);t.TryStatement=Oe;var xe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.TYPEDECLARATION,t}return i(t,e),t}(ee);t.TypeDeclaration=xe;var ke=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLEDECLARATION,t}return i(t,e),t}(re);t.VariableDeclaration=ke;var Le=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VARIABLE,t}return i(t,e),t}(J);t.VariableStatement=Le;var Re=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.VOID,t}return i(t,e),t}(J);t.VoidStatement=Re;var Fe=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.kind=s.WHILE,t}return i(t,e),t}(J);function Be(e){return e.endsWith(".ts")&&(e=e.substring(0,e.length-3)),e}t.WhileStatement=Fe,t.findDecorator=function(e,t){if(t)for(var r=0,n=t.length;r>>e.size-t},e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.asClass=function(t){assert(9==this.kind&&!this.classReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.classReference=t,r},e.prototype.asFunction=function(t){assert(7==this.kind&&!this.signatureReference);var r=new e(this.kind,-129&this.flags|256,this.size);return r.signatureReference=t,r},e.prototype.asNullable=function(){return assert(this.is(256)),this.cachedNullableType||(assert(!this.is(512)),this.cachedNullableType=new e(this.kind,512|this.flags,this.size),this.cachedNullableType.nonNullableType=this,this.cachedNullableType.classReference=this.classReference,this.cachedNullableType.signatureReference=this.signatureReference),this.cachedNullableType},e.prototype.isAssignableTo=function(t,r){var n,i,a,o;if(void 0===r&&(r=!1),this.is(256)){if(t.is(256)&&(!this.is(512)||t.is(512)))if(n=this.classReference){if(i=t.classReference)return n.isAssignableTo(i)}else if((a=this.signatureReference)&&(o=t.signatureReference))return a.isAssignableTo(o)}else if(!t.is(256))if(this.is(4))if(t.is(4)){if(!r||this==e.bool||this.is(1)==t.is(1))return this.size<=t.size}else{if(11==t.kind)return this.size<=23;if(12==t.kind)return this.size<=52}else if(this.is(8)){if(t.is(8))return this.size<=t.size}else if(this.is(1024)&&t.is(1024))return this.size==t.size;return!1},e.commonCompatible=function(e,t,r){return t.isAssignableTo(e,r)?e:e.isAssignableTo(t,r)?t:null},e.prototype.toString=function(e){if(void 0===e&&(e=!1),!e&&this.is(256)){var t=this.classReference;if(t)return this.is(512)?t.name+" | null":t.name;var r=this.signatureReference;if(r)return this.is(512)?"("+r.toString(!0)+") | null":r.toString(!0);assert(!1)}switch(this.kind){case 0:return"i8";case 1:return"i16";case 2:return"i32";case 3:return"i64";case 4:return"isize";case 5:return"u8";case 6:return"u16";case 7:return"u32";case 8:return"u64";case 9:return"usize";case 10:return"bool";case 11:return"f32";case 12:return"f64";case 13:return"v128";default:assert(!1);case 14:return"void"}},e.prototype.toNativeType=function(){switch(this.kind){default:return i.NativeType.I32;case 3:case 8:return i.NativeType.I64;case 4:case 9:return 64==this.size?i.NativeType.I64:i.NativeType.I32;case 11:return i.NativeType.F32;case 12:return i.NativeType.F64;case 13:return i.NativeType.V128;case 14:return i.NativeType.None}},e.prototype.toNativeZero=function(e){switch(this.kind){case 14:assert(!1);default:return e.createI32(0);case 4:case 9:if(64!=this.size)return e.createI32(0);case 3:case 8:return e.createI64(0);case 11:return e.createF32(0);case 12:return e.createF64(0);case 13:return e.createV128(a)}},e.prototype.toNativeOne=function(e){switch(this.kind){case 13:case 14:assert(!1);default:return e.createI32(1);case 4:case 9:if(64!=this.size)return e.createI32(1);case 3:case 8:return e.createI64(1);case 11:return e.createF32(1);case 12:return e.createF64(1)}},e.prototype.toNativeNegOne=function(e){switch(this.kind){case 13:case 14:assert(!1);default:return e.createI32(-1);case 4:case 9:if(64!=this.size)return e.createI32(-1);case 3:case 8:return e.createI64(-1,-1);case 11:return e.createF32(-1);case 12:return e.createF64(-1)}},e.prototype.toSignatureString=function(){switch(this.kind){default:return"i";case 3:case 8:return"I";case 4:case 9:return 64==this.size?"I":"i";case 11:return"f";case 12:return"F";case 13:return"v";case 14:return"_"}},e.i8=new e(0,165,8),e.i16=new e(1,165,16),e.i32=new e(2,133,32),e.i64=new e(3,197,64),e.isize32=new e(4,149,32),e.isize64=new e(4,213,64),e.u8=new e(5,166,8),e.u16=new e(6,166,16),e.u32=new e(7,134,32),e.u64=new e(8,198,64),e.usize32=new e(9,150,32),e.usize64=new e(9,214,64),e.bool=new e(10,166,1),e.f32=new e(11,137,32),e.f64=new e(12,201,64),e.v128=new e(13,1152,128),e.void=new e(14,0,0),e}();t.Type=o,t.typesToNativeTypes=function(e){for(var t=e.length,r=new Array(t),n=0;ne?t[e]:l(e)},e.prototype.isAssignableTo=function(e){var t=this.thisType,r=e.thisType;if(t){if(!r||!t.isAssignableTo(r))return!1}else if(r)return!1;if(this.hasRest!=e.hasRest)return!1;var n=this.parameterTypes,i=e.parameterTypes,a=n.length;if(a!=i.length)return!1;for(var o=0;o=c&&u!=p?t.push("?: "):t.push(": "),t.push(i[u].toString());return t.push(") => "),t.push(this.returnType.toString()),t.join("")},e}();t.Signature=s;var c=null;function l(e){c||(c=[]);for(var t=c.length;t<=e;++t)c.push("arg$"+t.toString(10));return c[e-1]}t.getDefaultParameterName=l},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,"__esModule",{value:!0});var a,o,s=r(1),c=r(5),l=r(2);function p(e){switch(assert(e.length),e.charCodeAt(0)){case 97:switch(e){case"abstract":return a.ABSTRACT;case"as":return a.AS;case"async":return a.ASYNC;case"await":return a.AWAIT}break;case 98:switch(e){case"break":return a.BREAK}break;case 99:switch(e){case"case":return a.CASE;case"catch":return a.CATCH;case"class":return a.CLASS;case"continue":return a.CONTINUE;case"const":return a.CONST;case"constructor":return a.CONSTRUCTOR}break;case 100:switch(e){case"debugger":return a.DEBUGGER;case"declare":return a.DECLARE;case"default":return a.DEFAULT;case"delete":return a.DELETE;case"do":return a.DO}break;case 101:switch(e){case"else":return a.ELSE;case"enum":return a.ENUM;case"export":return a.EXPORT;case"extends":return a.EXTENDS}break;case 102:switch(e){case"false":return a.FALSE;case"finally":return a.FINALLY;case"for":return a.FOR;case"from":return a.FROM;case"function":return a.FUNCTION}break;case 103:switch(e){case"get":return a.GET}break;case 105:switch(e){case"if":return a.IF;case"implements":return a.IMPLEMENTS;case"import":return a.IMPORT;case"in":return a.IN;case"instanceof":return a.INSTANCEOF;case"interface":return a.INTERFACE;case"is":return a.IS}break;case 107:switch(e){case"keyof":return a.KEYOF}break;case 108:switch(e){case"let":return a.LET}break;case 109:switch(e){case"module":return a.MODULE}break;case 110:switch(e){case"namespace":return a.NAMESPACE;case"new":return a.NEW;case"null":return a.NULL}break;case 111:switch(e){case"of":return a.OF}break;case 112:switch(e){case"package":return a.PACKAGE;case"private":return a.PRIVATE;case"protected":return a.PROTECTED;case"public":return a.PUBLIC}break;case 114:switch(e){case"readonly":return a.READONLY;case"return":return a.RETURN}break;case 115:switch(e){case"set":return a.SET;case"static":return a.STATIC;case"super":return a.SUPER;case"switch":return a.SWITCH}break;case 116:switch(e){case"this":return a.THIS;case"throw":return a.THROW;case"true":return a.TRUE;case"try":return a.TRY;case"type":return a.TYPE;case"typeof":return a.TYPEOF}break;case 118:switch(e){case"var":return a.VAR;case"void":return a.VOID}break;case 119:switch(e){case"while":return a.WHILE;case"with":return a.WITH}break;case 121:switch(e){case"yield":return a.YIELD}}return a.INVALID}function u(e){switch(e){case a.ABSTRACT:case a.AS:case a.CONSTRUCTOR:case a.DECLARE:case a.DELETE:case a.FROM:case a.FOR:case a.GET:case a.IS:case a.KEYOF:case a.MODULE:case a.NAMESPACE:case a.READONLY:case a.SET:case a.TYPE:case a.VOID:return!0;default:return!1}}!function(e){e[e.ABSTRACT=0]="ABSTRACT",e[e.AS=1]="AS",e[e.ASYNC=2]="ASYNC",e[e.AWAIT=3]="AWAIT",e[e.BREAK=4]="BREAK",e[e.CASE=5]="CASE",e[e.CATCH=6]="CATCH",e[e.CLASS=7]="CLASS",e[e.CONST=8]="CONST",e[e.CONTINUE=9]="CONTINUE",e[e.CONSTRUCTOR=10]="CONSTRUCTOR",e[e.DEBUGGER=11]="DEBUGGER",e[e.DECLARE=12]="DECLARE",e[e.DEFAULT=13]="DEFAULT",e[e.DELETE=14]="DELETE",e[e.DO=15]="DO",e[e.ELSE=16]="ELSE",e[e.ENUM=17]="ENUM",e[e.EXPORT=18]="EXPORT",e[e.EXTENDS=19]="EXTENDS",e[e.FALSE=20]="FALSE",e[e.FINALLY=21]="FINALLY",e[e.FOR=22]="FOR",e[e.FROM=23]="FROM",e[e.FUNCTION=24]="FUNCTION",e[e.GET=25]="GET",e[e.IF=26]="IF",e[e.IMPLEMENTS=27]="IMPLEMENTS",e[e.IMPORT=28]="IMPORT",e[e.IN=29]="IN",e[e.INSTANCEOF=30]="INSTANCEOF",e[e.INTERFACE=31]="INTERFACE",e[e.IS=32]="IS",e[e.KEYOF=33]="KEYOF",e[e.LET=34]="LET",e[e.MODULE=35]="MODULE",e[e.NAMESPACE=36]="NAMESPACE",e[e.NEW=37]="NEW",e[e.NULL=38]="NULL",e[e.OF=39]="OF",e[e.PACKAGE=40]="PACKAGE",e[e.PRIVATE=41]="PRIVATE",e[e.PROTECTED=42]="PROTECTED",e[e.PUBLIC=43]="PUBLIC",e[e.READONLY=44]="READONLY",e[e.RETURN=45]="RETURN",e[e.SET=46]="SET",e[e.STATIC=47]="STATIC",e[e.SUPER=48]="SUPER",e[e.SWITCH=49]="SWITCH",e[e.THIS=50]="THIS",e[e.THROW=51]="THROW",e[e.TRUE=52]="TRUE",e[e.TRY=53]="TRY",e[e.TYPE=54]="TYPE",e[e.TYPEOF=55]="TYPEOF",e[e.VAR=56]="VAR",e[e.VOID=57]="VOID",e[e.WHILE=58]="WHILE",e[e.WITH=59]="WITH",e[e.YIELD=60]="YIELD",e[e.OPENBRACE=61]="OPENBRACE",e[e.CLOSEBRACE=62]="CLOSEBRACE",e[e.OPENPAREN=63]="OPENPAREN",e[e.CLOSEPAREN=64]="CLOSEPAREN",e[e.OPENBRACKET=65]="OPENBRACKET",e[e.CLOSEBRACKET=66]="CLOSEBRACKET",e[e.DOT=67]="DOT",e[e.DOT_DOT_DOT=68]="DOT_DOT_DOT",e[e.SEMICOLON=69]="SEMICOLON",e[e.COMMA=70]="COMMA",e[e.LESSTHAN=71]="LESSTHAN",e[e.GREATERTHAN=72]="GREATERTHAN",e[e.LESSTHAN_EQUALS=73]="LESSTHAN_EQUALS",e[e.GREATERTHAN_EQUALS=74]="GREATERTHAN_EQUALS",e[e.EQUALS_EQUALS=75]="EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS=76]="EXCLAMATION_EQUALS",e[e.EQUALS_EQUALS_EQUALS=77]="EQUALS_EQUALS_EQUALS",e[e.EXCLAMATION_EQUALS_EQUALS=78]="EXCLAMATION_EQUALS_EQUALS",e[e.EQUALS_GREATERTHAN=79]="EQUALS_GREATERTHAN",e[e.PLUS=80]="PLUS",e[e.MINUS=81]="MINUS",e[e.ASTERISK_ASTERISK=82]="ASTERISK_ASTERISK",e[e.ASTERISK=83]="ASTERISK",e[e.SLASH=84]="SLASH",e[e.PERCENT=85]="PERCENT",e[e.PLUS_PLUS=86]="PLUS_PLUS",e[e.MINUS_MINUS=87]="MINUS_MINUS",e[e.LESSTHAN_LESSTHAN=88]="LESSTHAN_LESSTHAN",e[e.GREATERTHAN_GREATERTHAN=89]="GREATERTHAN_GREATERTHAN",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN=90]="GREATERTHAN_GREATERTHAN_GREATERTHAN",e[e.AMPERSAND=91]="AMPERSAND",e[e.BAR=92]="BAR",e[e.CARET=93]="CARET",e[e.EXCLAMATION=94]="EXCLAMATION",e[e.TILDE=95]="TILDE",e[e.AMPERSAND_AMPERSAND=96]="AMPERSAND_AMPERSAND",e[e.BAR_BAR=97]="BAR_BAR",e[e.QUESTION=98]="QUESTION",e[e.COLON=99]="COLON",e[e.EQUALS=100]="EQUALS",e[e.PLUS_EQUALS=101]="PLUS_EQUALS",e[e.MINUS_EQUALS=102]="MINUS_EQUALS",e[e.ASTERISK_EQUALS=103]="ASTERISK_EQUALS",e[e.ASTERISK_ASTERISK_EQUALS=104]="ASTERISK_ASTERISK_EQUALS",e[e.SLASH_EQUALS=105]="SLASH_EQUALS",e[e.PERCENT_EQUALS=106]="PERCENT_EQUALS",e[e.LESSTHAN_LESSTHAN_EQUALS=107]="LESSTHAN_LESSTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_EQUALS=108]="GREATERTHAN_GREATERTHAN_EQUALS",e[e.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS=109]="GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS",e[e.AMPERSAND_EQUALS=110]="AMPERSAND_EQUALS",e[e.BAR_EQUALS=111]="BAR_EQUALS",e[e.CARET_EQUALS=112]="CARET_EQUALS",e[e.AT=113]="AT",e[e.IDENTIFIER=114]="IDENTIFIER",e[e.STRINGLITERAL=115]="STRINGLITERAL",e[e.INTEGERLITERAL=116]="INTEGERLITERAL",e[e.FLOATLITERAL=117]="FLOATLITERAL",e[e.INVALID=118]="INVALID",e[e.ENDOFFILE=119]="ENDOFFILE"}(a=t.Token||(t.Token={})),function(e){e[e.DEFAULT=0]="DEFAULT",e[e.PREFER=1]="PREFER",e[e.ALWAYS=2]="ALWAYS"}(o=t.IdentifierHandling||(t.IdentifierHandling={})),t.tokenFromKeyword=p,t.tokenIsAlsoIdentifier=u,t.operatorTokenToString=function(e){switch(e){case a.DELETE:return"delete";case a.IN:return"in";case a.INSTANCEOF:return"instanceof";case a.NEW:return"new";case a.TYPEOF:return"typeof";case a.VOID:return"void";case a.YIELD:return"yield";case a.DOT_DOT_DOT:return"...";case a.COMMA:return",";case a.LESSTHAN:return"<";case a.GREATERTHAN:return">";case a.LESSTHAN_EQUALS:return"<=";case a.GREATERTHAN_EQUALS:return">=";case a.EQUALS_EQUALS:return"==";case a.EXCLAMATION_EQUALS:return"!=";case a.EQUALS_EQUALS_EQUALS:return"===";case a.EXCLAMATION_EQUALS_EQUALS:return"!==";case a.PLUS:return"+";case a.MINUS:return"-";case a.ASTERISK_ASTERISK:return"**";case a.ASTERISK:return"*";case a.SLASH:return"/";case a.PERCENT:return"%";case a.PLUS_PLUS:return"++";case a.MINUS_MINUS:return"--";case a.LESSTHAN_LESSTHAN:return"<<";case a.GREATERTHAN_GREATERTHAN:return">>";case a.GREATERTHAN_GREATERTHAN_GREATERTHAN:return">>>";case a.AMPERSAND:return"&";case a.BAR:return"|";case a.CARET:return"^";case a.EXCLAMATION:return"!";case a.TILDE:return"~";case a.AMPERSAND_AMPERSAND:return"&&";case a.BAR_BAR:return"||";case a.EQUALS:return"=";case a.PLUS_EQUALS:return"+=";case a.MINUS_EQUALS:return"-=";case a.ASTERISK_EQUALS:return"*=";case a.ASTERISK_ASTERISK_EQUALS:return"**=";case a.SLASH_EQUALS:return"/=";case a.PERCENT_EQUALS:return"%=";case a.LESSTHAN_LESSTHAN_EQUALS:return"<<=";case a.GREATERTHAN_GREATERTHAN_EQUALS:return">>=";case a.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:return">>>=";case a.AMPERSAND_EQUALS:return"&=";case a.BAR_EQUALS:return"|=";case a.CARET_EQUALS:return"^=";default:return assert(!1),""}};var _=function(){function e(e,t,r){this.debugInfoRef=0,this.source=e,this.start=t,this.end=r}return e.join=function(t,r){if(t.source!=r.source)throw new Error("source mismatch");return new e(t.source,t.startr.end?t.end:r.end)},Object.defineProperty(e.prototype,"atStart",{get:function(){return new e(this.source,this.start,this.start)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"atEnd",{get:function(){return new e(this.source,this.end,this.end)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"line",{get:function(){for(var e=this.source.text,t=1,r=this.start;r>=0;--r)10==e.charCodeAt(r)&&t++;return t},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"column",{get:function(){for(var e=this.source.text,t=0,r=this.start-1;r>=0&&10!=e.charCodeAt(r);--r)++t;return t},enumerable:!0,configurable:!0}),e.prototype.toString=function(){return this.source.text.substring(this.start,this.end)},e}();t.Range=_;var h=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,r)||this;n.end=0,n.pos=0,n.token=-1,n.tokenPos=0,n.nextToken=-1,n.nextTokenPos=0,n.nextTokenOnNewLine=!1,n.onComment=null,n.source=t,n.pos=0,n.end=t.text.length,n.diagnostics=r||new Array;var i=t.text;if(n.pos1&&this.pos2&&this.pos1&&this.pos1&&this.pos1&&this.pos2&&this.pos1&&this.pos1&&this.pos1&&this.pos2&&this.pos+11&&this.pos1&&this.pos2&&this.pos1&&this.pos2&&this.pos1&&this.pos2&&this.pos3&&this.pos1&&this.pos1&&this.pos=this.end){n+=e.substring(r,this.pos),this.error(s.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.end));break}var i=e.charCodeAt(this.pos);if(i==t){n+=e.substring(r,this.pos++);break}if(92!=i){if(l.isLineBreak(i)){n+=e.substring(r,this.pos),this.error(s.DiagnosticCode.Unterminated_string_literal,this.range(r-1,this.pos));break}++this.pos}else n+=e.substring(r,this.pos),n+=this.readEscapeSequence(),r=this.pos}return n},t.prototype.readEscapeSequence=function(){if(++this.pos>=this.end)return this.error(s.DiagnosticCode.Unexpected_end_of_text,this.range(this.end)),"";var e=this.source.text,t=e.charCodeAt(this.pos++);switch(t){case 48:return"\0";case 98:return"\b";case 116:return"\t";case 110:return"\n";case 118:return"\v";case 102:return"\f";case 114:return"\r";case 39:return"'";case 34:return'"';case 117:return this.pos=this.end){this.error(s.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.end));break}if(92!=e.charCodeAt(this.pos)){var n=e.charCodeAt(this.pos);if(!r&&47==n)break;if(l.isLineBreak(n)){this.error(s.DiagnosticCode.Unterminated_regular_expression_literal,this.range(t,this.pos));break}++this.pos,r=!1}else++this.pos,r=!0}return e.substring(t,this.pos)},t.prototype.readRegexpFlags=function(){for(var e=this.source.text,t=this.pos,r=0;this.pos57)&&95!=r)break;t++}return!0},t.prototype.readInteger=function(){var e=this.source.text;if(this.pos+2=48&&o<=57)r=i64_add(i64_shl(r,n),i64_new(o-48));else if(o>=65&&o<=70)r=i64_add(i64_shl(r,n),i64_new(10+o-65));else if(o>=97&&o<=102)r=i64_add(i64_shl(r,n),i64_new(10+o-97));else{if(95!=o)break;i==a&&this.error(i==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(s.DiagnosticCode.Hexadecimal_digit_expected,this.range(t)):i==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readDecimalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0),n=i64_new(10),i=t;this.pos=48&&o<=57)r=i64_add(i64_mul(r,n),i64_new(o-48));else{if(95!=o)break;i==a&&this.error(i==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}this.pos=a+1}return this.pos==t?this.error(s.DiagnosticCode.Digit_expected,this.range(t)):i==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readOctalInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0),n=i64_new(3),i=t;this.pos=48&&o<=55)r=i64_add(i64_shl(r,n),i64_new(o-48));else{if(95!=o)break;i==a&&this.error(i==t?s.DiagnosticCode.Numeric_separators_are_not_allowed_here:s.DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,this.range(a)),i=a+1}++this.pos}return this.pos==t?this.error(s.DiagnosticCode.Octal_digit_expected,this.range(t)):i==this.pos&&this.error(s.DiagnosticCode.Numeric_separators_are_not_allowed_here,this.range(i-1)),r},t.prototype.readBinaryInteger=function(){for(var e=this.source.text,t=this.pos,r=i64_new(0),n=i64_new(1),i=t;this.pos=48&&n<=57)t=(t<<4)+n-48;else if(n>=65&&n<=70)t=(t<<4)+n+-55;else{if(!(n>=97&&n<=102))return this.error(s.DiagnosticCode.Hexadecimal_digit_expected,this.range(this.pos-1,this.pos)),"";t=(t<<4)+n+-87}if(0==--e)break}return e?(this.error(s.DiagnosticCode.Unexpected_end_of_text,this.range(this.pos)),""):String.fromCharCode(t)},t.prototype.readExtendedUnicodeEscape=function(){var e=this.pos,t=this.readHexInteger(),r=i64_low(t),n=!1;assert(!i64_high(t)),r>1114111&&(this.error(s.DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,this.range(e,this.pos)),n=!0);var i=this.source.text;return this.pos>=this.end?(this.error(s.DiagnosticCode.Unexpected_end_of_text,this.range(e,this.end)),n=!0):125==i.charCodeAt(this.pos)?++this.pos:(this.error(s.DiagnosticCode.Unterminated_Unicode_escape_sequence,this.range(e,this.pos)),n=!0),n?"":r<65536?String.fromCharCode(r):String.fromCharCode(55296+(r-65536>>>10),56320+(r-65536&1023))},t.prototype.finish=function(){},t}(s.DiagnosticEmitter);t.Tokenizer=h;var d=function(){return function(){}}();t.State=d;var y=null},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},o=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return o};Object.defineProperty(t,"__esModule",{value:!0});var s,c=r(1),l=r(3),p=r(5),u=r(6),_=r(0),h=r(2),d=r(7);!function(e){e[e.REPORT=0]="REPORT",e[e.SWALLOW=1]="SWALLOW"}(s=t.ReportMode||(t.ReportMode={}));var y=function(e){function t(t){var r=e.call(this,t.diagnostics)||this;return r.currentThisExpression=null,r.currentElementExpression=null,r.program=t,r}return i(t,e),t.prototype.resolveType=function(e,t,r,n){if(void 0===r&&(r=null),void 0===n&&(n=s.REPORT),e.kind==p.NodeKind.SIGNATURE){var i=e.explicitThisType,a=null;if(i&&!(a=this.resolveType(i,t,r,n)))return null;for(var o=e.parameters,d=o.length,y=new Array(d),m=new Array(d),g=0,T=!1,f=0;fl)return this.error(c.DiagnosticCode.Expected_0_type_arguments_but_got_1,_?p.Range.join(t[0].range,t[_-1].range):assert(i).range,(_");var U=new l.Function(D,e,B,r);return e.setResolvedInstance(o,U),U},t.prototype.resolveFunctionInclTypeArguments=function(e,t,r,n,i,a){void 0===a&&(a=s.REPORT);var o=e.parent.kind==l.ElementKind.PROPERTY_PROTOTYPE?e.parent.parent:e.parent,p=null;if(e.is(_.CommonFlags.GENERIC)){if(e.is(_.CommonFlags.INSTANCE)){assert(o.kind==l.ElementKind.CLASS);var u=o.typeArguments;if(u){var h=assert(o.prototype.typeParameterNodes),d=u.length;assert(d==h.length);for(var y=0;y"),(f=new l.Class(C,e,t,A)).contextualTypeArguments=r,e.setResolvedInstance(T,f);var O=0;if(A){if(V=A.members){(w=f.members)||(f.members=w=new Map);try{for(var x=a(V),k=x.next();!k.done;k=x.next()){var L=o(k.value,2),R=L[0],F=L[1];w.set(R,F)}}catch(e){i={error:e}}finally{try{k&&!k.done&&(p=x.return)&&p.call(x)}finally{if(i)throw i.error}}}O=A.currentMemoryOffset}var B=e.instanceMembers;if(B)try{for(var D=a(B.values()),U=D.next();!U.done;U=D.next()){var P=U.value;switch(P.kind){case l.ElementKind.FIELD_PROTOTYPE:var w;if(w=f.members){if(w.has(P.name)){this.error(c.DiagnosticCode.Duplicate_identifier_0,P.identifierNode.range,P.name);break}}else f.members=w=new Map;var M=P.typeNode,G=null;if(M)G=this.resolveType(M,e.parent,f.contextualTypeArguments,n);else{var V;if(A)if((V=A.members)&&V.has(P.name)){var K=V.get(P.name);K.is(_.CommonFlags.PRIVATE)||(assert(K.kind==l.ElementKind.FIELD),G=K.type)}G||n==s.REPORT&&this.error(c.DiagnosticCode.Type_expected,P.identifierNode.range.atEnd)}if(!G)break;var z=new l.Field(P,f,G);switch(G.byteSize){case 1:break;case 2:1&O&&++O;break;case 4:3&O&&(O=1+(3|O));break;case 8:7&O&&(O=1+(7|O));break;default:assert(!1)}z.memoryOffset=O,O+=G.byteSize,f.add(P.name,z);break;case l.ElementKind.FUNCTION_PROTOTYPE:var H=P.toBound(f);f.add(H.name,H);break;case l.ElementKind.PROPERTY_PROTOTYPE:var Y=new l.Property(P,f),W=P.getterPrototype;if(W){var X=this.resolveFunction(W.toBound(f),null,h.makeMap(f.contextualTypeArguments),n);X&&(Y.getterInstance=X,Y.setType(X.signature.returnType))}var Q=P.setterPrototype;if(Q){var q=this.resolveFunction(Q.toBound(f),null,h.makeMap(f.contextualTypeArguments),n);q&&(Y.setterInstance=q,Y.is(_.CommonFlags.RESOLVED)||(assert(1==q.signature.parameterTypes.length),Y.setType(q.signature.parameterTypes[0])))}f.add(Y.name,Y);break;default:assert(!1)}}}catch(e){d={error:e}}finally{try{U&&!U.done&&(y=D.return)&&y.call(D)}finally{if(d)throw d.error}}f.currentMemoryOffset=O;var j=f.lookupInSelf(_.CommonSymbols.constructor);if(j&&j.parent===f){assert(j.kind==l.ElementKind.FUNCTION_PROTOTYPE);var Z=this.resolveFunction(j,null,f.contextualTypeArguments,n);Z&&(f.constructorInstance=Z)}try{for(var J=a(e.overloadPrototypes),$=J.next();!$.done;$=J.next()){var ee=o($.value,2),te=ee[0],re=ee[1];assert(te!=l.OperatorKind.INVALID);var ne=void 0;if(re.is(_.CommonFlags.INSTANCE)){H=re.toBound(f);ne=this.resolveFunction(H,null,h.makeMap(),n)}else ne=this.resolveFunction(re,null,h.makeMap(),n);if(ne){var ie=f.overloads;ie||(f.overloads=ie=new Map),ie.set(te,ne)}}}catch(e){m={error:e}}finally{try{$&&!$.done&&(g=J.return)&&g.call(J)}finally{if(m)throw m.error}}return f},t.prototype.resolveClassInclTypeArguments=function(e,t,r,n,i,a){void 0===a&&(a=s.REPORT);var o=null;if(e.is(_.CommonFlags.GENERIC)){if(!(o=this.resolveTypeArguments(assert(e.typeParameterNodes),t,r,n,i,a)))return null}else if(null!==t&&t.length)return a==s.REPORT&&this.error(c.DiagnosticCode.Type_0_is_not_generic,i.range,e.internalName),null;return this.resolveClass(e,o,n,a)},t}(c.DiagnosticEmitter);t.Resolver=y},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},o=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return o};Object.defineProperty(t,"__esModule",{value:!0});var s,c=r(24),l=r(1),p=r(4),u=r(0),_=r(3),h=r(12),d=r(9),y=r(7),m=r(5),g=r(6),T=r(2);!function(e){e[e.WASM32=0]="WASM32",e[e.WASM64=1]="WASM64"}(s=t.Target||(t.Target={}));var f=function(){function e(){this.target=s.WASM32,this.noAssert=!1,this.importMemory=!1,this.sharedMemory=0,this.importTable=!1,this.sourceMap=!1,this.memoryBase=0,this.globalAliases=null,this.features=0,this.optimizeLevelHint=0,this.shrinkLevelHint=0}return Object.defineProperty(e.prototype,"isWasm64",{get:function(){return this.target==s.WASM64},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"usizeType",{get:function(){return this.target==s.WASM64?g.Type.usize64:g.Type.usize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"isizeType",{get:function(){return this.target==s.WASM64?g.Type.isize64:g.Type.isize32},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"nativeSizeType",{get:function(){return this.target==s.WASM64?p.NativeType.I64:p.NativeType.I32},enumerable:!0,configurable:!0}),e.prototype.hasFeature=function(e){return 0!=(this.features&e)},e}();t.Options=f,function(e){e[e.NONE=0]="NONE",e[e.SIGN_EXTENSION=1]="SIGN_EXTENSION",e[e.MUTABLE_GLOBAL=2]="MUTABLE_GLOBAL",e[e.BULK_MEMORY=4]="BULK_MEMORY",e[e.SIMD=8]="SIMD",e[e.THREADS=16]="THREADS"}(t.Feature||(t.Feature={})),function(e){e[e.NONE=0]="NONE",e[e.IMPLICIT=1]="IMPLICIT",e[e.EXPLICIT=2]="EXPLICIT"}(t.ConversionKind||(t.ConversionKind={})),function(e){e[e.NONE=0]="NONE",e[e.WRAP=1]="WRAP"}(t.WrapMode||(t.WrapMode={}));var E,I,v,b=function(e){function t(t,r){void 0===r&&(r=null);var n=e.call(this,t.diagnostics)||this;return n.currentInlineFunctions=[],n.currentEnum=null,n.currentType=g.Type.void,n.memorySegments=[],n.stringSegments=new Map,n.functionTable=["null"],n.argcVar=0,n.argcSet=0,n.needsIterateRoots=!1,n.f32ModInstance=null,n.f64ModInstance=null,n.f32PowInstance=null,n.f64PowInstance=null,n.program=t,n.resolver=t.resolver,r||(r=new f),n.options=r,n.memoryOffset=i64_new(max(r.memoryBase,8)),n.module=p.Module.create(),n}return i(t,e),t.compile=function(e,r){return void 0===r&&(r=null),new t(e,r).compile()},t.prototype.compile=function(){var e,t,r,n,i=this.options,o=this.module,s=this.program;s.initialize(i);var l=s.makeNativeFunction("start",new g.Signature([],g.Type.void));l.internalName="start";var u=new Array;this.currentFlow=l.flow,this.currentBody=u,i.isWasm64?o.addGlobal(c.BuiltinSymbols.HEAP_BASE,p.NativeType.I64,!0,o.createI64(0,0)):o.addGlobal(c.BuiltinSymbols.HEAP_BASE,p.NativeType.I32,!1,o.createI32(0));var _=s.filesByName;try{for(var h=a(_.values()),d=h.next();!d.done;d=h.next()){(S=d.value).source.isEntry&&(this.compileFile(S),this.compileExports(S))}}catch(t){e={error:t}}finally{try{d&&!d.done&&(t=h.return)&&t.call(h)}finally{if(e)throw e.error}}var y=s.explicitStartFunction;if(u.length||y){var m=l.signature,T=o.addFunction(l.internalName,this.ensureFunctionType(m.parameterTypes,m.returnType,m.thisType),g.typesToNativeTypes(l.additionalLocals),o.createBlock(null,u));l.finalize(o,T),y||o.setStart(T)}var f=this.memoryOffset;f=i64_align(f,i.usizeType.byteSize),this.memoryOffset=f,o.removeGlobal(c.BuiltinSymbols.HEAP_BASE),i.isWasm64?o.addGlobal(c.BuiltinSymbols.HEAP_BASE,p.NativeType.I64,!1,o.createI64(i64_low(f),i64_high(f))):o.addGlobal(c.BuiltinSymbols.HEAP_BASE,p.NativeType.I32,!1,o.createI32(i64_low(f)));var E=i.hasFeature(16)&&i.sharedMemory>0;o.setMemory(this.options.memoryBase||this.memorySegments.length?i64_low(i64_shr_u(i64_align(f,65536),i64_new(16,0))):0,E?i.sharedMemory:p.Module.UNLIMITED_MEMORY,this.memorySegments,i.target,"memory"),i.importMemory&&o.addMemoryImport("0","env","memory",E);var I=this.functionTable;o.setFunctionTable(I.length,4294967295,I),o.addTableExport("0","table"),o.addFunction("null",this.ensureFunctionType(null,g.Type.void),null,o.createBlock(null,[])),i.importTable&&o.addTableImport("0","env","table");try{for(var v=a(this.program.filesByName.values()),b=v.next();!b.done;b=v.next()){var S;(S=b.value).source.isEntry&&this.makeModuleExports(S)}}catch(e){r={error:e}}finally{try{b&&!b.done&&(n=v.return)&&n.call(v)}finally{if(r)throw r.error}}return this.needsIterateRoots&&c.compileIterateRoots(this),o},t.prototype.makeModuleExports=function(e){var t,r,n=e.exports;if(n)try{for(var i=a(n),s=i.next();!s.done;s=i.next()){var c=o(s.value,2),l=c[0],p=c[1];this.makeModuleExport(l,p)}}catch(e){t={error:e}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}var u=e.exportsStar;if(u)for(var _=0,h=u.length;_1?c.createBlock(null,n):n[0]),r.push(c.createCall(t.internalName,null,p.NativeType.None))}}},t.prototype.compileGlobal=function(e){if(e.is(u.CommonFlags.COMPILED))return!0;e.set(u.CommonFlags.COMPILED);var t=this.module,r=0,n=e.typeNode,i=e.initializerNode;if(!e.is(u.CommonFlags.RESOLVED))if(n){var a=this.resolver.resolveType(n,e.parent);if(!a)return!1;if(a==g.Type.void)return this.error(l.DiagnosticCode.Type_expected,n.range),!1;e.setType(a)}else{if(!i)return this.error(l.DiagnosticCode.Type_expected,e.identifierNode.range.atEnd),!1;var o=this.currentFlow;if(e.hasDecorator(_.DecoratorFlags.LAZY)&&(this.currentFlow=e.file.startFunction.flow),r=this.compileExpressionRetainType(i,g.Type.void,1),this.currentFlow=o,this.currentType==g.Type.void)return this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,i.range,this.currentType.toString(),""),!1;e.setType(this.currentType)}if(e.is(u.CommonFlags.AMBIENT)&&e.hasDecorator(_.DecoratorFlags.BUILTIN))return!0;var s=e.type.toNativeType(),c=e.is(u.CommonFlags.CONST)||e.is(u.CommonFlags.STATIC|u.CommonFlags.READONLY);if(e.is(u.CommonFlags.AMBIENT))return c||this.options.hasFeature(2)?(e.set(u.CommonFlags.MODULE_IMPORT),S(e,e.declaration),t.addGlobalImport(e.internalName,E,I,s),e.set(u.CommonFlags.COMPILED),!0):(this.error(l.DiagnosticCode.Operation_not_supported,e.declaration.range),!1);var h=!1;if(i){if(!r){o=this.currentFlow;e.hasDecorator(_.DecoratorFlags.LAZY)&&(this.currentFlow=e.file.startFunction.flow),r=this.compileExpression(i,e.type,1,1),this.currentFlow=o}if(p.getExpressionId(r)!=p.ExpressionId.Const&&(c?(r=t.precomputeExpression(r),p.getExpressionId(r)!=p.ExpressionId.Const&&(this.warning(l.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,i.range),h=!0)):h=!0),e.hasDecorator(_.DecoratorFlags.INLINE)&&!h){switch(assert(p.getExpressionId(r)==p.ExpressionId.Const),p.getExpressionType(r)){case p.NativeType.I32:e.constantValueKind=1,e.constantIntegerValue=i64_new(p.getConstValueI32(r),0);break;case p.NativeType.I64:e.constantValueKind=1,e.constantIntegerValue=i64_new(p.getConstValueI64Low(r),p.getConstValueI64High(r));break;case p.NativeType.F32:e.constantValueKind=2,e.constantFloatValue=p.getConstValueF32(r);break;case p.NativeType.F64:e.constantValueKind=2,e.constantFloatValue=p.getConstValueF64(r);break;default:return assert(!1),!1}e.set(u.CommonFlags.INLINED)}}else r=e.type.toNativeZero(t);var d=e.internalName;return h?(e.hasDecorator(_.DecoratorFlags.INLINE)&&this.error(l.DiagnosticCode.Decorator_0_is_not_valid_here,e.identifierNode.range,"inline"),t.addGlobal(d,s,!0,e.type.toNativeZero(t)),this.currentBody.push(t.createSetGlobal(d,r))):e.hasDecorator(_.DecoratorFlags.INLINE)||t.addGlobal(d,s,!c,r),!0},t.prototype.compileEnum=function(e){var t,r;if(e.is(u.CommonFlags.COMPILED))return!0;e.set(u.CommonFlags.COMPILED);var n=this.module;this.currentEnum=e;var i=null,o=!1,s=e.is(u.CommonFlags.CONST)||e.hasDecorator(_.DecoratorFlags.INLINE);if(e.members)try{for(var c=a(e.members.values()),h=c.next();!h.done;h=c.next()){var d=h.value;if(d.kind==_.ElementKind.ENUMVALUE){var y=!1,m=d,T=m.valueNode;m.set(u.CommonFlags.COMPILED);var f=this.currentFlow;e.hasDecorator(_.DecoratorFlags.LAZY)&&(this.currentFlow=e.file.startFunction.flow);var E=void 0;T?(E=this.compileExpression(T,g.Type.i32,1,0),p.getExpressionId(E)!=p.ExpressionId.Const&&(e.is(u.CommonFlags.CONST)?(E=n.precomputeExpression(E),p.getExpressionId(E)!=p.ExpressionId.Const&&(this.error(l.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,T.range),y=!0)):y=!0)):null==i?E=n.createI32(0):(o&&this.error(l.DiagnosticCode.Enum_member_must_have_initializer,d.identifierNode.range.atEnd),E=n.createBinary(p.BinaryOp.AddI32,n.createGetGlobal(i.internalName,p.NativeType.I32),n.createI32(1)),E=n.precomputeExpression(E),p.getExpressionId(E)!=p.ExpressionId.Const&&(e.is(u.CommonFlags.CONST)&&this.error(l.DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,d.declaration.range),y=!0)),this.currentFlow=f,y?(n.addGlobal(m.internalName,p.NativeType.I32,!0,n.createI32(0)),this.currentBody.push(n.createSetGlobal(m.internalName,E)),o=!0):(s?(m.setConstantIntegerValue(i64_new(p.getConstValueI32(E)),g.Type.i32),m.is(u.CommonFlags.MODULE_EXPORT)&&n.addGlobal(m.internalName,p.NativeType.I32,!1,E)):n.addGlobal(m.internalName,p.NativeType.I32,!0,E),o=!1),i=m}}}catch(e){t={error:e}}finally{try{h&&!h.done&&(r=c.return)&&r.call(c)}finally{if(t)throw t.error}}return this.currentEnum=null,!0},t.prototype.compileFunctionUsingTypeArguments=function(e,t,r,n){if(void 0===r&&(r=T.makeMap()),void 0===n&&(n=null),e.hasDecorator(_.DecoratorFlags.BUILTIN))return null;var i=this.resolver.resolveFunctionInclTypeArguments(e,t,e.parent,r,n||e.declaration);return i&&this.compileFunction(i)?i:null},t.prototype.ensureFunctionType=function(e,t,r){void 0===r&&(r=null);var n,i=e?e.length:0,a=0;if(r?((n=new Array(1+i))[0]=r.toNativeType(),a=1):n=new Array(i),e)for(var o=0;o=0)return e.functionTableIndex;var t=this.functionTable,r=t.length;return!e.is(u.CommonFlags.TRAMPOLINE)&&e.signature.requiredParameters=0?"case"+u.toString(10):"break")+"|"+a);var d=t.createBlock("case0|"+a,c,p.NativeType.None),y=!0,m=!0,T=!0,f=!0;for(_=0;_=0&&(y&&i.set(1),m&&i.set(2),T&&i.set(4),f&&i.set(32)),d},t.prototype.compileThrowStatement=function(e){var t=this.currentFlow;return t.set(4),t.set(1),c.compileAbort(this,null,e)},t.prototype.compileTryStatement=function(e){return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileVariableStatement=function(e){for(var t=e.declarations,r=t.length,n=this.currentFlow,i=new Array,a=this.resolver,o=0;o");continue}h=this.currentType}var y=!1;if(s.is(u.CommonFlags.CONST))if(d)if(d=this.module.precomputeExpression(d),p.getExpressionId(d)==p.ExpressionId.Const){var m=new _.Local(c,-1,h,n.parentFunction);switch(p.getExpressionType(d)){case p.NativeType.I32:m.setConstantIntegerValue(i64_new(p.getConstValueI32(d),0),h);break;case p.NativeType.I64:m.setConstantIntegerValue(i64_new(p.getConstValueI64Low(d),p.getConstValueI64High(d)),h);break;case p.NativeType.F32:m.setConstantFloatValue(p.getConstValueF32(d),h);break;case p.NativeType.F64:m.setConstantFloatValue(p.getConstValueF64(d),h);break;default:return assert(!1),this.module.createUnreachable()}var T=n.scopedLocals;if(T){if(T.has(c))return this.error(l.DiagnosticCode.Duplicate_identifier_0,s.name.range,c),this.module.createUnreachable()}else n.scopedLocals=T=new Map;T.set(c,m),y=!0}else this.warning(l.DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,s.range);else this.error(l.DiagnosticCode._const_declarations_must_be_initialized,s.range);if(!y){m=void 0;if(s.isAny(u.CommonFlags.LET|u.CommonFlags.CONST)||n.is(4096))m=n.addScopedLocal(c,h,!1,s.name);else{if(n.lookupLocal(c)){this.error(l.DiagnosticCode.Duplicate_identifier_0,s.name.range,c);continue}m=n.parentFunction.addLocal(h,c,s)}d?(i.push(this.compileAssignmentWithValue(s.name,d)),m.type.is(36)&&n.setLocalWrapped(m.index,!n.canOverflow(d,h))):m.type.is(36)&&n.setLocalWrapped(m.index,!0)}}return i.length?1==i.length?i[0]:this.module.createBlock(null,i,p.NativeType.None):0},t.prototype.compileVoidStatement=function(e){return this.compileExpression(e.expression,g.Type.void,2,0)},t.prototype.compileWhileStatement=function(e){var t=this.module,r=this.currentFlow,n=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,g.Type.bool,0),this.currentType),i=t.precomputeExpression(n);if(p.getExpressionId(i)==p.ExpressionId.Const&&p.getExpressionType(i)==p.NativeType.I32){if(!p.getConstValueI32(i))return t.createNop()}else n=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,g.Type.bool,0),this.currentType);var a=r.pushBreakLabel(),o=r.fork();this.currentFlow=o;var s="break|"+a;o.breakLabel=s;var c="continue|"+a;o.continueLabel=c;var l=this.compileStatement(e.statement),u=o.isAny(29);return o.freeScopedLocals(),r.popBreakLabel(),this.currentFlow=r,o.unset(1560),r.inheritConditional(o),t.createBlock(s,[t.createLoop(c,t.createIf(n,u?l:t.createBlock(null,[l,t.createBreak(c)],p.NativeType.None)))])},t.prototype.compileInlineConstant=function(e,t,r){assert(e.is(u.CommonFlags.INLINED));var n=e.type;switch(!r&&n.is(4)&&t.is(4)&&n.size>i:0);case 5:case 6:case 10:var a=e.type.computeSmallIntegerMask(g.Type.i32);return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue)&a:0);case 2:case 7:return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 4:case 9:if(!e.program.options.isWasm64)return this.module.createI32(1==e.constantValueKind?i64_low(e.constantIntegerValue):0);case 3:case 8:return 1==e.constantValueKind?this.module.createI64(i64_low(e.constantIntegerValue),i64_high(e.constantIntegerValue)):this.module.createI64(0);case 12:if(!e.hasDecorator(_.DecoratorFlags.BUILTIN)||t!=g.Type.f32)return this.module.createF64(e.constantFloatValue);this.currentType=g.Type.f32;case 11:return this.module.createF32(e.constantFloatValue);default:return assert(!1),this.module.createUnreachable()}},t.prototype.compileExpression=function(e,t,r,n){var i;switch(this.currentType=t,e.kind){case m.NodeKind.ASSERTION:i=this.compileAssertionExpression(e,t);break;case m.NodeKind.BINARY:i=this.compileBinaryExpression(e,t);break;case m.NodeKind.CALL:i=this.compileCallExpression(e,t);break;case m.NodeKind.COMMA:i=this.compileCommaExpression(e,t);break;case m.NodeKind.ELEMENTACCESS:i=this.compileElementAccessExpression(e,t);break;case m.NodeKind.FUNCTION:i=this.compileFunctionExpression(e,t);break;case m.NodeKind.IDENTIFIER:case m.NodeKind.FALSE:case m.NodeKind.NULL:case m.NodeKind.THIS:case m.NodeKind.SUPER:case m.NodeKind.TRUE:i=this.compileIdentifierExpression(e,t,0==r);break;case m.NodeKind.INSTANCEOF:i=this.compileInstanceOfExpression(e,t);break;case m.NodeKind.LITERAL:i=this.compileLiteralExpression(e,t);break;case m.NodeKind.NEW:i=this.compileNewExpression(e,t);break;case m.NodeKind.PARENTHESIZED:i=this.compileParenthesizedExpression(e,t);break;case m.NodeKind.PROPERTYACCESS:i=this.compilePropertyAccessExpression(e,t,0==r);break;case m.NodeKind.TERNARY:i=this.compileTernaryExpression(e,t);break;case m.NodeKind.UNARYPOSTFIX:i=this.compileUnaryPostfixExpression(e,t);break;case m.NodeKind.UNARYPREFIX:i=this.compileUnaryPrefixExpression(e,t);break;default:this.error(l.DiagnosticCode.Operation_not_supported,e.range),i=this.module.createUnreachable()}var a=this.currentType;return 0!=r&&a!=t?(i=this.convertExpression(i,a,t,r,n,e),this.currentType=t):1==n&&(i=this.ensureSmallIntegerWrap(i,a)),this.options.sourceMap&&this.addDebugLocation(i,e.range),i},t.prototype.compileExpressionRetainType=function(e,t,r){return this.compileExpression(e,t==g.Type.void?g.Type.i32:t,0,r)},t.prototype.precomputeExpression=function(e,t,r,n){return this.module.precomputeExpression(this.compileExpression(e,t,r,n))},t.prototype.convertExpression=function(e,t,r,n,i,a){assert(0!=n);var o=this.module;return 14==t.kind?(assert(14!=r.kind),this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,a.range,t.toString(),r.toString()),o.createUnreachable()):14==r.kind?o.createDrop(e):(t.isAssignableTo(r)||1==n&&this.error(l.DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,a.range,t.toString(),r.toString()),t.is(8)?r.is(8)?11==t.kind?12==r.kind&&(e=o.createUnary(p.UnaryOp.PromoteF32,e)):11==r.kind&&(e=o.createUnary(p.UnaryOp.DemoteF64,e)):r.is(4)?11==t.kind?r==g.Type.bool?(e=o.createBinary(p.BinaryOp.NeF32,e,o.createF32(0)),i=0):e=r.is(1)?r.is(64)?o.createUnary(p.UnaryOp.TruncF32ToI64,e):o.createUnary(p.UnaryOp.TruncF32ToI32,e):r.is(64)?o.createUnary(p.UnaryOp.TruncF32ToU64,e):o.createUnary(p.UnaryOp.TruncF32ToU32,e):r==g.Type.bool?(e=o.createBinary(p.BinaryOp.NeF64,e,o.createF64(0)),i=0):e=r.is(1)?r.is(64)?o.createUnary(p.UnaryOp.TruncF64ToI64,e):o.createUnary(p.UnaryOp.TruncF64ToI32,e):r.is(64)?o.createUnary(p.UnaryOp.TruncF64ToU64,e):o.createUnary(p.UnaryOp.TruncF64ToU32,e):(assert(0==r.flags,"void type expected"),e=o.createDrop(e)):t.is(4)&&r.is(8)?e=11==r.kind?t.is(64)?o.createUnary(t.is(1)?p.UnaryOp.ConvertI64ToF32:p.UnaryOp.ConvertU64ToF32,e):o.createUnary(t.is(1)?p.UnaryOp.ConvertI32ToF32:p.UnaryOp.ConvertU32ToF32,e):t.is(64)?o.createUnary(t.is(1)?p.UnaryOp.ConvertI64ToF64:p.UnaryOp.ConvertU64ToF64,e):o.createUnary(t.is(1)?p.UnaryOp.ConvertI32ToF64:p.UnaryOp.ConvertU32ToF64,e):t.is(64)?r==g.Type.bool?(e=o.createBinary(p.BinaryOp.NeI64,e,o.createI64(0)),i=0):r.is(64)||(e=o.createUnary(p.UnaryOp.WrapI64,e)):r.is(64)?(e=o.createUnary(t.is(1)?p.UnaryOp.ExtendI32:p.UnaryOp.ExtendU32,this.ensureSmallIntegerWrap(e,t)),i=0):t.is(32)&&t.size",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d),o.kind){case 0:case 1:case 2:s=c.createBinary(p.BinaryOp.GtI32,r,i);break;case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.GtI64:p.BinaryOp.GtI32,r,i);break;case 3:s=c.createBinary(p.BinaryOp.GtI64,r,i);break;case 5:case 6:case 7:case 10:s=c.createBinary(p.BinaryOp.GtU32,r,i);break;case 9:s=c.createBinary(this.options.isWasm64?p.BinaryOp.GtU64:p.BinaryOp.GtU32,r,i);break;case 8:s=c.createBinary(p.BinaryOp.GtU64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.GtF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.GtF64,r,i);break;default:assert(!1),s=c.createUnreachable()}this.currentType=g.Type.bool;break;case y.Token.LESSTHAN_EQUALS:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.LE)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!0)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"<=",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d),o.kind){case 0:case 1:case 2:s=c.createBinary(p.BinaryOp.LeI32,r,i);break;case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.LeI64:p.BinaryOp.LeI32,r,i);break;case 3:s=c.createBinary(p.BinaryOp.LeI64,r,i);break;case 5:case 6:case 7:case 10:s=c.createBinary(p.BinaryOp.LeU32,r,i);break;case 9:s=c.createBinary(this.options.isWasm64?p.BinaryOp.LeU64:p.BinaryOp.LeU32,r,i);break;case 8:s=c.createBinary(p.BinaryOp.LeU64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.LeF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.LeF64,r,i);break;default:assert(!1),s=c.createUnreachable()}this.currentType=g.Type.bool;break;case y.Token.GREATERTHAN_EQUALS:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.GE)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!0)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,">=",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d),o.kind){case 0:case 1:case 2:s=c.createBinary(p.BinaryOp.GeI32,r,i);break;case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.GeI64:p.BinaryOp.GeI32,r,i);break;case 3:s=c.createBinary(p.BinaryOp.GeI64,r,i);break;case 5:case 6:case 7:case 10:s=c.createBinary(p.BinaryOp.GeU32,r,i);break;case 9:s=c.createBinary(this.options.isWasm64?p.BinaryOp.GeU64:p.BinaryOp.GeU32,r,i);break;case 8:s=c.createBinary(p.BinaryOp.GeU64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.GeF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.GeF64,r,i);break;default:assert(!1),s=c.createUnreachable()}this.currentType=g.Type.bool;break;case y.Token.EQUALS_EQUALS_EQUALS:case y.Token.EQUALS_EQUALS:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,T==y.Token.EQUALS_EQUALS&&this.currentType.is(256))if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.EQ)){s=this.compileBinaryOverload(b,h,r,d,e);break}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,y.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d),o.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:s=c.createBinary(p.BinaryOp.EqI32,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.EqI64:p.BinaryOp.EqI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.EqI64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.EqF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.EqF64,r,i);break;default:assert(!1),s=c.createUnreachable()}this.currentType=g.Type.bool;break;case y.Token.EXCLAMATION_EQUALS_EQUALS:case y.Token.EXCLAMATION_EQUALS:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,T==y.Token.EXCLAMATION_EQUALS&&this.currentType.is(256))if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.NE)){s=this.compileBinaryOverload(b,h,r,d,e);break}if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,y.operatorTokenToString(e.operator),n.toString(),a.toString()),this.currentType=t,c.createUnreachable();switch(r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d),o.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:s=c.createBinary(p.BinaryOp.NeI32,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.NeI64:p.BinaryOp.NeI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.NeI64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.NeF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.NeF64,r,i);break;default:assert(!1),s=c.createUnreachable()}this.currentType=g.Type.bool;break;case y.Token.EQUALS:return this.compileAssignment(h,d,t);case y.Token.PLUS_EQUALS:m=!0;case y.Token.PLUS:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.ADD)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0);else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"+",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,0,h),i=this.convertExpression(i,a,a=o,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:s=c.createBinary(p.BinaryOp.AddI32,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.AddI64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.AddF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.AddF64,r,i);break;default:assert(!1),s=c.createUnreachable()}break;case y.Token.MINUS_EQUALS:m=!0;case y.Token.MINUS:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.SUB)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"-",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,0,h),i=this.convertExpression(i,a,a=o,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:s=c.createBinary(p.BinaryOp.SubI32,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.SubI64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.SubF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.SubF64,r,i);break;default:assert(!1),s=c.createUnreachable()}break;case y.Token.ASTERISK_EQUALS:m=!0;case y.Token.ASTERISK:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.MUL)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1);else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"*",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,0,h),i=this.convertExpression(i,a,a=o,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:s=c.createBinary(p.BinaryOp.MulI32,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.MulI64:p.BinaryOp.MulI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.MulI64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.MulF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.MulF64,r,i);break;default:assert(!1),s=c.createUnreachable()}break;case y.Token.ASTERISK_ASTERISK_EQUALS:m=!0;case y.Token.ASTERISK_ASTERISK:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.POW)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}var f=void 0;if(11==this.currentType.kind){if(i=this.compileExpression(d,g.Type.f32,1,0),a=this.currentType,!(f=this.f32PowInstance)){if(!(E=this.program.lookupGlobal(u.LibrarySymbols.Mathf))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),s=c.createUnreachable();break}if(!(I=E.members?E.members.get(u.LibrarySymbols.pow):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.pow"),s=c.createUnreachable();break}assert(I.kind==_.ElementKind.FUNCTION_PROTOTYPE),this.f32PowInstance=f=this.resolver.resolveFunction(I,null)}}else if(r=this.convertExpression(r,this.currentType,g.Type.f64,1,0,h),n=this.currentType,i=this.compileExpression(d,g.Type.f64,1,0),a=this.currentType,!(f=this.f64PowInstance)){if(!(E=this.program.lookupGlobal(u.LibrarySymbols.Math))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),s=c.createUnreachable();break}if(!(I=E.members?E.members.get(u.LibrarySymbols.pow):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math.pow"),s=c.createUnreachable();break}assert(I.kind==_.ElementKind.FUNCTION_PROTOTYPE),this.f64PowInstance=f=this.resolver.resolveFunction(I,null)}s=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):c.createUnreachable();break;case y.Token.SLASH_EQUALS:m=!0;case y.Token.SLASH:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.DIV)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"/",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d)}switch(this.currentType.kind){case 0:case 1:case 2:s=c.createBinary(p.BinaryOp.DivI32,r,i);break;case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.DivI64:p.BinaryOp.DivI32,r,i);break;case 3:s=c.createBinary(p.BinaryOp.DivI64,r,i);break;case 5:case 6:case 10:case 7:s=c.createBinary(p.BinaryOp.DivU32,r,i);break;case 9:s=c.createBinary(this.options.isWasm64?p.BinaryOp.DivU64:p.BinaryOp.DivU32,r,i);break;case 8:s=c.createBinary(p.BinaryOp.DivU64,r,i);break;case 11:s=c.createBinary(p.BinaryOp.DivF32,r,i);break;case 12:s=c.createBinary(p.BinaryOp.DivF64,r,i);break;default:assert(!1),s=c.createUnreachable()}break;case y.Token.PERCENT_EQUALS:m=!0;case y.Token.PERCENT:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.REM)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"%",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,1,h),i=this.convertExpression(i,a,a=o,1,1,d)}switch(this.currentType.kind){case 0:case 1:case 2:s=c.createBinary(p.BinaryOp.RemI32,r,i);break;case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.RemI64:p.BinaryOp.RemI32,r,i);break;case 3:s=c.createBinary(p.BinaryOp.RemI64,r,i);break;case 5:case 6:case 10:case 7:s=c.createBinary(p.BinaryOp.RemU32,r,i);break;case 9:s=c.createBinary(this.options.isWasm64?p.BinaryOp.RemU64:p.BinaryOp.RemU32,r,i);break;case 8:s=c.createBinary(p.BinaryOp.RemU64,r,i);break;case 11:if(!(f=this.f32ModInstance)){if(!(E=this.program.lookupGlobal(u.LibrarySymbols.Mathf))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf"),s=c.createUnreachable();break}if(!(I=E.members?E.members.get(u.LibrarySymbols.mod):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Mathf.mod"),s=c.createUnreachable();break}assert(I.kind==_.ElementKind.FUNCTION_PROTOTYPE),this.f32ModInstance=f=this.resolver.resolveFunction(I,null)}s=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):c.createUnreachable();break;case 12:if(!(f=this.f64ModInstance)){var E,I;if(!(E=this.program.lookupGlobal(u.LibrarySymbols.Math))){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math"),s=c.createUnreachable();break}if(!(I=E.members?E.members.get(u.LibrarySymbols.mod):null)){this.error(l.DiagnosticCode.Cannot_find_name_0,e.range,"Math.mod"),s=c.createUnreachable();break}assert(I.kind==_.ElementKind.FUNCTION_PROTOTYPE),this.f64ModInstance=f=this.resolver.resolveFunction(I,null)}s=f&&this.compileFunction(f)?this.makeCallDirect(f,[r,i]):c.createUnreachable();break;default:assert(!1),s=c.createUnreachable()}break;case y.Token.LESSTHAN_LESSTHAN_EQUALS:m=!0;case y.Token.LESSTHAN_LESSTHAN:if(r=this.compileExpressionRetainType(h,t.intType,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.BITWISE_SHL)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(i=this.compileExpression(d,n,1,0),a=this.currentType,this.currentType.kind){case 0:case 1:case 5:case 6:case 10:case 2:case 7:s=c.createBinary(p.BinaryOp.ShlI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.ShlI64,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.ShlI64:p.BinaryOp.ShlI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,y.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),s=c.createUnreachable()}break;case y.Token.GREATERTHAN_GREATERTHAN_EQUALS:m=!0;case y.Token.GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(h,t.intType,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.BITWISE_SHR)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,1),a=this.currentType,this.currentType.kind){case 0:case 1:case 2:s=c.createBinary(p.BinaryOp.ShrI32,r,i);break;case 3:s=c.createBinary(p.BinaryOp.ShrI64,r,i);break;case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrI64:p.BinaryOp.ShrI32,r,i);break;case 5:case 6:case 10:case 7:s=c.createBinary(p.BinaryOp.ShrU32,r,i);break;case 8:s=c.createBinary(p.BinaryOp.ShrU64,r,i);break;case 9:s=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrU64:p.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,y.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),s=c.createUnreachable()}break;case y.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:m=!0;case y.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:if(r=this.compileExpressionRetainType(h,t.intType,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.BITWISE_SHR_U)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}switch(r=this.ensureSmallIntegerWrap(r,n),i=this.compileExpression(d,n,1,0),a=this.currentType,this.currentType.kind){case 5:case 6:case 10:s=c.createBinary(p.BinaryOp.ShrU32,r,i);case 0:case 1:case 2:case 7:s=c.createBinary(p.BinaryOp.ShrU32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.ShrU64,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.ShrU64:p.BinaryOp.ShrU32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,y.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),s=c.createUnreachable()}break;case y.Token.AMPERSAND_EQUALS:m=!0;case y.Token.AMPERSAND:if(r=this.compileExpressionRetainType(h,t.intType,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.BITWISE_AND)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"&",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,0,h),i=this.convertExpression(i,a,a=o,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 10:case 7:s=c.createBinary(p.BinaryOp.AndI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.AndI64,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.AndI64:p.BinaryOp.AndI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,y.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),s=c.createUnreachable()}break;case y.Token.BAR_EQUALS:m=!0;case y.Token.BAR:if(r=this.compileExpressionRetainType(h,t.intType,0),n=this.currentType,this.currentType.is(256)){if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.BITWISE_OR)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"|",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,0,h),i=this.convertExpression(i,a,a=o,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:s=c.createBinary(p.BinaryOp.OrI32,r,i);break;case 2:case 7:s=c.createBinary(p.BinaryOp.OrI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.OrI64,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.OrI64:p.BinaryOp.OrI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,y.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),s=c.createUnreachable()}break;case y.Token.CARET_EQUALS:m=!0;case y.Token.CARET:if(r=this.compileExpressionRetainType(h,t.intType,0),n=this.currentType,this.currentType.is(256)){var v,b;if(v=n.classReference)if(b=v.lookupOverload(_.OperatorKind.BITWISE_XOR)){s=this.compileBinaryOverload(b,h,r,d,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}if(m)i=this.compileExpression(d,n,1,0),a=this.currentType;else{if(i=this.compileExpressionRetainType(d,n,0),a=this.currentType,!(o=g.Type.commonCompatible(n,a,!1)))return this.error(l.DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,e.range,"^",n.toString(),a.toString()),this.currentType=t,c.createUnreachable();r=this.convertExpression(r,n,n=o,1,0,h),i=this.convertExpression(i,a,a=o,1,0,d)}switch(this.currentType.kind){case 0:case 1:case 5:case 6:case 10:s=c.createBinary(p.BinaryOp.XorI32,r,i);break;case 2:case 7:s=c.createBinary(p.BinaryOp.XorI32,r,i);break;case 3:case 8:s=c.createBinary(p.BinaryOp.XorI64,r,i);break;case 9:case 4:s=c.createBinary(this.options.isWasm64?p.BinaryOp.XorI64:p.BinaryOp.XorI32,r,i);break;case 11:case 12:return this.error(l.DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,e.range,y.operatorTokenToString(e.operator),this.currentType.toString()),c.createUnreachable();default:assert(!1),s=c.createUnreachable()}break;case y.Token.AMPERSAND_AMPERSAND:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,i=this.compileExpression(d,n,1,0),a=this.currentType,s=c.cloneExpression(r,!0,0))s=c.createIf(this.makeIsTrueish(r,this.currentType),i,s);else{var S=(A=this.currentFlow).getAndFreeTempLocal(this.currentType,!A.canOverflow(r,this.currentType));s=c.createIf(this.makeIsTrueish(c.createTeeLocal(S.index,r),this.currentType),i,c.createGetLocal(assert(S).index,this.currentType.toNativeType()))}break;case y.Token.BAR_BAR:if(r=this.compileExpressionRetainType(h,t,0),n=this.currentType,i=this.compileExpression(d,n,1,0),a=this.currentType,s=this.module.cloneExpression(r,!0,0))s=this.module.createIf(this.makeIsTrueish(r,this.currentType),s,i);else{var A;S=(A=this.currentFlow).getAndFreeTempLocal(this.currentType,!A.canOverflow(r,this.currentType));s=c.createIf(this.makeIsTrueish(c.createTeeLocal(S.index,r),this.currentType),c.createGetLocal(assert(S).index,this.currentType.toNativeType()),i)}break;default:assert(!1),s=this.module.createUnreachable()}return m?this.compileAssignmentWithValue(h,s,t!=g.Type.void):s},t.prototype.compileUnaryOverload=function(e,t,r,n){var i,a=0;return e.is(u.CommonFlags.INSTANCE)?(a=r,i=[]):i=[t],this.compileCallDirect(e,i,n,a)},t.prototype.compileBinaryOverload=function(e,t,r,n,i){var a,o=0;if(e.is(u.CommonFlags.INSTANCE)){var s=assert(e.parent);assert(s.kind==_.ElementKind.CLASS),o=r,a=[n]}else a=[t,n];return this.compileCallDirect(e,a,i,o)},t.prototype.compileAssignment=function(e,t,r){var n,i=this.program.resolver,a=this.currentFlow,o=i.resolveExpression(e,a);if(!o)return this.module.createUnreachable();switch(o.kind){case _.ElementKind.GLOBAL:if(!this.compileGlobal(o))return this.module.createUnreachable();assert(o.type!=g.Type.void);case _.ElementKind.LOCAL:case _.ElementKind.FIELD:n=o.type;break;case _.ElementKind.PROPERTY_PROTOTYPE:var s=o.setterPrototype;if(!s)return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,o.internalName),this.module.createUnreachable();if(!(c=this.resolver.resolveFunction(s,null,T.makeMap(),d.ReportMode.REPORT)))return this.module.createUnreachable();assert(1==c.signature.parameterTypes.length),n=c.signature.parameterTypes[0];break;case _.ElementKind.PROPERTY:var c;if(!(c=o.setterInstance))return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,o.internalName),this.module.createUnreachable();assert(1==c.signature.parameterTypes.length),n=c.signature.parameterTypes[0];break;case _.ElementKind.CLASS:if(i.currentElementExpression){var p=a.is(8192),u=o.lookupOverload(_.OperatorKind.INDEXED_SET,p);if(!u)return o.lookupOverload(_.OperatorKind.INDEXED_GET,p)?this.error(l.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,o.internalName):this.error(l.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,o.internalName),this.module.createUnreachable();assert(2==u.signature.parameterTypes.length),n=u.signature.parameterTypes[1];break}default:return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()}assert(n!=g.Type.void);var h=this.compileExpression(t,n,1,0);return this.compileAssignmentWithValue(e,h,r!=g.Type.void)},t.prototype.compileAssignmentWithValue=function(e,t,r){void 0===r&&(r=!1);var n=this.module,i=this.currentFlow,a=this.resolver.resolveExpression(e,i);if(!a)return n.createUnreachable();switch(a.kind){case _.ElementKind.LOCAL:var o=a.type;return assert(o!=g.Type.void),this.currentType=r?o:g.Type.void,a.is(u.CommonFlags.CONST)?(this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable()):(o.is(36)&&i.setLocalWrapped(a.index,!i.canOverflow(t,o)),r?n.createTeeLocal(a.index,t):n.createSetLocal(a.index,t));case _.ElementKind.GLOBAL:if(!this.compileGlobal(a))return n.createUnreachable();o=a.type;if(assert(o!=g.Type.void),this.currentType=r?o:g.Type.void,a.is(u.CommonFlags.CONST))return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();if(t=this.ensureSmallIntegerWrap(t,o),r){var s=o.toNativeType(),c=a.internalName;return n.createBlock(null,[n.createSetGlobal(c,t),n.createGetGlobal(c,s)],s)}return n.createSetGlobal(a.internalName,t);case _.ElementKind.FIELD:var p=a.initializerNode;if(a.is(u.CommonFlags.READONLY)&&!i.actualFunction.is(u.CommonFlags.CONSTRUCTOR)&&!p)return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();var h=assert(this.resolver.currentThisExpression),y=this.compileExpressionRetainType(h,this.options.usizeType,0);o=a.type;this.currentType=r?o:g.Type.void;s=o.toNativeType();if(10==o.kind&&(t=this.ensureSmallIntegerWrap(t,o)),r){var m=this.currentFlow,f=m.getAndFreeTempLocal(o,!m.canOverflow(t,o)).index;return n.createBlock(null,[n.createSetLocal(f,t),n.createStore(o.byteSize,y,n.createGetLocal(f,s),s,a.memoryOffset),n.createGetLocal(f,s)],s)}return n.createStore(o.byteSize,y,t,s,a.memoryOffset);case _.ElementKind.PROPERTY_PROTOTYPE:var E=a.setterPrototype;if(!E)return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();if(!(b=this.resolver.resolveFunction(E,null,T.makeMap(),d.ReportMode.REPORT)))return n.createUnreachable();if(!r)return this.makeCallDirect(b,[t]);var I=assert(a.getterPrototype);if(!(A=this.resolver.resolveFunction(I,null,T.makeMap(),d.ReportMode.REPORT)))return n.createUnreachable();var v=(B=A.signature.returnType).toNativeType();return n.createBlock(null,[this.makeCallDirect(b,[t]),this.makeCallDirect(A)],v);case _.ElementKind.PROPERTY:var b;if(!(b=a.setterInstance))return this.error(l.DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,e.range,a.internalName),n.createUnreachable();if(!r){var S=this.compileExpressionRetainType(assert(this.resolver.currentThisExpression),this.options.usizeType,0);return this.makeCallDirect(b,[S,t])}var A;v=(B=(A=assert(a.getterInstance)).signature.returnType).toNativeType(),y=this.compileExpressionRetainType(assert(this.resolver.currentThisExpression),this.options.usizeType,0),f=i.getAndFreeTempLocal(B,!1).index;return n.createBlock(null,[this.makeCallDirect(b,[n.createTeeLocal(f,y),t]),this.makeCallDirect(A,[n.createGetLocal(f,v)])],v);case _.ElementKind.CLASS:var N=this.resolver.currentElementExpression;if(N){var C=i.is(8192),O=a.lookupOverload(_.OperatorKind.INDEXED_GET,C);if(!O)return this.error(l.DiagnosticCode.Index_signature_is_missing_in_type_0,e.range,a.internalName),n.createUnreachable();var x=a.lookupOverload(_.OperatorKind.INDEXED_SET,C);if(!x)return this.error(l.DiagnosticCode.Index_signature_in_type_0_only_permits_reading,e.range,a.internalName),this.currentType=r?O.signature.returnType:g.Type.void,n.createUnreachable();var k=a.type,L=(h=assert(this.resolver.currentThisExpression),y=this.compileExpressionRetainType(h,this.options.usizeType,0),this.compileExpression(N,g.Type.i32,1,0));if(r){var R=i.getTempLocal(k,!1),F=i.getAndFreeTempLocal(this.currentType,!1),B=O.signature.returnType;return i.freeTempLocal(R),n.createBlock(null,[this.makeCallDirect(x,[n.createTeeLocal(R.index,y),n.createTeeLocal(F.index,L),t]),this.makeCallDirect(O,[n.createGetLocal(R.index,R.type.toNativeType()),n.createGetLocal(F.index,F.type.toNativeType())])],B.toNativeType())}return this.makeCallDirect(x,[y,L,t])}}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileCallExpression=function(e,t){var r=this.module,n=this.currentFlow;if(e.expression.kind==m.NodeKind.SUPER){var i=this.currentFlow,a=i.actualFunction;if(!a.is(u.CommonFlags.CONSTRUCTOR))return this.error(l.DiagnosticCode.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors,e.range),r.createUnreachable();var o=assert(a.parent);assert(o.kind==_.ElementKind.CLASS);var s=assert(o.base),c=assert(i.lookupLocal(u.CommonSymbols.this_)),h=this.options.nativeSizeType,d=[r.createSetLocal(c.index,this.compileCallDirect(this.ensureConstructor(s,e),e.arguments,e,r.createIf(r.createGetLocal(c.index,h),r.createGetLocal(c.index,h),this.makeAllocation(o))))];return this.makeFieldInitialization(o,d),i.isAny(2080)?(this.error(l.DiagnosticCode._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class,e.range),r.createUnreachable()):(i.set(96),this.currentType=g.Type.void,r.createBlock(null,d))}var y,f,E=this.resolver.resolveExpression(e.expression,n);if(!E)return r.createUnreachable();switch(E.kind){case _.ElementKind.FUNCTION_PROTOTYPE:var I=E,v=e.typeArguments;if(I.hasDecorator(_.DecoratorFlags.BUILTIN))return this.compileCallExpressionBuiltin(I,e,t);var b=null;if(v){if(!I.is(u.CommonFlags.GENERIC))return this.error(l.DiagnosticCode.Type_0_is_not_generic,e.expression.range,I.internalName),r.createUnreachable();b=this.resolver.resolveFunctionInclTypeArguments(I,v,n.actualFunction.parent,T.makeMap(n.contextualTypeArguments),e)}else{if(I.is(u.CommonFlags.GENERIC)){for(var S=new Map,A=assert(I.typeParameterNodes),N=A.length,C=0;Co&&!i)||(this.error(l.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,o.toString(),t.toString()),!1)},t.prototype.compileCallDirect=function(e,t,r,n){void 0===n&&(n=0);var i=t.length,a=e.signature;if(!this.checkCallSignature(a,i,0!=n,r))return this.module.createUnreachable();if(e.hasDecorator(_.DecoratorFlags.INLINE)){if(assert(!e.is(u.CommonFlags.TRAMPOLINE)),!this.currentInlineFunctions.includes(e)){this.currentInlineFunctions.push(e);var o=this.compileCallInlinePrechecked(e,t,n);return this.currentInlineFunctions.pop(),o}this.warning(l.DiagnosticCode.Function_0_cannot_be_inlined_into_itself,r.range,e.internalName)}var s=n?i+1:i,c=new Array(s),p=0;n&&(c[0]=n,p=1);for(var h=a.parameterTypes,d=0;d=i);var s=this.module;if(!this.compileFunction(e))return s.createUnreachable();var c=e.signature.returnType,l=e.is(u.CommonFlags.MODULE_IMPORT);if(r=a),this.ensureFunctionType(e.parameterTypes,e.returnType,e.thisType);var c=this.module;if(n=0),this.currentType=N,this.module.createGetLocal(C,N.toNativeType());case _.ElementKind.GLOBAL:if(!this.compileGlobal(A))return this.module.createUnreachable();var O=A.type;return assert(O!=g.Type.void),A.is(u.CommonFlags.INLINED)?this.compileInlineConstant(A,t,r):(this.currentType=O,this.module.createGetGlobal(A.internalName,O.toNativeType()));case _.ElementKind.ENUMVALUE:return A.is(u.CommonFlags.COMPILED)?(this.currentType=g.Type.i32,A.is(u.CommonFlags.INLINED)?(assert(1==A.constantValueKind),this.module.createI32(i64_low(A.constantIntegerValue))):this.module.createGetGlobal(A.internalName,p.NativeType.I32)):(this.error(l.DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,e.range),this.currentType=g.Type.i32,this.module.createUnreachable());case _.ElementKind.FUNCTION_PROTOTYPE:var x=this.resolver.resolveFunction(A,null,T.makeMap(i.contextualTypeArguments));if(!x||!this.compileFunction(x))return n.createUnreachable();var k=this.ensureFunctionTableEntry(x);return this.currentType=x.signature.type,this.module.createI32(k)}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.module.createUnreachable()},t.prototype.compileInstanceOfExpression=function(e,t){var r=this.module,n=this.compileExpressionRetainType(e.expression,this.options.usizeType,0),i=this.currentType,a=this.resolver.resolveType(e.isType,this.currentFlow.actualFunction);return this.currentType=g.Type.bool,a?a.is(256)?i.is(512)&&!a.is(512)&&i.nonNullableType.isAssignableTo(a)?r.createBinary(i.is(64)?p.BinaryOp.NeI64:p.BinaryOp.NeI32,n,i.toNativeZero(r)):r.createI32(i.isAssignableTo(a)?1:0):r.createI32(i==a?1:0):r.createUnreachable()},t.prototype.compileLiteralExpression=function(e,t,r){void 0===r&&(r=!1);var n=this.module;switch(e.literalKind){case m.LiteralKind.ARRAY:assert(!r);var i=t.classReference;return i&&i.prototype==this.program.arrayPrototype?this.compileArrayLiteral(assert(i.typeArguments)[0],e.elementExpressions,!1,e):(this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable());case m.LiteralKind.FLOAT:var a=e.value;return r&&(a=-a),t==g.Type.f32?n.createF32(a):(this.currentType=g.Type.f64,n.createF64(a));case m.LiteralKind.INTEGER:var o=e.value;r&&(o=i64_sub(i64_new(0),o));var s=this.resolver.determineIntegerLiteralType(o,t);switch(this.currentType=s,s.kind){case 4:if(!this.options.isWasm64)return n.createI32(i64_low(o));case 3:return n.createI64(i64_low(o),i64_high(o));case 9:if(!this.options.isWasm64)return n.createI32(i64_low(o));case 8:return n.createI64(i64_low(o),i64_high(o));case 11:return n.createF32(i64_to_f32(o));case 12:return n.createF64(i64_to_f64(o));default:return n.createI32(i64_low(o))}case m.LiteralKind.STRING:return assert(!r),this.compileStringLiteral(e);case m.LiteralKind.OBJECT:return assert(!r),this.compileObjectLiteral(e,t)}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),this.currentType=t,n.createUnreachable()},t.prototype.ensureStaticString=function(e){var t,r=this.program,n=r.hasGC,i=r.gcHeaderSize,a=assert(r.stringInstance),o=this.stringSegments;if(o.has(e))t=o.get(e);else{var s=e.length,l=a.currentMemoryOffset+1&-2,p=l+2*s,_=void 0,h=void 0;n?(_=new Uint8Array(i+p),h=i,T.writeI32(c.ensureGCHook(this,a),_,r.gcHookOffset)):(_=new Uint8Array(p),h=0),T.writeI32(s,_,h+a.offsetof(u.LibrarySymbols.length)),h+=l;for(var d=0;d",t.toString()),r.createUnreachable();var i=n.constructorInstance;if(i){if(i.signature.requiredParameters)return this.error(l.DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,e.range,n.toString()),r.createUnreachable();if(i.is(u.CommonFlags.PRIVATE))return this.error(l.DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable();if(i.is(u.CommonFlags.PROTECTED))return this.error(l.DiagnosticCode.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration,e.range,n.toString()),r.createUnreachable()}var a=e.names,o=a.length,s=e.values,c=n.members,p=!1,h=new Array(o+2),d=this.currentFlow.getTempLocal(this.options.usizeType);assert(o==s.length);for(var y=0,m=o;yI)for(m=I;m=0);var c=this.compileExpressionRetainType(assert(this.resolver.currentThisExpression),this.options.usizeType,0);return this.currentType=a.type,n.createLoad(a.type.byteSize,a.type.is(5),c,a.type.toNativeType(),a.memoryOffset);case _.ElementKind.PROPERTY_PROTOTYPE:var h=a.getterPrototype;if(h){var d=this.resolver.resolveFunction(h,null);if(d)return this.compileCallDirect(d,[],e,0)}return n.createUnreachable();case _.ElementKind.PROPERTY:var y=assert(a.getterInstance);return this.compileCallDirect(y,[],e,this.compileExpressionRetainType(assert(this.resolver.currentThisExpression),this.options.usizeType,0));case _.ElementKind.FUNCTION_PROTOTYPE:return this.error(l.DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,e.range,a.name),n.createUnreachable()}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()},t.prototype.compileGetter=function(e,t){var r=e.getterPrototype;if(r){var n=this.resolver.resolveFunction(r,null);if(!n)return this.module.createUnreachable();var i=n.signature;if(!this.checkCallSignature(i,0,n.is(u.CommonFlags.INSTANCE),t))return this.module.createUnreachable();if(n.is(u.CommonFlags.INSTANCE)){var a=assert(n.parent);assert(a.kind==_.ElementKind.CLASS);var o=assert(this.resolver.currentThisExpression),s=this.compileExpressionRetainType(o,this.options.usizeType,0);//!!! +return this.currentType=i.returnType,this.compileCallDirect(n,[],t,s)}return this.currentType=i.returnType,this.compileCallDirect(n,[],t,0)}return this.error(l.DiagnosticCode.Property_0_does_not_exist_on_type_1,t.range,e.name,e.parent.toString()),this.module.createUnreachable()},t.prototype.compileTernaryExpression=function(e,t){var r=e.ifThen,n=e.ifElse,i=this.currentFlow,a=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,g.Type.bool,0),this.currentType),o=this.module.precomputeExpression(a);if(p.getExpressionId(o)==p.ExpressionId.Const&&p.getExpressionType(o)==p.NativeType.I32)return p.getConstValueI32(o)?this.compileExpressionRetainType(r,t,0):this.compileExpressionRetainType(n,t,0);a=this.makeIsTrueish(this.compileExpressionRetainType(e.condition,g.Type.bool,0),this.currentType);var s=i.fork();this.currentFlow=s;var c=this.compileExpressionRetainType(r,t,0),u=this.currentType;s.freeScopedLocals();var _=i.fork();this.currentFlow=_;var h=this.compileExpressionRetainType(n,t,0),d=this.currentType;_.freeScopedLocals(),this.currentFlow=i,i.inheritMutual(s,_);var y=g.Type.commonCompatible(u,d,!1);return y?(c=this.convertExpression(c,u,y,1,0,r),h=this.convertExpression(h,d,y,1,0,n),this.currentType=y,this.module.createIf(a,c,h)):(this.error(l.DiagnosticCode.Type_0_is_not_assignable_to_type_1,e.range,u.toString(),d.toString()),this.currentType=t,this.module.createUnreachable())},t.prototype.compileUnaryPostfixExpression=function(e,t){var r=this.module,n=this.currentFlow,i=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0);if(p.getExpressionId(i)==p.ExpressionId.Unreachable)return i;var a,o=this.currentType,s=null;switch(t!=g.Type.void&&(s=n.getTempLocal(o,!1),i=r.createTeeLocal(s.index,i)),e.operator){case y.Token.PLUS_PLUS:switch(o.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(p.BinaryOp.AddI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){if(u=this.currentType.classReference)if(h=u.lookupOverload(_.OperatorKind.POSTFIX_INC)){a=this.compileUnaryOverload(h,e.operand,i,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:var c=this.options;a=r.createBinary(c.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,i,o.toNativeOne(r));break;case 3:case 8:a=r.createBinary(p.BinaryOp.AddI64,i,r.createI64(1));break;case 11:a=r.createBinary(p.BinaryOp.AddF32,i,r.createF32(1));break;case 12:a=r.createBinary(p.BinaryOp.AddF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;case y.Token.MINUS_MINUS:switch(o.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:a=r.createBinary(p.BinaryOp.SubI32,i,r.createI32(1));break;case 9:if(this.currentType.is(256)){var u,h;if(u=this.currentType.classReference)if(h=u.lookupOverload(_.OperatorKind.POSTFIX_DEC)){a=this.compileUnaryOverload(h,e.operand,i,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),r.createUnreachable()}case 4:c=this.options;a=r.createBinary(c.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,i,o.toNativeOne(r));break;case 3:case 8:a=r.createBinary(p.BinaryOp.SubI64,i,r.createI64(1));break;case 11:a=r.createBinary(p.BinaryOp.SubF32,i,r.createF32(1));break;case 12:a=r.createBinary(p.BinaryOp.SubF64,i,r.createF64(1));break;default:return assert(!1),r.createUnreachable()}break;default:return assert(!1),r.createUnreachable()}if(!s)return this.currentType=g.Type.void,this.compileAssignmentWithValue(e.operand,a,!1);var d=this.compileAssignmentWithValue(e.operand,a,!1);this.currentType=s.type,n.freeTempLocal(s);var m=s.type.toNativeType();return r.createBlock(null,[d,r.createGetLocal(s.index,m)],m)},t.prototype.compileUnaryPrefixExpression=function(e,t){var r,n=this.module,i=!1;switch(e.operator){case y.Token.PLUS:if(r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(o=a.lookupOverload(_.OperatorKind.PLUS)){r=this.compileUnaryOverload(o,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}break;case y.Token.MINUS:if(e.operand.kind==m.NodeKind.LITERAL&&(e.operand.literalKind==m.LiteralKind.INTEGER||e.operand.literalKind==m.LiteralKind.FLOAT)){r=this.compileLiteralExpression(e.operand,t,!0),this.options.sourceMap&&this.addDebugLocation(r,e.range);break}if(r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(o=a.lookupOverload(_.OperatorKind.MINUS)){r=this.compileUnaryOverload(o,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.SubI32,n.createI32(0),r);break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,this.currentType.toNativeZero(n),r);break;case 3:case 8:r=n.createBinary(p.BinaryOp.SubI64,n.createI64(0),r);break;case 11:r=n.createUnary(p.UnaryOp.NegF32,r);break;case 12:r=n.createUnary(p.UnaryOp.NegF64,r);break;default:assert(!1),r=n.createUnreachable()}break;case y.Token.PLUS_PLUS:if(i=!0,r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(o=a.lookupOverload(_.OperatorKind.PREFIX_INC)){r=this.compileUnaryOverload(o,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.AddI32,r,this.module.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.AddI64:p.BinaryOp.AddI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.AddI64,r,n.createI64(1));break;case 11:r=n.createBinary(p.BinaryOp.AddF32,r,n.createF32(1));break;case 12:r=n.createBinary(p.BinaryOp.AddF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case y.Token.MINUS_MINUS:if(i=!0,r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256)){if(a=this.currentType.classReference)if(o=a.lookupOverload(_.OperatorKind.PREFIX_DEC)){r=this.compileUnaryOverload(o,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.SubI32,r,n.createI32(1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.SubI64:p.BinaryOp.SubI32,r,this.currentType.toNativeOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.SubI64,r,n.createI64(1));break;case 11:r=n.createBinary(p.BinaryOp.SubF32,r,n.createF32(1));break;case 12:r=n.createBinary(p.BinaryOp.SubF64,r,n.createF64(1));break;default:assert(!1),r=n.createUnreachable()}break;case y.Token.EXCLAMATION:if(r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t,0,0),this.currentType.is(256))if(a=this.currentType.classReference)if(o=a.lookupOverload(_.OperatorKind.NOT)){r=this.compileUnaryOverload(o,e.operand,r,e);break}r=this.makeIsFalseish(r,this.currentType),this.currentType=g.Type.bool;break;case y.Token.TILDE:if(r=this.compileExpression(e.operand,t==g.Type.void?g.Type.i32:t.is(8)?g.Type.i64:t,0,0),this.currentType.is(256)){var a,o;if(a=this.currentType.classReference)if(o=a.lookupOverload(_.OperatorKind.BITWISE_NOT)){r=this.compileUnaryOverload(o,e.operand,r,e);break}return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable()}switch(r=this.convertExpression(r,this.currentType,this.currentType.intType,1,0,e.operand),this.currentType.kind){case 0:case 1:case 2:case 5:case 6:case 7:case 10:r=n.createBinary(p.BinaryOp.XorI32,r,n.createI32(-1));break;case 9:case 4:r=n.createBinary(this.options.isWasm64?p.BinaryOp.XorI64:p.BinaryOp.XorI32,r,this.currentType.toNativeNegOne(n));break;case 3:case 8:r=n.createBinary(p.BinaryOp.XorI64,r,n.createI64(-1,-1));break;default:assert(!1),r=n.createUnreachable()}break;case y.Token.TYPEOF:return this.error(l.DiagnosticCode.Operation_not_supported,e.range),n.createUnreachable();default:return assert(!1),n.createUnreachable()}return i?this.compileAssignmentWithValue(e.operand,r,t!=g.Type.void):r},t.prototype.ensureSmallIntegerWrap=function(e,t){var r=this.module,n=this.currentFlow;switch(t.kind){case 0:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(p.UnaryOp.ExtendI8ToI32,e):r.createBinary(p.BinaryOp.ShrI32,r.createBinary(p.BinaryOp.ShlI32,e,r.createI32(24)),r.createI32(24)));break;case 1:n.canOverflow(e,t)&&(e=this.options.hasFeature(1)?r.createUnary(p.UnaryOp.ExtendI16ToI32,e):r.createBinary(p.BinaryOp.ShrI32,r.createBinary(p.BinaryOp.ShlI32,e,r.createI32(16)),r.createI32(16)));break;case 5:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.AndI32,e,r.createI32(255)));break;case 6:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.AndI32,e,r.createI32(65535)));break;case 10:n.canOverflow(e,t)&&(e=r.createBinary(p.BinaryOp.NeI32,e,r.createI32(0)))}return e},t.prototype.makeIsFalseish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return r.createUnary(p.UnaryOp.EqzI32,e);case 3:case 8:return r.createUnary(p.UnaryOp.EqzI64,e);case 9:case 4:return r.createUnary(64==t.size?p.UnaryOp.EqzI64:p.UnaryOp.EqzI32,e);case 11:return r.createBinary(p.BinaryOp.EqF32,e,r.createF32(0));case 12:return r.createBinary(p.BinaryOp.EqF64,e,r.createF64(0));default:return assert(!1),r.createI32(1)}},t.prototype.makeIsTrueish=function(e,t){var r=this.module;switch(t.kind){case 0:case 1:case 5:case 6:case 10:e=this.ensureSmallIntegerWrap(e,t);case 2:case 7:return e;case 3:case 8:return r.createBinary(p.BinaryOp.NeI64,e,r.createI64(0));case 9:case 4:return 64==t.size?r.createBinary(p.BinaryOp.NeI64,e,r.createI64(0)):e;case 11:return r.createBinary(p.BinaryOp.NeF32,e,r.createF32(0));case 12:return r.createBinary(p.BinaryOp.NeF64,e,r.createF64(0));default:return assert(!1),r.createI32(0)}},t.prototype.makeAllocation=function(e){var t=this.program;assert(e.program==t);var r=this.module,n=this.options;if(t.hasGC&&e.type.isManaged(t)){var i=assert(t.gcAllocateInstance);return this.compileFunction(i)?(this.currentType=e.type,r.createCall(i.internalName,[n.isWasm64?r.createI64(e.currentMemoryOffset):r.createI32(e.currentMemoryOffset),r.createI32(c.ensureGCHook(this,e))],n.nativeSizeType)):r.createUnreachable()}return(i=t.memoryAllocateInstance)&&this.compileFunction(i)?(this.currentType=e.type,r.createCall(i.internalName,[n.isWasm64?r.createI64(e.currentMemoryOffset):r.createI32(e.currentMemoryOffset)],n.nativeSizeType)):r.createUnreachable()},t.prototype.makeFieldInitialization=function(e,t){var r,n;void 0===t&&(t=[]);var i=e.members;if(!i)return[];var o=this.module,s=this.currentFlow,c=s.is(4096),l=c?assert(s.lookupLocal(u.CommonSymbols.this_)).index:0,p=this.options.nativeSizeType;try{for(var h=a(i.values()),d=h.next();!d.done;d=h.next()){var y=d.value;if(y.kind==_.ElementKind.FIELD&&y.parent==e){var m=y;assert(!m.isAny(u.CommonFlags.CONST));var g=m.type,T=g.toNativeType(),f=m.prototype.initializerNode;if(f)t.push(o.createStore(g.byteSize,o.createGetLocal(l,p),this.compileExpression(f,g,1,0),T,m.memoryOffset));else{var E=m.prototype.parameterIndex;t.push(o.createStore(g.byteSize,o.createGetLocal(l,p),E>=0?o.createGetLocal(c?assert(s.lookupLocal(m.name)).index:1+E,T):g.toNativeZero(o),T,m.memoryOffset))}}}}catch(e){r={error:e}}finally{try{d&&!d.done&&(n=h.return)&&n.call(h)}finally{if(r)throw r.error}}return t},t.prototype.addDebugLocation=function(e,t){var r=this.currentFlow.parentFunction,n=t.source;n.debugInfoIndex<0&&(n.debugInfoIndex=this.module.addDebugInfoFile(n.normalizedPath)),t.debugInfoRef=e,r.debugLocations.push(t)},t}(l.DiagnosticEmitter);function S(e,t){if(E=t.range.source.simplePath,I=_.mangleInternalName(e.name,e.parent,e.is(u.CommonFlags.INSTANCE),!0),e.hasDecorator(_.DecoratorFlags.EXTERNAL)){var r=e.program,n=assert(m.findDecorator(m.DecoratorKind.EXTERNAL,t.decorators)),i=n.arguments;if(i&&i.length){var a=i[0];a.kind==m.NodeKind.LITERAL&&a.literalKind==m.LiteralKind.STRING?(I=a.value,i.length>=2&&((a=i[1]).kind==m.NodeKind.LITERAL&&a.literalKind==m.LiteralKind.STRING?(E=I,I=a.value,i.length>2&&r.error(l.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"2",i.length.toString())):r.error(l.DiagnosticCode.String_literal_expected,a.range))):r.error(l.DiagnosticCode.String_literal_expected,a.range)}else r.error(l.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,n.range,"1","0")}}t.Compiler=b,function(e){e.started="~lib/started",e.argc="~lib/argc",e.setargc="~lib/setargc"}(v||(v={}))},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.Operation_not_supported=100]="Operation_not_supported",e[e.Operation_is_unsafe=101]="Operation_is_unsafe",e[e.User_defined_0=102]="User_defined_0",e[e.Conversion_from_type_0_to_1_requires_an_explicit_cast=200]="Conversion_from_type_0_to_1_requires_an_explicit_cast",e[e.Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit=201]="Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit",e[e.Type_0_cannot_be_changed_to_type_1=202]="Type_0_cannot_be_changed_to_type_1",e[e.Type_0_cannot_be_reinterpreted_as_type_1=203]="Type_0_cannot_be_reinterpreted_as_type_1",e[e.Basic_type_0_cannot_be_nullable=204]="Basic_type_0_cannot_be_nullable",e[e.Cannot_export_a_mutable_global=205]="Cannot_export_a_mutable_global",e[e.Compiling_constant_with_non_constant_initializer_as_mutable=206]="Compiling_constant_with_non_constant_initializer_as_mutable",e[e.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa=207]="Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa",e[e.Unmanaged_classes_cannot_implement_interfaces=208]="Unmanaged_classes_cannot_implement_interfaces",e[e.Invalid_regular_expression_flags=209]="Invalid_regular_expression_flags",e[e.Implementation_0_must_match_the_signature_1=210]="Implementation_0_must_match_the_signature_1",e[e.Class_0_is_sealed_and_cannot_be_extended=211]="Class_0_is_sealed_and_cannot_be_extended",e[e.Decorator_0_is_not_valid_here=212]="Decorator_0_is_not_valid_here",e[e.Duplicate_decorator=213]="Duplicate_decorator",e[e.An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf=214]="An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf",e[e.Optional_parameter_must_have_an_initializer=215]="Optional_parameter_must_have_an_initializer",e[e.Constructor_of_class_0_must_not_require_any_arguments=216]="Constructor_of_class_0_must_not_require_any_arguments",e[e.Function_0_cannot_be_inlined_into_itself=217]="Function_0_cannot_be_inlined_into_itself",e[e.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set=218]="Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set",e[e.Optional_properties_are_not_supported=219]="Optional_properties_are_not_supported",e[e.Expression_must_be_a_compile_time_constant=220]="Expression_must_be_a_compile_time_constant",e[e.Module_cannot_have_multiple_start_functions=221]="Module_cannot_have_multiple_start_functions",e[e.Unterminated_string_literal=1002]="Unterminated_string_literal",e[e.Identifier_expected=1003]="Identifier_expected",e[e._0_expected=1005]="_0_expected",e[e.A_file_cannot_have_a_reference_to_itself=1006]="A_file_cannot_have_a_reference_to_itself",e[e.Trailing_comma_not_allowed=1009]="Trailing_comma_not_allowed",e[e.Unexpected_token=1012]="Unexpected_token",e[e.A_rest_parameter_must_be_last_in_a_parameter_list=1014]="A_rest_parameter_must_be_last_in_a_parameter_list",e[e.Parameter_cannot_have_question_mark_and_initializer=1015]="Parameter_cannot_have_question_mark_and_initializer",e[e.A_required_parameter_cannot_follow_an_optional_parameter=1016]="A_required_parameter_cannot_follow_an_optional_parameter",e[e.Statements_are_not_allowed_in_ambient_contexts=1036]="Statements_are_not_allowed_in_ambient_contexts",e[e.Initializers_are_not_allowed_in_ambient_contexts=1039]="Initializers_are_not_allowed_in_ambient_contexts",e[e._0_modifier_cannot_be_used_here=1042]="_0_modifier_cannot_be_used_here",e[e.A_rest_parameter_cannot_be_optional=1047]="A_rest_parameter_cannot_be_optional",e[e.A_rest_parameter_cannot_have_an_initializer=1048]="A_rest_parameter_cannot_have_an_initializer",e[e.A_set_accessor_must_have_exactly_one_parameter=1049]="A_set_accessor_must_have_exactly_one_parameter",e[e.A_set_accessor_parameter_cannot_have_an_initializer=1052]="A_set_accessor_parameter_cannot_have_an_initializer",e[e.A_get_accessor_cannot_have_parameters=1054]="A_get_accessor_cannot_have_parameters",e[e.Enum_member_must_have_initializer=1061]="Enum_member_must_have_initializer",e[e.Type_parameters_cannot_appear_on_a_constructor_declaration=1092]="Type_parameters_cannot_appear_on_a_constructor_declaration",e[e.Type_annotation_cannot_appear_on_a_constructor_declaration=1093]="Type_annotation_cannot_appear_on_a_constructor_declaration",e[e.An_accessor_cannot_have_type_parameters=1094]="An_accessor_cannot_have_type_parameters",e[e.A_set_accessor_cannot_have_a_return_type_annotation=1095]="A_set_accessor_cannot_have_a_return_type_annotation",e[e.Type_parameter_list_cannot_be_empty=1098]="Type_parameter_list_cannot_be_empty",e[e.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement=1104]="A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement",e[e.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement=1105]="A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement",e[e.A_return_statement_can_only_be_used_within_a_function_body=1108]="A_return_statement_can_only_be_used_within_a_function_body",e[e.Expression_expected=1109]="Expression_expected",e[e.Type_expected=1110]="Type_expected",e[e.A_default_clause_cannot_appear_more_than_once_in_a_switch_statement=1113]="A_default_clause_cannot_appear_more_than_once_in_a_switch_statement",e[e.Duplicate_label_0=1114]="Duplicate_label_0",e[e.Octal_literals_are_not_allowed_in_strict_mode=1121]="Octal_literals_are_not_allowed_in_strict_mode",e[e.Digit_expected=1124]="Digit_expected",e[e.Hexadecimal_digit_expected=1125]="Hexadecimal_digit_expected",e[e.Unexpected_end_of_text=1126]="Unexpected_end_of_text",e[e.Invalid_character=1127]="Invalid_character",e[e._case_or_default_expected=1130]="_case_or_default_expected",e[e._super_must_be_followed_by_an_argument_list_or_member_access=1034]="_super_must_be_followed_by_an_argument_list_or_member_access",e[e.A_declare_modifier_cannot_be_used_in_an_already_ambient_context=1038]="A_declare_modifier_cannot_be_used_in_an_already_ambient_context",e[e.Type_argument_expected=1140]="Type_argument_expected",e[e.String_literal_expected=1141]="String_literal_expected",e[e.Line_break_not_permitted_here=1142]="Line_break_not_permitted_here",e[e.Declaration_expected=1146]="Declaration_expected",e[e._const_declarations_must_be_initialized=1155]="_const_declarations_must_be_initialized",e[e.Unterminated_regular_expression_literal=1161]="Unterminated_regular_expression_literal",e[e.Interface_declaration_cannot_have_implements_clause=1176]="Interface_declaration_cannot_have_implements_clause",e[e.Binary_digit_expected=1177]="Binary_digit_expected",e[e.Octal_digit_expected=1178]="Octal_digit_expected",e[e.An_implementation_cannot_be_declared_in_ambient_contexts=1183]="An_implementation_cannot_be_declared_in_ambient_contexts",e[e.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive=1198]="An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive",e[e.Unterminated_Unicode_escape_sequence=1199]="Unterminated_Unicode_escape_sequence",e[e.Decorators_are_not_valid_here=1206]="Decorators_are_not_valid_here",e[e._abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration=1242]="_abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration",e[e.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract=1245]="Method_0_cannot_have_an_implementation_because_it_is_marked_abstract",e[e.A_definite_assignment_assertion_is_not_permitted_in_this_context=1255]="A_definite_assignment_assertion_is_not_permitted_in_this_context",e[e.A_class_may_only_extend_another_class=1311]="A_class_may_only_extend_another_class",e[e.A_parameter_property_cannot_be_declared_using_a_rest_parameter=1317]="A_parameter_property_cannot_be_declared_using_a_rest_parameter",e[e.Duplicate_identifier_0=2300]="Duplicate_identifier_0",e[e.Cannot_find_name_0=2304]="Cannot_find_name_0",e[e.Module_0_has_no_exported_member_1=2305]="Module_0_has_no_exported_member_1",e[e.Generic_type_0_requires_1_type_argument_s=2314]="Generic_type_0_requires_1_type_argument_s",e[e.Type_0_is_not_generic=2315]="Type_0_is_not_generic",e[e.Type_0_is_not_assignable_to_type_1=2322]="Type_0_is_not_assignable_to_type_1",e[e.Index_signature_is_missing_in_type_0=2329]="Index_signature_is_missing_in_type_0",e[e._this_cannot_be_referenced_in_current_location=2332]="_this_cannot_be_referenced_in_current_location",e[e._super_can_only_be_referenced_in_a_derived_class=2335]="_super_can_only_be_referenced_in_a_derived_class",e[e.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors=2337]="Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors",e[e.Property_0_does_not_exist_on_type_1=2339]="Property_0_does_not_exist_on_type_1",e[e.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures=2349]="Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures",e[e.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature=2351]="Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature",e[e.A_function_whose_declared_type_is_not_void_must_return_a_value=2355]="A_function_whose_declared_type_is_not_void_must_return_a_value",e[e.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access=2357]="The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access",e[e.The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access=2364]="The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access",e[e.Operator_0_cannot_be_applied_to_types_1_and_2=2365]="Operator_0_cannot_be_applied_to_types_1_and_2",e[e.A_super_call_must_be_the_first_statement_in_the_constructor=2376]="A_super_call_must_be_the_first_statement_in_the_constructor",e[e.Constructors_for_derived_classes_must_contain_a_super_call=2377]="Constructors_for_derived_classes_must_contain_a_super_call",e[e._get_and_set_accessor_must_have_the_same_type=2380]="_get_and_set_accessor_must_have_the_same_type",e[e.Constructor_implementation_is_missing=2390]="Constructor_implementation_is_missing",e[e.Function_implementation_is_missing_or_not_immediately_following_the_declaration=2391]="Function_implementation_is_missing_or_not_immediately_following_the_declaration",e[e.Multiple_constructor_implementations_are_not_allowed=2392]="Multiple_constructor_implementations_are_not_allowed",e[e.Duplicate_function_implementation=2393]="Duplicate_function_implementation",e[e.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local=2395]="Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local",e[e.A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged=2434]="A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged",e[e.Type_0_has_no_property_1=2460]="Type_0_has_no_property_1",e[e.The_0_operator_cannot_be_applied_to_type_1=2469]="The_0_operator_cannot_be_applied_to_type_1",e[e.In_const_enum_declarations_member_initializer_must_be_constant_expression=2474]="In_const_enum_declarations_member_initializer_must_be_constant_expression",e[e.Export_declaration_conflicts_with_exported_declaration_of_0=2484]="Export_declaration_conflicts_with_exported_declaration_of_0",e[e.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property=2540]="Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property",e[e.The_target_of_an_assignment_must_be_a_variable_or_a_property_access=2541]="The_target_of_an_assignment_must_be_a_variable_or_a_property_access",e[e.Index_signature_in_type_0_only_permits_reading=2542]="Index_signature_in_type_0_only_permits_reading",e[e.Expected_0_arguments_but_got_1=2554]="Expected_0_arguments_but_got_1",e[e.Expected_at_least_0_arguments_but_got_1=2555]="Expected_at_least_0_arguments_but_got_1",e[e.Expected_0_type_arguments_but_got_1=2558]="Expected_0_type_arguments_but_got_1",e[e.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums=2651]="A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums",e[e.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration=2673]="Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration",e[e.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration=2674]="Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration",e[e.Namespace_0_has_no_exported_member_1=2694]="Namespace_0_has_no_exported_member_1",e[e.Required_type_parameters_may_not_follow_optional_type_parameters=2706]="Required_type_parameters_may_not_follow_optional_type_parameters",e[e.Duplicate_property_0=2718]="Duplicate_property_0",e[e.File_0_not_found=6054]="File_0_not_found",e[e.Numeric_separators_are_not_allowed_here=6188]="Numeric_separators_are_not_allowed_here",e[e.Multiple_consecutive_numeric_separators_are_not_permitted=6189]="Multiple_consecutive_numeric_separators_are_not_permitted",e[e._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class=17009]="_super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class",e[e._super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class=17011]="_super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class"}(t.DiagnosticCode||(t.DiagnosticCode={})),t.diagnosticCodeToString=function(e){switch(e){case 100:return"Operation not supported.";case 101:return"Operation is unsafe.";case 102:return"User-defined: {0}";case 200:return"Conversion from type '{0}' to '{1}' requires an explicit cast.";case 201:return"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.";case 202:return"Type '{0}' cannot be changed to type '{1}'.";case 203:return"Type '{0}' cannot be reinterpreted as type '{1}'.";case 204:return"Basic type '{0}' cannot be nullable.";case 205:return"Cannot export a mutable global.";case 206:return"Compiling constant with non-constant initializer as mutable.";case 207:return"Unmanaged classes cannot extend managed classes and vice-versa.";case 208:return"Unmanaged classes cannot implement interfaces.";case 209:return"Invalid regular expression flags.";case 210:return"Implementation '{0}' must match the signature '{1}'.";case 211:return"Class '{0}' is sealed and cannot be extended.";case 212:return"Decorator '{0}' is not valid here.";case 213:return"Duplicate decorator.";case 214:return"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.";case 215:return"Optional parameter must have an initializer.";case 216:return"Constructor of class '{0}' must not require any arguments.";case 217:return"Function '{0}' cannot be inlined into itself.";case 218:return"Cannot access method '{0}' without calling it as it requires 'this' to be set.";case 219:return"Optional properties are not supported.";case 220:return"Expression must be a compile-time constant.";case 221:return"Module cannot have multiple start functions.";case 1002:return"Unterminated string literal.";case 1003:return"Identifier expected.";case 1005:return"'{0}' expected.";case 1006:return"A file cannot have a reference to itself.";case 1009:return"Trailing comma not allowed.";case 1012:return"Unexpected token.";case 1014:return"A rest parameter must be last in a parameter list.";case 1015:return"Parameter cannot have question mark and initializer.";case 1016:return"A required parameter cannot follow an optional parameter.";case 1036:return"Statements are not allowed in ambient contexts.";case 1039:return"Initializers are not allowed in ambient contexts.";case 1042:return"'{0}' modifier cannot be used here.";case 1047:return"A rest parameter cannot be optional.";case 1048:return"A rest parameter cannot have an initializer.";case 1049:return"A 'set' accessor must have exactly one parameter.";case 1052:return"A 'set' accessor parameter cannot have an initializer.";case 1054:return"A 'get' accessor cannot have parameters.";case 1061:return"Enum member must have initializer.";case 1092:return"Type parameters cannot appear on a constructor declaration.";case 1093:return"Type annotation cannot appear on a constructor declaration.";case 1094:return"An accessor cannot have type parameters.";case 1095:return"A 'set' accessor cannot have a return type annotation.";case 1098:return"Type parameter list cannot be empty.";case 1104:return"A 'continue' statement can only be used within an enclosing iteration statement.";case 1105:return"A 'break' statement can only be used within an enclosing iteration or switch statement.";case 1108:return"A 'return' statement can only be used within a function body.";case 1109:return"Expression expected.";case 1110:return"Type expected.";case 1113:return"A 'default' clause cannot appear more than once in a 'switch' statement.";case 1114:return"Duplicate label '{0}'.";case 1121:return"Octal literals are not allowed in strict mode.";case 1124:return"Digit expected.";case 1125:return"Hexadecimal digit expected.";case 1126:return"Unexpected end of text.";case 1127:return"Invalid character.";case 1130:return"'case' or 'default' expected.";case 1034:return"'super' must be followed by an argument list or member access.";case 1038:return"A 'declare' modifier cannot be used in an already ambient context.";case 1140:return"Type argument expected.";case 1141:return"String literal expected.";case 1142:return"Line break not permitted here.";case 1146:return"Declaration expected.";case 1155:return"'const' declarations must be initialized.";case 1161:return"Unterminated regular expression literal.";case 1176:return"Interface declaration cannot have 'implements' clause.";case 1177:return"Binary digit expected.";case 1178:return"Octal digit expected.";case 1183:return"An implementation cannot be declared in ambient contexts.";case 1198:return"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.";case 1199:return"Unterminated Unicode escape sequence.";case 1206:return"Decorators are not valid here.";case 1242:return"'abstract' modifier can only appear on a class, method, or property declaration.";case 1245:return"Method '{0}' cannot have an implementation because it is marked abstract.";case 1255:return"A definite assignment assertion '!' is not permitted in this context.";case 1311:return"A class may only extend another class.";case 1317:return"A parameter property cannot be declared using a rest parameter.";case 2300:return"Duplicate identifier '{0}'.";case 2304:return"Cannot find name '{0}'.";case 2305:return"Module '{0}' has no exported member '{1}'.";case 2314:return"Generic type '{0}' requires {1} type argument(s).";case 2315:return"Type '{0}' is not generic.";case 2322:return"Type '{0}' is not assignable to type '{1}'.";case 2329:return"Index signature is missing in type '{0}'.";case 2332:return"'this' cannot be referenced in current location.";case 2335:return"'super' can only be referenced in a derived class.";case 2337:return"Super calls are not permitted outside constructors or in nested functions inside constructors.";case 2339:return"Property '{0}' does not exist on type '{1}'.";case 2349:return"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.";case 2351:return"Cannot use 'new' with an expression whose type lacks a construct signature.";case 2355:return"A function whose declared type is not 'void' must return a value.";case 2357:return"The operand of an increment or decrement operator must be a variable or a property access.";case 2364:return"The left-hand side of an assignment expression must be a variable or a property access.";case 2365:return"Operator '{0}' cannot be applied to types '{1}' and '{2}'.";case 2376:return"A 'super' call must be the first statement in the constructor.";case 2377:return"Constructors for derived classes must contain a 'super' call.";case 2380:return"'get' and 'set' accessor must have the same type.";case 2390:return"Constructor implementation is missing.";case 2391:return"Function implementation is missing or not immediately following the declaration.";case 2392:return"Multiple constructor implementations are not allowed.";case 2393:return"Duplicate function implementation.";case 2395:return"Individual declarations in merged declaration '{0}' must be all exported or all local.";case 2434:return"A namespace declaration cannot be located prior to a class or function with which it is merged.";case 2460:return"Type '{0}' has no property '{1}'.";case 2469:return"The '{0}' operator cannot be applied to type '{1}'.";case 2474:return"In 'const' enum declarations member initializer must be constant expression.";case 2484:return"Export declaration conflicts with exported declaration of '{0}'.";case 2540:return"Cannot assign to '{0}' because it is a constant or a read-only property.";case 2541:return"The target of an assignment must be a variable or a property access.";case 2542:return"Index signature in type '{0}' only permits reading.";case 2554:return"Expected {0} arguments, but got {1}.";case 2555:return"Expected at least {0} arguments, but got {1}.";case 2558:return"Expected {0} type arguments, but got {1}.";case 2651:return"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.";case 2673:return"Constructor of class '{0}' is private and only accessible within the class declaration.";case 2674:return"Constructor of class '{0}' is protected and only accessible within the class declaration.";case 2694:return"Namespace '{0}' has no exported member '{1}'.";case 2706:return"Required type parameters may not follow optional type parameters.";case 2718:return"Duplicate property '{0}'.";case 6054:return"File '{0}' not found.";case 6188:return"Numeric separators are not allowed here.";case 6189:return"Multiple consecutive numeric separators are not permitted.";case 17009:return"'super' must be called before accessing 'this' in the constructor of a derived class.";case 17011:return"'super' must be called before accessing a property of 'super' in the constructor of a derived class.";default:return""}}},function(e,t,r){"use strict";var n=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i=r(6),a=r(3),o=r(4),s=r(0),c=r(1),l=r(2);!function(e){e[e.NONE=0]="NONE",e[e.RETURNS=1]="RETURNS",e[e.RETURNS_WRAPPED=2]="RETURNS_WRAPPED",e[e.THROWS=4]="THROWS",e[e.BREAKS=8]="BREAKS",e[e.CONTINUES=16]="CONTINUES",e[e.ALLOCATES=32]="ALLOCATES",e[e.CALLS_SUPER=64]="CALLS_SUPER",e[e.CONDITIONALLY_RETURNS=128]="CONDITIONALLY_RETURNS",e[e.CONDITIONALLY_THROWS=256]="CONDITIONALLY_THROWS",e[e.CONDITIONALLY_BREAKS=512]="CONDITIONALLY_BREAKS",e[e.CONDITIONALLY_CONTINUES=1024]="CONDITIONALLY_CONTINUES",e[e.CONDITIONALLY_ALLOCATES=2048]="CONDITIONALLY_ALLOCATES",e[e.INLINE_CONTEXT=4096]="INLINE_CONTEXT",e[e.UNCHECKED_CONTEXT=8192]="UNCHECKED_CONTEXT",e[e.ANY_TERMINATING=29]="ANY_TERMINATING",e[e.ANY_CATEGORICAL=127]="ANY_CATEGORICAL",e[e.ANY_CONDITIONAL=3968]="ANY_CONDITIONAL"}(t.FlowFlags||(t.FlowFlags={}));var p=function(){function e(){this.scopedLocals=null}return e.create=function(t){var r=new e;return r.parent=null,r.flags=0,r.parentFunction=t,r.continueLabel=null,r.breakLabel=null,r.returnType=t.signature.returnType,r.contextualTypeArguments=t.contextualTypeArguments,r.wrappedLocals=i64_new(0),r.wrappedLocalsExt=null,r.inlineFunction=null,r.inlineReturnLabel=null,r},e.createInline=function(t,r){var n=e.create(t);return n.set(4096),n.inlineFunction=r,n.inlineReturnLabel=r.internalName+"|inlined."+(r.nextInlineId++).toString(10),n.returnType=r.signature.returnType,n.contextualTypeArguments=r.contextualTypeArguments,n},Object.defineProperty(e.prototype,"actualFunction",{get:function(){return this.inlineFunction||this.parentFunction},enumerable:!0,configurable:!0}),e.prototype.is=function(e){return(this.flags&e)==e},e.prototype.isAny=function(e){return 0!=(this.flags&e)},e.prototype.set=function(e){this.flags|=e},e.prototype.unset=function(e){this.flags&=~e},e.prototype.fork=function(){var t=new e;return t.parent=this,t.flags=this.flags,t.parentFunction=this.parentFunction,t.continueLabel=this.continueLabel,t.breakLabel=this.breakLabel,t.returnType=this.returnType,t.contextualTypeArguments=this.contextualTypeArguments,t.wrappedLocals=this.wrappedLocals,t.wrappedLocalsExt=this.wrappedLocalsExt?this.wrappedLocalsExt.slice():null,t.inlineFunction=this.inlineFunction,t.inlineReturnLabel=this.inlineReturnLabel,t},e.prototype.getTempLocal=function(e,t){void 0===t&&(t=!1);var r,n,i=this.parentFunction;switch(e.toNativeType()){case o.NativeType.I32:r=i.tempI32s;break;case o.NativeType.I64:r=i.tempI64s;break;case o.NativeType.F32:r=i.tempF32s;break;case o.NativeType.F64:r=i.tempF64s;break;default:throw new Error("concrete type expected")}return r&&r.length?((n=r.pop()).type=e,n.flags=s.CommonFlags.NONE):n=i.addLocal(e),e.is(36)&&this.setLocalWrapped(n.index,t),n},e.prototype.freeTempLocal=function(e){if(!e.is(s.CommonFlags.INLINED)){assert(e.index>=0);var t,r=this.parentFunction;switch(assert(null!=e.type),e.type.toNativeType()){case o.NativeType.I32:t=r.tempI32s||(r.tempI32s=[]);break;case o.NativeType.I64:t=r.tempI64s||(r.tempI64s=[]);break;case o.NativeType.F32:t=r.tempF32s||(r.tempF32s=[]);break;case o.NativeType.F64:t=r.tempF64s||(r.tempF64s=[]);break;default:throw new Error("concrete type expected")}assert(e.index>=0),t.push(e)}},e.prototype.getAndFreeTempLocal=function(e,t){var r,n,i=this.parentFunction;switch(e.toNativeType()){case o.NativeType.I32:r=i.tempI32s||(i.tempI32s=[]);break;case o.NativeType.I64:r=i.tempI64s||(i.tempI64s=[]);break;case o.NativeType.F32:r=i.tempF32s||(i.tempF32s=[]);break;case o.NativeType.F64:r=i.tempF64s||(i.tempF64s=[]);break;default:throw new Error("concrete type expected")}return r.length?(n=r[r.length-1]).type=e:(n=i.addLocal(e),r.push(n)),e.is(36)&&this.setLocalWrapped(n.index,t),n},e.prototype.addScopedLocal=function(e,t,r,n){void 0===n&&(n=null);var i=this.getTempLocal(t,!1);if(this.scopedLocals){var a=this.scopedLocals.get(e);if(a)return n&&this.parentFunction.program.error(c.DiagnosticCode.Duplicate_identifier_0,n.range),a}else this.scopedLocals=new Map;return i.set(s.CommonFlags.SCOPED),this.scopedLocals.set(e,i),t.is(36)&&this.setLocalWrapped(i.index,r),i},e.prototype.addScopedAlias=function(e,t,r,n){if(void 0===n&&(n=null),this.scopedLocals){var i=this.scopedLocals.get(e);if(i)return n&&this.parentFunction.program.error(c.DiagnosticCode.Duplicate_identifier_0,n.range),i}else this.scopedLocals=new Map;assert(r1?e.breakLabel=t[r-2].toString(10):(e.breakLabel=null,e.breakStack=null)},e.prototype.inherit=function(e){this.flags|=4095&e.flags,this.wrappedLocals=e.wrappedLocals,this.wrappedLocalsExt=e.wrappedLocalsExt},e.prototype.inheritConditional=function(e){e.is(1)&&this.set(128),e.is(4)&&this.set(256),e.is(8)&&e.breakLabel==this.breakLabel&&this.set(512),e.is(16)&&e.continueLabel==this.continueLabel&&this.set(1024),e.is(32)&&this.set(2048)},e.prototype.inheritMutual=function(e,t){this.flags|=e.flags&t.flags&127,this.flags|=3968&e.flags,this.flags|=3968&t.flags,this.wrappedLocals=i64_and(e.wrappedLocals,t.wrappedLocals);var r=e.wrappedLocalsExt,n=t.wrappedLocalsExt;if(null!=r&&null!=n){var i=this.wrappedLocalsExt,a=min(r.length,n.length);if(a){if(i)for(;i.lengthc):this.canOverflow(o.getBinaryLeft(e),t)&&!(o.getExpressionId(r=o.getBinaryRight(e))==o.ExpressionId.Const&&o.getConstValueI32(r)>=c);case o.BinaryOp.DivU32:case o.BinaryOp.RemI32:case o.BinaryOp.RemU32:return this.canOverflow(o.getBinaryLeft(e),t)||this.canOverflow(o.getBinaryRight(e),t)}break;case o.ExpressionId.Unary:switch(o.getUnaryOp(e)){case o.UnaryOp.EqzI32:case o.UnaryOp.EqzI64:return!1;case o.UnaryOp.ClzI32:case o.UnaryOp.CtzI32:case o.UnaryOp.PopcntI32:return t.size<7}break;case o.ExpressionId.Const:var l=0;switch(o.getExpressionType(e)){case o.NativeType.I32:l=o.getConstValueI32(e);break;case o.NativeType.I64:l=o.getConstValueI64Low(e);break;case o.NativeType.F32:l=i32(o.getConstValueF32(e));break;case o.NativeType.F64:l=i32(o.getConstValueF64(e));break;default:assert(!1)}switch(t.kind){case 0:return li8.MAX_VALUE;case 1:return li16.MAX_VALUE;case 5:return l<0||l>u8.MAX_VALUE;case 6:return l<0||l>u16.MAX_VALUE;case 10:return 0!=(-2&l)}break;case o.ExpressionId.Load:var p=void 0;switch(o.getLoadBytes(e)){case 1:p=o.isLoadSigned(e)?i.Type.i8:i.Type.u8;break;case 2:p=o.isLoadSigned(e)?i.Type.i16:i.Type.u16;break;default:p=o.isLoadSigned(e)?i.Type.i32:i.Type.u32}return u(p,t);case o.ExpressionId.Block:if(!o.getBlockName(e)){var _=assert(o.getBlockChildCount(e)),h=o.getBlockChild(e,_-1);return this.canOverflow(h,t)}break;case o.ExpressionId.If:return this.canOverflow(o.getIfTrue(e),t)||this.canOverflow(assert(o.getIfFalse(e)),t);case o.ExpressionId.Select:return this.canOverflow(o.getSelectThen(e),t)||this.canOverflow(o.getSelectElse(e),t);case o.ExpressionId.Call:var d=this.parentFunction.program,y=assert(d.instancesByName.get(assert(o.getCallTarget(e))));assert(y.kind==a.ElementKind.FUNCTION);var m=y.signature.returnType;return!y.flow.is(2)||u(m,t);case o.ExpressionId.Unreachable:return!1}return!0},e}();function u(e,t){return!e.is(4)||e.size>t.size||e.is(1)!=t.is(1)}t.Flow=p},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(4),i=function(){function e(){this.text=[],this.functionId=0}return e.decompile=function(t){var r=new e;return r.decompile(t),r.finish()},e.prototype.decompile=function(e){throw new Error("not implemented")},e.prototype.decompileFunction=function(e){var t=n.getFunctionName(e)||"$"+this.functionId.toString(10),r=n.getFunctionBody(e);this.push("function "),this.push(t),this.push("(");for(var i=0,o=n.getFunctionParamCount(e);i0&&this.push(", "),this.push("$"),this.push(i.toString(10)),this.push(": "),this.push(a(n.getFunctionParamType(e,i)));this.push("): "),this.push(a(n.getFunctionResultType(e))),this.push(" "),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("{\n"),this.decompileExpression(r),n.getExpressionId(r)!=n.ExpressionId.Block&&this.push("\n}\n"),++this.functionId},e.prototype.decompileExpression=function(e){var t,r,i,o,s=n.getExpressionId(e),c=n.getExpressionType(e);switch(s){case n.ExpressionId.Block:for(null!=(r=n.getBlockName(e))&&(this.push(r),this.push(": ")),this.push("{\n"),o=n.getBlockChildCount(e),i=0;i("),this.push(n.getLoadOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getLoadPtr(e)),void this.push(")");case n.ExpressionId.Store:return this.push("store<"),this.push(a(c)),this.push(">("),this.push(n.getStoreOffset(e).toString(10)),this.push(" + "),this.decompileExpression(n.getStorePtr(e)),this.push(", "),this.decompileExpression(n.getStoreValue(e)),void this.push(")");case n.ExpressionId.Const:switch(c){case n.NativeType.I32:return void this.push(n.getConstValueI32(e).toString(10));case n.NativeType.I64:return void this.push(i64_to_string(i64_new(n.getConstValueI64Low(e),n.getConstValueI64High(e))));case n.NativeType.F32:return void this.push(n.getConstValueF32(e).toString(10));case n.NativeType.F64:return void this.push(n.getConstValueF64(e).toString(10))}break;case n.ExpressionId.Unary:switch(n.getUnaryOp(e)){case n.UnaryOp.ClzI32:return this.push("clz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI32:return this.push("ctz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI32:return this.push("popcnt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NegF32:case n.UnaryOp.NegF64:return this.push("-"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.AbsF32:return this.push("abs("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF32:return this.push("ceil("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF32:return this.push("floor("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF32:return this.push("trunc("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF32:return this.push("nearest("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF32:return this.push("sqrt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.EqzI32:case n.UnaryOp.EqzI64:return this.push("!"),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ClzI64:return this.push("clz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CtzI64:return this.push("ctz("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.PopcntI64:return this.push("popcnt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.AbsF64:return this.push("abs("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.CeilF64:return this.push("ceil("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.FloorF64:return this.push("floor("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.TruncF64:return this.push("trunc("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.NearestF64:return this.push("nearest("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.SqrtF64:return this.push("sqrt("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ExtendI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ExtendU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.WrapI64:case n.UnaryOp.TruncF32ToI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToI64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF32ToU64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToI64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.TruncF64ToU64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretF32:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretF64:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ConvertI32ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI32ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU32ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertI64ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ConvertU64ToF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.PromoteF32:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.DemoteF64:return this.push(""),void this.decompileExpression(n.getUnaryValue(e));case n.UnaryOp.ReinterpretI32:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")");case n.UnaryOp.ReinterpretI64:return this.push("reinterpret("),this.decompileExpression(n.getUnaryValue(e)),void this.push(")")}break;case n.ExpressionId.Binary:switch(n.getBinaryOp(e)){case n.BinaryOp.AddI32:case n.BinaryOp.AddI64:case n.BinaryOp.AddF32:case n.BinaryOp.AddF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" + "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.SubI32:case n.BinaryOp.SubI64:case n.BinaryOp.SubF32:case n.BinaryOp.SubF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" - "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.MulI32:case n.BinaryOp.MulI64:case n.BinaryOp.MulF32:case n.BinaryOp.MulF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" * "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivI32:case n.BinaryOp.DivI64:case n.BinaryOp.DivF32:case n.BinaryOp.DivF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU32:return this.push("("),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RemI32:case n.BinaryOp.RemI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU32:return this.push("("),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.AndI32:case n.BinaryOp.AndI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" & "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.OrI32:case n.BinaryOp.OrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" | "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.XorI32:case n.BinaryOp.XorI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" ^ "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShlI32:case n.BinaryOp.ShlI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" << "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrU32:case n.BinaryOp.ShrU64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >>> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.ShrI32:case n.BinaryOp.ShrI64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >> "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI32:return this.push("rotl("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI32:return this.push("rotr("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.EqI32:case n.BinaryOp.EqI64:case n.BinaryOp.EqF32:case n.BinaryOp.EqF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" == "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.NeI32:case n.BinaryOp.NeI64:case n.BinaryOp.NeF32:case n.BinaryOp.NeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" != "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtI32:case n.BinaryOp.LtI64:case n.BinaryOp.LtF32:case n.BinaryOp.LtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LtU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeI32:case n.BinaryOp.LeI64:case n.BinaryOp.LeF32:case n.BinaryOp.LeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtI32:case n.BinaryOp.GtI64:case n.BinaryOp.GtF32:case n.BinaryOp.GtF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeI32:case n.BinaryOp.GeI64:case n.BinaryOp.GeF32:case n.BinaryOp.GeF64:return this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU32:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.DivU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" / "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RemU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" % "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.RotlI64:return this.push("rotl("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.RotrI64:return this.push("rotr("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.LtU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" < "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.LeU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" <= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GtU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" > "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.GeU64:return this.push(""),this.decompileExpression(n.getBinaryLeft(e)),this.push(" >= "),void this.decompileExpression(n.getBinaryRight(e));case n.BinaryOp.CopysignF32:return this.push("copysign("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF32:return this.push("min("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF32:return this.push("max("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.CopysignF64:return this.push("copysign("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MinF64:return this.push("min("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")");case n.BinaryOp.MaxF64:return this.push("max("),this.decompileExpression(n.getBinaryLeft(e)),this.push(", "),this.decompileExpression(n.getBinaryRight(e)),void this.push(")")}return;case n.ExpressionId.Select:return this.push("select<"),this.push(a(c)),this.push(">("),this.decompileExpression(n.getSelectThen(e)),this.push(", "),this.decompileExpression(n.getSelectElse(e)),this.push(", "),this.decompileExpression(n.getSelectCondition(e)),void this.push(")");case n.ExpressionId.Drop:return this.decompileExpression(n.getDropValue(e)),void this.push(";\n");case n.ExpressionId.Return:return void((t=n.getReturnValue(e))?(this.push("return "),this.decompileExpression(t),this.push(";\n")):this.push("return;\n"));case n.ExpressionId.Host:switch(n.getHostOp(e)){case n.HostOp.CurrentMemory:return void this.push("memory.size()");case n.HostOp.GrowMemory:return this.push("memory.grow("),this.decompileExpression(n.getHostOperand(e,0)),void this.push(")")}break;case n.ExpressionId.Nop:return void this.push(";\n");case n.ExpressionId.Unreachable:return void this.push("unreachable()");case n.ExpressionId.AtomicCmpxchg:case n.ExpressionId.AtomicRMW:case n.ExpressionId.AtomicWait:case n.ExpressionId.AtomicWake:}throw new Error("not implemented")},e.prototype.push=function(e){this.text.push(e)},e.prototype.finish=function(){var e=this.text.join("");return this.text=[],e},e}();function a(e){switch(e){case n.NativeType.None:return"void";case n.NativeType.I32:return"i32";case n.NativeType.I64:return"i64";case n.NativeType.F32:return"f32";case n.NativeType.F64:return"f64";case n.NativeType.V128:return"v128";case n.NativeType.Unreachable:throw new Error("unreachable type");case n.NativeType.Auto:throw new Error("auto type");default:throw new Error("unexpected type")}}t.Decompiler=i},function(e,t,r){"use strict";var n,i=this&&this.__extends||(n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)},function(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),a=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},o=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return o};Object.defineProperty(t,"__esModule",{value:!0});var s=r(0),c=r(3),l=r(2),p=function(){function e(e,t){void 0===t&&(t=!1),this.todo=[],this.seen=new Set,this.program=e,this.includePrivate}return e.prototype.walk=function(){var e,t,r,n;try{for(var i=a(this.program.filesByName.values()),o=i.next();!o.done;o=i.next()){var s=o.value.members;if(s)try{for(var c=a(s.values()),l=c.next();!l.done;l=c.next()){var p=l.value;this.visitElement(p)}}catch(e){r={error:e}}finally{try{l&&!l.done&&(n=c.return)&&n.call(c)}finally{if(r)throw r.error}}}}catch(t){e={error:t}}finally{try{o&&!o.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}for(var u=this.todo;0"),null}for(;e.skip(s.Token.BAR);){if(!e.skip(s.Token.NULL))return r||this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"null"),null;y=!0}n=p.Node.createType(_,d,y,e.range(a,e.pos))}for(;e.skip(s.Token.OPENBRACKET);){var T=e.tokenPos;if(!e.skip(s.Token.CLOSEBRACKET))return r||this.error(c.DiagnosticCode._0_expected,e.range(),"]"),null;var f=e.range(T,e.pos);y=!1;if(e.skip(s.Token.BAR)){if(!e.skip(s.Token.NULL))return r||this.error(c.DiagnosticCode._0_expected,e.range(),"null"),null;y=!0}if(n=p.Node.createType(p.Node.createSimpleTypeName("Array",f),[n],y,e.range(a,e.pos)),y)break}return n},t.prototype.tryParseSignature=function(e){var t,r=e.mark(),n=e.tokenPos,i=null,a=null,o=!1;if(e.skip(s.Token.CLOSEPAREN))o=!0,e.discard(r),i=[];else{o=!1;do{var l=p.ParameterKind.DEFAULT;if(e.skip(s.Token.DOT_DOT_DOT)&&(o=!0,e.discard(r),l=p.ParameterKind.REST),e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return e.reset(r),this.tryParseSignatureIsSignature=!1,null;o=!0,e.discard(r);var u=this.parseType(e,!1);if(!u)return null;if(u.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,u.range),this.tryParseSignatureIsSignature=!0,null;a=u}else{if(!e.skipIdentifier())return o?this.error(c.DiagnosticCode.Identifier_expected,e.range()):e.reset(r),this.tryParseSignatureIsSignature=o,null;var _=p.Node.createIdentifierExpression(e.readIdentifier(),e.range(e.tokenPos,e.pos));if(e.skip(s.Token.QUESTION)&&(o=!0,e.discard(r),l==p.ParameterKind.REST?this.error(c.DiagnosticCode.A_rest_parameter_cannot_be_optional,e.range()):l=p.ParameterKind.OPTIONAL),e.skip(s.Token.COLON)){o=!0,e.discard(r);var h=this.parseType(e);if(!h)return this.tryParseSignatureIsSignature=o,null;var d=new p.ParameterNode;d.parameterKind=l,d.name=_,d.type=h,i?i.push(d):i=[d]}else o&&this.error(c.DiagnosticCode.Type_expected,e.range())}}while(e.skip(s.Token.COMMA));if(!e.skip(s.Token.CLOSEPAREN))return o?this.error(c.DiagnosticCode._0_expected,e.range(),")"):e.reset(r),this.tryParseSignatureIsSignature=o,null}return e.skip(s.Token.EQUALS_GREATERTHAN)?(o=!0,e.discard(r),(t=this.parseType(e))?(this.tryParseSignatureIsSignature=!0,p.Node.createSignature(i||[],t,a,!1,e.range(n,e.pos))):(this.tryParseSignatureIsSignature=o,null)):(o?this.error(c.DiagnosticCode._0_expected,e.range(),"=>"):e.reset(r),this.tryParseSignatureIsSignature=o,null)},t.prototype.parseDecorator=function(e){var t=e.tokenPos;if(e.skipIdentifier()){for(var r=e.readIdentifier(),n=p.Node.createIdentifierExpression(r,e.range(t,e.pos));e.skip(s.Token.DOT);){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;r=e.readIdentifier(),n=p.Node.createPropertyAccessExpression(n,p.Node.createIdentifierExpression(r,e.range()),e.range(t,e.pos))}var i=void 0;if(!e.skip(s.Token.OPENPAREN))return p.Node.createDecorator(n,null,e.range(t,e.pos));if(i=this.parseArguments(e))return p.Node.createDecorator(n,i,e.range(t,e.pos))}else this.error(c.DiagnosticCode.Identifier_expected,e.range());return null},t.prototype.parseVariable=function(e,t,r,n){var i=new Array;do{var a=this.parseVariableDeclaration(e,t,r);if(!a)return null;i.push(a)}while(e.skip(s.Token.COMMA));var o=p.Node.createVariableStatement(i,r,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),o},t.prototype.parseVariableDeclaration=function(e,t,r){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var n=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),i=t;e.skip(s.Token.EXCLAMATION)&&(i|=a.CommonFlags.DEFINITE_ASSIGNMENT);var o=null;e.skip(s.Token.COLON)&&(o=this.parseType(e));var l=null;if(e.skip(s.Token.EQUALS)){if(i&a.CommonFlags.AMBIENT&&this.error(c.DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,e.range()),!(l=this.parseExpression(e,2)))return null}else i&a.CommonFlags.CONST?i&a.CommonFlags.AMBIENT||this.error(c.DiagnosticCode._const_declarations_must_be_initialized,n.range):o||this.error(c.DiagnosticCode.Type_expected,e.range(e.pos));var u=s.Range.join(n.range,e.range());return i&a.CommonFlags.DEFINITE_ASSIGNMENT&&l&&this.error(c.DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,u),p.Node.createVariableDeclaration(n,o,l,r,i,u)},t.prototype.parseEnum=function(e,t,r,n){if(e.next()!=s.Token.IDENTIFIER)return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());if(e.next()!=s.Token.OPENBRACE)return this.error(c.DiagnosticCode._0_expected,e.range(),"{"),null;for(var o=new Array;!e.skip(s.Token.CLOSEBRACE);){var l=this.parseEnumValue(e,a.CommonFlags.NONE);if(!l)return null;if(o.push(l),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEBRACE))break;return this.error(c.DiagnosticCode._0_expected,e.range(),"}"),null}}var u=p.Node.createEnumDeclaration(i,o,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),u},t.prototype.parseEnumValue=function(e,t){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var r=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),n=null;return e.skip(s.Token.EQUALS)&&!(n=this.parseExpression(e,2))?null:p.Node.createEnumValueDeclaration(r,n,t,s.Range.join(r.range,e.range()))},t.prototype.parseReturn=function(e){var t=null;if(e.peek(!0)!=s.Token.SEMICOLON&&e.nextToken!=s.Token.CLOSEBRACE&&!e.nextTokenOnNewLine&&!(t=this.parseExpression(e)))return null;var r=p.Node.createReturnStatement(t,e.range());return e.skip(s.Token.SEMICOLON),r},t.prototype.parseTypeParameters=function(e){for(var t=new Array,r=!1;!e.skip(s.Token.GREATERTHAN);){var n=this.parseTypeParameter(e);if(!n)return null;if(null!==n.defaultType?r=!0:r&&(this.error(c.DiagnosticCode.Required_type_parameters_may_not_follow_optional_type_parameters,n.range),n.defaultType=null),t.push(n),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.GREATERTHAN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),">"),null}}return 0===t.length&&this.error(c.DiagnosticCode.Type_parameter_list_cannot_be_empty,e.range()),t},t.prototype.parseTypeParameter=function(e){if(e.next()==s.Token.IDENTIFIER){var t=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),r=null;if(e.skip(s.Token.EXTENDS)){if(!(i=this.parseType(e)))return null;if(i.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,i.range),null;r=i}var n=null;if(e.skip(s.Token.EQUALS)){var i;if(!(i=this.parseType(e)))return null;if(i.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,i.range),null;n=i}return p.Node.createTypeParameter(t,r,n,s.Range.join(t.range,e.range()))}return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseParameters=function(e,t){void 0===t&&(t=!1);var r=new Array,n=null,i=!1,a=!1,o=null;if(this.parseParametersThis=null,e.skip(s.Token.THIS)){if(!e.skip(s.Token.COLON))return this.error(c.DiagnosticCode._0_expected,e.range(),":"),null;if(!(o=this.parseType(e)))return null;if(o.kind==p.NodeKind.TYPE?this.parseParametersThis=o:this.error(c.DiagnosticCode.Operation_not_supported,o.range),!e.skip(s.Token.COMMA))return e.skip(s.Token.CLOSEPAREN)?r:(this.error(c.DiagnosticCode._0_expected,e.range(),")"),null)}for(;!e.skip(s.Token.CLOSEPAREN);){var l=this.parseParameter(e,t);if(!l)return null;switch(n&&!a&&(this.error(c.DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,n.name.range),a=!0),l.parameterKind){default:i&&this.error(c.DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,l.name.range);break;case p.ParameterKind.OPTIONAL:i=!0;break;case p.ParameterKind.REST:n=l}if(r.push(l),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),")"),null}}return r},t.prototype.parseParameter=function(e,t){void 0===t&&(t=!1);var r=!1,n=!1,i=null,o=a.CommonFlags.NONE;if(t&&(e.skip(s.Token.PUBLIC)?(i=e.range(),o|=a.CommonFlags.PUBLIC):e.skip(s.Token.PROTECTED)?(i=e.range(),o|=a.CommonFlags.PROTECTED):e.skip(s.Token.PRIVATE)&&(i=e.range(),o|=a.CommonFlags.PRIVATE),e.peek()==s.Token.READONLY)){var l=e.mark();e.next(),e.peek()!=s.Token.COLON?(e.discard(l),i||(i=e.range()),o|=a.CommonFlags.READONLY):e.reset(l)}if(e.skip(s.Token.DOT_DOT_DOT)&&(o?this.error(c.DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,e.range()):i=e.range(),r=!0),e.skipIdentifier()){r||(i=e.range());var u=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),_=null;if((n=e.skip(s.Token.QUESTION))&&r&&this.error(c.DiagnosticCode.A_rest_parameter_cannot_be_optional,u.range),e.skip(s.Token.COLON)){if(!(_=this.parseType(e)))return null}else _=p.Node.createOmittedType(e.range(e.pos));var h=null;if(e.skip(s.Token.EQUALS)&&(r&&this.error(c.DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,u.range),n?this.error(c.DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,u.range):n=!0,!(h=this.parseExpression(e,2))))return null;var d=p.Node.createParameter(u,_,h,r?p.ParameterKind.REST:n?p.ParameterKind.OPTIONAL:p.ParameterKind.DEFAULT,s.Range.join(i,e.range()));return d.flags|=o,d}return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null},t.prototype.parseFunction=function(e,t,r,n){if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range(e.pos)),null;var i=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),o=-1,l=null;if(e.skip(s.Token.LESSTHAN)){if(o=e.tokenPos,!(l=this.parseTypeParameters(e)))return null;t|=a.CommonFlags.GENERIC}if(!e.skip(s.Token.OPENPAREN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"("),null;o<0&&(o=e.tokenPos);var u=this.parseParameters(e);if(!u)return null;var _=this.parseParametersThis,h=0!=(t&a.CommonFlags.SET);h&&(1!=u.length&&this.error(c.DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,i.range),u.length&&u[0].initializer&&this.error(c.DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,i.range)),t&a.CommonFlags.GET&&u.length&&this.error(c.DiagnosticCode.A_get_accessor_cannot_have_parameters,i.range);var d=null;if(e.skip(s.Token.COLON)&&!(d=this.parseType(e,!0,h)))return null;d||(d=p.Node.createOmittedType(e.range(e.pos)),h||this.error(c.DiagnosticCode.Type_expected,d.range));var y=p.Node.createSignature(u,d,_,!1,e.range(o,e.pos)),m=null;if(e.skip(s.Token.OPENBRACE)){if(t&a.CommonFlags.AMBIENT&&this.error(c.DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,e.range()),!(m=this.parseBlockStatement(e,!1)))return null}else t&a.CommonFlags.AMBIENT||this.error(c.DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,e.range(e.pos));var g=p.Node.createFunctionDeclaration(i,l,y,m,r,t,e.range(n,e.pos));return e.skip(s.Token.SEMICOLON),g},t.prototype.parseFunctionExpression=function(e){var t,r=e.tokenPos,n=!1;if(e.token==s.Token.FUNCTION){if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENPAREN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"("),null}else n=!0,assert(e.token==s.Token.OPENPAREN),t=p.Node.createEmptyIdentifierExpression(e.range(e.tokenPos));var i=e.pos,a=this.parseParameters(e);return a?this.parseFunctionExpressionCommon(e,t,a,n,r,i):null},t.prototype.parseFunctionExpressionCommon=function(e,t,r,n,i,o){void 0===i&&(i=-1),void 0===o&&(o=-1),i<0&&(i=t.range.start),o<0&&(o=i);var l=null;if(e.skip(s.Token.COLON)){if(!(l=this.parseType(e)))return null}else l=p.Node.createOmittedType(e.range(e.pos)),this.error(c.DiagnosticCode.Type_expected,l.range);if(n&&!e.skip(s.Token.EQUALS_GREATERTHAN))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"=>"),null;var u,_=p.Node.createSignature(r,l,null,!1,e.range(o,e.pos));if(n)u=this.parseStatement(e,!1);else{if(!e.skip(s.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;u=this.parseBlockStatement(e,!1)}if(!u)return null;var h=p.Node.createFunctionDeclaration(t,null,_,u,null,n?a.CommonFlags.ARROW:a.CommonFlags.NONE,e.range(i,e.pos));return p.Node.createFunctionExpression(h)},t.prototype.parseClassOrInterface=function(e,t,r,n){var i=e.token==s.Token.INTERFACE;if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;var o=p.Node.createIdentifierExpression(e.readIdentifier(),e.range()),l=null;if(e.skip(s.Token.LESSTHAN)){if(!(l=this.parseTypeParameters(e)))return null;t|=a.CommonFlags.GENERIC}var u=null;if(e.skip(s.Token.EXTENDS)){var _=this.parseType(e);if(!_)return null;if(_.kind!=p.NodeKind.TYPE)return this.error(c.DiagnosticCode.Operation_not_supported,_.range),null;u=_}var h=null;if(e.skip(s.Token.IMPLEMENTS)){i&&this.error(c.DiagnosticCode.Interface_declaration_cannot_have_implements_clause,e.range());do{var d=this.parseType(e);if(!d)return null;i||(h||(h=[]),h.push(d))}while(e.skip(s.Token.COMMA))}if(!e.skip(s.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(),"{"),null;var y,m=new Array;if(i?(assert(!h),y=p.Node.createInterfaceDeclaration(o,l,u,m,r,t,e.range(n,e.pos))):y=p.Node.createClassDeclaration(o,l,u,h,m,r,t,e.range(n,e.pos)),!e.skip(s.Token.CLOSEBRACE))do{var g=this.parseClassMember(e,y);g&&m.push(g)}while(!e.skip(s.Token.CLOSEBRACE));return y},t.prototype.parseClassExpression=function(e){var t,r=e.tokenPos;if(t=e.skipIdentifier()?p.Node.createIdentifierExpression(e.readIdentifier(),e.range()):p.Node.createEmptyIdentifierExpression(e.range(e.pos)),!e.skip(s.Token.OPENBRACE))return this.error(c.DiagnosticCode._0_expected,e.range(e.pos),"{"),null;var n=new Array,i=p.Node.createClassDeclaration(t,[],null,null,n,null,a.CommonFlags.NONE,e.range(r,e.pos));if(!e.skip(s.Token.CLOSEBRACE))do{var o=this.parseClassMember(e,i);o&&n.push(o)}while(!e.skip(s.Token.CLOSEBRACE));return p.Node.createClassExpression(i)},t.prototype.parseClassMember=function(e,t){var r=e.pos,n=t.kind==p.NodeKind.INTERFACEDECLARATION,i=new Array;if(e.skip(s.Token.AT)){do{var o=this.parseDecorator(e);if(!o)break;i.push(o)}while(e.skip(s.Token.AT));n&&this.error(c.DiagnosticCode.Decorators_are_not_valid_here,s.Range.join(i[0].range,i[i.length-1].range))}var l=t.flags&a.CommonFlags.AMBIENT;n&&(l|=a.CommonFlags.VIRTUAL);var u=0,_=0;e.skip(s.Token.PUBLIC)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"public"),l|=a.CommonFlags.PUBLIC,u=e.tokenPos,_=e.pos):e.skip(s.Token.PRIVATE)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"private"),l|=a.CommonFlags.PRIVATE,u=e.tokenPos,_=e.pos):e.skip(s.Token.PROTECTED)&&(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"protected"),l|=a.CommonFlags.PROTECTED,u=e.tokenPos,_=e.pos);var h=0,d=0,y=0,m=0;e.skip(s.Token.STATIC)?(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"static"),l|=a.CommonFlags.STATIC,h=e.tokenPos,d=e.pos):(l|=a.CommonFlags.INSTANCE,e.skip(s.Token.ABSTRACT)&&(n&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(),"abstract"),l|=a.CommonFlags.ABSTRACT,y=e.tokenPos,m=e.pos),t.flags&a.CommonFlags.GENERIC&&(l|=a.CommonFlags.GENERIC_CONTEXT));var g=0,T=0;e.skip(s.Token.READONLY)&&(l|=a.CommonFlags.READONLY,g=e.tokenPos,T=e.pos);var f,E=e.mark(),I=!1,v=!1,b=!1,S=0,A=0;if(n||(e.skip(s.Token.GET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(E):(l|=a.CommonFlags.GET,v=!0,S=e.tokenPos,A=e.pos,l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly")):e.skip(s.Token.SET)?e.peek(!0,s.IdentifierHandling.PREFER)!=s.Token.IDENTIFIER||e.nextTokenOnNewLine?e.reset(E):(l|=a.CommonFlags.SET,b=!0,S=e.tokenPos,A=e.pos,l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly")):e.skip(s.Token.CONSTRUCTOR)&&(I=!0,(l|=a.CommonFlags.CONSTRUCTOR)&a.CommonFlags.STATIC&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(h,d),"static"),l&a.CommonFlags.ABSTRACT&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,m),"abstract"),l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly"))),I)f=p.Node.createConstructorExpression(e.range());else{if(!v&&!b&&e.skip(s.Token.OPENBRACKET)){l&a.CommonFlags.PUBLIC?this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,_),"public"):l&a.CommonFlags.PROTECTED?this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,_),"protected"):l&a.CommonFlags.PRIVATE&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(u,_),"protected"),l&a.CommonFlags.STATIC&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(h,d),"static"),l&a.CommonFlags.ABSTRACT&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(y,m),"abstract"),l&a.CommonFlags.READONLY&&this.error(c.DiagnosticCode._0_modifier_cannot_be_used_here,e.range(g,T),"readonly");var N=this.parseIndexSignatureDeclaration(e,i);return N?(e.skip(s.Token.SEMICOLON),N):null}if(!e.skipIdentifier())return this.error(c.DiagnosticCode.Identifier_expected,e.range()),null;f=p.Node.createIdentifierExpression(e.readIdentifier(),e.range())}var C=null;if(e.skip(s.Token.LESSTHAN)){var O=e.tokenPos;if(!(C=this.parseTypeParameters(e)))return null;I?this.error(c.DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,e.range(O,e.pos)):v||b?this.error(c.DiagnosticCode.An_accessor_cannot_have_type_parameters,e.range(O,e.pos)):l|=a.CommonFlags.GENERIC}if(e.skip(s.Token.OPENPAREN)){var x=e.tokenPos,k=this.parseParameters(e,I);if(!k)return null;var L=this.parseParametersThis;if(I)for(var R=0,F=k.length;R"),null):null;case s.Token.IDENTIFIER:return p.Node.createIdentifierExpression(e.readIdentifier(),e.range(r,e.pos));case s.Token.THIS:return p.Node.createThisExpression(e.range(r,e.pos));case s.Token.CONSTRUCTOR:return p.Node.createConstructorExpression(e.range(r,e.pos));case s.Token.SUPER:return e.peek()!=s.Token.DOT&&e.nextToken!=s.Token.OPENPAREN&&this.error(c.DiagnosticCode._super_must_be_followed_by_an_argument_list_or_member_access,e.range()),p.Node.createSuperExpression(e.range(r,e.pos));case s.Token.STRINGLITERAL:return p.Node.createStringLiteralExpression(e.readString(),e.range(r,e.pos));case s.Token.INTEGERLITERAL:return p.Node.createIntegerLiteralExpression(e.readInteger(),e.range(r,e.pos));case s.Token.FLOATLITERAL:return p.Node.createFloatLiteralExpression(e.readFloat(),e.range(r,e.pos));case s.Token.SLASH:var T=e.readRegexpPattern();return e.skip(s.Token.SLASH)?p.Node.createRegexpLiteralExpression(T,e.readRegexpFlags(),e.range(r,e.pos)):(this.error(c.DiagnosticCode._0_expected,e.range(),"/"),null);case s.Token.FUNCTION:return this.parseFunctionExpression(e);case s.Token.CLASS:return this.parseClassExpression(e);default:return t==s.Token.ENDOFFILE?this.error(c.DiagnosticCode.Unexpected_end_of_text,e.range(r)):this.error(c.DiagnosticCode.Expression_expected,e.range()),null}},t.prototype.tryParseTypeArgumentsBeforeArguments=function(e){var t=e.mark();if(!e.skip(s.Token.LESSTHAN))return null;var r=new Array;do{if(e.peek()===s.Token.GREATERTHAN)break;var n=this.parseType(e,!0,!0);if(!n)return e.reset(t),null;r.push(n)}while(e.skip(s.Token.COMMA));return e.skip(s.Token.GREATERTHAN)&&e.skip(s.Token.OPENPAREN)?r:(e.reset(t),null)},t.prototype.parseArguments=function(e){for(var t=new Array;!e.skip(s.Token.CLOSEPAREN);){var r=this.parseExpression(e,2);if(!r)return null;if(t.push(r),!e.skip(s.Token.COMMA)){if(e.skip(s.Token.CLOSEPAREN))break;return this.error(c.DiagnosticCode._0_expected,e.range(),")"),null}}return t},t.prototype.parseExpression=function(e,t){void 0===t&&(t=1),assert(0!=t);var r=this.parseExpressionStart(e);if(!r)return null;for(var n,i,a=(r=this.maybeParseCallExpression(e,r)).range.start,o=null;(i=_(n=e.peek()))>=t;){switch(e.next(),n){case s.Token.AS:var l=this.parseType(e);if(!l)return null;r=p.Node.createAssertionExpression(p.AssertionKind.AS,r,l,e.range(a,e.pos));break;case s.Token.EXCLAMATION:r=p.Node.createAssertionExpression(p.AssertionKind.NONNULL,r,null,e.range(a,e.pos));break;case s.Token.INSTANCEOF:var u=this.parseType(e);if(!u)return null;r=p.Node.createInstanceOfExpression(r,u,e.range(a,e.pos));break;case s.Token.OPENBRACKET:if(!(o=this.parseExpression(e)))return null;if(!e.skip(s.Token.CLOSEBRACKET))return this.error(c.DiagnosticCode._0_expected,e.range(),"]"),null;r=p.Node.createElementAccessExpression(r,o,e.range(a,e.pos));break;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:r.kind!=p.NodeKind.IDENTIFIER&&r.kind!=p.NodeKind.ELEMENTACCESS&&r.kind!=p.NodeKind.PROPERTYACCESS&&this.error(c.DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,r.range),r=p.Node.createUnaryPostfixExpression(n,r,e.range(a,e.pos));break;case s.Token.QUESTION:var d=this.parseExpression(e);if(!d)return null;if(!e.skip(s.Token.COLON))return this.error(c.DiagnosticCode._0_expected,e.range(),":"),null;var y=this.parseExpression(e,t>1?2:1);if(!y)return null;r=p.Node.createTernaryExpression(r,d,y,e.range(a,e.pos));break;case s.Token.COMMA:var m=[r];do{if(!(r=this.parseExpression(e,2)))return null;m.push(r)}while(e.skip(s.Token.COMMA));r=p.Node.createCommaExpression(m,e.range(a,e.pos));break;default:if(n==s.Token.DOT){if(e.skipIdentifier())o=p.Node.createIdentifierExpression(e.readIdentifier(),e.range());else if(!(o=this.parseExpression(e,h(n)?i:i+1)))return null;if(o.kind==p.NodeKind.IDENTIFIER)r=p.Node.createPropertyAccessExpression(r,o,e.range(a,e.pos));else{if(o.kind!=p.NodeKind.CALL)return this.error(c.DiagnosticCode.Identifier_expected,o.range),null;if(!(r=this.joinPropertyCall(e,a,r,o)))return null}}else{if(!(o=this.parseExpression(e,h(n)?i:i+1)))return null;r=p.Node.createBinaryExpression(n,r,o,e.range(a,e.pos))}}r=this.maybeParseCallExpression(e,r)}return r},t.prototype.joinPropertyCall=function(e,t,r,n){var i=n.expression;switch(i.kind){case p.NodeKind.IDENTIFIER:n.expression=p.Node.createPropertyAccessExpression(r,i,e.range(t,e.pos));break;case p.NodeKind.CALL:var a=this.joinPropertyCall(e,t,r,i);if(!a)return null;n.expression=a,n.range=e.range(t,e.pos);break;default:return this.error(c.DiagnosticCode.Identifier_expected,n.range),null}return n},t.prototype.maybeParseCallExpression=function(e,t){if(p.nodeIsCallable(t.kind))for(var r=null;e.skip(s.Token.OPENPAREN)||p.nodeIsGenericCallable(t.kind)&&null!==(r=this.tryParseTypeArgumentsBeforeArguments(e));){var n=this.parseArguments(e);if(!n)break;t=p.Node.createCallExpression(t,r,n,e.range(t.range.start,e.pos))}return t},t.prototype.skipStatement=function(e){for(e.peek(!0),e.nextTokenOnNewLine&&e.next();;){var t=e.peek(!0);if(t==s.Token.ENDOFFILE||t==s.Token.SEMICOLON){e.next();break}if(e.nextTokenOnNewLine)break;switch(e.next()){case s.Token.IDENTIFIER:e.readIdentifier();break;case s.Token.STRINGLITERAL:e.readString();break;case s.Token.INTEGERLITERAL:e.readInteger();break;case s.Token.FLOATLITERAL:e.readFloat()}}},t.prototype.skipBlock=function(e){var t=1,r=!0;do{switch(e.next()){case s.Token.ENDOFFILE:this.error(c.DiagnosticCode._0_expected,e.range(),"}"),r=!1;break;case s.Token.OPENBRACE:++t;break;case s.Token.CLOSEBRACE:--t||(r=!1);break;case s.Token.IDENTIFIER:e.readIdentifier();break;case s.Token.STRINGLITERAL:e.readString();break;case s.Token.INTEGERLITERAL:e.readInteger();break;case s.Token.FLOATLITERAL:e.readFloat()}}while(r)},t}(c.DiagnosticEmitter);function _(e){switch(e){case s.Token.COMMA:return 1;case s.Token.EQUALS:case s.Token.PLUS_EQUALS:case s.Token.MINUS_EQUALS:case s.Token.ASTERISK_ASTERISK_EQUALS:case s.Token.ASTERISK_EQUALS:case s.Token.SLASH_EQUALS:case s.Token.PERCENT_EQUALS:case s.Token.LESSTHAN_LESSTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.AMPERSAND_EQUALS:case s.Token.CARET_EQUALS:case s.Token.BAR_EQUALS:return 4;case s.Token.QUESTION:return 5;case s.Token.BAR_BAR:return 6;case s.Token.AMPERSAND_AMPERSAND:return 7;case s.Token.BAR:return 8;case s.Token.CARET:return 9;case s.Token.AMPERSAND:return 10;case s.Token.EQUALS_EQUALS:case s.Token.EXCLAMATION_EQUALS:case s.Token.EQUALS_EQUALS_EQUALS:case s.Token.EXCLAMATION_EQUALS_EQUALS:return 11;case s.Token.AS:case s.Token.IN:case s.Token.INSTANCEOF:case s.Token.LESSTHAN:case s.Token.GREATERTHAN:case s.Token.LESSTHAN_EQUALS:case s.Token.GREATERTHAN_EQUALS:return 12;case s.Token.LESSTHAN_LESSTHAN:case s.Token.GREATERTHAN_GREATERTHAN:case s.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN:return 13;case s.Token.PLUS:case s.Token.MINUS:return 14;case s.Token.ASTERISK:case s.Token.SLASH:case s.Token.PERCENT:return 15;case s.Token.ASTERISK_ASTERISK:return 16;case s.Token.PLUS_PLUS:case s.Token.MINUS_MINUS:return 18;case s.Token.DOT:case s.Token.NEW:case s.Token.OPENBRACKET:case s.Token.EXCLAMATION:return 20}return 0}function h(e){switch(e){case s.Token.EQUALS:case s.Token.PLUS_EQUALS:case s.Token.MINUS_EQUALS:case s.Token.ASTERISK_ASTERISK_EQUALS:case s.Token.ASTERISK_EQUALS:case s.Token.SLASH_EQUALS:case s.Token.PERCENT_EQUALS:case s.Token.LESSTHAN_LESSTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:case s.Token.AMPERSAND_EQUALS:case s.Token.CARET_EQUALS:case s.Token.BAR_EQUALS:case s.Token.QUESTION:case s.Token.ASTERISK_ASTERISK:return!0;default:return!1}}t.Parser=u,function(e){e[e.NONE=0]="NONE",e[e.COMMA=1]="COMMA",e[e.SPREAD=2]="SPREAD",e[e.YIELD=3]="YIELD",e[e.ASSIGNMENT=4]="ASSIGNMENT",e[e.CONDITIONAL=5]="CONDITIONAL",e[e.LOGICAL_OR=6]="LOGICAL_OR",e[e.LOGICAL_AND=7]="LOGICAL_AND",e[e.BITWISE_OR=8]="BITWISE_OR",e[e.BITWISE_XOR=9]="BITWISE_XOR",e[e.BITWISE_AND=10]="BITWISE_AND",e[e.EQUALITY=11]="EQUALITY",e[e.RELATIONAL=12]="RELATIONAL",e[e.SHIFT=13]="SHIFT",e[e.ADDITIVE=14]="ADDITIVE",e[e.MULTIPLICATIVE=15]="MULTIPLICATIVE",e[e.EXPONENTIATED=16]="EXPONENTIATED",e[e.UNARY_PREFIX=17]="UNARY_PREFIX",e[e.UNARY_POSTFIX=18]="UNARY_POSTFIX",e[e.CALL=19]="CALL",e[e.MEMBERACCESS=20]="MEMBERACCESS",e[e.GROUPING=21]="GROUPING"}(t.Precedence||(t.Precedence={}))},function(e,t,r){r(17),e.exports=r(31)},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),r(18),r(20),r(21),r(22);var n=r(4);n.Module.prototype.toText=function(){return binaryen.wrapModule(this.ref).emitStackIR()},n.Module.prototype.toAsmjs=function(){return binaryen.wrapModule(this.ref).emitAsmjs()}},function(e,t,r){(function(e){const t=e.Binaryen||r(19);for(var n in e.binaryen=t,t)(n.startsWith("_Binaryen")||n.startsWith("_Relooper"))&&(e[n]=t[n]);e.__memory_allocate=t._malloc,e.__memory_free=t._free,e.__memory_copy=t._memmove,e.__store=function(e,r){t.HEAPU8[e]=r},e.__load=function(e){return t.HEAPU8[e]}}).call(this,r(8))},function(t,r){t.exports=e},function(e,t,r){(function(e){var t="undefined"!=typeof window&&window||void 0!==e&&e||self;t.ASC_TARGET=0,t.ASC_NO_ASSERT=!1,t.ASC_MEMORY_BASE=0,t.ASC_OPTIMIZE_LEVEL=3,t.ASC_SHRINK_LEVEL=0,t.ASC_FEATURE_MUTABLE_GLOBAL=!1,t.ASC_FEATURE_SIGN_EXTENSION=!1,t.ASC_FEATURE_BULK_MEMORY=!1,t.ASC_FEATURE_SIMD=!1,t.ASC_FEATURE_THREADS=!1;var r=new Float64Array(1),n=new Uint32Array(r.buffer);function i(){Error.captureStackTrace?Error.captureStackTrace(this,i):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}function a(e){this.message=e||"assertion failed",Error.captureStackTrace?Error.captureStackTrace(this,a):this.stack=this.name+": "+this.message+"\n"+(new Error).stack}Object.defineProperties(t.i8=function(e){return e<<24>>24},{MIN_VALUE:{value:-128,writable:!1},MAX_VALUE:{value:127,writable:!1}}),Object.defineProperties(t.i16=function(e){return e<<16>>16},{MIN_VALUE:{value:-32768,writable:!1},MAX_VALUE:{value:32767,writable:!1}}),Object.defineProperties(t.i32=t.isize=function(e){return 0|e},{MIN_VALUE:{value:-2147483648,writable:!1},MAX_VALUE:{value:2147483647,writable:!1}}),Object.defineProperties(t.u8=function(e){return 255&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:255,writable:!1}}),Object.defineProperties(t.u16=function(e){return 65535&e},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:65535,writable:!1}}),Object.defineProperties(t.u32=t.usize=function(e){return e>>>0},{MIN_VALUE:{value:0,writable:!1},MAX_VALUE:{value:4294967295,writable:!1}}),Object.defineProperties(t.bool=function(e){return!!e},{MIN_VALUE:{value:!1,writable:!1},MAX_VALUE:{value:!0,writable:!1}}),Object.defineProperties(t.f32=function(e){return Math.fround(e)},{EPSILON:{value:Math.fround(1.1920929e-7),writable:!1},MIN_VALUE:{value:Math.fround(1.4012985e-45),writable:!1},MAX_VALUE:{value:Math.fround(3.4028235e38),writable:!1},MIN_NORMAL_VALUE:{value:Math.fround(1.17549435e-38),writable:!1},MIN_SAFE_INTEGER:{value:-16777215,writable:!1},MAX_SAFE_INTEGER:{value:16777215,writable:!1}}),Object.defineProperties(t.f64=function(e){return+e},{EPSILON:{value:2.220446049250313e-16,writable:!1},MIN_VALUE:{value:5e-324,writable:!1},MAX_VALUE:{value:1.7976931348623157e308,writable:!1},MIN_NORMAL_VALUE:{value:2.2250738585072014e-308,writable:!1},MIN_SAFE_INTEGER:{value:-9007199254740991,writable:!1},MAX_SAFE_INTEGER:{value:9007199254740991,writable:!1}}),t.clz=Math.clz32,t.ctz=function(e){var t=Math.clz32(e&-e);return e?31-t:t},t.popcnt=function(e){return 16843009*((e=(858993459&(e-=e>>>1&1431655765))+(e>>>2&858993459))+(e>>>4)&252645135)>>>24},t.rotl=function(e,t){return e<<(t&=31)|e>>>32-t},t.rotr=function(e,t){return e>>>(t&=31)|e<<32-t},t.abs=Math.abs,t.max=Math.max,t.min=Math.min,t.ceil=Math.ceil,t.floor=Math.floor,t.nearest=function(e){return.5===Math.abs(e-Math.trunc(e))?2*Math.round(.5*e):Math.round(e)},t.select=function(e,t,r){return r?e:t},t.sqrt=Math.sqrt,t.trunc=Math.trunc,t.copysign=function(e,t){return Math.abs(e)*Math.sign(t)},t.bswap=function(e){var t=e>>8&16711935,r=(16711935&e)<<8;return(t=(e=t|r)>>16&65535)|(r=(65535&e)<<16)},t.bswap16=function(e){return e<<8&65280|e>>8&255|4294901760&e},i.prototype=Object.create(Error.prototype),i.prototype.name="UnreachableError",i.prototype.message="unreachable",t.unreachable=function(){throw new i},a.prototype=Object.create(Error.prototype),a.prototype.name="AssertionError",t.assert=function(e,t){if(e)return e;throw new a(t)},t.changetype=function(e){return e},t.parseI32=function(e,t){return 0|parseInt(e,void 0)},String.fromCharCodes=function(e){return String.fromCharCode.apply(String,e)},String.fromCodePoints=function(e){return String.fromCodePoint.apply(String,e)},t.isInteger=Number.isInteger,t.isFloat=function(e){return"number"==typeof e},t.isReference=function(e){return"object"==typeof e||"string"==typeof e},t.isString=function(e){return"string"==typeof e||e instanceof String},t.isArray=Array.isArray,t.isDefined=function(e){return void 0!==e},t.isConstant=function(e){return!1},t.unchecked=function(e){return e},t.fmod=function(e,t){return e%t},t.fmodf=function(e,t){return Math.fround(e%t)},t.JSMath=Math,t.JSMath.signbit=function(e){return r[0]=e,Boolean(n[1]>>>31&e==e)},t.memory=(()=>{var e=new Uint8Array(0),r=0;return{allocate:t.__memory_allocate||function(t){if(!(t>>>=0))return 0;if(r+t>e.length){var n=e;(e=new Uint8Array(Math.max(65536,e.length+t,2*e.length))).set(n)}var i=r;return 7&(r+=t)&&(r=1+(7|r)),i},fill:t.__memory_fill||function(t,r,n){e.fill(r,t,t+n)},free:t.__memory_free||function(e){},copy:t.__memory_copy||function(t,r,n){e.copyWithin(t,r,r+n)},reset:t.__memory_reset||function(){e=new Uint8Array(0),r=0}}})(),t.store=t.__store||function(e,t,r){HEAP[(0|e)+(0|r)]=t},t.load=t.__load||function(e,t){return HEAP[(0|e)+(0|t)]}}).call(this,r(8))},function(e,t,r){(function(e){const t=new Float64Array(1),r=new Float32Array(t.buffer),n=new Int32Array(t.buffer);e.f32_as_i32=function(e){return r[0]=e,n[0]},e.i32_as_f32=function(e){return n[0]=e,r[0]},e.f64_as_i64=function(e){return t[0]=e,i64_new(n[0],n[1])},e.i64_as_f64=function(e){return n[0]=i64_low(e),n[1]=i64_high(e),t[0]}}).call(this,r(8))},function(e,t,r){(function(e){const t=e.Long||r(23);e.i64_zero=t.ZERO,e.i64_one=t.ONE,e.i64_new=function(e,r){return t.fromBits(e,r)},e.i64_low=function(e){return e.low},e.i64_high=function(e){return e.high},e.i64_add=function(e,t){return e.add(t)},e.i64_sub=function(e,t){return e.sub(t)},e.i64_mul=function(e,t){return e.mul(t)},e.i64_div=function(e,t){return e.div(t)},e.i64_div_u=function(e,t){return e.toUnsigned().div(t.toUnsigned()).toSigned()},e.i64_rem=function(e,t){return e.mod(t)},e.i64_rem_u=function(e,t){return e.toUnsigned().mod(t.toUnsigned()).toSigned()},e.i64_and=function(e,t){return e.and(t)},e.i64_or=function(e,t){return e.or(t)},e.i64_xor=function(e,t){return e.xor(t)},e.i64_shl=function(e,t){return e.shl(t)},e.i64_shr=function(e,t){return e.shr(t)},e.i64_shr_u=function(e,t){return e.shru(t)},e.i64_not=function(e){return e.not()},e.i64_eq=function(e,t){return e.eq(t)},e.i64_ne=function(e,t){return e.ne(t)},e.i64_align=function(e,r){assert(r&&0==(r&r-1));var n=t.fromInt(r-1);return e.add(n).and(n.not())},e.i64_is_i8=function(e){return 0===e.high&&e.low>=0&&e.low<=i8.MAX_VALUE||-1===e.high&&e.low>=i8.MIN_VALUE&&e.low<0},e.i64_is_i16=function(e){return 0===e.high&&e.low>=0&&e.low<=i16.MAX_VALUE||-1===e.high&&e.low>=i16.MIN_VALUE&&e.low<0},e.i64_is_i32=function(e){return 0===e.high&&e.low>=0||-1===e.high&&e.low<0},e.i64_is_u8=function(e){return 0===e.high&&e.low>=0&&e.low<=u8.MAX_VALUE},e.i64_is_u16=function(e){return 0===e.high&&e.low>=0&&e.low<=u16.MAX_VALUE},e.i64_is_u32=function(e){return 0===e.high},e.i64_is_bool=function(e){return 0===e.high&&(0===e.low||1===e.low)};const n=t.fromNumber(f32.MIN_SAFE_INTEGER),i=t.fromNumber(f32.MAX_SAFE_INTEGER);e.i64_is_f32=function(e){return e.gte(n)&&e.lte(i)};const a=t.fromNumber(f64.MIN_SAFE_INTEGER),o=t.fromNumber(f64.MAX_SAFE_INTEGER);e.i64_is_f64=function(e){return e.gte(a)&&e.lte(o)},e.i64_to_f32=function(t){return e.Math.fround(t.toNumber())},e.i64_to_f64=function(e){return e.toNumber()},e.i64_to_string=function(e,t){return(t?e.toUnsigned():e).toString(10)}}).call(this,r(8))},function(e,t){e.exports=n;var r=null;try{r=new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([0,97,115,109,1,0,0,0,1,13,2,96,0,1,127,96,4,127,127,127,127,1,127,3,7,6,0,1,1,1,1,1,6,6,1,127,1,65,0,11,7,50,6,3,109,117,108,0,1,5,100,105,118,95,115,0,2,5,100,105,118,95,117,0,3,5,114,101,109,95,115,0,4,5,114,101,109,95,117,0,5,8,103,101,116,95,104,105,103,104,0,0,10,191,1,6,4,0,35,0,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,126,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,127,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,128,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,129,34,4,66,32,135,167,36,0,32,4,167,11,36,1,1,126,32,0,173,32,1,173,66,32,134,132,32,2,173,32,3,173,66,32,134,132,130,34,4,66,32,135,167,36,0,32,4,167,11])),{}).exports}catch(e){}function n(e,t,r){this.low=0|e,this.high=0|t,this.unsigned=!!r}function i(e){return!0===(e&&e.__isLong__)}n.prototype.__isLong__,Object.defineProperty(n.prototype,"__isLong__",{value:!0}),n.isLong=i;var a={},o={};function s(e,t){var r,n,i;return t?(i=0<=(e>>>=0)&&e<256)&&(n=o[e])?n:(r=l(e,(0|e)<0?-1:0,!0),i&&(o[e]=r),r):(i=-128<=(e|=0)&&e<128)&&(n=a[e])?n:(r=l(e,e<0?-1:0,!1),i&&(a[e]=r),r)}function c(e,t){if(isNaN(e))return t?T:g;if(t){if(e<0)return T;if(e>=d)return b}else{if(e<=-y)return S;if(e+1>=y)return v}return e<0?c(-e,t).neg():l(e%h|0,e/h|0,t)}function l(e,t,r){return new n(e,t,r)}n.fromInt=s,n.fromNumber=c,n.fromBits=l;var p=Math.pow;function u(e,t,r){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return g;if("number"==typeof t?(r=t,t=!1):t=!!t,(r=r||10)<2||360)throw Error("interior hyphen");if(0===n)return u(e.substring(1),t,r).neg();for(var i=c(p(r,8)),a=g,o=0;o>>0:this.low},A.toNumber=function(){return this.unsigned?(this.high>>>0)*h+(this.low>>>0):this.high*h+(this.low>>>0)},A.toString=function(e){if((e=e||10)<2||36>>0).toString(e);if((a=s).isZero())return l+o;for(;l.length<6;)l="0"+l;o=""+l+o}},A.getHighBits=function(){return this.high},A.getHighBitsUnsigned=function(){return this.high>>>0},A.getLowBits=function(){return this.low},A.getLowBitsUnsigned=function(){return this.low>>>0},A.getNumBitsAbs=function(){if(this.isNegative())return this.eq(S)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<=0},A.isOdd=function(){return 1==(1&this.low)},A.isEven=function(){return 0==(1&this.low)},A.equals=function(e){return i(e)||(e=_(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},A.eq=A.equals,A.notEquals=function(e){return!this.eq(e)},A.neq=A.notEquals,A.ne=A.notEquals,A.lessThan=function(e){return this.comp(e)<0},A.lt=A.lessThan,A.lessThanOrEqual=function(e){return this.comp(e)<=0},A.lte=A.lessThanOrEqual,A.le=A.lessThanOrEqual,A.greaterThan=function(e){return this.comp(e)>0},A.gt=A.greaterThan,A.greaterThanOrEqual=function(e){return this.comp(e)>=0},A.gte=A.greaterThanOrEqual,A.ge=A.greaterThanOrEqual,A.compare=function(e){if(i(e)||(e=_(e)),this.eq(e))return 0;var t=this.isNegative(),r=e.isNegative();return t&&!r?-1:!t&&r?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},A.comp=A.compare,A.negate=function(){return!this.unsigned&&this.eq(S)?S:this.not().add(f)},A.neg=A.negate,A.add=function(e){i(e)||(e=_(e));var t=this.high>>>16,r=65535&this.high,n=this.low>>>16,a=65535&this.low,o=e.high>>>16,s=65535&e.high,c=e.low>>>16,p=0,u=0,h=0,d=0;return h+=(d+=a+(65535&e.low))>>>16,u+=(h+=n+c)>>>16,p+=(u+=r+s)>>>16,p+=t+o,l((h&=65535)<<16|(d&=65535),(p&=65535)<<16|(u&=65535),this.unsigned)},A.subtract=function(e){return i(e)||(e=_(e)),this.add(e.neg())},A.sub=A.subtract,A.multiply=function(e){if(this.isZero())return g;if(i(e)||(e=_(e)),r)return l(r.mul(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned);if(e.isZero())return g;if(this.eq(S))return e.isOdd()?S:g;if(e.eq(S))return this.isOdd()?S:g;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(m)&&e.lt(m))return c(this.toNumber()*e.toNumber(),this.unsigned);var t=this.high>>>16,n=65535&this.high,a=this.low>>>16,o=65535&this.low,s=e.high>>>16,p=65535&e.high,u=e.low>>>16,h=65535&e.low,d=0,y=0,T=0,f=0;return T+=(f+=o*h)>>>16,y+=(T+=a*h)>>>16,T&=65535,y+=(T+=o*u)>>>16,d+=(y+=n*h)>>>16,y&=65535,d+=(y+=a*u)>>>16,y&=65535,d+=(y+=o*p)>>>16,d+=t*h+n*u+a*p+o*s,l((T&=65535)<<16|(f&=65535),(d&=65535)<<16|(y&=65535),this.unsigned)},A.mul=A.multiply,A.divide=function(e){if(i(e)||(e=_(e)),e.isZero())throw Error("division by zero");var t,n,a;if(r)return this.unsigned||-2147483648!==this.high||-1!==e.low||-1!==e.high?l((this.unsigned?r.div_u:r.div_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this;if(this.isZero())return this.unsigned?T:g;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return T;if(e.gt(this.shru(1)))return E;a=T}else{if(this.eq(S))return e.eq(f)||e.eq(I)?S:e.eq(S)?f:(t=this.shr(1).div(e).shl(1)).eq(g)?e.isNegative()?f:I:(n=this.sub(e.mul(t)),a=t.add(n.div(e)));if(e.eq(S))return this.unsigned?T:g;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();a=g}for(n=this;n.gte(e);){t=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var o=Math.ceil(Math.log(t)/Math.LN2),s=o<=48?1:p(2,o-48),u=c(t),h=u.mul(e);h.isNegative()||h.gt(n);)h=(u=c(t-=s,this.unsigned)).mul(e);u.isZero()&&(u=f),a=a.add(u),n=n.sub(h)}return a},A.div=A.divide,A.modulo=function(e){return i(e)||(e=_(e)),r?l((this.unsigned?r.rem_u:r.rem_s)(this.low,this.high,e.low,e.high),r.get_high(),this.unsigned):this.sub(this.div(e).mul(e))},A.mod=A.modulo,A.rem=A.modulo,A.not=function(){return l(~this.low,~this.high,this.unsigned)},A.and=function(e){return i(e)||(e=_(e)),l(this.low&e.low,this.high&e.high,this.unsigned)},A.or=function(e){return i(e)||(e=_(e)),l(this.low|e.low,this.high|e.high,this.unsigned)},A.xor=function(e){return i(e)||(e=_(e)),l(this.low^e.low,this.high^e.high,this.unsigned)},A.shiftLeft=function(e){return i(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?l(this.low<>>32-e,this.unsigned):l(0,this.low<>>e|this.high<<32-e,this.high>>e,this.unsigned):l(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},A.shr=A.shiftRight,A.shiftRightUnsigned=function(e){if(i(e)&&(e=e.toInt()),0===(e&=63))return this;var t=this.high;return e<32?l(this.low>>>e|t<<32-e,t>>>e,this.unsigned):l(32===e?t:t>>>e-32,0,this.unsigned)},A.shru=A.shiftRightUnsigned,A.shr_u=A.shiftRightUnsigned,A.toSigned=function(){return this.unsigned?l(this.low,this.high,!1):this},A.toUnsigned=function(){return this.unsigned?this:l(this.low,this.high,!0)},A.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},A.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24,255&e,e>>>8&255,e>>>16&255,e>>>24]},A.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24,e>>>16&255,e>>>8&255,255&e,t>>>24,t>>>16&255,t>>>8&255,255&t]},n.fromBytes=function(e,t,r){return r?n.fromBytesLE(e,t):n.fromBytesBE(e,t)},n.fromBytesLE=function(e,t){return new n(e[0]|e[1]<<8|e[2]<<16|e[3]<<24,e[4]|e[5]<<8|e[6]<<16|e[7]<<24,t)},n.fromBytesBE=function(e,t){return new n(e[4]<<24|e[5]<<16|e[6]<<8|e[7],e[0]<<24|e[1]<<16|e[2]<<8|e[3],t)}},function(e,t,r){"use strict";var n=this&&this.__values||function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],r=0;return t?t.call(e):{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}};Object.defineProperty(t,"__esModule",{value:!0});var i,a=r(1),o=r(5),s=r(6),c=r(4),l=r(3),p=r(9),u=r(0);function _(e,t,r,n,u,_){var g,T,f,E,I=e.module;switch(t.internalName){case i.isInteger:var v=d(e,r,n,_);return e.currentType=s.Type.bool,v?v.is(4)&&!v.is(256)?I.createI32(1):I.createI32(0):I.createUnreachable();case i.isFloat:v=d(e,r,n,_);return e.currentType=s.Type.bool,v?v.is(8)?I.createI32(1):I.createI32(0):I.createUnreachable();case i.isSigned:v=d(e,r,n,_);return e.currentType=s.Type.bool,v?v.is(1)?I.createI32(1):I.createI32(0):I.createUnreachable();case i.isReference:v=d(e,r,n,_);return e.currentType=s.Type.bool,v?v.is(256)?I.createI32(1):I.createI32(0):I.createUnreachable();case i.isString:v=d(e,r,n,_);if(e.currentType=s.Type.bool,!v)return I.createUnreachable();if(M=v.classReference){var b=e.program.stringInstance;if(b&&M.isAssignableTo(b))return I.createI32(1)}return I.createI32(0);case i.isArray:v=d(e,r,n,_);if(e.currentType=s.Type.bool,!v)return I.createUnreachable();var S=v.classReference;if(!S)return I.createI32(0);var A=S.prototype;return I.createI32(A.extends(e.program.arrayPrototype)?1:0);case i.isFunction:v=d(e,r,n,_);return e.currentType=s.Type.bool,v?I.createI32(v.signatureReference?1:0):I.createUnreachable();case i.isNullable:v=d(e,r,n,_);return e.currentType=s.Type.bool,v?I.createI32(v.is(512)?1:0):I.createUnreachable();case i.isDefined:if(e.currentType=s.Type.bool,r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),1!=n.length)return e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();var N=e.resolver.resolveExpression(n[0],e.currentFlow,s.Type.void,p.ReportMode.SWALLOW);return I.createI32(N?1:0);case i.isConstant:if(e.currentType=s.Type.bool,r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),1!=n.length)return e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();var C=e.compileExpressionRetainType(n[0],s.Type.i32,0);return e.currentType=s.Type.bool,I.createI32(c.getExpressionId(C)==c.ExpressionId.Const?1:0);case i.isManaged:if(!e.program.hasGC)return e.currentType=s.Type.bool,I.createI32(0);v=d(e,r,n,_);return e.currentType=s.Type.bool,v?null===(M=v.classReference)||M.hasDecorator(l.DecoratorFlags.UNMANAGED)?I.createI32(0):I.createI32(1):I.createUnreachable();case i.clz:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 10:case 0:case 5:case 1:case 6:case 2:case 7:E=I.createUnary(c.UnaryOp.ClzI32,g);break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}case 4:E=I.createUnary(e.options.isWasm64?c.UnaryOp.ClzI64:c.UnaryOp.ClzI32,g);break;case 3:case 8:E=I.createUnary(c.UnaryOp.ClzI64,g);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.ctz:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],0,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 10:case 0:case 5:case 1:case 6:case 2:case 7:E=I.createUnary(c.UnaryOp.CtzI32,g);break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}case 4:E=I.createUnary(e.options.isWasm64?c.UnaryOp.CtzI64:c.UnaryOp.CtzI32,g);break;case 3:case 8:E=I.createUnary(c.UnaryOp.CtzI64,g);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.popcnt:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(e.currentType.kind){case 10:case 0:case 5:case 1:case 6:case 2:case 7:E=I.createUnary(c.UnaryOp.PopcntI32,g);break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}case 4:E=I.createUnary(e.options.isWasm64?c.UnaryOp.PopcntI64:c.UnaryOp.PopcntI32,g);break;case 3:case 8:E=I.createUnary(c.UnaryOp.PopcntI64,g);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.rotl:if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(T=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:E=e.ensureSmallIntegerWrap(I.createBinary(c.BinaryOp.RotlI32,g,T),e.currentType);case 2:case 7:E=I.createBinary(c.BinaryOp.RotlI32,g,T);break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}case 4:E=I.createBinary(e.options.isWasm64?c.BinaryOp.RotlI64:c.BinaryOp.RotlI32,g,T);break;case 3:case 8:E=I.createBinary(c.BinaryOp.RotlI64,g,T);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.rotr:if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.i32,0,1);switch(T=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 0:case 1:case 5:case 6:case 10:E=e.ensureSmallIntegerWrap(I.createBinary(c.BinaryOp.RotrI32,g,T),e.currentType);break;case 2:case 7:E=I.createBinary(c.BinaryOp.RotrI32,g,T);break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}case 4:E=I.createBinary(e.options.isWasm64?c.BinaryOp.RotrI64:c.BinaryOp.RotrI32,g,T);break;case 3:case 8:E=I.createBinary(c.BinaryOp.RotrI64,g,T);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.abs:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.f64,0,1);switch(e.currentType.kind){case 0:case 1:case 2:var O=(R=e.currentFlow).getTempLocal(s.Type.i32,!1),x=R.getAndFreeTempLocal(s.Type.i32,!1).index,k=O.index;E=I.createBinary(c.BinaryOp.XorI32,I.createBinary(c.BinaryOp.AddI32,I.createTeeLocal(x,I.createBinary(c.BinaryOp.ShrI32,I.createTeeLocal(k,g),I.createI32(31))),I.createGetLocal(k,c.NativeType.I32)),I.createGetLocal(x,c.NativeType.I32)),R.freeTempLocal(O);break;case 4:var L=e.options,R=e.currentFlow,F=L.isWasm64;O=R.getTempLocal(L.usizeType,!1),x=R.getAndFreeTempLocal(L.usizeType,!1).index,k=O.index;E=I.createBinary(F?c.BinaryOp.XorI64:c.BinaryOp.XorI32,I.createBinary(F?c.BinaryOp.AddI64:c.BinaryOp.AddI32,I.createTeeLocal(x,I.createBinary(F?c.BinaryOp.ShrI64:c.BinaryOp.ShrI32,I.createTeeLocal(k,g),F?I.createI64(63):I.createI32(31))),I.createGetLocal(k,L.nativeSizeType)),I.createGetLocal(x,L.nativeSizeType)),R.freeTempLocal(O);break;case 3:O=(R=e.currentFlow).getTempLocal(s.Type.i64,!1),x=R.getAndFreeTempLocal(s.Type.i64,!1).index,k=O.index;E=I.createBinary(c.BinaryOp.XorI64,I.createBinary(c.BinaryOp.AddI64,I.createTeeLocal(x,I.createBinary(c.BinaryOp.ShrI64,I.createTeeLocal(k,g),I.createI64(63))),I.createGetLocal(k,c.NativeType.I64)),I.createGetLocal(x,c.NativeType.I64)),R.freeTempLocal(O);break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}case 5:case 6:case 7:case 8:case 10:E=g;break;case 11:E=I.createUnary(c.UnaryOp.AbsF32,g);break;case 12:E=I.createUnary(c.UnaryOp.AbsF64,g);break;case 14:E=I.createUnreachable();break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.max:if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.f64,0,1);switch(T=e.compileExpression(n[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:var B=(R=e.currentFlow).getTempLocal(e.currentType,!R.canOverflow(g,e.currentType));O=R.getAndFreeTempLocal(e.currentType,!R.canOverflow(T,e.currentType));R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.GtI32,I.createGetLocal(B.index,c.NativeType.I32),I.createGetLocal(O.index,c.NativeType.I32)));break;case 5:case 6:case 7:case 10:B=(R=e.currentFlow).getTempLocal(e.currentType,!R.canOverflow(g,e.currentType)),O=R.getAndFreeTempLocal(e.currentType,!R.canOverflow(T,e.currentType));R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.GtU32,I.createGetLocal(B.index,c.NativeType.I32),I.createGetLocal(O.index,c.NativeType.I32)));break;case 3:B=(R=e.currentFlow).getTempLocal(s.Type.i64,!1),O=R.getAndFreeTempLocal(s.Type.i64,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.GtI64,I.createGetLocal(B.index,c.NativeType.I64),I.createGetLocal(O.index,c.NativeType.I64)));break;case 8:B=(R=e.currentFlow).getTempLocal(s.Type.i64,!1),O=R.getAndFreeTempLocal(s.Type.i64,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.GtU64,I.createGetLocal(B.index,c.NativeType.I64),I.createGetLocal(O.index,c.NativeType.I64)));break;case 4:B=(R=e.currentFlow).getTempLocal(e.options.usizeType,!1),O=R.getAndFreeTempLocal(e.options.usizeType,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(e.options.isWasm64?c.BinaryOp.GtI64:c.BinaryOp.GtI32,I.createGetLocal(B.index,e.options.nativeSizeType),I.createGetLocal(O.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}B=(R=e.currentFlow).getTempLocal(e.options.usizeType,!1),O=R.getAndFreeTempLocal(e.options.usizeType,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(e.options.isWasm64?c.BinaryOp.GtU64:c.BinaryOp.GtU32,I.createGetLocal(B.index,e.options.nativeSizeType),I.createGetLocal(O.index,e.options.nativeSizeType)));break;case 11:E=I.createBinary(c.BinaryOp.MaxF32,g,T);break;case 12:E=I.createBinary(c.BinaryOp.MaxF64,g,T);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.min:if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpression(n[0],s.Type.f64,0,1);switch(T=e.compileExpression(n[1],e.currentType,1,1),e.currentType.kind){case 0:case 1:case 2:B=(R=e.currentFlow).getTempLocal(e.currentType,!R.canOverflow(g,e.currentType)),O=R.getAndFreeTempLocal(e.currentType,!R.canOverflow(T,e.currentType));R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.LtI32,I.createGetLocal(B.index,c.NativeType.I32),I.createGetLocal(O.index,c.NativeType.I32)));break;case 5:case 6:case 7:case 10:B=(R=e.currentFlow).getTempLocal(e.currentType,!R.canOverflow(g,e.currentType)),O=R.getAndFreeTempLocal(e.currentType,!R.canOverflow(T,e.currentType));R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.LtU32,I.createGetLocal(B.index,c.NativeType.I32),I.createGetLocal(O.index,c.NativeType.I32)));break;case 3:B=(R=e.currentFlow).getTempLocal(s.Type.i64,!1),O=R.getAndFreeTempLocal(s.Type.i64,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.LtI64,I.createGetLocal(B.index,c.NativeType.I64),I.createGetLocal(O.index,c.NativeType.I64)));break;case 8:B=(R=e.currentFlow).getTempLocal(s.Type.i64,!1),O=R.getAndFreeTempLocal(s.Type.i64,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(c.BinaryOp.LtU64,I.createGetLocal(B.index,c.NativeType.I64),I.createGetLocal(O.index,c.NativeType.I64)));break;case 4:B=(R=e.currentFlow).getTempLocal(e.options.usizeType,!1),O=R.getAndFreeTempLocal(e.options.usizeType,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(e.options.isWasm64?c.BinaryOp.LtI64:c.BinaryOp.LtI32,I.createGetLocal(B.index,e.options.nativeSizeType),I.createGetLocal(O.index,e.options.nativeSizeType)));break;case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}B=(R=e.currentFlow).getTempLocal(e.options.usizeType,!1),O=R.getAndFreeTempLocal(e.options.usizeType,!1);R.freeTempLocal(B),E=I.createSelect(I.createTeeLocal(B.index,g),I.createTeeLocal(O.index,T),I.createBinary(e.options.isWasm64?c.BinaryOp.LtU64:c.BinaryOp.LtU32,I.createGetLocal(B.index,e.options.nativeSizeType),I.createGetLocal(O.index,e.options.nativeSizeType)));break;case 11:E=I.createBinary(c.BinaryOp.MinF32,g,T);break;case 12:E=I.createBinary(c.BinaryOp.MinF64,g,T);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.ceil:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}default:E=g;break;case 11:E=I.createUnary(c.UnaryOp.CeilF32,g);break;case 12:E=I.createUnary(c.UnaryOp.CeilF64,g);break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.floor:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}default:E=g;break;case 11:E=I.createUnary(c.UnaryOp.FloorF32,g);break;case 12:E=I.createUnary(c.UnaryOp.FloorF64,g);break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.copysign:if(2!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(T=e.compileExpression(n[1],e.currentType,1,0),e.currentType.kind){case 11:E=I.createBinary(c.BinaryOp.CopysignF32,g,T);break;case 12:E=I.createBinary(c.BinaryOp.CopysignF64,g,T);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.nearest:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}default:E=g;break;case 11:E=I.createUnary(c.UnaryOp.NearestF32,g);break;case 12:E=I.createUnary(c.UnaryOp.NearestF64,g);break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.reinterpret:if(1!=n.length)return r&&1==r.length||(r&&r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0")),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(!r||1!=r.length)return r&&r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable();switch(r[0].kind){case 2:case 7:g=e.compileExpression(n[0],s.Type.f32,1,0),E=I.createUnary(c.UnaryOp.ReinterpretF32,g);break;case 3:case 8:g=e.compileExpression(n[0],s.Type.f64,1,0),E=I.createUnary(c.UnaryOp.ReinterpretF64,g);break;case 9:if(r[0].is(256))return e.error(a.DiagnosticCode.Operation_not_supported,_.range),e.currentType=r[0],I.createUnreachable();case 4:g=e.compileExpression(n[0],e.options.isWasm64?s.Type.f64:s.Type.f32,1,0),E=I.createUnary(e.options.isWasm64?c.UnaryOp.ReinterpretF64:c.UnaryOp.ReinterpretF32,g);break;case 11:g=e.compileExpression(n[0],s.Type.i32,1,0),E=I.createUnary(c.UnaryOp.ReinterpretI32,g);break;case 12:g=e.compileExpression(n[0],s.Type.i64,1,0),E=I.createUnary(c.UnaryOp.ReinterpretI64,g);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return e.currentType=r[0],E;case i.sqrt:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 11:E=I.createUnary(c.UnaryOp.SqrtF32,g);break;case 12:E=I.createUnary(c.UnaryOp.SqrtF64,g);break;default:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.trunc:if(1!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(r&&r.length){if(e.currentType=r[0],1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpression(n[0],s.Type.f64,0,0);switch(e.currentType.kind){case 9:if(e.currentType.is(256)){e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable();break}default:E=g;break;case 11:E=I.createUnary(c.UnaryOp.TruncF32,g);break;case 12:E=I.createUnary(c.UnaryOp.TruncF64,g);break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.load:return n.length<1||n.length>2?(r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),n.length<1?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"1",n.length.toString(10)):e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable()):r&&1==r.length?(g=e.compileExpression(n[0],e.options.usizeType,1,0),(G=2==n.length?y(e,n[1]):0)<0?I.createUnreachable():(e.currentType=r[0],I.createLoad(r[0].byteSize,r[0].is(5),g,r[0].is(4)&&u.is(4)&&u.size>r[0].size?(e.currentType=u).toNativeType():(e.currentType=r[0]).toNativeType(),G))):(r&&r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable());case i.store:if(e.currentType=s.Type.void,n.length<2||n.length>3)return r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"2",n.length.toString(10)):e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),I.createUnreachable();if(!r||1!=r.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable();g=e.compileExpression(n[0],e.options.usizeType,1,0),T=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);v=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size2?(r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),n.length<1?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"1",n.length.toString(10)):e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable()):r&&1==r.length?(g=e.compileExpression(n[0],e.options.usizeType,1,0),(G=2==n.length?y(e,n[1]):0)<0?I.createUnreachable():(e.currentType=r[0],I.createAtomicLoad(r[0].byteSize,g,r[0].is(4)&&u.is(4)&&u.size>r[0].size?(e.currentType=u).toNativeType():(e.currentType=r[0]).toNativeType(),G))):(r&&r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable());case i.atomic_store:if(!e.options.hasFeature(16))break;if(e.currentType=s.Type.void,n.length<2||n.length>3)return r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"2",n.length.toString(10)):e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),I.createUnreachable();if(!r||1!=r.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable();g=e.compileExpression(n[0],e.options.usizeType,1,0),T=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);v=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size3)return r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),n.length<2?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"2",n.length.toString(10)):e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),I.createUnreachable();if(!r||1!=r.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable();g=e.compileExpression(n[0],e.options.usizeType,1,0),T=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0);v=void 0;if(r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size4)return r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),n.length<3?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"2",n.length.toString(10)):e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),I.createUnreachable();if(!r||1!=r.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable();g=e.compileExpression(n[0],e.options.usizeType,1,0),T=e.compileExpression(n[1],r[0],r[0].is(4)?0:1,0),f=e.compileExpression(n[2],r[0],r[0].is(4)?0:1,0);v=void 0;return r[0].is(4)&&(!e.currentType.is(4)||e.currentType.size1)return r&&1==r.length||e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();if(!r||1!=r.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable();var M;if(!(M=r[0].classReference))return e.error(a.DiagnosticCode.Operation_not_supported,_.range),I.createUnreachable();var G=void 0;if(n.length){if(n[0].kind!=o.NodeKind.LITERAL||n[0].literalKind!=o.LiteralKind.STRING)return e.error(a.DiagnosticCode.String_literal_expected,n[0].range),I.createUnreachable();var V=n[0].value,K=M.members?M.members.get(V):null;if(!K||K.kind!=l.ElementKind.FIELD)return e.error(a.DiagnosticCode.Type_0_has_no_property_1,n[0].range,M.internalName,V),I.createUnreachable();G=K.memoryOffset}else G=M.currentMemoryOffset;return e.options.isWasm64?u.is(4)&&u.size<=32?(e.currentType=s.Type.u32,I.createI32(G)):I.createI64(G):u.is(4)&&64==u.size?(e.currentType=s.Type.u64,I.createI64(G)):I.createI32(G);case i.select:if(3!=n.length)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),I.createUnreachable();if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,0)}else g=e.compileExpressionRetainType(n[0],s.Type.i32,0);v=e.currentType;switch(T=e.compileExpression(n[1],v,1,0),f=e.makeIsTrueish(e.compileExpressionRetainType(n[2],s.Type.bool,0),e.currentType),e.currentType=v,e.currentType.kind){case 0:case 1:case 5:case 6:case 10:default:E=I.createSelect(g,T,f);break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=I.createUnreachable()}return E;case i.unreachable:return 0!=n.length&&e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"0",n.length.toString(10)),r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),I.createUnreachable();case i.memory_size:return e.currentType=s.Type.i32,0!=n.length&&e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"0",n.length.toString(10)),r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),I.createHost(c.HostOp.CurrentMemory);case i.memory_grow:return e.currentType=s.Type.i32,1!=n.length?(e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"0",n.length.toString(10)),g=I.createUnreachable()):g=e.compileExpression(n[0],s.Type.i32,1,0),r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),I.createHost(c.HostOp.GrowMemory,null,[g]);case i.memory_copy:if(!e.options.hasFeature(4)){var z=e.resolver.resolveFunction(t,null);return e.currentType=s.Type.void,z?e.compileCallDirect(z,n,_):I.createUnreachable()}if(r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),3!=n.length)return e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),e.currentType=s.Type.void,I.createUnreachable();var H=e.options.usizeType;return g=e.compileExpression(n[0],H,1,0),T=e.compileExpression(n[1],H,1,0),f=e.compileExpression(n[2],H,1,0),e.currentType=s.Type.void,I.createMemoryCopy(g,T,f);case i.memory_fill:if(!e.options.hasFeature(4)){z=e.resolver.resolveFunction(t,null);return e.currentType=s.Type.void,z?e.compileCallDirect(z,n,_):I.createUnreachable()}if(r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),3!=n.length)return e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"3",n.length.toString(10)),e.currentType=s.Type.void,I.createUnreachable();H=e.options.usizeType;return g=e.compileExpression(n[0],H,1,0),T=e.compileExpression(n[1],s.Type.u32,1,0),f=e.compileExpression(n[2],H,1,0),e.currentType=s.Type.void,I.createMemoryFill(g,T,f);case i.changetype:return r&&1==r.length?1!=n.length?(e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),e.currentType=r[0],I.createUnreachable()):(g=e.compileExpressionRetainType(n[0],r[0],0),e.currentType=r[0],e.currentType.size!=r[0].size?(e.error(a.DiagnosticCode.Operation_not_supported,_.range),I.createUnreachable()):g):(r&&r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r?r.length.toString(10):"0"),I.createUnreachable());case i.assert:if(n.length<1||n.length>2)return r&&(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),n.length<1?e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"1",n.length.toString(10)):n.length>2&&e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"2",n.length.toString(10)),I.createUnreachable();if(r){if(r.length&&(e.currentType=r[0].nonNullableType),1!=r.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();g=e.compileExpression(n[0],r[0],1,1)}else g=e.compileExpressionRetainType(n[0],s.Type.bool,1);v=e.currentType;if(e.currentType=v.nonNullableType,e.options.noAssert)return u==s.Type.void?(e.currentType=s.Type.void,I.createNop()):g;var Y=m(e,2==n.length?n[1]:null,_);if(e.currentType=v.nonNullableType,u==s.Type.void){switch(e.currentType.kind){default:E=I.createIf(I.createUnary(c.UnaryOp.EqzI32,g),Y);break;case 3:case 8:E=I.createIf(I.createUnary(c.UnaryOp.EqzI64,g),Y);break;case 4:case 9:E=I.createIf(I.createUnary(e.options.isWasm64?c.UnaryOp.EqzI64:c.UnaryOp.EqzI32,g),Y);break;case 11:E=I.createIf(I.createBinary(c.BinaryOp.EqF32,g,I.createF32(0)),Y);break;case 12:E=I.createIf(I.createBinary(c.BinaryOp.EqF64,g,I.createF64(0)),Y);break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=Y}e.currentType=s.Type.void}else switch(e.currentType.kind){case 0:case 1:case 5:case 6:case 10:var W=(R=e.currentFlow).getAndFreeTempLocal(e.currentType,!R.canOverflow(g,e.currentType));E=I.createIf(I.createTeeLocal(W.index,g),I.createGetLocal(W.index,c.NativeType.I32),Y);break;case 2:case 7:default:W=e.currentFlow.getAndFreeTempLocal(s.Type.i32,!1);E=I.createIf(I.createTeeLocal(W.index,g),I.createGetLocal(W.index,c.NativeType.I32),Y);break;case 3:case 8:W=e.currentFlow.getAndFreeTempLocal(s.Type.i64,!1);E=I.createIf(I.createUnary(c.UnaryOp.EqzI64,I.createTeeLocal(W.index,g)),Y,I.createGetLocal(W.index,c.NativeType.I64));break;case 4:case 9:W=e.currentFlow.getAndFreeTempLocal(e.options.usizeType,!1);E=I.createIf(I.createUnary(e.options.isWasm64?c.UnaryOp.EqzI64:c.UnaryOp.EqzI32,I.createTeeLocal(W.index,g)),Y,I.createGetLocal(W.index,e.options.nativeSizeType));break;case 11:W=e.currentFlow.getAndFreeTempLocal(s.Type.f32,!1);E=I.createIf(I.createBinary(c.BinaryOp.EqF32,I.createTeeLocal(W.index,g),I.createF32(0)),Y,I.createGetLocal(W.index,c.NativeType.F32));break;case 12:W=e.currentFlow.getAndFreeTempLocal(s.Type.f64,!1);E=I.createIf(I.createBinary(c.BinaryOp.EqF64,I.createTeeLocal(W.index,g),I.createF64(0)),Y,I.createGetLocal(W.index,c.NativeType.F64));break;case 14:e.error(a.DiagnosticCode.Operation_not_supported,_.range),E=Y}return E;case i.unchecked:return r&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),1!=n.length?(e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable()):((R=e.currentFlow).set(8192),E=e.compileExpressionRetainType(n[0],u,0),R.unset(8192),E);case i.call_indirect:if(n.length<1)return r&&(r.length&&(e.currentType=r[0]),1!=r.length&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10))),e.error(a.DiagnosticCode.Expected_at_least_0_arguments_but_got_1,_.range,"1",n.length.toString(10)),I.createUnreachable();var X=void 0;if(r){if(1!=r.length)return r.length&&(e.currentType=r[0]),e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,_.range,"1",r.length.toString(10)),I.createUnreachable();X=r[0]}else X=u;if(g=e.compileExpressionRetainType(n[0],s.Type.u32,0),7!=e.currentType.kind)return e.error(a.DiagnosticCode.Operation_not_supported,n[0].range),I.createUnreachable();for(var Q=n.length-1,q=new Array(Q),j=new Array(Q+1),Z=X.toNativeType(),J=new Array(Q),$=0;$ void"),I.createUnreachable())}var oe=function(e,t,r,n,a){switch(t.internalName){case i.i32_clz:return h(i.clz,e,s.Type.i32,r,s.Type.i32,a);case i.i64_clz:return h(i.clz,e,s.Type.i64,r,s.Type.i64,a);case i.i32_ctz:return h(i.ctz,e,s.Type.i32,r,s.Type.i32,a);case i.i64_ctz:return h(i.ctz,e,s.Type.i64,r,s.Type.i64,a);case i.i32_popcnt:return h(i.popcnt,e,s.Type.i32,r,s.Type.i32,a);case i.i64_popcnt:return h(i.popcnt,e,s.Type.i64,r,s.Type.i64,a);case i.i32_rotl:return h(i.rotl,e,s.Type.i32,r,s.Type.i32,a);case i.i64_rotl:return h(i.rotl,e,s.Type.i64,r,s.Type.i64,a);case i.i32_rotr:return h(i.rotr,e,s.Type.i32,r,s.Type.i32,a);case i.i64_rotr:return h(i.rotr,e,s.Type.i64,r,s.Type.i64,a);case i.f32_abs:return h(i.abs,e,s.Type.f32,r,s.Type.f32,a);case i.f64_abs:return h(i.abs,e,s.Type.f64,r,s.Type.f64,a);case i.f32_max:return h(i.max,e,s.Type.f32,r,s.Type.f32,a);case i.f64_max:return h(i.max,e,s.Type.f64,r,s.Type.f64,a);case i.f32_min:return h(i.min,e,s.Type.f32,r,s.Type.f32,a);case i.f64_min:return h(i.min,e,s.Type.f64,r,s.Type.f64,a);case i.f32_ceil:return h(i.ceil,e,s.Type.f32,r,s.Type.f32,a);case i.f64_ceil:return h(i.ceil,e,s.Type.f64,r,s.Type.f64,a);case i.f32_floor:return h(i.floor,e,s.Type.f32,r,s.Type.f32,a);case i.f64_floor:return h(i.floor,e,s.Type.f64,r,s.Type.f64,a);case i.f32_copysign:return h(i.copysign,e,s.Type.f32,r,s.Type.f32,a);case i.f64_copysign:return h(i.copysign,e,s.Type.f64,r,s.Type.f64,a);case i.f32_nearest:return h(i.nearest,e,s.Type.f32,r,s.Type.f32,a);case i.f64_nearest:return h(i.nearest,e,s.Type.f64,r,s.Type.f64,a);case i.i32_reinterpret_f32:return h(i.reinterpret,e,s.Type.i32,r,s.Type.f32,a);case i.i64_reinterpret_f64:return h(i.reinterpret,e,s.Type.i64,r,s.Type.f64,a);case i.f32_reinterpret_i32:return h(i.reinterpret,e,s.Type.f32,r,s.Type.i32,a);case i.f64_reinterpret_i64:return h(i.reinterpret,e,s.Type.f64,r,s.Type.i64,a);case i.f32_sqrt:return h(i.sqrt,e,s.Type.f32,r,s.Type.f32,a);case i.f64_sqrt:return h(i.sqrt,e,s.Type.f64,r,s.Type.f64,a);case i.f32_trunc:return h(i.trunc,e,s.Type.f32,r,s.Type.f32,a);case i.f64_trunc:return h(i.trunc,e,s.Type.f64,r,s.Type.f64,a);case i.i32_load8_s:return h(i.load,e,s.Type.i8,r,s.Type.i32,a);case i.i32_load8_u:return h(i.load,e,s.Type.u8,r,s.Type.u32,a);case i.i32_load16_s:return h(i.load,e,s.Type.i16,r,s.Type.i32,a);case i.i32_load16_u:return h(i.load,e,s.Type.u16,r,s.Type.u32,a);case i.i32_load:return h(i.load,e,s.Type.i32,r,s.Type.i32,a);case i.i64_load8_s:return h(i.load,e,s.Type.i8,r,s.Type.i64,a);case i.i64_load8_u:return h(i.load,e,s.Type.u8,r,s.Type.u64,a);case i.i64_load16_s:return h(i.load,e,s.Type.i16,r,s.Type.i64,a);case i.i64_load16_u:return h(i.load,e,s.Type.u16,r,s.Type.u64,a);case i.i64_load32_s:return h(i.load,e,s.Type.i32,r,s.Type.i64,a);case i.i64_load32_u:return h(i.load,e,s.Type.u32,r,s.Type.u64,a);case i.i64_load:return h(i.load,e,s.Type.i64,r,s.Type.i64,a);case i.f32_load:return h(i.load,e,s.Type.f32,r,s.Type.f32,a);case i.f64_load:return h(i.load,e,s.Type.f64,r,s.Type.f64,a);case i.i32_store8:return h(i.store,e,s.Type.i8,r,s.Type.i32,a);case i.i32_store16:return h(i.store,e,s.Type.i16,r,s.Type.i32,a);case i.i32_store:return h(i.store,e,s.Type.i32,r,s.Type.i32,a);case i.i64_store8:return h(i.store,e,s.Type.i8,r,s.Type.i64,a);case i.i64_store16:return h(i.store,e,s.Type.i16,r,s.Type.i64,a);case i.i64_store32:return h(i.store,e,s.Type.i32,r,s.Type.i64,a);case i.i64_store:return h(i.store,e,s.Type.i64,r,s.Type.i64,a);case i.f32_store:return h(i.store,e,s.Type.f32,r,s.Type.f32,a);case i.f64_store:return h(i.store,e,s.Type.f64,r,s.Type.f64,a)}if(e.options.hasFeature(16))switch(t.internalName){case i.i32_atomic_load8_u:return h(i.atomic_load,e,s.Type.u8,r,s.Type.u32,a);case i.i32_atomic_load16_u:return h(i.atomic_load,e,s.Type.u16,r,s.Type.u32,a);case i.i32_atomic_load:return h(i.atomic_load,e,s.Type.i32,r,s.Type.i32,a);case i.i64_atomic_load8_u:return h(i.atomic_load,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_load16_u:return h(i.atomic_load,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_load32_u:return h(i.atomic_load,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_load:return h(i.atomic_load,e,s.Type.i64,r,s.Type.i64,a);case i.i32_atomic_store8:return h(i.atomic_store,e,s.Type.i8,r,s.Type.i32,a);case i.i32_atomic_store16:return h(i.atomic_store,e,s.Type.i16,r,s.Type.i32,a);case i.i32_atomic_store:return h(i.atomic_store,e,s.Type.i32,r,s.Type.i32,a);case i.i64_atomic_store8:return h(i.atomic_store,e,s.Type.i8,r,s.Type.i64,a);case i.i64_atomic_store16:return h(i.atomic_store,e,s.Type.i16,r,s.Type.i64,a);case i.i64_atomic_store32:return h(i.atomic_store,e,s.Type.i32,r,s.Type.i64,a);case i.i64_atomic_store:return h(i.atomic_store,e,s.Type.i64,r,s.Type.i64,a);case i.i32_atomic_rmw8_u_add:return h(i.atomic_add,e,s.Type.u8,r,s.Type.u32,a);case i.i32_atomic_rmw16_u_add:return h(i.atomic_add,e,s.Type.u16,r,s.Type.u32,a);case i.i32_atomic_rmw_add:return h(i.atomic_add,e,s.Type.u32,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_add:return h(i.atomic_add,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_add:return h(i.atomic_add,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_add:return h(i.atomic_add,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_add:return h(i.atomic_add,e,s.Type.u64,r,s.Type.u64,a);case i.i32_atomic_rmw8_u_sub:return h(i.atomic_sub,e,s.Type.u8,r,s.Type.u32,a);case i.i32_atomic_rmw16_u_sub:return h(i.atomic_sub,e,s.Type.u16,r,s.Type.u32,a);case i.i32_atomic_rmw_sub:return h(i.atomic_sub,e,s.Type.u32,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_sub:return h(i.atomic_sub,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_sub:return h(i.atomic_sub,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_sub:return h(i.atomic_sub,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_sub:return h(i.atomic_sub,e,s.Type.u64,r,s.Type.u64,a);case i.i32_atomic_rmw8_u_and:return h(i.atomic_and,e,s.Type.u8,r,s.Type.u32,a);case i.i32_atomic_rmw16_u_and:return h(i.atomic_and,e,s.Type.u16,r,s.Type.u32,a);case i.i32_atomic_rmw_and:return h(i.atomic_and,e,s.Type.u32,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_and:return h(i.atomic_and,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_and:return h(i.atomic_and,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_and:return h(i.atomic_and,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_and:return h(i.atomic_and,e,s.Type.u64,r,s.Type.u64,a);case i.i32_atomic_rmw8_u_or:return h(i.atomic_or,e,s.Type.u8,r,s.Type.u32,a);case i.i32_atomic_rmw16_u_or:return h(i.atomic_or,e,s.Type.u16,r,s.Type.u32,a);case i.i32_atomic_rmw_or:return h(i.atomic_or,e,s.Type.u32,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_or:return h(i.atomic_or,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_or:return h(i.atomic_or,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_or:return h(i.atomic_or,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_or:return h(i.atomic_or,e,s.Type.u64,r,s.Type.u64,a);case i.i32_atomic_rmw8_u_xor:case i.i32_atomic_rmw16_u_xor:case i.i32_atomic_rmw_xor:return h(i.atomic_xor,e,s.Type.u8,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_xor:return h(i.atomic_xor,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_xor:return h(i.atomic_xor,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_xor:return h(i.atomic_xor,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_xor:return h(i.atomic_xor,e,s.Type.u64,r,s.Type.u64,a);case i.i32_atomic_rmw8_u_xchg:case i.i32_atomic_rmw16_u_xchg:case i.i32_atomic_rmw_xchg:return h(i.atomic_xchg,e,s.Type.u8,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_xchg:return h(i.atomic_xchg,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_xchg:return h(i.atomic_xchg,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_xchg:return h(i.atomic_xchg,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_xchg:return h(i.atomic_xchg,e,s.Type.u64,r,s.Type.u64,a);case i.i32_atomic_rmw8_u_cmpxchg:case i.i32_atomic_rmw16_u_cmpxchg:case i.i32_atomic_rmw_cmpxchg:return h(i.atomic_cmpxchg,e,s.Type.u8,r,s.Type.u32,a);case i.i64_atomic_rmw8_u_cmpxchg:return h(i.atomic_cmpxchg,e,s.Type.u8,r,s.Type.u64,a);case i.i64_atomic_rmw16_u_cmpxchg:return h(i.atomic_cmpxchg,e,s.Type.u16,r,s.Type.u64,a);case i.i64_atomic_rmw32_u_cmpxchg:return h(i.atomic_cmpxchg,e,s.Type.u32,r,s.Type.u64,a);case i.i64_atomic_rmw_cmpxchg:return h(i.atomic_cmpxchg,e,s.Type.u64,r,s.Type.u64,a);case i.i32_wait:return h(i.atomic_wait,e,s.Type.i32,r,s.Type.u32,a);case i.i64_wait:return h(i.atomic_wait,e,s.Type.i64,r,s.Type.i64,a);case i.i32_notify:return h(i.atomic_notify,e,s.Type.i32,r,s.Type.u32,a);case i.i64_notify:return h(i.atomic_notify,e,s.Type.i64,r,s.Type.i64,a)}return 0}(e,t,n,0,_);return oe?(r&&r.length&&e.error(a.DiagnosticCode.Type_0_is_not_generic,_.range,t.internalName),oe):(e.error(a.DiagnosticCode.Cannot_find_name_0,_.expression.range,t.internalName),I.createUnreachable())}function h(e,t,r,n,i,a){assert(t.program.elementsByName.has(e));var o=t.program.elementsByName.get(e);return assert(o.kind==l.ElementKind.FUNCTION_PROTOTYPE),_(t,o,[r],n,i,a)}function d(e,t,r,n){if(0==r.length)return t&&1==t.length?t[0]:(e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t?t.length.toString(10):"0"),null);if(1==r.length){if(t)if(1==t.length)e.compileExpression(r[0],t[0],1,0);else{if(t.length)return e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t.length.toString(10)),null;e.compileExpressionRetainType(r[0],s.Type.i32,0)}else e.compileExpressionRetainType(r[0],s.Type.i32,0);return e.currentType}return t&&t.length>1&&e.error(a.DiagnosticCode.Expected_0_type_arguments_but_got_1,n.range,"1",t.length.toString(10)),e.error(a.DiagnosticCode.Expected_0_arguments_but_got_1,n.range,"1",r.length.toString(10)),null}function y(e,t){var r,n;return e.options.isWasm64?(r=e.precomputeExpression(t,s.Type.usize64,1,0),(c.getExpressionId(r)!=c.ExpressionId.Const||c.getExpressionType(r)!=c.NativeType.I64||0!=c.getConstValueI64High(r)||(n=c.getConstValueI64Low(r))<0)&&(e.error(a.DiagnosticCode.Expression_must_be_a_compile_time_constant,t.range),n=-1)):(r=e.precomputeExpression(t,s.Type.usize32,1,0),(c.getExpressionId(r)!=c.ExpressionId.Const||c.getExpressionType(r)!=c.NativeType.I32||(n=c.getConstValueI32(r))<0)&&(e.error(a.DiagnosticCode.Expression_must_be_a_compile_time_constant,t.range),n=-1)),n}function m(e,t,r){var n=e.program,i=e.module,a=e.program.stringInstance;if(!a)return i.createUnreachable();var o=n.abortInstance;if(!o||!e.compileFunction(o))return i.createUnreachable();var l=null!=t?e.compileExpression(t,a.type,1,0):a.type.toNativeZero(i),p=e.ensureStaticString(r.range.source.normalizedPath);return e.currentType=s.Type.void,i.createBlock(null,[i.createCall(o.internalName,[l,p,i.createI32(r.range.line),i.createI32(r.range.column)],c.NativeType.None),i.createUnreachable()])}!function(e){e.isInteger="~lib/builtins/isInteger",e.isFloat="~lib/builtins/isFloat",e.isSigned="~lib/builtins/isSigned",e.isReference="~lib/builtins/isReference",e.isString="~lib/builtins/isString",e.isArray="~lib/builtins/isArray",e.isFunction="~lib/builtins/isFunction",e.isNullable="~lib/builtins/isNullable",e.isDefined="~lib/builtins/isDefined",e.isConstant="~lib/builtins/isConstant",e.isManaged="~lib/builtins/isManaged",e.clz="~lib/builtins/clz",e.ctz="~lib/builtins/ctz",e.popcnt="~lib/builtins/popcnt",e.rotl="~lib/builtins/rotl",e.rotr="~lib/builtins/rotr",e.abs="~lib/builtins/abs",e.max="~lib/builtins/max",e.min="~lib/builtins/min",e.ceil="~lib/builtins/ceil",e.floor="~lib/builtins/floor",e.copysign="~lib/builtins/copysign",e.nearest="~lib/builtins/nearest",e.reinterpret="~lib/builtins/reinterpret",e.sqrt="~lib/builtins/sqrt",e.trunc="~lib/builtins/trunc",e.load="~lib/builtins/load",e.store="~lib/builtins/store",e.atomic_load="~lib/builtins/atomic.load",e.atomic_store="~lib/builtins/atomic.store",e.atomic_add="~lib/builtins/atomic.add",e.atomic_sub="~lib/builtins/atomic.sub",e.atomic_and="~lib/builtins/atomic.and",e.atomic_or="~lib/builtins/atomic.or",e.atomic_xor="~lib/builtins/atomic.xor",e.atomic_xchg="~lib/builtins/atomic.xchg",e.atomic_cmpxchg="~lib/builtins/atomic.cmpxchg",e.atomic_wait="~lib/builtins/atomic.wait",e.atomic_notify="~lib/builtins/atomic.notify",e.sizeof="~lib/builtins/sizeof",e.alignof="~lib/builtins/alignof",e.offsetof="~lib/builtins/offsetof",e.select="~lib/builtins/select",e.unreachable="~lib/builtins/unreachable",e.changetype="~lib/builtins/changetype",e.assert="~lib/builtins/assert",e.unchecked="~lib/builtins/unchecked",e.call_indirect="~lib/builtins/call_indirect",e.instantiate="~lib/builtins/instantiate",e.i8="~lib/builtins/i8",e.i16="~lib/builtins/i16",e.i32="~lib/builtins/i32",e.i64="~lib/builtins/i64",e.isize="~lib/builtins/isize",e.u8="~lib/builtins/u8",e.u16="~lib/builtins/u16",e.u32="~lib/builtins/u32",e.u64="~lib/builtins/u64",e.usize="~lib/builtins/usize",e.bool="~lib/builtins/bool",e.f32="~lib/builtins/f32",e.f64="~lib/builtins/f64",e.v128="~lib/builtins/v128",e.void_="~lib/builtins/void",e.i32_clz="~lib/builtins/i32.clz",e.i64_clz="~lib/builtins/i64.clz",e.i32_ctz="~lib/builtins/i32.ctz",e.i64_ctz="~lib/builtins/i64.ctz",e.i32_popcnt="~lib/builtins/i32.popcnt",e.i64_popcnt="~lib/builtins/i64.popcnt",e.i32_rotl="~lib/builtins/i32.rotl",e.i64_rotl="~lib/builtins/i64.rotl",e.i32_rotr="~lib/builtins/i32.rotr",e.i64_rotr="~lib/builtins/i64.rotr",e.f32_abs="~lib/builtins/f32.abs",e.f64_abs="~lib/builtins/f64.abs",e.f32_max="~lib/builtins/f32.max",e.f64_max="~lib/builtins/f64.max",e.f32_min="~lib/builtins/f32.min",e.f64_min="~lib/builtins/f64.min",e.f32_ceil="~lib/builtins/f32.ceil",e.f64_ceil="~lib/builtins/f64.ceil",e.f32_floor="~lib/builtins/f32.floor",e.f64_floor="~lib/builtins/f64.floor",e.f32_copysign="~lib/builtins/f32.copysign",e.f64_copysign="~lib/builtins/f64.copysign",e.f32_nearest="~lib/builtins/f32.nearest",e.f64_nearest="~lib/builtins/f64.nearest",e.i32_reinterpret_f32="~lib/builtins/i32.reinterpret_f32",e.i64_reinterpret_f64="~lib/builtins/i64.reinterpret_f64",e.f32_reinterpret_i32="~lib/builtins/f32.reinterpret_i32",e.f64_reinterpret_i64="~lib/builtins/f64.reinterpret_i64",e.f32_sqrt="~lib/builtins/f32.sqrt",e.f64_sqrt="~lib/builtins/f64.sqrt",e.f32_trunc="~lib/builtins/f32.trunc",e.f64_trunc="~lib/builtins/f64.trunc",e.i32_load8_s="~lib/builtins/i32.load8_s",e.i32_load8_u="~lib/builtins/i32.load8_u",e.i32_load16_s="~lib/builtins/i32.load16_s",e.i32_load16_u="~lib/builtins/i32.load16_u",e.i32_load="~lib/builtins/i32.load",e.i64_load8_s="~lib/builtins/i64.load8_s",e.i64_load8_u="~lib/builtins/i64.load8_u",e.i64_load16_s="~lib/builtins/i64.load16_s",e.i64_load16_u="~lib/builtins/i64.load16_u",e.i64_load32_s="~lib/builtins/i64.load32_s",e.i64_load32_u="~lib/builtins/i64.load32_u",e.i64_load="~lib/builtins/i64.load",e.f32_load="~lib/builtins/f32.load",e.f64_load="~lib/builtins/f64.load",e.i32_store8="~lib/builtins/i32.store8",e.i32_store16="~lib/builtins/i32.store16",e.i32_store="~lib/builtins/i32.store",e.i64_store8="~lib/builtins/i64.store8",e.i64_store16="~lib/builtins/i64.store16",e.i64_store32="~lib/builtins/i64.store32",e.i64_store="~lib/builtins/i64.store",e.f32_store="~lib/builtins/f32.store",e.f64_store="~lib/builtins/f64.store",e.i32_atomic_load8_u="~lib/builtins/i32.atomic.load8_u",e.i32_atomic_load16_u="~lib/builtins/i32.atomic.load16_u",e.i32_atomic_load="~lib/builtins/i32.atomic.load",e.i64_atomic_load8_u="~lib/builtins/i64.atomic.load8_u",e.i64_atomic_load16_u="~lib/builtins/i64.atomic.load16_u",e.i64_atomic_load32_u="~lib/builtins/i64.atomic.load32_u",e.i64_atomic_load="~lib/builtins/i64.atomic.load",e.i32_atomic_store8="~lib/builtins/i32.atomic.store8",e.i32_atomic_store16="~lib/builtins/i32.atomic.store16",e.i32_atomic_store="~lib/builtins/i32.atomic.store",e.i64_atomic_store8="~lib/builtins/i64.atomic.store8",e.i64_atomic_store16="~lib/builtins/i64.atomic.store16",e.i64_atomic_store32="~lib/builtins/i64.atomic.store32",e.i64_atomic_store="~lib/builtins/i64.atomic.store",e.i32_atomic_rmw8_u_add="~lib/builtins/i32.atomic.rmw8_u.add",e.i32_atomic_rmw16_u_add="~lib/builtins/i32.atomic.rmw16_u.add",e.i32_atomic_rmw_add="~lib/builtins/i32.atomic.rmw.add",e.i64_atomic_rmw8_u_add="~lib/builtins/i64.atomic.rmw8_u.add",e.i64_atomic_rmw16_u_add="~lib/builtins/i64.atomic.rmw16_u.add",e.i64_atomic_rmw32_u_add="~lib/builtins/i64.atomic.rmw32_u.add",e.i64_atomic_rmw_add="~lib/builtins/i64.atomic.rmw.add",e.i32_atomic_rmw8_u_sub="~lib/builtins/i32.atomic.rmw8_u.sub",e.i32_atomic_rmw16_u_sub="~lib/builtins/i32.atomic.rmw16_u.sub",e.i32_atomic_rmw_sub="~lib/builtins/i32.atomic.rmw.sub",e.i64_atomic_rmw8_u_sub="~lib/builtins/i64.atomic.rmw8_u.sub",e.i64_atomic_rmw16_u_sub="~lib/builtins/i64.atomic.rmw16_u.sub",e.i64_atomic_rmw32_u_sub="~lib/builtins/i64.atomic.rmw32_u.sub",e.i64_atomic_rmw_sub="~lib/builtins/i64.atomic.rmw.sub",e.i32_atomic_rmw8_u_and="~lib/builtins/i32.atomic.rmw8_u.and",e.i32_atomic_rmw16_u_and="~lib/builtins/i32.atomic.rmw16_u.and",e.i32_atomic_rmw_and="~lib/builtins/i32.atomic.rmw.and",e.i64_atomic_rmw8_u_and="~lib/builtins/i64.atomic.rmw8_u.and",e.i64_atomic_rmw16_u_and="~lib/builtins/i64.atomic.rmw16_u.and",e.i64_atomic_rmw32_u_and="~lib/builtins/i64.atomic.rmw32_u.and",e.i64_atomic_rmw_and="~lib/builtins/i64.atomic.rmw.and",e.i32_atomic_rmw8_u_or="~lib/builtins/i32.atomic.rmw8_u.or",e.i32_atomic_rmw16_u_or="~lib/builtins/i32.atomic.rmw16_u.or",e.i32_atomic_rmw_or="~lib/builtins/i32.atomic.rmw.or",e.i64_atomic_rmw8_u_or="~lib/builtins/i64.atomic.rmw8_u.or",e.i64_atomic_rmw16_u_or="~lib/builtins/i64.atomic.rmw16_u.or",e.i64_atomic_rmw32_u_or="~lib/builtins/i64.atomic.rmw32_u.or",e.i64_atomic_rmw_or="~lib/builtins/i64.atomic.rmw.or",e.i32_atomic_rmw8_u_xor="~lib/builtins/i32.atomic.rmw8_u.xor",e.i32_atomic_rmw16_u_xor="~lib/builtins/i32.atomic.rmw16_u.xor",e.i32_atomic_rmw_xor="~lib/builtins/i32.atomic.rmw.xor",e.i64_atomic_rmw8_u_xor="~lib/builtins/i64.atomic.rmw8_u.xor",e.i64_atomic_rmw16_u_xor="~lib/builtins/i64.atomic.rmw16_u.xor",e.i64_atomic_rmw32_u_xor="~lib/builtins/i64.atomic.rmw32_u.xor",e.i64_atomic_rmw_xor="~lib/builtins/i64.atomic.rmw.xor",e.i32_atomic_rmw8_u_xchg="~lib/builtins/i32.atomic.rmw8_u.xchg",e.i32_atomic_rmw16_u_xchg="~lib/builtins/i32.atomic.rmw16_u.xchg",e.i32_atomic_rmw_xchg="~lib/builtins/i32.atomic.rmw.xchg",e.i64_atomic_rmw8_u_xchg="~lib/builtins/i64.atomic.rmw8_u.xchg",e.i64_atomic_rmw16_u_xchg="~lib/builtins/i64.atomic.rmw16_u.xchg",e.i64_atomic_rmw32_u_xchg="~lib/builtins/i64.atomic.rmw32_u.xchg",e.i64_atomic_rmw_xchg="~lib/builtins/i64.atomic.rmw.xchg",e.i32_atomic_rmw8_u_cmpxchg="~lib/builtins/i32.atomic.rmw8_u.cmpxchg",e.i32_atomic_rmw16_u_cmpxchg="~lib/builtins/i32.atomic.rmw16_u.cmpxchg",e.i32_atomic_rmw_cmpxchg="~lib/builtins/i32.atomic.rmw.cmpxchg",e.i64_atomic_rmw8_u_cmpxchg="~lib/builtins/i64.atomic.rmw8_u.cmpxchg",e.i64_atomic_rmw16_u_cmpxchg="~lib/builtins/i64.atomic.rmw16_u.cmpxchg",e.i64_atomic_rmw32_u_cmpxchg="~lib/builtins/i64.atomic.rmw32_u.cmpxchg",e.i64_atomic_rmw_cmpxchg="~lib/builtins/i64.atomic.rmw.cmpxchg",e.i32_wait="~lib/builtins/i32.wait",e.i64_wait="~lib/builtins/i64.wait",e.i32_notify="~lib/builtins/i32.notify",e.i64_notify="~lib/builtins/i64.notify",e.ERROR="~lib/diagnostics/ERROR",e.WARNING="~lib/diagnostics/WARNING",e.INFO="~lib/diagnostics/INFO",e.HEAP_BASE="~lib/memory/HEAP_BASE",e.memory_size="~lib/memory/memory.size",e.memory_grow="~lib/memory/memory.grow",e.memory_copy="~lib/memory/memory.copy",e.memory_fill="~lib/memory/memory.fill",e.iterateRoots="~lib/gc/iterateRoots"}(i=t.BuiltinSymbols||(t.BuiltinSymbols={})),t.compileCall=_,t.compileAbort=m,t.compileIterateRoots=function(e){var t,r,i=e.module,a=new Array;try{for(var o=n(e.program.elementsByName.values()),p=o.next();!p.done;p=o.next()){var _=p.value;if(_.kind==l.ElementKind.GLOBAL){var h=_,d=h.type.classReference;if(h.is(u.CommonFlags.COMPILED)&&null!==d&&!d.hasDecorator(l.DecoratorFlags.UNMANAGED))if(h.is(u.CommonFlags.INLINED)){var y=h.constantIntegerValue;a.push(i.createCallIndirect(i.createGetLocal(0,c.NativeType.I32),[e.options.isWasm64?i.createI64(i64_low(y),i64_high(y)):i.createI32(i64_low(y))],"i_"))}else a.push(i.createCallIndirect(i.createGetLocal(0,c.NativeType.I32),[i.createGetGlobal(h.internalName,e.options.nativeSizeType)],"i_"))}}}catch(e){t={error:e}}finally{try{p&&!p.done&&(r=o.return)&&r.call(o)}finally{if(t)throw t.error}}var m=e.ensureFunctionType([s.Type.i32],s.Type.void);i.addFunction("~iterateRoots",m,[],a.length?i.createBlock(null,a):i.createNop())},t.ensureGCHook=function e(t,r){var i,a,o=t.program;assert(r.type.isManaged(o));var p=r.gcHookIndex;if(-1!=p)return p;var _=r.members;if(r.isDeclaredInLibrary&&null!==_&&_.has("__gc")){var h=assert(_.get("__gc"));assert(h.kind==l.ElementKind.FUNCTION_PROTOTYPE);var d=assert(o.resolver.resolveFunction(h,null));assert(d.is(u.CommonFlags.PRIVATE|u.CommonFlags.INSTANCE)),assert(!d.isAny(u.CommonFlags.AMBIENT|u.CommonFlags.VIRTUAL)),assert(0==d.signature.parameterTypes.length),assert(d.signature.returnType==s.Type.void),d.internalName=r.internalName+"~gc",assert(t.compileFunction(d));var y=t.ensureFunctionTableEntry(d);return r.gcHookIndex=y,y}var m=t.module,g=t.options,T=g.nativeSizeType,f=g.usizeType.byteSize,E=new Array;E.push(m.createIf(m.createUnary(g.isWasm64?c.UnaryOp.EqzI64:c.UnaryOp.EqzI32,m.createGetLocal(0,T)),m.createReturn()));var I=t.functionTable,v=I.length;I.push(""),r.gcHookIndex=v;var b=r.base;if(b?(assert(b.type.isManaged(o)),E.push(m.createCallIndirect(m.createI32(e(t,b.type.classReference)),[m.createGetLocal(0,T)],T==c.NativeType.I64?"I_":"i_"))):E.push(m.createCall(assert(o.gcMarkInstance).internalName,[m.createGetLocal(0,T)],c.NativeType.None)),_)try{for(var S=n(_.values()),A=S.next();!A.done;A=S.next()){var N=A.value;if(N.kind==l.ElementKind.FIELD&&N.parent===r&&N.type.isManaged(o)){var C=N.memoryOffset;assert(C>=0),E.push(m.createCall(assert(o.gcMarkInstance).internalName,[m.createLoad(f,!1,m.createGetLocal(0,T),T,C)],c.NativeType.None))}}}catch(e){i={error:e}}finally{try{A&&!A.done&&(a=S.return)&&a.call(S)}finally{if(i)throw i.error}}var O=r.internalName+"~gc";return m.addFunction(O,t.ensureFunctionType(null,s.Type.void,g.usizeType),null,m.createBlock(null,E)),I[v]=O,v}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.bitsetIs=function(e,t){return assert(t>=0&&t<64),i64_ne(i64_and(e,i64_shl(i64_one,i64_new(t))),i64_zero)},t.bitsetSet=function(e,t,r){return assert(t>=0&&t<64),r?i64_or(e,i64_shl(i64_one,i64_new(t))):i64_and(e,i64_not(i64_shl(i64_one,i64_new(t))))}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),function(e){e[e.NULL=0]="NULL",e[e.LINEFEED=10]="LINEFEED",e[e.CARRIAGERETURN=13]="CARRIAGERETURN",e[e.LINESEPARATOR=8232]="LINESEPARATOR",e[e.PARAGRAPHSEPARATOR=8233]="PARAGRAPHSEPARATOR",e[e.NEXTLINE=133]="NEXTLINE",e[e.SPACE=32]="SPACE",e[e.NONBREAKINGSPACE=160]="NONBREAKINGSPACE",e[e.ENQUAD=8192]="ENQUAD",e[e.EMQUAD=8193]="EMQUAD",e[e.ENSPACE=8194]="ENSPACE",e[e.EMSPACE=8195]="EMSPACE",e[e.THREEPEREMSPACE=8196]="THREEPEREMSPACE",e[e.FOURPEREMSPACE=8197]="FOURPEREMSPACE",e[e.SIXPEREMSPACE=8198]="SIXPEREMSPACE",e[e.FIGURESPACE=8199]="FIGURESPACE",e[e.PUNCTUATIONSPACE=8200]="PUNCTUATIONSPACE",e[e.THINSPACE=8201]="THINSPACE",e[e.HAIRSPACE=8202]="HAIRSPACE",e[e.ZEROWIDTHSPACE=8203]="ZEROWIDTHSPACE",e[e.NARROWNOBREAKSPACE=8239]="NARROWNOBREAKSPACE",e[e.IDEOGRAPHICSPACE=12288]="IDEOGRAPHICSPACE",e[e.MATHEMATICALSPACE=8287]="MATHEMATICALSPACE",e[e.OGHAM=5760]="OGHAM",e[e._=95]="_",e[e._0=48]="_0",e[e._1=49]="_1",e[e._2=50]="_2",e[e._3=51]="_3",e[e._4=52]="_4",e[e._5=53]="_5",e[e._6=54]="_6",e[e._7=55]="_7",e[e._8=56]="_8",e[e._9=57]="_9",e[e.a=97]="a",e[e.b=98]="b",e[e.c=99]="c",e[e.d=100]="d",e[e.e=101]="e",e[e.f=102]="f",e[e.g=103]="g",e[e.h=104]="h",e[e.i=105]="i",e[e.j=106]="j",e[e.k=107]="k",e[e.l=108]="l",e[e.m=109]="m",e[e.n=110]="n",e[e.o=111]="o",e[e.p=112]="p",e[e.q=113]="q",e[e.r=114]="r",e[e.s=115]="s",e[e.t=116]="t",e[e.u=117]="u",e[e.v=118]="v",e[e.w=119]="w",e[e.x=120]="x",e[e.y=121]="y",e[e.z=122]="z",e[e.A=65]="A",e[e.B=66]="B",e[e.C=67]="C",e[e.D=68]="D",e[e.E=69]="E",e[e.F=70]="F",e[e.G=71]="G",e[e.H=72]="H",e[e.I=73]="I",e[e.J=74]="J",e[e.K=75]="K",e[e.L=76]="L",e[e.M=77]="M",e[e.N=78]="N",e[e.O=79]="O",e[e.P=80]="P",e[e.Q=81]="Q",e[e.R=82]="R",e[e.S=83]="S",e[e.T=84]="T",e[e.U=85]="U",e[e.V=86]="V",e[e.W=87]="W",e[e.X=88]="X",e[e.Y=89]="Y",e[e.Z=90]="Z",e[e.AMPERSAND=38]="AMPERSAND",e[e.ASTERISK=42]="ASTERISK",e[e.AT=64]="AT",e[e.BACKSLASH=92]="BACKSLASH",e[e.BACKTICK=96]="BACKTICK",e[e.BAR=124]="BAR",e[e.CARET=94]="CARET",e[e.CLOSEBRACE=125]="CLOSEBRACE",e[e.CLOSEBRACKET=93]="CLOSEBRACKET",e[e.CLOSEPAREN=41]="CLOSEPAREN",e[e.COLON=58]="COLON",e[e.COMMA=44]="COMMA",e[e.DOLLAR=36]="DOLLAR",e[e.DOT=46]="DOT",e[e.DOUBLEQUOTE=34]="DOUBLEQUOTE",e[e.EQUALS=61]="EQUALS",e[e.EXCLAMATION=33]="EXCLAMATION",e[e.GREATERTHAN=62]="GREATERTHAN",e[e.HASH=35]="HASH",e[e.LESSTHAN=60]="LESSTHAN",e[e.MINUS=45]="MINUS",e[e.OPENBRACE=123]="OPENBRACE",e[e.OPENBRACKET=91]="OPENBRACKET",e[e.OPENPAREN=40]="OPENPAREN",e[e.PERCENT=37]="PERCENT",e[e.PLUS=43]="PLUS",e[e.QUESTION=63]="QUESTION",e[e.SEMICOLON=59]="SEMICOLON",e[e.SINGLEQUOTE=39]="SINGLEQUOTE",e[e.SLASH=47]="SLASH",e[e.TILDE=126]="TILDE",e[e.BACKSPACE=8]="BACKSPACE",e[e.FORMFEED=12]="FORMFEED",e[e.BYTEORDERMARK=65279]="BYTEORDERMARK",e[e.TAB=9]="TAB",e[e.VERTICALTAB=11]="VERTICALTAB"}(t.CharCode||(t.CharCode={})),t.isLineBreak=function(e){switch(e){case 10:case 13:case 8232:case 8233:return!0;default:return!1}},t.isWhiteSpace=function(e){switch(e){case 32:case 9:case 11:case 12:case 160:case 133:case 5760:case 8239:case 8287:case 12288:case 65279:return!0;default:return e>=8192&&e<=8203}},t.isDecimalDigit=function(e){return e>=48&&e<=57},t.isOctalDigit=function(e){return e>=48&&e<=55},t.isIdentifierStart=function(e){return e>=97&&e<=122||e>=65&&e<=90||95==e||36==e||e>127&&!((t=e)<0||t>65535)&&a(t,n);var t},t.isKeywordCharacter=function(e){return e>=97&&e<=122},t.isIdentifierPart=function(e){return e>=97&&e<=122||e>=65&&e<=90||e>=48&&e<=57||95==e||36==e||e>127&&!((t=e)<0||t>65535)&&a(t,i);var t};var n=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,880,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1162,1319,1329,1366,1369,1369,1377,1415,1488,1514,1520,1522,1568,1610,1646,1647,1649,1747,1749,1749,1765,1766,1774,1775,1786,1788,1791,1791,1808,1808,1810,1839,1869,1957,1969,1969,1994,2026,2036,2037,2042,2042,2048,2069,2074,2074,2084,2084,2088,2088,2112,2136,2208,2208,2210,2220,2308,2361,2365,2365,2384,2384,2392,2401,2417,2423,2425,2431,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2493,2493,2510,2510,2524,2525,2527,2529,2544,2545,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2649,2652,2654,2654,2674,2676,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2749,2749,2768,2768,2784,2785,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2877,2877,2908,2909,2911,2913,2929,2929,2947,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3024,3024,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3133,3160,3161,3168,3169,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3261,3261,3294,3294,3296,3297,3313,3314,3333,3340,3342,3344,3346,3386,3389,3389,3406,3406,3424,3425,3450,3455,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3585,3632,3634,3635,3648,3654,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3760,3762,3763,3773,3773,3776,3780,3782,3782,3804,3807,3840,3840,3904,3911,3913,3948,3976,3980,4096,4138,4159,4159,4176,4181,4186,4189,4193,4193,4197,4198,4206,4208,4213,4225,4238,4238,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5905,5920,5937,5952,5969,5984,5996,5998,6e3,6016,6067,6103,6103,6108,6108,6176,6263,6272,6312,6314,6314,6320,6389,6400,6428,6480,6509,6512,6516,6528,6571,6593,6599,6656,6678,6688,6740,6823,6823,6917,6963,6981,6987,7043,7072,7086,7087,7098,7141,7168,7203,7245,7247,7258,7293,7401,7404,7406,7409,7413,7414,7424,7615,7680,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8305,8305,8319,8319,8336,8348,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11502,11506,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11648,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11823,11823,12293,12295,12321,12329,12337,12341,12344,12348,12353,12438,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42527,42538,42539,42560,42606,42623,42647,42656,42735,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43009,43011,43013,43015,43018,43020,43042,43072,43123,43138,43187,43250,43255,43259,43259,43274,43301,43312,43334,43360,43388,43396,43442,43471,43471,43520,43560,43584,43586,43588,43595,43616,43638,43642,43642,43648,43695,43697,43697,43701,43702,43705,43709,43712,43712,43714,43714,43739,43741,43744,43754,43762,43764,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44002,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64285,64287,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65136,65140,65142,65276,65313,65338,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500],i=[170,170,181,181,186,186,192,214,216,246,248,705,710,721,736,740,748,748,750,750,768,884,886,887,890,893,902,902,904,906,908,908,910,929,931,1013,1015,1153,1155,1159,1162,1319,1329,1366,1369,1369,1377,1415,1425,1469,1471,1471,1473,1474,1476,1477,1479,1479,1488,1514,1520,1522,1552,1562,1568,1641,1646,1747,1749,1756,1759,1768,1770,1788,1791,1791,1808,1866,1869,1969,1984,2037,2042,2042,2048,2093,2112,2139,2208,2208,2210,2220,2276,2302,2304,2403,2406,2415,2417,2423,2425,2431,2433,2435,2437,2444,2447,2448,2451,2472,2474,2480,2482,2482,2486,2489,2492,2500,2503,2504,2507,2510,2519,2519,2524,2525,2527,2531,2534,2545,2561,2563,2565,2570,2575,2576,2579,2600,2602,2608,2610,2611,2613,2614,2616,2617,2620,2620,2622,2626,2631,2632,2635,2637,2641,2641,2649,2652,2654,2654,2662,2677,2689,2691,2693,2701,2703,2705,2707,2728,2730,2736,2738,2739,2741,2745,2748,2757,2759,2761,2763,2765,2768,2768,2784,2787,2790,2799,2817,2819,2821,2828,2831,2832,2835,2856,2858,2864,2866,2867,2869,2873,2876,2884,2887,2888,2891,2893,2902,2903,2908,2909,2911,2915,2918,2927,2929,2929,2946,2947,2949,2954,2958,2960,2962,2965,2969,2970,2972,2972,2974,2975,2979,2980,2984,2986,2990,3001,3006,3010,3014,3016,3018,3021,3024,3024,3031,3031,3046,3055,3073,3075,3077,3084,3086,3088,3090,3112,3114,3123,3125,3129,3133,3140,3142,3144,3146,3149,3157,3158,3160,3161,3168,3171,3174,3183,3202,3203,3205,3212,3214,3216,3218,3240,3242,3251,3253,3257,3260,3268,3270,3272,3274,3277,3285,3286,3294,3294,3296,3299,3302,3311,3313,3314,3330,3331,3333,3340,3342,3344,3346,3386,3389,3396,3398,3400,3402,3406,3415,3415,3424,3427,3430,3439,3450,3455,3458,3459,3461,3478,3482,3505,3507,3515,3517,3517,3520,3526,3530,3530,3535,3540,3542,3542,3544,3551,3570,3571,3585,3642,3648,3662,3664,3673,3713,3714,3716,3716,3719,3720,3722,3722,3725,3725,3732,3735,3737,3743,3745,3747,3749,3749,3751,3751,3754,3755,3757,3769,3771,3773,3776,3780,3782,3782,3784,3789,3792,3801,3804,3807,3840,3840,3864,3865,3872,3881,3893,3893,3895,3895,3897,3897,3902,3911,3913,3948,3953,3972,3974,3991,3993,4028,4038,4038,4096,4169,4176,4253,4256,4293,4295,4295,4301,4301,4304,4346,4348,4680,4682,4685,4688,4694,4696,4696,4698,4701,4704,4744,4746,4749,4752,4784,4786,4789,4792,4798,4800,4800,4802,4805,4808,4822,4824,4880,4882,4885,4888,4954,4957,4959,4992,5007,5024,5108,5121,5740,5743,5759,5761,5786,5792,5866,5870,5872,5888,5900,5902,5908,5920,5940,5952,5971,5984,5996,5998,6e3,6002,6003,6016,6099,6103,6103,6108,6109,6112,6121,6155,6157,6160,6169,6176,6263,6272,6314,6320,6389,6400,6428,6432,6443,6448,6459,6470,6509,6512,6516,6528,6571,6576,6601,6608,6617,6656,6683,6688,6750,6752,6780,6783,6793,6800,6809,6823,6823,6912,6987,6992,7001,7019,7027,7040,7155,7168,7223,7232,7241,7245,7293,7376,7378,7380,7414,7424,7654,7676,7957,7960,7965,7968,8005,8008,8013,8016,8023,8025,8025,8027,8027,8029,8029,8031,8061,8064,8116,8118,8124,8126,8126,8130,8132,8134,8140,8144,8147,8150,8155,8160,8172,8178,8180,8182,8188,8204,8205,8255,8256,8276,8276,8305,8305,8319,8319,8336,8348,8400,8412,8417,8417,8421,8432,8450,8450,8455,8455,8458,8467,8469,8469,8473,8477,8484,8484,8486,8486,8488,8488,8490,8493,8495,8505,8508,8511,8517,8521,8526,8526,8544,8584,11264,11310,11312,11358,11360,11492,11499,11507,11520,11557,11559,11559,11565,11565,11568,11623,11631,11631,11647,11670,11680,11686,11688,11694,11696,11702,11704,11710,11712,11718,11720,11726,11728,11734,11736,11742,11744,11775,11823,11823,12293,12295,12321,12335,12337,12341,12344,12348,12353,12438,12441,12442,12445,12447,12449,12538,12540,12543,12549,12589,12593,12686,12704,12730,12784,12799,13312,19893,19968,40908,40960,42124,42192,42237,42240,42508,42512,42539,42560,42607,42612,42621,42623,42647,42655,42737,42775,42783,42786,42888,42891,42894,42896,42899,42912,42922,43e3,43047,43072,43123,43136,43204,43216,43225,43232,43255,43259,43259,43264,43309,43312,43347,43360,43388,43392,43456,43471,43481,43520,43574,43584,43597,43600,43609,43616,43638,43642,43643,43648,43714,43739,43741,43744,43759,43762,43766,43777,43782,43785,43790,43793,43798,43808,43814,43816,43822,43968,44010,44012,44013,44016,44025,44032,55203,55216,55238,55243,55291,63744,64109,64112,64217,64256,64262,64275,64279,64285,64296,64298,64310,64312,64316,64318,64318,64320,64321,64323,64324,64326,64433,64467,64829,64848,64911,64914,64967,65008,65019,65024,65039,65056,65062,65075,65076,65101,65103,65136,65140,65142,65276,65296,65305,65313,65338,65343,65343,65345,65370,65382,65470,65474,65479,65482,65487,65490,65495,65498,65500];function a(e,t){if(e>1),(n=t[r-=1&r])<=e&&e<=t[r+1])return!0;e=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}}},i=this&&this.__read||function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,a=r.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(i)throw i.error}}return o};Object.defineProperty(t,"__esModule",{value:!0}),t.makeArray=function(e){if(void 0===e&&(e=null),e){for(var t=new Array(e.length),r=0,n=e.length;r0||n=0;)if(e.charCodeAt(a)==i){r-a==3&&46==e.charCodeAt(a+1)&&46==e.charCodeAt(a+2)||(e=t?e.substring(0,a):e.substring(0,a)+e.substring(r+3),n-=r+3-a,r=a-1);break}if(a<0&&r>0&&(2!=r||46!=e.charCodeAt(0)||46!=e.charCodeAt(1))){n=(e=e.substring(r+4)).length;continue}}}r++}return n>0?e:"."}function o(e){var t=e.length;if(t<=1){if(0==t)return".";if(e.charCodeAt(0)==i)return e}for(;--t>0;)if(e.charCodeAt(t)==i)return e.substring(0,t);return"."}t.normalizePath=a,t.resolvePath=function(e,t){return e.startsWith("std/")?e:a(o(t)+n.PATH_DELIMITER+e)},t.dirname=o},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=" ",i=" ",a=" ";t.indent=function(e,t){for(;t>=4;)e.push(a),t-=4;t>=2&&(e.push(i),t-=2),t&&e.push(n)}},function(e,t,r){"use strict";function n(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function i(e,t,r){t[r]=e,t[r+1]=e>>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function a(e,t){var r=n(e,t),i=n(e,t+4);return i64_new(r,i)}Object.defineProperty(t,"__esModule",{value:!0}),t.readI8=function(e,t){return e[t]},t.writeI8=function(e,t,r){t[r]=e},t.readI16=function(e,t){return e[t]|e[t+1]<<8},t.writeI16=function(e,t,r){t[r]=e,t[r+1]=e>>>8},t.readI32=n,t.writeI32=i,t.readI64=a,t.writeI64=function(e,t,r){i(i64_low(e),t,r),i(i64_high(e),t,r+4)},t.readF32=function(e,t){return i32_as_f32(n(e,t))},t.writeF32=function(e,t,r){i(f32_as_i32(e),t,r)},t.readF64=function(e,t){return i64_as_f64(a(e,t))},t.writeF64=function(e,t,r){var n=f64_as_i64(e);i(i64_low(n),t,r),i(i64_high(n),t,r+4)}},function(e,t,r){"use strict";function n(e){for(var r in e)t.hasOwnProperty(r)||(t[r]=e[r])}Object.defineProperty(t,"__esModule",{value:!0});var i=r(10),a=r(13),o=r(14),s=r(1);t.formatDiagnostic=s.formatDiagnosticMessage;var c=r(15);t.parseFile=function(e,t,r,n){return void 0===r&&(r=!1),void 0===n&&(n=null),n||(n=new c.Parser),n.parseFile(e,t,r),n},t.nextFile=function(e){return e.nextFile()},t.nextDiagnostic=function(e){var t=e.program;return t.diagnosticsOffset 0 && !isLineBreak(text.charCodeAt(start - 1))) start--;\r\n while (end < len && !isLineBreak(text.charCodeAt(end))) end++;\r\n var sb: string[] = [\r\n \"\\n \",\r\n text.substring(start, end),\r\n \"\\n \"\r\n ];\r\n while (start < range.start) {\r\n sb.push(\" \");\r\n start++;\r\n }\r\n if (useColors) sb.push(COLOR_RED);\r\n if (range.start == range.end) {\r\n sb.push(\"^\");\r\n } else {\r\n while (start++ < range.end) sb.push(\"~\");\r\n }\r\n if (useColors) sb.push(COLOR_RESET);\r\n return sb.join(\"\");\r\n}\r\n\r\n/** Base class of all diagnostic emitters. */\r\nexport abstract class DiagnosticEmitter {\r\n\r\n /** Diagnostic messages emitted so far. */\r\n diagnostics: DiagnosticMessage[];\r\n\r\n /** Initializes this diagnostic emitter. */\r\n protected constructor(diagnostics: DiagnosticMessage[] | null = null) {\r\n this.diagnostics = diagnostics ? diagnostics : new Array();\r\n }\r\n\r\n /** Emits a diagnostic message of the specified category. */\r\n emitDiagnostic(\r\n code: DiagnosticCode,\r\n category: DiagnosticCategory,\r\n range: Range,\r\n relatedRange: Range | null,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n var message = DiagnosticMessage.create(code, category, arg0, arg1, arg2).withRange(range);\r\n if (relatedRange) message.relatedRange = relatedRange;\r\n this.diagnostics.push(message);\r\n // console.log(formatDiagnosticMessage(message, true, true) + \"\\n\"); // temporary\r\n // console.log(new Error(\"stack\").stack);\r\n }\r\n\r\n /** Emits an informatory diagnostic message. */\r\n info(\r\n code: DiagnosticCode,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.INFO, range, null, arg0, arg1, arg2);\r\n }\r\n\r\n /** Emits an informatory diagnostic message with a related range. */\r\n infoRelated(\r\n code: DiagnosticCode,\r\n range: Range,\r\n relatedRange: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.INFO, range, relatedRange, arg0, arg1, arg2);\r\n }\r\n\r\n /** Emits a warning diagnostic message. */\r\n warning(\r\n code: DiagnosticCode,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, null, arg0, arg1, arg2);\r\n }\r\n\r\n /** Emits a warning diagnostic message with a related range. */\r\n warningRelated(\r\n code: DiagnosticCode,\r\n range: Range,\r\n relatedRange: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, relatedRange, arg0, arg1, arg2);\r\n }\r\n\r\n /** Emits an error diagnostic message. */\r\n error(\r\n code: DiagnosticCode,\r\n range: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, null, arg0, arg1, arg2);\r\n }\r\n\r\n /** Emits an error diagnostic message with a related range. */\r\n errorRelated(\r\n code: DiagnosticCode,\r\n range: Range,\r\n relatedRange: Range,\r\n arg0: string | null = null,\r\n arg1: string | null = null,\r\n arg2: string | null = null\r\n ): void {\r\n this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, relatedRange, arg0, arg1, arg2);\r\n }\r\n}\r\n","/**\r\n * Various compiler utilities.\r\n * @module util\r\n * @preferred\r\n *//***/\r\n\r\nexport * from \"./bitset\";\r\nexport * from \"./charcode\";\r\nexport * from \"./collections\";\r\nexport * from \"./path\";\r\nexport * from \"./text\";\r\nexport * from \"./binary\";\r\n","/**\r\n * AssemblyScript's intermediate representation describing a program's elements.\r\n * @module program\r\n *//***/\r\n\r\nimport {\r\n CommonFlags,\r\n PATH_DELIMITER,\r\n STATIC_DELIMITER,\r\n INSTANCE_DELIMITER,\r\n GETTER_PREFIX,\r\n SETTER_PREFIX,\r\n INNER_DELIMITER,\r\n LIBRARY_SUBST,\r\n INDEX_SUFFIX,\r\n CommonSymbols,\r\n LibrarySymbols\r\n} from \"./common\";\r\n\r\nimport {\r\n Options,\r\n Feature\r\n} from \"./compiler\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticMessage,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags,\r\n Signature\r\n} from \"./types\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n Source,\r\n SourceKind,\r\n Range,\r\n DecoratorNode,\r\n DecoratorKind,\r\n SignatureNode,\r\n TypeParameterNode,\r\n CommonTypeNode,\r\n TypeNode,\r\n\r\n Expression,\r\n IdentifierExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n StringLiteralExpression,\r\n\r\n Statement,\r\n ClassDeclaration,\r\n DeclarationStatement,\r\n EnumDeclaration,\r\n EnumValueDeclaration,\r\n ExportMember,\r\n ExportStatement,\r\n FieldDeclaration,\r\n FunctionDeclaration,\r\n ImportDeclaration,\r\n ImportStatement,\r\n InterfaceDeclaration,\r\n MethodDeclaration,\r\n NamespaceDeclaration,\r\n TypeDeclaration,\r\n VariableDeclaration,\r\n VariableLikeDeclarationStatement,\r\n VariableStatement,\r\n\r\n decoratorNameToKind,\r\n findDecorator\r\n} from \"./ast\";\r\n\r\nimport {\r\n Module,\r\n FunctionRef\r\n} from \"./module\";\r\n\r\nimport {\r\n CharCode\r\n} from \"./util\";\r\n\r\nimport {\r\n Resolver\r\n} from \"./resolver\";\r\n\r\nimport {\r\n Flow\r\n} from \"./flow\";\r\n\r\n/** Represents a yet unresolved `import`. */\r\nclass QueuedImport {\r\n constructor(\r\n /** File being imported into. */\r\n public localFile: File,\r\n /** Identifier within the local file. */\r\n public localIdentifier: IdentifierExpression,\r\n /** Identifier within the other file. Is an `import *` if not set. */\r\n public foreignIdentifier: IdentifierExpression | null,\r\n /** Path to the other file. */\r\n public foreignPath: string,\r\n /** Alternative path to the other file. */\r\n public foreignPathAlt: string\r\n ) {}\r\n}\r\n\r\n/** Represents a yet unresolved `export`. */\r\nclass QueuedExport {\r\n constructor(\r\n /** Identifier within the local file. */\r\n public localIdentifier: IdentifierExpression,\r\n /** Identifier within the other file. */\r\n public foreignIdentifier: IdentifierExpression,\r\n /** Path to the other file if a re-export. */\r\n public foreignPath: string | null,\r\n /** Alternative path to the other file if a re-export. */\r\n public foreignPathAlt: string | null\r\n ) {}\r\n}\r\n\r\n/** Represents a yet unresolved `export *`. */\r\nclass QueuedExportStar {\r\n // stored in a map with localFile as the key\r\n constructor(\r\n /** Path to the other file. */\r\n public foreignPath: string,\r\n /** Alternative path to the other file. */\r\n public foreignPathAlt: string,\r\n /** Reference to the path literal for reporting. */\r\n public pathLiteral: StringLiteralExpression\r\n ) {}\r\n}\r\n\r\n/** Represents the kind of an operator overload. */\r\nexport enum OperatorKind {\r\n INVALID,\r\n\r\n // indexed access\r\n INDEXED_GET, // a[]\r\n INDEXED_SET, // a[]=b\r\n UNCHECKED_INDEXED_GET, // unchecked(a[])\r\n UNCHECKED_INDEXED_SET, // unchecked(a[]=b)\r\n\r\n // binary\r\n ADD, // a + b\r\n SUB, // a - b\r\n MUL, // a * b\r\n DIV, // a / b\r\n REM, // a % b\r\n POW, // a ** b\r\n BITWISE_AND, // a & b\r\n BITWISE_OR, // a | b\r\n BITWISE_XOR, // a ^ b\r\n BITWISE_SHL, // a << b\r\n BITWISE_SHR, // a >> b\r\n BITWISE_SHR_U, // a >>> b\r\n EQ, // a == b\r\n NE, // a != b\r\n GT, // a > b\r\n GE, // a >= b\r\n LT, // a < b\r\n LE, // a <= b\r\n\r\n // unary prefix\r\n PLUS, // +a\r\n MINUS, // -a\r\n NOT, // !a\r\n BITWISE_NOT, // ~a\r\n PREFIX_INC, // ++a\r\n PREFIX_DEC, // --a\r\n\r\n // unary postfix\r\n POSTFIX_INC, // a++\r\n POSTFIX_DEC // a--\r\n\r\n // not overridable:\r\n // IDENTITY // a === b\r\n // LOGICAL_AND // a && b\r\n // LOGICAL_OR // a || b\r\n}\r\n\r\n/** Returns the operator kind represented by the specified decorator and string argument. */\r\nfunction operatorKindFromDecorator(decoratorKind: DecoratorKind, arg: string): OperatorKind {\r\n assert(arg.length);\r\n switch (decoratorKind) {\r\n case DecoratorKind.OPERATOR:\r\n case DecoratorKind.OPERATOR_BINARY: {\r\n switch (arg.charCodeAt(0)) {\r\n case CharCode.OPENBRACKET: {\r\n if (arg == \"[]\") return OperatorKind.INDEXED_GET;\r\n if (arg == \"[]=\") return OperatorKind.INDEXED_SET;\r\n break;\r\n }\r\n case CharCode.OPENBRACE: {\r\n if (arg == \"{}\") return OperatorKind.UNCHECKED_INDEXED_GET;\r\n if (arg == \"{}=\") return OperatorKind.UNCHECKED_INDEXED_SET;\r\n break;\r\n }\r\n case CharCode.PLUS: {\r\n if (arg == \"+\") return OperatorKind.ADD;\r\n break;\r\n }\r\n case CharCode.MINUS: {\r\n if (arg == \"-\") return OperatorKind.SUB;\r\n break;\r\n }\r\n case CharCode.ASTERISK: {\r\n if (arg == \"*\") return OperatorKind.MUL;\r\n if (arg == \"**\") return OperatorKind.POW;\r\n break;\r\n }\r\n case CharCode.SLASH: {\r\n if (arg == \"/\") return OperatorKind.DIV;\r\n break;\r\n }\r\n case CharCode.PERCENT: {\r\n if (arg == \"%\") return OperatorKind.REM;\r\n break;\r\n }\r\n case CharCode.AMPERSAND: {\r\n if (arg == \"&\") return OperatorKind.BITWISE_AND;\r\n break;\r\n }\r\n case CharCode.BAR: {\r\n if (arg == \"|\") return OperatorKind.BITWISE_OR;\r\n break;\r\n }\r\n case CharCode.CARET: {\r\n if (arg == \"^\") return OperatorKind.BITWISE_XOR;\r\n break;\r\n }\r\n case CharCode.EQUALS: {\r\n if (arg == \"==\") return OperatorKind.EQ;\r\n break;\r\n }\r\n case CharCode.EXCLAMATION: {\r\n if (arg == \"!=\") return OperatorKind.NE;\r\n break;\r\n }\r\n case CharCode.GREATERTHAN: {\r\n if (arg == \">\") return OperatorKind.GT;\r\n if (arg == \">=\") return OperatorKind.GE;\r\n if (arg == \">>\") return OperatorKind.BITWISE_SHR;\r\n if (arg == \">>>\") return OperatorKind.BITWISE_SHR_U;\r\n break;\r\n }\r\n case CharCode.LESSTHAN: {\r\n if (arg == \"<\") return OperatorKind.LT;\r\n if (arg == \"<=\") return OperatorKind.LE;\r\n if (arg == \"<<\") return OperatorKind.BITWISE_SHL;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n case DecoratorKind.OPERATOR_PREFIX: {\r\n switch (arg.charCodeAt(0)) {\r\n case CharCode.PLUS: {\r\n if (arg == \"+\") return OperatorKind.PLUS;\r\n if (arg == \"++\") return OperatorKind.PREFIX_INC;\r\n break;\r\n }\r\n case CharCode.MINUS: {\r\n if (arg == \"-\") return OperatorKind.MINUS;\r\n if (arg == \"--\") return OperatorKind.PREFIX_DEC;\r\n break;\r\n }\r\n case CharCode.EXCLAMATION: {\r\n if (arg == \"!\") return OperatorKind.NOT;\r\n break;\r\n }\r\n case CharCode.TILDE: {\r\n if (arg == \"~\") return OperatorKind.BITWISE_NOT;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n case DecoratorKind.OPERATOR_POSTFIX: {\r\n switch (arg.charCodeAt(0)) {\r\n case CharCode.PLUS: {\r\n if (arg == \"++\") return OperatorKind.POSTFIX_INC;\r\n break;\r\n }\r\n case CharCode.MINUS: {\r\n if (arg == \"--\") return OperatorKind.POSTFIX_DEC;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n return OperatorKind.INVALID;\r\n}\r\n\r\n/** Represents an AssemblyScript program. */\r\nexport class Program extends DiagnosticEmitter {\r\n\r\n /** Resolver instance. */\r\n resolver: Resolver;\r\n /** Array of sources. */\r\n sources: Source[] = [];\r\n /** Diagnostic offset used where successively obtaining the next diagnostic. */\r\n diagnosticsOffset: i32 = 0;\r\n /** Compiler options. */\r\n options: Options;\r\n /** Special native code source. */\r\n nativeSource: Source;\r\n /** Special native code file. */\r\n nativeFile: File;\r\n /** Explicitly annotated start function. */\r\n explicitStartFunction: FunctionPrototype | null = null;\r\n\r\n // lookup maps\r\n\r\n /** Files by unique internal name. */\r\n filesByName: Map = new Map();\r\n /** Elements by unique internal name in element space. */\r\n elementsByName: Map = new Map();\r\n /** Elements by declaration. */\r\n elementsByDeclaration: Map = new Map();\r\n /** Element instances by unique internal name. */\r\n instancesByName: Map = new Map();\r\n /** Classes backing basic types like `i32`. */\r\n typeClasses: Map = new Map();\r\n\r\n // runtime references\r\n\r\n /** ArrayBuffer instance reference. */\r\n arrayBufferInstance: Class | null = null;\r\n /** Array prototype reference. */\r\n arrayPrototype: ClassPrototype | null = null;\r\n /** String instance reference. */\r\n stringInstance: Class | null = null;\r\n /** Abort function reference, if present. */\r\n abortInstance: Function | null = null;\r\n /** Memory allocation function. */\r\n memoryAllocateInstance: Function | null = null;\r\n\r\n // gc integration\r\n\r\n /** Whether a garbage collector is present or not. */\r\n hasGC: bool = false;\r\n /** Garbage collector allocation function. */\r\n gcAllocateInstance: Function | null = null;\r\n /** Garbage collector link function called when a managed object is referenced from a parent. */\r\n gcLinkInstance: Function | null = null;\r\n /** Garbage collector mark function called to on reachable managed objects. */\r\n gcMarkInstance: Function | null = null;\r\n /** Size of a managed object header. */\r\n gcHeaderSize: u32 = 0;\r\n /** Offset of the GC hook. */\r\n gcHookOffset: u32 = 0;\r\n\r\n /** Constructs a new program, optionally inheriting parser diagnostics. */\r\n constructor(\r\n /** Shared array of diagnostic messages (emitted so far). */\r\n diagnostics: DiagnosticMessage[] | null = null\r\n ) {\r\n super(diagnostics);\r\n var nativeSource = new Source(LIBRARY_SUBST, \"[native code]\", SourceKind.LIBRARY);\r\n this.nativeSource = nativeSource;\r\n var nativeFile = new File(this, nativeSource);\r\n this.nativeFile = nativeFile;\r\n this.filesByName.set(nativeFile.internalName, nativeFile);\r\n this.resolver = new Resolver(this);\r\n }\r\n\r\n /** Creates a native variable declaration. */\r\n makeNativeVariableDeclaration(\r\n /** The simple name of the variable */\r\n name: string,\r\n /** Flags indicating specific traits, e.g. `CONST`. */\r\n flags: CommonFlags = CommonFlags.NONE\r\n ): VariableDeclaration {\r\n var range = this.nativeSource.range;\r\n return Node.createVariableDeclaration(\r\n Node.createIdentifierExpression(name, range),\r\n null, null, null, flags, range\r\n );\r\n }\r\n\r\n /** Creates a native type declaration. */\r\n makeNativeTypeDeclaration(\r\n /** The simple name of the type. */\r\n name: string,\r\n /** Flags indicating specific traits, e.g. `GENERIC`. */\r\n flags: CommonFlags = CommonFlags.NONE\r\n ): TypeDeclaration {\r\n var range = this.nativeSource.range;\r\n var identifier = Node.createIdentifierExpression(name, range);\r\n return Node.createTypeDeclaration(\r\n identifier,\r\n null,\r\n Node.createOmittedType(range),\r\n null, flags, range\r\n );\r\n }\r\n\r\n // a dummy signature for programmatically generated native functions\r\n private nativeDummySignature: SignatureNode | null = null;\r\n\r\n /** Creates a native function declaration. */\r\n makeNativeFunctionDeclaration(\r\n /** The simple name of the function. */\r\n name: string,\r\n /** Flags indicating specific traits, e.g. `DECLARE`. */\r\n flags: CommonFlags = CommonFlags.NONE\r\n ): FunctionDeclaration {\r\n var range = this.nativeSource.range;\r\n return Node.createFunctionDeclaration(\r\n Node.createIdentifierExpression(name, range),\r\n null,\r\n this.nativeDummySignature || (this.nativeDummySignature = Node.createSignature([],\r\n Node.createType( // ^ AST signature doesn't really matter, is overridden anyway\r\n Node.createSimpleTypeName(CommonSymbols.void_, range),\r\n null, false, range\r\n ),\r\n null, false, range)\r\n ),\r\n null, null, flags, range\r\n );\r\n }\r\n\r\n /** Creates a native namespace declaration. */\r\n makeNativeNamespaceDeclaration(\r\n /** The simple name of the namespace. */\r\n name: string,\r\n /** Flags indicating specific traits, e.g. `EXPORT`. */\r\n flags: CommonFlags = CommonFlags.NONE\r\n ): NamespaceDeclaration {\r\n var range = this.nativeSource.range;\r\n return Node.createNamespaceDeclaration(\r\n Node.createIdentifierExpression(name, range),\r\n [], null, flags, range\r\n );\r\n }\r\n\r\n /** Creates a native function. */\r\n makeNativeFunction(\r\n /** The simple name of the function. */\r\n name: string,\r\n /** Concrete function signature. */\r\n signature: Signature,\r\n /** Parent element, usually a file, class or namespace. */\r\n parent: Element = this.nativeFile,\r\n /** Flags indicating specific traits, e.g. `GENERIC`. */\r\n flags: CommonFlags = CommonFlags.NONE,\r\n /** Decorator flags representing built-in decorators. */\r\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\r\n ): Function {\r\n return new Function(\r\n name,\r\n new FunctionPrototype(\r\n name,\r\n parent,\r\n this.makeNativeFunctionDeclaration(name, flags),\r\n decoratorFlags\r\n ),\r\n signature\r\n );\r\n }\r\n\r\n /** Gets the (possibly merged) program element linked to the specified declaration. */\r\n getElementByDeclaration(declaration: DeclarationStatement): DeclaredElement {\r\n var elementsByDeclaration = this.elementsByDeclaration;\r\n assert(elementsByDeclaration.has(declaration));\r\n return elementsByDeclaration.get(declaration)!;\r\n }\r\n\r\n /** Initializes the program and its elements prior to compilation. */\r\n initialize(options: Options): void {\r\n this.options = options;\r\n\r\n // register native types\r\n this.registerNativeType(CommonSymbols.i8, Type.i8);\r\n this.registerNativeType(CommonSymbols.i16, Type.i16);\r\n this.registerNativeType(CommonSymbols.i32, Type.i32);\r\n this.registerNativeType(CommonSymbols.i64, Type.i64);\r\n this.registerNativeType(CommonSymbols.isize, options.isizeType);\r\n this.registerNativeType(CommonSymbols.u8, Type.u8);\r\n this.registerNativeType(CommonSymbols.u16, Type.u16);\r\n this.registerNativeType(CommonSymbols.u32, Type.u32);\r\n this.registerNativeType(CommonSymbols.u64, Type.u64);\r\n this.registerNativeType(CommonSymbols.usize, options.usizeType);\r\n this.registerNativeType(CommonSymbols.bool, Type.bool);\r\n this.registerNativeType(CommonSymbols.f32, Type.f32);\r\n this.registerNativeType(CommonSymbols.f64, Type.f64);\r\n this.registerNativeType(CommonSymbols.void_, Type.void);\r\n this.registerNativeType(CommonSymbols.number, Type.f64); // alias\r\n this.registerNativeType(CommonSymbols.boolean, Type.bool); // alias\r\n this.nativeFile.add(CommonSymbols.native, new TypeDefinition(\r\n CommonSymbols.native,\r\n this.nativeFile,\r\n this.makeNativeTypeDeclaration(CommonSymbols.native, CommonFlags.EXPORT | CommonFlags.GENERIC),\r\n DecoratorFlags.BUILTIN\r\n ));\r\n if (options.hasFeature(Feature.SIMD)) this.registerNativeType(CommonSymbols.v128, Type.v128);\r\n\r\n // register compiler hints\r\n this.registerConstantInteger(LibrarySymbols.ASC_TARGET, Type.i32,\r\n i64_new(options.isWasm64 ? 2 : 1));\r\n this.registerConstantInteger(LibrarySymbols.ASC_NO_ASSERT, Type.bool,\r\n i64_new(options.noAssert ? 1 : 0, 0));\r\n this.registerConstantInteger(LibrarySymbols.ASC_MEMORY_BASE, Type.i32,\r\n i64_new(options.memoryBase, 0));\r\n this.registerConstantInteger(LibrarySymbols.ASC_OPTIMIZE_LEVEL, Type.i32,\r\n i64_new(options.optimizeLevelHint, 0));\r\n this.registerConstantInteger(LibrarySymbols.ASC_SHRINK_LEVEL, Type.i32,\r\n i64_new(options.shrinkLevelHint, 0));\r\n this.registerConstantInteger(LibrarySymbols.ASC_FEATURE_MUTABLE_GLOBAL, Type.bool,\r\n i64_new(options.hasFeature(Feature.MUTABLE_GLOBAL) ? 1 : 0, 0));\r\n this.registerConstantInteger(LibrarySymbols.ASC_FEATURE_SIGN_EXTENSION, Type.bool,\r\n i64_new(options.hasFeature(Feature.SIGN_EXTENSION) ? 1 : 0, 0));\r\n this.registerConstantInteger(LibrarySymbols.ASC_FEATURE_BULK_MEMORY, Type.bool,\r\n i64_new(options.hasFeature(Feature.BULK_MEMORY) ? 1 : 0, 0));\r\n this.registerConstantInteger(LibrarySymbols.ASC_FEATURE_SIMD, Type.bool,\r\n i64_new(options.hasFeature(Feature.SIMD) ? 1 : 0, 0));\r\n\r\n // remember deferred elements\r\n var queuedImports = new Array();\r\n var queuedExports = new Map>();\r\n var queuedExportsStar = new Map();\r\n var queuedExtends = new Array();\r\n var queuedImplements = new Array();\r\n\r\n // initialize relevant declaration-like statements of the entire program\r\n for (let i = 0, k = this.sources.length; i < k; ++i) {\r\n let source = this.sources[i];\r\n let file = new File(this, source);\r\n this.filesByName.set(file.internalName, file);\r\n let statements = source.statements;\r\n for (let j = 0, l = statements.length; j < l; ++j) {\r\n let statement = statements[j];\r\n switch (statement.kind) {\r\n case NodeKind.EXPORT: {\r\n this.initializeExports(statement, file, queuedExports, queuedExportsStar);\r\n break;\r\n }\r\n case NodeKind.IMPORT: {\r\n this.initializeImports(statement, file, queuedImports, queuedExports);\r\n break;\r\n }\r\n case NodeKind.VARIABLE: {\r\n this.initializeVariables(statement, file);\r\n break;\r\n }\r\n case NodeKind.CLASSDECLARATION: {\r\n this.initializeClass(statement, file, queuedExtends, queuedImplements);\r\n break;\r\n }\r\n case NodeKind.ENUMDECLARATION: {\r\n this.initializeEnum(statement, file);\r\n break;\r\n }\r\n case NodeKind.FUNCTIONDECLARATION: {\r\n this.initializeFunction(statement, file);\r\n break;\r\n }\r\n case NodeKind.INTERFACEDECLARATION: {\r\n this.initializeInterface(statement, file);\r\n break;\r\n }\r\n case NodeKind.NAMESPACEDECLARATION: {\r\n this.initializeNamespace(statement, file, queuedExtends, queuedImplements);\r\n break;\r\n }\r\n case NodeKind.TYPEDECLARATION: {\r\n this.initializeTypeDefinition(statement, file);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // queued exports * should be linkable now that all files have been processed\r\n for (let [file, exportsStar] of queuedExportsStar) {\r\n for (let i = 0, k = exportsStar.length; i < k; ++i) {\r\n let exportStar = exportsStar[i];\r\n let foreignFile = this.lookupForeignFile(exportStar.foreignPath, exportStar.foreignPathAlt);\r\n if (!foreignFile) {\r\n this.error(\r\n DiagnosticCode.File_0_not_found,\r\n exportStar.pathLiteral.range, exportStar.pathLiteral.value\r\n );\r\n continue;\r\n }\r\n file.ensureExportStar(foreignFile);\r\n }\r\n }\r\n\r\n // queued imports should be resolvable now through traversing exports and queued exports\r\n for (let i = 0, k = queuedImports.length; i < k; ++i) {\r\n let queuedImport = queuedImports[i];\r\n let foreignIdentifier = queuedImport.foreignIdentifier;\r\n if (foreignIdentifier) { // i.e. import { foo [as bar] } from \"./baz\"\r\n let element = this.lookupForeign(\r\n foreignIdentifier.text,\r\n queuedImport.foreignPath,\r\n queuedImport.foreignPathAlt,\r\n queuedExports\r\n );\r\n if (element) {\r\n queuedImport.localFile.add(\r\n queuedImport.localIdentifier.text,\r\n element,\r\n true // isImport\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Module_0_has_no_exported_member_1,\r\n foreignIdentifier.range,\r\n queuedImport.foreignPath,\r\n foreignIdentifier.text\r\n );\r\n }\r\n } else { // i.e. import * as bar from \"./bar\"\r\n let foreignFile = this.lookupForeignFile(queuedImport.foreignPath, queuedImport.foreignPathAlt);\r\n if (foreignFile) {\r\n let localFile = queuedImport.localFile;\r\n let localName = queuedImport.localIdentifier.text;\r\n localFile.add(\r\n localName,\r\n foreignFile.asImportedNamespace(\r\n localName,\r\n localFile\r\n ),\r\n true // isImport\r\n );\r\n } else {\r\n assert(false); // already reported by the parser not finding the file\r\n }\r\n }\r\n }\r\n\r\n // queued exports should be resolvable now that imports are finalized\r\n for (let [file, exports] of queuedExports) {\r\n for (let [exportName, queuedExport] of exports) {\r\n let localName = queuedExport.localIdentifier.text;\r\n let foreignPath = queuedExport.foreignPath;\r\n if (foreignPath) { // i.e. export { foo [as bar] } from \"./baz\"\r\n let element = this.lookupForeign(\r\n localName,\r\n foreignPath,\r\n assert(queuedExport.foreignPathAlt), // must be set if foreignPath is\r\n queuedExports\r\n );\r\n if (element) {\r\n file.ensureExport(exportName, element);\r\n } else {\r\n this.error(\r\n DiagnosticCode.Module_0_has_no_exported_member_1,\r\n queuedExport.localIdentifier.range,\r\n foreignPath, localName\r\n );\r\n }\r\n } else { // i.e. export { foo [as bar] }\r\n let element = file.lookupInSelf(localName);\r\n if (element) {\r\n file.ensureExport(exportName, element);\r\n } else {\r\n let globalElement = this.lookupGlobal(localName);\r\n if (globalElement && globalElement instanceof DeclaredElement) { // export { memory }\r\n file.ensureExport(exportName, globalElement);\r\n } else {\r\n this.error(\r\n DiagnosticCode.Module_0_has_no_exported_member_1,\r\n queuedExport.foreignIdentifier.range,\r\n file.internalName, queuedExport.foreignIdentifier.text\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // register classes backing basic types\r\n this.registerNativeTypeClass(TypeKind.I8, LibrarySymbols.I8);\r\n this.registerNativeTypeClass(TypeKind.I16, LibrarySymbols.I16);\r\n this.registerNativeTypeClass(TypeKind.I32, LibrarySymbols.I32);\r\n this.registerNativeTypeClass(TypeKind.I64, LibrarySymbols.I64);\r\n this.registerNativeTypeClass(TypeKind.ISIZE, LibrarySymbols.Isize);\r\n this.registerNativeTypeClass(TypeKind.U8, LibrarySymbols.U8);\r\n this.registerNativeTypeClass(TypeKind.U16, LibrarySymbols.U16);\r\n this.registerNativeTypeClass(TypeKind.U32, LibrarySymbols.U32);\r\n this.registerNativeTypeClass(TypeKind.U64, LibrarySymbols.U64);\r\n this.registerNativeTypeClass(TypeKind.USIZE, LibrarySymbols.Usize);\r\n this.registerNativeTypeClass(TypeKind.BOOL, LibrarySymbols.Bool);\r\n this.registerNativeTypeClass(TypeKind.F32, LibrarySymbols.F32);\r\n this.registerNativeTypeClass(TypeKind.F64, LibrarySymbols.F64);\r\n if (options.hasFeature(Feature.SIMD)) this.registerNativeTypeClass(TypeKind.V128, LibrarySymbols.V128);\r\n\r\n // resolve base prototypes of derived classes\r\n var resolver = this.resolver;\r\n for (let i = 0, k = queuedExtends.length; i < k; ++i) {\r\n let thisPrototype = queuedExtends[i];\r\n let extendsNode = assert(thisPrototype.extendsNode); // must be present if in queuedExtends\r\n let baseElement = resolver.resolveTypeName(extendsNode.name, thisPrototype.parent); // reports\r\n if (!baseElement) continue;\r\n if (baseElement.kind == ElementKind.CLASS_PROTOTYPE) {\r\n let basePrototype = baseElement;\r\n if (basePrototype.hasDecorator(DecoratorFlags.SEALED)) {\r\n this.error(\r\n DiagnosticCode.Class_0_is_sealed_and_cannot_be_extended,\r\n extendsNode.range, (baseElement).identifierNode.text\r\n );\r\n }\r\n if (\r\n basePrototype.hasDecorator(DecoratorFlags.UNMANAGED) !=\r\n thisPrototype.hasDecorator(DecoratorFlags.UNMANAGED)\r\n ) {\r\n this.error(\r\n DiagnosticCode.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa,\r\n Range.join(thisPrototype.identifierNode.range, extendsNode.range)\r\n );\r\n }\r\n thisPrototype.basePrototype = basePrototype;\r\n } else {\r\n this.error(\r\n DiagnosticCode.A_class_may_only_extend_another_class,\r\n extendsNode.range\r\n );\r\n }\r\n }\r\n\r\n // set up global aliases\r\n {\r\n let globalAliases = options.globalAliases;\r\n if (globalAliases) {\r\n for (let [alias, name] of globalAliases) {\r\n if (!name.length) continue; // explicitly disabled\r\n let elementsByName = this.elementsByName;\r\n let element = elementsByName.get(name);\r\n if (element) {\r\n if (elementsByName.has(alias)) throw new Error(\"duplicate global element: \" + name);\r\n elementsByName.set(alias, element);\r\n }\r\n else throw new Error(\"no such global element: \" + name);\r\n }\r\n }\r\n }\r\n\r\n // register global library elements\r\n {\r\n let element: Element | null;\r\n if (element = this.lookupGlobal(LibrarySymbols.String)) {\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n this.stringInstance = resolver.resolveClass(element, null);\r\n }\r\n if (element = this.lookupGlobal(LibrarySymbols.ArrayBuffer)) {\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n this.arrayBufferInstance = resolver.resolveClass(element, null);\r\n }\r\n if (element = this.lookupGlobal(LibrarySymbols.Array)) {\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n this.arrayPrototype = element;\r\n }\r\n if (element = this.lookupGlobal(LibrarySymbols.abort)) {\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.abortInstance = this.resolver.resolveFunction(element, null);\r\n }\r\n if (element = this.lookupGlobal(LibrarySymbols.memory)) {\r\n if (element = element.lookupInSelf(LibrarySymbols.allocate)) {\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.memoryAllocateInstance = this.resolver.resolveFunction(element, null);\r\n }\r\n }\r\n }\r\n\r\n // register GC hooks if present\r\n // FIXME: think about a better way than globals to model this, maybe a GC namespace that can be\r\n // dynamically extended by a concrete implementation but then has `@unsafe` methods that normal\r\n // code cannot call without explicitly enabling it with a flag.\r\n if (\r\n this.elementsByName.has(\"__gc_allocate\") &&\r\n this.elementsByName.has(\"__gc_link\") &&\r\n this.elementsByName.has(\"__gc_mark\")\r\n ) {\r\n // __gc_allocate(usize, (ref: usize) => void): usize\r\n let element = this.elementsByName.get(\"__gc_allocate\");\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let gcAllocateInstance = assert(this.resolver.resolveFunction(element, null));\r\n let signature = gcAllocateInstance.signature;\r\n assert(signature.parameterTypes.length == 2);\r\n assert(signature.parameterTypes[0] == this.options.usizeType);\r\n assert(signature.parameterTypes[1].signatureReference);\r\n assert(signature.returnType == this.options.usizeType);\r\n\r\n // __gc_link(usize, usize): void\r\n element = this.elementsByName.get(\"__gc_link\");\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let gcLinkInstance = assert(this.resolver.resolveFunction(element, null));\r\n signature = gcLinkInstance.signature;\r\n assert(signature.parameterTypes.length == 2);\r\n assert(signature.parameterTypes[0] == this.options.usizeType);\r\n assert(signature.parameterTypes[1] == this.options.usizeType);\r\n assert(signature.returnType == Type.void);\r\n\r\n // __gc_mark(usize): void\r\n element = this.elementsByName.get(\"__gc_mark\");\r\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let gcMarkInstance = assert(this.resolver.resolveFunction(element, null));\r\n signature = gcMarkInstance.signature;\r\n assert(signature.parameterTypes.length == 1);\r\n assert(signature.parameterTypes[0] == this.options.usizeType);\r\n assert(signature.returnType == Type.void);\r\n\r\n this.gcAllocateInstance = gcAllocateInstance;\r\n this.gcLinkInstance = gcLinkInstance;\r\n this.gcMarkInstance = gcMarkInstance;\r\n let gcHookOffset = 2 * options.usizeType.byteSize; // .next + .prev\r\n this.gcHookOffset = gcHookOffset;\r\n this.gcHeaderSize = (gcHookOffset + 4 + 7) & ~7; // + .hook index + alignment\r\n this.hasGC = true;\r\n }\r\n\r\n // mark module exports, i.e. to apply proper wrapping behavior on the boundaries\r\n for (let file of this.filesByName.values()) {\r\n let exports = file.exports;\r\n if (!(file.source.isEntry && exports)) continue;\r\n for (let element of exports.values()) this.markModuleExport(element);\r\n }\r\n }\r\n\r\n /** Marks an element and its children as a module export. */\r\n private markModuleExport(element: Element): void {\r\n element.set(CommonFlags.MODULE_EXPORT);\r\n switch (element.kind) {\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n let instanceMembers = (element).instanceMembers;\r\n if (instanceMembers) for (let member of instanceMembers.values()) this.markModuleExport(member);\r\n break;\r\n }\r\n case ElementKind.PROPERTY_PROTOTYPE: {\r\n let getterPrototype = (element).getterPrototype;\r\n if (getterPrototype) this.markModuleExport(getterPrototype);\r\n let setterPrototype = (element).setterPrototype;\r\n if (setterPrototype) this.markModuleExport(setterPrototype);\r\n break;\r\n }\r\n case ElementKind.PROPERTY:\r\n case ElementKind.FUNCTION:\r\n case ElementKind.FIELD:\r\n case ElementKind.CLASS: assert(false); // assumes that there are no instances yet\r\n }\r\n {\r\n let members = element.members;\r\n if (members) for (let member of members.values()) this.markModuleExport(member);\r\n }\r\n }\r\n\r\n /** Registers a native type with the program. */\r\n private registerNativeType(name: string, type: Type): void {\r\n var element = new TypeDefinition(\r\n name,\r\n this.nativeFile,\r\n this.makeNativeTypeDeclaration(name, CommonFlags.EXPORT),\r\n DecoratorFlags.BUILTIN\r\n );\r\n element.setType(type);\r\n this.nativeFile.add(name, element);\r\n }\r\n\r\n /** Registers the backing class of a native type. */\r\n private registerNativeTypeClass(typeKind: TypeKind, className: string): void {\r\n assert(!this.typeClasses.has(typeKind));\r\n var element = this.lookupGlobal(className);\r\n if (element) {\r\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\r\n let classElement = this.resolver.resolveClass(element, null);\r\n if (classElement) this.typeClasses.set(typeKind, classElement);\r\n }\r\n }\r\n\r\n /** Registers a constant integer value within the global scope. */\r\n private registerConstantInteger(name: string, type: Type, value: I64): void {\r\n assert(type.is(TypeFlags.INTEGER)); // must be an integer type\r\n var global = new Global(\r\n name,\r\n this.nativeFile,\r\n DecoratorFlags.NONE,\r\n this.makeNativeVariableDeclaration(name, CommonFlags.CONST | CommonFlags.EXPORT)\r\n );\r\n global.setConstantIntegerValue(value, type);\r\n this.nativeFile.add(name, global);\r\n }\r\n\r\n /** Registers a constant float value within the global scope. */\r\n private registerConstantFloat(name: string, type: Type, value: f64): void {\r\n assert(type.is(TypeFlags.FLOAT)); // must be a float type\r\n var global = new Global(\r\n name,\r\n this.nativeFile,\r\n DecoratorFlags.NONE,\r\n this.makeNativeVariableDeclaration(name, CommonFlags.CONST | CommonFlags.EXPORT)\r\n );\r\n global.setConstantFloatValue(value, type);\r\n this.nativeFile.add(name, global);\r\n }\r\n\r\n /** Ensures that the given global element exists. Attempts to merge duplicates. */\r\n ensureGlobal(name: string, element: DeclaredElement): void {\r\n var elementsByName = this.elementsByName;\r\n if (elementsByName.has(name)) {\r\n let actual = elementsByName.get(name);\r\n // NOTE: this is effectively only performed when merging native types with\r\n // their respective namespaces in std/builtins, but can also trigger when a\r\n // user has multiple global elements of the same name in different files,\r\n // which might result in unexpected shared symbols accross files. considering\r\n // this a wonky feature for now that we might want to revisit later.\r\n if (actual !== element) {\r\n let merged = tryMerge(elementsByName.get(name)!, element);\r\n if (!merged) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n element.identifierNode.range, name\r\n );\r\n return;\r\n }\r\n element = merged;\r\n }\r\n }\r\n elementsByName.set(name, element);\r\n }\r\n\r\n /** Looks up the element of the specified name in the global scope. */\r\n lookupGlobal(name: string): Element | null {\r\n var elements = this.elementsByName;\r\n if (elements.has(name)) return elements.get(name);\r\n return null;\r\n }\r\n\r\n /** Tries to locate a foreign file given its normalized path. */\r\n private lookupForeignFile(\r\n /** Normalized path to the other file. */\r\n foreignPath: string,\r\n /** Alternative normalized path to the other file. */\r\n foreignPathAlt: string\r\n ): File | null {\r\n var filesByName = this.filesByName;\r\n return filesByName.has(foreignPath)\r\n ? filesByName.get(foreignPath)!\r\n : filesByName.has(foreignPathAlt)\r\n ? filesByName.get(foreignPathAlt)!\r\n : null;\r\n }\r\n\r\n /** Tries to locate a foreign element by traversing exports and queued exports. */\r\n private lookupForeign(\r\n /** Identifier within the other file. */\r\n foreignName: string,\r\n /** Normalized path to the other file. */\r\n foreignPath: string,\r\n /** Alternative normalized path to the other file. */\r\n foreignPathAlt: string,\r\n /** So far queued exports. */\r\n queuedExports: Map>\r\n ): DeclaredElement | null {\r\n do {\r\n let foreignFile = this.lookupForeignFile(foreignPath, foreignPathAlt);\r\n if (!foreignFile) return null; // no such file\r\n\r\n // search already resolved exports\r\n let element = foreignFile.lookupExport(foreignName);\r\n if (element) return element;\r\n\r\n // otherwise traverse queued exports\r\n if (queuedExports.has(foreignFile)) {\r\n let fileQueuedExports = queuedExports.get(foreignFile)!;\r\n if (fileQueuedExports.has(foreignName)) {\r\n let queuedExport = fileQueuedExports.get(foreignName)!;\r\n if (queuedExport.foreignPath) { // imported from another file\r\n foreignName = queuedExport.localIdentifier.text;\r\n foreignPath = queuedExport.foreignPath;\r\n foreignPathAlt = assert(queuedExport.foreignPathAlt);\r\n continue;\r\n } else { // local element of this file\r\n element = foreignFile.lookupInSelf(queuedExport.localIdentifier.text);\r\n if (element) return element;\r\n }\r\n }\r\n }\r\n break;\r\n } while (true);\r\n return null;\r\n }\r\n\r\n /** Validates that only supported decorators are present. */\r\n private checkDecorators(\r\n /** Decorators present on an element. */\r\n decorators: DecoratorNode[] | null,\r\n /** Accepted decorator flags. Emits diagnostics if any other decorators are present. */\r\n acceptedFlags: DecoratorFlags\r\n ): DecoratorFlags {\r\n var flags = DecoratorFlags.NONE;\r\n if (decorators) {\r\n for (let i = 0, k = decorators.length; i < k; ++i) {\r\n let decorator = decorators[i];\r\n let kind = decoratorNameToKind(decorator.name);\r\n let flag = decoratorKindToFlag(kind);\r\n if (flag) {\r\n if (flag == DecoratorFlags.BUILTIN) {\r\n if (decorator.range.source.isLibrary) {\r\n flags |= flag;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Decorator_0_is_not_valid_here,\r\n decorator.range, decorator.name.range.toString()\r\n );\r\n }\r\n } else if (!(acceptedFlags & flag)) {\r\n this.error(\r\n DiagnosticCode.Decorator_0_is_not_valid_here,\r\n decorator.range, decorator.name.range.toString()\r\n );\r\n } else if (flags & flag) {\r\n this.error(\r\n DiagnosticCode.Duplicate_decorator,\r\n decorator.range, decorator.name.range.toString()\r\n );\r\n } else {\r\n flags |= flag;\r\n }\r\n }\r\n }\r\n }\r\n return flags;\r\n }\r\n\r\n /** Initializes a class declaration. */\r\n private initializeClass(\r\n /** The declaration to initialize. */\r\n declaration: ClassDeclaration,\r\n /** Parent element, usually a file or namespace. */\r\n parent: Element,\r\n /** So far queued `extends` clauses. */\r\n queuedExtends: ClassPrototype[],\r\n /** So far queued `implements` clauses. */\r\n queuedImplements: ClassPrototype[]\r\n ): void {\r\n var name = declaration.name.text;\r\n var element = new ClassPrototype(\r\n name,\r\n parent,\r\n declaration,\r\n this.checkDecorators(declaration.decorators,\r\n DecoratorFlags.GLOBAL |\r\n DecoratorFlags.SEALED |\r\n DecoratorFlags.UNMANAGED\r\n )\r\n );\r\n if (!parent.add(name, element)) return;\r\n\r\n var implementsTypes = declaration.implementsTypes;\r\n if (implementsTypes) {\r\n let numImplementsTypes = implementsTypes.length;\r\n // cannot implement interfaces when unmanaged\r\n if (element.hasDecorator(DecoratorFlags.UNMANAGED)) {\r\n if (numImplementsTypes) {\r\n this.error(\r\n DiagnosticCode.Unmanaged_classes_cannot_implement_interfaces,\r\n Range.join(\r\n declaration.name.range,\r\n implementsTypes[numImplementsTypes - 1].range\r\n )\r\n );\r\n }\r\n } else if (numImplementsTypes) {\r\n // remember classes that implement interfaces\r\n for (let i = 0; i < numImplementsTypes; ++i) {\r\n this.warning( // TODO: not yet supported\r\n DiagnosticCode.Operation_not_supported,\r\n implementsTypes[i].range\r\n );\r\n }\r\n queuedImplements.push(element);\r\n }\r\n }\r\n // remember classes that extend another class\r\n if (declaration.extendsType) queuedExtends.push(element);\r\n\r\n // initialize members\r\n var memberDeclarations = declaration.members;\r\n for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n let memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n case NodeKind.FIELDDECLARATION: {\r\n this.initializeField(memberDeclaration, element);\r\n break;\r\n }\r\n case NodeKind.METHODDECLARATION: {\r\n if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\r\n this.initializeProperty(memberDeclaration, element);\r\n } else {\r\n this.initializeMethod(memberDeclaration, element);\r\n }\r\n break;\r\n }\r\n case NodeKind.INDEXSIGNATUREDECLARATION: break; // ignored for now\r\n default: assert(false); // class member expected\r\n }\r\n }\r\n }\r\n\r\n /** Initializes a field of a class or interface. */\r\n private initializeField(\r\n /** The declaration to initialize. */\r\n declaration: FieldDeclaration,\r\n /** Parent class. */\r\n parent: ClassPrototype\r\n ): void {\r\n var name = declaration.name.text;\r\n var decorators = declaration.decorators;\r\n var element: DeclaredElement;\r\n if (declaration.is(CommonFlags.STATIC)) { // global variable\r\n assert(parent.kind != ElementKind.INTERFACE_PROTOTYPE);\r\n element = new Global(\r\n name,\r\n parent,\r\n this.checkDecorators(decorators,\r\n (declaration.is(CommonFlags.READONLY)\r\n ? DecoratorFlags.INLINE\r\n : DecoratorFlags.NONE\r\n ) | DecoratorFlags.LAZY\r\n ),\r\n declaration\r\n );\r\n if (!parent.add(name, element)) return;\r\n } else { // actual instance field\r\n assert(!declaration.isAny(CommonFlags.ABSTRACT | CommonFlags.GET | CommonFlags.SET));\r\n element = new FieldPrototype(\r\n name,\r\n parent,\r\n declaration,\r\n this.checkDecorators(decorators, DecoratorFlags.NONE)\r\n );\r\n if (!parent.addInstance(name, element)) return;\r\n }\r\n }\r\n\r\n /** Initializes a method of a class or interface. */\r\n private initializeMethod(\r\n /** The declaration to initialize. */\r\n declaration: MethodDeclaration,\r\n /** Parent class. */\r\n parent: ClassPrototype\r\n ): void {\r\n var name = declaration.name.text;\r\n var isStatic = declaration.is(CommonFlags.STATIC);\r\n var acceptedFlags = DecoratorFlags.INLINE;\r\n if (!declaration.is(CommonFlags.GENERIC)) {\r\n acceptedFlags |= DecoratorFlags.OPERATOR_BINARY\r\n | DecoratorFlags.OPERATOR_PREFIX\r\n | DecoratorFlags.OPERATOR_POSTFIX;\r\n }\r\n var element = new FunctionPrototype(\r\n name,\r\n parent,\r\n declaration,\r\n this.checkDecorators(declaration.decorators, acceptedFlags)\r\n );\r\n if (isStatic) { // global function\r\n assert(declaration.name.kind != NodeKind.CONSTRUCTOR);\r\n if (!parent.add(name, element)) return;\r\n } else { // actual instance method\r\n if (!parent.addInstance(name, element)) return;\r\n }\r\n this.checkOperatorOverloads(declaration.decorators, element, parent);\r\n }\r\n\r\n /** Checks that operator overloads are generally valid, if present. */\r\n private checkOperatorOverloads(\r\n /** Decorators to check. */\r\n decorators: DecoratorNode[] | null,\r\n /** Decorated method. */\r\n prototype: FunctionPrototype,\r\n /** Parent class. */\r\n classPrototype: ClassPrototype\r\n ): void {\r\n if (decorators) {\r\n for (let i = 0, k = decorators.length; i < k; ++i) {\r\n let decorator = decorators[i];\r\n switch (decorator.decoratorKind) {\r\n case DecoratorKind.OPERATOR:\r\n case DecoratorKind.OPERATOR_BINARY:\r\n case DecoratorKind.OPERATOR_PREFIX:\r\n case DecoratorKind.OPERATOR_POSTFIX: {\r\n let numArgs = decorator.arguments && decorator.arguments.length || 0;\r\n if (numArgs == 1) {\r\n let firstArg = (decorator.arguments)[0];\r\n if (\r\n firstArg.kind == NodeKind.LITERAL &&\r\n (firstArg).literalKind == LiteralKind.STRING\r\n ) {\r\n let kind = operatorKindFromDecorator(\r\n decorator.decoratorKind,\r\n (firstArg).value\r\n );\r\n if (kind == OperatorKind.INVALID) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n firstArg.range\r\n );\r\n } else {\r\n let overloads = classPrototype.overloadPrototypes;\r\n if (overloads.has(kind)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_function_implementation,\r\n firstArg.range\r\n );\r\n } else {\r\n prototype.operatorKind = kind;\r\n overloads.set(kind, prototype);\r\n }\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n firstArg.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n decorator.range, \"1\", numArgs.toString(10)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /** Ensures that the property introduced by the specified getter or setter exists.*/\r\n private ensureProperty(\r\n /** The declaration of the getter or setter introducing the property. */\r\n declaration: MethodDeclaration,\r\n /** Parent class. */\r\n parent: ClassPrototype\r\n ): PropertyPrototype | null {\r\n var name = declaration.name.text;\r\n if (declaration.is(CommonFlags.STATIC)) {\r\n let parentMembers = parent.members;\r\n if (parentMembers && parentMembers.has(name)) {\r\n let element = parentMembers.get(name)!;\r\n if (element.kind == ElementKind.PROPERTY_PROTOTYPE) return element;\r\n } else {\r\n let element = new PropertyPrototype(name, parent, declaration);\r\n if (!parent.add(name, element)) return null;\r\n return element;\r\n }\r\n } else {\r\n let parentMembers = parent.instanceMembers;\r\n if (parentMembers && parentMembers.has(name)) {\r\n let element = parentMembers.get(name);\r\n if (element.kind == ElementKind.PROPERTY_PROTOTYPE) return element;\r\n } else {\r\n let element = new PropertyPrototype(name, parent, declaration);\r\n if (!parent.addInstance(name, element)) return null;\r\n return element;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Duplicate_property_0,\r\n declaration.name.range, name\r\n );\r\n return null;\r\n }\r\n\r\n /** Initializes a property of a class. */\r\n private initializeProperty(\r\n /** The declaration of the getter or setter. */\r\n declaration: MethodDeclaration,\r\n /** Parent class. */\r\n parent: ClassPrototype\r\n ): void {\r\n var property = this.ensureProperty(declaration, parent);\r\n if (!property) return;\r\n var name = declaration.name.text;\r\n var isGetter = declaration.is(CommonFlags.GET);\r\n if (isGetter) {\r\n if (property.getterPrototype) {\r\n this.error(\r\n DiagnosticCode.Duplicate_property_0,\r\n declaration.name.range, name\r\n );\r\n return;\r\n }\r\n } else {\r\n if (property.setterPrototype) {\r\n this.error(\r\n DiagnosticCode.Duplicate_property_0,\r\n declaration.name.range, name\r\n );\r\n return;\r\n }\r\n }\r\n var element = new FunctionPrototype(\r\n (isGetter ? GETTER_PREFIX : SETTER_PREFIX) + name,\r\n property,\r\n declaration,\r\n this.checkDecorators(declaration.decorators,\r\n DecoratorFlags.INLINE\r\n )\r\n );\r\n if (isGetter) {\r\n property.getterPrototype = element;\r\n } else {\r\n property.setterPrototype = element;\r\n }\r\n }\r\n\r\n /** Initializes an enum. */\r\n private initializeEnum(\r\n /** The declaration to initialize. */\r\n declaration: EnumDeclaration,\r\n /** Parent element, usually a file or namespace. */\r\n parent: Element\r\n ): void {\r\n var name = declaration.name.text;\r\n var element = new Enum(\r\n name,\r\n parent,\r\n declaration,\r\n this.checkDecorators(declaration.decorators,\r\n DecoratorFlags.GLOBAL |\r\n DecoratorFlags.INLINE |\r\n DecoratorFlags.LAZY\r\n )\r\n );\r\n if (!parent.add(name, element)) return;\r\n var values = declaration.values;\r\n for (let i = 0, k = values.length; i < k; ++i) {\r\n this.initializeEnumValue(values[i], element);\r\n }\r\n }\r\n\r\n /** Initializes an enum value. */\r\n private initializeEnumValue(\r\n /** The declaration to initialize. */\r\n declaration: EnumValueDeclaration,\r\n /** Parent enum. */\r\n parent: Enum\r\n ): void {\r\n var name = declaration.name.text;\r\n var element = new EnumValue(\r\n name,\r\n parent,\r\n declaration,\r\n this.checkDecorators(declaration.decorators,\r\n DecoratorFlags.NONE\r\n )\r\n );\r\n if (!parent.add(name, element)) return;\r\n }\r\n\r\n /** Initializes an `export` statement. */\r\n private initializeExports(\r\n /** The statement to initialize. */\r\n statement: ExportStatement,\r\n /** Parent file. */\r\n parent: File,\r\n /** So far queued `export`s. */\r\n queuedExports: Map>,\r\n /** So far queued `export *`s. */\r\n queuedExportsStar: Map\r\n ): void {\r\n var members = statement.members;\r\n if (members) { // export { foo, bar } [from \"./baz\"]\r\n for (let i = 0, k = members.length; i < k; ++i) {\r\n this.initializeExport(members[i], parent, statement.internalPath, queuedExports);\r\n }\r\n } else { // export * from \"./baz\"\r\n let queued: QueuedExportStar[];\r\n if (queuedExportsStar.has(parent)) queued = queuedExportsStar.get(parent)!;\r\n else queuedExportsStar.set(parent, queued = []);\r\n let foreignPath = assert(statement.internalPath); // must be set for export *\r\n queued.push(new QueuedExportStar(\r\n foreignPath,\r\n foreignPath.endsWith(INDEX_SUFFIX) // strip or add index depending on what's already present\r\n ? foreignPath.substring(0, foreignPath.length - INDEX_SUFFIX.length)\r\n : foreignPath + INDEX_SUFFIX,\r\n assert(statement.path)\r\n ));\r\n }\r\n }\r\n\r\n /** Initializes a single `export` member. Does not handle `export *`. */\r\n private initializeExport(\r\n /** The member to initialize. */\r\n member: ExportMember,\r\n /** Local file. */\r\n localFile: File,\r\n /** Path to the other file, if present. */\r\n foreignPath: string | null,\r\n /** So far queued `export`s. */\r\n queuedExports: Map>\r\n ): void {\r\n var localName = member.localName.text;\r\n var foreignName = member.exportedName.text;\r\n\r\n // check for duplicates\r\n var element = localFile.lookupExport(foreignName);\r\n if (element) {\r\n this.error(\r\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\r\n member.exportedName.range, foreignName\r\n );\r\n return;\r\n }\r\n // local element, i.e. export { foo [as bar] }\r\n if (foreignPath === null) {\r\n\r\n // resolve right away if the local element already exists\r\n if (element = localFile.lookupInSelf(localName)) {\r\n localFile.ensureExport(foreignName, element);\r\n\r\n // otherwise queue it\r\n } else {\r\n let queued: Map;\r\n if (queuedExports.has(localFile)) queued = queuedExports.get(localFile)!;\r\n else queuedExports.set(localFile, queued = new Map());\r\n queued.set(foreignName, new QueuedExport(\r\n member.localName,\r\n member.exportedName,\r\n null, null\r\n ));\r\n }\r\n\r\n // foreign element, i.e. export { foo } from \"./bar\"\r\n } else {\r\n let queued: Map;\r\n if (queuedExports.has(localFile)) queued = queuedExports.get(localFile)!;\r\n else queuedExports.set(localFile, queued = new Map());\r\n queued.set(foreignName, new QueuedExport(\r\n member.localName,\r\n member.exportedName,\r\n foreignPath,\r\n foreignPath.endsWith(INDEX_SUFFIX) // strip or add index depending on what's already present\r\n ? foreignPath.substring(0, foreignPath.length - INDEX_SUFFIX.length)\r\n : foreignPath + INDEX_SUFFIX\r\n ));\r\n }\r\n }\r\n\r\n /** Initializes an `import` statement. */\r\n private initializeImports(\r\n /** The statement to initialize. */\r\n statement: ImportStatement,\r\n /** Parent file. */\r\n parent: File,\r\n /** So far queued `import`s. */\r\n queuedImports: QueuedImport[],\r\n /** SO far queued `export`s. */\r\n queuedExports: Map>\r\n ): void {\r\n var declarations = statement.declarations;\r\n if (declarations) { // import { foo [as bar] } from \"./baz\"\r\n for (let i = 0, k = declarations.length; i < k; ++i) {\r\n this.initializeImport(\r\n declarations[i],\r\n parent,\r\n statement.internalPath,\r\n queuedImports,\r\n queuedExports\r\n );\r\n }\r\n } else if (statement.namespaceName) { // import * as foo from \"./bar\"\r\n queuedImports.push(new QueuedImport(\r\n parent,\r\n statement.namespaceName,\r\n null, // indicates import *\r\n statement.internalPath,\r\n statement.internalPath + INDEX_SUFFIX\r\n ));\r\n } else {\r\n // import \"./foo\"\r\n }\r\n }\r\n\r\n /** Initializes a single `import` declaration. Does not handle `import *`. */\r\n private initializeImport( // { foo [as bar] }\r\n /** The declaration to initialize. */\r\n declaration: ImportDeclaration,\r\n /** Parent file. */\r\n parent: File,\r\n /** Path to the other file. */\r\n foreignPath: string,\r\n /** So far queued `import`s. */\r\n queuedImports: QueuedImport[],\r\n /** So far queued `export`s. */\r\n queuedExports: Map>\r\n ): void {\r\n var foreignPathAlt = foreignPath.endsWith(INDEX_SUFFIX) // strip or add index depending on what's already present\r\n ? foreignPath.substring(0, foreignPath.length - INDEX_SUFFIX.length)\r\n : foreignPath + INDEX_SUFFIX;\r\n\r\n // resolve right away if the element exists\r\n var element = this.lookupForeign(declaration.foreignName.text, foreignPath, foreignPathAlt, queuedExports);\r\n if (element) {\r\n parent.add(declaration.name.text, element, true);\r\n return;\r\n }\r\n\r\n // otherwise queue it\r\n queuedImports.push(new QueuedImport(\r\n parent,\r\n declaration.name,\r\n declaration.foreignName,\r\n foreignPath,\r\n foreignPathAlt\r\n ));\r\n }\r\n\r\n /** Initializes a function. Does not handle methods. */\r\n private initializeFunction(\r\n /** The declaration to initialize. */\r\n declaration: FunctionDeclaration,\r\n /** Parent element, usually a file or namespace. */\r\n parent: Element\r\n ): void {\r\n var name = declaration.name.text;\r\n var validDecorators = DecoratorFlags.NONE;\r\n if (!declaration.is(CommonFlags.AMBIENT)) {\r\n validDecorators |= DecoratorFlags.INLINE;\r\n }\r\n if (parent.kind != ElementKind.CLASS_PROTOTYPE && !declaration.is(CommonFlags.INSTANCE)) {\r\n validDecorators |= DecoratorFlags.GLOBAL;\r\n }\r\n if (!declaration.is(CommonFlags.GENERIC)) {\r\n if (declaration.is(CommonFlags.AMBIENT)) {\r\n validDecorators |= DecoratorFlags.EXTERNAL;\r\n } else if (parent.kind == ElementKind.FILE && (parent).source.isEntry) {\r\n validDecorators |= DecoratorFlags.START;\r\n }\r\n }\r\n var element = new FunctionPrototype(\r\n name,\r\n parent,\r\n declaration,\r\n this.checkDecorators(declaration.decorators, validDecorators)\r\n );\r\n if (!parent.add(name, element)) return;\r\n if (element.hasDecorator(DecoratorFlags.START)) {\r\n if (this.explicitStartFunction) {\r\n this.error(\r\n DiagnosticCode.Module_cannot_have_multiple_start_functions,\r\n assert(findDecorator(DecoratorKind.START, declaration.decorators)).range\r\n );\r\n } else this.explicitStartFunction = element;\r\n }\r\n }\r\n\r\n /** Initializes an interface. */\r\n private initializeInterface(\r\n /** The declaration to initialize. */\r\n declaration: InterfaceDeclaration,\r\n /** Parent element, usually a file or namespace. */\r\n parent: Element\r\n ): void {\r\n var name = declaration.name.text;\r\n var element = new InterfacePrototype(\r\n name,\r\n parent,\r\n declaration,\r\n this.checkDecorators(declaration.decorators,\r\n DecoratorFlags.GLOBAL\r\n )\r\n );\r\n if (!parent.add(name, element)) return;\r\n var memberDeclarations = declaration.members;\r\n for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\r\n let memberDeclaration = memberDeclarations[i];\r\n switch (memberDeclaration.kind) {\r\n case NodeKind.FIELDDECLARATION: {\r\n this.initializeField(memberDeclaration, element);\r\n break;\r\n }\r\n case NodeKind.METHODDECLARATION: {\r\n if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\r\n this.initializeProperty(memberDeclaration, element);\r\n } else {\r\n this.initializeMethod(memberDeclaration, element);\r\n }\r\n break;\r\n }\r\n default: assert(false); // interface member expected\r\n }\r\n }\r\n }\r\n\r\n /** Initializes a namespace. */\r\n private initializeNamespace(\r\n /** The declaration to initialize. */\r\n declaration: NamespaceDeclaration,\r\n /** Parent element, usually a file or another namespace. */\r\n parent: Element,\r\n /** So far queued `extends` clauses. */\r\n queuedExtends: ClassPrototype[],\r\n /** So far queued `implements` clauses. */\r\n queuedImplements: ClassPrototype[]\r\n ): void {\r\n var name = declaration.name.text;\r\n var element = new Namespace(name, parent, declaration);\r\n if (!parent.add(name, element)) return;\r\n element = assert(parent.lookupInSelf(name)); // possibly merged\r\n var members = declaration.members;\r\n for (let i = 0, k = members.length; i < k; ++i) {\r\n switch (members[i].kind) {\r\n case NodeKind.CLASSDECLARATION: {\r\n this.initializeClass(members[i], element, queuedExtends, queuedImplements);\r\n break;\r\n }\r\n case NodeKind.ENUMDECLARATION: {\r\n this.initializeEnum(members[i], element);\r\n break;\r\n }\r\n case NodeKind.FUNCTIONDECLARATION: {\r\n this.initializeFunction(members[i], element);\r\n break;\r\n }\r\n case NodeKind.INTERFACEDECLARATION: {\r\n this.initializeInterface(members[i], element);\r\n break;\r\n }\r\n case NodeKind.NAMESPACEDECLARATION: {\r\n this.initializeNamespace(members[i], element, queuedExtends, queuedImplements);\r\n break;\r\n }\r\n case NodeKind.TYPEDECLARATION: {\r\n this.initializeTypeDefinition(members[i], element);\r\n break;\r\n }\r\n case NodeKind.VARIABLE: {\r\n this.initializeVariables(members[i], element);\r\n break;\r\n }\r\n default: assert(false); // namespace member expected\r\n }\r\n }\r\n }\r\n\r\n /** Initializes a `type` definition. */\r\n private initializeTypeDefinition(\r\n /** The declaration to initialize. */\r\n declaration: TypeDeclaration,\r\n /** Parent element, usually a file or namespace. */\r\n parent: Element\r\n ): void {\r\n var name = declaration.name.text;\r\n var element = new TypeDefinition(\r\n name,\r\n parent,\r\n declaration,\r\n this.checkDecorators(declaration.decorators, DecoratorFlags.NONE)\r\n );\r\n parent.add(name, element); // reports\r\n }\r\n\r\n /** Initializes a variable statement. */\r\n private initializeVariables(\r\n /** The statement to initialize. */\r\n statement: VariableStatement,\r\n /** Parent element, usually a file or namespace. */\r\n parent: Element\r\n ): void {\r\n var declarations = statement.declarations;\r\n for (let i = 0, k = declarations.length; i < k; ++i) {\r\n let declaration = declarations[i];\r\n let name = declaration.name.text;\r\n let acceptedFlags = DecoratorFlags.GLOBAL | DecoratorFlags.LAZY;\r\n if (declaration.is(CommonFlags.DECLARE)) {\r\n acceptedFlags |= DecoratorFlags.EXTERNAL;\r\n }\r\n if (declaration.is(CommonFlags.CONST)) {\r\n acceptedFlags |= DecoratorFlags.INLINE;\r\n }\r\n let element = new Global(\r\n name,\r\n parent,\r\n this.checkDecorators(declaration.decorators, acceptedFlags),\r\n declaration\r\n );\r\n if (!parent.add(name, element)) continue; // reports\r\n }\r\n }\r\n}\r\n\r\n/** Indicates the specific kind of an {@link Element}. */\r\nexport enum ElementKind {\r\n /** A {@link Global}. */\r\n GLOBAL,\r\n /** A {@link Local}. */\r\n LOCAL,\r\n /** An {@link Enum}. */\r\n ENUM,\r\n /** An {@link EnumValue}. */\r\n ENUMVALUE,\r\n /** A {@link FunctionPrototype}. */\r\n FUNCTION_PROTOTYPE,\r\n /** A {@link Function}. */\r\n FUNCTION,\r\n /** A {@link FunctionTarget}. */\r\n FUNCTION_TARGET,\r\n /** A {@link ClassPrototype}. */\r\n CLASS_PROTOTYPE,\r\n /** A {@link Class}. */\r\n CLASS,\r\n /** An {@link InterfacePrototype}. */\r\n INTERFACE_PROTOTYPE,\r\n /** An {@link Interface}. */\r\n INTERFACE,\r\n /** A {@link FieldPrototype}. */\r\n FIELD_PROTOTYPE,\r\n /** A {@link Field}. */\r\n FIELD,\r\n /** A {@link PropertyPrototype}. */\r\n PROPERTY_PROTOTYPE,\r\n /** A {@link Property}. */\r\n PROPERTY,\r\n /** A {@link Namespace}. */\r\n NAMESPACE,\r\n /** A {@link File}. */\r\n FILE,\r\n /** A {@link TypeDefinition}. */\r\n TYPEDEFINITION,\r\n}\r\n\r\n/** Indicates built-in decorators that are present. */\r\nexport enum DecoratorFlags {\r\n /** No flags set. */\r\n NONE = 0,\r\n /** Is a program global. */\r\n GLOBAL = 1 << 0,\r\n /** Is a binary operator overload. */\r\n OPERATOR_BINARY = 1 << 1,\r\n /** Is a unary prefix operator overload. */\r\n OPERATOR_PREFIX = 1 << 2,\r\n /** Is a unary postfix operator overload. */\r\n OPERATOR_POSTFIX = 1 << 3,\r\n /** Is an unmanaged class. */\r\n UNMANAGED = 1 << 4,\r\n /** Is a sealed class. */\r\n SEALED = 1 << 5,\r\n /** Is always inlined. */\r\n INLINE = 1 << 6,\r\n /** Is using a different external name. */\r\n EXTERNAL = 1 << 7,\r\n /** Is a builtin. */\r\n BUILTIN = 1 << 8,\r\n /** Is compiled lazily. */\r\n LAZY = 1 << 9,\r\n /** Is the explicit start function. */\r\n START = 1 << 10\r\n}\r\n\r\n/** Translates a decorator kind to the respective decorator flag. */\r\nexport function decoratorKindToFlag(kind: DecoratorKind): DecoratorFlags {\r\n switch (kind) {\r\n case DecoratorKind.GLOBAL: return DecoratorFlags.GLOBAL;\r\n case DecoratorKind.OPERATOR:\r\n case DecoratorKind.OPERATOR_BINARY: return DecoratorFlags.OPERATOR_BINARY;\r\n case DecoratorKind.OPERATOR_PREFIX: return DecoratorFlags.OPERATOR_PREFIX;\r\n case DecoratorKind.OPERATOR_POSTFIX: return DecoratorFlags.OPERATOR_POSTFIX;\r\n case DecoratorKind.UNMANAGED: return DecoratorFlags.UNMANAGED;\r\n case DecoratorKind.SEALED: return DecoratorFlags.SEALED;\r\n case DecoratorKind.INLINE: return DecoratorFlags.INLINE;\r\n case DecoratorKind.EXTERNAL: return DecoratorFlags.EXTERNAL;\r\n case DecoratorKind.BUILTIN: return DecoratorFlags.BUILTIN;\r\n case DecoratorKind.LAZY: return DecoratorFlags.LAZY;\r\n case DecoratorKind.START: return DecoratorFlags.START;\r\n default: return DecoratorFlags.NONE;\r\n }\r\n}\r\n\r\n/** Base class of all program elements. */\r\nexport abstract class Element {\r\n\r\n /** Parent element. */\r\n parent: Element;\r\n /** Common flags indicating specific traits. */\r\n flags: CommonFlags = CommonFlags.NONE;\r\n /** Decorator flags indicating annotated traits. */\r\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE;\r\n /** Member elements. */\r\n members: Map | null = null;\r\n /** Shadowing type in type space, if any. */\r\n shadowType: TypeDefinition | null = null;\r\n\r\n /** Constructs a new program element. */\r\n protected constructor(\r\n /** Specific element kind. */\r\n public kind: ElementKind,\r\n /** Simple name. */\r\n public name: string,\r\n /** Internal name referring to this element. */\r\n public internalName: string,\r\n /** Containing {@link Program}. */\r\n public program: Program,\r\n /** Parent element. */\r\n parent: Element | null\r\n ) {\r\n this.program = program;\r\n this.name = name;\r\n this.internalName = internalName;\r\n if (parent) {\r\n this.parent = parent;\r\n } else {\r\n assert(this.kind == ElementKind.FILE);\r\n this.parent = this; // special case to keep this.parent non-nullable\r\n }\r\n }\r\n\r\n /** Gets the enclosing file. */\r\n get file(): File {\r\n var current: Element = this;\r\n do if ((current = current.parent).kind == ElementKind.FILE) return current;\r\n while (true);\r\n }\r\n\r\n /** Tests if this element has a specific flag or flags. */\r\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\r\n /** Tests if this element has any of the specified flags. */\r\n isAny(flags: CommonFlags): bool { return (this.flags & flags) != 0; }\r\n /** Sets a specific flag or flags. */\r\n set(flag: CommonFlags): void { this.flags |= flag; }\r\n /** Tests if this element has a specific decorator flag or flags. */\r\n hasDecorator(flag: DecoratorFlags): bool { return (this.decoratorFlags & flag) == flag; }\r\n\r\n /** Looks up the element with the specified name within this element. */\r\n lookupInSelf(name: string): DeclaredElement | null {\r\n var members = this.members;\r\n if (members && members.has(name)) return members.get(name)!;\r\n return null;\r\n }\r\n\r\n /** Looks up the element with the specified name relative to this element, like in JS. */\r\n abstract lookup(name: string): Element | null;\r\n\r\n /** Adds an element as a member of this one. Reports and returns `false` if a duplicate. */\r\n add(name: string, element: DeclaredElement): bool {\r\n var originalDeclaration = element.declaration;\r\n var members = this.members;\r\n if (!members) this.members = members = new Map();\r\n else if (members.has(name)) {\r\n let actual = members.get(name)!;\r\n if (actual.parent !== this) {\r\n // override non-own element\r\n } else {\r\n let merged = tryMerge(actual, element);\r\n if (merged) {\r\n element = merged; // use merged element\r\n } else {\r\n this.program.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n element.identifierNode.range, element.identifierNode.text\r\n );\r\n return false;\r\n }\r\n }\r\n }\r\n members.set(name, element);\r\n var program = this.program;\r\n if (element.kind != ElementKind.FUNCTION_PROTOTYPE || !(element).isBound) {\r\n // prefer unbound prototypes in global lookup maps\r\n program.elementsByName.set(element.internalName, element);\r\n program.elementsByDeclaration.set(originalDeclaration, element);\r\n }\r\n return true;\r\n }\r\n\r\n /** Returns a string representation of this element. */\r\n toString(): string {\r\n return ElementKind[this.kind] + \":\" + this.internalName;\r\n }\r\n}\r\n\r\n/** Base class of elements with an associated declaration statement. */\r\nexport abstract class DeclaredElement extends Element {\r\n\r\n /** Constructs a new declared program element. */\r\n protected constructor(\r\n /** Specific element kind. */\r\n kind: ElementKind,\r\n /** Simple name. */\r\n name: string,\r\n /** Internal name referring to this element. */\r\n internalName: string,\r\n /** Containing {@link Program}. */\r\n program: Program,\r\n /** Parent element. */\r\n parent: Element | null,\r\n /** Declaration reference. */\r\n public declaration: DeclarationStatement\r\n ) {\r\n super(kind, name, internalName, program, parent);\r\n // It is necessary to have access to identifiers of all members and exports\r\n // for reporting purposes and this is the lowest common denominator. Comes\r\n // at the expense of not having more specific type information in derived\r\n // classes, though. Instead, derived classes implement getters for other\r\n // important AST nodes directly through manual casting, allowing the resolver\r\n // etc. to not worry about actual declarations.\r\n this.declaration = declaration;\r\n this.flags = declaration.flags; // inherit\r\n }\r\n\r\n /** Tests if this element is a library element. */\r\n get isDeclaredInLibrary(): bool {\r\n return this.declaration.range.source.isLibrary;\r\n }\r\n\r\n /** Gets the associated identifier node. */\r\n get identifierNode(): IdentifierExpression {\r\n return this.declaration.name;\r\n }\r\n\r\n /** Gets the assiciated decorator nodes. */\r\n get decoratorNodes(): DecoratorNode[] | null {\r\n return this.declaration.decorators;\r\n }\r\n}\r\n\r\n/** Base class of elements that can be resolved to a concrete type. */\r\nexport abstract class TypedElement extends DeclaredElement {\r\n\r\n /** Resolved type. Set once `is(RESOLVED)`, otherwise void. */\r\n type: Type = Type.void;\r\n\r\n /** Sets the resolved type of this element. */\r\n setType(type: Type): void {\r\n assert(!this.is(CommonFlags.RESOLVED));\r\n this.type = type;\r\n this.set(CommonFlags.RESOLVED);\r\n }\r\n}\r\n\r\n/** A file representing the implicit top-level namespace of a source. */\r\nexport class File extends Element {\r\n\r\n /** File exports. */\r\n exports: Map | null = null;\r\n /** File re-exports. */\r\n exportsStar: File[] | null = null;\r\n /** Top-level start function of this file. */\r\n startFunction: Function;\r\n\r\n /** Constructs a new file. */\r\n constructor(\r\n /** Program this file belongs to. */\r\n program: Program,\r\n /** Source of this file. */\r\n public source: Source\r\n ) {\r\n super(\r\n ElementKind.FILE,\r\n source.normalizedPath,\r\n source.internalPath,\r\n program,\r\n null // special case for files\r\n );\r\n this.source = source;\r\n assert(!program.filesByName.has(this.internalName));\r\n program.filesByName.set(this.internalName, this);\r\n var startFunction = this.program.makeNativeFunction(\r\n \"start:\" + this.internalName,\r\n new Signature(null, Type.void),\r\n this\r\n );\r\n startFunction.internalName = startFunction.name;\r\n this.startFunction = startFunction;\r\n }\r\n\r\n /* @override */\r\n add(name: string, element: DeclaredElement, isImport: bool = false): bool {\r\n if (!super.add(name, element)) return false;\r\n element = assert(this.lookupInSelf(name)); // possibly merged\r\n if (element.is(CommonFlags.EXPORT) && !isImport) {\r\n this.ensureExport(\r\n element.name,\r\n element\r\n );\r\n }\r\n if (element.hasDecorator(DecoratorFlags.GLOBAL)) this.program.ensureGlobal(name, element);\r\n return true;\r\n }\r\n\r\n /* @override */\r\n lookupInSelf(name: string): DeclaredElement | null {\r\n var element = super.lookupInSelf(name);\r\n if (element) return element;\r\n var exportsStar = this.exportsStar;\r\n if (exportsStar) {\r\n for (let i = 0, k = exportsStar.length; i < k; ++i) {\r\n if (element = exportsStar[i].lookupInSelf(name)) return element;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n var element = this.lookupInSelf(name);\r\n if (element) return element;\r\n return this.program.lookupGlobal(name);\r\n }\r\n\r\n /** Ensures that an element is an export of this file. */\r\n ensureExport(name: string, element: DeclaredElement): void {\r\n var exports = this.exports;\r\n if (!exports) this.exports = exports = new Map();\r\n exports.set(name, element);\r\n if (this.source.isLibrary) this.program.ensureGlobal(name, element);\r\n }\r\n\r\n /** Ensures that another file is a re-export of this file. */\r\n ensureExportStar(file: File): void {\r\n var exportsStar = this.exportsStar;\r\n if (!exportsStar) this.exportsStar = exportsStar = [];\r\n else if (exportsStar.includes(file)) return;\r\n exportsStar.push(file);\r\n }\r\n\r\n /** Looks up the export of the specified name. */\r\n lookupExport(name: string): DeclaredElement | null {\r\n var exports = this.exports;\r\n if (exports && exports.has(name)) return exports.get(name)!;\r\n var exportsStar = this.exportsStar;\r\n if (exportsStar) {\r\n for (let i = 0, k = exportsStar.length; i < k; ++i) {\r\n let element = exportsStar[i].lookupExport(name);\r\n if (element) return element;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /** Creates an imported namespace from this file. */\r\n asImportedNamespace(name: string, parent: Element): Namespace {\r\n var ns = new Namespace(\r\n name,\r\n parent,\r\n this.program.makeNativeNamespaceDeclaration(name)\r\n );\r\n var exports = this.exports;\r\n if (exports) {\r\n for (let [memberName, member] of exports) {\r\n ns.add(memberName, member);\r\n }\r\n }\r\n return ns;\r\n }\r\n}\r\n\r\n/** A type definition. */\r\nexport class TypeDefinition extends TypedElement {\r\n\r\n /** Constructs a new type definition. */\r\n constructor(\r\n /** Simple name. */\r\n name: string,\r\n /** Parent element, usually a file or namespace. */\r\n parent: Element,\r\n /** Declaration reference. */\r\n declaration: TypeDeclaration,\r\n /** Pre-checked flags indicating built-in decorators. */\r\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\r\n ) {\r\n super(\r\n ElementKind.TYPEDEFINITION,\r\n name,\r\n mangleInternalName(name, parent, false),\r\n parent.program,\r\n parent,\r\n declaration\r\n );\r\n this.decoratorFlags = decoratorFlags;\r\n }\r\n\r\n /** Gets the associated type parameter nodes. */\r\n get typeParameterNodes(): TypeParameterNode[] | null {\r\n return (this.declaration).typeParameters;\r\n }\r\n\r\n /** Gets the associated type node. */\r\n get typeNode(): CommonTypeNode {\r\n return (this.declaration).type;\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n return this.parent.lookup(name);\r\n }\r\n}\r\n\r\n/** A namespace that differs from a file in being user-declared with a name. */\r\nexport class Namespace extends DeclaredElement {\r\n\r\n /** Constructs a new namespace. */\r\n constructor(\r\n /** Simple name. */\r\n name: string,\r\n /** Parent element, usually a file or another namespace. */\r\n parent: Element,\r\n /** Declaration reference. */\r\n declaration: NamespaceDeclaration\r\n ) {\r\n super(\r\n ElementKind.NAMESPACE,\r\n name,\r\n mangleInternalName(name, parent, false),\r\n parent.program,\r\n parent,\r\n declaration\r\n );\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n return this.lookupInSelf(name)\r\n || this.parent.lookup(name);\r\n }\r\n}\r\n\r\n/** An enum. */\r\nexport class Enum extends TypedElement {\r\n\r\n /** Constructs a new enum. */\r\n constructor(\r\n /** Simple name. */\r\n name: string,\r\n /** Parent element, usually a file or namespace. */\r\n parent: Element,\r\n /** Declaration reference. */\r\n declaration: EnumDeclaration,\r\n /** Pre-checked flags indicating built-in decorators. */\r\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\r\n ) {\r\n super(\r\n ElementKind.ENUM,\r\n name,\r\n mangleInternalName(name, parent, false),\r\n parent.program,\r\n parent,\r\n declaration\r\n );\r\n this.decoratorFlags = decoratorFlags;\r\n this.setType(Type.i32);\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n return this.lookupInSelf(name)\r\n || this.parent.lookup(name);\r\n }\r\n}\r\n\r\n/** Indicates the kind of an inlined constant value. */\r\nexport const enum ConstantValueKind {\r\n /** No constant value. */\r\n NONE,\r\n /** Constant integer value. */\r\n INTEGER,\r\n /** Constant float value. */\r\n FLOAT\r\n}\r\n\r\n/** Base class of all variable-like program elements. */\r\nexport abstract class VariableLikeElement extends TypedElement {\r\n\r\n /** Constant value kind. */\r\n constantValueKind: ConstantValueKind = ConstantValueKind.NONE;\r\n /** Constant integer value, if applicable. */\r\n constantIntegerValue: I64;\r\n /** Constant float value, if applicable. */\r\n constantFloatValue: f64;\r\n\r\n /** Constructs a new variable-like element. */\r\n protected constructor(\r\n /** Specific element kind. */\r\n kind: ElementKind,\r\n /** Simple name. */\r\n name: string,\r\n /** Parent element, usually a file, namespace or class. */\r\n parent: Element,\r\n /** Declaration reference. Creates a native declaration if omitted. */\r\n declaration: VariableLikeDeclarationStatement = parent.program.makeNativeVariableDeclaration(name)\r\n ) {\r\n super(\r\n kind,\r\n name,\r\n mangleInternalName(name, parent, false),\r\n parent.program,\r\n parent,\r\n declaration\r\n );\r\n this.flags = declaration.flags;\r\n }\r\n\r\n /** Gets the associated type node.s */\r\n get typeNode(): CommonTypeNode | null {\r\n return (this.declaration).type;\r\n }\r\n\r\n /** Gets the associated initializer node. */\r\n get initializerNode(): Expression | null {\r\n return (this.declaration).initializer;\r\n }\r\n\r\n /** Applies a constant integer value to this element. */\r\n setConstantIntegerValue(value: I64, type: Type): void {\r\n assert(type.is(TypeFlags.INTEGER));\r\n this.type = type;\r\n this.constantValueKind = ConstantValueKind.INTEGER;\r\n this.constantIntegerValue = value;\r\n this.set(CommonFlags.CONST | CommonFlags.INLINED | CommonFlags.RESOLVED);\r\n }\r\n\r\n /** Applies a constant float value to this element. */\r\n setConstantFloatValue(value: f64, type: Type): void {\r\n assert(type.is(TypeFlags.FLOAT));\r\n this.type = type;\r\n this.constantValueKind = ConstantValueKind.FLOAT;\r\n this.constantFloatValue = value;\r\n this.set(CommonFlags.CONST | CommonFlags.INLINED | CommonFlags.RESOLVED);\r\n }\r\n\r\n /** @override */\r\n lookup(name: string): Element | null {\r\n return this.parent.lookup(name);\r\n }\r\n}\r\n\r\n/** An enum value. */\r\nexport class EnumValue extends VariableLikeElement {\r\n\r\n /** Constructs a new enum value. */\r\n constructor(\r\n /** Simple name. */\r\n name: string,\r\n /** Parent enum. */\r\n parent: Enum,\r\n /** Declaration reference. */\r\n declaration: EnumValueDeclaration,\r\n /** Pre-checked flags indicating built-in decorators. */\r\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\r\n ) {\r\n super(\r\n ElementKind.ENUMVALUE,\r\n name,\r\n parent,\r\n declaration\r\n );\r\n this.decoratorFlags = decoratorFlags;\r\n this.setType(Type.i32);\r\n }\r\n\r\n /** Gets the associated value node. */\r\n get valueNode(): Expression | null {\r\n return (this.declaration).value;\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n return this.parent.lookup(name);\r\n }\r\n}\r\n\r\n/** A global variable. */\r\nexport class Global extends VariableLikeElement {\r\n\r\n /** Constructs a new global variable. */\r\n constructor(\r\n /** Simple name. */\r\n name: string,\r\n /** Parent element, usually a file, namespace or static class. */\r\n parent: Element,\r\n /** Pre-checked flags indicating built-in decorators. */\r\n decoratorFlags: DecoratorFlags,\r\n /** Declaration reference. Creates a native declaration if omitted. */\r\n declaration: VariableLikeDeclarationStatement = parent.program.makeNativeVariableDeclaration(name)\r\n ) {\r\n super(\r\n ElementKind.GLOBAL,\r\n name,\r\n parent,\r\n declaration\r\n );\r\n this.decoratorFlags = decoratorFlags;\r\n }\r\n}\r\n\r\n/** A function parameter. */\r\nexport class Parameter {\r\n /** Constructs a new function parameter. */\r\n constructor(\r\n /** Parameter name. */\r\n public name: string,\r\n /** Parameter type. */\r\n public type: Type,\r\n /** Parameter initializer, if present. */\r\n public initializer: Expression | null = null\r\n ) {}\r\n}\r\n\r\n/** A local variable. */\r\nexport class Local extends VariableLikeElement {\r\n\r\n /** Constructs a new local variable. */\r\n constructor(\r\n /** Simple name. */\r\n name: string,\r\n /** Zero-based index within the enclosing function. `-1` indicates a virtual local. */\r\n public index: i32,\r\n /** Resolved type. */\r\n type: Type,\r\n /** Parent function. */\r\n parent: Function,\r\n /** Declaration reference. */\r\n declaration: VariableLikeDeclarationStatement = parent.program.makeNativeVariableDeclaration(name)\r\n ) {\r\n super(\r\n ElementKind.LOCAL,\r\n name,\r\n parent,\r\n declaration\r\n );\r\n this.index = index;\r\n assert(type != Type.void);\r\n this.setType(type);\r\n }\r\n}\r\n\r\n/** A yet unresolved function prototype. */\r\nexport class FunctionPrototype extends DeclaredElement {\r\n\r\n /** Operator kind, if an overload. */\r\n operatorKind: OperatorKind = OperatorKind.INVALID;\r\n /** Already resolved instances. */\r\n instances: Map | null = null;\r\n\r\n /** Clones of this prototype that are bounds to specific classes. */\r\n private boundPrototypes: Map | null = null;\r\n\r\n /** Constructs a new function prototype. */\r\n constructor(\r\n /** Simple na,e */\r\n name: string,\r\n /** Parent element, usually a file, namespace or class (if a method). */\r\n parent: Element,\r\n /** Declaration reference. */\r\n declaration: FunctionDeclaration,\r\n /** Pre-checked flags indicating built-in decorators. */\r\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\r\n ) {\r\n super(\r\n ElementKind.FUNCTION_PROTOTYPE,\r\n name,\r\n mangleInternalName(name, parent, declaration.is(CommonFlags.INSTANCE)),\r\n parent.program,\r\n parent,\r\n declaration\r\n );\r\n this.decoratorFlags = decoratorFlags;\r\n }\r\n\r\n /** Gets the associated type parameter nodes. */\r\n get typeParameterNodes(): TypeParameterNode[] | null {\r\n return (this.declaration).typeParameters;\r\n }\r\n\r\n /** Gets the associated signature node. */\r\n get signatureNode(): SignatureNode {\r\n return (this.declaration).signature;\r\n }\r\n\r\n /** Gets the associated body node. */\r\n get bodyNode(): Statement | null {\r\n return (this.declaration).body;\r\n }\r\n\r\n /** Tests if this prototype is bound to a class. */\r\n get isBound(): bool {\r\n var parent = this.parent;\r\n return parent.kind == ElementKind.CLASS\r\n || parent.kind == ElementKind.PROPERTY_PROTOTYPE && parent.parent.kind == ElementKind.CLASS;\r\n }\r\n\r\n /** Creates a clone of this prototype that is bound to a concrete class instead. */\r\n toBound(classInstance: Class): FunctionPrototype {\r\n assert(this.is(CommonFlags.INSTANCE));\r\n assert(!this.isBound);\r\n var boundPrototypes = this.boundPrototypes;\r\n if (!boundPrototypes) this.boundPrototypes = boundPrototypes = new Map();\r\n else if (boundPrototypes.has(classInstance)) return boundPrototypes.get(classInstance)!;\r\n var declaration = this.declaration; assert(declaration.kind == NodeKind.METHODDECLARATION);\r\n var bound = new FunctionPrototype(\r\n this.name,\r\n classInstance, // !\r\n declaration,\r\n this.decoratorFlags\r\n );\r\n bound.flags = this.flags;\r\n bound.operatorKind = this.operatorKind;\r\n // NOTE: this.instances holds instances per bound class / unbound\r\n boundPrototypes.set(classInstance, bound);\r\n return bound;\r\n }\r\n\r\n /** Gets the resolved instance for the specified instance key, if already resolved. */\r\n getResolvedInstance(instanceKey: string): Function | null {\r\n var instances = this.instances;\r\n if (instances && instances.has(instanceKey)) return instances.get(instanceKey);\r\n return null;\r\n }\r\n\r\n /** Sets the resolved instance for the specified instance key. */\r\n setResolvedInstance(instanceKey: string, instance: Function): void {\r\n var instances = this.instances;\r\n if (!instances) this.instances = instances = new Map();\r\n else assert(!instances.has(instanceKey));\r\n instances.set(instanceKey, instance);\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n return this.parent.lookup(name);\r\n }\r\n}\r\n\r\n/** A resolved function. */\r\nexport class Function extends TypedElement {\r\n\r\n /** Function prototype. */\r\n prototype: FunctionPrototype;\r\n /** Function signature. */\r\n signature: Signature;\r\n /** Map of locals by name. */\r\n localsByName: Map = new Map();\r\n /** Array of locals by index. */\r\n localsByIndex: Local[] = [];\r\n /** List of additional non-parameter locals. */\r\n additionalLocals: Type[] = [];\r\n /** Contextual type arguments. */\r\n contextualTypeArguments: Map | null;\r\n /** Default control flow. */\r\n flow: Flow;\r\n /** Remembered debug locations. */\r\n debugLocations: Range[] = [];\r\n /** Function reference, if compiled. */\r\n ref: FunctionRef = 0;\r\n /** Function table index, if any. */\r\n functionTableIndex: i32 = -1;\r\n /** Trampoline function for calling with omitted arguments. */\r\n trampoline: Function | null = null;\r\n\r\n /** Counting id of inline operations involving this function. */\r\n nextInlineId: i32 = 0;\r\n\r\n /** Constructs a new concrete function. */\r\n constructor(\r\n /** Name incl. type parameters, i.e. `foo`. */\r\n nameInclTypeParameters: string,\r\n /** Respective function prototype. */\r\n prototype: FunctionPrototype,\r\n /** Concrete signature. */\r\n signature: Signature, // pre-resolved\r\n /** Contextual type arguments inherited from its parent class, if any. */\r\n contextualTypeArguments: Map | null = null\r\n ) {\r\n super(\r\n ElementKind.FUNCTION,\r\n nameInclTypeParameters,\r\n mangleInternalName(nameInclTypeParameters, prototype.parent, prototype.is(CommonFlags.INSTANCE)),\r\n prototype.program,\r\n prototype.parent,\r\n prototype.declaration\r\n );\r\n this.prototype = prototype;\r\n this.signature = signature;\r\n this.flags = prototype.flags | CommonFlags.RESOLVED;\r\n this.decoratorFlags = prototype.decoratorFlags;\r\n this.contextualTypeArguments = contextualTypeArguments;\r\n this.type = Type.u32.asFunction(signature);\r\n if (!prototype.is(CommonFlags.AMBIENT)) {\r\n let localIndex = 0;\r\n if (this.is(CommonFlags.INSTANCE)) {\r\n let local = new Local(\r\n CommonSymbols.this_,\r\n localIndex++,\r\n assert(signature.thisType),\r\n this\r\n );\r\n this.localsByName.set(CommonSymbols.this_, local);\r\n this.localsByIndex[local.index] = local;\r\n }\r\n let parameterTypes = signature.parameterTypes;\r\n for (let i = 0, k = parameterTypes.length; i < k; ++i) {\r\n let parameterType = parameterTypes[i];\r\n let parameterName = signature.getParameterName(i);\r\n let local = new Local(\r\n parameterName,\r\n localIndex++,\r\n parameterType,\r\n this\r\n );\r\n this.localsByName.set(parameterName, local);\r\n this.localsByIndex[local.index] = local;\r\n }\r\n }\r\n this.flow = Flow.create(this);\r\n registerConcreteElement(this.program, this);\r\n }\r\n\r\n /** Adds a local of the specified type, with an optional name. */\r\n addLocal(type: Type, name: string | null = null, declaration: VariableDeclaration | null = null): Local {\r\n // if it has a name, check previously as this method will throw otherwise\r\n var localIndex = this.signature.parameterTypes.length + this.additionalLocals.length;\r\n if (this.is(CommonFlags.INSTANCE)) ++localIndex;\r\n var localName = name !== null\r\n ? name\r\n : \"var$\" + localIndex.toString();\r\n var local = new Local(\r\n localName,\r\n localIndex,\r\n type,\r\n this,\r\n declaration || this.program.makeNativeVariableDeclaration(localName)\r\n );\r\n if (name) {\r\n if (this.localsByName.has(name)) throw new Error(\"duplicate local name\");\r\n this.localsByName.set(name, local);\r\n }\r\n this.localsByIndex[local.index] = local;\r\n this.additionalLocals.push(type);\r\n return local;\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n var locals = this.localsByName;\r\n if (locals.has(name)) return locals.get(name);\r\n return this.parent.lookup(name);\r\n }\r\n\r\n // used by flows to keep track of temporary locals\r\n tempI32s: Local[] | null = null;\r\n tempI64s: Local[] | null = null;\r\n tempF32s: Local[] | null = null;\r\n tempF64s: Local[] | null = null;\r\n\r\n // used by flows to keep track of break labels\r\n nextBreakId: i32 = 0;\r\n breakStack: i32[] | null = null;\r\n breakLabel: string | null = null;\r\n\r\n /** Finalizes the function once compiled, releasing no longer needed resources. */\r\n finalize(module: Module, ref: FunctionRef): void {\r\n this.ref = ref;\r\n assert(!this.breakStack || !this.breakStack.length); // internal error\r\n this.breakStack = null;\r\n this.breakLabel = null;\r\n this.tempI32s = this.tempI64s = this.tempF32s = this.tempF64s = null;\r\n if (this.program.options.sourceMap) {\r\n let debugLocations = this.debugLocations;\r\n for (let i = 0, k = debugLocations.length; i < k; ++i) {\r\n let debugLocation = debugLocations[i];\r\n module.setDebugLocation(\r\n ref,\r\n debugLocation.debugInfoRef,\r\n debugLocation.source.debugInfoIndex,\r\n debugLocation.line,\r\n debugLocation.column\r\n );\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** A resolved function target, that is a function called indirectly by an index and signature. */\r\nexport class FunctionTarget extends Element {\r\n\r\n /** Underlying signature. */\r\n signature: Signature;\r\n /** Function type. */\r\n type: Type;\r\n\r\n /** Constructs a new function target. */\r\n constructor(\r\n /** Concrete signature. */\r\n signature: Signature,\r\n /** Program reference. */\r\n program: Program,\r\n __s: string = \"\" // FIXME: current TS limitation workaround, but a fix seems underway\r\n ) {\r\n super(\r\n ElementKind.FUNCTION_TARGET,\r\n __s = \"sig:\" + signature.toSignatureString(),\r\n __s,\r\n program,\r\n program.nativeFile\r\n );\r\n this.signature = signature;\r\n this.flags = CommonFlags.RESOLVED;\r\n this.type = Type.u32.asFunction(signature);\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n return null;\r\n }\r\n}\r\n\r\n/** A yet unresolved instance field prototype. */\r\nexport class FieldPrototype extends DeclaredElement {\r\n\r\n /** Constructs a new field prototype. */\r\n constructor(\r\n /** Simple name. */\r\n name: string,\r\n /** Parent class. */\r\n parent: ClassPrototype,\r\n /** Declaration reference. */\r\n declaration: FieldDeclaration,\r\n /** Pre-checked flags indicating built-in decorators. */\r\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\r\n ) {\r\n super(\r\n ElementKind.FIELD_PROTOTYPE,\r\n name,\r\n mangleInternalName(name, parent, assert(declaration.is(CommonFlags.INSTANCE))),\r\n parent.program,\r\n parent,\r\n declaration\r\n );\r\n this.decoratorFlags = decoratorFlags;\r\n }\r\n\r\n /** Gets the associated type node. */\r\n get typeNode(): CommonTypeNode | null {\r\n return (this.declaration).type;\r\n }\r\n\r\n /** Gets the associated initializer node. */\r\n get initializerNode(): Expression | null {\r\n return (this.declaration).initializer;\r\n }\r\n\r\n /** Gets the associated parameter index. Set if declared as a constructor parameter, otherwise `-1`. */\r\n get parameterIndex(): i32 {\r\n return (this.declaration).parameterIndex;\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n return this.parent.lookup(name);\r\n }\r\n}\r\n\r\n/** A resolved instance field. */\r\nexport class Field extends VariableLikeElement {\r\n\r\n /** Field prototype reference. */\r\n prototype: FieldPrototype;\r\n /** Field memory offset, if an instance field. */\r\n memoryOffset: i32 = -1;\r\n\r\n /** Constructs a new field. */\r\n constructor(\r\n /** Respective field prototype. */\r\n prototype: FieldPrototype,\r\n /** Parent class. */\r\n parent: Class,\r\n /** Concrete type. */\r\n type: Type\r\n ) {\r\n super(\r\n ElementKind.FIELD,\r\n prototype.name,\r\n parent,\r\n prototype.declaration\r\n );\r\n this.prototype = prototype;\r\n this.flags = prototype.flags;\r\n assert(type != Type.void);\r\n this.setType(type);\r\n registerConcreteElement(this.program, this);\r\n }\r\n}\r\n\r\n/** A property comprised of a getter and a setter function. */\r\nexport class PropertyPrototype extends DeclaredElement {\r\n\r\n /** Getter prototype. */\r\n getterPrototype: FunctionPrototype | null = null;\r\n /** Setter prototype. */\r\n setterPrototype: FunctionPrototype | null = null;\r\n\r\n /** Constructs a new property prototype. */\r\n constructor(\r\n /** Simple name. */\r\n name: string,\r\n /** Parent class. */\r\n parent: ClassPrototype,\r\n /** Declaration of the getter or setter introducing the property. */\r\n firstDeclaration: FunctionDeclaration\r\n ) {\r\n super(\r\n ElementKind.PROPERTY_PROTOTYPE,\r\n name,\r\n mangleInternalName(name, parent, firstDeclaration.is(CommonFlags.INSTANCE)),\r\n parent.program,\r\n parent,\r\n firstDeclaration\r\n );\r\n this.flags &= ~(CommonFlags.GET | CommonFlags.SET);\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n return this.parent.lookup(name);\r\n }\r\n}\r\n\r\n/** A resolved property. */\r\nexport class Property extends VariableLikeElement {\r\n\r\n /** Prototype reference. */\r\n prototype: PropertyPrototype;\r\n /** Getter instance. */\r\n getterInstance: Function | null = null;\r\n /** Setter instance. */\r\n setterInstance: Function | null = null;\r\n\r\n /** Constructs a new property prototype. */\r\n constructor(\r\n /** Respective property prototype. */\r\n prototype: PropertyPrototype,\r\n /** Parent element, usually a static class prototype or class instance. */\r\n parent: Element\r\n ) {\r\n super(\r\n ElementKind.PROPERTY,\r\n prototype.name,\r\n parent,\r\n prototype.program.makeNativeVariableDeclaration(\r\n prototype.name,\r\n prototype.is(CommonFlags.INSTANCE)\r\n ? CommonFlags.INSTANCE\r\n : CommonFlags.NONE\r\n )\r\n );\r\n this.prototype = prototype;\r\n registerConcreteElement(this.program, this);\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n return this.parent.lookup(name);\r\n }\r\n}\r\n\r\n/** A yet unresolved class prototype. */\r\nexport class ClassPrototype extends DeclaredElement {\r\n\r\n /** Instance member prototypes. */\r\n instanceMembers: Map | null = null;\r\n /** Base class prototype, if applicable. */\r\n basePrototype: ClassPrototype | null = null; // set in Program#initialize\r\n /** Constructor prototype. */\r\n constructorPrototype: FunctionPrototype | null = null;\r\n /** Operator overload prototypes. */\r\n overloadPrototypes: Map = new Map();\r\n /** Already resolved instances. */\r\n instances: Map | null = null;\r\n\r\n constructor(\r\n /** Simple name. */\r\n name: string,\r\n /** Parent element, usually a file or namespace. */\r\n parent: Element,\r\n /** Declaration reference. */\r\n declaration: ClassDeclaration,\r\n /** Pre-checked flags indicating built-in decorators. */\r\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE,\r\n _isInterface: bool = false // FIXME\r\n ) {\r\n super(\r\n _isInterface ? ElementKind.INTERFACE_PROTOTYPE : ElementKind.CLASS_PROTOTYPE,\r\n name,\r\n mangleInternalName(name, parent, declaration.is(CommonFlags.INSTANCE)),\r\n parent.program,\r\n parent,\r\n declaration\r\n );\r\n this.decoratorFlags = decoratorFlags;\r\n }\r\n\r\n /** Gets the associated type parameter nodes. */\r\n get typeParameterNodes(): TypeParameterNode[] | null {\r\n return (this.declaration).typeParameters;\r\n }\r\n /** Gets the associated extends node. */\r\n get extendsNode(): TypeNode | null {\r\n return (this.declaration).extendsType;\r\n }\r\n /** Gets the associated implements nodes. */\r\n get implementsNodes(): TypeNode[] | null {\r\n return (this.declaration).implementsTypes;\r\n }\r\n\r\n /** Tests if this prototype extends the specified. */\r\n extends(basePtototype: ClassPrototype | null): bool {\r\n var current: ClassPrototype | null = this;\r\n do {\r\n if (current === basePtototype) return true;\r\n } while (current = current.basePrototype);\r\n return false;\r\n }\r\n\r\n /** Adds an element as an instance member of this one. Returns the previous element if a duplicate. */\r\n addInstance(name: string, element: DeclaredElement): bool {\r\n var originalDeclaration = element.declaration;\r\n var instanceMembers = this.instanceMembers;\r\n if (!instanceMembers) this.instanceMembers = instanceMembers = new Map();\r\n else if (instanceMembers.has(name)) {\r\n let merged = tryMerge(instanceMembers.get(name)!, element);\r\n if (!merged) {\r\n this.program.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n element.identifierNode.range, element.identifierNode.text\r\n );\r\n return false;\r\n }\r\n element = merged;\r\n }\r\n instanceMembers.set(name, element);\r\n if (element.is(CommonFlags.EXPORT) && this.is(CommonFlags.MODULE_EXPORT)) {\r\n element.set(CommonFlags.MODULE_EXPORT); // propagate\r\n }\r\n this.program.elementsByDeclaration.set(originalDeclaration, element);\r\n return true;\r\n }\r\n\r\n /** Gets the resolved instance for the specified instance key, if already resolved. */\r\n getResolvedInstance(instanceKey: string): Class | null {\r\n var instances = this.instances;\r\n if (instances && instances.has(instanceKey)) return instances.get(instanceKey);\r\n return null;\r\n }\r\n\r\n /** Sets the resolved instance for the specified instance key. */\r\n setResolvedInstance(instanceKey: string, instance: Class): void {\r\n var instances = this.instances;\r\n if (!instances) this.instances = instances = new Map();\r\n else assert(!instances.has(instanceKey));\r\n instances.set(instanceKey, instance);\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n return this.parent.lookup(name);\r\n }\r\n}\r\n\r\n/** A resolved class. */\r\nexport class Class extends TypedElement {\r\n\r\n /** Class prototype. */\r\n prototype: ClassPrototype;\r\n /** Resolved type arguments. */\r\n typeArguments: Type[] | null;\r\n /** Base class, if applicable. */\r\n base: Class | null;\r\n /** Contextual type arguments for fields and methods. */\r\n contextualTypeArguments: Map | null = null;\r\n /** Current member memory offset. */\r\n currentMemoryOffset: u32 = 0;\r\n /** Constructor instance. */\r\n constructorInstance: Function | null = null;\r\n /** Operator overloads. */\r\n overloads: Map | null = null;\r\n /** Function index of the GC hook. */\r\n gcHookIndex: u32 = -1;\r\n\r\n /** Constructs a new class. */\r\n constructor(\r\n /** Name incl. type parameters, i.e. `Foo`. */\r\n nameInclTypeParameters: string,\r\n /** The respective class prototype. */\r\n prototype: ClassPrototype,\r\n /** Concrete type arguments, if any. */\r\n typeArguments: Type[] | null = null,\r\n /** Base class, if derived. */\r\n base: Class | null = null,\r\n _isInterface: bool = false // FIXME\r\n ) {\r\n super(\r\n _isInterface ? ElementKind.INTERFACE : ElementKind.CLASS,\r\n nameInclTypeParameters,\r\n mangleInternalName(nameInclTypeParameters, prototype.parent, prototype.is(CommonFlags.INSTANCE)),\r\n prototype.program,\r\n prototype.parent,\r\n prototype.declaration\r\n );\r\n this.prototype = prototype;\r\n this.flags = prototype.flags;\r\n this.decoratorFlags = prototype.decoratorFlags;\r\n this.typeArguments = typeArguments;\r\n this.setType(this.program.options.usizeType.asClass(this));\r\n this.base = base;\r\n\r\n // inherit static members and contextual type arguments from base class\r\n if (base) {\r\n let inheritedTypeArguments = base.contextualTypeArguments;\r\n if (inheritedTypeArguments) {\r\n let contextualTypeArguments = this.contextualTypeArguments;\r\n for (let [baseName, baseType] of inheritedTypeArguments) {\r\n if (!contextualTypeArguments) this.contextualTypeArguments = contextualTypeArguments = new Map();\r\n contextualTypeArguments.set(baseName, baseType);\r\n }\r\n }\r\n }\r\n\r\n // apply pre-checked instance-specific contextual type arguments\r\n var typeParameters = prototype.typeParameterNodes;\r\n if (typeArguments) {\r\n let numTypeArguments = typeArguments.length;\r\n if (!typeParameters || numTypeArguments != typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n if (numTypeArguments) {\r\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\r\n for (let i = 0; i < numTypeArguments; ++i) {\r\n this.contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\r\n }\r\n }\r\n } else if (typeParameters && typeParameters.length) {\r\n throw new Error(\"type argument count mismatch\");\r\n }\r\n registerConcreteElement(this.program, this);\r\n }\r\n\r\n /** Tests if a value of this class type is assignable to a target of the specified class type. */\r\n isAssignableTo(target: Class): bool {\r\n var current: Class | null = this;\r\n do if (current == target) return true;\r\n while (current = current.base);\r\n return false;\r\n }\r\n\r\n /** Looks up the operator overload of the specified kind. */\r\n lookupOverload(kind: OperatorKind, unchecked: bool = false): Function | null {\r\n if (unchecked) {\r\n switch (kind) {\r\n case OperatorKind.INDEXED_GET: {\r\n let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_GET);\r\n if (uncheckedOverload) return uncheckedOverload;\r\n break;\r\n }\r\n case OperatorKind.INDEXED_SET: {\r\n let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_SET);\r\n if (uncheckedOverload) return uncheckedOverload;\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n var instance: Class | null = this;\r\n do {\r\n let overloads = instance.overloads;\r\n if (overloads) {\r\n let overload = overloads.get(kind);\r\n if (overload) return overload;\r\n }\r\n } while (instance = instance.base);\r\n return null;\r\n }\r\n\r\n /* @override */\r\n lookup(name: string): Element | null {\r\n return this.parent.lookup(name);\r\n }\r\n\r\n /** Calculates the memory offset of the specified field. */\r\n offsetof(fieldName: string): u32 {\r\n var members = assert(this.members);\r\n assert(members.has(fieldName));\r\n var field = members.get(fieldName);\r\n assert(field.kind == ElementKind.FIELD);\r\n return (field).memoryOffset;\r\n }\r\n}\r\n\r\n/** A yet unresolved interface. */\r\nexport class InterfacePrototype extends ClassPrototype { // FIXME\r\n\r\n /** Constructs a new interface prototype. */\r\n constructor(\r\n name: string,\r\n parent: Element,\r\n declaration: InterfaceDeclaration,\r\n decoratorFlags: DecoratorFlags\r\n ) {\r\n super(\r\n name,\r\n parent,\r\n declaration,\r\n decoratorFlags,\r\n true\r\n );\r\n }\r\n}\r\n\r\n/** A resolved interface. */\r\nexport class Interface extends Class { // FIXME\r\n\r\n /** Constructs a new interface. */\r\n constructor(\r\n nameInclTypeParameters: string,\r\n prototype: InterfacePrototype,\r\n typeArguments: Type[] = [],\r\n base: Interface | null = null\r\n ) {\r\n super(\r\n nameInclTypeParameters,\r\n prototype,\r\n typeArguments,\r\n base,\r\n true\r\n );\r\n }\r\n}\r\n\r\n/** Registers a concrete element with a program. */\r\nfunction registerConcreteElement(program: Program, element: Element): void {\r\n assert(!program.instancesByName.has(element.internalName));\r\n program.instancesByName.set(element.internalName, element);\r\n}\r\n\r\n/** Attempts to merge two elements. Returns the merged element on success. */\r\nfunction tryMerge(older: Element, newer: Element): DeclaredElement | null {\r\n // NOTE: some of the following cases are not supported by TS, not sure why exactly.\r\n // suggesting to just merge what seems to be possible for now and revisit later.\r\n assert(older.program === newer.program);\r\n assert(!newer.members);\r\n var merged: DeclaredElement | null = null;\r\n switch (older.kind) {\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n switch (newer.kind) {\r\n case ElementKind.NAMESPACE: {\r\n copyMembers(newer, older);\r\n merged = older;\r\n break;\r\n }\r\n case ElementKind.TYPEDEFINITION: {\r\n if (!older.shadowType) {\r\n older.shadowType = newer;\r\n copyMembers(newer, older);\r\n merged = older;\r\n }\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE:\r\n case ElementKind.ENUM: {\r\n if (newer.kind == ElementKind.NAMESPACE) {\r\n copyMembers(newer, older);\r\n merged = older;\r\n break;\r\n }\r\n break;\r\n }\r\n case ElementKind.NAMESPACE: {\r\n switch (newer.kind) {\r\n case ElementKind.ENUM:\r\n case ElementKind.CLASS_PROTOTYPE: // TS2434\r\n case ElementKind.FUNCTION_PROTOTYPE: { // TS2434\r\n copyMembers(older, newer);\r\n merged = newer;\r\n break;\r\n }\r\n case ElementKind.NAMESPACE: {\r\n copyMembers(newer, older);\r\n merged = older;\r\n break;\r\n }\r\n case ElementKind.TYPEDEFINITION: {\r\n if (!older.shadowType) {\r\n older.shadowType = newer;\r\n copyMembers(newer, older);\r\n merged = older;\r\n }\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n case ElementKind.GLOBAL: {\r\n if (newer.kind == ElementKind.TYPEDEFINITION) {\r\n if (!older.shadowType) {\r\n older.shadowType = newer;\r\n copyMembers(newer, older);\r\n merged = older;\r\n }\r\n }\r\n break;\r\n }\r\n case ElementKind.TYPEDEFINITION: {\r\n switch (newer.kind) {\r\n case ElementKind.GLOBAL:\r\n case ElementKind.FUNCTION_PROTOTYPE:\r\n case ElementKind.NAMESPACE: {\r\n if (!newer.shadowType) {\r\n newer.shadowType = older;\r\n copyMembers(older, newer);\r\n merged = newer;\r\n }\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n if (merged) {\r\n if (older.is(CommonFlags.EXPORT) != newer.is(CommonFlags.EXPORT)) {\r\n older.program.error(\r\n DiagnosticCode.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local,\r\n merged.identifierNode.range, merged.identifierNode.text\r\n );\r\n }\r\n }\r\n return merged;\r\n}\r\n\r\n/** Copies the members of `src` to `dest`. */\r\nfunction copyMembers(src: Element, dest: Element): void {\r\n var srcMembers = src.members;\r\n if (srcMembers) {\r\n let destMembers = dest.members;\r\n if (!destMembers) dest.members = destMembers = new Map();\r\n for (let [memberName, member] of srcMembers) {\r\n destMembers.set(memberName, member);\r\n }\r\n }\r\n}\r\n\r\n/** Mangles the internal name of an element with the specified name that is a child of the given parent. */\r\nexport function mangleInternalName(name: string, parent: Element, isInstance: bool, asGlobal: bool = false): string {\r\n switch (parent.kind) {\r\n case ElementKind.FILE: {\r\n if (asGlobal) return name;\r\n return parent.internalName + PATH_DELIMITER + name;\r\n }\r\n case ElementKind.FUNCTION: {\r\n if (asGlobal) return name;\r\n assert(!isInstance);\r\n return parent.internalName + INNER_DELIMITER + name;\r\n }\r\n default: {\r\n return mangleInternalName(parent.name, parent.parent, parent.is(CommonFlags.INSTANCE), asGlobal)\r\n + (isInstance ? INSTANCE_DELIMITER : STATIC_DELIMITER) + name;\r\n }\r\n }\r\n}\r\n","/**\r\n * A thin wrapper around Binaryen's C-API.\r\n * @module module\r\n *//***/\r\n\r\nimport {\r\n Target\r\n} from \"./compiler\";\r\n\r\nexport type ModuleRef = usize;\r\nexport type FunctionTypeRef = usize;\r\nexport type FunctionRef = usize;\r\nexport type ExpressionRef = usize;\r\nexport type GlobalRef = usize;\r\nexport type ImportRef = usize;\r\nexport type ExportRef = usize;\r\nexport type RelooperRef = usize;\r\nexport type RelooperBlockRef = usize;\r\nexport type Index = u32;\r\n\r\nexport enum NativeType {\r\n None = _BinaryenTypeNone(),\r\n I32 = _BinaryenTypeInt32(),\r\n I64 = _BinaryenTypeInt64(),\r\n F32 = _BinaryenTypeFloat32(),\r\n F64 = _BinaryenTypeFloat64(),\r\n V128 = _BinaryenTypeVec128(),\r\n Unreachable = _BinaryenTypeUnreachable(),\r\n Auto = _BinaryenTypeAuto()\r\n}\r\n\r\nexport enum ExpressionId {\r\n Invalid = _BinaryenInvalidId(),\r\n Block = _BinaryenBlockId(),\r\n If = _BinaryenIfId(),\r\n Loop = _BinaryenLoopId(),\r\n Break = _BinaryenBreakId(),\r\n Switch = _BinaryenSwitchId(),\r\n Call = _BinaryenCallId(),\r\n CallIndirect = _BinaryenCallIndirectId(),\r\n GetLocal = _BinaryenGetLocalId(),\r\n SetLocal = _BinaryenSetLocalId(),\r\n GetGlobal = _BinaryenGetGlobalId(),\r\n SetGlobal = _BinaryenSetGlobalId(),\r\n Load = _BinaryenLoadId(),\r\n Store = _BinaryenStoreId(),\r\n Const = _BinaryenConstId(),\r\n Unary = _BinaryenUnaryId(),\r\n Binary = _BinaryenBinaryId(),\r\n Select = _BinaryenSelectId(),\r\n Drop = _BinaryenDropId(),\r\n Return = _BinaryenReturnId(),\r\n Host = _BinaryenHostId(),\r\n Nop = _BinaryenNopId(),\r\n Unreachable = _BinaryenUnreachableId(),\r\n AtomicCmpxchg = _BinaryenAtomicCmpxchgId(),\r\n AtomicRMW = _BinaryenAtomicRMWId(),\r\n AtomicWait = _BinaryenAtomicWaitId(),\r\n AtomicWake = _BinaryenAtomicWakeId(),\r\n SIMDExtract = _BinaryenSIMDExtractId(),\r\n SIMDReplace = _BinaryenSIMDReplaceId(),\r\n SIMDShuffle = _BinaryenSIMDShuffleId(),\r\n SIMDBitselect = _BinaryenSIMDBitselectId(),\r\n SIMDShift = _BinaryenSIMDShiftId(),\r\n MemoryInit = _BinaryenMemoryInitId(),\r\n DataDrop = _BinaryenDataDropId(),\r\n MemoryCopy = _BinaryenMemoryCopyId(),\r\n MemoryFill = _BinaryenMemoryFillId()\r\n}\r\n\r\nexport enum UnaryOp {\r\n ClzI32 = _BinaryenClzInt32(),\r\n CtzI32 = _BinaryenCtzInt32(),\r\n PopcntI32 = _BinaryenPopcntInt32(),\r\n NegF32 = _BinaryenNegFloat32(),\r\n AbsF32 = _BinaryenAbsFloat32(),\r\n CeilF32 = _BinaryenCeilFloat32(),\r\n FloorF32 = _BinaryenFloorFloat32(),\r\n TruncF32 = _BinaryenTruncFloat32(),\r\n NearestF32 = _BinaryenNearestFloat32(),\r\n SqrtF32 = _BinaryenSqrtFloat32(),\r\n EqzI32 = _BinaryenEqZInt32(),\r\n ClzI64 = _BinaryenClzInt64(),\r\n CtzI64 = _BinaryenCtzInt64(),\r\n PopcntI64 = _BinaryenPopcntInt64(),\r\n NegF64 = _BinaryenNegFloat64(),\r\n AbsF64 = _BinaryenAbsFloat64(),\r\n CeilF64 = _BinaryenCeilFloat64(),\r\n FloorF64 = _BinaryenFloorFloat64(),\r\n TruncF64 = _BinaryenTruncFloat64(),\r\n NearestF64 = _BinaryenNearestFloat64(),\r\n SqrtF64 = _BinaryenSqrtFloat64(),\r\n EqzI64 = _BinaryenEqZInt64(),\r\n ExtendI32 = _BinaryenExtendSInt32(),\r\n ExtendU32 = _BinaryenExtendUInt32(),\r\n WrapI64 = _BinaryenWrapInt64(),\r\n TruncF32ToI32 = _BinaryenTruncSFloat32ToInt32(),\r\n TruncF32ToI64 = _BinaryenTruncSFloat32ToInt64(),\r\n TruncF32ToU32 = _BinaryenTruncUFloat32ToInt32(),\r\n TruncF32ToU64 = _BinaryenTruncUFloat32ToInt64(),\r\n TruncF64ToI32 = _BinaryenTruncSFloat64ToInt32(),\r\n TruncF64ToI64 = _BinaryenTruncSFloat64ToInt64(),\r\n TruncF64ToU32 = _BinaryenTruncUFloat64ToInt32(),\r\n TruncF64ToU64 = _BinaryenTruncUFloat64ToInt64(),\r\n ReinterpretF32 = _BinaryenReinterpretFloat32(),\r\n ReinterpretF64 = _BinaryenReinterpretFloat64(),\r\n ConvertI32ToF32 = _BinaryenConvertSInt32ToFloat32(),\r\n ConvertI32ToF64 = _BinaryenConvertSInt32ToFloat64(),\r\n ConvertU32ToF32 = _BinaryenConvertUInt32ToFloat32(),\r\n ConvertU32ToF64 = _BinaryenConvertUInt32ToFloat64(),\r\n ConvertI64ToF32 = _BinaryenConvertSInt64ToFloat32(),\r\n ConvertI64ToF64 = _BinaryenConvertSInt64ToFloat64(),\r\n ConvertU64ToF32 = _BinaryenConvertUInt64ToFloat32(),\r\n ConvertU64ToF64 = _BinaryenConvertUInt64ToFloat64(),\r\n PromoteF32 = _BinaryenPromoteFloat32(),\r\n DemoteF64 = _BinaryenDemoteFloat64(),\r\n ReinterpretI32 = _BinaryenReinterpretInt32(),\r\n ReinterpretI64 = _BinaryenReinterpretInt64(),\r\n\r\n // see: https://github.com/WebAssembly/sign-extension-ops\r\n ExtendI8ToI32 = _BinaryenExtendS8Int32(),\r\n ExtendI16ToI32 = _BinaryenExtendS16Int32(),\r\n ExtendI8ToI64 = _BinaryenExtendS8Int64(),\r\n ExtendI16ToI64 = _BinaryenExtendS16Int64(),\r\n ExtendI32ToI64 = _BinaryenExtendS32Int64()\r\n\r\n // see: https://github.com/WebAssembly/nontrapping-float-to-int-conversions\r\n // TruncF32ToI32Sat\r\n // TruncF32ToU32Sat\r\n // TruncF64ToI32Sat\r\n // TruncF64ToU32Sat\r\n // TruncF32ToI64Sat\r\n // TruncF32ToU64Sat\r\n // TruncF64ToI64Sat\r\n // TruncF64ToU64Sat\r\n}\r\n\r\nexport enum BinaryOp {\r\n AddI32 = _BinaryenAddInt32(),\r\n SubI32 = _BinaryenSubInt32(),\r\n MulI32 = _BinaryenMulInt32(),\r\n DivI32 = _BinaryenDivSInt32(),\r\n DivU32 = _BinaryenDivUInt32(),\r\n RemI32 = _BinaryenRemSInt32(),\r\n RemU32 = _BinaryenRemUInt32(),\r\n AndI32 = _BinaryenAndInt32(),\r\n OrI32 = _BinaryenOrInt32(),\r\n XorI32 = _BinaryenXorInt32(),\r\n ShlI32 = _BinaryenShlInt32(),\r\n ShrU32 = _BinaryenShrUInt32(),\r\n ShrI32 = _BinaryenShrSInt32(),\r\n RotlI32 = _BinaryenRotLInt32(),\r\n RotrI32 = _BinaryenRotRInt32(),\r\n EqI32 = _BinaryenEqInt32(),\r\n NeI32 = _BinaryenNeInt32(),\r\n LtI32 = _BinaryenLtSInt32(),\r\n LtU32 = _BinaryenLtUInt32(),\r\n LeI32 = _BinaryenLeSInt32(),\r\n LeU32 = _BinaryenLeUInt32(),\r\n GtI32 = _BinaryenGtSInt32(),\r\n GtU32 = _BinaryenGtUInt32(),\r\n GeI32 = _BinaryenGeSInt32(),\r\n GeU32 = _BinaryenGeUInt32(),\r\n AddI64 = _BinaryenAddInt64(),\r\n SubI64 = _BinaryenSubInt64(),\r\n MulI64 = _BinaryenMulInt64(),\r\n DivI64 = _BinaryenDivSInt64(),\r\n DivU64 = _BinaryenDivUInt64(),\r\n RemI64 = _BinaryenRemSInt64(),\r\n RemU64 = _BinaryenRemUInt64(),\r\n AndI64 = _BinaryenAndInt64(),\r\n OrI64 = _BinaryenOrInt64(),\r\n XorI64 = _BinaryenXorInt64(),\r\n ShlI64 = _BinaryenShlInt64(),\r\n ShrU64 = _BinaryenShrUInt64(),\r\n ShrI64 = _BinaryenShrSInt64(),\r\n RotlI64 = _BinaryenRotLInt64(),\r\n RotrI64 = _BinaryenRotRInt64(),\r\n EqI64 = _BinaryenEqInt64(),\r\n NeI64 = _BinaryenNeInt64(),\r\n LtI64 = _BinaryenLtSInt64(),\r\n LtU64 = _BinaryenLtUInt64(),\r\n LeI64 = _BinaryenLeSInt64(),\r\n LeU64 = _BinaryenLeUInt64(),\r\n GtI64 = _BinaryenGtSInt64(),\r\n GtU64 = _BinaryenGtUInt64(),\r\n GeI64 = _BinaryenGeSInt64(),\r\n GeU64 = _BinaryenGeUInt64(),\r\n AddF32 = _BinaryenAddFloat32(),\r\n SubF32 = _BinaryenSubFloat32(),\r\n MulF32 = _BinaryenMulFloat32(),\r\n DivF32 = _BinaryenDivFloat32(),\r\n CopysignF32 = _BinaryenCopySignFloat32(),\r\n MinF32 = _BinaryenMinFloat32(),\r\n MaxF32 = _BinaryenMaxFloat32(),\r\n EqF32 = _BinaryenEqFloat32(),\r\n NeF32 = _BinaryenNeFloat32(),\r\n LtF32 = _BinaryenLtFloat32(),\r\n LeF32 = _BinaryenLeFloat32(),\r\n GtF32 = _BinaryenGtFloat32(),\r\n GeF32 = _BinaryenGeFloat32(),\r\n AddF64 = _BinaryenAddFloat64(),\r\n SubF64 = _BinaryenSubFloat64(),\r\n MulF64 = _BinaryenMulFloat64(),\r\n DivF64 = _BinaryenDivFloat64(),\r\n CopysignF64 = _BinaryenCopySignFloat64(),\r\n MinF64 = _BinaryenMinFloat64(),\r\n MaxF64 = _BinaryenMaxFloat64(),\r\n EqF64 = _BinaryenEqFloat64(),\r\n NeF64 = _BinaryenNeFloat64(),\r\n LtF64 = _BinaryenLtFloat64(),\r\n LeF64 = _BinaryenLeFloat64(),\r\n GtF64 = _BinaryenGtFloat64(),\r\n GeF64 = _BinaryenGeFloat64()\r\n}\r\n\r\nexport enum HostOp {\r\n CurrentMemory = _BinaryenCurrentMemory(),\r\n GrowMemory = _BinaryenGrowMemory(),\r\n\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n // MoveMemory\r\n // SetMemory\r\n}\r\n\r\nexport enum AtomicRMWOp {\r\n Add = _BinaryenAtomicRMWAdd(),\r\n Sub = _BinaryenAtomicRMWSub(),\r\n And = _BinaryenAtomicRMWAnd(),\r\n Or = _BinaryenAtomicRMWOr(),\r\n Xor = _BinaryenAtomicRMWXor(),\r\n Xchg = _BinaryenAtomicRMWXchg()\r\n}\r\n\r\nexport enum SIMDOp {\r\n SplatVecI8x16 = _BinaryenSplatVecI8x16(),\r\n SplatVecI16x8 = _BinaryenSplatVecI16x8(),\r\n SplatVecI32x4 = _BinaryenSplatVecI32x4(),\r\n SplatVecI64x2 = _BinaryenSplatVecI64x2(),\r\n SplatVecF32x4 = _BinaryenSplatVecF32x4(),\r\n SplatVecF64x2 = _BinaryenSplatVecF64x2(),\r\n NotVec128 = _BinaryenNotVec128(),\r\n NegVecI8x16 = _BinaryenNegVecI8x16(),\r\n AnyTrueVecI8x16 = _BinaryenAnyTrueVecI8x16(),\r\n AllTrueVecI8x16 = _BinaryenAllTrueVecI8x16(),\r\n NegVecI16x8 = _BinaryenNegVecI16x8(),\r\n AnyTrueVecI16x8 = _BinaryenAnyTrueVecI16x8(),\r\n AllTrueVecI16x8 = _BinaryenAllTrueVecI16x8(),\r\n NegVecI32x4 = _BinaryenNegVecI32x4(),\r\n AnyTrueVecI32x4 = _BinaryenAnyTrueVecI32x4(),\r\n AllTrueVecI32x4 = _BinaryenAllTrueVecI32x4(),\r\n NegVecI64x2 = _BinaryenNegVecI64x2(),\r\n AnyTrueVecI64x2 = _BinaryenAnyTrueVecI64x2(),\r\n AllTrueVecI64x2 = _BinaryenAllTrueVecI64x2(),\r\n AbsVecF32x4 = _BinaryenAbsVecF32x4(),\r\n NegVecF32x4 = _BinaryenNegVecF32x4(),\r\n SqrtVecF32x4 = _BinaryenSqrtVecF32x4(),\r\n AbsVecF64x2 = _BinaryenAbsVecF64x2(),\r\n NegVecF64x2 = _BinaryenNegVecF64x2(),\r\n SqrtVecF64x2 = _BinaryenSqrtVecF64x2(),\r\n TruncSatSVecF32x4ToVecI32x4 = _BinaryenTruncSatSVecF32x4ToVecI32x4(),\r\n TruncSatUVecF32x4ToVecI32x4 = _BinaryenTruncSatUVecF32x4ToVecI32x4(),\r\n TruncSatSVecF64x2ToVecI64x2 = _BinaryenTruncSatSVecF64x2ToVecI64x2(),\r\n TruncSatUVecF64x2ToVecI64x2 = _BinaryenTruncSatUVecF64x2ToVecI64x2(),\r\n ConvertSVecI32x4ToVecF32x4 = _BinaryenConvertSVecI32x4ToVecF32x4(),\r\n ConvertUVecI32x4ToVecF32x4 = _BinaryenConvertUVecI32x4ToVecF32x4(),\r\n ConvertSVecI64x2ToVecF64x2 = _BinaryenConvertSVecI64x2ToVecF64x2(),\r\n ConvertUVecI64x2ToVecF64x2 = _BinaryenConvertUVecI64x2ToVecF64x2(),\r\n EqVecI8x16 = _BinaryenEqVecI8x16(),\r\n NeVecI8x16 = _BinaryenNeVecI8x16(),\r\n LtSVecI8x16 = _BinaryenLtSVecI8x16(),\r\n LtUVecI8x16 = _BinaryenLtUVecI8x16(),\r\n LeSVecI8x16 = _BinaryenLeSVecI8x16(),\r\n LeUVecI8x16 = _BinaryenLeUVecI8x16(),\r\n GtSVecI8x16 = _BinaryenGtSVecI8x16(),\r\n GtUVecI8x16 = _BinaryenGtUVecI8x16(),\r\n GeSVecI8x16 = _BinaryenGeSVecI8x16(),\r\n GeUVecI8x16 = _BinaryenGeUVecI8x16(),\r\n EqVecI16x8 = _BinaryenEqVecI16x8(),\r\n NeVecI16x8 = _BinaryenNeVecI16x8(),\r\n LtSVecI16x8 = _BinaryenLtSVecI16x8(),\r\n LtUVecI16x8 = _BinaryenLtUVecI16x8(),\r\n LeSVecI16x8 = _BinaryenLeSVecI16x8(),\r\n LeUVecI16x8 = _BinaryenLeUVecI16x8(),\r\n GtSVecI16x8 = _BinaryenGtSVecI16x8(),\r\n GtUVecI16x8 = _BinaryenGtUVecI16x8(),\r\n GeSVecI16x8 = _BinaryenGeSVecI16x8(),\r\n GeUVecI16x8 = _BinaryenGeUVecI16x8(),\r\n EqVecI32x4 = _BinaryenEqVecI32x4(),\r\n NeVecI32x4 = _BinaryenNeVecI32x4(),\r\n LtSVecI32x4 = _BinaryenLtSVecI32x4(),\r\n LtUVecI32x4 = _BinaryenLtUVecI32x4(),\r\n LeSVecI32x4 = _BinaryenLeSVecI32x4(),\r\n LeUVecI32x4 = _BinaryenLeUVecI32x4(),\r\n GtSVecI32x4 = _BinaryenGtSVecI32x4(),\r\n GtUVecI32x4 = _BinaryenGtUVecI32x4(),\r\n GeSVecI32x4 = _BinaryenGeSVecI32x4(),\r\n GeUVecI32x4 = _BinaryenGeUVecI32x4(),\r\n EqVecF32x4 = _BinaryenEqVecF32x4(),\r\n NeVecF32x4 = _BinaryenNeVecF32x4(),\r\n LtVecF32x4 = _BinaryenLtVecF32x4(),\r\n LeVecF32x4 = _BinaryenLeVecF32x4(),\r\n GtVecF32x4 = _BinaryenGtVecF32x4(),\r\n GeVecF32x4 = _BinaryenGeVecF32x4(),\r\n EqVecF64x2 = _BinaryenEqVecF64x2(),\r\n NeVecF64x2 = _BinaryenNeVecF64x2(),\r\n LtVecF64x2 = _BinaryenLtVecF64x2(),\r\n LeVecF64x2 = _BinaryenLeVecF64x2(),\r\n GtVecF64x2 = _BinaryenGtVecF64x2(),\r\n GeVecF64x2 = _BinaryenGeVecF64x2(),\r\n AndVec128 = _BinaryenAndVec128(),\r\n OrVec128 = _BinaryenOrVec128(),\r\n XorVec128 = _BinaryenXorVec128(),\r\n AddVecI8x16 = _BinaryenAddVecI8x16(),\r\n AddSatSVecI8x16 = _BinaryenAddSatSVecI8x16(),\r\n AddSatUVecI8x16 = _BinaryenAddSatUVecI8x16(),\r\n SubVecI8x16 = _BinaryenSubVecI8x16(),\r\n SubSatSVecI8x16 = _BinaryenSubSatSVecI8x16(),\r\n SubSatUVecI8x16 = _BinaryenSubSatUVecI8x16(),\r\n MulVecI8x16 = _BinaryenMulVecI8x16(),\r\n AddVecI16x8 = _BinaryenAddVecI16x8(),\r\n AddSatSVecI16x8 = _BinaryenAddSatSVecI16x8(),\r\n AddSatUVecI16x8 = _BinaryenAddSatUVecI16x8(),\r\n SubVecI16x8 = _BinaryenSubVecI16x8(),\r\n SubSatSVecI16x8 = _BinaryenSubSatSVecI16x8(),\r\n SubSatUVecI16x8 = _BinaryenSubSatUVecI16x8(),\r\n MulVecI16x8 = _BinaryenMulVecI16x8(),\r\n AddVecI32x4 = _BinaryenAddVecI32x4(),\r\n SubVecI32x4 = _BinaryenSubVecI32x4(),\r\n MulVecI32x4 = _BinaryenMulVecI32x4(),\r\n AddVecI64x2 = _BinaryenAddVecI64x2(),\r\n SubVecI64x2 = _BinaryenSubVecI64x2(),\r\n AddVecF32x4 = _BinaryenAddVecF32x4(),\r\n SubVecF32x4 = _BinaryenSubVecF32x4(),\r\n MulVecF32x4 = _BinaryenMulVecF32x4(),\r\n DivVecF32x4 = _BinaryenDivVecF32x4(),\r\n MinVecF32x4 = _BinaryenMinVecF32x4(),\r\n MaxVecF32x4 = _BinaryenMaxVecF32x4(),\r\n AddVecF64x2 = _BinaryenAddVecF64x2(),\r\n SubVecF64x2 = _BinaryenSubVecF64x2(),\r\n MulVecF64x2 = _BinaryenMulVecF64x2(),\r\n DivVecF64x2 = _BinaryenDivVecF64x2(),\r\n MinVecF64x2 = _BinaryenMinVecF64x2(),\r\n MaxVecF64x2 = _BinaryenMaxVecF64x2()\r\n}\r\n\r\nexport class MemorySegment {\r\n\r\n buffer: Uint8Array;\r\n offset: I64;\r\n\r\n static create(buffer: Uint8Array, offset: I64): MemorySegment {\r\n var segment = new MemorySegment();\r\n segment.buffer = buffer;\r\n segment.offset = offset;\r\n return segment;\r\n }\r\n}\r\n\r\nexport class Module {\r\n\r\n ref: ModuleRef;\r\n\r\n private lit: usize;\r\n\r\n static create(): Module {\r\n var module = new Module();\r\n module.ref = _BinaryenModuleCreate();\r\n module.lit = memory.allocate(_BinaryenSizeofLiteral());\r\n return module;\r\n }\r\n\r\n static createFrom(buffer: Uint8Array): Module {\r\n var cArr = allocU8Array(buffer);\r\n try {\r\n let module = new Module();\r\n module.ref = _BinaryenModuleRead(cArr, buffer.length);\r\n module.lit = memory.allocate(_BinaryenSizeofLiteral());\r\n return module;\r\n } finally {\r\n memory.free(changetype(cArr));\r\n }\r\n }\r\n\r\n private constructor() { }\r\n\r\n // types\r\n\r\n addFunctionType(\r\n name: string,\r\n result: NativeType,\r\n paramTypes: NativeType[] | null\r\n ): FunctionRef {\r\n var cStr = this.allocStringCached(name);\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenAddFunctionType(this.ref, cStr, result, cArr, paramTypes ? paramTypes.length : 0);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n getFunctionTypeBySignature(\r\n result: NativeType,\r\n paramTypes: NativeType[] | null\r\n ): FunctionTypeRef {\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n return _BinaryenGetFunctionTypeBySignature(this.ref, result, cArr, paramTypes ? paramTypes.length : 0);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n removeFunctionType(name: string): void {\r\n var cStr = this.allocStringCached(name);\r\n _BinaryenRemoveFunctionType(this.ref, cStr);\r\n }\r\n\r\n // constants\r\n\r\n createI32(value: i32): ExpressionRef {\r\n var out = this.lit;\r\n _BinaryenLiteralInt32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createI64(valueLow: i32, valueHigh: i32 = 0): ExpressionRef {\r\n var out = this.lit;\r\n _BinaryenLiteralInt64(out, valueLow, valueHigh);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createF32(value: f32): ExpressionRef {\r\n var out = this.lit;\r\n _BinaryenLiteralFloat32(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createF64(value: f64): ExpressionRef {\r\n var out = this.lit;\r\n _BinaryenLiteralFloat64(out, value);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n createV128(bytes: Uint8Array): ExpressionRef {\r\n assert(bytes.length == 16);\r\n var out = this.lit;\r\n // FIXME: does this work or do we need to malloc?\r\n for (let i = 0; i < 16; ++i) store(out + i, bytes[i]);\r\n _BinaryenLiteralVec128(out, out);\r\n return _BinaryenConst(this.ref, out);\r\n }\r\n\r\n // expressions\r\n\r\n createUnary(\r\n op: UnaryOp,\r\n expr: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenUnary(this.ref, op, expr);\r\n }\r\n\r\n createBinary(\r\n op: BinaryOp,\r\n left: ExpressionRef,\r\n right: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenBinary(this.ref, op, left, right);\r\n }\r\n\r\n createHost(\r\n op: HostOp,\r\n name: string | null = null,\r\n operands: ExpressionRef[] | null = null\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(name);\r\n var cArr = allocPtrArray(operands);\r\n try {\r\n return _BinaryenHost(this.ref, op, cStr, cArr, operands ? (operands).length : 0);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n createGetLocal(\r\n index: i32,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenGetLocal(this.ref, index, type);\r\n }\r\n\r\n createTeeLocal(\r\n index: i32,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenTeeLocal(this.ref, index, value);\r\n }\r\n\r\n createGetGlobal(\r\n name: string,\r\n type: NativeType\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(name);\r\n return _BinaryenGetGlobal(this.ref, cStr, type);\r\n }\r\n\r\n createLoad(\r\n bytes: Index,\r\n signed: bool,\r\n ptr: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenLoad(this.ref, bytes, signed ? 1 : 0, offset, /* always aligned */ bytes, type, ptr);\r\n }\r\n\r\n createStore(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenStore(this.ref, bytes, offset, /* always aligned */ bytes, ptr, value, type);\r\n }\r\n\r\n createAtomicLoad(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenAtomicLoad(this.ref, bytes, offset, type, ptr);\r\n }\r\n\r\n createAtomicStore(\r\n bytes: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType,\r\n offset: Index = 0\r\n ): ExpressionRef {\r\n return _BinaryenAtomicStore(this.ref, bytes, offset, ptr, value, type);\r\n }\r\n\r\n createAtomicRMW(\r\n op: AtomicRMWOp,\r\n bytes: Index,\r\n offset: Index,\r\n ptr: ExpressionRef,\r\n value: ExpressionRef,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicRMW(this.ref, op, bytes, offset, ptr, value, type);\r\n }\r\n\r\n createAtomicCmpxchg(\r\n bytes: Index,\r\n offset: Index,\r\n ptr: ExpressionRef,\r\n expected: ExpressionRef,\r\n replacement: ExpressionRef,\r\n type: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicCmpxchg(this.ref, bytes, offset, ptr, expected, replacement, type);\r\n }\r\n\r\n createAtomicWait(\r\n ptr: ExpressionRef,\r\n expected: ExpressionRef,\r\n timeout: ExpressionRef,\r\n expectedType: NativeType\r\n ): ExpressionRef {\r\n return _BinaryenAtomicWait(this.ref, ptr, expected, timeout, expectedType);\r\n }\r\n\r\n createAtomicWake(\r\n ptr: ExpressionRef,\r\n wakeCount: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenAtomicWake(this.ref, ptr, wakeCount);\r\n }\r\n\r\n // statements\r\n\r\n createSetLocal(\r\n index: Index,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenSetLocal(this.ref, index, value);\r\n }\r\n\r\n createSetGlobal(\r\n name: string,\r\n value: ExpressionRef\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(name);\r\n return _BinaryenSetGlobal(this.ref, cStr, value);\r\n }\r\n\r\n createBlock(\r\n label: string | null,\r\n children: ExpressionRef[],\r\n type: NativeType = NativeType.None\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(label);\r\n var cArr = allocPtrArray(children);\r\n try {\r\n return _BinaryenBlock(this.ref, cStr, cArr, children.length, type);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n createBreak(\r\n label: string | null,\r\n condition: ExpressionRef = 0,\r\n value: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(label);\r\n return _BinaryenBreak(this.ref, cStr, condition, value);\r\n }\r\n\r\n createDrop(\r\n expression: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenDrop(this.ref, expression);\r\n }\r\n\r\n createLoop(\r\n label: string | null,\r\n body: ExpressionRef\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(label);\r\n return _BinaryenLoop(this.ref, cStr, body);\r\n }\r\n\r\n createIf(\r\n condition: ExpressionRef,\r\n ifTrue: ExpressionRef,\r\n ifFalse: ExpressionRef = 0\r\n ): ExpressionRef {\r\n return _BinaryenIf(this.ref, condition, ifTrue, ifFalse);\r\n }\r\n\r\n createNop(): ExpressionRef {\r\n return _BinaryenNop(this.ref);\r\n }\r\n\r\n createReturn(\r\n expression: ExpressionRef = 0\r\n ): ExpressionRef {\r\n return _BinaryenReturn(this.ref, expression);\r\n }\r\n\r\n createSelect(\r\n ifTrue: ExpressionRef,\r\n ifFalse: ExpressionRef,\r\n condition: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenSelect(this.ref, condition, ifTrue, ifFalse);\r\n }\r\n\r\n createSwitch(\r\n names: string[],\r\n defaultName: string | null,\r\n condition: ExpressionRef,\r\n value: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var numNames = names.length;\r\n var strs = new Array(numNames);\r\n for (let i = 0; i < numNames; ++i) {\r\n strs[i] = this.allocStringCached(names[i]);\r\n }\r\n var cArr = allocI32Array(strs);\r\n var cStr = this.allocStringCached(defaultName);\r\n try {\r\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n createCall(\r\n target: string,\r\n operands: ExpressionRef[] | null,\r\n returnType: NativeType\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(target);\r\n var cArr = allocPtrArray(operands);\r\n try {\r\n return _BinaryenCall(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n createCallIndirect(\r\n index: ExpressionRef,\r\n operands: ExpressionRef[] | null,\r\n typeName: string\r\n ): ExpressionRef {\r\n var cStr = this.allocStringCached(typeName);\r\n var cArr = allocPtrArray(operands);\r\n try {\r\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n createUnreachable(): ExpressionRef {\r\n return _BinaryenUnreachable(this.ref);\r\n }\r\n\r\n // bulk memory\r\n\r\n createMemoryCopy(\r\n dest: ExpressionRef,\r\n source: ExpressionRef,\r\n size: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenMemoryCopy(this.ref, dest, source, size);\r\n }\r\n\r\n createMemoryFill(\r\n dest: ExpressionRef,\r\n value: ExpressionRef,\r\n size: ExpressionRef\r\n ): ExpressionRef {\r\n return _BinaryenMemoryFill(this.ref, dest, value, size);\r\n }\r\n\r\n // meta\r\n\r\n addGlobal(\r\n name: string,\r\n type: NativeType,\r\n mutable: bool,\r\n initializer: ExpressionRef\r\n ): GlobalRef {\r\n var cStr = this.allocStringCached(name);\r\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\r\n }\r\n\r\n removeGlobal(\r\n name: string\r\n ): void {\r\n var cStr = this.allocStringCached(name);\r\n _BinaryenRemoveGlobal(this.ref, cStr);\r\n }\r\n\r\n addFunction(\r\n name: string,\r\n type: FunctionTypeRef,\r\n varTypes: NativeType[] | null,\r\n body: ExpressionRef\r\n ): FunctionRef {\r\n var cStr = this.allocStringCached(name);\r\n var cArr = allocI32Array(varTypes);\r\n try {\r\n return _BinaryenAddFunction(this.ref, cStr, type, cArr, varTypes ? varTypes.length : 0, body);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n removeFunction(name: string): void {\r\n var cStr = this.allocStringCached(name);\r\n _BinaryenRemoveFunction(this.ref, cStr);\r\n }\r\n\r\n private hasTemporaryFunction: bool = false;\r\n\r\n addTemporaryFunction(result: NativeType, paramTypes: NativeType[] | null, body: ExpressionRef): FunctionRef {\r\n this.hasTemporaryFunction = assert(!this.hasTemporaryFunction);\r\n var tempName = this.allocStringCached(\"\");\r\n var cArr = allocI32Array(paramTypes);\r\n try {\r\n let typeRef = _BinaryenAddFunctionType(this.ref, tempName, result, cArr, paramTypes ? paramTypes.length : 0);\r\n return _BinaryenAddFunction(this.ref, tempName, typeRef, 0, 0, body);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n removeTemporaryFunction(): void {\r\n this.hasTemporaryFunction = !assert(this.hasTemporaryFunction);\r\n var tempName = this.allocStringCached(\"\");\r\n _BinaryenRemoveFunction(this.ref, tempName);\r\n _BinaryenRemoveFunctionType(this.ref, tempName);\r\n }\r\n\r\n addFunctionExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalName);\r\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\r\n }\r\n\r\n addTableExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalName);\r\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\r\n }\r\n\r\n addMemoryExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalName);\r\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\r\n }\r\n\r\n addGlobalExport(\r\n internalName: string,\r\n externalName: string\r\n ): ExportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalName);\r\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\r\n }\r\n\r\n removeExport(externalName: string): void {\r\n var cStr = this.allocStringCached(externalName);\r\n _BinaryenRemoveExport(this.ref, cStr);\r\n }\r\n\r\n addFunctionImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string,\r\n functionType: FunctionTypeRef\r\n ): ImportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalModuleName);\r\n var cStr3 = this.allocStringCached(externalBaseName);\r\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\r\n }\r\n\r\n addTableImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string\r\n ): ImportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalModuleName);\r\n var cStr3 = this.allocStringCached(externalBaseName);\r\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\r\n }\r\n\r\n addMemoryImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string,\r\n shared: bool = false,\r\n ): ImportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalModuleName);\r\n var cStr3 = this.allocStringCached(externalBaseName);\r\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3, shared);\r\n }\r\n\r\n addGlobalImport(\r\n internalName: string,\r\n externalModuleName: string,\r\n externalBaseName: string,\r\n globalType: NativeType\r\n ): ImportRef {\r\n var cStr1 = this.allocStringCached(internalName);\r\n var cStr2 = this.allocStringCached(externalModuleName);\r\n var cStr3 = this.allocStringCached(externalBaseName);\r\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\r\n }\r\n\r\n /** Unlimited memory constant. */\r\n static readonly UNLIMITED_MEMORY: Index = -1;\r\n\r\n setMemory(\r\n initial: Index,\r\n maximum: Index,\r\n segments: MemorySegment[],\r\n target: Target,\r\n exportName: string | null = null,\r\n shared: bool = false\r\n ): void {\r\n var cStr = this.allocStringCached(exportName);\r\n var k = segments.length;\r\n var segs = new Array(k);\r\n var offs = new Array(k);\r\n var sizs = new Array(k);\r\n for (let i = 0; i < k; ++i) {\r\n let buffer = segments[i].buffer;\r\n let offset = segments[i].offset;\r\n segs[i] = allocU8Array(buffer);\r\n offs[i] = target == Target.WASM64\r\n ? this.createI64(i64_low(offset), i64_high(offset))\r\n : this.createI32(i64_low(offset));\r\n sizs[i] = buffer.length;\r\n }\r\n var cArr1 = allocI32Array(segs);\r\n var cArr2 = allocI32Array(offs);\r\n var cArr3 = allocI32Array(sizs);\r\n try {\r\n _BinaryenSetMemory(this.ref, initial, maximum, cStr, cArr1, cArr2, cArr3, k, shared);\r\n } finally {\r\n memory.free(cArr3);\r\n memory.free(cArr2);\r\n memory.free(cArr1);\r\n for (let i = k - 1; i >= 0; --i) memory.free(segs[i]);\r\n }\r\n }\r\n\r\n setFunctionTable(\r\n initial: Index,\r\n maximum: Index,\r\n funcs: string[]\r\n ): void {\r\n var numNames = funcs.length;\r\n var names = new Array(numNames);\r\n for (let i = 0; i < numNames; ++i) {\r\n names[i] = this.allocStringCached(funcs[i]);\r\n }\r\n var cArr = allocI32Array(names);\r\n try {\r\n _BinaryenSetFunctionTable(this.ref, initial, maximum, cArr, numNames);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n setStart(func: FunctionRef): void {\r\n _BinaryenSetStart(this.ref, func);\r\n }\r\n\r\n getOptimizeLevel(): i32 {\r\n return _BinaryenGetOptimizeLevel();\r\n }\r\n\r\n setOptimizeLevel(level: i32 = 2): void {\r\n _BinaryenSetOptimizeLevel(level);\r\n }\r\n\r\n getShrinkLevel(): i32 {\r\n return _BinaryenGetShrinkLevel();\r\n }\r\n\r\n setShrinkLevel(level: i32 = 1): void {\r\n _BinaryenSetShrinkLevel(level);\r\n }\r\n\r\n setDebugInfo(on: bool = false): void {\r\n _BinaryenSetDebugInfo(on);\r\n }\r\n\r\n optimize(func: FunctionRef = 0): void {\r\n if (func) {\r\n _BinaryenFunctionOptimize(func, this.ref);\r\n } else {\r\n _BinaryenModuleOptimize(this.ref);\r\n }\r\n }\r\n\r\n runPasses(passes: string[], func: FunctionRef = 0): void {\r\n var numNames = passes.length;\r\n var names = new Array(numNames);\r\n for (let i = 0; i < numNames; ++i) {\r\n names[i] = allocString(passes[i]);\r\n }\r\n var cArr = allocI32Array(names);\r\n try {\r\n if (func) {\r\n _BinaryenFunctionRunPasses(func, this.ref, cArr, numNames);\r\n } else {\r\n _BinaryenModuleRunPasses(this.ref, cArr, numNames);\r\n }\r\n } finally {\r\n memory.free(cArr);\r\n for (let i = numNames; i >= 0; --i) memory.free(names[i]);\r\n }\r\n }\r\n\r\n private cachedPrecomputeNames: usize = 0;\r\n\r\n precomputeExpression(expr: ExpressionRef): ExpressionRef {\r\n // remember the previous optimize levels and set to max instead, to be sure\r\n var previousOptimizeLevel = _BinaryenGetOptimizeLevel();\r\n var previousShrinkLevel = _BinaryenGetShrinkLevel();\r\n var previousDebugInfo = _BinaryenGetDebugInfo();\r\n _BinaryenSetOptimizeLevel(4);\r\n _BinaryenSetShrinkLevel(0);\r\n _BinaryenSetDebugInfo(false);\r\n\r\n // wrap the expression in a temp. function and run the precompute pass on it\r\n var type = _BinaryenExpressionGetType(expr);\r\n var func = this.addTemporaryFunction(type, null, expr);\r\n var names = this.cachedPrecomputeNames;\r\n if (!names) {\r\n this.cachedPrecomputeNames = names = allocI32Array([ this.allocStringCached(\"precompute\") ]);\r\n }\r\n _BinaryenFunctionRunPasses(func, this.ref, names, 1);\r\n expr = _BinaryenFunctionGetBody(func);\r\n this.removeTemporaryFunction();\r\n\r\n // reset optimize levels to previous\r\n _BinaryenSetOptimizeLevel(previousOptimizeLevel);\r\n _BinaryenSetShrinkLevel(previousShrinkLevel);\r\n _BinaryenSetDebugInfo(previousDebugInfo);\r\n return expr;\r\n }\r\n\r\n validate(): bool {\r\n return _BinaryenModuleValidate(this.ref) == 1;\r\n }\r\n\r\n interpret(): void {\r\n _BinaryenModuleInterpret(this.ref);\r\n }\r\n\r\n toBinary(sourceMapUrl: string | null): BinaryModule {\r\n var out = this.lit; // safe to reuse as long as..\r\n assert(_BinaryenSizeofLiteral() >= 12);\r\n var cStr = allocString(sourceMapUrl);\r\n var binaryPtr: usize = 0;\r\n var sourceMapPtr: usize = 0;\r\n try {\r\n _BinaryenModuleAllocateAndWrite(out, this.ref, cStr);\r\n binaryPtr = readInt(out);\r\n let binaryBytes = readInt(out + 4);\r\n sourceMapPtr = readInt(out + 4 * 2);\r\n let ret = new BinaryModule();\r\n ret.output = readBuffer(binaryPtr, binaryBytes);\r\n ret.sourceMap = readString(sourceMapPtr);\r\n return ret;\r\n } finally {\r\n if (cStr) memory.free(cStr);\r\n if (binaryPtr) memory.free(binaryPtr);\r\n if (sourceMapPtr) memory.free(sourceMapPtr);\r\n }\r\n }\r\n\r\n toText(): string {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n }\r\n\r\n toAsmjs(): string {\r\n throw new Error(\"not implemented\"); // JS glue overrides this\r\n }\r\n\r\n private cachedStrings: Map = new Map();\r\n\r\n private allocStringCached(str: string | null): usize {\r\n if (str == null) return 0;\r\n var cachedStrings = this.cachedStrings;\r\n if (cachedStrings.has(str)) return cachedStrings.get(str);\r\n var ptr = allocString(str);\r\n cachedStrings.set(str, ptr);\r\n return ptr;\r\n }\r\n\r\n dispose(): void {\r\n assert(this.ref);\r\n for (let ptr of this.cachedStrings.values()) memory.free(ptr);\r\n this.cachedStrings = new Map();\r\n memory.free(this.lit);\r\n memory.free(this.cachedPrecomputeNames);\r\n this.cachedPrecomputeNames = 0;\r\n _BinaryenModuleDispose(this.ref);\r\n this.ref = 0;\r\n }\r\n\r\n createRelooper(): Relooper {\r\n return Relooper.create(this);\r\n }\r\n\r\n cloneExpression(\r\n expr: ExpressionRef,\r\n noSideEffects: bool = false,\r\n maxDepth: i32 = i32.MAX_VALUE\r\n ): ExpressionRef { // currently supports side effect free expressions only\r\n if (maxDepth < 0) return 0;\r\n maxDepth -= 1;\r\n\r\n var nested1: ExpressionRef,\r\n nested2: ExpressionRef;\r\n\r\n switch (_BinaryenExpressionGetId(expr)) {\r\n case ExpressionId.Const: {\r\n switch (_BinaryenExpressionGetType(expr)) {\r\n case NativeType.I32: {\r\n return this.createI32(_BinaryenConstGetValueI32(expr));\r\n }\r\n case NativeType.I64: {\r\n return this.createI64(\r\n _BinaryenConstGetValueI64Low(expr),\r\n _BinaryenConstGetValueI64High(expr)\r\n );\r\n }\r\n case NativeType.F32: {\r\n return this.createF32(_BinaryenConstGetValueF32(expr));\r\n }\r\n case NativeType.F64: {\r\n return this.createF64(_BinaryenConstGetValueF64(expr));\r\n }\r\n default: {\r\n throw new Error(\"concrete type expected\");\r\n }\r\n }\r\n }\r\n case ExpressionId.GetLocal: {\r\n return _BinaryenGetLocal(this.ref,\r\n _BinaryenGetLocalGetIndex(expr),\r\n _BinaryenExpressionGetType(expr)\r\n );\r\n }\r\n case ExpressionId.GetGlobal: {\r\n let globalName = _BinaryenGetGlobalGetName(expr);\r\n if (!globalName) break;\r\n return _BinaryenGetGlobal(this.ref, globalName, _BinaryenExpressionGetType(expr));\r\n }\r\n case ExpressionId.Load: {\r\n if (!(nested1 = this.cloneExpression(_BinaryenLoadGetPtr(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return (\r\n _BinaryenLoadIsAtomic(expr)\r\n ? _BinaryenAtomicLoad(this.ref,\r\n _BinaryenLoadGetBytes(expr),\r\n _BinaryenLoadGetOffset(expr),\r\n _BinaryenExpressionGetType(expr),\r\n nested1\r\n )\r\n : _BinaryenLoad(this.ref,\r\n _BinaryenLoadGetBytes(expr),\r\n _BinaryenLoadIsSigned(expr) ? 1 : 0,\r\n _BinaryenLoadGetOffset(expr),\r\n _BinaryenLoadGetAlign(expr),\r\n _BinaryenExpressionGetType(expr),\r\n nested1\r\n )\r\n );\r\n }\r\n case ExpressionId.Unary: {\r\n if (!(nested1 = this.cloneExpression(_BinaryenUnaryGetValue(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenUnary(this.ref, _BinaryenUnaryGetOp(expr), nested1);\r\n }\r\n case ExpressionId.Binary: {\r\n if (!(nested1 = this.cloneExpression(_BinaryenBinaryGetLeft(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n if (!(nested2 = this.cloneExpression(_BinaryenBinaryGetRight(expr), noSideEffects, maxDepth))) {\r\n break;\r\n }\r\n return _BinaryenBinary(this.ref, _BinaryenBinaryGetOp(expr), nested1, nested2);\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n // source map generation\r\n\r\n addDebugInfoFile(name: string): Index {\r\n var cStr = allocString(name);\r\n try {\r\n return _BinaryenModuleAddDebugInfoFileName(this.ref, cStr);\r\n } finally {\r\n memory.free(cStr);\r\n }\r\n }\r\n\r\n getDebugInfoFile(index: Index): string | null {\r\n return readString(_BinaryenModuleGetDebugInfoFileName(this.ref, index));\r\n }\r\n\r\n setDebugLocation(\r\n func: FunctionRef,\r\n expr: ExpressionRef,\r\n fileIndex: Index,\r\n lineNumber: Index,\r\n columnNumber: Index\r\n ): void {\r\n _BinaryenFunctionSetDebugLocation(func, expr, fileIndex, lineNumber, columnNumber);\r\n }\r\n}\r\n\r\n// expressions\r\n\r\nexport function getExpressionId(expr: ExpressionRef): ExpressionId {\r\n return _BinaryenExpressionGetId(expr);\r\n}\r\n\r\nexport function getExpressionType(expr: ExpressionRef): NativeType {\r\n return _BinaryenExpressionGetType(expr);\r\n}\r\n\r\nexport function getConstValueI32(expr: ExpressionRef): i32 {\r\n return _BinaryenConstGetValueI32(expr);\r\n}\r\n\r\nexport function getConstValueI64Low(expr: ExpressionRef): i32 {\r\n return _BinaryenConstGetValueI64Low(expr);\r\n}\r\n\r\nexport function getConstValueI64High(expr: ExpressionRef): i32 {\r\n return _BinaryenConstGetValueI64High(expr);\r\n}\r\n\r\nexport function getConstValueF32(expr: ExpressionRef): f32 {\r\n return _BinaryenConstGetValueF32(expr);\r\n}\r\n\r\nexport function getConstValueF64(expr: ExpressionRef): f32 {\r\n return _BinaryenConstGetValueF64(expr);\r\n}\r\n\r\nexport function getGetLocalIndex(expr: ExpressionRef): Index {\r\n return _BinaryenGetLocalGetIndex(expr);\r\n}\r\n\r\nexport function getSetLocalIndex(expr: ExpressionRef): Index {\r\n return _BinaryenSetLocalGetIndex(expr);\r\n}\r\n\r\nexport function getSetLocalValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenSetLocalGetValue(expr);\r\n}\r\n\r\nexport function isTeeLocal(expr: ExpressionRef): bool {\r\n return _BinaryenSetLocalIsTee(expr);\r\n}\r\n\r\nexport function getGetGlobalName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenGetGlobalGetName(expr));\r\n}\r\n\r\nexport function getBinaryOp(expr: ExpressionRef): BinaryOp {\r\n return _BinaryenBinaryGetOp(expr);\r\n}\r\n\r\nexport function getBinaryLeft(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenBinaryGetLeft(expr);\r\n}\r\n\r\nexport function getBinaryRight(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenBinaryGetRight(expr);\r\n}\r\n\r\nexport function getUnaryOp(expr: ExpressionRef): UnaryOp {\r\n return _BinaryenUnaryGetOp(expr);\r\n}\r\n\r\nexport function getUnaryValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenUnaryGetValue(expr);\r\n}\r\n\r\nexport function getLoadBytes(expr: ExpressionRef): u32 {\r\n return _BinaryenLoadGetBytes(expr);\r\n}\r\n\r\nexport function getLoadOffset(expr: ExpressionRef): u32 {\r\n return _BinaryenLoadGetOffset(expr);\r\n}\r\n\r\nexport function getLoadPtr(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenLoadGetPtr(expr);\r\n}\r\n\r\nexport function isLoadSigned(expr: ExpressionRef): bool {\r\n return _BinaryenLoadIsSigned(expr);\r\n}\r\n\r\nexport function getStoreBytes(expr: ExpressionRef): u32 {\r\n return _BinaryenStoreGetBytes(expr);\r\n}\r\n\r\nexport function getStoreOffset(expr: ExpressionRef): u32 {\r\n return _BinaryenStoreGetOffset(expr);\r\n}\r\n\r\nexport function getStorePtr(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenStoreGetPtr(expr);\r\n}\r\n\r\nexport function getStoreValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenStoreGetValue(expr);\r\n}\r\n\r\nexport function getBlockName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenBlockGetName(expr));\r\n}\r\n\r\nexport function getBlockChildCount(expr: ExpressionRef): Index {\r\n return _BinaryenBlockGetNumChildren(expr);\r\n}\r\n\r\nexport function getBlockChild(expr: ExpressionRef, index: Index): ExpressionRef {\r\n return _BinaryenBlockGetChild(expr, index);\r\n}\r\n\r\nexport function getIfCondition(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenIfGetCondition(expr);\r\n}\r\n\r\nexport function getIfTrue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenIfGetIfTrue(expr);\r\n}\r\n\r\nexport function getIfFalse(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenIfGetIfFalse(expr);\r\n}\r\n\r\nexport function getLoopName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenLoopGetName(expr));\r\n}\r\n\r\nexport function getLoopBody(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenLoopGetBody(expr);\r\n}\r\n\r\nexport function getBreakName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenBreakGetName(expr));\r\n}\r\n\r\nexport function getBreakCondition(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenBreakGetCondition(expr);\r\n}\r\n\r\nexport function getSelectThen(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenSelectGetIfTrue(expr);\r\n}\r\n\r\nexport function getSelectElse(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenSelectGetIfFalse(expr);\r\n}\r\n\r\nexport function getSelectCondition(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenSelectGetCondition(expr);\r\n}\r\n\r\nexport function getDropValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenDropGetValue(expr);\r\n}\r\n\r\nexport function getReturnValue(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenReturnGetValue(expr);\r\n}\r\n\r\nexport function getCallTarget(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenCallGetTarget(expr));\r\n}\r\n\r\nexport function getHostOp(expr: ExpressionRef): ExpressionRef {\r\n return _BinaryenHostGetOp(expr);\r\n}\r\n\r\nexport function getHostOperandCount(expr: ExpressionRef): Index {\r\n return _BinaryenHostGetNumOperands(expr);\r\n}\r\n\r\nexport function getHostOperand(expr: ExpressionRef, index: Index): ExpressionRef {\r\n return _BinaryenHostGetOperand(expr, index);\r\n}\r\n\r\nexport function getHostName(expr: ExpressionRef): string | null {\r\n return readString(_BinaryenHostGetNameOperand(expr));\r\n}\r\n\r\n// functions\r\n\r\nexport function getFunctionBody(func: FunctionRef): ExpressionRef {\r\n return _BinaryenFunctionGetBody(func);\r\n}\r\n\r\nexport function getFunctionName(func: FunctionRef): string | null {\r\n return readString(_BinaryenFunctionGetName(func));\r\n}\r\n\r\nexport function getFunctionParamCount(func: FunctionRef): Index {\r\n return _BinaryenFunctionGetNumParams(func);\r\n}\r\n\r\nexport function getFunctionParamType(func: FunctionRef, index: Index): NativeType {\r\n return _BinaryenFunctionGetParam(func, index);\r\n}\r\n\r\nexport function getFunctionResultType(func: FunctionRef): NativeType {\r\n return _BinaryenFunctionGetResult(func);\r\n}\r\n\r\nexport class Relooper {\r\n\r\n module: Module;\r\n ref: RelooperRef;\r\n\r\n static create(module: Module): Relooper {\r\n var relooper = new Relooper();\r\n relooper.module = module;\r\n relooper.ref = _RelooperCreate(module.ref);\r\n return relooper;\r\n }\r\n\r\n private constructor() {}\r\n\r\n addBlock(code: ExpressionRef): RelooperBlockRef {\r\n return _RelooperAddBlock(this.ref, code);\r\n }\r\n\r\n addBranch(\r\n from: RelooperBlockRef,\r\n to: RelooperBlockRef,\r\n condition: ExpressionRef = 0,\r\n code: ExpressionRef = 0\r\n ): void {\r\n _RelooperAddBranch(from, to, condition, code);\r\n }\r\n\r\n addBlockWithSwitch(code: ExpressionRef, condition: ExpressionRef): RelooperBlockRef {\r\n return _RelooperAddBlockWithSwitch(this.ref, code, condition);\r\n }\r\n\r\n addBranchForSwitch(\r\n from: RelooperBlockRef,\r\n to: RelooperBlockRef,\r\n indexes: i32[],\r\n code: ExpressionRef = 0\r\n ): void {\r\n var cArr = allocI32Array(indexes);\r\n try {\r\n _RelooperAddBranchForSwitch(from, to, cArr, indexes.length, code);\r\n } finally {\r\n memory.free(cArr);\r\n }\r\n }\r\n\r\n renderAndDispose(entry: RelooperBlockRef, labelHelper: Index): ExpressionRef {\r\n return _RelooperRenderAndDispose(this.ref, entry, labelHelper);\r\n }\r\n}\r\n\r\n// export function hasSideEffects(expr: ExpressionRef): bool {\r\n// switch (_BinaryenExpressionGetId(expr = getPtr(expr))) {\r\n// case ExpressionId.GetLocal:\r\n// case ExpressionId.GetGlobal:\r\n// case ExpressionId.Const:\r\n// case ExpressionId.Nop:\r\n// case ExpressionId.Unreachable: {\r\n// return false;\r\n// }\r\n// case ExpressionId.Block: {\r\n// for (let i = 0, k = _BinaryenBlockGetNumChildren(expr); i < k; ++i) {\r\n// if (hasSideEffects(_BinaryenBlockGetChild(expr, i))) return true;\r\n// }\r\n// return false;\r\n// }\r\n// case ExpressionId.If: {\r\n// return hasSideEffects(_BinaryenIfGetCondition(expr))\r\n// || hasSideEffects(_BinaryenIfGetIfTrue(expr))\r\n// || hasSideEffects(_BinaryenIfGetIfFalse(expr));\r\n// }\r\n// case ExpressionId.Unary: {\r\n// return hasSideEffects(_BinaryenUnaryGetValue(expr));\r\n// }\r\n// case ExpressionId.Binary: {\r\n// return hasSideEffects(_BinaryenBinaryGetLeft(expr))\r\n// || hasSideEffects(_BinaryenBinaryGetRight(expr));\r\n// }\r\n// case ExpressionId.Drop: {\r\n// return hasSideEffects(_BinaryenDropGetValue(expr));\r\n// }\r\n// case ExpressionId.Select: {\r\n// return hasSideEffects(_BinaryenSelectGetIfTrue(expr))\r\n// || hasSideEffects(_BinaryenSelectGetIfFalse(expr))\r\n// || hasSideEffects(_BinaryenSelectGetCondition(expr));\r\n// }\r\n// }\r\n// return true;\r\n// }\r\n\r\n// helpers\r\n// can't do stack allocation here: STACKTOP is a global in WASM but a hidden variable in asm.js\r\n\r\nfunction allocU8Array(u8s: Uint8Array | null): usize {\r\n if (!u8s) return 0;\r\n var numValues = u8s.length;\r\n var ptr = memory.allocate(numValues);\r\n var idx = ptr;\r\n for (let i = 0; i < numValues; ++i) {\r\n store(idx++, u8s[i]);\r\n }\r\n return ptr;\r\n}\r\n\r\nfunction allocI32Array(i32s: i32[] | null): usize {\r\n if (!i32s) return 0;\r\n var ptr = memory.allocate(i32s.length << 2);\r\n var idx = ptr;\r\n for (let i = 0, k = i32s.length; i < k; ++i) {\r\n let val = i32s[i];\r\n // store(idx, val) is not portable\r\n store(idx , ( val & 0xff) as u8);\r\n store(idx + 1, ((val >> 8) & 0xff) as u8);\r\n store(idx + 2, ((val >> 16) & 0xff) as u8);\r\n store(idx + 3, ( val >>> 24 ) as u8);\r\n idx += 4;\r\n }\r\n return ptr;\r\n}\r\n\r\nfunction allocPtrArray(ptrs: usize[] | null): usize {\r\n return allocI32Array(ptrs); // TODO: WASM64 one day\r\n}\r\n\r\nfunction stringLengthUTF8(str: string): usize {\r\n var len = 0;\r\n for (let i = 0, k = str.length; i < k; ++i) {\r\n let u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n ++len;\r\n } else if (u <= 0x7FF) {\r\n len += 2;\r\n } else if (u <= 0xFFFF) {\r\n len += 3;\r\n } else if (u <= 0x1FFFFF) {\r\n len += 4;\r\n } else if (u <= 0x3FFFFFF) {\r\n len += 5;\r\n } else {\r\n len += 6;\r\n }\r\n }\r\n return len;\r\n}\r\n\r\nfunction allocString(str: string | null): usize {\r\n if (str == null) return 0;\r\n var ptr = memory.allocate(stringLengthUTF8(str) + 1);\r\n // the following is based on Emscripten's stringToUTF8Array\r\n var idx = ptr;\r\n for (let i = 0, k = str.length; i < k; ++i) {\r\n let u = str.charCodeAt(i);\r\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\r\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\r\n }\r\n if (u <= 0x7F) {\r\n store(idx++, u as u8);\r\n } else if (u <= 0x7FF) {\r\n store(idx++, (0xC0 | (u >>> 6) ) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0xFFFF) {\r\n store(idx++, (0xE0 | (u >>> 12) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0x1FFFFF) {\r\n store(idx++, (0xF0 | (u >>> 18) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else if (u <= 0x3FFFFFF) {\r\n store(idx++, (0xF8 | (u >>> 24) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n } else {\r\n store(idx++, (0xFC | (u >>> 30) ) as u8);\r\n store(idx++, (0x80 | ((u >>> 24) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\r\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\r\n store(idx++, (0x80 | ( u & 63)) as u8);\r\n }\r\n }\r\n store(idx, 0);\r\n return ptr;\r\n}\r\n\r\nfunction readInt(ptr: usize): i32 {\r\n return (\r\n load(ptr ) |\r\n (load(ptr + 1) << 8) |\r\n (load(ptr + 2) << 16) |\r\n (load(ptr + 3) << 24)\r\n );\r\n}\r\n\r\nfunction readBuffer(ptr: usize, length: usize): Uint8Array {\r\n var ret = new Uint8Array(length);\r\n for (let i: usize = 0; i < length; ++i) {\r\n ret[i] = load(ptr + i);\r\n }\r\n return ret;\r\n}\r\n\r\nexport function readString(ptr: usize): string | null {\r\n if (!ptr) return null;\r\n var arr = new Array();\r\n // the following is based on Emscripten's UTF8ArrayToString\r\n var cp: u32;\r\n var u1: u32, u2: u32, u3: u32, u4: u32, u5: u32;\r\n while (cp = load(ptr++)) {\r\n if (!(cp & 0x80)) {\r\n arr.push(cp);\r\n continue;\r\n }\r\n u1 = load(ptr++) & 63;\r\n if ((cp & 0xE0) == 0xC0) {\r\n arr.push(((cp & 31) << 6) | u1);\r\n continue;\r\n }\r\n u2 = load(ptr++) & 63;\r\n if ((cp & 0xF0) == 0xE0) {\r\n cp = ((cp & 15) << 12) | (u1 << 6) | u2;\r\n } else {\r\n u3 = load(ptr++) & 63;\r\n if ((cp & 0xF8) == 0xF0) {\r\n cp = ((cp & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;\r\n } else {\r\n u4 = load(ptr++) & 63;\r\n if ((cp & 0xFC) == 0xF8) {\r\n cp = ((cp & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;\r\n } else {\r\n u5 = load(ptr++) & 63;\r\n cp = ((cp & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;\r\n }\r\n }\r\n }\r\n arr.push(cp);\r\n // if (cp < 0x10000) {\r\n // arr.push(cp);\r\n // } else {\r\n // var ch = cp - 0x10000;\r\n // arr.push(0xD800 | (ch >> 10));\r\n // arr.push(0xDC00 | (ch & 0x3FF));\r\n // }\r\n }\r\n // return String.fromCharCodes(arr);\r\n return String.fromCodePoints(arr);\r\n}\r\n\r\n/** Result structure of {@link Module#toBinary}. */\r\nexport class BinaryModule {\r\n /** WebAssembly binary. */\r\n output: Uint8Array;\r\n /** Source map, if generated. */\r\n sourceMap: string | null;\r\n}\r\n\r\n/** Tests if an expression needs an explicit 'unreachable' when it is the terminating statement. */\r\nexport function needsExplicitUnreachable(expr: ExpressionRef): bool {\r\n // not applicable if pushing a value to the stack\r\n switch (_BinaryenExpressionGetType(expr)) {\r\n case NativeType.I32:\r\n case NativeType.I64:\r\n case NativeType.F32:\r\n case NativeType.F64: return false;\r\n }\r\n switch (_BinaryenExpressionGetId(expr)) {\r\n case ExpressionId.Unreachable:\r\n case ExpressionId.Return: return false;\r\n case ExpressionId.Break: return _BinaryenBreakGetCondition(expr) != 0;\r\n case ExpressionId.Block: {\r\n if (!_BinaryenBlockGetName(expr)) { // can't break out of it\r\n let numChildren = _BinaryenBlockGetNumChildren(expr); // last child needs unreachable\r\n return numChildren > 0 && needsExplicitUnreachable(_BinaryenBlockGetChild(expr, numChildren - 1));\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n","/**\r\n * Abstract syntax tree representing a source file once parsed.\r\n * @module ast\r\n *//***/\r\n\r\nimport {\r\n CommonFlags,\r\n CommonSymbols,\r\n PATH_DELIMITER,\r\n LIBRARY_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n Token,\r\n Tokenizer,\r\n Range\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n normalizePath,\r\n resolvePath,\r\n CharCode\r\n} from \"./util\";\r\n\r\nexport { Token, Range };\r\n\r\n/** Indicates the kind of a node. */\r\nexport enum NodeKind {\r\n\r\n SOURCE,\r\n\r\n // types\r\n TYPE,\r\n TYPENAME,\r\n TYPEPARAMETER,\r\n PARAMETER,\r\n SIGNATURE,\r\n\r\n // expressions\r\n IDENTIFIER,\r\n ASSERTION,\r\n BINARY,\r\n CALL,\r\n CLASS,\r\n COMMA,\r\n ELEMENTACCESS,\r\n FALSE,\r\n FUNCTION,\r\n INSTANCEOF,\r\n LITERAL,\r\n NEW,\r\n NULL,\r\n PARENTHESIZED,\r\n PROPERTYACCESS,\r\n TERNARY,\r\n SUPER,\r\n THIS,\r\n TRUE,\r\n CONSTRUCTOR,\r\n UNARYPOSTFIX,\r\n UNARYPREFIX,\r\n\r\n // statements\r\n BLOCK,\r\n BREAK,\r\n CONTINUE,\r\n DO,\r\n EMPTY,\r\n EXPORT,\r\n EXPORTIMPORT,\r\n EXPRESSION,\r\n FOR,\r\n IF,\r\n IMPORT,\r\n RETURN,\r\n SWITCH,\r\n THROW,\r\n TRY,\r\n VARIABLE,\r\n VOID,\r\n WHILE,\r\n\r\n // declaration statements\r\n CLASSDECLARATION,\r\n ENUMDECLARATION,\r\n ENUMVALUEDECLARATION,\r\n FIELDDECLARATION,\r\n FUNCTIONDECLARATION,\r\n IMPORTDECLARATION,\r\n INDEXSIGNATUREDECLARATION,\r\n INTERFACEDECLARATION,\r\n METHODDECLARATION,\r\n NAMESPACEDECLARATION,\r\n TYPEDECLARATION,\r\n VARIABLEDECLARATION,\r\n\r\n // special\r\n DECORATOR,\r\n EXPORTMEMBER,\r\n SWITCHCASE,\r\n COMMENT\r\n}\r\n\r\n/** Checks if a node represents a constant value. */\r\nexport function nodeIsConstantValue(kind: NodeKind): bool {\r\n switch (kind) {\r\n case NodeKind.LITERAL:\r\n case NodeKind.NULL:\r\n case NodeKind.TRUE:\r\n case NodeKind.FALSE: return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Checks if a node might be callable. */\r\nexport function nodeIsCallable(kind: NodeKind): bool {\r\n switch (kind) {\r\n case NodeKind.IDENTIFIER:\r\n case NodeKind.ASSERTION: // if kind=NONNULL\r\n case NodeKind.CALL:\r\n case NodeKind.ELEMENTACCESS:\r\n case NodeKind.PARENTHESIZED:\r\n case NodeKind.PROPERTYACCESS:\r\n case NodeKind.SUPER: return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Checks if a node might be callable with generic arguments. */\r\nexport function nodeIsGenericCallable(kind: NodeKind): bool {\r\n switch (kind) {\r\n case NodeKind.IDENTIFIER:\r\n case NodeKind.PROPERTYACCESS: return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Base class of all nodes. */\r\nexport abstract class Node {\r\n\r\n /** Node kind indicator. */\r\n kind: NodeKind;\r\n /** Source range. */\r\n range: Range;\r\n\r\n // types\r\n\r\n static createTypeName(\r\n name: IdentifierExpression,\r\n range: Range\r\n ): TypeName {\r\n var typeName = new TypeName();\r\n typeName.range = range;\r\n typeName.identifier = name;\r\n typeName.next = null;\r\n return typeName;\r\n }\r\n\r\n static createSimpleTypeName(\r\n name: string,\r\n range: Range\r\n ): TypeName {\r\n return Node.createTypeName(Node.createIdentifierExpression(name, range), range);\r\n }\r\n\r\n static createType(\r\n name: TypeName,\r\n typeArguments: CommonTypeNode[] | null,\r\n isNullable: bool,\r\n range: Range\r\n ): TypeNode {\r\n var type = new TypeNode();\r\n type.range = range;\r\n type.name = name;\r\n type.typeArguments = typeArguments;\r\n type.isNullable = isNullable;\r\n return type;\r\n }\r\n\r\n static createOmittedType(\r\n range: Range\r\n ): TypeNode {\r\n return Node.createType(\r\n Node.createSimpleTypeName(\"\", range),\r\n null,\r\n false,\r\n range\r\n );\r\n }\r\n\r\n static createTypeParameter(\r\n name: IdentifierExpression,\r\n extendsType: TypeNode | null,\r\n defaultType: TypeNode | null,\r\n range: Range\r\n ): TypeParameterNode {\r\n var elem = new TypeParameterNode();\r\n elem.range = range;\r\n elem.name = name;\r\n elem.extendsType = extendsType;\r\n elem.defaultType = defaultType;\r\n return elem;\r\n }\r\n\r\n static createParameter(\r\n name: IdentifierExpression,\r\n type: CommonTypeNode,\r\n initializer: Expression | null,\r\n kind: ParameterKind,\r\n range: Range\r\n ): ParameterNode {\r\n var elem = new ParameterNode();\r\n elem.range = range;\r\n elem.name = name;\r\n elem.type = type;\r\n elem.initializer = initializer;\r\n elem.parameterKind = kind;\r\n return elem;\r\n }\r\n\r\n static createSignature(\r\n parameters: ParameterNode[],\r\n returnType: CommonTypeNode,\r\n explicitThisType: TypeNode | null,\r\n isNullable: bool,\r\n range: Range\r\n ): SignatureNode {\r\n var sig = new SignatureNode();\r\n sig.range = range;\r\n sig.parameters = parameters;\r\n sig.returnType = returnType;\r\n sig.explicitThisType = explicitThisType;\r\n sig.isNullable = isNullable;\r\n return sig;\r\n }\r\n\r\n // special\r\n\r\n static createDecorator(\r\n name: Expression,\r\n args: Expression[] | null,\r\n range: Range\r\n ): DecoratorNode {\r\n var stmt = new DecoratorNode();\r\n stmt.range = range;\r\n stmt.name = name;\r\n stmt.arguments = args;\r\n stmt.decoratorKind = decoratorNameToKind(name);\r\n return stmt;\r\n }\r\n\r\n static createComment(\r\n text: string,\r\n kind: CommentKind,\r\n range: Range\r\n ): CommentNode {\r\n var node = new CommentNode();\r\n node.range = range;\r\n node.commentKind = kind;\r\n node.text = text;\r\n return node;\r\n }\r\n\r\n // expressions\r\n\r\n static createIdentifierExpression(\r\n name: string,\r\n range: Range,\r\n isQuoted: bool = false\r\n ): IdentifierExpression {\r\n var expr = new IdentifierExpression();\r\n expr.range = range;\r\n expr.text = name; // TODO: extract from range\r\n expr.symbol = name; // TODO: Symbol.for(name)\r\n expr.isQuoted = isQuoted;\r\n return expr;\r\n }\r\n\r\n static createEmptyIdentifierExpression(\r\n range: Range\r\n ): IdentifierExpression {\r\n var expr = new IdentifierExpression();\r\n expr.range = range;\r\n expr.text = \"\";\r\n return expr;\r\n }\r\n\r\n static createArrayLiteralExpression(\r\n elements: (Expression | null)[],\r\n range: Range\r\n ): ArrayLiteralExpression {\r\n var expr = new ArrayLiteralExpression();\r\n expr.range = range;\r\n expr.elementExpressions = elements;\r\n return expr;\r\n }\r\n\r\n static createAssertionExpression(\r\n assertionKind: AssertionKind,\r\n expression: Expression,\r\n toType: CommonTypeNode | null,\r\n range: Range\r\n ): AssertionExpression {\r\n var expr = new AssertionExpression();\r\n expr.range = range;\r\n expr.assertionKind = assertionKind;\r\n expr.expression = expression;\r\n expr.toType = toType;\r\n return expr;\r\n }\r\n\r\n static createBinaryExpression(\r\n operator: Token,\r\n left: Expression,\r\n right: Expression,\r\n range: Range\r\n ): BinaryExpression {\r\n var expr = new BinaryExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.left = left;\r\n expr.right = right;\r\n return expr;\r\n }\r\n\r\n static createCallExpression(\r\n expression: Expression,\r\n typeArgs: CommonTypeNode[] | null,\r\n args: Expression[],\r\n range: Range\r\n ): CallExpression {\r\n var expr = new CallExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expr.typeArguments = typeArgs;\r\n expr.arguments = args;\r\n return expr;\r\n }\r\n\r\n static createClassExpression(\r\n declaration: ClassDeclaration\r\n ): ClassExpression {\r\n var expr = new ClassExpression();\r\n expr.range = declaration.range;\r\n expr.declaration = declaration;\r\n return expr;\r\n }\r\n\r\n static createCommaExpression(\r\n expressions: Expression[],\r\n range: Range\r\n ): CommaExpression {\r\n var expr = new CommaExpression();\r\n expr.range = range;\r\n expr.expressions = expressions;\r\n return expr;\r\n }\r\n\r\n static createConstructorExpression(\r\n range: Range\r\n ): ConstructorExpression {\r\n var expr = new ConstructorExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createElementAccessExpression(\r\n expression: Expression,\r\n element: Expression,\r\n range: Range\r\n ): ElementAccessExpression {\r\n var expr = new ElementAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expr.elementExpression = element;\r\n return expr;\r\n }\r\n\r\n static createFalseExpression(\r\n range: Range\r\n ): FalseExpression {\r\n var expr = new FalseExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createFloatLiteralExpression(\r\n value: f64,\r\n range: Range\r\n ): FloatLiteralExpression {\r\n var expr = new FloatLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createFunctionExpression(\r\n declaration: FunctionDeclaration\r\n ): FunctionExpression {\r\n var expr = new FunctionExpression();\r\n expr.range = declaration.range;\r\n expr.declaration = declaration;\r\n return expr;\r\n }\r\n\r\n static createInstanceOfExpression(\r\n expression: Expression,\r\n isType: CommonTypeNode,\r\n range: Range\r\n ): InstanceOfExpression {\r\n var expr = new InstanceOfExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expr.isType = isType;\r\n return expr;\r\n }\r\n\r\n static createIntegerLiteralExpression(\r\n value: I64,\r\n range: Range\r\n ): IntegerLiteralExpression {\r\n var expr = new IntegerLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createNewExpression(\r\n expression: Expression,\r\n typeArgs: CommonTypeNode[] | null,\r\n args: Expression[],\r\n range: Range\r\n ): NewExpression {\r\n var expr = new NewExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expr.typeArguments = typeArgs;\r\n expr.arguments = args;\r\n return expr;\r\n }\r\n\r\n static createNullExpression(\r\n range: Range\r\n ): NullExpression {\r\n var expr = new NullExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createObjectLiteralExpression(\r\n names: IdentifierExpression[],\r\n values: Expression[],\r\n range: Range\r\n ): ObjectLiteralExpression {\r\n var expr = new ObjectLiteralExpression();\r\n expr.range = range;\r\n expr.names = names;\r\n expr.values = values;\r\n return expr;\r\n }\r\n\r\n static createParenthesizedExpression(\r\n expression: Expression,\r\n range: Range\r\n ): ParenthesizedExpression {\r\n var expr = new ParenthesizedExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n return expr;\r\n }\r\n\r\n static createPropertyAccessExpression(\r\n expression: Expression,\r\n property: IdentifierExpression,\r\n range: Range\r\n ): PropertyAccessExpression {\r\n var expr = new PropertyAccessExpression();\r\n expr.range = range;\r\n expr.expression = expression;\r\n expr.property = property;\r\n return expr;\r\n }\r\n\r\n static createRegexpLiteralExpression(\r\n pattern: string,\r\n flags: string,\r\n range: Range\r\n ): RegexpLiteralExpression {\r\n var expr = new RegexpLiteralExpression();\r\n expr.range = range;\r\n expr.pattern = pattern;\r\n expr.patternFlags = flags;\r\n return expr;\r\n }\r\n\r\n static createTernaryExpression(\r\n condition: Expression,\r\n ifThen: Expression,\r\n ifElse: Expression,\r\n range: Range\r\n ): TernaryExpression {\r\n var expr = new TernaryExpression();\r\n expr.range = range;\r\n expr.condition = condition;\r\n expr.ifThen = ifThen;\r\n expr.ifElse = ifElse;\r\n return expr;\r\n }\r\n\r\n static createStringLiteralExpression(\r\n value: string,\r\n range: Range\r\n ): StringLiteralExpression {\r\n var expr = new StringLiteralExpression();\r\n expr.range = range;\r\n expr.value = value;\r\n return expr;\r\n }\r\n\r\n static createSuperExpression(\r\n range: Range\r\n ): SuperExpression {\r\n var expr = new SuperExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createThisExpression(\r\n range: Range\r\n ): ThisExpression {\r\n var expr = new ThisExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createTrueExpression(\r\n range: Range\r\n ): TrueExpression {\r\n var expr = new TrueExpression();\r\n expr.range = range;\r\n return expr;\r\n }\r\n\r\n static createUnaryPostfixExpression(\r\n operator: Token,\r\n operand: Expression,\r\n range: Range\r\n ): UnaryPostfixExpression {\r\n var expr = new UnaryPostfixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand;\r\n return expr;\r\n }\r\n\r\n static createUnaryPrefixExpression(\r\n operator: Token,\r\n operand: Expression,\r\n range: Range\r\n ): UnaryPrefixExpression {\r\n var expr = new UnaryPrefixExpression();\r\n expr.range = range;\r\n expr.operator = operator;\r\n expr.operand = operand;\r\n return expr;\r\n }\r\n\r\n // statements\r\n\r\n static createBlockStatement(\r\n statements: Statement[],\r\n range: Range\r\n ): BlockStatement {\r\n var stmt = new BlockStatement();\r\n stmt.range = range;\r\n stmt.statements = statements;\r\n return stmt;\r\n }\r\n\r\n static createBreakStatement(\r\n label: IdentifierExpression | null,\r\n range: Range\r\n ): BreakStatement {\r\n var stmt = new BreakStatement();\r\n stmt.range = range;\r\n stmt.label = label;\r\n return stmt;\r\n }\r\n\r\n static createClassDeclaration(\r\n identifier: IdentifierExpression,\r\n typeParameters: TypeParameterNode[] | null,\r\n extendsType: TypeNode | null, // can't be a function\r\n implementsTypes: TypeNode[] | null, // can't be functions\r\n members: DeclarationStatement[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): ClassDeclaration {\r\n var stmt = new ClassDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = identifier;\r\n stmt.typeParameters = typeParameters;\r\n stmt.extendsType = extendsType;\r\n stmt.implementsTypes = implementsTypes;\r\n stmt.members = members;\r\n stmt.decorators = decorators;\r\n return stmt;\r\n }\r\n\r\n static createContinueStatement(\r\n label: IdentifierExpression | null,\r\n range: Range\r\n ): ContinueStatement {\r\n var stmt = new ContinueStatement();\r\n stmt.range = range;\r\n stmt.label = label;\r\n return stmt;\r\n }\r\n\r\n static createDoStatement(\r\n statement: Statement,\r\n condition: Expression,\r\n range: Range\r\n ): DoStatement {\r\n var stmt = new DoStatement();\r\n stmt.range = range;\r\n stmt.statement = statement;\r\n stmt.condition = condition;\r\n return stmt;\r\n }\r\n\r\n static createEmptyStatement(\r\n range: Range\r\n ): EmptyStatement {\r\n var stmt = new EmptyStatement();\r\n stmt.range = range;\r\n return stmt;\r\n }\r\n\r\n static createEnumDeclaration(\r\n name: IdentifierExpression,\r\n members: EnumValueDeclaration[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): EnumDeclaration {\r\n var stmt = new EnumDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name;\r\n stmt.values = members;\r\n stmt.decorators = decorators;\r\n return stmt;\r\n }\r\n\r\n static createEnumValueDeclaration(\r\n name: IdentifierExpression,\r\n value: Expression | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): EnumValueDeclaration {\r\n var stmt = new EnumValueDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name;\r\n stmt.value = value;\r\n return stmt;\r\n }\r\n\r\n static createExportStatement(\r\n members: ExportMember[] | null,\r\n path: StringLiteralExpression | null,\r\n isDeclare: bool,\r\n range: Range\r\n ): ExportStatement {\r\n var stmt = new ExportStatement();\r\n stmt.range = range;\r\n stmt.members = members;\r\n stmt.path = path;\r\n if (path) {\r\n let normalizedPath = normalizePath(path.value);\r\n if (path.value.startsWith(\".\")) { // relative\r\n stmt.normalizedPath = resolvePath(\r\n normalizedPath,\r\n range.source.normalizedPath\r\n );\r\n } else { // absolute\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n } else {\r\n stmt.normalizedPath = null;\r\n stmt.internalPath = null;\r\n }\r\n stmt.isDeclare = isDeclare;\r\n return stmt;\r\n }\r\n\r\n static createExportImportStatement(\r\n name: IdentifierExpression,\r\n externalName: IdentifierExpression,\r\n range: Range\r\n ): ExportImportStatement {\r\n var stmt = new ExportImportStatement();\r\n stmt.range = range;\r\n stmt.name = name;\r\n stmt.externalName = externalName;\r\n return stmt;\r\n }\r\n\r\n static createExportMember(\r\n name: IdentifierExpression,\r\n externalName: IdentifierExpression | null,\r\n range: Range\r\n ): ExportMember {\r\n var elem = new ExportMember();\r\n elem.range = range;\r\n elem.localName = name;\r\n if (!externalName) externalName = name;\r\n elem.exportedName = externalName;\r\n return elem;\r\n }\r\n\r\n static createExpressionStatement(\r\n expression: Expression\r\n ): ExpressionStatement {\r\n var stmt = new ExpressionStatement();\r\n stmt.range = expression.range;\r\n stmt.expression = expression;\r\n return stmt;\r\n }\r\n\r\n static createIfStatement(\r\n condition: Expression,\r\n ifTrue: Statement,\r\n ifFalse: Statement | null,\r\n range: Range\r\n ): IfStatement {\r\n var stmt = new IfStatement();\r\n stmt.range = range;\r\n stmt.condition = condition;\r\n stmt.ifTrue = ifTrue;\r\n stmt.ifFalse = ifFalse;\r\n return stmt;\r\n }\r\n\r\n static createImportStatement(\r\n decls: ImportDeclaration[] | null,\r\n path: StringLiteralExpression,\r\n range: Range\r\n ): ImportStatement {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = decls;\r\n stmt.namespaceName = null;\r\n stmt.path = path;\r\n var normalizedPath = normalizePath(path.value);\r\n if (path.value.startsWith(\".\")) { // relative in project\r\n stmt.normalizedPath = resolvePath(\r\n normalizedPath,\r\n range.source.normalizedPath\r\n );\r\n } else { // absolute in library\r\n if (!normalizedPath.startsWith(LIBRARY_PREFIX)) {\r\n normalizedPath = LIBRARY_PREFIX + normalizedPath;\r\n }\r\n stmt.normalizedPath = normalizedPath;\r\n }\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n }\r\n\r\n static createImportStatementWithWildcard(\r\n identifier: IdentifierExpression,\r\n path: StringLiteralExpression,\r\n range: Range\r\n ): ImportStatement {\r\n var stmt = new ImportStatement();\r\n stmt.range = range;\r\n stmt.declarations = null;\r\n stmt.namespaceName = identifier;\r\n stmt.path = path;\r\n stmt.normalizedPath = resolvePath(\r\n normalizePath(path.value),\r\n range.source.normalizedPath\r\n );\r\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\r\n return stmt;\r\n }\r\n\r\n static createImportDeclaration(\r\n foreignName: IdentifierExpression,\r\n name: IdentifierExpression | null,\r\n range: Range\r\n ): ImportDeclaration {\r\n var elem = new ImportDeclaration();\r\n elem.range = range;\r\n elem.foreignName = foreignName;\r\n if (!name) name = foreignName;\r\n elem.name = name;\r\n return elem;\r\n }\r\n\r\n static createInterfaceDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameterNode[] | null,\r\n extendsType: TypeNode | null, // can't be a function\r\n members: DeclarationStatement[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): InterfaceDeclaration {\r\n var stmt = new InterfaceDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name;\r\n stmt.typeParameters = typeParameters;\r\n stmt.extendsType = extendsType;\r\n stmt.members = members;\r\n stmt.decorators = decorators;\r\n return stmt;\r\n }\r\n\r\n static createFieldDeclaration(\r\n name: IdentifierExpression,\r\n type: CommonTypeNode | null,\r\n initializer: Expression | null,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): FieldDeclaration {\r\n var stmt = new FieldDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name;\r\n stmt.type = type;\r\n stmt.initializer = initializer;\r\n stmt.decorators = decorators;\r\n return stmt;\r\n }\r\n\r\n static createForStatement(\r\n initializer: Statement | null,\r\n condition: Expression | null,\r\n incrementor: Expression | null,\r\n statement: Statement,\r\n range: Range\r\n ): ForStatement {\r\n var stmt = new ForStatement();\r\n stmt.range = range;\r\n stmt.initializer = initializer;\r\n stmt.condition = condition;\r\n stmt.incrementor = incrementor;\r\n stmt.statement = statement;\r\n return stmt;\r\n }\r\n\r\n static createFunctionDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameterNode[] | null,\r\n signature: SignatureNode,\r\n body: Statement | null,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): FunctionDeclaration {\r\n var stmt = new FunctionDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name;\r\n stmt.typeParameters = typeParameters;\r\n stmt.signature = signature;\r\n stmt.body = body;\r\n stmt.decorators = decorators;\r\n return stmt;\r\n }\r\n\r\n static createIndexSignatureDeclaration(\r\n keyType: TypeNode,\r\n valueType: CommonTypeNode,\r\n range: Range\r\n ): IndexSignatureDeclaration {\r\n var elem = new IndexSignatureDeclaration();\r\n elem.range = range;\r\n elem.keyType = keyType;\r\n elem.valueType = valueType;\r\n return elem;\r\n }\r\n\r\n static createMethodDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameterNode[] | null,\r\n signature: SignatureNode,\r\n body: Statement | null,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): MethodDeclaration {\r\n var stmt = new MethodDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name;\r\n stmt.typeParameters = typeParameters;\r\n stmt.signature = signature;\r\n stmt.body = body;\r\n stmt.decorators = decorators;\r\n return stmt;\r\n }\r\n\r\n static createNamespaceDeclaration(\r\n name: IdentifierExpression,\r\n members: Statement[],\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): NamespaceDeclaration {\r\n var stmt = new NamespaceDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name;\r\n stmt.members = members;\r\n stmt.decorators = decorators;\r\n return stmt;\r\n }\r\n\r\n static createReturnStatement(\r\n value: Expression | null,\r\n range: Range\r\n ): ReturnStatement {\r\n var stmt = new ReturnStatement();\r\n stmt.range = range;\r\n stmt.value = value;\r\n return stmt;\r\n }\r\n\r\n static createSwitchStatement(\r\n condition: Expression,\r\n cases: SwitchCase[],\r\n range: Range\r\n ): SwitchStatement {\r\n var stmt = new SwitchStatement();\r\n stmt.range = range;\r\n stmt.condition = condition;\r\n stmt.cases = cases;\r\n return stmt;\r\n }\r\n\r\n static createSwitchCase(\r\n label: Expression | null,\r\n statements: Statement[],\r\n range: Range\r\n ): SwitchCase {\r\n var elem = new SwitchCase();\r\n elem.range = range;\r\n elem.label = label;\r\n elem.statements = statements;\r\n return elem;\r\n }\r\n\r\n static createThrowStatement(\r\n value: Expression,\r\n range: Range\r\n ): ThrowStatement {\r\n var stmt = new ThrowStatement();\r\n stmt.range = range;\r\n stmt.value = value;\r\n return stmt;\r\n }\r\n\r\n static createTryStatement(\r\n statements: Statement[],\r\n catchVariable: IdentifierExpression | null,\r\n catchStatements: Statement[] | null,\r\n finallyStatements: Statement[] | null,\r\n range: Range\r\n ): TryStatement {\r\n var stmt = new TryStatement();\r\n stmt.range = range;\r\n stmt.statements = statements;\r\n stmt.catchVariable = catchVariable;\r\n stmt.catchStatements = catchStatements;\r\n stmt.finallyStatements = finallyStatements;\r\n return stmt;\r\n }\r\n\r\n static createTypeDeclaration(\r\n name: IdentifierExpression,\r\n typeParameters: TypeParameterNode[] | null,\r\n alias: CommonTypeNode,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): TypeDeclaration {\r\n var stmt = new TypeDeclaration();\r\n stmt.range = range;\r\n stmt.flags = flags;\r\n stmt.name = name;\r\n stmt.typeParameters = typeParameters;\r\n stmt.type = alias;\r\n stmt.decorators = decorators;\r\n return stmt;\r\n }\r\n\r\n static createVariableStatement(\r\n declarations: VariableDeclaration[],\r\n decorators: DecoratorNode[] | null,\r\n range: Range\r\n ): VariableStatement {\r\n var stmt = new VariableStatement();\r\n stmt.range = range;\r\n stmt.declarations = declarations;\r\n stmt.decorators = decorators;\r\n return stmt;\r\n }\r\n\r\n static createVariableDeclaration(\r\n name: IdentifierExpression,\r\n type: CommonTypeNode | null,\r\n initializer: Expression | null,\r\n decorators: DecoratorNode[] | null,\r\n flags: CommonFlags,\r\n range: Range\r\n ): VariableDeclaration {\r\n var elem = new VariableDeclaration();\r\n elem.range = range;\r\n elem.flags = flags;\r\n elem.name = name;\r\n elem.type = type;\r\n elem.initializer = initializer;\r\n elem.decorators = decorators; // inherited\r\n return elem;\r\n }\r\n\r\n static createVoidStatement(\r\n expression: Expression,\r\n range: Range\r\n ): VoidStatement {\r\n var stmt = new VoidStatement();\r\n stmt.range = range;\r\n stmt.expression = expression;\r\n return stmt;\r\n }\r\n\r\n static createWhileStatement(\r\n condition: Expression,\r\n statement: Statement,\r\n range: Range\r\n ): WhileStatement {\r\n var stmt = new WhileStatement();\r\n stmt.range = range;\r\n stmt.condition = condition;\r\n stmt.statement = statement;\r\n return stmt;\r\n }\r\n}\r\n\r\n// types\r\n\r\nexport abstract class CommonTypeNode extends Node {\r\n // kind varies\r\n\r\n /** Whether nullable or not. */\r\n isNullable: bool;\r\n}\r\n\r\n/** Represents a type name. */\r\nexport class TypeName extends Node {\r\n kind = NodeKind.TYPENAME;\r\n\r\n /** Identifier of this part. */\r\n identifier: IdentifierExpression;\r\n /** Next part of the type name or `null` if this is the last part. */\r\n next: TypeName | null;\r\n}\r\n\r\n/** Represents a type annotation. */\r\nexport class TypeNode extends CommonTypeNode {\r\n kind = NodeKind.TYPE;\r\n\r\n /** Type name. */\r\n name: TypeName;\r\n /** Type argument references. */\r\n typeArguments: CommonTypeNode[] | null;\r\n}\r\n\r\n/** Represents a type parameter. */\r\nexport class TypeParameterNode extends Node {\r\n kind = NodeKind.TYPEPARAMETER;\r\n\r\n /** Identifier reference. */\r\n name: IdentifierExpression;\r\n /** Extended type reference, if any. */\r\n extendsType: TypeNode | null; // can't be a function\r\n /** Default type if omitted, if any. */\r\n defaultType: TypeNode | null; // can't be a function\r\n}\r\n\r\n/** Represents the kind of a parameter. */\r\nexport enum ParameterKind {\r\n /** No specific flags. */\r\n DEFAULT,\r\n /** Is an optional parameter. */\r\n OPTIONAL,\r\n /** Is a rest parameter. */\r\n REST\r\n}\r\n\r\n/** Represents a function parameter. */\r\nexport class ParameterNode extends Node {\r\n kind = NodeKind.PARAMETER;\r\n\r\n /** Parameter kind. */\r\n parameterKind: ParameterKind;\r\n /** Parameter name. */\r\n name: IdentifierExpression;\r\n /** Parameter type. */\r\n type: CommonTypeNode;\r\n /** Initializer expression, if present. */\r\n initializer: Expression | null;\r\n /** Implicit field declaration, if applicable. */\r\n implicitFieldDeclaration: FieldDeclaration | null = null;\r\n /** Common flags indicating specific traits. */\r\n flags: CommonFlags = CommonFlags.NONE;\r\n\r\n /** Tests if this node has the specified flag or flags. */\r\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\r\n /** Tests if this node has one of the specified flags. */\r\n isAny(flag: CommonFlags): bool { return (this.flags & flag) != 0; }\r\n /** Sets a specific flag or flags. */\r\n set(flag: CommonFlags): void { this.flags |= flag; }\r\n}\r\n\r\n/** Represents a function signature. */\r\nexport class SignatureNode extends CommonTypeNode {\r\n kind = NodeKind.SIGNATURE;\r\n\r\n /** Accepted parameters. */\r\n parameters: ParameterNode[];\r\n /** Return type. */\r\n returnType: CommonTypeNode;\r\n /** Explicitly provided this type, if any. */\r\n explicitThisType: TypeNode | null; // can't be a function\r\n}\r\n\r\n// special\r\n\r\n/** Built-in decorator kinds. */\r\nexport enum DecoratorKind {\r\n CUSTOM,\r\n GLOBAL,\r\n OPERATOR,\r\n OPERATOR_BINARY,\r\n OPERATOR_PREFIX,\r\n OPERATOR_POSTFIX,\r\n UNMANAGED,\r\n SEALED,\r\n INLINE,\r\n EXTERNAL,\r\n BUILTIN,\r\n LAZY,\r\n START\r\n}\r\n\r\n/** Returns the kind of the specified decorator. Defaults to {@link DecoratorKind.CUSTOM}. */\r\nexport function decoratorNameToKind(name: Expression): DecoratorKind {\r\n // @global, @inline, @operator, @sealed, @unmanaged\r\n if (name.kind == NodeKind.IDENTIFIER) {\r\n let nameStr = (name).text;\r\n assert(nameStr.length);\r\n switch (nameStr.charCodeAt(0)) {\r\n case CharCode.b: {\r\n if (nameStr == \"builtin\") return DecoratorKind.BUILTIN;\r\n break;\r\n }\r\n case CharCode.e: {\r\n if (nameStr == \"external\") return DecoratorKind.EXTERNAL;\r\n break;\r\n }\r\n case CharCode.g: {\r\n if (nameStr == \"global\") return DecoratorKind.GLOBAL;\r\n break;\r\n }\r\n case CharCode.i: {\r\n if (nameStr == \"inline\") return DecoratorKind.INLINE;\r\n break;\r\n }\r\n case CharCode.l: {\r\n if (nameStr == \"lazy\") return DecoratorKind.LAZY;\r\n break;\r\n }\r\n case CharCode.o: {\r\n if (nameStr == \"operator\") return DecoratorKind.OPERATOR;\r\n break;\r\n }\r\n case CharCode.s: {\r\n if (nameStr == \"sealed\") return DecoratorKind.SEALED;\r\n if (nameStr == \"start\") return DecoratorKind.START;\r\n break;\r\n }\r\n case CharCode.u: {\r\n if (nameStr == \"unmanaged\") return DecoratorKind.UNMANAGED;\r\n break;\r\n }\r\n }\r\n } else if (\r\n name.kind == NodeKind.PROPERTYACCESS &&\r\n (name).expression.kind == NodeKind.IDENTIFIER\r\n ) {\r\n let nameStr = ((name).expression).text;\r\n assert(nameStr.length);\r\n let propStr = (name).property.text;\r\n assert(propStr.length);\r\n // @operator.binary, @operator.prefix, @operator.postfix\r\n if (nameStr == \"operator\") {\r\n switch (propStr.charCodeAt(0)) {\r\n case CharCode.b: {\r\n if (propStr == \"binary\") return DecoratorKind.OPERATOR_BINARY;\r\n break;\r\n }\r\n case CharCode.p: {\r\n switch (propStr) {\r\n case \"prefix\": return DecoratorKind.OPERATOR_PREFIX;\r\n case \"postfix\": return DecoratorKind.OPERATOR_POSTFIX;\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return DecoratorKind.CUSTOM;\r\n}\r\n\r\n/** Represents a decorator. */\r\nexport class DecoratorNode extends Node {\r\n kind = NodeKind.DECORATOR;\r\n\r\n /** Built-in kind, if applicable. */\r\n decoratorKind: DecoratorKind;\r\n /** Name expression. */\r\n name: Expression;\r\n /** Argument expressions. */\r\n arguments: Expression[] | null;\r\n}\r\n\r\n/** Comment kinds. */\r\nexport enum CommentKind {\r\n /** Line comment. */\r\n LINE,\r\n /** Triple-slash comment. */\r\n TRIPLE,\r\n /** Block comment. */\r\n BLOCK\r\n}\r\n\r\n/** Represents a comment. */\r\nexport class CommentNode extends Node {\r\n kind = NodeKind.COMMENT;\r\n\r\n /** Comment kind. */\r\n commentKind: CommentKind;\r\n /** Comment text. */\r\n text: string;\r\n}\r\n\r\n// expressions\r\n\r\n/** Base class of all expression nodes. */\r\nexport abstract class Expression extends Node { }\r\n\r\n/** Represents an identifier expression. */\r\nexport class IdentifierExpression extends Expression {\r\n kind = NodeKind.IDENTIFIER;\r\n\r\n /** Textual name. */\r\n text: string;\r\n /** Symbol. */\r\n symbol: string; // TODO: symbol\r\n /** Whether quoted or not. */\r\n isQuoted: bool;\r\n}\r\n\r\n/** Indicates the kind of a literal. */\r\nexport enum LiteralKind {\r\n FLOAT,\r\n INTEGER,\r\n STRING,\r\n REGEXP,\r\n ARRAY,\r\n OBJECT\r\n}\r\n\r\n/** Base class of all literal expressions. */\r\nexport abstract class LiteralExpression extends Expression {\r\n kind = NodeKind.LITERAL;\r\n\r\n /** Specific literal kind. */\r\n literalKind: LiteralKind;\r\n}\r\n\r\n/** Represents an `[]` literal expression. */\r\nexport class ArrayLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.ARRAY;\r\n\r\n /** Nested element expressions. */\r\n elementExpressions: (Expression | null)[];\r\n}\r\n\r\n/** Indicates the kind of an assertion. */\r\nexport enum AssertionKind {\r\n PREFIX,\r\n AS,\r\n NONNULL\r\n}\r\n\r\n/** Represents an assertion expression. */\r\nexport class AssertionExpression extends Expression {\r\n kind = NodeKind.ASSERTION;\r\n\r\n /** Specific kind of this assertion. */\r\n assertionKind: AssertionKind;\r\n /** Expression being asserted. */\r\n expression: Expression;\r\n /** Target type. */\r\n toType: CommonTypeNode | null;\r\n}\r\n\r\n/** Represents a binary expression. */\r\nexport class BinaryExpression extends Expression {\r\n kind = NodeKind.BINARY;\r\n\r\n /** Operator token. */\r\n operator: Token;\r\n /** Left-hand side expression */\r\n left: Expression;\r\n /** Right-hand side expression. */\r\n right: Expression;\r\n}\r\n\r\n/** Represents a call expression. */\r\nexport class CallExpression extends Expression {\r\n kind = NodeKind.CALL;\r\n\r\n /** Called expression. Usually an identifier or property access expression. */\r\n expression: Expression;\r\n /** Provided type arguments. */\r\n typeArguments: CommonTypeNode[] | null;\r\n /** Provided arguments. */\r\n arguments: Expression[];\r\n}\r\n\r\n/** Represents a class expression using the 'class' keyword. */\r\nexport class ClassExpression extends Expression {\r\n kind = NodeKind.CLASS;\r\n\r\n /** Inline class declaration. */\r\n declaration: ClassDeclaration;\r\n}\r\n\r\n/** Represents a comma expression composed of multiple expressions. */\r\nexport class CommaExpression extends Expression {\r\n kind = NodeKind.COMMA;\r\n\r\n /** Sequential expressions. */\r\n expressions: Expression[];\r\n}\r\n\r\n/** Represents a `constructor` expression. */\r\nexport class ConstructorExpression extends IdentifierExpression {\r\n kind = NodeKind.CONSTRUCTOR;\r\n text = \"constructor\";\r\n symbol = CommonSymbols.constructor;\r\n}\r\n\r\n/** Represents an element access expression, e.g., array access. */\r\nexport class ElementAccessExpression extends Expression {\r\n kind = NodeKind.ELEMENTACCESS;\r\n\r\n /** Expression being accessed. */\r\n expression: Expression;\r\n /** Element of the expression being accessed. */\r\n elementExpression: Expression;\r\n}\r\n\r\n/** Represents a float literal expression. */\r\nexport class FloatLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.FLOAT;\r\n\r\n /** Float value. */\r\n value: f64;\r\n}\r\n\r\n/** Represents a function expression using the 'function' keyword. */\r\nexport class FunctionExpression extends Expression {\r\n kind = NodeKind.FUNCTION;\r\n\r\n /** Inline function declaration. */\r\n declaration: FunctionDeclaration;\r\n}\r\n\r\n/** Represents an `instanceof` expression. */\r\nexport class InstanceOfExpression extends Expression {\r\n kind = NodeKind.INSTANCEOF;\r\n\r\n /** Expression being asserted. */\r\n expression: Expression;\r\n /** Type to test for. */\r\n isType: CommonTypeNode;\r\n}\r\n\r\n/** Represents an integer literal expression. */\r\nexport class IntegerLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.INTEGER;\r\n\r\n /** Integer value. */\r\n value: I64;\r\n}\r\n\r\n/** Represents a `new` expression. Like a call but with its own kind. */\r\nexport class NewExpression extends CallExpression {\r\n kind = NodeKind.NEW;\r\n}\r\n\r\n/** Represents a `null` expression. */\r\nexport class NullExpression extends IdentifierExpression {\r\n kind = NodeKind.NULL;\r\n text = \"null\";\r\n symbol = CommonSymbols.null_;\r\n}\r\n\r\n/** Represents an object literal expression. */\r\nexport class ObjectLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.OBJECT;\r\n\r\n /** Field names. */\r\n names: IdentifierExpression[];\r\n /** Field values. */\r\n values: Expression[];\r\n}\r\n\r\n/** Represents a parenthesized expression. */\r\nexport class ParenthesizedExpression extends Expression {\r\n kind = NodeKind.PARENTHESIZED;\r\n\r\n /** Expression in parenthesis. */\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a property access expression. */\r\nexport class PropertyAccessExpression extends Expression {\r\n kind = NodeKind.PROPERTYACCESS;\r\n\r\n /** Expression being accessed. */\r\n expression: Expression;\r\n /** Property of the expression being accessed. */\r\n property: IdentifierExpression;\r\n}\r\n\r\n/** Represents a regular expression literal expression. */\r\nexport class RegexpLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.REGEXP;\r\n\r\n /** Regular expression pattern. */\r\n pattern: string;\r\n /** Regular expression flags. */\r\n patternFlags: string;\r\n}\r\n\r\n/** Represents a ternary expression, i.e., short if notation. */\r\nexport class TernaryExpression extends Expression {\r\n kind = NodeKind.TERNARY;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Expression executed when condition is `true`. */\r\n ifThen: Expression;\r\n /** Expression executed when condition is `false`. */\r\n ifElse: Expression;\r\n}\r\n\r\n/** Represents a string literal expression. */\r\nexport class StringLiteralExpression extends LiteralExpression {\r\n literalKind = LiteralKind.STRING;\r\n\r\n /** String value without quotes. */\r\n value: string;\r\n}\r\n\r\n/** Represents a `super` expression. */\r\nexport class SuperExpression extends IdentifierExpression {\r\n kind = NodeKind.SUPER;\r\n text = \"super\";\r\n symbol = CommonSymbols.super_;\r\n}\r\n\r\n/** Represents a `this` expression. */\r\nexport class ThisExpression extends IdentifierExpression {\r\n kind = NodeKind.THIS;\r\n text = \"this\";\r\n symbol = CommonSymbols.this_;\r\n}\r\n\r\n/** Represents a `true` expression. */\r\nexport class TrueExpression extends IdentifierExpression {\r\n kind = NodeKind.TRUE;\r\n text = \"true\";\r\n symbol = CommonSymbols.true_;\r\n}\r\n\r\n/** Represents a `false` expression. */\r\nexport class FalseExpression extends IdentifierExpression {\r\n kind = NodeKind.FALSE;\r\n text = \"false\";\r\n symbol = CommonSymbols.false_;\r\n}\r\n\r\n/** Base class of all unary expressions. */\r\nexport abstract class UnaryExpression extends Expression {\r\n\r\n /** Operator token. */\r\n operator: Token;\r\n /** Operand expression. */\r\n operand: Expression;\r\n}\r\n\r\n/** Represents a unary postfix expression, e.g. a postfix increment. */\r\nexport class UnaryPostfixExpression extends UnaryExpression {\r\n kind = NodeKind.UNARYPOSTFIX;\r\n}\r\n\r\n/** Represents a unary prefix expression, e.g. a negation. */\r\nexport class UnaryPrefixExpression extends UnaryExpression {\r\n kind = NodeKind.UNARYPREFIX;\r\n}\r\n\r\n// statements\r\n\r\n/** Base class of all statement nodes. */\r\nexport abstract class Statement extends Node { }\r\n\r\n/** Indicates the specific kind of a source. */\r\nexport enum SourceKind {\r\n /** Default source. Usually imported from an entry file. */\r\n DEFAULT,\r\n /** Entry file. */\r\n ENTRY,\r\n /** Library file. */\r\n LIBRARY\r\n}\r\n\r\n/** A top-level source node. */\r\nexport class Source extends Node {\r\n kind = NodeKind.SOURCE;\r\n parent = null;\r\n\r\n /** Source kind. */\r\n sourceKind: SourceKind;\r\n /** Normalized path. */\r\n normalizedPath: string;\r\n /** Path used internally. */\r\n internalPath: string;\r\n /** Simple path (last part without extension). */\r\n simplePath: string;\r\n /** Contained statements. */\r\n statements: Statement[];\r\n /** Full source text. */\r\n text: string;\r\n /** Tokenizer reference. */\r\n tokenizer: Tokenizer | null = null;\r\n /** Source map index. */\r\n debugInfoIndex: i32 = -1;\r\n /** Re-exported sources. */\r\n exportPaths: Set | null = null;\r\n\r\n /** Constructs a new source node. */\r\n constructor(normalizedPath: string, text: string, kind: SourceKind) {\r\n super();\r\n this.sourceKind = kind;\r\n this.normalizedPath = normalizedPath;\r\n var internalPath = mangleInternalPath(this.normalizedPath);\r\n this.internalPath = internalPath;\r\n var pos = internalPath.lastIndexOf(PATH_DELIMITER);\r\n this.simplePath = pos >= 0 ? internalPath.substring(pos + 1) : internalPath;\r\n this.statements = new Array();\r\n this.range = new Range(this, 0, text.length);\r\n this.text = text;\r\n }\r\n\r\n /** Tests if this source is an entry file. */\r\n get isEntry(): bool { return this.sourceKind == SourceKind.ENTRY; }\r\n /** Tests if this source is a stdlib file. */\r\n get isLibrary(): bool { return this.sourceKind == SourceKind.LIBRARY; }\r\n}\r\n\r\n/** Base class of all declaration statements. */\r\nexport abstract class DeclarationStatement extends Statement {\r\n /** Simple name being declared. */\r\n name: IdentifierExpression;\r\n /** Array of decorators. */\r\n decorators: DecoratorNode[] | null = null;\r\n /** Common flags indicating specific traits. */\r\n flags: CommonFlags = CommonFlags.NONE;\r\n\r\n /** Tests if this node has the specified flag or flags. */\r\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\r\n /** Tests if this node has one of the specified flags. */\r\n isAny(flag: CommonFlags): bool { return (this.flags & flag) != 0; }\r\n /** Sets a specific flag or flags. */\r\n set(flag: CommonFlags): void { this.flags |= flag; }\r\n}\r\n\r\n/** Represents an index signature declaration. */\r\nexport class IndexSignatureDeclaration extends DeclarationStatement {\r\n kind = NodeKind.INDEXSIGNATUREDECLARATION;\r\n\r\n /** Key type. */\r\n keyType: TypeNode;\r\n /** Value type. */\r\n valueType: CommonTypeNode;\r\n}\r\n\r\n/** Base class of all variable-like declaration statements. */\r\nexport abstract class VariableLikeDeclarationStatement extends DeclarationStatement {\r\n\r\n /** Variable type. */\r\n type: CommonTypeNode | null;\r\n /** Variable initializer. */\r\n initializer: Expression | null;\r\n}\r\n\r\n/** Represents a block statement. */\r\nexport class BlockStatement extends Statement {\r\n kind = NodeKind.BLOCK;\r\n\r\n /** Contained statements. */\r\n statements: Statement[];\r\n}\r\n\r\n/** Represents a `break` statement. */\r\nexport class BreakStatement extends Statement {\r\n kind = NodeKind.BREAK;\r\n\r\n /** Target label, if applicable. */\r\n label: IdentifierExpression | null;\r\n}\r\n\r\n/** Represents a `class` declaration. */\r\nexport class ClassDeclaration extends DeclarationStatement {\r\n kind = NodeKind.CLASSDECLARATION;\r\n\r\n /** Accepted type parameters. */\r\n typeParameters: TypeParameterNode[] | null;\r\n /** Base class type being extended, if any. */\r\n extendsType: TypeNode | null; // can't be a function\r\n /** Interface types being implemented, if any. */\r\n implementsTypes: TypeNode[] | null; // can't be functions\r\n /** Class member declarations. */\r\n members: DeclarationStatement[];\r\n\r\n get isGeneric(): bool {\r\n var typeParameters = this.typeParameters;\r\n return typeParameters != null && typeParameters.length > 0;\r\n }\r\n}\r\n\r\n/** Represents a `continue` statement. */\r\nexport class ContinueStatement extends Statement {\r\n kind = NodeKind.CONTINUE;\r\n\r\n /** Target label, if applicable. */\r\n label: IdentifierExpression | null;\r\n}\r\n\r\n/** Represents a `do` statement. */\r\nexport class DoStatement extends Statement {\r\n kind = NodeKind.DO;\r\n\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n /** Condition when to repeat. */\r\n condition: Expression;\r\n}\r\n\r\n/** Represents an empty statement, i.e., a semicolon terminating nothing. */\r\nexport class EmptyStatement extends Statement {\r\n kind = NodeKind.EMPTY;\r\n}\r\n\r\n/** Represents an `enum` declaration. */\r\nexport class EnumDeclaration extends DeclarationStatement {\r\n kind = NodeKind.ENUMDECLARATION;\r\n\r\n /** Enum value declarations. */\r\n values: EnumValueDeclaration[];\r\n}\r\n\r\n/** Represents a value of an `enum` declaration. */\r\nexport class EnumValueDeclaration extends VariableLikeDeclarationStatement {\r\n kind = NodeKind.ENUMVALUEDECLARATION;\r\n // name is inherited\r\n\r\n /** Value expression. */\r\n value: Expression | null;\r\n}\r\n\r\n/** Represents an `export import` statement of an interface. */\r\nexport class ExportImportStatement extends Node {\r\n kind = NodeKind.EXPORTIMPORT;\r\n\r\n /** Identifier being imported. */\r\n name: IdentifierExpression;\r\n /** Identifier being exported. */\r\n externalName: IdentifierExpression;\r\n}\r\n\r\n/** Represents a member of an `export` statement. */\r\nexport class ExportMember extends Node {\r\n kind = NodeKind.EXPORTMEMBER;\r\n\r\n /** Local identifier. */\r\n localName: IdentifierExpression;\r\n /** Exported identifier. */\r\n exportedName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `export` statement. */\r\nexport class ExportStatement extends Statement {\r\n kind = NodeKind.EXPORT;\r\n\r\n /** Array of members if a set of named exports, or `null` if a file export. */\r\n members: ExportMember[] | null;\r\n /** Path being exported from, if applicable. */\r\n path: StringLiteralExpression | null;\r\n /** Normalized path, if `path` is set. */\r\n normalizedPath: string | null;\r\n /** Mangled internal path being referenced, if `path` is set. */\r\n internalPath: string | null;\r\n /** Whether this is a declared export. */\r\n isDeclare: bool;\r\n}\r\n\r\n/** Represents an expression that is used as a statement. */\r\nexport class ExpressionStatement extends Statement {\r\n kind = NodeKind.EXPRESSION;\r\n\r\n /** Expression being used as a statement.*/\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a field declaration within a `class`. */\r\nexport class FieldDeclaration extends VariableLikeDeclarationStatement {\r\n kind = NodeKind.FIELDDECLARATION;\r\n\r\n /** Parameter index if declared as a constructor parameter, otherwise `-1`. */\r\n parameterIndex: i32 = -1;\r\n}\r\n\r\n/** Represents a `for` statement. */\r\nexport class ForStatement extends Statement {\r\n kind = NodeKind.FOR;\r\n\r\n /**\r\n * Initializer statement, if present.\r\n * Either a {@link VariableStatement} or {@link ExpressionStatement}.\r\n */\r\n initializer: Statement | null;\r\n /** Condition expression, if present. */\r\n condition: Expression | null;\r\n /** Incrementor expression, if present. */\r\n incrementor: Expression | null;\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n}\r\n\r\n/** Represents a `function` declaration. */\r\nexport class FunctionDeclaration extends DeclarationStatement {\r\n kind = NodeKind.FUNCTIONDECLARATION;\r\n\r\n /** Type parameters, if any. */\r\n typeParameters: TypeParameterNode[] | null;\r\n /** Function signature. */\r\n signature: SignatureNode;\r\n /** Body statement. Usually a block. */\r\n body: Statement | null;\r\n\r\n get isGeneric(): bool {\r\n var typeParameters = this.typeParameters;\r\n return typeParameters != null && typeParameters.length > 0;\r\n }\r\n\r\n /** Clones this function declaration. */\r\n clone(): FunctionDeclaration {\r\n return Node.createFunctionDeclaration(\r\n this.name, this.typeParameters, this.signature, this.body, this.decorators, this.flags, this.range\r\n );\r\n }\r\n}\r\n\r\n/** Represents an `if` statement. */\r\nexport class IfStatement extends Statement {\r\n kind = NodeKind.IF;\r\n\r\n /** Condition. */\r\n condition: Expression;\r\n /** Statement executed when condition is `true`. */\r\n ifTrue: Statement;\r\n /** Statement executed when condition is `false`. */\r\n ifFalse: Statement | null;\r\n}\r\n\r\n/** Represents an `import` declaration part of an {@link ImportStatement}. */\r\nexport class ImportDeclaration extends DeclarationStatement {\r\n kind = NodeKind.IMPORTDECLARATION;\r\n\r\n /** Identifier being imported. */\r\n foreignName: IdentifierExpression;\r\n}\r\n\r\n/** Represents an `import` statement. */\r\nexport class ImportStatement extends Statement {\r\n kind = NodeKind.IMPORT;\r\n\r\n /** Array of member declarations or `null` if an asterisk import. */\r\n declarations: ImportDeclaration[] | null;\r\n /** Name of the local namespace, if an asterisk import. */\r\n namespaceName: IdentifierExpression | null;\r\n /** Path being imported from. */\r\n path: StringLiteralExpression;\r\n /** Normalized path. */\r\n normalizedPath: string;\r\n /** Mangled internal path being referenced. */\r\n internalPath: string;\r\n}\r\n\r\n/** Represents an `interfarce` declaration. */\r\nexport class InterfaceDeclaration extends ClassDeclaration {\r\n kind = NodeKind.INTERFACEDECLARATION;\r\n}\r\n\r\n/** Represents a method declaration within a `class`. */\r\nexport class MethodDeclaration extends FunctionDeclaration {\r\n kind = NodeKind.METHODDECLARATION;\r\n}\r\n\r\n/** Represents a `namespace` declaration. */\r\nexport class NamespaceDeclaration extends DeclarationStatement {\r\n kind = NodeKind.NAMESPACEDECLARATION;\r\n\r\n /** Array of namespace members. */\r\n members: Statement[];\r\n}\r\n\r\n/** Represents a `return` statement. */\r\nexport class ReturnStatement extends Statement {\r\n kind = NodeKind.RETURN;\r\n\r\n /** Value expression being returned, if present. */\r\n value: Expression | null;\r\n}\r\n\r\n/** Represents a single `case` within a `switch` statement. */\r\nexport class SwitchCase extends Node {\r\n kind = NodeKind.SWITCHCASE;\r\n\r\n /** Label expression. `null` indicates the default case. */\r\n label: Expression | null;\r\n /** Contained statements. */\r\n statements: Statement[];\r\n}\r\n\r\n/** Represents a `switch` statement. */\r\nexport class SwitchStatement extends Statement {\r\n kind = NodeKind.SWITCH;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Contained cases. */\r\n cases: SwitchCase[];\r\n}\r\n\r\n/** Represents a `throw` statement. */\r\nexport class ThrowStatement extends Statement {\r\n kind = NodeKind.THROW;\r\n\r\n /** Value expression being thrown. */\r\n value: Expression;\r\n}\r\n\r\n/** Represents a `try` statement. */\r\nexport class TryStatement extends Statement {\r\n kind = NodeKind.TRY;\r\n\r\n /** Contained statements. */\r\n statements: Statement[];\r\n /** Exception variable name, if a `catch` clause is present. */\r\n catchVariable: IdentifierExpression | null;\r\n /** Statements being executed on catch, if a `catch` clause is present. */\r\n catchStatements: Statement[] | null;\r\n /** Statements being executed afterwards, if a `finally` clause is present. */\r\n finallyStatements: Statement[] | null;\r\n}\r\n\r\n/** Represents a `type` declaration. */\r\nexport class TypeDeclaration extends DeclarationStatement {\r\n kind = NodeKind.TYPEDECLARATION;\r\n\r\n /** Type parameters, if any. */\r\n typeParameters: TypeParameterNode[] | null;\r\n /** Type being aliased. */\r\n type: CommonTypeNode;\r\n}\r\n\r\n/** Represents a variable declaration part of a {@link VariableStatement}. */\r\nexport class VariableDeclaration extends VariableLikeDeclarationStatement {\r\n kind = NodeKind.VARIABLEDECLARATION;\r\n}\r\n\r\n/** Represents a variable statement wrapping {@link VariableDeclaration}s. */\r\nexport class VariableStatement extends Statement {\r\n kind = NodeKind.VARIABLE;\r\n\r\n /** Array of decorators. */\r\n decorators: DecoratorNode[] | null;\r\n /** Array of member declarations. */\r\n declarations: VariableDeclaration[];\r\n}\r\n\r\n/** Represents a void statement dropping an expression's value. */\r\nexport class VoidStatement extends Statement {\r\n kind = NodeKind.VOID;\r\n\r\n /** Expression being dropped. */\r\n expression: Expression;\r\n}\r\n\r\n/** Represents a `while` statement. */\r\nexport class WhileStatement extends Statement {\r\n kind = NodeKind.WHILE;\r\n\r\n /** Condition expression. */\r\n condition: Expression;\r\n /** Statement being looped over. */\r\n statement: Statement;\r\n}\r\n\r\n/** Finds the first decorator matching the specified kind. */\r\nexport function findDecorator(kind: DecoratorKind, decorators: DecoratorNode[] | null): DecoratorNode | null {\r\n if (decorators) {\r\n for (let i = 0, k = decorators.length; i < k; ++i) {\r\n let decorator = decorators[i];\r\n if (decorator.decoratorKind == kind) return decorator;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** Mangles an external to an internal path. */\r\nexport function mangleInternalPath(path: string): string {\r\n if (path.endsWith(\".ts\")) path = path.substring(0, path.length - 3);\r\n return path;\r\n}\r\n","/**\r\n * Mappings from AssemblyScript types to WebAssembly types.\r\n * @module types\r\n *//***/\r\n\r\nimport {\r\n Class,\r\n FunctionTarget,\r\n Program,\r\n DecoratorFlags\r\n} from \"./program\";\r\n\r\nimport {\r\n NativeType,\r\n ExpressionRef,\r\n Module\r\n} from \"./module\";\r\n\r\n/** Indicates the kind of a type. */\r\nexport const enum TypeKind {\r\n\r\n // signed integers\r\n\r\n /** An 8-bit signed integer. */\r\n I8,\r\n /** A 16-bit signed integer. */\r\n I16,\r\n /** A 32-bit signed integer. */\r\n I32,\r\n /** A 64-bit signed integer. */\r\n I64,\r\n /** A 32-bit/64-bit signed integer, depending on the target. */\r\n ISIZE,\r\n\r\n // unsigned integers\r\n\r\n /** An 8-bit unsigned integer. */\r\n U8,\r\n /** A 16-bit unsigned integer. */\r\n U16,\r\n /** A 32-bit unsigned integer. Also the base of function types. */\r\n U32,\r\n /** A 64-bit unsigned integer. */\r\n U64,\r\n /** A 32-bit/64-bit unsigned integer, depending on the target. Also the base of class types. */\r\n USIZE,\r\n /** A 1-bit unsigned integer. */\r\n BOOL, // sic\r\n\r\n // floats\r\n\r\n /** A 32-bit float. */\r\n F32,\r\n /** A 64-bit double. */\r\n F64,\r\n\r\n // vectors\r\n V128,\r\n\r\n // other\r\n\r\n /** No return type. */\r\n VOID\r\n}\r\n\r\n/** Indicates capabilities of a type. */\r\nexport const enum TypeFlags {\r\n NONE = 0,\r\n /** Is a signed type that can represent negative values. */\r\n SIGNED = 1 << 0,\r\n /** Is an unsigned type that cannot represent negative values. */\r\n UNSIGNED = 1 << 1,\r\n /** Is an integer type. */\r\n INTEGER = 1 << 2,\r\n /** Is a floating point type. */\r\n FLOAT = 1 << 3,\r\n /** Is a pointer type. */\r\n POINTER = 1 << 4,\r\n /** Is smaller than 32-bits. */\r\n SHORT = 1 << 5,\r\n /** Is larger than 32-bits. */\r\n LONG = 1 << 6,\r\n /** Is a value type. */\r\n VALUE = 1 << 7,\r\n /** Is a reference type. */\r\n REFERENCE = 1 << 8,\r\n /** Is a nullable type. */\r\n NULLABLE = 1 << 9,\r\n /** Is a vector type. */\r\n VECTOR = 1 << 10\r\n}\r\n\r\nconst v128_zero = new Uint8Array(16);\r\n\r\n/** Represents a resolved type. */\r\nexport class Type {\r\n\r\n /** Type kind. */\r\n kind: TypeKind;\r\n /** Type flags. */\r\n flags: TypeFlags;\r\n /** Size in bits. */\r\n size: u32;\r\n /** Size in bytes. */\r\n byteSize: i32;\r\n /** Underlying class reference, if a class type. */\r\n classReference: Class | null;\r\n /** Underlying signature reference, if a function type. */\r\n signatureReference: Signature | null;\r\n /** Respective non-nullable type, if nullable. */\r\n nonNullableType: Type;\r\n /** Cached nullable type, if non-nullable. */\r\n private cachedNullableType: Type | null = null;\r\n\r\n /** Constructs a new resolved type. */\r\n constructor(kind: TypeKind, flags: TypeFlags, size: u32) {\r\n this.kind = kind;\r\n this.flags = flags;\r\n this.size = size;\r\n this.byteSize = ceil(size / 8);\r\n this.classReference = null;\r\n this.signatureReference = null;\r\n this.nonNullableType = this;\r\n }\r\n\r\n /** Returns the closest int type representing this type. */\r\n get intType(): Type {\r\n switch (this.kind) {\r\n case TypeKind.I8: return Type.i8;\r\n case TypeKind.I16: return Type.i16;\r\n case TypeKind.F32:\r\n case TypeKind.I32: return Type.i32;\r\n case TypeKind.F64:\r\n case TypeKind.I64: return Type.i64;\r\n case TypeKind.ISIZE: return this.size == 64 ? Type.isize64 : Type.isize32;\r\n case TypeKind.U8: return Type.u8;\r\n case TypeKind.U16: return Type.u16;\r\n case TypeKind.U32: return Type.u32;\r\n case TypeKind.U64: return Type.u64;\r\n case TypeKind.USIZE: return this.size == 64 ? Type.usize64 : Type.usize32;\r\n case TypeKind.BOOL:\r\n default: return Type.i32;\r\n }\r\n }\r\n\r\n /** Tests if this is a managed type that needs GC hooks. */\r\n isManaged(program: Program): bool {\r\n if (program.hasGC) {\r\n let classReference = this.classReference;\r\n return classReference !== null && !classReference.hasDecorator(DecoratorFlags.UNMANAGED);\r\n }\r\n return false;\r\n }\r\n\r\n /** Computes the sign-extending shift in the target type. */\r\n computeSmallIntegerShift(targetType: Type): u32 {\r\n return targetType.size - this.size;\r\n }\r\n\r\n /** Computes the truncating mask in the target type. */\r\n computeSmallIntegerMask(targetType: Type): u32 {\r\n var size = this.is(TypeFlags.UNSIGNED) ? this.size : this.size - 1;\r\n return ~0 >>> (targetType.size - size);\r\n }\r\n\r\n /** Tests if this type has (all of) the specified flags. */\r\n is(flags: TypeFlags): bool { return (this.flags & flags) == flags; }\r\n /** Tests if this type has any of the specified flags. */\r\n isAny(flags: TypeFlags): bool { return (this.flags & flags) != 0; }\r\n\r\n /** Composes a class type from this type and a class. */\r\n asClass(classType: Class): Type {\r\n assert(this.kind == TypeKind.USIZE && !this.classReference);\r\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n ret.classReference = classType;\r\n return ret;\r\n }\r\n\r\n /** Composes a function type from this type and a function. */\r\n asFunction(signature: Signature): Type {\r\n assert(this.kind == TypeKind.U32 && !this.signatureReference);\r\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\r\n ret.signatureReference = signature;\r\n return ret;\r\n }\r\n\r\n /** Composes the respective nullable type of this type. */\r\n asNullable(): Type {\r\n assert(this.is(TypeFlags.REFERENCE));\r\n if (!this.cachedNullableType) {\r\n assert(!this.is(TypeFlags.NULLABLE));\r\n this.cachedNullableType = new Type(this.kind, this.flags | TypeFlags.NULLABLE, this.size);\r\n this.cachedNullableType.nonNullableType = this;\r\n this.cachedNullableType.classReference = this.classReference; // either a class reference\r\n this.cachedNullableType.signatureReference = this.signatureReference; // or a function reference\r\n }\r\n return this.cachedNullableType;\r\n }\r\n\r\n /** Tests if a value of this type is assignable to a target of the specified type. */\r\n isAssignableTo(target: Type, signednessIsRelevant: bool = false): bool {\r\n var currentClass: Class | null;\r\n var targetClass: Class | null;\r\n var currentFunction: Signature | null;\r\n var targetFunction: Signature | null;\r\n if (this.is(TypeFlags.REFERENCE)) {\r\n if (target.is(TypeFlags.REFERENCE)) {\r\n if (!this.is(TypeFlags.NULLABLE) || target.is(TypeFlags.NULLABLE)) {\r\n if (currentClass = this.classReference) {\r\n if (targetClass = target.classReference) {\r\n return currentClass.isAssignableTo(targetClass);\r\n }\r\n } else if (currentFunction = this.signatureReference) {\r\n if (targetFunction = target.signatureReference) {\r\n return currentFunction.isAssignableTo(targetFunction);\r\n }\r\n }\r\n }\r\n }\r\n } else if (!target.is(TypeFlags.REFERENCE)) {\r\n if (this.is(TypeFlags.INTEGER)) {\r\n if (target.is(TypeFlags.INTEGER)) {\r\n if (\r\n !signednessIsRelevant ||\r\n this == Type.bool || // a bool (0 or 1) can be safely assigned to all sorts of integers\r\n this.is(TypeFlags.SIGNED) == target.is(TypeFlags.SIGNED)\r\n ) {\r\n return this.size <= target.size;\r\n }\r\n } else if (target.kind == TypeKind.F32) {\r\n return this.size <= 23; // mantissa bits\r\n } else if (target.kind == TypeKind.F64) {\r\n return this.size <= 52; // ^\r\n }\r\n } else if (this.is(TypeFlags.FLOAT)) {\r\n if (target.is(TypeFlags.FLOAT)) {\r\n return this.size <= target.size;\r\n }\r\n } else if (this.is(TypeFlags.VECTOR)) {\r\n if (target.is(TypeFlags.VECTOR)) {\r\n return this.size == target.size;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n /** Determines the common compatible type of two types, if any. */\r\n static commonCompatible(left: Type, right: Type, signednessIsImportant: bool): Type | null {\r\n if (right.isAssignableTo(left, signednessIsImportant)) return left;\r\n else if (left.isAssignableTo(right, signednessIsImportant)) return right;\r\n return null;\r\n }\r\n\r\n /** Converts this type to its TypeScript representation. */\r\n toString(kindOnly: bool = false): string {\r\n if (!kindOnly && this.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.classReference;\r\n if (classReference) {\r\n return this.is(TypeFlags.NULLABLE)\r\n ? classReference.name + \" | null\"\r\n : classReference.name;\r\n }\r\n let signatureReference = this.signatureReference;\r\n if (signatureReference) {\r\n return this.is(TypeFlags.NULLABLE)\r\n ? \"(\" + signatureReference.toString(true) + \") | null\"\r\n : signatureReference.toString(true);\r\n }\r\n assert(false);\r\n }\r\n switch (this.kind) {\r\n case TypeKind.I8: return \"i8\";\r\n case TypeKind.I16: return \"i16\";\r\n case TypeKind.I32: return \"i32\";\r\n case TypeKind.I64: return \"i64\";\r\n case TypeKind.ISIZE: return \"isize\";\r\n case TypeKind.U8: return \"u8\";\r\n case TypeKind.U16: return \"u16\";\r\n case TypeKind.U32: return \"u32\";\r\n case TypeKind.U64: return \"u64\";\r\n case TypeKind.USIZE: return \"usize\";\r\n case TypeKind.BOOL: return \"bool\";\r\n case TypeKind.F32: return \"f32\";\r\n case TypeKind.F64: return \"f64\";\r\n case TypeKind.V128: return \"v128\";\r\n default: assert(false);\r\n case TypeKind.VOID: return \"void\";\r\n }\r\n }\r\n\r\n // Binaryen specific\r\n\r\n /** Converts this type to its respective native type. */\r\n toNativeType(): NativeType {\r\n switch (this.kind) {\r\n default: return NativeType.I32;\r\n case TypeKind.I64:\r\n case TypeKind.U64: return NativeType.I64;\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: return this.size == 64 ? NativeType.I64 : NativeType.I32;\r\n case TypeKind.F32: return NativeType.F32;\r\n case TypeKind.F64: return NativeType.F64;\r\n case TypeKind.V128: return NativeType.V128;\r\n case TypeKind.VOID: return NativeType.None;\r\n }\r\n }\r\n\r\n /** Converts this type to its native `0` value. */\r\n toNativeZero(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n case TypeKind.VOID: assert(false);\r\n default: return module.createI32(0);\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(0);\r\n case TypeKind.I64:\r\n case TypeKind.U64: return module.createI64(0);\r\n case TypeKind.F32: return module.createF32(0);\r\n case TypeKind.F64: return module.createF64(0);\r\n case TypeKind.V128: return module.createV128(v128_zero);\r\n }\r\n }\r\n\r\n /** Converts this type to its native `1` value. */\r\n toNativeOne(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n case TypeKind.V128:\r\n case TypeKind.VOID: assert(false);\r\n default: return module.createI32(1);\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(1);\r\n case TypeKind.I64:\r\n case TypeKind.U64: return module.createI64(1);\r\n case TypeKind.F32: return module.createF32(1);\r\n case TypeKind.F64: return module.createF64(1);\r\n }\r\n }\r\n\r\n /** Converts this type to its native `-1` value. */\r\n toNativeNegOne(module: Module): ExpressionRef {\r\n switch (this.kind) {\r\n case TypeKind.V128:\r\n case TypeKind.VOID: assert(false);\r\n default: return module.createI32(-1);\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(-1);\r\n case TypeKind.I64:\r\n case TypeKind.U64: return module.createI64(-1, -1);\r\n case TypeKind.F32: return module.createF32(-1);\r\n case TypeKind.F64: return module.createF64(-1);\r\n }\r\n }\r\n\r\n /** Converts this type to its signature string. */\r\n toSignatureString(): string {\r\n switch (this.kind) {\r\n default: return \"i\";\r\n case TypeKind.I64:\r\n case TypeKind.U64: return \"I\";\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: return this.size == 64 ? \"I\" : \"i\";\r\n case TypeKind.F32: return \"f\";\r\n case TypeKind.F64: return \"F\";\r\n case TypeKind.V128: return \"v\";\r\n case TypeKind.VOID: return \"_\";\r\n }\r\n }\r\n\r\n // Types\r\n\r\n /** An 8-bit signed integer. */\r\n static readonly i8: Type = new Type(TypeKind.I8,\r\n TypeFlags.SIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 8\r\n );\r\n\r\n /** A 16-bit signed integer. */\r\n static readonly i16: Type = new Type(TypeKind.I16,\r\n TypeFlags.SIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 16\r\n );\r\n\r\n /** A 32-bit signed integer. */\r\n static readonly i32: Type = new Type(TypeKind.I32,\r\n TypeFlags.SIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit signed integer. */\r\n static readonly i64: Type = new Type(TypeKind.I64,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 32-bit signed size. WASM32 only. */\r\n static readonly isize32: Type = new Type(TypeKind.ISIZE,\r\n TypeFlags.SIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.POINTER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit signed size. WASM64 only. */\r\n static readonly isize64: Type = new Type(TypeKind.ISIZE,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.POINTER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** An 8-bit unsigned integer. */\r\n static readonly u8: Type = new Type(TypeKind.U8,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 8\r\n );\r\n\r\n /** A 16-bit unsigned integer. */\r\n static readonly u16: Type = new Type(TypeKind.U16,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 16\r\n );\r\n\r\n /** A 32-bit unsigned integer. */\r\n static readonly u32: Type = new Type(TypeKind.U32,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit unsigned integer. */\r\n static readonly u64: Type = new Type(TypeKind.U64,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 32-bit unsigned size. WASM32 only. */\r\n static readonly usize32: Type = new Type(TypeKind.USIZE,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.INTEGER |\r\n TypeFlags.POINTER |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit unsigned size. WASM64 only. */\r\n static readonly usize64: Type = new Type(TypeKind.USIZE,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.INTEGER |\r\n TypeFlags.POINTER |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 1-bit unsigned integer. */\r\n static readonly bool: Type = new Type(TypeKind.BOOL,\r\n TypeFlags.UNSIGNED |\r\n TypeFlags.SHORT |\r\n TypeFlags.INTEGER |\r\n TypeFlags.VALUE, 1\r\n );\r\n\r\n /** A 32-bit float. */\r\n static readonly f32: Type = new Type(TypeKind.F32,\r\n TypeFlags.SIGNED |\r\n TypeFlags.FLOAT |\r\n TypeFlags.VALUE, 32\r\n );\r\n\r\n /** A 64-bit float. */\r\n static readonly f64: Type = new Type(TypeKind.F64,\r\n TypeFlags.SIGNED |\r\n TypeFlags.LONG |\r\n TypeFlags.FLOAT |\r\n TypeFlags.VALUE, 64\r\n );\r\n\r\n /** A 128-bit vector. */\r\n static readonly v128: Type = new Type(TypeKind.V128,\r\n TypeFlags.VECTOR |\r\n TypeFlags.VALUE, 128\r\n );\r\n\r\n /** No return type. */\r\n static readonly void: Type = new Type(TypeKind.VOID, TypeFlags.NONE, 0);\r\n}\r\n\r\n/** Converts an array of types to an array of native types. */\r\nexport function typesToNativeTypes(types: Type[]): NativeType[] {\r\n var numTypes = types.length;\r\n var ret = new Array(numTypes);\r\n for (let i = 0; i < numTypes; ++i) ret[i] = types[i].toNativeType();\r\n return ret;\r\n}\r\n\r\n/** Converts an array of types to its combined string representation. */\r\nexport function typesToString(types: Type[]): string {\r\n var numTypes = types.length;\r\n if (!numTypes) return \"\";\r\n var sb = new Array(numTypes);\r\n for (let i = 0; i < numTypes; ++i) sb[i] = types[i].toString();\r\n return sb.join(\",\");\r\n}\r\n\r\n/** Represents a fully resolved function signature. */\r\nexport class Signature {\r\n\r\n /** Parameter types, if any, excluding `this`. */\r\n parameterTypes: Type[];\r\n /** Parameter names, if known, excluding `this`. */\r\n parameterNames: string[] | null;\r\n /** Number of required parameters excluding `this`. Other parameters are considered optional. */\r\n requiredParameters: i32;\r\n /** Return type. */\r\n returnType: Type;\r\n /** This type, if an instance signature. */\r\n thisType: Type | null;\r\n /** Whether the last parameter is a rest parameter. */\r\n hasRest: bool;\r\n /** Cached {@link FunctionTarget}. */\r\n cachedFunctionTarget: FunctionTarget | null = null;\r\n /** Respective function type. */\r\n type: Type;\r\n\r\n /** Constructs a new signature. */\r\n constructor(\r\n parameterTypes: Type[] | null = null,\r\n returnType: Type | null = null,\r\n thisType: Type | null = null\r\n ) {\r\n this.parameterTypes = parameterTypes ? parameterTypes : [];\r\n this.parameterNames = null;\r\n this.requiredParameters = 0;\r\n this.returnType = returnType ? returnType : Type.void;\r\n this.thisType = thisType;\r\n this.hasRest = false;\r\n this.type = Type.u32.asFunction(this);\r\n }\r\n\r\n asFunctionTarget(program: Program): FunctionTarget {\r\n var target = this.cachedFunctionTarget;\r\n if (!target) this.cachedFunctionTarget = target = new FunctionTarget(this, program);\r\n else assert(target.program == program);\r\n return target;\r\n }\r\n\r\n /** Gets the known or, alternatively, generic parameter name at the specified index. */\r\n getParameterName(index: i32): string {\r\n var parameterNames = this.parameterNames;\r\n return parameterNames && parameterNames.length > index\r\n ? parameterNames[index]\r\n : getDefaultParameterName(index);\r\n }\r\n\r\n /** Tests if a value of this function type is assignable to a target of the specified function type. */\r\n isAssignableTo(target: Signature): bool {\r\n // TODO: maybe cache results?\r\n\r\n // check `this` type\r\n var thisThisType = this.thisType;\r\n var targetThisType = target.thisType;\r\n if (thisThisType) {\r\n if (!(targetThisType && thisThisType.isAssignableTo(targetThisType))) return false;\r\n } else if (targetThisType) {\r\n return false;\r\n }\r\n\r\n // check rest parameter\r\n if (this.hasRest != target.hasRest) return false; // TODO\r\n\r\n // check parameter types\r\n var thisParameterTypes = this.parameterTypes;\r\n var targetParameterTypes = target.parameterTypes;\r\n var numParameters = thisParameterTypes.length;\r\n if (numParameters != targetParameterTypes.length) return false;\r\n for (let i = 0; i < numParameters; ++i) {\r\n let thisParameterType = thisParameterTypes[i];\r\n let targetParameterType = targetParameterTypes[i];\r\n if (!thisParameterType.isAssignableTo(targetParameterType)) return false;\r\n }\r\n\r\n // check return type\r\n var thisReturnType = this.returnType;\r\n var targetReturnType = target.returnType;\r\n return thisReturnType == targetReturnType || thisReturnType.isAssignableTo(targetReturnType);\r\n }\r\n\r\n /** Converts a signature to a function type string. */\r\n static makeSignatureString(parameterTypes: Type[] | null, returnType: Type, thisType: Type | null = null): string {\r\n var sb = [];\r\n if (thisType) sb.push(thisType.toSignatureString());\r\n if (parameterTypes) {\r\n for (let i = 0, k = parameterTypes.length; i < k; ++i) sb.push(parameterTypes[i].toSignatureString());\r\n }\r\n sb.push(returnType.toSignatureString());\r\n return sb.join(\"\");\r\n }\r\n\r\n /** Converts this signature to a function type string. */\r\n toSignatureString(): string {\r\n return Signature.makeSignatureString(this.parameterTypes, this.returnType, this.thisType);\r\n }\r\n\r\n /** Converts this signature to a string. */\r\n toString(includeThis: bool = false): string {\r\n var sb = new Array();\r\n sb.push(\"(\");\r\n var index = 0;\r\n var thisType = this.thisType;\r\n if (thisType) {\r\n if (includeThis) {\r\n sb.push(\"this: \");\r\n sb.push(thisType.toString());\r\n index = 1;\r\n }\r\n }\r\n var parameters = this.parameterTypes;\r\n var numParameters = parameters.length;\r\n if (numParameters) {\r\n let names = this.parameterNames;\r\n let numNames = names ? names.length : 0;\r\n let optionalStart = this.requiredParameters;\r\n let restIndex = this.hasRest ? numParameters - 1 : -1;\r\n for (let i = 0; i < numParameters; ++i, ++index) {\r\n if (index) sb.push(\", \");\r\n if (i == restIndex) sb.push(\"...\");\r\n if (i < numNames) sb.push((names)[i]);\r\n else sb.push(getDefaultParameterName(i));\r\n if (i >= optionalStart && i != restIndex) sb.push(\"?: \");\r\n else sb.push(\": \");\r\n sb.push(parameters[i].toString());\r\n }\r\n }\r\n sb.push(\") => \");\r\n sb.push(this.returnType.toString());\r\n return sb.join(\"\");\r\n }\r\n}\r\n\r\n// helpers\r\n\r\n// Cached default parameter names used where names are unknown.\r\nvar cachedDefaultParameterNames: string[] | null = null;\r\n\r\n/** Gets the cached default parameter name for the specified index. */\r\nexport function getDefaultParameterName(index: i32): string {\r\n if (!cachedDefaultParameterNames) cachedDefaultParameterNames = [];\r\n for (let i = cachedDefaultParameterNames.length; i <= index; ++i) {\r\n cachedDefaultParameterNames.push(\"arg$\" + i.toString(10));\r\n }\r\n return cachedDefaultParameterNames[index - 1];\r\n}\r\n","/**\r\n * A TypeScript tokenizer modified for AssemblyScript.\r\n *\r\n * Skips over trivia and provides a general mark/reset mechanism for the parser to utilize on\r\n * ambiguous tokens.\r\n *\r\n * @module tokenizer\r\n *//***/\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticMessage,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Source,\r\n CommentKind\r\n} from \"./ast\";\r\n\r\nimport {\r\n CharCode,\r\n isLineBreak,\r\n isWhiteSpace,\r\n isIdentifierStart,\r\n isIdentifierPart,\r\n isDecimalDigit,\r\n isOctalDigit,\r\n isKeywordCharacter\r\n} from \"./util\";\r\n\r\n/** Named token types. */\r\nexport enum Token {\r\n\r\n // keywords\r\n // discarded: ANY, BOOLEAN, NEVER, NUMBER, STRING, SYMBOL, UNDEFINED, LESSTHAN_SLASH\r\n\r\n ABSTRACT,\r\n AS,\r\n ASYNC,\r\n AWAIT, // ES2017\r\n BREAK, // ES2017\r\n CASE, // ES2017\r\n CATCH, // ES2017\r\n CLASS, // ES2017\r\n CONST, // ES2017\r\n CONTINUE, // ES2017\r\n CONSTRUCTOR,\r\n DEBUGGER, // ES2017\r\n DECLARE,\r\n DEFAULT, // ES2017\r\n DELETE, // ES2017\r\n DO, // ES2017\r\n ELSE, // ES2017\r\n ENUM, // ES2017 future\r\n EXPORT, // ES2017\r\n EXTENDS, // ES2017\r\n FALSE, // ES\r\n FINALLY, // ES2017\r\n FOR, // ES2017\r\n FROM, // AS possible identifier\r\n FUNCTION, // ES2017\r\n GET,\r\n IF, // ES2017\r\n IMPLEMENTS, // ES2017 non-lexical\r\n IMPORT, // ES2017\r\n IN, // ES2017\r\n INSTANCEOF, // ES2017\r\n INTERFACE, // ES2017 non-lexical\r\n IS,\r\n KEYOF,\r\n LET, // ES2017 non-lexical\r\n MODULE, // AS possible identifier\r\n NAMESPACE, // AS possible identifier\r\n NEW, // ES2017\r\n NULL, // ES\r\n OF,\r\n PACKAGE, // ES2017 non-lexical\r\n PRIVATE, // ES2017 non-lexical\r\n PROTECTED, // ES2017 non-lexical\r\n PUBLIC, // ES2017 non-lexical\r\n READONLY,\r\n RETURN, // ES2017\r\n SET,\r\n STATIC, // ES2017 non-lexical\r\n SUPER, // ES2017\r\n SWITCH, // ES2017\r\n THIS, // ES2017\r\n THROW, // ES2017\r\n TRUE, // ES\r\n TRY, // ES2017\r\n TYPE, // AS possible identifier\r\n TYPEOF, // ES2017\r\n VAR, // ES2017\r\n VOID, // ES2017\r\n WHILE, // ES2017\r\n WITH, // ES2017\r\n YIELD, // ES2017\r\n\r\n // punctuation\r\n\r\n OPENBRACE,\r\n CLOSEBRACE,\r\n OPENPAREN,\r\n CLOSEPAREN,\r\n OPENBRACKET,\r\n CLOSEBRACKET,\r\n DOT,\r\n DOT_DOT_DOT,\r\n SEMICOLON,\r\n COMMA,\r\n LESSTHAN,\r\n GREATERTHAN,\r\n LESSTHAN_EQUALS,\r\n GREATERTHAN_EQUALS,\r\n EQUALS_EQUALS,\r\n EXCLAMATION_EQUALS,\r\n EQUALS_EQUALS_EQUALS,\r\n EXCLAMATION_EQUALS_EQUALS,\r\n EQUALS_GREATERTHAN,\r\n PLUS,\r\n MINUS,\r\n ASTERISK_ASTERISK,\r\n ASTERISK,\r\n SLASH,\r\n PERCENT,\r\n PLUS_PLUS,\r\n MINUS_MINUS,\r\n LESSTHAN_LESSTHAN,\r\n GREATERTHAN_GREATERTHAN,\r\n GREATERTHAN_GREATERTHAN_GREATERTHAN,\r\n AMPERSAND,\r\n BAR,\r\n CARET,\r\n EXCLAMATION,\r\n TILDE,\r\n AMPERSAND_AMPERSAND,\r\n BAR_BAR,\r\n QUESTION,\r\n COLON,\r\n EQUALS,\r\n PLUS_EQUALS,\r\n MINUS_EQUALS,\r\n ASTERISK_EQUALS,\r\n ASTERISK_ASTERISK_EQUALS,\r\n SLASH_EQUALS,\r\n PERCENT_EQUALS,\r\n LESSTHAN_LESSTHAN_EQUALS,\r\n GREATERTHAN_GREATERTHAN_EQUALS,\r\n GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS,\r\n AMPERSAND_EQUALS,\r\n BAR_EQUALS,\r\n CARET_EQUALS,\r\n AT,\r\n\r\n // literals\r\n\r\n IDENTIFIER,\r\n STRINGLITERAL,\r\n INTEGERLITERAL,\r\n FLOATLITERAL,\r\n\r\n // meta\r\n\r\n INVALID,\r\n ENDOFFILE\r\n}\r\n\r\nexport enum IdentifierHandling {\r\n DEFAULT,\r\n PREFER,\r\n ALWAYS\r\n}\r\n\r\nexport function tokenFromKeyword(text: string): Token {\r\n assert(text.length);\r\n switch (text.charCodeAt(0)) {\r\n case CharCode.a: {\r\n switch (text) {\r\n case \"abstract\": return Token.ABSTRACT;\r\n case \"as\": return Token.AS;\r\n case \"async\": return Token.ASYNC;\r\n case \"await\": return Token.AWAIT;\r\n }\r\n break;\r\n }\r\n case CharCode.b: {\r\n switch (text) {\r\n case \"break\": return Token.BREAK;\r\n }\r\n break;\r\n }\r\n case CharCode.c: {\r\n switch (text) {\r\n case \"case\": return Token.CASE;\r\n case \"catch\": return Token.CATCH;\r\n case \"class\": return Token.CLASS;\r\n case \"continue\": return Token.CONTINUE;\r\n case \"const\": return Token.CONST;\r\n case \"constructor\": return Token.CONSTRUCTOR;\r\n }\r\n break;\r\n }\r\n case CharCode.d: {\r\n switch (text) {\r\n case \"debugger\": return Token.DEBUGGER;\r\n case \"declare\": return Token.DECLARE;\r\n case \"default\": return Token.DEFAULT;\r\n case \"delete\": return Token.DELETE;\r\n case \"do\": return Token.DO;\r\n }\r\n break;\r\n }\r\n case CharCode.e: {\r\n switch (text) {\r\n case \"else\": return Token.ELSE;\r\n case \"enum\": return Token.ENUM;\r\n case \"export\": return Token.EXPORT;\r\n case \"extends\": return Token.EXTENDS;\r\n }\r\n break;\r\n }\r\n case CharCode.f: {\r\n switch (text) {\r\n case \"false\": return Token.FALSE;\r\n case \"finally\": return Token.FINALLY;\r\n case \"for\": return Token.FOR;\r\n case \"from\": return Token.FROM;\r\n case \"function\": return Token.FUNCTION;\r\n }\r\n break;\r\n }\r\n case CharCode.g: {\r\n switch (text) {\r\n case \"get\": return Token.GET;\r\n }\r\n break;\r\n }\r\n case CharCode.i: {\r\n switch (text) {\r\n case \"if\": return Token.IF;\r\n case \"implements\": return Token.IMPLEMENTS;\r\n case \"import\": return Token.IMPORT;\r\n case \"in\": return Token.IN;\r\n case \"instanceof\": return Token.INSTANCEOF;\r\n case \"interface\": return Token.INTERFACE;\r\n case \"is\": return Token.IS;\r\n }\r\n break;\r\n }\r\n case CharCode.k: {\r\n switch (text) {\r\n case \"keyof\": return Token.KEYOF;\r\n }\r\n break;\r\n }\r\n case CharCode.l: {\r\n switch (text) {\r\n case \"let\": return Token.LET;\r\n }\r\n break;\r\n }\r\n case CharCode.m: {\r\n switch (text) {\r\n case \"module\": return Token.MODULE;\r\n }\r\n break;\r\n }\r\n case CharCode.n: {\r\n switch (text) {\r\n case \"namespace\": return Token.NAMESPACE;\r\n case \"new\": return Token.NEW;\r\n case \"null\": return Token.NULL;\r\n }\r\n break;\r\n }\r\n case CharCode.o: {\r\n switch (text) {\r\n case \"of\": return Token.OF;\r\n }\r\n break;\r\n }\r\n case CharCode.p: {\r\n switch (text) {\r\n case \"package\": return Token.PACKAGE;\r\n case \"private\": return Token.PRIVATE;\r\n case \"protected\": return Token.PROTECTED;\r\n case \"public\": return Token.PUBLIC;\r\n }\r\n break;\r\n }\r\n case CharCode.r: {\r\n switch (text) {\r\n case \"readonly\": return Token.READONLY;\r\n case \"return\": return Token.RETURN;\r\n }\r\n break;\r\n }\r\n case CharCode.s: {\r\n switch (text) {\r\n case \"set\": return Token.SET;\r\n case \"static\": return Token.STATIC;\r\n case \"super\": return Token.SUPER;\r\n case \"switch\": return Token.SWITCH;\r\n }\r\n break;\r\n }\r\n case CharCode.t: {\r\n switch (text) {\r\n case \"this\": return Token.THIS;\r\n case \"throw\": return Token.THROW;\r\n case \"true\": return Token.TRUE;\r\n case \"try\": return Token.TRY;\r\n case \"type\": return Token.TYPE;\r\n case \"typeof\": return Token.TYPEOF;\r\n }\r\n break;\r\n }\r\n case CharCode.v: {\r\n switch (text) {\r\n case \"var\": return Token.VAR;\r\n case \"void\": return Token.VOID;\r\n }\r\n break;\r\n }\r\n case CharCode.w: {\r\n switch (text) {\r\n case \"while\": return Token.WHILE;\r\n case \"with\": return Token.WITH;\r\n }\r\n break;\r\n }\r\n case CharCode.y: {\r\n switch (text) {\r\n case \"yield\": return Token.YIELD;\r\n }\r\n break;\r\n }\r\n }\r\n return Token.INVALID;\r\n}\r\n\r\nexport function tokenIsAlsoIdentifier(token: Token): bool {\r\n switch (token) {\r\n case Token.ABSTRACT:\r\n case Token.AS:\r\n case Token.CONSTRUCTOR:\r\n case Token.DECLARE:\r\n case Token.DELETE:\r\n case Token.FROM:\r\n case Token.FOR:\r\n case Token.GET:\r\n case Token.IS:\r\n case Token.KEYOF:\r\n case Token.MODULE:\r\n case Token.NAMESPACE:\r\n case Token.READONLY:\r\n case Token.SET:\r\n case Token.TYPE:\r\n case Token.VOID: return true;\r\n default: return false;\r\n }\r\n}\r\n\r\nexport function operatorTokenToString(token: Token): string {\r\n switch (token) {\r\n case Token.DELETE: return \"delete\";\r\n case Token.IN: return \"in\";\r\n case Token.INSTANCEOF: return \"instanceof\";\r\n case Token.NEW: return \"new\";\r\n case Token.TYPEOF: return \"typeof\";\r\n case Token.VOID: return \"void\";\r\n case Token.YIELD: return \"yield\";\r\n case Token.DOT_DOT_DOT: return \"...\";\r\n case Token.COMMA: return \",\";\r\n case Token.LESSTHAN: return \"<\";\r\n case Token.GREATERTHAN: return \">\";\r\n case Token.LESSTHAN_EQUALS: return \"<=\";\r\n case Token.GREATERTHAN_EQUALS: return \">=\";\r\n case Token.EQUALS_EQUALS: return \"==\";\r\n case Token.EXCLAMATION_EQUALS: return \"!=\";\r\n case Token.EQUALS_EQUALS_EQUALS: return \"===\";\r\n case Token.EXCLAMATION_EQUALS_EQUALS: return \"!==\";\r\n case Token.PLUS: return \"+\";\r\n case Token.MINUS: return \"-\";\r\n case Token.ASTERISK_ASTERISK: return \"**\";\r\n case Token.ASTERISK: return \"*\";\r\n case Token.SLASH: return \"/\";\r\n case Token.PERCENT: return \"%\";\r\n case Token.PLUS_PLUS: return \"++\";\r\n case Token.MINUS_MINUS: return \"--\";\r\n case Token.LESSTHAN_LESSTHAN: return \"<<\";\r\n case Token.GREATERTHAN_GREATERTHAN: return \">>\";\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return \">>>\";\r\n case Token.AMPERSAND: return \"&\";\r\n case Token.BAR: return \"|\";\r\n case Token.CARET: return \"^\";\r\n case Token.EXCLAMATION: return \"!\";\r\n case Token.TILDE: return \"~\";\r\n case Token.AMPERSAND_AMPERSAND: return \"&&\";\r\n case Token.BAR_BAR: return \"||\";\r\n case Token.EQUALS: return \"=\";\r\n case Token.PLUS_EQUALS: return \"+=\";\r\n case Token.MINUS_EQUALS: return \"-=\";\r\n case Token.ASTERISK_EQUALS: return \"*=\";\r\n case Token.ASTERISK_ASTERISK_EQUALS: return \"**=\";\r\n case Token.SLASH_EQUALS: return \"/=\";\r\n case Token.PERCENT_EQUALS: return \"%=\";\r\n case Token.LESSTHAN_LESSTHAN_EQUALS: return \"<<=\";\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS: return \">>=\";\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: return \">>>=\";\r\n case Token.AMPERSAND_EQUALS: return \"&=\";\r\n case Token.BAR_EQUALS: return \"|=\";\r\n case Token.CARET_EQUALS: return \"^=\";\r\n default: {\r\n assert(false);\r\n return \"\";\r\n }\r\n }\r\n}\r\n\r\nexport class Range {\r\n\r\n source: Source;\r\n start: i32;\r\n end: i32;\r\n\r\n // TODO: set these while tokenizing\r\n // line: i32;\r\n // column: i32;\r\n\r\n constructor(source: Source, start: i32, end: i32) {\r\n this.source = source;\r\n this.start = start;\r\n this.end = end;\r\n }\r\n\r\n static join(a: Range, b: Range): Range {\r\n if (a.source != b.source) throw new Error(\"source mismatch\");\r\n return new Range(a.source,\r\n a.start < b.start ? a.start : b.start,\r\n a.end > b.end ? a.end : b.end\r\n );\r\n }\r\n\r\n get atStart(): Range {\r\n return new Range(this.source, this.start, this.start);\r\n }\r\n get atEnd(): Range {\r\n return new Range(this.source, this.end, this.end);\r\n }\r\n\r\n get line(): i32 {\r\n var text = this.source.text;\r\n var line = 1;\r\n for (let pos = this.start; pos >= 0; --pos) {\r\n if (text.charCodeAt(pos) == CharCode.LINEFEED) line++;\r\n }\r\n return line;\r\n }\r\n\r\n get column(): i32 {\r\n var text = this.source.text;\r\n var column = 0;\r\n for (let pos = this.start - 1; pos >= 0; --pos) {\r\n if (text.charCodeAt(pos) == CharCode.LINEFEED) break;\r\n ++column;\r\n }\r\n return column;\r\n }\r\n\r\n toString(): string {\r\n return this.source.text.substring(this.start, this.end);\r\n }\r\n\r\n debugInfoRef: usize = 0;\r\n}\r\n\r\ndeclare function parseFloat(str: string): f64;\r\n\r\n/** Handler for intercepting comments while tokenizing. */\r\nexport type CommentHandler = (kind: CommentKind, text: string, range: Range) => void;\r\n\r\n/** Tokenizes a source to individual {@link Token}s. */\r\nexport class Tokenizer extends DiagnosticEmitter {\r\n\r\n source: Source;\r\n end: i32 = 0;\r\n\r\n pos: i32 = 0;\r\n token: Token = -1;\r\n tokenPos: i32 = 0;\r\n\r\n nextToken: Token = -1;\r\n nextTokenPos: i32 = 0;\r\n nextTokenOnNewLine: bool = false;\r\n\r\n onComment: CommentHandler | null = null;\r\n\r\n /** Constructs a new tokenizer. */\r\n constructor(source: Source, diagnostics: DiagnosticMessage[] | null = null) {\r\n super(diagnostics);\r\n this.source = source;\r\n this.pos = 0;\r\n this.end = source.text.length;\r\n this.diagnostics = diagnostics ? diagnostics : new Array();\r\n\r\n var text = source.text;\r\n\r\n // skip bom\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.BYTEORDERMARK\r\n ) {\r\n ++this.pos;\r\n }\r\n\r\n // skip shebang\r\n if (\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.HASH &&\r\n text.charCodeAt(this.pos + 1) == CharCode.EXCLAMATION\r\n ) {\r\n this.pos += 2;\r\n while (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) != CharCode.LINEFEED\r\n ) {\r\n ++this.pos;\r\n }\r\n // 'next' now starts at lf or eof\r\n }\r\n }\r\n\r\n next(identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): Token {\r\n this.nextToken = -1;\r\n return this.token = this.unsafeNext(identifierHandling);\r\n }\r\n\r\n private unsafeNext(\r\n identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\r\n maxTokenLength: i32 = i32.MAX_VALUE\r\n ): Token {\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n this.tokenPos = this.pos;\r\n let c = text.charCodeAt(this.pos);\r\n switch (c) {\r\n case CharCode.CARRIAGERETURN: {\r\n if (!(\r\n ++this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n )) break;\r\n // otherwise fall-through\r\n }\r\n case CharCode.LINEFEED:\r\n case CharCode.TAB:\r\n case CharCode.VERTICALTAB:\r\n case CharCode.FORMFEED:\r\n case CharCode.SPACE: {\r\n ++this.pos;\r\n break;\r\n }\r\n case CharCode.EXCLAMATION: {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.EXCLAMATION_EQUALS_EQUALS;\r\n }\r\n return Token.EXCLAMATION_EQUALS;\r\n }\r\n return Token.EXCLAMATION;\r\n }\r\n case CharCode.DOUBLEQUOTE:\r\n case CharCode.SINGLEQUOTE:\r\n case CharCode.BACKTICK: { // TODO\r\n return Token.STRINGLITERAL; // expects a call to readString\r\n }\r\n case CharCode.PERCENT: {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.PERCENT_EQUALS;\r\n }\r\n return Token.PERCENT;\r\n }\r\n case CharCode.AMPERSAND: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.AMPERSAND) {\r\n ++this.pos;\r\n return Token.AMPERSAND_AMPERSAND;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.AMPERSAND_EQUALS;\r\n }\r\n }\r\n return Token.AMPERSAND;\r\n }\r\n case CharCode.OPENPAREN: {\r\n ++this.pos;\r\n return Token.OPENPAREN;\r\n }\r\n case CharCode.CLOSEPAREN: {\r\n ++this.pos;\r\n return Token.CLOSEPAREN;\r\n }\r\n case CharCode.ASTERISK: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.ASTERISK_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.ASTERISK_ASTERISK_EQUALS;\r\n }\r\n return Token.ASTERISK_ASTERISK;\r\n }\r\n }\r\n return Token.ASTERISK;\r\n }\r\n case CharCode.PLUS: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.PLUS) {\r\n ++this.pos;\r\n return Token.PLUS_PLUS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.PLUS_EQUALS;\r\n }\r\n }\r\n return Token.PLUS;\r\n }\r\n case CharCode.COMMA: {\r\n ++this.pos;\r\n return Token.COMMA;\r\n }\r\n case CharCode.MINUS: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.MINUS) {\r\n ++this.pos;\r\n return Token.MINUS_MINUS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.MINUS_EQUALS;\r\n }\r\n }\r\n return Token.MINUS;\r\n }\r\n case CharCode.DOT: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (isDecimalDigit(text.charCodeAt(this.pos))) {\r\n --this.pos;\r\n return Token.FLOATLITERAL; // expects a call to readFloat\r\n }\r\n if (\r\n maxTokenLength > 2 && this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.DOT &&\r\n text.charCodeAt(this.pos + 1) == CharCode.DOT\r\n ) {\r\n this.pos += 2;\r\n return Token.DOT_DOT_DOT;\r\n }\r\n }\r\n return Token.DOT;\r\n }\r\n case CharCode.SLASH: {\r\n let commentStartPos = this.pos;\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.SLASH) { // single-line\r\n let commentKind = CommentKind.LINE;\r\n if (\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n ) {\r\n ++this.pos;\r\n commentKind = CommentKind.TRIPLE;\r\n }\r\n while (++this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.LINEFEED) {\r\n ++this.pos;\r\n break;\r\n }\r\n }\r\n if (this.onComment) {\r\n this.onComment(\r\n commentKind,\r\n text.substring(commentStartPos, this.pos),\r\n this.range(commentStartPos, this.pos)\r\n );\r\n }\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.ASTERISK) { // multi-line\r\n let closed = false;\r\n while (++this.pos < this.end) {\r\n c = text.charCodeAt(this.pos);\r\n if (\r\n c == CharCode.ASTERISK &&\r\n this.pos + 1 < this.end &&\r\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\r\n ) {\r\n this.pos += 2;\r\n closed = true;\r\n break;\r\n }\r\n }\r\n if (!closed) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n this.range(this.pos), \"*/\"\r\n );\r\n } else if (this.onComment) {\r\n this.onComment(\r\n CommentKind.BLOCK,\r\n text.substring(commentStartPos, this.pos),\r\n this.range(commentStartPos, this.pos)\r\n );\r\n }\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.SLASH_EQUALS;\r\n }\r\n }\r\n return Token.SLASH;\r\n }\r\n case CharCode._0:\r\n case CharCode._1:\r\n case CharCode._2:\r\n case CharCode._3:\r\n case CharCode._4:\r\n case CharCode._5:\r\n case CharCode._6:\r\n case CharCode._7:\r\n case CharCode._8:\r\n case CharCode._9: {\r\n return this.testInteger()\r\n ? Token.INTEGERLITERAL // expects a call to readInteger\r\n : Token.FLOATLITERAL; // expects a call to readFloat\r\n }\r\n case CharCode.COLON: {\r\n ++this.pos;\r\n return Token.COLON;\r\n }\r\n case CharCode.SEMICOLON: {\r\n ++this.pos;\r\n return Token.SEMICOLON;\r\n }\r\n case CharCode.LESSTHAN: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.LESSTHAN) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.LESSTHAN_LESSTHAN_EQUALS;\r\n }\r\n return Token.LESSTHAN_LESSTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.LESSTHAN_EQUALS;\r\n }\r\n }\r\n return Token.LESSTHAN;\r\n }\r\n case CharCode.EQUALS: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 2 &&\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.EQUALS_EQUALS_EQUALS;\r\n }\r\n return Token.EQUALS_EQUALS;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n return Token.EQUALS_GREATERTHAN;\r\n }\r\n }\r\n return Token.EQUALS;\r\n }\r\n case CharCode.GREATERTHAN: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n if (maxTokenLength > 2 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.GREATERTHAN) {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 3 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN_GREATERTHAN;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.GREATERTHAN_EQUALS;\r\n }\r\n }\r\n return Token.GREATERTHAN;\r\n }\r\n case CharCode.QUESTION: {\r\n ++this.pos;\r\n return Token.QUESTION;\r\n }\r\n case CharCode.OPENBRACKET: {\r\n ++this.pos;\r\n return Token.OPENBRACKET;\r\n }\r\n case CharCode.CLOSEBRACKET: {\r\n ++this.pos;\r\n return Token.CLOSEBRACKET;\r\n }\r\n case CharCode.CARET: {\r\n ++this.pos;\r\n if (\r\n maxTokenLength > 1 && this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.EQUALS\r\n ) {\r\n ++this.pos;\r\n return Token.CARET_EQUALS;\r\n }\r\n return Token.CARET;\r\n }\r\n case CharCode.OPENBRACE: {\r\n ++this.pos;\r\n return Token.OPENBRACE;\r\n }\r\n case CharCode.BAR: {\r\n ++this.pos;\r\n if (maxTokenLength > 1 && this.pos < this.end) {\r\n if (text.charCodeAt(this.pos) == CharCode.BAR) {\r\n ++this.pos;\r\n return Token.BAR_BAR;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.EQUALS) {\r\n ++this.pos;\r\n return Token.BAR_EQUALS;\r\n }\r\n }\r\n return Token.BAR;\r\n }\r\n case CharCode.CLOSEBRACE: {\r\n ++this.pos;\r\n return Token.CLOSEBRACE;\r\n }\r\n case CharCode.TILDE: {\r\n ++this.pos;\r\n return Token.TILDE;\r\n }\r\n case CharCode.AT: {\r\n ++this.pos;\r\n return Token.AT;\r\n }\r\n default: {\r\n if (isIdentifierStart(c)) {\r\n if (isKeywordCharacter(c)) {\r\n let posBefore = this.pos;\r\n while (\r\n ++this.pos < this.end &&\r\n isIdentifierPart(c = text.charCodeAt(this.pos))\r\n ) {\r\n if (!isKeywordCharacter(c)) {\r\n this.pos = posBefore;\r\n return Token.IDENTIFIER;\r\n }\r\n }\r\n let keywordText = text.substring(posBefore, this.pos);\r\n let keywordToken = tokenFromKeyword(keywordText);\r\n if (\r\n keywordToken != Token.INVALID &&\r\n identifierHandling !== IdentifierHandling.ALWAYS &&\r\n !(\r\n identifierHandling === IdentifierHandling.PREFER &&\r\n tokenIsAlsoIdentifier(keywordToken)\r\n )\r\n ) {\r\n return keywordToken;\r\n }\r\n this.pos = posBefore;\r\n }\r\n return Token.IDENTIFIER; // expects a call to readIdentifier\r\n } else if (isWhiteSpace(c)) {\r\n ++this.pos;\r\n break;\r\n }\r\n this.error(\r\n DiagnosticCode.Invalid_character,\r\n this.range(this.pos, this.pos + 1)\r\n );\r\n ++this.pos;\r\n return Token.INVALID;\r\n }\r\n }\r\n }\r\n return Token.ENDOFFILE;\r\n }\r\n\r\n peek(\r\n checkOnNewLine: bool = false,\r\n identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\r\n maxCompoundLength: i32 = i32.MAX_VALUE\r\n ): Token {\r\n var text = this.source.text;\r\n if (this.nextToken < 0) {\r\n let posBefore = this.pos;\r\n let tokenBefore = this.token;\r\n let tokenPosBefore = this.tokenPos;\r\n this.nextToken = this.unsafeNext(identifierHandling, maxCompoundLength);\r\n this.nextTokenPos = this.tokenPos;\r\n if (checkOnNewLine) {\r\n this.nextTokenOnNewLine = false;\r\n for (let pos = posBefore, end = this.nextTokenPos; pos < end; ++pos) {\r\n if (isLineBreak(text.charCodeAt(pos))) {\r\n this.nextTokenOnNewLine = true;\r\n break;\r\n }\r\n }\r\n }\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n }\r\n return this.nextToken;\r\n }\r\n\r\n skipIdentifier(identifierHandling: IdentifierHandling = IdentifierHandling.PREFER): bool {\r\n return this.skip(Token.IDENTIFIER, identifierHandling);\r\n }\r\n\r\n skip(token: Token, identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): bool {\r\n var posBefore = this.pos;\r\n var tokenBefore = this.token;\r\n var tokenPosBefore = this.tokenPos;\r\n var maxCompoundLength = i32.MAX_VALUE;\r\n switch (token) {\r\n case Token.GREATERTHAN: { // where parsing type arguments\r\n maxCompoundLength = 1;\r\n break;\r\n }\r\n }\r\n this.token = this.unsafeNext(identifierHandling, maxCompoundLength);\r\n if (this.token == token) {\r\n this.nextToken = -1;\r\n return true;\r\n } else {\r\n this.pos = posBefore;\r\n this.token = tokenBefore;\r\n this.tokenPos = tokenPosBefore;\r\n return false;\r\n }\r\n }\r\n\r\n mark(): State {\r\n var state: State;\r\n if (reusableState) {\r\n state = reusableState;\r\n reusableState = null;\r\n } else {\r\n state = new State();\r\n }\r\n state.pos = this.pos;\r\n state.token = this.token;\r\n state.tokenPos = this.tokenPos;\r\n return state;\r\n }\r\n\r\n discard(state: State): void {\r\n reusableState = state;\r\n }\r\n\r\n reset(state: State): void {\r\n this.pos = state.pos;\r\n this.token = state.token;\r\n this.tokenPos = state.tokenPos;\r\n this.nextToken = -1;\r\n }\r\n\r\n range(start: i32 = -1, end: i32 = -1): Range {\r\n if (start < 0) {\r\n start = this.tokenPos;\r\n end = this.pos;\r\n } else if (end < 0) {\r\n end = start;\r\n }\r\n return new Range(this.source, start, end);\r\n }\r\n\r\n readIdentifier(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n while (\r\n ++this.pos < this.end &&\r\n isIdentifierPart(text.charCodeAt(this.pos))\r\n );\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n readString(): string {\r\n var text = this.source.text;\r\n var quote = text.charCodeAt(this.pos++);\r\n var start = this.pos;\r\n var result = \"\";\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n result += text.substring(start, this.pos);\r\n this.error(\r\n DiagnosticCode.Unterminated_string_literal,\r\n this.range(start - 1, this.end)\r\n );\r\n break;\r\n }\r\n let c = text.charCodeAt(this.pos);\r\n if (c == quote) {\r\n result += text.substring(start, this.pos++);\r\n break;\r\n }\r\n if (c == CharCode.BACKSLASH) {\r\n result += text.substring(start, this.pos);\r\n result += this.readEscapeSequence();\r\n start = this.pos;\r\n continue;\r\n }\r\n if (isLineBreak(c)) {\r\n result += text.substring(start, this.pos);\r\n this.error(\r\n DiagnosticCode.Unterminated_string_literal,\r\n this.range(start - 1, this.pos)\r\n );\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n return result;\r\n }\r\n\r\n readEscapeSequence(): string {\r\n if (++this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(this.end)\r\n );\r\n return \"\";\r\n }\r\n\r\n var text = this.source.text;\r\n var c = text.charCodeAt(this.pos++);\r\n switch (c) {\r\n case CharCode._0: return \"\\0\";\r\n case CharCode.b: return \"\\b\";\r\n case CharCode.t: return \"\\t\";\r\n case CharCode.n: return \"\\n\";\r\n case CharCode.v: return \"\\v\";\r\n case CharCode.f: return \"\\f\";\r\n case CharCode.r: return \"\\r\";\r\n case CharCode.SINGLEQUOTE: return \"'\";\r\n case CharCode.DOUBLEQUOTE: return \"\\\"\";\r\n case CharCode.u: {\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.OPENBRACE\r\n ) {\r\n ++this.pos;\r\n return this.readExtendedUnicodeEscape(); // \\u{DDDDDDDD}\r\n }\r\n return this.readUnicodeEscape(); // \\uDDDD\r\n }\r\n case CharCode.CARRIAGERETURN: {\r\n if (\r\n this.pos < this.end &&\r\n text.charCodeAt(this.pos) == CharCode.LINEFEED\r\n ) {\r\n ++this.pos;\r\n }\r\n // fall through\r\n }\r\n case CharCode.LINEFEED:\r\n case CharCode.LINESEPARATOR:\r\n case CharCode.PARAGRAPHSEPARATOR: return \"\";\r\n default: return String.fromCharCode(c);\r\n }\r\n }\r\n\r\n readRegexpPattern(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var escaped = false;\r\n while (true) {\r\n if (this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unterminated_regular_expression_literal,\r\n this.range(start, this.end)\r\n );\r\n break;\r\n }\r\n if (text.charCodeAt(this.pos) == CharCode.BACKSLASH) {\r\n ++this.pos;\r\n escaped = true;\r\n continue;\r\n }\r\n let c = text.charCodeAt(this.pos);\r\n if (c == CharCode.SLASH && !escaped) break;\r\n if (isLineBreak(c)) {\r\n this.error(\r\n DiagnosticCode.Unterminated_regular_expression_literal,\r\n this.range(start, this.pos)\r\n );\r\n break;\r\n }\r\n ++this.pos;\r\n escaped = false;\r\n }\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n readRegexpFlags(): string {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var flags = 0;\r\n while (this.pos < this.end) {\r\n let c: i32 = text.charCodeAt(this.pos);\r\n if (!isIdentifierPart(c)) break;\r\n ++this.pos;\r\n\r\n // make sure each supported flag is unique\r\n switch (c) {\r\n case CharCode.g: {\r\n flags |= flags & 1 ? -1 : 1;\r\n break;\r\n }\r\n case CharCode.i: {\r\n flags |= flags & 2 ? -1 : 2;\r\n break;\r\n }\r\n case CharCode.m: {\r\n flags |= flags & 4 ? -1 : 4;\r\n break;\r\n }\r\n default: {\r\n flags = -1;\r\n break;\r\n }\r\n }\r\n }\r\n if (flags == -1) {\r\n this.error(\r\n DiagnosticCode.Invalid_regular_expression_flags,\r\n this.range(start, this.pos)\r\n );\r\n }\r\n return text.substring(start, this.pos);\r\n }\r\n\r\n testInteger(): bool {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 1 < this.end) {\r\n switch (text.charCodeAt(this.pos + 2)) {\r\n case CharCode.X:\r\n case CharCode.x:\r\n case CharCode.B:\r\n case CharCode.b:\r\n case CharCode.O:\r\n case CharCode.o: return true;\r\n }\r\n }\r\n var pos = this.pos;\r\n while (pos < this.end) {\r\n let c = text.charCodeAt(pos);\r\n if (c == CharCode.DOT || c == CharCode.E || c == CharCode.e) {\r\n return false;\r\n }\r\n if ((c < CharCode._0 || c > CharCode._9) && c != CharCode._) break;\r\n // does not validate separator placement (this is done in readXYInteger)\r\n pos++;\r\n }\r\n return true;\r\n }\r\n\r\n readInteger(): I64 {\r\n var text = this.source.text;\r\n if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\r\n switch (text.charCodeAt(this.pos + 1)) {\r\n case CharCode.X:\r\n case CharCode.x: {\r\n this.pos += 2;\r\n return this.readHexInteger();\r\n }\r\n case CharCode.B:\r\n case CharCode.b: {\r\n this.pos += 2;\r\n return this.readBinaryInteger();\r\n }\r\n case CharCode.O:\r\n case CharCode.o: {\r\n this.pos += 2;\r\n return this.readOctalInteger();\r\n }\r\n }\r\n if (isOctalDigit(text.charCodeAt(this.pos + 1))) {\r\n let start = this.pos;\r\n ++this.pos;\r\n let value = this.readOctalInteger();\r\n this.error(\r\n DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode,\r\n this.range(start, this.pos)\r\n );\r\n return value;\r\n }\r\n }\r\n return this.readDecimalInteger();\r\n }\r\n\r\n readHexInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_16 = i64_new(16, 0);\r\n var sepEnd = start;\r\n while (this.pos < this.end) {\r\n let pos = this.pos;\r\n let c = text.charCodeAt(pos);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n // value = value * 16 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else if (c >= CharCode.A && c <= CharCode.F) {\r\n // value = value * 16 + 10 + c - CharCode.A;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(10 + c - CharCode.A, 0)\r\n );\r\n } else if (c >= CharCode.a && c <= CharCode.f) {\r\n // value = value * 16 + 10 + c - CharCode.a;\r\n value = i64_add(\r\n i64_mul(value, i64_16),\r\n i64_new(10 + c - CharCode.a, 0)\r\n );\r\n } else if (c == CharCode._) {\r\n if (sepEnd == pos) {\r\n this.error(\r\n sepEnd == start\r\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n this.range(pos)\r\n );\r\n }\r\n sepEnd = pos + 1;\r\n } else {\r\n break;\r\n }\r\n this.pos = pos + 1;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Hexadecimal_digit_expected,\r\n this.range(start)\r\n );\r\n } else if (sepEnd == this.pos) {\r\n this.error(\r\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n this.range(sepEnd - 1)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readDecimalInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_10 = i64_new(10, 0);\r\n var sepEnd = start;\r\n while (this.pos < this.end) {\r\n let pos = this.pos;\r\n let c = text.charCodeAt(pos);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n // value = value * 10 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_10),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else if (c == CharCode._) {\r\n if (sepEnd == pos) {\r\n this.error(\r\n sepEnd == start\r\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n this.range(pos)\r\n );\r\n }\r\n sepEnd = pos + 1;\r\n } else {\r\n break;\r\n }\r\n this.pos = pos + 1;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Digit_expected,\r\n this.range(start)\r\n );\r\n } else if (sepEnd == this.pos) {\r\n this.error(\r\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n this.range(sepEnd - 1)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readOctalInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_8 = i64_new(8, 0);\r\n var sepEnd = start;\r\n while (this.pos < this.end) {\r\n let pos = this.pos;\r\n let c = text.charCodeAt(pos);\r\n if (c >= CharCode._0 && c <= CharCode._7) {\r\n // value = value * 8 + c - CharCode._0;\r\n value = i64_add(\r\n i64_mul(value, i64_8),\r\n i64_new(c - CharCode._0, 0)\r\n );\r\n } else if (c == CharCode._) {\r\n if (sepEnd == pos) {\r\n this.error(\r\n sepEnd == start\r\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n this.range(pos)\r\n );\r\n }\r\n sepEnd = pos + 1;\r\n } else {\r\n break;\r\n }\r\n ++this.pos;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Octal_digit_expected,\r\n this.range(start)\r\n );\r\n } else if (sepEnd == this.pos) {\r\n this.error(\r\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n this.range(sepEnd - 1)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readBinaryInteger(): I64 {\r\n var text = this.source.text;\r\n var start = this.pos;\r\n var value = i64_new(0, 0);\r\n var i64_2 = i64_new(2, 0);\r\n var i64_1 = i64_new(1, 0);\r\n var sepEnd = start;\r\n while (this.pos < this.end) {\r\n let pos = this.pos;\r\n let c = text.charCodeAt(pos);\r\n if (c == CharCode._0) {\r\n // value = value * 2;\r\n value = i64_mul(\r\n value,\r\n i64_2\r\n );\r\n } else if (c == CharCode._1) {\r\n // value = value * 2 + 1;\r\n value = i64_add(\r\n i64_mul(value, i64_2),\r\n i64_1\r\n );\r\n } else if (c == CharCode._) {\r\n if (sepEnd == pos) {\r\n this.error(\r\n sepEnd == start\r\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\r\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\r\n this.range(pos)\r\n );\r\n }\r\n sepEnd = pos + 1;\r\n } else {\r\n break;\r\n }\r\n this.pos = pos + 1;\r\n }\r\n if (this.pos == start) {\r\n this.error(\r\n DiagnosticCode.Binary_digit_expected,\r\n this.range(start)\r\n );\r\n } else if (sepEnd == this.pos) {\r\n this.error(\r\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\r\n this.range(sepEnd - 1)\r\n );\r\n }\r\n return value;\r\n }\r\n\r\n readFloat(): f64 {\r\n // var text = this.source.text;\r\n // if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\r\n // switch (text.charCodeAt(this.pos + 1)) {\r\n // case CharCode.X:\r\n // case CharCode.x: {\r\n // this.pos += 2;\r\n // return this.readHexFloat();\r\n // }\r\n // }\r\n // }\r\n return this.readDecimalFloat();\r\n }\r\n\r\n readDecimalFloat(): f64 {\r\n // TODO: numeric separators (parseFloat can't handle these)\r\n var start = this.pos;\r\n var text = this.source.text;\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n if (this.pos < this.end && text.charCodeAt(this.pos) == CharCode.DOT) {\r\n ++this.pos;\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n if (this.pos < this.end) {\r\n let c = text.charCodeAt(this.pos);\r\n if (c == CharCode.E || c == CharCode.e) {\r\n if (\r\n ++this.pos < this.end && (\r\n text.charCodeAt(this.pos) == CharCode.MINUS ||\r\n text.charCodeAt(this.pos) == CharCode.PLUS\r\n ) &&\r\n isDecimalDigit(text.charCodeAt(this.pos + 1))\r\n ) {\r\n ++this.pos;\r\n }\r\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\r\n ++this.pos;\r\n }\r\n }\r\n }\r\n return parseFloat(text.substring(start, this.pos));\r\n }\r\n\r\n readHexFloat(): f64 {\r\n throw new Error(\"not implemented\"); // TBD\r\n }\r\n\r\n readUnicodeEscape(): string {\r\n var remain = 4;\r\n var value = 0;\r\n var text = this.source.text;\r\n while (this.pos < this.end) {\r\n let c = text.charCodeAt(this.pos++);\r\n if (c >= CharCode._0 && c <= CharCode._9) {\r\n value = value * 16 + c - CharCode._0;\r\n } else if (c >= CharCode.A && c <= CharCode.F) {\r\n value = value * 16 + 10 + c - CharCode.A;\r\n } else if (c >= CharCode.a && c <= CharCode.f) {\r\n value = value * 16 + 10 + c - CharCode.a;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Hexadecimal_digit_expected,\r\n this.range(this.pos - 1, this.pos)\r\n );\r\n return \"\";\r\n }\r\n if (--remain == 0) break;\r\n }\r\n if (remain) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(this.pos)\r\n );\r\n return \"\";\r\n }\r\n return String.fromCharCode(value);\r\n }\r\n\r\n private readExtendedUnicodeEscape(): string {\r\n var start = this.pos;\r\n var value = this.readHexInteger();\r\n var value32 = i64_low(value);\r\n var invalid = false;\r\n\r\n assert(!i64_high(value));\r\n if (value32 > 0x10FFFF) {\r\n this.error(\r\n DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,\r\n this.range(start, this.pos)\r\n );\r\n invalid = true;\r\n }\r\n\r\n var text = this.source.text;\r\n if (this.pos >= this.end) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n this.range(start, this.end)\r\n );\r\n invalid = true;\r\n } else if (text.charCodeAt(this.pos) == CharCode.CLOSEBRACE) {\r\n ++this.pos;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Unterminated_Unicode_escape_sequence,\r\n this.range(start, this.pos)\r\n );\r\n invalid = true;\r\n }\r\n\r\n if (invalid) return \"\";\r\n return value32 < 65536\r\n ? String.fromCharCode(value32)\r\n : String.fromCharCode(\r\n (((value32 - 65536) / 1024 | 0) + 0xD800) as i32,\r\n ( (value32 - 65536) % 1024 + 0xDC00) as i32\r\n );\r\n }\r\n\r\n finish(): void {\r\n }\r\n}\r\n\r\n/** Tokenizer state as returned by {@link Tokenizer#mark} and consumed by {@link Tokenizer#reset}. */\r\nexport class State {\r\n /** Current position. */\r\n pos: i32;\r\n /** Current token. */\r\n token: Token;\r\n /** Current token's position. */\r\n tokenPos: i32;\r\n}\r\n\r\n// Reusable state object to reduce allocations\r\nvar reusableState: State | null = null;\r\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\r\n * Resolve infrastructure to obtain types and elements.\r\n * @module resolver\r\n *//***/\r\n\r\nimport {\r\n DiagnosticEmitter,\r\n DiagnosticCode\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Program,\r\n ElementKind,\r\n OperatorKind,\r\n Element,\r\n Class,\r\n ClassPrototype,\r\n Function,\r\n FunctionPrototype,\r\n VariableLikeElement,\r\n Property,\r\n PropertyPrototype,\r\n Field,\r\n FieldPrototype,\r\n Global,\r\n TypeDefinition\r\n} from \"./program\";\r\n\r\nimport {\r\n FlowFlags,\r\n Flow\r\n} from \"./flow\";\r\n\r\nimport {\r\n SignatureNode,\r\n ParameterKind,\r\n CommonTypeNode,\r\n NodeKind,\r\n TypeNode,\r\n TypeName,\r\n TypeParameterNode,\r\n Node,\r\n Range,\r\n IdentifierExpression,\r\n CallExpression,\r\n ElementAccessExpression,\r\n PropertyAccessExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n ParenthesizedExpression,\r\n AssertionExpression,\r\n Expression,\r\n IntegerLiteralExpression,\r\n UnaryPrefixExpression,\r\n UnaryPostfixExpression,\r\n AssertionKind,\r\n BinaryExpression,\r\n ThisExpression,\r\n SuperExpression\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n Signature,\r\n typesToString,\r\n TypeKind,\r\n TypeFlags\r\n} from \"./types\";\r\n\r\nimport {\r\n CommonFlags,\r\n CommonSymbols\r\n} from \"./common\";\r\n\r\nimport {\r\n makeMap\r\n} from \"./util\";\r\n\r\nimport {\r\n Token\r\n} from \"./tokenizer\";\r\n\r\n/** Indicates whether errors are reported or not. */\r\nexport enum ReportMode {\r\n /** Report errors. */\r\n REPORT,\r\n /** Swallow errors. */\r\n SWALLOW\r\n}\r\n\r\n/** Provides tools to resolve types and expressions. */\r\nexport class Resolver extends DiagnosticEmitter {\r\n\r\n /** The program this resolver belongs to. */\r\n program: Program;\r\n\r\n /** Target expression of the previously resolved property or element access. */\r\n currentThisExpression: Expression | null = null;\r\n /** Element expression of the previously resolved element access. */\r\n currentElementExpression : Expression | null = null;\r\n\r\n /** Constructs the resolver for the specified program. */\r\n constructor(\r\n /** The program to construct a resolver for. */\r\n program: Program\r\n ) {\r\n super(program.diagnostics);\r\n this.program = program;\r\n }\r\n\r\n /** Resolves a {@link CommonTypeNode} to a concrete {@link Type}. */\r\n resolveType(\r\n /** The type to resolve. */\r\n node: CommonTypeNode,\r\n /** Relative context. */\r\n context: Element,\r\n /** Type arguments inherited through context, i.e. `T`. */\r\n contextualTypeArguments: Map | null = null,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Type | null {\r\n\r\n // handle signature\r\n if (node.kind == NodeKind.SIGNATURE) {\r\n let explicitThisType = (node).explicitThisType;\r\n let thisType: Type | null = null;\r\n if (explicitThisType) {\r\n thisType = this.resolveType(\r\n explicitThisType,\r\n context,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!thisType) return null;\r\n }\r\n let parameterNodes = (node).parameters;\r\n let numParameters = parameterNodes.length;\r\n let parameterTypes = new Array(numParameters);\r\n let parameterNames = new Array(numParameters);\r\n let requiredParameters = 0;\r\n let hasRest = false;\r\n for (let i = 0; i < numParameters; ++i) {\r\n let parameterTypeNode = parameterNodes[i];\r\n switch (parameterTypeNode.parameterKind) {\r\n case ParameterKind.DEFAULT: {\r\n requiredParameters = i + 1;\r\n break;\r\n }\r\n case ParameterKind.REST: {\r\n assert(i == numParameters);\r\n hasRest = true;\r\n break;\r\n }\r\n }\r\n let parameterType = this.resolveType(\r\n assert(parameterTypeNode.type),\r\n context,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!parameterType) return null;\r\n parameterTypes[i] = parameterType;\r\n parameterNames[i] = parameterTypeNode.name.text;\r\n }\r\n let returnTypeNode = (node).returnType;\r\n let returnType: Type | null;\r\n if (returnTypeNode) {\r\n returnType = this.resolveType(\r\n returnTypeNode,\r\n context,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!returnType) return null;\r\n } else {\r\n returnType = Type.void;\r\n }\r\n let signature = new Signature(parameterTypes, returnType, thisType);\r\n signature.parameterNames = parameterNames;\r\n signature.requiredParameters = requiredParameters;\r\n signature.hasRest = hasRest;\r\n return node.isNullable ? signature.type.asNullable() : signature.type;\r\n }\r\n\r\n // now dealing with TypeNode\r\n assert(node.kind == NodeKind.TYPE);\r\n var typeNode = node;\r\n var typeName = typeNode.name;\r\n var typeArgumentNodes = typeNode.typeArguments;\r\n var possiblyPlaceholder = !typeName.next;\r\n\r\n // look up in contextual type arguments if possibly a placeholder\r\n if (possiblyPlaceholder) {\r\n if (contextualTypeArguments && contextualTypeArguments.has(typeName.identifier.text)) {\r\n let type = contextualTypeArguments.get(typeName.identifier.text)!;\r\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n node.range, type.toString()\r\n );\r\n }\r\n }\r\n if (node.isNullable) {\r\n if (!type.is(TypeFlags.REFERENCE)) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Basic_type_0_cannot_be_nullable,\r\n node.range, type.toString()\r\n );\r\n }\r\n }\r\n return type.asNullable();\r\n }\r\n return type;\r\n }\r\n }\r\n\r\n // look up in context\r\n var element = this.resolveTypeName(typeName, context, reportMode);\r\n if (!element) return null;\r\n\r\n // use shadow type if present (i.e. namespace sharing a type)\r\n if (element.shadowType) {\r\n element = element.shadowType;\r\n\r\n } else {\r\n // handle enums (become i32)\r\n if (element.kind == ElementKind.ENUM) {\r\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n node.range, element.internalName\r\n );\r\n }\r\n }\r\n if (node.isNullable) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Basic_type_0_cannot_be_nullable,\r\n node.range, element.name\r\n );\r\n }\r\n }\r\n return Type.i32;\r\n }\r\n\r\n // handle classes\r\n if (element.kind == ElementKind.CLASS_PROTOTYPE) {\r\n let instance = this.resolveClassInclTypeArguments(\r\n element,\r\n typeArgumentNodes,\r\n context,\r\n makeMap(contextualTypeArguments), // don't inherit\r\n node\r\n ); // reports\r\n if (!instance) return null;\r\n return node.isNullable ? instance.type.asNullable() : instance.type;\r\n }\r\n }\r\n\r\n // handle type definitions\r\n if (element.kind == ElementKind.TYPEDEFINITION) {\r\n\r\n // shortcut already resolved (mostly builtins)\r\n if (element.is(CommonFlags.RESOLVED)) {\r\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n node.range, element.internalName\r\n );\r\n }\r\n }\r\n let type = (element).type;\r\n if (node.isNullable) {\r\n if (!type.is(TypeFlags.REFERENCE)) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Basic_type_0_cannot_be_nullable,\r\n typeNode.name.range, typeName.identifier.text\r\n );\r\n }\r\n } else {\r\n return type.asNullable();\r\n }\r\n }\r\n return type;\r\n }\r\n\r\n // handle special native type\r\n if (possiblyPlaceholder && typeName.identifier.text == CommonSymbols.native) {\r\n if (!(typeArgumentNodes && typeArgumentNodes.length == 1)) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n typeNode.range, \"1\", (typeArgumentNodes ? typeArgumentNodes.length : 1).toString(10)\r\n );\r\n }\r\n return null;\r\n }\r\n let typeArgument = this.resolveType(\r\n typeArgumentNodes[0],\r\n context,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!typeArgument) return null;\r\n switch (typeArgument.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: return Type.i32;\r\n case TypeKind.ISIZE: if (!this.program.options.isWasm64) return Type.i32;\r\n case TypeKind.I64: return Type.i64;\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: return Type.u32;\r\n case TypeKind.USIZE: if (!this.program.options.isWasm64) return Type.u32;\r\n case TypeKind.U64: return Type.u64;\r\n case TypeKind.F32: return Type.f32;\r\n case TypeKind.F64: return Type.f64;\r\n case TypeKind.V128: return Type.v128;\r\n case TypeKind.VOID: return Type.void;\r\n default: assert(false);\r\n }\r\n }\r\n\r\n // resolve normally\r\n let typeParameterNodes = (element).typeParameterNodes;\r\n let typeArguments: Type[] | null = null;\r\n if (typeParameterNodes) {\r\n typeArguments = this.resolveTypeArguments(\r\n typeParameterNodes,\r\n typeArgumentNodes,\r\n context,\r\n contextualTypeArguments = makeMap(contextualTypeArguments), // inherit\r\n node,\r\n reportMode\r\n );\r\n if (!typeArguments) return null;\r\n } else if (typeArgumentNodes && typeArgumentNodes.length) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n typeNode.range, typeName.identifier.text\r\n );\r\n // recoverable\r\n }\r\n return this.resolveType(\r\n (element).typeNode,\r\n element,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n typeNode.name.range, typeName.identifier.text\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a type name to the program element it refers to. */\r\n resolveTypeName(\r\n /** The type name to resolve. */\r\n typeName: TypeName,\r\n /** Relative context. */\r\n context: Element,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode = ReportMode.REPORT\r\n ): Element | null {\r\n var element = context.lookup(typeName.identifier.text);\r\n if (!element) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n typeName.range, typeName.identifier.text\r\n );\r\n }\r\n return null;\r\n }\r\n var prev = typeName;\r\n var next = typeName.next;\r\n while (next) {\r\n if (!(element = element.lookupInSelf(next.identifier.text))) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n next.range, next.identifier.text, prev.identifier.text\r\n );\r\n }\r\n return null;\r\n }\r\n prev = next;\r\n next = next.next;\r\n }\r\n return element;\r\n }\r\n\r\n /** Resolves an array of type arguments to concrete types. */\r\n resolveTypeArguments(\r\n /** Actual type parameter nodes. */\r\n typeParameters: TypeParameterNode[],\r\n /** Type arguments provided. */\r\n typeArgumentNodes: CommonTypeNode[] | null,\r\n /** Relative context. */\r\n context: Element,\r\n /** Type arguments inherited through context, i.e. `T`. */\r\n contextualTypeArguments: Map = makeMap(),\r\n /** Alternative report node in case of empty type arguments. */\r\n alternativeReportNode: Node | null = null,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Type[] | null {\r\n var minParameterCount = 0;\r\n var maxParameterCount = 0;\r\n for (let i = 0; i < typeParameters.length; ++i) {\r\n if (!typeParameters[i].defaultType) ++minParameterCount;\r\n ++maxParameterCount;\r\n }\r\n var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;\r\n if (argumentCount < minParameterCount || argumentCount > maxParameterCount) {\r\n this.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n argumentCount\r\n ? Range.join(\r\n (typeArgumentNodes)[0].range,\r\n (typeArgumentNodes)[argumentCount - 1].range\r\n )\r\n : assert(alternativeReportNode).range,\r\n (argumentCount < minParameterCount ? minParameterCount : maxParameterCount).toString(10),\r\n argumentCount.toString(10)\r\n );\r\n return null;\r\n }\r\n var typeArguments = new Array(maxParameterCount);\r\n for (let i = 0; i < maxParameterCount; ++i) {\r\n let type = i < argumentCount\r\n ? this.resolveType( // reports\r\n (typeArgumentNodes)[i],\r\n context,\r\n contextualTypeArguments,\r\n reportMode\r\n )\r\n : this.resolveType( // reports\r\n assert(typeParameters[i].defaultType),\r\n context,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!type) return null;\r\n // TODO: check extendsType\r\n contextualTypeArguments.set(typeParameters[i].name.text, type);\r\n typeArguments[i] = type;\r\n }\r\n return typeArguments;\r\n }\r\n\r\n /** Resolves an identifier to the program element it refers to. */\r\n resolveIdentifier(\r\n /** The expression to resolve. */\r\n identifier: IdentifierExpression,\r\n /** Optional flow to search for scoped locals. */\r\n flow: Flow | null,\r\n /** Optional context to search. */\r\n context: Element | null,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n var name = identifier.text;\r\n var element: Element | null;\r\n if (flow) {\r\n if (element = flow.lookup(name)) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return element;\r\n }\r\n }\r\n if (context) {\r\n if (element = context.lookup(name)) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return element;\r\n }\r\n }\r\n if (element = this.program.lookupGlobal(name)) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return element;\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n identifier.range, name\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a lazily compiled global, i.e. a static class field. */\r\n ensureResolvedLazyGlobal(global: Global, reportMode: ReportMode = ReportMode.REPORT): bool {\r\n if (global.is(CommonFlags.RESOLVED)) return true;\r\n var typeNode = global.typeNode;\r\n if (!typeNode) return false;\r\n var type = this.resolveType( // reports\r\n typeNode,\r\n global.parent,\r\n null,\r\n reportMode\r\n );\r\n if (!type) return false;\r\n global.setType(type);\r\n return true;\r\n }\r\n\r\n /** Resolves a property access expression to the program element it refers to. */\r\n resolvePropertyAccessExpression(\r\n /** The expression to resolve. */\r\n propertyAccess: PropertyAccessExpression,\r\n /** Current flow. */\r\n flow: Flow,\r\n /** Current contextual type. */\r\n contextualType: Type,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n var targetExpression = propertyAccess.expression;\r\n var target = this.resolveExpression(targetExpression, flow, contextualType, reportMode); // reports\r\n if (!target) return null;\r\n var propertyName = propertyAccess.property.text;\r\n\r\n // Resolve variable-likes to their class type first\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL: if (!this.ensureResolvedLazyGlobal(target, reportMode)) return null;\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD: {\r\n let type = (target).type; assert(type != Type.void);\r\n let classReference = type.classReference;\r\n if (!classReference) {\r\n let typeClasses = this.program.typeClasses;\r\n if (!type.is(TypeFlags.REFERENCE) && typeClasses.has(type.kind)) {\r\n classReference = typeClasses.get(type.kind)!;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, (target).type.toString()\r\n );\r\n return null;\r\n }\r\n }\r\n target = classReference;\r\n break;\r\n }\r\n case ElementKind.PROPERTY_PROTOTYPE: { // static\r\n let getterInstance = this.resolveFunction( // reports\r\n assert((target).getterPrototype), // must have a getter\r\n null,\r\n makeMap(),\r\n reportMode\r\n );\r\n if (!getterInstance) return null;\r\n let classReference = getterInstance.signature.returnType.classReference;\r\n if (!classReference) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, getterInstance.signature.returnType.toString()\r\n );\r\n return null;\r\n }\r\n target = classReference;\r\n break;\r\n }\r\n case ElementKind.PROPERTY: { // instance\r\n let getterInstance = assert((target).getterInstance); // must have a getter\r\n let classReference = getterInstance.signature.returnType.classReference;\r\n if (!classReference) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, getterInstance.signature.returnType.toString()\r\n );\r\n return null;\r\n }\r\n target = classReference;\r\n break;\r\n }\r\n case ElementKind.CLASS: { // property access on element access?\r\n let elementExpression = this.currentElementExpression;\r\n if (elementExpression) {\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET);\r\n if (!indexedGet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n elementExpression.range, (target).internalName\r\n );\r\n return null;\r\n }\r\n let returnType = indexedGet.signature.returnType;\r\n if (!(target = returnType.classReference)) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, returnType.toString()\r\n );\r\n return null;\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // Look up the member within\r\n switch (target.kind) {\r\n case ElementKind.CLASS_PROTOTYPE:\r\n case ElementKind.CLASS: {\r\n do {\r\n let members = target.members;\r\n if (members && members.has(propertyName)) {\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = null;\r\n return members.get(propertyName)!; // instance FIELD, static GLOBAL, FUNCTION_PROTOTYPE...\r\n }\r\n // traverse inherited static members on the base prototype if target is a class prototype\r\n if (target.kind == ElementKind.CLASS_PROTOTYPE) {\r\n if ((target).basePrototype) {\r\n target = (target).basePrototype;\r\n } else {\r\n break;\r\n }\r\n // traverse inherited instance members on the base class if target is a class instance\r\n } else if (target.kind == ElementKind.CLASS) {\r\n if ((target).base) {\r\n target = (target).base;\r\n } else {\r\n break;\r\n }\r\n } else {\r\n break;\r\n }\r\n } while (true);\r\n break;\r\n }\r\n default: { // enums or other namespace-like elements\r\n let members = target.members;\r\n if (members && members.has(propertyName)) {\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = null;\r\n return members.get(propertyName)!; // static ENUMVALUE, static GLOBAL, static FUNCTION_PROTOTYPE...\r\n }\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n propertyAccess.property.range, propertyName, target.internalName\r\n );\r\n return null;\r\n }\r\n\r\n /** Resolves an element access expression to the program element it refers to. */\r\n resolveElementAccessExpression(\r\n /** The expression to resolve. */\r\n elementAccess: ElementAccessExpression,\r\n /** Current flow. */\r\n flow: Flow,\r\n /** Current contextual type. */\r\n contextualType: Type,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n var targetExpression = elementAccess.expression;\r\n var target = this.resolveExpression(targetExpression, flow, contextualType, reportMode); // reports\r\n if (!target) return null;\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL: if (!this.ensureResolvedLazyGlobal(target, reportMode)) return null;\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD: {\r\n let type = (target).type;\r\n if (target = type.classReference) {\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = elementAccess.elementExpression;\r\n return target;\r\n }\r\n break;\r\n }\r\n case ElementKind.CLASS: {\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET);\r\n if (!indexedGet) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n elementAccess.range, (target).internalName\r\n );\r\n }\r\n return null;\r\n }\r\n if (targetExpression.kind == NodeKind.ELEMENTACCESS) { // nested element access\r\n let returnType = indexedGet.signature.returnType;\r\n if (target = returnType.classReference) {\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = elementAccess.elementExpression;\r\n return target;\r\n }\r\n return null;\r\n }\r\n this.currentThisExpression = targetExpression;\r\n this.currentElementExpression = elementAccess.elementExpression;\r\n return target;\r\n }\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n targetExpression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Determines the final type of an integer literal given the specified contextual type. */\r\n determineIntegerLiteralType(\r\n /** Integer literal value. */\r\n intValue: I64,\r\n /** Current contextual type. */\r\n contextualType: Type\r\n ): Type {\r\n if (!contextualType.is(TypeFlags.REFERENCE)) {\r\n // compile to contextualType if matching\r\n switch (contextualType.kind) {\r\n case TypeKind.I8: {\r\n if (i64_is_i8(intValue)) return Type.i8;\r\n break;\r\n }\r\n case TypeKind.U8: {\r\n if (i64_is_u8(intValue)) return Type.u8;\r\n break;\r\n }\r\n case TypeKind.I16: {\r\n if (i64_is_i16(intValue)) return Type.i16;\r\n break;\r\n }\r\n case TypeKind.U16: {\r\n if (i64_is_u16(intValue)) return Type.u16;\r\n break;\r\n }\r\n case TypeKind.I32: {\r\n if (i64_is_i32(intValue)) return Type.i32;\r\n break;\r\n }\r\n case TypeKind.U32: {\r\n if (i64_is_u32(intValue)) return Type.u32;\r\n break;\r\n }\r\n case TypeKind.BOOL: {\r\n if (i64_is_bool(intValue)) return Type.bool;\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n if (!this.program.options.isWasm64) {\r\n if (i64_is_i32(intValue)) return Type.isize32;\r\n break;\r\n }\r\n return Type.isize64;\r\n }\r\n case TypeKind.USIZE: {\r\n if (!this.program.options.isWasm64) {\r\n if (i64_is_u32(intValue)) return Type.usize32;\r\n break;\r\n }\r\n return Type.usize64;\r\n }\r\n case TypeKind.I64: return Type.i64;\r\n case TypeKind.U64: return Type.u64;\r\n case TypeKind.F32: return Type.f32;\r\n case TypeKind.F64: return Type.f64;\r\n case TypeKind.VOID: break; // best fitting below\r\n default: assert(false);\r\n }\r\n }\r\n // otherwise compile to best fitting native type\r\n if (i64_is_i32(intValue)) return Type.i32;\r\n if (i64_is_u32(intValue)) return Type.u32;\r\n return Type.i64;\r\n }\r\n\r\n /** Resolves any expression to the program element it refers to. */\r\n resolveExpression(\r\n /** The expression to resolve. */\r\n expression: Expression,\r\n /** Current flow. */\r\n flow: Flow,\r\n /** Current contextual type. */\r\n contextualType: Type = Type.void,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n while (expression.kind == NodeKind.PARENTHESIZED) { // simply skip\r\n expression = (expression).expression;\r\n }\r\n switch (expression.kind) {\r\n case NodeKind.ASSERTION: {\r\n return this.resolveAssertionExpression(\r\n expression,\r\n flow, contextualType, reportMode\r\n );\r\n }\r\n case NodeKind.UNARYPREFIX: {\r\n return this.resolveUnaryPrefixExpression(\r\n expression,\r\n flow, contextualType, reportMode\r\n );\r\n }\r\n case NodeKind.UNARYPOSTFIX: {\r\n return this.resolveUnaryPostfixExpression(\r\n expression,\r\n flow, contextualType, reportMode\r\n );\r\n }\r\n case NodeKind.BINARY: {\r\n return this.resolveBinaryExpression(\r\n expression,\r\n flow, contextualType, reportMode\r\n );\r\n }\r\n case NodeKind.THIS: {\r\n return this.resolveThisExpression(\r\n expression,\r\n flow, contextualType, reportMode\r\n );\r\n }\r\n case NodeKind.SUPER: {\r\n return this.resolveSuperExpression(\r\n expression,\r\n flow, contextualType, reportMode\r\n );\r\n }\r\n case NodeKind.IDENTIFIER: {\r\n return this.resolveIdentifier(\r\n expression,\r\n flow, flow.actualFunction, reportMode\r\n );\r\n }\r\n case NodeKind.LITERAL: {\r\n return this.resolveLiteralExpression(\r\n expression,\r\n flow, contextualType, reportMode\r\n );\r\n }\r\n case NodeKind.PROPERTYACCESS: {\r\n return this.resolvePropertyAccessExpression(\r\n expression,\r\n flow, contextualType, reportMode\r\n );\r\n }\r\n case NodeKind.ELEMENTACCESS: {\r\n return this.resolveElementAccessExpression(\r\n expression,\r\n flow, contextualType, reportMode\r\n );\r\n }\r\n case NodeKind.CALL: {\r\n return this.resolveCallExpression(\r\n expression,\r\n flow, contextualType, reportMode\r\n );\r\n }\r\n // TODO: everything else\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves an assertion expression to the program element it refers to. */\r\n resolveAssertionExpression(\r\n /** The expression to resolve. */\r\n expression: AssertionExpression,\r\n /** Current flow. */\r\n flow: Flow,\r\n /** Current contextual type. */\r\n contextualType: Type = Type.void,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n if (expression.assertionKind == AssertionKind.NONNULL) {\r\n return this.resolveExpression(\r\n expression.expression,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n var type = this.resolveType(\r\n assert(expression.toType), // must be set if not NONNULL\r\n flow.actualFunction,\r\n flow.contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!type) return null;\r\n var element: Element | null = type.classReference;\r\n if (!element) {\r\n let signature = type.signatureReference;\r\n if (!signature) return null;\r\n element = signature.asFunctionTarget(this.program);\r\n }\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return element;\r\n }\r\n\r\n /** Resolves an unary prefix expression to the program element it refers to. */\r\n resolveUnaryPrefixExpression(\r\n /** The expression to resolve. */\r\n expression: UnaryPrefixExpression,\r\n /** Current flow. */\r\n flow: Flow,\r\n /** Current contextual type. */\r\n contextualType: Type = Type.void,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n var operand = expression.operand;\r\n // TODO: operator overloads\r\n switch (expression.operator) {\r\n case Token.MINUS: {\r\n // implicitly negate if an integer literal to distinguish between i32/u32/i64\r\n if (operand.kind == NodeKind.LITERAL && (operand).literalKind == LiteralKind.INTEGER) {\r\n let type = this.determineIntegerLiteralType(\r\n i64_sub(i64_zero, (operand).value),\r\n contextualType\r\n );\r\n let typeClasses = this.program.typeClasses;\r\n return typeClasses.has(type.kind) ? typeClasses.get(type.kind)! : null;\r\n }\r\n return this.resolveExpression(\r\n operand,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n case Token.PLUS:\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS: {\r\n return this.resolveExpression(\r\n expression.operand,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n case Token.EXCLAMATION: {\r\n let typeClasses = this.program.typeClasses;\r\n return typeClasses.has(TypeKind.BOOL) ? typeClasses.get(TypeKind.BOOL)! : null;\r\n }\r\n case Token.TILDE: {\r\n let resolvedOperand = this.resolveExpression(\r\n expression.operand,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n if (!resolvedOperand) return null;\r\n // TODO\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves an unary postfix expression to the program element it refers to. */\r\n resolveUnaryPostfixExpression(\r\n /** The expression to resolve. */\r\n expression: UnaryPostfixExpression,\r\n /** Current flow. */\r\n flow: Flow,\r\n /** Current contextual type. */\r\n contextualType: Type = Type.void,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n // TODO: operator overloads\r\n switch (expression.operator) {\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS: {\r\n return this.resolveExpression(\r\n expression.operand,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n }\r\n default: assert(false);\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a binary expression to the program element it refers to. */\r\n resolveBinaryExpression(\r\n /** The expression to resolve. */\r\n expression: BinaryExpression,\r\n /** Current flow. */\r\n flow: Flow,\r\n /** Current contextual type. */\r\n contextualType: Type = Type.void,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n // TODO\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a this expression to the program element it refers to. */\r\n resolveThisExpression(\r\n /** The expression to resolve. */\r\n expression: ThisExpression,\r\n /** Current flow. */\r\n flow: Flow,\r\n /** Current contextual type. */\r\n contextualType: Type = Type.void,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n let thisLocal = flow.lookupLocal(CommonSymbols.this_);\r\n if (thisLocal) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return thisLocal;\r\n }\r\n }\r\n var parent = flow.actualFunction.parent;\r\n if (parent) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return parent;\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a super expression to the program element it refers to. */\r\n resolveSuperExpression(\r\n /** The expression to resolve. */\r\n expression: SuperExpression,\r\n /** Current flow. */\r\n flow: Flow,\r\n /** Current contextual type. */\r\n contextualType: Type = Type.void,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n let superLocal = flow.lookupLocal(CommonSymbols.super_);\r\n if (superLocal) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return superLocal;\r\n }\r\n }\r\n var parent: Element | null = flow.actualFunction.parent;\r\n if (parent && parent.kind == ElementKind.CLASS && (parent = (parent).base)) {\r\n this.currentThisExpression = null;\r\n this.currentElementExpression = null;\r\n return parent;\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a literal expression to the program element it refers to. */\r\n resolveLiteralExpression(\r\n /** The expression to resolve. */\r\n expression: LiteralExpression,\r\n /** Current flow. */\r\n flow: Flow,\r\n /** Current contextual type. */\r\n contextualType: Type = Type.void,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n switch (expression.literalKind) {\r\n case LiteralKind.INTEGER: {\r\n this.currentThisExpression = expression;\r\n this.currentElementExpression = null;\r\n let literalType = this.determineIntegerLiteralType(\r\n (expression).value,\r\n contextualType\r\n );\r\n let typeClasses = this.program.typeClasses;\r\n return typeClasses.has(literalType.kind) ? typeClasses.get(literalType.kind)! : null;\r\n }\r\n case LiteralKind.FLOAT: {\r\n this.currentThisExpression = expression;\r\n this.currentElementExpression = null;\r\n let literalType = contextualType == Type.f32 ? Type.f32 : Type.f64;\r\n let typeClasses = this.program.typeClasses;\r\n return typeClasses.has(literalType.kind) ? typeClasses.get(literalType.kind)! : null;\r\n }\r\n case LiteralKind.STRING: {\r\n this.currentThisExpression = expression;\r\n this.currentElementExpression = null;\r\n return this.program.stringInstance;\r\n }\r\n // TODO\r\n // case LiteralKind.ARRAY:\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a call expression to the program element it refers to. */\r\n resolveCallExpression(\r\n /** The expression to resolve. */\r\n expression: CallExpression,\r\n /** Current flow. */\r\n flow: Flow,\r\n /** Current contextual type. */\r\n contextualType: Type = Type.void,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Element | null {\r\n var targetExpression = expression.expression;\r\n var target = this.resolveExpression( // reports\r\n targetExpression,\r\n flow,\r\n contextualType,\r\n reportMode\r\n );\r\n if (!target) return null;\r\n if (target.kind == ElementKind.FUNCTION_PROTOTYPE) {\r\n let instance = this.resolveFunctionInclTypeArguments(\r\n target,\r\n expression.typeArguments,\r\n flow.actualFunction,\r\n makeMap(flow.contextualTypeArguments), // don't inherit\r\n expression,\r\n reportMode\r\n );\r\n if (!instance) return null;\r\n let returnType = instance.signature.returnType;\r\n let classType = returnType.classReference;\r\n if (classType) {\r\n // reuse resolvedThisExpression (might be property access)\r\n // reuse resolvedElementExpression (might be element access)\r\n return classType;\r\n } else {\r\n let signature = returnType.signatureReference;\r\n if (signature) {\r\n let functionTarget = signature.asFunctionTarget(this.program);\r\n // reuse resolvedThisExpression (might be property access)\r\n // reuse resolvedElementExpression (might be element access)\r\n return functionTarget;\r\n }\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n targetExpression.range, target.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /** Resolves a function prototype using the specified concrete type arguments. */\r\n resolveFunction(\r\n /** The prototype of the function. */\r\n prototype: FunctionPrototype,\r\n /** Concrete type arguments. */\r\n typeArguments: Type[] | null,\r\n /** Type arguments inherited through context, i.e. `T`. */\r\n contextualTypeArguments: Map = makeMap(),\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Function | null {\r\n var actualParent = prototype.parent.kind == ElementKind.PROPERTY_PROTOTYPE\r\n ? prototype.parent.parent\r\n : prototype.parent;\r\n var classInstance: Class | null = null; // if an instance method\r\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\r\n\r\n // Instance method prototypes are pre-bound to their concrete class as their parent\r\n if (prototype.is(CommonFlags.INSTANCE)) {\r\n assert(actualParent.kind == ElementKind.CLASS);\r\n classInstance = actualParent;\r\n\r\n // check if this exact concrete class and function combination is known already\r\n let resolvedInstance = prototype.getResolvedInstance(instanceKey);\r\n if (resolvedInstance) return resolvedInstance;\r\n\r\n // inherit class specific type arguments\r\n let classTypeArguments = classInstance.typeArguments;\r\n if (classTypeArguments) {\r\n let classTypeParameters = assert(classInstance.prototype.typeParameterNodes);\r\n let numClassTypeArguments = classTypeParameters.length;\r\n assert(numClassTypeArguments == classTypeParameters.length);\r\n for (let i = 0; i < numClassTypeArguments; ++i) {\r\n let classTypeParameterName = classTypeParameters[i].name.text;\r\n if (!contextualTypeArguments.has(classTypeParameterName)) {\r\n contextualTypeArguments.set(\r\n classTypeParameterName,\r\n classTypeArguments[i]\r\n );\r\n }\r\n }\r\n }\r\n } else {\r\n assert(actualParent.kind != ElementKind.CLASS); // must not be pre-bound\r\n let resolvedInstance = prototype.getResolvedInstance(instanceKey);\r\n if (resolvedInstance) return resolvedInstance;\r\n }\r\n\r\n // override whatever is contextual with actual function type arguments\r\n var signatureNode = prototype.signatureNode;\r\n var typeParameterNodes = prototype.typeParameterNodes;\r\n var numFunctionTypeArguments: i32;\r\n if (typeArguments && (numFunctionTypeArguments = typeArguments.length)) {\r\n assert(typeParameterNodes && numFunctionTypeArguments == typeParameterNodes.length);\r\n for (let i = 0; i < numFunctionTypeArguments; ++i) {\r\n contextualTypeArguments.set(\r\n (typeParameterNodes)[i].name.text,\r\n typeArguments[i]\r\n );\r\n }\r\n } else {\r\n assert(!typeParameterNodes || typeParameterNodes.length == 0);\r\n }\r\n\r\n // resolve `this` type if applicable\r\n var thisType: Type | null = null;\r\n var explicitThisType = signatureNode.explicitThisType;\r\n if (explicitThisType) {\r\n thisType = this.resolveType(\r\n explicitThisType,\r\n prototype.parent, // relative to function\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!thisType) return null;\r\n contextualTypeArguments.set(CommonSymbols.this_, thisType);\r\n } else if (classInstance) {\r\n thisType = classInstance.type;\r\n contextualTypeArguments.set(CommonSymbols.this_, thisType);\r\n }\r\n\r\n // resolve parameter types\r\n var signatureParameters = signatureNode.parameters;\r\n var numSignatureParameters = signatureParameters.length;\r\n var parameterTypes = new Array(numSignatureParameters);\r\n var parameterNames = new Array(numSignatureParameters);\r\n var requiredParameters = 0;\r\n for (let i = 0; i < numSignatureParameters; ++i) {\r\n let parameterDeclaration = signatureParameters[i];\r\n if (parameterDeclaration.parameterKind == ParameterKind.DEFAULT) {\r\n requiredParameters = i + 1;\r\n }\r\n let typeNode = assert(parameterDeclaration.type);\r\n let parameterType = this.resolveType(\r\n typeNode,\r\n prototype.parent, // relative to function\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!parameterType) return null;\r\n parameterTypes[i] = parameterType;\r\n parameterNames[i] = parameterDeclaration.name.text;\r\n }\r\n\r\n // resolve return type\r\n var returnType: Type;\r\n if (prototype.is(CommonFlags.SET)) {\r\n returnType = Type.void; // not annotated\r\n } else if (prototype.is(CommonFlags.CONSTRUCTOR)) {\r\n returnType = assert(classInstance).type; // not annotated\r\n } else {\r\n let typeNode = assert(signatureNode.returnType);\r\n let type = this.resolveType(\r\n typeNode,\r\n prototype.parent, // relative to function\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n if (!type) return null;\r\n returnType = type;\r\n }\r\n\r\n var signature = new Signature(parameterTypes, returnType, thisType);\r\n signature.parameterNames = parameterNames;\r\n signature.requiredParameters = requiredParameters;\r\n\r\n var nameInclTypeParameters = prototype.name;\r\n if (instanceKey.length) nameInclTypeParameters += \"<\" + instanceKey + \">\";\r\n var instance = new Function(\r\n nameInclTypeParameters,\r\n prototype,\r\n signature,\r\n contextualTypeArguments\r\n );\r\n prototype.setResolvedInstance(instanceKey, instance);\r\n return instance;\r\n }\r\n\r\n /** Resolves a function prototypeby first resolving the specified type arguments. */\r\n resolveFunctionInclTypeArguments(\r\n /** The prototype of the function. */\r\n prototype: FunctionPrototype,\r\n /** Type arguments provided. */\r\n typeArgumentNodes: CommonTypeNode[] | null,\r\n /** Relative context. Type arguments are resolved from here. */\r\n context: Element,\r\n /** Type arguments inherited through context, i.e. `T`. */\r\n contextualTypeArguments: Map,\r\n /** The node to use when reporting intermediate errors. */\r\n reportNode: Node,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Function | null {\r\n var actualParent = prototype.parent.kind == ElementKind.PROPERTY_PROTOTYPE\r\n ? prototype.parent.parent\r\n : prototype.parent;\r\n var resolvedTypeArguments: Type[] | null = null;\r\n\r\n // Resolve type arguments if generic\r\n if (prototype.is(CommonFlags.GENERIC)) {\r\n\r\n // If this is an instance method, first apply the class's type arguments\r\n if (prototype.is(CommonFlags.INSTANCE)) {\r\n assert(actualParent.kind == ElementKind.CLASS);\r\n let classTypeArguments = (actualParent).typeArguments;\r\n if (classTypeArguments) {\r\n let typeParameterNodes = assert((actualParent).prototype.typeParameterNodes);\r\n let numClassTypeArguments = classTypeArguments.length;\r\n assert(numClassTypeArguments == typeParameterNodes.length);\r\n for (let i = 0; i < numClassTypeArguments; ++i) {\r\n contextualTypeArguments.set(\r\n typeParameterNodes[i].name.text,\r\n classTypeArguments[i]\r\n );\r\n }\r\n }\r\n }\r\n\r\n resolvedTypeArguments = this.resolveTypeArguments( // reports\r\n assert(prototype.typeParameterNodes),\r\n typeArgumentNodes,\r\n context,\r\n contextualTypeArguments,\r\n reportNode,\r\n reportMode\r\n );\r\n if (!resolvedTypeArguments) return null;\r\n\r\n // Otherwise make sure that no type arguments have been specified\r\n } else {\r\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Continue with concrete types\r\n return this.resolveFunction(\r\n prototype,\r\n resolvedTypeArguments,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n }\r\n\r\n /** Resolves a class prototype using the specified concrete type arguments. */\r\n resolveClass(\r\n /** The prototype of the class. */\r\n prototype: ClassPrototype,\r\n /** Concrete type arguments. */\r\n typeArguments: Type[] | null,\r\n /** Type arguments inherited through context, i.e. `T`. */\r\n contextualTypeArguments: Map = makeMap(),\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Class | null {\r\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\r\n\r\n // Check if this exact instance has already been resolved\r\n var instance = prototype.getResolvedInstance(instanceKey);\r\n if (instance) return instance;\r\n\r\n // Insert contextual type arguments for this operation. Internally, this method is always\r\n // called with matching type parameter / argument counts.\r\n if (typeArguments) {\r\n let typeParameterNodes = assert(prototype.typeParameterNodes);\r\n let numTypeParameters = typeParameterNodes.length;\r\n let numTypeArguments = typeArguments.length;\r\n assert(numTypeArguments == numTypeParameters);\r\n for (let i = 0; i < numTypeArguments; ++i) {\r\n contextualTypeArguments.set(typeParameterNodes[i].name.text, typeArguments[i]);\r\n }\r\n } else {\r\n let typeParameterNodes = prototype.typeParameterNodes;\r\n assert(!(typeParameterNodes && typeParameterNodes.length));\r\n }\r\n\r\n // Resolve base class if applicable\r\n var basePrototype = prototype.basePrototype;\r\n var baseClass: Class | null = null;\r\n if (basePrototype) {\r\n let extendsNode = assert(prototype.extendsNode); // must be present if it has a base prototype\r\n baseClass = this.resolveClassInclTypeArguments(\r\n basePrototype,\r\n extendsNode.typeArguments,\r\n prototype.parent, // relative to derived class\r\n makeMap(contextualTypeArguments), // don't inherit\r\n extendsNode,\r\n reportMode\r\n );\r\n if (!baseClass) return null;\r\n }\r\n\r\n // Construct the instance and remember that it has been resolved already\r\n var nameInclTypeParamters = prototype.name;\r\n if (instanceKey.length) nameInclTypeParamters += \"<\" + instanceKey + \">\";\r\n instance = new Class(nameInclTypeParamters, prototype, typeArguments, baseClass);\r\n instance.contextualTypeArguments = contextualTypeArguments;\r\n prototype.setResolvedInstance(instanceKey, instance);\r\n\r\n // Inherit base class members and set up the initial memory offset for own fields\r\n var memoryOffset: u32 = 0;\r\n if (baseClass) {\r\n let baseMembers = baseClass.members;\r\n if (baseMembers) {\r\n let instanceMembers = instance.members;\r\n if (!instanceMembers) instance.members = instanceMembers = new Map();\r\n for (let [baseMemberName, baseMember] of baseMembers) {\r\n instanceMembers.set(baseMemberName, baseMember);\r\n }\r\n }\r\n memoryOffset = baseClass.currentMemoryOffset;\r\n }\r\n\r\n // Resolve instance members\r\n var instanceMemberPrototypes = prototype.instanceMembers;\r\n if (instanceMemberPrototypes) {\r\n for (let member of instanceMemberPrototypes.values()) {\r\n switch (member.kind) {\r\n\r\n // Lay out fields in advance\r\n case ElementKind.FIELD_PROTOTYPE: {\r\n let instanceMembers = instance.members;\r\n if (!instanceMembers) instance.members = instanceMembers = new Map();\r\n else if (instanceMembers.has(member.name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n (member).identifierNode.range,\r\n member.name\r\n );\r\n break;\r\n }\r\n let fieldTypeNode = (member).typeNode;\r\n let fieldType: Type | null = null;\r\n // TODO: handle duplicate non-private fields specifically?\r\n if (!fieldTypeNode) {\r\n if (baseClass) {\r\n let baseMembers = baseClass.members;\r\n if (baseMembers && baseMembers.has((member).name)) {\r\n let baseField = baseMembers.get((member).name)!;\r\n if (!baseField.is(CommonFlags.PRIVATE)) {\r\n assert(baseField.kind == ElementKind.FIELD);\r\n fieldType = (baseField).type;\r\n }\r\n }\r\n }\r\n if (!fieldType) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n (member).identifierNode.range.atEnd\r\n );\r\n }\r\n }\r\n } else {\r\n fieldType = this.resolveType(\r\n fieldTypeNode,\r\n prototype.parent, // relative to class\r\n instance.contextualTypeArguments,\r\n reportMode\r\n );\r\n }\r\n if (!fieldType) break; // did report above\r\n let fieldInstance = new Field(member, instance, fieldType);\r\n switch (fieldType.byteSize) { // align\r\n case 1: break;\r\n case 2: { if (memoryOffset & 1) ++memoryOffset; break; }\r\n case 4: { if (memoryOffset & 3) memoryOffset = (memoryOffset | 3) + 1; break; }\r\n case 8: { if (memoryOffset & 7) memoryOffset = (memoryOffset | 7) + 1; break; }\r\n default: assert(false);\r\n }\r\n fieldInstance.memoryOffset = memoryOffset;\r\n memoryOffset += fieldType.byteSize;\r\n instance.add(member.name, fieldInstance); // reports\r\n break;\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n let boundPrototype = (member).toBound(instance);\r\n instance.add(boundPrototype.name, boundPrototype); // reports\r\n break;\r\n }\r\n case ElementKind.PROPERTY_PROTOTYPE: {\r\n let propertyInstance = new Property(member, instance);\r\n let getterPrototype = (member).getterPrototype;\r\n if (getterPrototype) {\r\n let getterInstance = this.resolveFunction(\r\n getterPrototype.toBound(instance),\r\n null,\r\n makeMap(instance.contextualTypeArguments),\r\n reportMode\r\n );\r\n if (getterInstance) {\r\n propertyInstance.getterInstance = getterInstance;\r\n propertyInstance.setType(getterInstance.signature.returnType);\r\n }\r\n }\r\n let setterPrototype = (member).setterPrototype;\r\n if (setterPrototype) {\r\n let setterInstance = this.resolveFunction(\r\n setterPrototype.toBound(instance),\r\n null,\r\n makeMap(instance.contextualTypeArguments),\r\n reportMode\r\n );\r\n if (setterInstance) {\r\n propertyInstance.setterInstance = setterInstance;\r\n if (!propertyInstance.is(CommonFlags.RESOLVED)) {\r\n assert(setterInstance.signature.parameterTypes.length == 1);\r\n propertyInstance.setType(setterInstance.signature.parameterTypes[0]);\r\n }\r\n }\r\n }\r\n instance.add(propertyInstance.name, propertyInstance); // reports\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n }\r\n\r\n // Finalize memory offset\r\n instance.currentMemoryOffset = memoryOffset;\r\n\r\n // Link _own_ constructor if present\r\n {\r\n let ctorPrototype = instance.lookupInSelf(CommonSymbols.constructor);\r\n if (ctorPrototype && ctorPrototype.parent === instance) {\r\n assert(ctorPrototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let ctorInstance = this.resolveFunction(\r\n ctorPrototype,\r\n null,\r\n instance.contextualTypeArguments,\r\n reportMode\r\n );\r\n if (ctorInstance) instance.constructorInstance = ctorInstance;\r\n }\r\n }\r\n\r\n // Fully resolve operator overloads (don't have type parameters on their own)\r\n for (let [kind, overloadPrototype] of prototype.overloadPrototypes) {\r\n assert(kind != OperatorKind.INVALID);\r\n let operatorInstance: Function | null;\r\n if (overloadPrototype.is(CommonFlags.INSTANCE)) {\r\n let boundPrototype = overloadPrototype.toBound(instance);\r\n operatorInstance = this.resolveFunction(\r\n boundPrototype,\r\n null,\r\n makeMap(),\r\n reportMode\r\n );\r\n } else {\r\n operatorInstance = this.resolveFunction(\r\n overloadPrototype,\r\n null,\r\n makeMap(),\r\n reportMode\r\n );\r\n }\r\n if (!operatorInstance) continue;\r\n let overloads = instance.overloads;\r\n if (!overloads) instance.overloads = overloads = new Map();\r\n overloads.set(kind, operatorInstance);\r\n }\r\n return instance;\r\n }\r\n\r\n /** Resolves a class prototype by first resolving the specified type arguments. */\r\n resolveClassInclTypeArguments(\r\n /** The prototype of the class. */\r\n prototype: ClassPrototype,\r\n /** Type argument nodes provided. */\r\n typeArgumentNodes: CommonTypeNode[] | null,\r\n /** Relative context. Type arguments are resolved from here. */\r\n context: Element,\r\n /** Type arguments inherited through context, i.e. `T`. */\r\n contextualTypeArguments: Map,\r\n /** The node to use when reporting intermediate errors. */\r\n reportNode: Node,\r\n /** How to proceed with eventualy diagnostics. */\r\n reportMode: ReportMode = ReportMode.REPORT\r\n ): Class | null {\r\n var resolvedTypeArguments: Type[] | null = null;\r\n\r\n // Resolve type arguments if generic\r\n if (prototype.is(CommonFlags.GENERIC)) {\r\n resolvedTypeArguments = this.resolveTypeArguments( // reports\r\n assert(prototype.typeParameterNodes), // must be present if generic\r\n typeArgumentNodes,\r\n context,\r\n contextualTypeArguments,\r\n reportNode,\r\n reportMode\r\n );\r\n if (!resolvedTypeArguments) return null;\r\n\r\n // Otherwise make sure that no type arguments have been specified\r\n } else {\r\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\r\n if (reportMode == ReportMode.REPORT) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Continue with concrete types\r\n return this.resolveClass(\r\n prototype,\r\n resolvedTypeArguments,\r\n contextualTypeArguments,\r\n reportMode\r\n );\r\n }\r\n}\r\n","/**\r\n * The AssemblyScript compiler.\r\n * @module compiler\r\n *//***/\r\n\r\nimport {\r\n compileCall as compileBuiltinCall,\r\n compileAbort,\r\n compileIterateRoots,\r\n ensureGCHook,\r\n BuiltinSymbols\r\n} from \"./builtins\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Module,\r\n MemorySegment,\r\n ExpressionRef,\r\n UnaryOp,\r\n BinaryOp,\r\n NativeType,\r\n FunctionRef,\r\n ExpressionId,\r\n FunctionTypeRef,\r\n GlobalRef,\r\n getExpressionId,\r\n getExpressionType,\r\n getConstValueI32,\r\n getConstValueI64Low,\r\n getConstValueI64High,\r\n getConstValueF32,\r\n getConstValueF64,\r\n getBlockChildCount,\r\n getBlockChild,\r\n getBlockName,\r\n needsExplicitUnreachable\r\n} from \"./module\";\r\n\r\nimport {\r\n CommonFlags,\r\n INSTANCE_DELIMITER,\r\n STATIC_DELIMITER,\r\n GETTER_PREFIX,\r\n SETTER_PREFIX,\r\n LibrarySymbols,\r\n CommonSymbols,\r\n INDEX_SUFFIX,\r\n LIBRARY_PREFIX\r\n} from \"./common\";\r\n\r\nimport {\r\n Program,\r\n ClassPrototype,\r\n Class,\r\n Element,\r\n ElementKind,\r\n Enum,\r\n Field,\r\n FunctionPrototype,\r\n Function,\r\n FunctionTarget,\r\n Global,\r\n Local,\r\n EnumValue,\r\n Property,\r\n VariableLikeElement,\r\n ConstantValueKind,\r\n OperatorKind,\r\n DecoratorFlags,\r\n PropertyPrototype,\r\n File,\r\n mangleInternalName\r\n} from \"./program\";\r\n\r\nimport {\r\n FlowFlags,\r\n Flow\r\n} from \"./flow\";\r\n\r\nimport {\r\n Resolver, ReportMode\r\n} from \"./resolver\";\r\n\r\nimport {\r\n Token,\r\n operatorTokenToString\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n TypeNode,\r\n Range,\r\n DecoratorKind,\r\n AssertionKind,\r\n\r\n Statement,\r\n BlockStatement,\r\n BreakStatement,\r\n ClassDeclaration,\r\n ContinueStatement,\r\n DeclarationStatement,\r\n DoStatement,\r\n EmptyStatement,\r\n EnumDeclaration,\r\n ExportStatement,\r\n ExpressionStatement,\r\n ForStatement,\r\n IfStatement,\r\n ImportStatement,\r\n InstanceOfExpression,\r\n InterfaceDeclaration,\r\n NamespaceDeclaration,\r\n ReturnStatement,\r\n SwitchStatement,\r\n ThrowStatement,\r\n TryStatement,\r\n VariableStatement,\r\n VoidStatement,\r\n WhileStatement,\r\n\r\n Expression,\r\n AssertionExpression,\r\n BinaryExpression,\r\n CallExpression,\r\n CommaExpression,\r\n ElementAccessExpression,\r\n FloatLiteralExpression,\r\n FunctionExpression,\r\n IdentifierExpression,\r\n IntegerLiteralExpression,\r\n LiteralExpression,\r\n LiteralKind,\r\n NewExpression,\r\n ObjectLiteralExpression,\r\n ParenthesizedExpression,\r\n PropertyAccessExpression,\r\n TernaryExpression,\r\n ArrayLiteralExpression,\r\n StringLiteralExpression,\r\n UnaryPostfixExpression,\r\n UnaryPrefixExpression,\r\n\r\n nodeIsConstantValue,\r\n findDecorator,\r\n FieldDeclaration\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags,\r\n Signature,\r\n\r\n typesToNativeTypes\r\n} from \"./types\";\r\n\r\nimport {\r\n writeI8,\r\n writeI16,\r\n writeI32,\r\n writeI64,\r\n writeF32,\r\n writeF64,\r\n makeMap\r\n} from \"./util\";\r\n\r\n/** Compilation target. */\r\nexport enum Target {\r\n /** WebAssembly with 32-bit pointers. */\r\n WASM32,\r\n /** WebAssembly with 64-bit pointers. Experimental and not supported by any runtime yet. */\r\n WASM64\r\n}\r\n\r\n/** Compiler options. */\r\nexport class Options {\r\n\r\n /** WebAssembly target. Defaults to {@link Target.WASM32}. */\r\n target: Target = Target.WASM32;\r\n /** If true, replaces assertions with nops. */\r\n noAssert: bool = false;\r\n /** If true, imports the memory provided by the embedder. */\r\n importMemory: bool = false;\r\n /** If greater than zero, declare memory as shared by setting max memory to sharedMemory. */\r\n sharedMemory: i32 = 0;\r\n /** If true, imports the function table provided by the embedder. */\r\n importTable: bool = false;\r\n /** If true, generates information necessary for source maps. */\r\n sourceMap: bool = false;\r\n /** Static memory start offset. */\r\n memoryBase: i32 = 0;\r\n /** Global aliases. */\r\n globalAliases: Map | null = null;\r\n /** Additional features to activate. */\r\n features: Feature = Feature.NONE;\r\n\r\n /** Hinted optimize level. Not applied by the compiler itself. */\r\n optimizeLevelHint: i32 = 0;\r\n /** Hinted shrink level. Not applied by the compiler itself. */\r\n shrinkLevelHint: i32 = 0;\r\n\r\n /** Tests if the target is WASM64 or, otherwise, WASM32. */\r\n get isWasm64(): bool {\r\n return this.target == Target.WASM64;\r\n }\r\n\r\n /** Gets the unsigned size type matching the target. */\r\n get usizeType(): Type {\r\n return this.target == Target.WASM64 ? Type.usize64 : Type.usize32;\r\n }\r\n\r\n /** Gets the signed size type matching the target. */\r\n get isizeType(): Type {\r\n return this.target == Target.WASM64 ? Type.isize64 : Type.isize32;\r\n }\r\n\r\n /** Gets the native size type matching the target. */\r\n get nativeSizeType(): NativeType {\r\n return this.target == Target.WASM64 ? NativeType.I64 : NativeType.I32;\r\n }\r\n\r\n /** Tests if a specific feature is activated. */\r\n hasFeature(feature: Feature): bool {\r\n return (this.features & feature) != 0;\r\n }\r\n}\r\n\r\n/** Indicates specific features to activate. */\r\nexport const enum Feature {\r\n /** No additional features. */\r\n NONE = 0,\r\n /** Sign extension operations. */\r\n SIGN_EXTENSION = 1 << 0, // see: https://github.com/WebAssembly/sign-extension-ops\r\n /** Mutable global imports and exports. */\r\n MUTABLE_GLOBAL = 1 << 1, // see: https://github.com/WebAssembly/mutable-global\r\n /** Bulk memory operations. */\r\n BULK_MEMORY = 1 << 2, // see: https://github.com/WebAssembly/bulk-memory-operations\r\n /** SIMD types and operations. */\r\n SIMD = 1 << 3, // see: https://github.com/WebAssembly/simd\r\n /** Threading and atomic operations. */\r\n THREADS = 1 << 4 // see: https://github.com/WebAssembly/threads\r\n}\r\n\r\n/** Indicates the desired kind of a conversion. */\r\nexport const enum ConversionKind {\r\n /** No conversion. */\r\n NONE,\r\n /** Implicit conversion. */\r\n IMPLICIT,\r\n /** Explicit conversion. */\r\n EXPLICIT\r\n}\r\n\r\n/** Indicates the desired wrap mode of a conversion. */\r\nexport const enum WrapMode {\r\n /** No wrapping. */\r\n NONE,\r\n /** Wrap small integer values. */\r\n WRAP\r\n}\r\n\r\n/** Compiler interface. */\r\nexport class Compiler extends DiagnosticEmitter {\r\n\r\n /** Program reference. */\r\n program: Program;\r\n /** Resolver reference. */\r\n resolver: Resolver;\r\n /** Provided options. */\r\n options: Options;\r\n /** Module instance being compiled. */\r\n module: Module;\r\n /** Current control flow. */\r\n currentFlow: Flow;\r\n /** Current inline functions stack. */\r\n currentInlineFunctions: Function[] = [];\r\n /** Current enum in compilation. */\r\n currentEnum: Enum | null = null;\r\n /** Current type in compilation. */\r\n currentType: Type = Type.void;\r\n /** Start function statements. */\r\n currentBody: ExpressionRef[];\r\n /** Counting memory offset. */\r\n memoryOffset: I64;\r\n /** Memory segments being compiled. */\r\n memorySegments: MemorySegment[] = [];\r\n /** Map of already compiled static string segments. */\r\n stringSegments: Map = new Map();\r\n /** Function table being compiled. */\r\n functionTable: string[] = [ \"null\" ];\r\n /** Argument count helper global. */\r\n argcVar: GlobalRef = 0;\r\n /** Argument count helper setter. */\r\n argcSet: FunctionRef = 0;\r\n /** Indicates whether the iterateRoots function must be generated. */\r\n needsIterateRoots: bool = false;\r\n\r\n /** Compiles a {@link Program} to a {@link Module} using the specified options. */\r\n static compile(program: Program, options: Options | null = null): Module {\r\n return new Compiler(program, options).compile();\r\n }\r\n\r\n /** Constructs a new compiler for a {@link Program} using the specified options. */\r\n constructor(program: Program, options: Options | null = null) {\r\n super(program.diagnostics);\r\n this.program = program;\r\n this.resolver = program.resolver;\r\n if (!options) options = new Options();\r\n this.options = options;\r\n this.memoryOffset = i64_new(\r\n // leave space for `null`. also functions as a sentinel for erroneous stores at offset 0.\r\n // note that Binaryen's asm.js output utilizes the first 8 bytes for reinterpretations (#1547)\r\n max(options.memoryBase, 8)\r\n );\r\n this.module = Module.create();\r\n }\r\n\r\n /** Performs compilation of the underlying {@link Program} to a {@link Module}. */\r\n compile(): Module {\r\n var options = this.options;\r\n var module = this.module;\r\n var program = this.program;\r\n\r\n // initialize lookup maps, built-ins, imports, exports, etc.\r\n program.initialize(options);\r\n\r\n // set up the main start function\r\n var startFunctionInstance = program.makeNativeFunction(\"start\", new Signature([], Type.void));\r\n startFunctionInstance.internalName = \"start\";\r\n var startFunctionBody = new Array();\r\n this.currentFlow = startFunctionInstance.flow;\r\n this.currentBody = startFunctionBody;\r\n\r\n // add a mutable heap base dummy\r\n if (options.isWasm64) {\r\n module.addGlobal(\r\n BuiltinSymbols.HEAP_BASE,\r\n NativeType.I64,\r\n true,\r\n module.createI64(0, 0)\r\n );\r\n } else {\r\n module.addGlobal(\r\n BuiltinSymbols.HEAP_BASE,\r\n NativeType.I32,\r\n false,\r\n module.createI32(0)\r\n );\r\n }\r\n\r\n // compile entry file(s) while traversing reachable elements\r\n var files = program.filesByName;\r\n for (let file of files.values()) {\r\n if (file.source.isEntry) {\r\n this.compileFile(file);\r\n this.compileExports(file);\r\n }\r\n }\r\n\r\n // compile the start function if not empty or called by main\r\n var explicitStartFunction = program.explicitStartFunction;\r\n if (startFunctionBody.length || explicitStartFunction) {\r\n let signature = startFunctionInstance.signature;\r\n let funcRef = module.addFunction(\r\n startFunctionInstance.internalName,\r\n this.ensureFunctionType(\r\n signature.parameterTypes,\r\n signature.returnType,\r\n signature.thisType\r\n ),\r\n typesToNativeTypes(startFunctionInstance.additionalLocals),\r\n module.createBlock(null, startFunctionBody)\r\n );\r\n startFunctionInstance.finalize(module, funcRef);\r\n if (!explicitStartFunction) module.setStart(funcRef);\r\n }\r\n\r\n // update the heap base pointer\r\n var memoryOffset = this.memoryOffset;\r\n memoryOffset = i64_align(memoryOffset, options.usizeType.byteSize);\r\n this.memoryOffset = memoryOffset;\r\n module.removeGlobal(BuiltinSymbols.HEAP_BASE);\r\n if (options.isWasm64) {\r\n module.addGlobal(\r\n BuiltinSymbols.HEAP_BASE,\r\n NativeType.I64,\r\n false,\r\n module.createI64(i64_low(memoryOffset), i64_high(memoryOffset))\r\n );\r\n } else {\r\n module.addGlobal(\r\n BuiltinSymbols.HEAP_BASE,\r\n NativeType.I32,\r\n false,\r\n module.createI32(i64_low(memoryOffset))\r\n );\r\n }\r\n\r\n // set up memory\r\n var isSharedMemory = options.hasFeature(Feature.THREADS) && options.sharedMemory > 0;\r\n module.setMemory(\r\n this.options.memoryBase /* is specified */ || this.memorySegments.length\r\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\r\n : 0,\r\n isSharedMemory ? options.sharedMemory : Module.UNLIMITED_MEMORY,\r\n this.memorySegments,\r\n options.target,\r\n \"memory\"\r\n );\r\n\r\n // import memory if requested (default memory is named '0' by Binaryen)\r\n if (options.importMemory) module.addMemoryImport(\"0\", \"env\", \"memory\", isSharedMemory);\r\n\r\n // set up function table\r\n var functionTable = this.functionTable;\r\n module.setFunctionTable(functionTable.length, 0xffffffff, functionTable);\r\n module.addTableExport(\"0\", \"table\");\r\n module.addFunction(\"null\", this.ensureFunctionType(null, Type.void), null, module.createBlock(null, []));\r\n\r\n // import table if requested (default table is named '0' by Binaryen)\r\n if (options.importTable) module.addTableImport(\"0\", \"env\", \"table\");\r\n\r\n // set up module exports\r\n for (let file of this.program.filesByName.values()) {\r\n if (file.source.isEntry) this.makeModuleExports(file);\r\n }\r\n\r\n // set up gc\r\n if (this.needsIterateRoots) compileIterateRoots(this);\r\n\r\n return module;\r\n }\r\n\r\n /** Applies the respective module exports for the specified file. */\r\n private makeModuleExports(file: File): void {\r\n var members = file.exports;\r\n if (members) for (let [name, member] of members) this.makeModuleExport(name, member);\r\n var exportsStar = file.exportsStar;\r\n if (exportsStar) {\r\n for (let i = 0, k = exportsStar.length; i < k; ++i) this.makeModuleExports(exportsStar[i]);\r\n }\r\n }\r\n\r\n /** Applies the respective module export(s) for the specified element. */\r\n private makeModuleExport(name: string, element: Element, prefix: string = \"\"): void {\r\n switch (element.kind) {\r\n\r\n // traverse instances\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n let instances = (element).instances;\r\n if (instances) {\r\n for (let instance of instances.values()) {\r\n let instanceName = name;\r\n if (instance.is(CommonFlags.GENERIC)) {\r\n let fullName = instance.internalName;\r\n instanceName += fullName.substring(fullName.lastIndexOf(\"<\"));\r\n }\r\n this.makeModuleExport(instanceName, instance, prefix);\r\n }\r\n }\r\n break;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n let instances = (element).instances;\r\n if (instances) {\r\n for (let instance of instances.values()) {\r\n let instanceName = name;\r\n if (instance.is(CommonFlags.GENERIC)) {\r\n let fullName = instance.internalName;\r\n instanceName += fullName.substring(fullName.lastIndexOf(\"<\"));\r\n }\r\n this.makeModuleExport(instanceName, instance, prefix);\r\n }\r\n }\r\n break;\r\n }\r\n case ElementKind.PROPERTY_PROTOTYPE: {\r\n let getter = (element).getterPrototype;\r\n let setter = (element).setterPrototype;\r\n if (getter) this.makeModuleExport(GETTER_PREFIX + name, getter, prefix);\r\n if (setter) this.makeModuleExport(SETTER_PREFIX + name, setter, prefix);\r\n break;\r\n }\r\n\r\n // export concrete elements\r\n case ElementKind.GLOBAL: {\r\n let isConst = element.is(CommonFlags.CONST) || element.is(CommonFlags.STATIC | CommonFlags.READONLY);\r\n if (!isConst && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n this.error(\r\n DiagnosticCode.Cannot_export_a_mutable_global,\r\n (element).identifierNode.range\r\n );\r\n } else {\r\n this.module.addGlobalExport(element.internalName, prefix + name);\r\n }\r\n break;\r\n }\r\n case ElementKind.ENUMVALUE: {\r\n if (!assert(element.parent).is(CommonFlags.CONST) && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n this.error(\r\n DiagnosticCode.Cannot_export_a_mutable_global,\r\n (element).identifierNode.range\r\n );\r\n } else {\r\n this.module.addGlobalExport(element.internalName, prefix + name);\r\n }\r\n break;\r\n }\r\n case ElementKind.FUNCTION: {\r\n let instance = element;\r\n let signature = instance.signature;\r\n if (signature.requiredParameters < signature.parameterTypes.length) {\r\n // utilize trampoline to fill in omitted arguments\r\n instance = this.ensureTrampoline(instance);\r\n this.ensureArgcSet();\r\n }\r\n if (instance.is(CommonFlags.COMPILED)) this.module.addFunctionExport(instance.internalName, prefix + name);\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let getter = (element).getterInstance;\r\n if (getter) this.makeModuleExport(GETTER_PREFIX + name, getter, prefix);\r\n let setter = (element).setterInstance;\r\n if (setter) this.makeModuleExport(SETTER_PREFIX + name, setter, prefix);\r\n break;\r\n }\r\n case ElementKind.FIELD: {\r\n let module = this.module;\r\n let type = (element).type;\r\n let nativeType = type.toNativeType();\r\n let offset = (element).memoryOffset;\r\n let usizeType = this.options.usizeType;\r\n let nativeSizeType = this.options.nativeSizeType;\r\n\r\n // make a getter\r\n let getterName = prefix + GETTER_PREFIX + name;\r\n module.addFunction(\r\n getterName,\r\n this.ensureFunctionType(null, type, usizeType),\r\n null,\r\n module.createLoad(\r\n type.byteSize,\r\n type.is(TypeFlags.SIGNED),\r\n module.createGetLocal(0, nativeSizeType),\r\n nativeType,\r\n offset\r\n )\r\n );\r\n module.addFunctionExport(getterName, getterName);\r\n\r\n // make a setter\r\n if (!element.is(CommonFlags.READONLY)) {\r\n let setterName = prefix + SETTER_PREFIX + name;\r\n module.addFunction(\r\n setterName,\r\n this.ensureFunctionType([ type ], Type.void, usizeType),\r\n null,\r\n module.createStore(\r\n type.byteSize,\r\n module.createGetLocal(0, nativeSizeType),\r\n module.createGetLocal(1, nativeType),\r\n nativeType,\r\n offset\r\n )\r\n );\r\n module.addFunctionExport(setterName, setterName);\r\n }\r\n break;\r\n }\r\n\r\n // just traverse members below\r\n case ElementKind.ENUM:\r\n case ElementKind.CLASS:\r\n case ElementKind.NAMESPACE:\r\n case ElementKind.FILE:\r\n case ElementKind.TYPEDEFINITION: break;\r\n\r\n default: assert(false); // unexpected module export\r\n }\r\n\r\n // traverse members\r\n var members = element.members;\r\n if (members) {\r\n let subPrefix = prefix + name + (element.kind == ElementKind.CLASS\r\n ? INSTANCE_DELIMITER\r\n : STATIC_DELIMITER\r\n );\r\n if (\r\n element.kind == ElementKind.NAMESPACE ||\r\n element.kind == ElementKind.FILE\r\n ) {\r\n for (let member of members.values()) {\r\n if (!member.is(CommonFlags.EXPORT)) continue;\r\n this.makeModuleExport(member.name, member, subPrefix);\r\n }\r\n } else {\r\n for (let member of members.values()) {\r\n if (member.is(CommonFlags.PRIVATE)) continue;\r\n this.makeModuleExport(member.name, member, subPrefix);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // general\r\n\r\n /** Compiles any element. */\r\n compileElement(element: Element, compileMembers: bool = true): void {\r\n switch (element.kind) {\r\n case ElementKind.GLOBAL: {\r\n this.compileGlobal(element);\r\n break;\r\n }\r\n case ElementKind.ENUM: {\r\n this.compileEnum(element);\r\n break;\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (!element.is(CommonFlags.GENERIC)) {\r\n this.compileFunctionUsingTypeArguments(element, []);\r\n }\r\n break;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n if (!element.is(CommonFlags.GENERIC)) {\r\n this.compileClassUsingTypeArguments(element, []);\r\n }\r\n break;\r\n }\r\n case ElementKind.PROPERTY_PROTOTYPE: {\r\n let getterPrototype = (element).getterPrototype;\r\n if (getterPrototype) {\r\n this.compileFunctionUsingTypeArguments(getterPrototype, []);\r\n }\r\n let setterPrototype = (element).setterPrototype;\r\n if (setterPrototype) {\r\n this.compileFunctionUsingTypeArguments(setterPrototype, []);\r\n }\r\n break;\r\n }\r\n case ElementKind.NAMESPACE:\r\n case ElementKind.TYPEDEFINITION:\r\n case ElementKind.ENUMVALUE: break;\r\n default: assert(false, ElementKind[element.kind]);\r\n }\r\n if (compileMembers) this.compileMembers(element);\r\n }\r\n\r\n /** Compiles an element's members. */\r\n compileMembers(element: Element): void {\r\n var members = element.members;\r\n if (members) for (let element of members.values()) this.compileElement(element);\r\n }\r\n\r\n /** Compiles a file's exports. */\r\n compileExports(file: File): void {\r\n var exports = file.exports;\r\n if (exports) for (let element of exports.values()) this.compileElement(element);\r\n var exportsStar = file.exportsStar;\r\n if (exportsStar) for (let exportStar of exportsStar) this.compileFile(exportStar);\r\n }\r\n\r\n // files\r\n\r\n /** Compiles the file matching the specified path. */\r\n compileFileByPath(normalizedPathWithoutExtension: string, reportNode: Node): void {\r\n var file: File;\r\n var filesByName = this.program.filesByName;\r\n var pathWithIndex: string;\r\n if (filesByName.has(normalizedPathWithoutExtension)) {\r\n file = filesByName.get(normalizedPathWithoutExtension)!;\r\n } else if (filesByName.has(pathWithIndex = normalizedPathWithoutExtension + INDEX_SUFFIX)) {\r\n file = filesByName.get(pathWithIndex)!;\r\n } else {\r\n this.error(\r\n DiagnosticCode.File_0_not_found,\r\n reportNode.range, normalizedPathWithoutExtension\r\n );\r\n return;\r\n }\r\n this.compileFile(file);\r\n }\r\n\r\n /** Compiles the specified file. */\r\n compileFile(file: File): void {\r\n if (file.is(CommonFlags.COMPILED)) return;\r\n file.set(CommonFlags.COMPILED);\r\n\r\n // compile top-level statements within the file's start function\r\n var startFunction = file.startFunction;\r\n var previousBody = this.currentBody;\r\n var startFunctionBody = new Array();\r\n this.currentBody = startFunctionBody;\r\n\r\n // compile top-level statements\r\n var previousFlow = this.currentFlow;\r\n this.currentFlow = startFunction.flow;\r\n for (let statements = file.source.statements, i = 0, k = statements.length; i < k; ++i) {\r\n this.compileTopLevelStatement(statements[i], startFunctionBody);\r\n }\r\n this.currentFlow = previousFlow;\r\n this.currentBody = previousBody;\r\n\r\n // if top-level statements are present, make the per-file start function and call it in start\r\n if (startFunctionBody.length) {\r\n let module = this.module;\r\n let locals = startFunction.localsByIndex;\r\n let numLocals = locals.length;\r\n let varTypes = new Array(numLocals);\r\n for (let i = 0; i < numLocals; ++i) varTypes[i] = locals[i].type.toNativeType();\r\n module.addFunction(\r\n startFunction.internalName,\r\n this.ensureFunctionType(startFunction.signature.parameterTypes, startFunction.signature.returnType),\r\n varTypes,\r\n startFunctionBody.length > 1\r\n ? module.createBlock(null, startFunctionBody)\r\n : startFunctionBody[0]\r\n );\r\n previousBody.push(\r\n module.createCall(startFunction.internalName, null, NativeType.None)\r\n );\r\n }\r\n }\r\n\r\n // globals\r\n\r\n compileGlobal(global: Global): bool {\r\n if (global.is(CommonFlags.COMPILED)) return true;\r\n global.set(CommonFlags.COMPILED);\r\n\r\n var module = this.module;\r\n var initExpr: ExpressionRef = 0;\r\n var typeNode = global.typeNode;\r\n var initializerNode = global.initializerNode;\r\n\r\n if (!global.is(CommonFlags.RESOLVED)) {\r\n\r\n // resolve now if annotated\r\n if (typeNode) {\r\n let resolvedType = this.resolver.resolveType(typeNode, global.parent); // reports\r\n if (!resolvedType) return false;\r\n if (resolvedType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n typeNode.range\r\n );\r\n return false;\r\n }\r\n global.setType(resolvedType);\r\n\r\n // infer from initializer if not annotated\r\n } else if (initializerNode) { // infer type using void/NONE for literal inference\r\n let previousFlow = this.currentFlow;\r\n if (global.hasDecorator(DecoratorFlags.LAZY)) {\r\n this.currentFlow = global.file.startFunction.flow;\r\n }\r\n initExpr = this.compileExpressionRetainType( // reports\r\n initializerNode,\r\n Type.void,\r\n WrapMode.WRAP\r\n );\r\n this.currentFlow = previousFlow;\r\n if (this.currentType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n initializerNode.range, this.currentType.toString(), \"\"\r\n );\r\n return false;\r\n }\r\n global.setType(this.currentType);\r\n\r\n // must either be annotated or have an initializer\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n global.identifierNode.range.atEnd\r\n );\r\n return false;\r\n }\r\n }\r\n\r\n // ambient builtins like 'HEAP_BASE' need to be resolved but are added explicitly\r\n if (global.is(CommonFlags.AMBIENT) && global.hasDecorator(DecoratorFlags.BUILTIN)) return true;\r\n\r\n var nativeType = global.type.toNativeType();\r\n var isDeclaredConstant = global.is(CommonFlags.CONST) || global.is(CommonFlags.STATIC | CommonFlags.READONLY);\r\n\r\n // handle imports\r\n if (global.is(CommonFlags.AMBIENT)) {\r\n\r\n // constant global\r\n if (isDeclaredConstant || this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\r\n global.set(CommonFlags.MODULE_IMPORT);\r\n mangleImportName(global, global.declaration);\r\n module.addGlobalImport(\r\n global.internalName,\r\n mangleImportName_moduleName,\r\n mangleImportName_elementName,\r\n nativeType\r\n );\r\n global.set(CommonFlags.COMPILED);\r\n return true;\r\n\r\n // importing mutable globals is not supported in the MVP\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n global.declaration.range\r\n );\r\n }\r\n return false;\r\n }\r\n\r\n // the MVP does not yet support initializer expressions other than constant values (and constant\r\n // get_globals), hence such initializations must be performed in the start function for now.\r\n var initializeInStart = false;\r\n\r\n // evaluate initializer if present\r\n if (initializerNode) {\r\n if (!initExpr) {\r\n let previousFlow = this.currentFlow;\r\n if (global.hasDecorator(DecoratorFlags.LAZY)) {\r\n this.currentFlow = global.file.startFunction.flow;\r\n }\r\n initExpr = this.compileExpression(\r\n initializerNode,\r\n global.type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP\r\n );\r\n this.currentFlow = previousFlow;\r\n }\r\n\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n if (isDeclaredConstant) {\r\n initExpr = module.precomputeExpression(initExpr);\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n initializerNode.range\r\n );\r\n initializeInStart = true;\r\n }\r\n } else {\r\n initializeInStart = true;\r\n }\r\n }\r\n\r\n // explicitly inline if annotated\r\n if (global.hasDecorator(DecoratorFlags.INLINE)) {\r\n if (!initializeInStart) { // reported above\r\n assert(getExpressionId(initExpr) == ExpressionId.Const);\r\n let exprType = getExpressionType(initExpr);\r\n switch (exprType) {\r\n case NativeType.I32: {\r\n global.constantValueKind = ConstantValueKind.INTEGER;\r\n global.constantIntegerValue = i64_new(getConstValueI32(initExpr), 0);\r\n break;\r\n }\r\n case NativeType.I64: {\r\n global.constantValueKind = ConstantValueKind.INTEGER;\r\n global.constantIntegerValue = i64_new(\r\n getConstValueI64Low(initExpr),\r\n getConstValueI64High(initExpr)\r\n );\r\n break;\r\n }\r\n case NativeType.F32: {\r\n global.constantValueKind = ConstantValueKind.FLOAT;\r\n global.constantFloatValue = getConstValueF32(initExpr);\r\n break;\r\n }\r\n case NativeType.F64: {\r\n global.constantValueKind = ConstantValueKind.FLOAT;\r\n global.constantFloatValue = getConstValueF64(initExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return false;\r\n }\r\n }\r\n global.set(CommonFlags.INLINED); // inline the value from now on\r\n }\r\n }\r\n\r\n // initialize to zero if there's no initializer\r\n } else {\r\n initExpr = global.type.toNativeZero(module);\r\n }\r\n\r\n var internalName = global.internalName;\r\n\r\n if (initializeInStart) { // initialize to mutable zero and set the actual value in start\r\n if (global.hasDecorator(DecoratorFlags.INLINE)) {\r\n this.error(\r\n DiagnosticCode.Decorator_0_is_not_valid_here,\r\n global.identifierNode.range, \"inline\"\r\n );\r\n }\r\n module.addGlobal(internalName, nativeType, true, global.type.toNativeZero(module));\r\n this.currentBody.push(module.createSetGlobal(internalName, initExpr));\r\n\r\n } else if (!global.hasDecorator(DecoratorFlags.INLINE)) { // compile normally\r\n module.addGlobal(internalName, nativeType, !isDeclaredConstant, initExpr);\r\n }\r\n return true;\r\n }\r\n\r\n // enums\r\n\r\n compileEnum(element: Enum): bool {\r\n if (element.is(CommonFlags.COMPILED)) return true;\r\n element.set(CommonFlags.COMPILED);\r\n\r\n var module = this.module;\r\n this.currentEnum = element;\r\n var previousValue: EnumValue | null = null;\r\n var previousValueIsMut = false;\r\n var isInline = element.is(CommonFlags.CONST) || element.hasDecorator(DecoratorFlags.INLINE);\r\n\r\n if (element.members) {\r\n for (let member of element.members.values()) {\r\n if (member.kind != ElementKind.ENUMVALUE) continue; // happens if an enum is also a namespace\r\n let initInStart = false;\r\n let val = member;\r\n let valueNode = val.valueNode;\r\n val.set(CommonFlags.COMPILED);\r\n let previousFlow = this.currentFlow;\r\n if (element.hasDecorator(DecoratorFlags.LAZY)) {\r\n this.currentFlow = element.file.startFunction.flow;\r\n }\r\n let initExpr: ExpressionRef;\r\n if (valueNode) {\r\n initExpr = this.compileExpression(\r\n valueNode,\r\n Type.i32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n if (element.is(CommonFlags.CONST)) {\r\n initExpr = module.precomputeExpression(initExpr);\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n this.error(\r\n DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,\r\n valueNode.range\r\n );\r\n initInStart = true;\r\n }\r\n } else {\r\n initInStart = true;\r\n }\r\n }\r\n } else if (previousValue == null) {\r\n initExpr = module.createI32(0);\r\n } else {\r\n if (previousValueIsMut) {\r\n this.error(\r\n DiagnosticCode.Enum_member_must_have_initializer,\r\n (member).identifierNode.range.atEnd\r\n );\r\n }\r\n initExpr = module.createBinary(BinaryOp.AddI32,\r\n module.createGetGlobal(previousValue.internalName, NativeType.I32),\r\n module.createI32(1)\r\n );\r\n initExpr = module.precomputeExpression(initExpr);\r\n if (getExpressionId(initExpr) != ExpressionId.Const) {\r\n if (element.is(CommonFlags.CONST)) {\r\n this.error(\r\n DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,\r\n member.declaration.range\r\n );\r\n }\r\n initInStart = true;\r\n }\r\n }\r\n this.currentFlow = previousFlow;\r\n if (initInStart) {\r\n module.addGlobal(val.internalName, NativeType.I32, true, module.createI32(0));\r\n this.currentBody.push(\r\n module.createSetGlobal(val.internalName, initExpr)\r\n );\r\n previousValueIsMut = true;\r\n } else {\r\n if (isInline) {\r\n val.setConstantIntegerValue(i64_new(getConstValueI32(initExpr)), Type.i32);\r\n if (val.is(CommonFlags.MODULE_EXPORT)) {\r\n module.addGlobal(val.internalName, NativeType.I32, false, initExpr);\r\n }\r\n } else {\r\n module.addGlobal(val.internalName, NativeType.I32, true, initExpr);\r\n }\r\n previousValueIsMut = false;\r\n }\r\n previousValue = val;\r\n }\r\n }\r\n this.currentEnum = null;\r\n return true;\r\n }\r\n\r\n // functions\r\n\r\n /** Resolves the specified type arguments prior to compiling the resulting function instance. */\r\n compileFunctionUsingTypeArguments(\r\n prototype: FunctionPrototype,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map = makeMap(),\r\n alternativeReportNode: Node | null = null\r\n ): Function | null {\r\n if (prototype.hasDecorator(DecoratorFlags.BUILTIN)) return null;\r\n var instance = this.resolver.resolveFunctionInclTypeArguments(\r\n prototype,\r\n typeArguments,\r\n prototype.parent, // relative to itself\r\n contextualTypeArguments,\r\n alternativeReportNode || prototype.declaration\r\n );\r\n if (!instance) return null;\r\n if (!this.compileFunction(instance)) return null; // reports\r\n return instance;\r\n }\r\n\r\n /** Either reuses or creates the function type matching the specified signature. */\r\n ensureFunctionType(\r\n parameterTypes: Type[] | null,\r\n returnType: Type,\r\n thisType: Type | null = null\r\n ): FunctionTypeRef {\r\n var numParameters = parameterTypes ? parameterTypes.length : 0;\r\n var paramTypes: NativeType[];\r\n var index = 0;\r\n if (thisType) {\r\n paramTypes = new Array(1 + numParameters);\r\n paramTypes[0] = thisType.toNativeType();\r\n index = 1;\r\n } else {\r\n paramTypes = new Array(numParameters);\r\n }\r\n if (parameterTypes) {\r\n for (let i = 0; i < numParameters; ++i, ++index) {\r\n paramTypes[index] = parameterTypes[i].toNativeType();\r\n }\r\n }\r\n var resultType = returnType.toNativeType();\r\n var module = this.module;\r\n var typeRef = module.getFunctionTypeBySignature(resultType, paramTypes);\r\n if (!typeRef) {\r\n let name = Signature.makeSignatureString(parameterTypes, returnType, thisType);\r\n typeRef = module.addFunctionType(name, resultType, paramTypes);\r\n }\r\n return typeRef;\r\n }\r\n\r\n /** Compiles the body of a function within the specified flow. */\r\n private compileFunctionBody(instance: Function): ExpressionRef[] {\r\n var module = this.module;\r\n var bodyNode = assert(instance.prototype.bodyNode);\r\n var returnType = instance.signature.returnType;\r\n var flow = this.currentFlow;\r\n\r\n // compile statements\r\n var stmts: BinaryenExportRef[];\r\n if (bodyNode.kind == NodeKind.BLOCK) {\r\n stmts = this.compileStatements((bodyNode).statements, true);\r\n } else {\r\n // must be an expression statement if not a block\r\n assert(bodyNode.kind == NodeKind.EXPRESSION);\r\n\r\n // must be an arrow function\r\n assert(instance.is(CommonFlags.ARROW));\r\n\r\n // none of the following can be an arrow function\r\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\r\n\r\n let stmt = this.compileExpression(\r\n (bodyNode).expression,\r\n returnType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n flow.set(FlowFlags.RETURNS);\r\n if (!flow.canOverflow(stmt, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\r\n stmts = [ stmt ];\r\n }\r\n\r\n // make the main function call `start` implicitly, but only once\r\n if (instance.prototype == this.program.explicitStartFunction) {\r\n module.addGlobal(CompilerSymbols.started, NativeType.I32, true, module.createI32(0));\r\n stmts.unshift(\r\n module.createIf(\r\n module.createUnary(\r\n UnaryOp.EqzI32,\r\n module.createGetGlobal(CompilerSymbols.started, NativeType.I32)\r\n ),\r\n module.createBlock(null, [\r\n module.createCall(\"start\", null, NativeType.None),\r\n module.createSetGlobal(CompilerSymbols.started, module.createI32(1))\r\n ])\r\n )\r\n );\r\n }\r\n\r\n // make constructors return their instance pointer\r\n if (instance.is(CommonFlags.CONSTRUCTOR)) {\r\n let nativeSizeType = this.options.nativeSizeType;\r\n assert(instance.is(CommonFlags.INSTANCE));\r\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n\r\n if (!flow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n let thisLocalIndex = flow.is(FlowFlags.INLINE_CONTEXT)\r\n ? assert(flow.lookupLocal(CommonSymbols.this_)).index\r\n : 0;\r\n\r\n // if `this` wasn't accessed before, allocate if necessary and initialize `this`\r\n if (!flow.is(FlowFlags.ALLOCATES)) {\r\n // {\r\n // if (!this) this = \r\n // this.a = X\r\n // this.b = Y\r\n // }\r\n stmts.push(\r\n module.createIf(\r\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\r\n module.createGetLocal(thisLocalIndex, nativeSizeType)\r\n ),\r\n module.createSetLocal(thisLocalIndex,\r\n this.makeAllocation(classInstance)\r\n )\r\n )\r\n );\r\n this.makeFieldInitialization(classInstance, stmts);\r\n }\r\n\r\n // implicitly return `this`\r\n stmts.push(\r\n module.createGetLocal(thisLocalIndex, nativeSizeType)\r\n );\r\n }\r\n\r\n // check that super has been called if this is a derived class\r\n if ((classInstance).base && !flow.is(FlowFlags.CALLS_SUPER)) {\r\n this.error(\r\n DiagnosticCode.Constructors_for_derived_classes_must_contain_a_super_call,\r\n instance.prototype.declaration.range\r\n );\r\n }\r\n\r\n // if this is a normal function, make sure that all branches return\r\n } else if (returnType != Type.void && !flow.is(FlowFlags.RETURNS)) {\r\n this.error(\r\n DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\r\n instance.prototype.signatureNode.returnType.range\r\n );\r\n }\r\n\r\n return stmts;\r\n }\r\n\r\n /** Compiles a readily resolved function instance. */\r\n compileFunction(instance: Function): bool {\r\n if (instance.is(CommonFlags.COMPILED)) return true;\r\n assert(!(instance.is(CommonFlags.AMBIENT) && instance.hasDecorator(DecoratorFlags.BUILTIN)));\r\n instance.set(CommonFlags.COMPILED);\r\n\r\n var module = this.module;\r\n var signature = instance.signature;\r\n var bodyNode = instance.prototype.bodyNode;\r\n\r\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\r\n var funcRef: FunctionRef;\r\n\r\n // concrete function\r\n if (bodyNode) {\r\n\r\n // must not be ambient\r\n if (instance.is(CommonFlags.AMBIENT)) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n instance.identifierNode.range\r\n );\r\n }\r\n\r\n // cannot have an annotated external name\r\n if (instance.hasDecorator(DecoratorFlags.EXTERNAL)) {\r\n let decoratorNodes = instance.decoratorNodes;\r\n let decorator = assert(findDecorator(DecoratorKind.EXTERNAL, decoratorNodes));\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n decorator.range\r\n );\r\n }\r\n\r\n // compile body in this function's context\r\n let previousFlow = this.currentFlow;\r\n this.currentFlow = instance.flow;\r\n let stmts = this.compileFunctionBody(instance);\r\n this.currentFlow = previousFlow;\r\n\r\n // create the function\r\n funcRef = module.addFunction(\r\n instance.internalName,\r\n typeRef,\r\n typesToNativeTypes(instance.additionalLocals),\r\n stmts.length\r\n ? stmts.length == 1\r\n ? stmts[0]\r\n : module.createBlock(null, stmts, instance.signature.returnType.toNativeType())\r\n : module.createNop()\r\n );\r\n\r\n // imported function\r\n } else {\r\n if (!instance.is(CommonFlags.AMBIENT)) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n instance.identifierNode.range\r\n );\r\n }\r\n\r\n instance.set(CommonFlags.MODULE_IMPORT);\r\n mangleImportName(instance, instance.declaration); // TODO: check for duplicates\r\n\r\n // create the import\r\n funcRef = module.addFunctionImport(\r\n instance.internalName,\r\n mangleImportName_moduleName,\r\n mangleImportName_elementName,\r\n typeRef\r\n );\r\n }\r\n\r\n instance.finalize(module, funcRef);\r\n return true;\r\n }\r\n\r\n // classes\r\n\r\n compileClassUsingTypeArguments(\r\n prototype: ClassPrototype,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map = makeMap(),\r\n alternativeReportNode: Node | null = null\r\n ): void {\r\n var instance = this.resolver.resolveClassInclTypeArguments(\r\n prototype,\r\n typeArguments,\r\n prototype.parent, // relative to itself\r\n contextualTypeArguments,\r\n alternativeReportNode || prototype.declaration\r\n );\r\n if (!instance) return;\r\n this.compileClass(instance);\r\n }\r\n\r\n compileClass(instance: Class): bool {\r\n if (instance.is(CommonFlags.COMPILED)) return true;\r\n instance.set(CommonFlags.COMPILED);\r\n var prototype = instance.prototype;\r\n var staticMembers = (prototype).members;\r\n if (staticMembers) {\r\n for (let element of staticMembers.values()) {\r\n switch (element.kind) {\r\n case ElementKind.GLOBAL: {\r\n this.compileGlobal(element);\r\n break;\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (\r\n !(element).is(CommonFlags.GENERIC)\r\n ) {\r\n this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap(),\r\n (element).identifierNode\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.PROPERTY_PROTOTYPE: {\r\n let getter = (element).getterPrototype;\r\n if (getter) {\r\n this.compileFunctionUsingTypeArguments(\r\n getter,\r\n [],\r\n makeMap(),\r\n getter.identifierNode\r\n );\r\n }\r\n let setter = (element).setterPrototype;\r\n if (setter) {\r\n this.compileFunctionUsingTypeArguments(\r\n setter,\r\n [],\r\n makeMap(),\r\n setter.identifierNode\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n }\r\n }\r\n }\r\n }\r\n var ctorInstance = instance.constructorInstance;\r\n if (ctorInstance) this.compileFunction(ctorInstance);\r\n var instanceMembers = instance.members;\r\n if (instanceMembers) {\r\n for (let element of instanceMembers.values()) {\r\n switch (element.kind) {\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n if (\r\n !(element).is(CommonFlags.GENERIC)\r\n ) {\r\n this.compileFunctionUsingTypeArguments(\r\n element,\r\n [],\r\n makeMap(instance.contextualTypeArguments),\r\n (element).declaration.name\r\n );\r\n }\r\n break;\r\n }\r\n case ElementKind.FIELD_PROTOTYPE: {\r\n element.set(CommonFlags.COMPILED);\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let getter = (element).getterInstance;\r\n if (getter) this.compileFunction(getter);\r\n let setter = (element).setterInstance;\r\n if (setter) this.compileFunction(setter);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n compileInterfaceDeclaration(\r\n declaration: InterfaceDeclaration,\r\n typeArguments: TypeNode[],\r\n contextualTypeArguments: Map | null = null,\r\n alternativeReportNode: Node | null = null\r\n ): void {\r\n // TODO\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n declaration.range\r\n );\r\n }\r\n\r\n // memory\r\n\r\n /** Adds a static memory segment with the specified data. */\r\n addMemorySegment(buffer: Uint8Array, alignment: i32 = 8): MemorySegment {\r\n var memoryOffset = i64_align(this.memoryOffset, alignment);\r\n var segment = MemorySegment.create(buffer, memoryOffset);\r\n this.memorySegments.push(segment);\r\n this.memoryOffset = i64_add(memoryOffset, i64_new(buffer.length, 0));\r\n return segment;\r\n }\r\n\r\n // function table\r\n\r\n /** Ensures that a table entry exists for the specified function and returns its index. */\r\n ensureFunctionTableEntry(func: Function): i32 {\r\n assert(func.is(CommonFlags.COMPILED));\r\n if (func.functionTableIndex >= 0) {\r\n return func.functionTableIndex;\r\n }\r\n var functionTable = this.functionTable;\r\n var index = functionTable.length;\r\n if (!func.is(CommonFlags.TRAMPOLINE) && func.signature.requiredParameters < func.signature.parameterTypes.length) {\r\n // insert the trampoline if the function has optional parameters\r\n func = this.ensureTrampoline(func);\r\n }\r\n functionTable.push(func.internalName);\r\n func.functionTableIndex = index;\r\n return index;\r\n }\r\n\r\n // statements\r\n\r\n compileTopLevelStatement(statement: Statement, body: ExpressionRef[]): void {\r\n switch (statement.kind) {\r\n case NodeKind.CLASSDECLARATION: {\r\n let memberStatements = (statement).members;\r\n for (let i = 0, k = memberStatements.length; i < k; ++i) {\r\n this.compileTopLevelStatement(memberStatements[i], body);\r\n }\r\n break;\r\n }\r\n case NodeKind.ENUMDECLARATION: {\r\n let element = this.program.getElementByDeclaration(statement);\r\n assert(element.kind == ElementKind.ENUM);\r\n if (!element.hasDecorator(DecoratorFlags.LAZY)) this.compileEnum(element);\r\n break;\r\n }\r\n case NodeKind.NAMESPACEDECLARATION: {\r\n let memberStatements = (statement).members;\r\n for (let i = 0, k = memberStatements.length; i < k; ++i) {\r\n this.compileTopLevelStatement(memberStatements[i], body);\r\n }\r\n break;\r\n }\r\n case NodeKind.VARIABLE: {\r\n let declarations = (statement).declarations;\r\n for (let i = 0, k = declarations.length; i < k; ++i) {\r\n let element = this.program.getElementByDeclaration(declarations[i]);\r\n assert(element.kind == ElementKind.GLOBAL);\r\n if (\r\n !element.is(CommonFlags.AMBIENT) && // delay imports\r\n !element.hasDecorator(DecoratorFlags.LAZY)\r\n ) this.compileGlobal(element);\r\n }\r\n break;\r\n }\r\n case NodeKind.FIELDDECLARATION: {\r\n let element = this.program.getElementByDeclaration(statement);\r\n if (element.kind == ElementKind.GLOBAL) { // static\r\n if (!element.hasDecorator(DecoratorFlags.LAZY)) this.compileGlobal(element);\r\n }\r\n break;\r\n }\r\n case NodeKind.EXPORT: {\r\n if ((statement).normalizedPath != null) {\r\n this.compileFileByPath(\r\n (statement).normalizedPath,\r\n (statement).path\r\n );\r\n }\r\n break;\r\n }\r\n case NodeKind.IMPORT: {\r\n this.compileFileByPath(\r\n (statement).normalizedPath,\r\n (statement).path\r\n );\r\n break;\r\n }\r\n case NodeKind.FUNCTIONDECLARATION:\r\n case NodeKind.METHODDECLARATION:\r\n case NodeKind.INTERFACEDECLARATION:\r\n case NodeKind.INDEXSIGNATUREDECLARATION:\r\n case NodeKind.TYPEDECLARATION: break;\r\n default: { // otherwise a top-level statement that is part of the start function's body\r\n let stmt = this.compileStatement(statement);\r\n if (getExpressionId(stmt) != ExpressionId.Nop) body.push(stmt);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n compileStatement(statement: Statement, isLastStatementInBody: bool = false): ExpressionRef {\r\n var module = this.module;\r\n var stmt: ExpressionRef;\r\n switch (statement.kind) {\r\n case NodeKind.BLOCK: {\r\n stmt = this.compileBlockStatement(statement);\r\n break;\r\n }\r\n case NodeKind.BREAK: {\r\n stmt = this.compileBreakStatement(statement);\r\n break;\r\n }\r\n case NodeKind.CONTINUE: {\r\n stmt = this.compileContinueStatement(statement);\r\n break;\r\n }\r\n case NodeKind.DO: {\r\n stmt = this.compileDoStatement(statement);\r\n break;\r\n }\r\n case NodeKind.EMPTY: {\r\n stmt = this.compileEmptyStatement(statement);\r\n break;\r\n }\r\n case NodeKind.EXPRESSION: {\r\n stmt = this.compileExpressionStatement(statement);\r\n break;\r\n }\r\n case NodeKind.FOR: {\r\n stmt = this.compileForStatement(statement);\r\n break;\r\n }\r\n case NodeKind.IF: {\r\n stmt = this.compileIfStatement(statement);\r\n break;\r\n }\r\n case NodeKind.RETURN: {\r\n stmt = this.compileReturnStatement(statement, isLastStatementInBody);\r\n break;\r\n }\r\n case NodeKind.SWITCH: {\r\n stmt = this.compileSwitchStatement(statement);\r\n break;\r\n }\r\n case NodeKind.THROW: {\r\n stmt = this.compileThrowStatement(statement);\r\n break;\r\n }\r\n case NodeKind.TRY: {\r\n stmt = this.compileTryStatement(statement);\r\n break;\r\n }\r\n case NodeKind.VARIABLE: {\r\n stmt = this.compileVariableStatement(statement);\r\n if (!stmt) stmt = module.createNop();\r\n break;\r\n }\r\n case NodeKind.VOID: {\r\n stmt = this.compileVoidStatement(statement);\r\n break;\r\n }\r\n case NodeKind.WHILE: {\r\n stmt = this.compileWhileStatement(statement);\r\n break;\r\n }\r\n case NodeKind.TYPEDECLARATION: {\r\n // TODO: integrate inner type declaration into flow\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.range\r\n );\r\n stmt = module.createUnreachable();\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n stmt = module.createUnreachable();\r\n }\r\n }\r\n if (this.options.sourceMap) this.addDebugLocation(stmt, statement.range);\r\n return stmt;\r\n }\r\n\r\n compileStatements(statements: Statement[], isBody: bool = false): ExpressionRef[] {\r\n var numStatements = statements.length;\r\n var stmts = new Array(numStatements);\r\n stmts.length = 0;\r\n var flow = this.currentFlow;\r\n for (let i = 0; i < numStatements; ++i) {\r\n let stmt = this.compileStatement(statements[i], isBody && i == numStatements - 1);\r\n switch (getExpressionId(stmt)) {\r\n case ExpressionId.Block: {\r\n if (!getBlockName(stmt)) {\r\n for (let j = 0, k = getBlockChildCount(stmt); j < k; ++j) stmts.push(getBlockChild(stmt, j));\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: stmts.push(stmt);\r\n case ExpressionId.Nop:\r\n }\r\n if (flow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n if (needsExplicitUnreachable(stmt)) stmts.push(this.module.createUnreachable());\r\n break;\r\n }\r\n }\r\n return stmts;\r\n }\r\n\r\n compileBlockStatement(statement: BlockStatement): ExpressionRef {\r\n var statements = statement.statements;\r\n var outerFlow = this.currentFlow;\r\n var innerFlow = outerFlow.fork();\r\n this.currentFlow = innerFlow;\r\n\r\n var stmts = this.compileStatements(statements);\r\n var stmt = stmts.length == 0\r\n ? this.module.createNop()\r\n : stmts.length == 1\r\n ? stmts[0]\r\n : this.module.createBlock(null, stmts,getExpressionType(stmts[stmts.length - 1]));\r\n\r\n innerFlow.freeScopedLocals();\r\n outerFlow.inherit(innerFlow);\r\n this.currentFlow = outerFlow;\r\n return stmt;\r\n }\r\n\r\n compileBreakStatement(statement: BreakStatement): ExpressionRef {\r\n var module = this.module;\r\n if (statement.label) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.label.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n var flow = this.currentFlow;\r\n var breakLabel = flow.breakLabel;\r\n if (breakLabel == null) {\r\n this.error(\r\n DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement,\r\n statement.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n flow.set(FlowFlags.BREAKS);\r\n return module.createBreak(breakLabel);\r\n }\r\n\r\n compileContinueStatement(statement: ContinueStatement): ExpressionRef {\r\n var module = this.module;\r\n var label = statement.label;\r\n if (label) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n label.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n // Check if 'continue' is allowed here\r\n var flow = this.currentFlow;\r\n var continueLabel = flow.continueLabel;\r\n if (continueLabel == null) {\r\n this.error(\r\n DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement,\r\n statement.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n flow.set(FlowFlags.CONTINUES);\r\n return module.createBreak(continueLabel);\r\n }\r\n\r\n compileDoStatement(statement: DoStatement): ExpressionRef {\r\n var module = this.module;\r\n\r\n var outerFlow = this.currentFlow;\r\n var label = outerFlow.pushBreakLabel();\r\n var innerFlow = outerFlow.fork();\r\n this.currentFlow = innerFlow;\r\n var breakLabel = \"break|\" + label;\r\n innerFlow.breakLabel = breakLabel;\r\n var continueLabel = \"continue|\" + label;\r\n innerFlow.continueLabel = continueLabel;\r\n\r\n var body = this.compileStatement(statement.statement);\r\n var condExpr = this.makeIsTrueish(\r\n this.compileExpression(statement.condition, Type.i32, ConversionKind.NONE, WrapMode.NONE),\r\n this.currentType\r\n );\r\n // TODO: check if condition is always false and if so, omit it (just a block)\r\n\r\n // Switch back to the parent flow\r\n innerFlow.freeScopedLocals();\r\n outerFlow.popBreakLabel();\r\n this.currentFlow = outerFlow;\r\n var terminated = innerFlow.isAny(FlowFlags.ANY_TERMINATING);\r\n innerFlow.unset(\r\n FlowFlags.BREAKS |\r\n FlowFlags.CONDITIONALLY_BREAKS |\r\n FlowFlags.CONTINUES |\r\n FlowFlags.CONDITIONALLY_CONTINUES\r\n );\r\n outerFlow.inherit(innerFlow);\r\n\r\n var block: ExpressionRef[] = [\r\n module.createLoop(continueLabel,\r\n terminated\r\n ? body // skip trailing continue if unnecessary\r\n : module.createBlock(null, [\r\n body,\r\n module.createBreak(continueLabel, condExpr)\r\n ], NativeType.None)\r\n )\r\n ];\r\n if (terminated) block.push(module.createUnreachable());\r\n return module.createBlock(breakLabel, block);\r\n }\r\n\r\n compileEmptyStatement(statement: EmptyStatement): ExpressionRef {\r\n return this.module.createNop();\r\n }\r\n\r\n compileExpressionStatement(statement: ExpressionStatement): ExpressionRef {\r\n var expr = this.compileExpression(statement.expression, Type.void, ConversionKind.NONE, WrapMode.NONE);\r\n if (this.currentType != Type.void) {\r\n expr = this.module.createDrop(expr);\r\n this.currentType = Type.void;\r\n }\r\n return expr;\r\n }\r\n\r\n compileForStatement(statement: ForStatement): ExpressionRef {\r\n // A for statement initiates a new branch with its own scoped variables\r\n // possibly declared in its initializer, and break context.\r\n var outerFlow = this.currentFlow;\r\n var label = outerFlow.pushBreakLabel();\r\n var innerFlow = outerFlow.fork();\r\n this.currentFlow = innerFlow;\r\n var breakLabel = innerFlow.breakLabel = \"break|\" + label;\r\n innerFlow.breakLabel = breakLabel;\r\n var continueLabel = \"continue|\" + label;\r\n innerFlow.continueLabel = continueLabel;\r\n var repeatLabel = \"repeat|\" + label;\r\n\r\n // Compile in correct order\r\n var module = this.module;\r\n var initExpr = statement.initializer\r\n ? this.compileStatement(statement.initializer)\r\n : 0;\r\n var condExpr: ExpressionRef = 0;\r\n var alwaysTrue = false;\r\n if (statement.condition) {\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n // check if the condition is always true\r\n let condPre = module.precomputeExpression(condExpr);\r\n if (getExpressionId(condPre) == ExpressionId.Const) {\r\n assert(getExpressionType(condPre) == NativeType.I32);\r\n if (getConstValueI32(condPre) != 0) alwaysTrue = true;\r\n // TODO: could skip compilation if the condition is always false here, but beware that the\r\n // initializer could still declare new 'var's that are used later on.\r\n }\r\n // recompile to original\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n } else {\r\n // omitted condition is always true\r\n condExpr = module.createI32(1);\r\n alwaysTrue = true;\r\n }\r\n var incrExpr = statement.incrementor\r\n ? this.compileExpression(statement.incrementor, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n : 0;\r\n var bodyStatement = statement.statement;\r\n var bodyExpr = bodyStatement.kind == NodeKind.BLOCK && (bodyStatement).statements.length == 1\r\n ? this.compileStatement((bodyStatement).statements[0])\r\n : this.compileStatement(bodyStatement);\r\n\r\n // Switch back to the parent flow\r\n innerFlow.freeScopedLocals();\r\n outerFlow.popBreakLabel();\r\n this.currentFlow = outerFlow;\r\n var usesContinue = innerFlow.isAny(FlowFlags.CONTINUES | FlowFlags.CONDITIONALLY_CONTINUES);\r\n innerFlow.unset(\r\n FlowFlags.BREAKS |\r\n FlowFlags.CONDITIONALLY_BREAKS |\r\n FlowFlags.CONTINUES |\r\n FlowFlags.CONDITIONALLY_CONTINUES\r\n );\r\n if (alwaysTrue) outerFlow.inherit(innerFlow);\r\n else outerFlow.inheritConditional(innerFlow);\r\n\r\n var breakBlock = new Array(); // outer 'break' block\r\n if (initExpr) breakBlock.push(initExpr);\r\n\r\n var repeatBlock = new Array(); // block repeating the loop\r\n if (usesContinue) {\r\n repeatBlock.push(\r\n module.createBlock(continueLabel, [ // inner 'continue' block\r\n module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr)),\r\n bodyExpr\r\n ], NativeType.None)\r\n );\r\n } else { // can omit the 'continue' block\r\n repeatBlock.push(\r\n module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr))\r\n );\r\n repeatBlock.push(bodyExpr);\r\n }\r\n if (incrExpr) repeatBlock.push(incrExpr);\r\n repeatBlock.push(\r\n module.createBreak(repeatLabel)\r\n );\r\n\r\n breakBlock.push(\r\n module.createLoop(repeatLabel, module.createBlock(null, repeatBlock, NativeType.None))\r\n );\r\n\r\n return module.createBlock(breakLabel, breakBlock);\r\n }\r\n\r\n compileIfStatement(statement: IfStatement): ExpressionRef {\r\n var module = this.module;\r\n var ifTrue = statement.ifTrue;\r\n var ifFalse = statement.ifFalse;\r\n var outerFlow = this.currentFlow;\r\n var actualFunction = outerFlow.actualFunction;\r\n\r\n // The condition doesn't initiate a branch yet\r\n var condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n\r\n // Try to eliminate unnecesssary branches if the condition is constant\r\n var condExprPrecomp = module.precomputeExpression(condExpr);\r\n if (\r\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n getExpressionType(condExprPrecomp) == NativeType.I32\r\n ) {\r\n return getConstValueI32(condExprPrecomp)\r\n ? this.compileStatement(ifTrue)\r\n : ifFalse\r\n ? this.compileStatement(ifFalse)\r\n : module.createNop();\r\n\r\n // Otherwise recompile to the original and let the optimizer decide\r\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n }\r\n\r\n // Each arm initiates a branch\r\n var ifTrueFlow = outerFlow.fork();\r\n this.currentFlow = ifTrueFlow;\r\n var ifTrueExpr = this.compileStatement(ifTrue);\r\n ifTrueFlow.freeScopedLocals();\r\n this.currentFlow = outerFlow;\r\n\r\n var ifFalseExpr: ExpressionRef = 0;\r\n if (ifFalse) {\r\n let ifFalseFlow = outerFlow.fork();\r\n this.currentFlow = ifFalseFlow;\r\n ifFalseExpr = this.compileStatement(ifFalse);\r\n ifFalseFlow.freeScopedLocals();\r\n this.currentFlow = outerFlow;\r\n outerFlow.inheritMutual(ifTrueFlow, ifFalseFlow);\r\n } else {\r\n outerFlow.inheritConditional(ifTrueFlow);\r\n }\r\n return module.createIf(condExpr, ifTrueExpr, ifFalseExpr);\r\n }\r\n\r\n compileReturnStatement(statement: ReturnStatement, isLastStatementInBody: bool): ExpressionRef {\r\n var module = this.module;\r\n var expr: ExpressionRef = 0;\r\n var flow = this.currentFlow;\r\n var returnType = flow.returnType;\r\n\r\n // Remember that this flow returns\r\n flow.set(FlowFlags.RETURNS);\r\n\r\n if (statement.value) {\r\n if (returnType == Type.void) {\r\n this.compileExpressionRetainType(statement.value, returnType, WrapMode.NONE);\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n statement.value.range, this.currentType.toString(), returnType.toString()\r\n );\r\n this.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n expr = this.compileExpression(\r\n statement.value,\r\n returnType,\r\n ConversionKind.IMPLICIT,\r\n flow.actualFunction.is(CommonFlags.MODULE_EXPORT)\r\n ? WrapMode.WRAP\r\n : WrapMode.NONE\r\n );\r\n\r\n // Remember whether returning a properly wrapped value\r\n if (!flow.canOverflow(expr, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\r\n\r\n } else if (returnType != Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n statement.range, \"void\", returnType.toString()\r\n );\r\n expr = module.createUnreachable();\r\n }\r\n\r\n // If the last statement anyway, make it the block's return value\r\n if (isLastStatementInBody) return expr ? expr : module.createNop();\r\n\r\n // When inlining, break to the end of the inlined function's block (no need to wrap)\r\n if (flow.is(FlowFlags.INLINE_CONTEXT)) return module.createBreak(assert(flow.inlineReturnLabel), 0, expr);\r\n\r\n return module.createReturn(expr);\r\n }\r\n\r\n compileSwitchStatement(statement: SwitchStatement): ExpressionRef {\r\n var module = this.module;\r\n\r\n var cases = statement.cases;\r\n var numCases = cases.length;\r\n if (!numCases) {\r\n return this.compileExpression(statement.condition, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n }\r\n\r\n // Everything within a switch uses the same break context\r\n var outerFlow = this.currentFlow;\r\n var context = outerFlow.pushBreakLabel();\r\n\r\n // introduce a local for evaluating the condition (exactly once)\r\n var tempLocal = outerFlow.getTempLocal(Type.u32, false);\r\n var tempLocalIndex = tempLocal.index;\r\n\r\n // Prepend initializer to inner block. Does not initiate a new branch, yet.\r\n var breaks = new Array(1 + numCases);\r\n breaks[0] = module.createSetLocal( // initializer\r\n tempLocalIndex,\r\n this.compileExpression(statement.condition, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n );\r\n\r\n // make one br_if per (possibly dynamic) labeled case (binaryen optimizes to br_table where possible)\r\n var breakIndex = 1;\r\n var defaultIndex = -1;\r\n for (let i = 0; i < numCases; ++i) {\r\n let case_ = cases[i];\r\n let label = case_.label;\r\n if (label) {\r\n breaks[breakIndex++] = module.createBreak(\"case\" + i.toString(10) + \"|\" + context,\r\n module.createBinary(BinaryOp.EqI32,\r\n module.createGetLocal(tempLocalIndex, NativeType.I32),\r\n this.compileExpression(label, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n )\r\n );\r\n } else {\r\n defaultIndex = i;\r\n }\r\n }\r\n\r\n outerFlow.freeTempLocal(tempLocal);\r\n\r\n // otherwise br to default respectively out of the switch if there is no default case\r\n breaks[breakIndex] = module.createBreak((defaultIndex >= 0\r\n ? \"case\" + defaultIndex.toString(10)\r\n : \"break\"\r\n ) + \"|\" + context);\r\n\r\n // nest blocks in order\r\n var currentBlock = module.createBlock(\"case0|\" + context, breaks, NativeType.None);\r\n var alwaysReturns = true;\r\n var alwaysReturnsWrapped = true;\r\n var alwaysThrows = true;\r\n var alwaysAllocates = true;\r\n for (let i = 0; i < numCases; ++i) {\r\n let case_ = cases[i];\r\n let statements = case_.statements;\r\n let numStatements = statements.length;\r\n\r\n // Each switch case initiates a new branch\r\n let innerFlow = outerFlow.fork();\r\n this.currentFlow = innerFlow;\r\n let breakLabel = \"break|\" + context;\r\n innerFlow.breakLabel = breakLabel;\r\n\r\n let isLast = i == numCases - 1;\r\n let nextLabel = isLast ? breakLabel : \"case\" + (i + 1).toString(10) + \"|\" + context;\r\n let stmts = new Array(1 + numStatements);\r\n stmts[0] = currentBlock;\r\n let count = 1;\r\n let terminated = false;\r\n for (let j = 0; j < numStatements; ++j) {\r\n let stmt = this.compileStatement(statements[j]);\r\n if (getExpressionId(stmt) != ExpressionId.Nop) {\r\n stmts[count++] = stmt;\r\n if (innerFlow.isAny(FlowFlags.ANY_TERMINATING)) {\r\n terminated = true;\r\n break;\r\n }\r\n }\r\n }\r\n stmts.length = count;\r\n if (terminated || isLast) {\r\n if (!innerFlow.is(FlowFlags.RETURNS)) alwaysReturns = false;\r\n if (!innerFlow.is(FlowFlags.RETURNS_WRAPPED)) alwaysReturnsWrapped = false;\r\n if (!innerFlow.is(FlowFlags.THROWS)) alwaysThrows = false;\r\n if (!innerFlow.is(FlowFlags.ALLOCATES)) alwaysAllocates = false;\r\n }\r\n\r\n // Switch back to the parent flow\r\n innerFlow.unset(\r\n FlowFlags.BREAKS |\r\n FlowFlags.CONDITIONALLY_BREAKS\r\n );\r\n innerFlow.freeScopedLocals();\r\n this.currentFlow = outerFlow;\r\n currentBlock = module.createBlock(nextLabel, stmts, NativeType.None); // must be a labeled block\r\n }\r\n outerFlow.popBreakLabel();\r\n\r\n // If the switch has a default (guaranteed to handle any value), propagate common flags\r\n if (defaultIndex >= 0) {\r\n if (alwaysReturns) outerFlow.set(FlowFlags.RETURNS);\r\n if (alwaysReturnsWrapped) outerFlow.set(FlowFlags.RETURNS_WRAPPED);\r\n if (alwaysThrows) outerFlow.set(FlowFlags.THROWS);\r\n if (alwaysAllocates) outerFlow.set(FlowFlags.ALLOCATES);\r\n }\r\n return currentBlock;\r\n }\r\n\r\n compileThrowStatement(statement: ThrowStatement): ExpressionRef {\r\n var flow = this.currentFlow;\r\n\r\n // Remember that this branch throws\r\n flow.set(FlowFlags.THROWS);\r\n\r\n // FIXME: without try-catch it is safe to assume RETURNS as well for now\r\n flow.set(FlowFlags.RETURNS);\r\n\r\n // TODO: requires exception-handling spec.\r\n return compileAbort(this, null, statement);\r\n }\r\n\r\n compileTryStatement(statement: TryStatement): ExpressionRef {\r\n // TODO: can't yet support something like: try { return ... } finally { ... }\r\n // worthwhile to investigate lowering returns to block results (here)?\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n statement.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n /** Compiles a variable statement. Returns `0` if an initializer is not necessary. */\r\n compileVariableStatement(statement: VariableStatement): ExpressionRef {\r\n var declarations = statement.declarations;\r\n var numDeclarations = declarations.length;\r\n var flow = this.currentFlow;\r\n var initializers = new Array();\r\n var resolver = this.resolver;\r\n for (let i = 0; i < numDeclarations; ++i) {\r\n let declaration = declarations[i];\r\n let name = declaration.name.text;\r\n let type: Type | null = null;\r\n let initExpr: ExpressionRef = 0;\r\n if (declaration.type) {\r\n type = resolver.resolveType( // reports\r\n declaration.type,\r\n flow.actualFunction,\r\n flow.contextualTypeArguments\r\n );\r\n if (!type) continue;\r\n if (declaration.initializer) {\r\n initExpr = this.compileExpression( // reports\r\n declaration.initializer,\r\n type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n } else if (declaration.initializer) { // infer type using void/NONE for proper literal inference\r\n initExpr = this.compileExpressionRetainType( // reports\r\n declaration.initializer,\r\n Type.void,\r\n WrapMode.NONE\r\n );\r\n if (this.currentType == Type.void) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n declaration.range, this.currentType.toString(), \"\"\r\n );\r\n continue;\r\n }\r\n type = this.currentType;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n declaration.name.range.atEnd\r\n );\r\n continue;\r\n }\r\n let isInlined = false;\r\n if (declaration.is(CommonFlags.CONST)) {\r\n if (initExpr) {\r\n initExpr = this.module.precomputeExpression(initExpr);\r\n if (getExpressionId(initExpr) == ExpressionId.Const) {\r\n let local = new Local(name, -1, type, flow.parentFunction);\r\n switch (getExpressionType(initExpr)) {\r\n case NativeType.I32: {\r\n local.setConstantIntegerValue(\r\n i64_new(\r\n getConstValueI32(initExpr),\r\n 0\r\n ),\r\n type\r\n );\r\n break;\r\n }\r\n case NativeType.I64: {\r\n local.setConstantIntegerValue(\r\n i64_new(\r\n getConstValueI64Low(initExpr),\r\n getConstValueI64High(initExpr)\r\n ),\r\n type\r\n );\r\n break;\r\n }\r\n case NativeType.F32: {\r\n local.setConstantFloatValue(getConstValueF32(initExpr), type);\r\n break;\r\n }\r\n case NativeType.F64: {\r\n local.setConstantFloatValue(getConstValueF64(initExpr), type);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n // Create a virtual local that doesn't actually exist in WebAssembly\r\n let scopedLocals = flow.scopedLocals;\r\n if (!scopedLocals) flow.scopedLocals = scopedLocals = new Map();\r\n else if (scopedLocals.has(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, name\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n scopedLocals.set(name, local);\r\n isInlined = true;\r\n } else {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n declaration.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._const_declarations_must_be_initialized,\r\n declaration.range\r\n );\r\n }\r\n }\r\n if (!isInlined) {\r\n let local: Local;\r\n if (\r\n declaration.isAny(CommonFlags.LET | CommonFlags.CONST) ||\r\n flow.is(FlowFlags.INLINE_CONTEXT)\r\n ) { // here: not top-level\r\n local = flow.addScopedLocal(name, type, false, declaration.name); // reports if duplicate\r\n } else {\r\n if (flow.lookupLocal(name)) {\r\n this.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n declaration.name.range, name\r\n );\r\n continue;\r\n }\r\n local = flow.parentFunction.addLocal(type, name, declaration);\r\n }\r\n if (initExpr) {\r\n initializers.push(\r\n this.compileAssignmentWithValue(declaration.name, initExpr)\r\n );\r\n if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n flow.setLocalWrapped(local.index, !flow.canOverflow(initExpr, type));\r\n }\r\n } else if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n flow.setLocalWrapped(local.index, true); // zero\r\n }\r\n }\r\n }\r\n return initializers.length // we can unwrap these here because the\r\n ? initializers.length == 1 // source didn't tell us exactly what to do\r\n ? initializers[0]\r\n : this.module.createBlock(null, initializers, NativeType.None)\r\n : 0;\r\n }\r\n\r\n compileVoidStatement(statement: VoidStatement): ExpressionRef {\r\n return this.compileExpression(statement.expression, Type.void, ConversionKind.EXPLICIT, WrapMode.NONE);\r\n }\r\n\r\n compileWhileStatement(statement: WhileStatement): ExpressionRef {\r\n var module = this.module;\r\n var outerFlow = this.currentFlow;\r\n\r\n // The condition does not yet initialize a branch\r\n var condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n\r\n // Try to eliminate unnecesssary loops if the condition is constant\r\n var condExprPrecomp = module.precomputeExpression(condExpr);\r\n if (\r\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n getExpressionType(condExprPrecomp) == NativeType.I32\r\n ) {\r\n if (!getConstValueI32(condExprPrecomp)) return module.createNop();\r\n\r\n // Otherwise recompile to the original and let the optimizer decide\r\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n }\r\n\r\n // Statements initiate a new branch with its own break context\r\n var label = outerFlow.pushBreakLabel();\r\n var innerFlow = outerFlow.fork();\r\n this.currentFlow = innerFlow;\r\n var breakLabel = \"break|\" + label;\r\n innerFlow.breakLabel = breakLabel;\r\n var continueLabel = \"continue|\" + label;\r\n innerFlow.continueLabel = continueLabel;\r\n\r\n var body = this.compileStatement(statement.statement);\r\n var alwaysTrue = false; // TODO\r\n var terminated = innerFlow.isAny(FlowFlags.ANY_TERMINATING);\r\n\r\n // Switch back to the parent flow\r\n innerFlow.freeScopedLocals();\r\n outerFlow.popBreakLabel();\r\n this.currentFlow = outerFlow;\r\n innerFlow.unset(\r\n FlowFlags.BREAKS |\r\n FlowFlags.CONDITIONALLY_BREAKS |\r\n FlowFlags.CONTINUES |\r\n FlowFlags.CONDITIONALLY_CONTINUES\r\n );\r\n if (alwaysTrue) outerFlow.inherit(innerFlow);\r\n else outerFlow.inheritConditional(innerFlow);\r\n\r\n return module.createBlock(breakLabel, [\r\n module.createLoop(continueLabel,\r\n module.createIf(condExpr,\r\n terminated\r\n ? body // skip trailing continue if unnecessary\r\n : module.createBlock(null, [\r\n body,\r\n module.createBreak(continueLabel)\r\n ], NativeType.None)\r\n )\r\n )\r\n ]);\r\n }\r\n\r\n // expressions\r\n\r\n /**\r\n * Compiles the value of an inlined constant element.\r\n * @param retainType If true, the annotated type of the constant is retained. Otherwise, the value\r\n * is precomputed according to context.\r\n */\r\n compileInlineConstant(\r\n element: VariableLikeElement,\r\n contextualType: Type,\r\n retainType: bool\r\n ): ExpressionRef {\r\n assert(element.is(CommonFlags.INLINED));\r\n var type = element.type;\r\n switch (\r\n !retainType &&\r\n type.is(TypeFlags.INTEGER) &&\r\n contextualType.is(TypeFlags.INTEGER) &&\r\n type.size < contextualType.size\r\n ? (this.currentType = contextualType).kind // essentially precomputes a (sign-)extension\r\n : (this.currentType = type).kind\r\n ) {\r\n case TypeKind.I8:\r\n case TypeKind.I16: {\r\n let shift = type.computeSmallIntegerShift(Type.i32);\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue) << shift >> shift\r\n : 0\r\n ); // recognized by canOverflow\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n let mask = element.type.computeSmallIntegerMask(Type.i32);\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue) & mask\r\n : 0\r\n ); // recognized by canOverflow\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue)\r\n : 0\r\n );\r\n }\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: {\r\n if (!element.program.options.isWasm64) {\r\n return this.module.createI32(\r\n element.constantValueKind == ConstantValueKind.INTEGER\r\n ? i64_low(element.constantIntegerValue)\r\n : 0\r\n );\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n return element.constantValueKind == ConstantValueKind.INTEGER\r\n ? this.module.createI64(\r\n i64_low(element.constantIntegerValue),\r\n i64_high(element.constantIntegerValue)\r\n )\r\n : this.module.createI64(0);\r\n }\r\n case TypeKind.F64: {\r\n // monkey-patch for converting built-in floats to f32 implicitly\r\n if (!(element.hasDecorator(DecoratorFlags.BUILTIN) && contextualType == Type.f32)) {\r\n return this.module.createF64((element).constantFloatValue);\r\n }\r\n // otherwise fall-through: basically precomputes f32.demote/f64 of NaN / Infinity\r\n this.currentType = Type.f32;\r\n }\r\n case TypeKind.F32: {\r\n return this.module.createF32((element).constantFloatValue);\r\n }\r\n default: {\r\n assert(false);\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n }\r\n\r\n compileExpression(\r\n expression: Expression,\r\n contextualType: Type,\r\n conversionKind: ConversionKind,\r\n wrapMode: WrapMode\r\n ): ExpressionRef {\r\n this.currentType = contextualType;\r\n var expr: ExpressionRef;\r\n switch (expression.kind) {\r\n case NodeKind.ASSERTION: {\r\n expr = this.compileAssertionExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.BINARY: {\r\n expr = this.compileBinaryExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.CALL: {\r\n expr = this.compileCallExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.COMMA: {\r\n expr = this.compileCommaExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.ELEMENTACCESS: {\r\n expr = this.compileElementAccessExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.FUNCTION: {\r\n expr = this.compileFunctionExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.IDENTIFIER:\r\n case NodeKind.FALSE:\r\n case NodeKind.NULL:\r\n case NodeKind.THIS:\r\n case NodeKind.SUPER:\r\n case NodeKind.TRUE: {\r\n expr = this.compileIdentifierExpression(\r\n expression,\r\n contextualType,\r\n conversionKind == ConversionKind.NONE // retain type of inlined constants\r\n );\r\n break;\r\n }\r\n case NodeKind.INSTANCEOF: {\r\n expr = this.compileInstanceOfExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.LITERAL: {\r\n expr = this.compileLiteralExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.NEW: {\r\n expr = this.compileNewExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.PARENTHESIZED: {\r\n expr = this.compileParenthesizedExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.PROPERTYACCESS: {\r\n expr = this.compilePropertyAccessExpression(\r\n expression,\r\n contextualType,\r\n conversionKind == ConversionKind.NONE // retain type of inlined constants\r\n );\r\n break;\r\n }\r\n case NodeKind.TERNARY: {\r\n expr = this.compileTernaryExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.UNARYPOSTFIX: {\r\n expr = this.compileUnaryPostfixExpression(expression, contextualType);\r\n break;\r\n }\r\n case NodeKind.UNARYPREFIX: {\r\n expr = this.compileUnaryPrefixExpression(expression, contextualType);\r\n break;\r\n }\r\n default: {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n expr = this.module.createUnreachable();\r\n }\r\n }\r\n var currentType = this.currentType;\r\n if (conversionKind != ConversionKind.NONE && currentType != contextualType) {\r\n expr = this.convertExpression(expr, currentType, contextualType, conversionKind, wrapMode, expression);\r\n this.currentType = contextualType;\r\n } else if (wrapMode == WrapMode.WRAP) {\r\n expr = this.ensureSmallIntegerWrap(expr, currentType);\r\n }\r\n\r\n if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\r\n return expr;\r\n }\r\n\r\n compileExpressionRetainType(\r\n expression: Expression,\r\n contextualType: Type,\r\n wrapMode: WrapMode\r\n ): ExpressionRef {\r\n return this.compileExpression(\r\n expression,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n wrapMode\r\n );\r\n }\r\n\r\n precomputeExpression(\r\n expression: Expression,\r\n contextualType: Type,\r\n conversionKind: ConversionKind,\r\n wrapMode: WrapMode\r\n ): ExpressionRef {\r\n return this.module.precomputeExpression(\r\n this.compileExpression(expression, contextualType, conversionKind, wrapMode)\r\n );\r\n }\r\n\r\n convertExpression(\r\n expr: ExpressionRef,\r\n fromType: Type,\r\n toType: Type,\r\n conversionKind: ConversionKind,\r\n wrapMode: WrapMode,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n assert(conversionKind != ConversionKind.NONE);\r\n var module = this.module;\r\n\r\n // void to any\r\n if (fromType.kind == TypeKind.VOID) {\r\n assert(toType.kind != TypeKind.VOID); // convertExpression should not be called with void -> void\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n reportNode.range, fromType.toString(), toType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n // any to void\r\n if (toType.kind == TypeKind.VOID) return module.createDrop(expr);\r\n\r\n if (!fromType.isAssignableTo(toType)) {\r\n if (conversionKind == ConversionKind.IMPLICIT) {\r\n this.error(\r\n DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,\r\n reportNode.range, fromType.toString(), toType.toString()\r\n ); // recoverable\r\n }\r\n }\r\n\r\n if (fromType.is(TypeFlags.FLOAT)) {\r\n\r\n // float to float\r\n if (toType.is(TypeFlags.FLOAT)) {\r\n if (fromType.kind == TypeKind.F32) {\r\n\r\n // f32 to f64\r\n if (toType.kind == TypeKind.F64) {\r\n expr = module.createUnary(UnaryOp.PromoteF32, expr);\r\n }\r\n\r\n // otherwise f32 to f32\r\n\r\n // f64 to f32\r\n } else if (toType.kind == TypeKind.F32) {\r\n expr = module.createUnary(UnaryOp.DemoteF64, expr);\r\n }\r\n\r\n // otherwise f64 to f64\r\n\r\n // float to int\r\n } else if (toType.is(TypeFlags.INTEGER)) {\r\n\r\n // f32 to int\r\n if (fromType.kind == TypeKind.F32) {\r\n if (toType == Type.bool) {\r\n expr = module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\r\n wrapMode = WrapMode.NONE;\r\n } else if (toType.is(TypeFlags.SIGNED)) {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.TruncF32ToI64, expr);\r\n } else {\r\n expr = module.createUnary(UnaryOp.TruncF32ToI32, expr);\r\n }\r\n } else {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.TruncF32ToU64, expr);\r\n } else {\r\n expr = module.createUnary(UnaryOp.TruncF32ToU32, expr);\r\n }\r\n }\r\n\r\n // f64 to int\r\n } else {\r\n if (toType == Type.bool) {\r\n expr = module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\r\n wrapMode = WrapMode.NONE;\r\n } else if (toType.is(TypeFlags.SIGNED)) {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.TruncF64ToI64, expr);\r\n } else {\r\n expr = module.createUnary(UnaryOp.TruncF64ToI32, expr);\r\n }\r\n } else {\r\n if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.TruncF64ToU64, expr);\r\n } else {\r\n expr = module.createUnary(UnaryOp.TruncF64ToU32, expr);\r\n }\r\n }\r\n }\r\n\r\n // float to void\r\n } else {\r\n assert(toType.flags == TypeFlags.NONE, \"void type expected\");\r\n expr = module.createDrop(expr);\r\n }\r\n\r\n // int to float\r\n } else if (fromType.is(TypeFlags.INTEGER) && toType.is(TypeFlags.FLOAT)) {\r\n\r\n // int to f32\r\n if (toType.kind == TypeKind.F32) {\r\n if (fromType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI64ToF32\r\n : UnaryOp.ConvertU64ToF32,\r\n expr\r\n );\r\n } else {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI32ToF32\r\n : UnaryOp.ConvertU32ToF32,\r\n expr\r\n );\r\n }\r\n\r\n // int to f64\r\n } else {\r\n if (fromType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI64ToF64\r\n : UnaryOp.ConvertU64ToF64,\r\n expr\r\n );\r\n } else {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED)\r\n ? UnaryOp.ConvertI32ToF64\r\n : UnaryOp.ConvertU32ToF64,\r\n expr\r\n );\r\n }\r\n }\r\n\r\n // int to int\r\n } else {\r\n // i64 to ...\r\n if (fromType.is(TypeFlags.LONG)) {\r\n\r\n // i64 to i32 or smaller\r\n if (toType == Type.bool) {\r\n expr = module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\r\n wrapMode = WrapMode.NONE;\r\n } else if (!toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(UnaryOp.WrapI64, expr); // discards upper bits\r\n }\r\n\r\n // i32 or smaller to i64\r\n } else if (toType.is(TypeFlags.LONG)) {\r\n expr = module.createUnary(\r\n fromType.is(TypeFlags.SIGNED) ? UnaryOp.ExtendI32 : UnaryOp.ExtendU32,\r\n this.ensureSmallIntegerWrap(expr, fromType) // must clear garbage bits\r\n );\r\n wrapMode = WrapMode.NONE;\r\n\r\n // i32 to i32\r\n } else {\r\n // small i32 to ...\r\n if (fromType.is(TypeFlags.SHORT)) {\r\n // small i32 to larger i32\r\n if (fromType.size < toType.size) {\r\n expr = this.ensureSmallIntegerWrap(expr, fromType); // must clear garbage bits\r\n wrapMode = WrapMode.NONE;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.currentType = toType;\r\n return wrapMode == WrapMode.WRAP\r\n ? this.ensureSmallIntegerWrap(expr, toType)\r\n : expr;\r\n }\r\n\r\n compileAssertionExpression(expression: AssertionExpression, contextualType: Type): ExpressionRef {\r\n switch (expression.assertionKind) {\r\n case AssertionKind.PREFIX:\r\n case AssertionKind.AS: {\r\n let toType = this.resolver.resolveType( // reports\r\n assert(expression.toType),\r\n this.currentFlow.actualFunction,\r\n this.currentFlow.contextualTypeArguments\r\n );\r\n if (!toType) return this.module.createUnreachable();\r\n return this.compileExpression(expression.expression, toType, ConversionKind.EXPLICIT, WrapMode.NONE);\r\n }\r\n case AssertionKind.NONNULL: {\r\n assert(!expression.toType);\r\n let expr = this.compileExpressionRetainType(expression.expression, contextualType, WrapMode.NONE);\r\n this.currentType = this.currentType.nonNullableType;\r\n return expr;\r\n }\r\n default: assert(false);\r\n }\r\n return this.module.createUnreachable();\r\n }\r\n\r\n private f32ModInstance: Function | null = null;\r\n private f64ModInstance: Function | null = null;\r\n private f32PowInstance: Function | null = null;\r\n private f64PowInstance: Function | null = null;\r\n\r\n compileBinaryExpression(\r\n expression: BinaryExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var left = expression.left;\r\n var right = expression.right;\r\n\r\n var leftExpr: ExpressionRef;\r\n var leftType: Type;\r\n var rightExpr: ExpressionRef;\r\n var rightType: Type;\r\n var commonType: Type | null;\r\n\r\n var expr: ExpressionRef;\r\n var compound = false;\r\n\r\n var operator = expression.operator;\r\n switch (operator) {\r\n case Token.LESSTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.LT);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"<\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.LtI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.LtI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LtI64\r\n : BinaryOp.LtI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.LtU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LtU64\r\n : BinaryOp.LtU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.LtU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.LtF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.LtF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.GREATERTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.GT);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \">\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.GtI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GtI64\r\n : BinaryOp.GtI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.GtI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.GtU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GtU64\r\n : BinaryOp.GtU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.GtU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.GtF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.GtF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.LESSTHAN_EQUALS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.LE);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"<=\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.LeI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LeI64\r\n : BinaryOp.LeI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.LeI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.LeU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.LeU64\r\n : BinaryOp.LeU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.LeU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.LeF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.LeF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.GREATERTHAN_EQUALS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.GE);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \">=\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.GeI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GeI64\r\n : BinaryOp.GeI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.GeI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.GeU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.GeU64\r\n : BinaryOp.GeU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.GeU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.GeF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.GeF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n\r\n case Token.EQUALS_EQUALS_EQUALS:\r\n case Token.EQUALS_EQUALS: {\r\n\r\n // NOTE that this favors correctness, in terms of emitting a binary expression, over\r\n // checking for a possible use of unary EQZ. while the most classic of all optimizations,\r\n // that's not what the source told us to do. for reference, `!left` emits unary EQZ.\r\n\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (operator == Token.EQUALS_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.EQ);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n // still allow '==' with references\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.EqI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.EqI64\r\n : BinaryOp.EqI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.EqI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.EqF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.EqF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.EXCLAMATION_EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (operator == Token.EXCLAMATION_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.NE);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n // still allow '!=' with references\r\n }\r\n\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n switch (commonType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.NeI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.NeI64\r\n : BinaryOp.NeI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.NeI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.NeF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.NeF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.EQUALS: {\r\n return this.compileAssignment(left, right, contextualType);\r\n }\r\n case Token.PLUS_EQUALS: compound = true;\r\n case Token.PLUS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.ADD);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"+\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8: // addition might overflow\r\n case TypeKind.I16: // ^\r\n case TypeKind.U8: // ^\r\n case TypeKind.U16: // ^\r\n case TypeKind.BOOL: // ^\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.AddI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.AddI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.AddF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.AddF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.MINUS_EQUALS: compound = true;\r\n case Token.MINUS: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.SUB);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"-\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8: // subtraction might overflow\r\n case TypeKind.I16: // ^\r\n case TypeKind.U8: // ^\r\n case TypeKind.U16: // ^\r\n case TypeKind.BOOL: // ^\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.SubI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.SubI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.SubF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.SubF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.ASTERISK_EQUALS: compound = true;\r\n case Token.ASTERISK: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.MUL);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"*\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.MulI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.MulI64\r\n : BinaryOp.MulI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.MulI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.MulF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.MulF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.ASTERISK_ASTERISK_EQUALS: compound = true;\r\n case Token.ASTERISK_ASTERISK: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.POW);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n let instance: Function | null;\r\n\r\n // Mathf.pow if lhs is f32 (result is f32)\r\n if (this.currentType.kind == TypeKind.F32) {\r\n rightExpr = this.compileExpression(right, Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (!(instance = this.f32PowInstance)) {\r\n let namespace = this.program.lookupGlobal(LibrarySymbols.Mathf);\r\n if (!namespace) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Mathf\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n let prototype = namespace.members ? namespace.members.get(LibrarySymbols.pow) : null;\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Mathf.pow\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.f32PowInstance = instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n\r\n // Math.pow otherwise (result is f64)\r\n // TODO: should the result be converted back?\r\n } else {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n this.currentType,\r\n Type.f64,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n leftType = this.currentType;\r\n rightExpr = this.compileExpression(\r\n right,\r\n Type.f64,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n rightType = this.currentType;\r\n if (!(instance = this.f64PowInstance)) {\r\n let namespace = this.program.lookupGlobal(LibrarySymbols.Math);\r\n if (!namespace) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Math\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n let prototype = namespace.members ? namespace.members.get(LibrarySymbols.pow) : null;\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Math.pow\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.f64PowInstance = instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n }\r\n if (!(instance && this.compileFunction(instance))) {\r\n expr = module.createUnreachable();\r\n } else {\r\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n }\r\n break;\r\n }\r\n case Token.SLASH_EQUALS: compound = true;\r\n case Token.SLASH: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.DIV);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP, // !\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP, // !\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"/\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8: // signed div on signed small integers might overflow, e.g. -128/-1\r\n case TypeKind.I16: // ^\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.DivI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.DivI64\r\n : BinaryOp.DivI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.DivI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.DivU64\r\n : BinaryOp.DivU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.DivU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.DivF32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.DivF64, leftExpr, rightExpr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.PERCENT_EQUALS: compound = true;\r\n case Token.PERCENT: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.REM);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP, // !\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP, // !\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"%\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16: {\r\n expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.RemI64\r\n : BinaryOp.RemI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.RemI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.RemU64\r\n : BinaryOp.RemU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.RemU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n let instance = this.f32ModInstance;\r\n if (!instance) {\r\n let namespace = this.program.lookupGlobal(LibrarySymbols.Mathf);\r\n if (!namespace) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Mathf\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n let prototype = namespace.members ? namespace.members.get(LibrarySymbols.mod) : null;\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Mathf.mod\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.f32ModInstance = instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n if (!(instance && this.compileFunction(instance))) {\r\n expr = module.createUnreachable();\r\n } else {\r\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n }\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n let instance = this.f64ModInstance;\r\n if (!instance) {\r\n let namespace = this.program.lookupGlobal(LibrarySymbols.Math);\r\n if (!namespace) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Math\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n let prototype = namespace.members ? namespace.members.get(LibrarySymbols.mod) : null;\r\n if (!prototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n expression.range, \"Math.mod\"\r\n );\r\n expr = module.createUnreachable();\r\n break;\r\n }\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n this.f64ModInstance = instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n if (!(instance && this.compileFunction(instance))) {\r\n expr = module.createUnreachable();\r\n } else {\r\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\r\n }\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.LESSTHAN_LESSTHAN_EQUALS: compound = true;\r\n case Token.LESSTHAN_LESSTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHL);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.ShlI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.ShlI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShlI64\r\n : BinaryOp.ShlI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\r\n case Token.GREATERTHAN_GREATERTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n rightType = this.currentType;\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16: {\r\n expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I32: {\r\n expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n expr = module.createBinary(BinaryOp.ShrI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrI64\r\n : BinaryOp.ShrI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrU64\r\n : BinaryOp.ShrU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR_U);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n switch (this.currentType.kind) {\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: { // assumes that unsigned shr on unsigned small integers does not overflow\r\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n }\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.ShrU64\r\n : BinaryOp.ShrU32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.AMPERSAND_EQUALS: compound = true;\r\n case Token.AMPERSAND: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overloadd\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_AND);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"&\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.AndI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.AndI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AndI64\r\n : BinaryOp.AndI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.BAR_EQUALS: compound = true;\r\n case Token.BAR: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_OR);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"|\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.OrI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.OrI64\r\n : BinaryOp.OrI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.CARET_EQUALS: compound = true;\r\n case Token.CARET: {\r\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = leftType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_XOR);\r\n if (overload) {\r\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n if (compound) {\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n } else {\r\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\r\n rightType = this.currentType;\r\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\r\n leftExpr = this.convertExpression(\r\n leftExpr,\r\n leftType,\r\n leftType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n left\r\n );\r\n rightExpr = this.convertExpression(\r\n rightExpr,\r\n rightType,\r\n rightType = commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n right\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\r\n expression.range, \"^\", leftType.toString(), rightType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.XorI64, leftExpr, rightExpr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.XorI64\r\n : BinaryOp.XorI32,\r\n leftExpr,\r\n rightExpr\r\n );\r\n break;\r\n }\r\n case TypeKind.F32:\r\n case TypeKind.F64: {\r\n this.error(\r\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\r\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n\r\n // logical (no overloading)\r\n\r\n case Token.AMPERSAND_AMPERSAND: { // left && right\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n\r\n // simplify if cloning left without side effects is possible\r\n if (expr = module.cloneExpression(leftExpr, true, 0)) {\r\n this.makeIsTrueish(leftExpr, this.currentType);\r\n expr = module.createIf(\r\n this.makeIsTrueish(leftExpr, this.currentType),\r\n rightExpr,\r\n expr\r\n );\r\n\r\n // if not possible, tee left to a temp. local\r\n } else {\r\n let flow = this.currentFlow;\r\n let tempLocal = flow.getAndFreeTempLocal(\r\n this.currentType,\r\n !flow.canOverflow(leftExpr, this.currentType)\r\n );\r\n expr = module.createIf(\r\n this.makeIsTrueish(\r\n module.createTeeLocal(tempLocal.index, leftExpr),\r\n this.currentType\r\n ),\r\n rightExpr,\r\n module.createGetLocal(\r\n assert(tempLocal).index, // to be sure\r\n this.currentType.toNativeType()\r\n )\r\n );\r\n }\r\n break;\r\n }\r\n case Token.BAR_BAR: { // left || right\r\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\r\n leftType = this.currentType;\r\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n rightType = this.currentType;\r\n\r\n // simplify if cloning left without side effects is possible\r\n if (expr = this.module.cloneExpression(leftExpr, true, 0)) {\r\n expr = this.module.createIf(\r\n this.makeIsTrueish(leftExpr, this.currentType),\r\n expr,\r\n rightExpr\r\n );\r\n\r\n // if not possible, tee left to a temp. local\r\n } else {\r\n let flow = this.currentFlow;\r\n let tempLocal = flow.getAndFreeTempLocal(\r\n this.currentType,\r\n !flow.canOverflow(leftExpr, this.currentType)\r\n );\r\n expr = module.createIf(\r\n this.makeIsTrueish(\r\n module.createTeeLocal(tempLocal.index, leftExpr),\r\n this.currentType\r\n ),\r\n module.createGetLocal(\r\n assert(tempLocal).index, // to be sure\r\n this.currentType.toNativeType()\r\n ),\r\n rightExpr\r\n );\r\n }\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = this.module.createUnreachable();\r\n }\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(left, expr, contextualType != Type.void)\r\n : expr;\r\n }\r\n\r\n compileUnaryOverload(\r\n operatorInstance: Function,\r\n value: Expression,\r\n valueExpr: ExpressionRef,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n var argumentExpressions: Expression[];\r\n var thisArg: ExpressionRef = 0;\r\n if (operatorInstance.is(CommonFlags.INSTANCE)) {\r\n thisArg = valueExpr; // can reuse the previously evaluated expr as the this value here\r\n argumentExpressions = [];\r\n } else {\r\n argumentExpressions = [ value ]; // annotated type might differ -> recompile\r\n }\r\n return this.compileCallDirect(\r\n operatorInstance,\r\n argumentExpressions,\r\n reportNode,\r\n thisArg\r\n );\r\n }\r\n\r\n compileBinaryOverload(\r\n operatorInstance: Function,\r\n left: Expression,\r\n leftExpr: ExpressionRef,\r\n right: Expression,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n var argumentExpressions: Expression[];\r\n var thisArg: ExpressionRef = 0;\r\n if (operatorInstance.is(CommonFlags.INSTANCE)) {\r\n let classInstance = assert(operatorInstance.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n thisArg = leftExpr; // can reuse the previously evaluated leftExpr as the this value here\r\n argumentExpressions = [ right ];\r\n } else {\r\n argumentExpressions = [ left, right ]; // annotated type of LHS might differ -> recompile\r\n }\r\n var ret = this.compileCallDirect(\r\n operatorInstance,\r\n argumentExpressions,\r\n reportNode,\r\n thisArg\r\n );\r\n return ret;\r\n }\r\n\r\n compileAssignment(expression: Expression, valueExpression: Expression, contextualType: Type): ExpressionRef {\r\n var program = this.program;\r\n var resolver = program.resolver;\r\n var flow = this.currentFlow;\r\n var target = resolver.resolveExpression(expression, flow); // reports\r\n if (!target) return this.module.createUnreachable();\r\n\r\n // to compile just the value, we need to know the target's type\r\n var targetType: Type;\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL: {\r\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field compiled as a global\r\n return this.module.createUnreachable();\r\n }\r\n assert((target).type != Type.void); // compileGlobal must guarantee this\r\n // fall-through\r\n }\r\n case ElementKind.LOCAL:\r\n case ElementKind.FIELD: {\r\n targetType = (target).type;\r\n break;\r\n }\r\n case ElementKind.PROPERTY_PROTOTYPE: { // static property\r\n let setterPrototype = (target).setterPrototype;\r\n if (!setterPrototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (target).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n let setterInstance = this.resolver.resolveFunction(setterPrototype, null, makeMap(), ReportMode.REPORT);\r\n if (!setterInstance) return this.module.createUnreachable();\r\n assert(setterInstance.signature.parameterTypes.length == 1); // parser must guarantee this\r\n targetType = setterInstance.signature.parameterTypes[0];\r\n break;\r\n }\r\n case ElementKind.PROPERTY: { // instance property\r\n let setterInstance = (target).setterInstance;\r\n if (!setterInstance) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (target).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n assert(setterInstance.signature.parameterTypes.length == 1); // parser must guarantee this\r\n targetType = setterInstance.signature.parameterTypes[0];\r\n break;\r\n }\r\n case ElementKind.CLASS: {\r\n if (resolver.currentElementExpression) { // indexed access\r\n let isUnchecked = flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n let indexedSet = (target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\r\n if (!indexedSet) {\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n if (!indexedGet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n expression.range, (target).internalName\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n expression.range, (target).internalName\r\n );\r\n }\r\n return this.module.createUnreachable();\r\n }\r\n assert(indexedSet.signature.parameterTypes.length == 2); // parser must guarantee this\r\n targetType = indexedSet.signature.parameterTypes[1]; // 2nd parameter is the element\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n\r\n // compile the value and do the assignment\r\n assert(targetType != Type.void);\r\n var valueExpr = this.compileExpression(valueExpression, targetType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n return this.compileAssignmentWithValue(\r\n expression,\r\n valueExpr,\r\n contextualType != Type.void\r\n );\r\n }\r\n\r\n compileAssignmentWithValue(\r\n expression: Expression,\r\n valueWithCorrectType: ExpressionRef,\r\n tee: bool = false\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n var target = this.resolver.resolveExpression(expression, flow); // reports\r\n if (!target) return module.createUnreachable();\r\n\r\n switch (target.kind) {\r\n case ElementKind.LOCAL: {\r\n let type = (target).type;\r\n assert(type != Type.void);\r\n this.currentType = tee ? type : Type.void;\r\n if ((target).is(CommonFlags.CONST)) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, target.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n flow.setLocalWrapped((target).index, !flow.canOverflow(valueWithCorrectType, type));\r\n }\r\n return tee\r\n ? module.createTeeLocal((target).index, valueWithCorrectType)\r\n : module.createSetLocal((target).index, valueWithCorrectType);\r\n }\r\n case ElementKind.GLOBAL: {\r\n if (!this.compileGlobal(target)) return module.createUnreachable();\r\n let type = (target).type;\r\n assert(type != Type.void);\r\n this.currentType = tee ? type : Type.void;\r\n if ((target).is(CommonFlags.CONST)) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range,\r\n target.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type); // guaranteed\r\n if (tee) {\r\n let nativeType = type.toNativeType();\r\n let internalName = target.internalName;\r\n return module.createBlock(null, [ // emulated teeGlobal\r\n module.createSetGlobal(internalName, valueWithCorrectType),\r\n module.createGetGlobal(internalName, nativeType)\r\n ], nativeType);\r\n } else {\r\n return module.createSetGlobal(target.internalName, valueWithCorrectType);\r\n }\r\n }\r\n case ElementKind.FIELD: {\r\n let initializerNode = (target).initializerNode;\r\n if (\r\n (target).is(CommonFlags.READONLY) &&\r\n !(\r\n flow.actualFunction.is(CommonFlags.CONSTRUCTOR) ||\r\n initializerNode\r\n )\r\n ) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, (target).internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n let type = (target).type;\r\n this.currentType = tee ? type : Type.void;\r\n let nativeType = type.toNativeType();\r\n if (type.kind == TypeKind.BOOL) {\r\n // make sure bools are wrapped (usually are) when storing as 8 bits\r\n valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type);\r\n }\r\n if (tee) {\r\n let flow = this.currentFlow;\r\n let tempLocal = flow.getAndFreeTempLocal(\r\n type,\r\n !flow.canOverflow(valueWithCorrectType, type)\r\n );\r\n let tempLocalIndex = tempLocal.index;\r\n // TODO: simplify if valueWithCorrectType has no side effects\r\n // TODO: call __gc_link here if a GC is present\r\n return module.createBlock(null, [\r\n module.createSetLocal(tempLocalIndex, valueWithCorrectType),\r\n module.createStore(\r\n type.byteSize,\r\n thisExpr,\r\n module.createGetLocal(tempLocalIndex, nativeType),\r\n nativeType,\r\n (target).memoryOffset\r\n ),\r\n module.createGetLocal(tempLocalIndex, nativeType)\r\n ], nativeType);\r\n } else {\r\n // TODO: call __gc_link here if a GC is present\r\n return module.createStore(\r\n type.byteSize,\r\n thisExpr,\r\n valueWithCorrectType,\r\n nativeType,\r\n (target).memoryOffset\r\n );\r\n }\r\n }\r\n case ElementKind.PROPERTY_PROTOTYPE: { // static property\r\n let setterPrototype = (target).setterPrototype;\r\n if (!setterPrototype) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, target.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n let setterInstance = this.resolver.resolveFunction(setterPrototype, null, makeMap(), ReportMode.REPORT);\r\n if (!setterInstance) return module.createUnreachable();\r\n // call just the setter if the return value isn't of interest\r\n if (!tee) return this.makeCallDirect(setterInstance, [ valueWithCorrectType ]);\r\n // otherwise call the setter first, then the getter\r\n let getterPrototype = assert((target).getterPrototype); // must be present\r\n let getterInstance = this.resolver.resolveFunction(getterPrototype, null, makeMap(), ReportMode.REPORT);\r\n if (!getterInstance) return module.createUnreachable();\r\n let returnType = getterInstance.signature.returnType;\r\n let nativeReturnType = returnType.toNativeType();\r\n return module.createBlock(null, [\r\n this.makeCallDirect(setterInstance, [ valueWithCorrectType ]),\r\n this.makeCallDirect(getterInstance) // sets currentType\r\n ], nativeReturnType);\r\n }\r\n case ElementKind.PROPERTY: { // instance property\r\n let setterInstance = (target).setterInstance;\r\n if (!setterInstance) {\r\n this.error(\r\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\r\n expression.range, target.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n // call just the setter if the return value isn't of interest\r\n if (!tee) {\r\n let thisExpr = this.compileExpressionRetainType(\r\n assert(this.resolver.currentThisExpression),\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n return this.makeCallDirect(setterInstance, [ thisExpr, valueWithCorrectType ]);\r\n }\r\n // otherwise call the setter first, then the getter\r\n let getterInstance = assert((target).getterInstance); // must be present\r\n let returnType = getterInstance.signature.returnType;\r\n let nativeReturnType = returnType.toNativeType();\r\n let thisExpr = this.compileExpressionRetainType(\r\n assert(this.resolver.currentThisExpression),\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n let tempLocal = flow.getAndFreeTempLocal(returnType, false);\r\n let tempLocalIndex = tempLocal.index;\r\n return module.createBlock(null, [\r\n this.makeCallDirect(setterInstance, [ // set and remember the target\r\n module.createTeeLocal(tempLocalIndex, thisExpr),\r\n valueWithCorrectType\r\n ]),\r\n this.makeCallDirect(getterInstance, [ // get from remembered target\r\n module.createGetLocal(tempLocalIndex, nativeReturnType)\r\n ])\r\n ], nativeReturnType);\r\n }\r\n case ElementKind.CLASS: {\r\n let elementExpression = this.resolver.currentElementExpression;\r\n if (elementExpression) {\r\n let isUnchecked = flow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n if (!indexedGet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n expression.range, target.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n let indexedSet = (target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\r\n if (!indexedSet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n expression.range, target.internalName\r\n );\r\n this.currentType = tee ? indexedGet.signature.returnType : Type.void;\r\n return module.createUnreachable();\r\n }\r\n let targetType = (target).type;\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n let elementExpr = this.compileExpression(\r\n elementExpression,\r\n Type.i32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n if (tee) {\r\n let tempLocalTarget = flow.getTempLocal(targetType, false);\r\n let tempLocalElement = flow.getAndFreeTempLocal(this.currentType, false);\r\n let returnType = indexedGet.signature.returnType;\r\n flow.freeTempLocal(tempLocalTarget);\r\n return module.createBlock(null, [\r\n this.makeCallDirect(indexedSet, [\r\n module.createTeeLocal(tempLocalTarget.index, thisExpr),\r\n module.createTeeLocal(tempLocalElement.index, elementExpr),\r\n valueWithCorrectType\r\n ]),\r\n this.makeCallDirect(indexedGet, [\r\n module.createGetLocal(tempLocalTarget.index, tempLocalTarget.type.toNativeType()),\r\n module.createGetLocal(tempLocalElement.index, tempLocalElement.type.toNativeType())\r\n ])\r\n ], returnType.toNativeType());\r\n } else {\r\n return this.makeCallDirect(indexedSet, [\r\n thisExpr,\r\n elementExpr,\r\n valueWithCorrectType\r\n ]);\r\n }\r\n }\r\n // fall-through\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n compileCallExpression(expression: CallExpression, contextualType: Type): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n\r\n // handle call to super\r\n if (expression.expression.kind == NodeKind.SUPER) {\r\n let flow = this.currentFlow;\r\n let actualFunction = flow.actualFunction;\r\n if (!actualFunction.is(CommonFlags.CONSTRUCTOR)) {\r\n this.error(\r\n DiagnosticCode.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n let classInstance = assert(actualFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n let baseClassInstance = assert((classInstance).base);\r\n let thisLocal = assert(flow.lookupLocal(CommonSymbols.this_));\r\n let nativeSizeType = this.options.nativeSizeType;\r\n\r\n // {\r\n // this = super(this || , ...args)\r\n // this.a = X\r\n // this.b = Y\r\n // }\r\n let stmts: ExpressionRef[] = [\r\n module.createSetLocal(thisLocal.index,\r\n this.compileCallDirect(\r\n this.ensureConstructor(baseClassInstance, expression),\r\n expression.arguments,\r\n expression,\r\n module.createIf(\r\n module.createGetLocal(thisLocal.index, nativeSizeType),\r\n module.createGetLocal(thisLocal.index, nativeSizeType),\r\n this.makeAllocation(classInstance)\r\n )\r\n )\r\n )\r\n ];\r\n this.makeFieldInitialization(classInstance, stmts);\r\n\r\n // check that super had been called before accessing allocating `this`\r\n if (flow.isAny(\r\n FlowFlags.ALLOCATES |\r\n FlowFlags.CONDITIONALLY_ALLOCATES\r\n )) {\r\n this.error(\r\n DiagnosticCode._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n flow.set(FlowFlags.ALLOCATES | FlowFlags.CALLS_SUPER);\r\n this.currentType = Type.void;\r\n return module.createBlock(null, stmts);\r\n }\r\n\r\n // otherwise resolve normally\r\n var target = this.resolver.resolveExpression(expression.expression, flow); // reports\r\n if (!target) return module.createUnreachable();\r\n\r\n var signature: Signature | null;\r\n var indexArg: ExpressionRef;\r\n switch (target.kind) {\r\n\r\n // direct call: concrete function\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n let prototype = target;\r\n let typeArguments = expression.typeArguments;\r\n\r\n // builtins handle present respectively omitted type arguments on their own\r\n if (prototype.hasDecorator(DecoratorFlags.BUILTIN)) {\r\n return this.compileCallExpressionBuiltin(prototype, expression, contextualType);\r\n }\r\n\r\n let instance: Function | null = null;\r\n\r\n // resolve generic call if type arguments have been provided\r\n if (typeArguments) {\r\n if (!prototype.is(CommonFlags.GENERIC)) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n expression.expression.range, prototype.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n instance = this.resolver.resolveFunctionInclTypeArguments(\r\n prototype,\r\n typeArguments,\r\n flow.actualFunction.parent, // relative to caller\r\n makeMap(flow.contextualTypeArguments),\r\n expression\r\n );\r\n\r\n // infer generic call if type arguments have been omitted\r\n } else if (prototype.is(CommonFlags.GENERIC)) {\r\n let inferredTypes = new Map();\r\n let typeParameterNodes = assert(prototype.typeParameterNodes);\r\n let numTypeParameters = typeParameterNodes.length;\r\n for (let i = 0; i < numTypeParameters; ++i) {\r\n inferredTypes.set(typeParameterNodes[i].name.text, null);\r\n }\r\n // let numInferred = 0;\r\n let parameterNodes = prototype.signatureNode.parameters;\r\n let numParameters = parameterNodes.length;\r\n let argumentNodes = expression.arguments;\r\n let numArguments = argumentNodes.length;\r\n let argumentExprs = new Array(numArguments);\r\n for (let i = 0; i < numParameters; ++i) {\r\n let typeNode = parameterNodes[i].type;\r\n let templateName = typeNode.kind == NodeKind.TYPE && !(typeNode).name.next\r\n ? (typeNode).name.identifier.text\r\n : null;\r\n let argumentExpression = i < numArguments\r\n ? argumentNodes[i]\r\n : parameterNodes[i].initializer;\r\n if (!argumentExpression) { // missing initializer -> too few arguments\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n expression.range, numParameters.toString(10), numArguments.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (templateName !== null && inferredTypes.has(templateName)) {\r\n let inferredType = inferredTypes.get(templateName);\r\n if (inferredType) {\r\n argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, inferredType, WrapMode.NONE);\r\n let commonType: Type | null;\r\n if (!(commonType = Type.commonCompatible(inferredType, this.currentType, true))) {\r\n if (!(commonType = Type.commonCompatible(inferredType, this.currentType, false))) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n parameterNodes[i].type.range, this.currentType.toString(), inferredType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n inferredType = commonType;\r\n } else {\r\n argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, Type.i32, WrapMode.NONE);\r\n inferredType = this.currentType;\r\n // ++numInferred;\r\n }\r\n inferredTypes.set(templateName, inferredType);\r\n } else {\r\n let concreteType = this.resolver.resolveType(\r\n parameterNodes[i].type,\r\n flow.actualFunction,\r\n flow.contextualTypeArguments\r\n );\r\n if (!concreteType) return module.createUnreachable();\r\n argumentExprs[i] = this.compileExpression(\r\n argumentExpression,\r\n concreteType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n }\r\n let resolvedTypeArguments = new Array(numTypeParameters);\r\n for (let i = 0; i < numTypeParameters; ++i) {\r\n let inferredType = assert(inferredTypes.get(typeParameterNodes[i].name.text)); // TODO\r\n resolvedTypeArguments[i] = inferredType;\r\n }\r\n instance = this.resolver.resolveFunction(\r\n prototype,\r\n resolvedTypeArguments,\r\n makeMap(flow.contextualTypeArguments)\r\n );\r\n if (!instance) return this.module.createUnreachable();\r\n return this.makeCallDirect(instance, argumentExprs);\r\n // TODO: this skips inlining because inlining requires compiling its temporary locals in\r\n // the scope of the inlined flow. might need another mechanism to lock temp. locals early,\r\n // so inlining can be performed in `makeCallDirect` instead?\r\n\r\n // otherwise resolve the non-generic call as usual\r\n } else {\r\n instance = this.resolver.resolveFunction(prototype, null);\r\n }\r\n if (!instance) return this.module.createUnreachable();\r\n\r\n // compile 'this' expression if an instance method\r\n let thisExpr: ExpressionRef = 0;\r\n if (instance.is(CommonFlags.INSTANCE)) {\r\n thisExpr = this.compileExpressionRetainType(\r\n assert(this.resolver.currentThisExpression),\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n }\r\n\r\n return this.compileCallDirect(\r\n instance,\r\n expression.arguments,\r\n expression,\r\n thisExpr\r\n );\r\n }\r\n\r\n // indirect call: index argument with signature (non-generic, can't be inlined)\r\n case ElementKind.LOCAL: {\r\n if (signature = (target).type.signatureReference) {\r\n if ((target).is(CommonFlags.INLINED)) {\r\n indexArg = module.createI32(i64_low((target).constantIntegerValue));\r\n } else {\r\n indexArg = module.createGetLocal((target).index, NativeType.I32);\r\n }\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, (target).type.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case ElementKind.GLOBAL: {\r\n if (signature = (target).type.signatureReference) {\r\n indexArg = module.createGetGlobal((target).internalName, (target).type.toNativeType());\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, (target).type.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case ElementKind.FIELD: {\r\n let type = (target).type;\r\n if (signature = type.signatureReference) {\r\n let thisExpression = assert(this.resolver.currentThisExpression);\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n indexArg = module.createLoad(\r\n 4,\r\n false,\r\n thisExpr,\r\n NativeType.I32,\r\n (target).memoryOffset\r\n );\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, type.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case ElementKind.FUNCTION_TARGET: {\r\n signature = (target).signature;\r\n indexArg = this.compileExpression(\r\n expression.expression,\r\n (target).type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n break;\r\n }\r\n\r\n case ElementKind.PROPERTY_PROTOTYPE: { // static property\r\n let getterPrototype = assert((target).getterPrototype);\r\n let getterInstance = this.resolver.resolveFunction(getterPrototype, null);\r\n if (!getterInstance) return module.createUnreachable();\r\n indexArg = this.compileCallDirect(getterInstance, [], expression.expression);\r\n signature = this.currentType.signatureReference;\r\n if (!signature) {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n break;\r\n }\r\n case ElementKind.PROPERTY: { // instance property\r\n let getterInstance = assert((target).getterInstance);\r\n indexArg = this.compileCallDirect(getterInstance, [], expression.expression,\r\n this.compileExpressionRetainType(\r\n assert(this.resolver.currentThisExpression),\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n )\r\n );\r\n signature = this.currentType.signatureReference;\r\n if (!signature) {\r\n this.error(\r\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\r\n expression.range, this.currentType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n break;\r\n }\r\n\r\n // not supported\r\n default: {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n return this.compileCallIndirect(\r\n signature,\r\n indexArg,\r\n expression.arguments,\r\n expression\r\n );\r\n }\r\n\r\n private compileCallExpressionBuiltin(\r\n prototype: FunctionPrototype,\r\n expression: CallExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var typeArguments: Type[] | null = null;\r\n\r\n // builtins handle omitted type arguments on their own. if present, however, resolve them here\r\n // and pass them to the builtin, even if it's still up to the builtin how to handle them.\r\n var typeParameterNodes = prototype.typeParameterNodes;\r\n var typeArgumentNodes = expression.typeArguments;\r\n if (expression.typeArguments) {\r\n if (!prototype.is(CommonFlags.GENERIC)) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n expression.range, prototype.internalName\r\n );\r\n }\r\n typeArguments = this.resolver.resolveTypeArguments(\r\n assert(typeParameterNodes),\r\n typeArgumentNodes,\r\n this.currentFlow.actualFunction.parent,\r\n makeMap(this.currentFlow.contextualTypeArguments),\r\n expression\r\n );\r\n }\r\n\r\n // now compile the builtin, which usually returns a block of code that replaces the call.\r\n var expr = compileBuiltinCall(\r\n this,\r\n prototype,\r\n typeArguments,\r\n expression.arguments,\r\n contextualType,\r\n expression\r\n );\r\n if (!expr) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n return expr;\r\n }\r\n\r\n /**\r\n * Checks that a call with the given number as arguments can be performed according to the\r\n * specified signature.\r\n */\r\n checkCallSignature(\r\n signature: Signature,\r\n numArguments: i32,\r\n hasThis: bool,\r\n reportNode: Node\r\n ): bool {\r\n\r\n // cannot call an instance method without a `this` argument (TODO: `.call`?)\r\n var thisType = signature.thisType;\r\n if (hasThis != (thisType != null)) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported, // TODO: better message?\r\n reportNode.range\r\n );\r\n return false;\r\n }\r\n\r\n // not yet implemented (TODO: maybe some sort of an unmanaged/lightweight array?)\r\n var hasRest = signature.hasRest;\r\n if (hasRest) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return false;\r\n }\r\n\r\n var minimum = signature.requiredParameters;\r\n var maximum = signature.parameterTypes.length;\r\n\r\n // must at least be called with required arguments\r\n if (numArguments < minimum) {\r\n this.error(\r\n minimum < maximum\r\n ? DiagnosticCode.Expected_at_least_0_arguments_but_got_1\r\n : DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, minimum.toString(), numArguments.toString()\r\n );\r\n return false;\r\n }\r\n\r\n // must not be called with more than the maximum arguments\r\n if (numArguments > maximum && !hasRest) {\r\n this.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, maximum.toString(), numArguments.toString()\r\n );\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** Compiles a direct call to a concrete function. */\r\n compileCallDirect(\r\n instance: Function,\r\n argumentExpressions: Expression[],\r\n reportNode: Node,\r\n thisArg: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var numArguments = argumentExpressions.length;\r\n var signature = instance.signature;\r\n\r\n if (!this.checkCallSignature( // reports\r\n signature,\r\n numArguments,\r\n thisArg != 0,\r\n reportNode\r\n )) {\r\n return this.module.createUnreachable();\r\n }\r\n\r\n // Inline if explicitly requested\r\n if (instance.hasDecorator(DecoratorFlags.INLINE)) {\r\n assert(!instance.is(CommonFlags.TRAMPOLINE)); // doesn't make sense\r\n if (this.currentInlineFunctions.includes(instance)) {\r\n this.warning(\r\n DiagnosticCode.Function_0_cannot_be_inlined_into_itself,\r\n reportNode.range, instance.internalName\r\n );\r\n } else {\r\n this.currentInlineFunctions.push(instance);\r\n let expr = this.compileCallInlinePrechecked(instance, argumentExpressions, thisArg);\r\n this.currentInlineFunctions.pop();\r\n return expr;\r\n }\r\n }\r\n\r\n // Otherwise compile to just a call\r\n var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\r\n var operands = new Array(numArgumentsInclThis);\r\n var index = 0;\r\n if (thisArg) {\r\n operands[0] = thisArg;\r\n index = 1;\r\n }\r\n var parameterTypes = signature.parameterTypes;\r\n for (let i = 0; i < numArguments; ++i, ++index) {\r\n operands[index] = this.compileExpression(\r\n argumentExpressions[i],\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n assert(index == numArgumentsInclThis);\r\n return this.makeCallDirect(instance, operands);\r\n }\r\n\r\n // Depends on being pre-checked in compileCallDirect\r\n private compileCallInlinePrechecked(\r\n instance: Function,\r\n argumentExpressions: Expression[],\r\n thisArg: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var module = this.module;\r\n\r\n // Create a new inline flow and use it to compile the function as a block\r\n var previousFlow = this.currentFlow;\r\n var flow = Flow.createInline(previousFlow.parentFunction, instance);\r\n\r\n // Convert provided call arguments to temporary locals. It is important that these are compiled\r\n // here, with their respective locals being blocked. There is no 'makeCallInline'.\r\n var body = [];\r\n\r\n if (thisArg) {\r\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n let thisType = assert(instance.signature.thisType);\r\n let thisLocal = flow.addScopedLocal(CommonSymbols.this_, thisType, false);\r\n body.push(\r\n module.createSetLocal(thisLocal.index, thisArg)\r\n );\r\n let baseInstance = (classInstance).base;\r\n if (baseInstance) flow.addScopedAlias(CommonSymbols.super_, baseInstance.type, thisLocal.index);\r\n }\r\n\r\n var numArguments = argumentExpressions.length;\r\n var signature = instance.signature;\r\n var parameterTypes = signature.parameterTypes;\r\n for (let i = 0; i < numArguments; ++i) {\r\n let paramExpr = this.compileExpression(\r\n argumentExpressions[i],\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n let argumentLocal = flow.addScopedLocal(\r\n signature.getParameterName(i),\r\n parameterTypes[i],\r\n !previousFlow.canOverflow(paramExpr, parameterTypes[i])\r\n );\r\n body.push(\r\n module.createSetLocal(argumentLocal.index, paramExpr)\r\n );\r\n }\r\n\r\n // Compile optional parameter initializers in the scope of the inlined flow\r\n this.currentFlow = flow;\r\n var numParameters = signature.parameterTypes.length;\r\n for (let i = numArguments; i < numParameters; ++i) {\r\n let initExpr = this.compileExpression(\r\n assert(instance.prototype.signatureNode.parameters[i].initializer),\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP\r\n );\r\n let argumentLocal = flow.addScopedLocal(\r\n signature.getParameterName(i),\r\n parameterTypes[i],\r\n !flow.canOverflow(initExpr, parameterTypes[i])\r\n );\r\n body.push(\r\n module.createSetLocal(argumentLocal.index, initExpr)\r\n );\r\n }\r\n\r\n // Compile the called function's body in the scope of the inlined flow\r\n {\r\n let stmts = this.compileFunctionBody(instance);\r\n for (let i = 0, k = stmts.length; i < k; ++i) body.push(stmts[i]);\r\n }\r\n\r\n // Free any new scoped locals and reset to the original flow\r\n flow.freeScopedLocals();\r\n var returnType = flow.returnType;\r\n this.currentFlow = previousFlow;\r\n this.currentType = returnType;\r\n\r\n // Create an outer block that we can break to when returning a value out of order\r\n return module.createBlock(flow.inlineReturnLabel, body, returnType.toNativeType());\r\n }\r\n\r\n /** Gets the trampoline for the specified function. */\r\n ensureTrampoline(original: Function): Function {\r\n // A trampoline is a function that takes a fixed amount of operands with some of them possibly\r\n // being zeroed. It takes one additional argument denoting the number of actual operands\r\n // provided to the call, and takes appropriate steps to initialize zeroed operands to their\r\n // default values using the optional parameter initializers of the original function. Doing so\r\n // allows calls to functions with optional parameters to circumvent the trampoline when all\r\n // parameters are provided as a fast route, respectively setting up omitted operands in a proper\r\n // context otherwise.\r\n var trampoline = original.trampoline;\r\n if (trampoline) return trampoline;\r\n\r\n var originalSignature = original.signature;\r\n var originalName = original.internalName;\r\n var originalParameterTypes = originalSignature.parameterTypes;\r\n var originalParameterDeclarations = original.prototype.signatureNode.parameters;\r\n var commonReturnType = originalSignature.returnType;\r\n var commonThisType = originalSignature.thisType;\r\n var isInstance = original.is(CommonFlags.INSTANCE);\r\n\r\n // arguments excl. `this`, operands incl. `this`\r\n var minArguments = originalSignature.requiredParameters;\r\n var minOperands = minArguments;\r\n var maxArguments = originalParameterTypes.length;\r\n var maxOperands = maxArguments;\r\n if (isInstance) {\r\n ++minOperands;\r\n ++maxOperands;\r\n }\r\n var numOptional = assert(maxOperands - minOperands);\r\n\r\n var forwardedOperands = new Array(minOperands);\r\n var operandIndex = 0;\r\n\r\n // forward `this` if applicable\r\n var module = this.module;\r\n if (isInstance) {\r\n forwardedOperands[0] = module.createGetLocal(0, this.options.nativeSizeType);\r\n operandIndex = 1;\r\n }\r\n\r\n // forward required arguments\r\n for (let i = 0; i < minArguments; ++i, ++operandIndex) {\r\n forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, originalParameterTypes[i].toNativeType());\r\n }\r\n assert(operandIndex == minOperands);\r\n\r\n // create the trampoline element\r\n var trampolineSignature = new Signature(originalParameterTypes, commonReturnType, commonThisType);\r\n trampolineSignature.requiredParameters = maxArguments;\r\n trampoline = new Function(\r\n original.name + \"|trampoline\",\r\n original.prototype,\r\n trampolineSignature,\r\n original.contextualTypeArguments\r\n );\r\n trampoline.set(original.flags | CommonFlags.TRAMPOLINE | CommonFlags.COMPILED);\r\n original.trampoline = trampoline;\r\n\r\n // compile initializers of omitted arguments in scope of the trampoline function\r\n // this is necessary because initializers might need additional locals and a proper this context\r\n var previousFlow = this.currentFlow;\r\n this.currentFlow = trampoline.flow;\r\n\r\n // create a br_table switching over the number of optional parameters provided\r\n var numNames = numOptional + 1; // incl. outer block\r\n var names = new Array(numNames);\r\n var ofN = \"of\" + numOptional.toString(10);\r\n for (let i = 0; i < numNames; ++i) {\r\n let label = i.toString(10) + ofN;\r\n names[i] = label;\r\n }\r\n var body = module.createBlock(names[0], [\r\n module.createBlock(\"outOfRange\", [\r\n module.createSwitch(names, \"outOfRange\",\r\n // condition is number of provided optional arguments, so subtract required arguments\r\n minArguments\r\n ? module.createBinary(\r\n BinaryOp.SubI32,\r\n module.createGetGlobal(CompilerSymbols.argc, NativeType.I32),\r\n module.createI32(minArguments)\r\n )\r\n : module.createGetGlobal(CompilerSymbols.argc, NativeType.I32)\r\n )\r\n ]),\r\n module.createUnreachable()\r\n ]);\r\n for (let i = 0; i < numOptional; ++i, ++operandIndex) {\r\n let type = originalParameterTypes[minArguments + i];\r\n let declaration = originalParameterDeclarations[minArguments + i];\r\n let initializer = declaration.initializer;\r\n let initExpr: ExpressionRef;\r\n if (initializer) {\r\n initExpr = module.createSetLocal(operandIndex,\r\n this.compileExpression(\r\n initializer,\r\n type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.WRAP\r\n )\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Optional_parameter_must_have_an_initializer,\r\n declaration.range\r\n );\r\n initExpr = module.createUnreachable();\r\n }\r\n body = module.createBlock(names[i + 1], [\r\n body,\r\n initExpr,\r\n ]);\r\n forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, type.toNativeType());\r\n }\r\n this.currentFlow = previousFlow;\r\n assert(operandIndex == maxOperands);\r\n\r\n var funcRef = module.addFunction(\r\n trampoline.internalName,\r\n this.ensureFunctionType(\r\n trampolineSignature.parameterTypes,\r\n trampolineSignature.returnType,\r\n trampolineSignature.thisType\r\n ),\r\n typesToNativeTypes(trampoline.additionalLocals),\r\n module.createBlock(null, [\r\n body,\r\n module.createCall(\r\n originalName,\r\n forwardedOperands,\r\n commonReturnType.toNativeType()\r\n )\r\n ], commonReturnType.toNativeType())\r\n );\r\n trampoline.finalize(module, funcRef);\r\n return trampoline;\r\n }\r\n\r\n /** Makes sure that the argument count helper global is present and returns its name. */\r\n private ensureArgcVar(): string {\r\n if (!this.argcVar) {\r\n let module = this.module;\r\n this.argcVar = module.addGlobal(\r\n CompilerSymbols.argc,\r\n NativeType.I32,\r\n true,\r\n module.createI32(0)\r\n );\r\n }\r\n return CompilerSymbols.argc;\r\n }\r\n\r\n /** Makes sure that the argument count helper setter is present and returns its name. */\r\n private ensureArgcSet(): string {\r\n var internalName = CompilerSymbols.setargc;\r\n if (!this.argcSet) {\r\n let module = this.module;\r\n this.argcSet = module.addFunction(internalName,\r\n this.ensureFunctionType([ Type.u32 ], Type.void),\r\n null,\r\n module.createSetGlobal(this.ensureArgcVar(),\r\n module.createGetLocal(0, NativeType.I32)\r\n )\r\n );\r\n module.addFunctionExport(internalName, \"_setargc\");\r\n }\r\n return internalName;\r\n }\r\n\r\n /** Creates a direct call to the specified function. */\r\n makeCallDirect(\r\n instance: Function,\r\n operands: ExpressionRef[] | null = null\r\n ): ExpressionRef {\r\n var numOperands = operands ? operands.length : 0;\r\n var numArguments = numOperands;\r\n var minArguments = instance.signature.requiredParameters;\r\n var minOperands = minArguments;\r\n var maxArguments = instance.signature.parameterTypes.length;\r\n var maxOperands = maxArguments;\r\n if (instance.is(CommonFlags.INSTANCE)) {\r\n ++minOperands;\r\n ++maxOperands;\r\n --numArguments;\r\n }\r\n assert(numOperands >= minOperands);\r\n\r\n var module = this.module;\r\n if (!this.compileFunction(instance)) return module.createUnreachable();\r\n var returnType = instance.signature.returnType;\r\n var isCallImport = instance.is(CommonFlags.MODULE_IMPORT);\r\n\r\n // fill up omitted arguments with their initializers, if constant, otherwise with zeroes.\r\n if (numOperands < maxOperands) {\r\n if (!operands) {\r\n operands = new Array(maxOperands);\r\n operands.length = 0;\r\n }\r\n let parameterTypes = instance.signature.parameterTypes;\r\n let parameterNodes = instance.prototype.signatureNode.parameters;\r\n let allOptionalsAreConstant = true;\r\n for (let i = numArguments; i < maxArguments; ++i) {\r\n let initializer = parameterNodes[i].initializer;\r\n if (!(initializer !== null && nodeIsConstantValue(initializer.kind))) {\r\n allOptionalsAreConstant = false;\r\n break;\r\n }\r\n }\r\n if (allOptionalsAreConstant) { // inline into the call\r\n for (let i = numArguments; i < maxArguments; ++i) {\r\n operands.push(\r\n this.compileExpression(\r\n parameterNodes[i].initializer,\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n )\r\n );\r\n }\r\n } else { // otherwise fill up with zeroes and call the trampoline\r\n for (let i = numArguments; i < maxArguments; ++i) {\r\n operands.push(parameterTypes[i].toNativeZero(module));\r\n }\r\n if (!isCallImport) {\r\n let original = instance;\r\n instance = this.ensureTrampoline(instance);\r\n if (!this.compileFunction(instance)) return module.createUnreachable();\r\n instance.flow.flags = original.flow.flags;\r\n let nativeReturnType = returnType.toNativeType();\r\n this.currentType = returnType;\r\n return module.createBlock(null, [\r\n module.createSetGlobal(this.ensureArgcVar(), module.createI32(numArguments)),\r\n module.createCall(instance.internalName, operands, nativeReturnType)\r\n ], nativeReturnType);\r\n }\r\n }\r\n }\r\n\r\n // otherwise just call through\r\n this.currentType = returnType;\r\n return module.createCall(instance.internalName, operands, returnType.toNativeType());\r\n }\r\n\r\n /** Compiles an indirect call using an index argument and a signature. */\r\n compileCallIndirect(\r\n signature: Signature,\r\n indexArg: ExpressionRef,\r\n argumentExpressions: Expression[],\r\n reportNode: Node,\r\n thisArg: ExpressionRef = 0\r\n ): ExpressionRef {\r\n var numArguments = argumentExpressions.length;\r\n\r\n if (!this.checkCallSignature( // reports\r\n signature,\r\n numArguments,\r\n thisArg != 0,\r\n reportNode\r\n )) {\r\n return this.module.createUnreachable();\r\n }\r\n\r\n var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\r\n var operands = new Array(numArgumentsInclThis);\r\n var index = 0;\r\n if (thisArg) {\r\n operands[0] = thisArg;\r\n index = 1;\r\n }\r\n var parameterTypes = signature.parameterTypes;\r\n for (let i = 0; i < numArguments; ++i, ++index) {\r\n operands[index] = this.compileExpression(\r\n argumentExpressions[i],\r\n parameterTypes[i],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n assert(index == numArgumentsInclThis);\r\n return this.makeCallIndirect(signature, indexArg, operands);\r\n }\r\n\r\n /** Creates an indirect call to the function at `indexArg` in the function table. */\r\n makeCallIndirect(\r\n signature: Signature,\r\n indexArg: ExpressionRef,\r\n operands: ExpressionRef[] | null = null\r\n ): ExpressionRef {\r\n var numOperands = operands ? operands.length : 0;\r\n var numArguments = numOperands;\r\n var minArguments = signature.requiredParameters;\r\n var minOperands = minArguments;\r\n var maxArguments = signature.parameterTypes.length;\r\n var maxOperands = maxArguments;\r\n if (signature.thisType) {\r\n ++minOperands;\r\n ++maxOperands;\r\n --numArguments;\r\n }\r\n assert(numOperands >= minOperands);\r\n\r\n this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\r\n var module = this.module;\r\n\r\n // fill up omitted arguments with zeroes\r\n if (numOperands < maxOperands) {\r\n if (!operands) {\r\n operands = new Array(maxOperands);\r\n operands.length = 0;\r\n }\r\n let parameterTypes = signature.parameterTypes;\r\n for (let i = numArguments; i < maxArguments; ++i) {\r\n operands.push(parameterTypes[i].toNativeZero(module));\r\n }\r\n }\r\n\r\n var returnType = signature.returnType;\r\n this.currentType = returnType;\r\n return module.createBlock(null, [\r\n module.createSetGlobal(this.ensureArgcVar(), // might still be calling a trampoline\r\n module.createI32(numArguments)\r\n ),\r\n module.createCallIndirect(indexArg, operands, signature.toSignatureString())\r\n ], returnType.toNativeType()); // not necessarily wrapped\r\n }\r\n\r\n compileCommaExpression(expression: CommaExpression, contextualType: Type): ExpressionRef {\r\n var expressions = expression.expressions;\r\n var numExpressions = expressions.length;\r\n var exprs = new Array(numExpressions--);\r\n for (let i = 0; i < numExpressions; ++i) {\r\n exprs[i] = this.compileExpression(\r\n expressions[i],\r\n Type.void, // drop all\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n exprs[numExpressions] = this.compileExpression(\r\n expressions[numExpressions],\r\n contextualType, // except last\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n return this.module.createBlock(null, exprs, this.currentType.toNativeType());\r\n }\r\n\r\n compileElementAccessExpression(expression: ElementAccessExpression, contextualType: Type): ExpressionRef {\r\n var target = this.resolver.resolveElementAccessExpression(\r\n expression,\r\n this.currentFlow,\r\n contextualType\r\n ); // reports\r\n if (!target) return this.module.createUnreachable();\r\n switch (target.kind) {\r\n case ElementKind.CLASS: {\r\n let isUnchecked = this.currentFlow.is(FlowFlags.UNCHECKED_CONTEXT);\r\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\r\n if (!indexedGet) {\r\n this.error(\r\n DiagnosticCode.Index_signature_is_missing_in_type_0,\r\n expression.expression.range, (target).internalName\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n let thisArg = this.compileExpression(\r\n expression.expression,\r\n (target).type,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n return this.compileCallDirect(indexedGet, [\r\n expression.elementExpression\r\n ], expression, thisArg);\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileFunctionExpression(\r\n expression: FunctionExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var declaration = expression.declaration;\r\n var name = declaration.name;\r\n var simpleName = (name.text.length\r\n ? name.text\r\n : \"anonymous\") + \"|\" + this.functionTable.length.toString(10);\r\n var flow = this.currentFlow;\r\n var prototype = new FunctionPrototype(\r\n simpleName,\r\n flow.actualFunction,\r\n declaration.clone(), // same function can be compiled multiple times if generic\r\n DecoratorFlags.NONE\r\n );\r\n var instance = this.compileFunctionUsingTypeArguments(\r\n prototype,\r\n [],\r\n makeMap(flow.contextualTypeArguments),\r\n declaration\r\n );\r\n if (!instance) return this.module.createUnreachable();\r\n this.currentType = instance.signature.type; // TODO: get cached type?\r\n // NOTE that, in order to make this work in every case, the function must be represented by a\r\n // value, so we add it and rely on the optimizer to figure out where it can be called directly.\r\n var index = this.ensureFunctionTableEntry(instance); // reports\r\n return index < 0\r\n ? this.module.createUnreachable()\r\n : this.module.createI32(index);\r\n }\r\n\r\n /** Makes sure the enclosing source file of the specified expression has been compiled. */\r\n private maybeCompileEnclosingSource(expression: Expression): void {\r\n var internalPath = expression.range.source.internalPath;\r\n var filesByName = this.program.filesByName;\r\n assert(filesByName.has(internalPath));\r\n var enclosingFile = filesByName.get(internalPath)!;\r\n if (!enclosingFile.is(CommonFlags.COMPILED)) {\r\n this.compileFileByPath(internalPath, expression);\r\n }\r\n }\r\n\r\n /**\r\n * Compiles an identifier in the specified context.\r\n * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\r\n * precomputes them according to context.\r\n */\r\n compileIdentifierExpression(\r\n expression: IdentifierExpression,\r\n contextualType: Type,\r\n retainConstantType: bool\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n var actualFunction = flow.actualFunction;\r\n\r\n // check special keywords first\r\n switch (expression.kind) {\r\n case NodeKind.NULL: {\r\n let options = this.options;\r\n if (!contextualType.classReference) {\r\n this.currentType = options.usizeType;\r\n }\r\n return options.isWasm64\r\n ? module.createI64(0)\r\n : module.createI32(0);\r\n }\r\n case NodeKind.TRUE: {\r\n this.currentType = Type.bool;\r\n return module.createI32(1);\r\n }\r\n case NodeKind.FALSE: {\r\n this.currentType = Type.bool;\r\n return module.createI32(0);\r\n }\r\n case NodeKind.THIS: {\r\n if (actualFunction.is(CommonFlags.INSTANCE)) {\r\n let thisLocal = assert(flow.lookupLocal(CommonSymbols.this_));\r\n let classInstance = assert(actualFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n let nativeSizeType = this.options.nativeSizeType;\r\n if (actualFunction.is(CommonFlags.CONSTRUCTOR)) {\r\n if (!flow.is(FlowFlags.ALLOCATES)) {\r\n flow.set(FlowFlags.ALLOCATES);\r\n // {\r\n // if (!this) this = \r\n // this.a = X\r\n // this.b = Y\r\n // return this\r\n // }\r\n let stmts: ExpressionRef[] = [\r\n module.createIf(\r\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\r\n module.createGetLocal(thisLocal.index, nativeSizeType)\r\n ),\r\n module.createSetLocal(thisLocal.index,\r\n this.makeAllocation(classInstance)\r\n )\r\n )\r\n ];\r\n this.makeFieldInitialization(classInstance, stmts);\r\n stmts.push(\r\n module.createGetLocal(thisLocal.index, nativeSizeType)\r\n );\r\n this.currentType = thisLocal.type;\r\n return module.createBlock(null, stmts, nativeSizeType);\r\n }\r\n }\r\n // if not a constructor, `this` type can differ\r\n let thisType = assert(actualFunction.signature.thisType);\r\n this.currentType = thisType;\r\n return module.createGetLocal(thisLocal.index, thisType.toNativeType());\r\n }\r\n this.error(\r\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\r\n expression.range\r\n );\r\n this.currentType = this.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n case NodeKind.SUPER: {\r\n let flow = this.currentFlow;\r\n let actualFunction = flow.actualFunction;\r\n if (actualFunction.is(CommonFlags.CONSTRUCTOR)) {\r\n if (!flow.is(FlowFlags.CALLS_SUPER)) {\r\n // TS1034 in the parser effectively limits this to property accesses\r\n this.error(\r\n DiagnosticCode._super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class,\r\n expression.range\r\n );\r\n }\r\n }\r\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\r\n let scopedThis = flow.lookupLocal(CommonSymbols.this_);\r\n if (scopedThis) {\r\n let scopedThisClass = assert(scopedThis.type.classReference);\r\n let base = scopedThisClass.base;\r\n if (base) {\r\n this.currentType = base.type;\r\n return module.createGetLocal(scopedThis.index, base.type.toNativeType());\r\n }\r\n }\r\n }\r\n if (actualFunction.is(CommonFlags.INSTANCE)) {\r\n let classInstance = assert(actualFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n let baseClassInstance = (classInstance).base;\r\n if (baseClassInstance) {\r\n let superType = baseClassInstance.type;\r\n this.currentType = superType;\r\n return module.createGetLocal(0, superType.toNativeType());\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\r\n expression.range\r\n );\r\n this.currentType = this.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n }\r\n\r\n this.maybeCompileEnclosingSource(expression);\r\n\r\n // otherwise resolve\r\n var target = this.resolver.resolveIdentifier( // reports\r\n expression,\r\n flow,\r\n this.currentEnum || actualFunction\r\n );\r\n if (!target) return module.createUnreachable();\r\n\r\n switch (target.kind) {\r\n case ElementKind.LOCAL: {\r\n let localType = (target).type;\r\n assert(localType != Type.void);\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return this.compileInlineConstant(target, contextualType, retainConstantType);\r\n }\r\n let localIndex = (target).index;\r\n assert(localIndex >= 0);\r\n this.currentType = localType;\r\n return this.module.createGetLocal(localIndex, localType.toNativeType());\r\n }\r\n case ElementKind.GLOBAL: {\r\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field\r\n return this.module.createUnreachable();\r\n }\r\n let globalType = (target).type;\r\n assert(globalType != Type.void);\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return this.compileInlineConstant(target, contextualType, retainConstantType);\r\n }\r\n this.currentType = globalType;\r\n return this.module.createGetGlobal((target).internalName, globalType.toNativeType());\r\n }\r\n case ElementKind.ENUMVALUE: { // here: if referenced from within the same enum\r\n if (!target.is(CommonFlags.COMPILED)) {\r\n this.error(\r\n DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,\r\n expression.range\r\n );\r\n this.currentType = Type.i32;\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = Type.i32;\r\n if ((target).is(CommonFlags.INLINED)) {\r\n assert((target).constantValueKind == ConstantValueKind.INTEGER);\r\n return this.module.createI32(i64_low((target).constantIntegerValue));\r\n }\r\n return this.module.createGetGlobal((target).internalName, NativeType.I32);\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n let instance = this.resolver.resolveFunction(\r\n target,\r\n null,\r\n makeMap(flow.contextualTypeArguments)\r\n );\r\n if (!(instance && this.compileFunction(instance))) return module.createUnreachable();\r\n let index = this.ensureFunctionTableEntry(instance);\r\n this.currentType = instance.signature.type;\r\n return this.module.createI32(index);\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n\r\n compileInstanceOfExpression(\r\n expression: InstanceOfExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var module = this.module;\r\n // NOTE that this differs from TypeScript in that the rhs is a type, not an expression. at the\r\n // time of implementation, this seemed more useful because dynamic rhs expressions are not\r\n // possible in AS anyway.\r\n var expr = this.compileExpressionRetainType(expression.expression, this.options.usizeType, WrapMode.NONE);\r\n var actualType = this.currentType;\r\n var expectedType = this.resolver.resolveType(\r\n expression.isType,\r\n this.currentFlow.actualFunction\r\n );\r\n this.currentType = Type.bool;\r\n if (!expectedType) return module.createUnreachable();\r\n\r\n // instanceof must be exact\r\n if (!expectedType.is(TypeFlags.REFERENCE)) {\r\n return module.createI32(actualType == expectedType ? 1 : 0);\r\n }\r\n // instanceof must be != 0\r\n if (\r\n actualType.is(TypeFlags.NULLABLE) && !expectedType.is(TypeFlags.NULLABLE) &&\r\n actualType.nonNullableType.isAssignableTo(expectedType)\r\n ) {\r\n return module.createBinary(\r\n actualType.is(TypeFlags.LONG)\r\n ? BinaryOp.NeI64\r\n : BinaryOp.NeI32,\r\n expr,\r\n actualType.toNativeZero(module)\r\n );\r\n }\r\n return module.createI32(actualType.isAssignableTo(expectedType) ? 1 : 0);\r\n }\r\n\r\n compileLiteralExpression(\r\n expression: LiteralExpression,\r\n contextualType: Type,\r\n implicitNegate: bool = false\r\n ): ExpressionRef {\r\n var module = this.module;\r\n switch (expression.literalKind) {\r\n case LiteralKind.ARRAY: {\r\n assert(!implicitNegate);\r\n let classType = contextualType.classReference;\r\n if (\r\n classType &&\r\n classType.prototype == this.program.arrayPrototype\r\n ) {\r\n return this.compileArrayLiteral(\r\n assert(classType.typeArguments)[0],\r\n (expression).elementExpressions,\r\n false, // TODO: isConst?\r\n expression\r\n );\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n case LiteralKind.FLOAT: {\r\n let floatValue = (expression).value;\r\n if (implicitNegate) {\r\n floatValue = -floatValue;\r\n }\r\n if (contextualType == Type.f32) {\r\n return module.createF32(floatValue);\r\n }\r\n this.currentType = Type.f64;\r\n return module.createF64(floatValue);\r\n }\r\n case LiteralKind.INTEGER: {\r\n let intValue = (expression).value;\r\n if (implicitNegate) {\r\n intValue = i64_sub(\r\n i64_new(0),\r\n intValue\r\n );\r\n }\r\n let type = this.resolver.determineIntegerLiteralType(intValue, contextualType);\r\n this.currentType = type;\r\n switch (type.kind) {\r\n case TypeKind.ISIZE: if (!this.options.isWasm64) return module.createI32(i64_low(intValue));\r\n case TypeKind.I64: return module.createI64(i64_low(intValue), i64_high(intValue));\r\n case TypeKind.USIZE: if (!this.options.isWasm64) return module.createI32(i64_low(intValue));\r\n case TypeKind.U64: return module.createI64(i64_low(intValue), i64_high(intValue));\r\n case TypeKind.F32: return module.createF32(i64_to_f32(intValue));\r\n case TypeKind.F64: return module.createF64(i64_to_f64(intValue));\r\n default: return module.createI32(i64_low(intValue));\r\n }\r\n }\r\n case LiteralKind.STRING: {\r\n assert(!implicitNegate);\r\n return this.compileStringLiteral(expression);\r\n }\r\n case LiteralKind.OBJECT: {\r\n assert(!implicitNegate);\r\n return this.compileObjectLiteral(expression, contextualType);\r\n }\r\n // case LiteralKind.REGEXP:\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n this.currentType = contextualType;\r\n return module.createUnreachable();\r\n }\r\n\r\n /** Ensures that the specified string exists in static memory and returns a pointer to it. */\r\n ensureStaticString(stringValue: string): ExpressionRef {\r\n var program = this.program;\r\n var hasGC = program.hasGC;\r\n var gcHeaderSize = program.gcHeaderSize;\r\n\r\n var stringInstance = assert(program.stringInstance);\r\n var stringSegment: MemorySegment;\r\n\r\n // if the string already exists, reuse it\r\n var segments = this.stringSegments;\r\n if (segments.has(stringValue)) {\r\n stringSegment = segments.get(stringValue);\r\n\r\n // otherwise create it\r\n } else {\r\n let length = stringValue.length;\r\n let headerSize = (stringInstance.currentMemoryOffset + 1) & ~1;\r\n let totalSize = headerSize + length * 2;\r\n\r\n let buf: Uint8Array;\r\n let pos: u32;\r\n\r\n if (hasGC) {\r\n buf = new Uint8Array(gcHeaderSize + totalSize);\r\n pos = gcHeaderSize;\r\n writeI32(ensureGCHook(this, stringInstance), buf, program.gcHookOffset);\r\n } else {\r\n buf = new Uint8Array(totalSize);\r\n pos = 0;\r\n }\r\n writeI32(length, buf, pos + stringInstance.offsetof(LibrarySymbols.length));\r\n pos += headerSize;\r\n for (let i = 0; i < length; ++i) {\r\n writeI16(stringValue.charCodeAt(i), buf, pos + (i << 1));\r\n }\r\n stringSegment = this.addMemorySegment(buf);\r\n segments.set(stringValue, stringSegment);\r\n }\r\n var stringOffset = stringSegment.offset;\r\n if (hasGC) stringOffset = i64_add(stringOffset, i64_new(gcHeaderSize));\r\n\r\n this.currentType = stringInstance.type;\r\n if (this.options.isWasm64) {\r\n return this.module.createI64(i64_low(stringOffset), i64_high(stringOffset));\r\n } else {\r\n assert(i64_is_u32(stringOffset));\r\n return this.module.createI32(i64_low(stringOffset));\r\n }\r\n }\r\n\r\n compileStringLiteral(expression: StringLiteralExpression): ExpressionRef {\r\n return this.ensureStaticString(expression.value);\r\n }\r\n\r\n /** Ensures that the specified array exists in static memory and returns a pointer to it. */\r\n ensureStaticArray(elementType: Type, values: ExpressionRef[]): ExpressionRef {\r\n var program = this.program;\r\n var hasGC = program.hasGC;\r\n var gcHeaderSize = program.gcHeaderSize;\r\n\r\n var length = values.length;\r\n var byteSize = elementType.byteSize;\r\n var byteLength = length * byteSize;\r\n var usizeTypeSize = this.options.usizeType.byteSize;\r\n\r\n var buf: Uint8Array;\r\n var pos: u32;\r\n\r\n // create the backing ArrayBuffer segment\r\n var bufferInstance = assert(program.arrayBufferInstance);\r\n var bufferHeaderSize = (bufferInstance.currentMemoryOffset + 7) & ~7;\r\n var bufferTotalSize = 1 << (32 - clz(bufferHeaderSize + byteLength - 1));\r\n if (hasGC) {\r\n buf = new Uint8Array(gcHeaderSize + bufferTotalSize);\r\n pos = gcHeaderSize;\r\n writeI32(ensureGCHook(this, bufferInstance), buf, program.gcHookOffset);\r\n } else {\r\n buf = new Uint8Array(bufferTotalSize);\r\n pos = 0;\r\n }\r\n writeI32(byteLength, buf, pos + bufferInstance.offsetof(LibrarySymbols.byteLength));\r\n pos += bufferHeaderSize;\r\n var nativeType = elementType.toNativeType();\r\n switch (nativeType) {\r\n case NativeType.I32: {\r\n switch (byteSize) {\r\n case 1: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeI8(getConstValueI32(value), buf, pos);\r\n pos += 1;\r\n }\r\n break;\r\n }\r\n case 2: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeI16(getConstValueI32(value), buf, pos);\r\n pos += 2;\r\n }\r\n break;\r\n }\r\n case 4: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeI32(getConstValueI32(value), buf, pos);\r\n pos += 4;\r\n }\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n break;\r\n }\r\n case NativeType.I64: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeI64(i64_new(getConstValueI64Low(value), getConstValueI64High(value)), buf, pos);\r\n pos += 8;\r\n }\r\n break;\r\n }\r\n case NativeType.F32: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeF32(getConstValueF32(value), buf, pos);\r\n pos += 4;\r\n }\r\n break;\r\n }\r\n case NativeType.F64: {\r\n for (let i = 0; i < length; ++i) {\r\n let value = values[i];\r\n assert(getExpressionType(value) == nativeType);\r\n assert(getExpressionId(value) == ExpressionId.Const);\r\n writeF64(getConstValueF64(value), buf, pos);\r\n pos += 8;\r\n }\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n var bufferSegment = this.addMemorySegment(buf);\r\n var bufferOffset = bufferSegment.offset;\r\n if (hasGC) bufferOffset = i64_add(bufferOffset, i64_new(gcHeaderSize));\r\n\r\n // create the Array segment and return a pointer to it\r\n var arrayPrototype = assert(program.arrayPrototype);\r\n var arrayInstance = assert(this.resolver.resolveClass(\r\n arrayPrototype,\r\n [ elementType ],\r\n makeMap()\r\n ));\r\n var arrayHeaderSize = (arrayInstance.currentMemoryOffset + 7) & ~7;\r\n if (hasGC) {\r\n buf = new Uint8Array(gcHeaderSize + arrayHeaderSize);\r\n pos = gcHeaderSize;\r\n writeI32(ensureGCHook(this, arrayInstance), buf, program.gcHookOffset);\r\n } else {\r\n buf = new Uint8Array(arrayHeaderSize);\r\n pos = 0;\r\n }\r\n var arraySegment = this.addMemorySegment(buf);\r\n var arrayOffset = arraySegment.offset;\r\n if (hasGC) arrayOffset = i64_add(arrayOffset, i64_new(gcHeaderSize));\r\n this.currentType = arrayInstance.type;\r\n if (usizeTypeSize == 8) {\r\n writeI64(bufferOffset, buf, pos + arrayInstance.offsetof(\"buffer_\"));\r\n writeI32(length, buf, pos + arrayInstance.offsetof(\"length_\"));\r\n return this.module.createI64(i64_low(arrayOffset), i64_high(arrayOffset));\r\n } else {\r\n assert(i64_is_u32(bufferOffset));\r\n writeI32(i64_low(bufferOffset), buf, pos + arrayInstance.offsetof(\"buffer_\"));\r\n writeI32(length, buf, pos + arrayInstance.offsetof(\"length_\"));\r\n assert(i64_is_u32(arrayOffset));\r\n return this.module.createI32(i64_low(arrayOffset));\r\n }\r\n }\r\n\r\n compileArrayLiteral(\r\n elementType: Type,\r\n expressions: (Expression | null)[],\r\n isConst: bool,\r\n reportNode: Node\r\n ): ExpressionRef {\r\n var module = this.module;\r\n\r\n // find out whether all elements are constant (array is static)\r\n var length = expressions.length;\r\n var compiledValues = new Array(length);\r\n var constantValues = new Array(length);\r\n var nativeElementType = elementType.toNativeType();\r\n var isStatic = true;\r\n for (let i = 0; i < length; ++i) {\r\n let expr = expressions[i]\r\n ? this.compileExpression(expressions[i], elementType, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n : elementType.toNativeZero(module);\r\n compiledValues[i] = expr;\r\n if (isStatic) {\r\n expr = module.precomputeExpression(compiledValues[i]);\r\n if (getExpressionId(expr) == ExpressionId.Const) {\r\n assert(getExpressionType(expr) == nativeElementType);\r\n constantValues[i] = expr;\r\n } else {\r\n if (isConst) {\r\n this.warning(\r\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\r\n reportNode.range\r\n );\r\n }\r\n isStatic = false;\r\n }\r\n }\r\n }\r\n\r\n // make a static array if possible\r\n if (isStatic) return this.ensureStaticArray(elementType, constantValues);\r\n\r\n // otherwise obtain the array type\r\n var arrayPrototype = assert(this.program.arrayPrototype);\r\n var arrayInstance = assert(this.resolver.resolveClass(\r\n arrayPrototype,\r\n [ elementType ],\r\n makeMap()\r\n ));\r\n var arrayType = arrayInstance.type;\r\n\r\n // and compile an explicit instantiation\r\n this.currentType = arrayType;\r\n var setter = arrayInstance.lookupOverload(OperatorKind.INDEXED_SET, true);\r\n if (!setter) {\r\n this.error(\r\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\r\n reportNode.range, arrayInstance.internalName\r\n );\r\n return module.createUnreachable();\r\n }\r\n var nativeArrayType = arrayType.toNativeType();\r\n var flow = this.currentFlow;\r\n var tempLocal = flow.parentFunction.addLocal(arrayType); // can't reuse a temp (used in compiledValues)\r\n var stmts = new Array(2 + length);\r\n var index = 0;\r\n stmts[index++] = module.createSetLocal(tempLocal.index,\r\n this.makeCallDirect(assert(arrayInstance.constructorInstance), [\r\n module.createI32(0), // this\r\n module.createI32(length)\r\n ])\r\n );\r\n for (let i = 0; i < length; ++i) {\r\n stmts[index++] = this.makeCallDirect(setter, [\r\n module.createGetLocal(tempLocal.index, nativeArrayType), // this\r\n module.createI32(i),\r\n compiledValues[i]\r\n ]);\r\n }\r\n assert(index + 1 == stmts.length);\r\n stmts[index] = module.createGetLocal(tempLocal.index, nativeArrayType);\r\n flow.freeTempLocal(tempLocal); // but can be reused now\r\n this.currentType = arrayType;\r\n return module.createBlock(null, stmts, nativeArrayType);\r\n }\r\n\r\n compileObjectLiteral(expression: ObjectLiteralExpression, contextualType: Type): ExpressionRef {\r\n var module = this.module;\r\n\r\n // contextual type must be a class\r\n var classReference = contextualType.classReference;\r\n if (!classReference || classReference.is(CommonFlags.ABSTRACT)) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n expression.range, \"\", contextualType.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n // if present, check that the constructor is compatible with object literals\r\n var ctor = classReference.constructorInstance;\r\n if (ctor) {\r\n // TODO: if the constructor requires parameters, check whether these are given as part of the\r\n // object literal and use them to call the ctor while not generating a store.\r\n if (ctor.signature.requiredParameters) {\r\n this.error(\r\n DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,\r\n expression.range, classReference.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (ctor.is(CommonFlags.PRIVATE)) {\r\n this.error(\r\n DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,\r\n expression.range, classReference.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (ctor.is(CommonFlags.PROTECTED)) {\r\n this.error(\r\n DiagnosticCode.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration,\r\n expression.range, classReference.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n\r\n // check and compile field values\r\n var names = expression.names;\r\n var numNames = names.length;\r\n var values = expression.values;\r\n var members = classReference.members;\r\n var hasErrors = false;\r\n var exprs = new Array(numNames + 2);\r\n var flow = this.currentFlow;\r\n var tempLocal = flow.getTempLocal(this.options.usizeType);\r\n assert(numNames == values.length);\r\n for (let i = 0, k = numNames; i < k; ++i) {\r\n let member = members ? members.get(names[i].text) : null;\r\n if (!member || member.kind != ElementKind.FIELD) {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n names[i].range, names[i].text, classReference.toString()\r\n );\r\n hasErrors = true;\r\n continue;\r\n }\r\n let type = (member).type;\r\n exprs[i + 1] = this.module.createStore( // TODO: handle setters as well\r\n type.byteSize,\r\n this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType),\r\n this.compileExpression(values[i], (member).type, ConversionKind.IMPLICIT, WrapMode.NONE),\r\n type.toNativeType(),\r\n (member).memoryOffset\r\n );\r\n }\r\n this.currentType = classReference.type.nonNullableType;\r\n if (hasErrors) return module.createUnreachable();\r\n\r\n // allocate a new instance first and assign 'this' to the temp. local\r\n exprs[0] = module.createSetLocal(\r\n tempLocal.index,\r\n this.makeAllocation(classReference)\r\n );\r\n\r\n // once all field values have been set, return 'this'\r\n exprs[exprs.length - 1] = module.createGetLocal(tempLocal.index, this.options.nativeSizeType);\r\n\r\n return module.createBlock(null, exprs, this.options.nativeSizeType);\r\n }\r\n\r\n compileNewExpression(expression: NewExpression, contextualType: Type): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n\r\n // obtain the class being instantiated\r\n var target = this.resolver.resolveExpression( // reports\r\n expression.expression,\r\n flow\r\n );\r\n if (!target) return module.createUnreachable();\r\n if (target.kind != ElementKind.CLASS_PROTOTYPE) {\r\n this.error(\r\n DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature,\r\n expression.expression.range\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n var classPrototype = target;\r\n var classInstance: Class | null = null;\r\n var typeArguments = expression.typeArguments;\r\n var classReference: Class | null;\r\n if (\r\n !typeArguments &&\r\n (classReference = contextualType.classReference) !== null &&\r\n classReference.is(CommonFlags.GENERIC)\r\n ) {\r\n classInstance = this.resolver.resolveClass(\r\n classPrototype,\r\n classReference.typeArguments,\r\n makeMap(flow.contextualTypeArguments)\r\n );\r\n } else {\r\n classInstance = this.resolver.resolveClassInclTypeArguments(\r\n classPrototype,\r\n typeArguments,\r\n flow.actualFunction.parent, // relative to caller\r\n makeMap(flow.contextualTypeArguments),\r\n expression\r\n );\r\n }\r\n if (!classInstance) return module.createUnreachable();\r\n return this.compileInstantiate(classInstance, expression.arguments, expression);\r\n }\r\n\r\n /** Gets the compiled constructor of the specified class or generates one if none is present. */\r\n ensureConstructor(classInstance: Class, reportNode: Node): Function {\r\n var instance = classInstance.constructorInstance;\r\n if (instance) {\r\n // do not attempt to compile it if inlined anyway\r\n if (!instance.hasDecorator(DecoratorFlags.INLINE)) this.compileFunction(instance);\r\n return instance;\r\n }\r\n\r\n // use the signature of the parent constructor if a derived class\r\n var baseClass = classInstance.base;\r\n var signature = baseClass\r\n ? this.ensureConstructor(baseClass, reportNode).signature\r\n : new Signature(null, classInstance.type, classInstance.type);\r\n\r\n instance = new Function(\r\n CommonSymbols.constructor,\r\n new FunctionPrototype(CommonSymbols.constructor, classInstance,\r\n this.program.makeNativeFunctionDeclaration(CommonSymbols.constructor,\r\n CommonFlags.INSTANCE | CommonFlags.CONSTRUCTOR\r\n )\r\n ),\r\n signature,\r\n null\r\n );\r\n instance.internalName = classInstance.internalName + INSTANCE_DELIMITER + \"constructor\";\r\n instance.set(CommonFlags.COMPILED);\r\n instance.prototype.setResolvedInstance(\"\", instance);\r\n classInstance.constructorInstance = instance;\r\n var previousFlow = this.currentFlow;\r\n this.currentFlow = instance.flow;\r\n\r\n // generate body\r\n var module = this.module;\r\n var nativeSizeType = this.options.nativeSizeType;\r\n var stmts = new Array();\r\n\r\n // {\r\n // if (!this) this = \r\n // IF_DERIVED: this = super(this, ...args)\r\n // this.a = X\r\n // this.b = Y\r\n // return this\r\n // }\r\n stmts.push(\r\n module.createIf(\r\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\r\n module.createGetLocal(0, nativeSizeType)\r\n ),\r\n module.createSetLocal(0,\r\n this.makeAllocation(classInstance)\r\n )\r\n )\r\n );\r\n if (baseClass) {\r\n let parameterTypes = signature.parameterTypes;\r\n let numParameters = parameterTypes.length;\r\n let operands = new Array(1 + numParameters);\r\n operands[0] = module.createGetLocal(0, nativeSizeType);\r\n for (let i = 0; i < numParameters; ++i) {\r\n operands[i + 1] = module.createGetLocal(i + 1, parameterTypes[i].toNativeType());\r\n }\r\n // TODO: base constructor might be inlined, but makeCallDirect can't do this\r\n stmts.push(\r\n module.createSetLocal(0,\r\n this.makeCallDirect(assert(baseClass.constructorInstance), operands)\r\n )\r\n );\r\n }\r\n this.makeFieldInitialization(classInstance, stmts);\r\n stmts.push(\r\n module.createGetLocal(0, nativeSizeType)\r\n );\r\n\r\n // make the function\r\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\r\n var locals = instance.localsByIndex;\r\n var varTypes = new Array(); // of temp. vars added while compiling initializers\r\n var numOperands = 1 + signature.parameterTypes.length;\r\n var numLocals = locals.length;\r\n if (numLocals > numOperands) {\r\n for (let i = numOperands; i < numLocals; ++i) varTypes.push(locals[i].type.toNativeType());\r\n }\r\n var funcRef = module.addFunction(instance.internalName, typeRef, varTypes,\r\n stmts.length == 1\r\n ? stmts[0]\r\n : module.createBlock(null, stmts, nativeSizeType)\r\n );\r\n instance.finalize(module, funcRef);\r\n this.currentFlow = previousFlow;\r\n return instance;\r\n }\r\n\r\n compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\r\n var ctor = this.ensureConstructor(classInstance, reportNode);\r\n var expr = this.compileCallDirect(\r\n ctor,\r\n argumentExpressions,\r\n reportNode,\r\n this.options.usizeType.toNativeZero(this.module)\r\n );\r\n this.currentType = classInstance.type;\r\n return expr;\r\n }\r\n\r\n compileParenthesizedExpression(\r\n expression: ParenthesizedExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n // does not change types, just order\r\n return this.compileExpression(\r\n expression.expression,\r\n contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n }\r\n\r\n /**\r\n * Compiles a property access in the specified context.\r\n * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\r\n * precomputes them according to context.\r\n */\r\n compilePropertyAccessExpression(\r\n propertyAccess: PropertyAccessExpression,\r\n contextualType: Type,\r\n retainConstantType: bool\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n\r\n this.maybeCompileEnclosingSource(propertyAccess);\r\n\r\n var target = this.resolver.resolvePropertyAccessExpression(propertyAccess, flow, contextualType); // reports\r\n if (!target) return module.createUnreachable();\r\n\r\n switch (target.kind) {\r\n case ElementKind.GLOBAL: { // static field\r\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field\r\n return module.createUnreachable();\r\n }\r\n let globalType = (target).type;\r\n assert(globalType != Type.void);\r\n if ((target).is(CommonFlags.INLINED)) {\r\n return this.compileInlineConstant(target, contextualType, retainConstantType);\r\n }\r\n this.currentType = globalType;\r\n return module.createGetGlobal((target).internalName, globalType.toNativeType());\r\n }\r\n case ElementKind.ENUMVALUE: { // enum value\r\n let theEnum = assert((target).parent); assert(theEnum.kind == ElementKind.ENUM);\r\n if (!this.compileEnum(theEnum)) {\r\n this.currentType = Type.i32;\r\n return this.module.createUnreachable();\r\n }\r\n this.currentType = Type.i32;\r\n if ((target).is(CommonFlags.INLINED)) {\r\n assert((target).constantValueKind == ConstantValueKind.INTEGER);\r\n return module.createI32(i64_low((target).constantIntegerValue));\r\n }\r\n return module.createGetGlobal((target).internalName, NativeType.I32);\r\n }\r\n case ElementKind.FIELD: { // instance field\r\n assert((target).memoryOffset >= 0);\r\n let thisExpr = this.compileExpressionRetainType(\r\n assert(this.resolver.currentThisExpression),\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n this.currentType = (target).type;\r\n return module.createLoad(\r\n (target).type.byteSize,\r\n (target).type.is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n thisExpr,\r\n (target).type.toNativeType(),\r\n (target).memoryOffset\r\n );\r\n }\r\n case ElementKind.PROPERTY_PROTOTYPE: {// static property\r\n let getterPrototype = (target).getterPrototype;\r\n if (getterPrototype) {\r\n let getter = this.resolver.resolveFunction(getterPrototype, null);\r\n if (getter) return this.compileCallDirect(getter, [], propertyAccess, 0);\r\n }\r\n return module.createUnreachable();\r\n }\r\n case ElementKind.PROPERTY: { // instance property\r\n let getterInstance = assert((target).getterInstance);\r\n return this.compileCallDirect(getterInstance, [], propertyAccess,\r\n this.compileExpressionRetainType(\r\n assert(this.resolver.currentThisExpression),\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n )\r\n );\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n this.error(\r\n DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,\r\n propertyAccess.range, (target).name\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n propertyAccess.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n private compileGetter(target: PropertyPrototype, reportNode: Node): ExpressionRef {\r\n var prototype = target.getterPrototype;\r\n if (prototype) {\r\n let instance = this.resolver.resolveFunction(prototype, null);\r\n if (!instance) return this.module.createUnreachable();\r\n let signature = instance.signature;\r\n if (!this.checkCallSignature( // reports\r\n signature,\r\n 0,\r\n instance.is(CommonFlags.INSTANCE),\r\n reportNode\r\n )) {\r\n return this.module.createUnreachable();\r\n }\r\n if (instance.is(CommonFlags.INSTANCE)) {\r\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\r\n let thisExpression = assert(this.resolver.currentThisExpression); //!!!\r\n let thisExpr = this.compileExpressionRetainType(\r\n thisExpression,\r\n this.options.usizeType,\r\n WrapMode.NONE\r\n );\r\n this.currentType = signature.returnType;\r\n return this.compileCallDirect(instance, [], reportNode, thisExpr);\r\n } else {\r\n this.currentType = signature.returnType;\r\n return this.compileCallDirect(instance, [], reportNode, 0);\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\r\n reportNode.range, (target).name, (target).parent.toString()\r\n );\r\n return this.module.createUnreachable();\r\n }\r\n }\r\n\r\n compileTernaryExpression(expression: TernaryExpression, contextualType: Type): ExpressionRef {\r\n var ifThen = expression.ifThen;\r\n var ifElse = expression.ifElse;\r\n var outerFlow = this.currentFlow;\r\n\r\n var condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n\r\n // Try to eliminate unnecesssary branches if the condition is constant\r\n var condExprPrecomp = this.module.precomputeExpression(condExpr);\r\n if (\r\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\r\n getExpressionType(condExprPrecomp) == NativeType.I32\r\n ) {\r\n return getConstValueI32(condExprPrecomp)\r\n ? this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE)\r\n : this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\r\n\r\n // Otherwise recompile to the original and let the optimizer decide\r\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\r\n condExpr = this.makeIsTrueish(\r\n this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\r\n this.currentType\r\n );\r\n }\r\n\r\n var ifThenFlow = outerFlow.fork();\r\n this.currentFlow = ifThenFlow;\r\n var ifThenExpr = this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE);\r\n var ifThenType = this.currentType;\r\n ifThenFlow.freeScopedLocals();\r\n\r\n var ifElseFlow = outerFlow.fork();\r\n this.currentFlow = ifElseFlow;\r\n var ifElseExpr = this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\r\n var ifElseType = this.currentType;\r\n ifElseFlow.freeScopedLocals();\r\n this.currentFlow = outerFlow;\r\n\r\n outerFlow.inheritMutual(ifThenFlow, ifElseFlow);\r\n\r\n var commonType = Type.commonCompatible(ifThenType, ifElseType, false);\r\n if (!commonType) {\r\n this.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n expression.range, ifThenType.toString(), ifElseType.toString()\r\n );\r\n this.currentType = contextualType;\r\n return this.module.createUnreachable();\r\n }\r\n ifThenExpr = this.convertExpression(\r\n ifThenExpr,\r\n ifThenType,\r\n commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n ifThen\r\n );\r\n ifElseExpr = this.convertExpression(\r\n ifElseExpr,\r\n ifElseType,\r\n commonType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE,\r\n ifElse\r\n );\r\n this.currentType = commonType;\r\n return this.module.createIf(condExpr, ifThenExpr, ifElseExpr);\r\n }\r\n\r\n compileUnaryPostfixExpression(expression: UnaryPostfixExpression, contextualType: Type): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n\r\n // make a getter for the expression (also obtains the type)\r\n var getValue = this.compileExpression( // reports\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // shortcut if compiling the getter already failed\r\n if (getExpressionId(getValue) == ExpressionId.Unreachable) return getValue;\r\n\r\n var currentType = this.currentType;\r\n\r\n // if the value isn't dropped, a temp. local is required to remember the original value\r\n var tempLocal: Local | null = null;\r\n if (contextualType != Type.void) {\r\n tempLocal = flow.getTempLocal(currentType, false);\r\n getValue = module.createTeeLocal(\r\n tempLocal.index,\r\n getValue\r\n );\r\n }\r\n\r\n var calcValue: ExpressionRef;\r\n\r\n switch (expression.operator) {\r\n case Token.PLUS_PLUS: {\r\n switch (currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n calcValue = module.createBinary(\r\n BinaryOp.AddI32,\r\n getValue,\r\n module.createI32(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.POSTFIX_INC);\r\n if (overload) {\r\n calcValue = this.compileUnaryOverload(overload, expression.operand, getValue, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case TypeKind.ISIZE: {\r\n let options = this.options;\r\n calcValue = module.createBinary(\r\n options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n getValue,\r\n currentType.toNativeOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n calcValue = module.createBinary(\r\n BinaryOp.AddI64,\r\n getValue,\r\n module.createI64(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n calcValue = module.createBinary(\r\n BinaryOp.AddF32,\r\n getValue,\r\n module.createF32(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n calcValue = module.createBinary(\r\n BinaryOp.AddF64,\r\n getValue,\r\n module.createF64(1)\r\n );\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.MINUS_MINUS: {\r\n switch (currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n calcValue = module.createBinary(\r\n BinaryOp.SubI32,\r\n getValue,\r\n module.createI32(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.POSTFIX_DEC);\r\n if (overload) {\r\n calcValue = this.compileUnaryOverload(overload, expression.operand, getValue, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case TypeKind.ISIZE: {\r\n let options = this.options;\r\n calcValue = module.createBinary(\r\n options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n getValue,\r\n currentType.toNativeOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n calcValue = module.createBinary(\r\n BinaryOp.SubI64,\r\n getValue,\r\n module.createI64(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n calcValue = module.createBinary(\r\n BinaryOp.SubF32,\r\n getValue,\r\n module.createF32(1)\r\n );\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n calcValue = module.createBinary(\r\n BinaryOp.SubF64,\r\n getValue,\r\n module.createF64(1)\r\n );\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n return module.createUnreachable();\r\n }\r\n }\r\n\r\n // simplify if dropped anyway\r\n if (!tempLocal) {\r\n this.currentType = Type.void;\r\n return this.compileAssignmentWithValue(expression.operand,\r\n calcValue,\r\n false\r\n );\r\n }\r\n\r\n // otherwise use the temp. local for the intermediate value (always possibly overflows)\r\n var setValue = this.compileAssignmentWithValue(expression.operand,\r\n calcValue, // also tees getValue to tempLocal\r\n false\r\n );\r\n\r\n this.currentType = tempLocal.type;\r\n flow.freeTempLocal(tempLocal);\r\n var nativeType = tempLocal.type.toNativeType();\r\n\r\n return module.createBlock(null, [\r\n setValue,\r\n module.createGetLocal(tempLocal.index, nativeType)\r\n ], nativeType); // result of 'x++' / 'x--' might overflow\r\n }\r\n\r\n compileUnaryPrefixExpression(\r\n expression: UnaryPrefixExpression,\r\n contextualType: Type\r\n ): ExpressionRef {\r\n var module = this.module;\r\n var compound = false;\r\n var expr: ExpressionRef;\r\n\r\n switch (expression.operator) {\r\n case Token.PLUS: {\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.PLUS);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n // nop\r\n break;\r\n }\r\n case Token.MINUS: {\r\n if (expression.operand.kind == NodeKind.LITERAL && (\r\n (expression.operand).literalKind == LiteralKind.INTEGER ||\r\n (expression.operand).literalKind == LiteralKind.FLOAT\r\n )) {\r\n // implicitly negate integer and float literals. also enables proper checking of literal ranges.\r\n expr = this.compileLiteralExpression(expression.operand, contextualType, true);\r\n // compileExpression normally does this:\r\n if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\r\n break;\r\n }\r\n\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.MINUS);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.SubI32, module.createI32(0), expr);\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n this.currentType.toNativeZero(module),\r\n expr\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.SubI64, module.createI64(0), expr);\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createUnary(UnaryOp.NegF32, expr);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createUnary(UnaryOp.NegF64, expr);\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.PLUS_PLUS: {\r\n compound = true;\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.PREFIX_INC);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.AddI32, expr, this.module.createI32(1));\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.AddI64\r\n : BinaryOp.AddI32,\r\n expr,\r\n this.currentType.toNativeOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.AddI64, expr, module.createI64(1));\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.AddF32, expr, module.createF32(1));\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.AddF64, expr, module.createF64(1));\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.MINUS_MINUS: {\r\n compound = true;\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.PREFIX_DEC);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.SubI32, expr, module.createI32(1));\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.SubI64\r\n : BinaryOp.SubI32,\r\n expr,\r\n this.currentType.toNativeOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.SubI64, expr, module.createI64(1));\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n expr = module.createBinary(BinaryOp.SubF32, expr, module.createF32(1));\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n expr = module.createBinary(BinaryOp.SubF64, expr, module.createF64(1));\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.EXCLAMATION: {\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.NOT);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n // allow '!' for references even without an overload\r\n }\r\n\r\n expr = this.makeIsFalseish(expr, this.currentType);\r\n this.currentType = Type.bool;\r\n break;\r\n }\r\n case Token.TILDE: {\r\n expr = this.compileExpression(\r\n expression.operand,\r\n contextualType == Type.void\r\n ? Type.i32\r\n : contextualType.is(TypeFlags.FLOAT)\r\n ? Type.i64\r\n : contextualType,\r\n ConversionKind.NONE,\r\n WrapMode.NONE\r\n );\r\n\r\n // check operator overload\r\n if (this.currentType.is(TypeFlags.REFERENCE)) {\r\n let classReference = this.currentType.classReference;\r\n if (classReference) {\r\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_NOT);\r\n if (overload) {\r\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\r\n break;\r\n }\r\n }\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n } else {\r\n expr = this.convertExpression(\r\n expr,\r\n this.currentType, this.currentType.intType,\r\n ConversionKind.IMPLICIT, WrapMode.NONE,\r\n expression.operand\r\n );\r\n }\r\n\r\n switch (this.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n expr = module.createBinary(BinaryOp.XorI32, expr, module.createI32(-1));\r\n break;\r\n }\r\n case TypeKind.USIZE:\r\n case TypeKind.ISIZE: {\r\n expr = module.createBinary(\r\n this.options.isWasm64\r\n ? BinaryOp.XorI64\r\n : BinaryOp.XorI32,\r\n expr,\r\n this.currentType.toNativeNegOne(module)\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n expr = module.createBinary(BinaryOp.XorI64, expr, module.createI64(-1, -1));\r\n break;\r\n }\r\n default: {\r\n assert(false);\r\n expr = module.createUnreachable();\r\n }\r\n }\r\n break;\r\n }\r\n case Token.TYPEOF: {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n expression.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n default: {\r\n assert(false);\r\n return module.createUnreachable();\r\n }\r\n }\r\n return compound\r\n ? this.compileAssignmentWithValue(expression.operand, expr, contextualType != Type.void)\r\n : expr;\r\n }\r\n\r\n /** Makes sure that a 32-bit integer value is wrapped to a valid value of the specified type. */\r\n ensureSmallIntegerWrap(expr: ExpressionRef, type: Type): ExpressionRef {\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n switch (type.kind) {\r\n case TypeKind.I8: {\r\n if (flow.canOverflow(expr, type)) {\r\n expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\r\n ? module.createUnary(UnaryOp.ExtendI8ToI32, expr)\r\n : module.createBinary(BinaryOp.ShrI32,\r\n module.createBinary(BinaryOp.ShlI32,\r\n expr,\r\n module.createI32(24)\r\n ),\r\n module.createI32(24)\r\n );\r\n }\r\n break;\r\n }\r\n case TypeKind.I16: {\r\n if (flow.canOverflow(expr, type)) {\r\n expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\r\n ? module.createUnary(UnaryOp.ExtendI16ToI32, expr)\r\n : module.createBinary(BinaryOp.ShrI32,\r\n module.createBinary(BinaryOp.ShlI32,\r\n expr,\r\n module.createI32(16)\r\n ),\r\n module.createI32(16)\r\n );\r\n }\r\n break;\r\n }\r\n case TypeKind.U8: {\r\n if (flow.canOverflow(expr, type)) {\r\n expr = module.createBinary(BinaryOp.AndI32,\r\n expr,\r\n module.createI32(0xff)\r\n );\r\n }\r\n break;\r\n }\r\n case TypeKind.U16: {\r\n if (flow.canOverflow(expr, type)) {\r\n expr = module.createBinary(BinaryOp.AndI32,\r\n expr,\r\n module.createI32(0xffff)\r\n );\r\n }\r\n break;\r\n }\r\n case TypeKind.BOOL: {\r\n if (flow.canOverflow(expr, type)) {\r\n // bool is special in that it compares to 0 instead of masking with 0x1\r\n expr = module.createBinary(BinaryOp.NeI32,\r\n expr,\r\n module.createI32(0)\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n return expr;\r\n }\r\n\r\n /** Creates a comparison whether an expression is 'false' in a broader sense. */\r\n makeIsFalseish(expr: ExpressionRef, type: Type): ExpressionRef {\r\n var module = this.module;\r\n switch (type.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = this.ensureSmallIntegerWrap(expr, type);\r\n // fall-through\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n return module.createUnary(UnaryOp.EqzI32, expr);\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n return module.createUnary(UnaryOp.EqzI64, expr);\r\n }\r\n case TypeKind.USIZE: // TODO: strings?\r\n case TypeKind.ISIZE: {\r\n return module.createUnary(type.size == 64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32, expr);\r\n }\r\n case TypeKind.F32: {\r\n return module.createBinary(BinaryOp.EqF32, expr, module.createF32(0));\r\n }\r\n case TypeKind.F64: {\r\n return module.createBinary(BinaryOp.EqF64, expr, module.createF64(0));\r\n }\r\n default: {\r\n assert(false);\r\n return module.createI32(1);\r\n }\r\n }\r\n }\r\n\r\n /** Creates a comparison whether an expression is 'true' in a broader sense. */\r\n makeIsTrueish(expr: ExpressionRef, type: Type): ExpressionRef {\r\n var module = this.module;\r\n switch (type.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n expr = this.ensureSmallIntegerWrap(expr, type);\r\n // fall-through\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n return expr;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n return module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\r\n }\r\n case TypeKind.USIZE: // TODO: strings?\r\n case TypeKind.ISIZE: {\r\n return type.size == 64\r\n ? module.createBinary(BinaryOp.NeI64, expr, module.createI64(0))\r\n : expr;\r\n }\r\n case TypeKind.F32: {\r\n return module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\r\n }\r\n case TypeKind.F64: {\r\n return module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\r\n }\r\n default: {\r\n assert(false);\r\n return module.createI32(0);\r\n }\r\n }\r\n }\r\n\r\n /** Makes an allocation suitable to hold the data of an instance of the given class. */\r\n makeAllocation(classInstance: Class): ExpressionRef {\r\n var program = this.program;\r\n assert(classInstance.program == program);\r\n var module = this.module;\r\n var options = this.options;\r\n\r\n // __gc_allocate(size, markFn)\r\n if (program.hasGC && classInstance.type.isManaged(program)) {\r\n let allocateInstance = assert(program.gcAllocateInstance);\r\n if (!this.compileFunction(allocateInstance)) return module.createUnreachable();\r\n this.currentType = classInstance.type;\r\n return module.createCall(\r\n allocateInstance.internalName, [\r\n options.isWasm64\r\n ? module.createI64(classInstance.currentMemoryOffset)\r\n : module.createI32(classInstance.currentMemoryOffset),\r\n module.createI32(\r\n ensureGCHook(this, classInstance)\r\n )\r\n ],\r\n options.nativeSizeType\r\n );\r\n\r\n // memory.allocate(size)\r\n } else {\r\n let allocateInstance = program.memoryAllocateInstance;\r\n if (!allocateInstance || !this.compileFunction(allocateInstance)) return module.createUnreachable();\r\n this.currentType = classInstance.type;\r\n return module.createCall(\r\n allocateInstance.internalName, [\r\n options.isWasm64\r\n ? module.createI64(classInstance.currentMemoryOffset)\r\n : module.createI32(classInstance.currentMemoryOffset)\r\n ],\r\n options.nativeSizeType\r\n );\r\n }\r\n }\r\n\r\n /** Makes the initializers for a class's fields. */\r\n makeFieldInitialization(classInstance: Class, stmts: ExpressionRef[] = []): ExpressionRef[] {\r\n var members = classInstance.members;\r\n if (!members) return [];\r\n\r\n var module = this.module;\r\n var flow = this.currentFlow;\r\n var isInline = flow.is(FlowFlags.INLINE_CONTEXT);\r\n var thisLocalIndex = isInline\r\n ? assert(flow.lookupLocal(CommonSymbols.this_)).index\r\n : 0;\r\n var nativeSizeType = this.options.nativeSizeType;\r\n\r\n for (let member of members.values()) {\r\n if (\r\n member.kind != ElementKind.FIELD || // not a field\r\n member.parent != classInstance // inherited field\r\n ) continue;\r\n\r\n let field = member; assert(!field.isAny(CommonFlags.CONST));\r\n let fieldType = field.type;\r\n let nativeFieldType = fieldType.toNativeType();\r\n let initializerNode = field.prototype.initializerNode;\r\n if (initializerNode) { // use initializer\r\n stmts.push(\r\n module.createStore(fieldType.byteSize,\r\n module.createGetLocal(thisLocalIndex, nativeSizeType),\r\n this.compileExpression( // reports\r\n initializerNode,\r\n fieldType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n ),\r\n nativeFieldType,\r\n field.memoryOffset\r\n )\r\n );\r\n } else {\r\n let parameterIndex = field.prototype.parameterIndex;\r\n stmts.push(\r\n module.createStore(fieldType.byteSize,\r\n module.createGetLocal(thisLocalIndex, nativeSizeType),\r\n parameterIndex >= 0 // initialized via parameter (here: a local)\r\n ? module.createGetLocal(\r\n isInline\r\n ? assert(flow.lookupLocal(field.name)).index\r\n : 1 + parameterIndex, // this is local 0\r\n nativeFieldType\r\n )\r\n : fieldType.toNativeZero(module),\r\n nativeFieldType,\r\n field.memoryOffset\r\n )\r\n );\r\n }\r\n }\r\n return stmts;\r\n }\r\n\r\n /** Adds the debug location of the specified expression at the specified range to the source map. */\r\n addDebugLocation(expr: ExpressionRef, range: Range): void {\r\n var parentFunction = this.currentFlow.parentFunction;\r\n var source = range.source;\r\n if (source.debugInfoIndex < 0) source.debugInfoIndex = this.module.addDebugInfoFile(source.normalizedPath);\r\n range.debugInfoRef = expr;\r\n parentFunction.debugLocations.push(range);\r\n }\r\n}\r\n\r\n// helpers\r\n\r\nfunction mangleImportName(\r\n element: Element,\r\n declaration: DeclarationStatement\r\n): void {\r\n // by default, use the file name as the module name\r\n mangleImportName_moduleName = declaration.range.source.simplePath;\r\n // and the internal name of the element within that file as the element name\r\n mangleImportName_elementName = mangleInternalName(\r\n element.name, element.parent, element.is(CommonFlags.INSTANCE), true\r\n );\r\n if (!element.hasDecorator(DecoratorFlags.EXTERNAL)) return;\r\n\r\n var program = element.program;\r\n var decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\r\n var args = decorator.arguments;\r\n if (args && args.length) {\r\n let arg = args[0];\r\n // if one argument is given, override just the element name\r\n // if two arguments are given, override both module and element name\r\n if (arg.kind == NodeKind.LITERAL && (arg).literalKind == LiteralKind.STRING) {\r\n mangleImportName_elementName = (arg).value;\r\n if (args.length >= 2) {\r\n arg = args[1];\r\n if (arg.kind == NodeKind.LITERAL && (arg).literalKind == LiteralKind.STRING) {\r\n mangleImportName_moduleName = mangleImportName_elementName;\r\n mangleImportName_elementName = (arg).value;\r\n if (args.length > 2) {\r\n program.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n decorator.range, \"2\", args.length.toString()\r\n );\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.String_literal_expected,\r\n arg.range\r\n );\r\n }\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.String_literal_expected,\r\n arg.range\r\n );\r\n }\r\n } else {\r\n program.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n decorator.range, \"1\", \"0\"\r\n );\r\n }\r\n}\r\n\r\nvar mangleImportName_moduleName: string;\r\nvar mangleImportName_elementName: string;\r\n\r\n/** Special compiler symbols. */\r\nnamespace CompilerSymbols {\r\n /** Module started global. Used if an explicit start function is present. */\r\n export const started = \"~lib/started\";\r\n /** Argument count global. Used to call trampolines for varargs functions. */\r\n export const argc = \"~lib/argc\";\r\n /** Argument count setter. Exported for use by host calls. */\r\n export const setargc = \"~lib/setargc\";\r\n}\r\n","/**\r\n * Generated from diagnosticsMessages.json. Do not edit.\r\n * @module diagnostics\r\n *//***/\r\n\r\n/* tslint:disable:max-line-length */\r\n\r\n/** Enum of available diagnostic codes. */\r\nexport enum DiagnosticCode {\r\n Operation_not_supported = 100,\r\n Operation_is_unsafe = 101,\r\n User_defined_0 = 102,\r\n Conversion_from_type_0_to_1_requires_an_explicit_cast = 200,\r\n Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit = 201,\r\n Type_0_cannot_be_changed_to_type_1 = 202,\r\n Type_0_cannot_be_reinterpreted_as_type_1 = 203,\r\n Basic_type_0_cannot_be_nullable = 204,\r\n Cannot_export_a_mutable_global = 205,\r\n Compiling_constant_with_non_constant_initializer_as_mutable = 206,\r\n Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa = 207,\r\n Unmanaged_classes_cannot_implement_interfaces = 208,\r\n Invalid_regular_expression_flags = 209,\r\n Implementation_0_must_match_the_signature_1 = 210,\r\n Class_0_is_sealed_and_cannot_be_extended = 211,\r\n Decorator_0_is_not_valid_here = 212,\r\n Duplicate_decorator = 213,\r\n An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf = 214,\r\n Optional_parameter_must_have_an_initializer = 215,\r\n Constructor_of_class_0_must_not_require_any_arguments = 216,\r\n Function_0_cannot_be_inlined_into_itself = 217,\r\n Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set = 218,\r\n Optional_properties_are_not_supported = 219,\r\n Expression_must_be_a_compile_time_constant = 220,\r\n Module_cannot_have_multiple_start_functions = 221,\r\n Unterminated_string_literal = 1002,\r\n Identifier_expected = 1003,\r\n _0_expected = 1005,\r\n A_file_cannot_have_a_reference_to_itself = 1006,\r\n Trailing_comma_not_allowed = 1009,\r\n Unexpected_token = 1012,\r\n A_rest_parameter_must_be_last_in_a_parameter_list = 1014,\r\n Parameter_cannot_have_question_mark_and_initializer = 1015,\r\n A_required_parameter_cannot_follow_an_optional_parameter = 1016,\r\n Statements_are_not_allowed_in_ambient_contexts = 1036,\r\n Initializers_are_not_allowed_in_ambient_contexts = 1039,\r\n _0_modifier_cannot_be_used_here = 1042,\r\n A_rest_parameter_cannot_be_optional = 1047,\r\n A_rest_parameter_cannot_have_an_initializer = 1048,\r\n A_set_accessor_must_have_exactly_one_parameter = 1049,\r\n A_set_accessor_parameter_cannot_have_an_initializer = 1052,\r\n A_get_accessor_cannot_have_parameters = 1054,\r\n Enum_member_must_have_initializer = 1061,\r\n Type_parameters_cannot_appear_on_a_constructor_declaration = 1092,\r\n Type_annotation_cannot_appear_on_a_constructor_declaration = 1093,\r\n An_accessor_cannot_have_type_parameters = 1094,\r\n A_set_accessor_cannot_have_a_return_type_annotation = 1095,\r\n Type_parameter_list_cannot_be_empty = 1098,\r\n A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement = 1104,\r\n A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement = 1105,\r\n A_return_statement_can_only_be_used_within_a_function_body = 1108,\r\n Expression_expected = 1109,\r\n Type_expected = 1110,\r\n A_default_clause_cannot_appear_more_than_once_in_a_switch_statement = 1113,\r\n Duplicate_label_0 = 1114,\r\n Octal_literals_are_not_allowed_in_strict_mode = 1121,\r\n Digit_expected = 1124,\r\n Hexadecimal_digit_expected = 1125,\r\n Unexpected_end_of_text = 1126,\r\n Invalid_character = 1127,\r\n _case_or_default_expected = 1130,\r\n _super_must_be_followed_by_an_argument_list_or_member_access = 1034,\r\n A_declare_modifier_cannot_be_used_in_an_already_ambient_context = 1038,\r\n Type_argument_expected = 1140,\r\n String_literal_expected = 1141,\r\n Line_break_not_permitted_here = 1142,\r\n Declaration_expected = 1146,\r\n _const_declarations_must_be_initialized = 1155,\r\n Unterminated_regular_expression_literal = 1161,\r\n Interface_declaration_cannot_have_implements_clause = 1176,\r\n Binary_digit_expected = 1177,\r\n Octal_digit_expected = 1178,\r\n An_implementation_cannot_be_declared_in_ambient_contexts = 1183,\r\n An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive = 1198,\r\n Unterminated_Unicode_escape_sequence = 1199,\r\n Decorators_are_not_valid_here = 1206,\r\n _abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration = 1242,\r\n Method_0_cannot_have_an_implementation_because_it_is_marked_abstract = 1245,\r\n A_definite_assignment_assertion_is_not_permitted_in_this_context = 1255,\r\n A_class_may_only_extend_another_class = 1311,\r\n A_parameter_property_cannot_be_declared_using_a_rest_parameter = 1317,\r\n Duplicate_identifier_0 = 2300,\r\n Cannot_find_name_0 = 2304,\r\n Module_0_has_no_exported_member_1 = 2305,\r\n Generic_type_0_requires_1_type_argument_s = 2314,\r\n Type_0_is_not_generic = 2315,\r\n Type_0_is_not_assignable_to_type_1 = 2322,\r\n Index_signature_is_missing_in_type_0 = 2329,\r\n _this_cannot_be_referenced_in_current_location = 2332,\r\n _super_can_only_be_referenced_in_a_derived_class = 2335,\r\n Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors = 2337,\r\n Property_0_does_not_exist_on_type_1 = 2339,\r\n Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures = 2349,\r\n Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature = 2351,\r\n A_function_whose_declared_type_is_not_void_must_return_a_value = 2355,\r\n The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access = 2357,\r\n The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access = 2364,\r\n Operator_0_cannot_be_applied_to_types_1_and_2 = 2365,\r\n A_super_call_must_be_the_first_statement_in_the_constructor = 2376,\r\n Constructors_for_derived_classes_must_contain_a_super_call = 2377,\r\n _get_and_set_accessor_must_have_the_same_type = 2380,\r\n Constructor_implementation_is_missing = 2390,\r\n Function_implementation_is_missing_or_not_immediately_following_the_declaration = 2391,\r\n Multiple_constructor_implementations_are_not_allowed = 2392,\r\n Duplicate_function_implementation = 2393,\r\n Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local = 2395,\r\n A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged = 2434,\r\n Type_0_has_no_property_1 = 2460,\r\n The_0_operator_cannot_be_applied_to_type_1 = 2469,\r\n In_const_enum_declarations_member_initializer_must_be_constant_expression = 2474,\r\n Export_declaration_conflicts_with_exported_declaration_of_0 = 2484,\r\n Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property = 2540,\r\n The_target_of_an_assignment_must_be_a_variable_or_a_property_access = 2541,\r\n Index_signature_in_type_0_only_permits_reading = 2542,\r\n Expected_0_arguments_but_got_1 = 2554,\r\n Expected_at_least_0_arguments_but_got_1 = 2555,\r\n Expected_0_type_arguments_but_got_1 = 2558,\r\n A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums = 2651,\r\n Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration = 2673,\r\n Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration = 2674,\r\n Namespace_0_has_no_exported_member_1 = 2694,\r\n Required_type_parameters_may_not_follow_optional_type_parameters = 2706,\r\n Duplicate_property_0 = 2718,\r\n File_0_not_found = 6054,\r\n Numeric_separators_are_not_allowed_here = 6188,\r\n Multiple_consecutive_numeric_separators_are_not_permitted = 6189,\r\n _super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class = 17009,\r\n _super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class = 17011\r\n}\r\n\r\n/** Translates a diagnostic code to its respective string. */\r\nexport function diagnosticCodeToString(code: DiagnosticCode): string {\r\n switch (code) {\r\n case 100: return \"Operation not supported.\";\r\n case 101: return \"Operation is unsafe.\";\r\n case 102: return \"User-defined: {0}\";\r\n case 200: return \"Conversion from type '{0}' to '{1}' requires an explicit cast.\";\r\n case 201: return \"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.\";\r\n case 202: return \"Type '{0}' cannot be changed to type '{1}'.\";\r\n case 203: return \"Type '{0}' cannot be reinterpreted as type '{1}'.\";\r\n case 204: return \"Basic type '{0}' cannot be nullable.\";\r\n case 205: return \"Cannot export a mutable global.\";\r\n case 206: return \"Compiling constant with non-constant initializer as mutable.\";\r\n case 207: return \"Unmanaged classes cannot extend managed classes and vice-versa.\";\r\n case 208: return \"Unmanaged classes cannot implement interfaces.\";\r\n case 209: return \"Invalid regular expression flags.\";\r\n case 210: return \"Implementation '{0}' must match the signature '{1}'.\";\r\n case 211: return \"Class '{0}' is sealed and cannot be extended.\";\r\n case 212: return \"Decorator '{0}' is not valid here.\";\r\n case 213: return \"Duplicate decorator.\";\r\n case 214: return \"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.\";\r\n case 215: return \"Optional parameter must have an initializer.\";\r\n case 216: return \"Constructor of class '{0}' must not require any arguments.\";\r\n case 217: return \"Function '{0}' cannot be inlined into itself.\";\r\n case 218: return \"Cannot access method '{0}' without calling it as it requires 'this' to be set.\";\r\n case 219: return \"Optional properties are not supported.\";\r\n case 220: return \"Expression must be a compile-time constant.\";\r\n case 221: return \"Module cannot have multiple start functions.\";\r\n case 1002: return \"Unterminated string literal.\";\r\n case 1003: return \"Identifier expected.\";\r\n case 1005: return \"'{0}' expected.\";\r\n case 1006: return \"A file cannot have a reference to itself.\";\r\n case 1009: return \"Trailing comma not allowed.\";\r\n case 1012: return \"Unexpected token.\";\r\n case 1014: return \"A rest parameter must be last in a parameter list.\";\r\n case 1015: return \"Parameter cannot have question mark and initializer.\";\r\n case 1016: return \"A required parameter cannot follow an optional parameter.\";\r\n case 1036: return \"Statements are not allowed in ambient contexts.\";\r\n case 1039: return \"Initializers are not allowed in ambient contexts.\";\r\n case 1042: return \"'{0}' modifier cannot be used here.\";\r\n case 1047: return \"A rest parameter cannot be optional.\";\r\n case 1048: return \"A rest parameter cannot have an initializer.\";\r\n case 1049: return \"A 'set' accessor must have exactly one parameter.\";\r\n case 1052: return \"A 'set' accessor parameter cannot have an initializer.\";\r\n case 1054: return \"A 'get' accessor cannot have parameters.\";\r\n case 1061: return \"Enum member must have initializer.\";\r\n case 1092: return \"Type parameters cannot appear on a constructor declaration.\";\r\n case 1093: return \"Type annotation cannot appear on a constructor declaration.\";\r\n case 1094: return \"An accessor cannot have type parameters.\";\r\n case 1095: return \"A 'set' accessor cannot have a return type annotation.\";\r\n case 1098: return \"Type parameter list cannot be empty.\";\r\n case 1104: return \"A 'continue' statement can only be used within an enclosing iteration statement.\";\r\n case 1105: return \"A 'break' statement can only be used within an enclosing iteration or switch statement.\";\r\n case 1108: return \"A 'return' statement can only be used within a function body.\";\r\n case 1109: return \"Expression expected.\";\r\n case 1110: return \"Type expected.\";\r\n case 1113: return \"A 'default' clause cannot appear more than once in a 'switch' statement.\";\r\n case 1114: return \"Duplicate label '{0}'.\";\r\n case 1121: return \"Octal literals are not allowed in strict mode.\";\r\n case 1124: return \"Digit expected.\";\r\n case 1125: return \"Hexadecimal digit expected.\";\r\n case 1126: return \"Unexpected end of text.\";\r\n case 1127: return \"Invalid character.\";\r\n case 1130: return \"'case' or 'default' expected.\";\r\n case 1034: return \"'super' must be followed by an argument list or member access.\";\r\n case 1038: return \"A 'declare' modifier cannot be used in an already ambient context.\";\r\n case 1140: return \"Type argument expected.\";\r\n case 1141: return \"String literal expected.\";\r\n case 1142: return \"Line break not permitted here.\";\r\n case 1146: return \"Declaration expected.\";\r\n case 1155: return \"'const' declarations must be initialized.\";\r\n case 1161: return \"Unterminated regular expression literal.\";\r\n case 1176: return \"Interface declaration cannot have 'implements' clause.\";\r\n case 1177: return \"Binary digit expected.\";\r\n case 1178: return \"Octal digit expected.\";\r\n case 1183: return \"An implementation cannot be declared in ambient contexts.\";\r\n case 1198: return \"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.\";\r\n case 1199: return \"Unterminated Unicode escape sequence.\";\r\n case 1206: return \"Decorators are not valid here.\";\r\n case 1242: return \"'abstract' modifier can only appear on a class, method, or property declaration.\";\r\n case 1245: return \"Method '{0}' cannot have an implementation because it is marked abstract.\";\r\n case 1255: return \"A definite assignment assertion '!' is not permitted in this context.\";\r\n case 1311: return \"A class may only extend another class.\";\r\n case 1317: return \"A parameter property cannot be declared using a rest parameter.\";\r\n case 2300: return \"Duplicate identifier '{0}'.\";\r\n case 2304: return \"Cannot find name '{0}'.\";\r\n case 2305: return \"Module '{0}' has no exported member '{1}'.\";\r\n case 2314: return \"Generic type '{0}' requires {1} type argument(s).\";\r\n case 2315: return \"Type '{0}' is not generic.\";\r\n case 2322: return \"Type '{0}' is not assignable to type '{1}'.\";\r\n case 2329: return \"Index signature is missing in type '{0}'.\";\r\n case 2332: return \"'this' cannot be referenced in current location.\";\r\n case 2335: return \"'super' can only be referenced in a derived class.\";\r\n case 2337: return \"Super calls are not permitted outside constructors or in nested functions inside constructors.\";\r\n case 2339: return \"Property '{0}' does not exist on type '{1}'.\";\r\n case 2349: return \"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.\";\r\n case 2351: return \"Cannot use 'new' with an expression whose type lacks a construct signature.\";\r\n case 2355: return \"A function whose declared type is not 'void' must return a value.\";\r\n case 2357: return \"The operand of an increment or decrement operator must be a variable or a property access.\";\r\n case 2364: return \"The left-hand side of an assignment expression must be a variable or a property access.\";\r\n case 2365: return \"Operator '{0}' cannot be applied to types '{1}' and '{2}'.\";\r\n case 2376: return \"A 'super' call must be the first statement in the constructor.\";\r\n case 2377: return \"Constructors for derived classes must contain a 'super' call.\";\r\n case 2380: return \"'get' and 'set' accessor must have the same type.\";\r\n case 2390: return \"Constructor implementation is missing.\";\r\n case 2391: return \"Function implementation is missing or not immediately following the declaration.\";\r\n case 2392: return \"Multiple constructor implementations are not allowed.\";\r\n case 2393: return \"Duplicate function implementation.\";\r\n case 2395: return \"Individual declarations in merged declaration '{0}' must be all exported or all local.\";\r\n case 2434: return \"A namespace declaration cannot be located prior to a class or function with which it is merged.\";\r\n case 2460: return \"Type '{0}' has no property '{1}'.\";\r\n case 2469: return \"The '{0}' operator cannot be applied to type '{1}'.\";\r\n case 2474: return \"In 'const' enum declarations member initializer must be constant expression.\";\r\n case 2484: return \"Export declaration conflicts with exported declaration of '{0}'.\";\r\n case 2540: return \"Cannot assign to '{0}' because it is a constant or a read-only property.\";\r\n case 2541: return \"The target of an assignment must be a variable or a property access.\";\r\n case 2542: return \"Index signature in type '{0}' only permits reading.\";\r\n case 2554: return \"Expected {0} arguments, but got {1}.\";\r\n case 2555: return \"Expected at least {0} arguments, but got {1}.\";\r\n case 2558: return \"Expected {0} type arguments, but got {1}.\";\r\n case 2651: return \"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.\";\r\n case 2673: return \"Constructor of class '{0}' is private and only accessible within the class declaration.\";\r\n case 2674: return \"Constructor of class '{0}' is protected and only accessible within the class declaration.\";\r\n case 2694: return \"Namespace '{0}' has no exported member '{1}'.\";\r\n case 2706: return \"Required type parameters may not follow optional type parameters.\";\r\n case 2718: return \"Duplicate property '{0}'.\";\r\n case 6054: return \"File '{0}' not found.\";\r\n case 6188: return \"Numeric separators are not allowed here.\";\r\n case 6189: return \"Multiple consecutive numeric separators are not permitted.\";\r\n case 17009: return \"'super' must be called before accessing 'this' in the constructor of a derived class.\";\r\n case 17011: return \"'super' must be called before accessing a property of 'super' in the constructor of a derived class.\";\r\n default: return \"\";\r\n }\r\n}\r\n","/**\r\n * A control flow analyzer.\r\n * @module flow\r\n *//***/\r\n\r\nimport {\r\n Type,\r\n TypeFlags,\r\n TypeKind\r\n} from \"./types\";\r\n\r\nimport {\r\n Local,\r\n Function,\r\n Element,\r\n ElementKind,\r\n Global\r\n} from \"./program\";\r\n\r\nimport {\r\n NativeType,\r\n ExpressionId,\r\n ExpressionRef,\r\n\r\n getExpressionId,\r\n getGetLocalIndex,\r\n isTeeLocal,\r\n getSetLocalValue,\r\n getGetGlobalName,\r\n getBinaryOp,\r\n BinaryOp,\r\n getBinaryLeft,\r\n getConstValueI32,\r\n getBinaryRight,\r\n getUnaryOp,\r\n UnaryOp,\r\n getExpressionType,\r\n getConstValueI64Low,\r\n getConstValueF32,\r\n getConstValueF64,\r\n getLoadBytes,\r\n isLoadSigned,\r\n getBlockName,\r\n getBlockChildCount,\r\n getBlockChild,\r\n getIfTrue,\r\n getIfFalse,\r\n getSelectThen,\r\n getSelectElse,\r\n getCallTarget\r\n} from \"./module\";\r\n\r\nimport {\r\n CommonFlags\r\n} from \"./common\";\r\n\r\nimport {\r\n DiagnosticCode\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Node\r\n} from \"./ast\";\r\n\r\nimport {\r\n bitsetIs,\r\n bitsetSet\r\n} from \"./util\";\r\n\r\n/** Control flow flags indicating specific conditions. */\r\nexport const enum FlowFlags {\r\n /** No specific conditions. */\r\n NONE = 0,\r\n\r\n // categorical\r\n\r\n /** This flow returns. */\r\n RETURNS = 1 << 0,\r\n /** This flow returns a wrapped value. */\r\n RETURNS_WRAPPED = 1 << 1,\r\n /** This flow throws. */\r\n THROWS = 1 << 2,\r\n /** This flow breaks. */\r\n BREAKS = 1 << 3,\r\n /** This flow continues. */\r\n CONTINUES = 1 << 4,\r\n /** This flow allocates. Constructors only. */\r\n ALLOCATES = 1 << 5,\r\n /** This flow calls super. Constructors only. */\r\n CALLS_SUPER = 1 << 6,\r\n\r\n // conditional\r\n\r\n /** This flow conditionally returns in a child flow. */\r\n CONDITIONALLY_RETURNS = 1 << 7,\r\n /** This flow conditionally throws in a child flow. */\r\n CONDITIONALLY_THROWS = 1 << 8,\r\n /** This flow conditionally breaks in a child flow. */\r\n CONDITIONALLY_BREAKS = 1 << 9,\r\n /** This flow conditionally continues in a child flow. */\r\n CONDITIONALLY_CONTINUES = 1 << 10,\r\n /** This flow conditionally allocates in a child flow. Constructors only. */\r\n CONDITIONALLY_ALLOCATES = 1 << 11,\r\n\r\n // special\r\n\r\n /** This is an inlining flow. */\r\n INLINE_CONTEXT = 1 << 12,\r\n /** This is a flow with explicitly disabled bounds checking. */\r\n UNCHECKED_CONTEXT = 1 << 13,\r\n\r\n // masks\r\n\r\n /** Any terminating flag. */\r\n ANY_TERMINATING = FlowFlags.RETURNS\r\n | FlowFlags.THROWS\r\n | FlowFlags.BREAKS\r\n | FlowFlags.CONTINUES,\r\n\r\n /** Any categorical flag. */\r\n ANY_CATEGORICAL = FlowFlags.RETURNS\r\n | FlowFlags.RETURNS_WRAPPED\r\n | FlowFlags.THROWS\r\n | FlowFlags.BREAKS\r\n | FlowFlags.CONTINUES\r\n | FlowFlags.ALLOCATES\r\n | FlowFlags.CALLS_SUPER,\r\n\r\n /** Any conditional flag. */\r\n ANY_CONDITIONAL = FlowFlags.CONDITIONALLY_RETURNS\r\n | FlowFlags.CONDITIONALLY_THROWS\r\n | FlowFlags.CONDITIONALLY_BREAKS\r\n | FlowFlags.CONDITIONALLY_CONTINUES\r\n | FlowFlags.CONDITIONALLY_ALLOCATES\r\n}\r\n\r\n/** A control flow evaluator. */\r\nexport class Flow {\r\n\r\n /** Parent flow. */\r\n parent: Flow | null;\r\n /** Flow flags indicating specific conditions. */\r\n flags: FlowFlags;\r\n /** Function this flow belongs to. */\r\n parentFunction: Function;\r\n /** The label we break to when encountering a continue statement. */\r\n continueLabel: string | null;\r\n /** The label we break to when encountering a break statement. */\r\n breakLabel: string | null;\r\n /** The current return type. */\r\n returnType: Type;\r\n /** The current contextual type arguments. */\r\n contextualTypeArguments: Map | null;\r\n /** Scoped local variables. */\r\n scopedLocals: Map | null = null;\r\n /** Local variable wrap states for the first 64 locals. */\r\n wrappedLocals: I64;\r\n /** Local variable wrap states for locals with index >= 64. */\r\n wrappedLocalsExt: I64[] | null;\r\n /** Function being inlined, when inlining. */\r\n inlineFunction: Function | null;\r\n /** The label we break to when encountering a return statement, when inlining. */\r\n inlineReturnLabel: string | null;\r\n\r\n /** Creates the parent flow of the specified function. */\r\n static create(parentFunction: Function): Flow {\r\n var flow = new Flow();\r\n flow.parent = null;\r\n flow.flags = FlowFlags.NONE;\r\n flow.parentFunction = parentFunction;\r\n flow.continueLabel = null;\r\n flow.breakLabel = null;\r\n flow.returnType = parentFunction.signature.returnType;\r\n flow.contextualTypeArguments = parentFunction.contextualTypeArguments;\r\n flow.wrappedLocals = i64_new(0);\r\n flow.wrappedLocalsExt = null;\r\n flow.inlineFunction = null;\r\n flow.inlineReturnLabel = null;\r\n return flow;\r\n }\r\n\r\n /** Creates an inline flow within `currentFunction`. */\r\n static createInline(parentFunction: Function, inlineFunction: Function): Flow {\r\n var flow = Flow.create(parentFunction);\r\n flow.set(FlowFlags.INLINE_CONTEXT);\r\n flow.inlineFunction = inlineFunction;\r\n flow.inlineReturnLabel = inlineFunction.internalName + \"|inlined.\" + (inlineFunction.nextInlineId++).toString(10);\r\n flow.returnType = inlineFunction.signature.returnType;\r\n flow.contextualTypeArguments = inlineFunction.contextualTypeArguments;\r\n return flow;\r\n }\r\n\r\n private constructor() { }\r\n\r\n /** Gets the actual function being compiled, The inlined function when inlining, otherwise the parent function. */\r\n get actualFunction(): Function {\r\n return this.inlineFunction || this.parentFunction;\r\n }\r\n\r\n /** Tests if this flow has the specified flag or flags. */\r\n is(flag: FlowFlags): bool { return (this.flags & flag) == flag; }\r\n /** Tests if this flow has one of the specified flags. */\r\n isAny(flag: FlowFlags): bool { return (this.flags & flag) != 0; }\r\n /** Sets the specified flag or flags. */\r\n set(flag: FlowFlags): void { this.flags |= flag; }\r\n /** Unsets the specified flag or flags. */\r\n unset(flag: FlowFlags): void { this.flags &= ~flag; }\r\n\r\n /** Forks this flow to a child flow. */\r\n fork(): Flow {\r\n var branch = new Flow();\r\n branch.parent = this;\r\n branch.flags = this.flags;\r\n branch.parentFunction = this.parentFunction;\r\n branch.continueLabel = this.continueLabel;\r\n branch.breakLabel = this.breakLabel;\r\n branch.returnType = this.returnType;\r\n branch.contextualTypeArguments = this.contextualTypeArguments;\r\n branch.wrappedLocals = this.wrappedLocals;\r\n branch.wrappedLocalsExt = this.wrappedLocalsExt ? this.wrappedLocalsExt.slice() : null;\r\n branch.inlineFunction = this.inlineFunction;\r\n branch.inlineReturnLabel = this.inlineReturnLabel;\r\n return branch;\r\n }\r\n\r\n /** Gets a free temporary local of the specified type. */\r\n getTempLocal(type: Type, wrapped: bool = false): Local {\r\n var parentFunction = this.parentFunction;\r\n var temps: Local[] | null;\r\n switch (type.toNativeType()) {\r\n case NativeType.I32: { temps = parentFunction.tempI32s; break; }\r\n case NativeType.I64: { temps = parentFunction.tempI64s; break; }\r\n case NativeType.F32: { temps = parentFunction.tempF32s; break; }\r\n case NativeType.F64: { temps = parentFunction.tempF64s; break; }\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n var local: Local;\r\n if (temps && temps.length) {\r\n local = temps.pop();\r\n local.type = type;\r\n local.flags = CommonFlags.NONE;\r\n } else {\r\n local = parentFunction.addLocal(type);\r\n }\r\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) this.setLocalWrapped(local.index, wrapped);\r\n return local;\r\n }\r\n\r\n /** Frees the temporary local for reuse. */\r\n freeTempLocal(local: Local): void {\r\n if (local.is(CommonFlags.INLINED)) return;\r\n assert(local.index >= 0);\r\n var parentFunction = this.parentFunction;\r\n var temps: Local[];\r\n assert(local.type != null); // internal error\r\n switch ((local.type).toNativeType()) {\r\n case NativeType.I32: {\r\n temps = parentFunction.tempI32s || (parentFunction.tempI32s = []);\r\n break;\r\n }\r\n case NativeType.I64: {\r\n temps = parentFunction.tempI64s || (parentFunction.tempI64s = []);\r\n break;\r\n }\r\n case NativeType.F32: {\r\n temps = parentFunction.tempF32s || (parentFunction.tempF32s = []);\r\n break;\r\n }\r\n case NativeType.F64: {\r\n temps = parentFunction.tempF64s || (parentFunction.tempF64s = []);\r\n break;\r\n }\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n assert(local.index >= 0);\r\n temps.push(local);\r\n }\r\n\r\n /** Gets and immediately frees a temporary local of the specified type. */\r\n getAndFreeTempLocal(type: Type, wrapped: bool): Local {\r\n var parentFunction = this.parentFunction;\r\n var temps: Local[];\r\n switch (type.toNativeType()) {\r\n case NativeType.I32: {\r\n temps = parentFunction.tempI32s || (parentFunction.tempI32s = []);\r\n break;\r\n }\r\n case NativeType.I64: {\r\n temps = parentFunction.tempI64s || (parentFunction.tempI64s = []);\r\n break;\r\n }\r\n case NativeType.F32: {\r\n temps = parentFunction.tempF32s || (parentFunction.tempF32s = []);\r\n break;\r\n }\r\n case NativeType.F64: {\r\n temps = parentFunction.tempF64s || (parentFunction.tempF64s = []);\r\n break;\r\n }\r\n default: throw new Error(\"concrete type expected\");\r\n }\r\n var local: Local;\r\n if (temps.length) {\r\n local = temps[temps.length - 1];\r\n local.type = type;\r\n } else {\r\n local = parentFunction.addLocal(type);\r\n temps.push(local);\r\n }\r\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) this.setLocalWrapped(local.index, wrapped);\r\n return local;\r\n }\r\n\r\n /** Adds a new scoped local of the specified name. */\r\n addScopedLocal(name: string, type: Type, wrapped: bool, reportNode: Node | null = null): Local {\r\n var scopedLocal = this.getTempLocal(type, false);\r\n if (!this.scopedLocals) this.scopedLocals = new Map();\r\n else {\r\n let existingLocal = this.scopedLocals.get(name);\r\n if (existingLocal) {\r\n if (reportNode) {\r\n this.parentFunction.program.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n reportNode.range\r\n );\r\n }\r\n return existingLocal;\r\n }\r\n }\r\n scopedLocal.set(CommonFlags.SCOPED);\r\n this.scopedLocals.set(name, scopedLocal);\r\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\r\n this.setLocalWrapped(scopedLocal.index, wrapped);\r\n }\r\n return scopedLocal;\r\n }\r\n\r\n /** Adds a new scoped alias for the specified local. For example `super` aliased to the `this` local. */\r\n addScopedAlias(name: string, type: Type, index: i32, reportNode: Node | null = null): Local {\r\n if (!this.scopedLocals) this.scopedLocals = new Map();\r\n else {\r\n let existingLocal = this.scopedLocals.get(name);\r\n if (existingLocal) {\r\n if (reportNode) {\r\n this.parentFunction.program.error(\r\n DiagnosticCode.Duplicate_identifier_0,\r\n reportNode.range\r\n );\r\n }\r\n return existingLocal;\r\n }\r\n }\r\n assert(index < this.parentFunction.localsByIndex.length);\r\n var scopedAlias = new Local(\r\n name,\r\n index,\r\n type,\r\n this.parentFunction\r\n );\r\n // not flagged as SCOPED as it must not be free'd when the flow is finalized\r\n this.scopedLocals.set(name, scopedAlias);\r\n return scopedAlias;\r\n }\r\n\r\n /** Frees this flow's scoped variables and returns its parent flow. */\r\n freeScopedLocals(): void {\r\n if (this.scopedLocals) {\r\n for (let scopedLocal of this.scopedLocals.values()) {\r\n if (scopedLocal.is(CommonFlags.SCOPED)) { // otherwise an alias\r\n this.freeTempLocal(scopedLocal);\r\n }\r\n }\r\n this.scopedLocals = null;\r\n }\r\n }\r\n\r\n /** Looks up the local of the specified name in the current scope. */\r\n lookupLocal(name: string): Local | null {\r\n var current: Flow | null = this;\r\n var scope: Map | null;\r\n do if ((scope = current.scopedLocals) && (scope.has(name))) return scope.get(name);\r\n while (current = current.parent);\r\n return this.parentFunction.localsByName.get(name);\r\n }\r\n\r\n /** Looks up the element with the specified name relative to the scope of this flow. */\r\n lookup(name: string): Element | null {\r\n var element = this.lookupLocal(name);\r\n if (element) return element;\r\n return this.actualFunction.lookup(name);\r\n }\r\n\r\n /** Tests if the value of the local at the specified index is considered wrapped. */\r\n isLocalWrapped(index: i32): bool {\r\n if (index < 0) return true; // inlined constant\r\n if (index < 64) return bitsetIs(this.wrappedLocals, index);\r\n var ext = this.wrappedLocalsExt;\r\n var i = ((index - 64) / 64) | 0;\r\n if (!(ext && i < ext.length)) return false;\r\n return bitsetIs(ext[i], index - (i + 1) * 64);\r\n }\r\n\r\n /** Sets if the value of the local at the specified index is considered wrapped. */\r\n setLocalWrapped(index: i32, wrapped: bool): void {\r\n if (index < 0) return; // inlined constant\r\n if (index < 64) {\r\n this.wrappedLocals = bitsetSet(this.wrappedLocals, index, wrapped);\r\n return;\r\n }\r\n var ext = this.wrappedLocalsExt;\r\n var i = ((index - 64) / 64) | 0;\r\n if (!ext) {\r\n this.wrappedLocalsExt = ext = new Array(i + 1);\r\n for (let j = 0; j <= i; ++j) ext[j] = i64_new(0);\r\n } else {\r\n while (ext.length <= i) ext.push(i64_new(0));\r\n }\r\n ext[i] = bitsetSet(ext[i], index - (i + 1) * 64, wrapped);\r\n }\r\n\r\n /** Pushes a new break label to the stack, for example when entering a loop that one can `break` from. */\r\n pushBreakLabel(): string {\r\n var parentFunction = this.parentFunction;\r\n var id = parentFunction.nextBreakId++;\r\n var stack = parentFunction.breakStack;\r\n if (!stack) parentFunction.breakStack = [ id ];\r\n else stack.push(id);\r\n return parentFunction.breakLabel = id.toString(10);\r\n }\r\n\r\n /** Pops the most recent break label from the stack. */\r\n popBreakLabel(): void {\r\n var parentFunction = this.parentFunction;\r\n var stack = assert(parentFunction.breakStack);\r\n var length = assert(stack.length);\r\n stack.pop();\r\n if (length > 1) {\r\n parentFunction.breakLabel = stack[length - 2].toString(10);\r\n } else {\r\n parentFunction.breakLabel = null;\r\n parentFunction.breakStack = null;\r\n }\r\n }\r\n\r\n /** Inherits flags and local wrap states from the specified flow (e.g. blocks). */\r\n inherit(other: Flow): void {\r\n this.flags |= other.flags & (FlowFlags.ANY_CATEGORICAL | FlowFlags.ANY_CONDITIONAL);\r\n this.wrappedLocals = other.wrappedLocals;\r\n this.wrappedLocalsExt = other.wrappedLocalsExt; // no need to slice because other flow is finished\r\n }\r\n\r\n /** Inherits categorical flags as conditional flags from the specified flow (e.g. then without else). */\r\n inheritConditional(other: Flow): void {\r\n if (other.is(FlowFlags.RETURNS)) {\r\n this.set(FlowFlags.CONDITIONALLY_RETURNS);\r\n }\r\n if (other.is(FlowFlags.THROWS)) {\r\n this.set(FlowFlags.CONDITIONALLY_THROWS);\r\n }\r\n if (other.is(FlowFlags.BREAKS) && other.breakLabel == this.breakLabel) {\r\n this.set(FlowFlags.CONDITIONALLY_BREAKS);\r\n }\r\n if (other.is(FlowFlags.CONTINUES) && other.continueLabel == this.continueLabel) {\r\n this.set(FlowFlags.CONDITIONALLY_CONTINUES);\r\n }\r\n if (other.is(FlowFlags.ALLOCATES)) {\r\n this.set(FlowFlags.CONDITIONALLY_ALLOCATES);\r\n }\r\n }\r\n\r\n /** Inherits mutual flags and local wrap states from the specified flows (e.g. then with else). */\r\n inheritMutual(left: Flow, right: Flow): void {\r\n // categorical flags set in both arms\r\n this.flags |= left.flags & right.flags & FlowFlags.ANY_CATEGORICAL;\r\n\r\n // conditional flags set in at least one arm\r\n this.flags |= left.flags & FlowFlags.ANY_CONDITIONAL;\r\n this.flags |= right.flags & FlowFlags.ANY_CONDITIONAL;\r\n\r\n // locals wrapped in both arms\r\n this.wrappedLocals = i64_and(left.wrappedLocals, right.wrappedLocals);\r\n var leftExt = left.wrappedLocalsExt;\r\n var rightExt = right.wrappedLocalsExt;\r\n if (leftExt != null && rightExt != null) {\r\n let thisExt = this.wrappedLocalsExt;\r\n let minLength = min(leftExt.length, rightExt.length);\r\n if (minLength) {\r\n if (!thisExt) thisExt = new Array(minLength);\r\n else while (thisExt.length < minLength) thisExt.push(i64_new(0));\r\n for (let i = 0; i < minLength; ++i) {\r\n thisExt[i] = i64_and(\r\n leftExt[i],\r\n rightExt[i]\r\n );\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Tests if an expression can possibly overflow in the context of this flow. Assumes that the\r\n * expression might already have overflown and returns `false` only if the operation neglects\r\n * any possible combination of garbage bits being present.\r\n */\r\n canOverflow(expr: ExpressionRef, type: Type): bool {\r\n // TODO: the following catches most common and a few uncommon cases, but there are additional\r\n // opportunities here, obviously.\r\n assert(type != Type.void);\r\n\r\n // types other than i8, u8, i16, u16 and bool do not overflow\r\n if (!type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) return false;\r\n\r\n var operand: ExpressionRef;\r\n switch (getExpressionId(expr)) {\r\n\r\n // overflows if the local isn't wrapped or the conversion does\r\n case ExpressionId.GetLocal: {\r\n let local = this.parentFunction.localsByIndex[getGetLocalIndex(expr)];\r\n return !this.isLocalWrapped(local.index)\r\n || canConversionOverflow(local.type, type);\r\n }\r\n\r\n // overflows if the value does\r\n case ExpressionId.SetLocal: { // tee\r\n assert(isTeeLocal(expr));\r\n return this.canOverflow(getSetLocalValue(expr), type);\r\n }\r\n\r\n // overflows if the conversion does (globals are wrapped on set)\r\n case ExpressionId.GetGlobal: {\r\n // TODO: this is inefficient because it has to read a string\r\n let global = assert(this.parentFunction.program.elementsByName.get(assert(getGetGlobalName(expr))));\r\n assert(global.kind == ElementKind.GLOBAL);\r\n return canConversionOverflow(assert((global).type), type);\r\n }\r\n\r\n case ExpressionId.Binary: {\r\n switch (getBinaryOp(expr)) {\r\n\r\n // comparisons do not overflow (result is 0 or 1)\r\n case BinaryOp.EqI32:\r\n case BinaryOp.EqI64:\r\n case BinaryOp.EqF32:\r\n case BinaryOp.EqF64:\r\n case BinaryOp.NeI32:\r\n case BinaryOp.NeI64:\r\n case BinaryOp.NeF32:\r\n case BinaryOp.NeF64:\r\n case BinaryOp.LtI32:\r\n case BinaryOp.LtU32:\r\n case BinaryOp.LtI64:\r\n case BinaryOp.LtU64:\r\n case BinaryOp.LtF32:\r\n case BinaryOp.LtF64:\r\n case BinaryOp.LeI32:\r\n case BinaryOp.LeU32:\r\n case BinaryOp.LeI64:\r\n case BinaryOp.LeU64:\r\n case BinaryOp.LeF32:\r\n case BinaryOp.LeF64:\r\n case BinaryOp.GtI32:\r\n case BinaryOp.GtU32:\r\n case BinaryOp.GtI64:\r\n case BinaryOp.GtU64:\r\n case BinaryOp.GtF32:\r\n case BinaryOp.GtF64:\r\n case BinaryOp.GeI32:\r\n case BinaryOp.GeU32:\r\n case BinaryOp.GeI64:\r\n case BinaryOp.GeU64:\r\n case BinaryOp.GeF32:\r\n case BinaryOp.GeF64: return false;\r\n\r\n // result won't overflow if one side is 0 or if one side is 1 and the other wrapped\r\n case BinaryOp.MulI32: {\r\n return !(\r\n (\r\n getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\r\n (\r\n getConstValueI32(operand) == 0 ||\r\n (\r\n getConstValueI32(operand) == 1 &&\r\n !this.canOverflow(getBinaryRight(expr), type)\r\n )\r\n )\r\n ) || (\r\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n (\r\n getConstValueI32(operand) == 0 ||\r\n (\r\n getConstValueI32(operand) == 1 &&\r\n !this.canOverflow(getBinaryLeft(expr), type)\r\n )\r\n )\r\n )\r\n );\r\n }\r\n\r\n // result won't overflow if one side is a constant less than this type's mask or one side\r\n // is wrapped\r\n case BinaryOp.AndI32: {\r\n // note that computeSmallIntegerMask returns the mask minus the MSB for signed types\r\n // because signed value garbage bits must be guaranteed to be equal to the MSB.\r\n return !(\r\n (\r\n (\r\n getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\r\n getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\r\n ) || !this.canOverflow(operand, type)\r\n ) || (\r\n (\r\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\r\n ) || !this.canOverflow(operand, type)\r\n )\r\n );\r\n }\r\n\r\n // overflows if the shift doesn't clear potential garbage bits\r\n case BinaryOp.ShlI32: {\r\n let shift = 32 - type.size;\r\n return getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const\r\n || getConstValueI32(operand) < shift;\r\n }\r\n\r\n // overflows if the value does and the shift doesn't clear potential garbage bits\r\n case BinaryOp.ShrI32: {\r\n let shift = 32 - type.size;\r\n return this.canOverflow(getBinaryLeft(expr), type) && (\r\n getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const ||\r\n getConstValueI32(operand) < shift\r\n );\r\n }\r\n\r\n // overflows if the shift does not clear potential garbage bits. if an unsigned value is\r\n // wrapped, it can't overflow.\r\n case BinaryOp.ShrU32: {\r\n let shift = 32 - type.size;\r\n return type.is(TypeFlags.SIGNED)\r\n ? !(\r\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n getConstValueI32(operand) > shift // must clear MSB\r\n )\r\n : this.canOverflow(getBinaryLeft(expr), type) && !(\r\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\r\n getConstValueI32(operand) >= shift // can leave MSB\r\n );\r\n }\r\n\r\n // overflows if any side does\r\n case BinaryOp.DivU32:\r\n case BinaryOp.RemI32:\r\n case BinaryOp.RemU32: {\r\n return this.canOverflow(getBinaryLeft(expr), type)\r\n || this.canOverflow(getBinaryRight(expr), type);\r\n }\r\n }\r\n break;\r\n }\r\n\r\n case ExpressionId.Unary: {\r\n switch (getUnaryOp(expr)) {\r\n\r\n // comparisons do not overflow (result is 0 or 1)\r\n case UnaryOp.EqzI32:\r\n case UnaryOp.EqzI64: return false;\r\n\r\n // overflow if the maximum result (32) cannot be represented in the target type\r\n case UnaryOp.ClzI32:\r\n case UnaryOp.CtzI32:\r\n case UnaryOp.PopcntI32: return type.size < 7;\r\n }\r\n break;\r\n }\r\n\r\n // overflows if the value cannot be represented in the target type\r\n case ExpressionId.Const: {\r\n let value: i32 = 0;\r\n switch (getExpressionType(expr)) {\r\n case NativeType.I32: { value = getConstValueI32(expr); break; }\r\n case NativeType.I64: { value = getConstValueI64Low(expr); break; } // discards upper bits\r\n case NativeType.F32: { value = i32(getConstValueF32(expr)); break; }\r\n case NativeType.F64: { value = i32(getConstValueF64(expr)); break; }\r\n default: assert(false);\r\n }\r\n switch (type.kind) {\r\n case TypeKind.I8: return value < i8.MIN_VALUE || value > i8.MAX_VALUE;\r\n case TypeKind.I16: return value < i16.MIN_VALUE || value > i16.MAX_VALUE;\r\n case TypeKind.U8: return value < 0 || value > u8.MAX_VALUE;\r\n case TypeKind.U16: return value < 0 || value > u16.MAX_VALUE;\r\n case TypeKind.BOOL: return (value & ~1) != 0;\r\n }\r\n break;\r\n }\r\n\r\n // overflows if the conversion does\r\n case ExpressionId.Load: {\r\n let fromType: Type;\r\n switch (getLoadBytes(expr)) {\r\n case 1: { fromType = isLoadSigned(expr) ? Type.i8 : Type.u8; break; }\r\n case 2: { fromType = isLoadSigned(expr) ? Type.i16 : Type.u16; break; }\r\n default: { fromType = isLoadSigned(expr) ? Type.i32 : Type.u32; break; }\r\n }\r\n return canConversionOverflow(fromType, type);\r\n }\r\n\r\n // overflows if the result does, which is either\r\n // - the last expression of the block, by contract, if the block doesn't have a label\r\n // - the last expression or the value of an inner br if the block has a label (TODO)\r\n case ExpressionId.Block: {\r\n if (!getBlockName(expr)) {\r\n let size = assert(getBlockChildCount(expr));\r\n let last = getBlockChild(expr, size - 1);\r\n return this.canOverflow(last, type);\r\n }\r\n break;\r\n }\r\n\r\n // overflows if either side does\r\n case ExpressionId.If: {\r\n return this.canOverflow(getIfTrue(expr), type)\r\n || this.canOverflow(assert(getIfFalse(expr)), type);\r\n }\r\n\r\n // overflows if either side does\r\n case ExpressionId.Select: {\r\n return this.canOverflow(getSelectThen(expr), type)\r\n || this.canOverflow(getSelectElse(expr), type);\r\n }\r\n\r\n // overflows if the call does not return a wrapped value or the conversion does\r\n case ExpressionId.Call: {\r\n let program = this.parentFunction.program;\r\n let instance = assert(program.instancesByName.get(assert(getCallTarget(expr))));\r\n assert(instance.kind == ElementKind.FUNCTION);\r\n let returnType = (instance).signature.returnType;\r\n return !(instance).flow.is(FlowFlags.RETURNS_WRAPPED)\r\n || canConversionOverflow(returnType, type);\r\n }\r\n\r\n // doesn't technically overflow\r\n case ExpressionId.Unreachable: return false;\r\n }\r\n return true;\r\n }\r\n}\r\n\r\n/** Tests if a conversion from one type to another can technically overflow. */\r\nfunction canConversionOverflow(fromType: Type, toType: Type): bool {\r\n return !fromType.is(TypeFlags.INTEGER) // non-i32 locals or returns\r\n || fromType.size > toType.size\r\n || fromType.is(TypeFlags.SIGNED) != toType.is(TypeFlags.SIGNED);\r\n}\r\n","/**\r\n * A decompiler that generates low-level AssemblyScript from WebAssembly binaries.\r\n * @module decompiler\r\n *//***/\r\n\r\nimport {\r\n Module,\r\n NativeType,\r\n ExpressionId,\r\n UnaryOp,\r\n BinaryOp,\r\n HostOp,\r\n FunctionRef,\r\n ExpressionRef,\r\n Index,\r\n getFunctionName,\r\n getFunctionBody,\r\n getFunctionParamCount,\r\n getFunctionParamType,\r\n getFunctionResultType,\r\n getExpressionId,\r\n getExpressionType,\r\n getBlockName,\r\n getBlockChildCount,\r\n getBlockChild,\r\n getIfCondition,\r\n getIfTrue,\r\n getIfFalse,\r\n getLoopName,\r\n getLoopBody,\r\n getBreakName,\r\n getBreakCondition,\r\n getGetLocalIndex,\r\n getSetLocalIndex,\r\n getSetLocalValue,\r\n getLoadOffset,\r\n getLoadPtr,\r\n getStoreOffset,\r\n getStorePtr,\r\n getStoreValue,\r\n getConstValueI32,\r\n getConstValueI64Low,\r\n getConstValueI64High,\r\n getConstValueF32,\r\n getConstValueF64,\r\n getUnaryOp,\r\n getUnaryValue,\r\n getBinaryOp,\r\n getBinaryLeft,\r\n getBinaryRight,\r\n getSelectThen,\r\n getSelectElse,\r\n getSelectCondition,\r\n getDropValue,\r\n getReturnValue,\r\n getHostOp,\r\n getHostOperand\r\n} from \"./module\";\r\n\r\n// TODO :-)\r\n\r\nexport class Decompiler {\r\n\r\n static decompile(module: Module): string {\r\n var decompiler = new Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n }\r\n\r\n text: string[] = [];\r\n functionId: i32 = 0;\r\n\r\n constructor() { }\r\n\r\n /** Decompiles a module to an AST that can then be serialized. */\r\n decompile(module: Module): void {\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n decompileFunction(func: FunctionRef): void {\r\n var name = getFunctionName(func) || \"$\" + this.functionId.toString(10);\r\n var body = getFunctionBody(func);\r\n this.push(\"function \");\r\n this.push(name);\r\n this.push(\"(\");\r\n for (let i: Index = 0, k: Index = getFunctionParamCount(func); i < k; ++i) {\r\n if (i > 0) this.push(\", \");\r\n this.push(\"$\");\r\n this.push(i.toString(10));\r\n this.push(\": \");\r\n this.push(nativeTypeToType(getFunctionParamType(func, i)));\r\n }\r\n this.push(\"): \");\r\n this.push(nativeTypeToType(getFunctionResultType(func)));\r\n this.push(\" \");\r\n if (getExpressionId(body) != ExpressionId.Block) {\r\n this.push(\"{\\n\");\r\n }\r\n this.decompileExpression(body);\r\n if (getExpressionId(body) != ExpressionId.Block) {\r\n this.push(\"\\n}\\n\");\r\n }\r\n ++this.functionId;\r\n }\r\n\r\n decompileExpression(expr: ExpressionRef): void {\r\n var id = getExpressionId(expr);\r\n var type = getExpressionType(expr);\r\n\r\n var nested: ExpressionRef;\r\n var string: string | null;\r\n var i: Index, k: Index;\r\n\r\n switch (id) {\r\n case ExpressionId.Block: { // TODO: magic\r\n if ((string = getBlockName(expr)) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"{\\n\");\r\n k = getBlockChildCount(expr);\r\n for (i = 0; i < k; ++i) {\r\n this.decompileExpression(getBlockChild(expr, i));\r\n }\r\n this.push(\"}\\n\");\r\n return;\r\n }\r\n case ExpressionId.If: {\r\n if (type == NativeType.None) {\r\n this.push(\"if (\");\r\n this.decompileExpression(getIfCondition(expr));\r\n this.push(\") \");\r\n this.decompileExpression(getIfTrue(expr));\r\n if (nested = getIfFalse(expr)) {\r\n this.push(\" else \");\r\n this.decompileExpression(nested);\r\n }\r\n } else {\r\n this.decompileExpression(getIfCondition(expr));\r\n this.push(\" ? \");\r\n this.decompileExpression(getIfTrue(expr));\r\n this.push(\" : \");\r\n this.decompileExpression(getIfFalse(expr));\r\n }\r\n return;\r\n }\r\n case ExpressionId.Loop: {\r\n if ((string = getLoopName(expr)) != null) {\r\n this.push(string);\r\n this.push(\": \");\r\n }\r\n this.push(\"do \");\r\n this.decompileExpression(getLoopBody(expr));\r\n this.push(\"while (0);\\n\");\r\n }\r\n case ExpressionId.Break: {\r\n if (nested = getBreakCondition(expr)) {\r\n this.push(\"if (\");\r\n this.decompileExpression(nested);\r\n this.push(\") \");\r\n }\r\n if ((string = getBreakName(expr)) != null) {\r\n this.push(\"break \");\r\n this.push(string);\r\n this.push(\";\\n\");\r\n } else {\r\n this.push(\"break;\\n\");\r\n }\r\n return;\r\n }\r\n case ExpressionId.Switch:\r\n case ExpressionId.Call:\r\n case ExpressionId.CallIndirect: {\r\n throw new Error(\"not implemented\");\r\n }\r\n case ExpressionId.GetLocal: {\r\n this.push(\"$\");\r\n this.push(getGetLocalIndex(expr).toString(10));\r\n return;\r\n }\r\n case ExpressionId.SetLocal: {\r\n this.push(\"$\");\r\n this.push(getSetLocalIndex(expr).toString(10));\r\n this.push(\" = \");\r\n this.decompileExpression(getSetLocalValue(expr));\r\n return;\r\n }\r\n case ExpressionId.GetGlobal:\r\n case ExpressionId.SetGlobal: {\r\n throw new Error(\"not implemented\");\r\n }\r\n case ExpressionId.Load: {\r\n this.push(\"load<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(getLoadOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(getLoadPtr(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case ExpressionId.Store: {\r\n this.push(\"store<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.push(getStoreOffset(expr).toString(10));\r\n this.push(\" + \");\r\n this.decompileExpression(getStorePtr(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getStoreValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case ExpressionId.Const: {\r\n switch (type) {\r\n case NativeType.I32: {\r\n this.push(getConstValueI32(expr).toString(10));\r\n return;\r\n }\r\n case NativeType.I64: {\r\n this.push(\r\n i64_to_string(\r\n i64_new(\r\n getConstValueI64Low(expr),\r\n getConstValueI64High(expr)\r\n )\r\n )\r\n );\r\n return;\r\n }\r\n case NativeType.F32: {\r\n this.push(getConstValueF32(expr).toString(10));\r\n return;\r\n }\r\n case NativeType.F64: {\r\n this.push(getConstValueF64(expr).toString(10));\r\n return;\r\n }\r\n }\r\n break;\r\n }\r\n case ExpressionId.Unary: {\r\n switch (getUnaryOp(expr)) {\r\n case UnaryOp.ClzI32: {\r\n this.push(\"clz(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.CtzI32: {\r\n this.push(\"ctz(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.PopcntI32: {\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.NegF32:\r\n case UnaryOp.NegF64: {\r\n this.push(\"-\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.AbsF32: {\r\n this.push(\"abs(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.CeilF32: {\r\n this.push(\"ceil(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.FloorF32: {\r\n this.push(\"floor(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.TruncF32: {\r\n this.push(\"trunc(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.NearestF32: {\r\n this.push(\"nearest(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.SqrtF32: {\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.EqzI32:\r\n case UnaryOp.EqzI64: {\r\n this.push(\"!\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ClzI64: {\r\n this.push(\"clz(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.CtzI64: {\r\n this.push(\"ctz(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.PopcntI64: {\r\n this.push(\"popcnt(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.AbsF64: {\r\n this.push(\"abs(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.CeilF64: {\r\n this.push(\"ceil(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.FloorF64: {\r\n this.push(\"floor(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.TruncF64: {\r\n this.push(\"trunc(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.NearestF64: {\r\n this.push(\"nearest(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.SqrtF64: {\r\n this.push(\"sqrt(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.ExtendI32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ExtendU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.WrapI64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF32ToI32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF32ToI64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF32ToU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF32ToU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF64ToI32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF64ToI64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF64ToU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.TruncF64ToU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ReinterpretF32: {\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.ReinterpretF64: {\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.ConvertI32ToF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertI32ToF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertU32ToF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertU32ToF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertI64ToF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertI64ToF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertU64ToF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ConvertU64ToF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.PromoteF32: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.DemoteF64: {\r\n this.push(\"\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n return;\r\n }\r\n case UnaryOp.ReinterpretI32: {\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case UnaryOp.ReinterpretI64: {\r\n this.push(\"reinterpret(\");\r\n this.decompileExpression(getUnaryValue(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n }\r\n break;\r\n }\r\n case ExpressionId.Binary: { // TODO: precedence\r\n switch (getBinaryOp(expr)) {\r\n case BinaryOp.AddI32:\r\n case BinaryOp.AddI64:\r\n case BinaryOp.AddF32:\r\n case BinaryOp.AddF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" + \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.SubI32:\r\n case BinaryOp.SubI64:\r\n case BinaryOp.SubF32:\r\n case BinaryOp.SubF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" - \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.MulI32:\r\n case BinaryOp.MulI64:\r\n case BinaryOp.MulF32:\r\n case BinaryOp.MulF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" * \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.DivI32:\r\n case BinaryOp.DivI64:\r\n case BinaryOp.DivF32:\r\n case BinaryOp.DivF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.DivU32: {\r\n this.push(\"(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.RemI32:\r\n case BinaryOp.RemI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.RemU32: {\r\n this.push(\"(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.AndI32:\r\n case BinaryOp.AndI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" & \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.OrI32:\r\n case BinaryOp.OrI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" | \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.XorI32:\r\n case BinaryOp.XorI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" ^ \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.ShlI32:\r\n case BinaryOp.ShlI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" << \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.ShrU32:\r\n case BinaryOp.ShrU64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >>> \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.ShrI32:\r\n case BinaryOp.ShrI64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >> \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.RotlI32: {\r\n this.push(\"rotl(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.RotrI32: {\r\n this.push(\"rotr(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.EqI32:\r\n case BinaryOp.EqI64:\r\n case BinaryOp.EqF32:\r\n case BinaryOp.EqF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" == \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.NeI32:\r\n case BinaryOp.NeI64:\r\n case BinaryOp.NeF32:\r\n case BinaryOp.NeF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" != \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LtI32:\r\n case BinaryOp.LtI64:\r\n case BinaryOp.LtF32:\r\n case BinaryOp.LtF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LtU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LeI32:\r\n case BinaryOp.LeI64:\r\n case BinaryOp.LeF32:\r\n case BinaryOp.LeF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LeU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GtI32:\r\n case BinaryOp.GtI64:\r\n case BinaryOp.GtF32:\r\n case BinaryOp.GtF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GtU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GeI32:\r\n case BinaryOp.GeI64:\r\n case BinaryOp.GeF32:\r\n case BinaryOp.GeF64: {\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GeU32: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.DivU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" / \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.RemU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" % \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.RotlI64: {\r\n this.push(\"rotl(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.RotrI64: {\r\n this.push(\"rotr(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.LtU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" < \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.LeU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" <= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GtU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" > \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.GeU64: {\r\n this.push(\"\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\" >= \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n return;\r\n }\r\n case BinaryOp.CopysignF32: {\r\n this.push(\"copysign(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.MinF32: {\r\n this.push(\"min(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.MaxF32: {\r\n this.push(\"max(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.CopysignF64: {\r\n this.push(\"copysign(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.MinF64: {\r\n this.push(\"min(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case BinaryOp.MaxF64: {\r\n this.push(\"max(\");\r\n this.decompileExpression(getBinaryLeft(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getBinaryRight(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n }\r\n return;\r\n }\r\n case ExpressionId.Select: {\r\n this.push(\"select<\");\r\n this.push(nativeTypeToType(type));\r\n this.push(\">(\");\r\n this.decompileExpression(getSelectThen(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getSelectElse(expr));\r\n this.push(\", \");\r\n this.decompileExpression(getSelectCondition(expr));\r\n this.push(\")\");\r\n return;\r\n }\r\n case ExpressionId.Drop: {\r\n this.decompileExpression(getDropValue(expr));\r\n this.push(\";\\n\");\r\n return;\r\n }\r\n case ExpressionId.Return: {\r\n if (nested = getReturnValue(expr)) {\r\n this.push(\"return \");\r\n this.decompileExpression(nested);\r\n this.push(\";\\n\");\r\n } else {\r\n this.push(\"return;\\n\");\r\n }\r\n return;\r\n }\r\n case ExpressionId.Host: {\r\n switch (getHostOp(expr)) {\r\n case HostOp.CurrentMemory: {\r\n this.push(\"memory.size()\");\r\n return;\r\n }\r\n case HostOp.GrowMemory: {\r\n this.push(\"memory.grow(\");\r\n this.decompileExpression(getHostOperand(expr, 0));\r\n this.push(\")\");\r\n return;\r\n }\r\n }\r\n break;\r\n }\r\n case ExpressionId.Nop: {\r\n this.push(\";\\n\");\r\n return;\r\n }\r\n case ExpressionId.Unreachable: {\r\n this.push(\"unreachable()\");\r\n return;\r\n }\r\n case ExpressionId.AtomicCmpxchg:\r\n case ExpressionId.AtomicRMW:\r\n case ExpressionId.AtomicWait:\r\n case ExpressionId.AtomicWake:\r\n }\r\n throw new Error(\"not implemented\");\r\n }\r\n\r\n private push(text: string): void {\r\n // mostly here so we can add debugging if necessary\r\n this.text.push(text);\r\n }\r\n\r\n finish(): string {\r\n var ret = this.text.join(\"\");\r\n this.text = [];\r\n return ret;\r\n }\r\n}\r\n\r\nfunction nativeTypeToType(type: NativeType): string {\r\n switch (type) {\r\n case NativeType.None: return \"void\";\r\n case NativeType.I32: return \"i32\";\r\n case NativeType.I64: return \"i64\";\r\n case NativeType.F32: return \"f32\";\r\n case NativeType.F64: return \"f64\";\r\n case NativeType.V128: return \"v128\";\r\n case NativeType.Unreachable: throw new Error(\"unreachable type\");\r\n case NativeType.Auto: throw new Error(\"auto type\");\r\n default: throw new Error(\"unexpected type\");\r\n }\r\n}\r\n","/**\r\n * Definition builders for WebIDL and TypeScript.\r\n * @module definitions\r\n *//***/\r\n\r\nimport {\r\n CommonFlags\r\n} from \"./common\";\r\n\r\nimport {\r\n Program,\r\n Element,\r\n ElementKind,\r\n Global,\r\n Enum,\r\n EnumValue,\r\n Field,\r\n Function,\r\n FunctionPrototype,\r\n Class,\r\n ClassPrototype,\r\n Namespace,\r\n ConstantValueKind,\r\n Interface,\r\n Property,\r\n PropertyPrototype\r\n} from \"./program\";\r\n\r\nimport {\r\n Type,\r\n TypeKind\r\n} from \"./types\";\r\n\r\nimport {\r\n indent\r\n} from \"./util\";\r\n\r\n/** Walker base class. */\r\nabstract class ExportsWalker {\r\n\r\n /** Program reference. */\r\n program: Program;\r\n /** Whether to include private members */\r\n includePrivate: bool;\r\n /** Elements still to do. */\r\n todo: Element[] = [];\r\n /** Already seen elements. */\r\n seen: Set = new Set();\r\n\r\n /** Constructs a new Element walker. */\r\n constructor(program: Program, includePrivate: bool = false) {\r\n this.program = program;\r\n this.includePrivate;\r\n }\r\n\r\n /** Walks all elements and calls the respective handlers. */\r\n walk(): void {\r\n for (let file of this.program.filesByName.values()) {\r\n let members = file.members;\r\n if (!members) continue;\r\n for (let member of members.values()) {\r\n // FIXME: doesn't honor the actual externally visible name\r\n this.visitElement(member);\r\n }\r\n }\r\n var todo = this.todo;\r\n for (let i = 0; i < todo.length; ) this.visitElement(todo[i]);\r\n }\r\n\r\n /** Visits an element.*/\r\n visitElement(element: Element): void {\r\n if (element.is(CommonFlags.PRIVATE) && !this.includePrivate) return;\r\n if (this.seen.has(element)) return;\r\n this.seen.add(element);\r\n switch (element.kind) {\r\n case ElementKind.GLOBAL: {\r\n if (element.is(CommonFlags.COMPILED)) this.visitGlobal(element);\r\n break;\r\n }\r\n case ElementKind.ENUM: {\r\n if (element.is(CommonFlags.COMPILED)) this.visitEnum(element);\r\n break;\r\n }\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n this.visitFunctionInstances(element);\r\n break;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n this.visitClassInstances(element);\r\n break;\r\n }\r\n case ElementKind.FIELD: {\r\n if ((element).is(CommonFlags.COMPILED)) this.visitField(element);\r\n break;\r\n }\r\n case ElementKind.PROPERTY_PROTOTYPE: {\r\n this.visitPropertyInstances(element);\r\n break;\r\n }\r\n case ElementKind.PROPERTY: {\r\n let prop = element;\r\n let getter = prop.getterInstance;\r\n if (getter) this.visitFunction(getter);\r\n let setter = prop.setterInstance;\r\n if (setter) this.visitFunction(setter);\r\n break;\r\n }\r\n case ElementKind.NAMESPACE: {\r\n if (hasCompiledMember(element)) this.visitNamespace(element);\r\n break;\r\n }\r\n case ElementKind.TYPEDEFINITION: break;\r\n default: assert(false);\r\n }\r\n }\r\n\r\n private visitFunctionInstances(element: FunctionPrototype): void {\r\n var instances = element.instances;\r\n if (instances) {\r\n for (let instance of instances.values()) {\r\n if (instance.is(CommonFlags.COMPILED)) this.visitFunction(instance);\r\n }\r\n }\r\n }\r\n\r\n private visitClassInstances(element: ClassPrototype): void {\r\n var instances = element.instances;\r\n if (instances) {\r\n for (let instance of instances.values()) {\r\n if (instance.is(CommonFlags.COMPILED)) this.visitClass(instance);\r\n }\r\n }\r\n }\r\n\r\n private visitPropertyInstances(element: PropertyPrototype): void {\r\n // var instances = element.instances;\r\n // if (instances) {\r\n // for (let instance of instances.values()) {\r\n // if (instance.is(CommonFlags.COMPILED)) this.visitProperty(instance);\r\n // }\r\n // }\r\n assert(false);\r\n }\r\n\r\n abstract visitGlobal(element: Global): void;\r\n abstract visitEnum(element: Enum): void;\r\n abstract visitFunction(element: Function): void;\r\n abstract visitClass(element: Class): void;\r\n abstract visitInterface(element: Interface): void;\r\n abstract visitField(element: Field): void;\r\n abstract visitNamespace(element: Element): void;\r\n}\r\n\r\n/** A WebIDL definitions builder. */\r\nexport class IDLBuilder extends ExportsWalker {\r\n\r\n /** Builds WebIDL definitions for the specified program. */\r\n static build(program: Program): string {\r\n return new IDLBuilder(program).build();\r\n }\r\n\r\n private sb: string[] = [];\r\n private indentLevel: i32 = 0;\r\n\r\n /** Constructs a new WebIDL builder. */\r\n constructor(program: Program, includePrivate: bool = false) {\r\n super(program, includePrivate);\r\n }\r\n\r\n visitGlobal(element: Global): void {\r\n var sb = this.sb;\r\n var isConst = element.is(CommonFlags.INLINED);\r\n indent(sb, this.indentLevel);\r\n if (isConst) sb.push(\"const \");\r\n sb.push(this.typeToString(element.type));\r\n sb.push(\" \");\r\n sb.push(element.name);\r\n if (isConst) {\r\n switch (element.constantValueKind) {\r\n case ConstantValueKind.INTEGER: {\r\n sb.push(\" = \");\r\n sb.push(i64_to_string(element.constantIntegerValue));\r\n break;\r\n }\r\n case ConstantValueKind.FLOAT: {\r\n sb.push(\" = \");\r\n sb.push(element.constantFloatValue.toString());\r\n break;\r\n }\r\n default: assert(false);\r\n }\r\n }\r\n sb.push(\";\\n\");\r\n }\r\n\r\n visitEnum(element: Enum): void {\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"interface \");\r\n sb.push(element.name);\r\n sb.push(\" {\\n\");\r\n var members = element.members;\r\n if (members) {\r\n for (let [name, member] of members) {\r\n if (member.kind == ElementKind.ENUMVALUE) {\r\n let isConst = (member).is(CommonFlags.INLINED);\r\n indent(sb, this.indentLevel);\r\n if (isConst) sb.push(\"const \");\r\n else sb.push(\"readonly \");\r\n sb.push(\"unsigned long \");\r\n sb.push(name);\r\n if (isConst) {\r\n sb.push(\" = \");\r\n assert((member).constantValueKind == ConstantValueKind.INTEGER);\r\n sb.push(i64_low((member).constantIntegerValue).toString(10));\r\n }\r\n sb.push(\";\\n\");\r\n }\r\n }\r\n for (let member of members.values()) {\r\n if (member.kind != ElementKind.ENUMVALUE) this.visitElement(member);\r\n }\r\n }\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n visitFunction(element: Function): void {\r\n var sb = this.sb;\r\n var signature = element.signature;\r\n indent(sb, this.indentLevel);\r\n sb.push(this.typeToString(signature.returnType));\r\n sb.push(\" \");\r\n sb.push(element.name);\r\n sb.push(\"(\");\r\n var parameters = signature.parameterTypes;\r\n var numParameters = parameters.length;\r\n // var requiredParameters = signature.requiredParameters;\r\n for (let i = 0; i < numParameters; ++i) {\r\n if (i) sb.push(\", \");\r\n // if (i >= requiredParameters) sb.push(\"optional \");\r\n sb.push(this.typeToString(parameters[i]));\r\n sb.push(\" \");\r\n sb.push(signature.getParameterName(i));\r\n }\r\n sb.push(\");\\n\");\r\n var members = element.members;\r\n if (members && members.size) {\r\n indent(sb, this.indentLevel);\r\n sb.push(\"interface \");\r\n sb.push(element.name);\r\n sb.push(\" {\\n\");\r\n for (let member of members.values()) this.visitElement(member);\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n }\r\n\r\n visitClass(element: Class): void {\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"interface \");\r\n sb.push(element.name);\r\n sb.push(\" {\\n\");\r\n // TODO\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n visitInterface(element: Interface): void {\r\n this.visitClass(element);\r\n }\r\n\r\n visitField(element: Field): void {\r\n // TODO\r\n }\r\n\r\n visitNamespace(element: Namespace): void {\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"interface \");\r\n sb.push(element.name);\r\n sb.push(\" {\\n\");\r\n var members = element.members;\r\n if (members) {\r\n for (let member of members.values()) this.visitElement(member);\r\n }\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n typeToString(type: Type): string {\r\n switch (type.kind) {\r\n case TypeKind.I8: return \"byte\";\r\n case TypeKind.I16: return \"short\";\r\n case TypeKind.I32: return \"long\";\r\n case TypeKind.I64: return \"long long\";\r\n case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"long long\" : \"long\";\r\n case TypeKind.U8: return \"octet\";\r\n case TypeKind.U16: return \"unsigned short\";\r\n case TypeKind.U32: return \"unsigned long\";\r\n // ^ TODO: function types\r\n case TypeKind.U64: return \"unsigned long long\";\r\n case TypeKind.USIZE: return this.program.options.isWasm64 ? \"unsigned long long\" : \"unsigned long\";\r\n // ^ TODO: class types\r\n case TypeKind.BOOL: return \"boolean\";\r\n case TypeKind.F32: return \"unrestricted float\";\r\n case TypeKind.F64: return \"unrestricted double\";\r\n case TypeKind.VOID: return \"void\";\r\n default: {\r\n assert(false);\r\n return \"\";\r\n }\r\n }\r\n }\r\n\r\n build(): string {\r\n var sb = this.sb;\r\n sb.push(\"interface ASModule {\\n\");\r\n ++this.indentLevel;\r\n this.walk();\r\n --this.indentLevel;\r\n sb.push(\"}\\n\");\r\n return sb.join(\"\");\r\n }\r\n}\r\n\r\n/** A TypeScript definitions builder. */\r\nexport class TSDBuilder extends ExportsWalker {\r\n\r\n /** Builds TypeScript definitions for the specified program. */\r\n static build(program: Program): string {\r\n return new TSDBuilder(program).build();\r\n }\r\n\r\n private sb: string[] = [];\r\n private indentLevel: i32 = 0;\r\n\r\n /** Constructs a new WebIDL builder. */\r\n constructor(program: Program, includePrivate: bool = false) {\r\n super(program, includePrivate);\r\n }\r\n\r\n visitGlobal(element: Global): void {\r\n var sb = this.sb;\r\n var isConst = element.is(CommonFlags.INLINED);\r\n indent(sb, this.indentLevel);\r\n if (element.is(CommonFlags.STATIC)) {\r\n if (isConst) sb.push(\"static readonly \");\r\n else sb.push(\"static \");\r\n } else {\r\n if (isConst) sb.push(\"const \");\r\n else sb.push(\"var \");\r\n }\r\n sb.push(element.name);\r\n sb.push(\": \");\r\n sb.push(this.typeToString(element.type));\r\n sb.push(\";\\n\");\r\n this.visitNamespace(element);\r\n }\r\n\r\n visitEnum(element: Enum): void {\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"enum \");\r\n sb.push(element.name);\r\n sb.push(\" {\\n\");\r\n var members = element.members;\r\n if (members) {\r\n let numMembers = members.size;\r\n for (let [name, member] of members) {\r\n if (member.kind == ElementKind.ENUMVALUE) {\r\n indent(sb, this.indentLevel);\r\n sb.push(name);\r\n if (member.is(CommonFlags.INLINED)) {\r\n sb.push(\" = \");\r\n assert((member).constantValueKind == ConstantValueKind.INTEGER);\r\n sb.push(i64_low((member).constantIntegerValue).toString(10));\r\n }\r\n sb.push(\",\\n\");\r\n --numMembers;\r\n }\r\n }\r\n if (numMembers) this.visitNamespace(element);\r\n }\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n visitFunction(element: Function): void {\r\n if (element.isAny(CommonFlags.PRIVATE | CommonFlags.SET)) return;\r\n var sb = this.sb;\r\n var signature = element.signature;\r\n indent(sb, this.indentLevel);\r\n if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\r\n if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\r\n if (element.is(CommonFlags.GET)) {\r\n sb.push(element.identifierNode.text); // 'get:funcName' internally\r\n sb.push(\": \");\r\n sb.push(this.typeToString(signature.returnType));\r\n sb.push(\";\\n\");\r\n return;\r\n } else {\r\n if (!element.isAny(CommonFlags.STATIC | CommonFlags.INSTANCE)) sb.push(\"function \");\r\n sb.push(element.name);\r\n }\r\n sb.push(\"(\");\r\n var parameters = signature.parameterTypes;\r\n var numParameters = parameters.length;\r\n // var requiredParameters = signature.requiredParameters;\r\n for (let i = 0; i < numParameters; ++i) {\r\n if (i) sb.push(\", \");\r\n // if (i >= requiredParameters) sb.push(\"optional \");\r\n sb.push(signature.getParameterName(i));\r\n sb.push(\": \");\r\n sb.push(this.typeToString(parameters[i]));\r\n }\r\n if (element.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.SET)) {\r\n sb.push(\")\");\r\n } else {\r\n sb.push(\"): \");\r\n sb.push(this.typeToString(signature.returnType));\r\n }\r\n sb.push(\";\\n\");\r\n this.visitNamespace(element);\r\n }\r\n\r\n visitClass(element: Class): void {\r\n var sb = this.sb;\r\n var isInterface = element.kind == ElementKind.INTERFACE;\r\n indent(sb, this.indentLevel++);\r\n if (isInterface) {\r\n sb.push(\"interface \");\r\n } else {\r\n if (element.is(CommonFlags.ABSTRACT)) sb.push(\"abstract \");\r\n sb.push(\"class \");\r\n }\r\n sb.push(element.name);\r\n var base = element.base;\r\n if (base && base.is(CommonFlags.COMPILED | CommonFlags.MODULE_EXPORT)) {\r\n sb.push(\" extends \");\r\n sb.push(base.name); // TODO: fqn\r\n }\r\n sb.push(\" {\\n\");\r\n var members = element.parent.members; // static\r\n if (members) {\r\n for (let member of members.values()) {\r\n this.visitElement(member);\r\n }\r\n }\r\n var ctor = element.constructorInstance;\r\n if (ctor) this.visitFunction(ctor);\r\n members = element.members; // instance\r\n if (members) {\r\n for (let member of members.values()) this.visitElement(member);\r\n }\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n\r\n visitInterface(element: Interface): void {\r\n this.visitClass(element);\r\n }\r\n\r\n visitField(element: Field): void {\r\n if (element.is(CommonFlags.PRIVATE)) return;\r\n var sb = this.sb;\r\n indent(sb, this.indentLevel);\r\n if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\r\n if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\r\n if (element.is(CommonFlags.READONLY)) sb.push(\"readonly \");\r\n sb.push(element.name);\r\n sb.push(\": \");\r\n sb.push(this.typeToString(element.type));\r\n sb.push(\";\\n\");\r\n }\r\n\r\n visitNamespace(element: Element): void {\r\n var members = element.members;\r\n if (members && members.size) {\r\n let sb = this.sb;\r\n indent(sb, this.indentLevel++);\r\n sb.push(\"namespace \");\r\n sb.push(element.name);\r\n sb.push(\" {\\n\");\r\n for (let member of members.values()) this.visitElement(member);\r\n indent(sb, --this.indentLevel);\r\n sb.push(\"}\\n\");\r\n }\r\n }\r\n\r\n typeToString(type: Type): string {\r\n switch (type.kind) {\r\n case TypeKind.I8: return \"i8\";\r\n case TypeKind.I16: return \"i16\";\r\n case TypeKind.I32: return \"i32\";\r\n case TypeKind.I64: return \"I64\";\r\n case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"I64\" : \"i32\";\r\n case TypeKind.U8: return \"u8\";\r\n case TypeKind.U16: return \"u16\";\r\n case TypeKind.U32: return \"u32\";\r\n // ^ TODO: function types\r\n case TypeKind.U64: return \"U64\";\r\n case TypeKind.USIZE: return this.program.options.isWasm64 ? \"U64\" : \"u32\";\r\n // ^ TODO: class types\r\n case TypeKind.BOOL: return \"bool\";\r\n case TypeKind.F32: return \"f32\";\r\n case TypeKind.F64: return \"f64\";\r\n case TypeKind.V128: return \"v128\";\r\n case TypeKind.VOID: return \"void\";\r\n default: {\r\n assert(false);\r\n return \"\";\r\n }\r\n }\r\n }\r\n\r\n build(): string {\r\n var sb = this.sb;\r\n sb.push(\"declare module ASModule {\\n\");\r\n sb.push(\" type i8 = number;\\n\");\r\n sb.push(\" type i16 = number;\\n\");\r\n sb.push(\" type i32 = number;\\n\");\r\n sb.push(\" type u8 = number;\\n\");\r\n sb.push(\" type u16 = number;\\n\");\r\n sb.push(\" type u32 = number;\\n\");\r\n sb.push(\" type f32 = number;\\n\");\r\n sb.push(\" type f64 = number;\\n\");\r\n sb.push(\" type bool = any;\\n\");\r\n ++this.indentLevel;\r\n this.walk();\r\n --this.indentLevel;\r\n sb.push(\"}\\n\");\r\n sb.push(\"export default ASModule;\\n\");\r\n return this.sb.join(\"\");\r\n }\r\n}\r\n\r\n// helpers\r\n\r\n/** Tests if a namespace-like element has at least one compiled member. */\r\nfunction hasCompiledMember(element: Element): bool {\r\n var members = element.members;\r\n if (members) {\r\n for (let member of members.values()) {\r\n switch (member.kind) {\r\n case ElementKind.FUNCTION_PROTOTYPE: {\r\n let instances = (member).instances;\r\n if (instances) {\r\n for (let instance of instances.values()) {\r\n if (instance.is(CommonFlags.COMPILED)) return true;\r\n }\r\n }\r\n break;\r\n }\r\n case ElementKind.CLASS_PROTOTYPE: {\r\n let instances = (member).instances;\r\n if (instances) {\r\n for (let instance of instances.values()) {\r\n if (instance.is(CommonFlags.COMPILED)) return true;\r\n }\r\n }\r\n break;\r\n }\r\n default: {\r\n if (member.is(CommonFlags.COMPILED) || hasCompiledMember(member)) return true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n","/**\r\n * A TypeScript parser for the AssemblyScript subset.\r\n * @module parser\r\n *//***/\r\n\r\nimport {\r\n CommonFlags,\r\n LIBRARY_PREFIX,\r\n PATH_DELIMITER\r\n} from \"./common\";\r\n\r\nimport {\r\n Program\r\n} from \"./program\";\r\n\r\nimport {\r\n Tokenizer,\r\n Token,\r\n Range,\r\n CommentHandler,\r\n IdentifierHandling\r\n} from \"./tokenizer\";\r\n\r\nimport {\r\n DiagnosticCode,\r\n DiagnosticEmitter\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n normalizePath\r\n} from \"./util\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n Source,\r\n SourceKind,\r\n CommonTypeNode,\r\n TypeNode,\r\n SignatureNode,\r\n\r\n Expression,\r\n AssertionKind,\r\n CallExpression,\r\n ClassExpression,\r\n FunctionExpression,\r\n IdentifierExpression,\r\n StringLiteralExpression,\r\n\r\n Statement,\r\n BlockStatement,\r\n BreakStatement,\r\n ClassDeclaration,\r\n ContinueStatement,\r\n DeclarationStatement,\r\n DecoratorNode,\r\n DoStatement,\r\n EnumDeclaration,\r\n EnumValueDeclaration,\r\n ExportImportStatement,\r\n ExportMember,\r\n ExportStatement,\r\n ExpressionStatement,\r\n ForStatement,\r\n FunctionDeclaration,\r\n IfStatement,\r\n ImportDeclaration,\r\n ImportStatement,\r\n NamespaceDeclaration,\r\n ParameterNode,\r\n ParameterKind,\r\n ReturnStatement,\r\n SwitchCase,\r\n SwitchStatement,\r\n ThrowStatement,\r\n TryStatement,\r\n TypeDeclaration,\r\n TypeParameterNode,\r\n VariableStatement,\r\n VariableDeclaration,\r\n VoidStatement,\r\n WhileStatement,\r\n\r\n mangleInternalPath,\r\n nodeIsCallable,\r\n nodeIsGenericCallable,\r\n IndexSignatureDeclaration\r\n} from \"./ast\";\r\n\r\n/** Parser interface. */\r\nexport class Parser extends DiagnosticEmitter {\r\n\r\n /** Program being created. */\r\n program: Program;\r\n /** Source file names to be requested next. */\r\n backlog: string[] = new Array();\r\n /** Source file names already seen, that is processed or backlogged. */\r\n seenlog: Set = new Set();\r\n /** Source file names already completely processed. */\r\n donelog: Set = new Set();\r\n /** Optional handler to intercept comments while tokenizing. */\r\n onComment: CommentHandler | null = null;\r\n\r\n /** Constructs a new parser. */\r\n constructor() {\r\n super();\r\n this.program = new Program(this.diagnostics);\r\n }\r\n\r\n /** Parses a file and adds its definitions to the program. */\r\n parseFile(\r\n text: string,\r\n path: string,\r\n isEntry: bool\r\n ): void {\r\n var normalizedPath = normalizePath(path);\r\n var internalPath = mangleInternalPath(normalizedPath);\r\n\r\n // check if already processed\r\n if (this.donelog.has(internalPath)) return;\r\n this.donelog.add(internalPath); // do not parse again\r\n this.seenlog.add(internalPath); // do not request again\r\n\r\n // create the source element\r\n var source = new Source(\r\n normalizedPath,\r\n text,\r\n isEntry\r\n ? SourceKind.ENTRY\r\n : path.startsWith(LIBRARY_PREFIX) && path.indexOf(PATH_DELIMITER, LIBRARY_PREFIX.length) < 0\r\n ? SourceKind.LIBRARY\r\n : SourceKind.DEFAULT\r\n );\r\n var program = this.program;\r\n program.sources.push(source);\r\n\r\n // tokenize and parse\r\n var tn = new Tokenizer(source, program.diagnostics);\r\n tn.onComment = this.onComment;\r\n source.tokenizer = tn;\r\n var statements = source.statements;\r\n while (!tn.skip(Token.ENDOFFILE)) {\r\n let statement = this.parseTopLevelStatement(tn, null);\r\n if (statement) statements.push(statement);\r\n }\r\n tn.finish();\r\n }\r\n\r\n /** Parses a top-level statement. */\r\n parseTopLevelStatement(\r\n tn: Tokenizer,\r\n namespace: NamespaceDeclaration | null = null\r\n ): Statement | null {\r\n var flags = CommonFlags.NONE;\r\n var startPos: i32 = -1;\r\n\r\n // check decorators\r\n var decorators: DecoratorNode[] | null = null;\r\n while (tn.skip(Token.AT)) {\r\n if (startPos < 0) startPos = tn.tokenPos;\r\n let decorator = this.parseDecorator(tn);\r\n if (!decorator) {\r\n this.skipStatement(tn);\r\n continue;\r\n }\r\n if (!decorators) decorators = [];\r\n decorators.push(decorator);\r\n }\r\n\r\n // check modifiers\r\n var exportStart: i32 = 0;\r\n var exportEnd: i32 = 0;\r\n if (tn.skip(Token.EXPORT)) {\r\n if (tn.skip(Token.DEFAULT)) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n tn.range()\r\n );\r\n }\r\n if (startPos < 0) startPos = tn.tokenPos;\r\n flags |= CommonFlags.EXPORT;\r\n exportStart = tn.tokenPos;\r\n exportEnd = tn.pos;\r\n }\r\n\r\n var declareStart: i32 = 0;\r\n var declareEnd: i32 = 0;\r\n var contextIsAmbient = namespace != null && namespace.is(CommonFlags.AMBIENT);\r\n if (tn.skip(Token.DECLARE)) {\r\n if (startPos < 0) startPos = tn.tokenPos;\r\n if (contextIsAmbient) {\r\n this.error(\r\n DiagnosticCode.A_declare_modifier_cannot_be_used_in_an_already_ambient_context,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n flags |= CommonFlags.DECLARE | CommonFlags.AMBIENT;\r\n } else if (contextIsAmbient) {\r\n flags |= CommonFlags.AMBIENT;\r\n }\r\n\r\n // parse the statement\r\n var statement: Statement | null = null;\r\n\r\n // handle declarations\r\n var first = tn.peek();\r\n if (startPos < 0) startPos = tn.nextTokenPos;\r\n switch (first) {\r\n case Token.CONST: {\r\n tn.next();\r\n flags |= CommonFlags.CONST;\r\n if (tn.skip(Token.ENUM)) {\r\n statement = this.parseEnum(tn, flags, decorators, startPos);\r\n } else {\r\n statement = this.parseVariable(tn, flags, decorators, startPos);\r\n }\r\n decorators = null;\r\n break;\r\n }\r\n case Token.LET: flags |= CommonFlags.LET;\r\n case Token.VAR: {\r\n tn.next();\r\n statement = this.parseVariable(tn, flags, decorators, startPos);\r\n decorators = null;\r\n break;\r\n }\r\n case Token.ENUM: {\r\n tn.next();\r\n statement = this.parseEnum(tn, flags, decorators, startPos);\r\n decorators = null;\r\n break;\r\n }\r\n case Token.FUNCTION: {\r\n tn.next();\r\n statement = this.parseFunction(tn, flags, decorators, startPos);\r\n decorators = null;\r\n break;\r\n }\r\n case Token.ABSTRACT: {\r\n let state = tn.mark();\r\n tn.next();\r\n if (!tn.skip(Token.CLASS)) {\r\n tn.reset(state);\r\n statement = this.parseStatement(tn, true);\r\n break;\r\n } else {\r\n tn.discard(state);\r\n }\r\n flags |= CommonFlags.ABSTRACT;\r\n // fall through\r\n }\r\n case Token.CLASS:\r\n case Token.INTERFACE: {\r\n tn.next();\r\n statement = this.parseClassOrInterface(tn, flags, decorators, startPos);\r\n decorators = null;\r\n break;\r\n }\r\n case Token.NAMESPACE: {\r\n let state = tn.mark();\r\n tn.next();\r\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n tn.discard(state);\r\n statement = this.parseNamespace(tn, flags, decorators, startPos);\r\n decorators = null;\r\n } else {\r\n tn.reset(state);\r\n statement = this.parseStatement(tn, true);\r\n }\r\n break;\r\n }\r\n case Token.IMPORT: {\r\n tn.next();\r\n flags |= CommonFlags.IMPORT;\r\n if (flags & CommonFlags.EXPORT) {\r\n statement = this.parseExportImport(tn, startPos);\r\n } else {\r\n statement = this.parseImport(tn);\r\n }\r\n break;\r\n }\r\n case Token.TYPE: { // also identifier\r\n let state = tn.mark();\r\n tn.next();\r\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n tn.discard(state);\r\n statement = this.parseTypeDeclaration(tn, flags, decorators, startPos);\r\n decorators = null;\r\n } else {\r\n tn.reset(state);\r\n statement = this.parseStatement(tn, true);\r\n }\r\n break;\r\n }\r\n default: {\r\n\r\n // handle plain exports\r\n if (flags & CommonFlags.EXPORT) {\r\n statement = this.parseExport(tn, startPos, (flags & CommonFlags.DECLARE) != 0);\r\n\r\n // handle non-declaration statements\r\n } else {\r\n if (exportEnd) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(exportStart, exportEnd), \"export\"\r\n ); // recoverable\r\n }\r\n if (declareEnd) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(declareStart, declareEnd), \"declare\"\r\n ); // recoverable\r\n }\r\n if (!namespace) {\r\n statement = this.parseStatement(tn, true);\r\n } // TODO: else?\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // check for decorators that weren't consumed\r\n if (decorators) {\r\n for (let i = 0, k = decorators.length; i < k; ++i) {\r\n this.error(\r\n DiagnosticCode.Decorators_are_not_valid_here,\r\n decorators[i].range\r\n );\r\n }\r\n }\r\n return statement;\r\n }\r\n\r\n /** Obtains the next file to parse. */\r\n nextFile(): string | null {\r\n var backlog = this.backlog;\r\n return backlog.length ? backlog.shift() : null;\r\n }\r\n\r\n /** Finishes parsing and returns the program. */\r\n finish(): Program {\r\n if (this.backlog.length) throw new Error(\"backlog is not empty\");\r\n this.backlog = [];\r\n this.seenlog.clear();\r\n this.donelog.clear();\r\n return this.program;\r\n }\r\n\r\n /** Parses a type. */\r\n parseType(\r\n tn: Tokenizer,\r\n acceptParenthesized: bool = true,\r\n suppressErrors: bool = false\r\n ): CommonTypeNode | null {\r\n\r\n // NOTE: this parses our limited subset\r\n var token = tn.next();\r\n var startPos = tn.tokenPos;\r\n\r\n var type: CommonTypeNode;\r\n\r\n // '(' ...\r\n if (token == Token.OPENPAREN) {\r\n\r\n // '(' FunctionSignature ')' '|' 'null'?\r\n let isNullableSignature = tn.skip(Token.OPENPAREN);\r\n // FunctionSignature?\r\n let signature = this.tryParseSignature(tn);\r\n if (signature) {\r\n if (isNullableSignature) {\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.BAR)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"|\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.NULL)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"null\"\r\n );\r\n }\r\n signature.isNullable = true;\r\n }\r\n return signature;\r\n } else if (isNullableSignature || this.tryParseSignatureIsSignature) {\r\n this.error(\r\n DiagnosticCode.Unexpected_token,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n\r\n // Type (',' Type)* ')'\r\n if (acceptParenthesized) {\r\n let innerType = this.parseType(tn, false, suppressErrors);\r\n if (!innerType) return null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"}\"\r\n );\r\n }\r\n return null;\r\n }\r\n type = innerType;\r\n type.range.start = startPos;\r\n type.range.end = tn.pos;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Unexpected_token,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n\r\n // 'void'\r\n } else if (token == Token.VOID) {\r\n type = Node.createType(\r\n Node.createSimpleTypeName(\"void\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // 'this'\r\n } else if (token == Token.THIS) {\r\n type = Node.createType(\r\n Node.createSimpleTypeName(\"this\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // 'true'\r\n } else if (token == Token.TRUE || token == Token.FALSE) {\r\n type = Node.createType(\r\n Node.createSimpleTypeName(\"bool\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // StringLiteral\r\n } else if (token == Token.STRINGLITERAL) {\r\n tn.readString();\r\n type = Node.createType(\r\n Node.createSimpleTypeName(\"string\", tn.range()), [], false, tn.range(startPos, tn.pos)\r\n );\r\n\r\n // Identifier\r\n } else if (token == Token.IDENTIFIER) {\r\n let first = Node.createSimpleTypeName(tn.readIdentifier(), tn.range());\r\n let current = first;\r\n let parameters = new Array();\r\n let nullable = false;\r\n\r\n // Identifier ('.' Identifier)+\r\n while (tn.skip(Token.DOT)) {\r\n if (tn.skip(Token.IDENTIFIER)) {\r\n let next = Node.createSimpleTypeName(tn.readIdentifier(), tn.range());\r\n current.next = next;\r\n current = next;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range(tn.pos)\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n // Name\r\n if (tn.skip(Token.LESSTHAN)) {\r\n do {\r\n let parameter = this.parseType(tn, true, suppressErrors);\r\n if (!parameter) return null;\r\n parameters.push(parameter);\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \">\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n // ... | null\r\n while (tn.skip(Token.BAR)) {\r\n if (tn.skip(Token.NULL)) {\r\n nullable = true;\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"null\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n type = Node.createType(first, parameters, nullable, tn.range(startPos, tn.pos));\r\n\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n // ... [][]\r\n while (tn.skip(Token.OPENBRACKET)) {\r\n let bracketStart = tn.tokenPos;\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n }\r\n return null;\r\n }\r\n let bracketRange = tn.range(bracketStart, tn.pos);\r\n\r\n // ...[] | null\r\n let nullable = false;\r\n if (tn.skip(Token.BAR)) {\r\n if (tn.skip(Token.NULL)) {\r\n nullable = true;\r\n } else {\r\n if (!suppressErrors) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"null\"\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n type = Node.createType(\r\n Node.createSimpleTypeName(\"Array\", bracketRange),\r\n [ type ],\r\n nullable,\r\n tn.range(startPos, tn.pos)\r\n );\r\n if (nullable) break;\r\n }\r\n\r\n return type;\r\n }\r\n\r\n // Indicates whether tryParseSignature determined that it is handling a Signature\r\n private tryParseSignatureIsSignature: bool = false;\r\n\r\n /** Parses a function signature, as used in type declarations. */\r\n tryParseSignature(\r\n tn: Tokenizer\r\n ): SignatureNode | null {\r\n\r\n // at '(': ('...'? Identifier '?'? ':' Type (',' '...'? Identifier '?'? ':' Type)* )? ')' '=>' Type\r\n\r\n var state = tn.mark();\r\n var startPos = tn.tokenPos;\r\n var parameters: ParameterNode[] | null = null;\r\n var thisType: TypeNode | null = null;\r\n var isSignature: bool = false;\r\n\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n parameters = [];\r\n\r\n } else {\r\n isSignature = false; // not yet known\r\n do {\r\n let kind = ParameterKind.DEFAULT;\r\n if (tn.skip(Token.DOT_DOT_DOT)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n kind = ParameterKind.REST;\r\n }\r\n if (tn.skip(Token.THIS)) {\r\n if (tn.skip(Token.COLON)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n let t = this.parseType(tn, false);\r\n if (!t) return null;\r\n if (t.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n t.range\r\n );\r\n this.tryParseSignatureIsSignature = true;\r\n return null;\r\n }\r\n thisType = t;\r\n } else {\r\n tn.reset(state);\r\n this.tryParseSignatureIsSignature = false;\r\n return null;\r\n }\r\n } else if (tn.skipIdentifier()) {\r\n let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range(tn.tokenPos, tn.pos));\r\n if (tn.skip(Token.QUESTION)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n if (kind == ParameterKind.REST) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\r\n tn.range()\r\n ); // recoverable\r\n } else {\r\n kind = ParameterKind.OPTIONAL;\r\n }\r\n }\r\n if (tn.skip(Token.COLON)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n let type = this.parseType(tn); // not suppressing errors because known\r\n if (!type) {\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n let param = new ParameterNode();\r\n param.parameterKind = kind;\r\n param.name = name;\r\n param.type = type;\r\n if (!parameters) parameters = [ param ];\r\n else parameters.push(param);\r\n } else {\r\n if (isSignature) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n }\r\n } else {\r\n if (isSignature) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n } else {\r\n tn.reset(state);\r\n }\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n } while (tn.skip(Token.COMMA));\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n if (isSignature) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n } else {\r\n tn.reset(state);\r\n }\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n }\r\n\r\n var returnType: CommonTypeNode | null;\r\n if (tn.skip(Token.EQUALS_GREATERTHAN)) {\r\n isSignature = true;\r\n tn.discard(state);\r\n returnType = this.parseType(tn);\r\n if (!returnType) {\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n } else {\r\n if (isSignature) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=>\"\r\n );\r\n } else {\r\n tn.reset(state);\r\n }\r\n this.tryParseSignatureIsSignature = isSignature;\r\n return null;\r\n }\r\n this.tryParseSignatureIsSignature = true;\r\n return Node.createSignature(\r\n parameters || [],\r\n returnType,\r\n thisType,\r\n false,\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n\r\n // statements\r\n\r\n parseDecorator(\r\n tn: Tokenizer\r\n ): DecoratorNode | null {\r\n\r\n // at '@': Identifier ('.' Identifier)* '(' Arguments\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skipIdentifier()) {\r\n let name = tn.readIdentifier();\r\n let expression: Expression = Node.createIdentifierExpression(name, tn.range(startPos, tn.pos));\r\n while (tn.skip(Token.DOT)) {\r\n if (tn.skipIdentifier()) {\r\n name = tn.readIdentifier();\r\n expression = Node.createPropertyAccessExpression(\r\n expression,\r\n Node.createIdentifierExpression(name, tn.range()),\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n let args: Expression[] | null;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n args = this.parseArguments(tn);\r\n if (args) {\r\n return Node.createDecorator(expression, args, tn.range(startPos, tn.pos));\r\n }\r\n } else {\r\n return Node.createDecorator(expression, null, tn.range(startPos, tn.pos));\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseVariable(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): VariableStatement | null {\r\n\r\n // at ('const' | 'let' | 'var'): VariableDeclaration (',' VariableDeclaration)* ';'?\r\n\r\n var members = new Array();\r\n do {\r\n let member = this.parseVariableDeclaration(tn, flags, decorators);\r\n if (!member) return null;\r\n members.push(member);\r\n } while (tn.skip(Token.COMMA));\r\n\r\n var ret = Node.createVariableStatement(members, decorators, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseVariableDeclaration(\r\n tn: Tokenizer,\r\n parentFlags: CommonFlags,\r\n parentDecorators: DecoratorNode[] | null\r\n ): VariableDeclaration | null {\r\n\r\n // before: Identifier (':' Type)? ('=' Expression)?\r\n\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var flags = parentFlags;\r\n if (tn.skip(Token.EXCLAMATION)) {\r\n flags |= CommonFlags.DEFINITE_ASSIGNMENT;\r\n }\r\n\r\n var type: CommonTypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n }\r\n\r\n var initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n if (flags & CommonFlags.AMBIENT) {\r\n this.error(\r\n DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!initializer) return null;\r\n } else {\r\n if (flags & CommonFlags.CONST) {\r\n if (!(flags & CommonFlags.AMBIENT)) {\r\n this.error(\r\n DiagnosticCode._const_declarations_must_be_initialized,\r\n identifier.range\r\n ); // recoverable\r\n }\r\n } else if (!type) { // neither type nor initializer\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range(tn.pos)\r\n ); // recoverable\r\n }\r\n }\r\n var range = Range.join(identifier.range, tn.range());\r\n if ((flags & CommonFlags.DEFINITE_ASSIGNMENT) && initializer) {\r\n this.error(\r\n DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,\r\n range);\r\n }\r\n return Node.createVariableDeclaration(\r\n identifier,\r\n type,\r\n initializer,\r\n parentDecorators,\r\n flags,\r\n range\r\n );\r\n }\r\n\r\n parseEnum(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): EnumDeclaration | null {\r\n\r\n // at 'enum': Identifier '{' (EnumValueDeclaration (',' EnumValueDeclaration )*)? '}' ';'?\r\n\r\n if (tn.next() != Token.IDENTIFIER) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.next() != Token.OPENBRACE) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n var members = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let member = this.parseEnumValue(tn, CommonFlags.NONE);\r\n if (!member) return null;\r\n members.push(member);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACE)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n var ret = Node.createEnumDeclaration(\r\n identifier,\r\n members,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseEnumValue(\r\n tn: Tokenizer,\r\n parentFlags: CommonFlags\r\n ): EnumValueDeclaration | null {\r\n\r\n // before: Identifier ('=' Expression)?\r\n\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var value: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n value = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!value) return null;\r\n }\r\n return Node.createEnumValueDeclaration(\r\n identifier,\r\n value,\r\n parentFlags,\r\n Range.join(identifier.range, tn.range())\r\n );\r\n }\r\n\r\n parseReturn(\r\n tn: Tokenizer\r\n ): ReturnStatement | null {\r\n\r\n // at 'return': Expression | (';' | '}' | ...'\\n')\r\n\r\n var expr: Expression | null = null;\r\n if (\r\n tn.peek(true) != Token.SEMICOLON &&\r\n tn.nextToken != Token.CLOSEBRACE &&\r\n !tn.nextTokenOnNewLine\r\n ) {\r\n if (!(expr = this.parseExpression(tn))) return null;\r\n }\r\n\r\n var ret = Node.createReturnStatement(expr, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseTypeParameters(\r\n tn: Tokenizer\r\n ): TypeParameterNode[] | null {\r\n\r\n // at '<': TypeParameter (',' TypeParameter)* '>'\r\n\r\n var typeParameters = new Array();\r\n var seenOptional = false;\r\n while (!tn.skip(Token.GREATERTHAN)) {\r\n let typeParameter = this.parseTypeParameter(tn);\r\n if (!typeParameter) return null;\r\n if (typeParameter.defaultType !== null) {\r\n seenOptional = true;\r\n } else if (seenOptional) {\r\n this.error(\r\n DiagnosticCode.Required_type_parameters_may_not_follow_optional_type_parameters,\r\n typeParameter.range\r\n );\r\n typeParameter.defaultType = null;\r\n }\r\n typeParameters.push(typeParameter);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.GREATERTHAN)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \">\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n if (typeParameters.length === 0) {\r\n this.error(\r\n DiagnosticCode.Type_parameter_list_cannot_be_empty,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n return typeParameters;\r\n }\r\n\r\n parseTypeParameter(\r\n tn: Tokenizer\r\n ): TypeParameterNode | null {\r\n\r\n // before: Identifier ('extends' Type)? ('=' Type)?\r\n\r\n if (tn.next() == Token.IDENTIFIER) {\r\n let identifier = Node.createIdentifierExpression(\r\n tn.readIdentifier(),\r\n tn.range()\r\n );\r\n let extendsType: TypeNode | null = null;\r\n if (tn.skip(Token.EXTENDS)) {\r\n let t = this.parseType(tn);\r\n if (!t) return null;\r\n if (t.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n t.range\r\n );\r\n return null;\r\n }\r\n extendsType = t;\r\n }\r\n let defaultType: TypeNode | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n let t = this.parseType(tn);\r\n if (!t) return null;\r\n if (t.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n t.range\r\n );\r\n return null;\r\n }\r\n defaultType = t;\r\n }\r\n return Node.createTypeParameter(\r\n identifier,\r\n extendsType,\r\n defaultType,\r\n Range.join(identifier.range, tn.range())\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private parseParametersThis: TypeNode | null = null;\r\n\r\n parseParameters(\r\n tn: Tokenizer,\r\n isConstructor: bool = false\r\n ): ParameterNode[] | null {\r\n\r\n // at '(': (Parameter (',' Parameter)*)? ')'\r\n\r\n var parameters = new Array();\r\n var seenRest: ParameterNode | null = null;\r\n var seenOptional = false;\r\n var reportedRest = false;\r\n var thisType: CommonTypeNode | null = null;\r\n\r\n // check if there is a leading `this` parameter\r\n this.parseParametersThis = null;\r\n if (tn.skip(Token.THIS)) {\r\n if (tn.skip(Token.COLON)) {\r\n thisType = this.parseType(tn); // reports\r\n if (!thisType) return null;\r\n if (thisType.kind == NodeKind.TYPE) {\r\n this.parseParametersThis = thisType;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n thisType.range\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n return parameters;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n while (!tn.skip(Token.CLOSEPAREN)) {\r\n let param = this.parseParameter(tn, isConstructor); // reports\r\n if (!param) return null;\r\n if (seenRest && !reportedRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,\r\n seenRest.name.range\r\n );\r\n reportedRest = true;\r\n }\r\n switch (param.parameterKind) {\r\n default: {\r\n if (seenOptional) {\r\n this.error(\r\n DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,\r\n param.name.range\r\n );\r\n }\r\n break;\r\n }\r\n case ParameterKind.OPTIONAL: {\r\n seenOptional = true;\r\n break;\r\n }\r\n case ParameterKind.REST: {\r\n seenRest = param;\r\n break;\r\n }\r\n }\r\n parameters.push(param);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n return parameters;\r\n }\r\n\r\n parseParameter(\r\n tn: Tokenizer,\r\n isConstructor: bool = false\r\n ): ParameterNode | null {\r\n\r\n // before: ('public' | 'private' | 'protected' | '...')? Identifier '?'? (':' Type)? ('=' Expression)?\r\n\r\n var isRest = false;\r\n var isOptional = false;\r\n var startRange: Range | null = null;\r\n var accessFlags: CommonFlags = CommonFlags.NONE;\r\n if (isConstructor) {\r\n if (tn.skip(Token.PUBLIC)) {\r\n startRange = tn.range();\r\n accessFlags |= CommonFlags.PUBLIC;\r\n } else if (tn.skip(Token.PROTECTED)) {\r\n startRange = tn.range();\r\n accessFlags |= CommonFlags.PROTECTED;\r\n } else if (tn.skip(Token.PRIVATE)) {\r\n startRange = tn.range();\r\n accessFlags |= CommonFlags.PRIVATE;\r\n }\r\n if (tn.peek() == Token.READONLY) {\r\n let state = tn.mark();\r\n tn.next();\r\n if (tn.peek() != Token.COLON) { // modifier\r\n tn.discard(state);\r\n if (!startRange) startRange = tn.range();\r\n accessFlags |= CommonFlags.READONLY;\r\n } else { // identifier\r\n tn.reset(state);\r\n }\r\n }\r\n }\r\n if (tn.skip(Token.DOT_DOT_DOT)) {\r\n if (accessFlags) {\r\n this.error(\r\n DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,\r\n tn.range()\r\n );\r\n } else {\r\n startRange = tn.range();\r\n }\r\n isRest = true;\r\n }\r\n if (tn.skipIdentifier()) {\r\n if (!isRest) startRange = tn.range();\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let type: CommonTypeNode | null = null;\r\n if (isOptional = tn.skip(Token.QUESTION)) {\r\n if (isRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\r\n identifier.range\r\n );\r\n }\r\n }\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type) return null;\r\n } else {\r\n type = Node.createOmittedType(tn.range(tn.pos));\r\n }\r\n let initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n if (isRest) {\r\n this.error(\r\n DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,\r\n identifier.range\r\n );\r\n }\r\n if (isOptional) {\r\n this.error(\r\n DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,\r\n identifier.range\r\n );\r\n } else {\r\n isOptional = true;\r\n }\r\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!initializer) return null;\r\n }\r\n let param = Node.createParameter(\r\n identifier,\r\n type,\r\n initializer,\r\n isRest\r\n ? ParameterKind.REST\r\n : isOptional\r\n ? ParameterKind.OPTIONAL\r\n : ParameterKind.DEFAULT,\r\n Range.join(startRange, tn.range())\r\n );\r\n param.flags |= accessFlags;\r\n return param;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseFunction(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): FunctionDeclaration | null {\r\n\r\n // at 'function':\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // '(' Parameters (':' Type)?\r\n // '{' Statement* '}'\r\n // ';'?\r\n\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range(tn.pos)\r\n );\r\n return null;\r\n }\r\n\r\n var name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n var signatureStart: i32 = -1;\r\n\r\n var typeParameters: TypeParameterNode[] | null = null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n signatureStart = tn.tokenPos;\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n flags |= CommonFlags.GENERIC;\r\n }\r\n\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"(\"\r\n );\r\n return null;\r\n }\r\n\r\n if (signatureStart < 0) {\r\n signatureStart = tn.tokenPos;\r\n }\r\n\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters) return null;\r\n var thisType = this.parseParametersThis;\r\n\r\n var isSetter = (flags & CommonFlags.SET) != 0;\r\n if (isSetter) {\r\n if (parameters.length != 1) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n name.range\r\n ); // recoverable\r\n }\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n name.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n if (flags & CommonFlags.GET) {\r\n if (parameters.length) {\r\n this.error(\r\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n name.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n var returnType: CommonTypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n returnType = this.parseType(tn, true, isSetter);\r\n if (!returnType) return null;\r\n }\r\n\r\n if (!returnType) {\r\n returnType = Node.createOmittedType(\r\n tn.range(tn.pos)\r\n );\r\n if (!isSetter) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n returnType.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n var signature = Node.createSignature(\r\n parameters,\r\n returnType,\r\n thisType,\r\n false,\r\n tn.range(signatureStart, tn.pos)\r\n );\r\n\r\n var body: Statement | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n if (flags & CommonFlags.AMBIENT) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n\r\n body = this.parseBlockStatement(tn, false);\r\n if (!body) return null;\r\n } else if (!(flags & CommonFlags.AMBIENT)) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n tn.range(tn.pos)\r\n );\r\n }\r\n\r\n var ret = Node.createFunctionDeclaration(\r\n name,\r\n typeParameters,\r\n signature,\r\n body,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseFunctionExpression(tn: Tokenizer): FunctionExpression | null {\r\n var startPos = tn.tokenPos;\r\n var name: IdentifierExpression;\r\n var isArrow = false;\r\n\r\n // either at 'function':\r\n // Identifier?\r\n // '(' Parameters (':' Type)?\r\n // Statement\r\n\r\n if (tn.token == Token.FUNCTION) {\r\n if (tn.skipIdentifier()) {\r\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else { // empty name\r\n name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\r\n }\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"(\"\r\n );\r\n return null;\r\n }\r\n\r\n // or at '(' of arrow function:\r\n // Parameters (':' Type)?\r\n // Statement\r\n\r\n } else {\r\n isArrow = true;\r\n assert(tn.token == Token.OPENPAREN);\r\n name = Node.createEmptyIdentifierExpression(tn.range(tn.tokenPos));\r\n }\r\n\r\n // TODO: type parameters? doesn't seem worth it.\r\n\r\n var signatureStart = tn.pos;\r\n var parameters = this.parseParameters(tn);\r\n if (!parameters) return null;\r\n\r\n return this.parseFunctionExpressionCommon(tn, name, parameters, isArrow, startPos, signatureStart);\r\n }\r\n\r\n private parseFunctionExpressionCommon(\r\n tn: Tokenizer,\r\n name: IdentifierExpression,\r\n parameters: ParameterNode[],\r\n isArrow: bool,\r\n startPos: i32 = -1,\r\n signatureStart: i32 = -1\r\n ): FunctionExpression | null {\r\n if (startPos < 0) startPos = name.range.start;\r\n if (signatureStart < 0) signatureStart = startPos;\r\n\r\n var returnType: CommonTypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n returnType = this.parseType(tn);\r\n if (!returnType) return null;\r\n } else {\r\n returnType = Node.createOmittedType(tn.range(tn.pos));\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n returnType.range\r\n ); // recoverable\r\n }\r\n\r\n if (isArrow) {\r\n if (!tn.skip(Token.EQUALS_GREATERTHAN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"=>\"\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n var signature = Node.createSignature(\r\n parameters,\r\n returnType,\r\n null, // TODO?\r\n false,\r\n tn.range(signatureStart, tn.pos)\r\n );\r\n\r\n var body: Statement | null;\r\n if (isArrow) {\r\n body = this.parseStatement(tn, false);\r\n } else {\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"{\"\r\n );\r\n return null;\r\n }\r\n body = this.parseBlockStatement(tn, false);\r\n }\r\n if (!body) return null;\r\n\r\n var declaration = Node.createFunctionDeclaration(\r\n name,\r\n null,\r\n signature,\r\n body,\r\n null,\r\n isArrow ? CommonFlags.ARROW : CommonFlags.NONE,\r\n tn.range(startPos, tn.pos)\r\n );\r\n return Node.createFunctionExpression(declaration);\r\n }\r\n\r\n parseClassOrInterface(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): ClassDeclaration | null {\r\n\r\n // at ('class' | 'interface'):\r\n // Identifier\r\n // ('<' TypeParameters)?\r\n // ('extends' Type)?\r\n // ('implements' Type (',' Type)*)?\r\n // '{' ClassMember* '}'\r\n\r\n var isInterface = tn.token == Token.INTERFACE;\r\n\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n\r\n var identifier = Node.createIdentifierExpression(\r\n tn.readIdentifier(),\r\n tn.range()\r\n );\r\n\r\n var typeParameters: TypeParameterNode[] | null = null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n flags |= CommonFlags.GENERIC;\r\n }\r\n\r\n var extendsType: TypeNode | null = null;\r\n if (tn.skip(Token.EXTENDS)) {\r\n let t = this.parseType(tn);\r\n if (!t) return null;\r\n if (t.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n t.range\r\n );\r\n return null;\r\n }\r\n extendsType = t;\r\n }\r\n\r\n var implementsTypes: TypeNode[] | null = null;\r\n if (tn.skip(Token.IMPLEMENTS)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode.Interface_declaration_cannot_have_implements_clause,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n do {\r\n let type = this.parseType(tn);\r\n if (!type) return null;\r\n if (!isInterface) {\r\n if (!implementsTypes) implementsTypes = [];\r\n implementsTypes.push(type);\r\n }\r\n } while (tn.skip(Token.COMMA));\r\n }\r\n\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n\r\n var members = new Array();\r\n var declaration: ClassDeclaration;\r\n if (isInterface) {\r\n assert(!implementsTypes);\r\n declaration = Node.createInterfaceDeclaration(\r\n identifier,\r\n typeParameters,\r\n extendsType,\r\n members,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n declaration = Node.createClassDeclaration(\r\n identifier,\r\n typeParameters,\r\n extendsType,\r\n implementsTypes,\r\n members,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n do {\r\n let member = this.parseClassMember(tn, declaration);\r\n if (member) members.push(member);\r\n } while (!tn.skip(Token.CLOSEBRACE));\r\n }\r\n return declaration;\r\n }\r\n\r\n parseClassExpression(tn: Tokenizer): ClassExpression | null {\r\n\r\n // at 'class': Identifier? '{' ... '}'\r\n\r\n var startPos = tn.tokenPos;\r\n var name: IdentifierExpression;\r\n\r\n if (tn.skipIdentifier()) {\r\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\r\n }\r\n\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(tn.pos), \"{\"\r\n );\r\n return null;\r\n }\r\n\r\n var members = new Array();\r\n var declaration = Node.createClassDeclaration(\r\n name,\r\n [],\r\n null,\r\n null,\r\n members,\r\n null,\r\n CommonFlags.NONE,\r\n tn.range(startPos, tn.pos)\r\n );\r\n if (!tn.skip(Token.CLOSEBRACE)) {\r\n do {\r\n let member = this.parseClassMember(tn, declaration);\r\n if (member) members.push(member);\r\n } while (!tn.skip(Token.CLOSEBRACE));\r\n }\r\n return Node.createClassExpression(declaration);\r\n }\r\n\r\n parseClassMember(\r\n tn: Tokenizer,\r\n parent: ClassDeclaration\r\n ): DeclarationStatement | null {\r\n\r\n // before:\r\n // ('public' | 'private' | 'protected')?\r\n // ('static' | 'abstract')?\r\n // 'readonly'?\r\n // ('get' | 'set')?\r\n // Identifier ...\r\n\r\n var startPos = tn.pos;\r\n var isInterface = parent.kind == NodeKind.INTERFACEDECLARATION;\r\n\r\n var decorators = new Array();\r\n if (tn.skip(Token.AT)) {\r\n do {\r\n let decorator = this.parseDecorator(tn);\r\n if (!decorator) break;\r\n decorators.push(decorator);\r\n } while (tn.skip(Token.AT));\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode.Decorators_are_not_valid_here,\r\n Range.join(decorators[0].range, decorators[decorators.length - 1].range)\r\n );\r\n }\r\n }\r\n\r\n // inherit ambient status\r\n var flags = parent.flags & CommonFlags.AMBIENT;\r\n\r\n // implemented methods are virtual\r\n if (isInterface) flags |= CommonFlags.VIRTUAL;\r\n\r\n var accessStart = 0;\r\n var accessEnd = 0;\r\n if (tn.skip(Token.PUBLIC)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"public\"\r\n );\r\n }\r\n flags |= CommonFlags.PUBLIC;\r\n accessStart = tn.tokenPos;\r\n accessEnd = tn.pos;\r\n } else if (tn.skip(Token.PRIVATE)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"private\"\r\n );\r\n }\r\n flags |= CommonFlags.PRIVATE;\r\n accessStart = tn.tokenPos;\r\n accessEnd = tn.pos;\r\n } else if (tn.skip(Token.PROTECTED)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"protected\"\r\n );\r\n }\r\n flags |= CommonFlags.PROTECTED;\r\n accessStart = tn.tokenPos;\r\n accessEnd = tn.pos;\r\n }\r\n\r\n var staticStart = 0;\r\n var staticEnd = 0;\r\n var abstractStart = 0;\r\n var abstractEnd = 0;\r\n if (tn.skip(Token.STATIC)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"static\"\r\n );\r\n }\r\n flags |= CommonFlags.STATIC;\r\n staticStart = tn.tokenPos;\r\n staticEnd = tn.pos;\r\n } else {\r\n flags |= CommonFlags.INSTANCE;\r\n if (tn.skip(Token.ABSTRACT)) {\r\n if (isInterface) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(), \"abstract\"\r\n );\r\n }\r\n flags |= CommonFlags.ABSTRACT;\r\n abstractStart = tn.tokenPos;\r\n abstractEnd = tn.pos;\r\n }\r\n if (parent.flags & CommonFlags.GENERIC) flags |= CommonFlags.GENERIC_CONTEXT;\r\n }\r\n\r\n var readonlyStart: i32 = 0;\r\n var readonlyEnd: i32 = 0;\r\n if (tn.skip(Token.READONLY)) {\r\n flags |= CommonFlags.READONLY;\r\n readonlyStart = tn.tokenPos;\r\n readonlyEnd = tn.pos;\r\n }\r\n\r\n // check if accessor: ('get' | 'set') ^\\n Identifier\r\n var state = tn.mark();\r\n var isConstructor = false;\r\n var isGetter = false;\r\n var getStart: i32 = 0;\r\n var getEnd: i32 = 0;\r\n var isSetter = false;\r\n var setStart: i32 = 0;\r\n var setEnd: i32 = 0;\r\n if (!isInterface) {\r\n if (tn.skip(Token.GET)) {\r\n if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n flags |= CommonFlags.GET;\r\n isGetter = true;\r\n setStart = tn.tokenPos;\r\n setEnd = tn.pos;\r\n if (flags & CommonFlags.READONLY) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n ); // recoverable\r\n }\r\n } else {\r\n tn.reset(state);\r\n }\r\n } else if (tn.skip(Token.SET)) {\r\n if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n flags |= CommonFlags.SET;\r\n isSetter = true;\r\n setStart = tn.tokenPos;\r\n setEnd = tn.pos;\r\n if (flags & CommonFlags.READONLY) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n ); // recoverable\r\n }\r\n } else {\r\n tn.reset(state);\r\n }\r\n } else if (tn.skip(Token.CONSTRUCTOR)) {\r\n flags |= CommonFlags.CONSTRUCTOR;\r\n isConstructor = true;\r\n if (flags & CommonFlags.STATIC) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(staticStart, staticEnd), \"static\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.ABSTRACT) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(abstractStart, abstractEnd), \"abstract\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.READONLY) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n ); // recoverable\r\n }\r\n }\r\n }\r\n\r\n var name: IdentifierExpression;\r\n if (isConstructor) {\r\n name = Node.createConstructorExpression(tn.range());\r\n } else {\r\n if (!(isGetter || isSetter) && tn.skip(Token.OPENBRACKET)) {\r\n // TODO: also handle symbols, which might have some of these modifiers\r\n if (flags & CommonFlags.PUBLIC) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(accessStart, accessEnd), \"public\"\r\n ); // recoverable\r\n } else if (flags & CommonFlags.PROTECTED) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(accessStart, accessEnd), \"protected\"\r\n ); // recoverable\r\n } else if (flags & CommonFlags.PRIVATE) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(accessStart, accessEnd), \"protected\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.STATIC) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(staticStart, staticEnd), \"static\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.ABSTRACT) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(abstractStart, abstractEnd), \"abstract\"\r\n ); // recoverable\r\n }\r\n if (flags & CommonFlags.READONLY) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\r\n ); // recoverable\r\n }\r\n let retIndex = this.parseIndexSignatureDeclaration(tn, decorators);\r\n if (!retIndex) return null;\r\n tn.skip(Token.SEMICOLON);\r\n return retIndex;\r\n }\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var typeParameters: TypeParameterNode[] | null = null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n let typeParametersStart = tn.tokenPos;\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n if (isConstructor) {\r\n this.error(\r\n DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,\r\n tn.range(typeParametersStart, tn.pos)\r\n ); // recoverable\r\n } else if (isGetter || isSetter) {\r\n this.error(\r\n DiagnosticCode.An_accessor_cannot_have_type_parameters,\r\n tn.range(typeParametersStart, tn.pos)\r\n ); // recoverable\r\n } else {\r\n flags |= CommonFlags.GENERIC;\r\n }\r\n }\r\n\r\n // method: '(' Parameters (':' Type)? '{' Statement* '}' ';'?\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let signatureStart = tn.tokenPos;\r\n let parameters = this.parseParameters(tn, isConstructor);\r\n if (!parameters) return null;\r\n let thisType = this.parseParametersThis;\r\n if (isConstructor) {\r\n for (let i = 0, k = parameters.length; i < k; ++i) {\r\n let parameter = parameters[i];\r\n if (parameter.isAny(\r\n CommonFlags.PUBLIC |\r\n CommonFlags.PROTECTED |\r\n CommonFlags.PRIVATE |\r\n CommonFlags.READONLY\r\n )) {\r\n let implicitFieldDeclaration = Node.createFieldDeclaration(\r\n parameter.name,\r\n parameter.type,\r\n null, // initialized via parameter\r\n null,\r\n parameter.flags | CommonFlags.INSTANCE,\r\n parameter.range\r\n );\r\n implicitFieldDeclaration.parameterIndex = i;\r\n parameter.implicitFieldDeclaration = implicitFieldDeclaration;\r\n parent.members.push(implicitFieldDeclaration);\r\n }\r\n }\r\n } else if (isGetter) {\r\n if (parameters.length) {\r\n this.error(\r\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\r\n name.range\r\n );\r\n }\r\n } else if (isSetter) {\r\n if (parameters.length != 1) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\r\n name.range\r\n );\r\n }\r\n if (parameters.length && parameters[0].initializer) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\r\n name.range\r\n );\r\n }\r\n }\r\n\r\n let returnType: CommonTypeNode | null = null;\r\n if (tn.skip(Token.COLON)) {\r\n if (name.kind == NodeKind.CONSTRUCTOR) {\r\n this.error(\r\n DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration,\r\n tn.range()\r\n );\r\n } else if (isSetter) {\r\n this.error(\r\n DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation,\r\n tn.range()\r\n );\r\n }\r\n returnType = this.parseType(tn, name.kind == NodeKind.CONSTRUCTOR || isSetter);\r\n if (!returnType) return null;\r\n } else {\r\n returnType = Node.createOmittedType(tn.range(tn.pos));\r\n if (!isSetter && name.kind != NodeKind.CONSTRUCTOR) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n returnType.range\r\n ); // recoverable\r\n }\r\n }\r\n\r\n let signature = Node.createSignature(\r\n parameters,\r\n returnType,\r\n thisType,\r\n false,\r\n tn.range(signatureStart, tn.pos)\r\n );\r\n\r\n let body: Statement | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n if (flags & CommonFlags.AMBIENT) {\r\n this.error(\r\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\r\n tn.range()\r\n ); // recoverable\r\n } else if (flags & CommonFlags.ABSTRACT) {\r\n this.error(\r\n DiagnosticCode.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract,\r\n tn.range(), name.text\r\n ); // recoverable\r\n }\r\n body = this.parseBlockStatement(tn, false);\r\n if (!body) return null;\r\n } else if (!(flags & CommonFlags.AMBIENT) && !isInterface) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n\r\n let retMethod = Node.createMethodDeclaration(\r\n name,\r\n typeParameters,\r\n signature,\r\n body,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return retMethod;\r\n\r\n } else if (isConstructor) {\r\n this.error(\r\n DiagnosticCode.Constructor_implementation_is_missing,\r\n name.range\r\n );\r\n\r\n } else if (isGetter || isSetter) {\r\n this.error(\r\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\r\n name.range\r\n );\r\n\r\n // field: (':' Type)? ('=' Expression)? ';'?\r\n } else {\r\n if (flags & CommonFlags.ABSTRACT) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(abstractStart, abstractEnd), \"abstract\"\r\n ); // recoverable\r\n }\r\n\r\n if (flags & CommonFlags.GET) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(getStart, getEnd), \"get\"\r\n ); // recoverable\r\n }\r\n\r\n if (flags & CommonFlags.SET) {\r\n this.error(\r\n DiagnosticCode._0_modifier_cannot_be_used_here,\r\n tn.range(setStart, setEnd), \"set\"\r\n ); // recoverable\r\n }\r\n\r\n let type: CommonTypeNode | null = null;\r\n if (tn.skip(Token.QUESTION)) {\r\n this.error(\r\n DiagnosticCode.Optional_properties_are_not_supported,\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n if (tn.skip(Token.EXCLAMATION)) {\r\n flags |= CommonFlags.DEFINITE_ASSIGNMENT;\r\n }\r\n if (tn.skip(Token.COLON)) {\r\n type = this.parseType(tn);\r\n if (!type) return null;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n let initializer: Expression | null = null;\r\n if (tn.skip(Token.EQUALS)) {\r\n initializer = this.parseExpression(tn);\r\n if (!initializer) return null;\r\n }\r\n let range = tn.range(startPos, tn.pos);\r\n if ((flags & CommonFlags.DEFINITE_ASSIGNMENT) && ((flags & CommonFlags.STATIC) || isInterface || initializer)) {\r\n this.error(\r\n DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,\r\n range\r\n );\r\n }\r\n let retField = Node.createFieldDeclaration(\r\n name,\r\n type,\r\n initializer,\r\n decorators,\r\n flags,\r\n range\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return retField;\r\n }\r\n return null;\r\n }\r\n\r\n parseIndexSignatureDeclaration(tn: Tokenizer, decorators: DecoratorNode[]): IndexSignatureDeclaration | null {\r\n\r\n // at: '[': 'key' ':' Type ']' ':' Type\r\n\r\n if (decorators.length) {\r\n this.error(\r\n DiagnosticCode.Decorators_are_not_valid_here,\r\n Range.join(decorators[0].range, decorators[decorators.length - 1].range)\r\n ); // recoverable\r\n }\r\n\r\n var start = tn.tokenPos;\r\n if (tn.skipIdentifier()) {\r\n let id = tn.readIdentifier();\r\n if (id == \"key\") {\r\n if (tn.skip(Token.COLON)) {\r\n let keyType = this.parseType(tn);\r\n if (!keyType) return null;\r\n if (keyType.kind != NodeKind.TYPE) {\r\n this.error(\r\n DiagnosticCode.Type_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n if (tn.skip(Token.CLOSEBRACKET)) {\r\n if (tn.skip(Token.COLON)) {\r\n let valueType = this.parseType(tn);\r\n if (!valueType) return null;\r\n return Node.createIndexSignatureDeclaration(keyType, valueType, tn.range(start, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"key\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseNamespace(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): NamespaceDeclaration | null {\r\n\r\n // at 'namespace': Identifier '{' (Variable | Function)* '}'\r\n\r\n if (tn.skipIdentifier()) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(Token.OPENBRACE)) {\r\n let members = new Array();\r\n let ns = Node.createNamespaceDeclaration(\r\n identifier,\r\n members,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let member = this.parseTopLevelStatement(tn, ns);\r\n if (member) members.push(member);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ns;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExport(\r\n tn: Tokenizer,\r\n startPos: i32,\r\n isDeclare: bool\r\n ): ExportStatement | null {\r\n\r\n // at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?\r\n\r\n var path: StringLiteralExpression | null = null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n let members = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let member = this.parseExportMember(tn);\r\n if (!member) return null;\r\n members.push(member);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACE)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n if (tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n let ret = Node.createExportStatement(members, path, isDeclare, tn.range(startPos, tn.pos));\r\n let internalPath = ret.internalPath;\r\n if (internalPath !== null && !this.seenlog.has(internalPath)) {\r\n this.backlog.push(internalPath);\r\n this.seenlog.add(internalPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else if (tn.skip(Token.ASTERISK)) {\r\n if (tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n let ret = Node.createExportStatement(null, path, isDeclare, tn.range(startPos, tn.pos));\r\n let internalPath = assert(ret.internalPath);\r\n let source = tn.source;\r\n if (!source.exportPaths) source.exportPaths = new Set();\r\n source.exportPaths.add(internalPath);\r\n if (!this.seenlog.has(internalPath)) {\r\n this.backlog.push(internalPath);\r\n this.seenlog.add(internalPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"from\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExportMember(\r\n tn: Tokenizer\r\n ): ExportMember | null {\r\n\r\n // before: Identifier ('as' Identifier)?\r\n\r\n if (tn.skipIdentifier()) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let asIdentifier: IdentifierExpression | null = null;\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {\r\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n return Node.createExportMember(\r\n identifier,\r\n asIdentifier,\r\n asIdentifier\r\n ? Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseImport(\r\n tn: Tokenizer\r\n ): ImportStatement | null {\r\n\r\n // at 'import':\r\n // ('{' (ImportMember (',' ImportMember)* '}') | ('*' 'as' Identifier)?\r\n // 'from' StringLiteral ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var members: ImportDeclaration[] | null = null;\r\n var namespaceName: IdentifierExpression | null = null;\r\n var skipFrom = false;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n members = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let member = this.parseImportDeclaration(tn);\r\n if (!member) return null;\r\n members.push(member);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACE)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n } else if (tn.skip(Token.ASTERISK)) {\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skipIdentifier()) {\r\n namespaceName = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"as\"\r\n );\r\n return null;\r\n }\r\n } else {\r\n skipFrom = true;\r\n }\r\n\r\n if (skipFrom || tn.skip(Token.FROM)) {\r\n if (tn.skip(Token.STRINGLITERAL)) {\r\n let path = Node.createStringLiteralExpression(tn.readString(), tn.range());\r\n let ret: ImportStatement;\r\n if (namespaceName) {\r\n assert(!members);\r\n ret = Node.createImportStatementWithWildcard(namespaceName, path, tn.range(startPos, tn.pos));\r\n } else {\r\n ret = Node.createImportStatement(members, path, tn.range(startPos, tn.pos));\r\n }\r\n let internalPath = ret.internalPath;\r\n if (!this.seenlog.has(internalPath)) {\r\n this.backlog.push(internalPath);\r\n this.seenlog.add(internalPath);\r\n }\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.String_literal_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"from\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseImportDeclaration(\r\n tn: Tokenizer\r\n ): ImportDeclaration | null {\r\n\r\n // before: Identifier ('as' Identifier)?\r\n\r\n if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let asIdentifier: IdentifierExpression | null = null;\r\n if (tn.skip(Token.AS)) {\r\n if (tn.skipIdentifier()) {\r\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n }\r\n return Node.createImportDeclaration(\r\n identifier,\r\n asIdentifier,\r\n asIdentifier\r\n ? Range.join(identifier.range, asIdentifier.range)\r\n : identifier.range\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExportImport(\r\n tn: Tokenizer,\r\n startPos: i32\r\n ): ExportImportStatement | null {\r\n\r\n // at 'export' 'import': Identifier ('=' Identifier)? ';'?\r\n\r\n if (tn.skipIdentifier()) {\r\n let asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (tn.skip(Token.EQUALS)) {\r\n if (tn.skipIdentifier()) {\r\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let ret = Node.createExportImportStatement(identifier, asIdentifier, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseStatement(\r\n tn: Tokenizer,\r\n topLevel: bool = false\r\n ): Statement | null {\r\n\r\n // at previous token\r\n\r\n var state = tn.mark();\r\n var token = tn.next();\r\n var statement: Statement | null = null;\r\n switch (token) {\r\n case Token.BREAK: {\r\n statement = this.parseBreak(tn);\r\n break;\r\n }\r\n case Token.CONST: {\r\n statement = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\r\n break;\r\n }\r\n case Token.CONTINUE: {\r\n statement = this.parseContinue(tn);\r\n break;\r\n }\r\n case Token.DO: {\r\n statement = this.parseDoStatement(tn);\r\n break;\r\n }\r\n case Token.FOR: {\r\n statement = this.parseForStatement(tn);\r\n break;\r\n }\r\n case Token.IF: {\r\n statement = this.parseIfStatement(tn);\r\n break;\r\n }\r\n case Token.LET: {\r\n statement = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\r\n break;\r\n }\r\n case Token.VAR: {\r\n statement = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n break;\r\n }\r\n case Token.OPENBRACE: {\r\n statement = this.parseBlockStatement(tn, topLevel);\r\n break;\r\n }\r\n case Token.RETURN: {\r\n if (topLevel) {\r\n this.error(\r\n DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body,\r\n tn.range()\r\n ); // recoverable\r\n }\r\n statement = this.parseReturn(tn);\r\n break;\r\n }\r\n case Token.SEMICOLON: {\r\n return Node.createEmptyStatement(tn.range(tn.tokenPos));\r\n }\r\n case Token.SWITCH: {\r\n statement = this.parseSwitchStatement(tn);\r\n break;\r\n }\r\n case Token.THROW: {\r\n statement = this.parseThrowStatement(tn);\r\n break;\r\n }\r\n case Token.TRY: {\r\n statement = this.parseTryStatement(tn);\r\n break;\r\n }\r\n case Token.VOID: {\r\n statement = this.parseVoidStatement(tn);\r\n break;\r\n }\r\n case Token.WHILE: {\r\n statement = this.parseWhileStatement(tn);\r\n break;\r\n }\r\n case Token.TYPE: { // also identifier\r\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\r\n statement = this.parseTypeDeclaration(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: {\r\n tn.reset(state);\r\n statement = this.parseExpressionStatement(tn);\r\n break;\r\n }\r\n }\r\n if (!statement) { // has been reported\r\n tn.reset(state);\r\n this.skipStatement(tn);\r\n } else {\r\n tn.discard(state);\r\n }\r\n return statement;\r\n }\r\n\r\n parseBlockStatement(\r\n tn: Tokenizer,\r\n topLevel: bool\r\n ): BlockStatement | null {\r\n\r\n // at '{': Statement* '}' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var statements = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let state = tn.mark();\r\n let statement = this.parseStatement(tn, topLevel);\r\n if (!statement) {\r\n if (tn.token == Token.ENDOFFILE) return null;\r\n tn.reset(state);\r\n this.skipStatement(tn);\r\n } else {\r\n tn.discard(state);\r\n statements.push(statement);\r\n }\r\n }\r\n var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseBreak(\r\n tn: Tokenizer\r\n ): BreakStatement | null {\r\n\r\n // at 'break': Identifier? ';'?\r\n\r\n var identifier: IdentifierExpression | null = null;\r\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(IdentifierHandling.PREFER);\r\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = Node.createBreakStatement(identifier, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseContinue(\r\n tn: Tokenizer\r\n ): ContinueStatement | null {\r\n\r\n // at 'continue': Identifier? ';'?\r\n\r\n var identifier: IdentifierExpression | null = null;\r\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\r\n tn.next(IdentifierHandling.PREFER);\r\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n var ret = Node.createContinueStatement(identifier, tn.range());\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseDoStatement(\r\n tn: Tokenizer\r\n ): DoStatement | null {\r\n\r\n // at 'do': Statement 'while' '(' Expression ')' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n\r\n if (tn.skip(Token.WHILE)) {\r\n\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n let ret = Node.createDoStatement(statement, condition, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"while\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseExpressionStatement(\r\n tn: Tokenizer\r\n ): ExpressionStatement | null {\r\n\r\n // at previous token\r\n\r\n var expr = this.parseExpression(tn);\r\n if (!expr) return null;\r\n\r\n var ret = Node.createExpressionStatement(expr);\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseForStatement(\r\n tn: Tokenizer\r\n ): ForStatement | null {\r\n\r\n // at 'for': '(' Statement? Expression? ';' Expression? ')' Statement\r\n\r\n var startPos = tn.tokenPos;\r\n\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let initializer: Statement | null = null;\r\n\r\n if (tn.skip(Token.CONST)) {\r\n initializer = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\r\n } else if (tn.skip(Token.LET)) {\r\n initializer = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\r\n } else if (tn.skip(Token.VAR)) {\r\n initializer = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\r\n\r\n } else if (!tn.skip(Token.SEMICOLON)) {\r\n initializer = this.parseExpressionStatement(tn);\r\n if (!initializer) return null;\r\n }\r\n\r\n if (tn.token == Token.SEMICOLON) {\r\n let condition: ExpressionStatement | null = null;\r\n if (!tn.skip(Token.SEMICOLON)) {\r\n condition = this.parseExpressionStatement(tn);\r\n if (!condition) return null;\r\n }\r\n\r\n if (tn.token == Token.SEMICOLON) {\r\n let incrementor: Expression | null = null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n incrementor = this.parseExpression(tn);\r\n if (!incrementor) return null;\r\n\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n\r\n let statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n\r\n return Node.createForStatement(\r\n initializer,\r\n condition\r\n ? condition.expression\r\n : null,\r\n incrementor,\r\n statement,\r\n tn.range(startPos, tn.pos)\r\n );\r\n\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \";\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \";\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseIfStatement(\r\n tn: Tokenizer\r\n ): IfStatement | null {\r\n\r\n // at 'if': '(' Expression ')' Statement ('else' Statement)?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n let statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n let elseStatement: Statement | null = null;\r\n if (tn.skip(Token.ELSE)) {\r\n elseStatement = this.parseStatement(tn);\r\n if (!elseStatement) return null;\r\n }\r\n return Node.createIfStatement(\r\n condition,\r\n statement,\r\n elseStatement,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseSwitchStatement(\r\n tn: Tokenizer\r\n ): SwitchStatement | null {\r\n\r\n // at 'switch': '(' Expression ')' '{' SwitchCase* '}' ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let condition = this.parseExpression(tn);\r\n if (!condition) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n if (tn.skip(Token.OPENBRACE)) {\r\n let cases = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n let case_ = this.parseSwitchCase(tn);\r\n if (!case_) return null;\r\n cases.push(case_);\r\n }\r\n let ret = Node.createSwitchStatement(condition, cases, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseSwitchCase(\r\n tn: Tokenizer\r\n ): SwitchCase | null {\r\n\r\n var startPos = tn.tokenPos;\r\n var statements: Statement[],\r\n statement: Statement | null;\r\n\r\n // 'case' Expression ':' Statement*\r\n\r\n if (tn.skip(Token.CASE)) {\r\n let label = this.parseExpression(tn);\r\n if (!label) return null;\r\n if (tn.skip(Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n return Node.createSwitchCase(label, statements, tn.range(startPos, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n\r\n // 'default' ':' Statement*\r\n\r\n } else if (tn.skip(Token.DEFAULT)) {\r\n if (tn.skip(Token.COLON)) {\r\n statements = new Array();\r\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\r\n statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n statements.push(statement);\r\n }\r\n return Node.createSwitchCase(null, statements, tn.range(startPos, tn.pos));\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._case_or_default_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseThrowStatement(\r\n tn: Tokenizer\r\n ): ThrowStatement | null {\r\n\r\n // at 'throw': Expression ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var expression = this.parseExpression(tn);\r\n if (!expression) return null;\r\n var ret = Node.createThrowStatement(expression, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseTryStatement(\r\n tn: Tokenizer\r\n ): TryStatement | null {\r\n\r\n // at 'try':\r\n // '{' Statement* '}'\r\n // ('catch' '(' VariableMember ')' '{' Statement* '}')?\r\n // ('finally' '{' Statement* '}'? ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var stmt: Statement | null;\r\n if (tn.skip(Token.OPENBRACE)) {\r\n let statements = new Array();\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n statements.push(stmt);\r\n }\r\n let catchVariable: IdentifierExpression | null = null;\r\n let catchStatements: Statement[] | null = null;\r\n let finallyStatements: Statement[] | null = null;\r\n if (tn.skip(Token.CATCH)) {\r\n if (!tn.skip(Token.OPENPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skipIdentifier()) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n return null;\r\n }\r\n catchVariable = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n catchStatements = [];\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n catchStatements.push(stmt);\r\n }\r\n }\r\n if (tn.skip(Token.FINALLY)) {\r\n if (!tn.skip(Token.OPENBRACE)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n return null;\r\n }\r\n finallyStatements = [];\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n stmt = this.parseStatement(tn);\r\n if (!stmt) return null;\r\n finallyStatements.push(stmt);\r\n }\r\n }\r\n if (!(catchStatements || finallyStatements)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"catch\"\r\n );\r\n return null;\r\n }\r\n let ret = Node.createTryStatement(\r\n statements,\r\n catchVariable,\r\n catchStatements,\r\n finallyStatements,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"{\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseTypeDeclaration(\r\n tn: Tokenizer,\r\n flags: CommonFlags,\r\n decorators: DecoratorNode[] | null,\r\n startPos: i32\r\n ): TypeDeclaration | null {\r\n\r\n // at 'type': Identifier ('<' TypeParameters '>')? '=' Type ';'?\r\n\r\n if (tn.skipIdentifier()) {\r\n let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n let typeParameters: TypeParameterNode[] | null = null;\r\n if (tn.skip(Token.LESSTHAN)) {\r\n typeParameters = this.parseTypeParameters(tn);\r\n if (!typeParameters) return null;\r\n flags |= CommonFlags.GENERIC;\r\n }\r\n if (tn.skip(Token.EQUALS)) {\r\n let type = this.parseType(tn);\r\n if (!type) return null;\r\n let ret = Node.createTypeDeclaration(\r\n name,\r\n typeParameters,\r\n type,\r\n decorators,\r\n flags,\r\n tn.range(startPos, tn.pos)\r\n );\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"=\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n parseVoidStatement(\r\n tn: Tokenizer\r\n ): VoidStatement | null {\r\n\r\n // at 'void': Expression ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n var expression = this.parseExpression(tn, Precedence.GROUPING);\r\n if (!expression) return null;\r\n var ret = Node.createVoidStatement(expression, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n }\r\n\r\n parseWhileStatement(\r\n tn: Tokenizer\r\n ): WhileStatement | null {\r\n\r\n // at 'while': '(' Expression ')' Statement ';'?\r\n\r\n var startPos = tn.tokenPos;\r\n if (tn.skip(Token.OPENPAREN)) {\r\n let expression = this.parseExpression(tn);\r\n if (!expression) return null;\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n let statement = this.parseStatement(tn);\r\n if (!statement) return null;\r\n let ret = Node.createWhileStatement(expression, statement, tn.range(startPos, tn.pos));\r\n tn.skip(Token.SEMICOLON);\r\n return ret;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n }\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"(\"\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n // expressions\r\n // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing\r\n\r\n parseExpressionStart(\r\n tn: Tokenizer\r\n ): Expression | null {\r\n\r\n var token = tn.next(IdentifierHandling.PREFER);\r\n var startPos = tn.tokenPos;\r\n var precedence = determinePrecedenceStart(token);\r\n if (precedence != Precedence.NONE) {\r\n let operand: Expression | null;\r\n\r\n // TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)\r\n\r\n // NewExpression\r\n if (token == Token.NEW) {\r\n operand = this.parseExpression(tn, Precedence.CALL);\r\n if (!operand) return null;\r\n if (operand.kind == NodeKind.CALL) {\r\n return Node.createNewExpression(\r\n (operand).expression,\r\n (operand).typeArguments,\r\n (operand).arguments,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Operation_not_supported,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n } else {\r\n operand = this.parseExpression(tn, precedence);\r\n if (!operand) return null;\r\n }\r\n\r\n // UnaryPrefixExpression\r\n if (token == Token.PLUS_PLUS || token == Token.MINUS_MINUS) {\r\n if (\r\n operand.kind != NodeKind.IDENTIFIER &&\r\n operand.kind != NodeKind.ELEMENTACCESS &&\r\n operand.kind != NodeKind.PROPERTYACCESS\r\n ) {\r\n this.error(\r\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n operand.range\r\n );\r\n }\r\n }\r\n return Node.createUnaryPrefixExpression(token, operand, tn.range(startPos, tn.pos));\r\n }\r\n\r\n var expr: Expression | null = null;\r\n switch (token) {\r\n\r\n case Token.NULL: return Node.createNullExpression(tn.range());\r\n case Token.TRUE: return Node.createTrueExpression(tn.range());\r\n case Token.FALSE: return Node.createFalseExpression(tn.range());\r\n\r\n // ParenthesizedExpression\r\n // FunctionExpression\r\n case Token.OPENPAREN: {\r\n\r\n // determine whether this is a function expression\r\n if (tn.skip(Token.CLOSEPAREN)) { // must be a function expression (fast route)\r\n return this.parseFunctionExpressionCommon(\r\n tn,\r\n Node.createEmptyIdentifierExpression(tn.range(startPos)),\r\n [],\r\n true\r\n );\r\n }\r\n let state = tn.mark();\r\n let again = true;\r\n do {\r\n switch (tn.next(IdentifierHandling.PREFER)) {\r\n\r\n // function expression\r\n case Token.DOT_DOT_DOT: {\r\n tn.reset(state);\r\n return this.parseFunctionExpression(tn);\r\n }\r\n // can be both\r\n case Token.IDENTIFIER: {\r\n tn.readIdentifier();\r\n switch (tn.next()) {\r\n\r\n // if we got here, check for arrow\r\n case Token.CLOSEPAREN: {\r\n if (\r\n !tn.skip(Token.COLON) &&\r\n !tn.skip(Token.EQUALS_GREATERTHAN)\r\n ) {\r\n again = false;\r\n break;\r\n }\r\n // fall-through\r\n }\r\n // function expression\r\n case Token.COLON: { // type annotation\r\n tn.reset(state);\r\n return this.parseFunctionExpression(tn);\r\n }\r\n // optional parameter or parenthesized\r\n case Token.QUESTION: {\r\n if (\r\n tn.skip(Token.COLON) || // optional parameter with type\r\n tn.skip(Token.COMMA) || // optional parameter without type\r\n tn.skip(Token.CLOSEPAREN) // last optional parameter without type\r\n ) {\r\n tn.reset(state);\r\n return this.parseFunctionExpression(tn);\r\n }\r\n again = false; // parenthesized\r\n break;\r\n }\r\n case Token.COMMA: {\r\n break; // continue\r\n }\r\n // parenthesized expression\r\n // case Token.EQUALS: // missing type annotation for simplicity\r\n default: {\r\n again = false;\r\n break;\r\n }\r\n }\r\n break;\r\n }\r\n // parenthesized expression\r\n default: {\r\n again = false;\r\n break;\r\n }\r\n }\r\n } while (again);\r\n tn.reset(state);\r\n\r\n // parse parenthesized\r\n expr = this.parseExpression(tn);\r\n if (!expr) return null;\r\n if (!tn.skip(Token.CLOSEPAREN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n return Node.createParenthesizedExpression(expr, tn.range(startPos, tn.pos));\r\n }\r\n // ArrayLiteralExpression\r\n case Token.OPENBRACKET: {\r\n let elementExpressions = new Array();\r\n while (!tn.skip(Token.CLOSEBRACKET)) {\r\n if (tn.peek() == Token.COMMA) {\r\n expr = null; // omitted\r\n } else {\r\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n }\r\n elementExpressions.push(expr);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACKET)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n return Node.createArrayLiteralExpression(elementExpressions, tn.range(startPos, tn.pos));\r\n }\r\n // ObjectLiteralExpression\r\n case Token.OPENBRACE: {\r\n let startPos = tn.tokenPos;\r\n let names = new Array();\r\n let values = new Array();\r\n let name: IdentifierExpression;\r\n while (!tn.skip(Token.CLOSEBRACE)) {\r\n if (!tn.skipIdentifier()) {\r\n if (!tn.skip(Token.STRINGLITERAL)) {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n tn.range(),\r\n );\r\n return null;\r\n }\r\n name = Node.createIdentifierExpression(tn.readString(), tn.range());\r\n name.isQuoted = true;\r\n } else {\r\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n }\r\n names.push(name);\r\n if (tn.skip(Token.COLON)) {\r\n let value = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!value) return null;\r\n values.push(value);\r\n } else if (!name.isQuoted) {\r\n values.push(name);\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n return null;\r\n }\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEBRACE)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n return Node.createObjectLiteralExpression(names, values, tn.range(startPos, tn.pos));\r\n }\r\n // AssertionExpression (unary prefix)\r\n case Token.LESSTHAN: {\r\n let toType = this.parseType(tn);\r\n if (!toType) return null;\r\n if (!tn.skip(Token.GREATERTHAN)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \">\"\r\n );\r\n return null;\r\n }\r\n expr = this.parseExpression(tn, Precedence.CALL);\r\n if (!expr) return null;\r\n return Node.createAssertionExpression(\r\n AssertionKind.PREFIX,\r\n expr,\r\n toType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n case Token.IDENTIFIER: {\r\n return Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));\r\n }\r\n case Token.THIS: {\r\n return Node.createThisExpression(tn.range(startPos, tn.pos));\r\n }\r\n case Token.CONSTRUCTOR: {\r\n return Node.createConstructorExpression(tn.range(startPos, tn.pos));\r\n }\r\n case Token.SUPER: {\r\n if (tn.peek() != Token.DOT && tn.nextToken != Token.OPENPAREN) {\r\n this.error(\r\n DiagnosticCode._super_must_be_followed_by_an_argument_list_or_member_access,\r\n tn.range()\r\n );\r\n }\r\n return Node.createSuperExpression(tn.range(startPos, tn.pos));\r\n }\r\n case Token.STRINGLITERAL: {\r\n return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos));\r\n }\r\n case Token.INTEGERLITERAL: {\r\n return Node.createIntegerLiteralExpression(tn.readInteger(), tn.range(startPos, tn.pos));\r\n }\r\n case Token.FLOATLITERAL: {\r\n return Node.createFloatLiteralExpression(tn.readFloat(), tn.range(startPos, tn.pos));\r\n }\r\n // RegexpLiteralExpression\r\n // note that this also continues on invalid ones so the surrounding AST remains intact\r\n case Token.SLASH: {\r\n let regexpPattern = tn.readRegexpPattern(); // also reports\r\n if (!tn.skip(Token.SLASH)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"/\"\r\n );\r\n return null;\r\n }\r\n return Node.createRegexpLiteralExpression(\r\n regexpPattern,\r\n tn.readRegexpFlags(), // also reports\r\n tn.range(startPos, tn.pos)\r\n );\r\n }\r\n case Token.FUNCTION: {\r\n return this.parseFunctionExpression(tn);\r\n }\r\n case Token.CLASS: {\r\n return this.parseClassExpression(tn);\r\n }\r\n default: {\r\n if (token == Token.ENDOFFILE) {\r\n this.error(\r\n DiagnosticCode.Unexpected_end_of_text,\r\n tn.range(startPos)\r\n );\r\n } else {\r\n this.error(\r\n DiagnosticCode.Expression_expected,\r\n tn.range()\r\n );\r\n }\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n tryParseTypeArgumentsBeforeArguments(\r\n tn: Tokenizer\r\n ): CommonTypeNode[] | null {\r\n\r\n // at '<': Type (',' Type)* '>' '('\r\n\r\n var state = tn.mark();\r\n if (!tn.skip(Token.LESSTHAN)) return null;\r\n var typeArguments = new Array();\r\n do {\r\n if (tn.peek() === Token.GREATERTHAN) {\r\n break;\r\n }\r\n let type = this.parseType(tn, true, true);\r\n if (!type) {\r\n tn.reset(state);\r\n return null;\r\n }\r\n typeArguments.push(type);\r\n } while (tn.skip(Token.COMMA));\r\n if (tn.skip(Token.GREATERTHAN) && tn.skip(Token.OPENPAREN)) {\r\n return typeArguments;\r\n }\r\n tn.reset(state);\r\n return null;\r\n }\r\n\r\n parseArguments(\r\n tn: Tokenizer\r\n ): Expression[] | null {\r\n\r\n // at '(': (Expression (',' Expression)*)? ')'\r\n\r\n var args = new Array();\r\n while (!tn.skip(Token.CLOSEPAREN)) {\r\n let expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n args.push(expr);\r\n if (!tn.skip(Token.COMMA)) {\r\n if (tn.skip(Token.CLOSEPAREN)) {\r\n break;\r\n } else {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \")\"\r\n );\r\n return null;\r\n }\r\n }\r\n }\r\n return args;\r\n }\r\n\r\n parseExpression(\r\n tn: Tokenizer,\r\n precedence: Precedence = Precedence.COMMA\r\n ): Expression | null {\r\n assert(precedence != Precedence.NONE);\r\n\r\n var expr = this.parseExpressionStart(tn);\r\n if (!expr) return null;\r\n expr = this.maybeParseCallExpression(tn, expr); // simple call like on an Identifier\r\n\r\n var startPos = expr.range.start;\r\n var token: Token;\r\n var next: Expression | null = null;\r\n var nextPrecedence: Precedence;\r\n while (\r\n (nextPrecedence = determinePrecedence(token = tn.peek())) >= precedence\r\n ) { // precedence climbing\r\n tn.next();\r\n switch (token) {\r\n // AssertionExpression\r\n case Token.AS: {\r\n let toType = this.parseType(tn); // reports\r\n if (!toType) return null;\r\n expr = Node.createAssertionExpression(\r\n AssertionKind.AS,\r\n expr,\r\n toType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n case Token.EXCLAMATION: {\r\n expr = Node.createAssertionExpression(\r\n AssertionKind.NONNULL,\r\n expr,\r\n null,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // InstanceOfExpression\r\n case Token.INSTANCEOF: {\r\n let isType = this.parseType(tn); // reports\r\n if (!isType) return null;\r\n expr = Node.createInstanceOfExpression(\r\n expr,\r\n isType,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // ElementAccessExpression\r\n case Token.OPENBRACKET: {\r\n next = this.parseExpression(tn); // reports\r\n if (!next) return null;\r\n if (!tn.skip(Token.CLOSEBRACKET)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"]\"\r\n );\r\n return null;\r\n }\r\n expr = Node.createElementAccessExpression(\r\n expr,\r\n next,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // UnaryPostfixExpression\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS: {\r\n if (\r\n expr.kind != NodeKind.IDENTIFIER &&\r\n expr.kind != NodeKind.ELEMENTACCESS &&\r\n expr.kind != NodeKind.PROPERTYACCESS\r\n ) {\r\n this.error(\r\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\r\n expr.range\r\n );\r\n }\r\n expr = Node.createUnaryPostfixExpression(\r\n token,\r\n expr,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // TernaryExpression\r\n case Token.QUESTION: {\r\n let ifThen = this.parseExpression(tn);\r\n if (!ifThen) return null;\r\n if (!tn.skip(Token.COLON)) {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \":\"\r\n );\r\n return null;\r\n }\r\n let ifElse = this.parseExpression(tn, precedence > Precedence.COMMA\r\n ? Precedence.COMMA + 1\r\n : Precedence.COMMA\r\n );\r\n if (!ifElse) return null;\r\n expr = Node.createTernaryExpression(\r\n expr,\r\n ifThen,\r\n ifElse,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n // CommaExpression\r\n case Token.COMMA: {\r\n let commaExprs: Expression[] = [ expr ];\r\n do {\r\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\r\n if (!expr) return null;\r\n commaExprs.push(expr);\r\n } while (tn.skip(Token.COMMA));\r\n expr = Node.createCommaExpression(commaExprs, tn.range(startPos, tn.pos));\r\n break;\r\n }\r\n default: {\r\n\r\n // PropertyAccessExpression\r\n if (token == Token.DOT) {\r\n if (tn.skipIdentifier()) {\r\n next = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\r\n } else {\r\n next = this.parseExpression(tn,\r\n isRightAssociative(token)\r\n ? nextPrecedence\r\n : nextPrecedence + 1\r\n );\r\n if (!next) return null;\r\n }\r\n if (next.kind == NodeKind.IDENTIFIER) { // expr '.' Identifier\r\n expr = Node.createPropertyAccessExpression(\r\n expr,\r\n next,\r\n tn.range(startPos, tn.pos)\r\n );\r\n } else if (next.kind == NodeKind.CALL) { // expr '.' CallExpression\r\n expr = this.joinPropertyCall(tn, startPos, expr, next);\r\n if (!expr) return null;\r\n } else {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n next.range\r\n );\r\n return null;\r\n }\r\n\r\n // BinaryExpression\r\n } else {\r\n next = this.parseExpression(tn,\r\n isRightAssociative(token)\r\n ? nextPrecedence\r\n : nextPrecedence + 1\r\n );\r\n if (!next) return null;\r\n expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));\r\n }\r\n break;\r\n }\r\n }\r\n expr = this.maybeParseCallExpression(tn, expr); // compound call like on an ElementAccess\r\n }\r\n return expr;\r\n }\r\n\r\n private joinPropertyCall(\r\n tn: Tokenizer,\r\n startPos: i32,\r\n expr: Expression,\r\n call: CallExpression\r\n ): Expression | null {\r\n var callee = call.expression;\r\n switch (callee.kind) {\r\n case NodeKind.IDENTIFIER: { // join property access and use as call target\r\n call.expression = Node.createPropertyAccessExpression(\r\n expr,\r\n callee,\r\n tn.range(startPos, tn.pos)\r\n );\r\n break;\r\n }\r\n case NodeKind.CALL: { // join call target und wrap the original call around it\r\n let inner = this.joinPropertyCall(tn, startPos, expr, callee);\r\n if (!inner) return null;\r\n call.expression = inner;\r\n call.range = tn.range(startPos, tn.pos);\r\n break;\r\n }\r\n default: {\r\n this.error(\r\n DiagnosticCode.Identifier_expected,\r\n call.range\r\n );\r\n return null;\r\n }\r\n }\r\n return call;\r\n }\r\n\r\n private maybeParseCallExpression(\r\n tn: Tokenizer,\r\n expr: Expression\r\n ): Expression {\r\n if (nodeIsCallable(expr.kind)) {\r\n let typeArguments: CommonTypeNode[] | null = null;\r\n while (\r\n tn.skip(Token.OPENPAREN)\r\n ||\r\n nodeIsGenericCallable(expr.kind) && (typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null\r\n ) {\r\n let args = this.parseArguments(tn);\r\n if (!args) break;\r\n expr = Node.createCallExpression( // is again callable\r\n expr,\r\n typeArguments,\r\n args,\r\n tn.range(expr.range.start, tn.pos)\r\n );\r\n }\r\n }\r\n return expr;\r\n }\r\n\r\n /** Skips over a statement on errors in an attempt to reduce unnecessary diagnostic noise. */\r\n skipStatement(tn: Tokenizer): void {\r\n tn.peek(true);\r\n if (tn.nextTokenOnNewLine) tn.next(); // if reset() to the previous line\r\n do {\r\n let nextToken = tn.peek(true);\r\n if (\r\n nextToken == Token.ENDOFFILE || // next step should handle this\r\n nextToken == Token.SEMICOLON // end of the statement for sure\r\n ) {\r\n tn.next();\r\n break;\r\n }\r\n if (tn.nextTokenOnNewLine) break; // end of the statement maybe\r\n switch (tn.next()) {\r\n case Token.IDENTIFIER: {\r\n tn.readIdentifier();\r\n break;\r\n }\r\n case Token.STRINGLITERAL: {\r\n tn.readString();\r\n break;\r\n }\r\n case Token.INTEGERLITERAL: {\r\n tn.readInteger();\r\n break;\r\n }\r\n case Token.FLOATLITERAL: {\r\n tn.readFloat();\r\n break;\r\n }\r\n }\r\n } while (true);\r\n }\r\n\r\n /** Skips over a block on errors in an attempt to reduce unnecessary diagnostic noise. */\r\n skipBlock(tn: Tokenizer): void {\r\n // at '{': ... '}'\r\n var depth = 1;\r\n var again = true;\r\n do {\r\n switch (tn.next()) {\r\n case Token.ENDOFFILE: {\r\n this.error(\r\n DiagnosticCode._0_expected,\r\n tn.range(), \"}\"\r\n );\r\n again = false;\r\n break;\r\n }\r\n case Token.OPENBRACE: {\r\n ++depth;\r\n break;\r\n }\r\n case Token.CLOSEBRACE: {\r\n --depth;\r\n if (!depth) again = false;\r\n break;\r\n }\r\n case Token.IDENTIFIER: {\r\n tn.readIdentifier();\r\n break;\r\n }\r\n case Token.STRINGLITERAL: {\r\n tn.readString();\r\n break;\r\n }\r\n case Token.INTEGERLITERAL: {\r\n tn.readInteger();\r\n break;\r\n }\r\n case Token.FLOATLITERAL: {\r\n tn.readFloat();\r\n break;\r\n }\r\n }\r\n } while (again);\r\n }\r\n}\r\n\r\n/** Operator precedence from least to largest. */\r\nexport const enum Precedence {\r\n NONE,\r\n COMMA,\r\n SPREAD,\r\n YIELD,\r\n ASSIGNMENT,\r\n CONDITIONAL,\r\n LOGICAL_OR,\r\n LOGICAL_AND,\r\n BITWISE_OR,\r\n BITWISE_XOR,\r\n BITWISE_AND,\r\n EQUALITY,\r\n RELATIONAL,\r\n SHIFT,\r\n ADDITIVE,\r\n MULTIPLICATIVE,\r\n EXPONENTIATED,\r\n UNARY_PREFIX,\r\n UNARY_POSTFIX,\r\n CALL,\r\n MEMBERACCESS,\r\n GROUPING\r\n}\r\n\r\n/** Determines the precedence of a starting token. */\r\nfunction determinePrecedenceStart(kind: Token): Precedence {\r\n switch (kind) {\r\n case Token.DOT_DOT_DOT: return Precedence.SPREAD;\r\n case Token.YIELD: return Precedence.YIELD;\r\n case Token.EXCLAMATION:\r\n case Token.TILDE:\r\n case Token.PLUS:\r\n case Token.MINUS:\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS:\r\n case Token.TYPEOF:\r\n case Token.VOID:\r\n case Token.DELETE: return Precedence.UNARY_PREFIX;\r\n case Token.NEW: return Precedence.MEMBERACCESS;\r\n }\r\n return Precedence.NONE;\r\n}\r\n\r\n/** Determines the precende of a non-starting token. */\r\nfunction determinePrecedence(kind: Token): Precedence {\r\n switch (kind) {\r\n case Token.COMMA: return Precedence.COMMA;\r\n case Token.EQUALS:\r\n case Token.PLUS_EQUALS:\r\n case Token.MINUS_EQUALS:\r\n case Token.ASTERISK_ASTERISK_EQUALS:\r\n case Token.ASTERISK_EQUALS:\r\n case Token.SLASH_EQUALS:\r\n case Token.PERCENT_EQUALS:\r\n case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.AMPERSAND_EQUALS:\r\n case Token.CARET_EQUALS:\r\n case Token.BAR_EQUALS: return Precedence.ASSIGNMENT;\r\n case Token.QUESTION: return Precedence.CONDITIONAL;\r\n case Token.BAR_BAR: return Precedence.LOGICAL_OR;\r\n case Token.AMPERSAND_AMPERSAND: return Precedence.LOGICAL_AND;\r\n case Token.BAR: return Precedence.BITWISE_OR;\r\n case Token.CARET: return Precedence.BITWISE_XOR;\r\n case Token.AMPERSAND: return Precedence.BITWISE_AND;\r\n case Token.EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS:\r\n case Token.EQUALS_EQUALS_EQUALS:\r\n case Token.EXCLAMATION_EQUALS_EQUALS: return Precedence.EQUALITY;\r\n case Token.AS:\r\n case Token.IN:\r\n case Token.INSTANCEOF:\r\n case Token.LESSTHAN:\r\n case Token.GREATERTHAN:\r\n case Token.LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_EQUALS: return Precedence.RELATIONAL;\r\n case Token.LESSTHAN_LESSTHAN:\r\n case Token.GREATERTHAN_GREATERTHAN:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return Precedence.SHIFT;\r\n case Token.PLUS:\r\n case Token.MINUS: return Precedence.ADDITIVE;\r\n case Token.ASTERISK:\r\n case Token.SLASH:\r\n case Token.PERCENT: return Precedence.MULTIPLICATIVE;\r\n case Token.ASTERISK_ASTERISK: return Precedence.EXPONENTIATED;\r\n case Token.PLUS_PLUS:\r\n case Token.MINUS_MINUS: return Precedence.UNARY_POSTFIX;\r\n case Token.DOT:\r\n case Token.NEW:\r\n case Token.OPENBRACKET:\r\n case Token.EXCLAMATION: return Precedence.MEMBERACCESS;\r\n }\r\n return Precedence.NONE;\r\n}\r\n\r\n/** Determines whether a non-starting token is right associative. */\r\nfunction isRightAssociative(kind: Token): bool {\r\n switch (kind) {\r\n case Token.EQUALS:\r\n case Token.PLUS_EQUALS:\r\n case Token.MINUS_EQUALS:\r\n case Token.ASTERISK_ASTERISK_EQUALS:\r\n case Token.ASTERISK_EQUALS:\r\n case Token.SLASH_EQUALS:\r\n case Token.PERCENT_EQUALS:\r\n case Token.LESSTHAN_LESSTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\r\n case Token.AMPERSAND_EQUALS:\r\n case Token.CARET_EQUALS:\r\n case Token.BAR_EQUALS:\r\n case Token.QUESTION:\r\n case Token.ASTERISK_ASTERISK: return true;\r\n default: return false;\r\n }\r\n}\r\n","/**\r\n * JavaScript glue code.\r\n * @module glue/js\r\n * @preferred\r\n *//***/\r\n\r\n/// \r\n\r\nimport \"./binaryen\"; // must be first so portable can pick up the memory implementation\r\nimport \"../../../std/portable/index\";\r\nimport \"./float\";\r\nimport \"./i64\";\r\n\r\nimport { Module } from \"../../module\";\r\n\r\nModule.prototype.toText = function(this: Module) {\r\n return binaryen.wrapModule(this.ref).emitStackIR();\r\n};\r\n\r\nModule.prototype.toAsmjs = function(this: Module) {\r\n return binaryen.wrapModule(this.ref).emitAsmjs();\r\n};\r\n","// Copy Binaryen exports to global scope\r\n\r\nconst binaryen = global.Binaryen || require(\"binaryen\");\r\nglobal.binaryen = binaryen;\r\n\r\nfor (var key in binaryen) {\r\n if (key.startsWith(\"_Binaryen\") || key.startsWith(\"_Relooper\")) global[key] = binaryen[key];\r\n}\r\n\r\n// Utilize Binaryen's heap\r\n\r\nglobal.__memory_allocate = binaryen._malloc;\r\nglobal.__memory_free = binaryen._free;\r\nglobal.__memory_copy = binaryen._memmove;\r\nglobal.__store = function(ptr, val) { binaryen.HEAPU8[ptr] = val; };\r\nglobal.__load = function(ptr) { return binaryen.HEAPU8[ptr]; };\r\n","module.exports = __WEBPACK_EXTERNAL_MODULE__19__;","/** @module std/portable *//***/\r\n\r\nvar globalScope = typeof window !== \"undefined\" && window || typeof global !== \"undefined\" && global || self;\r\n\r\nglobalScope.ASC_TARGET = 0; // JS\r\nglobalScope.ASC_NO_ASSERT = false;\r\nglobalScope.ASC_MEMORY_BASE = 0;\r\nglobalScope.ASC_OPTIMIZE_LEVEL = 3;\r\nglobalScope.ASC_SHRINK_LEVEL = 0;\r\nglobalScope.ASC_FEATURE_MUTABLE_GLOBAL = false;\r\nglobalScope.ASC_FEATURE_SIGN_EXTENSION = false;\r\nglobalScope.ASC_FEATURE_BULK_MEMORY = false;\r\nglobalScope.ASC_FEATURE_SIMD = false;\r\nglobalScope.ASC_FEATURE_THREADS = false;\r\n\r\nvar F64 = new Float64Array(1);\r\nvar U64 = new Uint32Array(F64.buffer);\r\n\r\nObject.defineProperties(\r\n globalScope[\"i8\"] = function i8(value) { return value << 24 >> 24; }\r\n, {\r\n \"MIN_VALUE\": { value: -128, writable: false },\r\n \"MAX_VALUE\": { value: 127, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i16\"] = function i16(value) { return value << 16 >> 16; }\r\n, {\r\n \"MIN_VALUE\": { value: -32768, writable: false },\r\n \"MAX_VALUE\": { value: 32767, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"i32\"] = globalScope[\"isize\"] = function i32(value) { return value | 0; }\r\n, {\r\n \"MIN_VALUE\": { value: -2147483648, writable: false },\r\n \"MAX_VALUE\": { value: 2147483647, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u8\"] = function u8(value) { return value & 0xff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 255, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u16\"] = function u16(value) { return value & 0xffff; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 65535, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"u32\"] = globalScope[\"usize\"] = function u32(value) { return value >>> 0; }\r\n, {\r\n \"MIN_VALUE\": { value: 0, writable: false },\r\n \"MAX_VALUE\": { value: 4294967295, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"bool\"] = function bool(value) { return !!value; }\r\n, {\r\n \"MIN_VALUE\": { value: false, writable: false },\r\n \"MAX_VALUE\": { value: true, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f32\"] = function f32(value) { return Math.fround(value); }\r\n, {\r\n \"EPSILON\": { value: Math.fround(1.1920929e-07), writable: false },\r\n \"MIN_VALUE\": { value: Math.fround(1.4012985e-45), writable: false },\r\n \"MAX_VALUE\": { value: Math.fround(3.4028235e+38), writable: false },\r\n \"MIN_NORMAL_VALUE\": { value: Math.fround(1.17549435e-38), writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -16777215, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 16777215, writable: false }\r\n});\r\n\r\nObject.defineProperties(\r\n globalScope[\"f64\"] = function f64(value) { return +value; }\r\n, {\r\n \"EPSILON\": { value: 2.2204460492503131e-16, writable: false },\r\n \"MIN_VALUE\": { value: 5e-324, writable: false },\r\n \"MAX_VALUE\": { value: 1.7976931348623157e+308, writable: false },\r\n \"MIN_NORMAL_VALUE\": { value: 2.2250738585072014e-308 , writable: false },\r\n \"MIN_SAFE_INTEGER\": { value: -9007199254740991, writable: false },\r\n \"MAX_SAFE_INTEGER\": { value: 9007199254740991, writable: false }\r\n});\r\n\r\nglobalScope[\"clz\"] = Math.clz32;\r\n\r\nglobalScope[\"ctz\"] = function ctz(value) {\r\n var c = Math.clz32(value & -value);\r\n return value ? 31 - c : c;\r\n};\r\n\r\nglobalScope[\"popcnt\"] = function popcnt(value) {\r\n value -= value >>> 1 & 0x55555555;\r\n value = (value & 0x33333333) + (value >>> 2 & 0x33333333);\r\n return (((value + (value >>> 4)) & 0x0F0F0F0F) * 0x01010101) >>> 24;\r\n};\r\n\r\nglobalScope[\"rotl\"] = function rotl(value, shift) {\r\n shift &= 31;\r\n return (value << shift) | (value >>> (32 - shift));\r\n};\r\n\r\nglobalScope[\"rotr\"] = function rotr(value, shift) {\r\n shift &= 31;\r\n return (value >>> shift) | (value << (32 - shift));\r\n};\r\n\r\nglobalScope[\"abs\"] = Math.abs;\r\n\r\nglobalScope[\"max\"] = Math.max;\r\n\r\nglobalScope[\"min\"] = Math.min;\r\n\r\nglobalScope[\"ceil\"] = Math.ceil;\r\n\r\nglobalScope[\"floor\"] = Math.floor;\r\n\r\n// Adopt code from https://github.com/rfk/wasm-polyfill\r\nglobalScope[\"nearest\"] = function nearest(value) {\r\n if (Math.abs(value - Math.trunc(value)) === 0.5) {\r\n return 2.0 * Math.round(value * 0.5);\r\n }\r\n return Math.round(value);\r\n};\r\n\r\nglobalScope[\"select\"] = function select(ifTrue, ifFalse, condition) {\r\n return condition ? ifTrue : ifFalse;\r\n};\r\n\r\nglobalScope[\"sqrt\"] = Math.sqrt;\r\n\r\nglobalScope[\"trunc\"] = Math.trunc;\r\n\r\nglobalScope[\"copysign\"] = function copysign(x, y) {\r\n return Math.abs(x) * Math.sign(y);\r\n};\r\n\r\nglobalScope[\"bswap\"] = function bswap(value) {\r\n var a = value >> 8 & 0x00FF00FF;\r\n var b = (value & 0x00FF00FF) << 8;\r\n value = a | b;\r\n a = value >> 16 & 0x0000FFFF;\r\n b = (value & 0x0000FFFF) << 16;\r\n return a | b;\r\n};\r\n\r\nglobalScope[\"bswap16\"] = function bswap16(value) {\r\n return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);\r\n};\r\n\r\nfunction UnreachableError() {\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, UnreachableError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nUnreachableError.prototype = Object.create(Error.prototype);\r\nUnreachableError.prototype.name = \"UnreachableError\";\r\nUnreachableError.prototype.message = \"unreachable\";\r\n\r\nglobalScope[\"unreachable\"] = function unreachable() {\r\n throw new UnreachableError();\r\n};\r\n\r\nfunction AssertionError(message) {\r\n this.message = message || \"assertion failed\";\r\n if (Error.captureStackTrace) {\r\n Error.captureStackTrace(this, AssertionError);\r\n } else {\r\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\r\n }\r\n}\r\nAssertionError.prototype = Object.create(Error.prototype);\r\nAssertionError.prototype.name = \"AssertionError\";\r\n\r\nglobalScope[\"assert\"] = function assert(isTrueish, message) {\r\n if (isTrueish) return isTrueish;\r\n throw new AssertionError(message);\r\n};\r\n\r\nglobalScope[\"changetype\"] = function changetype(value) {\r\n return value;\r\n};\r\n\r\nglobalScope[\"parseI32\"] = function parseI32(str, radix) {\r\n return parseInt(str, undefined) | 0;\r\n};\r\n\r\nString[\"fromCharCodes\"] = function fromCharCodes(arr) {\r\n return String.fromCharCode.apply(String, arr);\r\n};\r\n\r\nString[\"fromCodePoints\"] = function fromCodePoints(arr) {\r\n return String.fromCodePoint.apply(String, arr);\r\n};\r\n\r\nglobalScope[\"isInteger\"] = Number.isInteger;\r\n\r\nglobalScope[\"isFloat\"] = function isFloat(arg) {\r\n return typeof arg === \"number\";\r\n};\r\n\r\nglobalScope[\"isReference\"] = function isReference(arg) {\r\n return typeof arg === \"object\" || typeof arg === \"string\";\r\n};\r\n\r\nglobalScope[\"isString\"] = function isString(arg) {\r\n return typeof arg === \"string\" || arg instanceof String;\r\n};\r\n\r\nglobalScope[\"isArray\"] = Array.isArray;\r\n\r\nglobalScope[\"isDefined\"] = function isDefined(expr) {\r\n return typeof expr !== \"undefined\";\r\n}\r\n\r\nglobalScope[\"isConstant\"] = function isConstant(expr) {\r\n return false;\r\n};\r\n\r\nglobalScope[\"unchecked\"] = function unchecked(expr) {\r\n return expr;\r\n};\r\n\r\nglobalScope[\"fmod\"] = function fmod(x, y) {\r\n return x % y;\r\n};\r\n\r\nglobalScope[\"fmodf\"] = function fmodf(x, y) {\r\n return Math.fround(x % y);\r\n};\r\n\r\nglobalScope[\"JSMath\"] = Math;\r\nglobalScope[\"JSMath\"].signbit = function signbit(x) {\r\n F64[0] = x; return Boolean((U64[1] >>> 31) & (x == x));\r\n}\r\n\r\nglobalScope[\"memory\"] = (() => {\r\n var HEAP = new Uint8Array(0);\r\n var HEAP_OFFSET = 0;\r\n return {\r\n allocate: globalScope[\"__memory_allocate\"] || function allocate(size) {\r\n if (!(size >>>= 0)) return 0;\r\n if (HEAP_OFFSET + size > HEAP.length) {\r\n var oldHeap = HEAP;\r\n HEAP = new Uint8Array(Math.max(65536, HEAP.length + size, HEAP.length * 2));\r\n HEAP.set(oldHeap);\r\n }\r\n var ptr = HEAP_OFFSET;\r\n if ((HEAP_OFFSET += size) & 7) HEAP_OFFSET = (HEAP_OFFSET | 7) + 1;\r\n return ptr;\r\n },\r\n fill: globalScope[\"__memory_fill\"] || function fill(dest, value, size) {\r\n HEAP.fill(value, dest, dest + size);\r\n },\r\n free: globalScope[\"__memory_free\"] || function free(ptr) { },\r\n copy: globalScope[\"__memory_copy\"] || function copy(dest, src, size) {\r\n HEAP.copyWithin(dest, src, src + size);\r\n },\r\n reset: globalScope[\"__memory_reset\"] || function reset() {\r\n HEAP = new Uint8Array(0);\r\n HEAP_OFFSET = 0;\r\n }\r\n };\r\n})();\r\n\r\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\r\n HEAP[(ptr | 0) + (offset | 0)] = value;\r\n};\r\n\r\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\r\n return HEAP[(ptr | 0) + (offset | 0)];\r\n};\r\n","const F64 = new Float64Array(1);\r\nconst F32 = new Float32Array(F64.buffer);\r\nconst I32 = new Int32Array(F64.buffer);\r\n\r\nglobal.f32_as_i32 = function(value) {\r\n F32[0] = value;\r\n return I32[0];\r\n};\r\n\r\nglobal.i32_as_f32 = function(value) {\r\n I32[0] = value;\r\n return F32[0];\r\n};\r\n\r\nglobal.f64_as_i64 = function(value) {\r\n F64[0] = value;\r\n return i64_new(I32[0], I32[1]);\r\n};\r\n\r\nglobal.i64_as_f64 = function(value) {\r\n I32[0] = i64_low(value);\r\n I32[1] = i64_high(value);\r\n return F64[0];\r\n};\r\n","const Long = global.Long || require(\"long\");\r\n\r\nglobal.i64_zero = Long.ZERO;\r\n\r\nglobal.i64_one = Long.ONE;\r\n\r\nglobal.i64_new = function(lo, hi) {\r\n return Long.fromBits(lo, hi);\r\n};\r\n\r\nglobal.i64_low = function(value) {\r\n return value.low;\r\n};\r\n\r\nglobal.i64_high = function(value) {\r\n return value.high;\r\n};\r\n\r\nglobal.i64_add = function(left, right) {\r\n return left.add(right);\r\n};\r\n\r\nglobal.i64_sub = function(left, right) {\r\n return left.sub(right);\r\n};\r\n\r\nglobal.i64_mul = function(left, right) {\r\n return left.mul(right);\r\n};\r\n\r\nglobal.i64_div = function(left, right) {\r\n return left.div(right);\r\n};\r\n\r\nglobal.i64_div_u = function(left, right) {\r\n return left.toUnsigned().div(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_rem = function(left, right) {\r\n return left.mod(right);\r\n};\r\n\r\nglobal.i64_rem_u = function(left, right) {\r\n return left.toUnsigned().mod(right.toUnsigned()).toSigned();\r\n};\r\n\r\nglobal.i64_and = function(left, right) {\r\n return left.and(right);\r\n};\r\n\r\nglobal.i64_or = function(left, right) {\r\n return left.or(right);\r\n};\r\n\r\nglobal.i64_xor = function(left, right) {\r\n return left.xor(right);\r\n};\r\n\r\nglobal.i64_shl = function(left, right) {\r\n return left.shl(right);\r\n};\r\n\r\nglobal.i64_shr = function(left, right) {\r\n return left.shr(right);\r\n};\r\n\r\nglobal.i64_shr_u = function(left, right) {\r\n return left.shru(right);\r\n};\r\n\r\nglobal.i64_not = function(value) {\r\n return value.not();\r\n};\r\n\r\nglobal.i64_eq = function(left, right) {\r\n return left.eq(right);\r\n};\r\n\r\nglobal.i64_ne = function(left, right) {\r\n return left.ne(right);\r\n};\r\n\r\nglobal.i64_align = function(value, alignment) {\r\n assert(alignment && (alignment & (alignment - 1)) == 0);\r\n var mask = Long.fromInt(alignment - 1);\r\n return value.add(mask).and(mask.not());\r\n};\r\n\r\nglobal.i64_is_i8 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i8.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i8.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i16 = function(value) {\r\n return value.high === 0 && (value.low >= 0 && value.low <= i16.MAX_VALUE)\r\n || value.high === -1 && (value.low >= i16.MIN_VALUE && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_i32 = function(value) {\r\n return (value.high === 0 && value.low >= 0)\r\n || (value.high === -1 && value.low < 0);\r\n};\r\n\r\nglobal.i64_is_u8 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u8.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u16 = function(value) {\r\n return value.high === 0 && value.low >= 0 && value.low <= u16.MAX_VALUE;\r\n};\r\n\r\nglobal.i64_is_u32 = function(value) {\r\n return value.high === 0;\r\n};\r\n\r\nglobal.i64_is_bool = function(value) {\r\n return value.high === 0 && (value.low === 0 || value.low === 1);\r\n};\r\n\r\nconst minSafeF32 = Long.fromNumber(f32.MIN_SAFE_INTEGER);\r\nconst maxSafeF32 = Long.fromNumber(f32.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f32 = function(value) {\r\n return value.gte(minSafeF32) && value.lte(maxSafeF32);\r\n};\r\n\r\nconst minSafeF64 = Long.fromNumber(f64.MIN_SAFE_INTEGER);\r\nconst maxSafeF64 = Long.fromNumber(f64.MAX_SAFE_INTEGER);\r\n\r\nglobal.i64_is_f64 = function(value) {\r\n return value.gte(minSafeF64) && value.lte(maxSafeF64);\r\n};\r\n\r\nglobal.i64_to_f32 = function(value) {\r\n return global.Math.fround(value.toNumber());\r\n};\r\n\r\nglobal.i64_to_f64 = function(value) {\r\n return value.toNumber();\r\n};\r\n\r\nglobal.i64_to_string = function(value, unsigned) {\r\n return (unsigned ? value.toUnsigned() : value).toString(10);\r\n};\r\n","module.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n ])), {}).exports;\r\n} catch (e) {\r\n // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n * See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n /**\r\n * The low 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.low = low | 0;\r\n\r\n /**\r\n * The high 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.high = high | 0;\r\n\r\n /**\r\n * Whether unsigned or not.\r\n * @type {boolean}\r\n */\r\n this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations. For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative). Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n var obj, cachedObj, cache;\r\n if (unsigned) {\r\n value >>>= 0;\r\n if (cache = (0 <= value && value < 256)) {\r\n cachedObj = UINT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n if (cache)\r\n UINT_CACHE[value] = obj;\r\n return obj;\r\n } else {\r\n value |= 0;\r\n if (cache = (-128 <= value && value < 128)) {\r\n cachedObj = INT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n if (cache)\r\n INT_CACHE[value] = obj;\r\n return obj;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n if (isNaN(value))\r\n return unsigned ? UZERO : ZERO;\r\n if (unsigned) {\r\n if (value < 0)\r\n return UZERO;\r\n if (value >= TWO_PWR_64_DBL)\r\n return MAX_UNSIGNED_VALUE;\r\n } else {\r\n if (value <= -TWO_PWR_63_DBL)\r\n return MIN_VALUE;\r\n if (value + 1 >= TWO_PWR_63_DBL)\r\n return MAX_VALUE;\r\n }\r\n if (value < 0)\r\n return fromNumber(-value, unsigned).neg();\r\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n * assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n if (str.length === 0)\r\n throw Error('empty string');\r\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n return ZERO;\r\n if (typeof unsigned === 'number') {\r\n // For goog.math.long compatibility\r\n radix = unsigned,\r\n unsigned = false;\r\n } else {\r\n unsigned = !! unsigned;\r\n }\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n\r\n var p;\r\n if ((p = str.indexOf('-')) > 0)\r\n throw Error('interior hyphen');\r\n else if (p === 0) {\r\n return fromString(str.substring(1), unsigned, radix).neg();\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n var result = ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i),\r\n value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = fromNumber(pow_dbl(radix, size));\r\n result = result.mul(power).add(fromNumber(value));\r\n } else {\r\n result = result.mul(radixToPower);\r\n result = result.add(fromNumber(value));\r\n }\r\n }\r\n result.unsigned = unsigned;\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n if (typeof val === 'number')\r\n return fromNumber(val, unsigned);\r\n if (typeof val === 'string')\r\n return fromString(val, unsigned);\r\n // Throws for non-objects, converts non-instanceof Long:\r\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n if (this.unsigned)\r\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n if (this.isZero())\r\n return '0';\r\n if (this.isNegative()) { // Unsigned Longs are never negative\r\n if (this.eq(MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = fromNumber(radix),\r\n div = this.div(radixLong),\r\n rem1 = div.mul(radixLong).sub(this);\r\n return div.toString(radix) + rem1.toInt().toString(radix);\r\n } else\r\n return '-' + this.neg().toString(radix);\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower),\r\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n digits = intval.toString(radix);\r\n rem = remDiv;\r\n if (rem.isZero())\r\n return digits + result;\r\n else {\r\n while (digits.length < 6)\r\n digits = '0' + digits;\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n if (this.isNegative()) // Unsigned Longs are never negative\r\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n var val = this.high != 0 ? this.high : this.low;\r\n for (var bit = 31; bit > 0; bit--)\r\n if ((val & (1 << bit)) != 0)\r\n break;\r\n return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n return false;\r\n return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.eq(other))\r\n return 0;\r\n var thisNeg = this.isNegative(),\r\n otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg)\r\n return -1;\r\n if (!thisNeg && otherNeg)\r\n return 1;\r\n // At this point the sign bits are the same\r\n if (!this.unsigned)\r\n return this.sub(other).isNegative() ? -1 : 1;\r\n // Both are positive if at least one is unsigned\r\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n if (!this.unsigned && this.eq(MIN_VALUE))\r\n return MIN_VALUE;\r\n return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n if (!isLong(addend))\r\n addend = fromValue(addend);\r\n\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = addend.high >>> 16;\r\n var b32 = addend.high & 0xFFFF;\r\n var b16 = addend.low >>> 16;\r\n var b00 = addend.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n if (!isLong(subtrahend))\r\n subtrahend = fromValue(subtrahend);\r\n return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n if (this.isZero())\r\n return ZERO;\r\n if (!isLong(multiplier))\r\n multiplier = fromValue(multiplier);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = wasm.mul(this.low,\r\n this.high,\r\n multiplier.low,\r\n multiplier.high);\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (multiplier.isZero())\r\n return ZERO;\r\n if (this.eq(MIN_VALUE))\r\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n if (multiplier.eq(MIN_VALUE))\r\n return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n if (this.isNegative()) {\r\n if (multiplier.isNegative())\r\n return this.neg().mul(multiplier.neg());\r\n else\r\n return this.neg().mul(multiplier).neg();\r\n } else if (multiplier.isNegative())\r\n return this.mul(multiplier.neg()).neg();\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = multiplier.high >>> 16;\r\n var b32 = multiplier.high & 0xFFFF;\r\n var b16 = multiplier.low >>> 16;\r\n var b00 = multiplier.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n * unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n if (divisor.isZero())\r\n throw Error('division by zero');\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n // guard against signed division overflow: the largest\r\n // negative number / -1 would be 1 larger than the largest\r\n // positive number, due to two's complement.\r\n if (!this.unsigned &&\r\n this.high === -0x80000000 &&\r\n divisor.low === -1 && divisor.high === -1) {\r\n // be consistent with non-wasm code path\r\n return this;\r\n }\r\n var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (this.isZero())\r\n return this.unsigned ? UZERO : ZERO;\r\n var approx, rem, res;\r\n if (!this.unsigned) {\r\n // This section is only relevant for signed longs and is derived from the\r\n // closure library as a whole.\r\n if (this.eq(MIN_VALUE)) {\r\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n else if (divisor.eq(MIN_VALUE))\r\n return ONE;\r\n else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shr(1);\r\n approx = halfThis.div(divisor).shl(1);\r\n if (approx.eq(ZERO)) {\r\n return divisor.isNegative() ? ONE : NEG_ONE;\r\n } else {\r\n rem = this.sub(divisor.mul(approx));\r\n res = approx.add(rem.div(divisor));\r\n return res;\r\n }\r\n }\r\n } else if (divisor.eq(MIN_VALUE))\r\n return this.unsigned ? UZERO : ZERO;\r\n if (this.isNegative()) {\r\n if (divisor.isNegative())\r\n return this.neg().div(divisor.neg());\r\n return this.neg().div(divisor).neg();\r\n } else if (divisor.isNegative())\r\n return this.div(divisor.neg()).neg();\r\n res = ZERO;\r\n } else {\r\n // The algorithm below has not been made for unsigned longs. It's therefore\r\n // required to take special care of the MSB prior to running it.\r\n if (!divisor.unsigned)\r\n divisor = divisor.toUnsigned();\r\n if (divisor.gt(this))\r\n return UZERO;\r\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n return UONE;\r\n res = UZERO;\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n rem = this;\r\n while (rem.gte(divisor)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n approxRes = fromNumber(approx),\r\n approxRem = approxRes.mul(divisor);\r\n while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n approx -= delta;\r\n approxRes = fromNumber(approx, this.unsigned);\r\n approxRem = approxRes.mul(divisor);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero())\r\n approxRes = ONE;\r\n\r\n res = res.add(approxRes);\r\n rem = rem.sub(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n else\r\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n else\r\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n numBits &= 63;\r\n if (numBits === 0)\r\n return this;\r\n else {\r\n var high = this.high;\r\n if (numBits < 32) {\r\n var low = this.low;\r\n return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n } else if (numBits === 32)\r\n return fromBits(high, 0, this.unsigned);\r\n else\r\n return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n if (!this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n if (this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n lo & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo >>> 16 & 0xff,\r\n lo >>> 24 ,\r\n hi & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi >>> 16 & 0xff,\r\n hi >>> 24\r\n ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n hi >>> 24 ,\r\n hi >>> 16 & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi & 0xff,\r\n lo >>> 24 ,\r\n lo >>> 16 & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo & 0xff\r\n ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n return new Long(\r\n bytes[0] |\r\n bytes[1] << 8 |\r\n bytes[2] << 16 |\r\n bytes[3] << 24,\r\n bytes[4] |\r\n bytes[5] << 8 |\r\n bytes[6] << 16 |\r\n bytes[7] << 24,\r\n unsigned\r\n );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n return new Long(\r\n bytes[4] << 24 |\r\n bytes[5] << 16 |\r\n bytes[6] << 8 |\r\n bytes[7],\r\n bytes[0] << 24 |\r\n bytes[1] << 16 |\r\n bytes[2] << 8 |\r\n bytes[3],\r\n unsigned\r\n );\r\n};\r\n","/**\r\n * Built-in elements providing WebAssembly core functionality.\r\n * @module builtins\r\n *//***/\r\n\r\n import {\r\n Compiler,\r\n ConversionKind,\r\n WrapMode,\r\n Feature\r\n} from \"./compiler\";\r\n\r\nimport {\r\n DiagnosticCode\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Node,\r\n NodeKind,\r\n Expression,\r\n LiteralKind,\r\n LiteralExpression,\r\n StringLiteralExpression,\r\n CallExpression\r\n} from \"./ast\";\r\n\r\nimport {\r\n Type,\r\n TypeKind,\r\n TypeFlags\r\n} from \"./types\";\r\n\r\nimport {\r\n BinaryOp,\r\n UnaryOp,\r\n HostOp,\r\n NativeType,\r\n ExpressionRef,\r\n ExpressionId,\r\n getExpressionId,\r\n getExpressionType,\r\n getConstValueI64High,\r\n getConstValueI64Low,\r\n getConstValueI32,\r\n AtomicRMWOp\r\n} from \"./module\";\r\n\r\nimport {\r\n ElementKind,\r\n FunctionPrototype,\r\n Class,\r\n Field,\r\n Global,\r\n DecoratorFlags,\r\n ClassPrototype\r\n} from \"./program\";\r\n\r\nimport {\r\n FlowFlags\r\n} from \"./flow\";\r\n\r\nimport {\r\n ReportMode\r\n} from \"./resolver\";\r\n\r\nimport {\r\n CommonFlags, CommonSymbols\r\n} from \"./common\";\r\n\r\n/** Symbols of various compiler built-ins. */\r\nexport namespace BuiltinSymbols {\r\n // std/builtins.ts\r\n export const isInteger = \"~lib/builtins/isInteger\";\r\n export const isFloat = \"~lib/builtins/isFloat\";\r\n export const isSigned = \"~lib/builtins/isSigned\";\r\n export const isReference = \"~lib/builtins/isReference\";\r\n export const isString = \"~lib/builtins/isString\";\r\n export const isArray = \"~lib/builtins/isArray\";\r\n export const isDefined = \"~lib/builtins/isDefined\";\r\n export const isConstant = \"~lib/builtins/isConstant\";\r\n export const isManaged = \"~lib/builtins/isManaged\";\r\n export const clz = \"~lib/builtins/clz\";\r\n export const ctz = \"~lib/builtins/ctz\";\r\n export const popcnt = \"~lib/builtins/popcnt\";\r\n export const rotl = \"~lib/builtins/rotl\";\r\n export const rotr = \"~lib/builtins/rotr\";\r\n export const abs = \"~lib/builtins/abs\";\r\n export const max = \"~lib/builtins/max\";\r\n export const min = \"~lib/builtins/min\";\r\n export const ceil = \"~lib/builtins/ceil\";\r\n export const floor = \"~lib/builtins/floor\";\r\n export const copysign = \"~lib/builtins/copysign\";\r\n export const nearest = \"~lib/builtins/nearest\";\r\n export const reinterpret = \"~lib/builtins/reinterpret\";\r\n export const sqrt = \"~lib/builtins/sqrt\";\r\n export const trunc = \"~lib/builtins/trunc\";\r\n export const load = \"~lib/builtins/load\";\r\n export const store = \"~lib/builtins/store\";\r\n export const atomic_load = \"~lib/builtins/atomic.load\";\r\n export const atomic_store = \"~lib/builtins/atomic.store\";\r\n export const atomic_add = \"~lib/builtins/atomic.add\";\r\n export const atomic_sub = \"~lib/builtins/atomic.sub\";\r\n export const atomic_and = \"~lib/builtins/atomic.and\";\r\n export const atomic_or = \"~lib/builtins/atomic.or\";\r\n export const atomic_xor = \"~lib/builtins/atomic.xor\";\r\n export const atomic_xchg = \"~lib/builtins/atomic.xchg\";\r\n export const atomic_cmpxchg = \"~lib/builtins/atomic.cmpxchg\";\r\n export const atomic_wait = \"~lib/builtins/atomic.wait\";\r\n export const atomic_notify = \"~lib/builtins/atomic.notify\";\r\n export const sizeof = \"~lib/builtins/sizeof\";\r\n export const alignof = \"~lib/builtins/alignof\";\r\n export const offsetof = \"~lib/builtins/offsetof\";\r\n export const select = \"~lib/builtins/select\";\r\n export const unreachable = \"~lib/builtins/unreachable\";\r\n export const changetype = \"~lib/builtins/changetype\";\r\n export const assert = \"~lib/builtins/assert\";\r\n export const unchecked = \"~lib/builtins/unchecked\";\r\n export const call_indirect = \"~lib/builtins/call_indirect\";\r\n export const instantiate = \"~lib/builtins/instantiate\";\r\n export const i8 = \"~lib/builtins/i8\";\r\n export const i16 = \"~lib/builtins/i16\";\r\n export const i32 = \"~lib/builtins/i32\";\r\n export const i64 = \"~lib/builtins/i64\";\r\n export const isize = \"~lib/builtins/isize\";\r\n export const u8 = \"~lib/builtins/u8\";\r\n export const u16 = \"~lib/builtins/u16\";\r\n export const u32 = \"~lib/builtins/u32\";\r\n export const u64 = \"~lib/builtins/u64\";\r\n export const usize = \"~lib/builtins/usize\";\r\n export const bool = \"~lib/builtins/bool\";\r\n export const f32 = \"~lib/builtins/f32\";\r\n export const f64 = \"~lib/builtins/f64\";\r\n export const v128 = \"~lib/builtins/v128\";\r\n export const void_ = \"~lib/builtins/void\";\r\n export const i32_clz = \"~lib/builtins/i32.clz\";\r\n export const i64_clz = \"~lib/builtins/i64.clz\";\r\n export const i32_ctz = \"~lib/builtins/i32.ctz\";\r\n export const i64_ctz = \"~lib/builtins/i64.ctz\";\r\n export const i32_popcnt = \"~lib/builtins/i32.popcnt\";\r\n export const i64_popcnt = \"~lib/builtins/i64.popcnt\";\r\n export const i32_rotl = \"~lib/builtins/i32.rotl\";\r\n export const i64_rotl = \"~lib/builtins/i64.rotl\";\r\n export const i32_rotr = \"~lib/builtins/i32.rotr\";\r\n export const i64_rotr = \"~lib/builtins/i64.rotr\";\r\n export const f32_abs = \"~lib/builtins/f32.abs\";\r\n export const f64_abs = \"~lib/builtins/f64.abs\";\r\n export const f32_max = \"~lib/builtins/f32.max\";\r\n export const f64_max = \"~lib/builtins/f64.max\";\r\n export const f32_min = \"~lib/builtins/f32.min\";\r\n export const f64_min = \"~lib/builtins/f64.min\";\r\n export const f32_ceil = \"~lib/builtins/f32.ceil\";\r\n export const f64_ceil = \"~lib/builtins/f64.ceil\";\r\n export const f32_floor = \"~lib/builtins/f32.floor\";\r\n export const f64_floor = \"~lib/builtins/f64.floor\";\r\n export const f32_copysign = \"~lib/builtins/f32.copysign\";\r\n export const f64_copysign = \"~lib/builtins/f64.copysign\";\r\n export const f32_nearest = \"~lib/builtins/f32.nearest\";\r\n export const f64_nearest = \"~lib/builtins/f64.nearest\";\r\n export const i32_reinterpret_f32 = \"~lib/builtins/i32.reinterpret_f32\";\r\n export const i64_reinterpret_f64 = \"~lib/builtins/i64.reinterpret_f64\";\r\n export const f32_reinterpret_i32 = \"~lib/builtins/f32.reinterpret_i32\";\r\n export const f64_reinterpret_i64 = \"~lib/builtins/f64.reinterpret_i64\";\r\n export const f32_sqrt = \"~lib/builtins/f32.sqrt\";\r\n export const f64_sqrt = \"~lib/builtins/f64.sqrt\";\r\n export const f32_trunc = \"~lib/builtins/f32.trunc\";\r\n export const f64_trunc = \"~lib/builtins/f64.trunc\";\r\n export const i32_load8_s = \"~lib/builtins/i32.load8_s\";\r\n export const i32_load8_u = \"~lib/builtins/i32.load8_u\";\r\n export const i32_load16_s = \"~lib/builtins/i32.load16_s\";\r\n export const i32_load16_u = \"~lib/builtins/i32.load16_u\";\r\n export const i32_load = \"~lib/builtins/i32.load\";\r\n export const i64_load8_s = \"~lib/builtins/i64.load8_s\";\r\n export const i64_load8_u = \"~lib/builtins/i64.load8_u\";\r\n export const i64_load16_s = \"~lib/builtins/i64.load16_s\";\r\n export const i64_load16_u = \"~lib/builtins/i64.load16_u\";\r\n export const i64_load32_s = \"~lib/builtins/i64.load32_s\";\r\n export const i64_load32_u = \"~lib/builtins/i64.load32_u\";\r\n export const i64_load = \"~lib/builtins/i64.load\";\r\n export const f32_load = \"~lib/builtins/f32.load\";\r\n export const f64_load = \"~lib/builtins/f64.load\";\r\n export const i32_store8 = \"~lib/builtins/i32.store8\";\r\n export const i32_store16 = \"~lib/builtins/i32.store16\";\r\n export const i32_store = \"~lib/builtins/i32.store\";\r\n export const i64_store8 = \"~lib/builtins/i64.store8\";\r\n export const i64_store16 = \"~lib/builtins/i64.store16\";\r\n export const i64_store32 = \"~lib/builtins/i64.store32\";\r\n export const i64_store = \"~lib/builtins/i64.store\";\r\n export const f32_store = \"~lib/builtins/f32.store\";\r\n export const f64_store = \"~lib/builtins/f64.store\";\r\n export const i32_atomic_load8_u = \"~lib/builtins/i32.atomic.load8_u\";\r\n export const i32_atomic_load16_u = \"~lib/builtins/i32.atomic.load16_u\";\r\n export const i32_atomic_load = \"~lib/builtins/i32.atomic.load\";\r\n export const i64_atomic_load8_u = \"~lib/builtins/i64.atomic.load8_u\";\r\n export const i64_atomic_load16_u = \"~lib/builtins/i64.atomic.load16_u\";\r\n export const i64_atomic_load32_u = \"~lib/builtins/i64.atomic.load32_u\";\r\n export const i64_atomic_load = \"~lib/builtins/i64.atomic.load\";\r\n export const i32_atomic_store8 = \"~lib/builtins/i32.atomic.store8\";\r\n export const i32_atomic_store16 = \"~lib/builtins/i32.atomic.store16\";\r\n export const i32_atomic_store = \"~lib/builtins/i32.atomic.store\";\r\n export const i64_atomic_store8 = \"~lib/builtins/i64.atomic.store8\";\r\n export const i64_atomic_store16 = \"~lib/builtins/i64.atomic.store16\";\r\n export const i64_atomic_store32 = \"~lib/builtins/i64.atomic.store32\";\r\n export const i64_atomic_store = \"~lib/builtins/i64.atomic.store\";\r\n export const i32_atomic_rmw8_u_add = \"~lib/builtins/i32.atomic.rmw8_u.add\";\r\n export const i32_atomic_rmw16_u_add = \"~lib/builtins/i32.atomic.rmw16_u.add\";\r\n export const i32_atomic_rmw_add = \"~lib/builtins/i32.atomic.rmw.add\";\r\n export const i64_atomic_rmw8_u_add = \"~lib/builtins/i64.atomic.rmw8_u.add\";\r\n export const i64_atomic_rmw16_u_add = \"~lib/builtins/i64.atomic.rmw16_u.add\";\r\n export const i64_atomic_rmw32_u_add = \"~lib/builtins/i64.atomic.rmw32_u.add\";\r\n export const i64_atomic_rmw_add = \"~lib/builtins/i64.atomic.rmw.add\";\r\n export const i32_atomic_rmw8_u_sub = \"~lib/builtins/i32.atomic.rmw8_u.sub\";\r\n export const i32_atomic_rmw16_u_sub = \"~lib/builtins/i32.atomic.rmw16_u.sub\";\r\n export const i32_atomic_rmw_sub = \"~lib/builtins/i32.atomic.rmw.sub\";\r\n export const i64_atomic_rmw8_u_sub = \"~lib/builtins/i64.atomic.rmw8_u.sub\";\r\n export const i64_atomic_rmw16_u_sub = \"~lib/builtins/i64.atomic.rmw16_u.sub\";\r\n export const i64_atomic_rmw32_u_sub = \"~lib/builtins/i64.atomic.rmw32_u.sub\";\r\n export const i64_atomic_rmw_sub = \"~lib/builtins/i64.atomic.rmw.sub\";\r\n export const i32_atomic_rmw8_u_and = \"~lib/builtins/i32.atomic.rmw8_u.and\";\r\n export const i32_atomic_rmw16_u_and = \"~lib/builtins/i32.atomic.rmw16_u.and\";\r\n export const i32_atomic_rmw_and = \"~lib/builtins/i32.atomic.rmw.and\";\r\n export const i64_atomic_rmw8_u_and = \"~lib/builtins/i64.atomic.rmw8_u.and\";\r\n export const i64_atomic_rmw16_u_and = \"~lib/builtins/i64.atomic.rmw16_u.and\";\r\n export const i64_atomic_rmw32_u_and = \"~lib/builtins/i64.atomic.rmw32_u.and\";\r\n export const i64_atomic_rmw_and = \"~lib/builtins/i64.atomic.rmw.and\";\r\n export const i32_atomic_rmw8_u_or = \"~lib/builtins/i32.atomic.rmw8_u.or\";\r\n export const i32_atomic_rmw16_u_or = \"~lib/builtins/i32.atomic.rmw16_u.or\";\r\n export const i32_atomic_rmw_or = \"~lib/builtins/i32.atomic.rmw.or\";\r\n export const i64_atomic_rmw8_u_or = \"~lib/builtins/i64.atomic.rmw8_u.or\";\r\n export const i64_atomic_rmw16_u_or = \"~lib/builtins/i64.atomic.rmw16_u.or\";\r\n export const i64_atomic_rmw32_u_or = \"~lib/builtins/i64.atomic.rmw32_u.or\";\r\n export const i64_atomic_rmw_or = \"~lib/builtins/i64.atomic.rmw.or\";\r\n export const i32_atomic_rmw8_u_xor = \"~lib/builtins/i32.atomic.rmw8_u.xor\";\r\n export const i32_atomic_rmw16_u_xor = \"~lib/builtins/i32.atomic.rmw16_u.xor\";\r\n export const i32_atomic_rmw_xor = \"~lib/builtins/i32.atomic.rmw.xor\";\r\n export const i64_atomic_rmw8_u_xor = \"~lib/builtins/i64.atomic.rmw8_u.xor\";\r\n export const i64_atomic_rmw16_u_xor = \"~lib/builtins/i64.atomic.rmw16_u.xor\";\r\n export const i64_atomic_rmw32_u_xor = \"~lib/builtins/i64.atomic.rmw32_u.xor\";\r\n export const i64_atomic_rmw_xor = \"~lib/builtins/i64.atomic.rmw.xor\";\r\n export const i32_atomic_rmw8_u_xchg = \"~lib/builtins/i32.atomic.rmw8_u.xchg\";\r\n export const i32_atomic_rmw16_u_xchg = \"~lib/builtins/i32.atomic.rmw16_u.xchg\";\r\n export const i32_atomic_rmw_xchg = \"~lib/builtins/i32.atomic.rmw.xchg\";\r\n export const i64_atomic_rmw8_u_xchg = \"~lib/builtins/i64.atomic.rmw8_u.xchg\";\r\n export const i64_atomic_rmw16_u_xchg = \"~lib/builtins/i64.atomic.rmw16_u.xchg\";\r\n export const i64_atomic_rmw32_u_xchg = \"~lib/builtins/i64.atomic.rmw32_u.xchg\";\r\n export const i64_atomic_rmw_xchg = \"~lib/builtins/i64.atomic.rmw.xchg\";\r\n export const i32_atomic_rmw8_u_cmpxchg = \"~lib/builtins/i32.atomic.rmw8_u.cmpxchg\";\r\n export const i32_atomic_rmw16_u_cmpxchg = \"~lib/builtins/i32.atomic.rmw16_u.cmpxchg\";\r\n export const i32_atomic_rmw_cmpxchg = \"~lib/builtins/i32.atomic.rmw.cmpxchg\";\r\n export const i64_atomic_rmw8_u_cmpxchg = \"~lib/builtins/i64.atomic.rmw8_u.cmpxchg\";\r\n export const i64_atomic_rmw16_u_cmpxchg = \"~lib/builtins/i64.atomic.rmw16_u.cmpxchg\";\r\n export const i64_atomic_rmw32_u_cmpxchg = \"~lib/builtins/i64.atomic.rmw32_u.cmpxchg\";\r\n export const i64_atomic_rmw_cmpxchg = \"~lib/builtins/i64.atomic.rmw.cmpxchg\";\r\n export const i32_wait = \"~lib/builtins/i32.wait\";\r\n export const i64_wait = \"~lib/builtins/i64.wait\";\r\n export const i32_notify = \"~lib/builtins/i32.notify\";\r\n export const i64_notify = \"~lib/builtins/i64.notify\";\r\n // std/diagnostics.ts\r\n export const ERROR = \"~lib/diagnostics/ERROR\";\r\n export const WARNING = \"~lib/diagnostics/WARNING\";\r\n export const INFO = \"~lib/diagnostics/INFO\";\r\n // std/memory.ts\r\n export const HEAP_BASE = \"~lib/memory/HEAP_BASE\";\r\n export const memory_size = \"~lib/memory/memory.size\";\r\n export const memory_grow = \"~lib/memory/memory.grow\";\r\n export const memory_copy = \"~lib/memory/memory.copy\";\r\n export const memory_fill = \"~lib/memory/memory.fill\";\r\n // std/gc.ts\r\n export const iterateRoots = \"~lib/gc/iterateRoots\";\r\n}\r\n\r\n/** Compiles a call to a built-in function. */\r\nexport function compileCall(\r\n compiler: Compiler,\r\n prototype: FunctionPrototype,\r\n typeArguments: Type[] | null,\r\n operands: Expression[],\r\n contextualType: Type,\r\n reportNode: CallExpression\r\n): ExpressionRef {\r\n var module = compiler.module;\r\n\r\n var arg0: ExpressionRef,\r\n arg1: ExpressionRef,\r\n arg2: ExpressionRef,\r\n ret: ExpressionRef;\r\n\r\n // NOTE that some implementations below make use of the select expression where straight-forward.\r\n // whether worth or not should probably be tested once it's known if/how embedders handle it.\r\n // search: createSelect\r\n\r\n switch (prototype.internalName) {\r\n\r\n // types\r\n\r\n case BuiltinSymbols.isInteger: { // isInteger() / isInteger(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n return type.is(TypeFlags.INTEGER) && !type.is(TypeFlags.REFERENCE)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case BuiltinSymbols.isFloat: { // isFloat() / isFloat(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n return type.is(TypeFlags.FLOAT)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case BuiltinSymbols.isSigned: { // isSigned() / isSigned(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n return type.is(TypeFlags.SIGNED)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case BuiltinSymbols.isReference: { // isReference() / isReference(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n return type.is(TypeFlags.REFERENCE)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n case BuiltinSymbols.isString: { // isString() / isString(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n let classType = type.classReference;\r\n if (classType) {\r\n let stringInstance = compiler.program.stringInstance;\r\n if (stringInstance && classType.isAssignableTo(stringInstance)) return module.createI32(1);\r\n }\r\n return module.createI32(0);\r\n }\r\n case BuiltinSymbols.isArray: { // isArray() / isArray(value: T) -> bool\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n let classReference = type.classReference;\r\n if (!classReference) return module.createI32(0);\r\n let classPrototype = classReference.prototype;\r\n return module.createI32(\r\n (classPrototype).extends(compiler.program.arrayPrototype)\r\n ? 1\r\n : 0\r\n );\r\n }\r\n case BuiltinSymbols.isDefined: { // isDefined(expression) -> bool\r\n compiler.currentType = Type.bool;\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n let element = compiler.resolver.resolveExpression(\r\n operands[0],\r\n compiler.currentFlow,\r\n Type.void,\r\n ReportMode.SWALLOW\r\n );\r\n return module.createI32(element ? 1 : 0);\r\n }\r\n case BuiltinSymbols.isConstant: { // isConstant(expression) -> bool\r\n compiler.currentType = Type.bool;\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n let expr = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n compiler.currentType = Type.bool;\r\n return module.createI32(getExpressionId(expr) == ExpressionId.Const ? 1 : 0);\r\n }\r\n case BuiltinSymbols.isManaged: { // isManaged() -> bool\r\n if (!compiler.program.hasGC) {\r\n compiler.currentType = Type.bool;\r\n return module.createI32(0);\r\n }\r\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\r\n compiler.currentType = Type.bool;\r\n if (!type) return module.createUnreachable();\r\n let classType = type.classReference;\r\n return classType !== null && !classType.hasDecorator(DecoratorFlags.UNMANAGED)\r\n ? module.createI32(1)\r\n : module.createI32(0);\r\n }\r\n\r\n // math\r\n\r\n case BuiltinSymbols.clz: { // clz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16: {\r\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\r\n break;\r\n }\r\n case TypeKind.BOOL: // usually overflows\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.ClzI64\r\n : UnaryOp.ClzI32,\r\n arg0\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createUnary(UnaryOp.ClzI64, arg0);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.ctz: { // ctz(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.NONE, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16: {\r\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\r\n break;\r\n }\r\n case TypeKind.BOOL: // usually overflows\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.CtzI64\r\n : UnaryOp.CtzI32,\r\n arg0\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createUnary(UnaryOp.CtzI64, arg0);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.popcnt: { // popcnt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16: {\r\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\r\n break;\r\n }\r\n case TypeKind.BOOL: // usually overflows\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.PopcntI64\r\n : UnaryOp.PopcntI32,\r\n arg0\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createUnary(UnaryOp.PopcntI64, arg0);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.rotl: { // rotl(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n ret = compiler.ensureSmallIntegerWrap(\r\n module.createBinary(BinaryOp.RotlI32, arg0, arg1),\r\n compiler.currentType\r\n );\r\n // fall-through\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createBinary(BinaryOp.RotlI32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.RotlI64\r\n : BinaryOp.RotlI32,\r\n arg0,\r\n arg1\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createBinary(BinaryOp.RotlI64, arg0, arg1);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret; // possibly overflows\r\n }\r\n case BuiltinSymbols.rotr: { // rotr(value: T, shift: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n ret = compiler.ensureSmallIntegerWrap(\r\n module.createBinary(BinaryOp.RotrI32, arg0, arg1),\r\n compiler.currentType\r\n );\r\n break;\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n ret = module.createBinary(BinaryOp.RotrI32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n ret = module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.RotrI64\r\n : BinaryOp.RotrI32,\r\n arg0,\r\n arg1\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createBinary(BinaryOp.RotrI64, arg0, arg1);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret; // possibly overflowws\r\n }\r\n case BuiltinSymbols.abs: { // abs(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n let flow = compiler.currentFlow;\r\n\r\n // possibly overflows, e.g. abs(-128) == 128\r\n let tempLocal1 = flow.getTempLocal(Type.i32, false);\r\n let tempLocalIndex2 = flow.getAndFreeTempLocal(Type.i32, false).index;\r\n let tempLocalIndex1 = tempLocal1.index;\r\n\r\n // (x + (x >> 31)) ^ (x >> 31)\r\n ret = module.createBinary(BinaryOp.XorI32,\r\n module.createBinary(BinaryOp.AddI32,\r\n module.createTeeLocal(\r\n tempLocalIndex2,\r\n module.createBinary(BinaryOp.ShrI32,\r\n module.createTeeLocal(tempLocalIndex1, arg0),\r\n module.createI32(31)\r\n )\r\n ),\r\n module.createGetLocal(tempLocalIndex1, NativeType.I32)\r\n ),\r\n module.createGetLocal(tempLocalIndex2, NativeType.I32)\r\n );\r\n\r\n flow.freeTempLocal(tempLocal1);\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n let options = compiler.options;\r\n let flow = compiler.currentFlow;\r\n let wasm64 = options.isWasm64;\r\n\r\n let tempLocal1 = flow.getTempLocal(options.usizeType, false);\r\n let tempLocalIndex2 = flow.getAndFreeTempLocal(options.usizeType, false).index;\r\n let tempLocalIndex1 = tempLocal1.index;\r\n\r\n ret = module.createBinary(wasm64 ? BinaryOp.XorI64 : BinaryOp.XorI32,\r\n module.createBinary(wasm64 ? BinaryOp.AddI64 : BinaryOp.AddI32,\r\n module.createTeeLocal(\r\n tempLocalIndex2,\r\n module.createBinary(wasm64 ? BinaryOp.ShrI64 : BinaryOp.ShrI32,\r\n module.createTeeLocal(tempLocalIndex1, arg0),\r\n wasm64 ? module.createI64(63) : module.createI32(31)\r\n )\r\n ),\r\n module.createGetLocal(tempLocalIndex1, options.nativeSizeType)\r\n ),\r\n module.createGetLocal(tempLocalIndex2, options.nativeSizeType)\r\n );\r\n\r\n flow.freeTempLocal(tempLocal1);\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n let flow = compiler.currentFlow;\r\n\r\n let tempLocal1 = flow.getTempLocal(Type.i64, false);\r\n let tempLocalIndex2 = flow.getAndFreeTempLocal(Type.i64, false).index;\r\n let tempLocalIndex1 = tempLocal1.index;\r\n\r\n // (x + (x >> 63)) ^ (x >> 63)\r\n ret = module.createBinary(BinaryOp.XorI64,\r\n module.createBinary(BinaryOp.AddI64,\r\n module.createTeeLocal(\r\n tempLocalIndex2,\r\n module.createBinary(BinaryOp.ShrI64,\r\n module.createTeeLocal(tempLocalIndex1, arg0),\r\n module.createI64(63)\r\n )\r\n ),\r\n module.createGetLocal(tempLocalIndex1, NativeType.I64)\r\n ),\r\n module.createGetLocal(tempLocalIndex2, NativeType.I64)\r\n );\r\n\r\n flow.freeTempLocal(tempLocal1);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.U64:\r\n case TypeKind.BOOL: {\r\n ret = arg0;\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.AbsF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.AbsF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n default: { // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.max: { // max(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n let tempLocal1 = flow.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg1, compiler.currentType)\r\n );\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n let tempLocal1 = flow.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg1, compiler.currentType)\r\n );\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtU32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtI64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.GtU64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.GtI64\r\n : BinaryOp.GtI32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.GtU64\r\n : BinaryOp.GtU32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createBinary(BinaryOp.MaxF32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createBinary(BinaryOp.MaxF64, arg0, arg1);\r\n break;\r\n }\r\n default: { // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.min: { // min(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.I32: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n let tempLocal1 = flow.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg1, compiler.currentType)\r\n );\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtI32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.U32:\r\n case TypeKind.BOOL: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n let tempLocal1 = flow.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg1, compiler.currentType)\r\n );\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtU32,\r\n module.createGetLocal(tempLocal0.index, NativeType.I32),\r\n module.createGetLocal(tempLocal1.index, NativeType.I32)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.I64: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtI64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.U64: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(BinaryOp.LtU64,\r\n module.createGetLocal(tempLocal0.index, NativeType.I64),\r\n module.createGetLocal(tempLocal1.index, NativeType.I64)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.ISIZE: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.LtI64\r\n : BinaryOp.LtI32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n let flow = compiler.currentFlow;\r\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\r\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n flow.freeTempLocal(tempLocal0);\r\n ret = module.createSelect(\r\n module.createTeeLocal(tempLocal0.index, arg0),\r\n module.createTeeLocal(tempLocal1.index, arg1),\r\n module.createBinary(\r\n compiler.options.isWasm64\r\n ? BinaryOp.LtU64\r\n : BinaryOp.LtU32,\r\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\r\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\r\n )\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createBinary(BinaryOp.MinF32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createBinary(BinaryOp.MinF64, arg0, arg1);\r\n break;\r\n }\r\n default: { // void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.ceil: { // ceil(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: { // any integer\r\n ret = arg0;\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.CeilF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.CeilF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.floor: { // floor(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: { // any integer\r\n ret = arg0;\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.FloorF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.FloorF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.copysign: { // copysign(left: T, right: T) -> T\r\n if (operands.length != 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n switch (compiler.currentType.kind) { // TODO: does an integer version make sense?\r\n case TypeKind.F32: {\r\n ret = module.createBinary(BinaryOp.CopysignF32, arg0, arg1);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createBinary(BinaryOp.CopysignF64, arg0, arg1);\r\n break;\r\n }\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.nearest: { // nearest(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: { // any integer\r\n ret = arg0;\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.NearestF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.NearestF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.reinterpret: { // reinterpret(value: *) -> T\r\n if (operands.length != 1) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n switch (typeArguments[0].kind) {\r\n case TypeKind.I32:\r\n case TypeKind.U32: {\r\n arg0 = compiler.compileExpression(operands[0], Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n ret = module.createUnary(UnaryOp.ReinterpretF32, arg0);\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n ret = module.createUnary(UnaryOp.ReinterpretF64, arg0);\r\n break;\r\n }\r\n case TypeKind.USIZE: {\r\n if (typeArguments[0].is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n // fall-through\r\n }\r\n case TypeKind.ISIZE: {\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.isWasm64\r\n ? Type.f64\r\n : Type.f32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n ret = module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.ReinterpretF64\r\n : UnaryOp.ReinterpretF32,\r\n arg0\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n ret = module.createUnary(UnaryOp.ReinterpretI32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n arg0 = compiler.compileExpression(operands[0], Type.i64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n ret = module.createUnary(UnaryOp.ReinterpretI64, arg0);\r\n break;\r\n }\r\n default: { // small integers and void\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return ret;\r\n }\r\n case BuiltinSymbols.sqrt: { // sqrt(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) { // TODO: integer versions (that return f64 or convert)?\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.SqrtF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.SqrtF64, arg0);\r\n break;\r\n }\r\n // case TypeKind.VOID:\r\n default: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.trunc: { // trunc(value: T) -> T\r\n if (operands.length != 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments && typeArguments.length) {\r\n compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\r\n }\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.USIZE: {\r\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n // fall-through\r\n }\r\n default: { // any integer\r\n ret = arg0;\r\n break;\r\n }\r\n // TODO: truncate to contextual type directly (if not void etc.)?\r\n case TypeKind.F32: {\r\n ret = module.createUnary(UnaryOp.TruncF32, arg0);\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createUnary(UnaryOp.TruncF64, arg0);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n // memory access\r\n\r\n case BuiltinSymbols.load: { // load(offset: usize, constantOffset?: usize) -> *\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n let offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return module.createLoad(\r\n typeArguments[0].byteSize,\r\n typeArguments[0].is(TypeFlags.SIGNED | TypeFlags.INTEGER),\r\n arg0,\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n contextualType.is(TypeFlags.INTEGER) &&\r\n contextualType.size > typeArguments[0].size\r\n ? (compiler.currentType = contextualType).toNativeType()\r\n : (compiler.currentType = typeArguments[0]).toNativeType(),\r\n offset\r\n );\r\n }\r\n case BuiltinSymbols.store: { // store(offset: usize, value: *, constantOffset?: usize) -> void\r\n compiler.currentType = Type.void;\r\n if (operands.length < 2 || operands.length > 3) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n let type: Type;\r\n if (\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n (\r\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\r\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n )\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[1]\r\n );\r\n type = typeArguments[0];\r\n } else {\r\n type = compiler.currentType;\r\n }\r\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = Type.void;\r\n return module.createStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\r\n }\r\n case BuiltinSymbols.atomic_load: { // load(offset: usize, constantOffset?: usize) -> *\r\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n let offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return module.createAtomicLoad(\r\n typeArguments[0].byteSize,\r\n arg0,\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n contextualType.is(TypeFlags.INTEGER) &&\r\n contextualType.size > typeArguments[0].size\r\n ? (compiler.currentType = contextualType).toNativeType()\r\n : (compiler.currentType = typeArguments[0]).toNativeType(),\r\n offset\r\n );\r\n }\r\n case BuiltinSymbols.atomic_store: { // store(offset: usize, value: *, constantOffset?: usize) -> void\r\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\r\n compiler.currentType = Type.void;\r\n if (operands.length < 2 || operands.length > 3) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n let type: Type;\r\n if (\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n (\r\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\r\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n )\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[1]\r\n );\r\n type = typeArguments[0];\r\n } else {\r\n type = compiler.currentType;\r\n }\r\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = Type.void;\r\n return module.createAtomicStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\r\n }\r\n case BuiltinSymbols.atomic_add: // add(ptr: usize, value: T, constantOffset?: usize): T;\r\n case BuiltinSymbols.atomic_sub: // sub(ptr: usize, value: T, constantOffset?: usize): T;\r\n case BuiltinSymbols.atomic_and: // and(ptr: usize, value: T, constantOffset?: usize): T;\r\n case BuiltinSymbols.atomic_or: // or(ptr: usize, value: T, constantOffset?: usize): T;\r\n case BuiltinSymbols.atomic_xor: // xor(ptr: usize, value: T, constantOffset?: usize): T;\r\n case BuiltinSymbols.atomic_xchg: // xchg(ptr: usize, value: T, constantOffset?: usize): T;\r\n {\r\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\r\n if (operands.length < 2 || operands.length > 3) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n\r\n let type: Type;\r\n if (\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n (\r\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\r\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n )\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[1]\r\n );\r\n type = typeArguments[0];\r\n } else {\r\n type = compiler.currentType;\r\n }\r\n\r\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n let RMWOp: AtomicRMWOp | null = null;\r\n switch (prototype.internalName) {\r\n case BuiltinSymbols.atomic_add: { RMWOp = AtomicRMWOp.Add; break; }\r\n case BuiltinSymbols.atomic_sub: { RMWOp = AtomicRMWOp.Sub; break; }\r\n case BuiltinSymbols.atomic_and: { RMWOp = AtomicRMWOp.And; break; }\r\n case BuiltinSymbols.atomic_or: { RMWOp = AtomicRMWOp.Or; break; }\r\n case BuiltinSymbols.atomic_xor: { RMWOp = AtomicRMWOp.Xor; break; }\r\n case BuiltinSymbols.atomic_xchg: { RMWOp = AtomicRMWOp.Xchg; break; }\r\n }\r\n compiler.currentType = typeArguments[0];\r\n if (RMWOp !== null) {\r\n return module.createAtomicRMW(\r\n RMWOp, typeArguments[0].byteSize, offset, arg0, arg1, type.toNativeType()\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n }\r\n case BuiltinSymbols.atomic_cmpxchg: { // cmpxchg(ptr: usize, expected: T, replacement: T, cOff?: usize): T\r\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\r\n if (operands.length < 3 || operands.length > 4) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n if (operands.length < 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n } else {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg2 = compiler.compileExpression(\r\n operands[2],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n\r\n let type: Type;\r\n if (\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n (\r\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\r\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n )\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[1]\r\n );\r\n arg2 = compiler.convertExpression(\r\n arg2,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[2]\r\n );\r\n type = typeArguments[0];\r\n } else {\r\n type = compiler.currentType;\r\n }\r\n\r\n let offset = operands.length == 4 ? evaluateConstantOffset(compiler, operands[3]) : 0; // reports\r\n if (offset < 0) { // reported in evaluateConstantOffset\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = typeArguments[0];\r\n return module.createAtomicCmpxchg(\r\n typeArguments[0].byteSize, offset, arg0, arg1, arg2, type.toNativeType()\r\n );\r\n }\r\n case BuiltinSymbols.atomic_wait: { // wait(ptr: usize, expected:T, timeout: i64): i32;\r\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\r\n let hasError = typeArguments == null;\r\n if (operands.length != 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n hasError = true;\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n hasError = true;\r\n }\r\n\r\n if (!typeArguments || hasError) {\r\n return module.createUnreachable();\r\n }\r\n\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n typeArguments[0],\r\n typeArguments[0].is(TypeFlags.INTEGER)\r\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\r\n : ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg2 = compiler.compileExpression(\r\n operands[2],\r\n Type.i64,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n\r\n let type: Type = typeArguments[0];\r\n if (\r\n typeArguments[0].is(TypeFlags.INTEGER) &&\r\n (\r\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\r\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\r\n )\r\n ) {\r\n arg1 = compiler.convertExpression(\r\n arg1,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[1]\r\n );\r\n arg2 = compiler.convertExpression(\r\n arg2,\r\n compiler.currentType, typeArguments[0],\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE, // still clears garbage bits\r\n operands[2]\r\n );\r\n }\r\n\r\n return module.createAtomicWait(\r\n arg0, arg1, arg2, type.toNativeType()\r\n );\r\n }\r\n case BuiltinSymbols.atomic_notify: { // notify(ptr: usize, count: u32): u32;\r\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\r\n let hasError = typeArguments == null;\r\n if (operands.length != 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n hasError = true;\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n hasError = true;\r\n }\r\n\r\n if (!typeArguments || hasError) {\r\n return module.createUnreachable();\r\n }\r\n\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n Type.i32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n\r\n return module.createAtomicWake(\r\n arg0, arg1\r\n );\r\n }\r\n case BuiltinSymbols.sizeof: { // sizeof() -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length != 0) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n let byteSize = (typeArguments)[0].byteSize;\r\n if (compiler.options.isWasm64) {\r\n // implicitly wrap if contextual type is a 32-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n compiler.currentType = Type.u32;\r\n ret = module.createI32(byteSize);\r\n } else {\r\n ret = module.createI64(byteSize, 0);\r\n }\r\n } else {\r\n // implicitly extend if contextual type is a 64-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n compiler.currentType = Type.u64;\r\n ret = module.createI64(byteSize, 0);\r\n } else {\r\n ret = module.createI32(byteSize);\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.alignof: { // alignof() -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length != 0) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n let byteSize = (typeArguments)[0].byteSize;\r\n let alignLog2: i32;\r\n switch (byteSize) {\r\n case 1: { alignLog2 = 0; break; }\r\n case 2: { alignLog2 = 1; break; }\r\n case 4: { alignLog2 = 2; break; }\r\n case 8: { alignLog2 = 3; break; }\r\n default: { assert(false, \"unexected byte size\"); return module.createUnreachable(); }\r\n }\r\n if (compiler.options.isWasm64) {\r\n // implicitly wrap if contextual type is a 32-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n compiler.currentType = Type.u32;\r\n ret = module.createI32(alignLog2);\r\n } else {\r\n ret = module.createI64(alignLog2, 0);\r\n }\r\n } else {\r\n // implicitly extend if contextual type is a 64-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n compiler.currentType = Type.u64;\r\n ret = module.createI64(alignLog2, 0);\r\n } else {\r\n ret = module.createI32(alignLog2);\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.offsetof: { // offsetof(fieldName?: string) -> usize\r\n compiler.currentType = compiler.options.usizeType;\r\n if (operands.length > 1) {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n let classType = typeArguments[0].classReference;\r\n if (!classType) {\r\n compiler.error( // TODO: better error\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n let offset: i32;\r\n if (operands.length) {\r\n if (\r\n operands[0].kind != NodeKind.LITERAL ||\r\n (operands[0]).literalKind != LiteralKind.STRING\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.String_literal_expected,\r\n operands[0].range\r\n );\r\n return module.createUnreachable();\r\n }\r\n let fieldName = (operands[0]).value;\r\n let field = classType.members ? classType.members.get(fieldName) : null;\r\n if (!(field && field.kind == ElementKind.FIELD)) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_has_no_property_1,\r\n operands[0].range, classType.internalName, fieldName\r\n );\r\n return module.createUnreachable();\r\n }\r\n offset = (field).memoryOffset;\r\n } else {\r\n offset = classType.currentMemoryOffset;\r\n }\r\n if (compiler.options.isWasm64) {\r\n // implicitly wrap if contextual type is a 32-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\r\n compiler.currentType = Type.u32;\r\n return module.createI32(offset);\r\n } else {\r\n return module.createI64(offset);\r\n }\r\n } else {\r\n // implicitly extend if contextual type is a 64-bit integer\r\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\r\n compiler.currentType = Type.u64;\r\n return module.createI64(offset);\r\n } else {\r\n return module.createI32(offset);\r\n }\r\n }\r\n }\r\n\r\n // control flow\r\n\r\n case BuiltinSymbols.select: { // select(ifTrue: T, ifFalse: T, condition: bool) -> T\r\n if (operands.length != 3) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n }\r\n let type = compiler.currentType;\r\n arg1 = compiler.compileExpression(operands[1], type, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n arg2 = compiler.makeIsTrueish(\r\n compiler.compileExpressionRetainType(operands[2], Type.bool, WrapMode.NONE),\r\n compiler.currentType\r\n );\r\n compiler.currentType = type;\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n ret = module.createSelect(arg0, arg1, arg2);\r\n break;\r\n }\r\n default: { // any other value type\r\n ret = module.createSelect(arg0, arg1, arg2);\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = module.createUnreachable();\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.unreachable: { // unreachable() -> *\r\n if (operands.length != 0) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n\r\n // host operations\r\n\r\n case BuiltinSymbols.memory_size: { // memory.size() -> i32\r\n compiler.currentType = Type.i32;\r\n if (operands.length != 0) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createHost(HostOp.CurrentMemory);\r\n }\r\n case BuiltinSymbols.memory_grow: { // memory.grow(pages: i32) -> i32\r\n compiler.currentType = Type.i32;\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"0\", operands.length.toString(10)\r\n );\r\n arg0 = module.createUnreachable();\r\n } else {\r\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return module.createHost(HostOp.GrowMemory, null, [ arg0 ]);\r\n }\r\n // see: https://github.com/WebAssembly/bulk-memory-operations\r\n case BuiltinSymbols.memory_copy: { // memory.copy(dest: usize, src: usize: n: usize) -> void\r\n if (!compiler.options.hasFeature(Feature.BULK_MEMORY)) {\r\n let instance = compiler.resolver.resolveFunction(prototype, null); // reports\r\n compiler.currentType = Type.void;\r\n if (!instance) return module.createUnreachable();\r\n return compiler.compileCallDirect(instance, operands, reportNode);\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n let usizeType = compiler.options.usizeType;\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg2 = compiler.compileExpression(\r\n operands[2],\r\n usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createMemoryCopy(arg0, arg1, arg2);\r\n }\r\n case BuiltinSymbols.memory_fill: { // memory.fill(dest: usize, value: u8, n: usize) -> void\r\n if (!compiler.options.hasFeature(Feature.BULK_MEMORY)) {\r\n let instance = compiler.resolver.resolveFunction(prototype, null); // reports\r\n compiler.currentType = Type.void;\r\n if (!instance) return module.createUnreachable();\r\n return compiler.compileCallDirect(instance, operands, reportNode);\r\n }\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 3) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"3\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n let usizeType = compiler.options.usizeType;\r\n arg0 = compiler.compileExpression(\r\n operands[0],\r\n usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg1 = compiler.compileExpression(\r\n operands[1],\r\n Type.u32,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n arg2 = compiler.compileExpression(\r\n operands[2],\r\n usizeType,\r\n ConversionKind.IMPLICIT,\r\n WrapMode.NONE\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createMemoryFill(arg0, arg1, arg2);\r\n }\r\n\r\n // other\r\n\r\n case BuiltinSymbols.changetype: { // changetype(value: *) -> T\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = typeArguments[0];\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpressionRetainType(\r\n operands[0],\r\n typeArguments[0],\r\n WrapMode.NONE\r\n );\r\n compiler.currentType = typeArguments[0];\r\n if (compiler.currentType.size != typeArguments[0].size) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n // if (reportNode.range.source.sourceKind != SourceKind.STDLIB)\r\n // compiler.warning(DiagnosticCode.Operation_is_unsafe, reportNode.range);\r\n return arg0; // any usize to any usize\r\n }\r\n case BuiltinSymbols.assert: { // assert(isTrueish: T, message?: string) -> T with T != null\r\n if (operands.length < 1 || operands.length > 2) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n if (operands.length < 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n } else if (operands.length > 2) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"2\", operands.length.toString(10)\r\n );\r\n }\r\n return module.createUnreachable();\r\n }\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\r\n } else {\r\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.bool, WrapMode.WRAP);\r\n }\r\n\r\n let type = compiler.currentType;\r\n compiler.currentType = type.nonNullableType;\r\n\r\n // just return ifTrueish if assertions are disabled, or simplify if dropped anyway\r\n if (compiler.options.noAssert) {\r\n if (contextualType == Type.void) {\r\n compiler.currentType = Type.void;\r\n return module.createNop();\r\n }\r\n return arg0;\r\n }\r\n\r\n let abort = compileAbort(compiler, operands.length == 2 ? operands[1] : null, reportNode);\r\n\r\n compiler.currentType = type.nonNullableType;\r\n\r\n if (contextualType == Type.void) { // simplify if dropped anyway\r\n switch (compiler.currentType.kind) {\r\n default: { // any integer up to 32-bits incl. bool\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI32,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI64,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: {\r\n ret = module.createIf(\r\n module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n arg0\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n // TODO: also check for NaN in float assertions, as in `Boolean(NaN) -> false`?\r\n case TypeKind.F32: {\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF32,\r\n arg0,\r\n module.createF32(0)\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF64,\r\n arg0,\r\n module.createF64(0)\r\n ),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = abort;\r\n break;\r\n }\r\n }\r\n compiler.currentType = Type.void;\r\n } else {\r\n switch (compiler.currentType.kind) {\r\n case TypeKind.I8:\r\n case TypeKind.I16:\r\n case TypeKind.U8:\r\n case TypeKind.U16:\r\n case TypeKind.BOOL: {\r\n let flow = compiler.currentFlow;\r\n let tempLocal = flow.getAndFreeTempLocal(\r\n compiler.currentType,\r\n !flow.canOverflow(arg0, compiler.currentType)\r\n );\r\n ret = module.createIf(\r\n module.createTeeLocal(tempLocal.index, arg0),\r\n module.createGetLocal(tempLocal.index, NativeType.I32),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.I32:\r\n case TypeKind.U32:\r\n default: {\r\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.i32, false);\r\n ret = module.createIf(\r\n module.createTeeLocal(tempLocal.index, arg0),\r\n module.createGetLocal(tempLocal.index, NativeType.I32),\r\n abort\r\n );\r\n break;\r\n }\r\n case TypeKind.I64:\r\n case TypeKind.U64: {\r\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.i64, false);\r\n ret = module.createIf(\r\n module.createUnary(UnaryOp.EqzI64,\r\n module.createTeeLocal(tempLocal.index, arg0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal.index, NativeType.I64)\r\n );\r\n break;\r\n }\r\n case TypeKind.ISIZE:\r\n case TypeKind.USIZE: {\r\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(compiler.options.usizeType, false);\r\n ret = module.createIf(\r\n module.createUnary(\r\n compiler.options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n module.createTeeLocal(tempLocal.index, arg0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\r\n );\r\n break;\r\n }\r\n case TypeKind.F32: {\r\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.f32, false);\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF32,\r\n module.createTeeLocal(tempLocal.index, arg0),\r\n module.createF32(0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal.index, NativeType.F32)\r\n );\r\n break;\r\n }\r\n case TypeKind.F64: {\r\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.f64, false);\r\n ret = module.createIf(\r\n module.createBinary(BinaryOp.EqF64,\r\n module.createTeeLocal(tempLocal.index, arg0),\r\n module.createF64(0)\r\n ),\r\n abort,\r\n module.createGetLocal(tempLocal.index, NativeType.F64)\r\n );\r\n break;\r\n }\r\n case TypeKind.VOID: {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n ret = abort;\r\n break;\r\n }\r\n }\r\n }\r\n return ret;\r\n }\r\n case BuiltinSymbols.unchecked: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n let flow = compiler.currentFlow;\r\n flow.set(FlowFlags.UNCHECKED_CONTEXT);\r\n ret = compiler.compileExpressionRetainType(operands[0], contextualType, WrapMode.NONE);\r\n flow.unset(FlowFlags.UNCHECKED_CONTEXT);\r\n return ret;\r\n }\r\n case BuiltinSymbols.call_indirect: { // call_indirect(target: Function | u32, ...args: *[]) -> T\r\n if (operands.length < 1) {\r\n if (typeArguments) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n if (typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n let returnType: Type;\r\n if (typeArguments) {\r\n if (typeArguments.length != 1) {\r\n if (typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return module.createUnreachable();\r\n }\r\n returnType = typeArguments[0];\r\n } else {\r\n returnType = contextualType;\r\n }\r\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\r\n if (compiler.currentType.kind != TypeKind.U32) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n operands[0].range\r\n );\r\n return module.createUnreachable();\r\n }\r\n let numOperands = operands.length - 1;\r\n let operandExprs = new Array(numOperands);\r\n let signatureParts = new Array(numOperands + 1);\r\n let nativeReturnType = returnType.toNativeType();\r\n let nativeParamTypes = new Array(numOperands);\r\n for (let i = 0; i < numOperands; ++i) {\r\n operandExprs[i] = compiler.compileExpressionRetainType(operands[1 + i], Type.i32, WrapMode.NONE);\r\n let operandType = compiler.currentType;\r\n signatureParts[i] = operandType.toSignatureString();\r\n nativeParamTypes[i] = operandType.toNativeType();\r\n }\r\n signatureParts[numOperands] = returnType.toSignatureString();\r\n let typeName = signatureParts.join(\"\");\r\n let typeRef = module.getFunctionTypeBySignature(nativeReturnType, nativeParamTypes);\r\n if (!typeRef) typeRef = module.addFunctionType(typeName, nativeReturnType, nativeParamTypes);\r\n compiler.currentType = returnType;\r\n // of course this can easily result in a 'RuntimeError: function signature mismatch' trap and\r\n // thus must be used with care. it exists because it *might* be useful in specific scenarios.\r\n return module.createCallIndirect(arg0, operandExprs, typeName);\r\n }\r\n case BuiltinSymbols.instantiate: {\r\n if (!(typeArguments && typeArguments.length == 1)) {\r\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n let classInstance = typeArguments[0].classReference;\r\n if (!classInstance) {\r\n compiler.error(\r\n DiagnosticCode.Operation_not_supported,\r\n reportNode.range\r\n );\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileInstantiate(classInstance, operands, reportNode);\r\n }\r\n\r\n // user-defined diagnostic macros\r\n\r\n case BuiltinSymbols.ERROR: {\r\n compiler.error(\r\n DiagnosticCode.User_defined_0,\r\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\r\n );\r\n return module.createUnreachable();\r\n }\r\n case BuiltinSymbols.WARNING: {\r\n compiler.warning(\r\n DiagnosticCode.User_defined_0,\r\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\r\n );\r\n return module.createNop();\r\n }\r\n case BuiltinSymbols.INFO: {\r\n compiler.info(\r\n DiagnosticCode.User_defined_0,\r\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\r\n );\r\n return module.createNop();\r\n }\r\n\r\n // conversions\r\n\r\n case BuiltinSymbols.i8: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.i8,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case BuiltinSymbols.i16: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.i16,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case BuiltinSymbols.i32: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.i32,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case BuiltinSymbols.i64: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.i64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.i64,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case BuiltinSymbols.isize: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = compiler.options.isWasm64\r\n ? Type.isize64\r\n : Type.isize32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n compiler.options.isWasm64\r\n ? Type.isize64\r\n : Type.isize32,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case BuiltinSymbols.u8: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u8;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.u8,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case BuiltinSymbols.u16: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u16;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.u16,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case BuiltinSymbols.u32: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.u32,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case BuiltinSymbols.u64: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.u64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.u64,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case BuiltinSymbols.usize: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = compiler.options.usizeType;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n compiler.options.usizeType,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case BuiltinSymbols.bool: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.bool;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.bool,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case BuiltinSymbols.f32: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.f32;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.f32,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n case BuiltinSymbols.f64: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.f64;\r\n return module.createUnreachable();\r\n }\r\n return compiler.compileExpression(\r\n operands[0],\r\n Type.f64,\r\n ConversionKind.EXPLICIT,\r\n WrapMode.NONE\r\n );\r\n }\r\n // TODO: v128\r\n\r\n // gc\r\n\r\n case BuiltinSymbols.iterateRoots: {\r\n if (typeArguments) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n if (operands.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n compiler.currentType = Type.void;\r\n return module.createUnreachable();\r\n }\r\n let expr = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\r\n let type = compiler.currentType;\r\n let signatureReference = type.signatureReference;\r\n compiler.currentType = Type.void;\r\n if (\r\n !type.is(TypeFlags.REFERENCE) ||\r\n !signatureReference ||\r\n signatureReference.parameterTypes.length != 1 ||\r\n signatureReference.parameterTypes[0] != compiler.options.usizeType\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\r\n reportNode.range, type.toString(), \"(ref: usize) => void\"\r\n );\r\n return module.createUnreachable();\r\n }\r\n compiler.currentType = Type.void;\r\n // just emit a call even if the function doesn't yet exist\r\n compiler.needsIterateRoots = true;\r\n return module.createCall(\"~iterateRoots\", [ expr ], NativeType.None);\r\n }\r\n }\r\n var expr = deferASMCall(compiler, prototype, operands, contextualType, reportNode);\r\n if (expr) {\r\n if (typeArguments && typeArguments.length) {\r\n compiler.error(\r\n DiagnosticCode.Type_0_is_not_generic,\r\n reportNode.range, prototype.internalName\r\n );\r\n }\r\n return expr;\r\n }\r\n compiler.error(\r\n DiagnosticCode.Cannot_find_name_0,\r\n reportNode.expression.range, prototype.internalName\r\n );\r\n return module.createUnreachable();\r\n}\r\n\r\n/** Defers an inline-assembler-like call to a built-in function. */\r\nfunction deferASMCall(\r\n compiler: Compiler,\r\n prototype: FunctionPrototype,\r\n operands: Expression[],\r\n contextualType: Type,\r\n reportNode: CallExpression\r\n): ExpressionRef {\r\n /* tslint:disable:max-line-length */\r\n switch (prototype.internalName) {\r\n\r\n // TODO: Operators can't be just deferred (don't have a corresponding generic built-in)\r\n // add, sub, mul, div_s, div_u, rem_s, rem_u\r\n // and, or, xor, shl, shr_u, shr_s\r\n // eq, eqz, ne, lt_s, lt_u, le_s, le_u, gt_s, gt_u, ge_s, ge_u\r\n\r\n case BuiltinSymbols.i32_clz: return deferASM(BuiltinSymbols.clz, compiler, Type.i32, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i64_clz: return deferASM(BuiltinSymbols.clz, compiler, Type.i64, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i32_ctz: return deferASM(BuiltinSymbols.ctz, compiler, Type.i32, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i64_ctz: return deferASM(BuiltinSymbols.ctz, compiler, Type.i64, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i32_popcnt: return deferASM(BuiltinSymbols.popcnt, compiler, Type.i32, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i64_popcnt: return deferASM(BuiltinSymbols.popcnt, compiler, Type.i64, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i32_rotl: return deferASM(BuiltinSymbols.rotl, compiler, Type.i32, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i64_rotl: return deferASM(BuiltinSymbols.rotl, compiler, Type.i64, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i32_rotr: return deferASM(BuiltinSymbols.rotr, compiler, Type.i32, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i64_rotr: return deferASM(BuiltinSymbols.rotr, compiler, Type.i64, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.f32_abs: return deferASM(BuiltinSymbols.abs, compiler, Type.f32, operands, Type.f32, reportNode);\r\n case BuiltinSymbols.f64_abs: return deferASM(BuiltinSymbols.abs, compiler, Type.f64, operands, Type.f64, reportNode);\r\n case BuiltinSymbols.f32_max: return deferASM(BuiltinSymbols.max, compiler, Type.f32, operands, Type.f32, reportNode);\r\n case BuiltinSymbols.f64_max: return deferASM(BuiltinSymbols.max, compiler, Type.f64, operands, Type.f64, reportNode);\r\n case BuiltinSymbols.f32_min: return deferASM(BuiltinSymbols.min, compiler, Type.f32, operands, Type.f32, reportNode);\r\n case BuiltinSymbols.f64_min: return deferASM(BuiltinSymbols.min, compiler, Type.f64, operands, Type.f64, reportNode);\r\n case BuiltinSymbols.f32_ceil: return deferASM(BuiltinSymbols.ceil, compiler, Type.f32, operands, Type.f32, reportNode);\r\n case BuiltinSymbols.f64_ceil: return deferASM(BuiltinSymbols.ceil, compiler, Type.f64, operands, Type.f64, reportNode);\r\n case BuiltinSymbols.f32_floor: return deferASM(BuiltinSymbols.floor, compiler, Type.f32, operands, Type.f32, reportNode);\r\n case BuiltinSymbols.f64_floor: return deferASM(BuiltinSymbols.floor, compiler, Type.f64, operands, Type.f64, reportNode);\r\n case BuiltinSymbols.f32_copysign: return deferASM(BuiltinSymbols.copysign, compiler, Type.f32, operands, Type.f32, reportNode);\r\n case BuiltinSymbols.f64_copysign: return deferASM(BuiltinSymbols.copysign, compiler, Type.f64, operands, Type.f64, reportNode);\r\n case BuiltinSymbols.f32_nearest: return deferASM(BuiltinSymbols.nearest, compiler, Type.f32, operands, Type.f32, reportNode);\r\n case BuiltinSymbols.f64_nearest: return deferASM(BuiltinSymbols.nearest, compiler, Type.f64, operands, Type.f64, reportNode);\r\n case BuiltinSymbols.i32_reinterpret_f32: return deferASM(BuiltinSymbols.reinterpret, compiler, Type.i32, operands, Type.f32, reportNode);\r\n case BuiltinSymbols.i64_reinterpret_f64: return deferASM(BuiltinSymbols.reinterpret, compiler, Type.i64, operands, Type.f64, reportNode);\r\n case BuiltinSymbols.f32_reinterpret_i32: return deferASM(BuiltinSymbols.reinterpret, compiler, Type.f32, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.f64_reinterpret_i64: return deferASM(BuiltinSymbols.reinterpret, compiler, Type.f64, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.f32_sqrt: return deferASM(BuiltinSymbols.sqrt, compiler, Type.f32, operands, Type.f32, reportNode);\r\n case BuiltinSymbols.f64_sqrt: return deferASM(BuiltinSymbols.sqrt, compiler, Type.f64, operands, Type.f64, reportNode);\r\n case BuiltinSymbols.f32_trunc: return deferASM(BuiltinSymbols.trunc, compiler, Type.f32, operands, Type.f32, reportNode);\r\n case BuiltinSymbols.f64_trunc: return deferASM(BuiltinSymbols.trunc, compiler, Type.f64, operands, Type.f64, reportNode);\r\n case BuiltinSymbols.i32_load8_s: return deferASM(BuiltinSymbols.load, compiler, Type.i8, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i32_load8_u: return deferASM(BuiltinSymbols.load, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_load16_s: return deferASM(BuiltinSymbols.load, compiler, Type.i16, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i32_load16_u: return deferASM(BuiltinSymbols.load, compiler, Type.u16, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_load: return deferASM(BuiltinSymbols.load, compiler, Type.i32, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i64_load8_s: return deferASM(BuiltinSymbols.load, compiler, Type.i8, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i64_load8_u: return deferASM(BuiltinSymbols.load, compiler, Type.u8, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_load16_s: return deferASM(BuiltinSymbols.load, compiler, Type.i16, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i64_load16_u: return deferASM(BuiltinSymbols.load, compiler, Type.u16, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_load32_s: return deferASM(BuiltinSymbols.load, compiler, Type.i32, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i64_load32_u: return deferASM(BuiltinSymbols.load, compiler, Type.u32, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_load: return deferASM(BuiltinSymbols.load, compiler, Type.i64, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.f32_load: return deferASM(BuiltinSymbols.load, compiler, Type.f32, operands, Type.f32, reportNode);\r\n case BuiltinSymbols.f64_load: return deferASM(BuiltinSymbols.load, compiler, Type.f64, operands, Type.f64, reportNode);\r\n case BuiltinSymbols.i32_store8: return deferASM(BuiltinSymbols.store, compiler, Type.i8, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i32_store16: return deferASM(BuiltinSymbols.store, compiler, Type.i16, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i32_store: return deferASM(BuiltinSymbols.store, compiler, Type.i32, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i64_store8: return deferASM(BuiltinSymbols.store, compiler, Type.i8, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i64_store16: return deferASM(BuiltinSymbols.store, compiler, Type.i16, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i64_store32: return deferASM(BuiltinSymbols.store, compiler, Type.i32, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i64_store: return deferASM(BuiltinSymbols.store, compiler, Type.i64, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.f32_store: return deferASM(BuiltinSymbols.store, compiler, Type.f32, operands, Type.f32, reportNode);\r\n case BuiltinSymbols.f64_store: return deferASM(BuiltinSymbols.store, compiler, Type.f64, operands, Type.f64, reportNode);\r\n }\r\n if (compiler.options.hasFeature(Feature.THREADS)) {\r\n switch (prototype.internalName) {\r\n case BuiltinSymbols.i32_atomic_load8_u: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_load16_u: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.u16, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_load: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.i32, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i64_atomic_load8_u: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.u8, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_load16_u: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.u16, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_load32_u: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.u32, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_load: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.i64, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i32_atomic_store8: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i8, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i32_atomic_store16: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i16, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i32_atomic_store: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i32, operands, Type.i32, reportNode);\r\n case BuiltinSymbols.i64_atomic_store8: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i8, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i64_atomic_store16: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i16, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i64_atomic_store32: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i32, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i64_atomic_store: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i64, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw8_u_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw16_u_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u16, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u32, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw8_u_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u8, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw16_u_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u16, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw32_u_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u32, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u64, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw8_u_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw16_u_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u16, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u32, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw8_u_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u8, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw16_u_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u16, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw32_u_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u32, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u64, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw8_u_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw16_u_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u16, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u32, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw8_u_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u8, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw16_u_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u16, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw32_u_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u32, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u64, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw8_u_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw16_u_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u16, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u32, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw8_u_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u8, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw16_u_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u16, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw32_u_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u32, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u64, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw8_u_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw16_u_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw8_u_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u8, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw16_u_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u16, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw32_u_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u32, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u64, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw8_u_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw16_u_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw8_u_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u8, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw16_u_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u16, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw32_u_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u32, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u64, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw8_u_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw16_u_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i32_atomic_rmw_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u8, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw8_u_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u8, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw16_u_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u16, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw32_u_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u32, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i64_atomic_rmw_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u64, operands, Type.u64, reportNode);\r\n case BuiltinSymbols.i32_wait: return deferASM(BuiltinSymbols.atomic_wait, compiler, Type.i32, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i64_wait: return deferASM(BuiltinSymbols.atomic_wait, compiler, Type.i64, operands, Type.i64, reportNode);\r\n case BuiltinSymbols.i32_notify: return deferASM(BuiltinSymbols.atomic_notify, compiler, Type.i32, operands, Type.u32, reportNode);\r\n case BuiltinSymbols.i64_notify: return deferASM(BuiltinSymbols.atomic_notify, compiler, Type.i64, operands, Type.i64, reportNode);\r\n }\r\n }\r\n /* tslint:enable:max-line-length */\r\n return 0;\r\n}\r\n\r\n/** A helper for deferring inline-assembler-like calls to built-in functions. */\r\nfunction deferASM(\r\n name: string,\r\n compiler: Compiler,\r\n typeArgument: Type,\r\n operands: Expression[],\r\n valueType: Type,\r\n reportNode: CallExpression\r\n): ExpressionRef {\r\n assert(compiler.program.elementsByName.has(name));\r\n var prototype = compiler.program.elementsByName.get(name)!;\r\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n return compileCall(compiler, prototype, [ typeArgument ], operands, valueType, reportNode);\r\n}\r\n\r\n/** Evaluates the constant type of a type argument *or* expression. */\r\nfunction evaluateConstantType(\r\n compiler: Compiler,\r\n typeArguments: Type[] | null,\r\n operands: Expression[],\r\n reportNode: Node\r\n): Type | null {\r\n if (operands.length == 0) { // requires type argument\r\n if (!typeArguments || typeArguments.length != 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\r\n );\r\n return null;\r\n }\r\n return typeArguments[0];\r\n }\r\n if (operands.length == 1) { // optional type argument\r\n if (typeArguments) {\r\n if (typeArguments.length == 1) {\r\n compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\r\n } else {\r\n if (typeArguments.length) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n return null;\r\n }\r\n compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n }\r\n } else {\r\n compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\r\n }\r\n return compiler.currentType;\r\n }\r\n if (typeArguments && typeArguments.length > 1) {\r\n compiler.error(\r\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\r\n reportNode.range, \"1\", typeArguments.length.toString(10)\r\n );\r\n }\r\n compiler.error(\r\n DiagnosticCode.Expected_0_arguments_but_got_1,\r\n reportNode.range, \"1\", operands.length.toString(10)\r\n );\r\n return null;\r\n}\r\n\r\n/** Evaluates a `constantOffset` argument.*/\r\nfunction evaluateConstantOffset(compiler: Compiler, expression: Expression): i32 {\r\n var expr: ExpressionRef;\r\n var value: i32;\r\n if (compiler.options.isWasm64) {\r\n expr = compiler.precomputeExpression(expression, Type.usize64, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n if (\r\n getExpressionId(expr) != ExpressionId.Const ||\r\n getExpressionType(expr) != NativeType.I64 ||\r\n getConstValueI64High(expr) != 0 ||\r\n (value = getConstValueI64Low(expr)) < 0\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Expression_must_be_a_compile_time_constant,\r\n expression.range\r\n );\r\n value = -1;\r\n }\r\n } else {\r\n expr = compiler.precomputeExpression(expression, Type.usize32, ConversionKind.IMPLICIT, WrapMode.NONE);\r\n if (\r\n getExpressionId(expr) != ExpressionId.Const ||\r\n getExpressionType(expr) != NativeType.I32 ||\r\n (value = getConstValueI32(expr)) < 0\r\n ) {\r\n compiler.error(\r\n DiagnosticCode.Expression_must_be_a_compile_time_constant,\r\n expression.range\r\n );\r\n value = -1;\r\n }\r\n }\r\n return value;\r\n}\r\n\r\n/** Compiles an abort wired to the conditionally imported 'abort' function. */\r\nexport function compileAbort(\r\n compiler: Compiler,\r\n message: Expression | null,\r\n reportNode: Node\r\n): ExpressionRef {\r\n var program = compiler.program;\r\n var module = compiler.module;\r\n\r\n var stringInstance = compiler.program.stringInstance;\r\n if (!stringInstance) return module.createUnreachable();\r\n\r\n var abortInstance = program.abortInstance;\r\n if (!(abortInstance && compiler.compileFunction(abortInstance))) return module.createUnreachable();\r\n\r\n var messageArg = message != null\r\n ? compiler.compileExpression(message, stringInstance.type, ConversionKind.IMPLICIT, WrapMode.NONE)\r\n : stringInstance.type.toNativeZero(module);\r\n\r\n var filenameArg = compiler.ensureStaticString(reportNode.range.source.normalizedPath);\r\n\r\n compiler.currentType = Type.void;\r\n return module.createBlock(null, [\r\n module.createCall(\r\n abortInstance.internalName, [\r\n messageArg,\r\n filenameArg,\r\n module.createI32(reportNode.range.line),\r\n module.createI32(reportNode.range.column)\r\n ],\r\n NativeType.None\r\n ),\r\n module.createUnreachable()\r\n ]);\r\n}\r\n\r\n/** Compiles the iterateRoots function if requires. */\r\nexport function compileIterateRoots(compiler: Compiler): void {\r\n var module = compiler.module;\r\n var exprs = new Array();\r\n\r\n for (let element of compiler.program.elementsByName.values()) {\r\n if (element.kind != ElementKind.GLOBAL) continue;\r\n let global = element;\r\n let classReference = global.type.classReference;\r\n if (\r\n global.is(CommonFlags.COMPILED) &&\r\n classReference !== null &&\r\n !classReference.hasDecorator(DecoratorFlags.UNMANAGED)\r\n ) {\r\n if (global.is(CommonFlags.INLINED)) {\r\n let value = global.constantIntegerValue;\r\n exprs.push(\r\n module.createCallIndirect(\r\n module.createGetLocal(0, NativeType.I32),\r\n [\r\n compiler.options.isWasm64\r\n ? module.createI64(i64_low(value), i64_high(value))\r\n : module.createI32(i64_low(value))\r\n ],\r\n \"i_\"\r\n )\r\n );\r\n } else {\r\n exprs.push(\r\n module.createCallIndirect(\r\n module.createGetLocal(0, NativeType.I32),\r\n [\r\n module.createGetGlobal(\r\n global.internalName,\r\n compiler.options.nativeSizeType\r\n )\r\n ],\r\n \"i_\"\r\n )\r\n );\r\n }\r\n }\r\n }\r\n var typeRef = compiler.ensureFunctionType([ Type.i32 ], Type.void);\r\n module.addFunction(\"~iterateRoots\", typeRef, [],\r\n exprs.length\r\n ? module.createBlock(null, exprs)\r\n : module.createNop()\r\n );\r\n}\r\n\r\n/** Ensures that the specified class's GC hook exists and returns its function table index. */\r\nexport function ensureGCHook(\r\n compiler: Compiler,\r\n classInstance: Class\r\n): u32 {\r\n var program = compiler.program;\r\n assert(classInstance.type.isManaged(program));\r\n\r\n // check if the GC hook has already been created\r\n {\r\n let existingIndex = classInstance.gcHookIndex;\r\n if (existingIndex != -1) return existingIndex;\r\n }\r\n\r\n // check if the class implements a custom GC function (only valid for library elements)\r\n var members = classInstance.members;\r\n if (classInstance.isDeclaredInLibrary) {\r\n if (members !== null && members.has(\"__gc\")) {\r\n let gcPrototype = assert(members.get(\"__gc\"));\r\n assert(gcPrototype.kind == ElementKind.FUNCTION_PROTOTYPE);\r\n let gcInstance = assert(program.resolver.resolveFunction(gcPrototype, null));\r\n assert(gcInstance.is(CommonFlags.PRIVATE | CommonFlags.INSTANCE));\r\n assert(!gcInstance.isAny(CommonFlags.AMBIENT | CommonFlags.VIRTUAL));\r\n assert(gcInstance.signature.parameterTypes.length == 0);\r\n assert(gcInstance.signature.returnType == Type.void);\r\n gcInstance.internalName = classInstance.internalName + \"~gc\";\r\n assert(compiler.compileFunction(gcInstance));\r\n let index = compiler.ensureFunctionTableEntry(gcInstance);\r\n classInstance.gcHookIndex = index;\r\n return index;\r\n }\r\n }\r\n\r\n var module = compiler.module;\r\n var options = compiler.options;\r\n var nativeSizeType = options.nativeSizeType;\r\n var nativeSizeSize = options.usizeType.byteSize;\r\n var body = new Array();\r\n\r\n // nothing to mark if 'this' is null\r\n body.push(\r\n module.createIf(\r\n module.createUnary(\r\n options.isWasm64\r\n ? UnaryOp.EqzI64\r\n : UnaryOp.EqzI32,\r\n module.createGetLocal(0, nativeSizeType)\r\n ),\r\n module.createReturn()\r\n )\r\n );\r\n\r\n // remember the function index so we don't recurse infinitely\r\n var functionTable = compiler.functionTable;\r\n var gcHookIndex = functionTable.length;\r\n functionTable.push(\"\");\r\n classInstance.gcHookIndex = gcHookIndex;\r\n\r\n // if the class extends a base class, call its hook first (calls mark)\r\n var baseInstance = classInstance.base;\r\n if (baseInstance) {\r\n assert(baseInstance.type.isManaged(program));\r\n body.push(\r\n module.createCallIndirect(\r\n module.createI32(\r\n ensureGCHook(compiler, baseInstance.type.classReference)\r\n ),\r\n [\r\n module.createGetLocal(0, nativeSizeType)\r\n ],\r\n nativeSizeType == NativeType.I64 ? \"I_\" : \"i_\"\r\n )\r\n );\r\n\r\n // if this class is the top-most base class, mark the instance\r\n } else {\r\n body.push(\r\n module.createCall(assert(program.gcMarkInstance).internalName, [\r\n module.createGetLocal(0, nativeSizeType)\r\n ], NativeType.None)\r\n );\r\n }\r\n\r\n // mark instances assigned to own fields that are again references\r\n if (members) {\r\n for (let member of members.values()) {\r\n if (member.kind == ElementKind.FIELD) {\r\n if ((member).parent === classInstance) {\r\n let type = (member).type;\r\n if (type.isManaged(program)) {\r\n let offset = (member).memoryOffset;\r\n assert(offset >= 0);\r\n body.push(\r\n module.createCall(assert(program.gcMarkInstance).internalName, [\r\n module.createLoad(\r\n nativeSizeSize,\r\n false,\r\n module.createGetLocal(0, nativeSizeType),\r\n nativeSizeType,\r\n offset\r\n )\r\n ], NativeType.None)\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // add the function to the module and return its table index\r\n var funcName = classInstance.internalName + \"~gc\";\r\n module.addFunction(\r\n funcName,\r\n compiler.ensureFunctionType(null, Type.void, options.usizeType),\r\n null,\r\n module.createBlock(null, body)\r\n );\r\n functionTable[gcHookIndex] = funcName;\r\n return gcHookIndex;\r\n}\r\n","/** @module util *//***/\r\n\r\n/** Tests if the bit at the specified index is set within a 64-bit map. */\r\nexport function bitsetIs(map: I64, index: i32): bool {\r\n assert(index >= 0 && index < 64);\r\n return i64_ne(\r\n i64_and(\r\n map,\r\n i64_shl(\r\n i64_one,\r\n i64_new(index)\r\n )\r\n ),\r\n i64_zero\r\n );\r\n}\r\n\r\n/** Sets or unsets the bit at the specified index within a 64-bit map and returns the new map. */\r\nexport function bitsetSet(map: I64, index: i32, isSet: bool): I64 {\r\n assert(index >= 0 && index < 64);\r\n return isSet\r\n ? i64_or(\r\n map,\r\n i64_shl(\r\n i64_one,\r\n i64_new(index)\r\n )\r\n )\r\n : i64_and(\r\n map,\r\n i64_not(\r\n i64_shl(\r\n i64_one,\r\n i64_new(index)\r\n )\r\n )\r\n );\r\n}\r\n","/** @module util *//***/\r\n\r\n/** An enum of named character codes. */\r\nexport const enum CharCode {\r\n\r\n NULL = 0,\r\n LINEFEED = 0x0A,\r\n CARRIAGERETURN = 0x0D,\r\n LINESEPARATOR = 0x2028,\r\n PARAGRAPHSEPARATOR = 0x2029,\r\n NEXTLINE = 0x0085,\r\n\r\n SPACE = 0x20,\r\n NONBREAKINGSPACE = 0xA0,\r\n ENQUAD = 0x2000,\r\n EMQUAD = 0x2001,\r\n ENSPACE = 0x2002,\r\n EMSPACE = 0x2003,\r\n THREEPEREMSPACE = 0x2004,\r\n FOURPEREMSPACE = 0x2005,\r\n SIXPEREMSPACE = 0x2006,\r\n FIGURESPACE = 0x2007,\r\n PUNCTUATIONSPACE = 0x2008,\r\n THINSPACE = 0x2009,\r\n HAIRSPACE = 0x200A,\r\n ZEROWIDTHSPACE = 0x200B,\r\n NARROWNOBREAKSPACE = 0x202F,\r\n IDEOGRAPHICSPACE = 0x3000,\r\n MATHEMATICALSPACE = 0x205F,\r\n OGHAM = 0x1680,\r\n\r\n _ = 0x5F,\r\n\r\n _0 = 0x30,\r\n _1 = 0x31,\r\n _2 = 0x32,\r\n _3 = 0x33,\r\n _4 = 0x34,\r\n _5 = 0x35,\r\n _6 = 0x36,\r\n _7 = 0x37,\r\n _8 = 0x38,\r\n _9 = 0x39,\r\n\r\n a = 0x61,\r\n b = 0x62,\r\n c = 0x63,\r\n d = 0x64,\r\n e = 0x65,\r\n f = 0x66,\r\n g = 0x67,\r\n h = 0x68,\r\n i = 0x69,\r\n j = 0x6A,\r\n k = 0x6B,\r\n l = 0x6C,\r\n m = 0x6D,\r\n n = 0x6E,\r\n o = 0x6F,\r\n p = 0x70,\r\n q = 0x71,\r\n r = 0x72,\r\n s = 0x73,\r\n t = 0x74,\r\n u = 0x75,\r\n v = 0x76,\r\n w = 0x77,\r\n x = 0x78,\r\n y = 0x79,\r\n z = 0x7A,\r\n\r\n A = 0x41,\r\n B = 0x42,\r\n C = 0x43,\r\n D = 0x44,\r\n E = 0x45,\r\n F = 0x46,\r\n G = 0x47,\r\n H = 0x48,\r\n I = 0x49,\r\n J = 0x4A,\r\n K = 0x4B,\r\n L = 0x4C,\r\n M = 0x4D,\r\n N = 0x4E,\r\n O = 0x4F,\r\n P = 0x50,\r\n Q = 0x51,\r\n R = 0x52,\r\n S = 0x53,\r\n T = 0x54,\r\n U = 0x55,\r\n V = 0x56,\r\n W = 0x57,\r\n X = 0x58,\r\n Y = 0x59,\r\n Z = 0x5a,\r\n\r\n AMPERSAND = 0x26,\r\n ASTERISK = 0x2A,\r\n AT = 0x40,\r\n BACKSLASH = 0x5C,\r\n BACKTICK = 0x60,\r\n BAR = 0x7C,\r\n CARET = 0x5E,\r\n CLOSEBRACE = 0x7D,\r\n CLOSEBRACKET = 0x5D,\r\n CLOSEPAREN = 0x29,\r\n COLON = 0x3A,\r\n COMMA = 0x2C,\r\n DOLLAR = 0x24,\r\n DOT = 0x2E,\r\n DOUBLEQUOTE = 0x22,\r\n EQUALS = 0x3D,\r\n EXCLAMATION = 0x21,\r\n GREATERTHAN = 0x3E,\r\n HASH = 0x23,\r\n LESSTHAN = 0x3C,\r\n MINUS = 0x2D,\r\n OPENBRACE = 0x7B,\r\n OPENBRACKET = 0x5B,\r\n OPENPAREN = 0x28,\r\n PERCENT = 0x25,\r\n PLUS = 0x2B,\r\n QUESTION = 0x3F,\r\n SEMICOLON = 0x3B,\r\n SINGLEQUOTE = 0x27,\r\n SLASH = 0x2F,\r\n TILDE = 0x7E,\r\n\r\n BACKSPACE = 0x08,\r\n FORMFEED = 0x0C,\r\n BYTEORDERMARK = 0xFEFF,\r\n TAB = 0x09,\r\n VERTICALTAB = 0x0B\r\n}\r\n\r\n/** Tests if the specified character code is some sort of line break. */\r\nexport function isLineBreak(c: CharCode): bool {\r\n switch (c) {\r\n case CharCode.LINEFEED:\r\n case CharCode.CARRIAGERETURN:\r\n case CharCode.LINESEPARATOR:\r\n case CharCode.PARAGRAPHSEPARATOR: {\r\n return true;\r\n }\r\n default: {\r\n return false;\r\n }\r\n }\r\n}\r\n\r\n/** Tests if the specified character code is some sort of white space. */\r\nexport function isWhiteSpace(c: i32): bool {\r\n switch (c) {\r\n case CharCode.SPACE:\r\n case CharCode.TAB:\r\n case CharCode.VERTICALTAB:\r\n case CharCode.FORMFEED:\r\n case CharCode.NONBREAKINGSPACE:\r\n case CharCode.NEXTLINE:\r\n case CharCode.OGHAM:\r\n case CharCode.NARROWNOBREAKSPACE:\r\n case CharCode.MATHEMATICALSPACE:\r\n case CharCode.IDEOGRAPHICSPACE:\r\n case CharCode.BYTEORDERMARK: {\r\n return true;\r\n }\r\n default: {\r\n return c >= CharCode.ENQUAD && c <= CharCode.ZEROWIDTHSPACE;\r\n }\r\n }\r\n}\r\n\r\n/** Tests if the specified character code is a valid decimal digit. */\r\nexport function isDecimalDigit(c: i32): bool {\r\n return c >= CharCode._0 && c <= CharCode._9;\r\n}\r\n\r\n/** Tests if the specified character code is a valid octal digit. */\r\nexport function isOctalDigit(c: i32): bool {\r\n return c >= CharCode._0 && c <= CharCode._7;\r\n}\r\n\r\n/** Tests if the specified character code is a valid start of an identifier. */\r\nexport function isIdentifierStart(c: i32): bool {\r\n return c >= CharCode.A && c <= CharCode.Z\r\n || c >= CharCode.a && c <= CharCode.z\r\n || c == CharCode.DOLLAR\r\n || c == CharCode._\r\n || c > 0x7f && isUnicodeIdentifierStart(c);\r\n}\r\n\r\n/** Tests if the specified character code is a valid keyword character. */\r\nexport function isKeywordCharacter(c: i32): bool {\r\n return c >= CharCode.a && c <= CharCode.z;\r\n}\r\n\r\n/** Tests if the specified character code is a valid part of an identifier. */\r\nexport function isIdentifierPart(c: i32): bool {\r\n return c >= CharCode.A && c <= CharCode.Z\r\n || c >= CharCode.a && c <= CharCode.z\r\n || c >= CharCode._0 && c <= CharCode._9\r\n || c == CharCode.DOLLAR\r\n || c == CharCode._\r\n || c > 0x7f && isUnicodeIdentifierPart(c);\r\n}\r\n\r\n// storing as u16 to save memory\r\nconst unicodeIdentifierStart: u16[] = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514,\r\n 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774,\r\n 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969,\r\n 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088,\r\n 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384,\r\n 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474,\r\n 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\r\n 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\r\n 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705,\r\n 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784,\r\n 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873,\r\n 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958,\r\n 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986,\r\n 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125,\r\n 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240,\r\n 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333,\r\n 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\r\n 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634,\r\n 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725,\r\n 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\r\n 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840,\r\n 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186,\r\n 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293,\r\n 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\r\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798,\r\n 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\r\n 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872,\r\n 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016,\r\n 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389,\r\n 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688,\r\n 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141,\r\n 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424,\r\n 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025,\r\n 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130,\r\n 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\r\n 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\r\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505,\r\n 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520,\r\n 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670,\r\n 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720,\r\n 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540,\r\n 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893,\r\n 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538,\r\n 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888,\r\n 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015,\r\n 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\r\n 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520,\r\n 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695,\r\n 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739,\r\n 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798,\r\n 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243,\r\n 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285,\r\n 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323,\r\n 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\r\n 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\r\n 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\nconst unicodeIdentifierPart: u16[] = [\r\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\r\n 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906,\r\n 908, 908, 910, 929, 931,\r\n 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415,\r\n 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520,\r\n 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788,\r\n 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112,\r\n 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423,\r\n 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482,\r\n 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525,\r\n 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602,\r\n 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632,\r\n 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693,\r\n 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757,\r\n 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821,\r\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884,\r\n 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929,\r\n 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972,\r\n 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018,\r\n 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088,\r\n 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157,\r\n 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216,\r\n 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\r\n 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340,\r\n 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424,\r\n 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515,\r\n 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570,\r\n 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720,\r\n 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751,\r\n 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789,\r\n 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895,\r\n 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028,\r\n 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304,\r\n 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744,\r\n 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808,\r\n 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108,\r\n 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902,\r\n 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099,\r\n 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272,\r\n 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516,\r\n 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783,\r\n 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155,\r\n 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676,\r\n 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027,\r\n 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134,\r\n 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205,\r\n 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417,\r\n 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477,\r\n 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\r\n 8521, 8526, 8526, 8544, 8584,\r\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559,\r\n 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686,\r\n 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728,\r\n 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335,\r\n 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\r\n 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799,\r\n 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512,\r\n 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783,\r\n 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072,\r\n 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309,\r\n 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584,\r\n 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741,\r\n 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808,\r\n 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203,\r\n 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275,\r\n 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321,\r\n 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008,\r\n 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140,\r\n 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382,\r\n 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,\r\n];\r\n\r\nfunction lookupInUnicodeMap(code: u16, map: u16[]): bool {\r\n if (code < map[0]) return false;\r\n\r\n var lo = 0;\r\n var hi = map.length;\r\n var mid: i32;\r\n\r\n while (lo + 1 < hi) {\r\n mid = lo + (hi - lo) / 2;\r\n mid -= mid % 2;\r\n if (map[mid] <= code && code <= map[mid + 1]) {\r\n return true;\r\n }\r\n if (code < map[mid]) {\r\n hi = mid;\r\n } else {\r\n lo = mid + 2;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction isUnicodeIdentifierStart(code: i32): bool {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code as u16, unicodeIdentifierStart);\r\n}\r\n\r\nfunction isUnicodeIdentifierPart(code: i32): bool {\r\n return code < 0 || code > 0xffff ? false\r\n : lookupInUnicodeMap(code as u16, unicodeIdentifierPart);\r\n}\r\n","export function makeArray(original: Array | null = null): Array {\r\n if (original) {\r\n let cloned = new Array(original.length);\r\n for (let i = 0, k = original.length; i < k; ++i) unchecked(cloned[i] = original[i]);\r\n return cloned;\r\n }\r\n return new Array();\r\n}\r\n\r\nexport function makeSet(original: Set | null = null): Set {\r\n if (original) {\r\n let cloned = new Set();\r\n for (let v of original) cloned.add(v);\r\n return cloned;\r\n }\r\n return new Set();\r\n}\r\n\r\nexport function makeMap(original: Map | null = null, overrides: Map | null = null): Map {\r\n var cloned = new Map();\r\n if (original) {\r\n for (let [k, v] of original) cloned.set(k, v);\r\n if (overrides) for (let [k, v] of overrides) cloned.set(k, v);\r\n } else if (overrides) {\r\n for (let [k, v] of overrides) cloned.set(k, v);\r\n }\r\n return cloned;\r\n}\r\n","/** @module util *//***/\r\n\r\nimport {\r\n CharCode\r\n} from \"./charcode\";\r\n\r\nconst separator = CharCode.SLASH;\r\n\r\n/**\r\n * Normalizes the specified path, removing interior placeholders.\r\n * Expects a posix-compatible relative path (not Windows compatible).\r\n */\r\nexport function normalizePath(path: string): string {\r\n var pos = 0;\r\n var len = path.length;\r\n\r\n // trim leading './'\r\n while (pos + 1 < len &&\r\n path.charCodeAt(pos) == CharCode.DOT &&\r\n path.charCodeAt(pos + 1) == separator\r\n ) {\r\n pos += 2;\r\n }\r\n\r\n if (pos > 0 || len < path.length) {\r\n path = path.substring(pos, len);\r\n len -= pos;\r\n pos = 0;\r\n }\r\n\r\n var atEnd: bool;\r\n while (pos + 1 < len) {\r\n atEnd = false;\r\n\r\n // we are only interested in '/.' sequences ...\r\n if (\r\n path.charCodeAt(pos) == separator &&\r\n path.charCodeAt(pos + 1) == CharCode.DOT\r\n ) {\r\n // '/.' ( '/' | $ )\r\n atEnd = pos + 2 == len;\r\n if (atEnd ||\r\n pos + 2 < len &&\r\n path.charCodeAt(pos + 2) == separator\r\n ) {\r\n path = atEnd\r\n ? path.substring(0, pos)\r\n : path.substring(0, pos) + path.substring(pos + 2);\r\n len -= 2;\r\n continue;\r\n }\r\n\r\n // '/.' ( './' | '.' $ )\r\n atEnd = pos + 3 == len;\r\n if (atEnd && path.charCodeAt(pos + 2) == CharCode.DOT ||\r\n pos + 3 < len &&\r\n path.charCodeAt(pos + 2) == CharCode.DOT &&\r\n path.charCodeAt(pos + 3) == separator\r\n ) {\r\n // find preceeding '/'\r\n let ipos = pos;\r\n while (--ipos >= 0) {\r\n if (path.charCodeAt(ipos) == separator) {\r\n if (pos - ipos != 3 ||\r\n path.charCodeAt(ipos + 1) != CharCode.DOT ||\r\n path.charCodeAt(ipos + 2) != CharCode.DOT\r\n ) { // exclude '..' itself\r\n path = atEnd\r\n ? path.substring(0, ipos)\r\n : path.substring(0, ipos) + path.substring(pos + 3);\r\n len -= pos + 3 - ipos;\r\n pos = ipos - 1; // incremented again at end of loop\r\n }\r\n break;\r\n }\r\n }\r\n\r\n // if there's no preceeding '/', trim start if non-empty\r\n if (ipos < 0 && pos > 0) {\r\n if (pos != 2 ||\r\n path.charCodeAt(0) != CharCode.DOT ||\r\n path.charCodeAt(1) != CharCode.DOT\r\n ) { // exclude '..' itself\r\n path = path.substring(pos + 4);\r\n len = path.length;\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n pos++;\r\n }\r\n return len > 0 ? path : \".\";\r\n}\r\n\r\n/** Resolves the specified path relative to the specified origin. */\r\nexport function resolvePath(normalizedPath: string, origin: string): string {\r\n if (normalizedPath.startsWith(\"std/\")) {\r\n return normalizedPath;\r\n }\r\n return normalizePath(\r\n dirname(origin) + String.fromCharCode(separator) + normalizedPath\r\n );\r\n}\r\n\r\n/** Obtains the directory portion of a normalized path. */\r\nexport function dirname(normalizedPath: string): string {\r\n var pos = normalizedPath.length;\r\n while (--pos > 0) {\r\n if (normalizedPath.charCodeAt(pos) == separator) {\r\n return normalizedPath.substring(0, pos);\r\n }\r\n }\r\n return \".\";\r\n}\r\n","/** @module util *//***/\r\n\r\nconst indentX1 = \" \";\r\nconst indentX2 = \" \";\r\nconst indentX4 = \" \";\r\n\r\n/** Creates an indentation matching the number of specified levels. */\r\nexport function indent(sb: string[], level: i32): void {\r\n while (level >= 4) {\r\n sb.push(indentX4);\r\n level -= 4;\r\n }\r\n if (level >= 2) {\r\n sb.push(indentX2);\r\n level -= 2;\r\n }\r\n if (level) {\r\n sb.push(indentX1);\r\n }\r\n}\r\n","/** @module util *//***/\r\n\r\n/** Reads an 8-bit integer from the specified buffer. */\r\nexport function readI8(buffer: Uint8Array, offset: i32): i32 {\r\n return buffer[offset];\r\n}\r\n\r\n/** Writes an 8-bit integer to the specified buffer. */\r\nexport function writeI8(value: i32, buffer: Uint8Array, offset: i32): void {\r\n buffer[offset] = value;\r\n}\r\n\r\n/** Reads a 16-bit integer from the specified buffer. */\r\nexport function readI16(buffer: Uint8Array, offset: i32): i32 {\r\n return buffer[offset ]\r\n | buffer[offset + 1] << 8;\r\n}\r\n\r\n/** Writes a 16-bit integer to the specified buffer. */\r\nexport function writeI16(value: i32, buffer: Uint8Array, offset: i32): void {\r\n buffer[offset ] = value;\r\n buffer[offset + 1] = value >>> 8;\r\n}\r\n\r\n/** Reads a 32-bit integer from the specified buffer. */\r\nexport function readI32(buffer: Uint8Array, offset: i32): i32 {\r\n return buffer[offset ]\r\n | buffer[offset + 1] << 8\r\n | buffer[offset + 2] << 16\r\n | buffer[offset + 3] << 24;\r\n}\r\n\r\n/** Writes a 32-bit integer to the specified buffer. */\r\nexport function writeI32(value: i32, buffer: Uint8Array, offset: i32): void {\r\n buffer[offset ] = value;\r\n buffer[offset + 1] = value >>> 8;\r\n buffer[offset + 2] = value >>> 16;\r\n buffer[offset + 3] = value >>> 24;\r\n}\r\n\r\n/** Reads a 64-bit integer from the specified buffer. */\r\nexport function readI64(buffer: Uint8Array, offset: i32): I64 {\r\n var lo = readI32(buffer, offset);\r\n var hi = readI32(buffer, offset + 4);\r\n return i64_new(lo, hi);\r\n}\r\n\r\n/** Writes a 64-bit integer to the specified buffer. */\r\nexport function writeI64(value: I64, buffer: Uint8Array, offset: i32): void {\r\n writeI32(i64_low(value), buffer, offset);\r\n writeI32(i64_high(value), buffer, offset + 4);\r\n}\r\n\r\n/** Reads a 32-bit float from the specified buffer. */\r\nexport function readF32(buffer: Uint8Array, offset: i32): f32 {\r\n return i32_as_f32(readI32(buffer, offset));\r\n}\r\n\r\n/** Writes a 32-bit float to the specified buffer. */\r\nexport function writeF32(value: f32, buffer: Uint8Array, offset: i32): void {\r\n writeI32(f32_as_i32(value), buffer, offset);\r\n}\r\n\r\n/** Reads a 64-bit float from the specified buffer. */\r\nexport function readF64(buffer: Uint8Array, offset: i32): f64 {\r\n return i64_as_f64(readI64(buffer, offset));\r\n}\r\n\r\n/** Writes a 64-bit float to the specified buffer. */\r\nexport function writeF64(value: f64, buffer: Uint8Array, offset: i32): void {\r\n var valueI64 = f64_as_i64(value);\r\n writeI32(i64_low(valueI64), buffer, offset);\r\n writeI32(i64_high(valueI64), buffer, offset + 4);\r\n}\r\n","/**\r\n * Low-level C-like compiler API.\r\n * @module index\r\n *//***/\r\n\r\nimport {\r\n Compiler,\r\n Options,\r\n Target,\r\n Feature\r\n} from \"./compiler\";\r\n\r\nimport {\r\n Decompiler\r\n} from \"./decompiler\";\r\n\r\nimport {\r\n IDLBuilder,\r\n TSDBuilder\r\n} from \"./definitions\";\r\n\r\nimport {\r\n DiagnosticMessage,\r\n DiagnosticCategory,\r\n formatDiagnosticMessage\r\n} from \"./diagnostics\";\r\n\r\nimport {\r\n Module\r\n} from \"./module\";\r\n\r\nimport {\r\n Parser\r\n} from \"./parser\";\r\n\r\nimport {\r\n Program\r\n} from \"./program\";\r\n\r\n/** Parses a source file. If `parser` has been omitted a new one is created. */\r\nexport function parseFile(text: string, path: string, isEntry: bool = false,\r\n parser: Parser | null = null\r\n): Parser {\r\n if (!parser) parser = new Parser();\r\n parser.parseFile(text, path, isEntry);\r\n return parser;\r\n}\r\n\r\n/** Obtains the next required file's path. Returns `null` once complete. */\r\nexport function nextFile(parser: Parser): string | null {\r\n return parser.nextFile();\r\n}\r\n\r\n/** Obtains the next diagnostic message. Returns `null` once complete. */\r\nexport function nextDiagnostic(parser: Parser): DiagnosticMessage | null {\r\n var program = parser.program;\r\n return program.diagnosticsOffset < program.diagnostics.length\r\n ? program.diagnostics[program.diagnosticsOffset++]\r\n : null;\r\n}\r\n\r\n/** Formats a diagnostic message to a string. */\r\nexport { formatDiagnosticMessage as formatDiagnostic };\r\n\r\n/** Tests whether a diagnostic is informatory. */\r\nexport function isInfo(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.INFO;\r\n}\r\n\r\n/** Tests whether a diagnostic is a warning. */\r\nexport function isWarning(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.WARNING;\r\n}\r\n\r\n/** Tests whether a diagnostic is an error. */\r\nexport function isError(message: DiagnosticMessage): bool {\r\n return message.category == DiagnosticCategory.ERROR;\r\n}\r\n\r\n/** Creates a new set of compiler options. */\r\nexport function createOptions(): Options {\r\n return new Options();\r\n}\r\n\r\n/** Sets the `target` option. */\r\nexport function setTarget(options: Options, target: Target): void {\r\n options.target = target;\r\n}\r\n\r\n/** Sets the `noAssert` option. */\r\nexport function setNoAssert(options: Options, noAssert: bool): void {\r\n options.noAssert = noAssert;\r\n}\r\n\r\n/** Sets the `importMemory` option. */\r\nexport function setImportMemory(options: Options, importMemory: bool): void {\r\n options.importMemory = importMemory;\r\n}\r\n\r\n/** Sets the `sharedMemory` option. */\r\nexport function setSharedMemory(options: Options, sharedMemory: i32): void {\r\n options.sharedMemory = sharedMemory;\r\n}\r\n\r\n/** Sets the `importTable` option. */\r\nexport function setImportTable(options: Options, importTable: bool): void {\r\n options.importTable = importTable;\r\n}\r\n\r\n/** Sets the `sourceMap` option. */\r\nexport function setSourceMap(options: Options, sourceMap: bool): void {\r\n options.sourceMap = sourceMap;\r\n}\r\n\r\n/** Sets the `memoryBase` option. */\r\nexport function setMemoryBase(options: Options, memoryBase: u32): void {\r\n options.memoryBase = memoryBase;\r\n}\r\n\r\n/** Sets a 'globalAliases' value. */\r\nexport function setGlobalAlias(options: Options, name: string, alias: string): void {\r\n var globalAliases = options.globalAliases;\r\n if (!globalAliases) options.globalAliases = globalAliases = new Map();\r\n globalAliases.set(name, alias);\r\n}\r\n\r\n/** Sign extension operations. */\r\nexport const FEATURE_SIGN_EXTENSION = Feature.SIGN_EXTENSION;\r\n/** Mutable global imports and exports. */\r\nexport const FEATURE_MUTABLE_GLOBAL = Feature.MUTABLE_GLOBAL;\r\n/** Bulk memory operations. */\r\nexport const FEATURE_BULK_MEMORY = Feature.BULK_MEMORY;\r\n/** SIMD types and operations. */\r\nexport const FEATURE_SIMD = Feature.SIMD;\r\n/** Threading and atomic operations. */\r\nexport const FEATURE_THREADS = Feature.THREADS;\r\n\r\n/** Enables a specific feature. */\r\nexport function enableFeature(options: Options, feature: Feature): void {\r\n options.features |= feature;\r\n}\r\n\r\n/** Gives the compiler a hint at the optimize levels that will be used later on. */\r\nexport function setOptimizeLevelHints(options: Options, optimizeLevel: i32, shrinkLevel: i32): void {\r\n options.optimizeLevelHint = optimizeLevel;\r\n options.shrinkLevelHint = shrinkLevel;\r\n}\r\n\r\n/** Finishes parsing. */\r\nexport function finishParsing(parser: Parser): Program {\r\n return parser.finish();\r\n}\r\n\r\n/** Compiles the sources computed by the parser to a module. */\r\nexport function compileProgram(program: Program, options: Options | null = null): Module {\r\n return new Compiler(program, options).compile();\r\n}\r\n\r\n/** Decompiles a module to its (low level) source. */\r\nexport function decompileModule(module: Module): string {\r\n var decompiler = new Decompiler();\r\n decompiler.decompile(module);\r\n return decompiler.finish();\r\n}\r\n\r\n/** Builds WebIDL definitions for the specified program. */\r\nexport function buildIDL(program: Program): string {\r\n return IDLBuilder.build(program);\r\n}\r\n\r\n/** Builds TypeScript definitions for the specified program. */\r\nexport function buildTSD(program: Program): string {\r\n return TSDBuilder.build(program);\r\n}\r\n\r\n/** Prefix indicating a library file. */\r\nexport { LIBRARY_PREFIX } from \"./common\";\r\n\r\n// Full API\r\nexport * from \"./ast\";\r\n// export * from \"./binary\";\r\nexport * from \"./common\";\r\nexport * from \"./compiler\";\r\nexport * from \"./decompiler\";\r\nexport * from \"./definitions\";\r\nexport * from \"./diagnosticMessages.generated\";\r\nexport * from \"./diagnostics\";\r\nexport * from \"./flow\";\r\nexport * from \"./module\";\r\nexport * from \"./parser\";\r\nexport * from \"./program\";\r\nexport * from \"./resolver\";\r\nexport * from \"./tokenizer\";\r\nexport * from \"./types\";\r\nexport * from \"./util\";\r\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://assemblyscript/webpack/universalModuleDefinition","webpack://assemblyscript/webpack/bootstrap","webpack://assemblyscript/./src/common.ts","webpack://assemblyscript/./src/diagnostics.ts","webpack://assemblyscript/./src/util/index.ts","webpack://assemblyscript/./src/program.ts","webpack://assemblyscript/./src/module.ts","webpack://assemblyscript/./src/ast.ts","webpack://assemblyscript/./src/types.ts","webpack://assemblyscript/./src/tokenizer.ts","webpack://assemblyscript/(webpack)/buildin/global.js","webpack://assemblyscript/./src/resolver.ts","webpack://assemblyscript/./src/compiler.ts","webpack://assemblyscript/./src/diagnosticMessages.generated.ts","webpack://assemblyscript/./src/flow.ts","webpack://assemblyscript/./src/decompiler.ts","webpack://assemblyscript/./src/definitions.ts","webpack://assemblyscript/./src/parser.ts","webpack://assemblyscript/./src/glue/js/index.ts","webpack://assemblyscript/./src/glue/js/binaryen.js","webpack://assemblyscript/external \"binaryen\"","webpack://assemblyscript/./std/portable/index.js","webpack://assemblyscript/./src/glue/js/float.js","webpack://assemblyscript/./src/glue/js/i64.js","webpack://assemblyscript/./node_modules/long/src/long.js","webpack://assemblyscript/./src/builtins.ts","webpack://assemblyscript/./src/util/bitset.ts","webpack://assemblyscript/./src/util/charcode.ts","webpack://assemblyscript/./src/util/collections.ts","webpack://assemblyscript/./src/util/path.ts","webpack://assemblyscript/./src/util/text.ts","webpack://assemblyscript/./src/util/binary.ts","webpack://assemblyscript/./src/index.ts"],"names":["root","factory","exports","module","require","define","amd","self","this","__WEBPACK_EXTERNAL_MODULE__19__","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","CommonFlags","PATH_DELIMITER","PARENT_SUBST","GETTER_PREFIX","SETTER_PREFIX","INSTANCE_DELIMITER","STATIC_DELIMITER","INNER_DELIMITER","LIBRARY_SUBST","LIBRARY_PREFIX","INDEX_SUFFIX","CommonSymbols","EMPTY","i8","i16","i32","i64","isize","u8","u16","u32","u64","usize","bool","f32","f64","v128","void_","number","boolean","string","native","null_","true_","false_","this_","super_","constructor","LibrarySymbols","ASC_TARGET","ASC_NO_TREESHAKING","ASC_NO_ASSERT","ASC_MEMORY_BASE","ASC_OPTIMIZE_LEVEL","ASC_SHRINK_LEVEL","ASC_FEATURE_MUTABLE_GLOBAL","ASC_FEATURE_SIGN_EXTENSION","ASC_FEATURE_BULK_MEMORY","ASC_FEATURE_SIMD","I8","I16","I32","I64","Isize","U8","U16","U32","U64","Usize","Bool","F32","F64","V128","String","Array","ArrayBuffer","Math","Mathf","memory","allocate","abort","main","length","byteLength","pow","mod","DiagnosticCategory","diagnosticMessages_generated_1","util_1","diagnosticMessages_generated_2","diagnosticCategoryToString","category","INFO","WARNING","ERROR","assert","diagnosticCategoryToColor","COLOR_BLUE","COLOR_YELLOW","COLOR_RED","DiagnosticCode","diagnosticCodeToString","COLOR_RESET","DiagnosticMessage","code","message","range","relatedRange","arg0","arg1","arg2","replace","createInfo","createWarning","createError","withRange","withRelatedRange","toString","source","normalizedPath","line","column","formatDiagnosticContext","useColors","text","len","start","end","isLineBreak","charCodeAt","sb","substring","push","join","formatDiagnosticMessage","showContext","DiagnosticEmitter","diagnostics","emitDiagnostic","info","infoRelated","warning","warningRelated","error","errorRelated","__export","OperatorKind","common_1","diagnostics_1","types_1","ast_1","resolver_1","flow_1","QueuedImport","localFile","localIdentifier","foreignIdentifier","foreignPath","foreignPathAlt","QueuedExport","QueuedExportStar","pathLiteral","operatorKindFromDecorator","decoratorKind","arg","DecoratorKind","OPERATOR","OPERATOR_BINARY","INDEXED_GET","INDEXED_SET","UNCHECKED_INDEXED_GET","UNCHECKED_INDEXED_SET","ADD","SUB","MUL","POW","DIV","REM","BITWISE_AND","BITWISE_OR","BITWISE_XOR","EQ","NE","GT","GE","BITWISE_SHR","BITWISE_SHR_U","LT","LE","BITWISE_SHL","OPERATOR_PREFIX","PLUS","PREFIX_INC","MINUS","PREFIX_DEC","NOT","BITWISE_NOT","OPERATOR_POSTFIX","POSTFIX_INC","POSTFIX_DEC","INVALID","ElementKind","DecoratorFlags","Program","_super","_this","sources","diagnosticsOffset","explicitStartFunction","filesByName","Map","elementsByName","elementsByDeclaration","instancesByName","typeClasses","arrayBufferInstance","arrayPrototype","stringInstance","abortInstance","memoryAllocateInstance","hasGC","gcAllocateInstance","gcLinkInstance","gcMarkInstance","gcHeaderSize","gcHookOffset","nativeDummySignature","nativeSource","Source","SourceKind","LIBRARY","nativeFile","File","set","internalName","resolver","Resolver","__extends","makeNativeVariableDeclaration","flags","NONE","Node","createVariableDeclaration","createIdentifierExpression","makeNativeTypeDeclaration","identifier","createTypeDeclaration","createOmittedType","makeNativeFunctionDeclaration","createFunctionDeclaration","createSignature","createType","createSimpleTypeName","makeNativeNamespaceDeclaration","createNamespaceDeclaration","makeNativeFunction","signature","parent","decoratorFlags","Function","FunctionPrototype","getElementByDeclaration","declaration","has","initialize","options","registerNativeType","Type","isizeType","usizeType","void","add","TypeDefinition","EXPORT","GENERIC","BUILTIN","hasFeature","registerConstantInteger","i64_new","isWasm64","noAssert","memoryBase","optimizeLevelHint","shrinkLevelHint","queuedImports","queuedExports","queuedExportsStar","queuedExtends","queuedImplements","k","file","statements","j","statement","kind","NodeKind","initializeExports","IMPORT","initializeImports","VARIABLE","initializeVariables","CLASSDECLARATION","initializeClass","ENUMDECLARATION","initializeEnum","FUNCTIONDECLARATION","initializeFunction","INTERFACEDECLARATION","initializeInterface","NAMESPACEDECLARATION","initializeNamespace","TYPEDECLARATION","initializeTypeDefinition","queuedExportsStar_1","__values","queuedExportsStar_1_1","next","done","_g","__read","exportsStar","exportStar","foreignFile","lookupForeignFile","ensureExportStar","File_0_not_found","queuedImport","element","lookupForeign","Module_0_has_no_exported_member_1","localName","asImportedNamespace","queuedExports_1","queuedExports_1_1","_h","exports_1","exports_1_1","_j","exportName","queuedExport","ensureExport","lookupInSelf","globalElement","lookupGlobal","DeclaredElement","registerNativeTypeClass","thisPrototype","extendsNode","baseElement","resolveTypeName","CLASS_PROTOTYPE","basePrototype","hasDecorator","SEALED","Class_0_is_sealed_and_cannot_be_extended","identifierNode","UNMANAGED","Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa","Range","A_class_may_only_extend_another_class","globalAliases","globalAliases_1","globalAliases_1_1","_k","alias","Error","resolveClass","FUNCTION_PROTOTYPE","resolveFunction","parameterTypes","signatureReference","returnType","byteSize","_l","values","_m","isEntry","_o","_p","markModuleExport","MODULE_EXPORT","instanceMembers","_c","_d","member","PROPERTY_PROTOTYPE","getterPrototype","setterPrototype","PROPERTY","FUNCTION","FIELD","CLASS","members","_e","_f","type","setType","typeKind","className","classElement","is","global","Global","CONST","setConstantIntegerValue","registerConstantFloat","setConstantFloatValue","ensureGlobal","merged","tryMerge","Duplicate_identifier_0","elements","foreignName","lookupExport","fileQueuedExports","checkDecorators","decorators","acceptedFlags","decorator","flag","decoratorKindToFlag","decoratorNameToKind","isLibrary","Decorator_0_is_not_valid_here","Duplicate_decorator","ClassPrototype","GLOBAL","implementsTypes","numImplementsTypes","Unmanaged_classes_cannot_implement_interfaces","Operation_not_supported","extendsType","memberDeclarations","memberDeclaration","FIELDDECLARATION","initializeField","METHODDECLARATION","isAny","GET","SET","initializeProperty","initializeMethod","INDEXSIGNATUREDECLARATION","STATIC","INTERFACE_PROTOTYPE","READONLY","INLINE","LAZY","ABSTRACT","FieldPrototype","addInstance","isStatic","CONSTRUCTOR","checkOperatorOverloads","classPrototype","numArgs","arguments","firstArg","LITERAL","literalKind","LiteralKind","STRING","overloads","overloadPrototypes","Duplicate_function_implementation","operatorKind","String_literal_expected","Expected_0_arguments_but_got_1","ensureProperty","parentMembers","PropertyPrototype","Duplicate_property_0","isGetter","Enum","initializeEnumValue","EnumValue","initializeExport","internalPath","queued","endsWith","path","exportedName","Export_declaration_conflicts_with_exported_declaration_of_0","declarations","initializeImport","namespaceName","validDecorators","AMBIENT","EXTERNAL","INSTANCE","FILE","START","Module_cannot_have_multiple_start_functions","findDecorator","InterfacePrototype","Namespace","DECLARE","Element","program","shadowType","current","originalDeclaration","actual","isBound","TypedElement","apply","RESOLVED","startFunction","Signature","isImport","lookup","includes","exports_2","exports_2_1","_b","memberName","TYPEDEFINITION","mangleInternalName","typeParameters","NAMESPACE","ENUM","ConstantValueKind","VariableLikeElement","constantValueKind","initializer","constantIntegerValue","INLINED","constantFloatValue","ENUMVALUE","Parameter","Local","index","LOCAL","instances","boundPrototypes","body","toBound","classInstance","bound","getResolvedInstance","instanceKey","setResolvedInstance","instance","nameInclTypeParameters","contextualTypeArguments","localsByName","localsByIndex","additionalLocals","debugLocations","ref","functionTableIndex","trampoline","nextInlineId","tempI32s","tempI64s","tempF32s","tempF64s","nextBreakId","breakStack","breakLabel","asFunction","localIndex","local","thisType","parameterType","parameterName","getParameterName","flow","Flow","registerConcreteElement","addLocal","locals","finalize","sourceMap","debugLocation","setDebugLocation","debugInfoRef","debugInfoIndex","FunctionTarget","__s","FUNCTION_TARGET","toSignatureString","FIELD_PROTOTYPE","parameterIndex","Field","memoryOffset","firstDeclaration","Property","getterInstance","setterInstance","_isInterface","constructorPrototype","extends","basePtototype","Class","typeArguments","base","INTERFACE","currentMemoryOffset","constructorInstance","gcHookIndex","asClass","inheritedTypeArguments","inheritedTypeArguments_1","inheritedTypeArguments_1_1","baseName","baseType","typeParameterNodes","numTypeArguments","isAssignableTo","target","lookupOverload","unchecked","uncheckedOverload","overload","offsetof","fieldName","field","Interface","older","newer","copyMembers","Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local","src","dest","srcMembers","destMembers","srcMembers_1","srcMembers_1_1","isInstance","asGlobal","NativeType","ExpressionId","compiler_1","_BinaryenTypeNone","_BinaryenTypeInt32","_BinaryenTypeInt64","_BinaryenTypeFloat32","_BinaryenTypeFloat64","_BinaryenTypeVec128","_BinaryenTypeUnreachable","_BinaryenTypeAuto","_BinaryenInvalidId","_BinaryenBlockId","_BinaryenIfId","_BinaryenLoopId","_BinaryenBreakId","_BinaryenSwitchId","_BinaryenCallId","_BinaryenCallIndirectId","_BinaryenGetLocalId","_BinaryenSetLocalId","_BinaryenGetGlobalId","_BinaryenSetGlobalId","_BinaryenLoadId","_BinaryenStoreId","_BinaryenConstId","_BinaryenUnaryId","_BinaryenBinaryId","_BinaryenSelectId","_BinaryenDropId","_BinaryenReturnId","_BinaryenHostId","_BinaryenNopId","_BinaryenUnreachableId","_BinaryenAtomicCmpxchgId","_BinaryenAtomicRMWId","_BinaryenAtomicWaitId","_BinaryenAtomicWakeId","_BinaryenSIMDExtractId","_BinaryenSIMDReplaceId","_BinaryenSIMDShuffleId","_BinaryenSIMDBitselectId","_BinaryenSIMDShiftId","_BinaryenMemoryInitId","_BinaryenDataDropId","_BinaryenMemoryCopyId","_BinaryenMemoryFillId","UnaryOp","_BinaryenClzInt32","_BinaryenCtzInt32","_BinaryenPopcntInt32","_BinaryenNegFloat32","_BinaryenAbsFloat32","_BinaryenCeilFloat32","_BinaryenFloorFloat32","_BinaryenTruncFloat32","_BinaryenNearestFloat32","_BinaryenSqrtFloat32","_BinaryenEqZInt32","_BinaryenClzInt64","_BinaryenCtzInt64","_BinaryenPopcntInt64","_BinaryenNegFloat64","_BinaryenAbsFloat64","_BinaryenCeilFloat64","_BinaryenFloorFloat64","_BinaryenTruncFloat64","_BinaryenNearestFloat64","_BinaryenSqrtFloat64","_BinaryenEqZInt64","_BinaryenExtendSInt32","_BinaryenExtendUInt32","_BinaryenWrapInt64","_BinaryenTruncSFloat32ToInt32","_BinaryenTruncSFloat32ToInt64","_BinaryenTruncUFloat32ToInt32","_BinaryenTruncUFloat32ToInt64","_BinaryenTruncSFloat64ToInt32","_BinaryenTruncSFloat64ToInt64","_BinaryenTruncUFloat64ToInt32","_BinaryenTruncUFloat64ToInt64","_BinaryenReinterpretFloat32","_BinaryenReinterpretFloat64","_BinaryenConvertSInt32ToFloat32","_BinaryenConvertSInt32ToFloat64","_BinaryenConvertUInt32ToFloat32","_BinaryenConvertUInt32ToFloat64","_BinaryenConvertSInt64ToFloat32","_BinaryenConvertSInt64ToFloat64","_BinaryenConvertUInt64ToFloat32","_BinaryenConvertUInt64ToFloat64","_BinaryenPromoteFloat32","_BinaryenDemoteFloat64","_BinaryenReinterpretInt32","_BinaryenReinterpretInt64","_BinaryenExtendS8Int32","_BinaryenExtendS16Int32","_BinaryenExtendS8Int64","_BinaryenExtendS16Int64","_BinaryenExtendS32Int64","BinaryOp","_BinaryenAddInt32","_BinaryenSubInt32","_BinaryenMulInt32","_BinaryenDivSInt32","_BinaryenDivUInt32","_BinaryenRemSInt32","_BinaryenRemUInt32","_BinaryenAndInt32","_BinaryenOrInt32","_BinaryenXorInt32","_BinaryenShlInt32","_BinaryenShrUInt32","_BinaryenShrSInt32","_BinaryenRotLInt32","_BinaryenRotRInt32","_BinaryenEqInt32","_BinaryenNeInt32","_BinaryenLtSInt32","_BinaryenLtUInt32","_BinaryenLeSInt32","_BinaryenLeUInt32","_BinaryenGtSInt32","_BinaryenGtUInt32","_BinaryenGeSInt32","_BinaryenGeUInt32","_BinaryenAddInt64","_BinaryenSubInt64","_BinaryenMulInt64","_BinaryenDivSInt64","_BinaryenDivUInt64","_BinaryenRemSInt64","_BinaryenRemUInt64","_BinaryenAndInt64","_BinaryenOrInt64","_BinaryenXorInt64","_BinaryenShlInt64","_BinaryenShrUInt64","_BinaryenShrSInt64","_BinaryenRotLInt64","_BinaryenRotRInt64","_BinaryenEqInt64","_BinaryenNeInt64","_BinaryenLtSInt64","_BinaryenLtUInt64","_BinaryenLeSInt64","_BinaryenLeUInt64","_BinaryenGtSInt64","_BinaryenGtUInt64","_BinaryenGeSInt64","_BinaryenGeUInt64","_BinaryenAddFloat32","_BinaryenSubFloat32","_BinaryenMulFloat32","_BinaryenDivFloat32","_BinaryenCopySignFloat32","_BinaryenMinFloat32","_BinaryenMaxFloat32","_BinaryenEqFloat32","_BinaryenNeFloat32","_BinaryenLtFloat32","_BinaryenLeFloat32","_BinaryenGtFloat32","_BinaryenGeFloat32","_BinaryenAddFloat64","_BinaryenSubFloat64","_BinaryenMulFloat64","_BinaryenDivFloat64","_BinaryenCopySignFloat64","_BinaryenMinFloat64","_BinaryenMaxFloat64","_BinaryenEqFloat64","_BinaryenNeFloat64","_BinaryenLtFloat64","_BinaryenLeFloat64","_BinaryenGtFloat64","_BinaryenGeFloat64","HostOp","_BinaryenCurrentMemory","_BinaryenGrowMemory","AtomicRMWOp","_BinaryenAtomicRMWAdd","_BinaryenAtomicRMWSub","_BinaryenAtomicRMWAnd","_BinaryenAtomicRMWOr","_BinaryenAtomicRMWXor","_BinaryenAtomicRMWXchg","SIMDOp","_BinaryenSplatVecI8x16","_BinaryenSplatVecI16x8","_BinaryenSplatVecI32x4","_BinaryenSplatVecI64x2","_BinaryenSplatVecF32x4","_BinaryenSplatVecF64x2","_BinaryenNotVec128","_BinaryenNegVecI8x16","_BinaryenAnyTrueVecI8x16","_BinaryenAllTrueVecI8x16","_BinaryenNegVecI16x8","_BinaryenAnyTrueVecI16x8","_BinaryenAllTrueVecI16x8","_BinaryenNegVecI32x4","_BinaryenAnyTrueVecI32x4","_BinaryenAllTrueVecI32x4","_BinaryenNegVecI64x2","_BinaryenAnyTrueVecI64x2","_BinaryenAllTrueVecI64x2","_BinaryenAbsVecF32x4","_BinaryenNegVecF32x4","_BinaryenSqrtVecF32x4","_BinaryenAbsVecF64x2","_BinaryenNegVecF64x2","_BinaryenSqrtVecF64x2","_BinaryenTruncSatSVecF32x4ToVecI32x4","_BinaryenTruncSatUVecF32x4ToVecI32x4","_BinaryenTruncSatSVecF64x2ToVecI64x2","_BinaryenTruncSatUVecF64x2ToVecI64x2","_BinaryenConvertSVecI32x4ToVecF32x4","_BinaryenConvertUVecI32x4ToVecF32x4","_BinaryenConvertSVecI64x2ToVecF64x2","_BinaryenConvertUVecI64x2ToVecF64x2","_BinaryenEqVecI8x16","_BinaryenNeVecI8x16","_BinaryenLtSVecI8x16","_BinaryenLtUVecI8x16","_BinaryenLeSVecI8x16","_BinaryenLeUVecI8x16","_BinaryenGtSVecI8x16","_BinaryenGtUVecI8x16","_BinaryenGeSVecI8x16","_BinaryenGeUVecI8x16","_BinaryenEqVecI16x8","_BinaryenNeVecI16x8","_BinaryenLtSVecI16x8","_BinaryenLtUVecI16x8","_BinaryenLeSVecI16x8","_BinaryenLeUVecI16x8","_BinaryenGtSVecI16x8","_BinaryenGtUVecI16x8","_BinaryenGeSVecI16x8","_BinaryenGeUVecI16x8","_BinaryenEqVecI32x4","_BinaryenNeVecI32x4","_BinaryenLtSVecI32x4","_BinaryenLtUVecI32x4","_BinaryenLeSVecI32x4","_BinaryenLeUVecI32x4","_BinaryenGtSVecI32x4","_BinaryenGtUVecI32x4","_BinaryenGeSVecI32x4","_BinaryenGeUVecI32x4","_BinaryenEqVecF32x4","_BinaryenNeVecF32x4","_BinaryenLtVecF32x4","_BinaryenLeVecF32x4","_BinaryenGtVecF32x4","_BinaryenGeVecF32x4","_BinaryenEqVecF64x2","_BinaryenNeVecF64x2","_BinaryenLtVecF64x2","_BinaryenLeVecF64x2","_BinaryenGtVecF64x2","_BinaryenGeVecF64x2","_BinaryenAndVec128","_BinaryenOrVec128","_BinaryenXorVec128","_BinaryenAddVecI8x16","_BinaryenAddSatSVecI8x16","_BinaryenAddSatUVecI8x16","_BinaryenSubVecI8x16","_BinaryenSubSatSVecI8x16","_BinaryenSubSatUVecI8x16","_BinaryenMulVecI8x16","_BinaryenAddVecI16x8","_BinaryenAddSatSVecI16x8","_BinaryenAddSatUVecI16x8","_BinaryenSubVecI16x8","_BinaryenSubSatSVecI16x8","_BinaryenSubSatUVecI16x8","_BinaryenMulVecI16x8","_BinaryenAddVecI32x4","_BinaryenSubVecI32x4","_BinaryenMulVecI32x4","_BinaryenAddVecI64x2","_BinaryenSubVecI64x2","_BinaryenAddVecF32x4","_BinaryenSubVecF32x4","_BinaryenMulVecF32x4","_BinaryenDivVecF32x4","_BinaryenMinVecF32x4","_BinaryenMaxVecF32x4","_BinaryenAddVecF64x2","_BinaryenSubVecF64x2","_BinaryenMulVecF64x2","_BinaryenDivVecF64x2","_BinaryenMinVecF64x2","_BinaryenMaxVecF64x2","MemorySegment","buffer","offset","segment","Module","hasTemporaryFunction","cachedPrecomputeNames","cachedStrings","_BinaryenModuleCreate","lit","_BinaryenSizeofLiteral","createFrom","cArr","allocU8Array","_BinaryenModuleRead","free","changetype","addFunctionType","result","paramTypes","cStr","allocStringCached","allocI32Array","_BinaryenAddFunctionType","getFunctionTypeBySignature","_BinaryenGetFunctionTypeBySignature","removeFunctionType","_BinaryenRemoveFunctionType","createI32","out","_BinaryenLiteralInt32","_BinaryenConst","createI64","valueLow","valueHigh","_BinaryenLiteralInt64","createF32","_BinaryenLiteralFloat32","createF64","_BinaryenLiteralFloat64","createV128","bytes","store","_BinaryenLiteralVec128","createUnary","op","expr","_BinaryenUnary","createBinary","left","right","_BinaryenBinary","createHost","operands","allocPtrArray","_BinaryenHost","createGetLocal","_BinaryenGetLocal","createTeeLocal","_BinaryenTeeLocal","createGetGlobal","_BinaryenGetGlobal","createLoad","signed","ptr","_BinaryenLoad","createStore","_BinaryenStore","createAtomicLoad","_BinaryenAtomicLoad","createAtomicStore","_BinaryenAtomicStore","createAtomicRMW","_BinaryenAtomicRMW","createAtomicCmpxchg","expected","replacement","_BinaryenAtomicCmpxchg","createAtomicWait","timeout","expectedType","_BinaryenAtomicWait","createAtomicWake","wakeCount","_BinaryenAtomicWake","createSetLocal","_BinaryenSetLocal","createSetGlobal","_BinaryenSetGlobal","createBlock","label","children","None","_BinaryenBlock","createBreak","condition","_BinaryenBreak","createDrop","expression","_BinaryenDrop","createLoop","_BinaryenLoop","createIf","ifTrue","ifFalse","_BinaryenIf","createNop","_BinaryenNop","createReturn","_BinaryenReturn","createSelect","_BinaryenSelect","createSwitch","names","defaultName","numNames","strs","_BinaryenSwitch","createCall","_BinaryenCall","createCallIndirect","typeName","_BinaryenCallIndirect","createUnreachable","_BinaryenUnreachable","createMemoryCopy","size","_BinaryenMemoryCopy","createMemoryFill","_BinaryenMemoryFill","addGlobal","mutable","_BinaryenAddGlobal","removeGlobal","_BinaryenRemoveGlobal","addFunction","varTypes","_BinaryenAddFunction","removeFunction","_BinaryenRemoveFunction","addTemporaryFunction","tempName","typeRef","removeTemporaryFunction","addFunctionExport","externalName","cStr1","cStr2","_BinaryenAddFunctionExport","addTableExport","_BinaryenAddTableExport","addMemoryExport","_BinaryenAddMemoryExport","addGlobalExport","_BinaryenAddGlobalExport","removeExport","_BinaryenRemoveExport","addFunctionImport","externalModuleName","externalBaseName","functionType","cStr3","_BinaryenAddFunctionImport","addTableImport","_BinaryenAddTableImport","addMemoryImport","shared","_BinaryenAddMemoryImport","addGlobalImport","globalType","_BinaryenAddGlobalImport","setMemory","initial","maximum","segments","segs","offs","sizs","Target","WASM64","i64_low","i64_high","cArr1","cArr2","cArr3","_BinaryenSetMemory","setFunctionTable","funcs","_BinaryenSetFunctionTable","setStart","func","_BinaryenSetStart","getOptimizeLevel","_BinaryenGetOptimizeLevel","setOptimizeLevel","level","_BinaryenSetOptimizeLevel","getShrinkLevel","_BinaryenGetShrinkLevel","setShrinkLevel","_BinaryenSetShrinkLevel","setDebugInfo","on","_BinaryenSetDebugInfo","optimize","_BinaryenFunctionOptimize","_BinaryenModuleOptimize","runPasses","passes","allocString","_BinaryenFunctionRunPasses","_BinaryenModuleRunPasses","precomputeExpression","previousOptimizeLevel","previousShrinkLevel","previousDebugInfo","_BinaryenGetDebugInfo","_BinaryenExpressionGetType","_BinaryenFunctionGetBody","validate","_BinaryenModuleValidate","interpret","_BinaryenModuleInterpret","toBinary","sourceMapUrl","binaryPtr","sourceMapPtr","_BinaryenModuleAllocateAndWrite","readInt","binaryBytes","ret","BinaryModule","output","Uint8Array","load","readBuffer","readString","toText","toAsmjs","str","dispose","_BinaryenModuleDispose","createRelooper","Relooper","cloneExpression","noSideEffects","maxDepth","MAX_VALUE","nested1","nested2","_BinaryenExpressionGetId","Const","_BinaryenConstGetValueI32","_BinaryenConstGetValueI64Low","_BinaryenConstGetValueI64High","_BinaryenConstGetValueF32","_BinaryenConstGetValueF64","GetLocal","_BinaryenGetLocalGetIndex","GetGlobal","globalName","_BinaryenGetGlobalGetName","Load","_BinaryenLoadGetPtr","_BinaryenLoadIsAtomic","_BinaryenLoadGetBytes","_BinaryenLoadGetOffset","_BinaryenLoadIsSigned","_BinaryenLoadGetAlign","Unary","_BinaryenUnaryGetValue","_BinaryenUnaryGetOp","Binary","_BinaryenBinaryGetLeft","_BinaryenBinaryGetRight","_BinaryenBinaryGetOp","addDebugInfoFile","_BinaryenModuleAddDebugInfoFileName","getDebugInfoFile","_BinaryenModuleGetDebugInfoFileName","fileIndex","lineNumber","columnNumber","_BinaryenFunctionSetDebugLocation","UNLIMITED_MEMORY","getExpressionId","getExpressionType","getConstValueI32","getConstValueI64Low","getConstValueI64High","getConstValueF32","getConstValueF64","getGetLocalIndex","getSetLocalIndex","_BinaryenSetLocalGetIndex","getSetLocalValue","_BinaryenSetLocalGetValue","isTeeLocal","_BinaryenSetLocalIsTee","getGetGlobalName","getBinaryOp","getBinaryLeft","getBinaryRight","getUnaryOp","getUnaryValue","getLoadBytes","getLoadOffset","getLoadPtr","isLoadSigned","getStoreBytes","_BinaryenStoreGetBytes","getStoreOffset","_BinaryenStoreGetOffset","getStorePtr","_BinaryenStoreGetPtr","getStoreValue","_BinaryenStoreGetValue","getBlockName","_BinaryenBlockGetName","getBlockChildCount","_BinaryenBlockGetNumChildren","getBlockChild","_BinaryenBlockGetChild","getIfCondition","_BinaryenIfGetCondition","getIfTrue","_BinaryenIfGetIfTrue","getIfFalse","_BinaryenIfGetIfFalse","getLoopName","_BinaryenLoopGetName","getLoopBody","_BinaryenLoopGetBody","getBreakName","_BinaryenBreakGetName","getBreakCondition","_BinaryenBreakGetCondition","getSelectThen","_BinaryenSelectGetIfTrue","getSelectElse","_BinaryenSelectGetIfFalse","getSelectCondition","_BinaryenSelectGetCondition","getDropValue","_BinaryenDropGetValue","getReturnValue","_BinaryenReturnGetValue","getCallTarget","_BinaryenCallGetTarget","getHostOp","_BinaryenHostGetOp","getHostOperandCount","_BinaryenHostGetNumOperands","getHostOperand","_BinaryenHostGetOperand","getHostName","_BinaryenHostGetNameOperand","getFunctionBody","getFunctionName","_BinaryenFunctionGetName","getFunctionParamCount","_BinaryenFunctionGetNumParams","getFunctionParamType","_BinaryenFunctionGetParam","getFunctionResultType","_BinaryenFunctionGetResult","relooper","_RelooperCreate","addBlock","_RelooperAddBlock","addBranch","from","to","_RelooperAddBranch","addBlockWithSwitch","_RelooperAddBlockWithSwitch","addBranchForSwitch","indexes","_RelooperAddBranchForSwitch","renderAndDispose","entry","labelHelper","_RelooperRenderAndDispose","u8s","numValues","idx","i32s","val","ptrs","u","stringLengthUTF8","cp","u1","u2","u3","u4","arr","fromCodePoints","needsExplicitUnreachable","Unreachable","Return","Break","Block","numChildren","tokenizer_1","Token","nodeIsConstantValue","NULL","TRUE","FALSE","nodeIsCallable","IDENTIFIER","ASSERTION","CALL","ELEMENTACCESS","PARENTHESIZED","PROPERTYACCESS","SUPER","nodeIsGenericCallable","createTypeName","TypeName","isNullable","TypeNode","createTypeParameter","defaultType","elem","TypeParameterNode","createParameter","ParameterNode","parameterKind","parameters","explicitThisType","sig","SignatureNode","createDecorator","args","stmt","DecoratorNode","createComment","node","CommentNode","commentKind","isQuoted","IdentifierExpression","symbol","createEmptyIdentifierExpression","createArrayLiteralExpression","ArrayLiteralExpression","elementExpressions","createAssertionExpression","assertionKind","toType","AssertionExpression","createBinaryExpression","operator","BinaryExpression","createCallExpression","typeArgs","CallExpression","createClassExpression","ClassExpression","createCommaExpression","expressions","CommaExpression","createConstructorExpression","ConstructorExpression","createElementAccessExpression","ElementAccessExpression","elementExpression","createFalseExpression","FalseExpression","createFloatLiteralExpression","FloatLiteralExpression","createFunctionExpression","FunctionExpression","createInstanceOfExpression","isType","InstanceOfExpression","createIntegerLiteralExpression","IntegerLiteralExpression","createNewExpression","NewExpression","createNullExpression","NullExpression","createObjectLiteralExpression","ObjectLiteralExpression","createParenthesizedExpression","ParenthesizedExpression","createPropertyAccessExpression","PropertyAccessExpression","createRegexpLiteralExpression","pattern","RegexpLiteralExpression","patternFlags","createTernaryExpression","ifThen","ifElse","TernaryExpression","createStringLiteralExpression","StringLiteralExpression","createSuperExpression","SuperExpression","createThisExpression","ThisExpression","createTrueExpression","TrueExpression","createUnaryPostfixExpression","operand","UnaryPostfixExpression","createUnaryPrefixExpression","UnaryPrefixExpression","createBlockStatement","BlockStatement","createBreakStatement","BreakStatement","createClassDeclaration","ClassDeclaration","createContinueStatement","ContinueStatement","createDoStatement","DoStatement","createEmptyStatement","EmptyStatement","createEnumDeclaration","EnumDeclaration","createEnumValueDeclaration","EnumValueDeclaration","createExportStatement","isDeclare","ExportStatement","normalizePath","startsWith","resolvePath","mangleInternalPath","createExportImportStatement","ExportImportStatement","createExportMember","ExportMember","createExpressionStatement","ExpressionStatement","createIfStatement","IfStatement","createImportStatement","decls","ImportStatement","createImportStatementWithWildcard","createImportDeclaration","ImportDeclaration","createInterfaceDeclaration","InterfaceDeclaration","createFieldDeclaration","FieldDeclaration","createForStatement","incrementor","ForStatement","FunctionDeclaration","createIndexSignatureDeclaration","keyType","valueType","IndexSignatureDeclaration","createMethodDeclaration","MethodDeclaration","NamespaceDeclaration","createReturnStatement","ReturnStatement","createSwitchStatement","cases","SwitchStatement","createSwitchCase","SwitchCase","createThrowStatement","ThrowStatement","createTryStatement","catchVariable","catchStatements","finallyStatements","TryStatement","TypeDeclaration","createVariableStatement","VariableStatement","VariableDeclaration","createVoidStatement","VoidStatement","createWhileStatement","WhileStatement","CommonTypeNode","TYPENAME","TYPE","TYPEPARAMETER","ParameterKind","PARAMETER","implicitFieldDeclaration","SIGNATURE","nameStr","propStr","CUSTOM","DECORATOR","CommentKind","COMMENT","Expression","LiteralExpression","ARRAY","AssertionKind","BINARY","COMMA","FLOAT","INSTANCEOF","INTEGER","NEW","OBJECT","REGEXP","TERNARY","THIS","UnaryExpression","UNARYPOSTFIX","UNARYPREFIX","Statement","SOURCE","tokenizer","exportPaths","sourceKind","pos","lastIndexOf","simplePath","ENTRY","DeclarationStatement","VariableLikeDeclarationStatement","BLOCK","BREAK","CONTINUE","DO","ENUMVALUEDECLARATION","EXPORTIMPORT","EXPORTMEMBER","EXPRESSION","FOR","clone","IF","IMPORTDECLARATION","RETURN","SWITCHCASE","SWITCH","THROW","TRY","VARIABLEDECLARATION","VOID","WHILE","program_1","module_1","TypeKind","TypeFlags","v128_zero","cachedNullableType","ceil","classReference","nonNullableType","isize64","isize32","usize64","usize32","isManaged","computeSmallIntegerShift","targetType","computeSmallIntegerMask","classType","asNullable","signednessIsRelevant","currentClass","targetClass","currentFunction","targetFunction","commonCompatible","signednessIsImportant","kindOnly","toNativeType","toNativeZero","toNativeOne","toNativeNegOne","typesToNativeTypes","types","numTypes","typesToString","cachedFunctionTarget","parameterNames","requiredParameters","hasRest","asFunctionTarget","getDefaultParameterName","thisThisType","targetThisType","thisParameterTypes","targetParameterTypes","numParameters","thisParameterType","targetParameterType","thisReturnType","targetReturnType","makeSignatureString","includeThis","optionalStart","restIndex","cachedDefaultParameterNames","IdentifierHandling","tokenFromKeyword","AS","ASYNC","AWAIT","CASE","CATCH","DEBUGGER","DEFAULT","DELETE","ELSE","EXTENDS","FINALLY","FROM","IMPLEMENTS","IN","IS","KEYOF","LET","MODULE","OF","PACKAGE","PRIVATE","PROTECTED","PUBLIC","TYPEOF","VAR","WITH","YIELD","tokenIsAlsoIdentifier","token","operatorTokenToString","DOT_DOT_DOT","LESSTHAN","GREATERTHAN","LESSTHAN_EQUALS","GREATERTHAN_EQUALS","EQUALS_EQUALS","EXCLAMATION_EQUALS","EQUALS_EQUALS_EQUALS","EXCLAMATION_EQUALS_EQUALS","ASTERISK_ASTERISK","ASTERISK","SLASH","PERCENT","PLUS_PLUS","MINUS_MINUS","LESSTHAN_LESSTHAN","GREATERTHAN_GREATERTHAN","GREATERTHAN_GREATERTHAN_GREATERTHAN","AMPERSAND","BAR","CARET","EXCLAMATION","TILDE","AMPERSAND_AMPERSAND","BAR_BAR","EQUALS","PLUS_EQUALS","MINUS_EQUALS","ASTERISK_EQUALS","ASTERISK_ASTERISK_EQUALS","SLASH_EQUALS","PERCENT_EQUALS","LESSTHAN_LESSTHAN_EQUALS","GREATERTHAN_GREATERTHAN_EQUALS","GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS","AMPERSAND_EQUALS","BAR_EQUALS","CARET_EQUALS","a","b","Tokenizer","tokenPos","nextToken","nextTokenPos","nextTokenOnNewLine","onComment","identifierHandling","unsafeNext","maxTokenLength","STRINGLITERAL","chr","OPENPAREN","CLOSEPAREN","isDecimalDigit","FLOATLITERAL","DOT","commentStartPos","LINE","TRIPLE","closed","_0_expected","testInteger","INTEGERLITERAL","COLON","SEMICOLON","EQUALS_GREATERTHAN","QUESTION","OPENBRACKET","CLOSEBRACKET","OPENBRACE","CLOSEBRACE","AT","isIdentifierStart","isKeywordCharacter","posBefore","isIdentifierPart","keywordToken","ALWAYS","PREFER","isWhiteSpace","Invalid_character","ENDOFFILE","peek","checkOnNewLine","maxCompoundLength","tokenBefore","tokenPosBefore","skipIdentifier","skip","mark","state","reusableState","State","discard","reset","readIdentifier","quote","Unterminated_string_literal","readEscapeSequence","Unexpected_end_of_text","readExtendedUnicodeEscape","readUnicodeEscape","fromCharCode","readRegexpPattern","escaped","Unterminated_regular_expression_literal","readRegexpFlags","Invalid_regular_expression_flags","readInteger","readHexInteger","readBinaryInteger","readOctalInteger","isOctalDigit","Octal_literals_are_not_allowed_in_strict_mode","readDecimalInteger","i64_4","sepEnd","i64_add","i64_shl","Numeric_separators_are_not_allowed_here","Multiple_consecutive_numeric_separators_are_not_permitted","Hexadecimal_digit_expected","i64_10","i64_mul","Digit_expected","i64_3","Octal_digit_expected","i64_1","Binary_digit_expected","readFloat","readDecimalFloat","parseFloat","readHexFloat","remain","value32","invalid","An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive","Unterminated_Unicode_escape_sequence","finish","g","e","window","ReportMode","currentThisExpression","currentElementExpression","resolveType","context","reportMode","REPORT","parameterNodes","parameterTypeNode","REST","returnTypeNode","typeNode","typeArgumentNodes","possiblyPlaceholder","Type_0_is_not_generic","Basic_type_0_cannot_be_nullable","resolveClassInclTypeArguments","makeMap","Expected_0_type_arguments_but_got_1","typeArgument","resolveTypeArguments","Cannot_find_name_0","prev","Property_0_does_not_exist_on_type_1","alternativeReportNode","minParameterCount","maxParameterCount","argumentCount","resolveIdentifier","ensureResolvedLazyGlobal","resolvePropertyAccessExpression","propertyAccess","contextualType","targetExpression","resolveExpression","propertyName","indexedGet","Index_signature_is_missing_in_type_0","resolveElementAccessExpression","elementAccess","determineIntegerLiteralType","intValue","i64_is_i8","i64_is_u8","i64_is_i16","i64_is_u16","i64_is_i32","i64_is_u32","i64_is_bool","resolveAssertionExpression","resolveUnaryPrefixExpression","resolveUnaryPostfixExpression","resolveBinaryExpression","resolveThisExpression","resolveSuperExpression","actualFunction","resolveLiteralExpression","resolveCallExpression","NONNULL","i64_sub","i64_zero","thisLocal","lookupLocal","_this_cannot_be_referenced_in_current_location","superLocal","_super_can_only_be_referenced_in_a_derived_class","literalType","resolveFunctionInclTypeArguments","Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures","actualParent","resolvedInstance","classTypeArguments","classTypeParameters","numClassTypeArguments","classTypeParameterName","numFunctionTypeArguments","signatureNode","signatureParameters","numSignatureParameters","parameterDeclaration","reportNode","resolvedTypeArguments","numTypeParameters","baseClass","nameInclTypeParamters","baseMembers","baseMembers_1","baseMembers_1_1","baseMemberName","baseMember","instanceMemberPrototypes","fieldTypeNode","fieldType","baseField","Type_expected","atEnd","fieldInstance","boundPrototype","propertyInstance","ctorPrototype","ctorInstance","overloadPrototype","operatorInstance","builtins_1","Options","WASM32","importMemory","sharedMemory","importTable","features","feature","Feature","ConversionKind","WrapMode","mangleImportName_moduleName","mangleImportName_elementName","CompilerSymbols","Compiler","currentInlineFunctions","currentEnum","currentType","memorySegments","stringSegments","functionTable","argcVar","argcSet","needsIterateRoots","f32ModInstance","f64ModInstance","f32PowInstance","f64PowInstance","max","compile","startFunctionInstance","startFunctionBody","currentFlow","currentBody","BuiltinSymbols","HEAP_BASE","files","compileFile","compileExports","funcRef","ensureFunctionType","i64_align","isSharedMemory","i64_shr_u","makeModuleExports","compileIterateRoots","members_1","members_1_1","makeModuleExport","prefix","instanceName","fullName","setter","Cannot_export_a_mutable_global","ensureTrampoline","ensureArgcSet","returnTypePostFix","COMPILED","nativeType","nativeSizeType","getterName","setterName","subPrefix","compileElement","compileMembers","compileGlobal","compileEnum","compileFunctionUsingTypeArguments","compileClassUsingTypeArguments","element_1","exportsStar_1","exportsStar_1_1","compileFileByPath","normalizedPathWithoutExtension","pathWithIndex","previousBody","previousFlow","compileTopLevelStatement","numLocals","initExpr","initializerNode","resolvedType","compileExpressionRetainType","Type_0_is_not_assignable_to_type_1","isDeclaredConstant","MODULE_IMPORT","mangleImportName","initializeInStart","compileExpression","Compiling_constant_with_non_constant_initializer_as_mutable","previousValue","previousValueIsMut","isInline","initInStart","valueNode","In_const_enum_declarations_member_initializer_must_be_constant_expression","Enum_member_must_have_initializer","AddI32","compileFunction","resultType","compileFunctionBody","stmts","bodyNode","compileStatements","ARROW","MAIN","canOverflow","started","unshift","EqzI32","thisLocalIndex","EqzI64","makeAllocation","makeFieldInitialization","Constructors_for_derived_classes_must_contain_a_super_call","A_function_whose_declared_type_is_not_void_must_return_a_value","An_implementation_cannot_be_declared_in_ambient_contexts","decoratorNodes","Function_implementation_is_missing_or_not_immediately_following_the_declaration","compileClass","staticMembers","compileInterfaceDeclaration","addMemorySegment","alignment","ensureFunctionTableEntry","TRAMPOLINE","memberStatements","compileStatement","Nop","isLastStatementInBody","compileBlockStatement","compileBreakStatement","compileContinueStatement","compileDoStatement","compileEmptyStatement","compileExpressionStatement","compileForStatement","compileIfStatement","compileReturnStatement","compileSwitchStatement","compileThrowStatement","compileTryStatement","compileVariableStatement","compileVoidStatement","compileWhileStatement","addDebugLocation","isBody","numStatements","outerFlow","innerFlow","fork","freeScopedLocals","inherit","A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement","continueLabel","A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement","pushBreakLabel","condExpr","makeIsTrueish","popBreakLabel","terminated","unset","block","repeatLabel","alwaysTrue","condPre","incrExpr","bodyStatement","bodyExpr","usesContinue","inheritConditional","breakBlock","repeatBlock","condExprPrecomp","ifTrueFlow","ifTrueExpr","ifFalseExpr","ifFalseFlow","inheritMutual","inlineReturnLabel","numCases","tempLocal","getTempLocal","tempLocalIndex","breaks","breakIndex","defaultIndex","EqI32","freeTempLocal","currentBlock","alwaysReturns","alwaysReturnsWrapped","alwaysThrows","alwaysAllocates","isLast","nextLabel","count","compileAbort","numDeclarations","initializers","isInlined","parentFunction","scopedLocals","_const_declarations_must_be_initialized","addScopedLocal","compileAssignmentWithValue","setLocalWrapped","compileInlineConstant","retainType","shift","mask","conversionKind","wrapMode","compileAssertionExpression","compileBinaryExpression","compileCallExpression","compileCommaExpression","compileElementAccessExpression","compileFunctionExpression","compileIdentifierExpression","compileInstanceOfExpression","compileLiteralExpression","compileNewExpression","compileParenthesizedExpression","compilePropertyAccessExpression","compileTernaryExpression","compileUnaryPostfixExpression","compileUnaryPrefixExpression","convertExpression","ensureSmallIntegerWrap","fromType","Conversion_from_type_0_to_1_requires_an_explicit_cast","PromoteF32","DemoteF64","NeF32","TruncF32ToI64","TruncF32ToI32","TruncF32ToU64","TruncF32ToU32","NeF64","TruncF64ToI64","TruncF64ToI32","TruncF64ToU64","TruncF64ToU32","ConvertI64ToF32","ConvertU64ToF32","ConvertI32ToF32","ConvertU32ToF32","ConvertI64ToF64","ConvertU64ToF64","ConvertI32ToF64","ConvertU32ToF64","NeI64","WrapI64","ExtendI32","ExtendU32","PREFIX","leftExpr","leftType","rightExpr","rightType","commonType","compound","compileBinaryOverload","Operator_0_cannot_be_applied_to_types_1_and_2","LtI32","LtI64","LtU32","LtU64","LtF32","LtF64","GtI32","GtI64","GtU32","GtU64","GtF32","GtF64","LeI32","LeI64","LeU32","LeU64","LeF32","LeF64","GeI32","GeI64","GeU32","GeU64","GeF32","GeF64","EqI64","EqF32","EqF64","NeI32","compileAssignment","AddI64","AddF32","AddF64","SubI32","SubI64","SubF32","SubF64","MulI32","MulI64","MulF32","MulF64","namespace","makeCallDirect","DivI32","DivI64","DivU32","DivU64","DivF32","DivF64","RemI32","RemI64","RemU32","RemU64","intType","ShlI32","ShlI64","The_0_operator_cannot_be_applied_to_type_1","ShrI32","ShrI64","ShrU32","ShrU64","AndI32","AndI64","OrI32","OrI64","XorI32","XorI64","getAndFreeTempLocal","compileUnaryOverload","valueExpr","argumentExpressions","thisArg","compileCallDirect","valueExpression","Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property","isUnchecked","indexedSet","Index_signature_in_type_0_only_permits_reading","valueWithCorrectType","tee","thisExpression","thisExpr","flow_2","nativeReturnType","thisExpr_1","elementExpr","tempLocalTarget","tempLocalElement","flow_3","Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors","baseClassInstance","ensureConstructor","_super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class","indexArg","compileCallExpressionBuiltin","inferredTypes","argumentNodes","numArguments","argumentExprs","templateName","argumentExpression","inferredType","concreteType","compileCallIndirect","compileCall","checkCallSignature","hasThis","minimum","Expected_at_least_0_arguments_but_got_1","compileCallInlinePrechecked","pop","Function_0_cannot_be_inlined_into_itself","numArgumentsInclThis","createInline","baseInstance","addScopedAlias","paramExpr","argumentLocal","original","originalSignature","originalName","originalParameterTypes","originalParameterDeclarations","commonReturnType","commonThisType","minArguments","minOperands","maxArguments","maxOperands","numOptional","forwardedOperands","operandIndex","trampolineSignature","ofN","argc","Optional_parameter_must_have_an_initializer","ensureArgcVar","setargc","numOperands","isCallImport","allOptionalsAreConstant","makeCallIndirect","numExpressions","exprs","simpleName","maybeCompileEnclosingSource","retainConstantType","flow_4","actualFunction_1","_super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class","scopedThis","superType","localType","A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums","actualType","implicitNegate","compileArrayLiteral","floatValue","i64_to_f32","i64_to_f64","compileStringLiteral","compileObjectLiteral","ensureStaticString","stringValue","stringSegment","headerSize","totalSize","buf","writeI32","ensureGCHook","writeI16","stringOffset","ensureStaticArray","elementType","usizeTypeSize","bufferInstance","bufferHeaderSize","bufferTotalSize","clz","writeI8","writeI64","writeF32","writeF64","bufferOffset","arrayInstance","arrayHeaderSize","arrayOffset","buffer_offset","length_offset","isConst","compiledValues","constantValues","nativeElementType","arrayType","nativeArrayType","ctor","Constructor_of_class_0_must_not_require_any_arguments","Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration","Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration","hasErrors","Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature","compileInstantiate","baseCtor","theEnum","Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set","compileGetter","ifThenFlow","ifThenExpr","ifThenType","ifElseFlow","ifElseExpr","ifElseType","getValue","calcValue","setValue","NegF32","NegF64","makeIsFalseish","ExtendI8ToI32","ExtendI16ToI32","allocateInstance","nativeFieldType","FlowFlags","wrappedLocals","wrappedLocalsExt","inlineFunction","branch","slice","wrapped","temps","scopedLocal","existingLocal","SCOPED","scopedAlias","scope","isLocalWrapped","bitsetIs","ext","bitsetSet","id","stack","other","i64_and","leftExt","rightExt","thisExt","minLength","min","canConversionOverflow","SetLocal","global_1","ClzI32","CtzI32","PopcntI32","MIN_VALUE","last","If","Select","Call","Decompiler","functionId","decompile","decompiler","decompileFunction","nativeTypeToType","decompileExpression","nested","Loop","Switch","CallIndirect","SetGlobal","Store","i64_to_string","AbsF32","CeilF32","FloorF32","TruncF32","NearestF32","SqrtF32","ClzI64","CtzI64","PopcntI64","AbsF64","CeilF64","FloorF64","TruncF64","NearestF64","SqrtF64","ReinterpretF32","ReinterpretF64","ReinterpretI32","ReinterpretI64","RotlI32","RotrI32","RotlI64","RotrI64","CopysignF32","MinF32","MaxF32","CopysignF64","MinF64","MaxF64","Drop","Host","CurrentMemory","GrowMemory","AtomicCmpxchg","AtomicRMW","AtomicWait","AtomicWake","Auto","ExportsWalker","includePrivate","todo","seen","Set","walk","visitElement","visitGlobal","visitEnum","visitFunctionInstances","visitClassInstances","visitField","visitPropertyInstances","prop","visitFunction","hasCompiledMember","visitNamespace","visitClass","IDLBuilder","indentLevel","build","indent","typeToString","visitInterface","TSDBuilder","numMembers","members_2","members_2_1","isInterface","Parser","backlog","seenlog","donelog","tryParseSignatureIsSignature","parseParametersThis","parseFile","indexOf","tn","parseTopLevelStatement","startPos","parseDecorator","skipStatement","exportStart","exportEnd","contextIsAmbient","A_declare_modifier_cannot_be_used_in_an_already_ambient_context","first","parseEnum","parseVariable","parseFunction","parseStatement","parseClassOrInterface","parseNamespace","parseExportImport","parseImport","parseTypeDeclaration","parseExport","_0_modifier_cannot_be_used_here","Decorators_are_not_valid_here","nextFile","clear","parseType","acceptParenthesized","suppressErrors","isNullableSignature","tryParseSignature","Unexpected_token","innerType","Identifier_expected","nullable","parameter","bracketStart","bracketRange","isSignature","A_rest_parameter_cannot_be_optional","OPTIONAL","param","parseArguments","parseVariableDeclaration","parentFlags","parentDecorators","DEFINITE_ASSIGNMENT","Initializers_are_not_allowed_in_ambient_contexts","parseExpression","A_definite_assignment_assertion_is_not_permitted_in_this_context","parseEnumValue","parseReturn","parseTypeParameters","seenOptional","typeParameter","parseTypeParameter","Required_type_parameters_may_not_follow_optional_type_parameters","Type_parameter_list_cannot_be_empty","parseParameters","isConstructor","seenRest","reportedRest","parseParameter","A_rest_parameter_must_be_last_in_a_parameter_list","A_required_parameter_cannot_follow_an_optional_parameter","isRest","isOptional","startRange","accessFlags","A_parameter_property_cannot_be_declared_using_a_rest_parameter","A_rest_parameter_cannot_have_an_initializer","Parameter_cannot_have_question_mark_and_initializer","signatureStart","isSetter","A_set_accessor_must_have_exactly_one_parameter","A_set_accessor_parameter_cannot_have_an_initializer","A_get_accessor_cannot_have_parameters","parseBlockStatement","parseFunctionExpression","isArrow","parseFunctionExpressionCommon","Interface_declaration_cannot_have_implements_clause","parseClassMember","parseClassExpression","VIRTUAL","accessStart","accessEnd","staticStart","staticEnd","abstractStart","abstractEnd","GENERIC_CONTEXT","readonlyStart","readonlyEnd","setEnd","retIndex","parseIndexSignatureDeclaration","typeParametersStart","Type_parameters_cannot_appear_on_a_constructor_declaration","An_accessor_cannot_have_type_parameters","Type_annotation_cannot_appear_on_a_constructor_declaration","A_set_accessor_cannot_have_a_return_type_annotation","Method_0_cannot_have_an_implementation_because_it_is_marked_abstract","retMethod","Constructor_implementation_is_missing","Optional_properties_are_not_supported","retField","parseExportMember","asIdentifier","skipFrom","parseImportDeclaration","topLevel","parseBreak","parseContinue","parseDoStatement","parseForStatement","parseIfStatement","A_return_statement_can_only_be_used_within_a_function_body","parseSwitchStatement","parseThrowStatement","parseTryStatement","parseVoidStatement","parseWhileStatement","parseExpressionStatement","elseStatement","case_","parseSwitchCase","_case_or_default_expected","parseExpressionStart","precedence","determinePrecedenceStart","The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access","again","startPos_1","_super_must_be_followed_by_an_argument_list_or_member_access","regexpPattern","Expression_expected","tryParseTypeArgumentsBeforeArguments","nextPrecedence","maybeParseCallExpression","determinePrecedence","commaExprs","isRightAssociative","joinPropertyCall","callee","inner","skipBlock","depth","Precedence","binaryen","wrapModule","emitStackIR","emitAsmjs","Binaryen","__memory_allocate","_malloc","__memory_free","_free","__memory_copy","_memmove","__store","HEAPU8","__load","globalScope","ASC_FEATURE_THREADS","Float64Array","Uint32Array","UnreachableError","captureStackTrace","AssertionError","defineProperties","writable","fround","EPSILON","MIN_NORMAL_VALUE","MIN_SAFE_INTEGER","MAX_SAFE_INTEGER","clz32","abs","floor","trunc","round","sqrt","x","y","sign","isTrueish","radix","parseInt","undefined","fromCodePoint","Number","isInteger","isArray","signbit","Boolean","HEAP","HEAP_OFFSET","oldHeap","fill","copy","copyWithin","Float32Array","Int32Array","f32_as_i32","i32_as_f32","f64_as_i64","i64_as_f64","Long","ZERO","i64_one","ONE","lo","hi","fromBits","low","high","sub","mul","i64_div","div","i64_div_u","toUnsigned","toSigned","i64_rem","i64_rem_u","and","i64_or","or","i64_xor","xor","shl","i64_shr","shr","shru","i64_not","not","i64_eq","eq","i64_ne","ne","fromInt","minSafeF32","fromNumber","maxSafeF32","i64_is_f32","gte","lte","minSafeF64","maxSafeF64","i64_is_f64","toNumber","unsigned","wasm","WebAssembly","Instance","isLong","obj","__isLong__","INT_CACHE","UINT_CACHE","cachedObj","cache","isNaN","UZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_63_DBL","neg","TWO_PWR_32_DBL","lowBits","highBits","pow_dbl","fromString","RangeError","radixToPower","power","fromValue","TWO_PWR_16_DBL","TWO_PWR_24","UONE","NEG_ONE","LongPrototype","toInt","isZero","isNegative","radixLong","rem1","rem","remDiv","digits","getHighBits","getHighBitsUnsigned","getLowBits","getLowBitsUnsigned","getNumBitsAbs","bit","eqz","isPositive","isOdd","isEven","equals","notEquals","neq","lessThan","comp","lt","lessThanOrEqual","le","greaterThan","gt","greaterThanOrEqual","ge","compare","thisNeg","otherNeg","negate","addend","a48","a32","a16","a00","b48","b32","b16","c48","c32","c16","c00","subtract","subtrahend","multiply","multiplier","get_high","b00","divide","divisor","approx","res","div_u","div_s","log2","log","LN2","delta","approxRes","approxRem","modulo","rem_u","rem_s","shiftLeft","numBits","shiftRight","shiftRightUnsigned","shr_u","toBytes","toBytesLE","toBytesBE","fromBytes","fromBytesLE","fromBytesBE","compiler","evaluateConstantType","isFloat","isSigned","isReference","isString","isFunction","isDefined","SWALLOW","isConstant","expr_1","ctz","popcnt","rotl","rotr","tempLocal1","tempLocalIndex2","tempLocalIndex1","wasm64","tempLocal0","copysign","nearest","reinterpret","evaluateConstantOffset","atomic_load","atomic_store","atomic_add","atomic_sub","atomic_and","atomic_or","atomic_xor","atomic_xchg","RMWOp","Add","Sub","And","Or","Xor","Xchg","atomic_cmpxchg","atomic_wait","hasError","atomic_notify","sizeof","alignof","alignLog2","Type_0_has_no_property_1","select","unreachable","memory_size","memory_grow","memory_copy","memory_fill","call_indirect","operandExprs","signatureParts","nativeParamTypes","operandType","instantiate","User_defined_0","iterateRoots","expr_2","i32_clz","deferASM","i64_clz","i32_ctz","i64_ctz","i32_popcnt","i64_popcnt","i32_rotl","i64_rotl","i32_rotr","i64_rotr","f32_abs","f64_abs","f32_max","f64_max","f32_min","f64_min","f32_ceil","f64_ceil","f32_floor","f64_floor","f32_copysign","f64_copysign","f32_nearest","f64_nearest","i32_reinterpret_f32","i64_reinterpret_f64","f32_reinterpret_i32","f64_reinterpret_i64","f32_sqrt","f64_sqrt","f32_trunc","f64_trunc","i32_load8_s","i32_load8_u","i32_load16_s","i32_load16_u","i32_load","i64_load8_s","i64_load8_u","i64_load16_s","i64_load16_u","i64_load32_s","i64_load32_u","i64_load","f32_load","f64_load","i32_store8","i32_store16","i32_store","i64_store8","i64_store16","i64_store32","i64_store","f32_store","f64_store","i32_atomic_load8_u","i32_atomic_load16_u","i32_atomic_load","i64_atomic_load8_u","i64_atomic_load16_u","i64_atomic_load32_u","i64_atomic_load","i32_atomic_store8","i32_atomic_store16","i32_atomic_store","i64_atomic_store8","i64_atomic_store16","i64_atomic_store32","i64_atomic_store","i32_atomic_rmw8_u_add","i32_atomic_rmw16_u_add","i32_atomic_rmw_add","i64_atomic_rmw8_u_add","i64_atomic_rmw16_u_add","i64_atomic_rmw32_u_add","i64_atomic_rmw_add","i32_atomic_rmw8_u_sub","i32_atomic_rmw16_u_sub","i32_atomic_rmw_sub","i64_atomic_rmw8_u_sub","i64_atomic_rmw16_u_sub","i64_atomic_rmw32_u_sub","i64_atomic_rmw_sub","i32_atomic_rmw8_u_and","i32_atomic_rmw16_u_and","i32_atomic_rmw_and","i64_atomic_rmw8_u_and","i64_atomic_rmw16_u_and","i64_atomic_rmw32_u_and","i64_atomic_rmw_and","i32_atomic_rmw8_u_or","i32_atomic_rmw16_u_or","i32_atomic_rmw_or","i64_atomic_rmw8_u_or","i64_atomic_rmw16_u_or","i64_atomic_rmw32_u_or","i64_atomic_rmw_or","i32_atomic_rmw8_u_xor","i32_atomic_rmw16_u_xor","i32_atomic_rmw_xor","i64_atomic_rmw8_u_xor","i64_atomic_rmw16_u_xor","i64_atomic_rmw32_u_xor","i64_atomic_rmw_xor","i32_atomic_rmw8_u_xchg","i32_atomic_rmw16_u_xchg","i32_atomic_rmw_xchg","i64_atomic_rmw8_u_xchg","i64_atomic_rmw16_u_xchg","i64_atomic_rmw32_u_xchg","i64_atomic_rmw_xchg","i32_atomic_rmw8_u_cmpxchg","i32_atomic_rmw16_u_cmpxchg","i32_atomic_rmw_cmpxchg","i64_atomic_rmw8_u_cmpxchg","i64_atomic_rmw16_u_cmpxchg","i64_atomic_rmw32_u_cmpxchg","i64_atomic_rmw_cmpxchg","i32_wait","i64_wait","i32_notify","i64_notify","deferASMCall","Expression_must_be_a_compile_time_constant","messageArg","filenameArg","existingIndex","isDeclaredInLibrary","gcPrototype","gcInstance","nativeSizeSize","funcName","map","isSet","CharCode","lookupInUnicodeMap","unicodeIdentifierStart","unicodeIdentifierPart","mid","midVal","makeArray","cloned","makeSet","original_1","original_1_1","v","overrides","original_2","original_2_1","overrides_1","overrides_1_1","overrides_2","overrides_2_1","separator","ipos","dirname","origin","indentX1","indentX2","indentX4","readI32","readI64","readI8","readI16","readF32","readF64","valueI64","decompiler_1","definitions_1","formatDiagnostic","parser_1","parser","nextDiagnostic","isInfo","isWarning","isError","createOptions","setTarget","setNoAssert","setImportMemory","setSharedMemory","setImportTable","setSourceMap","setMemoryBase","setGlobalAlias","FEATURE_SIGN_EXTENSION","FEATURE_MUTABLE_GLOBAL","FEATURE_BULK_MEMORY","FEATURE_SIMD","FEATURE_THREADS","enableFeature","setOptimizeLevelHints","optimizeLevel","shrinkLevel","finishParsing","compileProgram","decompileModule","buildIDL","buildTSD"],"mappings":"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KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAC1C,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OAEtCC,EAA+B,CACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACtE,IAAK,IAAK,IAAK,IAAK,IACpB,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KACxE,KAAM,KAAM,KAAM,KAAM,KACxB,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,KAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MACtE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,M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","file":"assemblyscript.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"binaryen\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"binaryen\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"assemblyscript\"] = factory(require(\"binaryen\"));\n\telse\n\t\troot[\"assemblyscript\"] = factory(root[\"binaryen\"]);\n})(typeof self !== 'undefined' ? self : this, function(__WEBPACK_EXTERNAL_MODULE__19__) {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 16);\n","/**\n * Common constants.\n * @module common\n *//***/\n\n/** Indicates traits of a {@link Node} or {@link Element}. */\nexport enum CommonFlags {\n /** No flags set. */\n NONE = 0,\n\n // Basic modifiers\n\n /** Has an `import` modifier. */\n IMPORT = 1 << 0,\n /** Has an `export` modifier. */\n EXPORT = 1 << 1,\n /** Has a `declare` modifier. */\n DECLARE = 1 << 2,\n /** Has a `const` modifier. */\n CONST = 1 << 3,\n /** Has a `let` modifier. */\n LET = 1 << 4,\n /** Has a `static` modifier. */\n STATIC = 1 << 5,\n /** Has a `readonly` modifier. */\n READONLY = 1 << 6,\n /** Has an `abstract` modifier. */\n ABSTRACT = 1 << 7,\n /** Has a `public` modifier. */\n PUBLIC = 1 << 8,\n /** Has a `private` modifier. */\n PRIVATE = 1 << 9,\n /** Has a `protected` modifier. */\n PROTECTED = 1 << 10,\n /** Has a `get` modifier. */\n GET = 1 << 11,\n /** Has a `set` modifier. */\n SET = 1 << 12,\n /** Has a definite assignment assertion `!` as in `x!: i32;`. */\n DEFINITE_ASSIGNMENT = 1 << 13,\n\n // Extended modifiers usually derived from basic modifiers\n\n /** Is ambient, that is either declared or nested in a declared element. */\n AMBIENT = 1 << 14,\n /** Is generic. */\n GENERIC = 1 << 15,\n /** Is part of a generic context. */\n GENERIC_CONTEXT = 1 << 16,\n /** Is an instance member. */\n INSTANCE = 1 << 17,\n /** Is a constructor. */\n CONSTRUCTOR = 1 << 18,\n /** Is an arrow function. */\n ARROW = 1 << 19,\n /** Is a module export. */\n MODULE_EXPORT = 1 << 20,\n /** Is a module import. */\n MODULE_IMPORT = 1 << 21,\n\n // Compilation states\n\n /** Is resolved. */\n RESOLVED = 1 << 22,\n /** Is compiled. */\n COMPILED = 1 << 23,\n /** Has a constant value and is therefore inlined. */\n INLINED = 1 << 24,\n /** Is scoped. */\n SCOPED = 1 << 25,\n /** Is a trampoline. */\n TRAMPOLINE = 1 << 26,\n /** Is a virtual method. */\n VIRTUAL = 1 << 27,\n /** Is the main function. */\n MAIN = 1 << 28,\n\n // Other\n\n QUOTED = 1 << 29\n}\n\n/** Path delimiter inserted between file system levels. */\nexport const PATH_DELIMITER = \"/\";\n/** Substitution used to indicate the parent directory. */\nexport const PARENT_SUBST = \"..\";\n/** Function name prefix used for getters. */\nexport const GETTER_PREFIX = \"get:\";\n/** Function name prefix used for setters. */\nexport const SETTER_PREFIX = \"set:\";\n/** Delimiter used between class names and instance members. */\nexport const INSTANCE_DELIMITER = \"#\";\n/** Delimiter used between class and namespace names and static members. */\nexport const STATIC_DELIMITER = \".\";\n/** Delimiter used between a function and its inner elements. */\nexport const INNER_DELIMITER = \"~\";\n/** Substitution used to indicate a library directory. */\nexport const LIBRARY_SUBST = \"~lib\";\n/** Library directory prefix. */\nexport const LIBRARY_PREFIX = LIBRARY_SUBST + PATH_DELIMITER;\n/** Path index suffix. */\nexport const INDEX_SUFFIX = PATH_DELIMITER + \"index\";\n\n/** Common compiler symbols. */\nexport namespace CommonSymbols {\n // special\n export const EMPTY = \"\";\n // types\n export const i8 = \"i8\";\n export const i16 = \"i16\";\n export const i32 = \"i32\";\n export const i64 = \"i64\";\n export const isize = \"isize\";\n export const u8 = \"u8\";\n export const u16 = \"u16\";\n export const u32 = \"u32\";\n export const u64 = \"u64\";\n export const usize = \"usize\";\n export const bool = \"bool\";\n export const f32 = \"f32\";\n export const f64 = \"f64\";\n export const v128 = \"v128\";\n export const void_ = \"void\";\n export const number = \"number\";\n export const boolean = \"boolean\";\n export const string = \"string\";\n export const native = \"native\";\n // aliases\n export const null_ = \"null\";\n export const true_ = \"true\";\n export const false_ = \"false\";\n // objects\n export const this_ = \"this\";\n export const super_ = \"super\";\n export const constructor = \"constructor\";\n}\n\n/** Common standard library symbols. */\nexport namespace LibrarySymbols {\n // constants\n export const ASC_TARGET = \"ASC_TARGET\";\n export const ASC_NO_TREESHAKING = \"ASC_NO_TREESHAKING\";\n export const ASC_NO_ASSERT = \"ASC_NO_ASSERT\";\n export const ASC_MEMORY_BASE = \"ASC_MEMORY_BASE\";\n export const ASC_OPTIMIZE_LEVEL = \"ASC_OPTIMIZE_LEVEL\";\n export const ASC_SHRINK_LEVEL = \"ASC_SHRINK_LEVEL\";\n export const ASC_FEATURE_MUTABLE_GLOBAL = \"ASC_FEATURE_MUTABLE_GLOBAL\";\n export const ASC_FEATURE_SIGN_EXTENSION = \"ASC_FEATURE_SIGN_EXTENSION\";\n export const ASC_FEATURE_BULK_MEMORY = \"ASC_FEATURE_BULK_MEMORY\";\n export const ASC_FEATURE_SIMD = \"ASC_FEATURE_SIMD\";\n // classes\n export const I8 = \"I8\";\n export const I16 = \"I16\";\n export const I32 = \"I32\";\n export const I64 = \"I64\";\n export const Isize = \"Isize\";\n export const U8 = \"U8\";\n export const U16 = \"U16\";\n export const U32 = \"U32\";\n export const U64 = \"U64\";\n export const Usize = \"Usize\";\n export const Bool = \"Bool\";\n export const F32 = \"F32\";\n export const F64 = \"F64\";\n export const V128 = \"V128\";\n export const String = \"String\";\n export const Array = \"Array\";\n export const ArrayBuffer = \"ArrayBuffer\";\n export const Math = \"Math\";\n export const Mathf = \"Mathf\";\n // runtime\n export const memory = \"memory\";\n export const allocate = \"allocate\";\n export const abort = \"abort\";\n export const main = \"main\";\n // other\n export const length = \"length\";\n export const byteLength = \"byteLength\";\n export const pow = \"pow\";\n export const mod = \"mod\";\n}\n","/**\n * Shared diagnostic handling inherited by the parser and the compiler.\n * @module diagnostics\n * @preferred\n *//***/\n\nimport {\n Range\n} from \"./ast\";\n\nimport {\n DiagnosticCode,\n diagnosticCodeToString\n} from \"./diagnosticMessages.generated\";\n\nimport {\n isLineBreak\n} from \"./util\";\n\nexport {\n DiagnosticCode,\n diagnosticCodeToString\n} from \"./diagnosticMessages.generated\";\n\n/** Indicates the category of a {@link DiagnosticMessage}. */\nexport enum DiagnosticCategory {\n /** Informatory message. */\n INFO,\n /** Warning message. */\n WARNING,\n /** Error message. */\n ERROR\n}\n\n/** Returns the string representation of the specified diagnostic category. */\nexport function diagnosticCategoryToString(category: DiagnosticCategory): string {\n switch (category) {\n case DiagnosticCategory.INFO: return \"INFO\";\n case DiagnosticCategory.WARNING: return \"WARNING\";\n case DiagnosticCategory.ERROR: return \"ERROR\";\n default: {\n assert(false);\n return \"\";\n }\n }\n}\n\n/** ANSI escape sequence for blue foreground. */\nexport const COLOR_BLUE: string = \"\\u001b[96m\";\n/** ANSI escape sequence for yellow foreground. */\nexport const COLOR_YELLOW: string = \"\\u001b[93m\";\n/** ANSI escape sequence for red foreground. */\nexport const COLOR_RED: string = \"\\u001b[91m\";\n/** ANSI escape sequence to reset the foreground color. */\nexport const COLOR_RESET: string = \"\\u001b[0m\";\n\n/** Returns the ANSI escape sequence for the specified category. */\nexport function diagnosticCategoryToColor(category: DiagnosticCategory): string {\n switch (category) {\n case DiagnosticCategory.INFO: return COLOR_BLUE;\n case DiagnosticCategory.WARNING: return COLOR_YELLOW;\n case DiagnosticCategory.ERROR: return COLOR_RED;\n default: {\n assert(false);\n return \"\";\n }\n }\n}\n\n/** Represents a diagnostic message. */\nexport class DiagnosticMessage {\n\n /** Message code. */\n code: i32;\n /** Message category. */\n category: DiagnosticCategory;\n /** Message text. */\n message: string;\n /** Respective source range, if any. */\n range: Range | null = null;\n /** Related range, if any. */\n relatedRange: Range | null = null;\n\n /** Constructs a new diagnostic message. */\n private constructor(code: i32, category: DiagnosticCategory, message: string) {\n this.code = code;\n this.category = category;\n this.message = message;\n }\n\n /** Creates a new diagnostic message of the specified category. */\n static create(\n code: DiagnosticCode,\n category: DiagnosticCategory,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): DiagnosticMessage {\n var message = diagnosticCodeToString(code);\n if (arg0 != null) message = message.replace(\"{0}\", arg0);\n if (arg1 != null) message = message.replace(\"{1}\", arg1);\n if (arg2 != null) message = message.replace(\"{2}\", arg2);\n return new DiagnosticMessage(code, category, message);\n }\n\n /** Creates a new informatory diagnostic message. */\n static createInfo(\n code: DiagnosticCode,\n arg0: string | null = null,\n arg1: string | null = null\n ): DiagnosticMessage {\n return DiagnosticMessage.create(code, DiagnosticCategory.INFO, arg0, arg1);\n }\n\n /** Creates a new warning diagnostic message. */\n static createWarning(\n code: DiagnosticCode,\n arg0: string | null = null,\n arg1: string | null = null\n ): DiagnosticMessage {\n return DiagnosticMessage.create(code, DiagnosticCategory.WARNING, arg0, arg1);\n }\n\n /** Creates a new error diagnostic message. */\n static createError(\n code: DiagnosticCode,\n arg0: string | null = null,\n arg1: string | null = null\n ): DiagnosticMessage {\n return DiagnosticMessage.create(code, DiagnosticCategory.ERROR, arg0, arg1);\n }\n\n /** Adds a source range to this message. */\n withRange(range: Range): this {\n this.range = range;\n return this;\n }\n\n /** Adds a related source range to this message. */\n withRelatedRange(range: Range): this {\n this.relatedRange = range;\n return this;\n }\n\n /** Converts this message to a string. */\n toString(): string {\n if (this.range) {\n return (\n diagnosticCategoryToString(this.category) +\n \" \" +\n this.code.toString(10) +\n \": \\\"\" +\n this.message +\n \"\\\" in \" +\n this.range.source.normalizedPath +\n \":\" +\n this.range.line.toString(10) +\n \":\" +\n this.range.column.toString(10)\n );\n }\n return (\n diagnosticCategoryToString(this.category) +\n \" \" +\n this.code.toString(10) +\n \": \" +\n this.message\n );\n }\n}\n\n/** Formats a diagnostic message, optionally with terminal colors and source context. */\nexport function formatDiagnosticMessage(\n message: DiagnosticMessage,\n useColors: bool = false,\n showContext: bool = false\n): string {\n\n // general information\n var sb: string[] = [];\n if (useColors) sb.push(diagnosticCategoryToColor(message.category));\n sb.push(diagnosticCategoryToString(message.category));\n if (useColors) sb.push(COLOR_RESET);\n sb.push(message.code < 1000 ? \" AS\" : \" TS\");\n sb.push(message.code.toString(10));\n sb.push(\": \");\n sb.push(message.message);\n\n // include range information if available\n if (message.range) {\n\n // include context information if requested\n let range = message.range;\n if (showContext) {\n sb.push(\"\\n\");\n sb.push(formatDiagnosticContext(range, useColors));\n }\n sb.push(\"\\n\");\n sb.push(\" in \");\n sb.push(range.source.normalizedPath);\n sb.push(\"(\");\n sb.push(range.line.toString(10));\n sb.push(\",\");\n sb.push(range.column.toString(10));\n sb.push(\")\");\n\n let relatedRange = message.relatedRange;\n if (relatedRange) {\n if (showContext) {\n sb.push(\"\\n\");\n sb.push(formatDiagnosticContext(relatedRange, useColors));\n }\n sb.push(\"\\n\");\n sb.push(\" in \");\n sb.push(range.source.normalizedPath);\n sb.push(\"(\");\n sb.push(range.line.toString(10));\n sb.push(\",\");\n sb.push(range.column.toString(10));\n sb.push(\")\");\n }\n }\n return sb.join(\"\");\n}\n\n/** Formats the diagnostic context for the specified range, optionally with terminal colors. */\nexport function formatDiagnosticContext(range: Range, useColors: bool = false): string {\n var text = range.source.text;\n var len = text.length;\n var start = range.start;\n var end = range.end;\n while (start > 0 && !isLineBreak(text.charCodeAt(start - 1))) start--;\n while (end < len && !isLineBreak(text.charCodeAt(end))) end++;\n var sb: string[] = [\n \"\\n \",\n text.substring(start, end),\n \"\\n \"\n ];\n while (start < range.start) {\n sb.push(\" \");\n start++;\n }\n if (useColors) sb.push(COLOR_RED);\n if (range.start == range.end) {\n sb.push(\"^\");\n } else {\n while (start++ < range.end) sb.push(\"~\");\n }\n if (useColors) sb.push(COLOR_RESET);\n return sb.join(\"\");\n}\n\n/** Base class of all diagnostic emitters. */\nexport abstract class DiagnosticEmitter {\n\n /** Diagnostic messages emitted so far. */\n diagnostics: DiagnosticMessage[];\n\n /** Initializes this diagnostic emitter. */\n protected constructor(diagnostics: DiagnosticMessage[] | null = null) {\n this.diagnostics = diagnostics ? diagnostics : new Array();\n }\n\n /** Emits a diagnostic message of the specified category. */\n emitDiagnostic(\n code: DiagnosticCode,\n category: DiagnosticCategory,\n range: Range,\n relatedRange: Range | null,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n var message = DiagnosticMessage.create(code, category, arg0, arg1, arg2).withRange(range);\n if (relatedRange) message.relatedRange = relatedRange;\n this.diagnostics.push(message);\n // console.log(formatDiagnosticMessage(message, true, true) + \"\\n\"); // temporary\n // console.log(new Error(\"stack\").stack);\n }\n\n /** Emits an informatory diagnostic message. */\n info(\n code: DiagnosticCode,\n range: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n this.emitDiagnostic(code, DiagnosticCategory.INFO, range, null, arg0, arg1, arg2);\n }\n\n /** Emits an informatory diagnostic message with a related range. */\n infoRelated(\n code: DiagnosticCode,\n range: Range,\n relatedRange: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n this.emitDiagnostic(code, DiagnosticCategory.INFO, range, relatedRange, arg0, arg1, arg2);\n }\n\n /** Emits a warning diagnostic message. */\n warning(\n code: DiagnosticCode,\n range: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, null, arg0, arg1, arg2);\n }\n\n /** Emits a warning diagnostic message with a related range. */\n warningRelated(\n code: DiagnosticCode,\n range: Range,\n relatedRange: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n this.emitDiagnostic(code, DiagnosticCategory.WARNING, range, relatedRange, arg0, arg1, arg2);\n }\n\n /** Emits an error diagnostic message. */\n error(\n code: DiagnosticCode,\n range: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, null, arg0, arg1, arg2);\n }\n\n /** Emits an error diagnostic message with a related range. */\n errorRelated(\n code: DiagnosticCode,\n range: Range,\n relatedRange: Range,\n arg0: string | null = null,\n arg1: string | null = null,\n arg2: string | null = null\n ): void {\n this.emitDiagnostic(code, DiagnosticCategory.ERROR, range, relatedRange, arg0, arg1, arg2);\n }\n}\n","/**\n * Various compiler utilities.\n * @module util\n * @preferred\n *//***/\n\nexport * from \"./bitset\";\nexport * from \"./charcode\";\nexport * from \"./collections\";\nexport * from \"./path\";\nexport * from \"./text\";\nexport * from \"./binary\";\n","/**\n * AssemblyScript's intermediate representation describing a program's elements.\n * @module program\n *//***/\n\nimport {\n CommonFlags,\n PATH_DELIMITER,\n STATIC_DELIMITER,\n INSTANCE_DELIMITER,\n GETTER_PREFIX,\n SETTER_PREFIX,\n INNER_DELIMITER,\n LIBRARY_SUBST,\n INDEX_SUFFIX,\n CommonSymbols,\n LibrarySymbols\n} from \"./common\";\n\nimport {\n Options,\n Feature\n} from \"./compiler\";\n\nimport {\n DiagnosticCode,\n DiagnosticMessage,\n DiagnosticEmitter\n} from \"./diagnostics\";\n\nimport {\n Type,\n TypeKind,\n TypeFlags,\n Signature\n} from \"./types\";\n\nimport {\n Node,\n NodeKind,\n Source,\n SourceKind,\n Range,\n DecoratorNode,\n DecoratorKind,\n SignatureNode,\n TypeParameterNode,\n CommonTypeNode,\n TypeNode,\n\n Expression,\n IdentifierExpression,\n LiteralExpression,\n LiteralKind,\n StringLiteralExpression,\n\n Statement,\n ClassDeclaration,\n DeclarationStatement,\n EnumDeclaration,\n EnumValueDeclaration,\n ExportMember,\n ExportStatement,\n FieldDeclaration,\n FunctionDeclaration,\n ImportDeclaration,\n ImportStatement,\n InterfaceDeclaration,\n MethodDeclaration,\n NamespaceDeclaration,\n TypeDeclaration,\n VariableDeclaration,\n VariableLikeDeclarationStatement,\n VariableStatement,\n\n decoratorNameToKind,\n findDecorator\n} from \"./ast\";\n\nimport {\n Module,\n FunctionRef\n} from \"./module\";\n\nimport {\n CharCode\n} from \"./util\";\n\nimport {\n Resolver\n} from \"./resolver\";\n\nimport {\n Flow\n} from \"./flow\";\n\n/** Represents a yet unresolved `import`. */\nclass QueuedImport {\n constructor(\n /** File being imported into. */\n public localFile: File,\n /** Identifier within the local file. */\n public localIdentifier: IdentifierExpression,\n /** Identifier within the other file. Is an `import *` if not set. */\n public foreignIdentifier: IdentifierExpression | null,\n /** Path to the other file. */\n public foreignPath: string,\n /** Alternative path to the other file. */\n public foreignPathAlt: string\n ) {}\n}\n\n/** Represents a yet unresolved `export`. */\nclass QueuedExport {\n constructor(\n /** Identifier within the local file. */\n public localIdentifier: IdentifierExpression,\n /** Identifier within the other file. */\n public foreignIdentifier: IdentifierExpression,\n /** Path to the other file if a re-export. */\n public foreignPath: string | null,\n /** Alternative path to the other file if a re-export. */\n public foreignPathAlt: string | null\n ) {}\n}\n\n/** Represents a yet unresolved `export *`. */\nclass QueuedExportStar {\n // stored in a map with localFile as the key\n constructor(\n /** Path to the other file. */\n public foreignPath: string,\n /** Alternative path to the other file. */\n public foreignPathAlt: string,\n /** Reference to the path literal for reporting. */\n public pathLiteral: StringLiteralExpression\n ) {}\n}\n\n/** Represents the kind of an operator overload. */\nexport enum OperatorKind {\n INVALID,\n\n // indexed access\n INDEXED_GET, // a[]\n INDEXED_SET, // a[]=b\n UNCHECKED_INDEXED_GET, // unchecked(a[])\n UNCHECKED_INDEXED_SET, // unchecked(a[]=b)\n\n // binary\n ADD, // a + b\n SUB, // a - b\n MUL, // a * b\n DIV, // a / b\n REM, // a % b\n POW, // a ** b\n BITWISE_AND, // a & b\n BITWISE_OR, // a | b\n BITWISE_XOR, // a ^ b\n BITWISE_SHL, // a << b\n BITWISE_SHR, // a >> b\n BITWISE_SHR_U, // a >>> b\n EQ, // a == b\n NE, // a != b\n GT, // a > b\n GE, // a >= b\n LT, // a < b\n LE, // a <= b\n\n // unary prefix\n PLUS, // +a\n MINUS, // -a\n NOT, // !a\n BITWISE_NOT, // ~a\n PREFIX_INC, // ++a\n PREFIX_DEC, // --a\n\n // unary postfix\n POSTFIX_INC, // a++\n POSTFIX_DEC // a--\n\n // not overridable:\n // IDENTITY // a === b\n // LOGICAL_AND // a && b\n // LOGICAL_OR // a || b\n}\n\n/** Returns the operator kind represented by the specified decorator and string argument. */\nfunction operatorKindFromDecorator(decoratorKind: DecoratorKind, arg: string): OperatorKind {\n assert(arg.length);\n switch (decoratorKind) {\n case DecoratorKind.OPERATOR:\n case DecoratorKind.OPERATOR_BINARY: {\n switch (arg.charCodeAt(0)) {\n case CharCode.OPENBRACKET: {\n if (arg == \"[]\") return OperatorKind.INDEXED_GET;\n if (arg == \"[]=\") return OperatorKind.INDEXED_SET;\n break;\n }\n case CharCode.OPENBRACE: {\n if (arg == \"{}\") return OperatorKind.UNCHECKED_INDEXED_GET;\n if (arg == \"{}=\") return OperatorKind.UNCHECKED_INDEXED_SET;\n break;\n }\n case CharCode.PLUS: {\n if (arg == \"+\") return OperatorKind.ADD;\n break;\n }\n case CharCode.MINUS: {\n if (arg == \"-\") return OperatorKind.SUB;\n break;\n }\n case CharCode.ASTERISK: {\n if (arg == \"*\") return OperatorKind.MUL;\n if (arg == \"**\") return OperatorKind.POW;\n break;\n }\n case CharCode.SLASH: {\n if (arg == \"/\") return OperatorKind.DIV;\n break;\n }\n case CharCode.PERCENT: {\n if (arg == \"%\") return OperatorKind.REM;\n break;\n }\n case CharCode.AMPERSAND: {\n if (arg == \"&\") return OperatorKind.BITWISE_AND;\n break;\n }\n case CharCode.BAR: {\n if (arg == \"|\") return OperatorKind.BITWISE_OR;\n break;\n }\n case CharCode.CARET: {\n if (arg == \"^\") return OperatorKind.BITWISE_XOR;\n break;\n }\n case CharCode.EQUALS: {\n if (arg == \"==\") return OperatorKind.EQ;\n break;\n }\n case CharCode.EXCLAMATION: {\n if (arg == \"!=\") return OperatorKind.NE;\n break;\n }\n case CharCode.GREATERTHAN: {\n if (arg == \">\") return OperatorKind.GT;\n if (arg == \">=\") return OperatorKind.GE;\n if (arg == \">>\") return OperatorKind.BITWISE_SHR;\n if (arg == \">>>\") return OperatorKind.BITWISE_SHR_U;\n break;\n }\n case CharCode.LESSTHAN: {\n if (arg == \"<\") return OperatorKind.LT;\n if (arg == \"<=\") return OperatorKind.LE;\n if (arg == \"<<\") return OperatorKind.BITWISE_SHL;\n break;\n }\n }\n break;\n }\n case DecoratorKind.OPERATOR_PREFIX: {\n switch (arg.charCodeAt(0)) {\n case CharCode.PLUS: {\n if (arg == \"+\") return OperatorKind.PLUS;\n if (arg == \"++\") return OperatorKind.PREFIX_INC;\n break;\n }\n case CharCode.MINUS: {\n if (arg == \"-\") return OperatorKind.MINUS;\n if (arg == \"--\") return OperatorKind.PREFIX_DEC;\n break;\n }\n case CharCode.EXCLAMATION: {\n if (arg == \"!\") return OperatorKind.NOT;\n break;\n }\n case CharCode.TILDE: {\n if (arg == \"~\") return OperatorKind.BITWISE_NOT;\n break;\n }\n }\n break;\n }\n case DecoratorKind.OPERATOR_POSTFIX: {\n switch (arg.charCodeAt(0)) {\n case CharCode.PLUS: {\n if (arg == \"++\") return OperatorKind.POSTFIX_INC;\n break;\n }\n case CharCode.MINUS: {\n if (arg == \"--\") return OperatorKind.POSTFIX_DEC;\n break;\n }\n }\n break;\n }\n }\n return OperatorKind.INVALID;\n}\n\n/** Represents an AssemblyScript program. */\nexport class Program extends DiagnosticEmitter {\n\n /** Resolver instance. */\n resolver: Resolver;\n /** Array of sources. */\n sources: Source[] = [];\n /** Diagnostic offset used where successively obtaining the next diagnostic. */\n diagnosticsOffset: i32 = 0;\n /** Compiler options. */\n options: Options;\n /** Special native code source. */\n nativeSource: Source;\n /** Special native code file. */\n nativeFile: File;\n /** Explicitly annotated start function. */\n explicitStartFunction: FunctionPrototype | null = null;\n\n // lookup maps\n\n /** Files by unique internal name. */\n filesByName: Map = new Map();\n /** Elements by unique internal name in element space. */\n elementsByName: Map = new Map();\n /** Elements by declaration. */\n elementsByDeclaration: Map = new Map();\n /** Element instances by unique internal name. */\n instancesByName: Map = new Map();\n /** Classes backing basic types like `i32`. */\n typeClasses: Map = new Map();\n\n // runtime references\n\n /** ArrayBuffer instance reference. */\n arrayBufferInstance: Class | null = null;\n /** Array prototype reference. */\n arrayPrototype: ClassPrototype | null = null;\n /** String instance reference. */\n stringInstance: Class | null = null;\n /** Abort function reference, if present. */\n abortInstance: Function | null = null;\n /** Memory allocation function. */\n memoryAllocateInstance: Function | null = null;\n\n // gc integration\n\n /** Whether a garbage collector is present or not. */\n hasGC: bool = false;\n /** Garbage collector allocation function. */\n gcAllocateInstance: Function | null = null;\n /** Garbage collector link function called when a managed object is referenced from a parent. */\n gcLinkInstance: Function | null = null;\n /** Garbage collector mark function called to on reachable managed objects. */\n gcMarkInstance: Function | null = null;\n /** Size of a managed object header. */\n gcHeaderSize: u32 = 0;\n /** Offset of the GC hook. */\n gcHookOffset: u32 = 0;\n\n /** Constructs a new program, optionally inheriting parser diagnostics. */\n constructor(\n /** Shared array of diagnostic messages (emitted so far). */\n diagnostics: DiagnosticMessage[] | null = null\n ) {\n super(diagnostics);\n var nativeSource = new Source(LIBRARY_SUBST, \"[native code]\", SourceKind.LIBRARY);\n this.nativeSource = nativeSource;\n var nativeFile = new File(this, nativeSource);\n this.nativeFile = nativeFile;\n this.filesByName.set(nativeFile.internalName, nativeFile);\n this.resolver = new Resolver(this);\n }\n\n /** Creates a native variable declaration. */\n makeNativeVariableDeclaration(\n /** The simple name of the variable */\n name: string,\n /** Flags indicating specific traits, e.g. `CONST`. */\n flags: CommonFlags = CommonFlags.NONE\n ): VariableDeclaration {\n var range = this.nativeSource.range;\n return Node.createVariableDeclaration(\n Node.createIdentifierExpression(name, range),\n null, null, null, flags, range\n );\n }\n\n /** Creates a native type declaration. */\n makeNativeTypeDeclaration(\n /** The simple name of the type. */\n name: string,\n /** Flags indicating specific traits, e.g. `GENERIC`. */\n flags: CommonFlags = CommonFlags.NONE\n ): TypeDeclaration {\n var range = this.nativeSource.range;\n var identifier = Node.createIdentifierExpression(name, range);\n return Node.createTypeDeclaration(\n identifier,\n null,\n Node.createOmittedType(range),\n null, flags, range\n );\n }\n\n // a dummy signature for programmatically generated native functions\n private nativeDummySignature: SignatureNode | null = null;\n\n /** Creates a native function declaration. */\n makeNativeFunctionDeclaration(\n /** The simple name of the function. */\n name: string,\n /** Flags indicating specific traits, e.g. `DECLARE`. */\n flags: CommonFlags = CommonFlags.NONE\n ): FunctionDeclaration {\n var range = this.nativeSource.range;\n return Node.createFunctionDeclaration(\n Node.createIdentifierExpression(name, range),\n null,\n this.nativeDummySignature || (this.nativeDummySignature = Node.createSignature([],\n Node.createType( // ^ AST signature doesn't really matter, is overridden anyway\n Node.createSimpleTypeName(CommonSymbols.void_, range),\n null, false, range\n ),\n null, false, range)\n ),\n null, null, flags, range\n );\n }\n\n /** Creates a native namespace declaration. */\n makeNativeNamespaceDeclaration(\n /** The simple name of the namespace. */\n name: string,\n /** Flags indicating specific traits, e.g. `EXPORT`. */\n flags: CommonFlags = CommonFlags.NONE\n ): NamespaceDeclaration {\n var range = this.nativeSource.range;\n return Node.createNamespaceDeclaration(\n Node.createIdentifierExpression(name, range),\n [], null, flags, range\n );\n }\n\n /** Creates a native function. */\n makeNativeFunction(\n /** The simple name of the function. */\n name: string,\n /** Concrete function signature. */\n signature: Signature,\n /** Parent element, usually a file, class or namespace. */\n parent: Element = this.nativeFile,\n /** Flags indicating specific traits, e.g. `GENERIC`. */\n flags: CommonFlags = CommonFlags.NONE,\n /** Decorator flags representing built-in decorators. */\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\n ): Function {\n return new Function(\n name,\n new FunctionPrototype(\n name,\n parent,\n this.makeNativeFunctionDeclaration(name, flags),\n decoratorFlags\n ),\n signature\n );\n }\n\n /** Gets the (possibly merged) program element linked to the specified declaration. */\n getElementByDeclaration(declaration: DeclarationStatement): DeclaredElement {\n var elementsByDeclaration = this.elementsByDeclaration;\n assert(elementsByDeclaration.has(declaration));\n return elementsByDeclaration.get(declaration)!;\n }\n\n /** Initializes the program and its elements prior to compilation. */\n initialize(options: Options): void {\n this.options = options;\n\n // register native types\n this.registerNativeType(CommonSymbols.i8, Type.i8);\n this.registerNativeType(CommonSymbols.i16, Type.i16);\n this.registerNativeType(CommonSymbols.i32, Type.i32);\n this.registerNativeType(CommonSymbols.i64, Type.i64);\n this.registerNativeType(CommonSymbols.isize, options.isizeType);\n this.registerNativeType(CommonSymbols.u8, Type.u8);\n this.registerNativeType(CommonSymbols.u16, Type.u16);\n this.registerNativeType(CommonSymbols.u32, Type.u32);\n this.registerNativeType(CommonSymbols.u64, Type.u64);\n this.registerNativeType(CommonSymbols.usize, options.usizeType);\n this.registerNativeType(CommonSymbols.bool, Type.bool);\n this.registerNativeType(CommonSymbols.f32, Type.f32);\n this.registerNativeType(CommonSymbols.f64, Type.f64);\n this.registerNativeType(CommonSymbols.void_, Type.void);\n this.registerNativeType(CommonSymbols.number, Type.f64); // alias\n this.registerNativeType(CommonSymbols.boolean, Type.bool); // alias\n this.nativeFile.add(CommonSymbols.native, new TypeDefinition(\n CommonSymbols.native,\n this.nativeFile,\n this.makeNativeTypeDeclaration(CommonSymbols.native, CommonFlags.EXPORT | CommonFlags.GENERIC),\n DecoratorFlags.BUILTIN\n ));\n if (options.hasFeature(Feature.SIMD)) this.registerNativeType(CommonSymbols.v128, Type.v128);\n\n // register compiler hints\n this.registerConstantInteger(LibrarySymbols.ASC_TARGET, Type.i32,\n i64_new(options.isWasm64 ? 2 : 1));\n this.registerConstantInteger(LibrarySymbols.ASC_NO_ASSERT, Type.bool,\n i64_new(options.noAssert ? 1 : 0, 0));\n this.registerConstantInteger(LibrarySymbols.ASC_MEMORY_BASE, Type.i32,\n i64_new(options.memoryBase, 0));\n this.registerConstantInteger(LibrarySymbols.ASC_OPTIMIZE_LEVEL, Type.i32,\n i64_new(options.optimizeLevelHint, 0));\n this.registerConstantInteger(LibrarySymbols.ASC_SHRINK_LEVEL, Type.i32,\n i64_new(options.shrinkLevelHint, 0));\n this.registerConstantInteger(LibrarySymbols.ASC_FEATURE_MUTABLE_GLOBAL, Type.bool,\n i64_new(options.hasFeature(Feature.MUTABLE_GLOBAL) ? 1 : 0, 0));\n this.registerConstantInteger(LibrarySymbols.ASC_FEATURE_SIGN_EXTENSION, Type.bool,\n i64_new(options.hasFeature(Feature.SIGN_EXTENSION) ? 1 : 0, 0));\n this.registerConstantInteger(LibrarySymbols.ASC_FEATURE_BULK_MEMORY, Type.bool,\n i64_new(options.hasFeature(Feature.BULK_MEMORY) ? 1 : 0, 0));\n this.registerConstantInteger(LibrarySymbols.ASC_FEATURE_SIMD, Type.bool,\n i64_new(options.hasFeature(Feature.SIMD) ? 1 : 0, 0));\n\n // remember deferred elements\n var queuedImports = new Array();\n var queuedExports = new Map>();\n var queuedExportsStar = new Map();\n var queuedExtends = new Array();\n var queuedImplements = new Array();\n\n // initialize relevant declaration-like statements of the entire program\n for (let i = 0, k = this.sources.length; i < k; ++i) {\n let source = this.sources[i];\n let file = new File(this, source);\n this.filesByName.set(file.internalName, file);\n let statements = source.statements;\n for (let j = 0, l = statements.length; j < l; ++j) {\n let statement = statements[j];\n switch (statement.kind) {\n case NodeKind.EXPORT: {\n this.initializeExports(statement, file, queuedExports, queuedExportsStar);\n break;\n }\n case NodeKind.IMPORT: {\n this.initializeImports(statement, file, queuedImports, queuedExports);\n break;\n }\n case NodeKind.VARIABLE: {\n this.initializeVariables(statement, file);\n break;\n }\n case NodeKind.CLASSDECLARATION: {\n this.initializeClass(statement, file, queuedExtends, queuedImplements);\n break;\n }\n case NodeKind.ENUMDECLARATION: {\n this.initializeEnum(statement, file);\n break;\n }\n case NodeKind.FUNCTIONDECLARATION: {\n this.initializeFunction(statement, file);\n break;\n }\n case NodeKind.INTERFACEDECLARATION: {\n this.initializeInterface(statement, file);\n break;\n }\n case NodeKind.NAMESPACEDECLARATION: {\n this.initializeNamespace(statement, file, queuedExtends, queuedImplements);\n break;\n }\n case NodeKind.TYPEDECLARATION: {\n this.initializeTypeDefinition(statement, file);\n break;\n }\n }\n }\n }\n\n // queued exports * should be linkable now that all files have been processed\n for (let [file, exportsStar] of queuedExportsStar) {\n for (let i = 0, k = exportsStar.length; i < k; ++i) {\n let exportStar = exportsStar[i];\n let foreignFile = this.lookupForeignFile(exportStar.foreignPath, exportStar.foreignPathAlt);\n if (!foreignFile) {\n this.error(\n DiagnosticCode.File_0_not_found,\n exportStar.pathLiteral.range, exportStar.pathLiteral.value\n );\n continue;\n }\n file.ensureExportStar(foreignFile);\n }\n }\n\n // queued imports should be resolvable now through traversing exports and queued exports\n for (let i = 0, k = queuedImports.length; i < k; ++i) {\n let queuedImport = queuedImports[i];\n let foreignIdentifier = queuedImport.foreignIdentifier;\n if (foreignIdentifier) { // i.e. import { foo [as bar] } from \"./baz\"\n let element = this.lookupForeign(\n foreignIdentifier.text,\n queuedImport.foreignPath,\n queuedImport.foreignPathAlt,\n queuedExports\n );\n if (element) {\n queuedImport.localFile.add(\n queuedImport.localIdentifier.text,\n element,\n true // isImport\n );\n } else {\n this.error(\n DiagnosticCode.Module_0_has_no_exported_member_1,\n foreignIdentifier.range,\n queuedImport.foreignPath,\n foreignIdentifier.text\n );\n }\n } else { // i.e. import * as bar from \"./bar\"\n let foreignFile = this.lookupForeignFile(queuedImport.foreignPath, queuedImport.foreignPathAlt);\n if (foreignFile) {\n let localFile = queuedImport.localFile;\n let localName = queuedImport.localIdentifier.text;\n localFile.add(\n localName,\n foreignFile.asImportedNamespace(\n localName,\n localFile\n ),\n true // isImport\n );\n } else {\n assert(false); // already reported by the parser not finding the file\n }\n }\n }\n\n // queued exports should be resolvable now that imports are finalized\n for (let [file, exports] of queuedExports) {\n for (let [exportName, queuedExport] of exports) {\n let localName = queuedExport.localIdentifier.text;\n let foreignPath = queuedExport.foreignPath;\n if (foreignPath) { // i.e. export { foo [as bar] } from \"./baz\"\n let element = this.lookupForeign(\n localName,\n foreignPath,\n assert(queuedExport.foreignPathAlt), // must be set if foreignPath is\n queuedExports\n );\n if (element) {\n file.ensureExport(exportName, element);\n } else {\n this.error(\n DiagnosticCode.Module_0_has_no_exported_member_1,\n queuedExport.localIdentifier.range,\n foreignPath, localName\n );\n }\n } else { // i.e. export { foo [as bar] }\n let element = file.lookupInSelf(localName);\n if (element) {\n file.ensureExport(exportName, element);\n } else {\n let globalElement = this.lookupGlobal(localName);\n if (globalElement && globalElement instanceof DeclaredElement) { // export { memory }\n file.ensureExport(exportName, globalElement);\n } else {\n this.error(\n DiagnosticCode.Module_0_has_no_exported_member_1,\n queuedExport.foreignIdentifier.range,\n file.internalName, queuedExport.foreignIdentifier.text\n );\n }\n }\n }\n }\n }\n\n // register classes backing basic types\n this.registerNativeTypeClass(TypeKind.I8, LibrarySymbols.I8);\n this.registerNativeTypeClass(TypeKind.I16, LibrarySymbols.I16);\n this.registerNativeTypeClass(TypeKind.I32, LibrarySymbols.I32);\n this.registerNativeTypeClass(TypeKind.I64, LibrarySymbols.I64);\n this.registerNativeTypeClass(TypeKind.ISIZE, LibrarySymbols.Isize);\n this.registerNativeTypeClass(TypeKind.U8, LibrarySymbols.U8);\n this.registerNativeTypeClass(TypeKind.U16, LibrarySymbols.U16);\n this.registerNativeTypeClass(TypeKind.U32, LibrarySymbols.U32);\n this.registerNativeTypeClass(TypeKind.U64, LibrarySymbols.U64);\n this.registerNativeTypeClass(TypeKind.USIZE, LibrarySymbols.Usize);\n this.registerNativeTypeClass(TypeKind.BOOL, LibrarySymbols.Bool);\n this.registerNativeTypeClass(TypeKind.F32, LibrarySymbols.F32);\n this.registerNativeTypeClass(TypeKind.F64, LibrarySymbols.F64);\n if (options.hasFeature(Feature.SIMD)) this.registerNativeTypeClass(TypeKind.V128, LibrarySymbols.V128);\n\n // resolve base prototypes of derived classes\n var resolver = this.resolver;\n for (let i = 0, k = queuedExtends.length; i < k; ++i) {\n let thisPrototype = queuedExtends[i];\n let extendsNode = assert(thisPrototype.extendsNode); // must be present if in queuedExtends\n let baseElement = resolver.resolveTypeName(extendsNode.name, thisPrototype.parent); // reports\n if (!baseElement) continue;\n if (baseElement.kind == ElementKind.CLASS_PROTOTYPE) {\n let basePrototype = baseElement;\n if (basePrototype.hasDecorator(DecoratorFlags.SEALED)) {\n this.error(\n DiagnosticCode.Class_0_is_sealed_and_cannot_be_extended,\n extendsNode.range, (baseElement).identifierNode.text\n );\n }\n if (\n basePrototype.hasDecorator(DecoratorFlags.UNMANAGED) !=\n thisPrototype.hasDecorator(DecoratorFlags.UNMANAGED)\n ) {\n this.error(\n DiagnosticCode.Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa,\n Range.join(thisPrototype.identifierNode.range, extendsNode.range)\n );\n }\n thisPrototype.basePrototype = basePrototype;\n } else {\n this.error(\n DiagnosticCode.A_class_may_only_extend_another_class,\n extendsNode.range\n );\n }\n }\n\n // set up global aliases\n {\n let globalAliases = options.globalAliases;\n if (globalAliases) {\n for (let [alias, name] of globalAliases) {\n if (!name.length) continue; // explicitly disabled\n let elementsByName = this.elementsByName;\n let element = elementsByName.get(name);\n if (element) {\n if (elementsByName.has(alias)) throw new Error(\"duplicate global element: \" + name);\n elementsByName.set(alias, element);\n }\n else throw new Error(\"no such global element: \" + name);\n }\n }\n }\n\n // register global library elements\n {\n let element: Element | null;\n if (element = this.lookupGlobal(LibrarySymbols.String)) {\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n this.stringInstance = resolver.resolveClass(element, null);\n }\n if (element = this.lookupGlobal(LibrarySymbols.ArrayBuffer)) {\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n this.arrayBufferInstance = resolver.resolveClass(element, null);\n }\n if (element = this.lookupGlobal(LibrarySymbols.Array)) {\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n this.arrayPrototype = element;\n }\n if (element = this.lookupGlobal(LibrarySymbols.abort)) {\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.abortInstance = this.resolver.resolveFunction(element, null);\n }\n if (element = this.lookupGlobal(LibrarySymbols.memory)) {\n if (element = element.lookupInSelf(LibrarySymbols.allocate)) {\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.memoryAllocateInstance = this.resolver.resolveFunction(element, null);\n }\n }\n }\n\n // register GC hooks if present\n // FIXME: think about a better way than globals to model this, maybe a GC namespace that can be\n // dynamically extended by a concrete implementation but then has `@unsafe` methods that normal\n // code cannot call without explicitly enabling it with a flag.\n if (\n this.elementsByName.has(\"__gc_allocate\") &&\n this.elementsByName.has(\"__gc_link\") &&\n this.elementsByName.has(\"__gc_mark\")\n ) {\n // __gc_allocate(usize, (ref: usize) => void): usize\n let element = this.elementsByName.get(\"__gc_allocate\");\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let gcAllocateInstance = assert(this.resolver.resolveFunction(element, null));\n let signature = gcAllocateInstance.signature;\n assert(signature.parameterTypes.length == 2);\n assert(signature.parameterTypes[0] == this.options.usizeType);\n assert(signature.parameterTypes[1].signatureReference);\n assert(signature.returnType == this.options.usizeType);\n\n // __gc_link(usize, usize): void\n element = this.elementsByName.get(\"__gc_link\");\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let gcLinkInstance = assert(this.resolver.resolveFunction(element, null));\n signature = gcLinkInstance.signature;\n assert(signature.parameterTypes.length == 2);\n assert(signature.parameterTypes[0] == this.options.usizeType);\n assert(signature.parameterTypes[1] == this.options.usizeType);\n assert(signature.returnType == Type.void);\n\n // __gc_mark(usize): void\n element = this.elementsByName.get(\"__gc_mark\");\n assert(element.kind == ElementKind.FUNCTION_PROTOTYPE);\n let gcMarkInstance = assert(this.resolver.resolveFunction(element, null));\n signature = gcMarkInstance.signature;\n assert(signature.parameterTypes.length == 1);\n assert(signature.parameterTypes[0] == this.options.usizeType);\n assert(signature.returnType == Type.void);\n\n this.gcAllocateInstance = gcAllocateInstance;\n this.gcLinkInstance = gcLinkInstance;\n this.gcMarkInstance = gcMarkInstance;\n let gcHookOffset = 2 * options.usizeType.byteSize; // .next + .prev\n this.gcHookOffset = gcHookOffset;\n this.gcHeaderSize = (gcHookOffset + 4 + 7) & ~7; // + .hook index + alignment\n this.hasGC = true;\n }\n\n // mark module exports, i.e. to apply proper wrapping behavior on the boundaries\n for (let file of this.filesByName.values()) {\n let exports = file.exports;\n if (!(file.source.isEntry && exports)) continue;\n for (let element of exports.values()) this.markModuleExport(element);\n }\n }\n\n /** Marks an element and its children as a module export. */\n private markModuleExport(element: Element): void {\n element.set(CommonFlags.MODULE_EXPORT);\n switch (element.kind) {\n case ElementKind.CLASS_PROTOTYPE: {\n let instanceMembers = (element).instanceMembers;\n if (instanceMembers) for (let member of instanceMembers.values()) this.markModuleExport(member);\n break;\n }\n case ElementKind.PROPERTY_PROTOTYPE: {\n let getterPrototype = (element).getterPrototype;\n if (getterPrototype) this.markModuleExport(getterPrototype);\n let setterPrototype = (element).setterPrototype;\n if (setterPrototype) this.markModuleExport(setterPrototype);\n break;\n }\n case ElementKind.PROPERTY:\n case ElementKind.FUNCTION:\n case ElementKind.FIELD:\n case ElementKind.CLASS: assert(false); // assumes that there are no instances yet\n }\n {\n let members = element.members;\n if (members) for (let member of members.values()) this.markModuleExport(member);\n }\n }\n\n /** Registers a native type with the program. */\n private registerNativeType(name: string, type: Type): void {\n var element = new TypeDefinition(\n name,\n this.nativeFile,\n this.makeNativeTypeDeclaration(name, CommonFlags.EXPORT),\n DecoratorFlags.BUILTIN\n );\n element.setType(type);\n this.nativeFile.add(name, element);\n }\n\n /** Registers the backing class of a native type. */\n private registerNativeTypeClass(typeKind: TypeKind, className: string): void {\n assert(!this.typeClasses.has(typeKind));\n var element = this.lookupGlobal(className);\n if (element) {\n assert(element.kind == ElementKind.CLASS_PROTOTYPE);\n let classElement = this.resolver.resolveClass(element, null);\n if (classElement) this.typeClasses.set(typeKind, classElement);\n }\n }\n\n /** Registers a constant integer value within the global scope. */\n private registerConstantInteger(name: string, type: Type, value: I64): void {\n assert(type.is(TypeFlags.INTEGER)); // must be an integer type\n var global = new Global(\n name,\n this.nativeFile,\n DecoratorFlags.NONE,\n this.makeNativeVariableDeclaration(name, CommonFlags.CONST | CommonFlags.EXPORT)\n );\n global.setConstantIntegerValue(value, type);\n this.nativeFile.add(name, global);\n }\n\n /** Registers a constant float value within the global scope. */\n private registerConstantFloat(name: string, type: Type, value: f64): void {\n assert(type.is(TypeFlags.FLOAT)); // must be a float type\n var global = new Global(\n name,\n this.nativeFile,\n DecoratorFlags.NONE,\n this.makeNativeVariableDeclaration(name, CommonFlags.CONST | CommonFlags.EXPORT)\n );\n global.setConstantFloatValue(value, type);\n this.nativeFile.add(name, global);\n }\n\n /** Ensures that the given global element exists. Attempts to merge duplicates. */\n ensureGlobal(name: string, element: DeclaredElement): void {\n var elementsByName = this.elementsByName;\n if (elementsByName.has(name)) {\n let actual = elementsByName.get(name);\n // NOTE: this is effectively only performed when merging native types with\n // their respective namespaces in std/builtins, but can also trigger when a\n // user has multiple global elements of the same name in different files,\n // which might result in unexpected shared symbols accross files. considering\n // this a wonky feature for now that we might want to revisit later.\n if (actual !== element) {\n let merged = tryMerge(elementsByName.get(name)!, element);\n if (!merged) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n element.identifierNode.range, name\n );\n return;\n }\n element = merged;\n }\n }\n elementsByName.set(name, element);\n }\n\n /** Looks up the element of the specified name in the global scope. */\n lookupGlobal(name: string): Element | null {\n var elements = this.elementsByName;\n if (elements.has(name)) return elements.get(name);\n return null;\n }\n\n /** Tries to locate a foreign file given its normalized path. */\n private lookupForeignFile(\n /** Normalized path to the other file. */\n foreignPath: string,\n /** Alternative normalized path to the other file. */\n foreignPathAlt: string\n ): File | null {\n var filesByName = this.filesByName;\n return filesByName.has(foreignPath)\n ? filesByName.get(foreignPath)!\n : filesByName.has(foreignPathAlt)\n ? filesByName.get(foreignPathAlt)!\n : null;\n }\n\n /** Tries to locate a foreign element by traversing exports and queued exports. */\n private lookupForeign(\n /** Identifier within the other file. */\n foreignName: string,\n /** Normalized path to the other file. */\n foreignPath: string,\n /** Alternative normalized path to the other file. */\n foreignPathAlt: string,\n /** So far queued exports. */\n queuedExports: Map>\n ): DeclaredElement | null {\n do {\n let foreignFile = this.lookupForeignFile(foreignPath, foreignPathAlt);\n if (!foreignFile) return null; // no such file\n\n // search already resolved exports\n let element = foreignFile.lookupExport(foreignName);\n if (element) return element;\n\n // otherwise traverse queued exports\n if (queuedExports.has(foreignFile)) {\n let fileQueuedExports = queuedExports.get(foreignFile)!;\n if (fileQueuedExports.has(foreignName)) {\n let queuedExport = fileQueuedExports.get(foreignName)!;\n if (queuedExport.foreignPath) { // imported from another file\n foreignName = queuedExport.localIdentifier.text;\n foreignPath = queuedExport.foreignPath;\n foreignPathAlt = assert(queuedExport.foreignPathAlt);\n continue;\n } else { // local element of this file\n element = foreignFile.lookupInSelf(queuedExport.localIdentifier.text);\n if (element) return element;\n }\n }\n }\n break;\n } while (true);\n return null;\n }\n\n /** Validates that only supported decorators are present. */\n private checkDecorators(\n /** Decorators present on an element. */\n decorators: DecoratorNode[] | null,\n /** Accepted decorator flags. Emits diagnostics if any other decorators are present. */\n acceptedFlags: DecoratorFlags\n ): DecoratorFlags {\n var flags = DecoratorFlags.NONE;\n if (decorators) {\n for (let i = 0, k = decorators.length; i < k; ++i) {\n let decorator = decorators[i];\n let kind = decoratorNameToKind(decorator.name);\n let flag = decoratorKindToFlag(kind);\n if (flag) {\n if (flag == DecoratorFlags.BUILTIN) {\n if (decorator.range.source.isLibrary) {\n flags |= flag;\n } else {\n this.error(\n DiagnosticCode.Decorator_0_is_not_valid_here,\n decorator.range, decorator.name.range.toString()\n );\n }\n } else if (!(acceptedFlags & flag)) {\n this.error(\n DiagnosticCode.Decorator_0_is_not_valid_here,\n decorator.range, decorator.name.range.toString()\n );\n } else if (flags & flag) {\n this.error(\n DiagnosticCode.Duplicate_decorator,\n decorator.range, decorator.name.range.toString()\n );\n } else {\n flags |= flag;\n }\n }\n }\n }\n return flags;\n }\n\n /** Initializes a class declaration. */\n private initializeClass(\n /** The declaration to initialize. */\n declaration: ClassDeclaration,\n /** Parent element, usually a file or namespace. */\n parent: Element,\n /** So far queued `extends` clauses. */\n queuedExtends: ClassPrototype[],\n /** So far queued `implements` clauses. */\n queuedImplements: ClassPrototype[]\n ): void {\n var name = declaration.name.text;\n var element = new ClassPrototype(\n name,\n parent,\n declaration,\n this.checkDecorators(declaration.decorators,\n DecoratorFlags.GLOBAL |\n DecoratorFlags.SEALED |\n DecoratorFlags.UNMANAGED\n )\n );\n if (!parent.add(name, element)) return;\n\n var implementsTypes = declaration.implementsTypes;\n if (implementsTypes) {\n let numImplementsTypes = implementsTypes.length;\n // cannot implement interfaces when unmanaged\n if (element.hasDecorator(DecoratorFlags.UNMANAGED)) {\n if (numImplementsTypes) {\n this.error(\n DiagnosticCode.Unmanaged_classes_cannot_implement_interfaces,\n Range.join(\n declaration.name.range,\n implementsTypes[numImplementsTypes - 1].range\n )\n );\n }\n } else if (numImplementsTypes) {\n // remember classes that implement interfaces\n for (let i = 0; i < numImplementsTypes; ++i) {\n this.warning( // TODO: not yet supported\n DiagnosticCode.Operation_not_supported,\n implementsTypes[i].range\n );\n }\n queuedImplements.push(element);\n }\n }\n // remember classes that extend another class\n if (declaration.extendsType) queuedExtends.push(element);\n\n // initialize members\n var memberDeclarations = declaration.members;\n for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\n let memberDeclaration = memberDeclarations[i];\n switch (memberDeclaration.kind) {\n case NodeKind.FIELDDECLARATION: {\n this.initializeField(memberDeclaration, element);\n break;\n }\n case NodeKind.METHODDECLARATION: {\n if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\n this.initializeProperty(memberDeclaration, element);\n } else {\n this.initializeMethod(memberDeclaration, element);\n }\n break;\n }\n case NodeKind.INDEXSIGNATUREDECLARATION: break; // ignored for now\n default: assert(false); // class member expected\n }\n }\n }\n\n /** Initializes a field of a class or interface. */\n private initializeField(\n /** The declaration to initialize. */\n declaration: FieldDeclaration,\n /** Parent class. */\n parent: ClassPrototype\n ): void {\n var name = declaration.name.text;\n var decorators = declaration.decorators;\n var element: DeclaredElement;\n if (declaration.is(CommonFlags.STATIC)) { // global variable\n assert(parent.kind != ElementKind.INTERFACE_PROTOTYPE);\n element = new Global(\n name,\n parent,\n this.checkDecorators(decorators,\n (declaration.is(CommonFlags.READONLY)\n ? DecoratorFlags.INLINE\n : DecoratorFlags.NONE\n ) | DecoratorFlags.LAZY\n ),\n declaration\n );\n if (!parent.add(name, element)) return;\n } else { // actual instance field\n assert(!declaration.isAny(CommonFlags.ABSTRACT | CommonFlags.GET | CommonFlags.SET));\n element = new FieldPrototype(\n name,\n parent,\n declaration,\n this.checkDecorators(decorators, DecoratorFlags.NONE)\n );\n if (!parent.addInstance(name, element)) return;\n }\n }\n\n /** Initializes a method of a class or interface. */\n private initializeMethod(\n /** The declaration to initialize. */\n declaration: MethodDeclaration,\n /** Parent class. */\n parent: ClassPrototype\n ): void {\n var name = declaration.name.text;\n var isStatic = declaration.is(CommonFlags.STATIC);\n var acceptedFlags = DecoratorFlags.INLINE;\n if (!declaration.is(CommonFlags.GENERIC)) {\n acceptedFlags |= DecoratorFlags.OPERATOR_BINARY\n | DecoratorFlags.OPERATOR_PREFIX\n | DecoratorFlags.OPERATOR_POSTFIX;\n }\n var element = new FunctionPrototype(\n name,\n parent,\n declaration,\n this.checkDecorators(declaration.decorators, acceptedFlags)\n );\n if (isStatic) { // global function\n assert(declaration.name.kind != NodeKind.CONSTRUCTOR);\n if (!parent.add(name, element)) return;\n } else { // actual instance method\n if (!parent.addInstance(name, element)) return;\n }\n this.checkOperatorOverloads(declaration.decorators, element, parent);\n }\n\n /** Checks that operator overloads are generally valid, if present. */\n private checkOperatorOverloads(\n /** Decorators to check. */\n decorators: DecoratorNode[] | null,\n /** Decorated method. */\n prototype: FunctionPrototype,\n /** Parent class. */\n classPrototype: ClassPrototype\n ): void {\n if (decorators) {\n for (let i = 0, k = decorators.length; i < k; ++i) {\n let decorator = decorators[i];\n switch (decorator.decoratorKind) {\n case DecoratorKind.OPERATOR:\n case DecoratorKind.OPERATOR_BINARY:\n case DecoratorKind.OPERATOR_PREFIX:\n case DecoratorKind.OPERATOR_POSTFIX: {\n let numArgs = decorator.arguments && decorator.arguments.length || 0;\n if (numArgs == 1) {\n let firstArg = (decorator.arguments)[0];\n if (\n firstArg.kind == NodeKind.LITERAL &&\n (firstArg).literalKind == LiteralKind.STRING\n ) {\n let kind = operatorKindFromDecorator(\n decorator.decoratorKind,\n (firstArg).value\n );\n if (kind == OperatorKind.INVALID) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n firstArg.range\n );\n } else {\n let overloads = classPrototype.overloadPrototypes;\n if (overloads.has(kind)) {\n this.error(\n DiagnosticCode.Duplicate_function_implementation,\n firstArg.range\n );\n } else {\n prototype.operatorKind = kind;\n overloads.set(kind, prototype);\n }\n }\n } else {\n this.error(\n DiagnosticCode.String_literal_expected,\n firstArg.range\n );\n }\n } else {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n decorator.range, \"1\", numArgs.toString(10)\n );\n }\n }\n }\n }\n }\n }\n\n /** Ensures that the property introduced by the specified getter or setter exists.*/\n private ensureProperty(\n /** The declaration of the getter or setter introducing the property. */\n declaration: MethodDeclaration,\n /** Parent class. */\n parent: ClassPrototype\n ): PropertyPrototype | null {\n var name = declaration.name.text;\n if (declaration.is(CommonFlags.STATIC)) {\n let parentMembers = parent.members;\n if (parentMembers && parentMembers.has(name)) {\n let element = parentMembers.get(name)!;\n if (element.kind == ElementKind.PROPERTY_PROTOTYPE) return element;\n } else {\n let element = new PropertyPrototype(name, parent, declaration);\n if (!parent.add(name, element)) return null;\n return element;\n }\n } else {\n let parentMembers = parent.instanceMembers;\n if (parentMembers && parentMembers.has(name)) {\n let element = parentMembers.get(name);\n if (element.kind == ElementKind.PROPERTY_PROTOTYPE) return element;\n } else {\n let element = new PropertyPrototype(name, parent, declaration);\n if (!parent.addInstance(name, element)) return null;\n return element;\n }\n }\n this.error(\n DiagnosticCode.Duplicate_property_0,\n declaration.name.range, name\n );\n return null;\n }\n\n /** Initializes a property of a class. */\n private initializeProperty(\n /** The declaration of the getter or setter. */\n declaration: MethodDeclaration,\n /** Parent class. */\n parent: ClassPrototype\n ): void {\n var property = this.ensureProperty(declaration, parent);\n if (!property) return;\n var name = declaration.name.text;\n var isGetter = declaration.is(CommonFlags.GET);\n if (isGetter) {\n if (property.getterPrototype) {\n this.error(\n DiagnosticCode.Duplicate_property_0,\n declaration.name.range, name\n );\n return;\n }\n } else {\n if (property.setterPrototype) {\n this.error(\n DiagnosticCode.Duplicate_property_0,\n declaration.name.range, name\n );\n return;\n }\n }\n var element = new FunctionPrototype(\n (isGetter ? GETTER_PREFIX : SETTER_PREFIX) + name,\n property,\n declaration,\n this.checkDecorators(declaration.decorators,\n DecoratorFlags.INLINE\n )\n );\n if (isGetter) {\n property.getterPrototype = element;\n } else {\n property.setterPrototype = element;\n }\n }\n\n /** Initializes an enum. */\n private initializeEnum(\n /** The declaration to initialize. */\n declaration: EnumDeclaration,\n /** Parent element, usually a file or namespace. */\n parent: Element\n ): void {\n var name = declaration.name.text;\n var element = new Enum(\n name,\n parent,\n declaration,\n this.checkDecorators(declaration.decorators,\n DecoratorFlags.GLOBAL |\n DecoratorFlags.INLINE |\n DecoratorFlags.LAZY\n )\n );\n if (!parent.add(name, element)) return;\n var values = declaration.values;\n for (let i = 0, k = values.length; i < k; ++i) {\n this.initializeEnumValue(values[i], element);\n }\n }\n\n /** Initializes an enum value. */\n private initializeEnumValue(\n /** The declaration to initialize. */\n declaration: EnumValueDeclaration,\n /** Parent enum. */\n parent: Enum\n ): void {\n var name = declaration.name.text;\n var element = new EnumValue(\n name,\n parent,\n declaration,\n this.checkDecorators(declaration.decorators,\n DecoratorFlags.NONE\n )\n );\n if (!parent.add(name, element)) return;\n }\n\n /** Initializes an `export` statement. */\n private initializeExports(\n /** The statement to initialize. */\n statement: ExportStatement,\n /** Parent file. */\n parent: File,\n /** So far queued `export`s. */\n queuedExports: Map>,\n /** So far queued `export *`s. */\n queuedExportsStar: Map\n ): void {\n var members = statement.members;\n if (members) { // export { foo, bar } [from \"./baz\"]\n for (let i = 0, k = members.length; i < k; ++i) {\n this.initializeExport(members[i], parent, statement.internalPath, queuedExports);\n }\n } else { // export * from \"./baz\"\n let queued: QueuedExportStar[];\n if (queuedExportsStar.has(parent)) queued = queuedExportsStar.get(parent)!;\n else queuedExportsStar.set(parent, queued = []);\n let foreignPath = assert(statement.internalPath); // must be set for export *\n queued.push(new QueuedExportStar(\n foreignPath,\n foreignPath.endsWith(INDEX_SUFFIX) // strip or add index depending on what's already present\n ? foreignPath.substring(0, foreignPath.length - INDEX_SUFFIX.length)\n : foreignPath + INDEX_SUFFIX,\n assert(statement.path)\n ));\n }\n }\n\n /** Initializes a single `export` member. Does not handle `export *`. */\n private initializeExport(\n /** The member to initialize. */\n member: ExportMember,\n /** Local file. */\n localFile: File,\n /** Path to the other file, if present. */\n foreignPath: string | null,\n /** So far queued `export`s. */\n queuedExports: Map>\n ): void {\n var localName = member.localName.text;\n var foreignName = member.exportedName.text;\n\n // check for duplicates\n var element = localFile.lookupExport(foreignName);\n if (element) {\n this.error(\n DiagnosticCode.Export_declaration_conflicts_with_exported_declaration_of_0,\n member.exportedName.range, foreignName\n );\n return;\n }\n // local element, i.e. export { foo [as bar] }\n if (foreignPath === null) {\n\n // resolve right away if the local element already exists\n if (element = localFile.lookupInSelf(localName)) {\n localFile.ensureExport(foreignName, element);\n\n // otherwise queue it\n } else {\n let queued: Map;\n if (queuedExports.has(localFile)) queued = queuedExports.get(localFile)!;\n else queuedExports.set(localFile, queued = new Map());\n queued.set(foreignName, new QueuedExport(\n member.localName,\n member.exportedName,\n null, null\n ));\n }\n\n // foreign element, i.e. export { foo } from \"./bar\"\n } else {\n let queued: Map;\n if (queuedExports.has(localFile)) queued = queuedExports.get(localFile)!;\n else queuedExports.set(localFile, queued = new Map());\n queued.set(foreignName, new QueuedExport(\n member.localName,\n member.exportedName,\n foreignPath,\n foreignPath.endsWith(INDEX_SUFFIX) // strip or add index depending on what's already present\n ? foreignPath.substring(0, foreignPath.length - INDEX_SUFFIX.length)\n : foreignPath + INDEX_SUFFIX\n ));\n }\n }\n\n /** Initializes an `import` statement. */\n private initializeImports(\n /** The statement to initialize. */\n statement: ImportStatement,\n /** Parent file. */\n parent: File,\n /** So far queued `import`s. */\n queuedImports: QueuedImport[],\n /** SO far queued `export`s. */\n queuedExports: Map>\n ): void {\n var declarations = statement.declarations;\n if (declarations) { // import { foo [as bar] } from \"./baz\"\n for (let i = 0, k = declarations.length; i < k; ++i) {\n this.initializeImport(\n declarations[i],\n parent,\n statement.internalPath,\n queuedImports,\n queuedExports\n );\n }\n } else if (statement.namespaceName) { // import * as foo from \"./bar\"\n queuedImports.push(new QueuedImport(\n parent,\n statement.namespaceName,\n null, // indicates import *\n statement.internalPath,\n statement.internalPath + INDEX_SUFFIX\n ));\n } else {\n // import \"./foo\"\n }\n }\n\n /** Initializes a single `import` declaration. Does not handle `import *`. */\n private initializeImport( // { foo [as bar] }\n /** The declaration to initialize. */\n declaration: ImportDeclaration,\n /** Parent file. */\n parent: File,\n /** Path to the other file. */\n foreignPath: string,\n /** So far queued `import`s. */\n queuedImports: QueuedImport[],\n /** So far queued `export`s. */\n queuedExports: Map>\n ): void {\n var foreignPathAlt = foreignPath.endsWith(INDEX_SUFFIX) // strip or add index depending on what's already present\n ? foreignPath.substring(0, foreignPath.length - INDEX_SUFFIX.length)\n : foreignPath + INDEX_SUFFIX;\n\n // resolve right away if the element exists\n var element = this.lookupForeign(declaration.foreignName.text, foreignPath, foreignPathAlt, queuedExports);\n if (element) {\n parent.add(declaration.name.text, element, true);\n return;\n }\n\n // otherwise queue it\n queuedImports.push(new QueuedImport(\n parent,\n declaration.name,\n declaration.foreignName,\n foreignPath,\n foreignPathAlt\n ));\n }\n\n /** Initializes a function. Does not handle methods. */\n private initializeFunction(\n /** The declaration to initialize. */\n declaration: FunctionDeclaration,\n /** Parent element, usually a file or namespace. */\n parent: Element\n ): void {\n var name = declaration.name.text;\n var validDecorators = DecoratorFlags.NONE;\n if (declaration.is(CommonFlags.AMBIENT)) {\n validDecorators |= DecoratorFlags.EXTERNAL;\n } else {\n validDecorators |= DecoratorFlags.INLINE;\n }\n if (!declaration.is(CommonFlags.INSTANCE)) {\n if (parent.kind != ElementKind.CLASS_PROTOTYPE) {\n validDecorators |= DecoratorFlags.GLOBAL;\n }\n }\n if (!declaration.is(CommonFlags.GENERIC)) {\n if (parent.kind == ElementKind.FILE && (parent).source.isEntry) {\n validDecorators |= DecoratorFlags.START;\n }\n }\n var element = new FunctionPrototype(\n name,\n parent,\n declaration,\n this.checkDecorators(declaration.decorators, validDecorators)\n );\n if (!parent.add(name, element)) return;\n if (element.hasDecorator(DecoratorFlags.START)) {\n if (this.explicitStartFunction) {\n this.error(\n DiagnosticCode.Module_cannot_have_multiple_start_functions,\n assert(findDecorator(DecoratorKind.START, declaration.decorators)).range\n );\n } else this.explicitStartFunction = element;\n }\n }\n\n /** Initializes an interface. */\n private initializeInterface(\n /** The declaration to initialize. */\n declaration: InterfaceDeclaration,\n /** Parent element, usually a file or namespace. */\n parent: Element\n ): void {\n var name = declaration.name.text;\n var element = new InterfacePrototype(\n name,\n parent,\n declaration,\n this.checkDecorators(declaration.decorators,\n DecoratorFlags.GLOBAL\n )\n );\n if (!parent.add(name, element)) return;\n var memberDeclarations = declaration.members;\n for (let i = 0, k = memberDeclarations.length; i < k; ++i) {\n let memberDeclaration = memberDeclarations[i];\n switch (memberDeclaration.kind) {\n case NodeKind.FIELDDECLARATION: {\n this.initializeField(memberDeclaration, element);\n break;\n }\n case NodeKind.METHODDECLARATION: {\n if (memberDeclaration.isAny(CommonFlags.GET | CommonFlags.SET)) {\n this.initializeProperty(memberDeclaration, element);\n } else {\n this.initializeMethod(memberDeclaration, element);\n }\n break;\n }\n default: assert(false); // interface member expected\n }\n }\n }\n\n /** Initializes a namespace. */\n private initializeNamespace(\n /** The declaration to initialize. */\n declaration: NamespaceDeclaration,\n /** Parent element, usually a file or another namespace. */\n parent: Element,\n /** So far queued `extends` clauses. */\n queuedExtends: ClassPrototype[],\n /** So far queued `implements` clauses. */\n queuedImplements: ClassPrototype[]\n ): void {\n var name = declaration.name.text;\n var element = new Namespace(name, parent, declaration);\n if (!parent.add(name, element)) return;\n element = assert(parent.lookupInSelf(name)); // possibly merged\n var members = declaration.members;\n for (let i = 0, k = members.length; i < k; ++i) {\n let member = members[i];\n switch (member.kind) {\n case NodeKind.CLASSDECLARATION: {\n this.initializeClass(member, element, queuedExtends, queuedImplements);\n break;\n }\n case NodeKind.ENUMDECLARATION: {\n this.initializeEnum(member, element);\n break;\n }\n case NodeKind.FUNCTIONDECLARATION: {\n this.initializeFunction(member, element);\n break;\n }\n case NodeKind.INTERFACEDECLARATION: {\n this.initializeInterface(member, element);\n break;\n }\n case NodeKind.NAMESPACEDECLARATION: {\n this.initializeNamespace(member, element, queuedExtends, queuedImplements);\n break;\n }\n case NodeKind.TYPEDECLARATION: {\n this.initializeTypeDefinition(member, element);\n break;\n }\n case NodeKind.VARIABLE: {\n this.initializeVariables(member, element);\n break;\n }\n default: assert(false); // namespace member expected\n }\n }\n }\n\n /** Initializes a `type` definition. */\n private initializeTypeDefinition(\n /** The declaration to initialize. */\n declaration: TypeDeclaration,\n /** Parent element, usually a file or namespace. */\n parent: Element\n ): void {\n var name = declaration.name.text;\n var element = new TypeDefinition(\n name,\n parent,\n declaration,\n this.checkDecorators(declaration.decorators, DecoratorFlags.NONE)\n );\n parent.add(name, element); // reports\n }\n\n /** Initializes a variable statement. */\n private initializeVariables(\n /** The statement to initialize. */\n statement: VariableStatement,\n /** Parent element, usually a file or namespace. */\n parent: Element\n ): void {\n var declarations = statement.declarations;\n for (let i = 0, k = declarations.length; i < k; ++i) {\n let declaration = declarations[i];\n let name = declaration.name.text;\n let acceptedFlags = DecoratorFlags.GLOBAL | DecoratorFlags.LAZY;\n if (declaration.is(CommonFlags.DECLARE)) {\n acceptedFlags |= DecoratorFlags.EXTERNAL;\n }\n if (declaration.is(CommonFlags.CONST)) {\n acceptedFlags |= DecoratorFlags.INLINE;\n }\n let element = new Global(\n name,\n parent,\n this.checkDecorators(declaration.decorators, acceptedFlags),\n declaration\n );\n if (!parent.add(name, element)) continue; // reports\n }\n }\n}\n\n/** Indicates the specific kind of an {@link Element}. */\nexport enum ElementKind {\n /** A {@link Global}. */\n GLOBAL,\n /** A {@link Local}. */\n LOCAL,\n /** An {@link Enum}. */\n ENUM,\n /** An {@link EnumValue}. */\n ENUMVALUE,\n /** A {@link FunctionPrototype}. */\n FUNCTION_PROTOTYPE,\n /** A {@link Function}. */\n FUNCTION,\n /** A {@link FunctionTarget}. */\n FUNCTION_TARGET,\n /** A {@link ClassPrototype}. */\n CLASS_PROTOTYPE,\n /** A {@link Class}. */\n CLASS,\n /** An {@link InterfacePrototype}. */\n INTERFACE_PROTOTYPE,\n /** An {@link Interface}. */\n INTERFACE,\n /** A {@link FieldPrototype}. */\n FIELD_PROTOTYPE,\n /** A {@link Field}. */\n FIELD,\n /** A {@link PropertyPrototype}. */\n PROPERTY_PROTOTYPE,\n /** A {@link Property}. */\n PROPERTY,\n /** A {@link Namespace}. */\n NAMESPACE,\n /** A {@link File}. */\n FILE,\n /** A {@link TypeDefinition}. */\n TYPEDEFINITION,\n}\n\n/** Indicates built-in decorators that are present. */\nexport enum DecoratorFlags {\n /** No flags set. */\n NONE = 0,\n /** Is a program global. */\n GLOBAL = 1 << 0,\n /** Is a binary operator overload. */\n OPERATOR_BINARY = 1 << 1,\n /** Is a unary prefix operator overload. */\n OPERATOR_PREFIX = 1 << 2,\n /** Is a unary postfix operator overload. */\n OPERATOR_POSTFIX = 1 << 3,\n /** Is an unmanaged class. */\n UNMANAGED = 1 << 4,\n /** Is a sealed class. */\n SEALED = 1 << 5,\n /** Is always inlined. */\n INLINE = 1 << 6,\n /** Is using a different external name. */\n EXTERNAL = 1 << 7,\n /** Is a builtin. */\n BUILTIN = 1 << 8,\n /** Is compiled lazily. */\n LAZY = 1 << 9,\n /** Is the explicit start function. */\n START = 1 << 10\n}\n\n/** Translates a decorator kind to the respective decorator flag. */\nexport function decoratorKindToFlag(kind: DecoratorKind): DecoratorFlags {\n switch (kind) {\n case DecoratorKind.GLOBAL: return DecoratorFlags.GLOBAL;\n case DecoratorKind.OPERATOR:\n case DecoratorKind.OPERATOR_BINARY: return DecoratorFlags.OPERATOR_BINARY;\n case DecoratorKind.OPERATOR_PREFIX: return DecoratorFlags.OPERATOR_PREFIX;\n case DecoratorKind.OPERATOR_POSTFIX: return DecoratorFlags.OPERATOR_POSTFIX;\n case DecoratorKind.UNMANAGED: return DecoratorFlags.UNMANAGED;\n case DecoratorKind.SEALED: return DecoratorFlags.SEALED;\n case DecoratorKind.INLINE: return DecoratorFlags.INLINE;\n case DecoratorKind.EXTERNAL: return DecoratorFlags.EXTERNAL;\n case DecoratorKind.BUILTIN: return DecoratorFlags.BUILTIN;\n case DecoratorKind.LAZY: return DecoratorFlags.LAZY;\n case DecoratorKind.START: return DecoratorFlags.START;\n default: return DecoratorFlags.NONE;\n }\n}\n\n/** Base class of all program elements. */\nexport abstract class Element {\n\n /** Parent element. */\n parent: Element;\n /** Common flags indicating specific traits. */\n flags: CommonFlags = CommonFlags.NONE;\n /** Decorator flags indicating annotated traits. */\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE;\n /** Member elements. */\n members: Map | null = null;\n /** Shadowing type in type space, if any. */\n shadowType: TypeDefinition | null = null;\n\n /** Constructs a new program element. */\n protected constructor(\n /** Specific element kind. */\n public kind: ElementKind,\n /** Simple name. */\n public name: string,\n /** Internal name referring to this element. */\n public internalName: string,\n /** Containing {@link Program}. */\n public program: Program,\n /** Parent element. */\n parent: Element | null\n ) {\n this.program = program;\n this.name = name;\n this.internalName = internalName;\n if (parent) {\n this.parent = parent;\n } else {\n assert(this.kind == ElementKind.FILE);\n this.parent = this; // special case to keep this.parent non-nullable\n }\n }\n\n /** Gets the enclosing file. */\n get file(): File {\n var current: Element = this;\n do if ((current = current.parent).kind == ElementKind.FILE) return current;\n while (true);\n }\n\n /** Tests if this element has a specific flag or flags. */\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\n /** Tests if this element has any of the specified flags. */\n isAny(flags: CommonFlags): bool { return (this.flags & flags) != 0; }\n /** Sets a specific flag or flags. */\n set(flag: CommonFlags): void { this.flags |= flag; }\n /** Tests if this element has a specific decorator flag or flags. */\n hasDecorator(flag: DecoratorFlags): bool { return (this.decoratorFlags & flag) == flag; }\n\n /** Looks up the element with the specified name within this element. */\n lookupInSelf(name: string): DeclaredElement | null {\n var members = this.members;\n if (members && members.has(name)) return members.get(name)!;\n return null;\n }\n\n /** Looks up the element with the specified name relative to this element, like in JS. */\n abstract lookup(name: string): Element | null;\n\n /** Adds an element as a member of this one. Reports and returns `false` if a duplicate. */\n add(name: string, element: DeclaredElement): bool {\n var originalDeclaration = element.declaration;\n var members = this.members;\n if (!members) this.members = members = new Map();\n else if (members.has(name)) {\n let actual = members.get(name)!;\n if (actual.parent !== this) {\n // override non-own element\n } else {\n let merged = tryMerge(actual, element);\n if (merged) {\n element = merged; // use merged element\n } else {\n this.program.error(\n DiagnosticCode.Duplicate_identifier_0,\n element.identifierNode.range, element.identifierNode.text\n );\n return false;\n }\n }\n }\n members.set(name, element);\n var program = this.program;\n if (element.kind != ElementKind.FUNCTION_PROTOTYPE || !(element).isBound) {\n // prefer unbound prototypes in global lookup maps\n program.elementsByName.set(element.internalName, element);\n program.elementsByDeclaration.set(originalDeclaration, element);\n }\n return true;\n }\n\n /** Returns a string representation of this element. */\n toString(): string {\n return ElementKind[this.kind] + \":\" + this.internalName;\n }\n}\n\n/** Base class of elements with an associated declaration statement. */\nexport abstract class DeclaredElement extends Element {\n\n /** Constructs a new declared program element. */\n protected constructor(\n /** Specific element kind. */\n kind: ElementKind,\n /** Simple name. */\n name: string,\n /** Internal name referring to this element. */\n internalName: string,\n /** Containing {@link Program}. */\n program: Program,\n /** Parent element. */\n parent: Element | null,\n /** Declaration reference. */\n public declaration: DeclarationStatement\n ) {\n super(kind, name, internalName, program, parent);\n // It is necessary to have access to identifiers of all members and exports\n // for reporting purposes and this is the lowest common denominator. Comes\n // at the expense of not having more specific type information in derived\n // classes, though. Instead, derived classes implement getters for other\n // important AST nodes directly through manual casting, allowing the resolver\n // etc. to not worry about actual declarations.\n this.declaration = declaration;\n this.flags = declaration.flags; // inherit\n }\n\n /** Tests if this element is a library element. */\n get isDeclaredInLibrary(): bool {\n return this.declaration.range.source.isLibrary;\n }\n\n /** Gets the associated identifier node. */\n get identifierNode(): IdentifierExpression {\n return this.declaration.name;\n }\n\n /** Gets the assiciated decorator nodes. */\n get decoratorNodes(): DecoratorNode[] | null {\n return this.declaration.decorators;\n }\n}\n\n/** Base class of elements that can be resolved to a concrete type. */\nexport abstract class TypedElement extends DeclaredElement {\n\n /** Resolved type. Set once `is(RESOLVED)`, otherwise void. */\n type: Type = Type.void;\n\n /** Sets the resolved type of this element. */\n setType(type: Type): void {\n assert(!this.is(CommonFlags.RESOLVED));\n this.type = type;\n this.set(CommonFlags.RESOLVED);\n }\n}\n\n/** A file representing the implicit top-level namespace of a source. */\nexport class File extends Element {\n\n /** File exports. */\n exports: Map | null = null;\n /** File re-exports. */\n exportsStar: File[] | null = null;\n /** Top-level start function of this file. */\n startFunction: Function;\n\n /** Constructs a new file. */\n constructor(\n /** Program this file belongs to. */\n program: Program,\n /** Source of this file. */\n public source: Source\n ) {\n super(\n ElementKind.FILE,\n source.normalizedPath,\n source.internalPath,\n program,\n null // special case for files\n );\n this.source = source;\n assert(!program.filesByName.has(this.internalName));\n program.filesByName.set(this.internalName, this);\n var startFunction = this.program.makeNativeFunction(\n \"start:\" + this.internalName,\n new Signature(null, Type.void),\n this\n );\n startFunction.internalName = startFunction.name;\n this.startFunction = startFunction;\n }\n\n /* @override */\n add(name: string, element: DeclaredElement, isImport: bool = false): bool {\n if (!super.add(name, element)) return false;\n element = assert(this.lookupInSelf(name)); // possibly merged\n if (element.is(CommonFlags.EXPORT) && !isImport) {\n this.ensureExport(\n element.name,\n element\n );\n }\n if (element.hasDecorator(DecoratorFlags.GLOBAL)) this.program.ensureGlobal(name, element);\n return true;\n }\n\n /* @override */\n lookupInSelf(name: string): DeclaredElement | null {\n var element = super.lookupInSelf(name);\n if (element) return element;\n var exportsStar = this.exportsStar;\n if (exportsStar) {\n for (let i = 0, k = exportsStar.length; i < k; ++i) {\n if (element = exportsStar[i].lookupInSelf(name)) return element;\n }\n }\n return null;\n }\n\n /* @override */\n lookup(name: string): Element | null {\n var element = this.lookupInSelf(name);\n if (element) return element;\n return this.program.lookupGlobal(name);\n }\n\n /** Ensures that an element is an export of this file. */\n ensureExport(name: string, element: DeclaredElement): void {\n var exports = this.exports;\n if (!exports) this.exports = exports = new Map();\n exports.set(name, element);\n if (this.source.isLibrary) this.program.ensureGlobal(name, element);\n }\n\n /** Ensures that another file is a re-export of this file. */\n ensureExportStar(file: File): void {\n var exportsStar = this.exportsStar;\n if (!exportsStar) this.exportsStar = exportsStar = [];\n else if (exportsStar.includes(file)) return;\n exportsStar.push(file);\n }\n\n /** Looks up the export of the specified name. */\n lookupExport(name: string): DeclaredElement | null {\n var exports = this.exports;\n if (exports && exports.has(name)) return exports.get(name)!;\n var exportsStar = this.exportsStar;\n if (exportsStar) {\n for (let i = 0, k = exportsStar.length; i < k; ++i) {\n let element = exportsStar[i].lookupExport(name);\n if (element) return element;\n }\n }\n return null;\n }\n\n /** Creates an imported namespace from this file. */\n asImportedNamespace(name: string, parent: Element): Namespace {\n var ns = new Namespace(\n name,\n parent,\n this.program.makeNativeNamespaceDeclaration(name)\n );\n var exports = this.exports;\n if (exports) {\n for (let [memberName, member] of exports) {\n ns.add(memberName, member);\n }\n }\n return ns;\n }\n}\n\n/** A type definition. */\nexport class TypeDefinition extends TypedElement {\n\n /** Constructs a new type definition. */\n constructor(\n /** Simple name. */\n name: string,\n /** Parent element, usually a file or namespace. */\n parent: Element,\n /** Declaration reference. */\n declaration: TypeDeclaration,\n /** Pre-checked flags indicating built-in decorators. */\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\n ) {\n super(\n ElementKind.TYPEDEFINITION,\n name,\n mangleInternalName(name, parent, false),\n parent.program,\n parent,\n declaration\n );\n this.decoratorFlags = decoratorFlags;\n }\n\n /** Gets the associated type parameter nodes. */\n get typeParameterNodes(): TypeParameterNode[] | null {\n return (this.declaration).typeParameters;\n }\n\n /** Gets the associated type node. */\n get typeNode(): CommonTypeNode {\n return (this.declaration).type;\n }\n\n /* @override */\n lookup(name: string): Element | null {\n return this.parent.lookup(name);\n }\n}\n\n/** A namespace that differs from a file in being user-declared with a name. */\nexport class Namespace extends DeclaredElement {\n\n /** Constructs a new namespace. */\n constructor(\n /** Simple name. */\n name: string,\n /** Parent element, usually a file or another namespace. */\n parent: Element,\n /** Declaration reference. */\n declaration: NamespaceDeclaration\n ) {\n super(\n ElementKind.NAMESPACE,\n name,\n mangleInternalName(name, parent, false),\n parent.program,\n parent,\n declaration\n );\n }\n\n /* @override */\n lookup(name: string): Element | null {\n return this.lookupInSelf(name)\n || this.parent.lookup(name);\n }\n}\n\n/** An enum. */\nexport class Enum extends TypedElement {\n\n /** Constructs a new enum. */\n constructor(\n /** Simple name. */\n name: string,\n /** Parent element, usually a file or namespace. */\n parent: Element,\n /** Declaration reference. */\n declaration: EnumDeclaration,\n /** Pre-checked flags indicating built-in decorators. */\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\n ) {\n super(\n ElementKind.ENUM,\n name,\n mangleInternalName(name, parent, false),\n parent.program,\n parent,\n declaration\n );\n this.decoratorFlags = decoratorFlags;\n this.setType(Type.i32);\n }\n\n /* @override */\n lookup(name: string): Element | null {\n return this.lookupInSelf(name)\n || this.parent.lookup(name);\n }\n}\n\n/** Indicates the kind of an inlined constant value. */\nexport const enum ConstantValueKind {\n /** No constant value. */\n NONE,\n /** Constant integer value. */\n INTEGER,\n /** Constant float value. */\n FLOAT\n}\n\n/** Base class of all variable-like program elements. */\nexport abstract class VariableLikeElement extends TypedElement {\n\n /** Constant value kind. */\n constantValueKind: ConstantValueKind = ConstantValueKind.NONE;\n /** Constant integer value, if applicable. */\n constantIntegerValue: I64;\n /** Constant float value, if applicable. */\n constantFloatValue: f64;\n\n /** Constructs a new variable-like element. */\n protected constructor(\n /** Specific element kind. */\n kind: ElementKind,\n /** Simple name. */\n name: string,\n /** Parent element, usually a file, namespace or class. */\n parent: Element,\n /** Declaration reference. Creates a native declaration if omitted. */\n declaration: VariableLikeDeclarationStatement = parent.program.makeNativeVariableDeclaration(name)\n ) {\n super(\n kind,\n name,\n mangleInternalName(name, parent, false),\n parent.program,\n parent,\n declaration\n );\n this.flags = declaration.flags;\n }\n\n /** Gets the associated type node.s */\n get typeNode(): CommonTypeNode | null {\n return (this.declaration).type;\n }\n\n /** Gets the associated initializer node. */\n get initializerNode(): Expression | null {\n return (this.declaration).initializer;\n }\n\n /** Applies a constant integer value to this element. */\n setConstantIntegerValue(value: I64, type: Type): void {\n assert(type.is(TypeFlags.INTEGER));\n this.type = type;\n this.constantValueKind = ConstantValueKind.INTEGER;\n this.constantIntegerValue = value;\n this.set(CommonFlags.CONST | CommonFlags.INLINED | CommonFlags.RESOLVED);\n }\n\n /** Applies a constant float value to this element. */\n setConstantFloatValue(value: f64, type: Type): void {\n assert(type.is(TypeFlags.FLOAT));\n this.type = type;\n this.constantValueKind = ConstantValueKind.FLOAT;\n this.constantFloatValue = value;\n this.set(CommonFlags.CONST | CommonFlags.INLINED | CommonFlags.RESOLVED);\n }\n\n /** @override */\n lookup(name: string): Element | null {\n return this.parent.lookup(name);\n }\n}\n\n/** An enum value. */\nexport class EnumValue extends VariableLikeElement {\n\n /** Constructs a new enum value. */\n constructor(\n /** Simple name. */\n name: string,\n /** Parent enum. */\n parent: Enum,\n /** Declaration reference. */\n declaration: EnumValueDeclaration,\n /** Pre-checked flags indicating built-in decorators. */\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\n ) {\n super(\n ElementKind.ENUMVALUE,\n name,\n parent,\n declaration\n );\n this.decoratorFlags = decoratorFlags;\n this.setType(Type.i32);\n }\n\n /** Gets the associated value node. */\n get valueNode(): Expression | null {\n return (this.declaration).value;\n }\n\n /* @override */\n lookup(name: string): Element | null {\n return this.parent.lookup(name);\n }\n}\n\n/** A global variable. */\nexport class Global extends VariableLikeElement {\n\n /** Constructs a new global variable. */\n constructor(\n /** Simple name. */\n name: string,\n /** Parent element, usually a file, namespace or static class. */\n parent: Element,\n /** Pre-checked flags indicating built-in decorators. */\n decoratorFlags: DecoratorFlags,\n /** Declaration reference. Creates a native declaration if omitted. */\n declaration: VariableLikeDeclarationStatement = parent.program.makeNativeVariableDeclaration(name)\n ) {\n super(\n ElementKind.GLOBAL,\n name,\n parent,\n declaration\n );\n this.decoratorFlags = decoratorFlags;\n }\n}\n\n/** A function parameter. */\nexport class Parameter {\n /** Constructs a new function parameter. */\n constructor(\n /** Parameter name. */\n public name: string,\n /** Parameter type. */\n public type: Type,\n /** Parameter initializer, if present. */\n public initializer: Expression | null = null\n ) {}\n}\n\n/** A local variable. */\nexport class Local extends VariableLikeElement {\n\n /** Constructs a new local variable. */\n constructor(\n /** Simple name. */\n name: string,\n /** Zero-based index within the enclosing function. `-1` indicates a virtual local. */\n public index: i32,\n /** Resolved type. */\n type: Type,\n /** Parent function. */\n parent: Function,\n /** Declaration reference. */\n declaration: VariableLikeDeclarationStatement = parent.program.makeNativeVariableDeclaration(name)\n ) {\n super(\n ElementKind.LOCAL,\n name,\n parent,\n declaration\n );\n this.index = index;\n assert(type != Type.void);\n this.setType(type);\n }\n}\n\n/** A yet unresolved function prototype. */\nexport class FunctionPrototype extends DeclaredElement {\n\n /** Operator kind, if an overload. */\n operatorKind: OperatorKind = OperatorKind.INVALID;\n /** Already resolved instances. */\n instances: Map | null = null;\n\n /** Clones of this prototype that are bounds to specific classes. */\n private boundPrototypes: Map | null = null;\n\n /** Constructs a new function prototype. */\n constructor(\n /** Simple na,e */\n name: string,\n /** Parent element, usually a file, namespace or class (if a method). */\n parent: Element,\n /** Declaration reference. */\n declaration: FunctionDeclaration,\n /** Pre-checked flags indicating built-in decorators. */\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\n ) {\n super(\n ElementKind.FUNCTION_PROTOTYPE,\n name,\n mangleInternalName(name, parent, declaration.is(CommonFlags.INSTANCE)),\n parent.program,\n parent,\n declaration\n );\n this.decoratorFlags = decoratorFlags;\n }\n\n /** Gets the associated type parameter nodes. */\n get typeParameterNodes(): TypeParameterNode[] | null {\n return (this.declaration).typeParameters;\n }\n\n /** Gets the associated signature node. */\n get signatureNode(): SignatureNode {\n return (this.declaration).signature;\n }\n\n /** Gets the associated body node. */\n get bodyNode(): Statement | null {\n return (this.declaration).body;\n }\n\n /** Tests if this prototype is bound to a class. */\n get isBound(): bool {\n var parent = this.parent;\n return parent.kind == ElementKind.CLASS\n || parent.kind == ElementKind.PROPERTY_PROTOTYPE && parent.parent.kind == ElementKind.CLASS;\n }\n\n /** Creates a clone of this prototype that is bound to a concrete class instead. */\n toBound(classInstance: Class): FunctionPrototype {\n assert(this.is(CommonFlags.INSTANCE));\n assert(!this.isBound);\n var boundPrototypes = this.boundPrototypes;\n if (!boundPrototypes) this.boundPrototypes = boundPrototypes = new Map();\n else if (boundPrototypes.has(classInstance)) return boundPrototypes.get(classInstance)!;\n var declaration = this.declaration; assert(declaration.kind == NodeKind.METHODDECLARATION);\n var bound = new FunctionPrototype(\n this.name,\n classInstance, // !\n declaration,\n this.decoratorFlags\n );\n bound.flags = this.flags;\n bound.operatorKind = this.operatorKind;\n // NOTE: this.instances holds instances per bound class / unbound\n boundPrototypes.set(classInstance, bound);\n return bound;\n }\n\n /** Gets the resolved instance for the specified instance key, if already resolved. */\n getResolvedInstance(instanceKey: string): Function | null {\n var instances = this.instances;\n if (instances && instances.has(instanceKey)) return instances.get(instanceKey);\n return null;\n }\n\n /** Sets the resolved instance for the specified instance key. */\n setResolvedInstance(instanceKey: string, instance: Function): void {\n var instances = this.instances;\n if (!instances) this.instances = instances = new Map();\n else assert(!instances.has(instanceKey));\n instances.set(instanceKey, instance);\n }\n\n /* @override */\n lookup(name: string): Element | null {\n return this.parent.lookup(name);\n }\n}\n\n/** A resolved function. */\nexport class Function extends TypedElement {\n\n /** Function prototype. */\n prototype: FunctionPrototype;\n /** Function signature. */\n signature: Signature;\n /** Map of locals by name. */\n localsByName: Map = new Map();\n /** Array of locals by index. */\n localsByIndex: Local[] = [];\n /** List of additional non-parameter locals. */\n additionalLocals: Type[] = [];\n /** Contextual type arguments. */\n contextualTypeArguments: Map | null;\n /** Default control flow. */\n flow: Flow;\n /** Remembered debug locations. */\n debugLocations: Range[] = [];\n /** Function reference, if compiled. */\n ref: FunctionRef = 0;\n /** Function table index, if any. */\n functionTableIndex: i32 = -1;\n /** Trampoline function for calling with omitted arguments. */\n trampoline: Function | null = null;\n\n /** Counting id of inline operations involving this function. */\n nextInlineId: i32 = 0;\n\n /** Constructs a new concrete function. */\n constructor(\n /** Name incl. type parameters, i.e. `foo`. */\n nameInclTypeParameters: string,\n /** Respective function prototype. */\n prototype: FunctionPrototype,\n /** Concrete signature. */\n signature: Signature, // pre-resolved\n /** Contextual type arguments inherited from its parent class, if any. */\n contextualTypeArguments: Map | null = null\n ) {\n super(\n ElementKind.FUNCTION,\n nameInclTypeParameters,\n mangleInternalName(nameInclTypeParameters, prototype.parent, prototype.is(CommonFlags.INSTANCE)),\n prototype.program,\n prototype.parent,\n prototype.declaration\n );\n this.prototype = prototype;\n this.signature = signature;\n this.flags = prototype.flags | CommonFlags.RESOLVED;\n this.decoratorFlags = prototype.decoratorFlags;\n this.contextualTypeArguments = contextualTypeArguments;\n this.type = Type.u32.asFunction(signature);\n if (!prototype.is(CommonFlags.AMBIENT)) {\n let localIndex = 0;\n if (this.is(CommonFlags.INSTANCE)) {\n let local = new Local(\n CommonSymbols.this_,\n localIndex++,\n assert(signature.thisType),\n this\n );\n this.localsByName.set(CommonSymbols.this_, local);\n this.localsByIndex[local.index] = local;\n }\n let parameterTypes = signature.parameterTypes;\n for (let i = 0, k = parameterTypes.length; i < k; ++i) {\n let parameterType = parameterTypes[i];\n let parameterName = signature.getParameterName(i);\n let local = new Local(\n parameterName,\n localIndex++,\n parameterType,\n this\n );\n this.localsByName.set(parameterName, local);\n this.localsByIndex[local.index] = local;\n }\n }\n this.flow = Flow.create(this);\n registerConcreteElement(this.program, this);\n }\n\n /** Adds a local of the specified type, with an optional name. */\n addLocal(type: Type, name: string | null = null, declaration: VariableDeclaration | null = null): Local {\n // if it has a name, check previously as this method will throw otherwise\n var localIndex = this.signature.parameterTypes.length + this.additionalLocals.length;\n if (this.is(CommonFlags.INSTANCE)) ++localIndex;\n var localName = name !== null\n ? name\n : \"var$\" + localIndex.toString();\n var local = new Local(\n localName,\n localIndex,\n type,\n this,\n declaration || this.program.makeNativeVariableDeclaration(localName)\n );\n if (name) {\n if (this.localsByName.has(name)) throw new Error(\"duplicate local name\");\n this.localsByName.set(name, local);\n }\n this.localsByIndex[local.index] = local;\n this.additionalLocals.push(type);\n return local;\n }\n\n /* @override */\n lookup(name: string): Element | null {\n var locals = this.localsByName;\n if (locals.has(name)) return locals.get(name);\n return this.parent.lookup(name);\n }\n\n // used by flows to keep track of temporary locals\n tempI32s: Local[] | null = null;\n tempI64s: Local[] | null = null;\n tempF32s: Local[] | null = null;\n tempF64s: Local[] | null = null;\n\n // used by flows to keep track of break labels\n nextBreakId: i32 = 0;\n breakStack: i32[] | null = null;\n breakLabel: string | null = null;\n\n /** Finalizes the function once compiled, releasing no longer needed resources. */\n finalize(module: Module, ref: FunctionRef): void {\n this.ref = ref;\n assert(!this.breakStack || !this.breakStack.length); // internal error\n this.breakStack = null;\n this.breakLabel = null;\n this.tempI32s = this.tempI64s = this.tempF32s = this.tempF64s = null;\n if (this.program.options.sourceMap) {\n let debugLocations = this.debugLocations;\n for (let i = 0, k = debugLocations.length; i < k; ++i) {\n let debugLocation = debugLocations[i];\n module.setDebugLocation(\n ref,\n debugLocation.debugInfoRef,\n debugLocation.source.debugInfoIndex,\n debugLocation.line,\n debugLocation.column\n );\n }\n }\n }\n}\n\n/** A resolved function target, that is a function called indirectly by an index and signature. */\nexport class FunctionTarget extends Element {\n\n /** Underlying signature. */\n signature: Signature;\n /** Function type. */\n type: Type;\n\n /** Constructs a new function target. */\n constructor(\n /** Concrete signature. */\n signature: Signature,\n /** Program reference. */\n program: Program,\n __s: string = \"\" // FIXME: current TS limitation workaround, but a fix seems underway\n ) {\n super(\n ElementKind.FUNCTION_TARGET,\n __s = \"sig:\" + signature.toSignatureString(),\n __s,\n program,\n program.nativeFile\n );\n this.signature = signature;\n this.flags = CommonFlags.RESOLVED;\n this.type = Type.u32.asFunction(signature);\n }\n\n /* @override */\n lookup(name: string): Element | null {\n return null;\n }\n}\n\n/** A yet unresolved instance field prototype. */\nexport class FieldPrototype extends DeclaredElement {\n\n /** Constructs a new field prototype. */\n constructor(\n /** Simple name. */\n name: string,\n /** Parent class. */\n parent: ClassPrototype,\n /** Declaration reference. */\n declaration: FieldDeclaration,\n /** Pre-checked flags indicating built-in decorators. */\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE\n ) {\n super(\n ElementKind.FIELD_PROTOTYPE,\n name,\n mangleInternalName(name, parent, assert(declaration.is(CommonFlags.INSTANCE))),\n parent.program,\n parent,\n declaration\n );\n this.decoratorFlags = decoratorFlags;\n }\n\n /** Gets the associated type node. */\n get typeNode(): CommonTypeNode | null {\n return (this.declaration).type;\n }\n\n /** Gets the associated initializer node. */\n get initializerNode(): Expression | null {\n return (this.declaration).initializer;\n }\n\n /** Gets the associated parameter index. Set if declared as a constructor parameter, otherwise `-1`. */\n get parameterIndex(): i32 {\n return (this.declaration).parameterIndex;\n }\n\n /* @override */\n lookup(name: string): Element | null {\n return this.parent.lookup(name);\n }\n}\n\n/** A resolved instance field. */\nexport class Field extends VariableLikeElement {\n\n /** Field prototype reference. */\n prototype: FieldPrototype;\n /** Field memory offset, if an instance field. */\n memoryOffset: i32 = -1;\n\n /** Constructs a new field. */\n constructor(\n /** Respective field prototype. */\n prototype: FieldPrototype,\n /** Parent class. */\n parent: Class,\n /** Concrete type. */\n type: Type\n ) {\n super(\n ElementKind.FIELD,\n prototype.name,\n parent,\n prototype.declaration\n );\n this.prototype = prototype;\n this.flags = prototype.flags;\n assert(type != Type.void);\n this.setType(type);\n registerConcreteElement(this.program, this);\n }\n}\n\n/** A property comprised of a getter and a setter function. */\nexport class PropertyPrototype extends DeclaredElement {\n\n /** Getter prototype. */\n getterPrototype: FunctionPrototype | null = null;\n /** Setter prototype. */\n setterPrototype: FunctionPrototype | null = null;\n\n /** Constructs a new property prototype. */\n constructor(\n /** Simple name. */\n name: string,\n /** Parent class. */\n parent: ClassPrototype,\n /** Declaration of the getter or setter introducing the property. */\n firstDeclaration: FunctionDeclaration\n ) {\n super(\n ElementKind.PROPERTY_PROTOTYPE,\n name,\n mangleInternalName(name, parent, firstDeclaration.is(CommonFlags.INSTANCE)),\n parent.program,\n parent,\n firstDeclaration\n );\n this.flags &= ~(CommonFlags.GET | CommonFlags.SET);\n }\n\n /* @override */\n lookup(name: string): Element | null {\n return this.parent.lookup(name);\n }\n}\n\n/** A resolved property. */\nexport class Property extends VariableLikeElement {\n\n /** Prototype reference. */\n prototype: PropertyPrototype;\n /** Getter instance. */\n getterInstance: Function | null = null;\n /** Setter instance. */\n setterInstance: Function | null = null;\n\n /** Constructs a new property prototype. */\n constructor(\n /** Respective property prototype. */\n prototype: PropertyPrototype,\n /** Parent element, usually a static class prototype or class instance. */\n parent: Element\n ) {\n super(\n ElementKind.PROPERTY,\n prototype.name,\n parent,\n prototype.program.makeNativeVariableDeclaration(\n prototype.name,\n prototype.is(CommonFlags.INSTANCE)\n ? CommonFlags.INSTANCE\n : CommonFlags.NONE\n )\n );\n this.prototype = prototype;\n registerConcreteElement(this.program, this);\n }\n\n /* @override */\n lookup(name: string): Element | null {\n return this.parent.lookup(name);\n }\n}\n\n/** A yet unresolved class prototype. */\nexport class ClassPrototype extends DeclaredElement {\n\n /** Instance member prototypes. */\n instanceMembers: Map | null = null;\n /** Base class prototype, if applicable. */\n basePrototype: ClassPrototype | null = null; // set in Program#initialize\n /** Constructor prototype. */\n constructorPrototype: FunctionPrototype | null = null;\n /** Operator overload prototypes. */\n overloadPrototypes: Map = new Map();\n /** Already resolved instances. */\n instances: Map | null = null;\n\n constructor(\n /** Simple name. */\n name: string,\n /** Parent element, usually a file or namespace. */\n parent: Element,\n /** Declaration reference. */\n declaration: ClassDeclaration,\n /** Pre-checked flags indicating built-in decorators. */\n decoratorFlags: DecoratorFlags = DecoratorFlags.NONE,\n _isInterface: bool = false // FIXME\n ) {\n super(\n _isInterface ? ElementKind.INTERFACE_PROTOTYPE : ElementKind.CLASS_PROTOTYPE,\n name,\n mangleInternalName(name, parent, declaration.is(CommonFlags.INSTANCE)),\n parent.program,\n parent,\n declaration\n );\n this.decoratorFlags = decoratorFlags;\n }\n\n /** Gets the associated type parameter nodes. */\n get typeParameterNodes(): TypeParameterNode[] | null {\n return (this.declaration).typeParameters;\n }\n /** Gets the associated extends node. */\n get extendsNode(): TypeNode | null {\n return (this.declaration).extendsType;\n }\n /** Gets the associated implements nodes. */\n get implementsNodes(): TypeNode[] | null {\n return (this.declaration).implementsTypes;\n }\n\n /** Tests if this prototype extends the specified. */\n extends(basePtototype: ClassPrototype | null): bool {\n var current: ClassPrototype | null = this;\n do {\n if (current === basePtototype) return true;\n } while (current = current.basePrototype);\n return false;\n }\n\n /** Adds an element as an instance member of this one. Returns the previous element if a duplicate. */\n addInstance(name: string, element: DeclaredElement): bool {\n var originalDeclaration = element.declaration;\n var instanceMembers = this.instanceMembers;\n if (!instanceMembers) this.instanceMembers = instanceMembers = new Map();\n else if (instanceMembers.has(name)) {\n let merged = tryMerge(instanceMembers.get(name)!, element);\n if (!merged) {\n this.program.error(\n DiagnosticCode.Duplicate_identifier_0,\n element.identifierNode.range, element.identifierNode.text\n );\n return false;\n }\n element = merged;\n }\n instanceMembers.set(name, element);\n if (element.is(CommonFlags.EXPORT) && this.is(CommonFlags.MODULE_EXPORT)) {\n element.set(CommonFlags.MODULE_EXPORT); // propagate\n }\n this.program.elementsByDeclaration.set(originalDeclaration, element);\n return true;\n }\n\n /** Gets the resolved instance for the specified instance key, if already resolved. */\n getResolvedInstance(instanceKey: string): Class | null {\n var instances = this.instances;\n if (instances && instances.has(instanceKey)) return instances.get(instanceKey);\n return null;\n }\n\n /** Sets the resolved instance for the specified instance key. */\n setResolvedInstance(instanceKey: string, instance: Class): void {\n var instances = this.instances;\n if (!instances) this.instances = instances = new Map();\n else assert(!instances.has(instanceKey));\n instances.set(instanceKey, instance);\n }\n\n /* @override */\n lookup(name: string): Element | null {\n return this.parent.lookup(name);\n }\n}\n\n/** A resolved class. */\nexport class Class extends TypedElement {\n\n /** Class prototype. */\n prototype: ClassPrototype;\n /** Resolved type arguments. */\n typeArguments: Type[] | null;\n /** Base class, if applicable. */\n base: Class | null;\n /** Contextual type arguments for fields and methods. */\n contextualTypeArguments: Map | null = null;\n /** Current member memory offset. */\n currentMemoryOffset: u32 = 0;\n /** Constructor instance. */\n constructorInstance: Function | null = null;\n /** Operator overloads. */\n overloads: Map | null = null;\n /** Function index of the GC hook. */\n gcHookIndex: u32 = -1;\n\n /** Constructs a new class. */\n constructor(\n /** Name incl. type parameters, i.e. `Foo`. */\n nameInclTypeParameters: string,\n /** The respective class prototype. */\n prototype: ClassPrototype,\n /** Concrete type arguments, if any. */\n typeArguments: Type[] | null = null,\n /** Base class, if derived. */\n base: Class | null = null,\n _isInterface: bool = false // FIXME\n ) {\n super(\n _isInterface ? ElementKind.INTERFACE : ElementKind.CLASS,\n nameInclTypeParameters,\n mangleInternalName(nameInclTypeParameters, prototype.parent, prototype.is(CommonFlags.INSTANCE)),\n prototype.program,\n prototype.parent,\n prototype.declaration\n );\n this.prototype = prototype;\n this.flags = prototype.flags;\n this.decoratorFlags = prototype.decoratorFlags;\n this.typeArguments = typeArguments;\n this.setType(this.program.options.usizeType.asClass(this));\n this.base = base;\n\n // inherit static members and contextual type arguments from base class\n if (base) {\n let inheritedTypeArguments = base.contextualTypeArguments;\n if (inheritedTypeArguments) {\n let contextualTypeArguments = this.contextualTypeArguments;\n for (let [baseName, baseType] of inheritedTypeArguments) {\n if (!contextualTypeArguments) this.contextualTypeArguments = contextualTypeArguments = new Map();\n contextualTypeArguments.set(baseName, baseType);\n }\n }\n }\n\n // apply pre-checked instance-specific contextual type arguments\n var typeParameters = prototype.typeParameterNodes;\n if (typeArguments) {\n let numTypeArguments = typeArguments.length;\n if (!typeParameters || numTypeArguments != typeParameters.length) {\n throw new Error(\"type argument count mismatch\");\n }\n if (numTypeArguments) {\n if (!this.contextualTypeArguments) this.contextualTypeArguments = new Map();\n for (let i = 0; i < numTypeArguments; ++i) {\n this.contextualTypeArguments.set(typeParameters[i].name.text, typeArguments[i]);\n }\n }\n } else if (typeParameters && typeParameters.length) {\n throw new Error(\"type argument count mismatch\");\n }\n registerConcreteElement(this.program, this);\n }\n\n /** Tests if a value of this class type is assignable to a target of the specified class type. */\n isAssignableTo(target: Class): bool {\n var current: Class | null = this;\n do if (current == target) return true;\n while (current = current.base);\n return false;\n }\n\n /** Looks up the operator overload of the specified kind. */\n lookupOverload(kind: OperatorKind, unchecked: bool = false): Function | null {\n if (unchecked) {\n switch (kind) {\n case OperatorKind.INDEXED_GET: {\n let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_GET);\n if (uncheckedOverload) return uncheckedOverload;\n break;\n }\n case OperatorKind.INDEXED_SET: {\n let uncheckedOverload = this.lookupOverload(OperatorKind.UNCHECKED_INDEXED_SET);\n if (uncheckedOverload) return uncheckedOverload;\n break;\n }\n default: assert(false);\n }\n }\n var instance: Class | null = this;\n do {\n let overloads = instance.overloads;\n if (overloads) {\n let overload = overloads.get(kind);\n if (overload) return overload;\n }\n } while (instance = instance.base);\n return null;\n }\n\n /* @override */\n lookup(name: string): Element | null {\n return this.parent.lookup(name);\n }\n\n /** Calculates the memory offset of the specified field. */\n offsetof(fieldName: string): u32 {\n var members = assert(this.members);\n assert(members.has(fieldName));\n var field = members.get(fieldName);\n assert(field.kind == ElementKind.FIELD);\n return (field).memoryOffset;\n }\n}\n\n/** A yet unresolved interface. */\nexport class InterfacePrototype extends ClassPrototype { // FIXME\n\n /** Constructs a new interface prototype. */\n constructor(\n name: string,\n parent: Element,\n declaration: InterfaceDeclaration,\n decoratorFlags: DecoratorFlags\n ) {\n super(\n name,\n parent,\n declaration,\n decoratorFlags,\n true\n );\n }\n}\n\n/** A resolved interface. */\nexport class Interface extends Class { // FIXME\n\n /** Constructs a new interface. */\n constructor(\n nameInclTypeParameters: string,\n prototype: InterfacePrototype,\n typeArguments: Type[] = [],\n base: Interface | null = null\n ) {\n super(\n nameInclTypeParameters,\n prototype,\n typeArguments,\n base,\n true\n );\n }\n}\n\n/** Registers a concrete element with a program. */\nfunction registerConcreteElement(program: Program, element: Element): void {\n assert(!program.instancesByName.has(element.internalName));\n program.instancesByName.set(element.internalName, element);\n}\n\n/** Attempts to merge two elements. Returns the merged element on success. */\nfunction tryMerge(older: Element, newer: Element): DeclaredElement | null {\n // NOTE: some of the following cases are not supported by TS, not sure why exactly.\n // suggesting to just merge what seems to be possible for now and revisit later.\n assert(older.program === newer.program);\n assert(!newer.members);\n var merged: DeclaredElement | null = null;\n switch (older.kind) {\n case ElementKind.FUNCTION_PROTOTYPE: {\n switch (newer.kind) {\n case ElementKind.NAMESPACE: {\n copyMembers(newer, older);\n merged = older;\n break;\n }\n case ElementKind.TYPEDEFINITION: {\n if (!older.shadowType) {\n older.shadowType = newer;\n copyMembers(newer, older);\n merged = older;\n }\n break;\n }\n }\n break;\n }\n case ElementKind.CLASS_PROTOTYPE:\n case ElementKind.ENUM: {\n if (newer.kind == ElementKind.NAMESPACE) {\n copyMembers(newer, older);\n merged = older;\n break;\n }\n break;\n }\n case ElementKind.NAMESPACE: {\n switch (newer.kind) {\n case ElementKind.ENUM:\n case ElementKind.CLASS_PROTOTYPE: // TS2434\n case ElementKind.FUNCTION_PROTOTYPE: { // TS2434\n copyMembers(older, newer);\n merged = newer;\n break;\n }\n case ElementKind.NAMESPACE: {\n copyMembers(newer, older);\n merged = older;\n break;\n }\n case ElementKind.TYPEDEFINITION: {\n if (!older.shadowType) {\n older.shadowType = newer;\n copyMembers(newer, older);\n merged = older;\n }\n break;\n }\n }\n break;\n }\n case ElementKind.GLOBAL: {\n if (newer.kind == ElementKind.TYPEDEFINITION) {\n if (!older.shadowType) {\n older.shadowType = newer;\n copyMembers(newer, older);\n merged = older;\n }\n }\n break;\n }\n case ElementKind.TYPEDEFINITION: {\n switch (newer.kind) {\n case ElementKind.GLOBAL:\n case ElementKind.FUNCTION_PROTOTYPE:\n case ElementKind.NAMESPACE: {\n if (!newer.shadowType) {\n newer.shadowType = older;\n copyMembers(older, newer);\n merged = newer;\n }\n break;\n }\n }\n break;\n }\n }\n if (merged) {\n if (older.is(CommonFlags.EXPORT) != newer.is(CommonFlags.EXPORT)) {\n older.program.error(\n DiagnosticCode.Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local,\n merged.identifierNode.range, merged.identifierNode.text\n );\n }\n }\n return merged;\n}\n\n/** Copies the members of `src` to `dest`. */\nfunction copyMembers(src: Element, dest: Element): void {\n var srcMembers = src.members;\n if (srcMembers) {\n let destMembers = dest.members;\n if (!destMembers) dest.members = destMembers = new Map();\n for (let [memberName, member] of srcMembers) {\n destMembers.set(memberName, member);\n }\n }\n}\n\n/** Mangles the internal name of an element with the specified name that is a child of the given parent. */\nexport function mangleInternalName(name: string, parent: Element, isInstance: bool, asGlobal: bool = false): string {\n switch (parent.kind) {\n case ElementKind.FILE: {\n if (asGlobal) return name;\n return parent.internalName + PATH_DELIMITER + name;\n }\n case ElementKind.FUNCTION: {\n if (asGlobal) return name;\n assert(!isInstance);\n return parent.internalName + INNER_DELIMITER + name;\n }\n default: {\n return mangleInternalName(parent.name, parent.parent, parent.is(CommonFlags.INSTANCE), asGlobal)\n + (isInstance ? INSTANCE_DELIMITER : STATIC_DELIMITER) + name;\n }\n }\n}\n","/**\n * A thin wrapper around Binaryen's C-API.\n * @module module\n *//***/\n\nimport {\n Target\n} from \"./compiler\";\n\nexport type ModuleRef = usize;\nexport type FunctionTypeRef = usize;\nexport type FunctionRef = usize;\nexport type ExpressionRef = usize;\nexport type GlobalRef = usize;\nexport type ImportRef = usize;\nexport type ExportRef = usize;\nexport type RelooperRef = usize;\nexport type RelooperBlockRef = usize;\nexport type Index = u32;\n\nexport enum NativeType {\n None = _BinaryenTypeNone(),\n I32 = _BinaryenTypeInt32(),\n I64 = _BinaryenTypeInt64(),\n F32 = _BinaryenTypeFloat32(),\n F64 = _BinaryenTypeFloat64(),\n V128 = _BinaryenTypeVec128(),\n Unreachable = _BinaryenTypeUnreachable(),\n Auto = _BinaryenTypeAuto()\n}\n\nexport enum ExpressionId {\n Invalid = _BinaryenInvalidId(),\n Block = _BinaryenBlockId(),\n If = _BinaryenIfId(),\n Loop = _BinaryenLoopId(),\n Break = _BinaryenBreakId(),\n Switch = _BinaryenSwitchId(),\n Call = _BinaryenCallId(),\n CallIndirect = _BinaryenCallIndirectId(),\n GetLocal = _BinaryenGetLocalId(),\n SetLocal = _BinaryenSetLocalId(),\n GetGlobal = _BinaryenGetGlobalId(),\n SetGlobal = _BinaryenSetGlobalId(),\n Load = _BinaryenLoadId(),\n Store = _BinaryenStoreId(),\n Const = _BinaryenConstId(),\n Unary = _BinaryenUnaryId(),\n Binary = _BinaryenBinaryId(),\n Select = _BinaryenSelectId(),\n Drop = _BinaryenDropId(),\n Return = _BinaryenReturnId(),\n Host = _BinaryenHostId(),\n Nop = _BinaryenNopId(),\n Unreachable = _BinaryenUnreachableId(),\n AtomicCmpxchg = _BinaryenAtomicCmpxchgId(),\n AtomicRMW = _BinaryenAtomicRMWId(),\n AtomicWait = _BinaryenAtomicWaitId(),\n AtomicWake = _BinaryenAtomicWakeId(),\n SIMDExtract = _BinaryenSIMDExtractId(),\n SIMDReplace = _BinaryenSIMDReplaceId(),\n SIMDShuffle = _BinaryenSIMDShuffleId(),\n SIMDBitselect = _BinaryenSIMDBitselectId(),\n SIMDShift = _BinaryenSIMDShiftId(),\n MemoryInit = _BinaryenMemoryInitId(),\n DataDrop = _BinaryenDataDropId(),\n MemoryCopy = _BinaryenMemoryCopyId(),\n MemoryFill = _BinaryenMemoryFillId()\n}\n\nexport enum UnaryOp {\n ClzI32 = _BinaryenClzInt32(),\n CtzI32 = _BinaryenCtzInt32(),\n PopcntI32 = _BinaryenPopcntInt32(),\n NegF32 = _BinaryenNegFloat32(),\n AbsF32 = _BinaryenAbsFloat32(),\n CeilF32 = _BinaryenCeilFloat32(),\n FloorF32 = _BinaryenFloorFloat32(),\n TruncF32 = _BinaryenTruncFloat32(),\n NearestF32 = _BinaryenNearestFloat32(),\n SqrtF32 = _BinaryenSqrtFloat32(),\n EqzI32 = _BinaryenEqZInt32(),\n ClzI64 = _BinaryenClzInt64(),\n CtzI64 = _BinaryenCtzInt64(),\n PopcntI64 = _BinaryenPopcntInt64(),\n NegF64 = _BinaryenNegFloat64(),\n AbsF64 = _BinaryenAbsFloat64(),\n CeilF64 = _BinaryenCeilFloat64(),\n FloorF64 = _BinaryenFloorFloat64(),\n TruncF64 = _BinaryenTruncFloat64(),\n NearestF64 = _BinaryenNearestFloat64(),\n SqrtF64 = _BinaryenSqrtFloat64(),\n EqzI64 = _BinaryenEqZInt64(),\n ExtendI32 = _BinaryenExtendSInt32(),\n ExtendU32 = _BinaryenExtendUInt32(),\n WrapI64 = _BinaryenWrapInt64(),\n TruncF32ToI32 = _BinaryenTruncSFloat32ToInt32(),\n TruncF32ToI64 = _BinaryenTruncSFloat32ToInt64(),\n TruncF32ToU32 = _BinaryenTruncUFloat32ToInt32(),\n TruncF32ToU64 = _BinaryenTruncUFloat32ToInt64(),\n TruncF64ToI32 = _BinaryenTruncSFloat64ToInt32(),\n TruncF64ToI64 = _BinaryenTruncSFloat64ToInt64(),\n TruncF64ToU32 = _BinaryenTruncUFloat64ToInt32(),\n TruncF64ToU64 = _BinaryenTruncUFloat64ToInt64(),\n ReinterpretF32 = _BinaryenReinterpretFloat32(),\n ReinterpretF64 = _BinaryenReinterpretFloat64(),\n ConvertI32ToF32 = _BinaryenConvertSInt32ToFloat32(),\n ConvertI32ToF64 = _BinaryenConvertSInt32ToFloat64(),\n ConvertU32ToF32 = _BinaryenConvertUInt32ToFloat32(),\n ConvertU32ToF64 = _BinaryenConvertUInt32ToFloat64(),\n ConvertI64ToF32 = _BinaryenConvertSInt64ToFloat32(),\n ConvertI64ToF64 = _BinaryenConvertSInt64ToFloat64(),\n ConvertU64ToF32 = _BinaryenConvertUInt64ToFloat32(),\n ConvertU64ToF64 = _BinaryenConvertUInt64ToFloat64(),\n PromoteF32 = _BinaryenPromoteFloat32(),\n DemoteF64 = _BinaryenDemoteFloat64(),\n ReinterpretI32 = _BinaryenReinterpretInt32(),\n ReinterpretI64 = _BinaryenReinterpretInt64(),\n\n // see: https://github.com/WebAssembly/sign-extension-ops\n ExtendI8ToI32 = _BinaryenExtendS8Int32(),\n ExtendI16ToI32 = _BinaryenExtendS16Int32(),\n ExtendI8ToI64 = _BinaryenExtendS8Int64(),\n ExtendI16ToI64 = _BinaryenExtendS16Int64(),\n ExtendI32ToI64 = _BinaryenExtendS32Int64()\n\n // see: https://github.com/WebAssembly/nontrapping-float-to-int-conversions\n // TruncF32ToI32Sat\n // TruncF32ToU32Sat\n // TruncF64ToI32Sat\n // TruncF64ToU32Sat\n // TruncF32ToI64Sat\n // TruncF32ToU64Sat\n // TruncF64ToI64Sat\n // TruncF64ToU64Sat\n}\n\nexport enum BinaryOp {\n AddI32 = _BinaryenAddInt32(),\n SubI32 = _BinaryenSubInt32(),\n MulI32 = _BinaryenMulInt32(),\n DivI32 = _BinaryenDivSInt32(),\n DivU32 = _BinaryenDivUInt32(),\n RemI32 = _BinaryenRemSInt32(),\n RemU32 = _BinaryenRemUInt32(),\n AndI32 = _BinaryenAndInt32(),\n OrI32 = _BinaryenOrInt32(),\n XorI32 = _BinaryenXorInt32(),\n ShlI32 = _BinaryenShlInt32(),\n ShrU32 = _BinaryenShrUInt32(),\n ShrI32 = _BinaryenShrSInt32(),\n RotlI32 = _BinaryenRotLInt32(),\n RotrI32 = _BinaryenRotRInt32(),\n EqI32 = _BinaryenEqInt32(),\n NeI32 = _BinaryenNeInt32(),\n LtI32 = _BinaryenLtSInt32(),\n LtU32 = _BinaryenLtUInt32(),\n LeI32 = _BinaryenLeSInt32(),\n LeU32 = _BinaryenLeUInt32(),\n GtI32 = _BinaryenGtSInt32(),\n GtU32 = _BinaryenGtUInt32(),\n GeI32 = _BinaryenGeSInt32(),\n GeU32 = _BinaryenGeUInt32(),\n AddI64 = _BinaryenAddInt64(),\n SubI64 = _BinaryenSubInt64(),\n MulI64 = _BinaryenMulInt64(),\n DivI64 = _BinaryenDivSInt64(),\n DivU64 = _BinaryenDivUInt64(),\n RemI64 = _BinaryenRemSInt64(),\n RemU64 = _BinaryenRemUInt64(),\n AndI64 = _BinaryenAndInt64(),\n OrI64 = _BinaryenOrInt64(),\n XorI64 = _BinaryenXorInt64(),\n ShlI64 = _BinaryenShlInt64(),\n ShrU64 = _BinaryenShrUInt64(),\n ShrI64 = _BinaryenShrSInt64(),\n RotlI64 = _BinaryenRotLInt64(),\n RotrI64 = _BinaryenRotRInt64(),\n EqI64 = _BinaryenEqInt64(),\n NeI64 = _BinaryenNeInt64(),\n LtI64 = _BinaryenLtSInt64(),\n LtU64 = _BinaryenLtUInt64(),\n LeI64 = _BinaryenLeSInt64(),\n LeU64 = _BinaryenLeUInt64(),\n GtI64 = _BinaryenGtSInt64(),\n GtU64 = _BinaryenGtUInt64(),\n GeI64 = _BinaryenGeSInt64(),\n GeU64 = _BinaryenGeUInt64(),\n AddF32 = _BinaryenAddFloat32(),\n SubF32 = _BinaryenSubFloat32(),\n MulF32 = _BinaryenMulFloat32(),\n DivF32 = _BinaryenDivFloat32(),\n CopysignF32 = _BinaryenCopySignFloat32(),\n MinF32 = _BinaryenMinFloat32(),\n MaxF32 = _BinaryenMaxFloat32(),\n EqF32 = _BinaryenEqFloat32(),\n NeF32 = _BinaryenNeFloat32(),\n LtF32 = _BinaryenLtFloat32(),\n LeF32 = _BinaryenLeFloat32(),\n GtF32 = _BinaryenGtFloat32(),\n GeF32 = _BinaryenGeFloat32(),\n AddF64 = _BinaryenAddFloat64(),\n SubF64 = _BinaryenSubFloat64(),\n MulF64 = _BinaryenMulFloat64(),\n DivF64 = _BinaryenDivFloat64(),\n CopysignF64 = _BinaryenCopySignFloat64(),\n MinF64 = _BinaryenMinFloat64(),\n MaxF64 = _BinaryenMaxFloat64(),\n EqF64 = _BinaryenEqFloat64(),\n NeF64 = _BinaryenNeFloat64(),\n LtF64 = _BinaryenLtFloat64(),\n LeF64 = _BinaryenLeFloat64(),\n GtF64 = _BinaryenGtFloat64(),\n GeF64 = _BinaryenGeFloat64()\n}\n\nexport enum HostOp {\n CurrentMemory = _BinaryenCurrentMemory(),\n GrowMemory = _BinaryenGrowMemory(),\n\n // see: https://github.com/WebAssembly/bulk-memory-operations\n // MoveMemory\n // SetMemory\n}\n\nexport enum AtomicRMWOp {\n Add = _BinaryenAtomicRMWAdd(),\n Sub = _BinaryenAtomicRMWSub(),\n And = _BinaryenAtomicRMWAnd(),\n Or = _BinaryenAtomicRMWOr(),\n Xor = _BinaryenAtomicRMWXor(),\n Xchg = _BinaryenAtomicRMWXchg()\n}\n\nexport enum SIMDOp {\n SplatVecI8x16 = _BinaryenSplatVecI8x16(),\n SplatVecI16x8 = _BinaryenSplatVecI16x8(),\n SplatVecI32x4 = _BinaryenSplatVecI32x4(),\n SplatVecI64x2 = _BinaryenSplatVecI64x2(),\n SplatVecF32x4 = _BinaryenSplatVecF32x4(),\n SplatVecF64x2 = _BinaryenSplatVecF64x2(),\n NotVec128 = _BinaryenNotVec128(),\n NegVecI8x16 = _BinaryenNegVecI8x16(),\n AnyTrueVecI8x16 = _BinaryenAnyTrueVecI8x16(),\n AllTrueVecI8x16 = _BinaryenAllTrueVecI8x16(),\n NegVecI16x8 = _BinaryenNegVecI16x8(),\n AnyTrueVecI16x8 = _BinaryenAnyTrueVecI16x8(),\n AllTrueVecI16x8 = _BinaryenAllTrueVecI16x8(),\n NegVecI32x4 = _BinaryenNegVecI32x4(),\n AnyTrueVecI32x4 = _BinaryenAnyTrueVecI32x4(),\n AllTrueVecI32x4 = _BinaryenAllTrueVecI32x4(),\n NegVecI64x2 = _BinaryenNegVecI64x2(),\n AnyTrueVecI64x2 = _BinaryenAnyTrueVecI64x2(),\n AllTrueVecI64x2 = _BinaryenAllTrueVecI64x2(),\n AbsVecF32x4 = _BinaryenAbsVecF32x4(),\n NegVecF32x4 = _BinaryenNegVecF32x4(),\n SqrtVecF32x4 = _BinaryenSqrtVecF32x4(),\n AbsVecF64x2 = _BinaryenAbsVecF64x2(),\n NegVecF64x2 = _BinaryenNegVecF64x2(),\n SqrtVecF64x2 = _BinaryenSqrtVecF64x2(),\n TruncSatSVecF32x4ToVecI32x4 = _BinaryenTruncSatSVecF32x4ToVecI32x4(),\n TruncSatUVecF32x4ToVecI32x4 = _BinaryenTruncSatUVecF32x4ToVecI32x4(),\n TruncSatSVecF64x2ToVecI64x2 = _BinaryenTruncSatSVecF64x2ToVecI64x2(),\n TruncSatUVecF64x2ToVecI64x2 = _BinaryenTruncSatUVecF64x2ToVecI64x2(),\n ConvertSVecI32x4ToVecF32x4 = _BinaryenConvertSVecI32x4ToVecF32x4(),\n ConvertUVecI32x4ToVecF32x4 = _BinaryenConvertUVecI32x4ToVecF32x4(),\n ConvertSVecI64x2ToVecF64x2 = _BinaryenConvertSVecI64x2ToVecF64x2(),\n ConvertUVecI64x2ToVecF64x2 = _BinaryenConvertUVecI64x2ToVecF64x2(),\n EqVecI8x16 = _BinaryenEqVecI8x16(),\n NeVecI8x16 = _BinaryenNeVecI8x16(),\n LtSVecI8x16 = _BinaryenLtSVecI8x16(),\n LtUVecI8x16 = _BinaryenLtUVecI8x16(),\n LeSVecI8x16 = _BinaryenLeSVecI8x16(),\n LeUVecI8x16 = _BinaryenLeUVecI8x16(),\n GtSVecI8x16 = _BinaryenGtSVecI8x16(),\n GtUVecI8x16 = _BinaryenGtUVecI8x16(),\n GeSVecI8x16 = _BinaryenGeSVecI8x16(),\n GeUVecI8x16 = _BinaryenGeUVecI8x16(),\n EqVecI16x8 = _BinaryenEqVecI16x8(),\n NeVecI16x8 = _BinaryenNeVecI16x8(),\n LtSVecI16x8 = _BinaryenLtSVecI16x8(),\n LtUVecI16x8 = _BinaryenLtUVecI16x8(),\n LeSVecI16x8 = _BinaryenLeSVecI16x8(),\n LeUVecI16x8 = _BinaryenLeUVecI16x8(),\n GtSVecI16x8 = _BinaryenGtSVecI16x8(),\n GtUVecI16x8 = _BinaryenGtUVecI16x8(),\n GeSVecI16x8 = _BinaryenGeSVecI16x8(),\n GeUVecI16x8 = _BinaryenGeUVecI16x8(),\n EqVecI32x4 = _BinaryenEqVecI32x4(),\n NeVecI32x4 = _BinaryenNeVecI32x4(),\n LtSVecI32x4 = _BinaryenLtSVecI32x4(),\n LtUVecI32x4 = _BinaryenLtUVecI32x4(),\n LeSVecI32x4 = _BinaryenLeSVecI32x4(),\n LeUVecI32x4 = _BinaryenLeUVecI32x4(),\n GtSVecI32x4 = _BinaryenGtSVecI32x4(),\n GtUVecI32x4 = _BinaryenGtUVecI32x4(),\n GeSVecI32x4 = _BinaryenGeSVecI32x4(),\n GeUVecI32x4 = _BinaryenGeUVecI32x4(),\n EqVecF32x4 = _BinaryenEqVecF32x4(),\n NeVecF32x4 = _BinaryenNeVecF32x4(),\n LtVecF32x4 = _BinaryenLtVecF32x4(),\n LeVecF32x4 = _BinaryenLeVecF32x4(),\n GtVecF32x4 = _BinaryenGtVecF32x4(),\n GeVecF32x4 = _BinaryenGeVecF32x4(),\n EqVecF64x2 = _BinaryenEqVecF64x2(),\n NeVecF64x2 = _BinaryenNeVecF64x2(),\n LtVecF64x2 = _BinaryenLtVecF64x2(),\n LeVecF64x2 = _BinaryenLeVecF64x2(),\n GtVecF64x2 = _BinaryenGtVecF64x2(),\n GeVecF64x2 = _BinaryenGeVecF64x2(),\n AndVec128 = _BinaryenAndVec128(),\n OrVec128 = _BinaryenOrVec128(),\n XorVec128 = _BinaryenXorVec128(),\n AddVecI8x16 = _BinaryenAddVecI8x16(),\n AddSatSVecI8x16 = _BinaryenAddSatSVecI8x16(),\n AddSatUVecI8x16 = _BinaryenAddSatUVecI8x16(),\n SubVecI8x16 = _BinaryenSubVecI8x16(),\n SubSatSVecI8x16 = _BinaryenSubSatSVecI8x16(),\n SubSatUVecI8x16 = _BinaryenSubSatUVecI8x16(),\n MulVecI8x16 = _BinaryenMulVecI8x16(),\n AddVecI16x8 = _BinaryenAddVecI16x8(),\n AddSatSVecI16x8 = _BinaryenAddSatSVecI16x8(),\n AddSatUVecI16x8 = _BinaryenAddSatUVecI16x8(),\n SubVecI16x8 = _BinaryenSubVecI16x8(),\n SubSatSVecI16x8 = _BinaryenSubSatSVecI16x8(),\n SubSatUVecI16x8 = _BinaryenSubSatUVecI16x8(),\n MulVecI16x8 = _BinaryenMulVecI16x8(),\n AddVecI32x4 = _BinaryenAddVecI32x4(),\n SubVecI32x4 = _BinaryenSubVecI32x4(),\n MulVecI32x4 = _BinaryenMulVecI32x4(),\n AddVecI64x2 = _BinaryenAddVecI64x2(),\n SubVecI64x2 = _BinaryenSubVecI64x2(),\n AddVecF32x4 = _BinaryenAddVecF32x4(),\n SubVecF32x4 = _BinaryenSubVecF32x4(),\n MulVecF32x4 = _BinaryenMulVecF32x4(),\n DivVecF32x4 = _BinaryenDivVecF32x4(),\n MinVecF32x4 = _BinaryenMinVecF32x4(),\n MaxVecF32x4 = _BinaryenMaxVecF32x4(),\n AddVecF64x2 = _BinaryenAddVecF64x2(),\n SubVecF64x2 = _BinaryenSubVecF64x2(),\n MulVecF64x2 = _BinaryenMulVecF64x2(),\n DivVecF64x2 = _BinaryenDivVecF64x2(),\n MinVecF64x2 = _BinaryenMinVecF64x2(),\n MaxVecF64x2 = _BinaryenMaxVecF64x2()\n}\n\nexport class MemorySegment {\n\n buffer: Uint8Array;\n offset: I64;\n\n static create(buffer: Uint8Array, offset: I64): MemorySegment {\n var segment = new MemorySegment();\n segment.buffer = buffer;\n segment.offset = offset;\n return segment;\n }\n}\n\nexport class Module {\n\n ref: ModuleRef;\n\n private lit: usize;\n\n static create(): Module {\n var module = new Module();\n module.ref = _BinaryenModuleCreate();\n module.lit = memory.allocate(_BinaryenSizeofLiteral());\n return module;\n }\n\n static createFrom(buffer: Uint8Array): Module {\n var cArr = allocU8Array(buffer);\n try {\n let module = new Module();\n module.ref = _BinaryenModuleRead(cArr, buffer.length);\n module.lit = memory.allocate(_BinaryenSizeofLiteral());\n return module;\n } finally {\n memory.free(changetype(cArr));\n }\n }\n\n private constructor() { }\n\n // types\n\n addFunctionType(\n name: string,\n result: NativeType,\n paramTypes: NativeType[] | null\n ): FunctionRef {\n var cStr = this.allocStringCached(name);\n var cArr = allocI32Array(paramTypes);\n try {\n return _BinaryenAddFunctionType(this.ref, cStr, result, cArr, paramTypes ? paramTypes.length : 0);\n } finally {\n memory.free(cArr);\n }\n }\n\n getFunctionTypeBySignature(\n result: NativeType,\n paramTypes: NativeType[] | null\n ): FunctionTypeRef {\n var cArr = allocI32Array(paramTypes);\n try {\n return _BinaryenGetFunctionTypeBySignature(this.ref, result, cArr, paramTypes ? paramTypes.length : 0);\n } finally {\n memory.free(cArr);\n }\n }\n\n removeFunctionType(name: string): void {\n var cStr = this.allocStringCached(name);\n _BinaryenRemoveFunctionType(this.ref, cStr);\n }\n\n // constants\n\n createI32(value: i32): ExpressionRef {\n var out = this.lit;\n _BinaryenLiteralInt32(out, value);\n return _BinaryenConst(this.ref, out);\n }\n\n createI64(valueLow: i32, valueHigh: i32 = 0): ExpressionRef {\n var out = this.lit;\n _BinaryenLiteralInt64(out, valueLow, valueHigh);\n return _BinaryenConst(this.ref, out);\n }\n\n createF32(value: f32): ExpressionRef {\n var out = this.lit;\n _BinaryenLiteralFloat32(out, value);\n return _BinaryenConst(this.ref, out);\n }\n\n createF64(value: f64): ExpressionRef {\n var out = this.lit;\n _BinaryenLiteralFloat64(out, value);\n return _BinaryenConst(this.ref, out);\n }\n\n createV128(bytes: Uint8Array): ExpressionRef {\n assert(bytes.length == 16);\n var out = this.lit;\n // FIXME: does this work or do we need to malloc?\n for (let i = 0; i < 16; ++i) store(out + i, bytes[i]);\n _BinaryenLiteralVec128(out, out);\n return _BinaryenConst(this.ref, out);\n }\n\n // expressions\n\n createUnary(\n op: UnaryOp,\n expr: ExpressionRef\n ): ExpressionRef {\n return _BinaryenUnary(this.ref, op, expr);\n }\n\n createBinary(\n op: BinaryOp,\n left: ExpressionRef,\n right: ExpressionRef\n ): ExpressionRef {\n return _BinaryenBinary(this.ref, op, left, right);\n }\n\n createHost(\n op: HostOp,\n name: string | null = null,\n operands: ExpressionRef[] | null = null\n ): ExpressionRef {\n var cStr = this.allocStringCached(name);\n var cArr = allocPtrArray(operands);\n try {\n return _BinaryenHost(this.ref, op, cStr, cArr, operands ? (operands).length : 0);\n } finally {\n memory.free(cArr);\n }\n }\n\n createGetLocal(\n index: i32,\n type: NativeType\n ): ExpressionRef {\n return _BinaryenGetLocal(this.ref, index, type);\n }\n\n createTeeLocal(\n index: i32,\n value: ExpressionRef\n ): ExpressionRef {\n return _BinaryenTeeLocal(this.ref, index, value);\n }\n\n createGetGlobal(\n name: string,\n type: NativeType\n ): ExpressionRef {\n var cStr = this.allocStringCached(name);\n return _BinaryenGetGlobal(this.ref, cStr, type);\n }\n\n createLoad(\n bytes: Index,\n signed: bool,\n ptr: ExpressionRef,\n type: NativeType,\n offset: Index = 0\n ): ExpressionRef {\n return _BinaryenLoad(this.ref, bytes, signed ? 1 : 0, offset, /* always aligned */ bytes, type, ptr);\n }\n\n createStore(\n bytes: Index,\n ptr: ExpressionRef,\n value: ExpressionRef,\n type: NativeType,\n offset: Index = 0\n ): ExpressionRef {\n return _BinaryenStore(this.ref, bytes, offset, /* always aligned */ bytes, ptr, value, type);\n }\n\n createAtomicLoad(\n bytes: Index,\n ptr: ExpressionRef,\n type: NativeType,\n offset: Index = 0\n ): ExpressionRef {\n return _BinaryenAtomicLoad(this.ref, bytes, offset, type, ptr);\n }\n\n createAtomicStore(\n bytes: Index,\n ptr: ExpressionRef,\n value: ExpressionRef,\n type: NativeType,\n offset: Index = 0\n ): ExpressionRef {\n return _BinaryenAtomicStore(this.ref, bytes, offset, ptr, value, type);\n }\n\n createAtomicRMW(\n op: AtomicRMWOp,\n bytes: Index,\n offset: Index,\n ptr: ExpressionRef,\n value: ExpressionRef,\n type: NativeType\n ): ExpressionRef {\n return _BinaryenAtomicRMW(this.ref, op, bytes, offset, ptr, value, type);\n }\n\n createAtomicCmpxchg(\n bytes: Index,\n offset: Index,\n ptr: ExpressionRef,\n expected: ExpressionRef,\n replacement: ExpressionRef,\n type: NativeType\n ): ExpressionRef {\n return _BinaryenAtomicCmpxchg(this.ref, bytes, offset, ptr, expected, replacement, type);\n }\n\n createAtomicWait(\n ptr: ExpressionRef,\n expected: ExpressionRef,\n timeout: ExpressionRef,\n expectedType: NativeType\n ): ExpressionRef {\n return _BinaryenAtomicWait(this.ref, ptr, expected, timeout, expectedType);\n }\n\n createAtomicWake(\n ptr: ExpressionRef,\n wakeCount: ExpressionRef\n ): ExpressionRef {\n return _BinaryenAtomicWake(this.ref, ptr, wakeCount);\n }\n\n // statements\n\n createSetLocal(\n index: Index,\n value: ExpressionRef\n ): ExpressionRef {\n return _BinaryenSetLocal(this.ref, index, value);\n }\n\n createSetGlobal(\n name: string,\n value: ExpressionRef\n ): ExpressionRef {\n var cStr = this.allocStringCached(name);\n return _BinaryenSetGlobal(this.ref, cStr, value);\n }\n\n createBlock(\n label: string | null,\n children: ExpressionRef[],\n type: NativeType = NativeType.None\n ): ExpressionRef {\n var cStr = this.allocStringCached(label);\n var cArr = allocPtrArray(children);\n try {\n return _BinaryenBlock(this.ref, cStr, cArr, children.length, type);\n } finally {\n memory.free(cArr);\n }\n }\n\n createBreak(\n label: string | null,\n condition: ExpressionRef = 0,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var cStr = this.allocStringCached(label);\n return _BinaryenBreak(this.ref, cStr, condition, value);\n }\n\n createDrop(\n expression: ExpressionRef\n ): ExpressionRef {\n return _BinaryenDrop(this.ref, expression);\n }\n\n createLoop(\n label: string | null,\n body: ExpressionRef\n ): ExpressionRef {\n var cStr = this.allocStringCached(label);\n return _BinaryenLoop(this.ref, cStr, body);\n }\n\n createIf(\n condition: ExpressionRef,\n ifTrue: ExpressionRef,\n ifFalse: ExpressionRef = 0\n ): ExpressionRef {\n return _BinaryenIf(this.ref, condition, ifTrue, ifFalse);\n }\n\n createNop(): ExpressionRef {\n return _BinaryenNop(this.ref);\n }\n\n createReturn(\n expression: ExpressionRef = 0\n ): ExpressionRef {\n return _BinaryenReturn(this.ref, expression);\n }\n\n createSelect(\n ifTrue: ExpressionRef,\n ifFalse: ExpressionRef,\n condition: ExpressionRef\n ): ExpressionRef {\n return _BinaryenSelect(this.ref, condition, ifTrue, ifFalse);\n }\n\n createSwitch(\n names: string[],\n defaultName: string | null,\n condition: ExpressionRef,\n value: ExpressionRef = 0\n ): ExpressionRef {\n var numNames = names.length;\n var strs = new Array(numNames);\n for (let i = 0; i < numNames; ++i) {\n strs[i] = this.allocStringCached(names[i]);\n }\n var cArr = allocI32Array(strs);\n var cStr = this.allocStringCached(defaultName);\n try {\n return _BinaryenSwitch(this.ref, cArr, numNames, cStr, condition, value);\n } finally {\n memory.free(cArr);\n }\n }\n\n createCall(\n target: string,\n operands: ExpressionRef[] | null,\n returnType: NativeType\n ): ExpressionRef {\n var cStr = this.allocStringCached(target);\n var cArr = allocPtrArray(operands);\n try {\n return _BinaryenCall(this.ref, cStr, cArr, operands && operands.length || 0, returnType);\n } finally {\n memory.free(cArr);\n }\n }\n\n createCallIndirect(\n index: ExpressionRef,\n operands: ExpressionRef[] | null,\n typeName: string\n ): ExpressionRef {\n var cStr = this.allocStringCached(typeName);\n var cArr = allocPtrArray(operands);\n try {\n return _BinaryenCallIndirect(this.ref, index, cArr, operands && operands.length || 0, cStr);\n } finally {\n memory.free(cArr);\n }\n }\n\n createUnreachable(): ExpressionRef {\n return _BinaryenUnreachable(this.ref);\n }\n\n // bulk memory\n\n createMemoryCopy(\n dest: ExpressionRef,\n source: ExpressionRef,\n size: ExpressionRef\n ): ExpressionRef {\n return _BinaryenMemoryCopy(this.ref, dest, source, size);\n }\n\n createMemoryFill(\n dest: ExpressionRef,\n value: ExpressionRef,\n size: ExpressionRef\n ): ExpressionRef {\n return _BinaryenMemoryFill(this.ref, dest, value, size);\n }\n\n // meta\n\n addGlobal(\n name: string,\n type: NativeType,\n mutable: bool,\n initializer: ExpressionRef\n ): GlobalRef {\n var cStr = this.allocStringCached(name);\n return _BinaryenAddGlobal(this.ref, cStr, type, mutable ? 1 : 0, initializer);\n }\n\n removeGlobal(\n name: string\n ): void {\n var cStr = this.allocStringCached(name);\n _BinaryenRemoveGlobal(this.ref, cStr);\n }\n\n addFunction(\n name: string,\n type: FunctionTypeRef,\n varTypes: NativeType[] | null,\n body: ExpressionRef\n ): FunctionRef {\n var cStr = this.allocStringCached(name);\n var cArr = allocI32Array(varTypes);\n try {\n return _BinaryenAddFunction(this.ref, cStr, type, cArr, varTypes ? varTypes.length : 0, body);\n } finally {\n memory.free(cArr);\n }\n }\n\n removeFunction(name: string): void {\n var cStr = this.allocStringCached(name);\n _BinaryenRemoveFunction(this.ref, cStr);\n }\n\n private hasTemporaryFunction: bool = false;\n\n addTemporaryFunction(result: NativeType, paramTypes: NativeType[] | null, body: ExpressionRef): FunctionRef {\n this.hasTemporaryFunction = assert(!this.hasTemporaryFunction);\n var tempName = this.allocStringCached(\"\");\n var cArr = allocI32Array(paramTypes);\n try {\n let typeRef = _BinaryenAddFunctionType(this.ref, tempName, result, cArr, paramTypes ? paramTypes.length : 0);\n return _BinaryenAddFunction(this.ref, tempName, typeRef, 0, 0, body);\n } finally {\n memory.free(cArr);\n }\n }\n\n removeTemporaryFunction(): void {\n this.hasTemporaryFunction = !assert(this.hasTemporaryFunction);\n var tempName = this.allocStringCached(\"\");\n _BinaryenRemoveFunction(this.ref, tempName);\n _BinaryenRemoveFunctionType(this.ref, tempName);\n }\n\n addFunctionExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalName);\n return _BinaryenAddFunctionExport(this.ref, cStr1, cStr2);\n }\n\n addTableExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalName);\n return _BinaryenAddTableExport(this.ref, cStr1, cStr2);\n }\n\n addMemoryExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalName);\n return _BinaryenAddMemoryExport(this.ref, cStr1, cStr2);\n }\n\n addGlobalExport(\n internalName: string,\n externalName: string\n ): ExportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalName);\n return _BinaryenAddGlobalExport(this.ref, cStr1, cStr2);\n }\n\n removeExport(externalName: string): void {\n var cStr = this.allocStringCached(externalName);\n _BinaryenRemoveExport(this.ref, cStr);\n }\n\n addFunctionImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n functionType: FunctionTypeRef\n ): ImportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalModuleName);\n var cStr3 = this.allocStringCached(externalBaseName);\n return _BinaryenAddFunctionImport(this.ref, cStr1, cStr2, cStr3, functionType);\n }\n\n addTableImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string\n ): ImportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalModuleName);\n var cStr3 = this.allocStringCached(externalBaseName);\n return _BinaryenAddTableImport(this.ref, cStr1, cStr2, cStr3);\n }\n\n addMemoryImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n shared: bool = false,\n ): ImportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalModuleName);\n var cStr3 = this.allocStringCached(externalBaseName);\n return _BinaryenAddMemoryImport(this.ref, cStr1, cStr2, cStr3, shared);\n }\n\n addGlobalImport(\n internalName: string,\n externalModuleName: string,\n externalBaseName: string,\n globalType: NativeType\n ): ImportRef {\n var cStr1 = this.allocStringCached(internalName);\n var cStr2 = this.allocStringCached(externalModuleName);\n var cStr3 = this.allocStringCached(externalBaseName);\n return _BinaryenAddGlobalImport(this.ref, cStr1, cStr2, cStr3, globalType);\n }\n\n /** Unlimited memory constant. */\n static readonly UNLIMITED_MEMORY: Index = -1;\n\n setMemory(\n initial: Index,\n maximum: Index,\n segments: MemorySegment[],\n target: Target,\n exportName: string | null = null,\n shared: bool = false\n ): void {\n var cStr = this.allocStringCached(exportName);\n var k = segments.length;\n var segs = new Array(k);\n var offs = new Array(k);\n var sizs = new Array(k);\n for (let i = 0; i < k; ++i) {\n let buffer = segments[i].buffer;\n let offset = segments[i].offset;\n segs[i] = allocU8Array(buffer);\n offs[i] = target == Target.WASM64\n ? this.createI64(i64_low(offset), i64_high(offset))\n : this.createI32(i64_low(offset));\n sizs[i] = buffer.length;\n }\n var cArr1 = allocI32Array(segs);\n var cArr2 = allocI32Array(offs);\n var cArr3 = allocI32Array(sizs);\n try {\n _BinaryenSetMemory(this.ref, initial, maximum, cStr, cArr1, cArr2, cArr3, k, shared);\n } finally {\n memory.free(cArr3);\n memory.free(cArr2);\n memory.free(cArr1);\n for (let i = k - 1; i >= 0; --i) memory.free(segs[i]);\n }\n }\n\n setFunctionTable(\n initial: Index,\n maximum: Index,\n funcs: string[]\n ): void {\n var numNames = funcs.length;\n var names = new Array(numNames);\n for (let i = 0; i < numNames; ++i) {\n names[i] = this.allocStringCached(funcs[i]);\n }\n var cArr = allocI32Array(names);\n try {\n _BinaryenSetFunctionTable(this.ref, initial, maximum, cArr, numNames);\n } finally {\n memory.free(cArr);\n }\n }\n\n setStart(func: FunctionRef): void {\n _BinaryenSetStart(this.ref, func);\n }\n\n getOptimizeLevel(): i32 {\n return _BinaryenGetOptimizeLevel();\n }\n\n setOptimizeLevel(level: i32 = 2): void {\n _BinaryenSetOptimizeLevel(level);\n }\n\n getShrinkLevel(): i32 {\n return _BinaryenGetShrinkLevel();\n }\n\n setShrinkLevel(level: i32 = 1): void {\n _BinaryenSetShrinkLevel(level);\n }\n\n setDebugInfo(on: bool = false): void {\n _BinaryenSetDebugInfo(on);\n }\n\n optimize(func: FunctionRef = 0): void {\n if (func) {\n _BinaryenFunctionOptimize(func, this.ref);\n } else {\n _BinaryenModuleOptimize(this.ref);\n }\n }\n\n runPasses(passes: string[], func: FunctionRef = 0): void {\n var numNames = passes.length;\n var names = new Array(numNames);\n for (let i = 0; i < numNames; ++i) {\n names[i] = allocString(passes[i]);\n }\n var cArr = allocI32Array(names);\n try {\n if (func) {\n _BinaryenFunctionRunPasses(func, this.ref, cArr, numNames);\n } else {\n _BinaryenModuleRunPasses(this.ref, cArr, numNames);\n }\n } finally {\n memory.free(cArr);\n for (let i = numNames; i >= 0; --i) memory.free(names[i]);\n }\n }\n\n private cachedPrecomputeNames: usize = 0;\n\n precomputeExpression(expr: ExpressionRef): ExpressionRef {\n // remember the previous optimize levels and set to max instead, to be sure\n var previousOptimizeLevel = _BinaryenGetOptimizeLevel();\n var previousShrinkLevel = _BinaryenGetShrinkLevel();\n var previousDebugInfo = _BinaryenGetDebugInfo();\n _BinaryenSetOptimizeLevel(4);\n _BinaryenSetShrinkLevel(0);\n _BinaryenSetDebugInfo(false);\n\n // wrap the expression in a temp. function and run the precompute pass on it\n var type = _BinaryenExpressionGetType(expr);\n var func = this.addTemporaryFunction(type, null, expr);\n var names = this.cachedPrecomputeNames;\n if (!names) {\n this.cachedPrecomputeNames = names = allocI32Array([ this.allocStringCached(\"precompute\") ]);\n }\n _BinaryenFunctionRunPasses(func, this.ref, names, 1);\n expr = _BinaryenFunctionGetBody(func);\n this.removeTemporaryFunction();\n\n // reset optimize levels to previous\n _BinaryenSetOptimizeLevel(previousOptimizeLevel);\n _BinaryenSetShrinkLevel(previousShrinkLevel);\n _BinaryenSetDebugInfo(previousDebugInfo);\n return expr;\n }\n\n validate(): bool {\n return _BinaryenModuleValidate(this.ref) == 1;\n }\n\n interpret(): void {\n _BinaryenModuleInterpret(this.ref);\n }\n\n toBinary(sourceMapUrl: string | null): BinaryModule {\n var out = this.lit; // safe to reuse as long as..\n assert(_BinaryenSizeofLiteral() >= 12);\n var cStr = allocString(sourceMapUrl);\n var binaryPtr: usize = 0;\n var sourceMapPtr: usize = 0;\n try {\n _BinaryenModuleAllocateAndWrite(out, this.ref, cStr);\n binaryPtr = readInt(out);\n let binaryBytes = readInt(out + 4);\n sourceMapPtr = readInt(out + 4 * 2);\n let ret = new BinaryModule();\n ret.output = readBuffer(binaryPtr, binaryBytes);\n ret.sourceMap = readString(sourceMapPtr);\n return ret;\n } finally {\n if (cStr) memory.free(cStr);\n if (binaryPtr) memory.free(binaryPtr);\n if (sourceMapPtr) memory.free(sourceMapPtr);\n }\n }\n\n toText(): string {\n throw new Error(\"not implemented\"); // JS glue overrides this\n }\n\n toAsmjs(): string {\n throw new Error(\"not implemented\"); // JS glue overrides this\n }\n\n private cachedStrings: Map = new Map();\n\n private allocStringCached(str: string | null): usize {\n if (str == null) return 0;\n var cachedStrings = this.cachedStrings;\n if (cachedStrings.has(str)) return cachedStrings.get(str);\n var ptr = allocString(str);\n cachedStrings.set(str, ptr);\n return ptr;\n }\n\n dispose(): void {\n assert(this.ref);\n for (let ptr of this.cachedStrings.values()) memory.free(ptr);\n this.cachedStrings = new Map();\n memory.free(this.lit);\n memory.free(this.cachedPrecomputeNames);\n this.cachedPrecomputeNames = 0;\n _BinaryenModuleDispose(this.ref);\n this.ref = 0;\n }\n\n createRelooper(): Relooper {\n return Relooper.create(this);\n }\n\n cloneExpression(\n expr: ExpressionRef,\n noSideEffects: bool = false,\n maxDepth: i32 = i32.MAX_VALUE\n ): ExpressionRef { // currently supports side effect free expressions only\n if (maxDepth < 0) return 0;\n maxDepth -= 1;\n\n var nested1: ExpressionRef,\n nested2: ExpressionRef;\n\n switch (_BinaryenExpressionGetId(expr)) {\n case ExpressionId.Const: {\n switch (_BinaryenExpressionGetType(expr)) {\n case NativeType.I32: {\n return this.createI32(_BinaryenConstGetValueI32(expr));\n }\n case NativeType.I64: {\n return this.createI64(\n _BinaryenConstGetValueI64Low(expr),\n _BinaryenConstGetValueI64High(expr)\n );\n }\n case NativeType.F32: {\n return this.createF32(_BinaryenConstGetValueF32(expr));\n }\n case NativeType.F64: {\n return this.createF64(_BinaryenConstGetValueF64(expr));\n }\n default: {\n throw new Error(\"concrete type expected\");\n }\n }\n }\n case ExpressionId.GetLocal: {\n return _BinaryenGetLocal(this.ref,\n _BinaryenGetLocalGetIndex(expr),\n _BinaryenExpressionGetType(expr)\n );\n }\n case ExpressionId.GetGlobal: {\n let globalName = _BinaryenGetGlobalGetName(expr);\n if (!globalName) break;\n return _BinaryenGetGlobal(this.ref, globalName, _BinaryenExpressionGetType(expr));\n }\n case ExpressionId.Load: {\n if (!(nested1 = this.cloneExpression(_BinaryenLoadGetPtr(expr), noSideEffects, maxDepth))) {\n break;\n }\n return (\n _BinaryenLoadIsAtomic(expr)\n ? _BinaryenAtomicLoad(this.ref,\n _BinaryenLoadGetBytes(expr),\n _BinaryenLoadGetOffset(expr),\n _BinaryenExpressionGetType(expr),\n nested1\n )\n : _BinaryenLoad(this.ref,\n _BinaryenLoadGetBytes(expr),\n _BinaryenLoadIsSigned(expr) ? 1 : 0,\n _BinaryenLoadGetOffset(expr),\n _BinaryenLoadGetAlign(expr),\n _BinaryenExpressionGetType(expr),\n nested1\n )\n );\n }\n case ExpressionId.Unary: {\n if (!(nested1 = this.cloneExpression(_BinaryenUnaryGetValue(expr), noSideEffects, maxDepth))) {\n break;\n }\n return _BinaryenUnary(this.ref, _BinaryenUnaryGetOp(expr), nested1);\n }\n case ExpressionId.Binary: {\n if (!(nested1 = this.cloneExpression(_BinaryenBinaryGetLeft(expr), noSideEffects, maxDepth))) {\n break;\n }\n if (!(nested2 = this.cloneExpression(_BinaryenBinaryGetRight(expr), noSideEffects, maxDepth))) {\n break;\n }\n return _BinaryenBinary(this.ref, _BinaryenBinaryGetOp(expr), nested1, nested2);\n }\n }\n return 0;\n }\n\n // source map generation\n\n addDebugInfoFile(name: string): Index {\n var cStr = allocString(name);\n try {\n return _BinaryenModuleAddDebugInfoFileName(this.ref, cStr);\n } finally {\n memory.free(cStr);\n }\n }\n\n getDebugInfoFile(index: Index): string | null {\n return readString(_BinaryenModuleGetDebugInfoFileName(this.ref, index));\n }\n\n setDebugLocation(\n func: FunctionRef,\n expr: ExpressionRef,\n fileIndex: Index,\n lineNumber: Index,\n columnNumber: Index\n ): void {\n _BinaryenFunctionSetDebugLocation(func, expr, fileIndex, lineNumber, columnNumber);\n }\n}\n\n// expressions\n\nexport function getExpressionId(expr: ExpressionRef): ExpressionId {\n return _BinaryenExpressionGetId(expr);\n}\n\nexport function getExpressionType(expr: ExpressionRef): NativeType {\n return _BinaryenExpressionGetType(expr);\n}\n\nexport function getConstValueI32(expr: ExpressionRef): i32 {\n return _BinaryenConstGetValueI32(expr);\n}\n\nexport function getConstValueI64Low(expr: ExpressionRef): i32 {\n return _BinaryenConstGetValueI64Low(expr);\n}\n\nexport function getConstValueI64High(expr: ExpressionRef): i32 {\n return _BinaryenConstGetValueI64High(expr);\n}\n\nexport function getConstValueF32(expr: ExpressionRef): f32 {\n return _BinaryenConstGetValueF32(expr);\n}\n\nexport function getConstValueF64(expr: ExpressionRef): f32 {\n return _BinaryenConstGetValueF64(expr);\n}\n\nexport function getGetLocalIndex(expr: ExpressionRef): Index {\n return _BinaryenGetLocalGetIndex(expr);\n}\n\nexport function getSetLocalIndex(expr: ExpressionRef): Index {\n return _BinaryenSetLocalGetIndex(expr);\n}\n\nexport function getSetLocalValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenSetLocalGetValue(expr);\n}\n\nexport function isTeeLocal(expr: ExpressionRef): bool {\n return _BinaryenSetLocalIsTee(expr);\n}\n\nexport function getGetGlobalName(expr: ExpressionRef): string | null {\n return readString(_BinaryenGetGlobalGetName(expr));\n}\n\nexport function getBinaryOp(expr: ExpressionRef): BinaryOp {\n return _BinaryenBinaryGetOp(expr);\n}\n\nexport function getBinaryLeft(expr: ExpressionRef): ExpressionRef {\n return _BinaryenBinaryGetLeft(expr);\n}\n\nexport function getBinaryRight(expr: ExpressionRef): ExpressionRef {\n return _BinaryenBinaryGetRight(expr);\n}\n\nexport function getUnaryOp(expr: ExpressionRef): UnaryOp {\n return _BinaryenUnaryGetOp(expr);\n}\n\nexport function getUnaryValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenUnaryGetValue(expr);\n}\n\nexport function getLoadBytes(expr: ExpressionRef): u32 {\n return _BinaryenLoadGetBytes(expr);\n}\n\nexport function getLoadOffset(expr: ExpressionRef): u32 {\n return _BinaryenLoadGetOffset(expr);\n}\n\nexport function getLoadPtr(expr: ExpressionRef): ExpressionRef {\n return _BinaryenLoadGetPtr(expr);\n}\n\nexport function isLoadSigned(expr: ExpressionRef): bool {\n return _BinaryenLoadIsSigned(expr);\n}\n\nexport function getStoreBytes(expr: ExpressionRef): u32 {\n return _BinaryenStoreGetBytes(expr);\n}\n\nexport function getStoreOffset(expr: ExpressionRef): u32 {\n return _BinaryenStoreGetOffset(expr);\n}\n\nexport function getStorePtr(expr: ExpressionRef): ExpressionRef {\n return _BinaryenStoreGetPtr(expr);\n}\n\nexport function getStoreValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenStoreGetValue(expr);\n}\n\nexport function getBlockName(expr: ExpressionRef): string | null {\n return readString(_BinaryenBlockGetName(expr));\n}\n\nexport function getBlockChildCount(expr: ExpressionRef): Index {\n return _BinaryenBlockGetNumChildren(expr);\n}\n\nexport function getBlockChild(expr: ExpressionRef, index: Index): ExpressionRef {\n return _BinaryenBlockGetChild(expr, index);\n}\n\nexport function getIfCondition(expr: ExpressionRef): ExpressionRef {\n return _BinaryenIfGetCondition(expr);\n}\n\nexport function getIfTrue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenIfGetIfTrue(expr);\n}\n\nexport function getIfFalse(expr: ExpressionRef): ExpressionRef {\n return _BinaryenIfGetIfFalse(expr);\n}\n\nexport function getLoopName(expr: ExpressionRef): string | null {\n return readString(_BinaryenLoopGetName(expr));\n}\n\nexport function getLoopBody(expr: ExpressionRef): ExpressionRef {\n return _BinaryenLoopGetBody(expr);\n}\n\nexport function getBreakName(expr: ExpressionRef): string | null {\n return readString(_BinaryenBreakGetName(expr));\n}\n\nexport function getBreakCondition(expr: ExpressionRef): ExpressionRef {\n return _BinaryenBreakGetCondition(expr);\n}\n\nexport function getSelectThen(expr: ExpressionRef): ExpressionRef {\n return _BinaryenSelectGetIfTrue(expr);\n}\n\nexport function getSelectElse(expr: ExpressionRef): ExpressionRef {\n return _BinaryenSelectGetIfFalse(expr);\n}\n\nexport function getSelectCondition(expr: ExpressionRef): ExpressionRef {\n return _BinaryenSelectGetCondition(expr);\n}\n\nexport function getDropValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenDropGetValue(expr);\n}\n\nexport function getReturnValue(expr: ExpressionRef): ExpressionRef {\n return _BinaryenReturnGetValue(expr);\n}\n\nexport function getCallTarget(expr: ExpressionRef): string | null {\n return readString(_BinaryenCallGetTarget(expr));\n}\n\nexport function getHostOp(expr: ExpressionRef): ExpressionRef {\n return _BinaryenHostGetOp(expr);\n}\n\nexport function getHostOperandCount(expr: ExpressionRef): Index {\n return _BinaryenHostGetNumOperands(expr);\n}\n\nexport function getHostOperand(expr: ExpressionRef, index: Index): ExpressionRef {\n return _BinaryenHostGetOperand(expr, index);\n}\n\nexport function getHostName(expr: ExpressionRef): string | null {\n return readString(_BinaryenHostGetNameOperand(expr));\n}\n\n// functions\n\nexport function getFunctionBody(func: FunctionRef): ExpressionRef {\n return _BinaryenFunctionGetBody(func);\n}\n\nexport function getFunctionName(func: FunctionRef): string | null {\n return readString(_BinaryenFunctionGetName(func));\n}\n\nexport function getFunctionParamCount(func: FunctionRef): Index {\n return _BinaryenFunctionGetNumParams(func);\n}\n\nexport function getFunctionParamType(func: FunctionRef, index: Index): NativeType {\n return _BinaryenFunctionGetParam(func, index);\n}\n\nexport function getFunctionResultType(func: FunctionRef): NativeType {\n return _BinaryenFunctionGetResult(func);\n}\n\nexport class Relooper {\n\n module: Module;\n ref: RelooperRef;\n\n static create(module: Module): Relooper {\n var relooper = new Relooper();\n relooper.module = module;\n relooper.ref = _RelooperCreate(module.ref);\n return relooper;\n }\n\n private constructor() {}\n\n addBlock(code: ExpressionRef): RelooperBlockRef {\n return _RelooperAddBlock(this.ref, code);\n }\n\n addBranch(\n from: RelooperBlockRef,\n to: RelooperBlockRef,\n condition: ExpressionRef = 0,\n code: ExpressionRef = 0\n ): void {\n _RelooperAddBranch(from, to, condition, code);\n }\n\n addBlockWithSwitch(code: ExpressionRef, condition: ExpressionRef): RelooperBlockRef {\n return _RelooperAddBlockWithSwitch(this.ref, code, condition);\n }\n\n addBranchForSwitch(\n from: RelooperBlockRef,\n to: RelooperBlockRef,\n indexes: i32[],\n code: ExpressionRef = 0\n ): void {\n var cArr = allocI32Array(indexes);\n try {\n _RelooperAddBranchForSwitch(from, to, cArr, indexes.length, code);\n } finally {\n memory.free(cArr);\n }\n }\n\n renderAndDispose(entry: RelooperBlockRef, labelHelper: Index): ExpressionRef {\n return _RelooperRenderAndDispose(this.ref, entry, labelHelper);\n }\n}\n\n// export function hasSideEffects(expr: ExpressionRef): bool {\n// switch (_BinaryenExpressionGetId(expr = getPtr(expr))) {\n// case ExpressionId.GetLocal:\n// case ExpressionId.GetGlobal:\n// case ExpressionId.Const:\n// case ExpressionId.Nop:\n// case ExpressionId.Unreachable: {\n// return false;\n// }\n// case ExpressionId.Block: {\n// for (let i = 0, k = _BinaryenBlockGetNumChildren(expr); i < k; ++i) {\n// if (hasSideEffects(_BinaryenBlockGetChild(expr, i))) return true;\n// }\n// return false;\n// }\n// case ExpressionId.If: {\n// return hasSideEffects(_BinaryenIfGetCondition(expr))\n// || hasSideEffects(_BinaryenIfGetIfTrue(expr))\n// || hasSideEffects(_BinaryenIfGetIfFalse(expr));\n// }\n// case ExpressionId.Unary: {\n// return hasSideEffects(_BinaryenUnaryGetValue(expr));\n// }\n// case ExpressionId.Binary: {\n// return hasSideEffects(_BinaryenBinaryGetLeft(expr))\n// || hasSideEffects(_BinaryenBinaryGetRight(expr));\n// }\n// case ExpressionId.Drop: {\n// return hasSideEffects(_BinaryenDropGetValue(expr));\n// }\n// case ExpressionId.Select: {\n// return hasSideEffects(_BinaryenSelectGetIfTrue(expr))\n// || hasSideEffects(_BinaryenSelectGetIfFalse(expr))\n// || hasSideEffects(_BinaryenSelectGetCondition(expr));\n// }\n// }\n// return true;\n// }\n\n// helpers\n// can't do stack allocation here: STACKTOP is a global in WASM but a hidden variable in asm.js\n\nfunction allocU8Array(u8s: Uint8Array | null): usize {\n if (!u8s) return 0;\n var numValues = u8s.length;\n var ptr = memory.allocate(numValues);\n var idx = ptr;\n for (let i = 0; i < numValues; ++i) {\n store(idx++, u8s[i]);\n }\n return ptr;\n}\n\nfunction allocI32Array(i32s: i32[] | null): usize {\n if (!i32s) return 0;\n var ptr = memory.allocate(i32s.length << 2);\n var idx = ptr;\n for (let i = 0, k = i32s.length; i < k; ++i) {\n let val = i32s[i];\n // store(idx, val) is not portable\n store(idx , ( val & 0xff) as u8);\n store(idx + 1, ((val >> 8) & 0xff) as u8);\n store(idx + 2, ((val >> 16) & 0xff) as u8);\n store(idx + 3, ( val >>> 24 ) as u8);\n idx += 4;\n }\n return ptr;\n}\n\nfunction allocPtrArray(ptrs: usize[] | null): usize {\n return allocI32Array(ptrs); // TODO: WASM64 one day\n}\n\nfunction stringLengthUTF8(str: string): usize {\n var len = 0;\n for (let i = 0, k = str.length; i < k; ++i) {\n let u = str.charCodeAt(i);\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\n }\n if (u <= 0x7F) {\n ++len;\n } else if (u <= 0x7FF) {\n len += 2;\n } else if (u <= 0xFFFF) {\n len += 3;\n } else if (u <= 0x1FFFFF) {\n len += 4;\n } else if (u <= 0x3FFFFFF) {\n len += 5;\n } else {\n len += 6;\n }\n }\n return len;\n}\n\nfunction allocString(str: string | null): usize {\n if (str == null) return 0;\n var ptr = memory.allocate(stringLengthUTF8(str) + 1);\n // the following is based on Emscripten's stringToUTF8Array\n var idx = ptr;\n for (let i = 0, k = str.length; i < k; ++i) {\n let u = str.charCodeAt(i);\n if (u >= 0xD800 && u <= 0xDFFF && i + 1 < k) {\n u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF);\n }\n if (u <= 0x7F) {\n store(idx++, u as u8);\n } else if (u <= 0x7FF) {\n store(idx++, (0xC0 | (u >>> 6) ) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n } else if (u <= 0xFFFF) {\n store(idx++, (0xE0 | (u >>> 12) ) as u8);\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n } else if (u <= 0x1FFFFF) {\n store(idx++, (0xF0 | (u >>> 18) ) as u8);\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n } else if (u <= 0x3FFFFFF) {\n store(idx++, (0xF8 | (u >>> 24) ) as u8);\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n } else {\n store(idx++, (0xFC | (u >>> 30) ) as u8);\n store(idx++, (0x80 | ((u >>> 24) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 18) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 12) & 63)) as u8);\n store(idx++, (0x80 | ((u >>> 6) & 63)) as u8);\n store(idx++, (0x80 | ( u & 63)) as u8);\n }\n }\n store(idx, 0);\n return ptr;\n}\n\nfunction readInt(ptr: usize): i32 {\n return (\n load(ptr ) |\n (load(ptr + 1) << 8) |\n (load(ptr + 2) << 16) |\n (load(ptr + 3) << 24)\n );\n}\n\nfunction readBuffer(ptr: usize, length: usize): Uint8Array {\n var ret = new Uint8Array(length);\n for (let i: usize = 0; i < length; ++i) {\n ret[i] = load(ptr + i);\n }\n return ret;\n}\n\nexport function readString(ptr: usize): string | null {\n if (!ptr) return null;\n var arr = new Array();\n // the following is based on Emscripten's UTF8ArrayToString\n var cp: u32;\n var u1: u32, u2: u32, u3: u32, u4: u32, u5: u32;\n while (cp = load(ptr++)) {\n if (!(cp & 0x80)) {\n arr.push(cp);\n continue;\n }\n u1 = load(ptr++) & 63;\n if ((cp & 0xE0) == 0xC0) {\n arr.push(((cp & 31) << 6) | u1);\n continue;\n }\n u2 = load(ptr++) & 63;\n if ((cp & 0xF0) == 0xE0) {\n cp = ((cp & 15) << 12) | (u1 << 6) | u2;\n } else {\n u3 = load(ptr++) & 63;\n if ((cp & 0xF8) == 0xF0) {\n cp = ((cp & 7) << 18) | (u1 << 12) | (u2 << 6) | u3;\n } else {\n u4 = load(ptr++) & 63;\n if ((cp & 0xFC) == 0xF8) {\n cp = ((cp & 3) << 24) | (u1 << 18) | (u2 << 12) | (u3 << 6) | u4;\n } else {\n u5 = load(ptr++) & 63;\n cp = ((cp & 1) << 30) | (u1 << 24) | (u2 << 18) | (u3 << 12) | (u4 << 6) | u5;\n }\n }\n }\n arr.push(cp);\n // if (cp < 0x10000) {\n // arr.push(cp);\n // } else {\n // var ch = cp - 0x10000;\n // arr.push(0xD800 | (ch >> 10));\n // arr.push(0xDC00 | (ch & 0x3FF));\n // }\n }\n // return String.fromCharCodes(arr);\n return String.fromCodePoints(arr);\n}\n\n/** Result structure of {@link Module#toBinary}. */\nexport class BinaryModule {\n /** WebAssembly binary. */\n output: Uint8Array;\n /** Source map, if generated. */\n sourceMap: string | null;\n}\n\n/** Tests if an expression needs an explicit 'unreachable' when it is the terminating statement. */\nexport function needsExplicitUnreachable(expr: ExpressionRef): bool {\n // not applicable if pushing a value to the stack\n switch (_BinaryenExpressionGetType(expr)) {\n case NativeType.I32:\n case NativeType.I64:\n case NativeType.F32:\n case NativeType.F64: return false;\n }\n switch (_BinaryenExpressionGetId(expr)) {\n case ExpressionId.Unreachable:\n case ExpressionId.Return: return false;\n case ExpressionId.Break: return _BinaryenBreakGetCondition(expr) != 0;\n case ExpressionId.Block: {\n if (!_BinaryenBlockGetName(expr)) { // can't break out of it\n let numChildren = _BinaryenBlockGetNumChildren(expr); // last child needs unreachable\n return numChildren > 0 && needsExplicitUnreachable(_BinaryenBlockGetChild(expr, numChildren - 1));\n }\n }\n }\n return true;\n}\n","/**\n * Abstract syntax tree representing a source file once parsed.\n * @module ast\n *//***/\n\nimport {\n CommonFlags,\n CommonSymbols,\n PATH_DELIMITER,\n LIBRARY_PREFIX\n} from \"./common\";\n\nimport {\n Token,\n Tokenizer,\n Range\n} from \"./tokenizer\";\n\nimport {\n normalizePath,\n resolvePath,\n CharCode\n} from \"./util\";\n\nexport { Token, Range };\n\n/** Indicates the kind of a node. */\nexport enum NodeKind {\n\n SOURCE,\n\n // types\n TYPE,\n TYPENAME,\n TYPEPARAMETER,\n PARAMETER,\n SIGNATURE,\n\n // expressions\n IDENTIFIER,\n ASSERTION,\n BINARY,\n CALL,\n CLASS,\n COMMA,\n ELEMENTACCESS,\n FALSE,\n FUNCTION,\n INSTANCEOF,\n LITERAL,\n NEW,\n NULL,\n PARENTHESIZED,\n PROPERTYACCESS,\n TERNARY,\n SUPER,\n THIS,\n TRUE,\n CONSTRUCTOR,\n UNARYPOSTFIX,\n UNARYPREFIX,\n\n // statements\n BLOCK,\n BREAK,\n CONTINUE,\n DO,\n EMPTY,\n EXPORT,\n EXPORTIMPORT,\n EXPRESSION,\n FOR,\n IF,\n IMPORT,\n RETURN,\n SWITCH,\n THROW,\n TRY,\n VARIABLE,\n VOID,\n WHILE,\n\n // declaration statements\n CLASSDECLARATION,\n ENUMDECLARATION,\n ENUMVALUEDECLARATION,\n FIELDDECLARATION,\n FUNCTIONDECLARATION,\n IMPORTDECLARATION,\n INDEXSIGNATUREDECLARATION,\n INTERFACEDECLARATION,\n METHODDECLARATION,\n NAMESPACEDECLARATION,\n TYPEDECLARATION,\n VARIABLEDECLARATION,\n\n // special\n DECORATOR,\n EXPORTMEMBER,\n SWITCHCASE,\n COMMENT\n}\n\n/** Checks if a node represents a constant value. */\nexport function nodeIsConstantValue(kind: NodeKind): bool {\n switch (kind) {\n case NodeKind.LITERAL:\n case NodeKind.NULL:\n case NodeKind.TRUE:\n case NodeKind.FALSE: return true;\n }\n return false;\n}\n\n/** Checks if a node might be callable. */\nexport function nodeIsCallable(kind: NodeKind): bool {\n switch (kind) {\n case NodeKind.IDENTIFIER:\n case NodeKind.ASSERTION: // if kind=NONNULL\n case NodeKind.CALL:\n case NodeKind.ELEMENTACCESS:\n case NodeKind.PARENTHESIZED:\n case NodeKind.PROPERTYACCESS:\n case NodeKind.SUPER: return true;\n }\n return false;\n}\n\n/** Checks if a node might be callable with generic arguments. */\nexport function nodeIsGenericCallable(kind: NodeKind): bool {\n switch (kind) {\n case NodeKind.IDENTIFIER:\n case NodeKind.PROPERTYACCESS: return true;\n }\n return false;\n}\n\n/** Base class of all nodes. */\nexport abstract class Node {\n\n /** Node kind indicator. */\n kind: NodeKind;\n /** Source range. */\n range: Range;\n\n // types\n\n static createTypeName(\n name: IdentifierExpression,\n range: Range\n ): TypeName {\n var typeName = new TypeName();\n typeName.range = range;\n typeName.identifier = name;\n typeName.next = null;\n return typeName;\n }\n\n static createSimpleTypeName(\n name: string,\n range: Range\n ): TypeName {\n return Node.createTypeName(Node.createIdentifierExpression(name, range), range);\n }\n\n static createType(\n name: TypeName,\n typeArguments: CommonTypeNode[] | null,\n isNullable: bool,\n range: Range\n ): TypeNode {\n var type = new TypeNode();\n type.range = range;\n type.name = name;\n type.typeArguments = typeArguments;\n type.isNullable = isNullable;\n return type;\n }\n\n static createOmittedType(\n range: Range\n ): TypeNode {\n return Node.createType(\n Node.createSimpleTypeName(\"\", range),\n null,\n false,\n range\n );\n }\n\n static createTypeParameter(\n name: IdentifierExpression,\n extendsType: TypeNode | null,\n defaultType: TypeNode | null,\n range: Range\n ): TypeParameterNode {\n var elem = new TypeParameterNode();\n elem.range = range;\n elem.name = name;\n elem.extendsType = extendsType;\n elem.defaultType = defaultType;\n return elem;\n }\n\n static createParameter(\n name: IdentifierExpression,\n type: CommonTypeNode,\n initializer: Expression | null,\n kind: ParameterKind,\n range: Range\n ): ParameterNode {\n var elem = new ParameterNode();\n elem.range = range;\n elem.name = name;\n elem.type = type;\n elem.initializer = initializer;\n elem.parameterKind = kind;\n return elem;\n }\n\n static createSignature(\n parameters: ParameterNode[],\n returnType: CommonTypeNode,\n explicitThisType: TypeNode | null,\n isNullable: bool,\n range: Range\n ): SignatureNode {\n var sig = new SignatureNode();\n sig.range = range;\n sig.parameters = parameters;\n sig.returnType = returnType;\n sig.explicitThisType = explicitThisType;\n sig.isNullable = isNullable;\n return sig;\n }\n\n // special\n\n static createDecorator(\n name: Expression,\n args: Expression[] | null,\n range: Range\n ): DecoratorNode {\n var stmt = new DecoratorNode();\n stmt.range = range;\n stmt.name = name;\n stmt.arguments = args;\n stmt.decoratorKind = decoratorNameToKind(name);\n return stmt;\n }\n\n static createComment(\n text: string,\n kind: CommentKind,\n range: Range\n ): CommentNode {\n var node = new CommentNode();\n node.range = range;\n node.commentKind = kind;\n node.text = text;\n return node;\n }\n\n // expressions\n\n static createIdentifierExpression(\n name: string,\n range: Range,\n isQuoted: bool = false\n ): IdentifierExpression {\n var expr = new IdentifierExpression();\n expr.range = range;\n expr.text = name; // TODO: extract from range\n expr.symbol = name; // TODO: Symbol.for(name)\n expr.isQuoted = isQuoted;\n return expr;\n }\n\n static createEmptyIdentifierExpression(\n range: Range\n ): IdentifierExpression {\n var expr = new IdentifierExpression();\n expr.range = range;\n expr.text = \"\";\n return expr;\n }\n\n static createArrayLiteralExpression(\n elements: (Expression | null)[],\n range: Range\n ): ArrayLiteralExpression {\n var expr = new ArrayLiteralExpression();\n expr.range = range;\n expr.elementExpressions = elements;\n return expr;\n }\n\n static createAssertionExpression(\n assertionKind: AssertionKind,\n expression: Expression,\n toType: CommonTypeNode | null,\n range: Range\n ): AssertionExpression {\n var expr = new AssertionExpression();\n expr.range = range;\n expr.assertionKind = assertionKind;\n expr.expression = expression;\n expr.toType = toType;\n return expr;\n }\n\n static createBinaryExpression(\n operator: Token,\n left: Expression,\n right: Expression,\n range: Range\n ): BinaryExpression {\n var expr = new BinaryExpression();\n expr.range = range;\n expr.operator = operator;\n expr.left = left;\n expr.right = right;\n return expr;\n }\n\n static createCallExpression(\n expression: Expression,\n typeArgs: CommonTypeNode[] | null,\n args: Expression[],\n range: Range\n ): CallExpression {\n var expr = new CallExpression();\n expr.range = range;\n expr.expression = expression;\n expr.typeArguments = typeArgs;\n expr.arguments = args;\n return expr;\n }\n\n static createClassExpression(\n declaration: ClassDeclaration\n ): ClassExpression {\n var expr = new ClassExpression();\n expr.range = declaration.range;\n expr.declaration = declaration;\n return expr;\n }\n\n static createCommaExpression(\n expressions: Expression[],\n range: Range\n ): CommaExpression {\n var expr = new CommaExpression();\n expr.range = range;\n expr.expressions = expressions;\n return expr;\n }\n\n static createConstructorExpression(\n range: Range\n ): ConstructorExpression {\n var expr = new ConstructorExpression();\n expr.range = range;\n return expr;\n }\n\n static createElementAccessExpression(\n expression: Expression,\n element: Expression,\n range: Range\n ): ElementAccessExpression {\n var expr = new ElementAccessExpression();\n expr.range = range;\n expr.expression = expression;\n expr.elementExpression = element;\n return expr;\n }\n\n static createFalseExpression(\n range: Range\n ): FalseExpression {\n var expr = new FalseExpression();\n expr.range = range;\n return expr;\n }\n\n static createFloatLiteralExpression(\n value: f64,\n range: Range\n ): FloatLiteralExpression {\n var expr = new FloatLiteralExpression();\n expr.range = range;\n expr.value = value;\n return expr;\n }\n\n static createFunctionExpression(\n declaration: FunctionDeclaration\n ): FunctionExpression {\n var expr = new FunctionExpression();\n expr.range = declaration.range;\n expr.declaration = declaration;\n return expr;\n }\n\n static createInstanceOfExpression(\n expression: Expression,\n isType: CommonTypeNode,\n range: Range\n ): InstanceOfExpression {\n var expr = new InstanceOfExpression();\n expr.range = range;\n expr.expression = expression;\n expr.isType = isType;\n return expr;\n }\n\n static createIntegerLiteralExpression(\n value: I64,\n range: Range\n ): IntegerLiteralExpression {\n var expr = new IntegerLiteralExpression();\n expr.range = range;\n expr.value = value;\n return expr;\n }\n\n static createNewExpression(\n expression: Expression,\n typeArgs: CommonTypeNode[] | null,\n args: Expression[],\n range: Range\n ): NewExpression {\n var expr = new NewExpression();\n expr.range = range;\n expr.expression = expression;\n expr.typeArguments = typeArgs;\n expr.arguments = args;\n return expr;\n }\n\n static createNullExpression(\n range: Range\n ): NullExpression {\n var expr = new NullExpression();\n expr.range = range;\n return expr;\n }\n\n static createObjectLiteralExpression(\n names: IdentifierExpression[],\n values: Expression[],\n range: Range\n ): ObjectLiteralExpression {\n var expr = new ObjectLiteralExpression();\n expr.range = range;\n expr.names = names;\n expr.values = values;\n return expr;\n }\n\n static createParenthesizedExpression(\n expression: Expression,\n range: Range\n ): ParenthesizedExpression {\n var expr = new ParenthesizedExpression();\n expr.range = range;\n expr.expression = expression;\n return expr;\n }\n\n static createPropertyAccessExpression(\n expression: Expression,\n property: IdentifierExpression,\n range: Range\n ): PropertyAccessExpression {\n var expr = new PropertyAccessExpression();\n expr.range = range;\n expr.expression = expression;\n expr.property = property;\n return expr;\n }\n\n static createRegexpLiteralExpression(\n pattern: string,\n flags: string,\n range: Range\n ): RegexpLiteralExpression {\n var expr = new RegexpLiteralExpression();\n expr.range = range;\n expr.pattern = pattern;\n expr.patternFlags = flags;\n return expr;\n }\n\n static createTernaryExpression(\n condition: Expression,\n ifThen: Expression,\n ifElse: Expression,\n range: Range\n ): TernaryExpression {\n var expr = new TernaryExpression();\n expr.range = range;\n expr.condition = condition;\n expr.ifThen = ifThen;\n expr.ifElse = ifElse;\n return expr;\n }\n\n static createStringLiteralExpression(\n value: string,\n range: Range\n ): StringLiteralExpression {\n var expr = new StringLiteralExpression();\n expr.range = range;\n expr.value = value;\n return expr;\n }\n\n static createSuperExpression(\n range: Range\n ): SuperExpression {\n var expr = new SuperExpression();\n expr.range = range;\n return expr;\n }\n\n static createThisExpression(\n range: Range\n ): ThisExpression {\n var expr = new ThisExpression();\n expr.range = range;\n return expr;\n }\n\n static createTrueExpression(\n range: Range\n ): TrueExpression {\n var expr = new TrueExpression();\n expr.range = range;\n return expr;\n }\n\n static createUnaryPostfixExpression(\n operator: Token,\n operand: Expression,\n range: Range\n ): UnaryPostfixExpression {\n var expr = new UnaryPostfixExpression();\n expr.range = range;\n expr.operator = operator;\n expr.operand = operand;\n return expr;\n }\n\n static createUnaryPrefixExpression(\n operator: Token,\n operand: Expression,\n range: Range\n ): UnaryPrefixExpression {\n var expr = new UnaryPrefixExpression();\n expr.range = range;\n expr.operator = operator;\n expr.operand = operand;\n return expr;\n }\n\n // statements\n\n static createBlockStatement(\n statements: Statement[],\n range: Range\n ): BlockStatement {\n var stmt = new BlockStatement();\n stmt.range = range;\n stmt.statements = statements;\n return stmt;\n }\n\n static createBreakStatement(\n label: IdentifierExpression | null,\n range: Range\n ): BreakStatement {\n var stmt = new BreakStatement();\n stmt.range = range;\n stmt.label = label;\n return stmt;\n }\n\n static createClassDeclaration(\n identifier: IdentifierExpression,\n typeParameters: TypeParameterNode[] | null,\n extendsType: TypeNode | null, // can't be a function\n implementsTypes: TypeNode[] | null, // can't be functions\n members: DeclarationStatement[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): ClassDeclaration {\n var stmt = new ClassDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = identifier;\n stmt.typeParameters = typeParameters;\n stmt.extendsType = extendsType;\n stmt.implementsTypes = implementsTypes;\n stmt.members = members;\n stmt.decorators = decorators;\n return stmt;\n }\n\n static createContinueStatement(\n label: IdentifierExpression | null,\n range: Range\n ): ContinueStatement {\n var stmt = new ContinueStatement();\n stmt.range = range;\n stmt.label = label;\n return stmt;\n }\n\n static createDoStatement(\n statement: Statement,\n condition: Expression,\n range: Range\n ): DoStatement {\n var stmt = new DoStatement();\n stmt.range = range;\n stmt.statement = statement;\n stmt.condition = condition;\n return stmt;\n }\n\n static createEmptyStatement(\n range: Range\n ): EmptyStatement {\n var stmt = new EmptyStatement();\n stmt.range = range;\n return stmt;\n }\n\n static createEnumDeclaration(\n name: IdentifierExpression,\n members: EnumValueDeclaration[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): EnumDeclaration {\n var stmt = new EnumDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name;\n stmt.values = members;\n stmt.decorators = decorators;\n return stmt;\n }\n\n static createEnumValueDeclaration(\n name: IdentifierExpression,\n value: Expression | null,\n flags: CommonFlags,\n range: Range\n ): EnumValueDeclaration {\n var stmt = new EnumValueDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name;\n stmt.value = value;\n return stmt;\n }\n\n static createExportStatement(\n members: ExportMember[] | null,\n path: StringLiteralExpression | null,\n isDeclare: bool,\n range: Range\n ): ExportStatement {\n var stmt = new ExportStatement();\n stmt.range = range;\n stmt.members = members;\n stmt.path = path;\n if (path) {\n let normalizedPath = normalizePath(path.value);\n if (path.value.startsWith(\".\")) { // relative\n stmt.normalizedPath = resolvePath(\n normalizedPath,\n range.source.normalizedPath\n );\n } else { // absolute\n stmt.normalizedPath = normalizedPath;\n }\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\n } else {\n stmt.normalizedPath = null;\n stmt.internalPath = null;\n }\n stmt.isDeclare = isDeclare;\n return stmt;\n }\n\n static createExportImportStatement(\n name: IdentifierExpression,\n externalName: IdentifierExpression,\n range: Range\n ): ExportImportStatement {\n var stmt = new ExportImportStatement();\n stmt.range = range;\n stmt.name = name;\n stmt.externalName = externalName;\n return stmt;\n }\n\n static createExportMember(\n name: IdentifierExpression,\n externalName: IdentifierExpression | null,\n range: Range\n ): ExportMember {\n var elem = new ExportMember();\n elem.range = range;\n elem.localName = name;\n if (!externalName) externalName = name;\n elem.exportedName = externalName;\n return elem;\n }\n\n static createExpressionStatement(\n expression: Expression\n ): ExpressionStatement {\n var stmt = new ExpressionStatement();\n stmt.range = expression.range;\n stmt.expression = expression;\n return stmt;\n }\n\n static createIfStatement(\n condition: Expression,\n ifTrue: Statement,\n ifFalse: Statement | null,\n range: Range\n ): IfStatement {\n var stmt = new IfStatement();\n stmt.range = range;\n stmt.condition = condition;\n stmt.ifTrue = ifTrue;\n stmt.ifFalse = ifFalse;\n return stmt;\n }\n\n static createImportStatement(\n decls: ImportDeclaration[] | null,\n path: StringLiteralExpression,\n range: Range\n ): ImportStatement {\n var stmt = new ImportStatement();\n stmt.range = range;\n stmt.declarations = decls;\n stmt.namespaceName = null;\n stmt.path = path;\n var normalizedPath = normalizePath(path.value);\n if (path.value.startsWith(\".\")) { // relative in project\n stmt.normalizedPath = resolvePath(\n normalizedPath,\n range.source.normalizedPath\n );\n } else { // absolute in library\n if (!normalizedPath.startsWith(LIBRARY_PREFIX)) {\n normalizedPath = LIBRARY_PREFIX + normalizedPath;\n }\n stmt.normalizedPath = normalizedPath;\n }\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\n return stmt;\n }\n\n static createImportStatementWithWildcard(\n identifier: IdentifierExpression,\n path: StringLiteralExpression,\n range: Range\n ): ImportStatement {\n var stmt = new ImportStatement();\n stmt.range = range;\n stmt.declarations = null;\n stmt.namespaceName = identifier;\n stmt.path = path;\n stmt.normalizedPath = resolvePath(\n normalizePath(path.value),\n range.source.normalizedPath\n );\n stmt.internalPath = mangleInternalPath(stmt.normalizedPath);\n return stmt;\n }\n\n static createImportDeclaration(\n foreignName: IdentifierExpression,\n name: IdentifierExpression | null,\n range: Range\n ): ImportDeclaration {\n var elem = new ImportDeclaration();\n elem.range = range;\n elem.foreignName = foreignName;\n if (!name) name = foreignName;\n elem.name = name;\n return elem;\n }\n\n static createInterfaceDeclaration(\n name: IdentifierExpression,\n typeParameters: TypeParameterNode[] | null,\n extendsType: TypeNode | null, // can't be a function\n members: DeclarationStatement[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): InterfaceDeclaration {\n var stmt = new InterfaceDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name;\n stmt.typeParameters = typeParameters;\n stmt.extendsType = extendsType;\n stmt.members = members;\n stmt.decorators = decorators;\n return stmt;\n }\n\n static createFieldDeclaration(\n name: IdentifierExpression,\n type: CommonTypeNode | null,\n initializer: Expression | null,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): FieldDeclaration {\n var stmt = new FieldDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name;\n stmt.type = type;\n stmt.initializer = initializer;\n stmt.decorators = decorators;\n return stmt;\n }\n\n static createForStatement(\n initializer: Statement | null,\n condition: Expression | null,\n incrementor: Expression | null,\n statement: Statement,\n range: Range\n ): ForStatement {\n var stmt = new ForStatement();\n stmt.range = range;\n stmt.initializer = initializer;\n stmt.condition = condition;\n stmt.incrementor = incrementor;\n stmt.statement = statement;\n return stmt;\n }\n\n static createFunctionDeclaration(\n name: IdentifierExpression,\n typeParameters: TypeParameterNode[] | null,\n signature: SignatureNode,\n body: Statement | null,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): FunctionDeclaration {\n var stmt = new FunctionDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name;\n stmt.typeParameters = typeParameters;\n stmt.signature = signature;\n stmt.body = body;\n stmt.decorators = decorators;\n return stmt;\n }\n\n static createIndexSignatureDeclaration(\n keyType: TypeNode,\n valueType: CommonTypeNode,\n range: Range\n ): IndexSignatureDeclaration {\n var elem = new IndexSignatureDeclaration();\n elem.range = range;\n elem.keyType = keyType;\n elem.valueType = valueType;\n return elem;\n }\n\n static createMethodDeclaration(\n name: IdentifierExpression,\n typeParameters: TypeParameterNode[] | null,\n signature: SignatureNode,\n body: Statement | null,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): MethodDeclaration {\n var stmt = new MethodDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name;\n stmt.typeParameters = typeParameters;\n stmt.signature = signature;\n stmt.body = body;\n stmt.decorators = decorators;\n return stmt;\n }\n\n static createNamespaceDeclaration(\n name: IdentifierExpression,\n members: Statement[],\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): NamespaceDeclaration {\n var stmt = new NamespaceDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name;\n stmt.members = members;\n stmt.decorators = decorators;\n return stmt;\n }\n\n static createReturnStatement(\n value: Expression | null,\n range: Range\n ): ReturnStatement {\n var stmt = new ReturnStatement();\n stmt.range = range;\n stmt.value = value;\n return stmt;\n }\n\n static createSwitchStatement(\n condition: Expression,\n cases: SwitchCase[],\n range: Range\n ): SwitchStatement {\n var stmt = new SwitchStatement();\n stmt.range = range;\n stmt.condition = condition;\n stmt.cases = cases;\n return stmt;\n }\n\n static createSwitchCase(\n label: Expression | null,\n statements: Statement[],\n range: Range\n ): SwitchCase {\n var elem = new SwitchCase();\n elem.range = range;\n elem.label = label;\n elem.statements = statements;\n return elem;\n }\n\n static createThrowStatement(\n value: Expression,\n range: Range\n ): ThrowStatement {\n var stmt = new ThrowStatement();\n stmt.range = range;\n stmt.value = value;\n return stmt;\n }\n\n static createTryStatement(\n statements: Statement[],\n catchVariable: IdentifierExpression | null,\n catchStatements: Statement[] | null,\n finallyStatements: Statement[] | null,\n range: Range\n ): TryStatement {\n var stmt = new TryStatement();\n stmt.range = range;\n stmt.statements = statements;\n stmt.catchVariable = catchVariable;\n stmt.catchStatements = catchStatements;\n stmt.finallyStatements = finallyStatements;\n return stmt;\n }\n\n static createTypeDeclaration(\n name: IdentifierExpression,\n typeParameters: TypeParameterNode[] | null,\n alias: CommonTypeNode,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): TypeDeclaration {\n var stmt = new TypeDeclaration();\n stmt.range = range;\n stmt.flags = flags;\n stmt.name = name;\n stmt.typeParameters = typeParameters;\n stmt.type = alias;\n stmt.decorators = decorators;\n return stmt;\n }\n\n static createVariableStatement(\n declarations: VariableDeclaration[],\n decorators: DecoratorNode[] | null,\n range: Range\n ): VariableStatement {\n var stmt = new VariableStatement();\n stmt.range = range;\n stmt.declarations = declarations;\n stmt.decorators = decorators;\n return stmt;\n }\n\n static createVariableDeclaration(\n name: IdentifierExpression,\n type: CommonTypeNode | null,\n initializer: Expression | null,\n decorators: DecoratorNode[] | null,\n flags: CommonFlags,\n range: Range\n ): VariableDeclaration {\n var elem = new VariableDeclaration();\n elem.range = range;\n elem.flags = flags;\n elem.name = name;\n elem.type = type;\n elem.initializer = initializer;\n elem.decorators = decorators; // inherited\n return elem;\n }\n\n static createVoidStatement(\n expression: Expression,\n range: Range\n ): VoidStatement {\n var stmt = new VoidStatement();\n stmt.range = range;\n stmt.expression = expression;\n return stmt;\n }\n\n static createWhileStatement(\n condition: Expression,\n statement: Statement,\n range: Range\n ): WhileStatement {\n var stmt = new WhileStatement();\n stmt.range = range;\n stmt.condition = condition;\n stmt.statement = statement;\n return stmt;\n }\n}\n\n// types\n\nexport abstract class CommonTypeNode extends Node {\n // kind varies\n\n /** Whether nullable or not. */\n isNullable: bool;\n}\n\n/** Represents a type name. */\nexport class TypeName extends Node {\n kind = NodeKind.TYPENAME;\n\n /** Identifier of this part. */\n identifier: IdentifierExpression;\n /** Next part of the type name or `null` if this is the last part. */\n next: TypeName | null;\n}\n\n/** Represents a type annotation. */\nexport class TypeNode extends CommonTypeNode {\n kind = NodeKind.TYPE;\n\n /** Type name. */\n name: TypeName;\n /** Type argument references. */\n typeArguments: CommonTypeNode[] | null;\n}\n\n/** Represents a type parameter. */\nexport class TypeParameterNode extends Node {\n kind = NodeKind.TYPEPARAMETER;\n\n /** Identifier reference. */\n name: IdentifierExpression;\n /** Extended type reference, if any. */\n extendsType: TypeNode | null; // can't be a function\n /** Default type if omitted, if any. */\n defaultType: TypeNode | null; // can't be a function\n}\n\n/** Represents the kind of a parameter. */\nexport enum ParameterKind {\n /** No specific flags. */\n DEFAULT,\n /** Is an optional parameter. */\n OPTIONAL,\n /** Is a rest parameter. */\n REST\n}\n\n/** Represents a function parameter. */\nexport class ParameterNode extends Node {\n kind = NodeKind.PARAMETER;\n\n /** Parameter kind. */\n parameterKind: ParameterKind;\n /** Parameter name. */\n name: IdentifierExpression;\n /** Parameter type. */\n type: CommonTypeNode;\n /** Initializer expression, if present. */\n initializer: Expression | null;\n /** Implicit field declaration, if applicable. */\n implicitFieldDeclaration: FieldDeclaration | null = null;\n /** Common flags indicating specific traits. */\n flags: CommonFlags = CommonFlags.NONE;\n\n /** Tests if this node has the specified flag or flags. */\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\n /** Tests if this node has one of the specified flags. */\n isAny(flag: CommonFlags): bool { return (this.flags & flag) != 0; }\n /** Sets a specific flag or flags. */\n set(flag: CommonFlags): void { this.flags |= flag; }\n}\n\n/** Represents a function signature. */\nexport class SignatureNode extends CommonTypeNode {\n kind = NodeKind.SIGNATURE;\n\n /** Accepted parameters. */\n parameters: ParameterNode[];\n /** Return type. */\n returnType: CommonTypeNode;\n /** Explicitly provided this type, if any. */\n explicitThisType: TypeNode | null; // can't be a function\n}\n\n// special\n\n/** Built-in decorator kinds. */\nexport enum DecoratorKind {\n CUSTOM,\n GLOBAL,\n OPERATOR,\n OPERATOR_BINARY,\n OPERATOR_PREFIX,\n OPERATOR_POSTFIX,\n UNMANAGED,\n SEALED,\n INLINE,\n EXTERNAL,\n BUILTIN,\n LAZY,\n START\n}\n\n/** Returns the kind of the specified decorator. Defaults to {@link DecoratorKind.CUSTOM}. */\nexport function decoratorNameToKind(name: Expression): DecoratorKind {\n // @global, @inline, @operator, @sealed, @unmanaged\n if (name.kind == NodeKind.IDENTIFIER) {\n let nameStr = (name).text;\n assert(nameStr.length);\n switch (nameStr.charCodeAt(0)) {\n case CharCode.b: {\n if (nameStr == \"builtin\") return DecoratorKind.BUILTIN;\n break;\n }\n case CharCode.e: {\n if (nameStr == \"external\") return DecoratorKind.EXTERNAL;\n break;\n }\n case CharCode.g: {\n if (nameStr == \"global\") return DecoratorKind.GLOBAL;\n break;\n }\n case CharCode.i: {\n if (nameStr == \"inline\") return DecoratorKind.INLINE;\n break;\n }\n case CharCode.l: {\n if (nameStr == \"lazy\") return DecoratorKind.LAZY;\n break;\n }\n case CharCode.o: {\n if (nameStr == \"operator\") return DecoratorKind.OPERATOR;\n break;\n }\n case CharCode.s: {\n if (nameStr == \"sealed\") return DecoratorKind.SEALED;\n if (nameStr == \"start\") return DecoratorKind.START;\n break;\n }\n case CharCode.u: {\n if (nameStr == \"unmanaged\") return DecoratorKind.UNMANAGED;\n break;\n }\n }\n } else if (\n name.kind == NodeKind.PROPERTYACCESS &&\n (name).expression.kind == NodeKind.IDENTIFIER\n ) {\n let nameStr = ((name).expression).text;\n assert(nameStr.length);\n let propStr = (name).property.text;\n assert(propStr.length);\n // @operator.binary, @operator.prefix, @operator.postfix\n if (nameStr == \"operator\") {\n switch (propStr.charCodeAt(0)) {\n case CharCode.b: {\n if (propStr == \"binary\") return DecoratorKind.OPERATOR_BINARY;\n break;\n }\n case CharCode.p: {\n switch (propStr) {\n case \"prefix\": return DecoratorKind.OPERATOR_PREFIX;\n case \"postfix\": return DecoratorKind.OPERATOR_POSTFIX;\n }\n break;\n }\n }\n }\n }\n return DecoratorKind.CUSTOM;\n}\n\n/** Represents a decorator. */\nexport class DecoratorNode extends Node {\n kind = NodeKind.DECORATOR;\n\n /** Built-in kind, if applicable. */\n decoratorKind: DecoratorKind;\n /** Name expression. */\n name: Expression;\n /** Argument expressions. */\n arguments: Expression[] | null;\n}\n\n/** Comment kinds. */\nexport enum CommentKind {\n /** Line comment. */\n LINE,\n /** Triple-slash comment. */\n TRIPLE,\n /** Block comment. */\n BLOCK\n}\n\n/** Represents a comment. */\nexport class CommentNode extends Node {\n kind = NodeKind.COMMENT;\n\n /** Comment kind. */\n commentKind: CommentKind;\n /** Comment text. */\n text: string;\n}\n\n// expressions\n\n/** Base class of all expression nodes. */\nexport abstract class Expression extends Node { }\n\n/** Represents an identifier expression. */\nexport class IdentifierExpression extends Expression {\n kind = NodeKind.IDENTIFIER;\n\n /** Textual name. */\n text: string;\n /** Symbol. */\n symbol: string; // TODO: symbol\n /** Whether quoted or not. */\n isQuoted: bool;\n}\n\n/** Indicates the kind of a literal. */\nexport enum LiteralKind {\n FLOAT,\n INTEGER,\n STRING,\n REGEXP,\n ARRAY,\n OBJECT\n}\n\n/** Base class of all literal expressions. */\nexport abstract class LiteralExpression extends Expression {\n kind = NodeKind.LITERAL;\n\n /** Specific literal kind. */\n literalKind: LiteralKind;\n}\n\n/** Represents an `[]` literal expression. */\nexport class ArrayLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.ARRAY;\n\n /** Nested element expressions. */\n elementExpressions: (Expression | null)[];\n}\n\n/** Indicates the kind of an assertion. */\nexport enum AssertionKind {\n PREFIX,\n AS,\n NONNULL\n}\n\n/** Represents an assertion expression. */\nexport class AssertionExpression extends Expression {\n kind = NodeKind.ASSERTION;\n\n /** Specific kind of this assertion. */\n assertionKind: AssertionKind;\n /** Expression being asserted. */\n expression: Expression;\n /** Target type. */\n toType: CommonTypeNode | null;\n}\n\n/** Represents a binary expression. */\nexport class BinaryExpression extends Expression {\n kind = NodeKind.BINARY;\n\n /** Operator token. */\n operator: Token;\n /** Left-hand side expression */\n left: Expression;\n /** Right-hand side expression. */\n right: Expression;\n}\n\n/** Represents a call expression. */\nexport class CallExpression extends Expression {\n kind = NodeKind.CALL;\n\n /** Called expression. Usually an identifier or property access expression. */\n expression: Expression;\n /** Provided type arguments. */\n typeArguments: CommonTypeNode[] | null;\n /** Provided arguments. */\n arguments: Expression[];\n}\n\n/** Represents a class expression using the 'class' keyword. */\nexport class ClassExpression extends Expression {\n kind = NodeKind.CLASS;\n\n /** Inline class declaration. */\n declaration: ClassDeclaration;\n}\n\n/** Represents a comma expression composed of multiple expressions. */\nexport class CommaExpression extends Expression {\n kind = NodeKind.COMMA;\n\n /** Sequential expressions. */\n expressions: Expression[];\n}\n\n/** Represents a `constructor` expression. */\nexport class ConstructorExpression extends IdentifierExpression {\n kind = NodeKind.CONSTRUCTOR;\n text = \"constructor\";\n symbol = CommonSymbols.constructor;\n}\n\n/** Represents an element access expression, e.g., array access. */\nexport class ElementAccessExpression extends Expression {\n kind = NodeKind.ELEMENTACCESS;\n\n /** Expression being accessed. */\n expression: Expression;\n /** Element of the expression being accessed. */\n elementExpression: Expression;\n}\n\n/** Represents a float literal expression. */\nexport class FloatLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.FLOAT;\n\n /** Float value. */\n value: f64;\n}\n\n/** Represents a function expression using the 'function' keyword. */\nexport class FunctionExpression extends Expression {\n kind = NodeKind.FUNCTION;\n\n /** Inline function declaration. */\n declaration: FunctionDeclaration;\n}\n\n/** Represents an `instanceof` expression. */\nexport class InstanceOfExpression extends Expression {\n kind = NodeKind.INSTANCEOF;\n\n /** Expression being asserted. */\n expression: Expression;\n /** Type to test for. */\n isType: CommonTypeNode;\n}\n\n/** Represents an integer literal expression. */\nexport class IntegerLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.INTEGER;\n\n /** Integer value. */\n value: I64;\n}\n\n/** Represents a `new` expression. Like a call but with its own kind. */\nexport class NewExpression extends CallExpression {\n kind = NodeKind.NEW;\n}\n\n/** Represents a `null` expression. */\nexport class NullExpression extends IdentifierExpression {\n kind = NodeKind.NULL;\n text = \"null\";\n symbol = CommonSymbols.null_;\n}\n\n/** Represents an object literal expression. */\nexport class ObjectLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.OBJECT;\n\n /** Field names. */\n names: IdentifierExpression[];\n /** Field values. */\n values: Expression[];\n}\n\n/** Represents a parenthesized expression. */\nexport class ParenthesizedExpression extends Expression {\n kind = NodeKind.PARENTHESIZED;\n\n /** Expression in parenthesis. */\n expression: Expression;\n}\n\n/** Represents a property access expression. */\nexport class PropertyAccessExpression extends Expression {\n kind = NodeKind.PROPERTYACCESS;\n\n /** Expression being accessed. */\n expression: Expression;\n /** Property of the expression being accessed. */\n property: IdentifierExpression;\n}\n\n/** Represents a regular expression literal expression. */\nexport class RegexpLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.REGEXP;\n\n /** Regular expression pattern. */\n pattern: string;\n /** Regular expression flags. */\n patternFlags: string;\n}\n\n/** Represents a ternary expression, i.e., short if notation. */\nexport class TernaryExpression extends Expression {\n kind = NodeKind.TERNARY;\n\n /** Condition expression. */\n condition: Expression;\n /** Expression executed when condition is `true`. */\n ifThen: Expression;\n /** Expression executed when condition is `false`. */\n ifElse: Expression;\n}\n\n/** Represents a string literal expression. */\nexport class StringLiteralExpression extends LiteralExpression {\n literalKind = LiteralKind.STRING;\n\n /** String value without quotes. */\n value: string;\n}\n\n/** Represents a `super` expression. */\nexport class SuperExpression extends IdentifierExpression {\n kind = NodeKind.SUPER;\n text = \"super\";\n symbol = CommonSymbols.super_;\n}\n\n/** Represents a `this` expression. */\nexport class ThisExpression extends IdentifierExpression {\n kind = NodeKind.THIS;\n text = \"this\";\n symbol = CommonSymbols.this_;\n}\n\n/** Represents a `true` expression. */\nexport class TrueExpression extends IdentifierExpression {\n kind = NodeKind.TRUE;\n text = \"true\";\n symbol = CommonSymbols.true_;\n}\n\n/** Represents a `false` expression. */\nexport class FalseExpression extends IdentifierExpression {\n kind = NodeKind.FALSE;\n text = \"false\";\n symbol = CommonSymbols.false_;\n}\n\n/** Base class of all unary expressions. */\nexport abstract class UnaryExpression extends Expression {\n\n /** Operator token. */\n operator: Token;\n /** Operand expression. */\n operand: Expression;\n}\n\n/** Represents a unary postfix expression, e.g. a postfix increment. */\nexport class UnaryPostfixExpression extends UnaryExpression {\n kind = NodeKind.UNARYPOSTFIX;\n}\n\n/** Represents a unary prefix expression, e.g. a negation. */\nexport class UnaryPrefixExpression extends UnaryExpression {\n kind = NodeKind.UNARYPREFIX;\n}\n\n// statements\n\n/** Base class of all statement nodes. */\nexport abstract class Statement extends Node { }\n\n/** Indicates the specific kind of a source. */\nexport enum SourceKind {\n /** Default source. Usually imported from an entry file. */\n DEFAULT,\n /** Entry file. */\n ENTRY,\n /** Library file. */\n LIBRARY\n}\n\n/** A top-level source node. */\nexport class Source extends Node {\n kind = NodeKind.SOURCE;\n parent = null;\n\n /** Source kind. */\n sourceKind: SourceKind;\n /** Normalized path. */\n normalizedPath: string;\n /** Path used internally. */\n internalPath: string;\n /** Simple path (last part without extension). */\n simplePath: string;\n /** Contained statements. */\n statements: Statement[];\n /** Full source text. */\n text: string;\n /** Tokenizer reference. */\n tokenizer: Tokenizer | null = null;\n /** Source map index. */\n debugInfoIndex: i32 = -1;\n /** Re-exported sources. */\n exportPaths: Set | null = null;\n\n /** Constructs a new source node. */\n constructor(normalizedPath: string, text: string, kind: SourceKind) {\n super();\n this.sourceKind = kind;\n this.normalizedPath = normalizedPath;\n var internalPath = mangleInternalPath(this.normalizedPath);\n this.internalPath = internalPath;\n var pos = internalPath.lastIndexOf(PATH_DELIMITER);\n this.simplePath = pos >= 0 ? internalPath.substring(pos + 1) : internalPath;\n this.statements = new Array();\n this.range = new Range(this, 0, text.length);\n this.text = text;\n }\n\n /** Tests if this source is an entry file. */\n get isEntry(): bool { return this.sourceKind == SourceKind.ENTRY; }\n /** Tests if this source is a stdlib file. */\n get isLibrary(): bool { return this.sourceKind == SourceKind.LIBRARY; }\n}\n\n/** Base class of all declaration statements. */\nexport abstract class DeclarationStatement extends Statement {\n /** Simple name being declared. */\n name: IdentifierExpression;\n /** Array of decorators. */\n decorators: DecoratorNode[] | null = null;\n /** Common flags indicating specific traits. */\n flags: CommonFlags = CommonFlags.NONE;\n\n /** Tests if this node has the specified flag or flags. */\n is(flag: CommonFlags): bool { return (this.flags & flag) == flag; }\n /** Tests if this node has one of the specified flags. */\n isAny(flag: CommonFlags): bool { return (this.flags & flag) != 0; }\n /** Sets a specific flag or flags. */\n set(flag: CommonFlags): void { this.flags |= flag; }\n}\n\n/** Represents an index signature declaration. */\nexport class IndexSignatureDeclaration extends DeclarationStatement {\n kind = NodeKind.INDEXSIGNATUREDECLARATION;\n\n /** Key type. */\n keyType: TypeNode;\n /** Value type. */\n valueType: CommonTypeNode;\n}\n\n/** Base class of all variable-like declaration statements. */\nexport abstract class VariableLikeDeclarationStatement extends DeclarationStatement {\n\n /** Variable type. */\n type: CommonTypeNode | null;\n /** Variable initializer. */\n initializer: Expression | null;\n}\n\n/** Represents a block statement. */\nexport class BlockStatement extends Statement {\n kind = NodeKind.BLOCK;\n\n /** Contained statements. */\n statements: Statement[];\n}\n\n/** Represents a `break` statement. */\nexport class BreakStatement extends Statement {\n kind = NodeKind.BREAK;\n\n /** Target label, if applicable. */\n label: IdentifierExpression | null;\n}\n\n/** Represents a `class` declaration. */\nexport class ClassDeclaration extends DeclarationStatement {\n kind = NodeKind.CLASSDECLARATION;\n\n /** Accepted type parameters. */\n typeParameters: TypeParameterNode[] | null;\n /** Base class type being extended, if any. */\n extendsType: TypeNode | null; // can't be a function\n /** Interface types being implemented, if any. */\n implementsTypes: TypeNode[] | null; // can't be functions\n /** Class member declarations. */\n members: DeclarationStatement[];\n\n get isGeneric(): bool {\n var typeParameters = this.typeParameters;\n return typeParameters != null && typeParameters.length > 0;\n }\n}\n\n/** Represents a `continue` statement. */\nexport class ContinueStatement extends Statement {\n kind = NodeKind.CONTINUE;\n\n /** Target label, if applicable. */\n label: IdentifierExpression | null;\n}\n\n/** Represents a `do` statement. */\nexport class DoStatement extends Statement {\n kind = NodeKind.DO;\n\n /** Statement being looped over. */\n statement: Statement;\n /** Condition when to repeat. */\n condition: Expression;\n}\n\n/** Represents an empty statement, i.e., a semicolon terminating nothing. */\nexport class EmptyStatement extends Statement {\n kind = NodeKind.EMPTY;\n}\n\n/** Represents an `enum` declaration. */\nexport class EnumDeclaration extends DeclarationStatement {\n kind = NodeKind.ENUMDECLARATION;\n\n /** Enum value declarations. */\n values: EnumValueDeclaration[];\n}\n\n/** Represents a value of an `enum` declaration. */\nexport class EnumValueDeclaration extends VariableLikeDeclarationStatement {\n kind = NodeKind.ENUMVALUEDECLARATION;\n // name is inherited\n\n /** Value expression. */\n value: Expression | null;\n}\n\n/** Represents an `export import` statement of an interface. */\nexport class ExportImportStatement extends Node {\n kind = NodeKind.EXPORTIMPORT;\n\n /** Identifier being imported. */\n name: IdentifierExpression;\n /** Identifier being exported. */\n externalName: IdentifierExpression;\n}\n\n/** Represents a member of an `export` statement. */\nexport class ExportMember extends Node {\n kind = NodeKind.EXPORTMEMBER;\n\n /** Local identifier. */\n localName: IdentifierExpression;\n /** Exported identifier. */\n exportedName: IdentifierExpression;\n}\n\n/** Represents an `export` statement. */\nexport class ExportStatement extends Statement {\n kind = NodeKind.EXPORT;\n\n /** Array of members if a set of named exports, or `null` if a file export. */\n members: ExportMember[] | null;\n /** Path being exported from, if applicable. */\n path: StringLiteralExpression | null;\n /** Normalized path, if `path` is set. */\n normalizedPath: string | null;\n /** Mangled internal path being referenced, if `path` is set. */\n internalPath: string | null;\n /** Whether this is a declared export. */\n isDeclare: bool;\n}\n\n/** Represents an expression that is used as a statement. */\nexport class ExpressionStatement extends Statement {\n kind = NodeKind.EXPRESSION;\n\n /** Expression being used as a statement.*/\n expression: Expression;\n}\n\n/** Represents a field declaration within a `class`. */\nexport class FieldDeclaration extends VariableLikeDeclarationStatement {\n kind = NodeKind.FIELDDECLARATION;\n\n /** Parameter index if declared as a constructor parameter, otherwise `-1`. */\n parameterIndex: i32 = -1;\n}\n\n/** Represents a `for` statement. */\nexport class ForStatement extends Statement {\n kind = NodeKind.FOR;\n\n /**\n * Initializer statement, if present.\n * Either a {@link VariableStatement} or {@link ExpressionStatement}.\n */\n initializer: Statement | null;\n /** Condition expression, if present. */\n condition: Expression | null;\n /** Incrementor expression, if present. */\n incrementor: Expression | null;\n /** Statement being looped over. */\n statement: Statement;\n}\n\n/** Represents a `function` declaration. */\nexport class FunctionDeclaration extends DeclarationStatement {\n kind = NodeKind.FUNCTIONDECLARATION;\n\n /** Type parameters, if any. */\n typeParameters: TypeParameterNode[] | null;\n /** Function signature. */\n signature: SignatureNode;\n /** Body statement. Usually a block. */\n body: Statement | null;\n\n get isGeneric(): bool {\n var typeParameters = this.typeParameters;\n return typeParameters != null && typeParameters.length > 0;\n }\n\n /** Clones this function declaration. */\n clone(): FunctionDeclaration {\n return Node.createFunctionDeclaration(\n this.name, this.typeParameters, this.signature, this.body, this.decorators, this.flags, this.range\n );\n }\n}\n\n/** Represents an `if` statement. */\nexport class IfStatement extends Statement {\n kind = NodeKind.IF;\n\n /** Condition. */\n condition: Expression;\n /** Statement executed when condition is `true`. */\n ifTrue: Statement;\n /** Statement executed when condition is `false`. */\n ifFalse: Statement | null;\n}\n\n/** Represents an `import` declaration part of an {@link ImportStatement}. */\nexport class ImportDeclaration extends DeclarationStatement {\n kind = NodeKind.IMPORTDECLARATION;\n\n /** Identifier being imported. */\n foreignName: IdentifierExpression;\n}\n\n/** Represents an `import` statement. */\nexport class ImportStatement extends Statement {\n kind = NodeKind.IMPORT;\n\n /** Array of member declarations or `null` if an asterisk import. */\n declarations: ImportDeclaration[] | null;\n /** Name of the local namespace, if an asterisk import. */\n namespaceName: IdentifierExpression | null;\n /** Path being imported from. */\n path: StringLiteralExpression;\n /** Normalized path. */\n normalizedPath: string;\n /** Mangled internal path being referenced. */\n internalPath: string;\n}\n\n/** Represents an `interfarce` declaration. */\nexport class InterfaceDeclaration extends ClassDeclaration {\n kind = NodeKind.INTERFACEDECLARATION;\n}\n\n/** Represents a method declaration within a `class`. */\nexport class MethodDeclaration extends FunctionDeclaration {\n kind = NodeKind.METHODDECLARATION;\n}\n\n/** Represents a `namespace` declaration. */\nexport class NamespaceDeclaration extends DeclarationStatement {\n kind = NodeKind.NAMESPACEDECLARATION;\n\n /** Array of namespace members. */\n members: Statement[];\n}\n\n/** Represents a `return` statement. */\nexport class ReturnStatement extends Statement {\n kind = NodeKind.RETURN;\n\n /** Value expression being returned, if present. */\n value: Expression | null;\n}\n\n/** Represents a single `case` within a `switch` statement. */\nexport class SwitchCase extends Node {\n kind = NodeKind.SWITCHCASE;\n\n /** Label expression. `null` indicates the default case. */\n label: Expression | null;\n /** Contained statements. */\n statements: Statement[];\n}\n\n/** Represents a `switch` statement. */\nexport class SwitchStatement extends Statement {\n kind = NodeKind.SWITCH;\n\n /** Condition expression. */\n condition: Expression;\n /** Contained cases. */\n cases: SwitchCase[];\n}\n\n/** Represents a `throw` statement. */\nexport class ThrowStatement extends Statement {\n kind = NodeKind.THROW;\n\n /** Value expression being thrown. */\n value: Expression;\n}\n\n/** Represents a `try` statement. */\nexport class TryStatement extends Statement {\n kind = NodeKind.TRY;\n\n /** Contained statements. */\n statements: Statement[];\n /** Exception variable name, if a `catch` clause is present. */\n catchVariable: IdentifierExpression | null;\n /** Statements being executed on catch, if a `catch` clause is present. */\n catchStatements: Statement[] | null;\n /** Statements being executed afterwards, if a `finally` clause is present. */\n finallyStatements: Statement[] | null;\n}\n\n/** Represents a `type` declaration. */\nexport class TypeDeclaration extends DeclarationStatement {\n kind = NodeKind.TYPEDECLARATION;\n\n /** Type parameters, if any. */\n typeParameters: TypeParameterNode[] | null;\n /** Type being aliased. */\n type: CommonTypeNode;\n}\n\n/** Represents a variable declaration part of a {@link VariableStatement}. */\nexport class VariableDeclaration extends VariableLikeDeclarationStatement {\n kind = NodeKind.VARIABLEDECLARATION;\n}\n\n/** Represents a variable statement wrapping {@link VariableDeclaration}s. */\nexport class VariableStatement extends Statement {\n kind = NodeKind.VARIABLE;\n\n /** Array of decorators. */\n decorators: DecoratorNode[] | null;\n /** Array of member declarations. */\n declarations: VariableDeclaration[];\n}\n\n/** Represents a void statement dropping an expression's value. */\nexport class VoidStatement extends Statement {\n kind = NodeKind.VOID;\n\n /** Expression being dropped. */\n expression: Expression;\n}\n\n/** Represents a `while` statement. */\nexport class WhileStatement extends Statement {\n kind = NodeKind.WHILE;\n\n /** Condition expression. */\n condition: Expression;\n /** Statement being looped over. */\n statement: Statement;\n}\n\n/** Finds the first decorator matching the specified kind. */\nexport function findDecorator(kind: DecoratorKind, decorators: DecoratorNode[] | null): DecoratorNode | null {\n if (decorators) {\n for (let i = 0, k = decorators.length; i < k; ++i) {\n let decorator = decorators[i];\n if (decorator.decoratorKind == kind) return decorator;\n }\n }\n return null;\n}\n\n/** Mangles an external to an internal path. */\nexport function mangleInternalPath(path: string): string {\n if (path.endsWith(\".ts\")) path = path.substring(0, path.length - 3);\n return path;\n}\n","/**\n * Mappings from AssemblyScript types to WebAssembly types.\n * @module types\n *//***/\n\nimport {\n Class,\n FunctionTarget,\n Program,\n DecoratorFlags\n} from \"./program\";\n\nimport {\n NativeType,\n ExpressionRef,\n Module\n} from \"./module\";\n\n/** Indicates the kind of a type. */\nexport const enum TypeKind {\n\n // signed integers\n\n /** An 8-bit signed integer. */\n I8,\n /** A 16-bit signed integer. */\n I16,\n /** A 32-bit signed integer. */\n I32,\n /** A 64-bit signed integer. */\n I64,\n /** A 32-bit/64-bit signed integer, depending on the target. */\n ISIZE,\n\n // unsigned integers\n\n /** An 8-bit unsigned integer. */\n U8,\n /** A 16-bit unsigned integer. */\n U16,\n /** A 32-bit unsigned integer. Also the base of function types. */\n U32,\n /** A 64-bit unsigned integer. */\n U64,\n /** A 32-bit/64-bit unsigned integer, depending on the target. Also the base of class types. */\n USIZE,\n /** A 1-bit unsigned integer. */\n BOOL, // sic\n\n // floats\n\n /** A 32-bit float. */\n F32,\n /** A 64-bit double. */\n F64,\n\n // vectors\n V128,\n\n // other\n\n /** No return type. */\n VOID\n}\n\n/** Indicates capabilities of a type. */\nexport const enum TypeFlags {\n NONE = 0,\n /** Is a signed type that can represent negative values. */\n SIGNED = 1 << 0,\n /** Is an unsigned type that cannot represent negative values. */\n UNSIGNED = 1 << 1,\n /** Is an integer type. */\n INTEGER = 1 << 2,\n /** Is a floating point type. */\n FLOAT = 1 << 3,\n /** Is a pointer type. */\n POINTER = 1 << 4,\n /** Is smaller than 32-bits. */\n SHORT = 1 << 5,\n /** Is larger than 32-bits. */\n LONG = 1 << 6,\n /** Is a value type. */\n VALUE = 1 << 7,\n /** Is a reference type. */\n REFERENCE = 1 << 8,\n /** Is a nullable type. */\n NULLABLE = 1 << 9,\n /** Is a vector type. */\n VECTOR = 1 << 10\n}\n\nconst v128_zero = new Uint8Array(16);\n\n/** Represents a resolved type. */\nexport class Type {\n\n /** Type kind. */\n kind: TypeKind;\n /** Type flags. */\n flags: TypeFlags;\n /** Size in bits. */\n size: u32;\n /** Size in bytes. */\n byteSize: i32;\n /** Underlying class reference, if a class type. */\n classReference: Class | null;\n /** Underlying signature reference, if a function type. */\n signatureReference: Signature | null;\n /** Respective non-nullable type, if nullable. */\n nonNullableType: Type;\n /** Cached nullable type, if non-nullable. */\n private cachedNullableType: Type | null = null;\n\n /** Constructs a new resolved type. */\n constructor(kind: TypeKind, flags: TypeFlags, size: u32) {\n this.kind = kind;\n this.flags = flags;\n this.size = size;\n this.byteSize = ceil(size / 8);\n this.classReference = null;\n this.signatureReference = null;\n this.nonNullableType = this;\n }\n\n /** Returns the closest int type representing this type. */\n get intType(): Type {\n switch (this.kind) {\n case TypeKind.I8: return Type.i8;\n case TypeKind.I16: return Type.i16;\n case TypeKind.F32:\n case TypeKind.I32: return Type.i32;\n case TypeKind.F64:\n case TypeKind.I64: return Type.i64;\n case TypeKind.ISIZE: return this.size == 64 ? Type.isize64 : Type.isize32;\n case TypeKind.U8: return Type.u8;\n case TypeKind.U16: return Type.u16;\n case TypeKind.U32: return Type.u32;\n case TypeKind.U64: return Type.u64;\n case TypeKind.USIZE: return this.size == 64 ? Type.usize64 : Type.usize32;\n case TypeKind.BOOL:\n default: return Type.i32;\n }\n }\n\n /** Tests if this is a managed type that needs GC hooks. */\n isManaged(program: Program): bool {\n if (program.hasGC) {\n let classReference = this.classReference;\n return classReference !== null && !classReference.hasDecorator(DecoratorFlags.UNMANAGED);\n }\n return false;\n }\n\n /** Computes the sign-extending shift in the target type. */\n computeSmallIntegerShift(targetType: Type): u32 {\n return targetType.size - this.size;\n }\n\n /** Computes the truncating mask in the target type. */\n computeSmallIntegerMask(targetType: Type): u32 {\n var size = this.is(TypeFlags.UNSIGNED) ? this.size : this.size - 1;\n return ~0 >>> (targetType.size - size);\n }\n\n /** Tests if this type has (all of) the specified flags. */\n is(flags: TypeFlags): bool { return (this.flags & flags) == flags; }\n /** Tests if this type has any of the specified flags. */\n isAny(flags: TypeFlags): bool { return (this.flags & flags) != 0; }\n\n /** Composes a class type from this type and a class. */\n asClass(classType: Class): Type {\n assert(this.kind == TypeKind.USIZE && !this.classReference);\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\n ret.classReference = classType;\n return ret;\n }\n\n /** Composes a function type from this type and a function. */\n asFunction(signature: Signature): Type {\n assert(this.kind == TypeKind.U32 && !this.signatureReference);\n var ret = new Type(this.kind, this.flags & ~TypeFlags.VALUE | TypeFlags.REFERENCE, this.size);\n ret.signatureReference = signature;\n return ret;\n }\n\n /** Composes the respective nullable type of this type. */\n asNullable(): Type {\n assert(this.is(TypeFlags.REFERENCE));\n if (!this.cachedNullableType) {\n assert(!this.is(TypeFlags.NULLABLE));\n this.cachedNullableType = new Type(this.kind, this.flags | TypeFlags.NULLABLE, this.size);\n this.cachedNullableType.nonNullableType = this;\n this.cachedNullableType.classReference = this.classReference; // either a class reference\n this.cachedNullableType.signatureReference = this.signatureReference; // or a function reference\n }\n return this.cachedNullableType;\n }\n\n /** Tests if a value of this type is assignable to a target of the specified type. */\n isAssignableTo(target: Type, signednessIsRelevant: bool = false): bool {\n var currentClass: Class | null;\n var targetClass: Class | null;\n var currentFunction: Signature | null;\n var targetFunction: Signature | null;\n if (this.is(TypeFlags.REFERENCE)) {\n if (target.is(TypeFlags.REFERENCE)) {\n if (!this.is(TypeFlags.NULLABLE) || target.is(TypeFlags.NULLABLE)) {\n if (currentClass = this.classReference) {\n if (targetClass = target.classReference) {\n return currentClass.isAssignableTo(targetClass);\n }\n } else if (currentFunction = this.signatureReference) {\n if (targetFunction = target.signatureReference) {\n return currentFunction.isAssignableTo(targetFunction);\n }\n }\n }\n }\n } else if (!target.is(TypeFlags.REFERENCE)) {\n if (this.is(TypeFlags.INTEGER)) {\n if (target.is(TypeFlags.INTEGER)) {\n if (\n !signednessIsRelevant ||\n this == Type.bool || // a bool (0 or 1) can be safely assigned to all sorts of integers\n this.is(TypeFlags.SIGNED) == target.is(TypeFlags.SIGNED)\n ) {\n return this.size <= target.size;\n }\n } else if (target.kind == TypeKind.F32) {\n return this.size <= 23; // mantissa bits\n } else if (target.kind == TypeKind.F64) {\n return this.size <= 52; // ^\n }\n } else if (this.is(TypeFlags.FLOAT)) {\n if (target.is(TypeFlags.FLOAT)) {\n return this.size <= target.size;\n }\n } else if (this.is(TypeFlags.VECTOR)) {\n if (target.is(TypeFlags.VECTOR)) {\n return this.size == target.size;\n }\n }\n }\n return false;\n }\n\n /** Determines the common compatible type of two types, if any. */\n static commonCompatible(left: Type, right: Type, signednessIsImportant: bool): Type | null {\n if (right.isAssignableTo(left, signednessIsImportant)) return left;\n else if (left.isAssignableTo(right, signednessIsImportant)) return right;\n return null;\n }\n\n /** Converts this type to its TypeScript representation. */\n toString(kindOnly: bool = false): string {\n if (!kindOnly && this.is(TypeFlags.REFERENCE)) {\n let classReference = this.classReference;\n if (classReference) {\n return this.is(TypeFlags.NULLABLE)\n ? classReference.name + \" | null\"\n : classReference.name;\n }\n let signatureReference = this.signatureReference;\n if (signatureReference) {\n return this.is(TypeFlags.NULLABLE)\n ? \"(\" + signatureReference.toString(true) + \") | null\"\n : signatureReference.toString(true);\n }\n assert(false);\n }\n switch (this.kind) {\n case TypeKind.I8: return \"i8\";\n case TypeKind.I16: return \"i16\";\n case TypeKind.I32: return \"i32\";\n case TypeKind.I64: return \"i64\";\n case TypeKind.ISIZE: return \"isize\";\n case TypeKind.U8: return \"u8\";\n case TypeKind.U16: return \"u16\";\n case TypeKind.U32: return \"u32\";\n case TypeKind.U64: return \"u64\";\n case TypeKind.USIZE: return \"usize\";\n case TypeKind.BOOL: return \"bool\";\n case TypeKind.F32: return \"f32\";\n case TypeKind.F64: return \"f64\";\n case TypeKind.V128: return \"v128\";\n default: assert(false);\n case TypeKind.VOID: return \"void\";\n }\n }\n\n // Binaryen specific\n\n /** Converts this type to its respective native type. */\n toNativeType(): NativeType {\n switch (this.kind) {\n default: return NativeType.I32;\n case TypeKind.I64:\n case TypeKind.U64: return NativeType.I64;\n case TypeKind.ISIZE:\n case TypeKind.USIZE: return this.size == 64 ? NativeType.I64 : NativeType.I32;\n case TypeKind.F32: return NativeType.F32;\n case TypeKind.F64: return NativeType.F64;\n case TypeKind.V128: return NativeType.V128;\n case TypeKind.VOID: return NativeType.None;\n }\n }\n\n /** Converts this type to its native `0` value. */\n toNativeZero(module: Module): ExpressionRef {\n switch (this.kind) {\n case TypeKind.VOID: assert(false);\n default: return module.createI32(0);\n case TypeKind.ISIZE:\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(0);\n case TypeKind.I64:\n case TypeKind.U64: return module.createI64(0);\n case TypeKind.F32: return module.createF32(0);\n case TypeKind.F64: return module.createF64(0);\n case TypeKind.V128: return module.createV128(v128_zero);\n }\n }\n\n /** Converts this type to its native `1` value. */\n toNativeOne(module: Module): ExpressionRef {\n switch (this.kind) {\n case TypeKind.V128:\n case TypeKind.VOID: assert(false);\n default: return module.createI32(1);\n case TypeKind.ISIZE:\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(1);\n case TypeKind.I64:\n case TypeKind.U64: return module.createI64(1);\n case TypeKind.F32: return module.createF32(1);\n case TypeKind.F64: return module.createF64(1);\n }\n }\n\n /** Converts this type to its native `-1` value. */\n toNativeNegOne(module: Module): ExpressionRef {\n switch (this.kind) {\n case TypeKind.V128:\n case TypeKind.VOID: assert(false);\n default: return module.createI32(-1);\n case TypeKind.ISIZE:\n case TypeKind.USIZE: if (this.size != 64) return module.createI32(-1);\n case TypeKind.I64:\n case TypeKind.U64: return module.createI64(-1, -1);\n case TypeKind.F32: return module.createF32(-1);\n case TypeKind.F64: return module.createF64(-1);\n }\n }\n\n /** Converts this type to its signature string. */\n toSignatureString(): string {\n switch (this.kind) {\n default: return \"i\";\n case TypeKind.I64:\n case TypeKind.U64: return \"I\";\n case TypeKind.ISIZE:\n case TypeKind.USIZE: return this.size == 64 ? \"I\" : \"i\";\n case TypeKind.F32: return \"f\";\n case TypeKind.F64: return \"F\";\n case TypeKind.V128: return \"v\";\n case TypeKind.VOID: return \"_\";\n }\n }\n\n // Types\n\n /** An 8-bit signed integer. */\n static readonly i8: Type = new Type(TypeKind.I8,\n TypeFlags.SIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 8\n );\n\n /** A 16-bit signed integer. */\n static readonly i16: Type = new Type(TypeKind.I16,\n TypeFlags.SIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 16\n );\n\n /** A 32-bit signed integer. */\n static readonly i32: Type = new Type(TypeKind.I32,\n TypeFlags.SIGNED |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit signed integer. */\n static readonly i64: Type = new Type(TypeKind.I64,\n TypeFlags.SIGNED |\n TypeFlags.LONG |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 64\n );\n\n /** A 32-bit signed size. WASM32 only. */\n static readonly isize32: Type = new Type(TypeKind.ISIZE,\n TypeFlags.SIGNED |\n TypeFlags.INTEGER |\n TypeFlags.POINTER |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit signed size. WASM64 only. */\n static readonly isize64: Type = new Type(TypeKind.ISIZE,\n TypeFlags.SIGNED |\n TypeFlags.LONG |\n TypeFlags.INTEGER |\n TypeFlags.POINTER |\n TypeFlags.VALUE, 64\n );\n\n /** An 8-bit unsigned integer. */\n static readonly u8: Type = new Type(TypeKind.U8,\n TypeFlags.UNSIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 8\n );\n\n /** A 16-bit unsigned integer. */\n static readonly u16: Type = new Type(TypeKind.U16,\n TypeFlags.UNSIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 16\n );\n\n /** A 32-bit unsigned integer. */\n static readonly u32: Type = new Type(TypeKind.U32,\n TypeFlags.UNSIGNED |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit unsigned integer. */\n static readonly u64: Type = new Type(TypeKind.U64,\n TypeFlags.UNSIGNED |\n TypeFlags.LONG |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 64\n );\n\n /** A 32-bit unsigned size. WASM32 only. */\n static readonly usize32: Type = new Type(TypeKind.USIZE,\n TypeFlags.UNSIGNED |\n TypeFlags.INTEGER |\n TypeFlags.POINTER |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit unsigned size. WASM64 only. */\n static readonly usize64: Type = new Type(TypeKind.USIZE,\n TypeFlags.UNSIGNED |\n TypeFlags.LONG |\n TypeFlags.INTEGER |\n TypeFlags.POINTER |\n TypeFlags.VALUE, 64\n );\n\n /** A 1-bit unsigned integer. */\n static readonly bool: Type = new Type(TypeKind.BOOL,\n TypeFlags.UNSIGNED |\n TypeFlags.SHORT |\n TypeFlags.INTEGER |\n TypeFlags.VALUE, 1\n );\n\n /** A 32-bit float. */\n static readonly f32: Type = new Type(TypeKind.F32,\n TypeFlags.SIGNED |\n TypeFlags.FLOAT |\n TypeFlags.VALUE, 32\n );\n\n /** A 64-bit float. */\n static readonly f64: Type = new Type(TypeKind.F64,\n TypeFlags.SIGNED |\n TypeFlags.LONG |\n TypeFlags.FLOAT |\n TypeFlags.VALUE, 64\n );\n\n /** A 128-bit vector. */\n static readonly v128: Type = new Type(TypeKind.V128,\n TypeFlags.VECTOR |\n TypeFlags.VALUE, 128\n );\n\n /** No return type. */\n static readonly void: Type = new Type(TypeKind.VOID, TypeFlags.NONE, 0);\n}\n\n/** Converts an array of types to an array of native types. */\nexport function typesToNativeTypes(types: Type[]): NativeType[] {\n var numTypes = types.length;\n var ret = new Array(numTypes);\n for (let i = 0; i < numTypes; ++i) ret[i] = types[i].toNativeType();\n return ret;\n}\n\n/** Converts an array of types to its combined string representation. */\nexport function typesToString(types: Type[]): string {\n var numTypes = types.length;\n if (!numTypes) return \"\";\n var sb = new Array(numTypes);\n for (let i = 0; i < numTypes; ++i) sb[i] = types[i].toString();\n return sb.join(\",\");\n}\n\n/** Represents a fully resolved function signature. */\nexport class Signature {\n\n /** Parameter types, if any, excluding `this`. */\n parameterTypes: Type[];\n /** Parameter names, if known, excluding `this`. */\n parameterNames: string[] | null;\n /** Number of required parameters excluding `this`. Other parameters are considered optional. */\n requiredParameters: i32;\n /** Return type. */\n returnType: Type;\n /** This type, if an instance signature. */\n thisType: Type | null;\n /** Whether the last parameter is a rest parameter. */\n hasRest: bool;\n /** Cached {@link FunctionTarget}. */\n cachedFunctionTarget: FunctionTarget | null = null;\n /** Respective function type. */\n type: Type;\n\n /** Constructs a new signature. */\n constructor(\n parameterTypes: Type[] | null = null,\n returnType: Type | null = null,\n thisType: Type | null = null\n ) {\n this.parameterTypes = parameterTypes ? parameterTypes : [];\n this.parameterNames = null;\n this.requiredParameters = 0;\n this.returnType = returnType ? returnType : Type.void;\n this.thisType = thisType;\n this.hasRest = false;\n this.type = Type.u32.asFunction(this);\n }\n\n asFunctionTarget(program: Program): FunctionTarget {\n var target = this.cachedFunctionTarget;\n if (!target) this.cachedFunctionTarget = target = new FunctionTarget(this, program);\n else assert(target.program == program);\n return target;\n }\n\n /** Gets the known or, alternatively, generic parameter name at the specified index. */\n getParameterName(index: i32): string {\n var parameterNames = this.parameterNames;\n return parameterNames && parameterNames.length > index\n ? parameterNames[index]\n : getDefaultParameterName(index);\n }\n\n /** Tests if a value of this function type is assignable to a target of the specified function type. */\n isAssignableTo(target: Signature): bool {\n // TODO: maybe cache results?\n\n // check `this` type\n var thisThisType = this.thisType;\n var targetThisType = target.thisType;\n if (thisThisType) {\n if (!(targetThisType && thisThisType.isAssignableTo(targetThisType))) return false;\n } else if (targetThisType) {\n return false;\n }\n\n // check rest parameter\n if (this.hasRest != target.hasRest) return false; // TODO\n\n // check parameter types\n var thisParameterTypes = this.parameterTypes;\n var targetParameterTypes = target.parameterTypes;\n var numParameters = thisParameterTypes.length;\n if (numParameters != targetParameterTypes.length) return false;\n for (let i = 0; i < numParameters; ++i) {\n let thisParameterType = thisParameterTypes[i];\n let targetParameterType = targetParameterTypes[i];\n if (!thisParameterType.isAssignableTo(targetParameterType)) return false;\n }\n\n // check return type\n var thisReturnType = this.returnType;\n var targetReturnType = target.returnType;\n return thisReturnType == targetReturnType || thisReturnType.isAssignableTo(targetReturnType);\n }\n\n /** Converts a signature to a function type string. */\n static makeSignatureString(parameterTypes: Type[] | null, returnType: Type, thisType: Type | null = null): string {\n var sb = [];\n if (thisType) sb.push(thisType.toSignatureString());\n if (parameterTypes) {\n for (let i = 0, k = parameterTypes.length; i < k; ++i) sb.push(parameterTypes[i].toSignatureString());\n }\n sb.push(returnType.toSignatureString());\n return sb.join(\"\");\n }\n\n /** Converts this signature to a function type string. */\n toSignatureString(): string {\n return Signature.makeSignatureString(this.parameterTypes, this.returnType, this.thisType);\n }\n\n /** Converts this signature to a string. */\n toString(includeThis: bool = false): string {\n var sb = new Array();\n sb.push(\"(\");\n var index = 0;\n var thisType = this.thisType;\n if (thisType) {\n if (includeThis) {\n sb.push(\"this: \");\n sb.push(thisType.toString());\n index = 1;\n }\n }\n var parameters = this.parameterTypes;\n var numParameters = parameters.length;\n if (numParameters) {\n let names = this.parameterNames;\n let numNames = names ? names.length : 0;\n let optionalStart = this.requiredParameters;\n let restIndex = this.hasRest ? numParameters - 1 : -1;\n for (let i = 0; i < numParameters; ++i, ++index) {\n if (index) sb.push(\", \");\n if (i == restIndex) sb.push(\"...\");\n if (i < numNames) sb.push((names)[i]);\n else sb.push(getDefaultParameterName(i));\n if (i >= optionalStart && i != restIndex) sb.push(\"?: \");\n else sb.push(\": \");\n sb.push(parameters[i].toString());\n }\n }\n sb.push(\") => \");\n sb.push(this.returnType.toString());\n return sb.join(\"\");\n }\n}\n\n// helpers\n\n// Cached default parameter names used where names are unknown.\nvar cachedDefaultParameterNames: string[] | null = null;\n\n/** Gets the cached default parameter name for the specified index. */\nexport function getDefaultParameterName(index: i32): string {\n if (!cachedDefaultParameterNames) cachedDefaultParameterNames = [];\n for (let i = cachedDefaultParameterNames.length; i <= index; ++i) {\n cachedDefaultParameterNames.push(\"arg$\" + i.toString(10));\n }\n return cachedDefaultParameterNames[index - 1];\n}\n","/**\n * A TypeScript tokenizer modified for AssemblyScript.\n *\n * Skips over trivia and provides a general mark/reset mechanism for the parser to utilize on\n * ambiguous tokens.\n *\n * @module tokenizer\n *//***/\n\nimport {\n DiagnosticCode,\n DiagnosticMessage,\n DiagnosticEmitter\n} from \"./diagnostics\";\n\nimport {\n Source,\n CommentKind\n} from \"./ast\";\n\nimport {\n CharCode,\n isLineBreak,\n isWhiteSpace,\n isIdentifierStart,\n isIdentifierPart,\n isDecimalDigit,\n isOctalDigit,\n isKeywordCharacter\n} from \"./util\";\n\n/** Named token types. */\nexport enum Token {\n\n // keywords\n // discarded: ANY, BOOLEAN, NEVER, NUMBER, STRING, SYMBOL, UNDEFINED, LESSTHAN_SLASH\n\n ABSTRACT,\n AS,\n ASYNC,\n AWAIT, // ES2017\n BREAK, // ES2017\n CASE, // ES2017\n CATCH, // ES2017\n CLASS, // ES2017\n CONST, // ES2017\n CONTINUE, // ES2017\n CONSTRUCTOR,\n DEBUGGER, // ES2017\n DECLARE,\n DEFAULT, // ES2017\n DELETE, // ES2017\n DO, // ES2017\n ELSE, // ES2017\n ENUM, // ES2017 future\n EXPORT, // ES2017\n EXTENDS, // ES2017\n FALSE, // ES\n FINALLY, // ES2017\n FOR, // ES2017\n FROM, // AS possible identifier\n FUNCTION, // ES2017\n GET,\n IF, // ES2017\n IMPLEMENTS, // ES2017 non-lexical\n IMPORT, // ES2017\n IN, // ES2017\n INSTANCEOF, // ES2017\n INTERFACE, // ES2017 non-lexical\n IS,\n KEYOF,\n LET, // ES2017 non-lexical\n MODULE, // AS possible identifier\n NAMESPACE, // AS possible identifier\n NEW, // ES2017\n NULL, // ES\n OF,\n PACKAGE, // ES2017 non-lexical\n PRIVATE, // ES2017 non-lexical\n PROTECTED, // ES2017 non-lexical\n PUBLIC, // ES2017 non-lexical\n READONLY,\n RETURN, // ES2017\n SET,\n STATIC, // ES2017 non-lexical\n SUPER, // ES2017\n SWITCH, // ES2017\n THIS, // ES2017\n THROW, // ES2017\n TRUE, // ES\n TRY, // ES2017\n TYPE, // AS possible identifier\n TYPEOF, // ES2017\n VAR, // ES2017\n VOID, // ES2017\n WHILE, // ES2017\n WITH, // ES2017\n YIELD, // ES2017\n\n // punctuation\n\n OPENBRACE,\n CLOSEBRACE,\n OPENPAREN,\n CLOSEPAREN,\n OPENBRACKET,\n CLOSEBRACKET,\n DOT,\n DOT_DOT_DOT,\n SEMICOLON,\n COMMA,\n LESSTHAN,\n GREATERTHAN,\n LESSTHAN_EQUALS,\n GREATERTHAN_EQUALS,\n EQUALS_EQUALS,\n EXCLAMATION_EQUALS,\n EQUALS_EQUALS_EQUALS,\n EXCLAMATION_EQUALS_EQUALS,\n EQUALS_GREATERTHAN,\n PLUS,\n MINUS,\n ASTERISK_ASTERISK,\n ASTERISK,\n SLASH,\n PERCENT,\n PLUS_PLUS,\n MINUS_MINUS,\n LESSTHAN_LESSTHAN,\n GREATERTHAN_GREATERTHAN,\n GREATERTHAN_GREATERTHAN_GREATERTHAN,\n AMPERSAND,\n BAR,\n CARET,\n EXCLAMATION,\n TILDE,\n AMPERSAND_AMPERSAND,\n BAR_BAR,\n QUESTION,\n COLON,\n EQUALS,\n PLUS_EQUALS,\n MINUS_EQUALS,\n ASTERISK_EQUALS,\n ASTERISK_ASTERISK_EQUALS,\n SLASH_EQUALS,\n PERCENT_EQUALS,\n LESSTHAN_LESSTHAN_EQUALS,\n GREATERTHAN_GREATERTHAN_EQUALS,\n GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS,\n AMPERSAND_EQUALS,\n BAR_EQUALS,\n CARET_EQUALS,\n AT,\n\n // literals\n\n IDENTIFIER,\n STRINGLITERAL,\n INTEGERLITERAL,\n FLOATLITERAL,\n\n // meta\n\n INVALID,\n ENDOFFILE\n}\n\nexport enum IdentifierHandling {\n DEFAULT,\n PREFER,\n ALWAYS\n}\n\nexport function tokenFromKeyword(text: string): Token {\n assert(text.length);\n switch (text.charCodeAt(0)) {\n case CharCode.a: {\n switch (text) {\n case \"abstract\": return Token.ABSTRACT;\n case \"as\": return Token.AS;\n case \"async\": return Token.ASYNC;\n case \"await\": return Token.AWAIT;\n }\n break;\n }\n case CharCode.b: {\n switch (text) {\n case \"break\": return Token.BREAK;\n }\n break;\n }\n case CharCode.c: {\n switch (text) {\n case \"case\": return Token.CASE;\n case \"catch\": return Token.CATCH;\n case \"class\": return Token.CLASS;\n case \"continue\": return Token.CONTINUE;\n case \"const\": return Token.CONST;\n case \"constructor\": return Token.CONSTRUCTOR;\n }\n break;\n }\n case CharCode.d: {\n switch (text) {\n case \"debugger\": return Token.DEBUGGER;\n case \"declare\": return Token.DECLARE;\n case \"default\": return Token.DEFAULT;\n case \"delete\": return Token.DELETE;\n case \"do\": return Token.DO;\n }\n break;\n }\n case CharCode.e: {\n switch (text) {\n case \"else\": return Token.ELSE;\n case \"enum\": return Token.ENUM;\n case \"export\": return Token.EXPORT;\n case \"extends\": return Token.EXTENDS;\n }\n break;\n }\n case CharCode.f: {\n switch (text) {\n case \"false\": return Token.FALSE;\n case \"finally\": return Token.FINALLY;\n case \"for\": return Token.FOR;\n case \"from\": return Token.FROM;\n case \"function\": return Token.FUNCTION;\n }\n break;\n }\n case CharCode.g: {\n switch (text) {\n case \"get\": return Token.GET;\n }\n break;\n }\n case CharCode.i: {\n switch (text) {\n case \"if\": return Token.IF;\n case \"implements\": return Token.IMPLEMENTS;\n case \"import\": return Token.IMPORT;\n case \"in\": return Token.IN;\n case \"instanceof\": return Token.INSTANCEOF;\n case \"interface\": return Token.INTERFACE;\n case \"is\": return Token.IS;\n }\n break;\n }\n case CharCode.k: {\n switch (text) {\n case \"keyof\": return Token.KEYOF;\n }\n break;\n }\n case CharCode.l: {\n switch (text) {\n case \"let\": return Token.LET;\n }\n break;\n }\n case CharCode.m: {\n switch (text) {\n case \"module\": return Token.MODULE;\n }\n break;\n }\n case CharCode.n: {\n switch (text) {\n case \"namespace\": return Token.NAMESPACE;\n case \"new\": return Token.NEW;\n case \"null\": return Token.NULL;\n }\n break;\n }\n case CharCode.o: {\n switch (text) {\n case \"of\": return Token.OF;\n }\n break;\n }\n case CharCode.p: {\n switch (text) {\n case \"package\": return Token.PACKAGE;\n case \"private\": return Token.PRIVATE;\n case \"protected\": return Token.PROTECTED;\n case \"public\": return Token.PUBLIC;\n }\n break;\n }\n case CharCode.r: {\n switch (text) {\n case \"readonly\": return Token.READONLY;\n case \"return\": return Token.RETURN;\n }\n break;\n }\n case CharCode.s: {\n switch (text) {\n case \"set\": return Token.SET;\n case \"static\": return Token.STATIC;\n case \"super\": return Token.SUPER;\n case \"switch\": return Token.SWITCH;\n }\n break;\n }\n case CharCode.t: {\n switch (text) {\n case \"this\": return Token.THIS;\n case \"throw\": return Token.THROW;\n case \"true\": return Token.TRUE;\n case \"try\": return Token.TRY;\n case \"type\": return Token.TYPE;\n case \"typeof\": return Token.TYPEOF;\n }\n break;\n }\n case CharCode.v: {\n switch (text) {\n case \"var\": return Token.VAR;\n case \"void\": return Token.VOID;\n }\n break;\n }\n case CharCode.w: {\n switch (text) {\n case \"while\": return Token.WHILE;\n case \"with\": return Token.WITH;\n }\n break;\n }\n case CharCode.y: {\n switch (text) {\n case \"yield\": return Token.YIELD;\n }\n break;\n }\n }\n return Token.INVALID;\n}\n\nexport function tokenIsAlsoIdentifier(token: Token): bool {\n switch (token) {\n case Token.ABSTRACT:\n case Token.AS:\n case Token.CONSTRUCTOR:\n case Token.DECLARE:\n case Token.DELETE:\n case Token.FROM:\n case Token.FOR:\n case Token.GET:\n case Token.IS:\n case Token.KEYOF:\n case Token.MODULE:\n case Token.NAMESPACE:\n case Token.READONLY:\n case Token.SET:\n case Token.TYPE:\n case Token.VOID: return true;\n default: return false;\n }\n}\n\nexport function operatorTokenToString(token: Token): string {\n switch (token) {\n case Token.DELETE: return \"delete\";\n case Token.IN: return \"in\";\n case Token.INSTANCEOF: return \"instanceof\";\n case Token.NEW: return \"new\";\n case Token.TYPEOF: return \"typeof\";\n case Token.VOID: return \"void\";\n case Token.YIELD: return \"yield\";\n case Token.DOT_DOT_DOT: return \"...\";\n case Token.COMMA: return \",\";\n case Token.LESSTHAN: return \"<\";\n case Token.GREATERTHAN: return \">\";\n case Token.LESSTHAN_EQUALS: return \"<=\";\n case Token.GREATERTHAN_EQUALS: return \">=\";\n case Token.EQUALS_EQUALS: return \"==\";\n case Token.EXCLAMATION_EQUALS: return \"!=\";\n case Token.EQUALS_EQUALS_EQUALS: return \"===\";\n case Token.EXCLAMATION_EQUALS_EQUALS: return \"!==\";\n case Token.PLUS: return \"+\";\n case Token.MINUS: return \"-\";\n case Token.ASTERISK_ASTERISK: return \"**\";\n case Token.ASTERISK: return \"*\";\n case Token.SLASH: return \"/\";\n case Token.PERCENT: return \"%\";\n case Token.PLUS_PLUS: return \"++\";\n case Token.MINUS_MINUS: return \"--\";\n case Token.LESSTHAN_LESSTHAN: return \"<<\";\n case Token.GREATERTHAN_GREATERTHAN: return \">>\";\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return \">>>\";\n case Token.AMPERSAND: return \"&\";\n case Token.BAR: return \"|\";\n case Token.CARET: return \"^\";\n case Token.EXCLAMATION: return \"!\";\n case Token.TILDE: return \"~\";\n case Token.AMPERSAND_AMPERSAND: return \"&&\";\n case Token.BAR_BAR: return \"||\";\n case Token.EQUALS: return \"=\";\n case Token.PLUS_EQUALS: return \"+=\";\n case Token.MINUS_EQUALS: return \"-=\";\n case Token.ASTERISK_EQUALS: return \"*=\";\n case Token.ASTERISK_ASTERISK_EQUALS: return \"**=\";\n case Token.SLASH_EQUALS: return \"/=\";\n case Token.PERCENT_EQUALS: return \"%=\";\n case Token.LESSTHAN_LESSTHAN_EQUALS: return \"<<=\";\n case Token.GREATERTHAN_GREATERTHAN_EQUALS: return \">>=\";\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: return \">>>=\";\n case Token.AMPERSAND_EQUALS: return \"&=\";\n case Token.BAR_EQUALS: return \"|=\";\n case Token.CARET_EQUALS: return \"^=\";\n default: {\n assert(false);\n return \"\";\n }\n }\n}\n\nexport class Range {\n\n source: Source;\n start: i32;\n end: i32;\n\n // TODO: set these while tokenizing\n // line: i32;\n // column: i32;\n\n constructor(source: Source, start: i32, end: i32) {\n this.source = source;\n this.start = start;\n this.end = end;\n }\n\n static join(a: Range, b: Range): Range {\n if (a.source != b.source) throw new Error(\"source mismatch\");\n return new Range(a.source,\n a.start < b.start ? a.start : b.start,\n a.end > b.end ? a.end : b.end\n );\n }\n\n get atStart(): Range {\n return new Range(this.source, this.start, this.start);\n }\n get atEnd(): Range {\n return new Range(this.source, this.end, this.end);\n }\n\n get line(): i32 {\n var text = this.source.text;\n var line = 1;\n for (let pos = this.start; pos >= 0; --pos) {\n if (text.charCodeAt(pos) == CharCode.LINEFEED) line++;\n }\n return line;\n }\n\n get column(): i32 {\n var text = this.source.text;\n var column = 0;\n for (let pos = this.start - 1; pos >= 0; --pos) {\n if (text.charCodeAt(pos) == CharCode.LINEFEED) break;\n ++column;\n }\n return column;\n }\n\n toString(): string {\n return this.source.text.substring(this.start, this.end);\n }\n\n debugInfoRef: usize = 0;\n}\n\ndeclare function parseFloat(str: string): f64;\n\n/** Handler for intercepting comments while tokenizing. */\nexport type CommentHandler = (kind: CommentKind, text: string, range: Range) => void;\n\n/** Tokenizes a source to individual {@link Token}s. */\nexport class Tokenizer extends DiagnosticEmitter {\n\n source: Source;\n end: i32 = 0;\n\n pos: i32 = 0;\n token: Token = -1;\n tokenPos: i32 = 0;\n\n nextToken: Token = -1;\n nextTokenPos: i32 = 0;\n nextTokenOnNewLine: bool = false;\n\n onComment: CommentHandler | null = null;\n\n /** Constructs a new tokenizer. */\n constructor(source: Source, diagnostics: DiagnosticMessage[] | null = null) {\n super(diagnostics);\n\n this.source = source;\n this.pos = 0;\n this.end = source.text.length;\n this.diagnostics = diagnostics ? diagnostics : new Array();\n\n var text = source.text;\n\n // skip bom\n if (\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.BYTEORDERMARK\n ) {\n ++this.pos;\n }\n\n // skip shebang\n if (\n this.pos + 1 < this.end &&\n text.charCodeAt(this.pos) == CharCode.HASH &&\n text.charCodeAt(this.pos + 1) == CharCode.EXCLAMATION\n ) {\n this.pos += 2;\n while (\n this.pos < this.end &&\n text.charCodeAt(this.pos) != CharCode.LINEFEED\n ) {\n ++this.pos;\n }\n // 'next' now starts at lf or eof\n }\n }\n\n next(identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): Token {\n this.nextToken = -1;\n return this.token = this.unsafeNext(identifierHandling);\n }\n\n private unsafeNext(\n identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\n maxTokenLength: i32 = i32.MAX_VALUE\n ): Token {\n var text = this.source.text;\n while (this.pos < this.end) {\n this.tokenPos = this.pos;\n let c = text.charCodeAt(this.pos);\n switch (c) {\n case CharCode.CARRIAGERETURN: {\n if (!(\n ++this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.LINEFEED\n )) break;\n // otherwise fall-through\n }\n case CharCode.LINEFEED:\n case CharCode.TAB:\n case CharCode.VERTICALTAB:\n case CharCode.FORMFEED:\n case CharCode.SPACE: {\n ++this.pos;\n break;\n }\n case CharCode.EXCLAMATION: {\n ++this.pos;\n if (\n maxTokenLength > 1 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n if (\n maxTokenLength > 2 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.EXCLAMATION_EQUALS_EQUALS;\n }\n return Token.EXCLAMATION_EQUALS;\n }\n return Token.EXCLAMATION;\n }\n case CharCode.DOUBLEQUOTE:\n case CharCode.SINGLEQUOTE:\n case CharCode.BACKTICK: { // TODO\n return Token.STRINGLITERAL; // expects a call to readString\n }\n case CharCode.PERCENT: {\n ++this.pos;\n if (\n maxTokenLength > 1 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.PERCENT_EQUALS;\n }\n return Token.PERCENT;\n }\n case CharCode.AMPERSAND: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n let chr = text.charCodeAt(this.pos);\n if (chr == CharCode.AMPERSAND) {\n ++this.pos;\n return Token.AMPERSAND_AMPERSAND;\n }\n if (chr == CharCode.EQUALS) {\n ++this.pos;\n return Token.AMPERSAND_EQUALS;\n }\n }\n return Token.AMPERSAND;\n }\n case CharCode.OPENPAREN: {\n ++this.pos;\n return Token.OPENPAREN;\n }\n case CharCode.CLOSEPAREN: {\n ++this.pos;\n return Token.CLOSEPAREN;\n }\n case CharCode.ASTERISK: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n let chr = text.charCodeAt(this.pos);\n if (chr == CharCode.EQUALS) {\n ++this.pos;\n return Token.ASTERISK_EQUALS;\n }\n if (chr == CharCode.ASTERISK) {\n ++this.pos;\n if (\n maxTokenLength > 2 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.ASTERISK_ASTERISK_EQUALS;\n }\n return Token.ASTERISK_ASTERISK;\n }\n }\n return Token.ASTERISK;\n }\n case CharCode.PLUS: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n let chr = text.charCodeAt(this.pos);\n if (chr == CharCode.PLUS) {\n ++this.pos;\n return Token.PLUS_PLUS;\n }\n if (chr == CharCode.EQUALS) {\n ++this.pos;\n return Token.PLUS_EQUALS;\n }\n }\n return Token.PLUS;\n }\n case CharCode.COMMA: {\n ++this.pos;\n return Token.COMMA;\n }\n case CharCode.MINUS: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n let chr = text.charCodeAt(this.pos);\n if (chr == CharCode.MINUS) {\n ++this.pos;\n return Token.MINUS_MINUS;\n }\n if (chr == CharCode.EQUALS) {\n ++this.pos;\n return Token.MINUS_EQUALS;\n }\n }\n return Token.MINUS;\n }\n case CharCode.DOT: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n let chr = text.charCodeAt(this.pos);\n if (isDecimalDigit(chr)) {\n --this.pos;\n return Token.FLOATLITERAL; // expects a call to readFloat\n }\n if (\n maxTokenLength > 2 && this.pos + 1 < this.end &&\n chr == CharCode.DOT &&\n text.charCodeAt(this.pos + 1) == CharCode.DOT\n ) {\n this.pos += 2;\n return Token.DOT_DOT_DOT;\n }\n }\n return Token.DOT;\n }\n case CharCode.SLASH: {\n let commentStartPos = this.pos;\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n let chr = text.charCodeAt(this.pos);\n if (chr == CharCode.SLASH) { // single-line\n let commentKind = CommentKind.LINE;\n if (\n this.pos + 1 < this.end &&\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\n ) {\n ++this.pos;\n commentKind = CommentKind.TRIPLE;\n }\n while (++this.pos < this.end) {\n if (text.charCodeAt(this.pos) == CharCode.LINEFEED) {\n ++this.pos;\n break;\n }\n }\n if (this.onComment) {\n this.onComment(\n commentKind,\n text.substring(commentStartPos, this.pos),\n this.range(commentStartPos, this.pos)\n );\n }\n break;\n }\n if (chr == CharCode.ASTERISK) { // multi-line\n let closed = false;\n while (++this.pos < this.end) {\n c = text.charCodeAt(this.pos);\n if (\n c == CharCode.ASTERISK &&\n this.pos + 1 < this.end &&\n text.charCodeAt(this.pos + 1) == CharCode.SLASH\n ) {\n this.pos += 2;\n closed = true;\n break;\n }\n }\n if (!closed) {\n this.error(\n DiagnosticCode._0_expected,\n this.range(this.pos), \"*/\"\n );\n } else if (this.onComment) {\n this.onComment(\n CommentKind.BLOCK,\n text.substring(commentStartPos, this.pos),\n this.range(commentStartPos, this.pos)\n );\n }\n break;\n }\n if (chr == CharCode.EQUALS) {\n ++this.pos;\n return Token.SLASH_EQUALS;\n }\n }\n return Token.SLASH;\n }\n case CharCode._0:\n case CharCode._1:\n case CharCode._2:\n case CharCode._3:\n case CharCode._4:\n case CharCode._5:\n case CharCode._6:\n case CharCode._7:\n case CharCode._8:\n case CharCode._9: {\n return this.testInteger()\n ? Token.INTEGERLITERAL // expects a call to readInteger\n : Token.FLOATLITERAL; // expects a call to readFloat\n }\n case CharCode.COLON: {\n ++this.pos;\n return Token.COLON;\n }\n case CharCode.SEMICOLON: {\n ++this.pos;\n return Token.SEMICOLON;\n }\n case CharCode.LESSTHAN: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n let chr = text.charCodeAt(this.pos);\n if (chr == CharCode.LESSTHAN) {\n ++this.pos;\n if (\n maxTokenLength > 2 &&\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.LESSTHAN_LESSTHAN_EQUALS;\n }\n return Token.LESSTHAN_LESSTHAN;\n }\n if (chr == CharCode.EQUALS) {\n ++this.pos;\n return Token.LESSTHAN_EQUALS;\n }\n }\n return Token.LESSTHAN;\n }\n case CharCode.EQUALS: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n let chr = text.charCodeAt(this.pos);\n if (chr == CharCode.EQUALS) {\n ++this.pos;\n if (\n maxTokenLength > 2 &&\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.EQUALS_EQUALS_EQUALS;\n }\n return Token.EQUALS_EQUALS;\n }\n if (chr == CharCode.GREATERTHAN) {\n ++this.pos;\n return Token.EQUALS_GREATERTHAN;\n }\n }\n return Token.EQUALS;\n }\n case CharCode.GREATERTHAN: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n let chr = text.charCodeAt(this.pos);\n if (chr == CharCode.GREATERTHAN) {\n ++this.pos;\n if (maxTokenLength > 2 && this.pos < this.end) {\n chr = text.charCodeAt(this.pos);\n if (chr == CharCode.GREATERTHAN) {\n ++this.pos;\n if (\n maxTokenLength > 3 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS;\n }\n return Token.GREATERTHAN_GREATERTHAN_GREATERTHAN;\n }\n if (chr == CharCode.EQUALS) {\n ++this.pos;\n return Token.GREATERTHAN_GREATERTHAN_EQUALS;\n }\n }\n return Token.GREATERTHAN_GREATERTHAN;\n }\n if (chr == CharCode.EQUALS) {\n ++this.pos;\n return Token.GREATERTHAN_EQUALS;\n }\n }\n return Token.GREATERTHAN;\n }\n case CharCode.QUESTION: {\n ++this.pos;\n return Token.QUESTION;\n }\n case CharCode.OPENBRACKET: {\n ++this.pos;\n return Token.OPENBRACKET;\n }\n case CharCode.CLOSEBRACKET: {\n ++this.pos;\n return Token.CLOSEBRACKET;\n }\n case CharCode.CARET: {\n ++this.pos;\n if (\n maxTokenLength > 1 && this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.EQUALS\n ) {\n ++this.pos;\n return Token.CARET_EQUALS;\n }\n return Token.CARET;\n }\n case CharCode.OPENBRACE: {\n ++this.pos;\n return Token.OPENBRACE;\n }\n case CharCode.BAR: {\n ++this.pos;\n if (maxTokenLength > 1 && this.pos < this.end) {\n let chr = text.charCodeAt(this.pos);\n if (chr == CharCode.BAR) {\n ++this.pos;\n return Token.BAR_BAR;\n }\n if (chr == CharCode.EQUALS) {\n ++this.pos;\n return Token.BAR_EQUALS;\n }\n }\n return Token.BAR;\n }\n case CharCode.CLOSEBRACE: {\n ++this.pos;\n return Token.CLOSEBRACE;\n }\n case CharCode.TILDE: {\n ++this.pos;\n return Token.TILDE;\n }\n case CharCode.AT: {\n ++this.pos;\n return Token.AT;\n }\n default: {\n if (isIdentifierStart(c)) {\n if (isKeywordCharacter(c)) {\n let posBefore = this.pos;\n while (\n ++this.pos < this.end &&\n isIdentifierPart(c = text.charCodeAt(this.pos))\n ) {\n if (!isKeywordCharacter(c)) {\n this.pos = posBefore;\n return Token.IDENTIFIER;\n }\n }\n let keywordText = text.substring(posBefore, this.pos);\n let keywordToken = tokenFromKeyword(keywordText);\n if (\n keywordToken !== Token.INVALID &&\n identifierHandling !== IdentifierHandling.ALWAYS &&\n !(\n identifierHandling === IdentifierHandling.PREFER &&\n tokenIsAlsoIdentifier(keywordToken)\n )\n ) {\n return keywordToken;\n }\n this.pos = posBefore;\n }\n return Token.IDENTIFIER; // expects a call to readIdentifier\n } else if (isWhiteSpace(c)) {\n ++this.pos;\n break;\n }\n this.error(\n DiagnosticCode.Invalid_character,\n this.range(this.pos, this.pos + 1)\n );\n ++this.pos;\n return Token.INVALID;\n }\n }\n }\n return Token.ENDOFFILE;\n }\n\n peek(\n checkOnNewLine: bool = false,\n identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT,\n maxCompoundLength: i32 = i32.MAX_VALUE\n ): Token {\n var text = this.source.text;\n if (this.nextToken < 0) {\n let posBefore = this.pos;\n let tokenBefore = this.token;\n let tokenPosBefore = this.tokenPos;\n this.nextToken = this.unsafeNext(identifierHandling, maxCompoundLength);\n this.nextTokenPos = this.tokenPos;\n if (checkOnNewLine) {\n this.nextTokenOnNewLine = false;\n for (let pos = posBefore, end = this.nextTokenPos; pos < end; ++pos) {\n if (isLineBreak(text.charCodeAt(pos))) {\n this.nextTokenOnNewLine = true;\n break;\n }\n }\n }\n this.pos = posBefore;\n this.token = tokenBefore;\n this.tokenPos = tokenPosBefore;\n }\n return this.nextToken;\n }\n\n skipIdentifier(identifierHandling: IdentifierHandling = IdentifierHandling.PREFER): bool {\n return this.skip(Token.IDENTIFIER, identifierHandling);\n }\n\n skip(token: Token, identifierHandling: IdentifierHandling = IdentifierHandling.DEFAULT): bool {\n var posBefore = this.pos;\n var tokenBefore = this.token;\n var tokenPosBefore = this.tokenPos;\n var maxCompoundLength = i32.MAX_VALUE;\n switch (token) {\n case Token.GREATERTHAN: { // where parsing type arguments\n maxCompoundLength = 1;\n break;\n }\n }\n this.token = this.unsafeNext(identifierHandling, maxCompoundLength);\n if (this.token == token) {\n this.nextToken = -1;\n return true;\n } else {\n this.pos = posBefore;\n this.token = tokenBefore;\n this.tokenPos = tokenPosBefore;\n return false;\n }\n }\n\n mark(): State {\n var state: State;\n if (reusableState) {\n state = reusableState;\n reusableState = null;\n } else {\n state = new State();\n }\n state.pos = this.pos;\n state.token = this.token;\n state.tokenPos = this.tokenPos;\n return state;\n }\n\n discard(state: State): void {\n reusableState = state;\n }\n\n reset(state: State): void {\n this.pos = state.pos;\n this.token = state.token;\n this.tokenPos = state.tokenPos;\n this.nextToken = -1;\n }\n\n range(start: i32 = -1, end: i32 = -1): Range {\n if (start < 0) {\n start = this.tokenPos;\n end = this.pos;\n } else if (end < 0) {\n end = start;\n }\n return new Range(this.source, start, end);\n }\n\n readIdentifier(): string {\n var text = this.source.text;\n var start = this.pos;\n while (\n ++this.pos < this.end &&\n isIdentifierPart(text.charCodeAt(this.pos))\n );\n return text.substring(start, this.pos);\n }\n\n readString(): string {\n var text = this.source.text;\n var quote = text.charCodeAt(this.pos++);\n var start = this.pos;\n var result = \"\";\n while (true) {\n if (this.pos >= this.end) {\n result += text.substring(start, this.pos);\n this.error(\n DiagnosticCode.Unterminated_string_literal,\n this.range(start - 1, this.end)\n );\n break;\n }\n let c = text.charCodeAt(this.pos);\n if (c == quote) {\n result += text.substring(start, this.pos++);\n break;\n }\n if (c == CharCode.BACKSLASH) {\n result += text.substring(start, this.pos);\n result += this.readEscapeSequence();\n start = this.pos;\n continue;\n }\n if (isLineBreak(c)) {\n result += text.substring(start, this.pos);\n this.error(\n DiagnosticCode.Unterminated_string_literal,\n this.range(start - 1, this.pos)\n );\n break;\n }\n ++this.pos;\n }\n return result;\n }\n\n readEscapeSequence(): string {\n if (++this.pos >= this.end) {\n this.error(\n DiagnosticCode.Unexpected_end_of_text,\n this.range(this.end)\n );\n return \"\";\n }\n\n var text = this.source.text;\n var c = text.charCodeAt(this.pos++);\n switch (c) {\n case CharCode._0: return \"\\0\";\n case CharCode.b: return \"\\b\";\n case CharCode.t: return \"\\t\";\n case CharCode.n: return \"\\n\";\n case CharCode.v: return \"\\v\";\n case CharCode.f: return \"\\f\";\n case CharCode.r: return \"\\r\";\n case CharCode.SINGLEQUOTE: return \"'\";\n case CharCode.DOUBLEQUOTE: return \"\\\"\";\n case CharCode.u: {\n if (\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.OPENBRACE\n ) {\n ++this.pos;\n return this.readExtendedUnicodeEscape(); // \\u{DDDDDDDD}\n }\n return this.readUnicodeEscape(); // \\uDDDD\n }\n case CharCode.CARRIAGERETURN: {\n if (\n this.pos < this.end &&\n text.charCodeAt(this.pos) == CharCode.LINEFEED\n ) {\n ++this.pos;\n }\n // fall through\n }\n case CharCode.LINEFEED:\n case CharCode.LINESEPARATOR:\n case CharCode.PARAGRAPHSEPARATOR: return \"\";\n default: return String.fromCharCode(c);\n }\n }\n\n readRegexpPattern(): string {\n var text = this.source.text;\n var start = this.pos;\n var escaped = false;\n while (true) {\n if (this.pos >= this.end) {\n this.error(\n DiagnosticCode.Unterminated_regular_expression_literal,\n this.range(start, this.end)\n );\n break;\n }\n if (text.charCodeAt(this.pos) == CharCode.BACKSLASH) {\n ++this.pos;\n escaped = true;\n continue;\n }\n let c = text.charCodeAt(this.pos);\n if (!escaped && c == CharCode.SLASH) break;\n if (isLineBreak(c)) {\n this.error(\n DiagnosticCode.Unterminated_regular_expression_literal,\n this.range(start, this.pos)\n );\n break;\n }\n ++this.pos;\n escaped = false;\n }\n return text.substring(start, this.pos);\n }\n\n readRegexpFlags(): string {\n var text = this.source.text;\n var start = this.pos;\n var flags = 0;\n while (this.pos < this.end) {\n let c: i32 = text.charCodeAt(this.pos);\n if (!isIdentifierPart(c)) break;\n ++this.pos;\n\n // make sure each supported flag is unique\n switch (c) {\n case CharCode.g: {\n flags |= flags & 1 ? -1 : 1;\n break;\n }\n case CharCode.i: {\n flags |= flags & 2 ? -1 : 2;\n break;\n }\n case CharCode.m: {\n flags |= flags & 4 ? -1 : 4;\n break;\n }\n default: {\n flags = -1;\n break;\n }\n }\n }\n if (flags == -1) {\n this.error(\n DiagnosticCode.Invalid_regular_expression_flags,\n this.range(start, this.pos)\n );\n }\n return text.substring(start, this.pos);\n }\n\n testInteger(): bool {\n var text = this.source.text;\n if (this.pos + 1 < this.end && text.charCodeAt(this.pos) == CharCode._0) {\n switch (text.charCodeAt(this.pos + 2)) {\n case CharCode.x:\n case CharCode.X:\n case CharCode.b:\n case CharCode.B:\n case CharCode.o:\n case CharCode.O: return true;\n }\n }\n var pos = this.pos;\n while (pos < this.end) {\n let c = text.charCodeAt(pos);\n if (c == CharCode.DOT || c == CharCode.e || c == CharCode.E) {\n return false;\n }\n if ((c < CharCode._0 || c > CharCode._9) && c != CharCode._) break;\n // does not validate separator placement (this is done in readXYInteger)\n pos++;\n }\n return true;\n }\n\n readInteger(): I64 {\n var text = this.source.text;\n if (this.pos + 2 < this.end && text.charCodeAt(this.pos) == CharCode._0) {\n switch (text.charCodeAt(this.pos + 1)) {\n case CharCode.x:\n case CharCode.X: {\n this.pos += 2;\n return this.readHexInteger();\n }\n case CharCode.b:\n case CharCode.B: {\n this.pos += 2;\n return this.readBinaryInteger();\n }\n case CharCode.o:\n case CharCode.O: {\n this.pos += 2;\n return this.readOctalInteger();\n }\n }\n if (isOctalDigit(text.charCodeAt(this.pos + 1))) {\n let start = this.pos;\n ++this.pos;\n let value = this.readOctalInteger();\n this.error(\n DiagnosticCode.Octal_literals_are_not_allowed_in_strict_mode,\n this.range(start, this.pos)\n );\n return value;\n }\n }\n return this.readDecimalInteger();\n }\n\n readHexInteger(): I64 {\n var text = this.source.text;\n var start = this.pos;\n var value = i64_new(0);\n var i64_4 = i64_new(4);\n var sepEnd = start;\n while (this.pos < this.end) {\n let pos = this.pos;\n let c = text.charCodeAt(pos);\n if (c >= CharCode._0 && c <= CharCode._9) {\n // value = (value << 4) + c - CharCode._0;\n value = i64_add(\n i64_shl(value, i64_4),\n i64_new(c - CharCode._0)\n );\n } else if (c >= CharCode.A && c <= CharCode.F) {\n // value = (value << 4) + 10 + c - CharCode.A;\n value = i64_add(\n i64_shl(value, i64_4),\n i64_new(10 + c - CharCode.A)\n );\n } else if (c >= CharCode.a && c <= CharCode.f) {\n // value = (value << 4) + 10 + c - CharCode.a;\n value = i64_add(\n i64_shl(value, i64_4),\n i64_new(10 + c - CharCode.a)\n );\n } else if (c == CharCode._) {\n if (sepEnd == pos) {\n this.error(\n sepEnd == start\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\n this.range(pos)\n );\n }\n sepEnd = pos + 1;\n } else {\n break;\n }\n this.pos = pos + 1;\n }\n if (this.pos == start) {\n this.error(\n DiagnosticCode.Hexadecimal_digit_expected,\n this.range(start)\n );\n } else if (sepEnd == this.pos) {\n this.error(\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\n this.range(sepEnd - 1)\n );\n }\n return value;\n }\n\n readDecimalInteger(): I64 {\n var text = this.source.text;\n var start = this.pos;\n var value = i64_new(0);\n var i64_10 = i64_new(10);\n var sepEnd = start;\n while (this.pos < this.end) {\n let pos = this.pos;\n let c = text.charCodeAt(pos);\n if (c >= CharCode._0 && c <= CharCode._9) {\n // value = value * 10 + c - CharCode._0;\n value = i64_add(\n i64_mul(value, i64_10),\n i64_new(c - CharCode._0)\n );\n } else if (c == CharCode._) {\n if (sepEnd == pos) {\n this.error(\n sepEnd == start\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\n this.range(pos)\n );\n }\n sepEnd = pos + 1;\n } else {\n break;\n }\n this.pos = pos + 1;\n }\n if (this.pos == start) {\n this.error(\n DiagnosticCode.Digit_expected,\n this.range(start)\n );\n } else if (sepEnd == this.pos) {\n this.error(\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\n this.range(sepEnd - 1)\n );\n }\n return value;\n }\n\n readOctalInteger(): I64 {\n var text = this.source.text;\n var start = this.pos;\n var value = i64_new(0);\n var i64_3 = i64_new(3);\n var sepEnd = start;\n while (this.pos < this.end) {\n let pos = this.pos;\n let c = text.charCodeAt(pos);\n if (c >= CharCode._0 && c <= CharCode._7) {\n // value = (value << 3) + c - CharCode._0;\n value = i64_add(\n i64_shl(value, i64_3),\n i64_new(c - CharCode._0)\n );\n } else if (c == CharCode._) {\n if (sepEnd == pos) {\n this.error(\n sepEnd == start\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\n this.range(pos)\n );\n }\n sepEnd = pos + 1;\n } else {\n break;\n }\n ++this.pos;\n }\n if (this.pos == start) {\n this.error(\n DiagnosticCode.Octal_digit_expected,\n this.range(start)\n );\n } else if (sepEnd == this.pos) {\n this.error(\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\n this.range(sepEnd - 1)\n );\n }\n return value;\n }\n\n readBinaryInteger(): I64 {\n var text = this.source.text;\n var start = this.pos;\n var value = i64_new(0);\n var i64_1 = i64_new(1);\n var sepEnd = start;\n while (this.pos < this.end) {\n let pos = this.pos;\n let c = text.charCodeAt(pos);\n if (c == CharCode._0) {\n // value = (value << 1);\n value = i64_shl(value, i64_1);\n } else if (c == CharCode._1) {\n // value = (value << 1) + 1;\n value = i64_add(\n i64_shl(value, i64_1),\n i64_1\n );\n } else if (c == CharCode._) {\n if (sepEnd == pos) {\n this.error(\n sepEnd == start\n ? DiagnosticCode.Numeric_separators_are_not_allowed_here\n : DiagnosticCode.Multiple_consecutive_numeric_separators_are_not_permitted,\n this.range(pos)\n );\n }\n sepEnd = pos + 1;\n } else {\n break;\n }\n this.pos = pos + 1;\n }\n if (this.pos == start) {\n this.error(\n DiagnosticCode.Binary_digit_expected,\n this.range(start)\n );\n } else if (sepEnd == this.pos) {\n this.error(\n DiagnosticCode.Numeric_separators_are_not_allowed_here,\n this.range(sepEnd - 1)\n );\n }\n return value;\n }\n\n readFloat(): f64 {\n // var text = this.source.text;\n // if (text.charCodeAt(this.pos) == CharCode._0 && this.pos + 2 < this.end) {\n // switch (text.charCodeAt(this.pos + 1)) {\n // case CharCode.X:\n // case CharCode.x: {\n // this.pos += 2;\n // return this.readHexFloat();\n // }\n // }\n // }\n return this.readDecimalFloat();\n }\n\n readDecimalFloat(): f64 {\n // TODO: numeric separators (parseFloat can't handle these)\n var start = this.pos;\n var text = this.source.text;\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\n ++this.pos;\n }\n if (this.pos < this.end && text.charCodeAt(this.pos) == CharCode.DOT) {\n ++this.pos;\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\n ++this.pos;\n }\n }\n if (this.pos < this.end) {\n let c = text.charCodeAt(this.pos);\n if (c == CharCode.e || c == CharCode.E) {\n if (\n ++this.pos < this.end &&\n (c = text.charCodeAt(this.pos)) == CharCode.MINUS || c == CharCode.PLUS &&\n isDecimalDigit(text.charCodeAt(this.pos + 1))\n ) {\n ++this.pos;\n }\n while (this.pos < this.end && isDecimalDigit(text.charCodeAt(this.pos))) {\n ++this.pos;\n }\n }\n }\n return parseFloat(text.substring(start, this.pos));\n }\n\n readHexFloat(): f64 {\n throw new Error(\"not implemented\"); // TBD\n }\n\n readUnicodeEscape(): string {\n var remain = 4;\n var value = 0;\n var text = this.source.text;\n while (this.pos < this.end) {\n let c = text.charCodeAt(this.pos++);\n if (c >= CharCode._0 && c <= CharCode._9) {\n value = (value << 4) + c - CharCode._0;\n } else if (c >= CharCode.A && c <= CharCode.F) {\n value = (value << 4) + c + (10 - CharCode.A);\n } else if (c >= CharCode.a && c <= CharCode.f) {\n value = (value << 4) + c + (10 - CharCode.a);\n } else {\n this.error(\n DiagnosticCode.Hexadecimal_digit_expected,\n this.range(this.pos - 1, this.pos)\n );\n return \"\";\n }\n if (--remain == 0) break;\n }\n if (remain) {\n this.error(\n DiagnosticCode.Unexpected_end_of_text,\n this.range(this.pos)\n );\n return \"\";\n }\n return String.fromCharCode(value);\n }\n\n private readExtendedUnicodeEscape(): string {\n var start = this.pos;\n var value = this.readHexInteger();\n var value32 = i64_low(value);\n var invalid = false;\n\n assert(!i64_high(value));\n if (value32 > 0x10FFFF) {\n this.error(\n DiagnosticCode.An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive,\n this.range(start, this.pos)\n );\n invalid = true;\n }\n\n var text = this.source.text;\n if (this.pos >= this.end) {\n this.error(\n DiagnosticCode.Unexpected_end_of_text,\n this.range(start, this.end)\n );\n invalid = true;\n } else if (text.charCodeAt(this.pos) == CharCode.CLOSEBRACE) {\n ++this.pos;\n } else {\n this.error(\n DiagnosticCode.Unterminated_Unicode_escape_sequence,\n this.range(start, this.pos)\n );\n invalid = true;\n }\n\n if (invalid) return \"\";\n return value32 < 65536\n ? String.fromCharCode(value32)\n : String.fromCharCode(\n ((value32 - 65536) >>> 10) + 0xD800,\n ((value32 - 65536) & 1023) + 0xDC00\n );\n }\n\n finish(): void {\n }\n}\n\n/** Tokenizer state as returned by {@link Tokenizer#mark} and consumed by {@link Tokenizer#reset}. */\nexport class State {\n /** Current position. */\n pos: i32;\n /** Current token. */\n token: Token;\n /** Current token's position. */\n tokenPos: i32;\n}\n\n// Reusable state object to reduce allocations\nvar reusableState: State | null = null;\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/**\n * Resolve infrastructure to obtain types and elements.\n * @module resolver\n *//***/\n\nimport {\n DiagnosticEmitter,\n DiagnosticCode\n} from \"./diagnostics\";\n\nimport {\n Program,\n ElementKind,\n OperatorKind,\n Element,\n Class,\n ClassPrototype,\n Function,\n FunctionPrototype,\n VariableLikeElement,\n Property,\n PropertyPrototype,\n Field,\n FieldPrototype,\n Global,\n TypeDefinition\n} from \"./program\";\n\nimport {\n FlowFlags,\n Flow\n} from \"./flow\";\n\nimport {\n SignatureNode,\n ParameterKind,\n CommonTypeNode,\n NodeKind,\n TypeNode,\n TypeName,\n TypeParameterNode,\n Node,\n Range,\n IdentifierExpression,\n CallExpression,\n ElementAccessExpression,\n PropertyAccessExpression,\n LiteralExpression,\n LiteralKind,\n ParenthesizedExpression,\n AssertionExpression,\n Expression,\n IntegerLiteralExpression,\n UnaryPrefixExpression,\n UnaryPostfixExpression,\n AssertionKind,\n BinaryExpression,\n ThisExpression,\n SuperExpression\n} from \"./ast\";\n\nimport {\n Type,\n Signature,\n typesToString,\n TypeKind,\n TypeFlags\n} from \"./types\";\n\nimport {\n CommonFlags,\n CommonSymbols\n} from \"./common\";\n\nimport {\n makeMap\n} from \"./util\";\n\nimport {\n Token\n} from \"./tokenizer\";\n\n/** Indicates whether errors are reported or not. */\nexport enum ReportMode {\n /** Report errors. */\n REPORT,\n /** Swallow errors. */\n SWALLOW\n}\n\n/** Provides tools to resolve types and expressions. */\nexport class Resolver extends DiagnosticEmitter {\n\n /** The program this resolver belongs to. */\n program: Program;\n\n /** Target expression of the previously resolved property or element access. */\n currentThisExpression: Expression | null = null;\n /** Element expression of the previously resolved element access. */\n currentElementExpression : Expression | null = null;\n\n /** Constructs the resolver for the specified program. */\n constructor(\n /** The program to construct a resolver for. */\n program: Program\n ) {\n super(program.diagnostics);\n this.program = program;\n }\n\n /** Resolves a {@link CommonTypeNode} to a concrete {@link Type}. */\n resolveType(\n /** The type to resolve. */\n node: CommonTypeNode,\n /** Relative context. */\n context: Element,\n /** Type arguments inherited through context, i.e. `T`. */\n contextualTypeArguments: Map | null = null,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Type | null {\n\n // handle signature\n if (node.kind == NodeKind.SIGNATURE) {\n let explicitThisType = (node).explicitThisType;\n let thisType: Type | null = null;\n if (explicitThisType) {\n thisType = this.resolveType(\n explicitThisType,\n context,\n contextualTypeArguments,\n reportMode\n );\n if (!thisType) return null;\n }\n let parameterNodes = (node).parameters;\n let numParameters = parameterNodes.length;\n let parameterTypes = new Array(numParameters);\n let parameterNames = new Array(numParameters);\n let requiredParameters = 0;\n let hasRest = false;\n for (let i = 0; i < numParameters; ++i) {\n let parameterTypeNode = parameterNodes[i];\n switch (parameterTypeNode.parameterKind) {\n case ParameterKind.DEFAULT: {\n requiredParameters = i + 1;\n break;\n }\n case ParameterKind.REST: {\n assert(i == numParameters);\n hasRest = true;\n break;\n }\n }\n let parameterType = this.resolveType(\n assert(parameterTypeNode.type),\n context,\n contextualTypeArguments,\n reportMode\n );\n if (!parameterType) return null;\n parameterTypes[i] = parameterType;\n parameterNames[i] = parameterTypeNode.name.text;\n }\n let returnTypeNode = (node).returnType;\n let returnType: Type | null;\n if (returnTypeNode) {\n returnType = this.resolveType(\n returnTypeNode,\n context,\n contextualTypeArguments,\n reportMode\n );\n if (!returnType) return null;\n } else {\n returnType = Type.void;\n }\n let signature = new Signature(parameterTypes, returnType, thisType);\n signature.parameterNames = parameterNames;\n signature.requiredParameters = requiredParameters;\n signature.hasRest = hasRest;\n return node.isNullable ? signature.type.asNullable() : signature.type;\n }\n\n // now dealing with TypeNode\n assert(node.kind == NodeKind.TYPE);\n var typeNode = node;\n var typeName = typeNode.name;\n var typeArgumentNodes = typeNode.typeArguments;\n var possiblyPlaceholder = !typeName.next;\n\n // look up in contextual type arguments if possibly a placeholder\n if (possiblyPlaceholder) {\n if (contextualTypeArguments && contextualTypeArguments.has(typeName.identifier.text)) {\n let type = contextualTypeArguments.get(typeName.identifier.text)!;\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n node.range, type.toString()\n );\n }\n }\n if (node.isNullable) {\n if (!type.is(TypeFlags.REFERENCE)) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Basic_type_0_cannot_be_nullable,\n node.range, type.toString()\n );\n }\n }\n return type.asNullable();\n }\n return type;\n }\n }\n\n // look up in context\n var element = this.resolveTypeName(typeName, context, reportMode);\n if (!element) return null;\n\n // use shadow type if present (i.e. namespace sharing a type)\n if (element.shadowType) {\n element = element.shadowType;\n\n } else {\n // handle enums (become i32)\n if (element.kind == ElementKind.ENUM) {\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n node.range, element.internalName\n );\n }\n }\n if (node.isNullable) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Basic_type_0_cannot_be_nullable,\n node.range, element.name\n );\n }\n }\n return Type.i32;\n }\n\n // handle classes\n if (element.kind == ElementKind.CLASS_PROTOTYPE) {\n let instance = this.resolveClassInclTypeArguments(\n element,\n typeArgumentNodes,\n context,\n makeMap(contextualTypeArguments), // don't inherit\n node\n ); // reports\n if (!instance) return null;\n return node.isNullable ? instance.type.asNullable() : instance.type;\n }\n }\n\n // handle type definitions\n if (element.kind == ElementKind.TYPEDEFINITION) {\n\n // shortcut already resolved (mostly builtins)\n if (element.is(CommonFlags.RESOLVED)) {\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n node.range, element.internalName\n );\n }\n }\n let type = (element).type;\n if (node.isNullable) {\n if (!type.is(TypeFlags.REFERENCE)) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Basic_type_0_cannot_be_nullable,\n typeNode.name.range, typeName.identifier.text\n );\n }\n } else {\n return type.asNullable();\n }\n }\n return type;\n }\n\n // handle special native type\n if (possiblyPlaceholder && typeName.identifier.text == CommonSymbols.native) {\n if (!(typeArgumentNodes && typeArgumentNodes.length == 1)) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n typeNode.range, \"1\", (typeArgumentNodes ? typeArgumentNodes.length : 1).toString(10)\n );\n }\n return null;\n }\n let typeArgument = this.resolveType(\n typeArgumentNodes[0],\n context,\n contextualTypeArguments,\n reportMode\n );\n if (!typeArgument) return null;\n switch (typeArgument.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: return Type.i32;\n case TypeKind.ISIZE: if (!this.program.options.isWasm64) return Type.i32;\n case TypeKind.I64: return Type.i64;\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: return Type.u32;\n case TypeKind.USIZE: if (!this.program.options.isWasm64) return Type.u32;\n case TypeKind.U64: return Type.u64;\n case TypeKind.F32: return Type.f32;\n case TypeKind.F64: return Type.f64;\n case TypeKind.V128: return Type.v128;\n case TypeKind.VOID: return Type.void;\n default: assert(false);\n }\n }\n\n // resolve normally\n let typeParameterNodes = (element).typeParameterNodes;\n let typeArguments: Type[] | null = null;\n if (typeParameterNodes) {\n typeArguments = this.resolveTypeArguments(\n typeParameterNodes,\n typeArgumentNodes,\n context,\n contextualTypeArguments = makeMap(contextualTypeArguments), // inherit\n node,\n reportMode\n );\n if (!typeArguments) return null;\n } else if (typeArgumentNodes && typeArgumentNodes.length) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n typeNode.range, typeName.identifier.text\n );\n // recoverable\n }\n return this.resolveType(\n (element).typeNode,\n element,\n contextualTypeArguments,\n reportMode\n );\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n typeNode.name.range, typeName.identifier.text\n );\n }\n return null;\n }\n\n /** Resolves a type name to the program element it refers to. */\n resolveTypeName(\n /** The type name to resolve. */\n typeName: TypeName,\n /** Relative context. */\n context: Element,\n /** How to proceed with eventualy diagnostics. */\n reportMode = ReportMode.REPORT\n ): Element | null {\n var element = context.lookup(typeName.identifier.text);\n if (!element) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n typeName.range, typeName.identifier.text\n );\n }\n return null;\n }\n var prev = typeName;\n var next = typeName.next;\n while (next) {\n if (!(element = element.lookupInSelf(next.identifier.text))) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n next.range, next.identifier.text, prev.identifier.text\n );\n }\n return null;\n }\n prev = next;\n next = next.next;\n }\n return element;\n }\n\n /** Resolves an array of type arguments to concrete types. */\n resolveTypeArguments(\n /** Actual type parameter nodes. */\n typeParameters: TypeParameterNode[],\n /** Type arguments provided. */\n typeArgumentNodes: CommonTypeNode[] | null,\n /** Relative context. */\n context: Element,\n /** Type arguments inherited through context, i.e. `T`. */\n contextualTypeArguments: Map = makeMap(),\n /** Alternative report node in case of empty type arguments. */\n alternativeReportNode: Node | null = null,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Type[] | null {\n var minParameterCount = 0;\n var maxParameterCount = 0;\n for (let i = 0; i < typeParameters.length; ++i) {\n if (!typeParameters[i].defaultType) ++minParameterCount;\n ++maxParameterCount;\n }\n var argumentCount = typeArgumentNodes ? typeArgumentNodes.length : 0;\n if (argumentCount < minParameterCount || argumentCount > maxParameterCount) {\n this.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n argumentCount\n ? Range.join(\n (typeArgumentNodes)[0].range,\n (typeArgumentNodes)[argumentCount - 1].range\n )\n : assert(alternativeReportNode).range,\n (argumentCount < minParameterCount ? minParameterCount : maxParameterCount).toString(10),\n argumentCount.toString(10)\n );\n return null;\n }\n var typeArguments = new Array(maxParameterCount);\n for (let i = 0; i < maxParameterCount; ++i) {\n let type = i < argumentCount\n ? this.resolveType( // reports\n (typeArgumentNodes)[i],\n context,\n contextualTypeArguments,\n reportMode\n )\n : this.resolveType( // reports\n assert(typeParameters[i].defaultType),\n context,\n contextualTypeArguments,\n reportMode\n );\n if (!type) return null;\n // TODO: check extendsType\n contextualTypeArguments.set(typeParameters[i].name.text, type);\n typeArguments[i] = type;\n }\n return typeArguments;\n }\n\n /** Resolves an identifier to the program element it refers to. */\n resolveIdentifier(\n /** The expression to resolve. */\n identifier: IdentifierExpression,\n /** Optional flow to search for scoped locals. */\n flow: Flow | null,\n /** Optional context to search. */\n context: Element | null,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var name = identifier.text;\n var element: Element | null;\n if (flow) {\n if (element = flow.lookup(name)) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element;\n }\n }\n if (context) {\n if (element = context.lookup(name)) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element;\n }\n }\n if (element = this.program.lookupGlobal(name)) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element;\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n identifier.range, name\n );\n }\n return null;\n }\n\n /** Resolves a lazily compiled global, i.e. a static class field. */\n ensureResolvedLazyGlobal(global: Global, reportMode: ReportMode = ReportMode.REPORT): bool {\n if (global.is(CommonFlags.RESOLVED)) return true;\n var typeNode = global.typeNode;\n if (!typeNode) return false;\n var type = this.resolveType( // reports\n typeNode,\n global.parent,\n null,\n reportMode\n );\n if (!type) return false;\n global.setType(type);\n return true;\n }\n\n /** Resolves a property access expression to the program element it refers to. */\n resolvePropertyAccessExpression(\n /** The expression to resolve. */\n propertyAccess: PropertyAccessExpression,\n /** Current flow. */\n flow: Flow,\n /** Current contextual type. */\n contextualType: Type,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = propertyAccess.expression;\n var target = this.resolveExpression(targetExpression, flow, contextualType, reportMode); // reports\n if (!target) return null;\n var propertyName = propertyAccess.property.text;\n\n // Resolve variable-likes to their class type first\n switch (target.kind) {\n case ElementKind.GLOBAL: if (!this.ensureResolvedLazyGlobal(target, reportMode)) return null;\n case ElementKind.LOCAL:\n case ElementKind.FIELD: {\n let type = (target).type; assert(type != Type.void);\n let classReference = type.classReference;\n if (!classReference) {\n let typeClasses = this.program.typeClasses;\n if (!type.is(TypeFlags.REFERENCE) && typeClasses.has(type.kind)) {\n classReference = typeClasses.get(type.kind)!;\n } else {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, (target).type.toString()\n );\n return null;\n }\n }\n target = classReference;\n break;\n }\n case ElementKind.PROPERTY_PROTOTYPE: { // static\n let getterInstance = this.resolveFunction( // reports\n assert((target).getterPrototype), // must have a getter\n null,\n makeMap(),\n reportMode\n );\n if (!getterInstance) return null;\n let classReference = getterInstance.signature.returnType.classReference;\n if (!classReference) {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, getterInstance.signature.returnType.toString()\n );\n return null;\n }\n target = classReference;\n break;\n }\n case ElementKind.PROPERTY: { // instance\n let getterInstance = assert((target).getterInstance); // must have a getter\n let classReference = getterInstance.signature.returnType.classReference;\n if (!classReference) {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, getterInstance.signature.returnType.toString()\n );\n return null;\n }\n target = classReference;\n break;\n }\n case ElementKind.CLASS: { // property access on element access?\n let elementExpression = this.currentElementExpression;\n if (elementExpression) {\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET);\n if (!indexedGet) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n elementExpression.range, (target).internalName\n );\n return null;\n }\n let returnType = indexedGet.signature.returnType;\n if (!(target = returnType.classReference)) {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, returnType.toString()\n );\n return null;\n }\n }\n break;\n }\n }\n\n // Look up the member within\n switch (target.kind) {\n case ElementKind.CLASS_PROTOTYPE:\n case ElementKind.CLASS: {\n do {\n let members = target.members;\n if (members && members.has(propertyName)) {\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = null;\n return members.get(propertyName)!; // instance FIELD, static GLOBAL, FUNCTION_PROTOTYPE...\n }\n // traverse inherited static members on the base prototype if target is a class prototype\n if (target.kind == ElementKind.CLASS_PROTOTYPE) {\n if ((target).basePrototype) {\n target = (target).basePrototype;\n } else {\n break;\n }\n // traverse inherited instance members on the base class if target is a class instance\n } else if (target.kind == ElementKind.CLASS) {\n if ((target).base) {\n target = (target).base;\n } else {\n break;\n }\n } else {\n break;\n }\n } while (true);\n break;\n }\n default: { // enums or other namespace-like elements\n let members = target.members;\n if (members && members.has(propertyName)) {\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = null;\n return members.get(propertyName)!; // static ENUMVALUE, static GLOBAL, static FUNCTION_PROTOTYPE...\n }\n break;\n }\n }\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n propertyAccess.property.range, propertyName, target.internalName\n );\n return null;\n }\n\n /** Resolves an element access expression to the program element it refers to. */\n resolveElementAccessExpression(\n /** The expression to resolve. */\n elementAccess: ElementAccessExpression,\n /** Current flow. */\n flow: Flow,\n /** Current contextual type. */\n contextualType: Type,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = elementAccess.expression;\n var target = this.resolveExpression(targetExpression, flow, contextualType, reportMode); // reports\n if (!target) return null;\n switch (target.kind) {\n case ElementKind.GLOBAL: if (!this.ensureResolvedLazyGlobal(target, reportMode)) return null;\n case ElementKind.LOCAL:\n case ElementKind.FIELD: {\n let type = (target).type;\n if (target = type.classReference) {\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = elementAccess.elementExpression;\n return target;\n }\n break;\n }\n case ElementKind.CLASS: {\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET);\n if (!indexedGet) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n elementAccess.range, (target).internalName\n );\n }\n return null;\n }\n if (targetExpression.kind == NodeKind.ELEMENTACCESS) { // nested element access\n let returnType = indexedGet.signature.returnType;\n if (target = returnType.classReference) {\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = elementAccess.elementExpression;\n return target;\n }\n return null;\n }\n this.currentThisExpression = targetExpression;\n this.currentElementExpression = elementAccess.elementExpression;\n return target;\n }\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n targetExpression.range\n );\n }\n return null;\n }\n\n /** Determines the final type of an integer literal given the specified contextual type. */\n determineIntegerLiteralType(\n /** Integer literal value. */\n intValue: I64,\n /** Current contextual type. */\n contextualType: Type\n ): Type {\n if (!contextualType.is(TypeFlags.REFERENCE)) {\n // compile to contextualType if matching\n switch (contextualType.kind) {\n case TypeKind.I8: {\n if (i64_is_i8(intValue)) return Type.i8;\n break;\n }\n case TypeKind.U8: {\n if (i64_is_u8(intValue)) return Type.u8;\n break;\n }\n case TypeKind.I16: {\n if (i64_is_i16(intValue)) return Type.i16;\n break;\n }\n case TypeKind.U16: {\n if (i64_is_u16(intValue)) return Type.u16;\n break;\n }\n case TypeKind.I32: {\n if (i64_is_i32(intValue)) return Type.i32;\n break;\n }\n case TypeKind.U32: {\n if (i64_is_u32(intValue)) return Type.u32;\n break;\n }\n case TypeKind.BOOL: {\n if (i64_is_bool(intValue)) return Type.bool;\n break;\n }\n case TypeKind.ISIZE: {\n if (!this.program.options.isWasm64) {\n if (i64_is_i32(intValue)) return Type.isize32;\n break;\n }\n return Type.isize64;\n }\n case TypeKind.USIZE: {\n if (!this.program.options.isWasm64) {\n if (i64_is_u32(intValue)) return Type.usize32;\n break;\n }\n return Type.usize64;\n }\n case TypeKind.I64: return Type.i64;\n case TypeKind.U64: return Type.u64;\n case TypeKind.F32: return Type.f32;\n case TypeKind.F64: return Type.f64;\n case TypeKind.VOID: break; // best fitting below\n default: assert(false);\n }\n }\n // otherwise compile to best fitting native type\n if (i64_is_i32(intValue)) return Type.i32;\n if (i64_is_u32(intValue)) return Type.u32;\n return Type.i64;\n }\n\n /** Resolves any expression to the program element it refers to. */\n resolveExpression(\n /** The expression to resolve. */\n expression: Expression,\n /** Current flow. */\n flow: Flow,\n /** Current contextual type. */\n contextualType: Type = Type.void,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n while (expression.kind == NodeKind.PARENTHESIZED) { // simply skip\n expression = (expression).expression;\n }\n switch (expression.kind) {\n case NodeKind.ASSERTION: {\n return this.resolveAssertionExpression(\n expression,\n flow, contextualType, reportMode\n );\n }\n case NodeKind.UNARYPREFIX: {\n return this.resolveUnaryPrefixExpression(\n expression,\n flow, contextualType, reportMode\n );\n }\n case NodeKind.UNARYPOSTFIX: {\n return this.resolveUnaryPostfixExpression(\n expression,\n flow, contextualType, reportMode\n );\n }\n case NodeKind.BINARY: {\n return this.resolveBinaryExpression(\n expression,\n flow, contextualType, reportMode\n );\n }\n case NodeKind.THIS: {\n return this.resolveThisExpression(\n expression,\n flow, contextualType, reportMode\n );\n }\n case NodeKind.SUPER: {\n return this.resolveSuperExpression(\n expression,\n flow, contextualType, reportMode\n );\n }\n case NodeKind.IDENTIFIER: {\n return this.resolveIdentifier(\n expression,\n flow, flow.actualFunction, reportMode\n );\n }\n case NodeKind.LITERAL: {\n return this.resolveLiteralExpression(\n expression,\n flow, contextualType, reportMode\n );\n }\n case NodeKind.PROPERTYACCESS: {\n return this.resolvePropertyAccessExpression(\n expression,\n flow, contextualType, reportMode\n );\n }\n case NodeKind.ELEMENTACCESS: {\n return this.resolveElementAccessExpression(\n expression,\n flow, contextualType, reportMode\n );\n }\n case NodeKind.CALL: {\n return this.resolveCallExpression(\n expression,\n flow, contextualType, reportMode\n );\n }\n // TODO: everything else\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n }\n return null;\n }\n\n /** Resolves an assertion expression to the program element it refers to. */\n resolveAssertionExpression(\n /** The expression to resolve. */\n expression: AssertionExpression,\n /** Current flow. */\n flow: Flow,\n /** Current contextual type. */\n contextualType: Type = Type.void,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n if (expression.assertionKind == AssertionKind.NONNULL) {\n return this.resolveExpression(\n expression.expression,\n flow,\n contextualType,\n reportMode\n );\n }\n var type = this.resolveType(\n assert(expression.toType), // must be set if not NONNULL\n flow.actualFunction,\n flow.contextualTypeArguments,\n reportMode\n );\n if (!type) return null;\n var element: Element | null = type.classReference;\n if (!element) {\n let signature = type.signatureReference;\n if (!signature) return null;\n element = signature.asFunctionTarget(this.program);\n }\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return element;\n }\n\n /** Resolves an unary prefix expression to the program element it refers to. */\n resolveUnaryPrefixExpression(\n /** The expression to resolve. */\n expression: UnaryPrefixExpression,\n /** Current flow. */\n flow: Flow,\n /** Current contextual type. */\n contextualType: Type = Type.void,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var operand = expression.operand;\n // TODO: operator overloads\n switch (expression.operator) {\n case Token.MINUS: {\n // implicitly negate if an integer literal to distinguish between i32/u32/i64\n if (operand.kind == NodeKind.LITERAL && (operand).literalKind == LiteralKind.INTEGER) {\n let type = this.determineIntegerLiteralType(\n i64_sub(i64_zero, (operand).value),\n contextualType\n );\n let typeClasses = this.program.typeClasses;\n return typeClasses.has(type.kind) ? typeClasses.get(type.kind)! : null;\n }\n return this.resolveExpression(\n operand,\n flow,\n contextualType,\n reportMode\n );\n }\n case Token.PLUS:\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS: {\n return this.resolveExpression(\n expression.operand,\n flow,\n contextualType,\n reportMode\n );\n }\n case Token.EXCLAMATION: {\n let typeClasses = this.program.typeClasses;\n return typeClasses.has(TypeKind.BOOL) ? typeClasses.get(TypeKind.BOOL)! : null;\n }\n case Token.TILDE: {\n let resolvedOperand = this.resolveExpression(\n expression.operand,\n flow,\n contextualType,\n reportMode\n );\n if (!resolvedOperand) return null;\n // TODO\n break;\n }\n default: assert(false);\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n }\n return null;\n }\n\n /** Resolves an unary postfix expression to the program element it refers to. */\n resolveUnaryPostfixExpression(\n /** The expression to resolve. */\n expression: UnaryPostfixExpression,\n /** Current flow. */\n flow: Flow,\n /** Current contextual type. */\n contextualType: Type = Type.void,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n // TODO: operator overloads\n switch (expression.operator) {\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS: {\n return this.resolveExpression(\n expression.operand,\n flow,\n contextualType,\n reportMode\n );\n }\n default: assert(false);\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n }\n return null;\n }\n\n /** Resolves a binary expression to the program element it refers to. */\n resolveBinaryExpression(\n /** The expression to resolve. */\n expression: BinaryExpression,\n /** Current flow. */\n flow: Flow,\n /** Current contextual type. */\n contextualType: Type = Type.void,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n // TODO\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n }\n return null;\n }\n\n /** Resolves a this expression to the program element it refers to. */\n resolveThisExpression(\n /** The expression to resolve. */\n expression: ThisExpression,\n /** Current flow. */\n flow: Flow,\n /** Current contextual type. */\n contextualType: Type = Type.void,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\n let thisLocal = flow.lookupLocal(CommonSymbols.this_);\n if (thisLocal) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return thisLocal;\n }\n }\n var parent = flow.actualFunction.parent;\n if (parent) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return parent;\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\n expression.range\n );\n }\n return null;\n }\n\n /** Resolves a super expression to the program element it refers to. */\n resolveSuperExpression(\n /** The expression to resolve. */\n expression: SuperExpression,\n /** Current flow. */\n flow: Flow,\n /** Current contextual type. */\n contextualType: Type = Type.void,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\n let superLocal = flow.lookupLocal(CommonSymbols.super_);\n if (superLocal) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return superLocal;\n }\n }\n var parent: Element | null = flow.actualFunction.parent;\n if (parent && parent.kind == ElementKind.CLASS && (parent = (parent).base)) {\n this.currentThisExpression = null;\n this.currentElementExpression = null;\n return parent;\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\n expression.range\n );\n }\n return null;\n }\n\n /** Resolves a literal expression to the program element it refers to. */\n resolveLiteralExpression(\n /** The expression to resolve. */\n expression: LiteralExpression,\n /** Current flow. */\n flow: Flow,\n /** Current contextual type. */\n contextualType: Type = Type.void,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n switch (expression.literalKind) {\n case LiteralKind.INTEGER: {\n this.currentThisExpression = expression;\n this.currentElementExpression = null;\n let literalType = this.determineIntegerLiteralType(\n (expression).value,\n contextualType\n );\n let typeClasses = this.program.typeClasses;\n return typeClasses.has(literalType.kind) ? typeClasses.get(literalType.kind)! : null;\n }\n case LiteralKind.FLOAT: {\n this.currentThisExpression = expression;\n this.currentElementExpression = null;\n let literalType = contextualType == Type.f32 ? Type.f32 : Type.f64;\n let typeClasses = this.program.typeClasses;\n return typeClasses.has(literalType.kind) ? typeClasses.get(literalType.kind)! : null;\n }\n case LiteralKind.STRING: {\n this.currentThisExpression = expression;\n this.currentElementExpression = null;\n return this.program.stringInstance;\n }\n // TODO\n // case LiteralKind.ARRAY:\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n }\n return null;\n }\n\n /** Resolves a call expression to the program element it refers to. */\n resolveCallExpression(\n /** The expression to resolve. */\n expression: CallExpression,\n /** Current flow. */\n flow: Flow,\n /** Current contextual type. */\n contextualType: Type = Type.void,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Element | null {\n var targetExpression = expression.expression;\n var target = this.resolveExpression( // reports\n targetExpression,\n flow,\n contextualType,\n reportMode\n );\n if (!target) return null;\n if (target.kind == ElementKind.FUNCTION_PROTOTYPE) {\n let instance = this.resolveFunctionInclTypeArguments(\n target,\n expression.typeArguments,\n flow.actualFunction,\n makeMap(flow.contextualTypeArguments), // don't inherit\n expression,\n reportMode\n );\n if (!instance) return null;\n let returnType = instance.signature.returnType;\n let classType = returnType.classReference;\n if (classType) {\n // reuse resolvedThisExpression (might be property access)\n // reuse resolvedElementExpression (might be element access)\n return classType;\n } else {\n let signature = returnType.signatureReference;\n if (signature) {\n let functionTarget = signature.asFunctionTarget(this.program);\n // reuse resolvedThisExpression (might be property access)\n // reuse resolvedElementExpression (might be element access)\n return functionTarget;\n }\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n targetExpression.range, target.internalName\n );\n }\n return null;\n }\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n }\n return null;\n }\n\n /** Resolves a function prototype using the specified concrete type arguments. */\n resolveFunction(\n /** The prototype of the function. */\n prototype: FunctionPrototype,\n /** Concrete type arguments. */\n typeArguments: Type[] | null,\n /** Type arguments inherited through context, i.e. `T`. */\n contextualTypeArguments: Map = makeMap(),\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Function | null {\n var actualParent = prototype.parent.kind == ElementKind.PROPERTY_PROTOTYPE\n ? prototype.parent.parent\n : prototype.parent;\n var classInstance: Class | null = null; // if an instance method\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\n\n // Instance method prototypes are pre-bound to their concrete class as their parent\n if (prototype.is(CommonFlags.INSTANCE)) {\n assert(actualParent.kind == ElementKind.CLASS);\n classInstance = actualParent;\n\n // check if this exact concrete class and function combination is known already\n let resolvedInstance = prototype.getResolvedInstance(instanceKey);\n if (resolvedInstance) return resolvedInstance;\n\n // inherit class specific type arguments\n let classTypeArguments = classInstance.typeArguments;\n if (classTypeArguments) {\n let classTypeParameters = assert(classInstance.prototype.typeParameterNodes);\n let numClassTypeArguments = classTypeParameters.length;\n assert(numClassTypeArguments == classTypeParameters.length);\n for (let i = 0; i < numClassTypeArguments; ++i) {\n let classTypeParameterName = classTypeParameters[i].name.text;\n if (!contextualTypeArguments.has(classTypeParameterName)) {\n contextualTypeArguments.set(\n classTypeParameterName,\n classTypeArguments[i]\n );\n }\n }\n }\n } else {\n assert(actualParent.kind != ElementKind.CLASS); // must not be pre-bound\n let resolvedInstance = prototype.getResolvedInstance(instanceKey);\n if (resolvedInstance) return resolvedInstance;\n }\n\n // override whatever is contextual with actual function type arguments\n var signatureNode = prototype.signatureNode;\n var typeParameterNodes = prototype.typeParameterNodes;\n var numFunctionTypeArguments: i32;\n if (typeArguments && (numFunctionTypeArguments = typeArguments.length)) {\n assert(typeParameterNodes && numFunctionTypeArguments == typeParameterNodes.length);\n for (let i = 0; i < numFunctionTypeArguments; ++i) {\n contextualTypeArguments.set(\n (typeParameterNodes)[i].name.text,\n typeArguments[i]\n );\n }\n } else {\n assert(!typeParameterNodes || typeParameterNodes.length == 0);\n }\n\n // resolve `this` type if applicable\n var thisType: Type | null = null;\n var explicitThisType = signatureNode.explicitThisType;\n if (explicitThisType) {\n thisType = this.resolveType(\n explicitThisType,\n prototype.parent, // relative to function\n contextualTypeArguments,\n reportMode\n );\n if (!thisType) return null;\n contextualTypeArguments.set(CommonSymbols.this_, thisType);\n } else if (classInstance) {\n thisType = classInstance.type;\n contextualTypeArguments.set(CommonSymbols.this_, thisType);\n }\n\n // resolve parameter types\n var signatureParameters = signatureNode.parameters;\n var numSignatureParameters = signatureParameters.length;\n var parameterTypes = new Array(numSignatureParameters);\n var parameterNames = new Array(numSignatureParameters);\n var requiredParameters = 0;\n for (let i = 0; i < numSignatureParameters; ++i) {\n let parameterDeclaration = signatureParameters[i];\n if (parameterDeclaration.parameterKind == ParameterKind.DEFAULT) {\n requiredParameters = i + 1;\n }\n let typeNode = assert(parameterDeclaration.type);\n let parameterType = this.resolveType(\n typeNode,\n prototype.parent, // relative to function\n contextualTypeArguments,\n reportMode\n );\n if (!parameterType) return null;\n parameterTypes[i] = parameterType;\n parameterNames[i] = parameterDeclaration.name.text;\n }\n\n // resolve return type\n var returnType: Type;\n if (prototype.is(CommonFlags.SET)) {\n returnType = Type.void; // not annotated\n } else if (prototype.is(CommonFlags.CONSTRUCTOR)) {\n returnType = assert(classInstance).type; // not annotated\n } else {\n let typeNode = assert(signatureNode.returnType);\n let type = this.resolveType(\n typeNode,\n prototype.parent, // relative to function\n contextualTypeArguments,\n reportMode\n );\n if (!type) return null;\n returnType = type;\n }\n\n var signature = new Signature(parameterTypes, returnType, thisType);\n signature.parameterNames = parameterNames;\n signature.requiredParameters = requiredParameters;\n\n var nameInclTypeParameters = prototype.name;\n if (instanceKey.length) nameInclTypeParameters += \"<\" + instanceKey + \">\";\n var instance = new Function(\n nameInclTypeParameters,\n prototype,\n signature,\n contextualTypeArguments\n );\n prototype.setResolvedInstance(instanceKey, instance);\n return instance;\n }\n\n /** Resolves a function prototypeby first resolving the specified type arguments. */\n resolveFunctionInclTypeArguments(\n /** The prototype of the function. */\n prototype: FunctionPrototype,\n /** Type arguments provided. */\n typeArgumentNodes: CommonTypeNode[] | null,\n /** Relative context. Type arguments are resolved from here. */\n context: Element,\n /** Type arguments inherited through context, i.e. `T`. */\n contextualTypeArguments: Map,\n /** The node to use when reporting intermediate errors. */\n reportNode: Node,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Function | null {\n var actualParent = prototype.parent.kind == ElementKind.PROPERTY_PROTOTYPE\n ? prototype.parent.parent\n : prototype.parent;\n var resolvedTypeArguments: Type[] | null = null;\n\n // Resolve type arguments if generic\n if (prototype.is(CommonFlags.GENERIC)) {\n\n // If this is an instance method, first apply the class's type arguments\n if (prototype.is(CommonFlags.INSTANCE)) {\n assert(actualParent.kind == ElementKind.CLASS);\n let classTypeArguments = (actualParent).typeArguments;\n if (classTypeArguments) {\n let typeParameterNodes = assert((actualParent).prototype.typeParameterNodes);\n let numClassTypeArguments = classTypeArguments.length;\n assert(numClassTypeArguments == typeParameterNodes.length);\n for (let i = 0; i < numClassTypeArguments; ++i) {\n contextualTypeArguments.set(\n typeParameterNodes[i].name.text,\n classTypeArguments[i]\n );\n }\n }\n }\n\n resolvedTypeArguments = this.resolveTypeArguments( // reports\n assert(prototype.typeParameterNodes),\n typeArgumentNodes,\n context,\n contextualTypeArguments,\n reportNode,\n reportMode\n );\n if (!resolvedTypeArguments) return null;\n\n // Otherwise make sure that no type arguments have been specified\n } else {\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return null;\n }\n }\n\n // Continue with concrete types\n return this.resolveFunction(\n prototype,\n resolvedTypeArguments,\n contextualTypeArguments,\n reportMode\n );\n }\n\n /** Resolves a class prototype using the specified concrete type arguments. */\n resolveClass(\n /** The prototype of the class. */\n prototype: ClassPrototype,\n /** Concrete type arguments. */\n typeArguments: Type[] | null,\n /** Type arguments inherited through context, i.e. `T`. */\n contextualTypeArguments: Map = makeMap(),\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Class | null {\n var instanceKey = typeArguments ? typesToString(typeArguments) : \"\";\n\n // Check if this exact instance has already been resolved\n var instance = prototype.getResolvedInstance(instanceKey);\n if (instance) return instance;\n\n // Insert contextual type arguments for this operation. Internally, this method is always\n // called with matching type parameter / argument counts.\n if (typeArguments) {\n let typeParameterNodes = assert(prototype.typeParameterNodes);\n let numTypeParameters = typeParameterNodes.length;\n let numTypeArguments = typeArguments.length;\n assert(numTypeArguments == numTypeParameters);\n for (let i = 0; i < numTypeArguments; ++i) {\n contextualTypeArguments.set(typeParameterNodes[i].name.text, typeArguments[i]);\n }\n } else {\n let typeParameterNodes = prototype.typeParameterNodes;\n assert(!(typeParameterNodes && typeParameterNodes.length));\n }\n\n // Resolve base class if applicable\n var basePrototype = prototype.basePrototype;\n var baseClass: Class | null = null;\n if (basePrototype) {\n let extendsNode = assert(prototype.extendsNode); // must be present if it has a base prototype\n baseClass = this.resolveClassInclTypeArguments(\n basePrototype,\n extendsNode.typeArguments,\n prototype.parent, // relative to derived class\n makeMap(contextualTypeArguments), // don't inherit\n extendsNode,\n reportMode\n );\n if (!baseClass) return null;\n }\n\n // Construct the instance and remember that it has been resolved already\n var nameInclTypeParamters = prototype.name;\n if (instanceKey.length) nameInclTypeParamters += \"<\" + instanceKey + \">\";\n instance = new Class(nameInclTypeParamters, prototype, typeArguments, baseClass);\n instance.contextualTypeArguments = contextualTypeArguments;\n prototype.setResolvedInstance(instanceKey, instance);\n\n // Inherit base class members and set up the initial memory offset for own fields\n var memoryOffset: u32 = 0;\n if (baseClass) {\n let baseMembers = baseClass.members;\n if (baseMembers) {\n let instanceMembers = instance.members;\n if (!instanceMembers) instance.members = instanceMembers = new Map();\n for (let [baseMemberName, baseMember] of baseMembers) {\n instanceMembers.set(baseMemberName, baseMember);\n }\n }\n memoryOffset = baseClass.currentMemoryOffset;\n }\n\n // Resolve instance members\n var instanceMemberPrototypes = prototype.instanceMembers;\n if (instanceMemberPrototypes) {\n for (let member of instanceMemberPrototypes.values()) {\n switch (member.kind) {\n\n // Lay out fields in advance\n case ElementKind.FIELD_PROTOTYPE: {\n let instanceMembers = instance.members;\n if (!instanceMembers) instance.members = instanceMembers = new Map();\n else if (instanceMembers.has(member.name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n (member).identifierNode.range,\n member.name\n );\n break;\n }\n let fieldTypeNode = (member).typeNode;\n let fieldType: Type | null = null;\n // TODO: handle duplicate non-private fields specifically?\n if (!fieldTypeNode) {\n if (baseClass) {\n let baseMembers = baseClass.members;\n if (baseMembers && baseMembers.has((member).name)) {\n let baseField = baseMembers.get((member).name)!;\n if (!baseField.is(CommonFlags.PRIVATE)) {\n assert(baseField.kind == ElementKind.FIELD);\n fieldType = (baseField).type;\n }\n }\n }\n if (!fieldType) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_expected,\n (member).identifierNode.range.atEnd\n );\n }\n }\n } else {\n fieldType = this.resolveType(\n fieldTypeNode,\n prototype.parent, // relative to class\n instance.contextualTypeArguments,\n reportMode\n );\n }\n if (!fieldType) break; // did report above\n let fieldInstance = new Field(member, instance, fieldType);\n switch (fieldType.byteSize) { // align\n case 1: break;\n case 2: { if (memoryOffset & 1) ++memoryOffset; break; }\n case 4: { if (memoryOffset & 3) memoryOffset = (memoryOffset | 3) + 1; break; }\n case 8: { if (memoryOffset & 7) memoryOffset = (memoryOffset | 7) + 1; break; }\n default: assert(false);\n }\n fieldInstance.memoryOffset = memoryOffset;\n memoryOffset += fieldType.byteSize;\n instance.add(member.name, fieldInstance); // reports\n break;\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n let boundPrototype = (member).toBound(instance);\n instance.add(boundPrototype.name, boundPrototype); // reports\n break;\n }\n case ElementKind.PROPERTY_PROTOTYPE: {\n let propertyInstance = new Property(member, instance);\n let getterPrototype = (member).getterPrototype;\n if (getterPrototype) {\n let getterInstance = this.resolveFunction(\n getterPrototype.toBound(instance),\n null,\n makeMap(instance.contextualTypeArguments),\n reportMode\n );\n if (getterInstance) {\n propertyInstance.getterInstance = getterInstance;\n propertyInstance.setType(getterInstance.signature.returnType);\n }\n }\n let setterPrototype = (member).setterPrototype;\n if (setterPrototype) {\n let setterInstance = this.resolveFunction(\n setterPrototype.toBound(instance),\n null,\n makeMap(instance.contextualTypeArguments),\n reportMode\n );\n if (setterInstance) {\n propertyInstance.setterInstance = setterInstance;\n if (!propertyInstance.is(CommonFlags.RESOLVED)) {\n assert(setterInstance.signature.parameterTypes.length == 1);\n propertyInstance.setType(setterInstance.signature.parameterTypes[0]);\n }\n }\n }\n instance.add(propertyInstance.name, propertyInstance); // reports\n break;\n }\n default: assert(false);\n }\n }\n }\n\n // Finalize memory offset\n instance.currentMemoryOffset = memoryOffset;\n\n // Link _own_ constructor if present\n {\n let ctorPrototype = instance.lookupInSelf(CommonSymbols.constructor);\n if (ctorPrototype && ctorPrototype.parent === instance) {\n assert(ctorPrototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n let ctorInstance = this.resolveFunction(\n ctorPrototype,\n null,\n instance.contextualTypeArguments,\n reportMode\n );\n if (ctorInstance) instance.constructorInstance = ctorInstance;\n }\n }\n\n // Fully resolve operator overloads (don't have type parameters on their own)\n for (let [kind, overloadPrototype] of prototype.overloadPrototypes) {\n assert(kind != OperatorKind.INVALID);\n let operatorInstance: Function | null;\n if (overloadPrototype.is(CommonFlags.INSTANCE)) {\n let boundPrototype = overloadPrototype.toBound(instance);\n operatorInstance = this.resolveFunction(\n boundPrototype,\n null,\n makeMap(),\n reportMode\n );\n } else {\n operatorInstance = this.resolveFunction(\n overloadPrototype,\n null,\n makeMap(),\n reportMode\n );\n }\n if (!operatorInstance) continue;\n let overloads = instance.overloads;\n if (!overloads) instance.overloads = overloads = new Map();\n overloads.set(kind, operatorInstance);\n }\n return instance;\n }\n\n /** Resolves a class prototype by first resolving the specified type arguments. */\n resolveClassInclTypeArguments(\n /** The prototype of the class. */\n prototype: ClassPrototype,\n /** Type argument nodes provided. */\n typeArgumentNodes: CommonTypeNode[] | null,\n /** Relative context. Type arguments are resolved from here. */\n context: Element,\n /** Type arguments inherited through context, i.e. `T`. */\n contextualTypeArguments: Map,\n /** The node to use when reporting intermediate errors. */\n reportNode: Node,\n /** How to proceed with eventualy diagnostics. */\n reportMode: ReportMode = ReportMode.REPORT\n ): Class | null {\n var resolvedTypeArguments: Type[] | null = null;\n\n // Resolve type arguments if generic\n if (prototype.is(CommonFlags.GENERIC)) {\n resolvedTypeArguments = this.resolveTypeArguments( // reports\n assert(prototype.typeParameterNodes), // must be present if generic\n typeArgumentNodes,\n context,\n contextualTypeArguments,\n reportNode,\n reportMode\n );\n if (!resolvedTypeArguments) return null;\n\n // Otherwise make sure that no type arguments have been specified\n } else {\n if (typeArgumentNodes !== null && typeArgumentNodes.length) {\n if (reportMode == ReportMode.REPORT) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return null;\n }\n }\n\n // Continue with concrete types\n return this.resolveClass(\n prototype,\n resolvedTypeArguments,\n contextualTypeArguments,\n reportMode\n );\n }\n}\n","/**\n * The AssemblyScript compiler.\n * @module compiler\n *//***/\n\nimport {\n compileCall as compileBuiltinCall,\n compileAbort,\n compileIterateRoots,\n ensureGCHook,\n BuiltinSymbols\n} from \"./builtins\";\n\nimport {\n DiagnosticCode,\n DiagnosticEmitter\n} from \"./diagnostics\";\n\nimport {\n Module,\n MemorySegment,\n ExpressionRef,\n UnaryOp,\n BinaryOp,\n NativeType,\n FunctionRef,\n ExpressionId,\n FunctionTypeRef,\n GlobalRef,\n getExpressionId,\n getExpressionType,\n getConstValueI32,\n getConstValueI64Low,\n getConstValueI64High,\n getConstValueF32,\n getConstValueF64,\n getBlockChildCount,\n getBlockChild,\n getBlockName,\n needsExplicitUnreachable\n} from \"./module\";\n\nimport {\n CommonFlags,\n INSTANCE_DELIMITER,\n STATIC_DELIMITER,\n GETTER_PREFIX,\n SETTER_PREFIX,\n LibrarySymbols,\n CommonSymbols,\n INDEX_SUFFIX\n} from \"./common\";\n\nimport {\n Program,\n ClassPrototype,\n Class,\n Element,\n ElementKind,\n Enum,\n Field,\n FunctionPrototype,\n Function,\n FunctionTarget,\n Global,\n Local,\n EnumValue,\n Property,\n VariableLikeElement,\n ConstantValueKind,\n OperatorKind,\n DecoratorFlags,\n PropertyPrototype,\n File,\n mangleInternalName\n} from \"./program\";\n\nimport {\n FlowFlags,\n Flow\n} from \"./flow\";\n\nimport {\n Resolver, ReportMode\n} from \"./resolver\";\n\nimport {\n Token,\n operatorTokenToString\n} from \"./tokenizer\";\n\nimport {\n Node,\n NodeKind,\n TypeNode,\n Range,\n DecoratorKind,\n AssertionKind,\n\n Statement,\n BlockStatement,\n BreakStatement,\n ClassDeclaration,\n ContinueStatement,\n DeclarationStatement,\n DoStatement,\n EmptyStatement,\n EnumDeclaration,\n ExportStatement,\n ExpressionStatement,\n ForStatement,\n IfStatement,\n ImportStatement,\n InstanceOfExpression,\n InterfaceDeclaration,\n NamespaceDeclaration,\n ReturnStatement,\n SwitchStatement,\n ThrowStatement,\n TryStatement,\n VariableStatement,\n VoidStatement,\n WhileStatement,\n\n Expression,\n AssertionExpression,\n BinaryExpression,\n CallExpression,\n CommaExpression,\n ElementAccessExpression,\n FloatLiteralExpression,\n FunctionExpression,\n IdentifierExpression,\n IntegerLiteralExpression,\n LiteralExpression,\n LiteralKind,\n NewExpression,\n ObjectLiteralExpression,\n ParenthesizedExpression,\n PropertyAccessExpression,\n TernaryExpression,\n ArrayLiteralExpression,\n StringLiteralExpression,\n UnaryPostfixExpression,\n UnaryPrefixExpression,\n\n nodeIsConstantValue,\n findDecorator,\n FieldDeclaration,\n FunctionDeclaration\n} from \"./ast\";\n\nimport {\n Type,\n TypeKind,\n TypeFlags,\n Signature,\n\n typesToNativeTypes\n} from \"./types\";\n\nimport {\n writeI8,\n writeI16,\n writeI32,\n writeI64,\n writeF32,\n writeF64,\n makeMap\n} from \"./util\";\n\n/** Compilation target. */\nexport enum Target {\n /** WebAssembly with 32-bit pointers. */\n WASM32,\n /** WebAssembly with 64-bit pointers. Experimental and not supported by any runtime yet. */\n WASM64\n}\n\n/** Compiler options. */\nexport class Options {\n\n /** WebAssembly target. Defaults to {@link Target.WASM32}. */\n target: Target = Target.WASM32;\n /** If true, replaces assertions with nops. */\n noAssert: bool = false;\n /** If true, imports the memory provided by the embedder. */\n importMemory: bool = false;\n /** If greater than zero, declare memory as shared by setting max memory to sharedMemory. */\n sharedMemory: i32 = 0;\n /** If true, imports the function table provided by the embedder. */\n importTable: bool = false;\n /** If true, generates information necessary for source maps. */\n sourceMap: bool = false;\n /** Static memory start offset. */\n memoryBase: i32 = 0;\n /** Global aliases. */\n globalAliases: Map | null = null;\n /** Additional features to activate. */\n features: Feature = Feature.NONE;\n\n /** Hinted optimize level. Not applied by the compiler itself. */\n optimizeLevelHint: i32 = 0;\n /** Hinted shrink level. Not applied by the compiler itself. */\n shrinkLevelHint: i32 = 0;\n\n /** Tests if the target is WASM64 or, otherwise, WASM32. */\n get isWasm64(): bool {\n return this.target == Target.WASM64;\n }\n\n /** Gets the unsigned size type matching the target. */\n get usizeType(): Type {\n return this.target == Target.WASM64 ? Type.usize64 : Type.usize32;\n }\n\n /** Gets the signed size type matching the target. */\n get isizeType(): Type {\n return this.target == Target.WASM64 ? Type.isize64 : Type.isize32;\n }\n\n /** Gets the native size type matching the target. */\n get nativeSizeType(): NativeType {\n return this.target == Target.WASM64 ? NativeType.I64 : NativeType.I32;\n }\n\n /** Tests if a specific feature is activated. */\n hasFeature(feature: Feature): bool {\n return (this.features & feature) != 0;\n }\n}\n\n/** Indicates specific features to activate. */\nexport const enum Feature {\n /** No additional features. */\n NONE = 0,\n /** Sign extension operations. */\n SIGN_EXTENSION = 1 << 0, // see: https://github.com/WebAssembly/sign-extension-ops\n /** Mutable global imports and exports. */\n MUTABLE_GLOBAL = 1 << 1, // see: https://github.com/WebAssembly/mutable-global\n /** Bulk memory operations. */\n BULK_MEMORY = 1 << 2, // see: https://github.com/WebAssembly/bulk-memory-operations\n /** SIMD types and operations. */\n SIMD = 1 << 3, // see: https://github.com/WebAssembly/simd\n /** Threading and atomic operations. */\n THREADS = 1 << 4 // see: https://github.com/WebAssembly/threads\n}\n\n/** Indicates the desired kind of a conversion. */\nexport const enum ConversionKind {\n /** No conversion. */\n NONE,\n /** Implicit conversion. */\n IMPLICIT,\n /** Explicit conversion. */\n EXPLICIT\n}\n\n/** Indicates the desired wrap mode of a conversion. */\nexport const enum WrapMode {\n /** No wrapping. */\n NONE,\n /** Wrap small integer values. */\n WRAP\n}\n\n/** Compiler interface. */\nexport class Compiler extends DiagnosticEmitter {\n\n /** Program reference. */\n program: Program;\n /** Resolver reference. */\n resolver: Resolver;\n /** Provided options. */\n options: Options;\n /** Module instance being compiled. */\n module: Module;\n /** Current control flow. */\n currentFlow: Flow;\n /** Current inline functions stack. */\n currentInlineFunctions: Function[] = [];\n /** Current enum in compilation. */\n currentEnum: Enum | null = null;\n /** Current type in compilation. */\n currentType: Type = Type.void;\n /** Start function statements. */\n currentBody: ExpressionRef[];\n /** Counting memory offset. */\n memoryOffset: I64;\n /** Memory segments being compiled. */\n memorySegments: MemorySegment[] = [];\n /** Map of already compiled static string segments. */\n stringSegments: Map = new Map();\n /** Function table being compiled. */\n functionTable: string[] = [ \"null\" ];\n /** Argument count helper global. */\n argcVar: GlobalRef = 0;\n /** Argument count helper setter. */\n argcSet: FunctionRef = 0;\n /** Indicates whether the iterateRoots function must be generated. */\n needsIterateRoots: bool = false;\n\n /** Compiles a {@link Program} to a {@link Module} using the specified options. */\n static compile(program: Program, options: Options | null = null): Module {\n return new Compiler(program, options).compile();\n }\n\n /** Constructs a new compiler for a {@link Program} using the specified options. */\n constructor(program: Program, options: Options | null = null) {\n super(program.diagnostics);\n this.program = program;\n this.resolver = program.resolver;\n if (!options) options = new Options();\n this.options = options;\n this.memoryOffset = i64_new(\n // leave space for `null`. also functions as a sentinel for erroneous stores at offset 0.\n // note that Binaryen's asm.js output utilizes the first 8 bytes for reinterpretations (#1547)\n max(options.memoryBase, 8)\n );\n this.module = Module.create();\n }\n\n /** Performs compilation of the underlying {@link Program} to a {@link Module}. */\n compile(): Module {\n var options = this.options;\n var module = this.module;\n var program = this.program;\n\n // initialize lookup maps, built-ins, imports, exports, etc.\n program.initialize(options);\n\n // set up the main start function\n var startFunctionInstance = program.makeNativeFunction(\"start\", new Signature([], Type.void));\n startFunctionInstance.internalName = \"start\";\n var startFunctionBody = new Array();\n this.currentFlow = startFunctionInstance.flow;\n this.currentBody = startFunctionBody;\n\n // add a mutable heap base dummy\n if (options.isWasm64) {\n module.addGlobal(\n BuiltinSymbols.HEAP_BASE,\n NativeType.I64,\n true,\n module.createI64(0, 0)\n );\n } else {\n module.addGlobal(\n BuiltinSymbols.HEAP_BASE,\n NativeType.I32,\n false,\n module.createI32(0)\n );\n }\n\n // compile entry file(s) while traversing reachable elements\n var files = program.filesByName;\n for (let file of files.values()) {\n if (file.source.isEntry) {\n this.compileFile(file);\n this.compileExports(file);\n }\n }\n\n // compile the start function if not empty or called by main\n var explicitStartFunction = program.explicitStartFunction;\n if (startFunctionBody.length || explicitStartFunction) {\n let signature = startFunctionInstance.signature;\n let funcRef = module.addFunction(\n startFunctionInstance.internalName,\n this.ensureFunctionType(\n signature.parameterTypes,\n signature.returnType,\n signature.thisType\n ),\n typesToNativeTypes(startFunctionInstance.additionalLocals),\n module.createBlock(null, startFunctionBody)\n );\n startFunctionInstance.finalize(module, funcRef);\n if (!explicitStartFunction) module.setStart(funcRef);\n }\n\n // update the heap base pointer\n var memoryOffset = this.memoryOffset;\n memoryOffset = i64_align(memoryOffset, options.usizeType.byteSize);\n this.memoryOffset = memoryOffset;\n module.removeGlobal(BuiltinSymbols.HEAP_BASE);\n if (options.isWasm64) {\n module.addGlobal(\n BuiltinSymbols.HEAP_BASE,\n NativeType.I64,\n false,\n module.createI64(i64_low(memoryOffset), i64_high(memoryOffset))\n );\n } else {\n module.addGlobal(\n BuiltinSymbols.HEAP_BASE,\n NativeType.I32,\n false,\n module.createI32(i64_low(memoryOffset))\n );\n }\n\n // set up memory\n var isSharedMemory = options.hasFeature(Feature.THREADS) && options.sharedMemory > 0;\n module.setMemory(\n this.options.memoryBase /* is specified */ || this.memorySegments.length\n ? i64_low(i64_shr_u(i64_align(memoryOffset, 0x10000), i64_new(16, 0)))\n : 0,\n isSharedMemory ? options.sharedMemory : Module.UNLIMITED_MEMORY,\n this.memorySegments,\n options.target,\n \"memory\"\n );\n\n // import memory if requested (default memory is named '0' by Binaryen)\n if (options.importMemory) module.addMemoryImport(\"0\", \"env\", \"memory\", isSharedMemory);\n\n // set up function table\n var functionTable = this.functionTable;\n module.setFunctionTable(functionTable.length, 0xffffffff, functionTable);\n module.addTableExport(\"0\", \"table\");\n module.addFunction(\"null\", this.ensureFunctionType(null, Type.void), null, module.createBlock(null, []));\n\n // import table if requested (default table is named '0' by Binaryen)\n if (options.importTable) module.addTableImport(\"0\", \"env\", \"table\");\n\n // set up module exports\n for (let file of this.program.filesByName.values()) {\n if (file.source.isEntry) this.makeModuleExports(file);\n }\n\n // set up gc\n if (this.needsIterateRoots) compileIterateRoots(this);\n\n return module;\n }\n\n /** Applies the respective module exports for the specified file. */\n private makeModuleExports(file: File): void {\n var members = file.exports;\n if (members) for (let [name, member] of members) this.makeModuleExport(name, member);\n var exportsStar = file.exportsStar;\n if (exportsStar) {\n for (let i = 0, k = exportsStar.length; i < k; ++i) this.makeModuleExports(exportsStar[i]);\n }\n }\n\n /** Applies the respective module export(s) for the specified element. */\n private makeModuleExport(name: string, element: Element, prefix: string = \"\"): void {\n switch (element.kind) {\n\n // traverse instances\n case ElementKind.FUNCTION_PROTOTYPE: {\n let instances = (element).instances;\n if (instances) {\n for (let instance of instances.values()) {\n let instanceName = name;\n if (instance.is(CommonFlags.GENERIC)) {\n let fullName = instance.internalName;\n instanceName += fullName.substring(fullName.lastIndexOf(\"<\"));\n }\n this.makeModuleExport(instanceName, instance, prefix);\n }\n }\n break;\n }\n case ElementKind.CLASS_PROTOTYPE: {\n let instances = (element).instances;\n if (instances) {\n for (let instance of instances.values()) {\n let instanceName = name;\n if (instance.is(CommonFlags.GENERIC)) {\n let fullName = instance.internalName;\n instanceName += fullName.substring(fullName.lastIndexOf(\"<\"));\n }\n this.makeModuleExport(instanceName, instance, prefix);\n }\n }\n break;\n }\n case ElementKind.PROPERTY_PROTOTYPE: {\n let getter = (element).getterPrototype;\n let setter = (element).setterPrototype;\n if (getter) this.makeModuleExport(GETTER_PREFIX + name, getter, prefix);\n if (setter) this.makeModuleExport(SETTER_PREFIX + name, setter, prefix);\n break;\n }\n\n // export concrete elements\n case ElementKind.GLOBAL: {\n let isConst = element.is(CommonFlags.CONST) || element.is(CommonFlags.STATIC | CommonFlags.READONLY);\n if (!isConst && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\n this.error(\n DiagnosticCode.Cannot_export_a_mutable_global,\n (element).identifierNode.range\n );\n } else {\n this.module.addGlobalExport(element.internalName, prefix + name);\n }\n break;\n }\n case ElementKind.ENUMVALUE: {\n if (!assert(element.parent).is(CommonFlags.CONST) && !this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\n this.error(\n DiagnosticCode.Cannot_export_a_mutable_global,\n (element).identifierNode.range\n );\n } else {\n this.module.addGlobalExport(element.internalName, prefix + name);\n }\n break;\n }\n case ElementKind.FUNCTION: {\n let instance = element;\n let signature = instance.signature;\n if (signature.requiredParameters < signature.parameterTypes.length) {\n // utilize trampoline to fill in omitted arguments\n instance = this.ensureTrampoline(instance);\n this.ensureArgcSet();\n }\n let returnTypePostFix = (!name.endsWith(\"constructor\") && signature.returnType.is(TypeFlags.REFERENCE))\n ? \"!\" + signature.returnType.toString()\n : \"\";\n if (instance.is(CommonFlags.COMPILED)) {\n this.module.addFunctionExport(instance.internalName, prefix + name + returnTypePostFix);\n }\n break;\n }\n case ElementKind.PROPERTY: {\n let getter = (element).getterInstance;\n if (getter) this.makeModuleExport(GETTER_PREFIX + name, getter, prefix);\n let setter = (element).setterInstance;\n if (setter) this.makeModuleExport(SETTER_PREFIX + name, setter, prefix);\n break;\n }\n case ElementKind.FIELD: {\n let module = this.module;\n let type = (element).type;\n let nativeType = type.toNativeType();\n let offset = (element).memoryOffset;\n let usizeType = this.options.usizeType;\n let nativeSizeType = this.options.nativeSizeType;\n\n // make a getter\n let getterName = prefix + GETTER_PREFIX + name;\n module.addFunction(\n getterName,\n this.ensureFunctionType(null, type, usizeType),\n null,\n module.createLoad(\n type.byteSize,\n type.is(TypeFlags.SIGNED),\n module.createGetLocal(0, nativeSizeType),\n nativeType,\n offset\n )\n );\n module.addFunctionExport(getterName, getterName);\n\n // make a setter\n if (!element.is(CommonFlags.READONLY)) {\n let setterName = prefix + SETTER_PREFIX + name;\n module.addFunction(\n setterName,\n this.ensureFunctionType([ type ], Type.void, usizeType),\n null,\n module.createStore(\n type.byteSize,\n module.createGetLocal(0, nativeSizeType),\n module.createGetLocal(1, nativeType),\n nativeType,\n offset\n )\n );\n module.addFunctionExport(setterName, setterName);\n }\n break;\n }\n\n // just traverse members below\n case ElementKind.ENUM:\n case ElementKind.CLASS:\n case ElementKind.NAMESPACE:\n case ElementKind.FILE:\n case ElementKind.TYPEDEFINITION: break;\n\n default: assert(false); // unexpected module export\n }\n\n // traverse members\n var members = element.members;\n if (members) {\n let subPrefix = prefix + name + (element.kind == ElementKind.CLASS\n ? INSTANCE_DELIMITER\n : STATIC_DELIMITER\n );\n if (\n element.kind == ElementKind.NAMESPACE ||\n element.kind == ElementKind.FILE\n ) {\n for (let member of members.values()) {\n if (!member.is(CommonFlags.EXPORT)) continue;\n this.makeModuleExport(member.name, member, subPrefix);\n }\n } else {\n for (let member of members.values()) {\n if (member.is(CommonFlags.PRIVATE)) continue;\n this.makeModuleExport(member.name, member, subPrefix);\n }\n }\n }\n }\n\n // general\n\n /** Compiles any element. */\n compileElement(element: Element, compileMembers: bool = true): void {\n switch (element.kind) {\n case ElementKind.GLOBAL: {\n this.compileGlobal(element);\n break;\n }\n case ElementKind.ENUM: {\n this.compileEnum(element);\n break;\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (!element.is(CommonFlags.GENERIC)) {\n this.compileFunctionUsingTypeArguments(element, []);\n }\n break;\n }\n case ElementKind.CLASS_PROTOTYPE: {\n if (!element.is(CommonFlags.GENERIC)) {\n this.compileClassUsingTypeArguments(element, []);\n }\n break;\n }\n case ElementKind.PROPERTY_PROTOTYPE: {\n let getterPrototype = (element).getterPrototype;\n if (getterPrototype) {\n this.compileFunctionUsingTypeArguments(getterPrototype, []);\n }\n let setterPrototype = (element).setterPrototype;\n if (setterPrototype) {\n this.compileFunctionUsingTypeArguments(setterPrototype, []);\n }\n break;\n }\n case ElementKind.NAMESPACE:\n case ElementKind.TYPEDEFINITION:\n case ElementKind.ENUMVALUE: break;\n default: assert(false, ElementKind[element.kind]);\n }\n if (compileMembers) this.compileMembers(element);\n }\n\n /** Compiles an element's members. */\n compileMembers(element: Element): void {\n var members = element.members;\n if (members) for (let element of members.values()) this.compileElement(element);\n }\n\n /** Compiles a file's exports. */\n compileExports(file: File): void {\n var exports = file.exports;\n if (exports) for (let element of exports.values()) this.compileElement(element);\n var exportsStar = file.exportsStar;\n if (exportsStar) for (let exportStar of exportsStar) this.compileFile(exportStar);\n }\n\n // files\n\n /** Compiles the file matching the specified path. */\n compileFileByPath(normalizedPathWithoutExtension: string, reportNode: Node): void {\n var file: File;\n var filesByName = this.program.filesByName;\n var pathWithIndex: string;\n if (filesByName.has(normalizedPathWithoutExtension)) {\n file = filesByName.get(normalizedPathWithoutExtension)!;\n } else if (filesByName.has(pathWithIndex = normalizedPathWithoutExtension + INDEX_SUFFIX)) {\n file = filesByName.get(pathWithIndex)!;\n } else {\n this.error(\n DiagnosticCode.File_0_not_found,\n reportNode.range, normalizedPathWithoutExtension\n );\n return;\n }\n this.compileFile(file);\n }\n\n /** Compiles the specified file. */\n compileFile(file: File): void {\n if (file.is(CommonFlags.COMPILED)) return;\n file.set(CommonFlags.COMPILED);\n\n // compile top-level statements within the file's start function\n var startFunction = file.startFunction;\n var previousBody = this.currentBody;\n var startFunctionBody = new Array();\n this.currentBody = startFunctionBody;\n\n // compile top-level statements\n var previousFlow = this.currentFlow;\n this.currentFlow = startFunction.flow;\n for (let statements = file.source.statements, i = 0, k = statements.length; i < k; ++i) {\n this.compileTopLevelStatement(statements[i], startFunctionBody);\n }\n this.currentFlow = previousFlow;\n this.currentBody = previousBody;\n\n // if top-level statements are present, make the per-file start function and call it in start\n if (startFunctionBody.length) {\n let module = this.module;\n let locals = startFunction.localsByIndex;\n let numLocals = locals.length;\n let varTypes = new Array(numLocals);\n for (let i = 0; i < numLocals; ++i) varTypes[i] = locals[i].type.toNativeType();\n module.addFunction(\n startFunction.internalName,\n this.ensureFunctionType(startFunction.signature.parameterTypes, startFunction.signature.returnType),\n varTypes,\n startFunctionBody.length > 1\n ? module.createBlock(null, startFunctionBody)\n : startFunctionBody[0]\n );\n previousBody.push(\n module.createCall(startFunction.internalName, null, NativeType.None)\n );\n }\n }\n\n // globals\n\n compileGlobal(global: Global): bool {\n if (global.is(CommonFlags.COMPILED)) return true;\n global.set(CommonFlags.COMPILED);\n\n var module = this.module;\n var initExpr: ExpressionRef = 0;\n var typeNode = global.typeNode;\n var initializerNode = global.initializerNode;\n\n if (!global.is(CommonFlags.RESOLVED)) {\n\n // resolve now if annotated\n if (typeNode) {\n let resolvedType = this.resolver.resolveType(typeNode, global.parent); // reports\n if (!resolvedType) return false;\n if (resolvedType == Type.void) {\n this.error(\n DiagnosticCode.Type_expected,\n typeNode.range\n );\n return false;\n }\n global.setType(resolvedType);\n\n // infer from initializer if not annotated\n } else if (initializerNode) { // infer type using void/NONE for literal inference\n let previousFlow = this.currentFlow;\n if (global.hasDecorator(DecoratorFlags.LAZY)) {\n this.currentFlow = global.file.startFunction.flow;\n }\n initExpr = this.compileExpressionRetainType( // reports\n initializerNode,\n Type.void,\n WrapMode.WRAP\n );\n this.currentFlow = previousFlow;\n if (this.currentType == Type.void) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n initializerNode.range, this.currentType.toString(), \"\"\n );\n return false;\n }\n global.setType(this.currentType);\n\n // must either be annotated or have an initializer\n } else {\n this.error(\n DiagnosticCode.Type_expected,\n global.identifierNode.range.atEnd\n );\n return false;\n }\n }\n\n // ambient builtins like 'HEAP_BASE' need to be resolved but are added explicitly\n if (global.is(CommonFlags.AMBIENT) && global.hasDecorator(DecoratorFlags.BUILTIN)) return true;\n\n var nativeType = global.type.toNativeType();\n var isDeclaredConstant = global.is(CommonFlags.CONST) || global.is(CommonFlags.STATIC | CommonFlags.READONLY);\n\n // handle imports\n if (global.is(CommonFlags.AMBIENT)) {\n\n // constant global\n if (isDeclaredConstant || this.options.hasFeature(Feature.MUTABLE_GLOBAL)) {\n global.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(global, global.declaration);\n module.addGlobalImport(\n global.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n nativeType\n );\n global.set(CommonFlags.COMPILED);\n return true;\n\n // importing mutable globals is not supported in the MVP\n } else {\n this.error(\n DiagnosticCode.Operation_not_supported,\n global.declaration.range\n );\n }\n return false;\n }\n\n // the MVP does not yet support initializer expressions other than constant values (and constant\n // get_globals), hence such initializations must be performed in the start function for now.\n var initializeInStart = false;\n\n // evaluate initializer if present\n if (initializerNode) {\n if (!initExpr) {\n let previousFlow = this.currentFlow;\n if (global.hasDecorator(DecoratorFlags.LAZY)) {\n this.currentFlow = global.file.startFunction.flow;\n }\n initExpr = this.compileExpression(\n initializerNode,\n global.type,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP\n );\n this.currentFlow = previousFlow;\n }\n\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n if (isDeclaredConstant) {\n initExpr = module.precomputeExpression(initExpr);\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n this.warning(\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\n initializerNode.range\n );\n initializeInStart = true;\n }\n } else {\n initializeInStart = true;\n }\n }\n\n // explicitly inline if annotated\n if (global.hasDecorator(DecoratorFlags.INLINE)) {\n if (!initializeInStart) { // reported above\n assert(getExpressionId(initExpr) == ExpressionId.Const);\n let exprType = getExpressionType(initExpr);\n switch (exprType) {\n case NativeType.I32: {\n global.constantValueKind = ConstantValueKind.INTEGER;\n global.constantIntegerValue = i64_new(getConstValueI32(initExpr), 0);\n break;\n }\n case NativeType.I64: {\n global.constantValueKind = ConstantValueKind.INTEGER;\n global.constantIntegerValue = i64_new(\n getConstValueI64Low(initExpr),\n getConstValueI64High(initExpr)\n );\n break;\n }\n case NativeType.F32: {\n global.constantValueKind = ConstantValueKind.FLOAT;\n global.constantFloatValue = getConstValueF32(initExpr);\n break;\n }\n case NativeType.F64: {\n global.constantValueKind = ConstantValueKind.FLOAT;\n global.constantFloatValue = getConstValueF64(initExpr);\n break;\n }\n default: {\n assert(false);\n return false;\n }\n }\n global.set(CommonFlags.INLINED); // inline the value from now on\n }\n }\n\n // initialize to zero if there's no initializer\n } else {\n initExpr = global.type.toNativeZero(module);\n }\n\n var internalName = global.internalName;\n\n if (initializeInStart) { // initialize to mutable zero and set the actual value in start\n if (global.hasDecorator(DecoratorFlags.INLINE)) {\n this.error(\n DiagnosticCode.Decorator_0_is_not_valid_here,\n global.identifierNode.range, \"inline\"\n );\n }\n module.addGlobal(internalName, nativeType, true, global.type.toNativeZero(module));\n this.currentBody.push(module.createSetGlobal(internalName, initExpr));\n\n } else if (!global.hasDecorator(DecoratorFlags.INLINE)) { // compile normally\n module.addGlobal(internalName, nativeType, !isDeclaredConstant, initExpr);\n }\n return true;\n }\n\n // enums\n\n compileEnum(element: Enum): bool {\n if (element.is(CommonFlags.COMPILED)) return true;\n element.set(CommonFlags.COMPILED);\n\n var module = this.module;\n this.currentEnum = element;\n var previousValue: EnumValue | null = null;\n var previousValueIsMut = false;\n var isInline = element.is(CommonFlags.CONST) || element.hasDecorator(DecoratorFlags.INLINE);\n\n if (element.members) {\n for (let member of element.members.values()) {\n if (member.kind != ElementKind.ENUMVALUE) continue; // happens if an enum is also a namespace\n let initInStart = false;\n let val = member;\n let valueNode = val.valueNode;\n val.set(CommonFlags.COMPILED);\n let previousFlow = this.currentFlow;\n if (element.hasDecorator(DecoratorFlags.LAZY)) {\n this.currentFlow = element.file.startFunction.flow;\n }\n let initExpr: ExpressionRef;\n if (valueNode) {\n initExpr = this.compileExpression(\n valueNode,\n Type.i32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n if (element.is(CommonFlags.CONST)) {\n initExpr = module.precomputeExpression(initExpr);\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n this.error(\n DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,\n valueNode.range\n );\n initInStart = true;\n }\n } else {\n initInStart = true;\n }\n }\n } else if (previousValue == null) {\n initExpr = module.createI32(0);\n } else {\n if (previousValueIsMut) {\n this.error(\n DiagnosticCode.Enum_member_must_have_initializer,\n (member).identifierNode.range.atEnd\n );\n }\n initExpr = module.createBinary(BinaryOp.AddI32,\n module.createGetGlobal(previousValue.internalName, NativeType.I32),\n module.createI32(1)\n );\n initExpr = module.precomputeExpression(initExpr);\n if (getExpressionId(initExpr) != ExpressionId.Const) {\n if (element.is(CommonFlags.CONST)) {\n this.error(\n DiagnosticCode.In_const_enum_declarations_member_initializer_must_be_constant_expression,\n member.declaration.range\n );\n }\n initInStart = true;\n }\n }\n this.currentFlow = previousFlow;\n if (initInStart) {\n module.addGlobal(val.internalName, NativeType.I32, true, module.createI32(0));\n this.currentBody.push(\n module.createSetGlobal(val.internalName, initExpr)\n );\n previousValueIsMut = true;\n } else {\n if (isInline) {\n val.setConstantIntegerValue(i64_new(getConstValueI32(initExpr)), Type.i32);\n if (val.is(CommonFlags.MODULE_EXPORT)) {\n module.addGlobal(val.internalName, NativeType.I32, false, initExpr);\n }\n } else {\n module.addGlobal(val.internalName, NativeType.I32, true, initExpr);\n }\n previousValueIsMut = false;\n }\n previousValue = val;\n }\n }\n this.currentEnum = null;\n return true;\n }\n\n // functions\n\n /** Resolves the specified type arguments prior to compiling the resulting function instance. */\n compileFunctionUsingTypeArguments(\n prototype: FunctionPrototype,\n typeArguments: TypeNode[],\n contextualTypeArguments: Map = makeMap(),\n alternativeReportNode: Node | null = null\n ): Function | null {\n if (prototype.hasDecorator(DecoratorFlags.BUILTIN)) return null;\n var instance = this.resolver.resolveFunctionInclTypeArguments(\n prototype,\n typeArguments,\n prototype.parent, // relative to itself\n contextualTypeArguments,\n alternativeReportNode || prototype.declaration\n );\n if (!instance) return null;\n if (!this.compileFunction(instance)) return null; // reports\n return instance;\n }\n\n /** Either reuses or creates the function type matching the specified signature. */\n ensureFunctionType(\n parameterTypes: Type[] | null,\n returnType: Type,\n thisType: Type | null = null\n ): FunctionTypeRef {\n var numParameters = parameterTypes ? parameterTypes.length : 0;\n var paramTypes: NativeType[];\n var index = 0;\n if (thisType) {\n paramTypes = new Array(1 + numParameters);\n paramTypes[0] = thisType.toNativeType();\n index = 1;\n } else {\n paramTypes = new Array(numParameters);\n }\n if (parameterTypes) {\n for (let i = 0; i < numParameters; ++i, ++index) {\n paramTypes[index] = parameterTypes[i].toNativeType();\n }\n }\n var resultType = returnType.toNativeType();\n var module = this.module;\n var typeRef = module.getFunctionTypeBySignature(resultType, paramTypes);\n if (!typeRef) {\n let name = Signature.makeSignatureString(parameterTypes, returnType, thisType);\n typeRef = module.addFunctionType(name, resultType, paramTypes);\n }\n return typeRef;\n }\n\n /** Compiles the body of a function within the specified flow. */\n private compileFunctionBody(instance: Function): ExpressionRef[] {\n var module = this.module;\n var bodyNode = assert(instance.prototype.bodyNode);\n var returnType = instance.signature.returnType;\n var flow = this.currentFlow;\n\n // compile statements\n var stmts: BinaryenExportRef[];\n if (bodyNode.kind == NodeKind.BLOCK) {\n stmts = this.compileStatements((bodyNode).statements, true);\n } else {\n // must be an expression statement if not a block\n assert(bodyNode.kind == NodeKind.EXPRESSION);\n\n // must be an arrow function\n assert(instance.is(CommonFlags.ARROW));\n\n // none of the following can be an arrow function\n assert(!instance.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.GET | CommonFlags.SET | CommonFlags.MAIN));\n\n let stmt = this.compileExpression(\n (bodyNode).expression,\n returnType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n flow.set(FlowFlags.RETURNS);\n if (!flow.canOverflow(stmt, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\n stmts = [ stmt ];\n }\n\n // make the main function call `start` implicitly, but only once\n if (instance.prototype == this.program.explicitStartFunction) {\n module.addGlobal(CompilerSymbols.started, NativeType.I32, true, module.createI32(0));\n stmts.unshift(\n module.createIf(\n module.createUnary(\n UnaryOp.EqzI32,\n module.createGetGlobal(CompilerSymbols.started, NativeType.I32)\n ),\n module.createBlock(null, [\n module.createCall(\"start\", null, NativeType.None),\n module.createSetGlobal(CompilerSymbols.started, module.createI32(1))\n ])\n )\n );\n }\n\n // make constructors return their instance pointer\n if (instance.is(CommonFlags.CONSTRUCTOR)) {\n let nativeSizeType = this.options.nativeSizeType;\n assert(instance.is(CommonFlags.INSTANCE));\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\n\n if (!flow.isAny(FlowFlags.ANY_TERMINATING)) {\n let thisLocalIndex = flow.is(FlowFlags.INLINE_CONTEXT)\n ? assert(flow.lookupLocal(CommonSymbols.this_)).index\n : 0;\n\n // if `this` wasn't accessed before, allocate if necessary and initialize `this`\n if (!flow.is(FlowFlags.ALLOCATES)) {\n // {\n // if (!this) this = \n // this.a = X\n // this.b = Y\n // }\n stmts.push(\n module.createIf(\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\n module.createGetLocal(thisLocalIndex, nativeSizeType)\n ),\n module.createSetLocal(thisLocalIndex,\n this.makeAllocation(classInstance)\n )\n )\n );\n this.makeFieldInitialization(classInstance, stmts);\n }\n\n // implicitly return `this`\n stmts.push(\n module.createGetLocal(thisLocalIndex, nativeSizeType)\n );\n }\n\n // check that super has been called if this is a derived class\n if ((classInstance).base && !flow.is(FlowFlags.CALLS_SUPER)) {\n this.error(\n DiagnosticCode.Constructors_for_derived_classes_must_contain_a_super_call,\n instance.prototype.declaration.range\n );\n }\n\n // if this is a normal function, make sure that all branches return\n } else if (returnType != Type.void && !flow.is(FlowFlags.RETURNS)) {\n this.error(\n DiagnosticCode.A_function_whose_declared_type_is_not_void_must_return_a_value,\n instance.prototype.signatureNode.returnType.range\n );\n }\n\n return stmts;\n }\n\n /** Compiles a readily resolved function instance. */\n compileFunction(instance: Function): bool {\n if (instance.is(CommonFlags.COMPILED)) return true;\n assert(!(instance.is(CommonFlags.AMBIENT) && instance.hasDecorator(DecoratorFlags.BUILTIN)));\n instance.set(CommonFlags.COMPILED);\n\n var module = this.module;\n var signature = instance.signature;\n var bodyNode = instance.prototype.bodyNode;\n\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var funcRef: FunctionRef;\n\n // concrete function\n if (bodyNode) {\n\n // must not be ambient\n if (instance.is(CommonFlags.AMBIENT)) {\n this.error(\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\n instance.identifierNode.range\n );\n }\n\n // cannot have an annotated external name\n if (instance.hasDecorator(DecoratorFlags.EXTERNAL)) {\n let decoratorNodes = instance.decoratorNodes;\n let decorator = assert(findDecorator(DecoratorKind.EXTERNAL, decoratorNodes));\n this.error(\n DiagnosticCode.Operation_not_supported,\n decorator.range\n );\n }\n\n // compile body in this function's context\n let previousFlow = this.currentFlow;\n this.currentFlow = instance.flow;\n let stmts = this.compileFunctionBody(instance);\n this.currentFlow = previousFlow;\n\n // create the function\n funcRef = module.addFunction(\n instance.internalName,\n typeRef,\n typesToNativeTypes(instance.additionalLocals),\n stmts.length\n ? stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, instance.signature.returnType.toNativeType())\n : module.createNop()\n );\n\n // imported function\n } else {\n if (!instance.is(CommonFlags.AMBIENT)) {\n this.error(\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\n instance.identifierNode.range\n );\n }\n\n instance.set(CommonFlags.MODULE_IMPORT);\n mangleImportName(instance, instance.declaration); // TODO: check for duplicates\n\n // create the import\n funcRef = module.addFunctionImport(\n instance.internalName,\n mangleImportName_moduleName,\n mangleImportName_elementName,\n typeRef\n );\n }\n\n instance.finalize(module, funcRef);\n return true;\n }\n\n // classes\n\n compileClassUsingTypeArguments(\n prototype: ClassPrototype,\n typeArguments: TypeNode[],\n contextualTypeArguments: Map = makeMap(),\n alternativeReportNode: Node | null = null\n ): void {\n var instance = this.resolver.resolveClassInclTypeArguments(\n prototype,\n typeArguments,\n prototype.parent, // relative to itself\n contextualTypeArguments,\n alternativeReportNode || prototype.declaration\n );\n if (!instance) return;\n this.compileClass(instance);\n }\n\n compileClass(instance: Class): bool {\n if (instance.is(CommonFlags.COMPILED)) return true;\n instance.set(CommonFlags.COMPILED);\n var prototype = instance.prototype;\n var staticMembers = (prototype).members;\n if (staticMembers) {\n for (let element of staticMembers.values()) {\n switch (element.kind) {\n case ElementKind.GLOBAL: {\n this.compileGlobal(element);\n break;\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (\n !(element).is(CommonFlags.GENERIC)\n ) {\n this.compileFunctionUsingTypeArguments(\n element,\n [],\n makeMap(),\n (element).identifierNode\n );\n }\n break;\n }\n case ElementKind.PROPERTY_PROTOTYPE: {\n let getter = (element).getterPrototype;\n if (getter) {\n this.compileFunctionUsingTypeArguments(\n getter,\n [],\n makeMap(),\n getter.identifierNode\n );\n }\n let setter = (element).setterPrototype;\n if (setter) {\n this.compileFunctionUsingTypeArguments(\n setter,\n [],\n makeMap(),\n setter.identifierNode\n );\n }\n break;\n }\n case ElementKind.PROPERTY: {\n }\n }\n }\n }\n var ctorInstance = instance.constructorInstance;\n if (ctorInstance) this.compileFunction(ctorInstance);\n var instanceMembers = instance.members;\n if (instanceMembers) {\n for (let element of instanceMembers.values()) {\n switch (element.kind) {\n case ElementKind.FUNCTION_PROTOTYPE: {\n if (\n !(element).is(CommonFlags.GENERIC)\n ) {\n this.compileFunctionUsingTypeArguments(\n element,\n [],\n makeMap(instance.contextualTypeArguments),\n (element).declaration.name\n );\n }\n break;\n }\n case ElementKind.FIELD_PROTOTYPE: {\n element.set(CommonFlags.COMPILED);\n break;\n }\n case ElementKind.PROPERTY: {\n let getter = (element).getterInstance;\n if (getter) this.compileFunction(getter);\n let setter = (element).setterInstance;\n if (setter) this.compileFunction(setter);\n break;\n }\n }\n }\n }\n return true;\n }\n\n compileInterfaceDeclaration(\n declaration: InterfaceDeclaration,\n typeArguments: TypeNode[],\n contextualTypeArguments: Map | null = null,\n alternativeReportNode: Node | null = null\n ): void {\n // TODO\n this.error(\n DiagnosticCode.Operation_not_supported,\n declaration.range\n );\n }\n\n // memory\n\n /** Adds a static memory segment with the specified data. */\n addMemorySegment(buffer: Uint8Array, alignment: i32 = 8): MemorySegment {\n var memoryOffset = i64_align(this.memoryOffset, alignment);\n var segment = MemorySegment.create(buffer, memoryOffset);\n this.memorySegments.push(segment);\n this.memoryOffset = i64_add(memoryOffset, i64_new(buffer.length, 0));\n return segment;\n }\n\n // function table\n\n /** Ensures that a table entry exists for the specified function and returns its index. */\n ensureFunctionTableEntry(func: Function): i32 {\n assert(func.is(CommonFlags.COMPILED));\n if (func.functionTableIndex >= 0) {\n return func.functionTableIndex;\n }\n var functionTable = this.functionTable;\n var index = functionTable.length;\n if (!func.is(CommonFlags.TRAMPOLINE) && func.signature.requiredParameters < func.signature.parameterTypes.length) {\n // insert the trampoline if the function has optional parameters\n func = this.ensureTrampoline(func);\n }\n functionTable.push(func.internalName);\n func.functionTableIndex = index;\n return index;\n }\n\n // statements\n\n compileTopLevelStatement(statement: Statement, body: ExpressionRef[]): void {\n switch (statement.kind) {\n case NodeKind.CLASSDECLARATION: {\n let memberStatements = (statement).members;\n for (let i = 0, k = memberStatements.length; i < k; ++i) {\n this.compileTopLevelStatement(memberStatements[i], body);\n }\n break;\n }\n case NodeKind.ENUMDECLARATION: {\n let element = this.program.getElementByDeclaration(statement);\n assert(element.kind == ElementKind.ENUM);\n if (!element.hasDecorator(DecoratorFlags.LAZY)) this.compileEnum(element);\n break;\n }\n case NodeKind.NAMESPACEDECLARATION: {\n let memberStatements = (statement).members;\n for (let i = 0, k = memberStatements.length; i < k; ++i) {\n this.compileTopLevelStatement(memberStatements[i], body);\n }\n break;\n }\n case NodeKind.VARIABLE: {\n let declarations = (statement).declarations;\n for (let i = 0, k = declarations.length; i < k; ++i) {\n let element = this.program.getElementByDeclaration(declarations[i]);\n assert(element.kind == ElementKind.GLOBAL);\n if (\n !element.is(CommonFlags.AMBIENT) && // delay imports\n !element.hasDecorator(DecoratorFlags.LAZY)\n ) this.compileGlobal(element);\n }\n break;\n }\n case NodeKind.FIELDDECLARATION: {\n let element = this.program.getElementByDeclaration(statement);\n if (element.kind == ElementKind.GLOBAL) { // static\n if (!element.hasDecorator(DecoratorFlags.LAZY)) this.compileGlobal(element);\n }\n break;\n }\n case NodeKind.EXPORT: {\n if ((statement).normalizedPath != null) {\n this.compileFileByPath(\n (statement).normalizedPath,\n (statement).path\n );\n }\n break;\n }\n case NodeKind.IMPORT: {\n this.compileFileByPath(\n (statement).normalizedPath,\n (statement).path\n );\n break;\n }\n case NodeKind.FUNCTIONDECLARATION:\n case NodeKind.METHODDECLARATION:\n case NodeKind.INTERFACEDECLARATION:\n case NodeKind.INDEXSIGNATUREDECLARATION:\n case NodeKind.TYPEDECLARATION: break;\n default: { // otherwise a top-level statement that is part of the start function's body\n let stmt = this.compileStatement(statement);\n if (getExpressionId(stmt) != ExpressionId.Nop) body.push(stmt);\n break;\n }\n }\n }\n\n compileStatement(statement: Statement, isLastStatementInBody: bool = false): ExpressionRef {\n var module = this.module;\n var stmt: ExpressionRef;\n switch (statement.kind) {\n case NodeKind.BLOCK: {\n stmt = this.compileBlockStatement(statement);\n break;\n }\n case NodeKind.BREAK: {\n stmt = this.compileBreakStatement(statement);\n break;\n }\n case NodeKind.CONTINUE: {\n stmt = this.compileContinueStatement(statement);\n break;\n }\n case NodeKind.DO: {\n stmt = this.compileDoStatement(statement);\n break;\n }\n case NodeKind.EMPTY: {\n stmt = this.compileEmptyStatement(statement);\n break;\n }\n case NodeKind.EXPRESSION: {\n stmt = this.compileExpressionStatement(statement);\n break;\n }\n case NodeKind.FOR: {\n stmt = this.compileForStatement(statement);\n break;\n }\n case NodeKind.IF: {\n stmt = this.compileIfStatement(statement);\n break;\n }\n case NodeKind.RETURN: {\n stmt = this.compileReturnStatement(statement, isLastStatementInBody);\n break;\n }\n case NodeKind.SWITCH: {\n stmt = this.compileSwitchStatement(statement);\n break;\n }\n case NodeKind.THROW: {\n stmt = this.compileThrowStatement(statement);\n break;\n }\n case NodeKind.TRY: {\n stmt = this.compileTryStatement(statement);\n break;\n }\n case NodeKind.VARIABLE: {\n stmt = this.compileVariableStatement(statement);\n if (!stmt) stmt = module.createNop();\n break;\n }\n case NodeKind.VOID: {\n stmt = this.compileVoidStatement(statement);\n break;\n }\n case NodeKind.WHILE: {\n stmt = this.compileWhileStatement(statement);\n break;\n }\n case NodeKind.TYPEDECLARATION: {\n // TODO: integrate inner type declaration into flow\n this.error(\n DiagnosticCode.Operation_not_supported,\n statement.range\n );\n stmt = module.createUnreachable();\n break;\n }\n default: {\n assert(false);\n stmt = module.createUnreachable();\n }\n }\n if (this.options.sourceMap) this.addDebugLocation(stmt, statement.range);\n return stmt;\n }\n\n compileStatements(statements: Statement[], isBody: bool = false): ExpressionRef[] {\n var numStatements = statements.length;\n var stmts = new Array(numStatements);\n stmts.length = 0;\n var flow = this.currentFlow;\n for (let i = 0; i < numStatements; ++i) {\n let stmt = this.compileStatement(statements[i], isBody && i == numStatements - 1);\n switch (getExpressionId(stmt)) {\n case ExpressionId.Block: {\n if (!getBlockName(stmt)) {\n for (let j = 0, k = getBlockChildCount(stmt); j < k; ++j) stmts.push(getBlockChild(stmt, j));\n break;\n }\n // fall-through\n }\n default: stmts.push(stmt);\n case ExpressionId.Nop:\n }\n if (flow.isAny(FlowFlags.ANY_TERMINATING)) {\n if (needsExplicitUnreachable(stmt)) stmts.push(this.module.createUnreachable());\n break;\n }\n }\n return stmts;\n }\n\n compileBlockStatement(statement: BlockStatement): ExpressionRef {\n var statements = statement.statements;\n var outerFlow = this.currentFlow;\n var innerFlow = outerFlow.fork();\n this.currentFlow = innerFlow;\n\n var stmts = this.compileStatements(statements);\n var stmt = stmts.length == 0\n ? this.module.createNop()\n : stmts.length == 1\n ? stmts[0]\n : this.module.createBlock(null, stmts,getExpressionType(stmts[stmts.length - 1]));\n\n innerFlow.freeScopedLocals();\n outerFlow.inherit(innerFlow);\n this.currentFlow = outerFlow;\n return stmt;\n }\n\n compileBreakStatement(statement: BreakStatement): ExpressionRef {\n var module = this.module;\n if (statement.label) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n statement.label.range\n );\n return module.createUnreachable();\n }\n var flow = this.currentFlow;\n var breakLabel = flow.breakLabel;\n if (breakLabel == null) {\n this.error(\n DiagnosticCode.A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement,\n statement.range\n );\n return module.createUnreachable();\n }\n flow.set(FlowFlags.BREAKS);\n return module.createBreak(breakLabel);\n }\n\n compileContinueStatement(statement: ContinueStatement): ExpressionRef {\n var module = this.module;\n var label = statement.label;\n if (label) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n label.range\n );\n return module.createUnreachable();\n }\n // Check if 'continue' is allowed here\n var flow = this.currentFlow;\n var continueLabel = flow.continueLabel;\n if (continueLabel == null) {\n this.error(\n DiagnosticCode.A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement,\n statement.range\n );\n return module.createUnreachable();\n }\n flow.set(FlowFlags.CONTINUES);\n return module.createBreak(continueLabel);\n }\n\n compileDoStatement(statement: DoStatement): ExpressionRef {\n var module = this.module;\n\n var outerFlow = this.currentFlow;\n var label = outerFlow.pushBreakLabel();\n var innerFlow = outerFlow.fork();\n this.currentFlow = innerFlow;\n var breakLabel = \"break|\" + label;\n innerFlow.breakLabel = breakLabel;\n var continueLabel = \"continue|\" + label;\n innerFlow.continueLabel = continueLabel;\n\n var body = this.compileStatement(statement.statement);\n var condExpr = this.makeIsTrueish(\n this.compileExpression(statement.condition, Type.i32, ConversionKind.NONE, WrapMode.NONE),\n this.currentType\n );\n // TODO: check if condition is always false and if so, omit it (just a block)\n\n // Switch back to the parent flow\n innerFlow.freeScopedLocals();\n outerFlow.popBreakLabel();\n this.currentFlow = outerFlow;\n var terminated = innerFlow.isAny(FlowFlags.ANY_TERMINATING);\n innerFlow.unset(\n FlowFlags.BREAKS |\n FlowFlags.CONDITIONALLY_BREAKS |\n FlowFlags.CONTINUES |\n FlowFlags.CONDITIONALLY_CONTINUES\n );\n outerFlow.inherit(innerFlow);\n\n var block: ExpressionRef[] = [\n module.createLoop(continueLabel,\n terminated\n ? body // skip trailing continue if unnecessary\n : module.createBlock(null, [\n body,\n module.createBreak(continueLabel, condExpr)\n ], NativeType.None)\n )\n ];\n if (terminated) block.push(module.createUnreachable());\n return module.createBlock(breakLabel, block);\n }\n\n compileEmptyStatement(statement: EmptyStatement): ExpressionRef {\n return this.module.createNop();\n }\n\n compileExpressionStatement(statement: ExpressionStatement): ExpressionRef {\n var expr = this.compileExpression(statement.expression, Type.void, ConversionKind.NONE, WrapMode.NONE);\n if (this.currentType != Type.void) {\n expr = this.module.createDrop(expr);\n this.currentType = Type.void;\n }\n return expr;\n }\n\n compileForStatement(statement: ForStatement): ExpressionRef {\n // A for statement initiates a new branch with its own scoped variables\n // possibly declared in its initializer, and break context.\n var outerFlow = this.currentFlow;\n var label = outerFlow.pushBreakLabel();\n var innerFlow = outerFlow.fork();\n this.currentFlow = innerFlow;\n var breakLabel = innerFlow.breakLabel = \"break|\" + label;\n innerFlow.breakLabel = breakLabel;\n var continueLabel = \"continue|\" + label;\n innerFlow.continueLabel = continueLabel;\n var repeatLabel = \"repeat|\" + label;\n\n // Compile in correct order\n var module = this.module;\n var initExpr = statement.initializer\n ? this.compileStatement(statement.initializer)\n : 0;\n var condExpr: ExpressionRef = 0;\n var alwaysTrue = false;\n if (statement.condition) {\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n // check if the condition is always true\n let condPre = module.precomputeExpression(condExpr);\n if (getExpressionId(condPre) == ExpressionId.Const) {\n assert(getExpressionType(condPre) == NativeType.I32);\n if (getConstValueI32(condPre) != 0) alwaysTrue = true;\n // TODO: could skip compilation if the condition is always false here, but beware that the\n // initializer could still declare new 'var's that are used later on.\n }\n // recompile to original\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n } else {\n // omitted condition is always true\n condExpr = module.createI32(1);\n alwaysTrue = true;\n }\n var incrExpr = statement.incrementor\n ? this.compileExpression(statement.incrementor, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE)\n : 0;\n var bodyStatement = statement.statement;\n var bodyExpr = bodyStatement.kind == NodeKind.BLOCK && (bodyStatement).statements.length == 1\n ? this.compileStatement((bodyStatement).statements[0])\n : this.compileStatement(bodyStatement);\n\n // Switch back to the parent flow\n innerFlow.freeScopedLocals();\n outerFlow.popBreakLabel();\n this.currentFlow = outerFlow;\n var usesContinue = innerFlow.isAny(FlowFlags.CONTINUES | FlowFlags.CONDITIONALLY_CONTINUES);\n innerFlow.unset(\n FlowFlags.BREAKS |\n FlowFlags.CONDITIONALLY_BREAKS |\n FlowFlags.CONTINUES |\n FlowFlags.CONDITIONALLY_CONTINUES\n );\n if (alwaysTrue) outerFlow.inherit(innerFlow);\n else outerFlow.inheritConditional(innerFlow);\n\n var breakBlock = new Array(); // outer 'break' block\n if (initExpr) breakBlock.push(initExpr);\n\n var repeatBlock = new Array(); // block repeating the loop\n if (usesContinue) {\n repeatBlock.push(\n module.createBlock(continueLabel, [ // inner 'continue' block\n module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr)),\n bodyExpr\n ], NativeType.None)\n );\n } else { // can omit the 'continue' block\n repeatBlock.push(\n module.createBreak(breakLabel, module.createUnary(UnaryOp.EqzI32, condExpr))\n );\n repeatBlock.push(bodyExpr);\n }\n if (incrExpr) repeatBlock.push(incrExpr);\n repeatBlock.push(\n module.createBreak(repeatLabel)\n );\n\n breakBlock.push(\n module.createLoop(repeatLabel, module.createBlock(null, repeatBlock, NativeType.None))\n );\n\n return module.createBlock(breakLabel, breakBlock);\n }\n\n compileIfStatement(statement: IfStatement): ExpressionRef {\n var module = this.module;\n var ifTrue = statement.ifTrue;\n var ifFalse = statement.ifFalse;\n var outerFlow = this.currentFlow;\n var actualFunction = outerFlow.actualFunction;\n\n // The condition doesn't initiate a branch yet\n var condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n\n // Try to eliminate unnecesssary branches if the condition is constant\n var condExprPrecomp = module.precomputeExpression(condExpr);\n if (\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\n getExpressionType(condExprPrecomp) == NativeType.I32\n ) {\n return getConstValueI32(condExprPrecomp)\n ? this.compileStatement(ifTrue)\n : ifFalse\n ? this.compileStatement(ifFalse)\n : module.createNop();\n\n // Otherwise recompile to the original and let the optimizer decide\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n }\n\n // Each arm initiates a branch\n var ifTrueFlow = outerFlow.fork();\n this.currentFlow = ifTrueFlow;\n var ifTrueExpr = this.compileStatement(ifTrue);\n ifTrueFlow.freeScopedLocals();\n this.currentFlow = outerFlow;\n\n var ifFalseExpr: ExpressionRef = 0;\n if (ifFalse) {\n let ifFalseFlow = outerFlow.fork();\n this.currentFlow = ifFalseFlow;\n ifFalseExpr = this.compileStatement(ifFalse);\n ifFalseFlow.freeScopedLocals();\n this.currentFlow = outerFlow;\n outerFlow.inheritMutual(ifTrueFlow, ifFalseFlow);\n } else {\n outerFlow.inheritConditional(ifTrueFlow);\n }\n return module.createIf(condExpr, ifTrueExpr, ifFalseExpr);\n }\n\n compileReturnStatement(statement: ReturnStatement, isLastStatementInBody: bool): ExpressionRef {\n var module = this.module;\n var expr: ExpressionRef = 0;\n var flow = this.currentFlow;\n var returnType = flow.returnType;\n\n // Remember that this flow returns\n flow.set(FlowFlags.RETURNS);\n\n if (statement.value) {\n if (returnType == Type.void) {\n this.compileExpressionRetainType(statement.value, returnType, WrapMode.NONE);\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n statement.value.range, this.currentType.toString(), returnType.toString()\n );\n this.currentType = Type.void;\n return module.createUnreachable();\n }\n expr = this.compileExpression(\n statement.value,\n returnType,\n ConversionKind.IMPLICIT,\n flow.actualFunction.is(CommonFlags.MODULE_EXPORT)\n ? WrapMode.WRAP\n : WrapMode.NONE\n );\n\n // Remember whether returning a properly wrapped value\n if (!flow.canOverflow(expr, returnType)) flow.set(FlowFlags.RETURNS_WRAPPED);\n\n } else if (returnType != Type.void) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n statement.range, \"void\", returnType.toString()\n );\n expr = module.createUnreachable();\n }\n\n // If the last statement anyway, make it the block's return value\n if (isLastStatementInBody) return expr ? expr : module.createNop();\n\n // When inlining, break to the end of the inlined function's block (no need to wrap)\n if (flow.is(FlowFlags.INLINE_CONTEXT)) return module.createBreak(assert(flow.inlineReturnLabel), 0, expr);\n\n return module.createReturn(expr);\n }\n\n compileSwitchStatement(statement: SwitchStatement): ExpressionRef {\n var module = this.module;\n\n var cases = statement.cases;\n var numCases = cases.length;\n if (!numCases) {\n return this.compileExpression(statement.condition, Type.void, ConversionKind.IMPLICIT, WrapMode.NONE);\n }\n\n // Everything within a switch uses the same break context\n var outerFlow = this.currentFlow;\n var context = outerFlow.pushBreakLabel();\n\n // introduce a local for evaluating the condition (exactly once)\n var tempLocal = outerFlow.getTempLocal(Type.u32, false);\n var tempLocalIndex = tempLocal.index;\n\n // Prepend initializer to inner block. Does not initiate a new branch, yet.\n var breaks = new Array(1 + numCases);\n breaks[0] = module.createSetLocal( // initializer\n tempLocalIndex,\n this.compileExpression(statement.condition, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\n );\n\n // make one br_if per (possibly dynamic) labeled case (binaryen optimizes to br_table where possible)\n var breakIndex = 1;\n var defaultIndex = -1;\n for (let i = 0; i < numCases; ++i) {\n let case_ = cases[i];\n let label = case_.label;\n if (label) {\n breaks[breakIndex++] = module.createBreak(\"case\" + i.toString(10) + \"|\" + context,\n module.createBinary(BinaryOp.EqI32,\n module.createGetLocal(tempLocalIndex, NativeType.I32),\n this.compileExpression(label, Type.u32, ConversionKind.IMPLICIT, WrapMode.NONE)\n )\n );\n } else {\n defaultIndex = i;\n }\n }\n\n outerFlow.freeTempLocal(tempLocal);\n\n // otherwise br to default respectively out of the switch if there is no default case\n breaks[breakIndex] = module.createBreak((defaultIndex >= 0\n ? \"case\" + defaultIndex.toString(10)\n : \"break\"\n ) + \"|\" + context);\n\n // nest blocks in order\n var currentBlock = module.createBlock(\"case0|\" + context, breaks, NativeType.None);\n var alwaysReturns = true;\n var alwaysReturnsWrapped = true;\n var alwaysThrows = true;\n var alwaysAllocates = true;\n for (let i = 0; i < numCases; ++i) {\n let case_ = cases[i];\n let statements = case_.statements;\n let numStatements = statements.length;\n\n // Each switch case initiates a new branch\n let innerFlow = outerFlow.fork();\n this.currentFlow = innerFlow;\n let breakLabel = \"break|\" + context;\n innerFlow.breakLabel = breakLabel;\n\n let isLast = i == numCases - 1;\n let nextLabel = isLast ? breakLabel : \"case\" + (i + 1).toString(10) + \"|\" + context;\n let stmts = new Array(1 + numStatements);\n stmts[0] = currentBlock;\n let count = 1;\n let terminated = false;\n for (let j = 0; j < numStatements; ++j) {\n let stmt = this.compileStatement(statements[j]);\n if (getExpressionId(stmt) != ExpressionId.Nop) {\n stmts[count++] = stmt;\n if (innerFlow.isAny(FlowFlags.ANY_TERMINATING)) {\n terminated = true;\n break;\n }\n }\n }\n stmts.length = count;\n if (terminated || isLast) {\n if (!innerFlow.is(FlowFlags.RETURNS)) alwaysReturns = false;\n if (!innerFlow.is(FlowFlags.RETURNS_WRAPPED)) alwaysReturnsWrapped = false;\n if (!innerFlow.is(FlowFlags.THROWS)) alwaysThrows = false;\n if (!innerFlow.is(FlowFlags.ALLOCATES)) alwaysAllocates = false;\n }\n\n // Switch back to the parent flow\n innerFlow.unset(\n FlowFlags.BREAKS |\n FlowFlags.CONDITIONALLY_BREAKS\n );\n innerFlow.freeScopedLocals();\n this.currentFlow = outerFlow;\n currentBlock = module.createBlock(nextLabel, stmts, NativeType.None); // must be a labeled block\n }\n outerFlow.popBreakLabel();\n\n // If the switch has a default (guaranteed to handle any value), propagate common flags\n if (defaultIndex >= 0) {\n if (alwaysReturns) outerFlow.set(FlowFlags.RETURNS);\n if (alwaysReturnsWrapped) outerFlow.set(FlowFlags.RETURNS_WRAPPED);\n if (alwaysThrows) outerFlow.set(FlowFlags.THROWS);\n if (alwaysAllocates) outerFlow.set(FlowFlags.ALLOCATES);\n }\n return currentBlock;\n }\n\n compileThrowStatement(statement: ThrowStatement): ExpressionRef {\n var flow = this.currentFlow;\n\n // Remember that this branch throws\n flow.set(FlowFlags.THROWS);\n\n // FIXME: without try-catch it is safe to assume RETURNS as well for now\n flow.set(FlowFlags.RETURNS);\n\n // TODO: requires exception-handling spec.\n return compileAbort(this, null, statement);\n }\n\n compileTryStatement(statement: TryStatement): ExpressionRef {\n // TODO: can't yet support something like: try { return ... } finally { ... }\n // worthwhile to investigate lowering returns to block results (here)?\n this.error(\n DiagnosticCode.Operation_not_supported,\n statement.range\n );\n return this.module.createUnreachable();\n }\n\n /** Compiles a variable statement. Returns `0` if an initializer is not necessary. */\n compileVariableStatement(statement: VariableStatement): ExpressionRef {\n var declarations = statement.declarations;\n var numDeclarations = declarations.length;\n var flow = this.currentFlow;\n var initializers = new Array();\n var resolver = this.resolver;\n for (let i = 0; i < numDeclarations; ++i) {\n let declaration = declarations[i];\n let name = declaration.name.text;\n let type: Type | null = null;\n let initExpr: ExpressionRef = 0;\n if (declaration.type) {\n type = resolver.resolveType( // reports\n declaration.type,\n flow.actualFunction,\n flow.contextualTypeArguments\n );\n if (!type) continue;\n if (declaration.initializer) {\n initExpr = this.compileExpression( // reports\n declaration.initializer,\n type,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n }\n } else if (declaration.initializer) { // infer type using void/NONE for proper literal inference\n initExpr = this.compileExpressionRetainType( // reports\n declaration.initializer,\n Type.void,\n WrapMode.NONE\n );\n if (this.currentType == Type.void) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n declaration.range, this.currentType.toString(), \"\"\n );\n continue;\n }\n type = this.currentType;\n } else {\n this.error(\n DiagnosticCode.Type_expected,\n declaration.name.range.atEnd\n );\n continue;\n }\n let isInlined = false;\n if (declaration.is(CommonFlags.CONST)) {\n if (initExpr) {\n initExpr = this.module.precomputeExpression(initExpr);\n if (getExpressionId(initExpr) == ExpressionId.Const) {\n let local = new Local(name, -1, type, flow.parentFunction);\n switch (getExpressionType(initExpr)) {\n case NativeType.I32: {\n local.setConstantIntegerValue(\n i64_new(\n getConstValueI32(initExpr),\n 0\n ),\n type\n );\n break;\n }\n case NativeType.I64: {\n local.setConstantIntegerValue(\n i64_new(\n getConstValueI64Low(initExpr),\n getConstValueI64High(initExpr)\n ),\n type\n );\n break;\n }\n case NativeType.F32: {\n local.setConstantFloatValue(getConstValueF32(initExpr), type);\n break;\n }\n case NativeType.F64: {\n local.setConstantFloatValue(getConstValueF64(initExpr), type);\n break;\n }\n default: {\n assert(false);\n return this.module.createUnreachable();\n }\n }\n // Create a virtual local that doesn't actually exist in WebAssembly\n let scopedLocals = flow.scopedLocals;\n if (!scopedLocals) flow.scopedLocals = scopedLocals = new Map();\n else if (scopedLocals.has(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, name\n );\n return this.module.createUnreachable();\n }\n scopedLocals.set(name, local);\n isInlined = true;\n } else {\n this.warning(\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\n declaration.range\n );\n }\n } else {\n this.error(\n DiagnosticCode._const_declarations_must_be_initialized,\n declaration.range\n );\n }\n }\n if (!isInlined) {\n let local: Local;\n if (\n declaration.isAny(CommonFlags.LET | CommonFlags.CONST) ||\n flow.is(FlowFlags.INLINE_CONTEXT)\n ) { // here: not top-level\n local = flow.addScopedLocal(name, type, false, declaration.name); // reports if duplicate\n } else {\n if (flow.lookupLocal(name)) {\n this.error(\n DiagnosticCode.Duplicate_identifier_0,\n declaration.name.range, name\n );\n continue;\n }\n local = flow.parentFunction.addLocal(type, name, declaration);\n }\n if (initExpr) {\n initializers.push(\n this.compileAssignmentWithValue(declaration.name, initExpr)\n );\n if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n flow.setLocalWrapped(local.index, !flow.canOverflow(initExpr, type));\n }\n } else if (local.type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n flow.setLocalWrapped(local.index, true); // zero\n }\n }\n }\n return initializers.length // we can unwrap these here because the\n ? initializers.length == 1 // source didn't tell us exactly what to do\n ? initializers[0]\n : this.module.createBlock(null, initializers, NativeType.None)\n : 0;\n }\n\n compileVoidStatement(statement: VoidStatement): ExpressionRef {\n return this.compileExpression(statement.expression, Type.void, ConversionKind.EXPLICIT, WrapMode.NONE);\n }\n\n compileWhileStatement(statement: WhileStatement): ExpressionRef {\n var module = this.module;\n var outerFlow = this.currentFlow;\n\n // The condition does not yet initialize a branch\n var condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n\n // Try to eliminate unnecesssary loops if the condition is constant\n var condExprPrecomp = module.precomputeExpression(condExpr);\n if (\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\n getExpressionType(condExprPrecomp) == NativeType.I32\n ) {\n if (!getConstValueI32(condExprPrecomp)) return module.createNop();\n\n // Otherwise recompile to the original and let the optimizer decide\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(statement.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n }\n\n // Statements initiate a new branch with its own break context\n var label = outerFlow.pushBreakLabel();\n var innerFlow = outerFlow.fork();\n this.currentFlow = innerFlow;\n var breakLabel = \"break|\" + label;\n innerFlow.breakLabel = breakLabel;\n var continueLabel = \"continue|\" + label;\n innerFlow.continueLabel = continueLabel;\n\n var body = this.compileStatement(statement.statement);\n var alwaysTrue = false; // TODO\n var terminated = innerFlow.isAny(FlowFlags.ANY_TERMINATING);\n\n // Switch back to the parent flow\n innerFlow.freeScopedLocals();\n outerFlow.popBreakLabel();\n this.currentFlow = outerFlow;\n innerFlow.unset(\n FlowFlags.BREAKS |\n FlowFlags.CONDITIONALLY_BREAKS |\n FlowFlags.CONTINUES |\n FlowFlags.CONDITIONALLY_CONTINUES\n );\n if (alwaysTrue) outerFlow.inherit(innerFlow);\n else outerFlow.inheritConditional(innerFlow);\n\n return module.createBlock(breakLabel, [\n module.createLoop(continueLabel,\n module.createIf(condExpr,\n terminated\n ? body // skip trailing continue if unnecessary\n : module.createBlock(null, [\n body,\n module.createBreak(continueLabel)\n ], NativeType.None)\n )\n )\n ]);\n }\n\n // expressions\n\n /**\n * Compiles the value of an inlined constant element.\n * @param retainType If true, the annotated type of the constant is retained. Otherwise, the value\n * is precomputed according to context.\n */\n compileInlineConstant(\n element: VariableLikeElement,\n contextualType: Type,\n retainType: bool\n ): ExpressionRef {\n assert(element.is(CommonFlags.INLINED));\n var type = element.type;\n switch (\n !retainType &&\n type.is(TypeFlags.INTEGER) &&\n contextualType.is(TypeFlags.INTEGER) &&\n type.size < contextualType.size\n ? (this.currentType = contextualType).kind // essentially precomputes a (sign-)extension\n : (this.currentType = type).kind\n ) {\n case TypeKind.I8:\n case TypeKind.I16: {\n let shift = type.computeSmallIntegerShift(Type.i32);\n return this.module.createI32(\n element.constantValueKind == ConstantValueKind.INTEGER\n ? i64_low(element.constantIntegerValue) << shift >> shift\n : 0\n ); // recognized by canOverflow\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n let mask = element.type.computeSmallIntegerMask(Type.i32);\n return this.module.createI32(\n element.constantValueKind == ConstantValueKind.INTEGER\n ? i64_low(element.constantIntegerValue) & mask\n : 0\n ); // recognized by canOverflow\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n return this.module.createI32(\n element.constantValueKind == ConstantValueKind.INTEGER\n ? i64_low(element.constantIntegerValue)\n : 0\n );\n }\n case TypeKind.ISIZE:\n case TypeKind.USIZE: {\n if (!element.program.options.isWasm64) {\n return this.module.createI32(\n element.constantValueKind == ConstantValueKind.INTEGER\n ? i64_low(element.constantIntegerValue)\n : 0\n );\n }\n // fall-through\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return element.constantValueKind == ConstantValueKind.INTEGER\n ? this.module.createI64(\n i64_low(element.constantIntegerValue),\n i64_high(element.constantIntegerValue)\n )\n : this.module.createI64(0);\n }\n case TypeKind.F64: {\n // monkey-patch for converting built-in floats to f32 implicitly\n if (!(element.hasDecorator(DecoratorFlags.BUILTIN) && contextualType == Type.f32)) {\n return this.module.createF64((element).constantFloatValue);\n }\n // otherwise fall-through: basically precomputes f32.demote/f64 of NaN / Infinity\n this.currentType = Type.f32;\n }\n case TypeKind.F32: {\n return this.module.createF32((element).constantFloatValue);\n }\n default: {\n assert(false);\n return this.module.createUnreachable();\n }\n }\n }\n\n compileExpression(\n expression: Expression,\n contextualType: Type,\n conversionKind: ConversionKind,\n wrapMode: WrapMode\n ): ExpressionRef {\n this.currentType = contextualType;\n var expr: ExpressionRef;\n switch (expression.kind) {\n case NodeKind.ASSERTION: {\n expr = this.compileAssertionExpression(expression, contextualType);\n break;\n }\n case NodeKind.BINARY: {\n expr = this.compileBinaryExpression(expression, contextualType);\n break;\n }\n case NodeKind.CALL: {\n expr = this.compileCallExpression(expression, contextualType);\n break;\n }\n case NodeKind.COMMA: {\n expr = this.compileCommaExpression(expression, contextualType);\n break;\n }\n case NodeKind.ELEMENTACCESS: {\n expr = this.compileElementAccessExpression(expression, contextualType);\n break;\n }\n case NodeKind.FUNCTION: {\n expr = this.compileFunctionExpression(expression, contextualType);\n break;\n }\n case NodeKind.IDENTIFIER:\n case NodeKind.FALSE:\n case NodeKind.NULL:\n case NodeKind.THIS:\n case NodeKind.SUPER:\n case NodeKind.TRUE: {\n expr = this.compileIdentifierExpression(\n expression,\n contextualType,\n conversionKind == ConversionKind.NONE // retain type of inlined constants\n );\n break;\n }\n case NodeKind.INSTANCEOF: {\n expr = this.compileInstanceOfExpression(expression, contextualType);\n break;\n }\n case NodeKind.LITERAL: {\n expr = this.compileLiteralExpression(expression, contextualType);\n break;\n }\n case NodeKind.NEW: {\n expr = this.compileNewExpression(expression, contextualType);\n break;\n }\n case NodeKind.PARENTHESIZED: {\n expr = this.compileParenthesizedExpression(expression, contextualType);\n break;\n }\n case NodeKind.PROPERTYACCESS: {\n expr = this.compilePropertyAccessExpression(\n expression,\n contextualType,\n conversionKind == ConversionKind.NONE // retain type of inlined constants\n );\n break;\n }\n case NodeKind.TERNARY: {\n expr = this.compileTernaryExpression(expression, contextualType);\n break;\n }\n case NodeKind.UNARYPOSTFIX: {\n expr = this.compileUnaryPostfixExpression(expression, contextualType);\n break;\n }\n case NodeKind.UNARYPREFIX: {\n expr = this.compileUnaryPrefixExpression(expression, contextualType);\n break;\n }\n default: {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n expr = this.module.createUnreachable();\n }\n }\n var currentType = this.currentType;\n if (conversionKind != ConversionKind.NONE && currentType != contextualType) {\n expr = this.convertExpression(expr, currentType, contextualType, conversionKind, wrapMode, expression);\n this.currentType = contextualType;\n } else if (wrapMode == WrapMode.WRAP) {\n expr = this.ensureSmallIntegerWrap(expr, currentType);\n }\n\n if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\n return expr;\n }\n\n compileExpressionRetainType(\n expression: Expression,\n contextualType: Type,\n wrapMode: WrapMode\n ): ExpressionRef {\n return this.compileExpression(\n expression,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n wrapMode\n );\n }\n\n precomputeExpression(\n expression: Expression,\n contextualType: Type,\n conversionKind: ConversionKind,\n wrapMode: WrapMode\n ): ExpressionRef {\n return this.module.precomputeExpression(\n this.compileExpression(expression, contextualType, conversionKind, wrapMode)\n );\n }\n\n convertExpression(\n expr: ExpressionRef,\n fromType: Type,\n toType: Type,\n conversionKind: ConversionKind,\n wrapMode: WrapMode,\n reportNode: Node\n ): ExpressionRef {\n assert(conversionKind != ConversionKind.NONE);\n var module = this.module;\n\n // void to any\n if (fromType.kind == TypeKind.VOID) {\n assert(toType.kind != TypeKind.VOID); // convertExpression should not be called with void -> void\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n reportNode.range, fromType.toString(), toType.toString()\n );\n return module.createUnreachable();\n }\n\n // any to void\n if (toType.kind == TypeKind.VOID) return module.createDrop(expr);\n\n if (!fromType.isAssignableTo(toType)) {\n if (conversionKind == ConversionKind.IMPLICIT) {\n this.error(\n DiagnosticCode.Conversion_from_type_0_to_1_requires_an_explicit_cast,\n reportNode.range, fromType.toString(), toType.toString()\n ); // recoverable\n }\n }\n\n if (fromType.is(TypeFlags.FLOAT)) {\n\n // float to float\n if (toType.is(TypeFlags.FLOAT)) {\n if (fromType.kind == TypeKind.F32) {\n\n // f32 to f64\n if (toType.kind == TypeKind.F64) {\n expr = module.createUnary(UnaryOp.PromoteF32, expr);\n }\n\n // otherwise f32 to f32\n\n // f64 to f32\n } else if (toType.kind == TypeKind.F32) {\n expr = module.createUnary(UnaryOp.DemoteF64, expr);\n }\n\n // otherwise f64 to f64\n\n // float to int\n } else if (toType.is(TypeFlags.INTEGER)) {\n\n // f32 to int\n if (fromType.kind == TypeKind.F32) {\n if (toType == Type.bool) {\n expr = module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\n wrapMode = WrapMode.NONE;\n } else if (toType.is(TypeFlags.SIGNED)) {\n if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.TruncF32ToI64, expr);\n } else {\n expr = module.createUnary(UnaryOp.TruncF32ToI32, expr);\n }\n } else {\n if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.TruncF32ToU64, expr);\n } else {\n expr = module.createUnary(UnaryOp.TruncF32ToU32, expr);\n }\n }\n\n // f64 to int\n } else {\n if (toType == Type.bool) {\n expr = module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\n wrapMode = WrapMode.NONE;\n } else if (toType.is(TypeFlags.SIGNED)) {\n if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.TruncF64ToI64, expr);\n } else {\n expr = module.createUnary(UnaryOp.TruncF64ToI32, expr);\n }\n } else {\n if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.TruncF64ToU64, expr);\n } else {\n expr = module.createUnary(UnaryOp.TruncF64ToU32, expr);\n }\n }\n }\n\n // float to void\n } else {\n assert(toType.flags == TypeFlags.NONE, \"void type expected\");\n expr = module.createDrop(expr);\n }\n\n // int to float\n } else if (fromType.is(TypeFlags.INTEGER) && toType.is(TypeFlags.FLOAT)) {\n\n // int to f32\n if (toType.kind == TypeKind.F32) {\n if (fromType.is(TypeFlags.LONG)) {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED)\n ? UnaryOp.ConvertI64ToF32\n : UnaryOp.ConvertU64ToF32,\n expr\n );\n } else {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED)\n ? UnaryOp.ConvertI32ToF32\n : UnaryOp.ConvertU32ToF32,\n expr\n );\n }\n\n // int to f64\n } else {\n if (fromType.is(TypeFlags.LONG)) {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED)\n ? UnaryOp.ConvertI64ToF64\n : UnaryOp.ConvertU64ToF64,\n expr\n );\n } else {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED)\n ? UnaryOp.ConvertI32ToF64\n : UnaryOp.ConvertU32ToF64,\n expr\n );\n }\n }\n\n // int to int\n } else {\n // i64 to ...\n if (fromType.is(TypeFlags.LONG)) {\n\n // i64 to i32 or smaller\n if (toType == Type.bool) {\n expr = module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\n wrapMode = WrapMode.NONE;\n } else if (!toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(UnaryOp.WrapI64, expr); // discards upper bits\n }\n\n // i32 or smaller to i64\n } else if (toType.is(TypeFlags.LONG)) {\n expr = module.createUnary(\n fromType.is(TypeFlags.SIGNED) ? UnaryOp.ExtendI32 : UnaryOp.ExtendU32,\n this.ensureSmallIntegerWrap(expr, fromType) // must clear garbage bits\n );\n wrapMode = WrapMode.NONE;\n\n // i32 to i32\n } else {\n // small i32 to ...\n if (fromType.is(TypeFlags.SHORT)) {\n // small i32 to larger i32\n if (fromType.size < toType.size) {\n expr = this.ensureSmallIntegerWrap(expr, fromType); // must clear garbage bits\n wrapMode = WrapMode.NONE;\n }\n }\n }\n }\n\n this.currentType = toType;\n return wrapMode == WrapMode.WRAP\n ? this.ensureSmallIntegerWrap(expr, toType)\n : expr;\n }\n\n compileAssertionExpression(expression: AssertionExpression, contextualType: Type): ExpressionRef {\n switch (expression.assertionKind) {\n case AssertionKind.PREFIX:\n case AssertionKind.AS: {\n let toType = this.resolver.resolveType( // reports\n assert(expression.toType),\n this.currentFlow.actualFunction,\n this.currentFlow.contextualTypeArguments\n );\n if (!toType) return this.module.createUnreachable();\n return this.compileExpression(expression.expression, toType, ConversionKind.EXPLICIT, WrapMode.NONE);\n }\n case AssertionKind.NONNULL: {\n assert(!expression.toType);\n let expr = this.compileExpressionRetainType(expression.expression, contextualType, WrapMode.NONE);\n this.currentType = this.currentType.nonNullableType;\n return expr;\n }\n default: assert(false);\n }\n return this.module.createUnreachable();\n }\n\n private f32ModInstance: Function | null = null;\n private f64ModInstance: Function | null = null;\n private f32PowInstance: Function | null = null;\n private f64PowInstance: Function | null = null;\n\n compileBinaryExpression(\n expression: BinaryExpression,\n contextualType: Type\n ): ExpressionRef {\n var module = this.module;\n var left = expression.left;\n var right = expression.right;\n\n var leftExpr: ExpressionRef;\n var leftType: Type;\n var rightExpr: ExpressionRef;\n var rightType: Type;\n var commonType: Type | null;\n\n var expr: ExpressionRef;\n var compound = false;\n\n var operator = expression.operator;\n switch (operator) {\n case Token.LESSTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.LT);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"<\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.LtI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.LtI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.LtI64\n : BinaryOp.LtI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.LtU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.LtU64\n : BinaryOp.LtU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.LtU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.LtF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.LtF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.GREATERTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.GT);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \">\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.GtI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.GtI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.GtU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.GtU64\n : BinaryOp.GtU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.GtU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.GtF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.GtF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.LESSTHAN_EQUALS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.LE);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"<=\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.LeI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.LeI64\n : BinaryOp.LeI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.LeI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.LeU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.LeU64\n : BinaryOp.LeU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.LeU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.LeF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.LeF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.GREATERTHAN_EQUALS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.GE);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, true)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \">=\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.GeI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.GeI64\n : BinaryOp.GeI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.GeI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.GeU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.GeU64\n : BinaryOp.GeU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.GeU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.GeF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.GeF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n\n case Token.EQUALS_EQUALS_EQUALS:\n case Token.EQUALS_EQUALS: {\n\n // NOTE that this favors correctness, in terms of emitting a binary expression, over\n // checking for a possible use of unary EQZ. while the most classic of all optimizations,\n // that's not what the source told us to do. for reference, `!left` emits unary EQZ.\n\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (operator == Token.EQUALS_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.EQ);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n // still allow '==' with references\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.EqI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.EqI64\n : BinaryOp.EqI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.EqI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.EqF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.EqF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.EXCLAMATION_EQUALS_EQUALS:\n case Token.EXCLAMATION_EQUALS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (operator == Token.EXCLAMATION_EQUALS && this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.NE);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n // still allow '!=' with references\n }\n\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, operatorTokenToString(expression.operator), leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n switch (commonType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.NeI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.NeI64\n : BinaryOp.NeI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.NeI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.NeF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.NeF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n this.currentType = Type.bool;\n break;\n }\n case Token.EQUALS: {\n return this.compileAssignment(left, right, contextualType);\n }\n case Token.PLUS_EQUALS: compound = true;\n case Token.PLUS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.ADD);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"+\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8: // addition might overflow\n case TypeKind.I16: // ^\n case TypeKind.U8: // ^\n case TypeKind.U16: // ^\n case TypeKind.BOOL: // ^\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.AddI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.AddI64\n : BinaryOp.AddI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.AddI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.AddF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.AddF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.MINUS_EQUALS: compound = true;\n case Token.MINUS: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.SUB);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"-\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8: // subtraction might overflow\n case TypeKind.I16: // ^\n case TypeKind.U8: // ^\n case TypeKind.U16: // ^\n case TypeKind.BOOL: // ^\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.SubI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.SubI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.SubF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.SubF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.ASTERISK_EQUALS: compound = true;\n case Token.ASTERISK: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.MUL);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"*\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL:\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.MulI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.MulI64\n : BinaryOp.MulI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.MulI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.MulF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.MulF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.ASTERISK_ASTERISK_EQUALS: compound = true;\n case Token.ASTERISK_ASTERISK: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.POW);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n let instance: Function | null;\n\n // Mathf.pow if lhs is f32 (result is f32)\n if (this.currentType.kind == TypeKind.F32) {\n rightExpr = this.compileExpression(right, Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n if (!(instance = this.f32PowInstance)) {\n let namespace = this.program.lookupGlobal(LibrarySymbols.Mathf);\n if (!namespace) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Mathf\"\n );\n expr = module.createUnreachable();\n break;\n }\n let prototype = namespace.members ? namespace.members.get(LibrarySymbols.pow) : null;\n if (!prototype) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Mathf.pow\"\n );\n expr = module.createUnreachable();\n break;\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.f32PowInstance = instance = this.resolver.resolveFunction(prototype, null);\n }\n\n // Math.pow otherwise (result is f64)\n // TODO: should the result be converted back?\n } else {\n leftExpr = this.convertExpression(\n leftExpr,\n this.currentType,\n Type.f64,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n leftType = this.currentType;\n rightExpr = this.compileExpression(\n right,\n Type.f64,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n rightType = this.currentType;\n if (!(instance = this.f64PowInstance)) {\n let namespace = this.program.lookupGlobal(LibrarySymbols.Math);\n if (!namespace) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Math\"\n );\n expr = module.createUnreachable();\n break;\n }\n let prototype = namespace.members ? namespace.members.get(LibrarySymbols.pow) : null;\n if (!prototype) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Math.pow\"\n );\n expr = module.createUnreachable();\n break;\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.f64PowInstance = instance = this.resolver.resolveFunction(prototype, null);\n }\n }\n if (!(instance && this.compileFunction(instance))) {\n expr = module.createUnreachable();\n } else {\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\n }\n break;\n }\n case Token.SLASH_EQUALS: compound = true;\n case Token.SLASH: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.DIV);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP, // !\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP, // !\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"/\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8: // signed div on signed small integers might overflow, e.g. -128/-1\n case TypeKind.I16: // ^\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.DivI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.DivI64\n : BinaryOp.DivI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.DivI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.DivU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.DivU64\n : BinaryOp.DivU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.DivU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.DivF32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.DivF64, leftExpr, rightExpr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.PERCENT_EQUALS: compound = true;\n case Token.PERCENT: {\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.REM);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType);\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP, // !\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP, // !\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"%\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16: {\n expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.RemI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.RemI64\n : BinaryOp.RemI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.RemI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.RemU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.RemU64\n : BinaryOp.RemU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.RemU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.F32: {\n let instance = this.f32ModInstance;\n if (!instance) {\n let namespace = this.program.lookupGlobal(LibrarySymbols.Mathf);\n if (!namespace) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Mathf\"\n );\n expr = module.createUnreachable();\n break;\n }\n let prototype = namespace.members ? namespace.members.get(LibrarySymbols.mod) : null;\n if (!prototype) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Mathf.mod\"\n );\n expr = module.createUnreachable();\n break;\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.f32ModInstance = instance = this.resolver.resolveFunction(prototype, null);\n }\n if (!(instance && this.compileFunction(instance))) {\n expr = module.createUnreachable();\n } else {\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\n }\n break;\n }\n case TypeKind.F64: {\n let instance = this.f64ModInstance;\n if (!instance) {\n let namespace = this.program.lookupGlobal(LibrarySymbols.Math);\n if (!namespace) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Math\"\n );\n expr = module.createUnreachable();\n break;\n }\n let prototype = namespace.members ? namespace.members.get(LibrarySymbols.mod) : null;\n if (!prototype) {\n this.error(\n DiagnosticCode.Cannot_find_name_0,\n expression.range, \"Math.mod\"\n );\n expr = module.createUnreachable();\n break;\n }\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n this.f64ModInstance = instance = this.resolver.resolveFunction(prototype, null);\n }\n if (!(instance && this.compileFunction(instance))) {\n expr = module.createUnreachable();\n } else {\n expr = this.makeCallDirect(instance, [ leftExpr, rightExpr ]);\n }\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.LESSTHAN_LESSTHAN_EQUALS: compound = true;\n case Token.LESSTHAN_LESSTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHL);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL:\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.ShlI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.ShlI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.ShlI64\n : BinaryOp.ShlI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\n case Token.GREATERTHAN_GREATERTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n rightType = this.currentType;\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16: {\n expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I32: {\n expr = module.createBinary(BinaryOp.ShrI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64: {\n expr = module.createBinary(BinaryOp.ShrI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.ShrI64\n : BinaryOp.ShrI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.ShrU64\n : BinaryOp.ShrU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS: compound = true;\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_SHR_U);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n leftExpr = this.ensureSmallIntegerWrap(leftExpr, leftType); // must clear garbage bits\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n switch (this.currentType.kind) {\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: { // assumes that unsigned shr on unsigned small integers does not overflow\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\n }\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.ShrU32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.ShrU64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.ShrU64\n : BinaryOp.ShrU32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.AMPERSAND_EQUALS: compound = true;\n case Token.AMPERSAND: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overloadd\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_AND);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"&\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.AndI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.AndI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.AndI64\n : BinaryOp.AndI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.BAR_EQUALS: compound = true;\n case Token.BAR: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_OR);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"|\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.OrI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.OrI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.OrI64\n : BinaryOp.OrI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.CARET_EQUALS: compound = true;\n case Token.CARET: {\n leftExpr = this.compileExpressionRetainType(left, contextualType.intType, WrapMode.NONE);\n leftType = this.currentType;\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = leftType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_XOR);\n if (overload) {\n expr = this.compileBinaryOverload(overload, left, leftExpr, right, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n if (compound) {\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n } else {\n rightExpr = this.compileExpressionRetainType(right, leftType, WrapMode.NONE);\n rightType = this.currentType;\n if (commonType = Type.commonCompatible(leftType, rightType, false)) {\n leftExpr = this.convertExpression(\n leftExpr,\n leftType,\n leftType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n left\n );\n rightExpr = this.convertExpression(\n rightExpr,\n rightType,\n rightType = commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n right\n );\n } else {\n this.error(\n DiagnosticCode.Operator_0_cannot_be_applied_to_types_1_and_2,\n expression.range, \"^\", leftType.toString(), rightType.toString()\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n }\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n expr = module.createBinary(BinaryOp.XorI32, leftExpr, rightExpr);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.XorI64, leftExpr, rightExpr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.XorI64\n : BinaryOp.XorI32,\n leftExpr,\n rightExpr\n );\n break;\n }\n case TypeKind.F32:\n case TypeKind.F64: {\n this.error(\n DiagnosticCode.The_0_operator_cannot_be_applied_to_type_1,\n expression.range, operatorTokenToString(expression.operator), this.currentType.toString()\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n\n // logical (no overloading)\n\n case Token.AMPERSAND_AMPERSAND: { // left && right\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n\n // simplify if cloning left without side effects is possible\n if (expr = module.cloneExpression(leftExpr, true, 0)) {\n expr = module.createIf(\n this.makeIsTrueish(leftExpr, this.currentType),\n rightExpr,\n expr\n );\n\n // if not possible, tee left to a temp. local\n } else {\n let flow = this.currentFlow;\n let tempLocal = flow.getAndFreeTempLocal(\n this.currentType,\n !flow.canOverflow(leftExpr, this.currentType)\n );\n expr = module.createIf(\n this.makeIsTrueish(\n module.createTeeLocal(tempLocal.index, leftExpr),\n this.currentType\n ),\n rightExpr,\n module.createGetLocal(\n assert(tempLocal).index, // to be sure\n this.currentType.toNativeType()\n )\n );\n }\n break;\n }\n case Token.BAR_BAR: { // left || right\n leftExpr = this.compileExpressionRetainType(left, contextualType, WrapMode.NONE);\n leftType = this.currentType;\n rightExpr = this.compileExpression(right, leftType, ConversionKind.IMPLICIT, WrapMode.NONE);\n rightType = this.currentType;\n\n // simplify if cloning left without side effects is possible\n if (expr = this.module.cloneExpression(leftExpr, true, 0)) {\n expr = this.module.createIf(\n this.makeIsTrueish(leftExpr, this.currentType),\n expr,\n rightExpr\n );\n\n // if not possible, tee left to a temp. local\n } else {\n let flow = this.currentFlow;\n let tempLocal = flow.getAndFreeTempLocal(\n this.currentType,\n !flow.canOverflow(leftExpr, this.currentType)\n );\n expr = module.createIf(\n this.makeIsTrueish(\n module.createTeeLocal(tempLocal.index, leftExpr),\n this.currentType\n ),\n module.createGetLocal(\n assert(tempLocal).index, // to be sure\n this.currentType.toNativeType()\n ),\n rightExpr\n );\n }\n break;\n }\n default: {\n assert(false);\n expr = this.module.createUnreachable();\n }\n }\n return compound\n ? this.compileAssignmentWithValue(left, expr, contextualType != Type.void)\n : expr;\n }\n\n compileUnaryOverload(\n operatorInstance: Function,\n value: Expression,\n valueExpr: ExpressionRef,\n reportNode: Node\n ): ExpressionRef {\n var argumentExpressions: Expression[];\n var thisArg: ExpressionRef = 0;\n if (operatorInstance.is(CommonFlags.INSTANCE)) {\n thisArg = valueExpr; // can reuse the previously evaluated expr as the this value here\n argumentExpressions = [];\n } else {\n argumentExpressions = [ value ]; // annotated type might differ -> recompile\n }\n return this.compileCallDirect(\n operatorInstance,\n argumentExpressions,\n reportNode,\n thisArg\n );\n }\n\n compileBinaryOverload(\n operatorInstance: Function,\n left: Expression,\n leftExpr: ExpressionRef,\n right: Expression,\n reportNode: Node\n ): ExpressionRef {\n var argumentExpressions: Expression[];\n var thisArg: ExpressionRef = 0;\n if (operatorInstance.is(CommonFlags.INSTANCE)) {\n let classInstance = assert(operatorInstance.parent); assert(classInstance.kind == ElementKind.CLASS);\n thisArg = leftExpr; // can reuse the previously evaluated leftExpr as the this value here\n argumentExpressions = [ right ];\n } else {\n argumentExpressions = [ left, right ]; // annotated type of LHS might differ -> recompile\n }\n var ret = this.compileCallDirect(\n operatorInstance,\n argumentExpressions,\n reportNode,\n thisArg\n );\n return ret;\n }\n\n compileAssignment(expression: Expression, valueExpression: Expression, contextualType: Type): ExpressionRef {\n var program = this.program;\n var resolver = program.resolver;\n var flow = this.currentFlow;\n var target = resolver.resolveExpression(expression, flow); // reports\n if (!target) return this.module.createUnreachable();\n\n // to compile just the value, we need to know the target's type\n var targetType: Type;\n switch (target.kind) {\n case ElementKind.GLOBAL: {\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field compiled as a global\n return this.module.createUnreachable();\n }\n assert((target).type != Type.void); // compileGlobal must guarantee this\n // fall-through\n }\n case ElementKind.LOCAL:\n case ElementKind.FIELD: {\n targetType = (target).type;\n break;\n }\n case ElementKind.PROPERTY_PROTOTYPE: { // static property\n let setterPrototype = (target).setterPrototype;\n if (!setterPrototype) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, (target).internalName\n );\n return this.module.createUnreachable();\n }\n let setterInstance = this.resolver.resolveFunction(setterPrototype, null, makeMap(), ReportMode.REPORT);\n if (!setterInstance) return this.module.createUnreachable();\n assert(setterInstance.signature.parameterTypes.length == 1); // parser must guarantee this\n targetType = setterInstance.signature.parameterTypes[0];\n break;\n }\n case ElementKind.PROPERTY: { // instance property\n let setterInstance = (target).setterInstance;\n if (!setterInstance) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, (target).internalName\n );\n return this.module.createUnreachable();\n }\n assert(setterInstance.signature.parameterTypes.length == 1); // parser must guarantee this\n targetType = setterInstance.signature.parameterTypes[0];\n break;\n }\n case ElementKind.CLASS: {\n if (resolver.currentElementExpression) { // indexed access\n let isUnchecked = flow.is(FlowFlags.UNCHECKED_CONTEXT);\n let indexedSet = (target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\n if (!indexedSet) {\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\n if (!indexedGet) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n expression.range, (target).internalName\n );\n } else {\n this.error(\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\n expression.range, (target).internalName\n );\n }\n return this.module.createUnreachable();\n }\n assert(indexedSet.signature.parameterTypes.length == 2); // parser must guarantee this\n targetType = indexedSet.signature.parameterTypes[1]; // 2nd parameter is the element\n break;\n }\n // fall-through\n }\n default: {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n }\n\n // compile the value and do the assignment\n assert(targetType != Type.void);\n var valueExpr = this.compileExpression(valueExpression, targetType, ConversionKind.IMPLICIT, WrapMode.NONE);\n return this.compileAssignmentWithValue(\n expression,\n valueExpr,\n contextualType != Type.void\n );\n }\n\n compileAssignmentWithValue(\n expression: Expression,\n valueWithCorrectType: ExpressionRef,\n tee: bool = false\n ): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n var target = this.resolver.resolveExpression(expression, flow); // reports\n if (!target) return module.createUnreachable();\n\n switch (target.kind) {\n case ElementKind.LOCAL: {\n let type = (target).type;\n assert(type != Type.void);\n this.currentType = tee ? type : Type.void;\n if ((target).is(CommonFlags.CONST)) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, target.internalName\n );\n return module.createUnreachable();\n }\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n flow.setLocalWrapped((target).index, !flow.canOverflow(valueWithCorrectType, type));\n }\n return tee\n ? module.createTeeLocal((target).index, valueWithCorrectType)\n : module.createSetLocal((target).index, valueWithCorrectType);\n }\n case ElementKind.GLOBAL: {\n if (!this.compileGlobal(target)) return module.createUnreachable();\n let type = (target).type;\n assert(type != Type.void);\n this.currentType = tee ? type : Type.void;\n if ((target).is(CommonFlags.CONST)) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range,\n target.internalName\n );\n return module.createUnreachable();\n }\n valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type); // guaranteed\n if (tee) {\n let nativeType = type.toNativeType();\n let internalName = target.internalName;\n return module.createBlock(null, [ // emulated teeGlobal\n module.createSetGlobal(internalName, valueWithCorrectType),\n module.createGetGlobal(internalName, nativeType)\n ], nativeType);\n } else {\n return module.createSetGlobal(target.internalName, valueWithCorrectType);\n }\n }\n case ElementKind.FIELD: {\n let initializerNode = (target).initializerNode;\n if (\n (target).is(CommonFlags.READONLY) &&\n !(\n flow.actualFunction.is(CommonFlags.CONSTRUCTOR) ||\n initializerNode\n )\n ) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, (target).internalName\n );\n return module.createUnreachable();\n }\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n let type = (target).type;\n this.currentType = tee ? type : Type.void;\n let nativeType = type.toNativeType();\n if (type.kind == TypeKind.BOOL) {\n // make sure bools are wrapped (usually are) when storing as 8 bits\n valueWithCorrectType = this.ensureSmallIntegerWrap(valueWithCorrectType, type);\n }\n if (tee) {\n let flow = this.currentFlow;\n let tempLocal = flow.getAndFreeTempLocal(\n type,\n !flow.canOverflow(valueWithCorrectType, type)\n );\n let tempLocalIndex = tempLocal.index;\n // TODO: simplify if valueWithCorrectType has no side effects\n // TODO: call __gc_link here if a GC is present\n return module.createBlock(null, [\n module.createSetLocal(tempLocalIndex, valueWithCorrectType),\n module.createStore(\n type.byteSize,\n thisExpr,\n module.createGetLocal(tempLocalIndex, nativeType),\n nativeType,\n (target).memoryOffset\n ),\n module.createGetLocal(tempLocalIndex, nativeType)\n ], nativeType);\n } else {\n // TODO: call __gc_link here if a GC is present\n return module.createStore(\n type.byteSize,\n thisExpr,\n valueWithCorrectType,\n nativeType,\n (target).memoryOffset\n );\n }\n }\n case ElementKind.PROPERTY_PROTOTYPE: { // static property\n let setterPrototype = (target).setterPrototype;\n if (!setterPrototype) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, target.internalName\n );\n return module.createUnreachable();\n }\n let setterInstance = this.resolver.resolveFunction(setterPrototype, null, makeMap(), ReportMode.REPORT);\n if (!setterInstance) return module.createUnreachable();\n // call just the setter if the return value isn't of interest\n if (!tee) return this.makeCallDirect(setterInstance, [ valueWithCorrectType ]);\n // otherwise call the setter first, then the getter\n let getterPrototype = assert((target).getterPrototype); // must be present\n let getterInstance = this.resolver.resolveFunction(getterPrototype, null, makeMap(), ReportMode.REPORT);\n if (!getterInstance) return module.createUnreachable();\n let returnType = getterInstance.signature.returnType;\n let nativeReturnType = returnType.toNativeType();\n return module.createBlock(null, [\n this.makeCallDirect(setterInstance, [ valueWithCorrectType ]),\n this.makeCallDirect(getterInstance) // sets currentType\n ], nativeReturnType);\n }\n case ElementKind.PROPERTY: { // instance property\n let setterInstance = (target).setterInstance;\n if (!setterInstance) {\n this.error(\n DiagnosticCode.Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property,\n expression.range, target.internalName\n );\n return module.createUnreachable();\n }\n // call just the setter if the return value isn't of interest\n if (!tee) {\n let thisExpr = this.compileExpressionRetainType(\n assert(this.resolver.currentThisExpression),\n this.options.usizeType,\n WrapMode.NONE\n );\n return this.makeCallDirect(setterInstance, [ thisExpr, valueWithCorrectType ]);\n }\n // otherwise call the setter first, then the getter\n let getterInstance = assert((target).getterInstance); // must be present\n let returnType = getterInstance.signature.returnType;\n let nativeReturnType = returnType.toNativeType();\n let thisExpr = this.compileExpressionRetainType(\n assert(this.resolver.currentThisExpression),\n this.options.usizeType,\n WrapMode.NONE\n );\n let tempLocal = flow.getAndFreeTempLocal(returnType, false);\n let tempLocalIndex = tempLocal.index;\n return module.createBlock(null, [\n this.makeCallDirect(setterInstance, [ // set and remember the target\n module.createTeeLocal(tempLocalIndex, thisExpr),\n valueWithCorrectType\n ]),\n this.makeCallDirect(getterInstance, [ // get from remembered target\n module.createGetLocal(tempLocalIndex, nativeReturnType)\n ])\n ], nativeReturnType);\n }\n case ElementKind.CLASS: {\n let elementExpression = this.resolver.currentElementExpression;\n if (elementExpression) {\n let isUnchecked = flow.is(FlowFlags.UNCHECKED_CONTEXT);\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\n if (!indexedGet) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n expression.range, target.internalName\n );\n return module.createUnreachable();\n }\n let indexedSet = (target).lookupOverload(OperatorKind.INDEXED_SET, isUnchecked);\n if (!indexedSet) {\n this.error(\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\n expression.range, target.internalName\n );\n this.currentType = tee ? indexedGet.signature.returnType : Type.void;\n return module.createUnreachable();\n }\n let targetType = (target).type;\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n let elementExpr = this.compileExpression(\n elementExpression,\n Type.i32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n if (tee) {\n let tempLocalTarget = flow.getTempLocal(targetType, false);\n let tempLocalElement = flow.getAndFreeTempLocal(this.currentType, false);\n let returnType = indexedGet.signature.returnType;\n flow.freeTempLocal(tempLocalTarget);\n return module.createBlock(null, [\n this.makeCallDirect(indexedSet, [\n module.createTeeLocal(tempLocalTarget.index, thisExpr),\n module.createTeeLocal(tempLocalElement.index, elementExpr),\n valueWithCorrectType\n ]),\n this.makeCallDirect(indexedGet, [\n module.createGetLocal(tempLocalTarget.index, tempLocalTarget.type.toNativeType()),\n module.createGetLocal(tempLocalElement.index, tempLocalElement.type.toNativeType())\n ])\n ], returnType.toNativeType());\n } else {\n return this.makeCallDirect(indexedSet, [\n thisExpr,\n elementExpr,\n valueWithCorrectType\n ]);\n }\n }\n // fall-through\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n compileCallExpression(expression: CallExpression, contextualType: Type): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n\n // handle call to super\n if (expression.expression.kind == NodeKind.SUPER) {\n let flow = this.currentFlow;\n let actualFunction = flow.actualFunction;\n if (!actualFunction.is(CommonFlags.CONSTRUCTOR)) {\n this.error(\n DiagnosticCode.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors,\n expression.range\n );\n return module.createUnreachable();\n }\n\n let classInstance = assert(actualFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\n let baseClassInstance = assert((classInstance).base);\n let thisLocal = assert(flow.lookupLocal(CommonSymbols.this_));\n let nativeSizeType = this.options.nativeSizeType;\n\n // {\n // this = super(this || , ...args)\n // this.a = X\n // this.b = Y\n // }\n let stmts: ExpressionRef[] = [\n module.createSetLocal(thisLocal.index,\n this.compileCallDirect(\n this.ensureConstructor(baseClassInstance, expression),\n expression.arguments,\n expression,\n module.createIf(\n module.createGetLocal(thisLocal.index, nativeSizeType),\n module.createGetLocal(thisLocal.index, nativeSizeType),\n this.makeAllocation(classInstance)\n )\n )\n )\n ];\n this.makeFieldInitialization(classInstance, stmts);\n\n // check that super had been called before accessing allocating `this`\n if (flow.isAny(\n FlowFlags.ALLOCATES |\n FlowFlags.CONDITIONALLY_ALLOCATES\n )) {\n this.error(\n DiagnosticCode._super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class,\n expression.range\n );\n return module.createUnreachable();\n }\n flow.set(FlowFlags.ALLOCATES | FlowFlags.CALLS_SUPER);\n this.currentType = Type.void;\n return module.createBlock(null, stmts);\n }\n\n // otherwise resolve normally\n var target = this.resolver.resolveExpression(expression.expression, flow); // reports\n if (!target) return module.createUnreachable();\n\n var signature: Signature | null;\n var indexArg: ExpressionRef;\n switch (target.kind) {\n\n // direct call: concrete function\n case ElementKind.FUNCTION_PROTOTYPE: {\n let prototype = target;\n let typeArguments = expression.typeArguments;\n\n // builtins handle present respectively omitted type arguments on their own\n if (prototype.hasDecorator(DecoratorFlags.BUILTIN)) {\n return this.compileCallExpressionBuiltin(prototype, expression, contextualType);\n }\n\n let instance: Function | null = null;\n\n // resolve generic call if type arguments have been provided\n if (typeArguments) {\n if (!prototype.is(CommonFlags.GENERIC)) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n expression.expression.range, prototype.internalName\n );\n return module.createUnreachable();\n }\n instance = this.resolver.resolveFunctionInclTypeArguments(\n prototype,\n typeArguments,\n flow.actualFunction.parent, // relative to caller\n makeMap(flow.contextualTypeArguments),\n expression\n );\n\n // infer generic call if type arguments have been omitted\n } else if (prototype.is(CommonFlags.GENERIC)) {\n let inferredTypes = new Map();\n let typeParameterNodes = assert(prototype.typeParameterNodes);\n let numTypeParameters = typeParameterNodes.length;\n for (let i = 0; i < numTypeParameters; ++i) {\n inferredTypes.set(typeParameterNodes[i].name.text, null);\n }\n // let numInferred = 0;\n let parameterNodes = prototype.signatureNode.parameters;\n let numParameters = parameterNodes.length;\n let argumentNodes = expression.arguments;\n let numArguments = argumentNodes.length;\n let argumentExprs = new Array(numArguments);\n for (let i = 0; i < numParameters; ++i) {\n let typeNode = parameterNodes[i].type;\n let templateName = typeNode.kind == NodeKind.TYPE && !(typeNode).name.next\n ? (typeNode).name.identifier.text\n : null;\n let argumentExpression = i < numArguments\n ? argumentNodes[i]\n : parameterNodes[i].initializer;\n if (!argumentExpression) { // missing initializer -> too few arguments\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n expression.range, numParameters.toString(10), numArguments.toString(10)\n );\n return module.createUnreachable();\n }\n if (templateName !== null && inferredTypes.has(templateName)) {\n let inferredType = inferredTypes.get(templateName);\n if (inferredType) {\n argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, inferredType, WrapMode.NONE);\n let commonType: Type | null;\n if (!(commonType = Type.commonCompatible(inferredType, this.currentType, true))) {\n if (!(commonType = Type.commonCompatible(inferredType, this.currentType, false))) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n parameterNodes[i].type.range, this.currentType.toString(), inferredType.toString()\n );\n return module.createUnreachable();\n }\n }\n inferredType = commonType;\n } else {\n argumentExprs[i] = this.compileExpressionRetainType(argumentExpression, Type.i32, WrapMode.NONE);\n inferredType = this.currentType;\n // ++numInferred;\n }\n inferredTypes.set(templateName, inferredType);\n } else {\n let concreteType = this.resolver.resolveType(\n parameterNodes[i].type,\n flow.actualFunction,\n flow.contextualTypeArguments\n );\n if (!concreteType) return module.createUnreachable();\n argumentExprs[i] = this.compileExpression(\n argumentExpression,\n concreteType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n }\n }\n let resolvedTypeArguments = new Array(numTypeParameters);\n for (let i = 0; i < numTypeParameters; ++i) {\n let inferredType = assert(inferredTypes.get(typeParameterNodes[i].name.text)); // TODO\n resolvedTypeArguments[i] = inferredType;\n }\n instance = this.resolver.resolveFunction(\n prototype,\n resolvedTypeArguments,\n makeMap(flow.contextualTypeArguments)\n );\n if (!instance) return this.module.createUnreachable();\n return this.makeCallDirect(instance, argumentExprs);\n // TODO: this skips inlining because inlining requires compiling its temporary locals in\n // the scope of the inlined flow. might need another mechanism to lock temp. locals early,\n // so inlining can be performed in `makeCallDirect` instead?\n\n // otherwise resolve the non-generic call as usual\n } else {\n instance = this.resolver.resolveFunction(prototype, null);\n }\n if (!instance) return this.module.createUnreachable();\n\n // compile 'this' expression if an instance method\n let thisExpr: ExpressionRef = 0;\n if (instance.is(CommonFlags.INSTANCE)) {\n thisExpr = this.compileExpressionRetainType(\n assert(this.resolver.currentThisExpression),\n this.options.usizeType,\n WrapMode.NONE\n );\n }\n\n return this.compileCallDirect(\n instance,\n expression.arguments,\n expression,\n thisExpr\n );\n }\n\n // indirect call: index argument with signature (non-generic, can't be inlined)\n case ElementKind.LOCAL: {\n if (signature = (target).type.signatureReference) {\n if ((target).is(CommonFlags.INLINED)) {\n indexArg = module.createI32(i64_low((target).constantIntegerValue));\n } else {\n indexArg = module.createGetLocal((target).index, NativeType.I32);\n }\n break;\n } else {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, (target).type.toString()\n );\n return module.createUnreachable();\n }\n }\n case ElementKind.GLOBAL: {\n if (signature = (target).type.signatureReference) {\n indexArg = module.createGetGlobal((target).internalName, (target).type.toNativeType());\n break;\n } else {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, (target).type.toString()\n );\n return module.createUnreachable();\n }\n }\n case ElementKind.FIELD: {\n let type = (target).type;\n if (signature = type.signatureReference) {\n let thisExpression = assert(this.resolver.currentThisExpression);\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n indexArg = module.createLoad(\n 4,\n false,\n thisExpr,\n NativeType.I32,\n (target).memoryOffset\n );\n break;\n } else {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, type.toString()\n );\n return module.createUnreachable();\n }\n }\n case ElementKind.FUNCTION_TARGET: {\n signature = (target).signature;\n indexArg = this.compileExpression(\n expression.expression,\n (target).type,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n break;\n }\n\n case ElementKind.PROPERTY_PROTOTYPE: { // static property\n let getterPrototype = assert((target).getterPrototype);\n let getterInstance = this.resolver.resolveFunction(getterPrototype, null);\n if (!getterInstance) return module.createUnreachable();\n indexArg = this.compileCallDirect(getterInstance, [], expression.expression);\n signature = this.currentType.signatureReference;\n if (!signature) {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, this.currentType.toString()\n );\n return module.createUnreachable();\n }\n break;\n }\n case ElementKind.PROPERTY: { // instance property\n let getterInstance = assert((target).getterInstance);\n indexArg = this.compileCallDirect(getterInstance, [], expression.expression,\n this.compileExpressionRetainType(\n assert(this.resolver.currentThisExpression),\n this.options.usizeType,\n WrapMode.NONE\n )\n );\n signature = this.currentType.signatureReference;\n if (!signature) {\n this.error(\n DiagnosticCode.Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures,\n expression.range, this.currentType.toString()\n );\n return module.createUnreachable();\n }\n break;\n }\n\n // not supported\n default: {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n }\n return this.compileCallIndirect(\n signature,\n indexArg,\n expression.arguments,\n expression\n );\n }\n\n private compileCallExpressionBuiltin(\n prototype: FunctionPrototype,\n expression: CallExpression,\n contextualType: Type\n ): ExpressionRef {\n var typeArguments: Type[] | null = null;\n\n // builtins handle omitted type arguments on their own. if present, however, resolve them here\n // and pass them to the builtin, even if it's still up to the builtin how to handle them.\n var typeParameterNodes = prototype.typeParameterNodes;\n var typeArgumentNodes = expression.typeArguments;\n if (expression.typeArguments) {\n if (!prototype.is(CommonFlags.GENERIC)) {\n this.error(\n DiagnosticCode.Type_0_is_not_generic,\n expression.range, prototype.internalName\n );\n }\n typeArguments = this.resolver.resolveTypeArguments(\n assert(typeParameterNodes),\n typeArgumentNodes,\n this.currentFlow.actualFunction.parent,\n makeMap(this.currentFlow.contextualTypeArguments),\n expression\n );\n }\n\n // now compile the builtin, which usually returns a block of code that replaces the call.\n var expr = compileBuiltinCall(\n this,\n prototype,\n typeArguments,\n expression.arguments,\n contextualType,\n expression\n );\n if (!expr) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n return expr;\n }\n\n /**\n * Checks that a call with the given number as arguments can be performed according to the\n * specified signature.\n */\n checkCallSignature(\n signature: Signature,\n numArguments: i32,\n hasThis: bool,\n reportNode: Node\n ): bool {\n\n // cannot call an instance method without a `this` argument (TODO: `.call`?)\n var thisType = signature.thisType;\n if (hasThis != (thisType != null)) {\n this.error(\n DiagnosticCode.Operation_not_supported, // TODO: better message?\n reportNode.range\n );\n return false;\n }\n\n // not yet implemented (TODO: maybe some sort of an unmanaged/lightweight array?)\n var hasRest = signature.hasRest;\n if (hasRest) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return false;\n }\n\n var minimum = signature.requiredParameters;\n var maximum = signature.parameterTypes.length;\n\n // must at least be called with required arguments\n if (numArguments < minimum) {\n this.error(\n minimum < maximum\n ? DiagnosticCode.Expected_at_least_0_arguments_but_got_1\n : DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, minimum.toString(), numArguments.toString()\n );\n return false;\n }\n\n // must not be called with more than the maximum arguments\n if (numArguments > maximum && !hasRest) {\n this.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, maximum.toString(), numArguments.toString()\n );\n return false;\n }\n\n return true;\n }\n\n /** Compiles a direct call to a concrete function. */\n compileCallDirect(\n instance: Function,\n argumentExpressions: Expression[],\n reportNode: Node,\n thisArg: ExpressionRef = 0\n ): ExpressionRef {\n var numArguments = argumentExpressions.length;\n var signature = instance.signature;\n\n if (!this.checkCallSignature( // reports\n signature,\n numArguments,\n thisArg != 0,\n reportNode\n )) {\n return this.module.createUnreachable();\n }\n\n // Inline if explicitly requested\n if (instance.hasDecorator(DecoratorFlags.INLINE)) {\n assert(!instance.is(CommonFlags.TRAMPOLINE)); // doesn't make sense\n if (this.currentInlineFunctions.includes(instance)) {\n this.warning(\n DiagnosticCode.Function_0_cannot_be_inlined_into_itself,\n reportNode.range, instance.internalName\n );\n } else {\n this.currentInlineFunctions.push(instance);\n let expr = this.compileCallInlinePrechecked(instance, argumentExpressions, thisArg);\n this.currentInlineFunctions.pop();\n return expr;\n }\n }\n\n // Otherwise compile to just a call\n var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\n var operands = new Array(numArgumentsInclThis);\n var index = 0;\n if (thisArg) {\n operands[0] = thisArg;\n index = 1;\n }\n var parameterTypes = signature.parameterTypes;\n for (let i = 0; i < numArguments; ++i, ++index) {\n operands[index] = this.compileExpression(\n argumentExpressions[i],\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n }\n assert(index == numArgumentsInclThis);\n return this.makeCallDirect(instance, operands);\n }\n\n // Depends on being pre-checked in compileCallDirect\n private compileCallInlinePrechecked(\n instance: Function,\n argumentExpressions: Expression[],\n thisArg: ExpressionRef = 0\n ): ExpressionRef {\n var module = this.module;\n\n // Create a new inline flow and use it to compile the function as a block\n var previousFlow = this.currentFlow;\n var flow = Flow.createInline(previousFlow.parentFunction, instance);\n\n // Convert provided call arguments to temporary locals. It is important that these are compiled\n // here, with their respective locals being blocked. There is no 'makeCallInline'.\n var body = [];\n\n if (thisArg) {\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\n let thisType = assert(instance.signature.thisType);\n let thisLocal = flow.addScopedLocal(CommonSymbols.this_, thisType, false);\n body.push(\n module.createSetLocal(thisLocal.index, thisArg)\n );\n let baseInstance = (classInstance).base;\n if (baseInstance) flow.addScopedAlias(CommonSymbols.super_, baseInstance.type, thisLocal.index);\n }\n\n var numArguments = argumentExpressions.length;\n var signature = instance.signature;\n var parameterTypes = signature.parameterTypes;\n for (let i = 0; i < numArguments; ++i) {\n let paramExpr = this.compileExpression(\n argumentExpressions[i],\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n let argumentLocal = flow.addScopedLocal(\n signature.getParameterName(i),\n parameterTypes[i],\n !previousFlow.canOverflow(paramExpr, parameterTypes[i])\n );\n body.push(\n module.createSetLocal(argumentLocal.index, paramExpr)\n );\n }\n\n // Compile optional parameter initializers in the scope of the inlined flow\n this.currentFlow = flow;\n var numParameters = signature.parameterTypes.length;\n for (let i = numArguments; i < numParameters; ++i) {\n let initExpr = this.compileExpression(\n assert(instance.prototype.signatureNode.parameters[i].initializer),\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.WRAP\n );\n let argumentLocal = flow.addScopedLocal(\n signature.getParameterName(i),\n parameterTypes[i],\n !flow.canOverflow(initExpr, parameterTypes[i])\n );\n body.push(\n module.createSetLocal(argumentLocal.index, initExpr)\n );\n }\n\n // Compile the called function's body in the scope of the inlined flow\n {\n let stmts = this.compileFunctionBody(instance);\n for (let i = 0, k = stmts.length; i < k; ++i) body.push(stmts[i]);\n }\n\n // Free any new scoped locals and reset to the original flow\n flow.freeScopedLocals();\n var returnType = flow.returnType;\n this.currentFlow = previousFlow;\n this.currentType = returnType;\n\n // Create an outer block that we can break to when returning a value out of order\n return module.createBlock(flow.inlineReturnLabel, body, returnType.toNativeType());\n }\n\n /** Gets the trampoline for the specified function. */\n ensureTrampoline(original: Function): Function {\n // A trampoline is a function that takes a fixed amount of operands with some of them possibly\n // being zeroed. It takes one additional argument denoting the number of actual operands\n // provided to the call, and takes appropriate steps to initialize zeroed operands to their\n // default values using the optional parameter initializers of the original function. Doing so\n // allows calls to functions with optional parameters to circumvent the trampoline when all\n // parameters are provided as a fast route, respectively setting up omitted operands in a proper\n // context otherwise.\n var trampoline = original.trampoline;\n if (trampoline) return trampoline;\n\n var originalSignature = original.signature;\n var originalName = original.internalName;\n var originalParameterTypes = originalSignature.parameterTypes;\n var originalParameterDeclarations = original.prototype.signatureNode.parameters;\n var commonReturnType = originalSignature.returnType;\n var commonThisType = originalSignature.thisType;\n var isInstance = original.is(CommonFlags.INSTANCE);\n\n // arguments excl. `this`, operands incl. `this`\n var minArguments = originalSignature.requiredParameters;\n var minOperands = minArguments;\n var maxArguments = originalParameterTypes.length;\n var maxOperands = maxArguments;\n if (isInstance) {\n ++minOperands;\n ++maxOperands;\n }\n var numOptional = assert(maxOperands - minOperands);\n\n var forwardedOperands = new Array(minOperands);\n var operandIndex = 0;\n\n // forward `this` if applicable\n var module = this.module;\n if (isInstance) {\n forwardedOperands[0] = module.createGetLocal(0, this.options.nativeSizeType);\n operandIndex = 1;\n }\n\n // forward required arguments\n for (let i = 0; i < minArguments; ++i, ++operandIndex) {\n forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, originalParameterTypes[i].toNativeType());\n }\n assert(operandIndex == minOperands);\n\n // create the trampoline element\n var trampolineSignature = new Signature(originalParameterTypes, commonReturnType, commonThisType);\n trampolineSignature.requiredParameters = maxArguments;\n trampoline = new Function(\n original.name + \"|trampoline\",\n original.prototype,\n trampolineSignature,\n original.contextualTypeArguments\n );\n trampoline.set(original.flags | CommonFlags.TRAMPOLINE | CommonFlags.COMPILED);\n original.trampoline = trampoline;\n\n // compile initializers of omitted arguments in scope of the trampoline function\n // this is necessary because initializers might need additional locals and a proper this context\n var previousFlow = this.currentFlow;\n this.currentFlow = trampoline.flow;\n\n // create a br_table switching over the number of optional parameters provided\n var numNames = numOptional + 1; // incl. outer block\n var names = new Array(numNames);\n var ofN = \"of\" + numOptional.toString(10);\n for (let i = 0; i < numNames; ++i) {\n let label = i.toString(10) + ofN;\n names[i] = label;\n }\n var body = module.createBlock(names[0], [\n module.createBlock(\"outOfRange\", [\n module.createSwitch(names, \"outOfRange\",\n // condition is number of provided optional arguments, so subtract required arguments\n minArguments\n ? module.createBinary(\n BinaryOp.SubI32,\n module.createGetGlobal(CompilerSymbols.argc, NativeType.I32),\n module.createI32(minArguments)\n )\n : module.createGetGlobal(CompilerSymbols.argc, NativeType.I32)\n )\n ]),\n module.createUnreachable()\n ]);\n for (let i = 0; i < numOptional; ++i, ++operandIndex) {\n let type = originalParameterTypes[minArguments + i];\n let declaration = originalParameterDeclarations[minArguments + i];\n let initializer = declaration.initializer;\n let initExpr: ExpressionRef;\n if (initializer) {\n initExpr = module.createSetLocal(operandIndex,\n this.compileExpression(\n initializer,\n type,\n ConversionKind.IMPLICIT,\n WrapMode.WRAP\n )\n );\n } else {\n this.error(\n DiagnosticCode.Optional_parameter_must_have_an_initializer,\n declaration.range\n );\n initExpr = module.createUnreachable();\n }\n body = module.createBlock(names[i + 1], [\n body,\n initExpr,\n ]);\n forwardedOperands[operandIndex] = module.createGetLocal(operandIndex, type.toNativeType());\n }\n this.currentFlow = previousFlow;\n assert(operandIndex == maxOperands);\n\n var funcRef = module.addFunction(\n trampoline.internalName,\n this.ensureFunctionType(\n trampolineSignature.parameterTypes,\n trampolineSignature.returnType,\n trampolineSignature.thisType\n ),\n typesToNativeTypes(trampoline.additionalLocals),\n module.createBlock(null, [\n body,\n module.createCall(\n originalName,\n forwardedOperands,\n commonReturnType.toNativeType()\n )\n ], commonReturnType.toNativeType())\n );\n trampoline.finalize(module, funcRef);\n return trampoline;\n }\n\n /** Makes sure that the argument count helper global is present and returns its name. */\n private ensureArgcVar(): string {\n if (!this.argcVar) {\n let module = this.module;\n this.argcVar = module.addGlobal(\n CompilerSymbols.argc,\n NativeType.I32,\n true,\n module.createI32(0)\n );\n }\n return CompilerSymbols.argc;\n }\n\n /** Makes sure that the argument count helper setter is present and returns its name. */\n private ensureArgcSet(): string {\n var internalName = CompilerSymbols.setargc;\n if (!this.argcSet) {\n let module = this.module;\n this.argcSet = module.addFunction(internalName,\n this.ensureFunctionType([ Type.u32 ], Type.void),\n null,\n module.createSetGlobal(this.ensureArgcVar(),\n module.createGetLocal(0, NativeType.I32)\n )\n );\n module.addFunctionExport(internalName, \"_setargc\");\n }\n return internalName;\n }\n\n /** Creates a direct call to the specified function. */\n makeCallDirect(\n instance: Function,\n operands: ExpressionRef[] | null = null\n ): ExpressionRef {\n var numOperands = operands ? operands.length : 0;\n var numArguments = numOperands;\n var minArguments = instance.signature.requiredParameters;\n var minOperands = minArguments;\n var maxArguments = instance.signature.parameterTypes.length;\n var maxOperands = maxArguments;\n if (instance.is(CommonFlags.INSTANCE)) {\n ++minOperands;\n ++maxOperands;\n --numArguments;\n }\n assert(numOperands >= minOperands);\n\n var module = this.module;\n if (!this.compileFunction(instance)) return module.createUnreachable();\n var returnType = instance.signature.returnType;\n var isCallImport = instance.is(CommonFlags.MODULE_IMPORT);\n\n // fill up omitted arguments with their initializers, if constant, otherwise with zeroes.\n if (numOperands < maxOperands) {\n if (!operands) {\n operands = new Array(maxOperands);\n operands.length = 0;\n }\n let parameterTypes = instance.signature.parameterTypes;\n let parameterNodes = instance.prototype.signatureNode.parameters;\n assert(parameterNodes.length == parameterTypes.length);\n let allOptionalsAreConstant = true;\n for (let i = numArguments; i < maxArguments; ++i) {\n let initializer = parameterNodes[i].initializer;\n if (!(initializer && nodeIsConstantValue(initializer.kind))) {\n allOptionalsAreConstant = false;\n break;\n }\n }\n if (allOptionalsAreConstant) { // inline into the call\n for (let i = numArguments; i < maxArguments; ++i) {\n operands.push(\n this.compileExpression(\n parameterNodes[i].initializer,\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n )\n );\n }\n } else { // otherwise fill up with zeroes and call the trampoline\n for (let i = numArguments; i < maxArguments; ++i) {\n operands.push(parameterTypes[i].toNativeZero(module));\n }\n if (!isCallImport) {\n let original = instance;\n instance = this.ensureTrampoline(instance);\n if (!this.compileFunction(instance)) return module.createUnreachable();\n instance.flow.flags = original.flow.flags;\n let nativeReturnType = returnType.toNativeType();\n this.currentType = returnType;\n return module.createBlock(null, [\n module.createSetGlobal(this.ensureArgcVar(), module.createI32(numArguments)),\n module.createCall(instance.internalName, operands, nativeReturnType)\n ], nativeReturnType);\n }\n }\n }\n\n // otherwise just call through\n this.currentType = returnType;\n return module.createCall(instance.internalName, operands, returnType.toNativeType());\n }\n\n /** Compiles an indirect call using an index argument and a signature. */\n compileCallIndirect(\n signature: Signature,\n indexArg: ExpressionRef,\n argumentExpressions: Expression[],\n reportNode: Node,\n thisArg: ExpressionRef = 0\n ): ExpressionRef {\n var numArguments = argumentExpressions.length;\n\n if (!this.checkCallSignature( // reports\n signature,\n numArguments,\n thisArg != 0,\n reportNode\n )) {\n return this.module.createUnreachable();\n }\n\n var numArgumentsInclThis = thisArg ? numArguments + 1 : numArguments;\n var operands = new Array(numArgumentsInclThis);\n var index = 0;\n if (thisArg) {\n operands[0] = thisArg;\n index = 1;\n }\n var parameterTypes = signature.parameterTypes;\n for (let i = 0; i < numArguments; ++i, ++index) {\n operands[index] = this.compileExpression(\n argumentExpressions[i],\n parameterTypes[i],\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n }\n assert(index == numArgumentsInclThis);\n return this.makeCallIndirect(signature, indexArg, operands);\n }\n\n /** Creates an indirect call to the function at `indexArg` in the function table. */\n makeCallIndirect(\n signature: Signature,\n indexArg: ExpressionRef,\n operands: ExpressionRef[] | null = null\n ): ExpressionRef {\n var numOperands = operands ? operands.length : 0;\n var numArguments = numOperands;\n var minArguments = signature.requiredParameters;\n var minOperands = minArguments;\n var maxArguments = signature.parameterTypes.length;\n var maxOperands = maxArguments;\n if (signature.thisType) {\n ++minOperands;\n ++maxOperands;\n --numArguments;\n }\n assert(numOperands >= minOperands);\n\n this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var module = this.module;\n\n // fill up omitted arguments with zeroes\n if (numOperands < maxOperands) {\n if (!operands) {\n operands = new Array(maxOperands);\n operands.length = 0;\n }\n let parameterTypes = signature.parameterTypes;\n for (let i = numArguments; i < maxArguments; ++i) {\n operands.push(parameterTypes[i].toNativeZero(module));\n }\n }\n\n var returnType = signature.returnType;\n this.currentType = returnType;\n return module.createBlock(null, [\n module.createSetGlobal(this.ensureArgcVar(), // might still be calling a trampoline\n module.createI32(numArguments)\n ),\n module.createCallIndirect(indexArg, operands, signature.toSignatureString())\n ], returnType.toNativeType()); // not necessarily wrapped\n }\n\n compileCommaExpression(expression: CommaExpression, contextualType: Type): ExpressionRef {\n var expressions = expression.expressions;\n var numExpressions = expressions.length;\n var exprs = new Array(numExpressions--);\n for (let i = 0; i < numExpressions; ++i) {\n exprs[i] = this.compileExpression(\n expressions[i],\n Type.void, // drop all\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n exprs[numExpressions] = this.compileExpression(\n expressions[numExpressions],\n contextualType, // except last\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n return this.module.createBlock(null, exprs, this.currentType.toNativeType());\n }\n\n compileElementAccessExpression(expression: ElementAccessExpression, contextualType: Type): ExpressionRef {\n var target = this.resolver.resolveElementAccessExpression(\n expression,\n this.currentFlow,\n contextualType\n ); // reports\n if (!target) return this.module.createUnreachable();\n switch (target.kind) {\n case ElementKind.CLASS: {\n let isUnchecked = this.currentFlow.is(FlowFlags.UNCHECKED_CONTEXT);\n let indexedGet = (target).lookupOverload(OperatorKind.INDEXED_GET, isUnchecked);\n if (!indexedGet) {\n this.error(\n DiagnosticCode.Index_signature_is_missing_in_type_0,\n expression.expression.range, (target).internalName\n );\n return this.module.createUnreachable();\n }\n let thisArg = this.compileExpression(\n expression.expression,\n (target).type,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n return this.compileCallDirect(indexedGet, [\n expression.elementExpression\n ], expression, thisArg);\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n compileFunctionExpression(\n expression: FunctionExpression,\n contextualType: Type\n ): ExpressionRef {\n var declaration = expression.declaration;\n var name = declaration.name;\n var simpleName = (name.text.length\n ? name.text\n : \"anonymous\") + \"|\" + this.functionTable.length.toString(10);\n var flow = this.currentFlow;\n var prototype = new FunctionPrototype(\n simpleName,\n flow.actualFunction,\n declaration.clone(), // same function can be compiled multiple times if generic\n DecoratorFlags.NONE\n );\n var instance = this.compileFunctionUsingTypeArguments(\n prototype,\n [],\n makeMap(flow.contextualTypeArguments),\n declaration\n );\n if (!instance) return this.module.createUnreachable();\n this.currentType = instance.signature.type; // TODO: get cached type?\n // NOTE that, in order to make this work in every case, the function must be represented by a\n // value, so we add it and rely on the optimizer to figure out where it can be called directly.\n var index = this.ensureFunctionTableEntry(instance); // reports\n return index < 0\n ? this.module.createUnreachable()\n : this.module.createI32(index);\n }\n\n /** Makes sure the enclosing source file of the specified expression has been compiled. */\n private maybeCompileEnclosingSource(expression: Expression): void {\n var internalPath = expression.range.source.internalPath;\n var filesByName = this.program.filesByName;\n assert(filesByName.has(internalPath));\n var enclosingFile = filesByName.get(internalPath)!;\n if (!enclosingFile.is(CommonFlags.COMPILED)) {\n this.compileFileByPath(internalPath, expression);\n }\n }\n\n /**\n * Compiles an identifier in the specified context.\n * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\n * precomputes them according to context.\n */\n compileIdentifierExpression(\n expression: IdentifierExpression,\n contextualType: Type,\n retainConstantType: bool\n ): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n var actualFunction = flow.actualFunction;\n\n // check special keywords first\n switch (expression.kind) {\n case NodeKind.NULL: {\n let options = this.options;\n if (!contextualType.classReference) {\n this.currentType = options.usizeType;\n }\n return options.isWasm64\n ? module.createI64(0)\n : module.createI32(0);\n }\n case NodeKind.TRUE: {\n this.currentType = Type.bool;\n return module.createI32(1);\n }\n case NodeKind.FALSE: {\n this.currentType = Type.bool;\n return module.createI32(0);\n }\n case NodeKind.THIS: {\n if (actualFunction.is(CommonFlags.INSTANCE)) {\n let thisLocal = assert(flow.lookupLocal(CommonSymbols.this_));\n let classInstance = assert(actualFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\n let nativeSizeType = this.options.nativeSizeType;\n if (actualFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.ALLOCATES)) {\n flow.set(FlowFlags.ALLOCATES);\n // {\n // if (!this) this = \n // this.a = X\n // this.b = Y\n // return this\n // }\n let stmts: ExpressionRef[] = [\n module.createIf(\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\n module.createGetLocal(thisLocal.index, nativeSizeType)\n ),\n module.createSetLocal(thisLocal.index,\n this.makeAllocation(classInstance)\n )\n )\n ];\n this.makeFieldInitialization(classInstance, stmts);\n stmts.push(\n module.createGetLocal(thisLocal.index, nativeSizeType)\n );\n this.currentType = thisLocal.type;\n return module.createBlock(null, stmts, nativeSizeType);\n }\n }\n // if not a constructor, `this` type can differ\n let thisType = assert(actualFunction.signature.thisType);\n this.currentType = thisType;\n return module.createGetLocal(thisLocal.index, thisType.toNativeType());\n }\n this.error(\n DiagnosticCode._this_cannot_be_referenced_in_current_location,\n expression.range\n );\n this.currentType = this.options.usizeType;\n return module.createUnreachable();\n }\n case NodeKind.SUPER: {\n let flow = this.currentFlow;\n let actualFunction = flow.actualFunction;\n if (actualFunction.is(CommonFlags.CONSTRUCTOR)) {\n if (!flow.is(FlowFlags.CALLS_SUPER)) {\n // TS1034 in the parser effectively limits this to property accesses\n this.error(\n DiagnosticCode._super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class,\n expression.range\n );\n }\n }\n if (flow.is(FlowFlags.INLINE_CONTEXT)) {\n let scopedThis = flow.lookupLocal(CommonSymbols.this_);\n if (scopedThis) {\n let scopedThisClass = assert(scopedThis.type.classReference);\n let base = scopedThisClass.base;\n if (base) {\n this.currentType = base.type;\n return module.createGetLocal(scopedThis.index, base.type.toNativeType());\n }\n }\n }\n if (actualFunction.is(CommonFlags.INSTANCE)) {\n let classInstance = assert(actualFunction.parent); assert(classInstance.kind == ElementKind.CLASS);\n let baseClassInstance = (classInstance).base;\n if (baseClassInstance) {\n let superType = baseClassInstance.type;\n this.currentType = superType;\n return module.createGetLocal(0, superType.toNativeType());\n }\n }\n this.error(\n DiagnosticCode._super_can_only_be_referenced_in_a_derived_class,\n expression.range\n );\n this.currentType = this.options.usizeType;\n return module.createUnreachable();\n }\n }\n\n this.maybeCompileEnclosingSource(expression);\n\n // otherwise resolve\n var target = this.resolver.resolveIdentifier( // reports\n expression,\n flow,\n this.currentEnum || actualFunction\n );\n if (!target) return module.createUnreachable();\n\n switch (target.kind) {\n case ElementKind.LOCAL: {\n let localType = (target).type;\n assert(localType != Type.void);\n if ((target).is(CommonFlags.INLINED)) {\n return this.compileInlineConstant(target, contextualType, retainConstantType);\n }\n let localIndex = (target).index;\n assert(localIndex >= 0);\n this.currentType = localType;\n return this.module.createGetLocal(localIndex, localType.toNativeType());\n }\n case ElementKind.GLOBAL: {\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field\n return this.module.createUnreachable();\n }\n let globalType = (target).type;\n assert(globalType != Type.void);\n if ((target).is(CommonFlags.INLINED)) {\n return this.compileInlineConstant(target, contextualType, retainConstantType);\n }\n this.currentType = globalType;\n return this.module.createGetGlobal((target).internalName, globalType.toNativeType());\n }\n case ElementKind.ENUMVALUE: { // here: if referenced from within the same enum\n if (!target.is(CommonFlags.COMPILED)) {\n this.error(\n DiagnosticCode.A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums,\n expression.range\n );\n this.currentType = Type.i32;\n return this.module.createUnreachable();\n }\n this.currentType = Type.i32;\n if ((target).is(CommonFlags.INLINED)) {\n assert((target).constantValueKind == ConstantValueKind.INTEGER);\n return this.module.createI32(i64_low((target).constantIntegerValue));\n }\n return this.module.createGetGlobal((target).internalName, NativeType.I32);\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n let instance = this.resolver.resolveFunction(\n target,\n null,\n makeMap(flow.contextualTypeArguments)\n );\n if (!(instance && this.compileFunction(instance))) return module.createUnreachable();\n let index = this.ensureFunctionTableEntry(instance);\n this.currentType = instance.signature.type;\n return this.module.createI32(index);\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return this.module.createUnreachable();\n }\n\n compileInstanceOfExpression(\n expression: InstanceOfExpression,\n contextualType: Type\n ): ExpressionRef {\n var module = this.module;\n // NOTE that this differs from TypeScript in that the rhs is a type, not an expression. at the\n // time of implementation, this seemed more useful because dynamic rhs expressions are not\n // possible in AS anyway.\n var expr = this.compileExpressionRetainType(expression.expression, this.options.usizeType, WrapMode.NONE);\n var actualType = this.currentType;\n var expectedType = this.resolver.resolveType(\n expression.isType,\n this.currentFlow.actualFunction\n );\n this.currentType = Type.bool;\n if (!expectedType) return module.createUnreachable();\n\n // instanceof must be exact\n if (!expectedType.is(TypeFlags.REFERENCE)) {\n return module.createI32(actualType == expectedType ? 1 : 0);\n }\n // instanceof must be != 0\n if (\n actualType.is(TypeFlags.NULLABLE) && !expectedType.is(TypeFlags.NULLABLE) &&\n actualType.nonNullableType.isAssignableTo(expectedType)\n ) {\n return module.createBinary(\n actualType.is(TypeFlags.LONG)\n ? BinaryOp.NeI64\n : BinaryOp.NeI32,\n expr,\n actualType.toNativeZero(module)\n );\n }\n return module.createI32(actualType.isAssignableTo(expectedType) ? 1 : 0);\n }\n\n compileLiteralExpression(\n expression: LiteralExpression,\n contextualType: Type,\n implicitNegate: bool = false\n ): ExpressionRef {\n var module = this.module;\n switch (expression.literalKind) {\n case LiteralKind.ARRAY: {\n assert(!implicitNegate);\n let classType = contextualType.classReference;\n if (\n classType &&\n classType.prototype == this.program.arrayPrototype\n ) {\n return this.compileArrayLiteral(\n assert(classType.typeArguments)[0],\n (expression).elementExpressions,\n false, // TODO: isConst?\n expression\n );\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n case LiteralKind.FLOAT: {\n let floatValue = (expression).value;\n if (implicitNegate) {\n floatValue = -floatValue;\n }\n if (contextualType == Type.f32) {\n return module.createF32(floatValue);\n }\n this.currentType = Type.f64;\n return module.createF64(floatValue);\n }\n case LiteralKind.INTEGER: {\n let intValue = (expression).value;\n if (implicitNegate) {\n intValue = i64_sub(\n i64_new(0),\n intValue\n );\n }\n let type = this.resolver.determineIntegerLiteralType(intValue, contextualType);\n this.currentType = type;\n switch (type.kind) {\n case TypeKind.ISIZE: if (!this.options.isWasm64) return module.createI32(i64_low(intValue));\n case TypeKind.I64: return module.createI64(i64_low(intValue), i64_high(intValue));\n case TypeKind.USIZE: if (!this.options.isWasm64) return module.createI32(i64_low(intValue));\n case TypeKind.U64: return module.createI64(i64_low(intValue), i64_high(intValue));\n case TypeKind.F32: return module.createF32(i64_to_f32(intValue));\n case TypeKind.F64: return module.createF64(i64_to_f64(intValue));\n default: return module.createI32(i64_low(intValue));\n }\n }\n case LiteralKind.STRING: {\n assert(!implicitNegate);\n return this.compileStringLiteral(expression);\n }\n case LiteralKind.OBJECT: {\n assert(!implicitNegate);\n return this.compileObjectLiteral(expression, contextualType);\n }\n // case LiteralKind.REGEXP:\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n this.currentType = contextualType;\n return module.createUnreachable();\n }\n\n /** Ensures that the specified string exists in static memory and returns a pointer to it. */\n ensureStaticString(stringValue: string): ExpressionRef {\n var program = this.program;\n var hasGC = program.hasGC;\n var gcHeaderSize = program.gcHeaderSize;\n\n var stringInstance = assert(program.stringInstance);\n var stringSegment: MemorySegment;\n\n // if the string already exists, reuse it\n var segments = this.stringSegments;\n if (segments.has(stringValue)) {\n stringSegment = segments.get(stringValue);\n\n // otherwise create it\n } else {\n let length = stringValue.length;\n let headerSize = (stringInstance.currentMemoryOffset + 1) & ~1;\n let totalSize = headerSize + length * 2;\n\n let buf: Uint8Array;\n let pos: u32;\n\n if (hasGC) {\n buf = new Uint8Array(gcHeaderSize + totalSize);\n pos = gcHeaderSize;\n writeI32(ensureGCHook(this, stringInstance), buf, program.gcHookOffset);\n } else {\n buf = new Uint8Array(totalSize);\n pos = 0;\n }\n writeI32(length, buf, pos + stringInstance.offsetof(LibrarySymbols.length));\n pos += headerSize;\n for (let i = 0; i < length; ++i) {\n writeI16(stringValue.charCodeAt(i), buf, pos + (i << 1));\n }\n stringSegment = this.addMemorySegment(buf);\n segments.set(stringValue, stringSegment);\n }\n var stringOffset = stringSegment.offset;\n if (hasGC) stringOffset = i64_add(stringOffset, i64_new(gcHeaderSize));\n\n this.currentType = stringInstance.type;\n if (this.options.isWasm64) {\n return this.module.createI64(i64_low(stringOffset), i64_high(stringOffset));\n } else {\n assert(i64_is_u32(stringOffset));\n return this.module.createI32(i64_low(stringOffset));\n }\n }\n\n compileStringLiteral(expression: StringLiteralExpression): ExpressionRef {\n return this.ensureStaticString(expression.value);\n }\n\n /** Ensures that the specified array exists in static memory and returns a pointer to it. */\n ensureStaticArray(elementType: Type, values: ExpressionRef[]): ExpressionRef {\n var program = this.program;\n var hasGC = program.hasGC;\n var gcHeaderSize = program.gcHeaderSize;\n\n var length = values.length;\n var byteSize = elementType.byteSize;\n var byteLength = length * byteSize;\n var usizeTypeSize = this.options.usizeType.byteSize;\n\n var buf: Uint8Array;\n var pos: u32;\n\n // create the backing ArrayBuffer segment\n var bufferInstance = assert(program.arrayBufferInstance);\n var bufferHeaderSize = (bufferInstance.currentMemoryOffset + 7) & ~7;\n var bufferTotalSize = 1 << (32 - clz(bufferHeaderSize + byteLength - 1));\n if (hasGC) {\n buf = new Uint8Array(gcHeaderSize + bufferTotalSize);\n pos = gcHeaderSize;\n writeI32(ensureGCHook(this, bufferInstance), buf, program.gcHookOffset);\n } else {\n buf = new Uint8Array(bufferTotalSize);\n pos = 0;\n }\n writeI32(byteLength, buf, pos + bufferInstance.offsetof(LibrarySymbols.byteLength));\n pos += bufferHeaderSize;\n var nativeType = elementType.toNativeType();\n switch (nativeType) {\n case NativeType.I32: {\n switch (byteSize) {\n case 1: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeI8(getConstValueI32(value), buf, pos);\n pos += 1;\n }\n break;\n }\n case 2: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeI16(getConstValueI32(value), buf, pos);\n pos += 2;\n }\n break;\n }\n case 4: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeI32(getConstValueI32(value), buf, pos);\n pos += 4;\n }\n break;\n }\n default: assert(false);\n }\n break;\n }\n case NativeType.I64: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeI64(i64_new(getConstValueI64Low(value), getConstValueI64High(value)), buf, pos);\n pos += 8;\n }\n break;\n }\n case NativeType.F32: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeF32(getConstValueF32(value), buf, pos);\n pos += 4;\n }\n break;\n }\n case NativeType.F64: {\n for (let i = 0; i < length; ++i) {\n let value = values[i];\n assert(getExpressionType(value) == nativeType);\n assert(getExpressionId(value) == ExpressionId.Const);\n writeF64(getConstValueF64(value), buf, pos);\n pos += 8;\n }\n break;\n }\n default: assert(false);\n }\n var bufferSegment = this.addMemorySegment(buf);\n var bufferOffset = bufferSegment.offset;\n if (hasGC) bufferOffset = i64_add(bufferOffset, i64_new(gcHeaderSize));\n\n // create the Array segment and return a pointer to it\n var arrayPrototype = assert(program.arrayPrototype);\n var arrayInstance = assert(this.resolver.resolveClass(\n arrayPrototype,\n [ elementType ],\n makeMap()\n ));\n var arrayHeaderSize = (arrayInstance.currentMemoryOffset + 7) & ~7;\n if (hasGC) {\n buf = new Uint8Array(gcHeaderSize + arrayHeaderSize);\n pos = gcHeaderSize;\n writeI32(ensureGCHook(this, arrayInstance), buf, program.gcHookOffset);\n } else {\n buf = new Uint8Array(arrayHeaderSize);\n pos = 0;\n }\n var arraySegment = this.addMemorySegment(buf);\n var arrayOffset = arraySegment.offset;\n if (hasGC) arrayOffset = i64_add(arrayOffset, i64_new(gcHeaderSize));\n this.currentType = arrayInstance.type;\n var buffer_offset = pos + arrayInstance.offsetof(\"buffer_\");\n var length_offset = pos + arrayInstance.offsetof(\"length_\");\n if (usizeTypeSize == 8) {\n writeI64(bufferOffset, buf, buffer_offset);\n writeI32(length, buf, length_offset);\n return this.module.createI64(i64_low(arrayOffset), i64_high(arrayOffset));\n } else {\n assert(i64_is_u32(bufferOffset));\n writeI32(i64_low(bufferOffset), buf, buffer_offset);\n writeI32(length, buf, length_offset);\n assert(i64_is_u32(arrayOffset));\n return this.module.createI32(i64_low(arrayOffset));\n }\n }\n\n compileArrayLiteral(\n elementType: Type,\n expressions: (Expression | null)[],\n isConst: bool,\n reportNode: Node\n ): ExpressionRef {\n var module = this.module;\n\n // find out whether all elements are constant (array is static)\n var length = expressions.length;\n var compiledValues = new Array(length);\n var constantValues = new Array(length);\n var nativeElementType = elementType.toNativeType();\n var isStatic = true;\n for (let i = 0; i < length; ++i) {\n let expression = expressions[i];\n let expr = expression\n ? this.compileExpression(expression, elementType, ConversionKind.IMPLICIT, WrapMode.NONE)\n : elementType.toNativeZero(module);\n compiledValues[i] = expr;\n if (isStatic) {\n expr = module.precomputeExpression(expr);\n if (getExpressionId(expr) == ExpressionId.Const) {\n assert(getExpressionType(expr) == nativeElementType);\n constantValues[i] = expr;\n } else {\n if (isConst) {\n this.warning(\n DiagnosticCode.Compiling_constant_with_non_constant_initializer_as_mutable,\n reportNode.range\n );\n }\n isStatic = false;\n }\n }\n }\n\n // make a static array if possible\n if (isStatic) return this.ensureStaticArray(elementType, constantValues);\n\n // otherwise obtain the array type\n var arrayPrototype = assert(this.program.arrayPrototype);\n var arrayInstance = assert(this.resolver.resolveClass(\n arrayPrototype,\n [ elementType ],\n makeMap()\n ));\n var arrayType = arrayInstance.type;\n\n // and compile an explicit instantiation\n this.currentType = arrayType;\n var setter = arrayInstance.lookupOverload(OperatorKind.INDEXED_SET, true);\n if (!setter) {\n this.error(\n DiagnosticCode.Index_signature_in_type_0_only_permits_reading,\n reportNode.range, arrayInstance.internalName\n );\n return module.createUnreachable();\n }\n var nativeArrayType = arrayType.toNativeType();\n var flow = this.currentFlow;\n var tempLocal = flow.parentFunction.addLocal(arrayType); // can't reuse a temp (used in compiledValues)\n var stmts = new Array(2 + length);\n var index = 0;\n stmts[index++] = module.createSetLocal(tempLocal.index,\n this.makeCallDirect(assert(arrayInstance.constructorInstance), [\n module.createI32(0), // this\n module.createI32(length)\n ])\n );\n for (let i = 0; i < length; ++i) {\n stmts[index++] = this.makeCallDirect(setter, [\n module.createGetLocal(tempLocal.index, nativeArrayType), // this\n module.createI32(i),\n compiledValues[i]\n ]);\n }\n assert(index + 1 == stmts.length);\n stmts[index] = module.createGetLocal(tempLocal.index, nativeArrayType);\n flow.freeTempLocal(tempLocal); // but can be reused now\n this.currentType = arrayType;\n return module.createBlock(null, stmts, nativeArrayType);\n }\n\n compileObjectLiteral(expression: ObjectLiteralExpression, contextualType: Type): ExpressionRef {\n var module = this.module;\n\n // contextual type must be a class\n var classReference = contextualType.classReference;\n if (!classReference || classReference.is(CommonFlags.ABSTRACT)) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n expression.range, \"\", contextualType.toString()\n );\n return module.createUnreachable();\n }\n\n // if present, check that the constructor is compatible with object literals\n var ctor = classReference.constructorInstance;\n if (ctor) {\n // TODO: if the constructor requires parameters, check whether these are given as part of the\n // object literal and use them to call the ctor while not generating a store.\n if (ctor.signature.requiredParameters) {\n this.error(\n DiagnosticCode.Constructor_of_class_0_must_not_require_any_arguments,\n expression.range, classReference.toString()\n );\n return module.createUnreachable();\n }\n if (ctor.is(CommonFlags.PRIVATE)) {\n this.error(\n DiagnosticCode.Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration,\n expression.range, classReference.toString()\n );\n return module.createUnreachable();\n }\n if (ctor.is(CommonFlags.PROTECTED)) {\n this.error(\n DiagnosticCode.Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration,\n expression.range, classReference.toString()\n );\n return module.createUnreachable();\n }\n }\n\n // check and compile field values\n var names = expression.names;\n var numNames = names.length;\n var values = expression.values;\n var members = classReference.members;\n var hasErrors = false;\n var exprs = new Array(numNames + 2);\n var flow = this.currentFlow;\n var tempLocal = flow.getTempLocal(this.options.usizeType);\n assert(numNames == values.length);\n for (let i = 0, k = numNames; i < k; ++i) {\n let member = members ? members.get(names[i].text) : null;\n if (!member || member.kind != ElementKind.FIELD) {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n names[i].range, names[i].text, classReference.toString()\n );\n hasErrors = true;\n continue;\n }\n let type = (member).type;\n exprs[i + 1] = this.module.createStore( // TODO: handle setters as well\n type.byteSize,\n this.module.createGetLocal(tempLocal.index, this.options.nativeSizeType),\n this.compileExpression(values[i], (member).type, ConversionKind.IMPLICIT, WrapMode.NONE),\n type.toNativeType(),\n (member).memoryOffset\n );\n }\n this.currentType = classReference.type.nonNullableType;\n if (hasErrors) return module.createUnreachable();\n\n // allocate a new instance first and assign 'this' to the temp. local\n exprs[0] = module.createSetLocal(\n tempLocal.index,\n this.makeAllocation(classReference)\n );\n\n // once all field values have been set, return 'this'\n exprs[exprs.length - 1] = module.createGetLocal(tempLocal.index, this.options.nativeSizeType);\n\n return module.createBlock(null, exprs, this.options.nativeSizeType);\n }\n\n compileNewExpression(expression: NewExpression, contextualType: Type): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n\n // obtain the class being instantiated\n var target = this.resolver.resolveExpression( // reports\n expression.expression,\n flow\n );\n if (!target) return module.createUnreachable();\n if (target.kind != ElementKind.CLASS_PROTOTYPE) {\n this.error(\n DiagnosticCode.Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature,\n expression.expression.range\n );\n return this.module.createUnreachable();\n }\n var classPrototype = target;\n var classInstance: Class | null = null;\n var typeArguments = expression.typeArguments;\n var classReference: Class | null;\n if (\n !typeArguments &&\n (classReference = contextualType.classReference) !== null &&\n classReference.is(CommonFlags.GENERIC)\n ) {\n classInstance = this.resolver.resolveClass(\n classPrototype,\n classReference.typeArguments,\n makeMap(flow.contextualTypeArguments)\n );\n } else {\n classInstance = this.resolver.resolveClassInclTypeArguments(\n classPrototype,\n typeArguments,\n flow.actualFunction.parent, // relative to caller\n makeMap(flow.contextualTypeArguments),\n expression\n );\n }\n if (!classInstance) return module.createUnreachable();\n return this.compileInstantiate(classInstance, expression.arguments, expression);\n }\n\n /** Gets the compiled constructor of the specified class or generates one if none is present. */\n ensureConstructor(classInstance: Class, reportNode: Node): Function {\n var instance = classInstance.constructorInstance;\n if (instance) {\n // do not attempt to compile it if inlined anyway\n if (!instance.hasDecorator(DecoratorFlags.INLINE)) this.compileFunction(instance);\n return instance;\n }\n\n // clone base constructor if a derived class\n var baseClass = classInstance.base;\n if (baseClass) {\n let baseCtor = this.ensureConstructor(baseClass, reportNode);\n instance = new Function(\n CommonSymbols.constructor,\n new FunctionPrototype(\n CommonSymbols.constructor,\n classInstance,\n // declaration is important, i.e. to access optional parameter initializers\n (baseCtor.declaration).clone()\n ),\n baseCtor.signature,\n null\n );\n\n // otherwise make a default constructor\n } else {\n instance = new Function(\n CommonSymbols.constructor,\n new FunctionPrototype(\n CommonSymbols.constructor,\n classInstance,\n this.program.makeNativeFunctionDeclaration(CommonSymbols.constructor,\n CommonFlags.INSTANCE | CommonFlags.CONSTRUCTOR\n )\n ),\n new Signature(null, classInstance.type, classInstance.type),\n null\n );\n }\n\n instance.internalName = classInstance.internalName + INSTANCE_DELIMITER + \"constructor\";\n instance.set(CommonFlags.COMPILED);\n instance.prototype.setResolvedInstance(\"\", instance);\n classInstance.constructorInstance = instance;\n var previousFlow = this.currentFlow;\n this.currentFlow = instance.flow;\n\n // generate body\n var signature = instance.signature;\n var module = this.module;\n var nativeSizeType = this.options.nativeSizeType;\n var stmts = new Array();\n\n // {\n // if (!this) this = \n // IF_DERIVED: this = super(this, ...args)\n // this.a = X\n // this.b = Y\n // return this\n // }\n stmts.push(\n module.createIf(\n module.createUnary(nativeSizeType == NativeType.I64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32,\n module.createGetLocal(0, nativeSizeType)\n ),\n module.createSetLocal(0,\n this.makeAllocation(classInstance)\n )\n )\n );\n if (baseClass) {\n let parameterTypes = signature.parameterTypes;\n let numParameters = parameterTypes.length;\n let operands = new Array(1 + numParameters);\n operands[0] = module.createGetLocal(0, nativeSizeType);\n for (let i = 0; i < numParameters; ++i) {\n operands[i + 1] = module.createGetLocal(i + 1, parameterTypes[i].toNativeType());\n }\n // TODO: base constructor might be inlined, but makeCallDirect can't do this\n stmts.push(\n module.createSetLocal(0,\n this.makeCallDirect(assert(baseClass.constructorInstance), operands)\n )\n );\n }\n this.makeFieldInitialization(classInstance, stmts);\n stmts.push(\n module.createGetLocal(0, nativeSizeType)\n );\n\n // make the function\n var typeRef = this.ensureFunctionType(signature.parameterTypes, signature.returnType, signature.thisType);\n var locals = instance.localsByIndex;\n var varTypes = new Array(); // of temp. vars added while compiling initializers\n var numOperands = 1 + signature.parameterTypes.length;\n var numLocals = locals.length;\n if (numLocals > numOperands) {\n for (let i = numOperands; i < numLocals; ++i) varTypes.push(locals[i].type.toNativeType());\n }\n var funcRef = module.addFunction(instance.internalName, typeRef, varTypes,\n stmts.length == 1\n ? stmts[0]\n : module.createBlock(null, stmts, nativeSizeType)\n );\n instance.finalize(module, funcRef);\n this.currentFlow = previousFlow;\n return instance;\n }\n\n compileInstantiate(classInstance: Class, argumentExpressions: Expression[], reportNode: Node): ExpressionRef {\n var ctor = this.ensureConstructor(classInstance, reportNode);\n var expr = this.compileCallDirect(\n ctor,\n argumentExpressions,\n reportNode,\n this.options.usizeType.toNativeZero(this.module)\n );\n this.currentType = classInstance.type;\n return expr;\n }\n\n compileParenthesizedExpression(\n expression: ParenthesizedExpression,\n contextualType: Type\n ): ExpressionRef {\n // does not change types, just order\n return this.compileExpression(\n expression.expression,\n contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n }\n\n /**\n * Compiles a property access in the specified context.\n * @param retainConstantType Retains the type of inlined constants if `true`, otherwise\n * precomputes them according to context.\n */\n compilePropertyAccessExpression(\n propertyAccess: PropertyAccessExpression,\n contextualType: Type,\n retainConstantType: bool\n ): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n\n this.maybeCompileEnclosingSource(propertyAccess);\n\n var target = this.resolver.resolvePropertyAccessExpression(propertyAccess, flow, contextualType); // reports\n if (!target) return module.createUnreachable();\n\n switch (target.kind) {\n case ElementKind.GLOBAL: { // static field\n if (!this.compileGlobal(target)) { // reports; not yet compiled if a static field\n return module.createUnreachable();\n }\n let globalType = (target).type;\n assert(globalType != Type.void);\n if ((target).is(CommonFlags.INLINED)) {\n return this.compileInlineConstant(target, contextualType, retainConstantType);\n }\n this.currentType = globalType;\n return module.createGetGlobal((target).internalName, globalType.toNativeType());\n }\n case ElementKind.ENUMVALUE: { // enum value\n let theEnum = assert((target).parent); assert(theEnum.kind == ElementKind.ENUM);\n if (!this.compileEnum(theEnum)) {\n this.currentType = Type.i32;\n return this.module.createUnreachable();\n }\n this.currentType = Type.i32;\n if ((target).is(CommonFlags.INLINED)) {\n assert((target).constantValueKind == ConstantValueKind.INTEGER);\n return module.createI32(i64_low((target).constantIntegerValue));\n }\n return module.createGetGlobal((target).internalName, NativeType.I32);\n }\n case ElementKind.FIELD: { // instance field\n assert((target).memoryOffset >= 0);\n let thisExpr = this.compileExpressionRetainType(\n assert(this.resolver.currentThisExpression),\n this.options.usizeType,\n WrapMode.NONE\n );\n this.currentType = (target).type;\n return module.createLoad(\n (target).type.byteSize,\n (target).type.is(TypeFlags.SIGNED | TypeFlags.INTEGER),\n thisExpr,\n (target).type.toNativeType(),\n (target).memoryOffset\n );\n }\n case ElementKind.PROPERTY_PROTOTYPE: {// static property\n let getterPrototype = (target).getterPrototype;\n if (getterPrototype) {\n let getter = this.resolver.resolveFunction(getterPrototype, null);\n if (getter) return this.compileCallDirect(getter, [], propertyAccess, 0);\n }\n return module.createUnreachable();\n }\n case ElementKind.PROPERTY: { // instance property\n let getterInstance = assert((target).getterInstance);\n return this.compileCallDirect(getterInstance, [], propertyAccess,\n this.compileExpressionRetainType(\n assert(this.resolver.currentThisExpression),\n this.options.usizeType,\n WrapMode.NONE\n )\n );\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n this.error(\n DiagnosticCode.Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set,\n propertyAccess.range, (target).name\n );\n return module.createUnreachable();\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n propertyAccess.range\n );\n return module.createUnreachable();\n }\n\n private compileGetter(target: PropertyPrototype, reportNode: Node): ExpressionRef {\n var prototype = target.getterPrototype;\n if (prototype) {\n let instance = this.resolver.resolveFunction(prototype, null);\n if (!instance) return this.module.createUnreachable();\n let signature = instance.signature;\n if (!this.checkCallSignature( // reports\n signature,\n 0,\n instance.is(CommonFlags.INSTANCE),\n reportNode\n )) {\n return this.module.createUnreachable();\n }\n if (instance.is(CommonFlags.INSTANCE)) {\n let classInstance = assert(instance.parent); assert(classInstance.kind == ElementKind.CLASS);\n let thisExpression = assert(this.resolver.currentThisExpression); //!!!\n let thisExpr = this.compileExpressionRetainType(\n thisExpression,\n this.options.usizeType,\n WrapMode.NONE\n );\n this.currentType = signature.returnType;\n return this.compileCallDirect(instance, [], reportNode, thisExpr);\n } else {\n this.currentType = signature.returnType;\n return this.compileCallDirect(instance, [], reportNode, 0);\n }\n } else {\n this.error(\n DiagnosticCode.Property_0_does_not_exist_on_type_1,\n reportNode.range, (target).name, (target).parent.toString()\n );\n return this.module.createUnreachable();\n }\n }\n\n compileTernaryExpression(expression: TernaryExpression, contextualType: Type): ExpressionRef {\n var ifThen = expression.ifThen;\n var ifElse = expression.ifElse;\n var outerFlow = this.currentFlow;\n\n var condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n\n // Try to eliminate unnecesssary branches if the condition is constant\n var condExprPrecomp = this.module.precomputeExpression(condExpr);\n if (\n getExpressionId(condExprPrecomp) == ExpressionId.Const &&\n getExpressionType(condExprPrecomp) == NativeType.I32\n ) {\n return getConstValueI32(condExprPrecomp)\n ? this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE)\n : this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\n\n // Otherwise recompile to the original and let the optimizer decide\n } else /* if (condExpr != condExprPrecomp) <- not guaranteed */ {\n condExpr = this.makeIsTrueish(\n this.compileExpressionRetainType(expression.condition, Type.bool, WrapMode.NONE),\n this.currentType\n );\n }\n\n var ifThenFlow = outerFlow.fork();\n this.currentFlow = ifThenFlow;\n var ifThenExpr = this.compileExpressionRetainType(ifThen, contextualType, WrapMode.NONE);\n var ifThenType = this.currentType;\n ifThenFlow.freeScopedLocals();\n\n var ifElseFlow = outerFlow.fork();\n this.currentFlow = ifElseFlow;\n var ifElseExpr = this.compileExpressionRetainType(ifElse, contextualType, WrapMode.NONE);\n var ifElseType = this.currentType;\n ifElseFlow.freeScopedLocals();\n this.currentFlow = outerFlow;\n\n outerFlow.inheritMutual(ifThenFlow, ifElseFlow);\n\n var commonType = Type.commonCompatible(ifThenType, ifElseType, false);\n if (!commonType) {\n this.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n expression.range, ifThenType.toString(), ifElseType.toString()\n );\n this.currentType = contextualType;\n return this.module.createUnreachable();\n }\n ifThenExpr = this.convertExpression(\n ifThenExpr,\n ifThenType,\n commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n ifThen\n );\n ifElseExpr = this.convertExpression(\n ifElseExpr,\n ifElseType,\n commonType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE,\n ifElse\n );\n this.currentType = commonType;\n return this.module.createIf(condExpr, ifThenExpr, ifElseExpr);\n }\n\n compileUnaryPostfixExpression(expression: UnaryPostfixExpression, contextualType: Type): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n\n // make a getter for the expression (also obtains the type)\n var getValue = this.compileExpression( // reports\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // shortcut if compiling the getter already failed\n if (getExpressionId(getValue) == ExpressionId.Unreachable) return getValue;\n\n var currentType = this.currentType;\n\n // if the value isn't dropped, a temp. local is required to remember the original value\n var tempLocal: Local | null = null;\n if (contextualType != Type.void) {\n tempLocal = flow.getTempLocal(currentType, false);\n getValue = module.createTeeLocal(\n tempLocal.index,\n getValue\n );\n }\n\n var calcValue: ExpressionRef;\n\n switch (expression.operator) {\n case Token.PLUS_PLUS: {\n switch (currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n calcValue = module.createBinary(\n BinaryOp.AddI32,\n getValue,\n module.createI32(1)\n );\n break;\n }\n case TypeKind.USIZE: {\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.POSTFIX_INC);\n if (overload) {\n calcValue = this.compileUnaryOverload(overload, expression.operand, getValue, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n }\n case TypeKind.ISIZE: {\n let options = this.options;\n calcValue = module.createBinary(\n options.isWasm64\n ? BinaryOp.AddI64\n : BinaryOp.AddI32,\n getValue,\n currentType.toNativeOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n calcValue = module.createBinary(\n BinaryOp.AddI64,\n getValue,\n module.createI64(1)\n );\n break;\n }\n case TypeKind.F32: {\n calcValue = module.createBinary(\n BinaryOp.AddF32,\n getValue,\n module.createF32(1)\n );\n break;\n }\n case TypeKind.F64: {\n calcValue = module.createBinary(\n BinaryOp.AddF64,\n getValue,\n module.createF64(1)\n );\n break;\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n break;\n }\n case Token.MINUS_MINUS: {\n switch (currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n calcValue = module.createBinary(\n BinaryOp.SubI32,\n getValue,\n module.createI32(1)\n );\n break;\n }\n case TypeKind.USIZE: {\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.POSTFIX_DEC);\n if (overload) {\n calcValue = this.compileUnaryOverload(overload, expression.operand, getValue, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n }\n case TypeKind.ISIZE: {\n let options = this.options;\n calcValue = module.createBinary(\n options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n getValue,\n currentType.toNativeOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n calcValue = module.createBinary(\n BinaryOp.SubI64,\n getValue,\n module.createI64(1)\n );\n break;\n }\n case TypeKind.F32: {\n calcValue = module.createBinary(\n BinaryOp.SubF32,\n getValue,\n module.createF32(1)\n );\n break;\n }\n case TypeKind.F64: {\n calcValue = module.createBinary(\n BinaryOp.SubF64,\n getValue,\n module.createF64(1)\n );\n break;\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n break;\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n\n // simplify if dropped anyway\n if (!tempLocal) {\n this.currentType = Type.void;\n return this.compileAssignmentWithValue(expression.operand,\n calcValue,\n false\n );\n }\n\n // otherwise use the temp. local for the intermediate value (always possibly overflows)\n var setValue = this.compileAssignmentWithValue(expression.operand,\n calcValue, // also tees getValue to tempLocal\n false\n );\n\n this.currentType = tempLocal.type;\n flow.freeTempLocal(tempLocal);\n var nativeType = tempLocal.type.toNativeType();\n\n return module.createBlock(null, [\n setValue,\n module.createGetLocal(tempLocal.index, nativeType)\n ], nativeType); // result of 'x++' / 'x--' might overflow\n }\n\n compileUnaryPrefixExpression(\n expression: UnaryPrefixExpression,\n contextualType: Type\n ): ExpressionRef {\n var module = this.module;\n var compound = false;\n var expr: ExpressionRef;\n\n switch (expression.operator) {\n case Token.PLUS: {\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.PLUS);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n // nop\n break;\n }\n case Token.MINUS: {\n if (expression.operand.kind == NodeKind.LITERAL && (\n (expression.operand).literalKind == LiteralKind.INTEGER ||\n (expression.operand).literalKind == LiteralKind.FLOAT\n )) {\n // implicitly negate integer and float literals. also enables proper checking of literal ranges.\n expr = this.compileLiteralExpression(expression.operand, contextualType, true);\n // compileExpression normally does this:\n if (this.options.sourceMap) this.addDebugLocation(expr, expression.range);\n break;\n }\n\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.MINUS);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.SubI32, module.createI32(0), expr);\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n this.currentType.toNativeZero(module),\n expr\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.SubI64, module.createI64(0), expr);\n break;\n }\n case TypeKind.F32: {\n expr = module.createUnary(UnaryOp.NegF32, expr);\n break;\n }\n case TypeKind.F64: {\n expr = module.createUnary(UnaryOp.NegF64, expr);\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.PLUS_PLUS: {\n compound = true;\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.PREFIX_INC);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.AddI32, expr, this.module.createI32(1));\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.AddI64\n : BinaryOp.AddI32,\n expr,\n this.currentType.toNativeOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.AddI64, expr, module.createI64(1));\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.AddF32, expr, module.createF32(1));\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.AddF64, expr, module.createF64(1));\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.MINUS_MINUS: {\n compound = true;\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.PREFIX_DEC);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.SubI32, expr, module.createI32(1));\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.SubI64\n : BinaryOp.SubI32,\n expr,\n this.currentType.toNativeOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.SubI64, expr, module.createI64(1));\n break;\n }\n case TypeKind.F32: {\n expr = module.createBinary(BinaryOp.SubF32, expr, module.createF32(1));\n break;\n }\n case TypeKind.F64: {\n expr = module.createBinary(BinaryOp.SubF64, expr, module.createF64(1));\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.EXCLAMATION: {\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.NOT);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n // allow '!' for references even without an overload\n }\n\n expr = this.makeIsFalseish(expr, this.currentType);\n this.currentType = Type.bool;\n break;\n }\n case Token.TILDE: {\n expr = this.compileExpression(\n expression.operand,\n contextualType == Type.void\n ? Type.i32\n : contextualType.is(TypeFlags.FLOAT)\n ? Type.i64\n : contextualType,\n ConversionKind.NONE,\n WrapMode.NONE\n );\n\n // check operator overload\n if (this.currentType.is(TypeFlags.REFERENCE)) {\n let classReference = this.currentType.classReference;\n if (classReference) {\n let overload = classReference.lookupOverload(OperatorKind.BITWISE_NOT);\n if (overload) {\n expr = this.compileUnaryOverload(overload, expression.operand, expr, expression);\n break;\n }\n }\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n } else {\n expr = this.convertExpression(\n expr,\n this.currentType, this.currentType.intType,\n ConversionKind.IMPLICIT, WrapMode.NONE,\n expression.operand\n );\n }\n\n switch (this.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n expr = module.createBinary(BinaryOp.XorI32, expr, module.createI32(-1));\n break;\n }\n case TypeKind.USIZE:\n case TypeKind.ISIZE: {\n expr = module.createBinary(\n this.options.isWasm64\n ? BinaryOp.XorI64\n : BinaryOp.XorI32,\n expr,\n this.currentType.toNativeNegOne(module)\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n expr = module.createBinary(BinaryOp.XorI64, expr, module.createI64(-1, -1));\n break;\n }\n default: {\n assert(false);\n expr = module.createUnreachable();\n }\n }\n break;\n }\n case Token.TYPEOF: {\n this.error(\n DiagnosticCode.Operation_not_supported,\n expression.range\n );\n return module.createUnreachable();\n }\n default: {\n assert(false);\n return module.createUnreachable();\n }\n }\n return compound\n ? this.compileAssignmentWithValue(expression.operand, expr, contextualType != Type.void)\n : expr;\n }\n\n /** Makes sure that a 32-bit integer value is wrapped to a valid value of the specified type. */\n ensureSmallIntegerWrap(expr: ExpressionRef, type: Type): ExpressionRef {\n var module = this.module;\n var flow = this.currentFlow;\n switch (type.kind) {\n case TypeKind.I8: {\n if (flow.canOverflow(expr, type)) {\n expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\n ? module.createUnary(UnaryOp.ExtendI8ToI32, expr)\n : module.createBinary(BinaryOp.ShrI32,\n module.createBinary(BinaryOp.ShlI32,\n expr,\n module.createI32(24)\n ),\n module.createI32(24)\n );\n }\n break;\n }\n case TypeKind.I16: {\n if (flow.canOverflow(expr, type)) {\n expr = this.options.hasFeature(Feature.SIGN_EXTENSION)\n ? module.createUnary(UnaryOp.ExtendI16ToI32, expr)\n : module.createBinary(BinaryOp.ShrI32,\n module.createBinary(BinaryOp.ShlI32,\n expr,\n module.createI32(16)\n ),\n module.createI32(16)\n );\n }\n break;\n }\n case TypeKind.U8: {\n if (flow.canOverflow(expr, type)) {\n expr = module.createBinary(BinaryOp.AndI32,\n expr,\n module.createI32(0xff)\n );\n }\n break;\n }\n case TypeKind.U16: {\n if (flow.canOverflow(expr, type)) {\n expr = module.createBinary(BinaryOp.AndI32,\n expr,\n module.createI32(0xffff)\n );\n }\n break;\n }\n case TypeKind.BOOL: {\n if (flow.canOverflow(expr, type)) {\n // bool is special in that it compares to 0 instead of masking with 0x1\n expr = module.createBinary(BinaryOp.NeI32,\n expr,\n module.createI32(0)\n );\n }\n break;\n }\n }\n return expr;\n }\n\n /** Creates a comparison whether an expression is 'false' in a broader sense. */\n makeIsFalseish(expr: ExpressionRef, type: Type): ExpressionRef {\n var module = this.module;\n switch (type.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = this.ensureSmallIntegerWrap(expr, type);\n // fall-through\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n return module.createUnary(UnaryOp.EqzI32, expr);\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createUnary(UnaryOp.EqzI64, expr);\n }\n case TypeKind.USIZE: // TODO: strings?\n case TypeKind.ISIZE: {\n return module.createUnary(type.size == 64 ? UnaryOp.EqzI64 : UnaryOp.EqzI32, expr);\n }\n case TypeKind.F32: {\n return module.createBinary(BinaryOp.EqF32, expr, module.createF32(0));\n }\n case TypeKind.F64: {\n return module.createBinary(BinaryOp.EqF64, expr, module.createF64(0));\n }\n default: {\n assert(false);\n return module.createI32(1);\n }\n }\n }\n\n /** Creates a comparison whether an expression is 'true' in a broader sense. */\n makeIsTrueish(expr: ExpressionRef, type: Type): ExpressionRef {\n var module = this.module;\n switch (type.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n expr = this.ensureSmallIntegerWrap(expr, type);\n // fall-through\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n return expr;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n return module.createBinary(BinaryOp.NeI64, expr, module.createI64(0));\n }\n case TypeKind.USIZE: // TODO: strings?\n case TypeKind.ISIZE: {\n return type.size == 64\n ? module.createBinary(BinaryOp.NeI64, expr, module.createI64(0))\n : expr;\n }\n case TypeKind.F32: {\n return module.createBinary(BinaryOp.NeF32, expr, module.createF32(0));\n }\n case TypeKind.F64: {\n return module.createBinary(BinaryOp.NeF64, expr, module.createF64(0));\n }\n default: {\n assert(false);\n return module.createI32(0);\n }\n }\n }\n\n /** Makes an allocation suitable to hold the data of an instance of the given class. */\n makeAllocation(classInstance: Class): ExpressionRef {\n var program = this.program;\n assert(classInstance.program == program);\n var module = this.module;\n var options = this.options;\n\n // __gc_allocate(size, markFn)\n if (program.hasGC && classInstance.type.isManaged(program)) {\n let allocateInstance = assert(program.gcAllocateInstance);\n if (!this.compileFunction(allocateInstance)) return module.createUnreachable();\n this.currentType = classInstance.type;\n return module.createCall(\n allocateInstance.internalName, [\n options.isWasm64\n ? module.createI64(classInstance.currentMemoryOffset)\n : module.createI32(classInstance.currentMemoryOffset),\n module.createI32(\n ensureGCHook(this, classInstance)\n )\n ],\n options.nativeSizeType\n );\n\n // memory.allocate(size)\n } else {\n let allocateInstance = program.memoryAllocateInstance;\n if (!allocateInstance || !this.compileFunction(allocateInstance)) return module.createUnreachable();\n this.currentType = classInstance.type;\n return module.createCall(\n allocateInstance.internalName, [\n options.isWasm64\n ? module.createI64(classInstance.currentMemoryOffset)\n : module.createI32(classInstance.currentMemoryOffset)\n ],\n options.nativeSizeType\n );\n }\n }\n\n /** Makes the initializers for a class's fields. */\n makeFieldInitialization(classInstance: Class, stmts: ExpressionRef[] = []): ExpressionRef[] {\n var members = classInstance.members;\n if (!members) return [];\n\n var module = this.module;\n var flow = this.currentFlow;\n var isInline = flow.is(FlowFlags.INLINE_CONTEXT);\n var thisLocalIndex = isInline\n ? assert(flow.lookupLocal(CommonSymbols.this_)).index\n : 0;\n var nativeSizeType = this.options.nativeSizeType;\n\n for (let member of members.values()) {\n if (\n member.kind != ElementKind.FIELD || // not a field\n member.parent != classInstance // inherited field\n ) continue;\n\n let field = member; assert(!field.isAny(CommonFlags.CONST));\n let fieldType = field.type;\n let nativeFieldType = fieldType.toNativeType();\n let initializerNode = field.prototype.initializerNode;\n if (initializerNode) { // use initializer\n stmts.push(\n module.createStore(fieldType.byteSize,\n module.createGetLocal(thisLocalIndex, nativeSizeType),\n this.compileExpression( // reports\n initializerNode,\n fieldType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n ),\n nativeFieldType,\n field.memoryOffset\n )\n );\n } else {\n let parameterIndex = field.prototype.parameterIndex;\n stmts.push(\n module.createStore(fieldType.byteSize,\n module.createGetLocal(thisLocalIndex, nativeSizeType),\n parameterIndex >= 0 // initialized via parameter (here: a local)\n ? module.createGetLocal(\n isInline\n ? assert(flow.lookupLocal(field.name)).index\n : 1 + parameterIndex, // this is local 0\n nativeFieldType\n )\n : fieldType.toNativeZero(module),\n nativeFieldType,\n field.memoryOffset\n )\n );\n }\n }\n return stmts;\n }\n\n /** Adds the debug location of the specified expression at the specified range to the source map. */\n addDebugLocation(expr: ExpressionRef, range: Range): void {\n var parentFunction = this.currentFlow.parentFunction;\n var source = range.source;\n if (source.debugInfoIndex < 0) source.debugInfoIndex = this.module.addDebugInfoFile(source.normalizedPath);\n range.debugInfoRef = expr;\n parentFunction.debugLocations.push(range);\n }\n}\n\n// helpers\n\nfunction mangleImportName(\n element: Element,\n declaration: DeclarationStatement\n): void {\n // by default, use the file name as the module name\n mangleImportName_moduleName = declaration.range.source.simplePath;\n // and the internal name of the element within that file as the element name\n mangleImportName_elementName = mangleInternalName(\n element.name, element.parent, element.is(CommonFlags.INSTANCE), true\n );\n if (!element.hasDecorator(DecoratorFlags.EXTERNAL)) return;\n\n var program = element.program;\n var decorator = assert(findDecorator(DecoratorKind.EXTERNAL, declaration.decorators));\n var args = decorator.arguments;\n if (args && args.length) {\n let arg = args[0];\n // if one argument is given, override just the element name\n // if two arguments are given, override both module and element name\n if (arg.kind == NodeKind.LITERAL && (arg).literalKind == LiteralKind.STRING) {\n mangleImportName_elementName = (arg).value;\n if (args.length >= 2) {\n arg = args[1];\n if (arg.kind == NodeKind.LITERAL && (arg).literalKind == LiteralKind.STRING) {\n mangleImportName_moduleName = mangleImportName_elementName;\n mangleImportName_elementName = (arg).value;\n if (args.length > 2) {\n program.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n decorator.range, \"2\", args.length.toString()\n );\n }\n } else {\n program.error(\n DiagnosticCode.String_literal_expected,\n arg.range\n );\n }\n }\n } else {\n program.error(\n DiagnosticCode.String_literal_expected,\n arg.range\n );\n }\n } else {\n program.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n decorator.range, \"1\", \"0\"\n );\n }\n}\n\nvar mangleImportName_moduleName: string;\nvar mangleImportName_elementName: string;\n\n/** Special compiler symbols. */\nnamespace CompilerSymbols {\n /** Module started global. Used if an explicit start function is present. */\n export const started = \"~lib/started\";\n /** Argument count global. Used to call trampolines for varargs functions. */\n export const argc = \"~lib/argc\";\n /** Argument count setter. Exported for use by host calls. */\n export const setargc = \"~lib/setargc\";\n}\n","/**\n * Generated from diagnosticsMessages.json. Do not edit.\n * @module diagnostics\n *//***/\n\n/* tslint:disable:max-line-length */\n\n/** Enum of available diagnostic codes. */\nexport enum DiagnosticCode {\n Operation_not_supported = 100,\n Operation_is_unsafe = 101,\n User_defined_0 = 102,\n Conversion_from_type_0_to_1_requires_an_explicit_cast = 200,\n Conversion_from_type_0_to_1_will_require_an_explicit_cast_when_switching_between_32_64_bit = 201,\n Type_0_cannot_be_changed_to_type_1 = 202,\n Type_0_cannot_be_reinterpreted_as_type_1 = 203,\n Basic_type_0_cannot_be_nullable = 204,\n Cannot_export_a_mutable_global = 205,\n Compiling_constant_with_non_constant_initializer_as_mutable = 206,\n Unmanaged_classes_cannot_extend_managed_classes_and_vice_versa = 207,\n Unmanaged_classes_cannot_implement_interfaces = 208,\n Invalid_regular_expression_flags = 209,\n Implementation_0_must_match_the_signature_1 = 210,\n Class_0_is_sealed_and_cannot_be_extended = 211,\n Decorator_0_is_not_valid_here = 212,\n Duplicate_decorator = 213,\n An_allocator_must_be_declared_to_allocate_memory_Try_importing_allocator_arena_or_allocator_tlsf = 214,\n Optional_parameter_must_have_an_initializer = 215,\n Constructor_of_class_0_must_not_require_any_arguments = 216,\n Function_0_cannot_be_inlined_into_itself = 217,\n Cannot_access_method_0_without_calling_it_as_it_requires_this_to_be_set = 218,\n Optional_properties_are_not_supported = 219,\n Expression_must_be_a_compile_time_constant = 220,\n Module_cannot_have_multiple_start_functions = 221,\n Unterminated_string_literal = 1002,\n Identifier_expected = 1003,\n _0_expected = 1005,\n A_file_cannot_have_a_reference_to_itself = 1006,\n Trailing_comma_not_allowed = 1009,\n Unexpected_token = 1012,\n A_rest_parameter_must_be_last_in_a_parameter_list = 1014,\n Parameter_cannot_have_question_mark_and_initializer = 1015,\n A_required_parameter_cannot_follow_an_optional_parameter = 1016,\n Statements_are_not_allowed_in_ambient_contexts = 1036,\n Initializers_are_not_allowed_in_ambient_contexts = 1039,\n _0_modifier_cannot_be_used_here = 1042,\n A_rest_parameter_cannot_be_optional = 1047,\n A_rest_parameter_cannot_have_an_initializer = 1048,\n A_set_accessor_must_have_exactly_one_parameter = 1049,\n A_set_accessor_parameter_cannot_have_an_initializer = 1052,\n A_get_accessor_cannot_have_parameters = 1054,\n Enum_member_must_have_initializer = 1061,\n Type_parameters_cannot_appear_on_a_constructor_declaration = 1092,\n Type_annotation_cannot_appear_on_a_constructor_declaration = 1093,\n An_accessor_cannot_have_type_parameters = 1094,\n A_set_accessor_cannot_have_a_return_type_annotation = 1095,\n Type_parameter_list_cannot_be_empty = 1098,\n A_continue_statement_can_only_be_used_within_an_enclosing_iteration_statement = 1104,\n A_break_statement_can_only_be_used_within_an_enclosing_iteration_or_switch_statement = 1105,\n A_return_statement_can_only_be_used_within_a_function_body = 1108,\n Expression_expected = 1109,\n Type_expected = 1110,\n A_default_clause_cannot_appear_more_than_once_in_a_switch_statement = 1113,\n Duplicate_label_0 = 1114,\n Octal_literals_are_not_allowed_in_strict_mode = 1121,\n Digit_expected = 1124,\n Hexadecimal_digit_expected = 1125,\n Unexpected_end_of_text = 1126,\n Invalid_character = 1127,\n _case_or_default_expected = 1130,\n _super_must_be_followed_by_an_argument_list_or_member_access = 1034,\n A_declare_modifier_cannot_be_used_in_an_already_ambient_context = 1038,\n Type_argument_expected = 1140,\n String_literal_expected = 1141,\n Line_break_not_permitted_here = 1142,\n Declaration_expected = 1146,\n _const_declarations_must_be_initialized = 1155,\n Unterminated_regular_expression_literal = 1161,\n Interface_declaration_cannot_have_implements_clause = 1176,\n Binary_digit_expected = 1177,\n Octal_digit_expected = 1178,\n An_implementation_cannot_be_declared_in_ambient_contexts = 1183,\n An_extended_Unicode_escape_value_must_be_between_0x0_and_0x10FFFF_inclusive = 1198,\n Unterminated_Unicode_escape_sequence = 1199,\n Decorators_are_not_valid_here = 1206,\n _abstract_modifier_can_only_appear_on_a_class_method_or_property_declaration = 1242,\n Method_0_cannot_have_an_implementation_because_it_is_marked_abstract = 1245,\n A_definite_assignment_assertion_is_not_permitted_in_this_context = 1255,\n A_class_may_only_extend_another_class = 1311,\n A_parameter_property_cannot_be_declared_using_a_rest_parameter = 1317,\n Duplicate_identifier_0 = 2300,\n Cannot_find_name_0 = 2304,\n Module_0_has_no_exported_member_1 = 2305,\n Generic_type_0_requires_1_type_argument_s = 2314,\n Type_0_is_not_generic = 2315,\n Type_0_is_not_assignable_to_type_1 = 2322,\n Index_signature_is_missing_in_type_0 = 2329,\n _this_cannot_be_referenced_in_current_location = 2332,\n _super_can_only_be_referenced_in_a_derived_class = 2335,\n Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors = 2337,\n Property_0_does_not_exist_on_type_1 = 2339,\n Cannot_invoke_an_expression_whose_type_lacks_a_call_signature_Type_0_has_no_compatible_call_signatures = 2349,\n Cannot_use_new_with_an_expression_whose_type_lacks_a_construct_signature = 2351,\n A_function_whose_declared_type_is_not_void_must_return_a_value = 2355,\n The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access = 2357,\n The_left_hand_side_of_an_assignment_expression_must_be_a_variable_or_a_property_access = 2364,\n Operator_0_cannot_be_applied_to_types_1_and_2 = 2365,\n A_super_call_must_be_the_first_statement_in_the_constructor = 2376,\n Constructors_for_derived_classes_must_contain_a_super_call = 2377,\n _get_and_set_accessor_must_have_the_same_type = 2380,\n Constructor_implementation_is_missing = 2390,\n Function_implementation_is_missing_or_not_immediately_following_the_declaration = 2391,\n Multiple_constructor_implementations_are_not_allowed = 2392,\n Duplicate_function_implementation = 2393,\n Individual_declarations_in_merged_declaration_0_must_be_all_exported_or_all_local = 2395,\n A_namespace_declaration_cannot_be_located_prior_to_a_class_or_function_with_which_it_is_merged = 2434,\n Type_0_has_no_property_1 = 2460,\n The_0_operator_cannot_be_applied_to_type_1 = 2469,\n In_const_enum_declarations_member_initializer_must_be_constant_expression = 2474,\n Export_declaration_conflicts_with_exported_declaration_of_0 = 2484,\n Cannot_assign_to_0_because_it_is_a_constant_or_a_read_only_property = 2540,\n The_target_of_an_assignment_must_be_a_variable_or_a_property_access = 2541,\n Index_signature_in_type_0_only_permits_reading = 2542,\n Expected_0_arguments_but_got_1 = 2554,\n Expected_at_least_0_arguments_but_got_1 = 2555,\n Expected_0_type_arguments_but_got_1 = 2558,\n A_member_initializer_in_a_enum_declaration_cannot_reference_members_declared_after_it_including_members_defined_in_other_enums = 2651,\n Constructor_of_class_0_is_private_and_only_accessible_within_the_class_declaration = 2673,\n Constructor_of_class_0_is_protected_and_only_accessible_within_the_class_declaration = 2674,\n Namespace_0_has_no_exported_member_1 = 2694,\n Required_type_parameters_may_not_follow_optional_type_parameters = 2706,\n Duplicate_property_0 = 2718,\n File_0_not_found = 6054,\n Numeric_separators_are_not_allowed_here = 6188,\n Multiple_consecutive_numeric_separators_are_not_permitted = 6189,\n _super_must_be_called_before_accessing_this_in_the_constructor_of_a_derived_class = 17009,\n _super_must_be_called_before_accessing_a_property_of_super_in_the_constructor_of_a_derived_class = 17011\n}\n\n/** Translates a diagnostic code to its respective string. */\nexport function diagnosticCodeToString(code: DiagnosticCode): string {\n switch (code) {\n case 100: return \"Operation not supported.\";\n case 101: return \"Operation is unsafe.\";\n case 102: return \"User-defined: {0}\";\n case 200: return \"Conversion from type '{0}' to '{1}' requires an explicit cast.\";\n case 201: return \"Conversion from type '{0}' to '{1}' will require an explicit cast when switching between 32/64-bit.\";\n case 202: return \"Type '{0}' cannot be changed to type '{1}'.\";\n case 203: return \"Type '{0}' cannot be reinterpreted as type '{1}'.\";\n case 204: return \"Basic type '{0}' cannot be nullable.\";\n case 205: return \"Cannot export a mutable global.\";\n case 206: return \"Compiling constant with non-constant initializer as mutable.\";\n case 207: return \"Unmanaged classes cannot extend managed classes and vice-versa.\";\n case 208: return \"Unmanaged classes cannot implement interfaces.\";\n case 209: return \"Invalid regular expression flags.\";\n case 210: return \"Implementation '{0}' must match the signature '{1}'.\";\n case 211: return \"Class '{0}' is sealed and cannot be extended.\";\n case 212: return \"Decorator '{0}' is not valid here.\";\n case 213: return \"Duplicate decorator.\";\n case 214: return \"An allocator must be declared to allocate memory. Try importing allocator/arena or allocator/tlsf.\";\n case 215: return \"Optional parameter must have an initializer.\";\n case 216: return \"Constructor of class '{0}' must not require any arguments.\";\n case 217: return \"Function '{0}' cannot be inlined into itself.\";\n case 218: return \"Cannot access method '{0}' without calling it as it requires 'this' to be set.\";\n case 219: return \"Optional properties are not supported.\";\n case 220: return \"Expression must be a compile-time constant.\";\n case 221: return \"Module cannot have multiple start functions.\";\n case 1002: return \"Unterminated string literal.\";\n case 1003: return \"Identifier expected.\";\n case 1005: return \"'{0}' expected.\";\n case 1006: return \"A file cannot have a reference to itself.\";\n case 1009: return \"Trailing comma not allowed.\";\n case 1012: return \"Unexpected token.\";\n case 1014: return \"A rest parameter must be last in a parameter list.\";\n case 1015: return \"Parameter cannot have question mark and initializer.\";\n case 1016: return \"A required parameter cannot follow an optional parameter.\";\n case 1036: return \"Statements are not allowed in ambient contexts.\";\n case 1039: return \"Initializers are not allowed in ambient contexts.\";\n case 1042: return \"'{0}' modifier cannot be used here.\";\n case 1047: return \"A rest parameter cannot be optional.\";\n case 1048: return \"A rest parameter cannot have an initializer.\";\n case 1049: return \"A 'set' accessor must have exactly one parameter.\";\n case 1052: return \"A 'set' accessor parameter cannot have an initializer.\";\n case 1054: return \"A 'get' accessor cannot have parameters.\";\n case 1061: return \"Enum member must have initializer.\";\n case 1092: return \"Type parameters cannot appear on a constructor declaration.\";\n case 1093: return \"Type annotation cannot appear on a constructor declaration.\";\n case 1094: return \"An accessor cannot have type parameters.\";\n case 1095: return \"A 'set' accessor cannot have a return type annotation.\";\n case 1098: return \"Type parameter list cannot be empty.\";\n case 1104: return \"A 'continue' statement can only be used within an enclosing iteration statement.\";\n case 1105: return \"A 'break' statement can only be used within an enclosing iteration or switch statement.\";\n case 1108: return \"A 'return' statement can only be used within a function body.\";\n case 1109: return \"Expression expected.\";\n case 1110: return \"Type expected.\";\n case 1113: return \"A 'default' clause cannot appear more than once in a 'switch' statement.\";\n case 1114: return \"Duplicate label '{0}'.\";\n case 1121: return \"Octal literals are not allowed in strict mode.\";\n case 1124: return \"Digit expected.\";\n case 1125: return \"Hexadecimal digit expected.\";\n case 1126: return \"Unexpected end of text.\";\n case 1127: return \"Invalid character.\";\n case 1130: return \"'case' or 'default' expected.\";\n case 1034: return \"'super' must be followed by an argument list or member access.\";\n case 1038: return \"A 'declare' modifier cannot be used in an already ambient context.\";\n case 1140: return \"Type argument expected.\";\n case 1141: return \"String literal expected.\";\n case 1142: return \"Line break not permitted here.\";\n case 1146: return \"Declaration expected.\";\n case 1155: return \"'const' declarations must be initialized.\";\n case 1161: return \"Unterminated regular expression literal.\";\n case 1176: return \"Interface declaration cannot have 'implements' clause.\";\n case 1177: return \"Binary digit expected.\";\n case 1178: return \"Octal digit expected.\";\n case 1183: return \"An implementation cannot be declared in ambient contexts.\";\n case 1198: return \"An extended Unicode escape value must be between 0x0 and 0x10FFFF inclusive.\";\n case 1199: return \"Unterminated Unicode escape sequence.\";\n case 1206: return \"Decorators are not valid here.\";\n case 1242: return \"'abstract' modifier can only appear on a class, method, or property declaration.\";\n case 1245: return \"Method '{0}' cannot have an implementation because it is marked abstract.\";\n case 1255: return \"A definite assignment assertion '!' is not permitted in this context.\";\n case 1311: return \"A class may only extend another class.\";\n case 1317: return \"A parameter property cannot be declared using a rest parameter.\";\n case 2300: return \"Duplicate identifier '{0}'.\";\n case 2304: return \"Cannot find name '{0}'.\";\n case 2305: return \"Module '{0}' has no exported member '{1}'.\";\n case 2314: return \"Generic type '{0}' requires {1} type argument(s).\";\n case 2315: return \"Type '{0}' is not generic.\";\n case 2322: return \"Type '{0}' is not assignable to type '{1}'.\";\n case 2329: return \"Index signature is missing in type '{0}'.\";\n case 2332: return \"'this' cannot be referenced in current location.\";\n case 2335: return \"'super' can only be referenced in a derived class.\";\n case 2337: return \"Super calls are not permitted outside constructors or in nested functions inside constructors.\";\n case 2339: return \"Property '{0}' does not exist on type '{1}'.\";\n case 2349: return \"Cannot invoke an expression whose type lacks a call signature. Type '{0}' has no compatible call signatures.\";\n case 2351: return \"Cannot use 'new' with an expression whose type lacks a construct signature.\";\n case 2355: return \"A function whose declared type is not 'void' must return a value.\";\n case 2357: return \"The operand of an increment or decrement operator must be a variable or a property access.\";\n case 2364: return \"The left-hand side of an assignment expression must be a variable or a property access.\";\n case 2365: return \"Operator '{0}' cannot be applied to types '{1}' and '{2}'.\";\n case 2376: return \"A 'super' call must be the first statement in the constructor.\";\n case 2377: return \"Constructors for derived classes must contain a 'super' call.\";\n case 2380: return \"'get' and 'set' accessor must have the same type.\";\n case 2390: return \"Constructor implementation is missing.\";\n case 2391: return \"Function implementation is missing or not immediately following the declaration.\";\n case 2392: return \"Multiple constructor implementations are not allowed.\";\n case 2393: return \"Duplicate function implementation.\";\n case 2395: return \"Individual declarations in merged declaration '{0}' must be all exported or all local.\";\n case 2434: return \"A namespace declaration cannot be located prior to a class or function with which it is merged.\";\n case 2460: return \"Type '{0}' has no property '{1}'.\";\n case 2469: return \"The '{0}' operator cannot be applied to type '{1}'.\";\n case 2474: return \"In 'const' enum declarations member initializer must be constant expression.\";\n case 2484: return \"Export declaration conflicts with exported declaration of '{0}'.\";\n case 2540: return \"Cannot assign to '{0}' because it is a constant or a read-only property.\";\n case 2541: return \"The target of an assignment must be a variable or a property access.\";\n case 2542: return \"Index signature in type '{0}' only permits reading.\";\n case 2554: return \"Expected {0} arguments, but got {1}.\";\n case 2555: return \"Expected at least {0} arguments, but got {1}.\";\n case 2558: return \"Expected {0} type arguments, but got {1}.\";\n case 2651: return \"A member initializer in a enum declaration cannot reference members declared after it, including members defined in other enums.\";\n case 2673: return \"Constructor of class '{0}' is private and only accessible within the class declaration.\";\n case 2674: return \"Constructor of class '{0}' is protected and only accessible within the class declaration.\";\n case 2694: return \"Namespace '{0}' has no exported member '{1}'.\";\n case 2706: return \"Required type parameters may not follow optional type parameters.\";\n case 2718: return \"Duplicate property '{0}'.\";\n case 6054: return \"File '{0}' not found.\";\n case 6188: return \"Numeric separators are not allowed here.\";\n case 6189: return \"Multiple consecutive numeric separators are not permitted.\";\n case 17009: return \"'super' must be called before accessing 'this' in the constructor of a derived class.\";\n case 17011: return \"'super' must be called before accessing a property of 'super' in the constructor of a derived class.\";\n default: return \"\";\n }\n}\n","/**\n * A control flow analyzer.\n * @module flow\n *//***/\n\nimport {\n Type,\n TypeFlags,\n TypeKind\n} from \"./types\";\n\nimport {\n Local,\n Function,\n Element,\n ElementKind,\n Global\n} from \"./program\";\n\nimport {\n NativeType,\n ExpressionId,\n ExpressionRef,\n\n getExpressionId,\n getGetLocalIndex,\n isTeeLocal,\n getSetLocalValue,\n getGetGlobalName,\n getBinaryOp,\n BinaryOp,\n getBinaryLeft,\n getConstValueI32,\n getBinaryRight,\n getUnaryOp,\n UnaryOp,\n getExpressionType,\n getConstValueI64Low,\n getConstValueF32,\n getConstValueF64,\n getLoadBytes,\n isLoadSigned,\n getBlockName,\n getBlockChildCount,\n getBlockChild,\n getIfTrue,\n getIfFalse,\n getSelectThen,\n getSelectElse,\n getCallTarget\n} from \"./module\";\n\nimport {\n CommonFlags\n} from \"./common\";\n\nimport {\n DiagnosticCode\n} from \"./diagnostics\";\n\nimport {\n Node\n} from \"./ast\";\n\nimport {\n bitsetIs,\n bitsetSet\n} from \"./util\";\n\n/** Control flow flags indicating specific conditions. */\nexport const enum FlowFlags {\n /** No specific conditions. */\n NONE = 0,\n\n // categorical\n\n /** This flow returns. */\n RETURNS = 1 << 0,\n /** This flow returns a wrapped value. */\n RETURNS_WRAPPED = 1 << 1,\n /** This flow throws. */\n THROWS = 1 << 2,\n /** This flow breaks. */\n BREAKS = 1 << 3,\n /** This flow continues. */\n CONTINUES = 1 << 4,\n /** This flow allocates. Constructors only. */\n ALLOCATES = 1 << 5,\n /** This flow calls super. Constructors only. */\n CALLS_SUPER = 1 << 6,\n\n // conditional\n\n /** This flow conditionally returns in a child flow. */\n CONDITIONALLY_RETURNS = 1 << 7,\n /** This flow conditionally throws in a child flow. */\n CONDITIONALLY_THROWS = 1 << 8,\n /** This flow conditionally breaks in a child flow. */\n CONDITIONALLY_BREAKS = 1 << 9,\n /** This flow conditionally continues in a child flow. */\n CONDITIONALLY_CONTINUES = 1 << 10,\n /** This flow conditionally allocates in a child flow. Constructors only. */\n CONDITIONALLY_ALLOCATES = 1 << 11,\n\n // special\n\n /** This is an inlining flow. */\n INLINE_CONTEXT = 1 << 12,\n /** This is a flow with explicitly disabled bounds checking. */\n UNCHECKED_CONTEXT = 1 << 13,\n\n // masks\n\n /** Any terminating flag. */\n ANY_TERMINATING = FlowFlags.RETURNS\n | FlowFlags.THROWS\n | FlowFlags.BREAKS\n | FlowFlags.CONTINUES,\n\n /** Any categorical flag. */\n ANY_CATEGORICAL = FlowFlags.RETURNS\n | FlowFlags.RETURNS_WRAPPED\n | FlowFlags.THROWS\n | FlowFlags.BREAKS\n | FlowFlags.CONTINUES\n | FlowFlags.ALLOCATES\n | FlowFlags.CALLS_SUPER,\n\n /** Any conditional flag. */\n ANY_CONDITIONAL = FlowFlags.CONDITIONALLY_RETURNS\n | FlowFlags.CONDITIONALLY_THROWS\n | FlowFlags.CONDITIONALLY_BREAKS\n | FlowFlags.CONDITIONALLY_CONTINUES\n | FlowFlags.CONDITIONALLY_ALLOCATES\n}\n\n/** A control flow evaluator. */\nexport class Flow {\n\n /** Parent flow. */\n parent: Flow | null;\n /** Flow flags indicating specific conditions. */\n flags: FlowFlags;\n /** Function this flow belongs to. */\n parentFunction: Function;\n /** The label we break to when encountering a continue statement. */\n continueLabel: string | null;\n /** The label we break to when encountering a break statement. */\n breakLabel: string | null;\n /** The current return type. */\n returnType: Type;\n /** The current contextual type arguments. */\n contextualTypeArguments: Map | null;\n /** Scoped local variables. */\n scopedLocals: Map | null = null;\n /** Local variable wrap states for the first 64 locals. */\n wrappedLocals: I64;\n /** Local variable wrap states for locals with index >= 64. */\n wrappedLocalsExt: I64[] | null;\n /** Function being inlined, when inlining. */\n inlineFunction: Function | null;\n /** The label we break to when encountering a return statement, when inlining. */\n inlineReturnLabel: string | null;\n\n /** Creates the parent flow of the specified function. */\n static create(parentFunction: Function): Flow {\n var flow = new Flow();\n flow.parent = null;\n flow.flags = FlowFlags.NONE;\n flow.parentFunction = parentFunction;\n flow.continueLabel = null;\n flow.breakLabel = null;\n flow.returnType = parentFunction.signature.returnType;\n flow.contextualTypeArguments = parentFunction.contextualTypeArguments;\n flow.wrappedLocals = i64_new(0);\n flow.wrappedLocalsExt = null;\n flow.inlineFunction = null;\n flow.inlineReturnLabel = null;\n return flow;\n }\n\n /** Creates an inline flow within `currentFunction`. */\n static createInline(parentFunction: Function, inlineFunction: Function): Flow {\n var flow = Flow.create(parentFunction);\n flow.set(FlowFlags.INLINE_CONTEXT);\n flow.inlineFunction = inlineFunction;\n flow.inlineReturnLabel = inlineFunction.internalName + \"|inlined.\" + (inlineFunction.nextInlineId++).toString(10);\n flow.returnType = inlineFunction.signature.returnType;\n flow.contextualTypeArguments = inlineFunction.contextualTypeArguments;\n return flow;\n }\n\n private constructor() { }\n\n /** Gets the actual function being compiled, The inlined function when inlining, otherwise the parent function. */\n get actualFunction(): Function {\n return this.inlineFunction || this.parentFunction;\n }\n\n /** Tests if this flow has the specified flag or flags. */\n is(flag: FlowFlags): bool { return (this.flags & flag) == flag; }\n /** Tests if this flow has one of the specified flags. */\n isAny(flag: FlowFlags): bool { return (this.flags & flag) != 0; }\n /** Sets the specified flag or flags. */\n set(flag: FlowFlags): void { this.flags |= flag; }\n /** Unsets the specified flag or flags. */\n unset(flag: FlowFlags): void { this.flags &= ~flag; }\n\n /** Forks this flow to a child flow. */\n fork(): Flow {\n var branch = new Flow();\n branch.parent = this;\n branch.flags = this.flags;\n branch.parentFunction = this.parentFunction;\n branch.continueLabel = this.continueLabel;\n branch.breakLabel = this.breakLabel;\n branch.returnType = this.returnType;\n branch.contextualTypeArguments = this.contextualTypeArguments;\n branch.wrappedLocals = this.wrappedLocals;\n branch.wrappedLocalsExt = this.wrappedLocalsExt ? this.wrappedLocalsExt.slice() : null;\n branch.inlineFunction = this.inlineFunction;\n branch.inlineReturnLabel = this.inlineReturnLabel;\n return branch;\n }\n\n /** Gets a free temporary local of the specified type. */\n getTempLocal(type: Type, wrapped: bool = false): Local {\n var parentFunction = this.parentFunction;\n var temps: Local[] | null;\n switch (type.toNativeType()) {\n case NativeType.I32: { temps = parentFunction.tempI32s; break; }\n case NativeType.I64: { temps = parentFunction.tempI64s; break; }\n case NativeType.F32: { temps = parentFunction.tempF32s; break; }\n case NativeType.F64: { temps = parentFunction.tempF64s; break; }\n default: throw new Error(\"concrete type expected\");\n }\n var local: Local;\n if (temps && temps.length) {\n local = temps.pop();\n local.type = type;\n local.flags = CommonFlags.NONE;\n } else {\n local = parentFunction.addLocal(type);\n }\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) this.setLocalWrapped(local.index, wrapped);\n return local;\n }\n\n /** Frees the temporary local for reuse. */\n freeTempLocal(local: Local): void {\n if (local.is(CommonFlags.INLINED)) return;\n assert(local.index >= 0);\n var parentFunction = this.parentFunction;\n var temps: Local[];\n assert(local.type != null); // internal error\n switch ((local.type).toNativeType()) {\n case NativeType.I32: {\n temps = parentFunction.tempI32s || (parentFunction.tempI32s = []);\n break;\n }\n case NativeType.I64: {\n temps = parentFunction.tempI64s || (parentFunction.tempI64s = []);\n break;\n }\n case NativeType.F32: {\n temps = parentFunction.tempF32s || (parentFunction.tempF32s = []);\n break;\n }\n case NativeType.F64: {\n temps = parentFunction.tempF64s || (parentFunction.tempF64s = []);\n break;\n }\n default: throw new Error(\"concrete type expected\");\n }\n assert(local.index >= 0);\n temps.push(local);\n }\n\n /** Gets and immediately frees a temporary local of the specified type. */\n getAndFreeTempLocal(type: Type, wrapped: bool): Local {\n var parentFunction = this.parentFunction;\n var temps: Local[];\n switch (type.toNativeType()) {\n case NativeType.I32: {\n temps = parentFunction.tempI32s || (parentFunction.tempI32s = []);\n break;\n }\n case NativeType.I64: {\n temps = parentFunction.tempI64s || (parentFunction.tempI64s = []);\n break;\n }\n case NativeType.F32: {\n temps = parentFunction.tempF32s || (parentFunction.tempF32s = []);\n break;\n }\n case NativeType.F64: {\n temps = parentFunction.tempF64s || (parentFunction.tempF64s = []);\n break;\n }\n default: throw new Error(\"concrete type expected\");\n }\n var local: Local;\n if (temps.length) {\n local = temps[temps.length - 1];\n local.type = type;\n } else {\n local = parentFunction.addLocal(type);\n temps.push(local);\n }\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) this.setLocalWrapped(local.index, wrapped);\n return local;\n }\n\n /** Adds a new scoped local of the specified name. */\n addScopedLocal(name: string, type: Type, wrapped: bool, reportNode: Node | null = null): Local {\n var scopedLocal = this.getTempLocal(type, false);\n if (!this.scopedLocals) this.scopedLocals = new Map();\n else {\n let existingLocal = this.scopedLocals.get(name);\n if (existingLocal) {\n if (reportNode) {\n this.parentFunction.program.error(\n DiagnosticCode.Duplicate_identifier_0,\n reportNode.range\n );\n }\n return existingLocal;\n }\n }\n scopedLocal.set(CommonFlags.SCOPED);\n this.scopedLocals.set(name, scopedLocal);\n if (type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) {\n this.setLocalWrapped(scopedLocal.index, wrapped);\n }\n return scopedLocal;\n }\n\n /** Adds a new scoped alias for the specified local. For example `super` aliased to the `this` local. */\n addScopedAlias(name: string, type: Type, index: i32, reportNode: Node | null = null): Local {\n if (!this.scopedLocals) this.scopedLocals = new Map();\n else {\n let existingLocal = this.scopedLocals.get(name);\n if (existingLocal) {\n if (reportNode) {\n this.parentFunction.program.error(\n DiagnosticCode.Duplicate_identifier_0,\n reportNode.range\n );\n }\n return existingLocal;\n }\n }\n assert(index < this.parentFunction.localsByIndex.length);\n var scopedAlias = new Local(\n name,\n index,\n type,\n this.parentFunction\n );\n // not flagged as SCOPED as it must not be free'd when the flow is finalized\n this.scopedLocals.set(name, scopedAlias);\n return scopedAlias;\n }\n\n /** Frees this flow's scoped variables and returns its parent flow. */\n freeScopedLocals(): void {\n if (this.scopedLocals) {\n for (let scopedLocal of this.scopedLocals.values()) {\n if (scopedLocal.is(CommonFlags.SCOPED)) { // otherwise an alias\n this.freeTempLocal(scopedLocal);\n }\n }\n this.scopedLocals = null;\n }\n }\n\n /** Looks up the local of the specified name in the current scope. */\n lookupLocal(name: string): Local | null {\n var current: Flow | null = this;\n var scope: Map | null;\n do if ((scope = current.scopedLocals) && (scope.has(name))) return scope.get(name);\n while (current = current.parent);\n return this.parentFunction.localsByName.get(name);\n }\n\n /** Looks up the element with the specified name relative to the scope of this flow. */\n lookup(name: string): Element | null {\n var element = this.lookupLocal(name);\n if (element) return element;\n return this.actualFunction.lookup(name);\n }\n\n /** Tests if the value of the local at the specified index is considered wrapped. */\n isLocalWrapped(index: i32): bool {\n if (index < 0) return true; // inlined constant\n if (index < 64) return bitsetIs(this.wrappedLocals, index);\n var ext = this.wrappedLocalsExt;\n var i = ((index - 64) / 64) | 0;\n if (!(ext && i < ext.length)) return false;\n return bitsetIs(ext[i], index - (i + 1) * 64);\n }\n\n /** Sets if the value of the local at the specified index is considered wrapped. */\n setLocalWrapped(index: i32, wrapped: bool): void {\n if (index < 0) return; // inlined constant\n if (index < 64) {\n this.wrappedLocals = bitsetSet(this.wrappedLocals, index, wrapped);\n return;\n }\n var ext = this.wrappedLocalsExt;\n var i = ((index - 64) / 64) | 0;\n if (!ext) {\n this.wrappedLocalsExt = ext = new Array(i + 1);\n for (let j = 0; j <= i; ++j) ext[j] = i64_new(0);\n } else {\n while (ext.length <= i) ext.push(i64_new(0));\n }\n ext[i] = bitsetSet(ext[i], index - (i + 1) * 64, wrapped);\n }\n\n /** Pushes a new break label to the stack, for example when entering a loop that one can `break` from. */\n pushBreakLabel(): string {\n var parentFunction = this.parentFunction;\n var id = parentFunction.nextBreakId++;\n var stack = parentFunction.breakStack;\n if (!stack) parentFunction.breakStack = [ id ];\n else stack.push(id);\n return parentFunction.breakLabel = id.toString(10);\n }\n\n /** Pops the most recent break label from the stack. */\n popBreakLabel(): void {\n var parentFunction = this.parentFunction;\n var stack = assert(parentFunction.breakStack);\n var length = assert(stack.length);\n stack.pop();\n if (length > 1) {\n parentFunction.breakLabel = stack[length - 2].toString(10);\n } else {\n parentFunction.breakLabel = null;\n parentFunction.breakStack = null;\n }\n }\n\n /** Inherits flags and local wrap states from the specified flow (e.g. blocks). */\n inherit(other: Flow): void {\n this.flags |= other.flags & (FlowFlags.ANY_CATEGORICAL | FlowFlags.ANY_CONDITIONAL);\n this.wrappedLocals = other.wrappedLocals;\n this.wrappedLocalsExt = other.wrappedLocalsExt; // no need to slice because other flow is finished\n }\n\n /** Inherits categorical flags as conditional flags from the specified flow (e.g. then without else). */\n inheritConditional(other: Flow): void {\n if (other.is(FlowFlags.RETURNS)) {\n this.set(FlowFlags.CONDITIONALLY_RETURNS);\n }\n if (other.is(FlowFlags.THROWS)) {\n this.set(FlowFlags.CONDITIONALLY_THROWS);\n }\n if (other.is(FlowFlags.BREAKS) && other.breakLabel == this.breakLabel) {\n this.set(FlowFlags.CONDITIONALLY_BREAKS);\n }\n if (other.is(FlowFlags.CONTINUES) && other.continueLabel == this.continueLabel) {\n this.set(FlowFlags.CONDITIONALLY_CONTINUES);\n }\n if (other.is(FlowFlags.ALLOCATES)) {\n this.set(FlowFlags.CONDITIONALLY_ALLOCATES);\n }\n }\n\n /** Inherits mutual flags and local wrap states from the specified flows (e.g. then with else). */\n inheritMutual(left: Flow, right: Flow): void {\n // categorical flags set in both arms\n this.flags |= left.flags & right.flags & FlowFlags.ANY_CATEGORICAL;\n\n // conditional flags set in at least one arm\n this.flags |= left.flags & FlowFlags.ANY_CONDITIONAL;\n this.flags |= right.flags & FlowFlags.ANY_CONDITIONAL;\n\n // locals wrapped in both arms\n this.wrappedLocals = i64_and(left.wrappedLocals, right.wrappedLocals);\n var leftExt = left.wrappedLocalsExt;\n var rightExt = right.wrappedLocalsExt;\n if (leftExt != null && rightExt != null) {\n let thisExt = this.wrappedLocalsExt;\n let minLength = min(leftExt.length, rightExt.length);\n if (minLength) {\n if (!thisExt) thisExt = new Array(minLength);\n else while (thisExt.length < minLength) thisExt.push(i64_new(0));\n for (let i = 0; i < minLength; ++i) {\n thisExt[i] = i64_and(\n leftExt[i],\n rightExt[i]\n );\n }\n }\n }\n }\n\n /**\n * Tests if an expression can possibly overflow in the context of this flow. Assumes that the\n * expression might already have overflown and returns `false` only if the operation neglects\n * any possible combination of garbage bits being present.\n */\n canOverflow(expr: ExpressionRef, type: Type): bool {\n // TODO: the following catches most common and a few uncommon cases, but there are additional\n // opportunities here, obviously.\n assert(type != Type.void);\n\n // types other than i8, u8, i16, u16 and bool do not overflow\n if (!type.is(TypeFlags.SHORT | TypeFlags.INTEGER)) return false;\n\n var operand: ExpressionRef;\n switch (getExpressionId(expr)) {\n\n // overflows if the local isn't wrapped or the conversion does\n case ExpressionId.GetLocal: {\n let local = this.parentFunction.localsByIndex[getGetLocalIndex(expr)];\n return !this.isLocalWrapped(local.index)\n || canConversionOverflow(local.type, type);\n }\n\n // overflows if the value does\n case ExpressionId.SetLocal: { // tee\n assert(isTeeLocal(expr));\n return this.canOverflow(getSetLocalValue(expr), type);\n }\n\n // overflows if the conversion does (globals are wrapped on set)\n case ExpressionId.GetGlobal: {\n // TODO: this is inefficient because it has to read a string\n let global = assert(this.parentFunction.program.elementsByName.get(assert(getGetGlobalName(expr))));\n assert(global.kind == ElementKind.GLOBAL);\n return canConversionOverflow(assert((global).type), type);\n }\n\n case ExpressionId.Binary: {\n switch (getBinaryOp(expr)) {\n\n // comparisons do not overflow (result is 0 or 1)\n case BinaryOp.EqI32:\n case BinaryOp.EqI64:\n case BinaryOp.EqF32:\n case BinaryOp.EqF64:\n case BinaryOp.NeI32:\n case BinaryOp.NeI64:\n case BinaryOp.NeF32:\n case BinaryOp.NeF64:\n case BinaryOp.LtI32:\n case BinaryOp.LtU32:\n case BinaryOp.LtI64:\n case BinaryOp.LtU64:\n case BinaryOp.LtF32:\n case BinaryOp.LtF64:\n case BinaryOp.LeI32:\n case BinaryOp.LeU32:\n case BinaryOp.LeI64:\n case BinaryOp.LeU64:\n case BinaryOp.LeF32:\n case BinaryOp.LeF64:\n case BinaryOp.GtI32:\n case BinaryOp.GtU32:\n case BinaryOp.GtI64:\n case BinaryOp.GtU64:\n case BinaryOp.GtF32:\n case BinaryOp.GtF64:\n case BinaryOp.GeI32:\n case BinaryOp.GeU32:\n case BinaryOp.GeI64:\n case BinaryOp.GeU64:\n case BinaryOp.GeF32:\n case BinaryOp.GeF64: return false;\n\n // result won't overflow if one side is 0 or if one side is 1 and the other wrapped\n case BinaryOp.MulI32: {\n return !(\n (\n getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\n (\n getConstValueI32(operand) == 0 ||\n (\n getConstValueI32(operand) == 1 &&\n !this.canOverflow(getBinaryRight(expr), type)\n )\n )\n ) || (\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\n (\n getConstValueI32(operand) == 0 ||\n (\n getConstValueI32(operand) == 1 &&\n !this.canOverflow(getBinaryLeft(expr), type)\n )\n )\n )\n );\n }\n\n // result won't overflow if one side is a constant less than this type's mask or one side\n // is wrapped\n case BinaryOp.AndI32: {\n // note that computeSmallIntegerMask returns the mask minus the MSB for signed types\n // because signed value garbage bits must be guaranteed to be equal to the MSB.\n return !(\n (\n (\n getExpressionId(operand = getBinaryLeft(expr)) == ExpressionId.Const &&\n getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\n ) || !this.canOverflow(operand, type)\n ) || (\n (\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\n getConstValueI32(operand) <= type.computeSmallIntegerMask(Type.i32)\n ) || !this.canOverflow(operand, type)\n )\n );\n }\n\n // overflows if the shift doesn't clear potential garbage bits\n case BinaryOp.ShlI32: {\n let shift = 32 - type.size;\n return getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const\n || getConstValueI32(operand) < shift;\n }\n\n // overflows if the value does and the shift doesn't clear potential garbage bits\n case BinaryOp.ShrI32: {\n let shift = 32 - type.size;\n return this.canOverflow(getBinaryLeft(expr), type) && (\n getExpressionId(operand = getBinaryRight(expr)) != ExpressionId.Const ||\n getConstValueI32(operand) < shift\n );\n }\n\n // overflows if the shift does not clear potential garbage bits. if an unsigned value is\n // wrapped, it can't overflow.\n case BinaryOp.ShrU32: {\n let shift = 32 - type.size;\n return type.is(TypeFlags.SIGNED)\n ? !(\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\n getConstValueI32(operand) > shift // must clear MSB\n )\n : this.canOverflow(getBinaryLeft(expr), type) && !(\n getExpressionId(operand = getBinaryRight(expr)) == ExpressionId.Const &&\n getConstValueI32(operand) >= shift // can leave MSB\n );\n }\n\n // overflows if any side does\n case BinaryOp.DivU32:\n case BinaryOp.RemI32:\n case BinaryOp.RemU32: {\n return this.canOverflow(getBinaryLeft(expr), type)\n || this.canOverflow(getBinaryRight(expr), type);\n }\n }\n break;\n }\n\n case ExpressionId.Unary: {\n switch (getUnaryOp(expr)) {\n\n // comparisons do not overflow (result is 0 or 1)\n case UnaryOp.EqzI32:\n case UnaryOp.EqzI64: return false;\n\n // overflow if the maximum result (32) cannot be represented in the target type\n case UnaryOp.ClzI32:\n case UnaryOp.CtzI32:\n case UnaryOp.PopcntI32: return type.size < 7;\n }\n break;\n }\n\n // overflows if the value cannot be represented in the target type\n case ExpressionId.Const: {\n let value: i32 = 0;\n switch (getExpressionType(expr)) {\n case NativeType.I32: { value = getConstValueI32(expr); break; }\n case NativeType.I64: { value = getConstValueI64Low(expr); break; } // discards upper bits\n case NativeType.F32: { value = i32(getConstValueF32(expr)); break; }\n case NativeType.F64: { value = i32(getConstValueF64(expr)); break; }\n default: assert(false);\n }\n switch (type.kind) {\n case TypeKind.I8: return value < i8.MIN_VALUE || value > i8.MAX_VALUE;\n case TypeKind.I16: return value < i16.MIN_VALUE || value > i16.MAX_VALUE;\n case TypeKind.U8: return value < 0 || value > u8.MAX_VALUE;\n case TypeKind.U16: return value < 0 || value > u16.MAX_VALUE;\n case TypeKind.BOOL: return (value & ~1) != 0;\n }\n break;\n }\n\n // overflows if the conversion does\n case ExpressionId.Load: {\n let fromType: Type;\n switch (getLoadBytes(expr)) {\n case 1: { fromType = isLoadSigned(expr) ? Type.i8 : Type.u8; break; }\n case 2: { fromType = isLoadSigned(expr) ? Type.i16 : Type.u16; break; }\n default: { fromType = isLoadSigned(expr) ? Type.i32 : Type.u32; break; }\n }\n return canConversionOverflow(fromType, type);\n }\n\n // overflows if the result does, which is either\n // - the last expression of the block, by contract, if the block doesn't have a label\n // - the last expression or the value of an inner br if the block has a label (TODO)\n case ExpressionId.Block: {\n if (!getBlockName(expr)) {\n let size = assert(getBlockChildCount(expr));\n let last = getBlockChild(expr, size - 1);\n return this.canOverflow(last, type);\n }\n break;\n }\n\n // overflows if either side does\n case ExpressionId.If: {\n return this.canOverflow(getIfTrue(expr), type)\n || this.canOverflow(assert(getIfFalse(expr)), type);\n }\n\n // overflows if either side does\n case ExpressionId.Select: {\n return this.canOverflow(getSelectThen(expr), type)\n || this.canOverflow(getSelectElse(expr), type);\n }\n\n // overflows if the call does not return a wrapped value or the conversion does\n case ExpressionId.Call: {\n let program = this.parentFunction.program;\n let instance = assert(program.instancesByName.get(assert(getCallTarget(expr))));\n assert(instance.kind == ElementKind.FUNCTION);\n let returnType = (instance).signature.returnType;\n return !(instance).flow.is(FlowFlags.RETURNS_WRAPPED)\n || canConversionOverflow(returnType, type);\n }\n\n // doesn't technically overflow\n case ExpressionId.Unreachable: return false;\n }\n return true;\n }\n}\n\n/** Tests if a conversion from one type to another can technically overflow. */\nfunction canConversionOverflow(fromType: Type, toType: Type): bool {\n return !fromType.is(TypeFlags.INTEGER) // non-i32 locals or returns\n || fromType.size > toType.size\n || fromType.is(TypeFlags.SIGNED) != toType.is(TypeFlags.SIGNED);\n}\n","/**\n * A decompiler that generates low-level AssemblyScript from WebAssembly binaries.\n * @module decompiler\n *//***/\n\nimport {\n Module,\n NativeType,\n ExpressionId,\n UnaryOp,\n BinaryOp,\n HostOp,\n FunctionRef,\n ExpressionRef,\n Index,\n getFunctionName,\n getFunctionBody,\n getFunctionParamCount,\n getFunctionParamType,\n getFunctionResultType,\n getExpressionId,\n getExpressionType,\n getBlockName,\n getBlockChildCount,\n getBlockChild,\n getIfCondition,\n getIfTrue,\n getIfFalse,\n getLoopName,\n getLoopBody,\n getBreakName,\n getBreakCondition,\n getGetLocalIndex,\n getSetLocalIndex,\n getSetLocalValue,\n getLoadOffset,\n getLoadPtr,\n getStoreOffset,\n getStorePtr,\n getStoreValue,\n getConstValueI32,\n getConstValueI64Low,\n getConstValueI64High,\n getConstValueF32,\n getConstValueF64,\n getUnaryOp,\n getUnaryValue,\n getBinaryOp,\n getBinaryLeft,\n getBinaryRight,\n getSelectThen,\n getSelectElse,\n getSelectCondition,\n getDropValue,\n getReturnValue,\n getHostOp,\n getHostOperand\n} from \"./module\";\n\n// TODO :-)\n\nexport class Decompiler {\n\n static decompile(module: Module): string {\n var decompiler = new Decompiler();\n decompiler.decompile(module);\n return decompiler.finish();\n }\n\n text: string[] = [];\n functionId: i32 = 0;\n\n constructor() { }\n\n /** Decompiles a module to an AST that can then be serialized. */\n decompile(module: Module): void {\n throw new Error(\"not implemented\");\n }\n\n decompileFunction(func: FunctionRef): void {\n var name = getFunctionName(func) || \"$\" + this.functionId.toString(10);\n var body = getFunctionBody(func);\n this.push(\"function \");\n this.push(name);\n this.push(\"(\");\n for (let i: Index = 0, k: Index = getFunctionParamCount(func); i < k; ++i) {\n if (i > 0) this.push(\", \");\n this.push(\"$\");\n this.push(i.toString(10));\n this.push(\": \");\n this.push(nativeTypeToType(getFunctionParamType(func, i)));\n }\n this.push(\"): \");\n this.push(nativeTypeToType(getFunctionResultType(func)));\n this.push(\" \");\n if (getExpressionId(body) != ExpressionId.Block) {\n this.push(\"{\\n\");\n }\n this.decompileExpression(body);\n if (getExpressionId(body) != ExpressionId.Block) {\n this.push(\"\\n}\\n\");\n }\n ++this.functionId;\n }\n\n decompileExpression(expr: ExpressionRef): void {\n var id = getExpressionId(expr);\n var type = getExpressionType(expr);\n\n var nested: ExpressionRef;\n var string: string | null;\n var i: Index, k: Index;\n\n switch (id) {\n case ExpressionId.Block: { // TODO: magic\n if ((string = getBlockName(expr)) != null) {\n this.push(string);\n this.push(\": \");\n }\n this.push(\"{\\n\");\n k = getBlockChildCount(expr);\n for (i = 0; i < k; ++i) {\n this.decompileExpression(getBlockChild(expr, i));\n }\n this.push(\"}\\n\");\n return;\n }\n case ExpressionId.If: {\n if (type == NativeType.None) {\n this.push(\"if (\");\n this.decompileExpression(getIfCondition(expr));\n this.push(\") \");\n this.decompileExpression(getIfTrue(expr));\n if (nested = getIfFalse(expr)) {\n this.push(\" else \");\n this.decompileExpression(nested);\n }\n } else {\n this.decompileExpression(getIfCondition(expr));\n this.push(\" ? \");\n this.decompileExpression(getIfTrue(expr));\n this.push(\" : \");\n this.decompileExpression(getIfFalse(expr));\n }\n return;\n }\n case ExpressionId.Loop: {\n if ((string = getLoopName(expr)) != null) {\n this.push(string);\n this.push(\": \");\n }\n this.push(\"do \");\n this.decompileExpression(getLoopBody(expr));\n this.push(\"while (0);\\n\");\n }\n case ExpressionId.Break: {\n if (nested = getBreakCondition(expr)) {\n this.push(\"if (\");\n this.decompileExpression(nested);\n this.push(\") \");\n }\n if ((string = getBreakName(expr)) != null) {\n this.push(\"break \");\n this.push(string);\n this.push(\";\\n\");\n } else {\n this.push(\"break;\\n\");\n }\n return;\n }\n case ExpressionId.Switch:\n case ExpressionId.Call:\n case ExpressionId.CallIndirect: {\n throw new Error(\"not implemented\");\n }\n case ExpressionId.GetLocal: {\n this.push(\"$\");\n this.push(getGetLocalIndex(expr).toString(10));\n return;\n }\n case ExpressionId.SetLocal: {\n this.push(\"$\");\n this.push(getSetLocalIndex(expr).toString(10));\n this.push(\" = \");\n this.decompileExpression(getSetLocalValue(expr));\n return;\n }\n case ExpressionId.GetGlobal:\n case ExpressionId.SetGlobal: {\n throw new Error(\"not implemented\");\n }\n case ExpressionId.Load: {\n this.push(\"load<\");\n this.push(nativeTypeToType(type));\n this.push(\">(\");\n this.push(getLoadOffset(expr).toString(10));\n this.push(\" + \");\n this.decompileExpression(getLoadPtr(expr));\n this.push(\")\");\n return;\n }\n case ExpressionId.Store: {\n this.push(\"store<\");\n this.push(nativeTypeToType(type));\n this.push(\">(\");\n this.push(getStoreOffset(expr).toString(10));\n this.push(\" + \");\n this.decompileExpression(getStorePtr(expr));\n this.push(\", \");\n this.decompileExpression(getStoreValue(expr));\n this.push(\")\");\n return;\n }\n case ExpressionId.Const: {\n switch (type) {\n case NativeType.I32: {\n this.push(getConstValueI32(expr).toString(10));\n return;\n }\n case NativeType.I64: {\n this.push(\n i64_to_string(\n i64_new(\n getConstValueI64Low(expr),\n getConstValueI64High(expr)\n )\n )\n );\n return;\n }\n case NativeType.F32: {\n this.push(getConstValueF32(expr).toString(10));\n return;\n }\n case NativeType.F64: {\n this.push(getConstValueF64(expr).toString(10));\n return;\n }\n }\n break;\n }\n case ExpressionId.Unary: {\n switch (getUnaryOp(expr)) {\n case UnaryOp.ClzI32: {\n this.push(\"clz(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.CtzI32: {\n this.push(\"ctz(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.PopcntI32: {\n this.push(\"popcnt(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.NegF32:\n case UnaryOp.NegF64: {\n this.push(\"-\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.AbsF32: {\n this.push(\"abs(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.CeilF32: {\n this.push(\"ceil(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.FloorF32: {\n this.push(\"floor(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.TruncF32: {\n this.push(\"trunc(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.NearestF32: {\n this.push(\"nearest(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.SqrtF32: {\n this.push(\"sqrt(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.EqzI32:\n case UnaryOp.EqzI64: {\n this.push(\"!\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ClzI64: {\n this.push(\"clz(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.CtzI64: {\n this.push(\"ctz(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.PopcntI64: {\n this.push(\"popcnt(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.AbsF64: {\n this.push(\"abs(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.CeilF64: {\n this.push(\"ceil(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.FloorF64: {\n this.push(\"floor(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.TruncF64: {\n this.push(\"trunc(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.NearestF64: {\n this.push(\"nearest(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.SqrtF64: {\n this.push(\"sqrt(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.ExtendI32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ExtendU32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.WrapI64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF32ToI32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF32ToI64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF32ToU32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF32ToU64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF64ToI32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF64ToI64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF64ToU32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.TruncF64ToU64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ReinterpretF32: {\n this.push(\"reinterpret(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.ReinterpretF64: {\n this.push(\"reinterpret(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.ConvertI32ToF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertI32ToF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertU32ToF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertU32ToF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertI64ToF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertI64ToF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertU64ToF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ConvertU64ToF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.PromoteF32: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.DemoteF64: {\n this.push(\"\");\n this.decompileExpression(getUnaryValue(expr));\n return;\n }\n case UnaryOp.ReinterpretI32: {\n this.push(\"reinterpret(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n case UnaryOp.ReinterpretI64: {\n this.push(\"reinterpret(\");\n this.decompileExpression(getUnaryValue(expr));\n this.push(\")\");\n return;\n }\n }\n break;\n }\n case ExpressionId.Binary: { // TODO: precedence\n switch (getBinaryOp(expr)) {\n case BinaryOp.AddI32:\n case BinaryOp.AddI64:\n case BinaryOp.AddF32:\n case BinaryOp.AddF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" + \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.SubI32:\n case BinaryOp.SubI64:\n case BinaryOp.SubF32:\n case BinaryOp.SubF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" - \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.MulI32:\n case BinaryOp.MulI64:\n case BinaryOp.MulF32:\n case BinaryOp.MulF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" * \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.DivI32:\n case BinaryOp.DivI64:\n case BinaryOp.DivF32:\n case BinaryOp.DivF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" / \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.DivU32: {\n this.push(\"(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" / \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.RemI32:\n case BinaryOp.RemI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" % \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.RemU32: {\n this.push(\"(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" / \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.AndI32:\n case BinaryOp.AndI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" & \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.OrI32:\n case BinaryOp.OrI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" | \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.XorI32:\n case BinaryOp.XorI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" ^ \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.ShlI32:\n case BinaryOp.ShlI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" << \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.ShrU32:\n case BinaryOp.ShrU64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >>> \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.ShrI32:\n case BinaryOp.ShrI64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >> \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.RotlI32: {\n this.push(\"rotl(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.RotrI32: {\n this.push(\"rotr(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.EqI32:\n case BinaryOp.EqI64:\n case BinaryOp.EqF32:\n case BinaryOp.EqF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" == \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.NeI32:\n case BinaryOp.NeI64:\n case BinaryOp.NeF32:\n case BinaryOp.NeF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" != \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LtI32:\n case BinaryOp.LtI64:\n case BinaryOp.LtF32:\n case BinaryOp.LtF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" < \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LtU32: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" < \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LeI32:\n case BinaryOp.LeI64:\n case BinaryOp.LeF32:\n case BinaryOp.LeF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" <= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LeU32: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" <= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GtI32:\n case BinaryOp.GtI64:\n case BinaryOp.GtF32:\n case BinaryOp.GtF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" > \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GtU32: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" > \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GeI32:\n case BinaryOp.GeI64:\n case BinaryOp.GeF32:\n case BinaryOp.GeF64: {\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GeU32: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.DivU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" / \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.RemU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" % \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.RotlI64: {\n this.push(\"rotl(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.RotrI64: {\n this.push(\"rotr(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.LtU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" < \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.LeU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" <= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GtU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" > \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.GeU64: {\n this.push(\"\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\" >= \");\n this.decompileExpression(getBinaryRight(expr));\n return;\n }\n case BinaryOp.CopysignF32: {\n this.push(\"copysign(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.MinF32: {\n this.push(\"min(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.MaxF32: {\n this.push(\"max(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.CopysignF64: {\n this.push(\"copysign(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.MinF64: {\n this.push(\"min(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n case BinaryOp.MaxF64: {\n this.push(\"max(\");\n this.decompileExpression(getBinaryLeft(expr));\n this.push(\", \");\n this.decompileExpression(getBinaryRight(expr));\n this.push(\")\");\n return;\n }\n }\n return;\n }\n case ExpressionId.Select: {\n this.push(\"select<\");\n this.push(nativeTypeToType(type));\n this.push(\">(\");\n this.decompileExpression(getSelectThen(expr));\n this.push(\", \");\n this.decompileExpression(getSelectElse(expr));\n this.push(\", \");\n this.decompileExpression(getSelectCondition(expr));\n this.push(\")\");\n return;\n }\n case ExpressionId.Drop: {\n this.decompileExpression(getDropValue(expr));\n this.push(\";\\n\");\n return;\n }\n case ExpressionId.Return: {\n if (nested = getReturnValue(expr)) {\n this.push(\"return \");\n this.decompileExpression(nested);\n this.push(\";\\n\");\n } else {\n this.push(\"return;\\n\");\n }\n return;\n }\n case ExpressionId.Host: {\n switch (getHostOp(expr)) {\n case HostOp.CurrentMemory: {\n this.push(\"memory.size()\");\n return;\n }\n case HostOp.GrowMemory: {\n this.push(\"memory.grow(\");\n this.decompileExpression(getHostOperand(expr, 0));\n this.push(\")\");\n return;\n }\n }\n break;\n }\n case ExpressionId.Nop: {\n this.push(\";\\n\");\n return;\n }\n case ExpressionId.Unreachable: {\n this.push(\"unreachable()\");\n return;\n }\n case ExpressionId.AtomicCmpxchg:\n case ExpressionId.AtomicRMW:\n case ExpressionId.AtomicWait:\n case ExpressionId.AtomicWake:\n }\n throw new Error(\"not implemented\");\n }\n\n private push(text: string): void {\n // mostly here so we can add debugging if necessary\n this.text.push(text);\n }\n\n finish(): string {\n var ret = this.text.join(\"\");\n this.text = [];\n return ret;\n }\n}\n\nfunction nativeTypeToType(type: NativeType): string {\n switch (type) {\n case NativeType.None: return \"void\";\n case NativeType.I32: return \"i32\";\n case NativeType.I64: return \"i64\";\n case NativeType.F32: return \"f32\";\n case NativeType.F64: return \"f64\";\n case NativeType.V128: return \"v128\";\n case NativeType.Unreachable: throw new Error(\"unreachable type\");\n case NativeType.Auto: throw new Error(\"auto type\");\n default: throw new Error(\"unexpected type\");\n }\n}\n","/**\n * Definition builders for WebIDL and TypeScript.\n * @module definitions\n *//***/\n\nimport {\n CommonFlags\n} from \"./common\";\n\nimport {\n Program,\n Element,\n ElementKind,\n Global,\n Enum,\n EnumValue,\n Field,\n Function,\n FunctionPrototype,\n Class,\n ClassPrototype,\n Namespace,\n ConstantValueKind,\n Interface,\n Property,\n PropertyPrototype\n} from \"./program\";\n\nimport {\n Type,\n TypeKind,\n TypeFlags\n} from \"./types\";\n\nimport {\n indent\n} from \"./util\";\n\n/** Walker base class. */\nabstract class ExportsWalker {\n\n /** Program reference. */\n program: Program;\n /** Whether to include private members */\n includePrivate: bool;\n /** Elements still to do. */\n todo: Element[] = [];\n /** Already seen elements. */\n seen: Set = new Set();\n\n /** Constructs a new Element walker. */\n constructor(program: Program, includePrivate: bool = false) {\n this.program = program;\n this.includePrivate;\n }\n\n /** Walks all elements and calls the respective handlers. */\n walk(): void {\n for (let file of this.program.filesByName.values()) {\n let members = file.members;\n if (!members) continue;\n for (let member of members.values()) {\n // FIXME: doesn't honor the actual externally visible name\n this.visitElement(member);\n }\n }\n var todo = this.todo;\n for (let i = 0; i < todo.length; ) this.visitElement(todo[i]);\n }\n\n /** Visits an element.*/\n visitElement(element: Element): void {\n if (element.is(CommonFlags.PRIVATE) && !this.includePrivate) return;\n if (this.seen.has(element)) return;\n this.seen.add(element);\n switch (element.kind) {\n case ElementKind.GLOBAL: {\n if (element.is(CommonFlags.COMPILED)) this.visitGlobal(element);\n break;\n }\n case ElementKind.ENUM: {\n if (element.is(CommonFlags.COMPILED)) this.visitEnum(element);\n break;\n }\n case ElementKind.FUNCTION_PROTOTYPE: {\n this.visitFunctionInstances(element);\n break;\n }\n case ElementKind.CLASS_PROTOTYPE: {\n this.visitClassInstances(element);\n break;\n }\n case ElementKind.FIELD: {\n if ((element).is(CommonFlags.COMPILED)) this.visitField(element);\n break;\n }\n case ElementKind.PROPERTY_PROTOTYPE: {\n this.visitPropertyInstances(element);\n break;\n }\n case ElementKind.PROPERTY: {\n let prop = element;\n let getter = prop.getterInstance;\n if (getter) this.visitFunction(getter);\n let setter = prop.setterInstance;\n if (setter) this.visitFunction(setter);\n break;\n }\n case ElementKind.NAMESPACE: {\n if (hasCompiledMember(element)) this.visitNamespace(element);\n break;\n }\n case ElementKind.TYPEDEFINITION: break;\n default: assert(false);\n }\n }\n\n private visitFunctionInstances(element: FunctionPrototype): void {\n var instances = element.instances;\n if (instances) {\n for (let instance of instances.values()) {\n if (instance.is(CommonFlags.COMPILED)) this.visitFunction(instance);\n }\n }\n }\n\n private visitClassInstances(element: ClassPrototype): void {\n var instances = element.instances;\n if (instances) {\n for (let instance of instances.values()) {\n if (instance.is(CommonFlags.COMPILED)) this.visitClass(instance);\n }\n }\n }\n\n private visitPropertyInstances(element: PropertyPrototype): void {\n // var instances = element.instances;\n // if (instances) {\n // for (let instance of instances.values()) {\n // if (instance.is(CommonFlags.COMPILED)) this.visitProperty(instance);\n // }\n // }\n assert(false);\n }\n\n abstract visitGlobal(element: Global): void;\n abstract visitEnum(element: Enum): void;\n abstract visitFunction(element: Function): void;\n abstract visitClass(element: Class): void;\n abstract visitInterface(element: Interface): void;\n abstract visitField(element: Field): void;\n abstract visitNamespace(element: Element): void;\n}\n\n/** A WebIDL definitions builder. */\nexport class IDLBuilder extends ExportsWalker {\n\n /** Builds WebIDL definitions for the specified program. */\n static build(program: Program): string {\n return new IDLBuilder(program).build();\n }\n\n private sb: string[] = [];\n private indentLevel: i32 = 0;\n\n /** Constructs a new WebIDL builder. */\n constructor(program: Program, includePrivate: bool = false) {\n super(program, includePrivate);\n }\n\n visitGlobal(element: Global): void {\n var sb = this.sb;\n var isConst = element.is(CommonFlags.INLINED);\n indent(sb, this.indentLevel);\n if (isConst) sb.push(\"const \");\n sb.push(this.typeToString(element.type));\n sb.push(\" \");\n sb.push(element.name);\n if (isConst) {\n switch (element.constantValueKind) {\n case ConstantValueKind.INTEGER: {\n sb.push(\" = \");\n sb.push(i64_to_string(element.constantIntegerValue));\n break;\n }\n case ConstantValueKind.FLOAT: {\n sb.push(\" = \");\n sb.push(element.constantFloatValue.toString());\n break;\n }\n default: assert(false);\n }\n }\n sb.push(\";\\n\");\n }\n\n visitEnum(element: Enum): void {\n var sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"interface \");\n sb.push(element.name);\n sb.push(\" {\\n\");\n var members = element.members;\n if (members) {\n for (let [name, member] of members) {\n if (member.kind == ElementKind.ENUMVALUE) {\n let isConst = (member).is(CommonFlags.INLINED);\n indent(sb, this.indentLevel);\n if (isConst) sb.push(\"const \");\n else sb.push(\"readonly \");\n sb.push(\"unsigned long \");\n sb.push(name);\n if (isConst) {\n sb.push(\" = \");\n assert((member).constantValueKind == ConstantValueKind.INTEGER);\n sb.push(i64_low((member).constantIntegerValue).toString(10));\n }\n sb.push(\";\\n\");\n }\n }\n for (let member of members.values()) {\n if (member.kind != ElementKind.ENUMVALUE) this.visitElement(member);\n }\n }\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n visitFunction(element: Function): void {\n var sb = this.sb;\n var signature = element.signature;\n indent(sb, this.indentLevel);\n sb.push(this.typeToString(signature.returnType));\n sb.push(\" \");\n sb.push(element.name);\n sb.push(\"(\");\n var parameters = signature.parameterTypes;\n var numParameters = parameters.length;\n // var requiredParameters = signature.requiredParameters;\n for (let i = 0; i < numParameters; ++i) {\n if (i) sb.push(\", \");\n // if (i >= requiredParameters) sb.push(\"optional \");\n sb.push(this.typeToString(parameters[i]));\n sb.push(\" \");\n sb.push(signature.getParameterName(i));\n }\n sb.push(\");\\n\");\n var members = element.members;\n if (members && members.size) {\n indent(sb, this.indentLevel);\n sb.push(\"interface \");\n sb.push(element.name);\n sb.push(\" {\\n\");\n for (let member of members.values()) this.visitElement(member);\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n }\n\n visitClass(element: Class): void {\n var sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"interface \");\n sb.push(element.name);\n sb.push(\" {\\n\");\n // TODO\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n visitInterface(element: Interface): void {\n this.visitClass(element);\n }\n\n visitField(element: Field): void {\n // TODO\n }\n\n visitNamespace(element: Namespace): void {\n var sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"interface \");\n sb.push(element.name);\n sb.push(\" {\\n\");\n var members = element.members;\n if (members) {\n for (let member of members.values()) this.visitElement(member);\n }\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n typeToString(type: Type): string {\n switch (type.kind) {\n case TypeKind.I8: return \"byte\";\n case TypeKind.I16: return \"short\";\n case TypeKind.I32: return \"long\";\n case TypeKind.I64: return \"long long\";\n case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"long long\" : \"long\";\n case TypeKind.U8: return \"octet\";\n case TypeKind.U16: return \"unsigned short\";\n case TypeKind.U32: return \"unsigned long\";\n // ^ TODO: function types\n case TypeKind.U64: return \"unsigned long long\";\n case TypeKind.USIZE: return this.program.options.isWasm64 ? \"unsigned long long\" : \"unsigned long\";\n // ^ TODO: class types\n case TypeKind.BOOL: return \"boolean\";\n case TypeKind.F32: return \"unrestricted float\";\n case TypeKind.F64: return \"unrestricted double\";\n case TypeKind.VOID: return \"void\";\n default: {\n assert(false);\n return \"\";\n }\n }\n }\n\n build(): string {\n var sb = this.sb;\n sb.push(\"interface ASModule {\\n\");\n ++this.indentLevel;\n this.walk();\n --this.indentLevel;\n sb.push(\"}\\n\");\n return sb.join(\"\");\n }\n}\n\n/** A TypeScript definitions builder. */\nexport class TSDBuilder extends ExportsWalker {\n\n /** Builds TypeScript definitions for the specified program. */\n static build(program: Program): string {\n return new TSDBuilder(program).build();\n }\n\n private sb: string[] = [];\n private indentLevel: i32 = 0;\n\n /** Constructs a new WebIDL builder. */\n constructor(program: Program, includePrivate: bool = false) {\n super(program, includePrivate);\n }\n\n visitGlobal(element: Global): void {\n var sb = this.sb;\n var isConst = element.is(CommonFlags.INLINED);\n indent(sb, this.indentLevel);\n if (element.is(CommonFlags.STATIC)) {\n if (isConst) sb.push(\"static readonly \");\n else sb.push(\"static \");\n } else {\n if (isConst) sb.push(\"const \");\n else sb.push(\"var \");\n }\n sb.push(element.name);\n sb.push(\": \");\n sb.push(this.typeToString(element.type));\n sb.push(\";\\n\");\n this.visitNamespace(element);\n }\n\n visitEnum(element: Enum): void {\n var sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"enum \");\n sb.push(element.name);\n sb.push(\" {\\n\");\n var members = element.members;\n if (members) {\n let numMembers = members.size;\n for (let [name, member] of members) {\n if (member.kind == ElementKind.ENUMVALUE) {\n indent(sb, this.indentLevel);\n sb.push(name);\n if (member.is(CommonFlags.INLINED)) {\n sb.push(\" = \");\n assert((member).constantValueKind == ConstantValueKind.INTEGER);\n sb.push(i64_low((member).constantIntegerValue).toString(10));\n }\n sb.push(\",\\n\");\n --numMembers;\n }\n }\n if (numMembers) this.visitNamespace(element);\n }\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n visitFunction(element: Function): void {\n if (element.isAny(CommonFlags.PRIVATE | CommonFlags.SET)) return;\n var sb = this.sb;\n var signature = element.signature;\n indent(sb, this.indentLevel);\n if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\n if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\n if (element.is(CommonFlags.GET)) {\n sb.push(element.identifierNode.text); // 'get:funcName' internally\n sb.push(\": \");\n sb.push(this.typeToString(signature.returnType));\n sb.push(\";\\n\");\n return;\n } else {\n if (!element.isAny(CommonFlags.STATIC | CommonFlags.INSTANCE)) sb.push(\"function \");\n sb.push(element.name);\n }\n sb.push(\"(\");\n var parameters = signature.parameterTypes;\n var numParameters = parameters.length;\n // var requiredParameters = signature.requiredParameters;\n for (let i = 0; i < numParameters; ++i) {\n if (i) sb.push(\", \");\n // if (i >= requiredParameters) sb.push(\"optional \");\n sb.push(signature.getParameterName(i));\n sb.push(\": \");\n sb.push(this.typeToString(parameters[i]));\n }\n if (element.isAny(CommonFlags.CONSTRUCTOR | CommonFlags.SET)) {\n sb.push(\")\");\n } else {\n sb.push(\"): \");\n sb.push(this.typeToString(signature.returnType));\n }\n sb.push(\";\\n\");\n this.visitNamespace(element);\n }\n\n visitClass(element: Class): void {\n var sb = this.sb;\n var isInterface = element.kind == ElementKind.INTERFACE;\n indent(sb, this.indentLevel++);\n if (isInterface) {\n sb.push(\"interface \");\n } else {\n if (element.is(CommonFlags.ABSTRACT)) sb.push(\"abstract \");\n sb.push(\"class \");\n }\n sb.push(element.name);\n var base = element.base;\n if (base && base.is(CommonFlags.COMPILED | CommonFlags.MODULE_EXPORT)) {\n sb.push(\" extends \");\n sb.push(base.name); // TODO: fqn\n }\n sb.push(\" {\\n\");\n var members = element.parent.members; // static\n if (members) {\n for (let member of members.values()) {\n this.visitElement(member);\n }\n }\n var ctor = element.constructorInstance;\n if (ctor) this.visitFunction(ctor);\n members = element.members; // instance\n if (members) {\n for (let member of members.values()) this.visitElement(member);\n }\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n\n visitInterface(element: Interface): void {\n this.visitClass(element);\n }\n\n visitField(element: Field): void {\n if (element.is(CommonFlags.PRIVATE)) return;\n var sb = this.sb;\n indent(sb, this.indentLevel);\n if (element.is(CommonFlags.PROTECTED)) sb.push(\"protected \");\n if (element.is(CommonFlags.STATIC)) sb.push(\"static \");\n if (element.is(CommonFlags.READONLY)) sb.push(\"readonly \");\n sb.push(element.name);\n sb.push(\": \");\n sb.push(this.typeToString(element.type));\n sb.push(\";\\n\");\n }\n\n visitNamespace(element: Element): void {\n var members = element.members;\n if (members && members.size) {\n let sb = this.sb;\n indent(sb, this.indentLevel++);\n sb.push(\"namespace \");\n sb.push(element.name);\n sb.push(\" {\\n\");\n for (let member of members.values()) this.visitElement(member);\n indent(sb, --this.indentLevel);\n sb.push(\"}\\n\");\n }\n }\n\n typeToString(type: Type): string {\n if (type.is(TypeFlags.REFERENCE)){\n return type.toString();\n }\n switch (type.kind) {\n case TypeKind.I8: return \"i8\";\n case TypeKind.I16: return \"i16\";\n case TypeKind.I32: return \"i32\";\n case TypeKind.I64: return \"I64\";\n case TypeKind.ISIZE: return this.program.options.isWasm64 ? \"I64\" : \"i32\";\n case TypeKind.U8: return \"u8\";\n case TypeKind.U16: return \"u16\";\n case TypeKind.U32: return \"u32\";\n // ^ TODO: function types\n case TypeKind.U64: return \"U64\";\n case TypeKind.USIZE: return this.program.options.isWasm64 ? \"U64\" : \"u32\";\n // ^ TODO: class types\n case TypeKind.BOOL: return \"bool\";\n case TypeKind.F32: return \"f32\";\n case TypeKind.F64: return \"f64\";\n case TypeKind.V128: return \"v128\";\n case TypeKind.VOID: return \"void\";\n default: {\n assert(false);\n return \"\";\n }\n }\n }\n\n build(): string {\n var sb = this.sb;\n sb.push(\"declare namespace ASModule {\\n\");\n sb.push(\" type i8 = number;\\n\");\n sb.push(\" type i16 = number;\\n\");\n sb.push(\" type i32 = number;\\n\");\n sb.push(\" type u8 = number;\\n\");\n sb.push(\" type u16 = number;\\n\");\n sb.push(\" type u32 = number;\\n\");\n sb.push(\" type f32 = number;\\n\");\n sb.push(\" type f64 = number;\\n\");\n sb.push(\" type bool = any;\\n\");\n ++this.indentLevel;\n this.walk();\n --this.indentLevel;\n sb.push(\"}\\n\");\n sb.push(\"export default ASModule;\\n\");\n return this.sb.join(\"\");\n }\n}\n\n// helpers\n\n/** Tests if a namespace-like element has at least one compiled member. */\nfunction hasCompiledMember(element: Element): bool {\n var members = element.members;\n if (members) {\n for (let member of members.values()) {\n switch (member.kind) {\n case ElementKind.FUNCTION_PROTOTYPE: {\n let instances = (member).instances;\n if (instances) {\n for (let instance of instances.values()) {\n if (instance.is(CommonFlags.COMPILED)) return true;\n }\n }\n break;\n }\n case ElementKind.CLASS_PROTOTYPE: {\n let instances = (member).instances;\n if (instances) {\n for (let instance of instances.values()) {\n if (instance.is(CommonFlags.COMPILED)) return true;\n }\n }\n break;\n }\n default: {\n if (member.is(CommonFlags.COMPILED) || hasCompiledMember(member)) return true;\n break;\n }\n }\n }\n }\n return false;\n}\n","/**\n * A TypeScript parser for the AssemblyScript subset.\n * @module parser\n *//***/\n\nimport {\n CommonFlags,\n LIBRARY_PREFIX,\n PATH_DELIMITER\n} from \"./common\";\n\nimport {\n Program\n} from \"./program\";\n\nimport {\n Tokenizer,\n Token,\n Range,\n CommentHandler,\n IdentifierHandling\n} from \"./tokenizer\";\n\nimport {\n DiagnosticCode,\n DiagnosticEmitter\n} from \"./diagnostics\";\n\nimport {\n normalizePath\n} from \"./util\";\n\nimport {\n Node,\n NodeKind,\n Source,\n SourceKind,\n CommonTypeNode,\n TypeNode,\n SignatureNode,\n\n Expression,\n AssertionKind,\n CallExpression,\n ClassExpression,\n FunctionExpression,\n IdentifierExpression,\n StringLiteralExpression,\n\n Statement,\n BlockStatement,\n BreakStatement,\n ClassDeclaration,\n ContinueStatement,\n DeclarationStatement,\n DecoratorNode,\n DoStatement,\n EnumDeclaration,\n EnumValueDeclaration,\n ExportImportStatement,\n ExportMember,\n ExportStatement,\n ExpressionStatement,\n ForStatement,\n FunctionDeclaration,\n IfStatement,\n ImportDeclaration,\n ImportStatement,\n NamespaceDeclaration,\n ParameterNode,\n ParameterKind,\n ReturnStatement,\n SwitchCase,\n SwitchStatement,\n ThrowStatement,\n TryStatement,\n TypeDeclaration,\n TypeParameterNode,\n VariableStatement,\n VariableDeclaration,\n VoidStatement,\n WhileStatement,\n\n mangleInternalPath,\n nodeIsCallable,\n nodeIsGenericCallable,\n IndexSignatureDeclaration\n} from \"./ast\";\n\n/** Parser interface. */\nexport class Parser extends DiagnosticEmitter {\n\n /** Program being created. */\n program: Program;\n /** Source file names to be requested next. */\n backlog: string[] = new Array();\n /** Source file names already seen, that is processed or backlogged. */\n seenlog: Set = new Set();\n /** Source file names already completely processed. */\n donelog: Set = new Set();\n /** Optional handler to intercept comments while tokenizing. */\n onComment: CommentHandler | null = null;\n\n /** Constructs a new parser. */\n constructor() {\n super();\n this.program = new Program(this.diagnostics);\n }\n\n /** Parses a file and adds its definitions to the program. */\n parseFile(\n text: string,\n path: string,\n isEntry: bool\n ): void {\n var normalizedPath = normalizePath(path);\n var internalPath = mangleInternalPath(normalizedPath);\n\n // check if already processed\n if (this.donelog.has(internalPath)) return;\n this.donelog.add(internalPath); // do not parse again\n this.seenlog.add(internalPath); // do not request again\n\n // create the source element\n var source = new Source(\n normalizedPath,\n text,\n isEntry\n ? SourceKind.ENTRY\n : path.startsWith(LIBRARY_PREFIX) && path.indexOf(PATH_DELIMITER, LIBRARY_PREFIX.length) < 0\n ? SourceKind.LIBRARY\n : SourceKind.DEFAULT\n );\n var program = this.program;\n program.sources.push(source);\n\n // tokenize and parse\n var tn = new Tokenizer(source, program.diagnostics);\n tn.onComment = this.onComment;\n source.tokenizer = tn;\n var statements = source.statements;\n while (!tn.skip(Token.ENDOFFILE)) {\n let statement = this.parseTopLevelStatement(tn, null);\n if (statement) statements.push(statement);\n }\n tn.finish();\n }\n\n /** Parses a top-level statement. */\n parseTopLevelStatement(\n tn: Tokenizer,\n namespace: NamespaceDeclaration | null = null\n ): Statement | null {\n var flags = CommonFlags.NONE;\n var startPos: i32 = -1;\n\n // check decorators\n var decorators: DecoratorNode[] | null = null;\n while (tn.skip(Token.AT)) {\n if (startPos < 0) startPos = tn.tokenPos;\n let decorator = this.parseDecorator(tn);\n if (!decorator) {\n this.skipStatement(tn);\n continue;\n }\n if (!decorators) decorators = [];\n decorators.push(decorator);\n }\n\n // check modifiers\n var exportStart: i32 = 0;\n var exportEnd: i32 = 0;\n if (tn.skip(Token.EXPORT)) {\n if (tn.skip(Token.DEFAULT)) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n tn.range()\n );\n }\n if (startPos < 0) startPos = tn.tokenPos;\n flags |= CommonFlags.EXPORT;\n exportStart = tn.tokenPos;\n exportEnd = tn.pos;\n }\n\n var declareStart: i32 = 0;\n var declareEnd: i32 = 0;\n var contextIsAmbient = namespace != null && namespace.is(CommonFlags.AMBIENT);\n if (tn.skip(Token.DECLARE)) {\n if (startPos < 0) startPos = tn.tokenPos;\n if (contextIsAmbient) {\n this.error(\n DiagnosticCode.A_declare_modifier_cannot_be_used_in_an_already_ambient_context,\n tn.range()\n ); // recoverable\n }\n flags |= CommonFlags.DECLARE | CommonFlags.AMBIENT;\n } else if (contextIsAmbient) {\n flags |= CommonFlags.AMBIENT;\n }\n\n // parse the statement\n var statement: Statement | null = null;\n\n // handle declarations\n var first = tn.peek();\n if (startPos < 0) startPos = tn.nextTokenPos;\n switch (first) {\n case Token.CONST: {\n tn.next();\n flags |= CommonFlags.CONST;\n if (tn.skip(Token.ENUM)) {\n statement = this.parseEnum(tn, flags, decorators, startPos);\n } else {\n statement = this.parseVariable(tn, flags, decorators, startPos);\n }\n decorators = null;\n break;\n }\n case Token.LET: flags |= CommonFlags.LET;\n case Token.VAR: {\n tn.next();\n statement = this.parseVariable(tn, flags, decorators, startPos);\n decorators = null;\n break;\n }\n case Token.ENUM: {\n tn.next();\n statement = this.parseEnum(tn, flags, decorators, startPos);\n decorators = null;\n break;\n }\n case Token.FUNCTION: {\n tn.next();\n statement = this.parseFunction(tn, flags, decorators, startPos);\n decorators = null;\n break;\n }\n case Token.ABSTRACT: {\n let state = tn.mark();\n tn.next();\n if (!tn.skip(Token.CLASS)) {\n tn.reset(state);\n statement = this.parseStatement(tn, true);\n break;\n } else {\n tn.discard(state);\n }\n flags |= CommonFlags.ABSTRACT;\n // fall through\n }\n case Token.CLASS:\n case Token.INTERFACE: {\n tn.next();\n statement = this.parseClassOrInterface(tn, flags, decorators, startPos);\n decorators = null;\n break;\n }\n case Token.NAMESPACE: {\n let state = tn.mark();\n tn.next();\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\n tn.discard(state);\n statement = this.parseNamespace(tn, flags, decorators, startPos);\n decorators = null;\n } else {\n tn.reset(state);\n statement = this.parseStatement(tn, true);\n }\n break;\n }\n case Token.IMPORT: {\n tn.next();\n flags |= CommonFlags.IMPORT;\n if (flags & CommonFlags.EXPORT) {\n statement = this.parseExportImport(tn, startPos);\n } else {\n statement = this.parseImport(tn);\n }\n break;\n }\n case Token.TYPE: { // also identifier\n let state = tn.mark();\n tn.next();\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\n tn.discard(state);\n statement = this.parseTypeDeclaration(tn, flags, decorators, startPos);\n decorators = null;\n } else {\n tn.reset(state);\n statement = this.parseStatement(tn, true);\n }\n break;\n }\n default: {\n\n // handle plain exports\n if (flags & CommonFlags.EXPORT) {\n statement = this.parseExport(tn, startPos, (flags & CommonFlags.DECLARE) != 0);\n\n // handle non-declaration statements\n } else {\n if (exportEnd) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(exportStart, exportEnd), \"export\"\n ); // recoverable\n }\n if (declareEnd) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(declareStart, declareEnd), \"declare\"\n ); // recoverable\n }\n if (!namespace) {\n statement = this.parseStatement(tn, true);\n } // TODO: else?\n }\n break;\n }\n }\n\n // check for decorators that weren't consumed\n if (decorators) {\n for (let i = 0, k = decorators.length; i < k; ++i) {\n this.error(\n DiagnosticCode.Decorators_are_not_valid_here,\n decorators[i].range\n );\n }\n }\n return statement;\n }\n\n /** Obtains the next file to parse. */\n nextFile(): string | null {\n var backlog = this.backlog;\n return backlog.length ? backlog.shift() : null;\n }\n\n /** Finishes parsing and returns the program. */\n finish(): Program {\n if (this.backlog.length) throw new Error(\"backlog is not empty\");\n this.backlog = [];\n this.seenlog.clear();\n this.donelog.clear();\n return this.program;\n }\n\n /** Parses a type. */\n parseType(\n tn: Tokenizer,\n acceptParenthesized: bool = true,\n suppressErrors: bool = false\n ): CommonTypeNode | null {\n\n // NOTE: this parses our limited subset\n var token = tn.next();\n var startPos = tn.tokenPos;\n\n var type: CommonTypeNode;\n\n // '(' ...\n if (token == Token.OPENPAREN) {\n\n // '(' FunctionSignature ')' '|' 'null'?\n let isNullableSignature = tn.skip(Token.OPENPAREN);\n // FunctionSignature?\n let signature = this.tryParseSignature(tn);\n if (signature) {\n if (isNullableSignature) {\n if (!tn.skip(Token.CLOSEPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n if (!tn.skip(Token.BAR)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"|\"\n );\n return null;\n }\n if (!tn.skip(Token.NULL)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"null\"\n );\n }\n signature.isNullable = true;\n }\n return signature;\n } else if (isNullableSignature || this.tryParseSignatureIsSignature) {\n this.error(\n DiagnosticCode.Unexpected_token,\n tn.range()\n );\n return null;\n }\n\n // Type (',' Type)* ')'\n if (acceptParenthesized) {\n let innerType = this.parseType(tn, false, suppressErrors);\n if (!innerType) return null;\n if (!tn.skip(Token.CLOSEPAREN)) {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"}\"\n );\n }\n return null;\n }\n type = innerType;\n type.range.start = startPos;\n type.range.end = tn.pos;\n } else {\n this.error(\n DiagnosticCode.Unexpected_token,\n tn.range()\n );\n return null;\n }\n\n // 'void'\n } else if (token == Token.VOID) {\n type = Node.createType(\n Node.createSimpleTypeName(\"void\", tn.range()), [], false, tn.range(startPos, tn.pos)\n );\n\n // 'this'\n } else if (token == Token.THIS) {\n type = Node.createType(\n Node.createSimpleTypeName(\"this\", tn.range()), [], false, tn.range(startPos, tn.pos)\n );\n\n // 'true'\n } else if (token == Token.TRUE || token == Token.FALSE) {\n type = Node.createType(\n Node.createSimpleTypeName(\"bool\", tn.range()), [], false, tn.range(startPos, tn.pos)\n );\n\n // StringLiteral\n } else if (token == Token.STRINGLITERAL) {\n tn.readString();\n type = Node.createType(\n Node.createSimpleTypeName(\"string\", tn.range()), [], false, tn.range(startPos, tn.pos)\n );\n\n // Identifier\n } else if (token == Token.IDENTIFIER) {\n let first = Node.createSimpleTypeName(tn.readIdentifier(), tn.range());\n let current = first;\n let parameters = new Array();\n let nullable = false;\n\n // Identifier ('.' Identifier)+\n while (tn.skip(Token.DOT)) {\n if (tn.skip(Token.IDENTIFIER)) {\n let next = Node.createSimpleTypeName(tn.readIdentifier(), tn.range());\n current.next = next;\n current = next;\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range(tn.pos)\n );\n return null;\n }\n }\n\n // Name\n if (tn.skip(Token.LESSTHAN)) {\n do {\n let parameter = this.parseType(tn, true, suppressErrors);\n if (!parameter) return null;\n parameters.push(parameter);\n } while (tn.skip(Token.COMMA));\n if (!tn.skip(Token.GREATERTHAN)) {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \">\"\n );\n }\n return null;\n }\n }\n // ... | null\n while (tn.skip(Token.BAR)) {\n if (tn.skip(Token.NULL)) {\n nullable = true;\n } else {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"null\"\n );\n }\n return null;\n }\n }\n type = Node.createType(first, parameters, nullable, tn.range(startPos, tn.pos));\n\n } else {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n // ... [][]\n while (tn.skip(Token.OPENBRACKET)) {\n let bracketStart = tn.tokenPos;\n if (!tn.skip(Token.CLOSEBRACKET)) {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"]\"\n );\n }\n return null;\n }\n let bracketRange = tn.range(bracketStart, tn.pos);\n\n // ...[] | null\n let nullable = false;\n if (tn.skip(Token.BAR)) {\n if (tn.skip(Token.NULL)) {\n nullable = true;\n } else {\n if (!suppressErrors) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"null\"\n );\n }\n return null;\n }\n }\n type = Node.createType(\n Node.createSimpleTypeName(\"Array\", bracketRange),\n [ type ],\n nullable,\n tn.range(startPos, tn.pos)\n );\n if (nullable) break;\n }\n\n return type;\n }\n\n // Indicates whether tryParseSignature determined that it is handling a Signature\n private tryParseSignatureIsSignature: bool = false;\n\n /** Parses a function signature, as used in type declarations. */\n tryParseSignature(\n tn: Tokenizer\n ): SignatureNode | null {\n\n // at '(': ('...'? Identifier '?'? ':' Type (',' '...'? Identifier '?'? ':' Type)* )? ')' '=>' Type\n\n var state = tn.mark();\n var startPos = tn.tokenPos;\n var parameters: ParameterNode[] | null = null;\n var thisType: TypeNode | null = null;\n var isSignature: bool = false;\n\n if (tn.skip(Token.CLOSEPAREN)) {\n isSignature = true;\n tn.discard(state);\n parameters = [];\n\n } else {\n isSignature = false; // not yet known\n do {\n let kind = ParameterKind.DEFAULT;\n if (tn.skip(Token.DOT_DOT_DOT)) {\n isSignature = true;\n tn.discard(state);\n kind = ParameterKind.REST;\n }\n if (tn.skip(Token.THIS)) {\n if (tn.skip(Token.COLON)) {\n isSignature = true;\n tn.discard(state);\n let t = this.parseType(tn, false);\n if (!t) return null;\n if (t.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n t.range\n );\n this.tryParseSignatureIsSignature = true;\n return null;\n }\n thisType = t;\n } else {\n tn.reset(state);\n this.tryParseSignatureIsSignature = false;\n return null;\n }\n } else if (tn.skipIdentifier()) {\n let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range(tn.tokenPos, tn.pos));\n if (tn.skip(Token.QUESTION)) {\n isSignature = true;\n tn.discard(state);\n if (kind == ParameterKind.REST) {\n this.error(\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\n tn.range()\n ); // recoverable\n } else {\n kind = ParameterKind.OPTIONAL;\n }\n }\n if (tn.skip(Token.COLON)) {\n isSignature = true;\n tn.discard(state);\n let type = this.parseType(tn); // not suppressing errors because known\n if (!type) {\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n let param = new ParameterNode();\n param.parameterKind = kind;\n param.name = name;\n param.type = type;\n if (!parameters) parameters = [ param ];\n else parameters.push(param);\n } else {\n if (isSignature) {\n this.error(\n DiagnosticCode.Type_expected,\n tn.range()\n ); // recoverable\n }\n }\n } else {\n if (isSignature) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n } else {\n tn.reset(state);\n }\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n } while (tn.skip(Token.COMMA));\n if (!tn.skip(Token.CLOSEPAREN)) {\n if (isSignature) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n } else {\n tn.reset(state);\n }\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n }\n\n var returnType: CommonTypeNode | null;\n if (tn.skip(Token.EQUALS_GREATERTHAN)) {\n isSignature = true;\n tn.discard(state);\n returnType = this.parseType(tn);\n if (!returnType) {\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n } else {\n if (isSignature) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"=>\"\n );\n } else {\n tn.reset(state);\n }\n this.tryParseSignatureIsSignature = isSignature;\n return null;\n }\n this.tryParseSignatureIsSignature = true;\n return Node.createSignature(\n parameters || [],\n returnType,\n thisType,\n false,\n tn.range(startPos, tn.pos)\n );\n }\n\n // statements\n\n parseDecorator(\n tn: Tokenizer\n ): DecoratorNode | null {\n\n // at '@': Identifier ('.' Identifier)* '(' Arguments\n\n var startPos = tn.tokenPos;\n if (tn.skipIdentifier()) {\n let name = tn.readIdentifier();\n let expression: Expression = Node.createIdentifierExpression(name, tn.range(startPos, tn.pos));\n while (tn.skip(Token.DOT)) {\n if (tn.skipIdentifier()) {\n name = tn.readIdentifier();\n expression = Node.createPropertyAccessExpression(\n expression,\n Node.createIdentifierExpression(name, tn.range()),\n tn.range(startPos, tn.pos)\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n }\n let args: Expression[] | null;\n if (tn.skip(Token.OPENPAREN)) {\n args = this.parseArguments(tn);\n if (args) {\n return Node.createDecorator(expression, args, tn.range(startPos, tn.pos));\n }\n } else {\n return Node.createDecorator(expression, null, tn.range(startPos, tn.pos));\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseVariable(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): VariableStatement | null {\n\n // at ('const' | 'let' | 'var'): VariableDeclaration (',' VariableDeclaration)* ';'?\n\n var members = new Array();\n do {\n let member = this.parseVariableDeclaration(tn, flags, decorators);\n if (!member) return null;\n members.push(member);\n } while (tn.skip(Token.COMMA));\n\n var ret = Node.createVariableStatement(members, decorators, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseVariableDeclaration(\n tn: Tokenizer,\n parentFlags: CommonFlags,\n parentDecorators: DecoratorNode[] | null\n ): VariableDeclaration | null {\n\n // before: Identifier (':' Type)? ('=' Expression)?\n\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n var flags = parentFlags;\n if (tn.skip(Token.EXCLAMATION)) {\n flags |= CommonFlags.DEFINITE_ASSIGNMENT;\n }\n\n var type: CommonTypeNode | null = null;\n if (tn.skip(Token.COLON)) {\n type = this.parseType(tn);\n }\n\n var initializer: Expression | null = null;\n if (tn.skip(Token.EQUALS)) {\n if (flags & CommonFlags.AMBIENT) {\n this.error(\n DiagnosticCode.Initializers_are_not_allowed_in_ambient_contexts,\n tn.range()\n ); // recoverable\n }\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!initializer) return null;\n } else {\n if (flags & CommonFlags.CONST) {\n if (!(flags & CommonFlags.AMBIENT)) {\n this.error(\n DiagnosticCode._const_declarations_must_be_initialized,\n identifier.range\n ); // recoverable\n }\n } else if (!type) { // neither type nor initializer\n this.error(\n DiagnosticCode.Type_expected,\n tn.range(tn.pos)\n ); // recoverable\n }\n }\n var range = Range.join(identifier.range, tn.range());\n if ((flags & CommonFlags.DEFINITE_ASSIGNMENT) && initializer) {\n this.error(\n DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,\n range);\n }\n return Node.createVariableDeclaration(\n identifier,\n type,\n initializer,\n parentDecorators,\n flags,\n range\n );\n }\n\n parseEnum(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): EnumDeclaration | null {\n\n // at 'enum': Identifier '{' (EnumValueDeclaration (',' EnumValueDeclaration )*)? '}' ';'?\n\n if (tn.next() != Token.IDENTIFIER) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n if (tn.next() != Token.OPENBRACE) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n return null;\n }\n var members = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let member = this.parseEnumValue(tn, CommonFlags.NONE);\n if (!member) return null;\n members.push(member);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACE)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n return null;\n }\n }\n }\n var ret = Node.createEnumDeclaration(\n identifier,\n members,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseEnumValue(\n tn: Tokenizer,\n parentFlags: CommonFlags\n ): EnumValueDeclaration | null {\n\n // before: Identifier ('=' Expression)?\n\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n var identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n var value: Expression | null = null;\n if (tn.skip(Token.EQUALS)) {\n value = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!value) return null;\n }\n return Node.createEnumValueDeclaration(\n identifier,\n value,\n parentFlags,\n Range.join(identifier.range, tn.range())\n );\n }\n\n parseReturn(\n tn: Tokenizer\n ): ReturnStatement | null {\n\n // at 'return': Expression | (';' | '}' | ...'\\n')\n\n var expr: Expression | null = null;\n if (\n tn.peek(true) != Token.SEMICOLON &&\n tn.nextToken != Token.CLOSEBRACE &&\n !tn.nextTokenOnNewLine\n ) {\n if (!(expr = this.parseExpression(tn))) return null;\n }\n\n var ret = Node.createReturnStatement(expr, tn.range());\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseTypeParameters(\n tn: Tokenizer\n ): TypeParameterNode[] | null {\n\n // at '<': TypeParameter (',' TypeParameter)* '>'\n\n var typeParameters = new Array();\n var seenOptional = false;\n while (!tn.skip(Token.GREATERTHAN)) {\n let typeParameter = this.parseTypeParameter(tn);\n if (!typeParameter) return null;\n if (typeParameter.defaultType !== null) {\n seenOptional = true;\n } else if (seenOptional) {\n this.error(\n DiagnosticCode.Required_type_parameters_may_not_follow_optional_type_parameters,\n typeParameter.range\n );\n typeParameter.defaultType = null;\n }\n typeParameters.push(typeParameter);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.GREATERTHAN)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \">\"\n );\n return null;\n }\n }\n }\n if (typeParameters.length === 0) {\n this.error(\n DiagnosticCode.Type_parameter_list_cannot_be_empty,\n tn.range()\n ); // recoverable\n }\n return typeParameters;\n }\n\n parseTypeParameter(\n tn: Tokenizer\n ): TypeParameterNode | null {\n\n // before: Identifier ('extends' Type)? ('=' Type)?\n\n if (tn.next() == Token.IDENTIFIER) {\n let identifier = Node.createIdentifierExpression(\n tn.readIdentifier(),\n tn.range()\n );\n let extendsType: TypeNode | null = null;\n if (tn.skip(Token.EXTENDS)) {\n let t = this.parseType(tn);\n if (!t) return null;\n if (t.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n t.range\n );\n return null;\n }\n extendsType = t;\n }\n let defaultType: TypeNode | null = null;\n if (tn.skip(Token.EQUALS)) {\n let t = this.parseType(tn);\n if (!t) return null;\n if (t.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n t.range\n );\n return null;\n }\n defaultType = t;\n }\n return Node.createTypeParameter(\n identifier,\n extendsType,\n defaultType,\n Range.join(identifier.range, tn.range())\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n private parseParametersThis: TypeNode | null = null;\n\n parseParameters(\n tn: Tokenizer,\n isConstructor: bool = false\n ): ParameterNode[] | null {\n\n // at '(': (Parameter (',' Parameter)*)? ')'\n\n var parameters = new Array();\n var seenRest: ParameterNode | null = null;\n var seenOptional = false;\n var reportedRest = false;\n var thisType: CommonTypeNode | null = null;\n\n // check if there is a leading `this` parameter\n this.parseParametersThis = null;\n if (tn.skip(Token.THIS)) {\n if (tn.skip(Token.COLON)) {\n thisType = this.parseType(tn); // reports\n if (!thisType) return null;\n if (thisType.kind == NodeKind.TYPE) {\n this.parseParametersThis = thisType;\n } else {\n this.error(\n DiagnosticCode.Operation_not_supported,\n thisType.range\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n return null;\n }\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEPAREN)) {\n return parameters;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n }\n }\n\n while (!tn.skip(Token.CLOSEPAREN)) {\n let param = this.parseParameter(tn, isConstructor); // reports\n if (!param) return null;\n if (seenRest && !reportedRest) {\n this.error(\n DiagnosticCode.A_rest_parameter_must_be_last_in_a_parameter_list,\n seenRest.name.range\n );\n reportedRest = true;\n }\n switch (param.parameterKind) {\n default: {\n if (seenOptional) {\n this.error(\n DiagnosticCode.A_required_parameter_cannot_follow_an_optional_parameter,\n param.name.range\n );\n }\n break;\n }\n case ParameterKind.OPTIONAL: {\n seenOptional = true;\n break;\n }\n case ParameterKind.REST: {\n seenRest = param;\n break;\n }\n }\n parameters.push(param);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEPAREN)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n }\n }\n return parameters;\n }\n\n parseParameter(\n tn: Tokenizer,\n isConstructor: bool = false\n ): ParameterNode | null {\n\n // before: ('public' | 'private' | 'protected' | '...')? Identifier '?'? (':' Type)? ('=' Expression)?\n\n var isRest = false;\n var isOptional = false;\n var startRange: Range | null = null;\n var accessFlags: CommonFlags = CommonFlags.NONE;\n if (isConstructor) {\n if (tn.skip(Token.PUBLIC)) {\n startRange = tn.range();\n accessFlags |= CommonFlags.PUBLIC;\n } else if (tn.skip(Token.PROTECTED)) {\n startRange = tn.range();\n accessFlags |= CommonFlags.PROTECTED;\n } else if (tn.skip(Token.PRIVATE)) {\n startRange = tn.range();\n accessFlags |= CommonFlags.PRIVATE;\n }\n if (tn.peek() == Token.READONLY) {\n let state = tn.mark();\n tn.next();\n if (tn.peek() != Token.COLON) { // modifier\n tn.discard(state);\n if (!startRange) startRange = tn.range();\n accessFlags |= CommonFlags.READONLY;\n } else { // identifier\n tn.reset(state);\n }\n }\n }\n if (tn.skip(Token.DOT_DOT_DOT)) {\n if (accessFlags) {\n this.error(\n DiagnosticCode.A_parameter_property_cannot_be_declared_using_a_rest_parameter,\n tn.range()\n );\n } else {\n startRange = tn.range();\n }\n isRest = true;\n }\n if (tn.skipIdentifier()) {\n if (!isRest) startRange = tn.range();\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let type: CommonTypeNode | null = null;\n if (isOptional = tn.skip(Token.QUESTION)) {\n if (isRest) {\n this.error(\n DiagnosticCode.A_rest_parameter_cannot_be_optional,\n identifier.range\n );\n }\n }\n if (tn.skip(Token.COLON)) {\n type = this.parseType(tn);\n if (!type) return null;\n } else {\n type = Node.createOmittedType(tn.range(tn.pos));\n }\n let initializer: Expression | null = null;\n if (tn.skip(Token.EQUALS)) {\n if (isRest) {\n this.error(\n DiagnosticCode.A_rest_parameter_cannot_have_an_initializer,\n identifier.range\n );\n }\n if (isOptional) {\n this.error(\n DiagnosticCode.Parameter_cannot_have_question_mark_and_initializer,\n identifier.range\n );\n } else {\n isOptional = true;\n }\n initializer = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!initializer) return null;\n }\n let param = Node.createParameter(\n identifier,\n type,\n initializer,\n isRest\n ? ParameterKind.REST\n : isOptional\n ? ParameterKind.OPTIONAL\n : ParameterKind.DEFAULT,\n Range.join(startRange, tn.range())\n );\n param.flags |= accessFlags;\n return param;\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseFunction(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): FunctionDeclaration | null {\n\n // at 'function':\n // Identifier\n // ('<' TypeParameters)?\n // '(' Parameters (':' Type)?\n // '{' Statement* '}'\n // ';'?\n\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range(tn.pos)\n );\n return null;\n }\n\n var name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n var signatureStart: i32 = -1;\n\n var typeParameters: TypeParameterNode[] | null = null;\n if (tn.skip(Token.LESSTHAN)) {\n signatureStart = tn.tokenPos;\n typeParameters = this.parseTypeParameters(tn);\n if (!typeParameters) return null;\n flags |= CommonFlags.GENERIC;\n }\n\n if (!tn.skip(Token.OPENPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"(\"\n );\n return null;\n }\n\n if (signatureStart < 0) {\n signatureStart = tn.tokenPos;\n }\n\n var parameters = this.parseParameters(tn);\n if (!parameters) return null;\n var thisType = this.parseParametersThis;\n\n var isSetter = (flags & CommonFlags.SET) != 0;\n if (isSetter) {\n if (parameters.length != 1) {\n this.error(\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\n name.range\n ); // recoverable\n }\n if (parameters.length && parameters[0].initializer) {\n this.error(\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\n name.range\n ); // recoverable\n }\n }\n\n if (flags & CommonFlags.GET) {\n if (parameters.length) {\n this.error(\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\n name.range\n ); // recoverable\n }\n }\n\n var returnType: CommonTypeNode | null = null;\n if (tn.skip(Token.COLON)) {\n returnType = this.parseType(tn, true, isSetter);\n if (!returnType) return null;\n }\n\n if (!returnType) {\n returnType = Node.createOmittedType(\n tn.range(tn.pos)\n );\n if (!isSetter) {\n this.error(\n DiagnosticCode.Type_expected,\n returnType.range\n ); // recoverable\n }\n }\n\n var signature = Node.createSignature(\n parameters,\n returnType,\n thisType,\n false,\n tn.range(signatureStart, tn.pos)\n );\n\n var body: Statement | null = null;\n if (tn.skip(Token.OPENBRACE)) {\n if (flags & CommonFlags.AMBIENT) {\n this.error(\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\n tn.range()\n ); // recoverable\n }\n\n body = this.parseBlockStatement(tn, false);\n if (!body) return null;\n } else if (!(flags & CommonFlags.AMBIENT)) {\n this.error(\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\n tn.range(tn.pos)\n );\n }\n\n var ret = Node.createFunctionDeclaration(\n name,\n typeParameters,\n signature,\n body,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseFunctionExpression(tn: Tokenizer): FunctionExpression | null {\n var startPos = tn.tokenPos;\n var name: IdentifierExpression;\n var isArrow = false;\n\n // either at 'function':\n // Identifier?\n // '(' Parameters (':' Type)?\n // Statement\n\n if (tn.token == Token.FUNCTION) {\n if (tn.skipIdentifier()) {\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else { // empty name\n name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\n }\n if (!tn.skip(Token.OPENPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"(\"\n );\n return null;\n }\n\n // or at '(' of arrow function:\n // Parameters (':' Type)?\n // Statement\n\n } else {\n isArrow = true;\n assert(tn.token == Token.OPENPAREN);\n name = Node.createEmptyIdentifierExpression(tn.range(tn.tokenPos));\n }\n\n // TODO: type parameters? doesn't seem worth it.\n\n var signatureStart = tn.pos;\n var parameters = this.parseParameters(tn);\n if (!parameters) return null;\n\n return this.parseFunctionExpressionCommon(tn, name, parameters, isArrow, startPos, signatureStart);\n }\n\n private parseFunctionExpressionCommon(\n tn: Tokenizer,\n name: IdentifierExpression,\n parameters: ParameterNode[],\n isArrow: bool,\n startPos: i32 = -1,\n signatureStart: i32 = -1\n ): FunctionExpression | null {\n if (startPos < 0) startPos = name.range.start;\n if (signatureStart < 0) signatureStart = startPos;\n\n var returnType: CommonTypeNode | null = null;\n if (tn.skip(Token.COLON)) {\n returnType = this.parseType(tn);\n if (!returnType) return null;\n } else {\n returnType = Node.createOmittedType(tn.range(tn.pos));\n this.error(\n DiagnosticCode.Type_expected,\n returnType.range\n ); // recoverable\n }\n\n if (isArrow) {\n if (!tn.skip(Token.EQUALS_GREATERTHAN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"=>\"\n );\n return null;\n }\n }\n\n var signature = Node.createSignature(\n parameters,\n returnType,\n null, // TODO?\n false,\n tn.range(signatureStart, tn.pos)\n );\n\n var body: Statement | null;\n if (isArrow) {\n body = this.parseStatement(tn, false);\n } else {\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"{\"\n );\n return null;\n }\n body = this.parseBlockStatement(tn, false);\n }\n if (!body) return null;\n\n var declaration = Node.createFunctionDeclaration(\n name,\n null,\n signature,\n body,\n null,\n isArrow ? CommonFlags.ARROW : CommonFlags.NONE,\n tn.range(startPos, tn.pos)\n );\n return Node.createFunctionExpression(declaration);\n }\n\n parseClassOrInterface(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): ClassDeclaration | null {\n\n // at ('class' | 'interface'):\n // Identifier\n // ('<' TypeParameters)?\n // ('extends' Type)?\n // ('implements' Type (',' Type)*)?\n // '{' ClassMember* '}'\n\n var isInterface = tn.token == Token.INTERFACE;\n\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n\n var identifier = Node.createIdentifierExpression(\n tn.readIdentifier(),\n tn.range()\n );\n\n var typeParameters: TypeParameterNode[] | null = null;\n if (tn.skip(Token.LESSTHAN)) {\n typeParameters = this.parseTypeParameters(tn);\n if (!typeParameters) return null;\n flags |= CommonFlags.GENERIC;\n }\n\n var extendsType: TypeNode | null = null;\n if (tn.skip(Token.EXTENDS)) {\n let t = this.parseType(tn);\n if (!t) return null;\n if (t.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Operation_not_supported,\n t.range\n );\n return null;\n }\n extendsType = t;\n }\n\n var implementsTypes: TypeNode[] | null = null;\n if (tn.skip(Token.IMPLEMENTS)) {\n if (isInterface) {\n this.error(\n DiagnosticCode.Interface_declaration_cannot_have_implements_clause,\n tn.range()\n ); // recoverable\n }\n do {\n let type = this.parseType(tn);\n if (!type) return null;\n if (!isInterface) {\n if (!implementsTypes) implementsTypes = [];\n implementsTypes.push(type);\n }\n } while (tn.skip(Token.COMMA));\n }\n\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n return null;\n }\n\n var members = new Array();\n var declaration: ClassDeclaration;\n if (isInterface) {\n assert(!implementsTypes);\n declaration = Node.createInterfaceDeclaration(\n identifier,\n typeParameters,\n extendsType,\n members,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n } else {\n declaration = Node.createClassDeclaration(\n identifier,\n typeParameters,\n extendsType,\n implementsTypes,\n members,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n }\n if (!tn.skip(Token.CLOSEBRACE)) {\n do {\n let member = this.parseClassMember(tn, declaration);\n if (member) members.push(member);\n } while (!tn.skip(Token.CLOSEBRACE));\n }\n return declaration;\n }\n\n parseClassExpression(tn: Tokenizer): ClassExpression | null {\n\n // at 'class': Identifier? '{' ... '}'\n\n var startPos = tn.tokenPos;\n var name: IdentifierExpression;\n\n if (tn.skipIdentifier()) {\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n name = Node.createEmptyIdentifierExpression(tn.range(tn.pos));\n }\n\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(tn.pos), \"{\"\n );\n return null;\n }\n\n var members = new Array();\n var declaration = Node.createClassDeclaration(\n name,\n [],\n null,\n null,\n members,\n null,\n CommonFlags.NONE,\n tn.range(startPos, tn.pos)\n );\n if (!tn.skip(Token.CLOSEBRACE)) {\n do {\n let member = this.parseClassMember(tn, declaration);\n if (member) members.push(member);\n } while (!tn.skip(Token.CLOSEBRACE));\n }\n return Node.createClassExpression(declaration);\n }\n\n parseClassMember(\n tn: Tokenizer,\n parent: ClassDeclaration\n ): DeclarationStatement | null {\n\n // before:\n // ('public' | 'private' | 'protected')?\n // ('static' | 'abstract')?\n // 'readonly'?\n // ('get' | 'set')?\n // Identifier ...\n\n var startPos = tn.pos;\n var isInterface = parent.kind == NodeKind.INTERFACEDECLARATION;\n\n var decorators = new Array();\n if (tn.skip(Token.AT)) {\n do {\n let decorator = this.parseDecorator(tn);\n if (!decorator) break;\n decorators.push(decorator);\n } while (tn.skip(Token.AT));\n if (isInterface) {\n this.error(\n DiagnosticCode.Decorators_are_not_valid_here,\n Range.join(decorators[0].range, decorators[decorators.length - 1].range)\n );\n }\n }\n\n // inherit ambient status\n var flags = parent.flags & CommonFlags.AMBIENT;\n\n // implemented methods are virtual\n if (isInterface) flags |= CommonFlags.VIRTUAL;\n\n var accessStart = 0;\n var accessEnd = 0;\n if (tn.skip(Token.PUBLIC)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"public\"\n );\n }\n flags |= CommonFlags.PUBLIC;\n accessStart = tn.tokenPos;\n accessEnd = tn.pos;\n } else if (tn.skip(Token.PRIVATE)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"private\"\n );\n }\n flags |= CommonFlags.PRIVATE;\n accessStart = tn.tokenPos;\n accessEnd = tn.pos;\n } else if (tn.skip(Token.PROTECTED)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"protected\"\n );\n }\n flags |= CommonFlags.PROTECTED;\n accessStart = tn.tokenPos;\n accessEnd = tn.pos;\n }\n\n var staticStart = 0;\n var staticEnd = 0;\n var abstractStart = 0;\n var abstractEnd = 0;\n if (tn.skip(Token.STATIC)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"static\"\n );\n }\n flags |= CommonFlags.STATIC;\n staticStart = tn.tokenPos;\n staticEnd = tn.pos;\n } else {\n flags |= CommonFlags.INSTANCE;\n if (tn.skip(Token.ABSTRACT)) {\n if (isInterface) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(), \"abstract\"\n );\n }\n flags |= CommonFlags.ABSTRACT;\n abstractStart = tn.tokenPos;\n abstractEnd = tn.pos;\n }\n if (parent.flags & CommonFlags.GENERIC) flags |= CommonFlags.GENERIC_CONTEXT;\n }\n\n var readonlyStart: i32 = 0;\n var readonlyEnd: i32 = 0;\n if (tn.skip(Token.READONLY)) {\n flags |= CommonFlags.READONLY;\n readonlyStart = tn.tokenPos;\n readonlyEnd = tn.pos;\n }\n\n // check if accessor: ('get' | 'set') ^\\n Identifier\n var state = tn.mark();\n var isConstructor = false;\n var isGetter = false;\n var getStart: i32 = 0;\n var getEnd: i32 = 0;\n var isSetter = false;\n var setStart: i32 = 0;\n var setEnd: i32 = 0;\n if (!isInterface) {\n if (tn.skip(Token.GET)) {\n if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\n flags |= CommonFlags.GET;\n isGetter = true;\n setStart = tn.tokenPos;\n setEnd = tn.pos;\n if (flags & CommonFlags.READONLY) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\n ); // recoverable\n }\n } else {\n tn.reset(state);\n }\n } else if (tn.skip(Token.SET)) {\n if (tn.peek(true, IdentifierHandling.PREFER) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\n flags |= CommonFlags.SET;\n isSetter = true;\n setStart = tn.tokenPos;\n setEnd = tn.pos;\n if (flags & CommonFlags.READONLY) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\n ); // recoverable\n }\n } else {\n tn.reset(state);\n }\n } else if (tn.skip(Token.CONSTRUCTOR)) {\n flags |= CommonFlags.CONSTRUCTOR;\n isConstructor = true;\n if (flags & CommonFlags.STATIC) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(staticStart, staticEnd), \"static\"\n ); // recoverable\n }\n if (flags & CommonFlags.ABSTRACT) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(abstractStart, abstractEnd), \"abstract\"\n ); // recoverable\n }\n if (flags & CommonFlags.READONLY) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\n ); // recoverable\n }\n }\n }\n\n var name: IdentifierExpression;\n if (isConstructor) {\n name = Node.createConstructorExpression(tn.range());\n } else {\n if (!(isGetter || isSetter) && tn.skip(Token.OPENBRACKET)) {\n // TODO: also handle symbols, which might have some of these modifiers\n if (flags & CommonFlags.PUBLIC) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(accessStart, accessEnd), \"public\"\n ); // recoverable\n } else if (flags & CommonFlags.PROTECTED) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(accessStart, accessEnd), \"protected\"\n ); // recoverable\n } else if (flags & CommonFlags.PRIVATE) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(accessStart, accessEnd), \"protected\"\n ); // recoverable\n }\n if (flags & CommonFlags.STATIC) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(staticStart, staticEnd), \"static\"\n ); // recoverable\n }\n if (flags & CommonFlags.ABSTRACT) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(abstractStart, abstractEnd), \"abstract\"\n ); // recoverable\n }\n if (flags & CommonFlags.READONLY) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(readonlyStart, readonlyEnd), \"readonly\"\n ); // recoverable\n }\n let retIndex = this.parseIndexSignatureDeclaration(tn, decorators);\n if (!retIndex) return null;\n tn.skip(Token.SEMICOLON);\n return retIndex;\n }\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n }\n var typeParameters: TypeParameterNode[] | null = null;\n if (tn.skip(Token.LESSTHAN)) {\n let typeParametersStart = tn.tokenPos;\n typeParameters = this.parseTypeParameters(tn);\n if (!typeParameters) return null;\n if (isConstructor) {\n this.error(\n DiagnosticCode.Type_parameters_cannot_appear_on_a_constructor_declaration,\n tn.range(typeParametersStart, tn.pos)\n ); // recoverable\n } else if (isGetter || isSetter) {\n this.error(\n DiagnosticCode.An_accessor_cannot_have_type_parameters,\n tn.range(typeParametersStart, tn.pos)\n ); // recoverable\n } else {\n flags |= CommonFlags.GENERIC;\n }\n }\n\n // method: '(' Parameters (':' Type)? '{' Statement* '}' ';'?\n if (tn.skip(Token.OPENPAREN)) {\n let signatureStart = tn.tokenPos;\n let parameters = this.parseParameters(tn, isConstructor);\n if (!parameters) return null;\n let thisType = this.parseParametersThis;\n if (isConstructor) {\n for (let i = 0, k = parameters.length; i < k; ++i) {\n let parameter = parameters[i];\n if (parameter.isAny(\n CommonFlags.PUBLIC |\n CommonFlags.PROTECTED |\n CommonFlags.PRIVATE |\n CommonFlags.READONLY\n )) {\n let implicitFieldDeclaration = Node.createFieldDeclaration(\n parameter.name,\n parameter.type,\n null, // initialized via parameter\n null,\n parameter.flags | CommonFlags.INSTANCE,\n parameter.range\n );\n implicitFieldDeclaration.parameterIndex = i;\n parameter.implicitFieldDeclaration = implicitFieldDeclaration;\n parent.members.push(implicitFieldDeclaration);\n }\n }\n } else if (isGetter) {\n if (parameters.length) {\n this.error(\n DiagnosticCode.A_get_accessor_cannot_have_parameters,\n name.range\n );\n }\n } else if (isSetter) {\n if (parameters.length != 1) {\n this.error(\n DiagnosticCode.A_set_accessor_must_have_exactly_one_parameter,\n name.range\n );\n }\n if (parameters.length && parameters[0].initializer) {\n this.error(\n DiagnosticCode.A_set_accessor_parameter_cannot_have_an_initializer,\n name.range\n );\n }\n }\n\n let returnType: CommonTypeNode | null = null;\n if (tn.skip(Token.COLON)) {\n if (name.kind == NodeKind.CONSTRUCTOR) {\n this.error(\n DiagnosticCode.Type_annotation_cannot_appear_on_a_constructor_declaration,\n tn.range()\n );\n } else if (isSetter) {\n this.error(\n DiagnosticCode.A_set_accessor_cannot_have_a_return_type_annotation,\n tn.range()\n );\n }\n returnType = this.parseType(tn, name.kind == NodeKind.CONSTRUCTOR || isSetter);\n if (!returnType) return null;\n } else {\n returnType = Node.createOmittedType(tn.range(tn.pos));\n if (!isSetter && name.kind != NodeKind.CONSTRUCTOR) {\n this.error(\n DiagnosticCode.Type_expected,\n returnType.range\n ); // recoverable\n }\n }\n\n let signature = Node.createSignature(\n parameters,\n returnType,\n thisType,\n false,\n tn.range(signatureStart, tn.pos)\n );\n\n let body: Statement | null = null;\n if (tn.skip(Token.OPENBRACE)) {\n if (flags & CommonFlags.AMBIENT) {\n this.error(\n DiagnosticCode.An_implementation_cannot_be_declared_in_ambient_contexts,\n tn.range()\n ); // recoverable\n } else if (flags & CommonFlags.ABSTRACT) {\n this.error(\n DiagnosticCode.Method_0_cannot_have_an_implementation_because_it_is_marked_abstract,\n tn.range(), name.text\n ); // recoverable\n }\n body = this.parseBlockStatement(tn, false);\n if (!body) return null;\n } else if (!(flags & CommonFlags.AMBIENT) && !isInterface) {\n this.error(\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\n tn.range()\n ); // recoverable\n }\n\n let retMethod = Node.createMethodDeclaration(\n name,\n typeParameters,\n signature,\n body,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return retMethod;\n\n } else if (isConstructor) {\n this.error(\n DiagnosticCode.Constructor_implementation_is_missing,\n name.range\n );\n\n } else if (isGetter || isSetter) {\n this.error(\n DiagnosticCode.Function_implementation_is_missing_or_not_immediately_following_the_declaration,\n name.range\n );\n\n // field: (':' Type)? ('=' Expression)? ';'?\n } else {\n if (flags & CommonFlags.ABSTRACT) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(abstractStart, abstractEnd), \"abstract\"\n ); // recoverable\n }\n\n if (flags & CommonFlags.GET) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(getStart, getEnd), \"get\"\n ); // recoverable\n }\n\n if (flags & CommonFlags.SET) {\n this.error(\n DiagnosticCode._0_modifier_cannot_be_used_here,\n tn.range(setStart, setEnd), \"set\"\n ); // recoverable\n }\n\n let type: CommonTypeNode | null = null;\n if (tn.skip(Token.QUESTION)) {\n this.error(\n DiagnosticCode.Optional_properties_are_not_supported,\n tn.range(startPos, tn.pos)\n );\n }\n if (tn.skip(Token.EXCLAMATION)) {\n flags |= CommonFlags.DEFINITE_ASSIGNMENT;\n }\n if (tn.skip(Token.COLON)) {\n type = this.parseType(tn);\n if (!type) return null;\n } else {\n this.error(\n DiagnosticCode.Type_expected,\n tn.range()\n ); // recoverable\n }\n let initializer: Expression | null = null;\n if (tn.skip(Token.EQUALS)) {\n initializer = this.parseExpression(tn);\n if (!initializer) return null;\n }\n let range = tn.range(startPos, tn.pos);\n if ((flags & CommonFlags.DEFINITE_ASSIGNMENT) && ((flags & CommonFlags.STATIC) || isInterface || initializer)) {\n this.error(\n DiagnosticCode.A_definite_assignment_assertion_is_not_permitted_in_this_context,\n range\n );\n }\n let retField = Node.createFieldDeclaration(\n name,\n type,\n initializer,\n decorators,\n flags,\n range\n );\n tn.skip(Token.SEMICOLON);\n return retField;\n }\n return null;\n }\n\n parseIndexSignatureDeclaration(tn: Tokenizer, decorators: DecoratorNode[]): IndexSignatureDeclaration | null {\n\n // at: '[': 'key' ':' Type ']' ':' Type\n\n if (decorators.length) {\n this.error(\n DiagnosticCode.Decorators_are_not_valid_here,\n Range.join(decorators[0].range, decorators[decorators.length - 1].range)\n ); // recoverable\n }\n\n var start = tn.tokenPos;\n if (tn.skipIdentifier()) {\n let id = tn.readIdentifier();\n if (id == \"key\") {\n if (tn.skip(Token.COLON)) {\n let keyType = this.parseType(tn);\n if (!keyType) return null;\n if (keyType.kind != NodeKind.TYPE) {\n this.error(\n DiagnosticCode.Type_expected,\n tn.range()\n );\n return null;\n }\n if (tn.skip(Token.CLOSEBRACKET)) {\n if (tn.skip(Token.COLON)) {\n let valueType = this.parseType(tn);\n if (!valueType) return null;\n return Node.createIndexSignatureDeclaration(keyType, valueType, tn.range(start, tn.pos));\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"]\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"key\"\n );\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseNamespace(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): NamespaceDeclaration | null {\n\n // at 'namespace': Identifier '{' (Variable | Function)* '}'\n\n if (tn.skipIdentifier()) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n if (tn.skip(Token.OPENBRACE)) {\n let members = new Array();\n let ns = Node.createNamespaceDeclaration(\n identifier,\n members,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n while (!tn.skip(Token.CLOSEBRACE)) {\n let member = this.parseTopLevelStatement(tn, ns);\n if (member) members.push(member);\n }\n tn.skip(Token.SEMICOLON);\n return ns;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseExport(\n tn: Tokenizer,\n startPos: i32,\n isDeclare: bool\n ): ExportStatement | null {\n\n // at 'export': '{' ExportMember (',' ExportMember)* }' ('from' StringLiteral)? ';'?\n\n var path: StringLiteralExpression | null = null;\n if (tn.skip(Token.OPENBRACE)) {\n let members = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let member = this.parseExportMember(tn);\n if (!member) return null;\n members.push(member);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACE)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n return null;\n }\n }\n }\n if (tn.skip(Token.FROM)) {\n if (tn.skip(Token.STRINGLITERAL)) {\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\n } else {\n this.error(\n DiagnosticCode.String_literal_expected,\n tn.range()\n );\n return null;\n }\n }\n let ret = Node.createExportStatement(members, path, isDeclare, tn.range(startPos, tn.pos));\n let internalPath = ret.internalPath;\n if (internalPath !== null && !this.seenlog.has(internalPath)) {\n this.backlog.push(internalPath);\n this.seenlog.add(internalPath);\n }\n tn.skip(Token.SEMICOLON);\n return ret;\n } else if (tn.skip(Token.ASTERISK)) {\n if (tn.skip(Token.FROM)) {\n if (tn.skip(Token.STRINGLITERAL)) {\n path = Node.createStringLiteralExpression(tn.readString(), tn.range());\n let ret = Node.createExportStatement(null, path, isDeclare, tn.range(startPos, tn.pos));\n let internalPath = assert(ret.internalPath);\n let source = tn.source;\n if (!source.exportPaths) source.exportPaths = new Set();\n source.exportPaths.add(internalPath);\n if (!this.seenlog.has(internalPath)) {\n this.backlog.push(internalPath);\n this.seenlog.add(internalPath);\n }\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode.String_literal_expected,\n tn.range()\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"from\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n }\n return null;\n }\n\n parseExportMember(\n tn: Tokenizer\n ): ExportMember | null {\n\n // before: Identifier ('as' Identifier)?\n\n if (tn.skipIdentifier()) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let asIdentifier: IdentifierExpression | null = null;\n if (tn.skip(Token.AS)) {\n if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n }\n return Node.createExportMember(\n identifier,\n asIdentifier,\n asIdentifier\n ? Range.join(identifier.range, asIdentifier.range)\n : identifier.range\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseImport(\n tn: Tokenizer\n ): ImportStatement | null {\n\n // at 'import':\n // ('{' (ImportMember (',' ImportMember)* '}') | ('*' 'as' Identifier)?\n // 'from' StringLiteral ';'?\n\n var startPos = tn.tokenPos;\n var members: ImportDeclaration[] | null = null;\n var namespaceName: IdentifierExpression | null = null;\n var skipFrom = false;\n if (tn.skip(Token.OPENBRACE)) {\n members = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let member = this.parseImportDeclaration(tn);\n if (!member) return null;\n members.push(member);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACE)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n return null;\n }\n }\n }\n } else if (tn.skip(Token.ASTERISK)) {\n if (tn.skip(Token.AS)) {\n if (tn.skipIdentifier()) {\n namespaceName = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"as\"\n );\n return null;\n }\n } else {\n skipFrom = true;\n }\n\n if (skipFrom || tn.skip(Token.FROM)) {\n if (tn.skip(Token.STRINGLITERAL)) {\n let path = Node.createStringLiteralExpression(tn.readString(), tn.range());\n let ret: ImportStatement;\n if (namespaceName) {\n assert(!members);\n ret = Node.createImportStatementWithWildcard(namespaceName, path, tn.range(startPos, tn.pos));\n } else {\n ret = Node.createImportStatement(members, path, tn.range(startPos, tn.pos));\n }\n let internalPath = ret.internalPath;\n if (!this.seenlog.has(internalPath)) {\n this.backlog.push(internalPath);\n this.seenlog.add(internalPath);\n }\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode.String_literal_expected,\n tn.range()\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"from\"\n );\n }\n return null;\n }\n\n parseImportDeclaration(\n tn: Tokenizer\n ): ImportDeclaration | null {\n\n // before: Identifier ('as' Identifier)?\n\n if (tn.skipIdentifier(IdentifierHandling.ALWAYS)) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let asIdentifier: IdentifierExpression | null = null;\n if (tn.skip(Token.AS)) {\n if (tn.skipIdentifier()) {\n asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n }\n return Node.createImportDeclaration(\n identifier,\n asIdentifier,\n asIdentifier\n ? Range.join(identifier.range, asIdentifier.range)\n : identifier.range\n );\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseExportImport(\n tn: Tokenizer,\n startPos: i32\n ): ExportImportStatement | null {\n\n // at 'export' 'import': Identifier ('=' Identifier)? ';'?\n\n if (tn.skipIdentifier()) {\n let asIdentifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n if (tn.skip(Token.EQUALS)) {\n if (tn.skipIdentifier()) {\n let identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let ret = Node.createExportImportStatement(identifier, asIdentifier, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"=\"\n );\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseStatement(\n tn: Tokenizer,\n topLevel: bool = false\n ): Statement | null {\n\n // at previous token\n\n var state = tn.mark();\n var token = tn.next();\n var statement: Statement | null = null;\n switch (token) {\n case Token.BREAK: {\n statement = this.parseBreak(tn);\n break;\n }\n case Token.CONST: {\n statement = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\n break;\n }\n case Token.CONTINUE: {\n statement = this.parseContinue(tn);\n break;\n }\n case Token.DO: {\n statement = this.parseDoStatement(tn);\n break;\n }\n case Token.FOR: {\n statement = this.parseForStatement(tn);\n break;\n }\n case Token.IF: {\n statement = this.parseIfStatement(tn);\n break;\n }\n case Token.LET: {\n statement = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\n break;\n }\n case Token.VAR: {\n statement = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\n break;\n }\n case Token.OPENBRACE: {\n statement = this.parseBlockStatement(tn, topLevel);\n break;\n }\n case Token.RETURN: {\n if (topLevel) {\n this.error(\n DiagnosticCode.A_return_statement_can_only_be_used_within_a_function_body,\n tn.range()\n ); // recoverable\n }\n statement = this.parseReturn(tn);\n break;\n }\n case Token.SEMICOLON: {\n return Node.createEmptyStatement(tn.range(tn.tokenPos));\n }\n case Token.SWITCH: {\n statement = this.parseSwitchStatement(tn);\n break;\n }\n case Token.THROW: {\n statement = this.parseThrowStatement(tn);\n break;\n }\n case Token.TRY: {\n statement = this.parseTryStatement(tn);\n break;\n }\n case Token.VOID: {\n statement = this.parseVoidStatement(tn);\n break;\n }\n case Token.WHILE: {\n statement = this.parseWhileStatement(tn);\n break;\n }\n case Token.TYPE: { // also identifier\n if (tn.peek(false, IdentifierHandling.PREFER) == Token.IDENTIFIER) {\n statement = this.parseTypeDeclaration(tn, CommonFlags.NONE, null, tn.tokenPos);\n break;\n }\n // fall-through\n }\n default: {\n tn.reset(state);\n statement = this.parseExpressionStatement(tn);\n break;\n }\n }\n if (!statement) { // has been reported\n tn.reset(state);\n this.skipStatement(tn);\n } else {\n tn.discard(state);\n }\n return statement;\n }\n\n parseBlockStatement(\n tn: Tokenizer,\n topLevel: bool\n ): BlockStatement | null {\n\n // at '{': Statement* '}' ';'?\n\n var startPos = tn.tokenPos;\n var statements = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let state = tn.mark();\n let statement = this.parseStatement(tn, topLevel);\n if (!statement) {\n if (tn.token == Token.ENDOFFILE) return null;\n tn.reset(state);\n this.skipStatement(tn);\n } else {\n tn.discard(state);\n statements.push(statement);\n }\n }\n var ret = Node.createBlockStatement(statements, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseBreak(\n tn: Tokenizer\n ): BreakStatement | null {\n\n // at 'break': Identifier? ';'?\n\n var identifier: IdentifierExpression | null = null;\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\n tn.next(IdentifierHandling.PREFER);\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n }\n var ret = Node.createBreakStatement(identifier, tn.range());\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseContinue(\n tn: Tokenizer\n ): ContinueStatement | null {\n\n // at 'continue': Identifier? ';'?\n\n var identifier: IdentifierExpression | null = null;\n if (tn.peek(true) == Token.IDENTIFIER && !tn.nextTokenOnNewLine) {\n tn.next(IdentifierHandling.PREFER);\n identifier = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n }\n var ret = Node.createContinueStatement(identifier, tn.range());\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseDoStatement(\n tn: Tokenizer\n ): DoStatement | null {\n\n // at 'do': Statement 'while' '(' Expression ')' ';'?\n\n var startPos = tn.tokenPos;\n var statement = this.parseStatement(tn);\n if (!statement) return null;\n\n if (tn.skip(Token.WHILE)) {\n\n if (tn.skip(Token.OPENPAREN)) {\n let condition = this.parseExpression(tn);\n if (!condition) return null;\n\n if (tn.skip(Token.CLOSEPAREN)) {\n let ret = Node.createDoStatement(statement, condition, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"while\"\n );\n }\n return null;\n }\n\n parseExpressionStatement(\n tn: Tokenizer\n ): ExpressionStatement | null {\n\n // at previous token\n\n var expr = this.parseExpression(tn);\n if (!expr) return null;\n\n var ret = Node.createExpressionStatement(expr);\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseForStatement(\n tn: Tokenizer\n ): ForStatement | null {\n\n // at 'for': '(' Statement? Expression? ';' Expression? ')' Statement\n\n var startPos = tn.tokenPos;\n\n if (tn.skip(Token.OPENPAREN)) {\n let initializer: Statement | null = null;\n\n if (tn.skip(Token.CONST)) {\n initializer = this.parseVariable(tn, CommonFlags.CONST, null, tn.tokenPos);\n } else if (tn.skip(Token.LET)) {\n initializer = this.parseVariable(tn, CommonFlags.LET, null, tn.tokenPos);\n } else if (tn.skip(Token.VAR)) {\n initializer = this.parseVariable(tn, CommonFlags.NONE, null, tn.tokenPos);\n\n } else if (!tn.skip(Token.SEMICOLON)) {\n initializer = this.parseExpressionStatement(tn);\n if (!initializer) return null;\n }\n\n if (tn.token == Token.SEMICOLON) {\n let condition: ExpressionStatement | null = null;\n if (!tn.skip(Token.SEMICOLON)) {\n condition = this.parseExpressionStatement(tn);\n if (!condition) return null;\n }\n\n if (tn.token == Token.SEMICOLON) {\n let incrementor: Expression | null = null;\n if (!tn.skip(Token.CLOSEPAREN)) {\n incrementor = this.parseExpression(tn);\n if (!incrementor) return null;\n\n if (!tn.skip(Token.CLOSEPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n }\n\n let statement = this.parseStatement(tn);\n if (!statement) return null;\n\n return Node.createForStatement(\n initializer,\n condition\n ? condition.expression\n : null,\n incrementor,\n statement,\n tn.range(startPos, tn.pos)\n );\n\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \";\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \";\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n return null;\n }\n\n parseIfStatement(\n tn: Tokenizer\n ): IfStatement | null {\n\n // at 'if': '(' Expression ')' Statement ('else' Statement)?\n\n var startPos = tn.tokenPos;\n if (tn.skip(Token.OPENPAREN)) {\n let condition = this.parseExpression(tn);\n if (!condition) return null;\n if (tn.skip(Token.CLOSEPAREN)) {\n let statement = this.parseStatement(tn);\n if (!statement) return null;\n let elseStatement: Statement | null = null;\n if (tn.skip(Token.ELSE)) {\n elseStatement = this.parseStatement(tn);\n if (!elseStatement) return null;\n }\n return Node.createIfStatement(\n condition,\n statement,\n elseStatement,\n tn.range(startPos, tn.pos)\n );\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n return null;\n }\n\n parseSwitchStatement(\n tn: Tokenizer\n ): SwitchStatement | null {\n\n // at 'switch': '(' Expression ')' '{' SwitchCase* '}' ';'?\n\n var startPos = tn.tokenPos;\n if (tn.skip(Token.OPENPAREN)) {\n let condition = this.parseExpression(tn);\n if (!condition) return null;\n if (tn.skip(Token.CLOSEPAREN)) {\n if (tn.skip(Token.OPENBRACE)) {\n let cases = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n let case_ = this.parseSwitchCase(tn);\n if (!case_) return null;\n cases.push(case_);\n }\n let ret = Node.createSwitchStatement(condition, cases, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n return null;\n }\n\n parseSwitchCase(\n tn: Tokenizer\n ): SwitchCase | null {\n\n var startPos = tn.tokenPos;\n var statements: Statement[],\n statement: Statement | null;\n\n // 'case' Expression ':' Statement*\n\n if (tn.skip(Token.CASE)) {\n let label = this.parseExpression(tn);\n if (!label) return null;\n if (tn.skip(Token.COLON)) {\n statements = new Array();\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\n statement = this.parseStatement(tn);\n if (!statement) return null;\n statements.push(statement);\n }\n return Node.createSwitchCase(label, statements, tn.range(startPos, tn.pos));\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n }\n\n // 'default' ':' Statement*\n\n } else if (tn.skip(Token.DEFAULT)) {\n if (tn.skip(Token.COLON)) {\n statements = new Array();\n while (tn.peek() != Token.CASE && tn.nextToken != Token.DEFAULT && tn.nextToken != Token.CLOSEBRACE) {\n statement = this.parseStatement(tn);\n if (!statement) return null;\n statements.push(statement);\n }\n return Node.createSwitchCase(null, statements, tn.range(startPos, tn.pos));\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._case_or_default_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseThrowStatement(\n tn: Tokenizer\n ): ThrowStatement | null {\n\n // at 'throw': Expression ';'?\n\n var startPos = tn.tokenPos;\n var expression = this.parseExpression(tn);\n if (!expression) return null;\n var ret = Node.createThrowStatement(expression, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseTryStatement(\n tn: Tokenizer\n ): TryStatement | null {\n\n // at 'try':\n // '{' Statement* '}'\n // ('catch' '(' VariableMember ')' '{' Statement* '}')?\n // ('finally' '{' Statement* '}'? ';'?\n\n var startPos = tn.tokenPos;\n var stmt: Statement | null;\n if (tn.skip(Token.OPENBRACE)) {\n let statements = new Array();\n while (!tn.skip(Token.CLOSEBRACE)) {\n stmt = this.parseStatement(tn);\n if (!stmt) return null;\n statements.push(stmt);\n }\n let catchVariable: IdentifierExpression | null = null;\n let catchStatements: Statement[] | null = null;\n let finallyStatements: Statement[] | null = null;\n if (tn.skip(Token.CATCH)) {\n if (!tn.skip(Token.OPENPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n return null;\n }\n if (!tn.skipIdentifier()) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n return null;\n }\n catchVariable = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n if (!tn.skip(Token.CLOSEPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n return null;\n }\n catchStatements = [];\n while (!tn.skip(Token.CLOSEBRACE)) {\n stmt = this.parseStatement(tn);\n if (!stmt) return null;\n catchStatements.push(stmt);\n }\n }\n if (tn.skip(Token.FINALLY)) {\n if (!tn.skip(Token.OPENBRACE)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n return null;\n }\n finallyStatements = [];\n while (!tn.skip(Token.CLOSEBRACE)) {\n stmt = this.parseStatement(tn);\n if (!stmt) return null;\n finallyStatements.push(stmt);\n }\n }\n if (!(catchStatements || finallyStatements)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"catch\"\n );\n return null;\n }\n let ret = Node.createTryStatement(\n statements,\n catchVariable,\n catchStatements,\n finallyStatements,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"{\"\n );\n }\n return null;\n }\n\n parseTypeDeclaration(\n tn: Tokenizer,\n flags: CommonFlags,\n decorators: DecoratorNode[] | null,\n startPos: i32\n ): TypeDeclaration | null {\n\n // at 'type': Identifier ('<' TypeParameters '>')? '=' Type ';'?\n\n if (tn.skipIdentifier()) {\n let name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n let typeParameters: TypeParameterNode[] | null = null;\n if (tn.skip(Token.LESSTHAN)) {\n typeParameters = this.parseTypeParameters(tn);\n if (!typeParameters) return null;\n flags |= CommonFlags.GENERIC;\n }\n if (tn.skip(Token.EQUALS)) {\n let type = this.parseType(tn);\n if (!type) return null;\n let ret = Node.createTypeDeclaration(\n name,\n typeParameters,\n type,\n decorators,\n flags,\n tn.range(startPos, tn.pos)\n );\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"=\"\n );\n }\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range()\n );\n }\n return null;\n }\n\n parseVoidStatement(\n tn: Tokenizer\n ): VoidStatement | null {\n\n // at 'void': Expression ';'?\n\n var startPos = tn.tokenPos;\n var expression = this.parseExpression(tn, Precedence.GROUPING);\n if (!expression) return null;\n var ret = Node.createVoidStatement(expression, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n }\n\n parseWhileStatement(\n tn: Tokenizer\n ): WhileStatement | null {\n\n // at 'while': '(' Expression ')' Statement ';'?\n\n var startPos = tn.tokenPos;\n if (tn.skip(Token.OPENPAREN)) {\n let expression = this.parseExpression(tn);\n if (!expression) return null;\n if (tn.skip(Token.CLOSEPAREN)) {\n let statement = this.parseStatement(tn);\n if (!statement) return null;\n let ret = Node.createWhileStatement(expression, statement, tn.range(startPos, tn.pos));\n tn.skip(Token.SEMICOLON);\n return ret;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n }\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"(\"\n );\n }\n return null;\n }\n\n // expressions\n // see: http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm#climbing\n\n parseExpressionStart(\n tn: Tokenizer\n ): Expression | null {\n\n var token = tn.next(IdentifierHandling.PREFER);\n var startPos = tn.tokenPos;\n var precedence = determinePrecedenceStart(token);\n if (precedence != Precedence.NONE) {\n let operand: Expression | null;\n\n // TODO: SpreadExpression, YieldExpression (currently become unsupported UnaryPrefixExpressions)\n\n // NewExpression\n if (token == Token.NEW) {\n operand = this.parseExpression(tn, Precedence.CALL);\n if (!operand) return null;\n if (operand.kind == NodeKind.CALL) {\n return Node.createNewExpression(\n (operand).expression,\n (operand).typeArguments,\n (operand).arguments,\n tn.range(startPos, tn.pos)\n );\n } else {\n this.error(\n DiagnosticCode.Operation_not_supported,\n tn.range()\n );\n }\n return null;\n } else {\n operand = this.parseExpression(tn, precedence);\n if (!operand) return null;\n }\n\n // UnaryPrefixExpression\n if (token == Token.PLUS_PLUS || token == Token.MINUS_MINUS) {\n if (\n operand.kind != NodeKind.IDENTIFIER &&\n operand.kind != NodeKind.ELEMENTACCESS &&\n operand.kind != NodeKind.PROPERTYACCESS\n ) {\n this.error(\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\n operand.range\n );\n }\n }\n return Node.createUnaryPrefixExpression(token, operand, tn.range(startPos, tn.pos));\n }\n\n var expr: Expression | null = null;\n switch (token) {\n\n case Token.NULL: return Node.createNullExpression(tn.range());\n case Token.TRUE: return Node.createTrueExpression(tn.range());\n case Token.FALSE: return Node.createFalseExpression(tn.range());\n\n // ParenthesizedExpression\n // FunctionExpression\n case Token.OPENPAREN: {\n\n // determine whether this is a function expression\n if (tn.skip(Token.CLOSEPAREN)) { // must be a function expression (fast route)\n return this.parseFunctionExpressionCommon(\n tn,\n Node.createEmptyIdentifierExpression(tn.range(startPos)),\n [],\n true\n );\n }\n let state = tn.mark();\n let again = true;\n do {\n switch (tn.next(IdentifierHandling.PREFER)) {\n\n // function expression\n case Token.DOT_DOT_DOT: {\n tn.reset(state);\n return this.parseFunctionExpression(tn);\n }\n // can be both\n case Token.IDENTIFIER: {\n tn.readIdentifier();\n switch (tn.next()) {\n\n // if we got here, check for arrow\n case Token.CLOSEPAREN: {\n if (\n !tn.skip(Token.COLON) &&\n !tn.skip(Token.EQUALS_GREATERTHAN)\n ) {\n again = false;\n break;\n }\n // fall-through\n }\n // function expression\n case Token.COLON: { // type annotation\n tn.reset(state);\n return this.parseFunctionExpression(tn);\n }\n // optional parameter or parenthesized\n case Token.QUESTION: {\n if (\n tn.skip(Token.COLON) || // optional parameter with type\n tn.skip(Token.COMMA) || // optional parameter without type\n tn.skip(Token.CLOSEPAREN) // last optional parameter without type\n ) {\n tn.reset(state);\n return this.parseFunctionExpression(tn);\n }\n again = false; // parenthesized\n break;\n }\n case Token.COMMA: {\n break; // continue\n }\n // parenthesized expression\n // case Token.EQUALS: // missing type annotation for simplicity\n default: {\n again = false;\n break;\n }\n }\n break;\n }\n // parenthesized expression\n default: {\n again = false;\n break;\n }\n }\n } while (again);\n tn.reset(state);\n\n // parse parenthesized\n expr = this.parseExpression(tn);\n if (!expr) return null;\n if (!tn.skip(Token.CLOSEPAREN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n return Node.createParenthesizedExpression(expr, tn.range(startPos, tn.pos));\n }\n // ArrayLiteralExpression\n case Token.OPENBRACKET: {\n let elementExpressions = new Array();\n while (!tn.skip(Token.CLOSEBRACKET)) {\n if (tn.peek() == Token.COMMA) {\n expr = null; // omitted\n } else {\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!expr) return null;\n }\n elementExpressions.push(expr);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACKET)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"]\"\n );\n return null;\n }\n }\n }\n return Node.createArrayLiteralExpression(elementExpressions, tn.range(startPos, tn.pos));\n }\n // ObjectLiteralExpression\n case Token.OPENBRACE: {\n let startPos = tn.tokenPos;\n let names = new Array();\n let values = new Array();\n let name: IdentifierExpression;\n while (!tn.skip(Token.CLOSEBRACE)) {\n if (!tn.skipIdentifier()) {\n if (!tn.skip(Token.STRINGLITERAL)) {\n this.error(\n DiagnosticCode.Identifier_expected,\n tn.range(),\n );\n return null;\n }\n name = Node.createIdentifierExpression(tn.readString(), tn.range());\n name.isQuoted = true;\n } else {\n name = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n }\n names.push(name);\n if (tn.skip(Token.COLON)) {\n let value = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!value) return null;\n values.push(value);\n } else if (!name.isQuoted) {\n values.push(name);\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n return null;\n }\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEBRACE)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n return null;\n }\n }\n }\n return Node.createObjectLiteralExpression(names, values, tn.range(startPos, tn.pos));\n }\n // AssertionExpression (unary prefix)\n case Token.LESSTHAN: {\n let toType = this.parseType(tn);\n if (!toType) return null;\n if (!tn.skip(Token.GREATERTHAN)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \">\"\n );\n return null;\n }\n expr = this.parseExpression(tn, Precedence.CALL);\n if (!expr) return null;\n return Node.createAssertionExpression(\n AssertionKind.PREFIX,\n expr,\n toType,\n tn.range(startPos, tn.pos)\n );\n }\n case Token.IDENTIFIER: {\n return Node.createIdentifierExpression(tn.readIdentifier(), tn.range(startPos, tn.pos));\n }\n case Token.THIS: {\n return Node.createThisExpression(tn.range(startPos, tn.pos));\n }\n case Token.CONSTRUCTOR: {\n return Node.createConstructorExpression(tn.range(startPos, tn.pos));\n }\n case Token.SUPER: {\n if (tn.peek() != Token.DOT && tn.nextToken != Token.OPENPAREN) {\n this.error(\n DiagnosticCode._super_must_be_followed_by_an_argument_list_or_member_access,\n tn.range()\n );\n }\n return Node.createSuperExpression(tn.range(startPos, tn.pos));\n }\n case Token.STRINGLITERAL: {\n return Node.createStringLiteralExpression(tn.readString(), tn.range(startPos, tn.pos));\n }\n case Token.INTEGERLITERAL: {\n return Node.createIntegerLiteralExpression(tn.readInteger(), tn.range(startPos, tn.pos));\n }\n case Token.FLOATLITERAL: {\n return Node.createFloatLiteralExpression(tn.readFloat(), tn.range(startPos, tn.pos));\n }\n // RegexpLiteralExpression\n // note that this also continues on invalid ones so the surrounding AST remains intact\n case Token.SLASH: {\n let regexpPattern = tn.readRegexpPattern(); // also reports\n if (!tn.skip(Token.SLASH)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"/\"\n );\n return null;\n }\n return Node.createRegexpLiteralExpression(\n regexpPattern,\n tn.readRegexpFlags(), // also reports\n tn.range(startPos, tn.pos)\n );\n }\n case Token.FUNCTION: {\n return this.parseFunctionExpression(tn);\n }\n case Token.CLASS: {\n return this.parseClassExpression(tn);\n }\n default: {\n if (token == Token.ENDOFFILE) {\n this.error(\n DiagnosticCode.Unexpected_end_of_text,\n tn.range(startPos)\n );\n } else {\n this.error(\n DiagnosticCode.Expression_expected,\n tn.range()\n );\n }\n return null;\n }\n }\n }\n\n tryParseTypeArgumentsBeforeArguments(\n tn: Tokenizer\n ): CommonTypeNode[] | null {\n\n // at '<': Type (',' Type)* '>' '('\n\n var state = tn.mark();\n if (!tn.skip(Token.LESSTHAN)) return null;\n var typeArguments = new Array();\n do {\n if (tn.peek() === Token.GREATERTHAN) {\n break;\n }\n let type = this.parseType(tn, true, true);\n if (!type) {\n tn.reset(state);\n return null;\n }\n typeArguments.push(type);\n } while (tn.skip(Token.COMMA));\n if (tn.skip(Token.GREATERTHAN) && tn.skip(Token.OPENPAREN)) {\n return typeArguments;\n }\n tn.reset(state);\n return null;\n }\n\n parseArguments(\n tn: Tokenizer\n ): Expression[] | null {\n\n // at '(': (Expression (',' Expression)*)? ')'\n\n var args = new Array();\n while (!tn.skip(Token.CLOSEPAREN)) {\n let expr = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!expr) return null;\n args.push(expr);\n if (!tn.skip(Token.COMMA)) {\n if (tn.skip(Token.CLOSEPAREN)) {\n break;\n } else {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \")\"\n );\n return null;\n }\n }\n }\n return args;\n }\n\n parseExpression(\n tn: Tokenizer,\n precedence: Precedence = Precedence.COMMA\n ): Expression | null {\n assert(precedence != Precedence.NONE);\n\n var expr = this.parseExpressionStart(tn);\n if (!expr) return null;\n expr = this.maybeParseCallExpression(tn, expr); // simple call like on an Identifier\n\n var startPos = expr.range.start;\n var token: Token;\n var next: Expression | null = null;\n var nextPrecedence: Precedence;\n while (\n (nextPrecedence = determinePrecedence(token = tn.peek())) >= precedence\n ) { // precedence climbing\n tn.next();\n switch (token) {\n // AssertionExpression\n case Token.AS: {\n let toType = this.parseType(tn); // reports\n if (!toType) return null;\n expr = Node.createAssertionExpression(\n AssertionKind.AS,\n expr,\n toType,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n case Token.EXCLAMATION: {\n expr = Node.createAssertionExpression(\n AssertionKind.NONNULL,\n expr,\n null,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // InstanceOfExpression\n case Token.INSTANCEOF: {\n let isType = this.parseType(tn); // reports\n if (!isType) return null;\n expr = Node.createInstanceOfExpression(\n expr,\n isType,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // ElementAccessExpression\n case Token.OPENBRACKET: {\n next = this.parseExpression(tn); // reports\n if (!next) return null;\n if (!tn.skip(Token.CLOSEBRACKET)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"]\"\n );\n return null;\n }\n expr = Node.createElementAccessExpression(\n expr,\n next,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // UnaryPostfixExpression\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS: {\n if (\n expr.kind != NodeKind.IDENTIFIER &&\n expr.kind != NodeKind.ELEMENTACCESS &&\n expr.kind != NodeKind.PROPERTYACCESS\n ) {\n this.error(\n DiagnosticCode.The_operand_of_an_increment_or_decrement_operator_must_be_a_variable_or_a_property_access,\n expr.range\n );\n }\n expr = Node.createUnaryPostfixExpression(\n token,\n expr,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // TernaryExpression\n case Token.QUESTION: {\n let ifThen = this.parseExpression(tn);\n if (!ifThen) return null;\n if (!tn.skip(Token.COLON)) {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \":\"\n );\n return null;\n }\n let ifElse = this.parseExpression(tn, precedence > Precedence.COMMA\n ? Precedence.COMMA + 1\n : Precedence.COMMA\n );\n if (!ifElse) return null;\n expr = Node.createTernaryExpression(\n expr,\n ifThen,\n ifElse,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n // CommaExpression\n case Token.COMMA: {\n let commaExprs: Expression[] = [ expr ];\n do {\n expr = this.parseExpression(tn, Precedence.COMMA + 1);\n if (!expr) return null;\n commaExprs.push(expr);\n } while (tn.skip(Token.COMMA));\n expr = Node.createCommaExpression(commaExprs, tn.range(startPos, tn.pos));\n break;\n }\n default: {\n\n // PropertyAccessExpression\n if (token == Token.DOT) {\n if (tn.skipIdentifier()) {\n next = Node.createIdentifierExpression(tn.readIdentifier(), tn.range());\n } else {\n next = this.parseExpression(tn,\n isRightAssociative(token)\n ? nextPrecedence\n : nextPrecedence + 1\n );\n if (!next) return null;\n }\n if (next.kind == NodeKind.IDENTIFIER) { // expr '.' Identifier\n expr = Node.createPropertyAccessExpression(\n expr,\n next,\n tn.range(startPos, tn.pos)\n );\n } else if (next.kind == NodeKind.CALL) { // expr '.' CallExpression\n expr = this.joinPropertyCall(tn, startPos, expr, next);\n if (!expr) return null;\n } else {\n this.error(\n DiagnosticCode.Identifier_expected,\n next.range\n );\n return null;\n }\n\n // BinaryExpression\n } else {\n next = this.parseExpression(tn,\n isRightAssociative(token)\n ? nextPrecedence\n : nextPrecedence + 1\n );\n if (!next) return null;\n expr = Node.createBinaryExpression(token, expr, next, tn.range(startPos, tn.pos));\n }\n break;\n }\n }\n expr = this.maybeParseCallExpression(tn, expr); // compound call like on an ElementAccess\n }\n return expr;\n }\n\n private joinPropertyCall(\n tn: Tokenizer,\n startPos: i32,\n expr: Expression,\n call: CallExpression\n ): Expression | null {\n var callee = call.expression;\n switch (callee.kind) {\n case NodeKind.IDENTIFIER: { // join property access and use as call target\n call.expression = Node.createPropertyAccessExpression(\n expr,\n callee,\n tn.range(startPos, tn.pos)\n );\n break;\n }\n case NodeKind.CALL: { // join call target und wrap the original call around it\n let inner = this.joinPropertyCall(tn, startPos, expr, callee);\n if (!inner) return null;\n call.expression = inner;\n call.range = tn.range(startPos, tn.pos);\n break;\n }\n default: {\n this.error(\n DiagnosticCode.Identifier_expected,\n call.range\n );\n return null;\n }\n }\n return call;\n }\n\n private maybeParseCallExpression(\n tn: Tokenizer,\n expr: Expression\n ): Expression {\n if (nodeIsCallable(expr.kind)) {\n let typeArguments: CommonTypeNode[] | null = null;\n while (\n tn.skip(Token.OPENPAREN)\n ||\n nodeIsGenericCallable(expr.kind) && (typeArguments = this.tryParseTypeArgumentsBeforeArguments(tn)) !== null\n ) {\n let args = this.parseArguments(tn);\n if (!args) break;\n expr = Node.createCallExpression( // is again callable\n expr,\n typeArguments,\n args,\n tn.range(expr.range.start, tn.pos)\n );\n }\n }\n return expr;\n }\n\n /** Skips over a statement on errors in an attempt to reduce unnecessary diagnostic noise. */\n skipStatement(tn: Tokenizer): void {\n tn.peek(true);\n if (tn.nextTokenOnNewLine) tn.next(); // if reset() to the previous line\n do {\n let nextToken = tn.peek(true);\n if (\n nextToken == Token.ENDOFFILE || // next step should handle this\n nextToken == Token.SEMICOLON // end of the statement for sure\n ) {\n tn.next();\n break;\n }\n if (tn.nextTokenOnNewLine) break; // end of the statement maybe\n switch (tn.next()) {\n case Token.IDENTIFIER: {\n tn.readIdentifier();\n break;\n }\n case Token.STRINGLITERAL: {\n tn.readString();\n break;\n }\n case Token.INTEGERLITERAL: {\n tn.readInteger();\n break;\n }\n case Token.FLOATLITERAL: {\n tn.readFloat();\n break;\n }\n }\n } while (true);\n }\n\n /** Skips over a block on errors in an attempt to reduce unnecessary diagnostic noise. */\n skipBlock(tn: Tokenizer): void {\n // at '{': ... '}'\n var depth = 1;\n var again = true;\n do {\n switch (tn.next()) {\n case Token.ENDOFFILE: {\n this.error(\n DiagnosticCode._0_expected,\n tn.range(), \"}\"\n );\n again = false;\n break;\n }\n case Token.OPENBRACE: {\n ++depth;\n break;\n }\n case Token.CLOSEBRACE: {\n --depth;\n if (!depth) again = false;\n break;\n }\n case Token.IDENTIFIER: {\n tn.readIdentifier();\n break;\n }\n case Token.STRINGLITERAL: {\n tn.readString();\n break;\n }\n case Token.INTEGERLITERAL: {\n tn.readInteger();\n break;\n }\n case Token.FLOATLITERAL: {\n tn.readFloat();\n break;\n }\n }\n } while (again);\n }\n}\n\n/** Operator precedence from least to largest. */\nexport const enum Precedence {\n NONE,\n COMMA,\n SPREAD,\n YIELD,\n ASSIGNMENT,\n CONDITIONAL,\n LOGICAL_OR,\n LOGICAL_AND,\n BITWISE_OR,\n BITWISE_XOR,\n BITWISE_AND,\n EQUALITY,\n RELATIONAL,\n SHIFT,\n ADDITIVE,\n MULTIPLICATIVE,\n EXPONENTIATED,\n UNARY_PREFIX,\n UNARY_POSTFIX,\n CALL,\n MEMBERACCESS,\n GROUPING\n}\n\n/** Determines the precedence of a starting token. */\nfunction determinePrecedenceStart(kind: Token): Precedence {\n switch (kind) {\n case Token.DOT_DOT_DOT: return Precedence.SPREAD;\n case Token.YIELD: return Precedence.YIELD;\n case Token.EXCLAMATION:\n case Token.TILDE:\n case Token.PLUS:\n case Token.MINUS:\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS:\n case Token.TYPEOF:\n case Token.VOID:\n case Token.DELETE: return Precedence.UNARY_PREFIX;\n case Token.NEW: return Precedence.MEMBERACCESS;\n }\n return Precedence.NONE;\n}\n\n/** Determines the precende of a non-starting token. */\nfunction determinePrecedence(kind: Token): Precedence {\n switch (kind) {\n case Token.COMMA: return Precedence.COMMA;\n case Token.EQUALS:\n case Token.PLUS_EQUALS:\n case Token.MINUS_EQUALS:\n case Token.ASTERISK_ASTERISK_EQUALS:\n case Token.ASTERISK_EQUALS:\n case Token.SLASH_EQUALS:\n case Token.PERCENT_EQUALS:\n case Token.LESSTHAN_LESSTHAN_EQUALS:\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\n case Token.AMPERSAND_EQUALS:\n case Token.CARET_EQUALS:\n case Token.BAR_EQUALS: return Precedence.ASSIGNMENT;\n case Token.QUESTION: return Precedence.CONDITIONAL;\n case Token.BAR_BAR: return Precedence.LOGICAL_OR;\n case Token.AMPERSAND_AMPERSAND: return Precedence.LOGICAL_AND;\n case Token.BAR: return Precedence.BITWISE_OR;\n case Token.CARET: return Precedence.BITWISE_XOR;\n case Token.AMPERSAND: return Precedence.BITWISE_AND;\n case Token.EQUALS_EQUALS:\n case Token.EXCLAMATION_EQUALS:\n case Token.EQUALS_EQUALS_EQUALS:\n case Token.EXCLAMATION_EQUALS_EQUALS: return Precedence.EQUALITY;\n case Token.AS:\n case Token.IN:\n case Token.INSTANCEOF:\n case Token.LESSTHAN:\n case Token.GREATERTHAN:\n case Token.LESSTHAN_EQUALS:\n case Token.GREATERTHAN_EQUALS: return Precedence.RELATIONAL;\n case Token.LESSTHAN_LESSTHAN:\n case Token.GREATERTHAN_GREATERTHAN:\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN: return Precedence.SHIFT;\n case Token.PLUS:\n case Token.MINUS: return Precedence.ADDITIVE;\n case Token.ASTERISK:\n case Token.SLASH:\n case Token.PERCENT: return Precedence.MULTIPLICATIVE;\n case Token.ASTERISK_ASTERISK: return Precedence.EXPONENTIATED;\n case Token.PLUS_PLUS:\n case Token.MINUS_MINUS: return Precedence.UNARY_POSTFIX;\n case Token.DOT:\n case Token.NEW:\n case Token.OPENBRACKET:\n case Token.EXCLAMATION: return Precedence.MEMBERACCESS;\n }\n return Precedence.NONE;\n}\n\n/** Determines whether a non-starting token is right associative. */\nfunction isRightAssociative(kind: Token): bool {\n switch (kind) {\n case Token.EQUALS:\n case Token.PLUS_EQUALS:\n case Token.MINUS_EQUALS:\n case Token.ASTERISK_ASTERISK_EQUALS:\n case Token.ASTERISK_EQUALS:\n case Token.SLASH_EQUALS:\n case Token.PERCENT_EQUALS:\n case Token.LESSTHAN_LESSTHAN_EQUALS:\n case Token.GREATERTHAN_GREATERTHAN_EQUALS:\n case Token.GREATERTHAN_GREATERTHAN_GREATERTHAN_EQUALS:\n case Token.AMPERSAND_EQUALS:\n case Token.CARET_EQUALS:\n case Token.BAR_EQUALS:\n case Token.QUESTION:\n case Token.ASTERISK_ASTERISK: return true;\n default: return false;\n }\n}\n","/**\n * JavaScript glue code.\n * @module glue/js\n * @preferred\n *//***/\n\n/// \n\nimport \"./binaryen\"; // must be first so portable can pick up the memory implementation\nimport \"../../../std/portable/index\";\nimport \"./float\";\nimport \"./i64\";\n\nimport { Module } from \"../../module\";\n\nModule.prototype.toText = function(this: Module) {\n return binaryen.wrapModule(this.ref).emitStackIR();\n};\n\nModule.prototype.toAsmjs = function(this: Module) {\n return binaryen.wrapModule(this.ref).emitAsmjs();\n};\n","// Copy Binaryen exports to global scope\n\nconst binaryen = global.Binaryen || require(\"binaryen\");\nglobal.binaryen = binaryen;\n\nfor (var key in binaryen) {\n if (key.startsWith(\"_Binaryen\") || key.startsWith(\"_Relooper\")) global[key] = binaryen[key];\n}\n\n// Utilize Binaryen's heap\n\nglobal.__memory_allocate = binaryen._malloc;\nglobal.__memory_free = binaryen._free;\nglobal.__memory_copy = binaryen._memmove;\nglobal.__store = function(ptr, val) { binaryen.HEAPU8[ptr] = val; };\nglobal.__load = function(ptr) { return binaryen.HEAPU8[ptr]; };\n","module.exports = __WEBPACK_EXTERNAL_MODULE__19__;","/** @module std/portable *//***/\n\nvar globalScope = typeof window !== \"undefined\" && window || typeof global !== \"undefined\" && global || self;\n\nglobalScope.ASC_TARGET = 0; // JS\nglobalScope.ASC_NO_ASSERT = false;\nglobalScope.ASC_MEMORY_BASE = 0;\nglobalScope.ASC_OPTIMIZE_LEVEL = 3;\nglobalScope.ASC_SHRINK_LEVEL = 0;\nglobalScope.ASC_FEATURE_MUTABLE_GLOBAL = false;\nglobalScope.ASC_FEATURE_SIGN_EXTENSION = false;\nglobalScope.ASC_FEATURE_BULK_MEMORY = false;\nglobalScope.ASC_FEATURE_SIMD = false;\nglobalScope.ASC_FEATURE_THREADS = false;\n\nvar F64 = new Float64Array(1);\nvar U64 = new Uint32Array(F64.buffer);\n\nObject.defineProperties(\n globalScope[\"i8\"] = function i8(value) { return value << 24 >> 24; }\n, {\n \"MIN_VALUE\": { value: -128, writable: false },\n \"MAX_VALUE\": { value: 127, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"i16\"] = function i16(value) { return value << 16 >> 16; }\n, {\n \"MIN_VALUE\": { value: -32768, writable: false },\n \"MAX_VALUE\": { value: 32767, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"i32\"] = globalScope[\"isize\"] = function i32(value) { return value | 0; }\n, {\n \"MIN_VALUE\": { value: -2147483648, writable: false },\n \"MAX_VALUE\": { value: 2147483647, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"u8\"] = function u8(value) { return value & 0xff; }\n, {\n \"MIN_VALUE\": { value: 0, writable: false },\n \"MAX_VALUE\": { value: 255, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"u16\"] = function u16(value) { return value & 0xffff; }\n, {\n \"MIN_VALUE\": { value: 0, writable: false },\n \"MAX_VALUE\": { value: 65535, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"u32\"] = globalScope[\"usize\"] = function u32(value) { return value >>> 0; }\n, {\n \"MIN_VALUE\": { value: 0, writable: false },\n \"MAX_VALUE\": { value: 4294967295, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"bool\"] = function bool(value) { return !!value; }\n, {\n \"MIN_VALUE\": { value: false, writable: false },\n \"MAX_VALUE\": { value: true, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"f32\"] = function f32(value) { return Math.fround(value); }\n, {\n \"EPSILON\": { value: Math.fround(1.1920929e-07), writable: false },\n \"MIN_VALUE\": { value: Math.fround(1.4012985e-45), writable: false },\n \"MAX_VALUE\": { value: Math.fround(3.4028235e+38), writable: false },\n \"MIN_NORMAL_VALUE\": { value: Math.fround(1.17549435e-38), writable: false },\n \"MIN_SAFE_INTEGER\": { value: -16777215, writable: false },\n \"MAX_SAFE_INTEGER\": { value: 16777215, writable: false }\n});\n\nObject.defineProperties(\n globalScope[\"f64\"] = function f64(value) { return +value; }\n, {\n \"EPSILON\": { value: 2.2204460492503131e-16, writable: false },\n \"MIN_VALUE\": { value: 5e-324, writable: false },\n \"MAX_VALUE\": { value: 1.7976931348623157e+308, writable: false },\n \"MIN_NORMAL_VALUE\": { value: 2.2250738585072014e-308 , writable: false },\n \"MIN_SAFE_INTEGER\": { value: -9007199254740991, writable: false },\n \"MAX_SAFE_INTEGER\": { value: 9007199254740991, writable: false }\n});\n\nglobalScope[\"clz\"] = Math.clz32;\n\nglobalScope[\"ctz\"] = function ctz(value) {\n var c = Math.clz32(value & -value);\n return value ? 31 - c : c;\n};\n\nglobalScope[\"popcnt\"] = function popcnt(value) {\n value -= value >>> 1 & 0x55555555;\n value = (value & 0x33333333) + (value >>> 2 & 0x33333333);\n return (((value + (value >>> 4)) & 0x0F0F0F0F) * 0x01010101) >>> 24;\n};\n\nglobalScope[\"rotl\"] = function rotl(value, shift) {\n shift &= 31;\n return (value << shift) | (value >>> (32 - shift));\n};\n\nglobalScope[\"rotr\"] = function rotr(value, shift) {\n shift &= 31;\n return (value >>> shift) | (value << (32 - shift));\n};\n\nglobalScope[\"abs\"] = Math.abs;\n\nglobalScope[\"max\"] = Math.max;\n\nglobalScope[\"min\"] = Math.min;\n\nglobalScope[\"ceil\"] = Math.ceil;\n\nglobalScope[\"floor\"] = Math.floor;\n\n// Adopt code from https://github.com/rfk/wasm-polyfill\nglobalScope[\"nearest\"] = function nearest(value) {\n if (Math.abs(value - Math.trunc(value)) === 0.5) {\n return 2.0 * Math.round(value * 0.5);\n }\n return Math.round(value);\n};\n\nglobalScope[\"select\"] = function select(ifTrue, ifFalse, condition) {\n return condition ? ifTrue : ifFalse;\n};\n\nglobalScope[\"sqrt\"] = Math.sqrt;\n\nglobalScope[\"trunc\"] = Math.trunc;\n\nglobalScope[\"copysign\"] = function copysign(x, y) {\n return Math.abs(x) * Math.sign(y);\n};\n\nglobalScope[\"bswap\"] = function bswap(value) {\n var a = value >> 8 & 0x00FF00FF;\n var b = (value & 0x00FF00FF) << 8;\n value = a | b;\n a = value >> 16 & 0x0000FFFF;\n b = (value & 0x0000FFFF) << 16;\n return a | b;\n};\n\nglobalScope[\"bswap16\"] = function bswap16(value) {\n return ((value << 8) & 0xFF00) | ((value >> 8) & 0x00FF) | (value & 0xFFFF0000);\n};\n\nfunction UnreachableError() {\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, UnreachableError);\n } else {\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\n }\n}\nUnreachableError.prototype = Object.create(Error.prototype);\nUnreachableError.prototype.name = \"UnreachableError\";\nUnreachableError.prototype.message = \"unreachable\";\n\nglobalScope[\"unreachable\"] = function unreachable() {\n throw new UnreachableError();\n};\n\nfunction AssertionError(message) {\n this.message = message || \"assertion failed\";\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AssertionError);\n } else {\n this.stack = this.name + \": \" + this.message + \"\\n\" + new Error().stack;\n }\n}\nAssertionError.prototype = Object.create(Error.prototype);\nAssertionError.prototype.name = \"AssertionError\";\n\nglobalScope[\"assert\"] = function assert(isTrueish, message) {\n if (isTrueish) return isTrueish;\n throw new AssertionError(message);\n};\n\nglobalScope[\"changetype\"] = function changetype(value) {\n return value;\n};\n\nglobalScope[\"parseI32\"] = function parseI32(str, radix) {\n return parseInt(str, undefined) | 0;\n};\n\nString[\"fromCharCodes\"] = function fromCharCodes(arr) {\n return String.fromCharCode.apply(String, arr);\n};\n\nString[\"fromCodePoints\"] = function fromCodePoints(arr) {\n return String.fromCodePoint.apply(String, arr);\n};\n\nglobalScope[\"isInteger\"] = Number.isInteger;\n\nglobalScope[\"isFloat\"] = function isFloat(arg) {\n return typeof arg === \"number\";\n};\n\nglobalScope[\"isReference\"] = function isReference(arg) {\n return typeof arg === \"object\" || typeof arg === \"string\";\n};\n\nglobalScope[\"isString\"] = function isString(arg) {\n return typeof arg === \"string\" || arg instanceof String;\n};\n\nglobalScope[\"isArray\"] = Array.isArray;\n\nglobalScope[\"isDefined\"] = function isDefined(expr) {\n return typeof expr !== \"undefined\";\n}\n\nglobalScope[\"isConstant\"] = function isConstant(expr) {\n return false;\n};\n\nglobalScope[\"unchecked\"] = function unchecked(expr) {\n return expr;\n};\n\nglobalScope[\"fmod\"] = function fmod(x, y) {\n return x % y;\n};\n\nglobalScope[\"fmodf\"] = function fmodf(x, y) {\n return Math.fround(x % y);\n};\n\nglobalScope[\"JSMath\"] = Math;\nglobalScope[\"JSMath\"].signbit = function signbit(x) {\n F64[0] = x; return Boolean((U64[1] >>> 31) & (x == x));\n}\n\nglobalScope[\"memory\"] = (() => {\n var HEAP = new Uint8Array(0);\n var HEAP_OFFSET = 0;\n return {\n allocate: globalScope[\"__memory_allocate\"] || function allocate(size) {\n if (!(size >>>= 0)) return 0;\n if (HEAP_OFFSET + size > HEAP.length) {\n var oldHeap = HEAP;\n HEAP = new Uint8Array(Math.max(65536, HEAP.length + size, HEAP.length * 2));\n HEAP.set(oldHeap);\n }\n var ptr = HEAP_OFFSET;\n if ((HEAP_OFFSET += size) & 7) HEAP_OFFSET = (HEAP_OFFSET | 7) + 1;\n return ptr;\n },\n fill: globalScope[\"__memory_fill\"] || function fill(dest, value, size) {\n HEAP.fill(value, dest, dest + size);\n },\n free: globalScope[\"__memory_free\"] || function free(ptr) { },\n copy: globalScope[\"__memory_copy\"] || function copy(dest, src, size) {\n HEAP.copyWithin(dest, src, src + size);\n },\n reset: globalScope[\"__memory_reset\"] || function reset() {\n HEAP = new Uint8Array(0);\n HEAP_OFFSET = 0;\n }\n };\n})();\n\nglobalScope[\"store\"] = globalScope[\"__store\"] || function store(ptr, value, offset) {\n HEAP[(ptr | 0) + (offset | 0)] = value;\n};\n\nglobalScope[\"load\"] = globalScope[\"__load\"] || function load(ptr, offset) {\n return HEAP[(ptr | 0) + (offset | 0)];\n};\n","const F64 = new Float64Array(1);\nconst F32 = new Float32Array(F64.buffer);\nconst I32 = new Int32Array(F64.buffer);\n\nglobal.f32_as_i32 = function(value) {\n F32[0] = value;\n return I32[0];\n};\n\nglobal.i32_as_f32 = function(value) {\n I32[0] = value;\n return F32[0];\n};\n\nglobal.f64_as_i64 = function(value) {\n F64[0] = value;\n return i64_new(I32[0], I32[1]);\n};\n\nglobal.i64_as_f64 = function(value) {\n I32[0] = i64_low(value);\n I32[1] = i64_high(value);\n return F64[0];\n};\n","const Long = global.Long || require(\"long\");\n\nglobal.i64_zero = Long.ZERO;\n\nglobal.i64_one = Long.ONE;\n\nglobal.i64_new = function(lo, hi) {\n return Long.fromBits(lo, hi);\n};\n\nglobal.i64_low = function(value) {\n return value.low;\n};\n\nglobal.i64_high = function(value) {\n return value.high;\n};\n\nglobal.i64_add = function(left, right) {\n return left.add(right);\n};\n\nglobal.i64_sub = function(left, right) {\n return left.sub(right);\n};\n\nglobal.i64_mul = function(left, right) {\n return left.mul(right);\n};\n\nglobal.i64_div = function(left, right) {\n return left.div(right);\n};\n\nglobal.i64_div_u = function(left, right) {\n return left.toUnsigned().div(right.toUnsigned()).toSigned();\n};\n\nglobal.i64_rem = function(left, right) {\n return left.mod(right);\n};\n\nglobal.i64_rem_u = function(left, right) {\n return left.toUnsigned().mod(right.toUnsigned()).toSigned();\n};\n\nglobal.i64_and = function(left, right) {\n return left.and(right);\n};\n\nglobal.i64_or = function(left, right) {\n return left.or(right);\n};\n\nglobal.i64_xor = function(left, right) {\n return left.xor(right);\n};\n\nglobal.i64_shl = function(left, right) {\n return left.shl(right);\n};\n\nglobal.i64_shr = function(left, right) {\n return left.shr(right);\n};\n\nglobal.i64_shr_u = function(left, right) {\n return left.shru(right);\n};\n\nglobal.i64_not = function(value) {\n return value.not();\n};\n\nglobal.i64_eq = function(left, right) {\n return left.eq(right);\n};\n\nglobal.i64_ne = function(left, right) {\n return left.ne(right);\n};\n\nglobal.i64_align = function(value, alignment) {\n assert(alignment && (alignment & (alignment - 1)) == 0);\n var mask = Long.fromInt(alignment - 1);\n return value.add(mask).and(mask.not());\n};\n\nglobal.i64_is_i8 = function(value) {\n return value.high === 0 && (value.low >= 0 && value.low <= i8.MAX_VALUE)\n || value.high === -1 && (value.low >= i8.MIN_VALUE && value.low < 0);\n};\n\nglobal.i64_is_i16 = function(value) {\n return value.high === 0 && (value.low >= 0 && value.low <= i16.MAX_VALUE)\n || value.high === -1 && (value.low >= i16.MIN_VALUE && value.low < 0);\n};\n\nglobal.i64_is_i32 = function(value) {\n return (value.high === 0 && value.low >= 0)\n || (value.high === -1 && value.low < 0);\n};\n\nglobal.i64_is_u8 = function(value) {\n return value.high === 0 && value.low >= 0 && value.low <= u8.MAX_VALUE;\n};\n\nglobal.i64_is_u16 = function(value) {\n return value.high === 0 && value.low >= 0 && value.low <= u16.MAX_VALUE;\n};\n\nglobal.i64_is_u32 = function(value) {\n return value.high === 0;\n};\n\nglobal.i64_is_bool = function(value) {\n return value.high === 0 && (value.low === 0 || value.low === 1);\n};\n\nconst minSafeF32 = Long.fromNumber(f32.MIN_SAFE_INTEGER);\nconst maxSafeF32 = Long.fromNumber(f32.MAX_SAFE_INTEGER);\n\nglobal.i64_is_f32 = function(value) {\n return value.gte(minSafeF32) && value.lte(maxSafeF32);\n};\n\nconst minSafeF64 = Long.fromNumber(f64.MIN_SAFE_INTEGER);\nconst maxSafeF64 = Long.fromNumber(f64.MAX_SAFE_INTEGER);\n\nglobal.i64_is_f64 = function(value) {\n return value.gte(minSafeF64) && value.lte(maxSafeF64);\n};\n\nglobal.i64_to_f32 = function(value) {\n return global.Math.fround(value.toNumber());\n};\n\nglobal.i64_to_f64 = function(value) {\n return value.toNumber();\n};\n\nglobal.i64_to_string = function(value, unsigned) {\n return (unsigned ? value.toUnsigned() : value).toString(10);\n};\n","module.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n 0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n ])), {}).exports;\r\n} catch (e) {\r\n // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n * See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n /**\r\n * The low 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.low = low | 0;\r\n\r\n /**\r\n * The high 32 bits as a signed value.\r\n * @type {number}\r\n */\r\n this.high = high | 0;\r\n\r\n /**\r\n * Whether unsigned or not.\r\n * @type {boolean}\r\n */\r\n this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations. For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative). Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n var obj, cachedObj, cache;\r\n if (unsigned) {\r\n value >>>= 0;\r\n if (cache = (0 <= value && value < 256)) {\r\n cachedObj = UINT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n if (cache)\r\n UINT_CACHE[value] = obj;\r\n return obj;\r\n } else {\r\n value |= 0;\r\n if (cache = (-128 <= value && value < 128)) {\r\n cachedObj = INT_CACHE[value];\r\n if (cachedObj)\r\n return cachedObj;\r\n }\r\n obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n if (cache)\r\n INT_CACHE[value] = obj;\r\n return obj;\r\n }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n if (isNaN(value))\r\n return unsigned ? UZERO : ZERO;\r\n if (unsigned) {\r\n if (value < 0)\r\n return UZERO;\r\n if (value >= TWO_PWR_64_DBL)\r\n return MAX_UNSIGNED_VALUE;\r\n } else {\r\n if (value <= -TWO_PWR_63_DBL)\r\n return MIN_VALUE;\r\n if (value + 1 >= TWO_PWR_63_DBL)\r\n return MAX_VALUE;\r\n }\r\n if (value < 0)\r\n return fromNumber(-value, unsigned).neg();\r\n return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n * assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n if (str.length === 0)\r\n throw Error('empty string');\r\n if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n return ZERO;\r\n if (typeof unsigned === 'number') {\r\n // For goog.math.long compatibility\r\n radix = unsigned,\r\n unsigned = false;\r\n } else {\r\n unsigned = !! unsigned;\r\n }\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n\r\n var p;\r\n if ((p = str.indexOf('-')) > 0)\r\n throw Error('interior hyphen');\r\n else if (p === 0) {\r\n return fromString(str.substring(1), unsigned, radix).neg();\r\n }\r\n\r\n // Do several (8) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n var result = ZERO;\r\n for (var i = 0; i < str.length; i += 8) {\r\n var size = Math.min(8, str.length - i),\r\n value = parseInt(str.substring(i, i + size), radix);\r\n if (size < 8) {\r\n var power = fromNumber(pow_dbl(radix, size));\r\n result = result.mul(power).add(fromNumber(value));\r\n } else {\r\n result = result.mul(radixToPower);\r\n result = result.add(fromNumber(value));\r\n }\r\n }\r\n result.unsigned = unsigned;\r\n return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n if (typeof val === 'number')\r\n return fromNumber(val, unsigned);\r\n if (typeof val === 'string')\r\n return fromString(val, unsigned);\r\n // Throws for non-objects, converts non-instanceof Long:\r\n return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n if (this.unsigned)\r\n return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n radix = radix || 10;\r\n if (radix < 2 || 36 < radix)\r\n throw RangeError('radix');\r\n if (this.isZero())\r\n return '0';\r\n if (this.isNegative()) { // Unsigned Longs are never negative\r\n if (this.eq(MIN_VALUE)) {\r\n // We need to change the Long value before it can be negated, so we remove\r\n // the bottom-most digit in this base and then recurse to do the rest.\r\n var radixLong = fromNumber(radix),\r\n div = this.div(radixLong),\r\n rem1 = div.mul(radixLong).sub(this);\r\n return div.toString(radix) + rem1.toInt().toString(radix);\r\n } else\r\n return '-' + this.neg().toString(radix);\r\n }\r\n\r\n // Do several (6) digits each time through the loop, so as to\r\n // minimize the calls to the very expensive emulated div.\r\n var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n rem = this;\r\n var result = '';\r\n while (true) {\r\n var remDiv = rem.div(radixToPower),\r\n intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n digits = intval.toString(radix);\r\n rem = remDiv;\r\n if (rem.isZero())\r\n return digits + result;\r\n else {\r\n while (digits.length < 6)\r\n digits = '0' + digits;\r\n result = '' + digits + result;\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n if (this.isNegative()) // Unsigned Longs are never negative\r\n return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n var val = this.high != 0 ? this.high : this.low;\r\n for (var bit = 31; bit > 0; bit--)\r\n if ((val & (1 << bit)) != 0)\r\n break;\r\n return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n return false;\r\n return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n if (this.eq(other))\r\n return 0;\r\n var thisNeg = this.isNegative(),\r\n otherNeg = other.isNegative();\r\n if (thisNeg && !otherNeg)\r\n return -1;\r\n if (!thisNeg && otherNeg)\r\n return 1;\r\n // At this point the sign bits are the same\r\n if (!this.unsigned)\r\n return this.sub(other).isNegative() ? -1 : 1;\r\n // Both are positive if at least one is unsigned\r\n return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n * if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n if (!this.unsigned && this.eq(MIN_VALUE))\r\n return MIN_VALUE;\r\n return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n if (!isLong(addend))\r\n addend = fromValue(addend);\r\n\r\n // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = addend.high >>> 16;\r\n var b32 = addend.high & 0xFFFF;\r\n var b16 = addend.low >>> 16;\r\n var b00 = addend.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 + b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 + b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 + b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 + b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n if (!isLong(subtrahend))\r\n subtrahend = fromValue(subtrahend);\r\n return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n if (this.isZero())\r\n return ZERO;\r\n if (!isLong(multiplier))\r\n multiplier = fromValue(multiplier);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = wasm.mul(this.low,\r\n this.high,\r\n multiplier.low,\r\n multiplier.high);\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (multiplier.isZero())\r\n return ZERO;\r\n if (this.eq(MIN_VALUE))\r\n return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n if (multiplier.eq(MIN_VALUE))\r\n return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n if (this.isNegative()) {\r\n if (multiplier.isNegative())\r\n return this.neg().mul(multiplier.neg());\r\n else\r\n return this.neg().mul(multiplier).neg();\r\n } else if (multiplier.isNegative())\r\n return this.mul(multiplier.neg()).neg();\r\n\r\n // If both longs are small, use float multiplication\r\n if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n // We can skip products that would overflow.\r\n\r\n var a48 = this.high >>> 16;\r\n var a32 = this.high & 0xFFFF;\r\n var a16 = this.low >>> 16;\r\n var a00 = this.low & 0xFFFF;\r\n\r\n var b48 = multiplier.high >>> 16;\r\n var b32 = multiplier.high & 0xFFFF;\r\n var b16 = multiplier.low >>> 16;\r\n var b00 = multiplier.low & 0xFFFF;\r\n\r\n var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n c00 += a00 * b00;\r\n c16 += c00 >>> 16;\r\n c00 &= 0xFFFF;\r\n c16 += a16 * b00;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c16 += a00 * b16;\r\n c32 += c16 >>> 16;\r\n c16 &= 0xFFFF;\r\n c32 += a32 * b00;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a16 * b16;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c32 += a00 * b32;\r\n c48 += c32 >>> 16;\r\n c32 &= 0xFFFF;\r\n c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n c48 &= 0xFFFF;\r\n return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n * unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n if (divisor.isZero())\r\n throw Error('division by zero');\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n // guard against signed division overflow: the largest\r\n // negative number / -1 would be 1 larger than the largest\r\n // positive number, due to two's complement.\r\n if (!this.unsigned &&\r\n this.high === -0x80000000 &&\r\n divisor.low === -1 && divisor.high === -1) {\r\n // be consistent with non-wasm code path\r\n return this;\r\n }\r\n var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n if (this.isZero())\r\n return this.unsigned ? UZERO : ZERO;\r\n var approx, rem, res;\r\n if (!this.unsigned) {\r\n // This section is only relevant for signed longs and is derived from the\r\n // closure library as a whole.\r\n if (this.eq(MIN_VALUE)) {\r\n if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE\r\n else if (divisor.eq(MIN_VALUE))\r\n return ONE;\r\n else {\r\n // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n var halfThis = this.shr(1);\r\n approx = halfThis.div(divisor).shl(1);\r\n if (approx.eq(ZERO)) {\r\n return divisor.isNegative() ? ONE : NEG_ONE;\r\n } else {\r\n rem = this.sub(divisor.mul(approx));\r\n res = approx.add(rem.div(divisor));\r\n return res;\r\n }\r\n }\r\n } else if (divisor.eq(MIN_VALUE))\r\n return this.unsigned ? UZERO : ZERO;\r\n if (this.isNegative()) {\r\n if (divisor.isNegative())\r\n return this.neg().div(divisor.neg());\r\n return this.neg().div(divisor).neg();\r\n } else if (divisor.isNegative())\r\n return this.div(divisor.neg()).neg();\r\n res = ZERO;\r\n } else {\r\n // The algorithm below has not been made for unsigned longs. It's therefore\r\n // required to take special care of the MSB prior to running it.\r\n if (!divisor.unsigned)\r\n divisor = divisor.toUnsigned();\r\n if (divisor.gt(this))\r\n return UZERO;\r\n if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n return UONE;\r\n res = UZERO;\r\n }\r\n\r\n // Repeat the following until the remainder is less than other: find a\r\n // floating-point that approximates remainder / other *from below*, add this\r\n // into the result, and subtract it from the remainder. It is critical that\r\n // the approximate value is less than or equal to the real value so that the\r\n // remainder never becomes negative.\r\n rem = this;\r\n while (rem.gte(divisor)) {\r\n // Approximate the result of division. This may be a little greater or\r\n // smaller than the actual value.\r\n approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n // We will tweak the approximate result by changing it in the 48-th digit or\r\n // the smallest non-fractional digit, whichever is larger.\r\n var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n // Decrease the approximation until it is smaller than the remainder. Note\r\n // that if it is too large, the product overflows and is negative.\r\n approxRes = fromNumber(approx),\r\n approxRem = approxRes.mul(divisor);\r\n while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n approx -= delta;\r\n approxRes = fromNumber(approx, this.unsigned);\r\n approxRem = approxRes.mul(divisor);\r\n }\r\n\r\n // We know the answer can't be zero... and actually, zero would cause\r\n // infinite recursion since we would make no progress.\r\n if (approxRes.isZero())\r\n approxRes = ONE;\r\n\r\n res = res.add(approxRes);\r\n rem = rem.sub(approxRem);\r\n }\r\n return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n if (!isLong(divisor))\r\n divisor = fromValue(divisor);\r\n\r\n // use wasm support if present\r\n if (wasm) {\r\n var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n this.low,\r\n this.high,\r\n divisor.low,\r\n divisor.high\r\n );\r\n return fromBits(low, wasm.get_high(), this.unsigned);\r\n }\r\n\r\n return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n if (!isLong(other))\r\n other = fromValue(other);\r\n return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n else\r\n return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n if ((numBits &= 63) === 0)\r\n return this;\r\n else if (numBits < 32)\r\n return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n else\r\n return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n if (isLong(numBits))\r\n numBits = numBits.toInt();\r\n numBits &= 63;\r\n if (numBits === 0)\r\n return this;\r\n else {\r\n var high = this.high;\r\n if (numBits < 32) {\r\n var low = this.low;\r\n return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n } else if (numBits === 32)\r\n return fromBits(high, 0, this.unsigned);\r\n else\r\n return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n if (!this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n if (this.unsigned)\r\n return this;\r\n return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n lo & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo >>> 16 & 0xff,\r\n lo >>> 24 ,\r\n hi & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi >>> 16 & 0xff,\r\n hi >>> 24\r\n ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n var hi = this.high,\r\n lo = this.low;\r\n return [\r\n hi >>> 24 ,\r\n hi >>> 16 & 0xff,\r\n hi >>> 8 & 0xff,\r\n hi & 0xff,\r\n lo >>> 24 ,\r\n lo >>> 16 & 0xff,\r\n lo >>> 8 & 0xff,\r\n lo & 0xff\r\n ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n return new Long(\r\n bytes[0] |\r\n bytes[1] << 8 |\r\n bytes[2] << 16 |\r\n bytes[3] << 24,\r\n bytes[4] |\r\n bytes[5] << 8 |\r\n bytes[6] << 16 |\r\n bytes[7] << 24,\r\n unsigned\r\n );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n return new Long(\r\n bytes[4] << 24 |\r\n bytes[5] << 16 |\r\n bytes[6] << 8 |\r\n bytes[7],\r\n bytes[0] << 24 |\r\n bytes[1] << 16 |\r\n bytes[2] << 8 |\r\n bytes[3],\r\n unsigned\r\n );\r\n};\r\n","/**\n * Built-in elements providing WebAssembly core functionality.\n * @module builtins\n *//***/\n\n import {\n Compiler,\n ConversionKind,\n WrapMode,\n Feature\n} from \"./compiler\";\n\nimport {\n DiagnosticCode\n} from \"./diagnostics\";\n\nimport {\n Node,\n NodeKind,\n Expression,\n LiteralKind,\n LiteralExpression,\n StringLiteralExpression,\n CallExpression\n} from \"./ast\";\n\nimport {\n Type,\n TypeKind,\n TypeFlags\n} from \"./types\";\n\nimport {\n BinaryOp,\n UnaryOp,\n HostOp,\n NativeType,\n ExpressionRef,\n ExpressionId,\n getExpressionId,\n getExpressionType,\n getConstValueI64High,\n getConstValueI64Low,\n getConstValueI32,\n AtomicRMWOp\n} from \"./module\";\n\nimport {\n ElementKind,\n FunctionPrototype,\n Class,\n Field,\n Global,\n DecoratorFlags,\n ClassPrototype\n} from \"./program\";\n\nimport {\n FlowFlags\n} from \"./flow\";\n\nimport {\n ReportMode\n} from \"./resolver\";\n\nimport {\n CommonFlags, CommonSymbols\n} from \"./common\";\n\n/** Symbols of various compiler built-ins. */\nexport namespace BuiltinSymbols {\n // std/builtins.ts\n export const isInteger = \"~lib/builtins/isInteger\";\n export const isFloat = \"~lib/builtins/isFloat\";\n export const isSigned = \"~lib/builtins/isSigned\";\n export const isReference = \"~lib/builtins/isReference\";\n export const isString = \"~lib/builtins/isString\";\n export const isArray = \"~lib/builtins/isArray\";\n export const isFunction = \"~lib/builtins/isFunction\";\n export const isNullable = \"~lib/builtins/isNullable\";\n export const isDefined = \"~lib/builtins/isDefined\";\n export const isConstant = \"~lib/builtins/isConstant\";\n export const isManaged = \"~lib/builtins/isManaged\";\n export const clz = \"~lib/builtins/clz\";\n export const ctz = \"~lib/builtins/ctz\";\n export const popcnt = \"~lib/builtins/popcnt\";\n export const rotl = \"~lib/builtins/rotl\";\n export const rotr = \"~lib/builtins/rotr\";\n export const abs = \"~lib/builtins/abs\";\n export const max = \"~lib/builtins/max\";\n export const min = \"~lib/builtins/min\";\n export const ceil = \"~lib/builtins/ceil\";\n export const floor = \"~lib/builtins/floor\";\n export const copysign = \"~lib/builtins/copysign\";\n export const nearest = \"~lib/builtins/nearest\";\n export const reinterpret = \"~lib/builtins/reinterpret\";\n export const sqrt = \"~lib/builtins/sqrt\";\n export const trunc = \"~lib/builtins/trunc\";\n export const load = \"~lib/builtins/load\";\n export const store = \"~lib/builtins/store\";\n export const atomic_load = \"~lib/builtins/atomic.load\";\n export const atomic_store = \"~lib/builtins/atomic.store\";\n export const atomic_add = \"~lib/builtins/atomic.add\";\n export const atomic_sub = \"~lib/builtins/atomic.sub\";\n export const atomic_and = \"~lib/builtins/atomic.and\";\n export const atomic_or = \"~lib/builtins/atomic.or\";\n export const atomic_xor = \"~lib/builtins/atomic.xor\";\n export const atomic_xchg = \"~lib/builtins/atomic.xchg\";\n export const atomic_cmpxchg = \"~lib/builtins/atomic.cmpxchg\";\n export const atomic_wait = \"~lib/builtins/atomic.wait\";\n export const atomic_notify = \"~lib/builtins/atomic.notify\";\n export const sizeof = \"~lib/builtins/sizeof\";\n export const alignof = \"~lib/builtins/alignof\";\n export const offsetof = \"~lib/builtins/offsetof\";\n export const select = \"~lib/builtins/select\";\n export const unreachable = \"~lib/builtins/unreachable\";\n export const changetype = \"~lib/builtins/changetype\";\n export const assert = \"~lib/builtins/assert\";\n export const unchecked = \"~lib/builtins/unchecked\";\n export const call_indirect = \"~lib/builtins/call_indirect\";\n export const instantiate = \"~lib/builtins/instantiate\";\n export const i8 = \"~lib/builtins/i8\";\n export const i16 = \"~lib/builtins/i16\";\n export const i32 = \"~lib/builtins/i32\";\n export const i64 = \"~lib/builtins/i64\";\n export const isize = \"~lib/builtins/isize\";\n export const u8 = \"~lib/builtins/u8\";\n export const u16 = \"~lib/builtins/u16\";\n export const u32 = \"~lib/builtins/u32\";\n export const u64 = \"~lib/builtins/u64\";\n export const usize = \"~lib/builtins/usize\";\n export const bool = \"~lib/builtins/bool\";\n export const f32 = \"~lib/builtins/f32\";\n export const f64 = \"~lib/builtins/f64\";\n export const v128 = \"~lib/builtins/v128\";\n export const void_ = \"~lib/builtins/void\";\n export const i32_clz = \"~lib/builtins/i32.clz\";\n export const i64_clz = \"~lib/builtins/i64.clz\";\n export const i32_ctz = \"~lib/builtins/i32.ctz\";\n export const i64_ctz = \"~lib/builtins/i64.ctz\";\n export const i32_popcnt = \"~lib/builtins/i32.popcnt\";\n export const i64_popcnt = \"~lib/builtins/i64.popcnt\";\n export const i32_rotl = \"~lib/builtins/i32.rotl\";\n export const i64_rotl = \"~lib/builtins/i64.rotl\";\n export const i32_rotr = \"~lib/builtins/i32.rotr\";\n export const i64_rotr = \"~lib/builtins/i64.rotr\";\n export const f32_abs = \"~lib/builtins/f32.abs\";\n export const f64_abs = \"~lib/builtins/f64.abs\";\n export const f32_max = \"~lib/builtins/f32.max\";\n export const f64_max = \"~lib/builtins/f64.max\";\n export const f32_min = \"~lib/builtins/f32.min\";\n export const f64_min = \"~lib/builtins/f64.min\";\n export const f32_ceil = \"~lib/builtins/f32.ceil\";\n export const f64_ceil = \"~lib/builtins/f64.ceil\";\n export const f32_floor = \"~lib/builtins/f32.floor\";\n export const f64_floor = \"~lib/builtins/f64.floor\";\n export const f32_copysign = \"~lib/builtins/f32.copysign\";\n export const f64_copysign = \"~lib/builtins/f64.copysign\";\n export const f32_nearest = \"~lib/builtins/f32.nearest\";\n export const f64_nearest = \"~lib/builtins/f64.nearest\";\n export const i32_reinterpret_f32 = \"~lib/builtins/i32.reinterpret_f32\";\n export const i64_reinterpret_f64 = \"~lib/builtins/i64.reinterpret_f64\";\n export const f32_reinterpret_i32 = \"~lib/builtins/f32.reinterpret_i32\";\n export const f64_reinterpret_i64 = \"~lib/builtins/f64.reinterpret_i64\";\n export const f32_sqrt = \"~lib/builtins/f32.sqrt\";\n export const f64_sqrt = \"~lib/builtins/f64.sqrt\";\n export const f32_trunc = \"~lib/builtins/f32.trunc\";\n export const f64_trunc = \"~lib/builtins/f64.trunc\";\n export const i32_load8_s = \"~lib/builtins/i32.load8_s\";\n export const i32_load8_u = \"~lib/builtins/i32.load8_u\";\n export const i32_load16_s = \"~lib/builtins/i32.load16_s\";\n export const i32_load16_u = \"~lib/builtins/i32.load16_u\";\n export const i32_load = \"~lib/builtins/i32.load\";\n export const i64_load8_s = \"~lib/builtins/i64.load8_s\";\n export const i64_load8_u = \"~lib/builtins/i64.load8_u\";\n export const i64_load16_s = \"~lib/builtins/i64.load16_s\";\n export const i64_load16_u = \"~lib/builtins/i64.load16_u\";\n export const i64_load32_s = \"~lib/builtins/i64.load32_s\";\n export const i64_load32_u = \"~lib/builtins/i64.load32_u\";\n export const i64_load = \"~lib/builtins/i64.load\";\n export const f32_load = \"~lib/builtins/f32.load\";\n export const f64_load = \"~lib/builtins/f64.load\";\n export const i32_store8 = \"~lib/builtins/i32.store8\";\n export const i32_store16 = \"~lib/builtins/i32.store16\";\n export const i32_store = \"~lib/builtins/i32.store\";\n export const i64_store8 = \"~lib/builtins/i64.store8\";\n export const i64_store16 = \"~lib/builtins/i64.store16\";\n export const i64_store32 = \"~lib/builtins/i64.store32\";\n export const i64_store = \"~lib/builtins/i64.store\";\n export const f32_store = \"~lib/builtins/f32.store\";\n export const f64_store = \"~lib/builtins/f64.store\";\n export const i32_atomic_load8_u = \"~lib/builtins/i32.atomic.load8_u\";\n export const i32_atomic_load16_u = \"~lib/builtins/i32.atomic.load16_u\";\n export const i32_atomic_load = \"~lib/builtins/i32.atomic.load\";\n export const i64_atomic_load8_u = \"~lib/builtins/i64.atomic.load8_u\";\n export const i64_atomic_load16_u = \"~lib/builtins/i64.atomic.load16_u\";\n export const i64_atomic_load32_u = \"~lib/builtins/i64.atomic.load32_u\";\n export const i64_atomic_load = \"~lib/builtins/i64.atomic.load\";\n export const i32_atomic_store8 = \"~lib/builtins/i32.atomic.store8\";\n export const i32_atomic_store16 = \"~lib/builtins/i32.atomic.store16\";\n export const i32_atomic_store = \"~lib/builtins/i32.atomic.store\";\n export const i64_atomic_store8 = \"~lib/builtins/i64.atomic.store8\";\n export const i64_atomic_store16 = \"~lib/builtins/i64.atomic.store16\";\n export const i64_atomic_store32 = \"~lib/builtins/i64.atomic.store32\";\n export const i64_atomic_store = \"~lib/builtins/i64.atomic.store\";\n export const i32_atomic_rmw8_u_add = \"~lib/builtins/i32.atomic.rmw8_u.add\";\n export const i32_atomic_rmw16_u_add = \"~lib/builtins/i32.atomic.rmw16_u.add\";\n export const i32_atomic_rmw_add = \"~lib/builtins/i32.atomic.rmw.add\";\n export const i64_atomic_rmw8_u_add = \"~lib/builtins/i64.atomic.rmw8_u.add\";\n export const i64_atomic_rmw16_u_add = \"~lib/builtins/i64.atomic.rmw16_u.add\";\n export const i64_atomic_rmw32_u_add = \"~lib/builtins/i64.atomic.rmw32_u.add\";\n export const i64_atomic_rmw_add = \"~lib/builtins/i64.atomic.rmw.add\";\n export const i32_atomic_rmw8_u_sub = \"~lib/builtins/i32.atomic.rmw8_u.sub\";\n export const i32_atomic_rmw16_u_sub = \"~lib/builtins/i32.atomic.rmw16_u.sub\";\n export const i32_atomic_rmw_sub = \"~lib/builtins/i32.atomic.rmw.sub\";\n export const i64_atomic_rmw8_u_sub = \"~lib/builtins/i64.atomic.rmw8_u.sub\";\n export const i64_atomic_rmw16_u_sub = \"~lib/builtins/i64.atomic.rmw16_u.sub\";\n export const i64_atomic_rmw32_u_sub = \"~lib/builtins/i64.atomic.rmw32_u.sub\";\n export const i64_atomic_rmw_sub = \"~lib/builtins/i64.atomic.rmw.sub\";\n export const i32_atomic_rmw8_u_and = \"~lib/builtins/i32.atomic.rmw8_u.and\";\n export const i32_atomic_rmw16_u_and = \"~lib/builtins/i32.atomic.rmw16_u.and\";\n export const i32_atomic_rmw_and = \"~lib/builtins/i32.atomic.rmw.and\";\n export const i64_atomic_rmw8_u_and = \"~lib/builtins/i64.atomic.rmw8_u.and\";\n export const i64_atomic_rmw16_u_and = \"~lib/builtins/i64.atomic.rmw16_u.and\";\n export const i64_atomic_rmw32_u_and = \"~lib/builtins/i64.atomic.rmw32_u.and\";\n export const i64_atomic_rmw_and = \"~lib/builtins/i64.atomic.rmw.and\";\n export const i32_atomic_rmw8_u_or = \"~lib/builtins/i32.atomic.rmw8_u.or\";\n export const i32_atomic_rmw16_u_or = \"~lib/builtins/i32.atomic.rmw16_u.or\";\n export const i32_atomic_rmw_or = \"~lib/builtins/i32.atomic.rmw.or\";\n export const i64_atomic_rmw8_u_or = \"~lib/builtins/i64.atomic.rmw8_u.or\";\n export const i64_atomic_rmw16_u_or = \"~lib/builtins/i64.atomic.rmw16_u.or\";\n export const i64_atomic_rmw32_u_or = \"~lib/builtins/i64.atomic.rmw32_u.or\";\n export const i64_atomic_rmw_or = \"~lib/builtins/i64.atomic.rmw.or\";\n export const i32_atomic_rmw8_u_xor = \"~lib/builtins/i32.atomic.rmw8_u.xor\";\n export const i32_atomic_rmw16_u_xor = \"~lib/builtins/i32.atomic.rmw16_u.xor\";\n export const i32_atomic_rmw_xor = \"~lib/builtins/i32.atomic.rmw.xor\";\n export const i64_atomic_rmw8_u_xor = \"~lib/builtins/i64.atomic.rmw8_u.xor\";\n export const i64_atomic_rmw16_u_xor = \"~lib/builtins/i64.atomic.rmw16_u.xor\";\n export const i64_atomic_rmw32_u_xor = \"~lib/builtins/i64.atomic.rmw32_u.xor\";\n export const i64_atomic_rmw_xor = \"~lib/builtins/i64.atomic.rmw.xor\";\n export const i32_atomic_rmw8_u_xchg = \"~lib/builtins/i32.atomic.rmw8_u.xchg\";\n export const i32_atomic_rmw16_u_xchg = \"~lib/builtins/i32.atomic.rmw16_u.xchg\";\n export const i32_atomic_rmw_xchg = \"~lib/builtins/i32.atomic.rmw.xchg\";\n export const i64_atomic_rmw8_u_xchg = \"~lib/builtins/i64.atomic.rmw8_u.xchg\";\n export const i64_atomic_rmw16_u_xchg = \"~lib/builtins/i64.atomic.rmw16_u.xchg\";\n export const i64_atomic_rmw32_u_xchg = \"~lib/builtins/i64.atomic.rmw32_u.xchg\";\n export const i64_atomic_rmw_xchg = \"~lib/builtins/i64.atomic.rmw.xchg\";\n export const i32_atomic_rmw8_u_cmpxchg = \"~lib/builtins/i32.atomic.rmw8_u.cmpxchg\";\n export const i32_atomic_rmw16_u_cmpxchg = \"~lib/builtins/i32.atomic.rmw16_u.cmpxchg\";\n export const i32_atomic_rmw_cmpxchg = \"~lib/builtins/i32.atomic.rmw.cmpxchg\";\n export const i64_atomic_rmw8_u_cmpxchg = \"~lib/builtins/i64.atomic.rmw8_u.cmpxchg\";\n export const i64_atomic_rmw16_u_cmpxchg = \"~lib/builtins/i64.atomic.rmw16_u.cmpxchg\";\n export const i64_atomic_rmw32_u_cmpxchg = \"~lib/builtins/i64.atomic.rmw32_u.cmpxchg\";\n export const i64_atomic_rmw_cmpxchg = \"~lib/builtins/i64.atomic.rmw.cmpxchg\";\n export const i32_wait = \"~lib/builtins/i32.wait\";\n export const i64_wait = \"~lib/builtins/i64.wait\";\n export const i32_notify = \"~lib/builtins/i32.notify\";\n export const i64_notify = \"~lib/builtins/i64.notify\";\n // std/diagnostics.ts\n export const ERROR = \"~lib/diagnostics/ERROR\";\n export const WARNING = \"~lib/diagnostics/WARNING\";\n export const INFO = \"~lib/diagnostics/INFO\";\n // std/memory.ts\n export const HEAP_BASE = \"~lib/memory/HEAP_BASE\";\n export const memory_size = \"~lib/memory/memory.size\";\n export const memory_grow = \"~lib/memory/memory.grow\";\n export const memory_copy = \"~lib/memory/memory.copy\";\n export const memory_fill = \"~lib/memory/memory.fill\";\n // std/gc.ts\n export const iterateRoots = \"~lib/gc/iterateRoots\";\n}\n\n/** Compiles a call to a built-in function. */\nexport function compileCall(\n compiler: Compiler,\n prototype: FunctionPrototype,\n typeArguments: Type[] | null,\n operands: Expression[],\n contextualType: Type,\n reportNode: CallExpression\n): ExpressionRef {\n var module = compiler.module;\n\n var arg0: ExpressionRef,\n arg1: ExpressionRef,\n arg2: ExpressionRef,\n ret: ExpressionRef;\n\n // NOTE that some implementations below make use of the select expression where straight-forward.\n // whether worth or not should probably be tested once it's known if/how embedders handle it.\n // search: createSelect\n\n switch (prototype.internalName) {\n\n // types\n\n case BuiltinSymbols.isInteger: { // isInteger() / isInteger(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return type.is(TypeFlags.INTEGER) && !type.is(TypeFlags.REFERENCE)\n ? module.createI32(1)\n : module.createI32(0);\n }\n case BuiltinSymbols.isFloat: { // isFloat() / isFloat(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return type.is(TypeFlags.FLOAT)\n ? module.createI32(1)\n : module.createI32(0);\n }\n case BuiltinSymbols.isSigned: { // isSigned() / isSigned(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return type.is(TypeFlags.SIGNED)\n ? module.createI32(1)\n : module.createI32(0);\n }\n case BuiltinSymbols.isReference: { // isReference() / isReference(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return type.is(TypeFlags.REFERENCE)\n ? module.createI32(1)\n : module.createI32(0);\n }\n case BuiltinSymbols.isString: { // isString() / isString(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n let classType = type.classReference;\n if (classType) {\n let stringInstance = compiler.program.stringInstance;\n if (stringInstance && classType.isAssignableTo(stringInstance)) return module.createI32(1);\n }\n return module.createI32(0);\n }\n case BuiltinSymbols.isArray: { // isArray() / isArray(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n let classReference = type.classReference;\n if (!classReference) return module.createI32(0);\n let classPrototype = classReference.prototype;\n return module.createI32(\n (classPrototype).extends(compiler.program.arrayPrototype)\n ? 1\n : 0\n );\n }\n case BuiltinSymbols.isFunction: { // isFunction / isFunction(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return module.createI32(type.signatureReference ? 1 : 0);\n }\n case BuiltinSymbols.isNullable: { // isNullable / isNullable(value: T) -> bool\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n return module.createI32(type.is(TypeFlags.NULLABLE) ? 1 : 0);\n }\n case BuiltinSymbols.isDefined: { // isDefined(expression) -> bool\n compiler.currentType = Type.bool;\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n let element = compiler.resolver.resolveExpression(\n operands[0],\n compiler.currentFlow,\n Type.void,\n ReportMode.SWALLOW\n );\n return module.createI32(element ? 1 : 0);\n }\n case BuiltinSymbols.isConstant: { // isConstant(expression) -> bool\n compiler.currentType = Type.bool;\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n let expr = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\n compiler.currentType = Type.bool;\n return module.createI32(getExpressionId(expr) == ExpressionId.Const ? 1 : 0);\n }\n case BuiltinSymbols.isManaged: { // isManaged() -> bool\n if (!compiler.program.hasGC) {\n compiler.currentType = Type.bool;\n return module.createI32(0);\n }\n let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);\n compiler.currentType = Type.bool;\n if (!type) return module.createUnreachable();\n let classType = type.classReference;\n return classType !== null && !classType.hasDecorator(DecoratorFlags.UNMANAGED)\n ? module.createI32(1)\n : module.createI32(0);\n }\n\n // math\n\n case BuiltinSymbols.clz: { // clz(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.BOOL: // usually overflows\n case TypeKind.I8:\n case TypeKind.U8:\n case TypeKind.I16:\n case TypeKind.U16:\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createUnary(UnaryOp.ClzI32, arg0);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.ClzI64\n : UnaryOp.ClzI32,\n arg0\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createUnary(UnaryOp.ClzI64, arg0);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case BuiltinSymbols.ctz: { // ctz(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.NONE, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.BOOL: // usually overflows\n case TypeKind.I8:\n case TypeKind.U8:\n case TypeKind.I16:\n case TypeKind.U16:\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createUnary(UnaryOp.CtzI32, arg0);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.CtzI64\n : UnaryOp.CtzI32,\n arg0\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createUnary(UnaryOp.CtzI64, arg0);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case BuiltinSymbols.popcnt: { // popcnt(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.BOOL: // usually overflows\n case TypeKind.I8:\n case TypeKind.U8:\n case TypeKind.I16:\n case TypeKind.U16:\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createUnary(UnaryOp.PopcntI32, arg0);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.PopcntI64\n : UnaryOp.PopcntI32,\n arg0\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createUnary(UnaryOp.PopcntI64, arg0);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case BuiltinSymbols.rotl: { // rotl(value: T, shift: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n ret = compiler.ensureSmallIntegerWrap(\n module.createBinary(BinaryOp.RotlI32, arg0, arg1),\n compiler.currentType\n );\n // fall-through\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createBinary(BinaryOp.RotlI32, arg0, arg1);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.RotlI64\n : BinaryOp.RotlI32,\n arg0,\n arg1\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createBinary(BinaryOp.RotlI64, arg0, arg1);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret; // possibly overflows\n }\n case BuiltinSymbols.rotr: { // rotr(value: T, shift: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.NONE, WrapMode.WRAP);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n ret = compiler.ensureSmallIntegerWrap(\n module.createBinary(BinaryOp.RotrI32, arg0, arg1),\n compiler.currentType\n );\n break;\n }\n case TypeKind.I32:\n case TypeKind.U32: {\n ret = module.createBinary(BinaryOp.RotrI32, arg0, arg1);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n ret = module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.RotrI64\n : BinaryOp.RotrI32,\n arg0,\n arg1\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createBinary(BinaryOp.RotrI64, arg0, arg1);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret; // possibly overflowws\n }\n case BuiltinSymbols.abs: { // abs(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n let flow = compiler.currentFlow;\n\n // possibly overflows, e.g. abs(-128) == 128\n let tempLocal1 = flow.getTempLocal(Type.i32, false);\n let tempLocalIndex2 = flow.getAndFreeTempLocal(Type.i32, false).index;\n let tempLocalIndex1 = tempLocal1.index;\n\n // (x + (x >> 31)) ^ (x >> 31)\n ret = module.createBinary(BinaryOp.XorI32,\n module.createBinary(BinaryOp.AddI32,\n module.createTeeLocal(\n tempLocalIndex2,\n module.createBinary(BinaryOp.ShrI32,\n module.createTeeLocal(tempLocalIndex1, arg0),\n module.createI32(31)\n )\n ),\n module.createGetLocal(tempLocalIndex1, NativeType.I32)\n ),\n module.createGetLocal(tempLocalIndex2, NativeType.I32)\n );\n\n flow.freeTempLocal(tempLocal1);\n break;\n }\n case TypeKind.ISIZE: {\n let options = compiler.options;\n let flow = compiler.currentFlow;\n let wasm64 = options.isWasm64;\n\n let tempLocal1 = flow.getTempLocal(options.usizeType, false);\n let tempLocalIndex2 = flow.getAndFreeTempLocal(options.usizeType, false).index;\n let tempLocalIndex1 = tempLocal1.index;\n\n ret = module.createBinary(wasm64 ? BinaryOp.XorI64 : BinaryOp.XorI32,\n module.createBinary(wasm64 ? BinaryOp.AddI64 : BinaryOp.AddI32,\n module.createTeeLocal(\n tempLocalIndex2,\n module.createBinary(wasm64 ? BinaryOp.ShrI64 : BinaryOp.ShrI32,\n module.createTeeLocal(tempLocalIndex1, arg0),\n wasm64 ? module.createI64(63) : module.createI32(31)\n )\n ),\n module.createGetLocal(tempLocalIndex1, options.nativeSizeType)\n ),\n module.createGetLocal(tempLocalIndex2, options.nativeSizeType)\n );\n\n flow.freeTempLocal(tempLocal1);\n break;\n }\n case TypeKind.I64: {\n let flow = compiler.currentFlow;\n\n let tempLocal1 = flow.getTempLocal(Type.i64, false);\n let tempLocalIndex2 = flow.getAndFreeTempLocal(Type.i64, false).index;\n let tempLocalIndex1 = tempLocal1.index;\n\n // (x + (x >> 63)) ^ (x >> 63)\n ret = module.createBinary(BinaryOp.XorI64,\n module.createBinary(BinaryOp.AddI64,\n module.createTeeLocal(\n tempLocalIndex2,\n module.createBinary(BinaryOp.ShrI64,\n module.createTeeLocal(tempLocalIndex1, arg0),\n module.createI64(63)\n )\n ),\n module.createGetLocal(tempLocalIndex1, NativeType.I64)\n ),\n module.createGetLocal(tempLocalIndex2, NativeType.I64)\n );\n\n flow.freeTempLocal(tempLocal1);\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.U64:\n case TypeKind.BOOL: {\n ret = arg0;\n break;\n }\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.AbsF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.AbsF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n ret = module.createUnreachable();\n break;\n }\n default: { // void\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case BuiltinSymbols.max: { // max(left: T, right: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n let tempLocal1 = flow.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg1, compiler.currentType)\n );\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.GtI32,\n module.createGetLocal(tempLocal0.index, NativeType.I32),\n module.createGetLocal(tempLocal1.index, NativeType.I32)\n )\n );\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n let tempLocal1 = flow.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg1, compiler.currentType)\n );\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.GtU32,\n module.createGetLocal(tempLocal0.index, NativeType.I32),\n module.createGetLocal(tempLocal1.index, NativeType.I32)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.GtI64,\n module.createGetLocal(tempLocal0.index, NativeType.I64),\n module.createGetLocal(tempLocal1.index, NativeType.I64)\n )\n );\n break;\n }\n case TypeKind.U64: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.GtU64,\n module.createGetLocal(tempLocal0.index, NativeType.I64),\n module.createGetLocal(tempLocal1.index, NativeType.I64)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtI64\n : BinaryOp.GtI32,\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\n )\n );\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.GtU64\n : BinaryOp.GtU32,\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\n )\n );\n break;\n }\n case TypeKind.F32: {\n ret = module.createBinary(BinaryOp.MaxF32, arg0, arg1);\n break;\n }\n case TypeKind.F64: {\n ret = module.createBinary(BinaryOp.MaxF64, arg0, arg1);\n break;\n }\n default: { // void\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case BuiltinSymbols.min: { // min(left: T, right: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.WRAP);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.WRAP);\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.I32: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n let tempLocal1 = flow.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg1, compiler.currentType)\n );\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.LtI32,\n module.createGetLocal(tempLocal0.index, NativeType.I32),\n module.createGetLocal(tempLocal1.index, NativeType.I32)\n )\n );\n break;\n }\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.U32:\n case TypeKind.BOOL: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n let tempLocal1 = flow.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg1, compiler.currentType)\n );\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.LtU32,\n module.createGetLocal(tempLocal0.index, NativeType.I32),\n module.createGetLocal(tempLocal1.index, NativeType.I32)\n )\n );\n break;\n }\n case TypeKind.I64: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.LtI64,\n module.createGetLocal(tempLocal0.index, NativeType.I64),\n module.createGetLocal(tempLocal1.index, NativeType.I64)\n )\n );\n break;\n }\n case TypeKind.U64: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(Type.i64, false);\n let tempLocal1 = flow.getAndFreeTempLocal(Type.i64, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(BinaryOp.LtU64,\n module.createGetLocal(tempLocal0.index, NativeType.I64),\n module.createGetLocal(tempLocal1.index, NativeType.I64)\n )\n );\n break;\n }\n case TypeKind.ISIZE: {\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.LtI64\n : BinaryOp.LtI32,\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\n )\n );\n break;\n }\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n let flow = compiler.currentFlow;\n let tempLocal0 = flow.getTempLocal(compiler.options.usizeType, false);\n let tempLocal1 = flow.getAndFreeTempLocal(compiler.options.usizeType, false);\n flow.freeTempLocal(tempLocal0);\n ret = module.createSelect(\n module.createTeeLocal(tempLocal0.index, arg0),\n module.createTeeLocal(tempLocal1.index, arg1),\n module.createBinary(\n compiler.options.isWasm64\n ? BinaryOp.LtU64\n : BinaryOp.LtU32,\n module.createGetLocal(tempLocal0.index, compiler.options.nativeSizeType),\n module.createGetLocal(tempLocal1.index, compiler.options.nativeSizeType)\n )\n );\n break;\n }\n case TypeKind.F32: {\n ret = module.createBinary(BinaryOp.MinF32, arg0, arg1);\n break;\n }\n case TypeKind.F64: {\n ret = module.createBinary(BinaryOp.MinF64, arg0, arg1);\n break;\n }\n default: { // void\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case BuiltinSymbols.ceil: { // ceil(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n default: { // any integer\n ret = arg0;\n break;\n }\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.CeilF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.CeilF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case BuiltinSymbols.floor: { // floor(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n default: { // any integer\n ret = arg0;\n break;\n }\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.FloorF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.FloorF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case BuiltinSymbols.copysign: { // copysign(left: T, right: T) -> T\n if (operands.length != 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n arg1 = compiler.compileExpression(operands[1], compiler.currentType, ConversionKind.IMPLICIT, WrapMode.NONE);\n switch (compiler.currentType.kind) { // TODO: does an integer version make sense?\n case TypeKind.F32: {\n ret = module.createBinary(BinaryOp.CopysignF32, arg0, arg1);\n break;\n }\n case TypeKind.F64: {\n ret = module.createBinary(BinaryOp.CopysignF64, arg0, arg1);\n break;\n }\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case BuiltinSymbols.nearest: { // nearest(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n default: { // any integer\n ret = arg0;\n break;\n }\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.NearestF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.NearestF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case BuiltinSymbols.reinterpret: { // reinterpret(value: *) -> T\n if (operands.length != 1) {\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n switch (typeArguments[0].kind) {\n case TypeKind.I32:\n case TypeKind.U32: {\n arg0 = compiler.compileExpression(operands[0], Type.f32, ConversionKind.IMPLICIT, WrapMode.NONE);\n ret = module.createUnary(UnaryOp.ReinterpretF32, arg0);\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.IMPLICIT, WrapMode.NONE);\n ret = module.createUnary(UnaryOp.ReinterpretF64, arg0);\n break;\n }\n case TypeKind.USIZE: {\n if (typeArguments[0].is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n compiler.currentType = typeArguments[0];\n return module.createUnreachable();\n }\n // fall-through\n }\n case TypeKind.ISIZE: {\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.isWasm64\n ? Type.f64\n : Type.f32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n ret = module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.ReinterpretF64\n : UnaryOp.ReinterpretF32,\n arg0\n );\n break;\n }\n case TypeKind.F32: {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\n ret = module.createUnary(UnaryOp.ReinterpretI32, arg0);\n break;\n }\n case TypeKind.F64: {\n arg0 = compiler.compileExpression(operands[0], Type.i64, ConversionKind.IMPLICIT, WrapMode.NONE);\n ret = module.createUnary(UnaryOp.ReinterpretI64, arg0);\n break;\n }\n default: { // small integers and void\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n compiler.currentType = typeArguments[0];\n return ret;\n }\n case BuiltinSymbols.sqrt: { // sqrt(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) { // TODO: integer versions (that return f64 or convert)?\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.SqrtF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.SqrtF64, arg0);\n break;\n }\n // case TypeKind.VOID:\n default: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case BuiltinSymbols.trunc: { // trunc(value: T) -> T\n if (operands.length != 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments && typeArguments.length) {\n compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.f64, ConversionKind.NONE, WrapMode.NONE);\n }\n switch (compiler.currentType.kind) {\n case TypeKind.USIZE: {\n if (compiler.currentType.is(TypeFlags.REFERENCE)) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n // fall-through\n }\n default: { // any integer\n ret = arg0;\n break;\n }\n // TODO: truncate to contextual type directly (if not void etc.)?\n case TypeKind.F32: {\n ret = module.createUnary(UnaryOp.TruncF32, arg0);\n break;\n }\n case TypeKind.F64: {\n ret = module.createUnary(UnaryOp.TruncF64, arg0);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n\n // memory access\n\n case BuiltinSymbols.load: { // load(offset: usize, constantOffset?: usize) -> *\n if (operands.length < 1 || operands.length > 2) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 1) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n let offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n compiler.currentType = typeArguments[0];\n return module.createLoad(\n typeArguments[0].byteSize,\n typeArguments[0].is(TypeFlags.SIGNED | TypeFlags.INTEGER),\n arg0,\n typeArguments[0].is(TypeFlags.INTEGER) &&\n contextualType.is(TypeFlags.INTEGER) &&\n contextualType.size > typeArguments[0].size\n ? (compiler.currentType = contextualType).toNativeType()\n : (compiler.currentType = typeArguments[0]).toNativeType(),\n offset\n );\n }\n case BuiltinSymbols.store: { // store(offset: usize, value: *, constantOffset?: usize) -> void\n compiler.currentType = Type.void;\n if (operands.length < 2 || operands.length > 3) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 2) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n let type: Type;\n if (\n typeArguments[0].is(TypeFlags.INTEGER) &&\n (\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\n )\n ) {\n arg1 = compiler.convertExpression(\n arg1,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[1]\n );\n type = typeArguments[0];\n } else {\n type = compiler.currentType;\n }\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n compiler.currentType = Type.void;\n return module.createStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\n }\n case BuiltinSymbols.atomic_load: { // load(offset: usize, constantOffset?: usize) -> *\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\n if (operands.length < 1 || operands.length > 2) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 1) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n let offset = operands.length == 2 ? evaluateConstantOffset(compiler, operands[1]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n compiler.currentType = typeArguments[0];\n return module.createAtomicLoad(\n typeArguments[0].byteSize,\n arg0,\n typeArguments[0].is(TypeFlags.INTEGER) &&\n contextualType.is(TypeFlags.INTEGER) &&\n contextualType.size > typeArguments[0].size\n ? (compiler.currentType = contextualType).toNativeType()\n : (compiler.currentType = typeArguments[0]).toNativeType(),\n offset\n );\n }\n case BuiltinSymbols.atomic_store: { // store(offset: usize, value: *, constantOffset?: usize) -> void\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\n compiler.currentType = Type.void;\n if (operands.length < 2 || operands.length > 3) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 2) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n let type: Type;\n if (\n typeArguments[0].is(TypeFlags.INTEGER) &&\n (\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\n )\n ) {\n arg1 = compiler.convertExpression(\n arg1,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[1]\n );\n type = typeArguments[0];\n } else {\n type = compiler.currentType;\n }\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n compiler.currentType = Type.void;\n return module.createAtomicStore(typeArguments[0].byteSize, arg0, arg1, type.toNativeType(), offset);\n }\n case BuiltinSymbols.atomic_add: // add(ptr: usize, value: T, constantOffset?: usize): T;\n case BuiltinSymbols.atomic_sub: // sub(ptr: usize, value: T, constantOffset?: usize): T;\n case BuiltinSymbols.atomic_and: // and(ptr: usize, value: T, constantOffset?: usize): T;\n case BuiltinSymbols.atomic_or: // or(ptr: usize, value: T, constantOffset?: usize): T;\n case BuiltinSymbols.atomic_xor: // xor(ptr: usize, value: T, constantOffset?: usize): T;\n case BuiltinSymbols.atomic_xchg: // xchg(ptr: usize, value: T, constantOffset?: usize): T;\n {\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\n if (operands.length < 2 || operands.length > 3) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 2) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n\n let type: Type;\n if (\n typeArguments[0].is(TypeFlags.INTEGER) &&\n (\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\n )\n ) {\n arg1 = compiler.convertExpression(\n arg1,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[1]\n );\n type = typeArguments[0];\n } else {\n type = compiler.currentType;\n }\n\n let offset = operands.length == 3 ? evaluateConstantOffset(compiler, operands[2]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n let RMWOp: AtomicRMWOp | null = null;\n switch (prototype.internalName) {\n case BuiltinSymbols.atomic_add: { RMWOp = AtomicRMWOp.Add; break; }\n case BuiltinSymbols.atomic_sub: { RMWOp = AtomicRMWOp.Sub; break; }\n case BuiltinSymbols.atomic_and: { RMWOp = AtomicRMWOp.And; break; }\n case BuiltinSymbols.atomic_or: { RMWOp = AtomicRMWOp.Or; break; }\n case BuiltinSymbols.atomic_xor: { RMWOp = AtomicRMWOp.Xor; break; }\n case BuiltinSymbols.atomic_xchg: { RMWOp = AtomicRMWOp.Xchg; break; }\n }\n compiler.currentType = typeArguments[0];\n if (RMWOp !== null) {\n return module.createAtomicRMW(\n RMWOp, typeArguments[0].byteSize, offset, arg0, arg1, type.toNativeType()\n );\n } else {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n }\n case BuiltinSymbols.atomic_cmpxchg: { // cmpxchg(ptr: usize, expected: T, replacement: T, cOff?: usize): T\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\n if (operands.length < 3 || operands.length > 4) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n if (operands.length < 3) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n } else {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg2 = compiler.compileExpression(\n operands[2],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n\n let type: Type;\n if (\n typeArguments[0].is(TypeFlags.INTEGER) &&\n (\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\n )\n ) {\n arg1 = compiler.convertExpression(\n arg1,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[1]\n );\n arg2 = compiler.convertExpression(\n arg2,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[2]\n );\n type = typeArguments[0];\n } else {\n type = compiler.currentType;\n }\n\n let offset = operands.length == 4 ? evaluateConstantOffset(compiler, operands[3]) : 0; // reports\n if (offset < 0) { // reported in evaluateConstantOffset\n return module.createUnreachable();\n }\n compiler.currentType = typeArguments[0];\n return module.createAtomicCmpxchg(\n typeArguments[0].byteSize, offset, arg0, arg1, arg2, type.toNativeType()\n );\n }\n case BuiltinSymbols.atomic_wait: { // wait(ptr: usize, expected:T, timeout: i64): i32;\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\n let hasError = typeArguments == null;\n if (operands.length != 3) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n hasError = true;\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n hasError = true;\n }\n\n if (!typeArguments || hasError) {\n return module.createUnreachable();\n }\n\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n typeArguments[0],\n typeArguments[0].is(TypeFlags.INTEGER)\n ? ConversionKind.NONE // no need to convert to small int (but now might result in a float)\n : ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg2 = compiler.compileExpression(\n operands[2],\n Type.i64,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n\n let type: Type = typeArguments[0];\n if (\n typeArguments[0].is(TypeFlags.INTEGER) &&\n (\n !compiler.currentType.is(TypeFlags.INTEGER) || // float to int\n compiler.currentType.size < typeArguments[0].size // int to larger int (clear garbage bits)\n )\n ) {\n arg1 = compiler.convertExpression(\n arg1,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[1]\n );\n arg2 = compiler.convertExpression(\n arg2,\n compiler.currentType, typeArguments[0],\n ConversionKind.IMPLICIT,\n WrapMode.NONE, // still clears garbage bits\n operands[2]\n );\n }\n\n return module.createAtomicWait(\n arg0, arg1, arg2, type.toNativeType()\n );\n }\n case BuiltinSymbols.atomic_notify: { // notify(ptr: usize, count: u32): u32;\n if (!compiler.options.hasFeature(Feature.THREADS)) break;\n let hasError = typeArguments == null;\n if (operands.length != 2) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n hasError = true;\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n hasError = true;\n }\n\n if (!typeArguments || hasError) {\n return module.createUnreachable();\n }\n\n arg0 = compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n Type.i32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n\n return module.createAtomicWake(\n arg0, arg1\n );\n }\n case BuiltinSymbols.sizeof: { // sizeof() -> usize\n compiler.currentType = compiler.options.usizeType;\n if (operands.length != 0) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n let byteSize = (typeArguments)[0].byteSize;\n if (compiler.options.isWasm64) {\n // implicitly wrap if contextual type is a 32-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\n compiler.currentType = Type.u32;\n ret = module.createI32(byteSize);\n } else {\n ret = module.createI64(byteSize, 0);\n }\n } else {\n // implicitly extend if contextual type is a 64-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\n compiler.currentType = Type.u64;\n ret = module.createI64(byteSize, 0);\n } else {\n ret = module.createI32(byteSize);\n }\n }\n return ret;\n }\n case BuiltinSymbols.alignof: { // alignof() -> usize\n compiler.currentType = compiler.options.usizeType;\n if (operands.length != 0) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n let byteSize = (typeArguments)[0].byteSize;\n let alignLog2: i32;\n switch (byteSize) {\n case 1: { alignLog2 = 0; break; }\n case 2: { alignLog2 = 1; break; }\n case 4: { alignLog2 = 2; break; }\n case 8: { alignLog2 = 3; break; }\n default: { assert(false, \"unexected byte size\"); return module.createUnreachable(); }\n }\n if (compiler.options.isWasm64) {\n // implicitly wrap if contextual type is a 32-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\n compiler.currentType = Type.u32;\n ret = module.createI32(alignLog2);\n } else {\n ret = module.createI64(alignLog2, 0);\n }\n } else {\n // implicitly extend if contextual type is a 64-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\n compiler.currentType = Type.u64;\n ret = module.createI64(alignLog2, 0);\n } else {\n ret = module.createI32(alignLog2);\n }\n }\n return ret;\n }\n case BuiltinSymbols.offsetof: { // offsetof(fieldName?: string) -> usize\n compiler.currentType = compiler.options.usizeType;\n if (operands.length > 1) {\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (!(typeArguments && typeArguments.length == 1)) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n let classType = typeArguments[0].classReference;\n if (!classType) {\n compiler.error( // TODO: better error\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return module.createUnreachable();\n }\n let offset: i32;\n if (operands.length) {\n if (\n operands[0].kind != NodeKind.LITERAL ||\n (operands[0]).literalKind != LiteralKind.STRING\n ) {\n compiler.error(\n DiagnosticCode.String_literal_expected,\n operands[0].range\n );\n return module.createUnreachable();\n }\n let fieldName = (operands[0]).value;\n let field = classType.members ? classType.members.get(fieldName) : null;\n if (!(field && field.kind == ElementKind.FIELD)) {\n compiler.error(\n DiagnosticCode.Type_0_has_no_property_1,\n operands[0].range, classType.internalName, fieldName\n );\n return module.createUnreachable();\n }\n offset = (field).memoryOffset;\n } else {\n offset = classType.currentMemoryOffset;\n }\n if (compiler.options.isWasm64) {\n // implicitly wrap if contextual type is a 32-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size <= 32) {\n compiler.currentType = Type.u32;\n return module.createI32(offset);\n } else {\n return module.createI64(offset);\n }\n } else {\n // implicitly extend if contextual type is a 64-bit integer\n if (contextualType.is(TypeFlags.INTEGER) && contextualType.size == 64) {\n compiler.currentType = Type.u64;\n return module.createI64(offset);\n } else {\n return module.createI32(offset);\n }\n }\n }\n\n // control flow\n\n case BuiltinSymbols.select: { // select(ifTrue: T, ifFalse: T, condition: bool) -> T\n if (operands.length != 3) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\n }\n let type = compiler.currentType;\n arg1 = compiler.compileExpression(operands[1], type, ConversionKind.IMPLICIT, WrapMode.NONE);\n arg2 = compiler.makeIsTrueish(\n compiler.compileExpressionRetainType(operands[2], Type.bool, WrapMode.NONE),\n compiler.currentType\n );\n compiler.currentType = type;\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL:\n default: {\n ret = module.createSelect(arg0, arg1, arg2);\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = module.createUnreachable();\n break;\n }\n }\n return ret;\n }\n case BuiltinSymbols.unreachable: { // unreachable() -> *\n if (operands.length != 0) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return module.createUnreachable();\n }\n\n // host operations\n\n case BuiltinSymbols.memory_size: { // memory.size() -> i32\n compiler.currentType = Type.i32;\n if (operands.length != 0) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return module.createHost(HostOp.CurrentMemory);\n }\n case BuiltinSymbols.memory_grow: { // memory.grow(pages: i32) -> i32\n compiler.currentType = Type.i32;\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"0\", operands.length.toString(10)\n );\n arg0 = module.createUnreachable();\n } else {\n arg0 = compiler.compileExpression(operands[0], Type.i32, ConversionKind.IMPLICIT, WrapMode.NONE);\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return module.createHost(HostOp.GrowMemory, null, [ arg0 ]);\n }\n // see: https://github.com/WebAssembly/bulk-memory-operations\n case BuiltinSymbols.memory_copy: { // memory.copy(dest: usize, src: usize: n: usize) -> void\n if (!compiler.options.hasFeature(Feature.BULK_MEMORY)) {\n let instance = compiler.resolver.resolveFunction(prototype, null); // reports\n compiler.currentType = Type.void;\n if (!instance) return module.createUnreachable();\n return compiler.compileCallDirect(instance, operands, reportNode);\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 3) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n compiler.currentType = Type.void;\n return module.createUnreachable();\n }\n let usizeType = compiler.options.usizeType;\n arg0 = compiler.compileExpression(\n operands[0],\n usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg2 = compiler.compileExpression(\n operands[2],\n usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n compiler.currentType = Type.void;\n return module.createMemoryCopy(arg0, arg1, arg2);\n }\n case BuiltinSymbols.memory_fill: { // memory.fill(dest: usize, value: u8, n: usize) -> void\n if (!compiler.options.hasFeature(Feature.BULK_MEMORY)) {\n let instance = compiler.resolver.resolveFunction(prototype, null); // reports\n compiler.currentType = Type.void;\n if (!instance) return module.createUnreachable();\n return compiler.compileCallDirect(instance, operands, reportNode);\n }\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 3) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"3\", operands.length.toString(10)\n );\n compiler.currentType = Type.void;\n return module.createUnreachable();\n }\n let usizeType = compiler.options.usizeType;\n arg0 = compiler.compileExpression(\n operands[0],\n usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg1 = compiler.compileExpression(\n operands[1],\n Type.u32,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n arg2 = compiler.compileExpression(\n operands[2],\n usizeType,\n ConversionKind.IMPLICIT,\n WrapMode.NONE\n );\n compiler.currentType = Type.void;\n return module.createMemoryFill(arg0, arg1, arg2);\n }\n\n // other\n\n case BuiltinSymbols.changetype: { // changetype(value: *) -> T\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = typeArguments[0];\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpressionRetainType(\n operands[0],\n typeArguments[0],\n WrapMode.NONE\n );\n compiler.currentType = typeArguments[0];\n if (compiler.currentType.size != typeArguments[0].size) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return module.createUnreachable();\n }\n // if (reportNode.range.source.sourceKind != SourceKind.STDLIB)\n // compiler.warning(DiagnosticCode.Operation_is_unsafe, reportNode.range);\n return arg0; // any usize to any usize\n }\n case BuiltinSymbols.assert: { // assert(isTrueish: T, message?: string) -> T with T != null\n if (operands.length < 1 || operands.length > 2) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n if (operands.length < 1) {\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n } else if (operands.length > 2) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"2\", operands.length.toString(10)\n );\n }\n return module.createUnreachable();\n }\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0].nonNullableType;\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n arg0 = compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.WRAP);\n } else {\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.bool, WrapMode.WRAP);\n }\n\n let type = compiler.currentType;\n compiler.currentType = type.nonNullableType;\n\n // just return ifTrueish if assertions are disabled, or simplify if dropped anyway\n if (compiler.options.noAssert) {\n if (contextualType == Type.void) {\n compiler.currentType = Type.void;\n return module.createNop();\n }\n return arg0;\n }\n\n let abort = compileAbort(compiler, operands.length == 2 ? operands[1] : null, reportNode);\n\n compiler.currentType = type.nonNullableType;\n\n if (contextualType == Type.void) { // simplify if dropped anyway\n switch (compiler.currentType.kind) {\n default: { // any integer up to 32-bits incl. bool\n ret = module.createIf(\n module.createUnary(UnaryOp.EqzI32,\n arg0\n ),\n abort\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n ret = module.createIf(\n module.createUnary(UnaryOp.EqzI64,\n arg0\n ),\n abort\n );\n break;\n }\n case TypeKind.ISIZE:\n case TypeKind.USIZE: {\n ret = module.createIf(\n module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.EqzI64\n : UnaryOp.EqzI32,\n arg0\n ),\n abort\n );\n break;\n }\n // TODO: also check for NaN in float assertions, as in `Boolean(NaN) -> false`?\n case TypeKind.F32: {\n ret = module.createIf(\n module.createBinary(BinaryOp.EqF32,\n arg0,\n module.createF32(0)\n ),\n abort\n );\n break;\n }\n case TypeKind.F64: {\n ret = module.createIf(\n module.createBinary(BinaryOp.EqF64,\n arg0,\n module.createF64(0)\n ),\n abort\n );\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = abort;\n break;\n }\n }\n compiler.currentType = Type.void;\n } else {\n switch (compiler.currentType.kind) {\n case TypeKind.I8:\n case TypeKind.I16:\n case TypeKind.U8:\n case TypeKind.U16:\n case TypeKind.BOOL: {\n let flow = compiler.currentFlow;\n let tempLocal = flow.getAndFreeTempLocal(\n compiler.currentType,\n !flow.canOverflow(arg0, compiler.currentType)\n );\n ret = module.createIf(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createGetLocal(tempLocal.index, NativeType.I32),\n abort\n );\n break;\n }\n case TypeKind.I32:\n case TypeKind.U32:\n default: {\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.i32, false);\n ret = module.createIf(\n module.createTeeLocal(tempLocal.index, arg0),\n module.createGetLocal(tempLocal.index, NativeType.I32),\n abort\n );\n break;\n }\n case TypeKind.I64:\n case TypeKind.U64: {\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.i64, false);\n ret = module.createIf(\n module.createUnary(UnaryOp.EqzI64,\n module.createTeeLocal(tempLocal.index, arg0)\n ),\n abort,\n module.createGetLocal(tempLocal.index, NativeType.I64)\n );\n break;\n }\n case TypeKind.ISIZE:\n case TypeKind.USIZE: {\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(compiler.options.usizeType, false);\n ret = module.createIf(\n module.createUnary(\n compiler.options.isWasm64\n ? UnaryOp.EqzI64\n : UnaryOp.EqzI32,\n module.createTeeLocal(tempLocal.index, arg0)\n ),\n abort,\n module.createGetLocal(tempLocal.index, compiler.options.nativeSizeType)\n );\n break;\n }\n case TypeKind.F32: {\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.f32, false);\n ret = module.createIf(\n module.createBinary(BinaryOp.EqF32,\n module.createTeeLocal(tempLocal.index, arg0),\n module.createF32(0)\n ),\n abort,\n module.createGetLocal(tempLocal.index, NativeType.F32)\n );\n break;\n }\n case TypeKind.F64: {\n let tempLocal = compiler.currentFlow.getAndFreeTempLocal(Type.f64, false);\n ret = module.createIf(\n module.createBinary(BinaryOp.EqF64,\n module.createTeeLocal(tempLocal.index, arg0),\n module.createF64(0)\n ),\n abort,\n module.createGetLocal(tempLocal.index, NativeType.F64)\n );\n break;\n }\n case TypeKind.VOID: {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n ret = abort;\n break;\n }\n }\n }\n return ret;\n }\n case BuiltinSymbols.unchecked: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n let flow = compiler.currentFlow;\n flow.set(FlowFlags.UNCHECKED_CONTEXT);\n ret = compiler.compileExpressionRetainType(operands[0], contextualType, WrapMode.NONE);\n flow.unset(FlowFlags.UNCHECKED_CONTEXT);\n return ret;\n }\n case BuiltinSymbols.call_indirect: { // call_indirect(target: Function | u32, ...args: *[]) -> T\n if (operands.length < 1) {\n if (typeArguments) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n if (typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n }\n compiler.error(\n DiagnosticCode.Expected_at_least_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return module.createUnreachable();\n }\n let returnType: Type;\n if (typeArguments) {\n if (typeArguments.length != 1) {\n if (typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return module.createUnreachable();\n }\n returnType = typeArguments[0];\n } else {\n returnType = contextualType;\n }\n arg0 = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\n if (compiler.currentType.kind != TypeKind.U32) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n operands[0].range\n );\n return module.createUnreachable();\n }\n let numOperands = operands.length - 1;\n let operandExprs = new Array(numOperands);\n let signatureParts = new Array(numOperands + 1);\n let nativeReturnType = returnType.toNativeType();\n let nativeParamTypes = new Array(numOperands);\n for (let i = 0; i < numOperands; ++i) {\n operandExprs[i] = compiler.compileExpressionRetainType(operands[1 + i], Type.i32, WrapMode.NONE);\n let operandType = compiler.currentType;\n signatureParts[i] = operandType.toSignatureString();\n nativeParamTypes[i] = operandType.toNativeType();\n }\n signatureParts[numOperands] = returnType.toSignatureString();\n let typeName = signatureParts.join(\"\");\n let typeRef = module.getFunctionTypeBySignature(nativeReturnType, nativeParamTypes);\n if (!typeRef) typeRef = module.addFunctionType(typeName, nativeReturnType, nativeParamTypes);\n compiler.currentType = returnType;\n // of course this can easily result in a 'RuntimeError: function signature mismatch' trap and\n // thus must be used with care. it exists because it *might* be useful in specific scenarios.\n return module.createCallIndirect(arg0, operandExprs, typeName);\n }\n case BuiltinSymbols.instantiate: {\n if (!(typeArguments && typeArguments.length == 1)) {\n if (typeArguments && typeArguments.length) compiler.currentType = typeArguments[0];\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return module.createUnreachable();\n }\n let classInstance = typeArguments[0].classReference;\n if (!classInstance) {\n compiler.error(\n DiagnosticCode.Operation_not_supported,\n reportNode.range\n );\n return module.createUnreachable();\n }\n return compiler.compileInstantiate(classInstance, operands, reportNode);\n }\n\n // user-defined diagnostic macros\n\n case BuiltinSymbols.ERROR: {\n compiler.error(\n DiagnosticCode.User_defined_0,\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\n );\n return module.createUnreachable();\n }\n case BuiltinSymbols.WARNING: {\n compiler.warning(\n DiagnosticCode.User_defined_0,\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\n );\n return module.createNop();\n }\n case BuiltinSymbols.INFO: {\n compiler.info(\n DiagnosticCode.User_defined_0,\n reportNode.range, (operands.length ? operands[0] : reportNode).range.toString()\n );\n return module.createNop();\n }\n\n // conversions\n\n case BuiltinSymbols.i8: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.i8;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.i8,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case BuiltinSymbols.i16: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.i16;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.i16,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case BuiltinSymbols.i32: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.i32;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.i32,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case BuiltinSymbols.i64: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.i64;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.i64,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case BuiltinSymbols.isize: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = compiler.options.isWasm64\n ? Type.isize64\n : Type.isize32;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n compiler.options.isWasm64\n ? Type.isize64\n : Type.isize32,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case BuiltinSymbols.u8: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.u8;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.u8,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case BuiltinSymbols.u16: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.u16;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.u16,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case BuiltinSymbols.u32: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.u32;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.u32,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case BuiltinSymbols.u64: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.u64;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.u64,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case BuiltinSymbols.usize: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = compiler.options.usizeType;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n compiler.options.usizeType,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case BuiltinSymbols.bool: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.bool;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.bool,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case BuiltinSymbols.f32: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.f32;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.f32,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n case BuiltinSymbols.f64: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.f64;\n return module.createUnreachable();\n }\n return compiler.compileExpression(\n operands[0],\n Type.f64,\n ConversionKind.EXPLICIT,\n WrapMode.NONE\n );\n }\n // TODO: v128\n\n // gc\n\n case BuiltinSymbols.iterateRoots: {\n if (typeArguments) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n if (operands.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n compiler.currentType = Type.void;\n return module.createUnreachable();\n }\n let expr = compiler.compileExpressionRetainType(operands[0], Type.u32, WrapMode.NONE);\n let type = compiler.currentType;\n let signatureReference = type.signatureReference;\n compiler.currentType = Type.void;\n if (\n !type.is(TypeFlags.REFERENCE) ||\n !signatureReference ||\n signatureReference.parameterTypes.length != 1 ||\n signatureReference.parameterTypes[0] != compiler.options.usizeType\n ) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_assignable_to_type_1,\n reportNode.range, type.toString(), \"(ref: usize) => void\"\n );\n return module.createUnreachable();\n }\n compiler.currentType = Type.void;\n // just emit a call even if the function doesn't yet exist\n compiler.needsIterateRoots = true;\n return module.createCall(\"~iterateRoots\", [ expr ], NativeType.None);\n }\n }\n var expr = deferASMCall(compiler, prototype, operands, contextualType, reportNode);\n if (expr) {\n if (typeArguments && typeArguments.length) {\n compiler.error(\n DiagnosticCode.Type_0_is_not_generic,\n reportNode.range, prototype.internalName\n );\n }\n return expr;\n }\n compiler.error(\n DiagnosticCode.Cannot_find_name_0,\n reportNode.expression.range, prototype.internalName\n );\n return module.createUnreachable();\n}\n\n/** Defers an inline-assembler-like call to a built-in function. */\nfunction deferASMCall(\n compiler: Compiler,\n prototype: FunctionPrototype,\n operands: Expression[],\n contextualType: Type,\n reportNode: CallExpression\n): ExpressionRef {\n /* tslint:disable:max-line-length */\n switch (prototype.internalName) {\n\n // TODO: Operators can't be just deferred (don't have a corresponding generic built-in)\n // add, sub, mul, div_s, div_u, rem_s, rem_u\n // and, or, xor, shl, shr_u, shr_s\n // eq, eqz, ne, lt_s, lt_u, le_s, le_u, gt_s, gt_u, ge_s, ge_u\n\n case BuiltinSymbols.i32_clz: return deferASM(BuiltinSymbols.clz, compiler, Type.i32, operands, Type.i32, reportNode);\n case BuiltinSymbols.i64_clz: return deferASM(BuiltinSymbols.clz, compiler, Type.i64, operands, Type.i64, reportNode);\n case BuiltinSymbols.i32_ctz: return deferASM(BuiltinSymbols.ctz, compiler, Type.i32, operands, Type.i32, reportNode);\n case BuiltinSymbols.i64_ctz: return deferASM(BuiltinSymbols.ctz, compiler, Type.i64, operands, Type.i64, reportNode);\n case BuiltinSymbols.i32_popcnt: return deferASM(BuiltinSymbols.popcnt, compiler, Type.i32, operands, Type.i32, reportNode);\n case BuiltinSymbols.i64_popcnt: return deferASM(BuiltinSymbols.popcnt, compiler, Type.i64, operands, Type.i64, reportNode);\n case BuiltinSymbols.i32_rotl: return deferASM(BuiltinSymbols.rotl, compiler, Type.i32, operands, Type.i32, reportNode);\n case BuiltinSymbols.i64_rotl: return deferASM(BuiltinSymbols.rotl, compiler, Type.i64, operands, Type.i64, reportNode);\n case BuiltinSymbols.i32_rotr: return deferASM(BuiltinSymbols.rotr, compiler, Type.i32, operands, Type.i32, reportNode);\n case BuiltinSymbols.i64_rotr: return deferASM(BuiltinSymbols.rotr, compiler, Type.i64, operands, Type.i64, reportNode);\n case BuiltinSymbols.f32_abs: return deferASM(BuiltinSymbols.abs, compiler, Type.f32, operands, Type.f32, reportNode);\n case BuiltinSymbols.f64_abs: return deferASM(BuiltinSymbols.abs, compiler, Type.f64, operands, Type.f64, reportNode);\n case BuiltinSymbols.f32_max: return deferASM(BuiltinSymbols.max, compiler, Type.f32, operands, Type.f32, reportNode);\n case BuiltinSymbols.f64_max: return deferASM(BuiltinSymbols.max, compiler, Type.f64, operands, Type.f64, reportNode);\n case BuiltinSymbols.f32_min: return deferASM(BuiltinSymbols.min, compiler, Type.f32, operands, Type.f32, reportNode);\n case BuiltinSymbols.f64_min: return deferASM(BuiltinSymbols.min, compiler, Type.f64, operands, Type.f64, reportNode);\n case BuiltinSymbols.f32_ceil: return deferASM(BuiltinSymbols.ceil, compiler, Type.f32, operands, Type.f32, reportNode);\n case BuiltinSymbols.f64_ceil: return deferASM(BuiltinSymbols.ceil, compiler, Type.f64, operands, Type.f64, reportNode);\n case BuiltinSymbols.f32_floor: return deferASM(BuiltinSymbols.floor, compiler, Type.f32, operands, Type.f32, reportNode);\n case BuiltinSymbols.f64_floor: return deferASM(BuiltinSymbols.floor, compiler, Type.f64, operands, Type.f64, reportNode);\n case BuiltinSymbols.f32_copysign: return deferASM(BuiltinSymbols.copysign, compiler, Type.f32, operands, Type.f32, reportNode);\n case BuiltinSymbols.f64_copysign: return deferASM(BuiltinSymbols.copysign, compiler, Type.f64, operands, Type.f64, reportNode);\n case BuiltinSymbols.f32_nearest: return deferASM(BuiltinSymbols.nearest, compiler, Type.f32, operands, Type.f32, reportNode);\n case BuiltinSymbols.f64_nearest: return deferASM(BuiltinSymbols.nearest, compiler, Type.f64, operands, Type.f64, reportNode);\n case BuiltinSymbols.i32_reinterpret_f32: return deferASM(BuiltinSymbols.reinterpret, compiler, Type.i32, operands, Type.f32, reportNode);\n case BuiltinSymbols.i64_reinterpret_f64: return deferASM(BuiltinSymbols.reinterpret, compiler, Type.i64, operands, Type.f64, reportNode);\n case BuiltinSymbols.f32_reinterpret_i32: return deferASM(BuiltinSymbols.reinterpret, compiler, Type.f32, operands, Type.i32, reportNode);\n case BuiltinSymbols.f64_reinterpret_i64: return deferASM(BuiltinSymbols.reinterpret, compiler, Type.f64, operands, Type.i64, reportNode);\n case BuiltinSymbols.f32_sqrt: return deferASM(BuiltinSymbols.sqrt, compiler, Type.f32, operands, Type.f32, reportNode);\n case BuiltinSymbols.f64_sqrt: return deferASM(BuiltinSymbols.sqrt, compiler, Type.f64, operands, Type.f64, reportNode);\n case BuiltinSymbols.f32_trunc: return deferASM(BuiltinSymbols.trunc, compiler, Type.f32, operands, Type.f32, reportNode);\n case BuiltinSymbols.f64_trunc: return deferASM(BuiltinSymbols.trunc, compiler, Type.f64, operands, Type.f64, reportNode);\n case BuiltinSymbols.i32_load8_s: return deferASM(BuiltinSymbols.load, compiler, Type.i8, operands, Type.i32, reportNode);\n case BuiltinSymbols.i32_load8_u: return deferASM(BuiltinSymbols.load, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_load16_s: return deferASM(BuiltinSymbols.load, compiler, Type.i16, operands, Type.i32, reportNode);\n case BuiltinSymbols.i32_load16_u: return deferASM(BuiltinSymbols.load, compiler, Type.u16, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_load: return deferASM(BuiltinSymbols.load, compiler, Type.i32, operands, Type.i32, reportNode);\n case BuiltinSymbols.i64_load8_s: return deferASM(BuiltinSymbols.load, compiler, Type.i8, operands, Type.i64, reportNode);\n case BuiltinSymbols.i64_load8_u: return deferASM(BuiltinSymbols.load, compiler, Type.u8, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_load16_s: return deferASM(BuiltinSymbols.load, compiler, Type.i16, operands, Type.i64, reportNode);\n case BuiltinSymbols.i64_load16_u: return deferASM(BuiltinSymbols.load, compiler, Type.u16, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_load32_s: return deferASM(BuiltinSymbols.load, compiler, Type.i32, operands, Type.i64, reportNode);\n case BuiltinSymbols.i64_load32_u: return deferASM(BuiltinSymbols.load, compiler, Type.u32, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_load: return deferASM(BuiltinSymbols.load, compiler, Type.i64, operands, Type.i64, reportNode);\n case BuiltinSymbols.f32_load: return deferASM(BuiltinSymbols.load, compiler, Type.f32, operands, Type.f32, reportNode);\n case BuiltinSymbols.f64_load: return deferASM(BuiltinSymbols.load, compiler, Type.f64, operands, Type.f64, reportNode);\n case BuiltinSymbols.i32_store8: return deferASM(BuiltinSymbols.store, compiler, Type.i8, operands, Type.i32, reportNode);\n case BuiltinSymbols.i32_store16: return deferASM(BuiltinSymbols.store, compiler, Type.i16, operands, Type.i32, reportNode);\n case BuiltinSymbols.i32_store: return deferASM(BuiltinSymbols.store, compiler, Type.i32, operands, Type.i32, reportNode);\n case BuiltinSymbols.i64_store8: return deferASM(BuiltinSymbols.store, compiler, Type.i8, operands, Type.i64, reportNode);\n case BuiltinSymbols.i64_store16: return deferASM(BuiltinSymbols.store, compiler, Type.i16, operands, Type.i64, reportNode);\n case BuiltinSymbols.i64_store32: return deferASM(BuiltinSymbols.store, compiler, Type.i32, operands, Type.i64, reportNode);\n case BuiltinSymbols.i64_store: return deferASM(BuiltinSymbols.store, compiler, Type.i64, operands, Type.i64, reportNode);\n case BuiltinSymbols.f32_store: return deferASM(BuiltinSymbols.store, compiler, Type.f32, operands, Type.f32, reportNode);\n case BuiltinSymbols.f64_store: return deferASM(BuiltinSymbols.store, compiler, Type.f64, operands, Type.f64, reportNode);\n }\n if (compiler.options.hasFeature(Feature.THREADS)) {\n switch (prototype.internalName) {\n case BuiltinSymbols.i32_atomic_load8_u: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_load16_u: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.u16, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_load: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.i32, operands, Type.i32, reportNode);\n case BuiltinSymbols.i64_atomic_load8_u: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.u8, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_load16_u: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.u16, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_load32_u: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.u32, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_load: return deferASM(BuiltinSymbols.atomic_load, compiler, Type.i64, operands, Type.i64, reportNode);\n case BuiltinSymbols.i32_atomic_store8: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i8, operands, Type.i32, reportNode);\n case BuiltinSymbols.i32_atomic_store16: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i16, operands, Type.i32, reportNode);\n case BuiltinSymbols.i32_atomic_store: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i32, operands, Type.i32, reportNode);\n case BuiltinSymbols.i64_atomic_store8: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i8, operands, Type.i64, reportNode);\n case BuiltinSymbols.i64_atomic_store16: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i16, operands, Type.i64, reportNode);\n case BuiltinSymbols.i64_atomic_store32: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i32, operands, Type.i64, reportNode);\n case BuiltinSymbols.i64_atomic_store: return deferASM(BuiltinSymbols.atomic_store, compiler, Type.i64, operands, Type.i64, reportNode);\n case BuiltinSymbols.i32_atomic_rmw8_u_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw16_u_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u16, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u32, operands, Type.u32, reportNode);\n case BuiltinSymbols.i64_atomic_rmw8_u_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u8, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw16_u_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u16, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw32_u_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u32, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw_add: return deferASM(BuiltinSymbols.atomic_add, compiler, Type.u64, operands, Type.u64, reportNode);\n case BuiltinSymbols.i32_atomic_rmw8_u_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw16_u_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u16, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u32, operands, Type.u32, reportNode);\n case BuiltinSymbols.i64_atomic_rmw8_u_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u8, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw16_u_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u16, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw32_u_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u32, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw_sub: return deferASM(BuiltinSymbols.atomic_sub, compiler, Type.u64, operands, Type.u64, reportNode);\n case BuiltinSymbols.i32_atomic_rmw8_u_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw16_u_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u16, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u32, operands, Type.u32, reportNode);\n case BuiltinSymbols.i64_atomic_rmw8_u_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u8, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw16_u_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u16, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw32_u_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u32, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw_and: return deferASM(BuiltinSymbols.atomic_and, compiler, Type.u64, operands, Type.u64, reportNode);\n case BuiltinSymbols.i32_atomic_rmw8_u_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw16_u_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u16, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u32, operands, Type.u32, reportNode);\n case BuiltinSymbols.i64_atomic_rmw8_u_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u8, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw16_u_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u16, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw32_u_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u32, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw_or: return deferASM(BuiltinSymbols.atomic_or, compiler, Type.u64, operands, Type.u64, reportNode);\n case BuiltinSymbols.i32_atomic_rmw8_u_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw16_u_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i64_atomic_rmw8_u_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u8, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw16_u_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u16, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw32_u_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u32, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw_xor: return deferASM(BuiltinSymbols.atomic_xor, compiler, Type.u64, operands, Type.u64, reportNode);\n case BuiltinSymbols.i32_atomic_rmw8_u_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw16_u_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i64_atomic_rmw8_u_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u8, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw16_u_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u16, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw32_u_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u32, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw_xchg: return deferASM(BuiltinSymbols.atomic_xchg, compiler, Type.u64, operands, Type.u64, reportNode);\n case BuiltinSymbols.i32_atomic_rmw8_u_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw16_u_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i32_atomic_rmw_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u8, operands, Type.u32, reportNode);\n case BuiltinSymbols.i64_atomic_rmw8_u_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u8, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw16_u_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u16, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw32_u_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u32, operands, Type.u64, reportNode);\n case BuiltinSymbols.i64_atomic_rmw_cmpxchg: return deferASM(BuiltinSymbols.atomic_cmpxchg, compiler, Type.u64, operands, Type.u64, reportNode);\n case BuiltinSymbols.i32_wait: return deferASM(BuiltinSymbols.atomic_wait, compiler, Type.i32, operands, Type.u32, reportNode);\n case BuiltinSymbols.i64_wait: return deferASM(BuiltinSymbols.atomic_wait, compiler, Type.i64, operands, Type.i64, reportNode);\n case BuiltinSymbols.i32_notify: return deferASM(BuiltinSymbols.atomic_notify, compiler, Type.i32, operands, Type.u32, reportNode);\n case BuiltinSymbols.i64_notify: return deferASM(BuiltinSymbols.atomic_notify, compiler, Type.i64, operands, Type.i64, reportNode);\n }\n }\n /* tslint:enable:max-line-length */\n return 0;\n}\n\n/** A helper for deferring inline-assembler-like calls to built-in functions. */\nfunction deferASM(\n name: string,\n compiler: Compiler,\n typeArgument: Type,\n operands: Expression[],\n valueType: Type,\n reportNode: CallExpression\n): ExpressionRef {\n assert(compiler.program.elementsByName.has(name));\n var prototype = compiler.program.elementsByName.get(name)!;\n assert(prototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n return compileCall(compiler, prototype, [ typeArgument ], operands, valueType, reportNode);\n}\n\n/** Evaluates the constant type of a type argument *or* expression. */\nfunction evaluateConstantType(\n compiler: Compiler,\n typeArguments: Type[] | null,\n operands: Expression[],\n reportNode: Node\n): Type | null {\n if (operands.length == 0) { // requires type argument\n if (!typeArguments || typeArguments.length != 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments ? typeArguments.length.toString(10) : \"0\"\n );\n return null;\n }\n return typeArguments[0];\n }\n if (operands.length == 1) { // optional type argument\n if (typeArguments) {\n if (typeArguments.length == 1) {\n compiler.compileExpression(operands[0], typeArguments[0], ConversionKind.IMPLICIT, WrapMode.NONE);\n } else {\n if (typeArguments.length) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n return null;\n }\n compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\n }\n } else {\n compiler.compileExpressionRetainType(operands[0], Type.i32, WrapMode.NONE);\n }\n return compiler.currentType;\n }\n if (typeArguments && typeArguments.length > 1) {\n compiler.error(\n DiagnosticCode.Expected_0_type_arguments_but_got_1,\n reportNode.range, \"1\", typeArguments.length.toString(10)\n );\n }\n compiler.error(\n DiagnosticCode.Expected_0_arguments_but_got_1,\n reportNode.range, \"1\", operands.length.toString(10)\n );\n return null;\n}\n\n/** Evaluates a `constantOffset` argument.*/\nfunction evaluateConstantOffset(compiler: Compiler, expression: Expression): i32 {\n var expr: ExpressionRef;\n var value: i32;\n if (compiler.options.isWasm64) {\n expr = compiler.precomputeExpression(expression, Type.usize64, ConversionKind.IMPLICIT, WrapMode.NONE);\n if (\n getExpressionId(expr) != ExpressionId.Const ||\n getExpressionType(expr) != NativeType.I64 ||\n getConstValueI64High(expr) != 0 ||\n (value = getConstValueI64Low(expr)) < 0\n ) {\n compiler.error(\n DiagnosticCode.Expression_must_be_a_compile_time_constant,\n expression.range\n );\n value = -1;\n }\n } else {\n expr = compiler.precomputeExpression(expression, Type.usize32, ConversionKind.IMPLICIT, WrapMode.NONE);\n if (\n getExpressionId(expr) != ExpressionId.Const ||\n getExpressionType(expr) != NativeType.I32 ||\n (value = getConstValueI32(expr)) < 0\n ) {\n compiler.error(\n DiagnosticCode.Expression_must_be_a_compile_time_constant,\n expression.range\n );\n value = -1;\n }\n }\n return value;\n}\n\n/** Compiles an abort wired to the conditionally imported 'abort' function. */\nexport function compileAbort(\n compiler: Compiler,\n message: Expression | null,\n reportNode: Node\n): ExpressionRef {\n var program = compiler.program;\n var module = compiler.module;\n\n var stringInstance = compiler.program.stringInstance;\n if (!stringInstance) return module.createUnreachable();\n\n var abortInstance = program.abortInstance;\n if (!(abortInstance && compiler.compileFunction(abortInstance))) return module.createUnreachable();\n\n var messageArg = message != null\n ? compiler.compileExpression(message, stringInstance.type, ConversionKind.IMPLICIT, WrapMode.NONE)\n : stringInstance.type.toNativeZero(module);\n\n var filenameArg = compiler.ensureStaticString(reportNode.range.source.normalizedPath);\n\n compiler.currentType = Type.void;\n return module.createBlock(null, [\n module.createCall(\n abortInstance.internalName, [\n messageArg,\n filenameArg,\n module.createI32(reportNode.range.line),\n module.createI32(reportNode.range.column)\n ],\n NativeType.None\n ),\n module.createUnreachable()\n ]);\n}\n\n/** Compiles the iterateRoots function if requires. */\nexport function compileIterateRoots(compiler: Compiler): void {\n var module = compiler.module;\n var exprs = new Array();\n\n for (let element of compiler.program.elementsByName.values()) {\n if (element.kind != ElementKind.GLOBAL) continue;\n let global = element;\n let classReference = global.type.classReference;\n if (\n global.is(CommonFlags.COMPILED) &&\n classReference !== null &&\n !classReference.hasDecorator(DecoratorFlags.UNMANAGED)\n ) {\n if (global.is(CommonFlags.INLINED)) {\n let value = global.constantIntegerValue;\n exprs.push(\n module.createCallIndirect(\n module.createGetLocal(0, NativeType.I32),\n [\n compiler.options.isWasm64\n ? module.createI64(i64_low(value), i64_high(value))\n : module.createI32(i64_low(value))\n ],\n \"i_\"\n )\n );\n } else {\n exprs.push(\n module.createCallIndirect(\n module.createGetLocal(0, NativeType.I32),\n [\n module.createGetGlobal(\n global.internalName,\n compiler.options.nativeSizeType\n )\n ],\n \"i_\"\n )\n );\n }\n }\n }\n var typeRef = compiler.ensureFunctionType([ Type.i32 ], Type.void);\n module.addFunction(\"~iterateRoots\", typeRef, [],\n exprs.length\n ? module.createBlock(null, exprs)\n : module.createNop()\n );\n}\n\n/** Ensures that the specified class's GC hook exists and returns its function table index. */\nexport function ensureGCHook(\n compiler: Compiler,\n classInstance: Class\n): u32 {\n var program = compiler.program;\n assert(classInstance.type.isManaged(program));\n\n // check if the GC hook has already been created\n {\n let existingIndex = classInstance.gcHookIndex;\n if (existingIndex != -1) return existingIndex;\n }\n\n // check if the class implements a custom GC function (only valid for library elements)\n var members = classInstance.members;\n if (classInstance.isDeclaredInLibrary) {\n if (members !== null && members.has(\"__gc\")) {\n let gcPrototype = assert(members.get(\"__gc\"));\n assert(gcPrototype.kind == ElementKind.FUNCTION_PROTOTYPE);\n let gcInstance = assert(program.resolver.resolveFunction(gcPrototype, null));\n assert(gcInstance.is(CommonFlags.PRIVATE | CommonFlags.INSTANCE));\n assert(!gcInstance.isAny(CommonFlags.AMBIENT | CommonFlags.VIRTUAL));\n assert(gcInstance.signature.parameterTypes.length == 0);\n assert(gcInstance.signature.returnType == Type.void);\n gcInstance.internalName = classInstance.internalName + \"~gc\";\n assert(compiler.compileFunction(gcInstance));\n let index = compiler.ensureFunctionTableEntry(gcInstance);\n classInstance.gcHookIndex = index;\n return index;\n }\n }\n\n var module = compiler.module;\n var options = compiler.options;\n var nativeSizeType = options.nativeSizeType;\n var nativeSizeSize = options.usizeType.byteSize;\n var body = new Array();\n\n // nothing to mark if 'this' is null\n body.push(\n module.createIf(\n module.createUnary(\n options.isWasm64\n ? UnaryOp.EqzI64\n : UnaryOp.EqzI32,\n module.createGetLocal(0, nativeSizeType)\n ),\n module.createReturn()\n )\n );\n\n // remember the function index so we don't recurse infinitely\n var functionTable = compiler.functionTable;\n var gcHookIndex = functionTable.length;\n functionTable.push(\"\");\n classInstance.gcHookIndex = gcHookIndex;\n\n // if the class extends a base class, call its hook first (calls mark)\n var baseInstance = classInstance.base;\n if (baseInstance) {\n assert(baseInstance.type.isManaged(program));\n body.push(\n module.createCallIndirect(\n module.createI32(\n ensureGCHook(compiler, baseInstance.type.classReference)\n ),\n [\n module.createGetLocal(0, nativeSizeType)\n ],\n nativeSizeType == NativeType.I64 ? \"I_\" : \"i_\"\n )\n );\n\n // if this class is the top-most base class, mark the instance\n } else {\n body.push(\n module.createCall(assert(program.gcMarkInstance).internalName, [\n module.createGetLocal(0, nativeSizeType)\n ], NativeType.None)\n );\n }\n\n // mark instances assigned to own fields that are again references\n if (members) {\n for (let member of members.values()) {\n if (member.kind == ElementKind.FIELD) {\n if ((member).parent === classInstance) {\n let type = (member).type;\n if (type.isManaged(program)) {\n let offset = (member).memoryOffset;\n assert(offset >= 0);\n body.push(\n module.createCall(assert(program.gcMarkInstance).internalName, [\n module.createLoad(\n nativeSizeSize,\n false,\n module.createGetLocal(0, nativeSizeType),\n nativeSizeType,\n offset\n )\n ], NativeType.None)\n );\n }\n }\n }\n }\n }\n\n // add the function to the module and return its table index\n var funcName = classInstance.internalName + \"~gc\";\n module.addFunction(\n funcName,\n compiler.ensureFunctionType(null, Type.void, options.usizeType),\n null,\n module.createBlock(null, body)\n );\n functionTable[gcHookIndex] = funcName;\n return gcHookIndex;\n}\n","/** @module util *//***/\n\n/** Tests if the bit at the specified index is set within a 64-bit map. */\nexport function bitsetIs(map: I64, index: i32): bool {\n assert(index >= 0 && index < 64);\n return i64_ne(\n i64_and(\n map,\n i64_shl(\n i64_one,\n i64_new(index)\n )\n ),\n i64_zero\n );\n}\n\n/** Sets or unsets the bit at the specified index within a 64-bit map and returns the new map. */\nexport function bitsetSet(map: I64, index: i32, isSet: bool): I64 {\n assert(index >= 0 && index < 64);\n return isSet\n ? i64_or(\n map,\n i64_shl(\n i64_one,\n i64_new(index)\n )\n )\n : i64_and(\n map,\n i64_not(\n i64_shl(\n i64_one,\n i64_new(index)\n )\n )\n );\n}\n","/** @module util *//***/\n\n/** An enum of named character codes. */\nexport const enum CharCode {\n\n NULL = 0,\n LINEFEED = 0x0A,\n CARRIAGERETURN = 0x0D,\n LINESEPARATOR = 0x2028,\n PARAGRAPHSEPARATOR = 0x2029,\n NEXTLINE = 0x0085,\n\n SPACE = 0x20,\n NONBREAKINGSPACE = 0xA0,\n ENQUAD = 0x2000,\n EMQUAD = 0x2001,\n ENSPACE = 0x2002,\n EMSPACE = 0x2003,\n THREEPEREMSPACE = 0x2004,\n FOURPEREMSPACE = 0x2005,\n SIXPEREMSPACE = 0x2006,\n FIGURESPACE = 0x2007,\n PUNCTUATIONSPACE = 0x2008,\n THINSPACE = 0x2009,\n HAIRSPACE = 0x200A,\n ZEROWIDTHSPACE = 0x200B,\n NARROWNOBREAKSPACE = 0x202F,\n IDEOGRAPHICSPACE = 0x3000,\n MATHEMATICALSPACE = 0x205F,\n OGHAM = 0x1680,\n\n _ = 0x5F,\n\n _0 = 0x30,\n _1 = 0x31,\n _2 = 0x32,\n _3 = 0x33,\n _4 = 0x34,\n _5 = 0x35,\n _6 = 0x36,\n _7 = 0x37,\n _8 = 0x38,\n _9 = 0x39,\n\n a = 0x61,\n b = 0x62,\n c = 0x63,\n d = 0x64,\n e = 0x65,\n f = 0x66,\n g = 0x67,\n h = 0x68,\n i = 0x69,\n j = 0x6A,\n k = 0x6B,\n l = 0x6C,\n m = 0x6D,\n n = 0x6E,\n o = 0x6F,\n p = 0x70,\n q = 0x71,\n r = 0x72,\n s = 0x73,\n t = 0x74,\n u = 0x75,\n v = 0x76,\n w = 0x77,\n x = 0x78,\n y = 0x79,\n z = 0x7A,\n\n A = 0x41,\n B = 0x42,\n C = 0x43,\n D = 0x44,\n E = 0x45,\n F = 0x46,\n G = 0x47,\n H = 0x48,\n I = 0x49,\n J = 0x4A,\n K = 0x4B,\n L = 0x4C,\n M = 0x4D,\n N = 0x4E,\n O = 0x4F,\n P = 0x50,\n Q = 0x51,\n R = 0x52,\n S = 0x53,\n T = 0x54,\n U = 0x55,\n V = 0x56,\n W = 0x57,\n X = 0x58,\n Y = 0x59,\n Z = 0x5a,\n\n AMPERSAND = 0x26,\n ASTERISK = 0x2A,\n AT = 0x40,\n BACKSLASH = 0x5C,\n BACKTICK = 0x60,\n BAR = 0x7C,\n CARET = 0x5E,\n CLOSEBRACE = 0x7D,\n CLOSEBRACKET = 0x5D,\n CLOSEPAREN = 0x29,\n COLON = 0x3A,\n COMMA = 0x2C,\n DOLLAR = 0x24,\n DOT = 0x2E,\n DOUBLEQUOTE = 0x22,\n EQUALS = 0x3D,\n EXCLAMATION = 0x21,\n GREATERTHAN = 0x3E,\n HASH = 0x23,\n LESSTHAN = 0x3C,\n MINUS = 0x2D,\n OPENBRACE = 0x7B,\n OPENBRACKET = 0x5B,\n OPENPAREN = 0x28,\n PERCENT = 0x25,\n PLUS = 0x2B,\n QUESTION = 0x3F,\n SEMICOLON = 0x3B,\n SINGLEQUOTE = 0x27,\n SLASH = 0x2F,\n TILDE = 0x7E,\n\n BACKSPACE = 0x08,\n FORMFEED = 0x0C,\n BYTEORDERMARK = 0xFEFF,\n TAB = 0x09,\n VERTICALTAB = 0x0B\n}\n\n/** Tests if the specified character code is some sort of line break. */\nexport function isLineBreak(c: CharCode): bool {\n switch (c) {\n case CharCode.LINEFEED:\n case CharCode.CARRIAGERETURN:\n case CharCode.LINESEPARATOR:\n case CharCode.PARAGRAPHSEPARATOR: {\n return true;\n }\n default: {\n return false;\n }\n }\n}\n\n/** Tests if the specified character code is some sort of white space. */\nexport function isWhiteSpace(c: i32): bool {\n switch (c) {\n case CharCode.SPACE:\n case CharCode.TAB:\n case CharCode.VERTICALTAB:\n case CharCode.FORMFEED:\n case CharCode.NONBREAKINGSPACE:\n case CharCode.NEXTLINE:\n case CharCode.OGHAM:\n case CharCode.NARROWNOBREAKSPACE:\n case CharCode.MATHEMATICALSPACE:\n case CharCode.IDEOGRAPHICSPACE:\n case CharCode.BYTEORDERMARK: {\n return true;\n }\n default: {\n return c >= CharCode.ENQUAD && c <= CharCode.ZEROWIDTHSPACE;\n }\n }\n}\n\n/** Tests if the specified character code is a valid decimal digit. */\nexport function isDecimalDigit(c: i32): bool {\n return c >= CharCode._0 && c <= CharCode._9;\n}\n\n/** Tests if the specified character code is a valid octal digit. */\nexport function isOctalDigit(c: i32): bool {\n return c >= CharCode._0 && c <= CharCode._7;\n}\n\n/** Tests if the specified character code is a valid start of an identifier. */\nexport function isIdentifierStart(c: i32): bool {\n return c >= CharCode.a && c <= CharCode.z\n || c >= CharCode.A && c <= CharCode.Z\n || c == CharCode._\n || c == CharCode.DOLLAR\n || c > 0x7f && isUnicodeIdentifierStart(c);\n}\n\n/** Tests if the specified character code is a valid keyword character. */\nexport function isKeywordCharacter(c: i32): bool {\n return c >= CharCode.a && c <= CharCode.z;\n}\n\n/** Tests if the specified character code is a valid part of an identifier. */\nexport function isIdentifierPart(c: i32): bool {\n return c >= CharCode.a && c <= CharCode.z\n || c >= CharCode.A && c <= CharCode.Z\n || c >= CharCode._0 && c <= CharCode._9\n || c == CharCode._\n || c == CharCode.DOLLAR\n || c > 0x7f && isUnicodeIdentifierPart(c);\n}\n\n// storing as u16 to save memory\nconst unicodeIdentifierStart: u16[] = [\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\n 740, 748, 748, 750, 750, 880, 884, 886, 887, 890, 893, 902, 902, 904, 906,\n 908, 908, 910, 929, 931,\n 1013, 1015, 1153, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415, 1488, 1514,\n 1520, 1522, 1568, 1610, 1646, 1647, 1649, 1747, 1749, 1749, 1765, 1766, 1774,\n 1775, 1786, 1788, 1791, 1791, 1808, 1808, 1810, 1839, 1869, 1957, 1969, 1969,\n 1994, 2026, 2036, 2037, 2042, 2042, 2048, 2069, 2074, 2074, 2084, 2084, 2088,\n 2088, 2112, 2136, 2208, 2208, 2210, 2220, 2308, 2361, 2365, 2365, 2384, 2384,\n 2392, 2401, 2417, 2423, 2425, 2431, 2437, 2444, 2447, 2448, 2451, 2472, 2474,\n 2480, 2482, 2482, 2486, 2489, 2493, 2493, 2510, 2510, 2524, 2525, 2527, 2529,\n 2544, 2545, 2565, 2570, 2575, 2576, 2579, 2600, 2602, 2608, 2610, 2611, 2613,\n 2614, 2616, 2617, 2649, 2652, 2654, 2654, 2674, 2676, 2693, 2701, 2703, 2705,\n 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2749, 2749, 2768, 2768, 2784,\n 2785, 2821, 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873,\n 2877, 2877, 2908, 2909, 2911, 2913, 2929, 2929, 2947, 2947, 2949, 2954, 2958,\n 2960, 2962, 2965, 2969, 2970, 2972, 2972, 2974, 2975, 2979, 2980, 2984, 2986,\n 2990, 3001, 3024, 3024, 3077, 3084, 3086, 3088, 3090, 3112, 3114, 3123, 3125,\n 3129, 3133, 3133, 3160, 3161, 3168, 3169, 3205, 3212, 3214, 3216, 3218, 3240,\n 3242, 3251, 3253, 3257, 3261, 3261, 3294, 3294, 3296, 3297, 3313, 3314, 3333,\n 3340, 3342, 3344, 3346, 3386, 3389, 3389, 3406, 3406, 3424, 3425, 3450, 3455,\n 3461, 3478, 3482, 3505, 3507, 3515, 3517, 3517, 3520, 3526, 3585, 3632, 3634,\n 3635, 3648, 3654, 3713, 3714, 3716, 3716, 3719, 3720, 3722, 3722, 3725, 3725,\n 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751, 3751, 3754, 3755, 3757,\n 3760, 3762, 3763, 3773, 3773, 3776, 3780, 3782, 3782, 3804, 3807, 3840, 3840,\n 3904, 3911, 3913, 3948, 3976, 3980, 4096, 4138, 4159, 4159, 4176, 4181, 4186,\n 4189, 4193, 4193, 4197, 4198, 4206, 4208, 4213, 4225, 4238, 4238, 4256, 4293,\n 4295, 4295, 4301, 4301, 4304, 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696,\n 4696, 4698, 4701, 4704, 4744, 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798,\n 4800, 4800, 4802, 4805, 4808, 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4992,\n 5007, 5024, 5108, 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872,\n 5888, 5900, 5902, 5905, 5920, 5937, 5952, 5969, 5984, 5996, 5998, 6000, 6016,\n 6067, 6103, 6103, 6108, 6108, 6176, 6263, 6272, 6312, 6314, 6314, 6320, 6389,\n 6400, 6428, 6480, 6509, 6512, 6516, 6528, 6571, 6593, 6599, 6656, 6678, 6688,\n 6740, 6823, 6823, 6917, 6963, 6981, 6987, 7043, 7072, 7086, 7087, 7098, 7141,\n 7168, 7203, 7245, 7247, 7258, 7293, 7401, 7404, 7406, 7409, 7413, 7414, 7424,\n 7615, 7680, 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025,\n 8027, 8027, 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130,\n 8132, 8134, 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188,\n 8305, 8305, 8319, 8319, 8336, 8348, 8450, 8450, 8455, 8455, 8458, 8467, 8469,\n 8469, 8473, 8477, 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505,\n 8508, 8511, 8517, 8521, 8526, 8526, 8544, 8584,\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11502, 11506, 11507, 11520,\n 11557, 11559, 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11648, 11670,\n 11680, 11686, 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720,\n 11726, 11728, 11734, 11736, 11742, 11823, 11823, 12293, 12295, 12321, 12329,\n 12337, 12341, 12344, 12348, 12353, 12438, 12445, 12447, 12449, 12538, 12540,\n 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799, 13312, 19893,\n 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512, 42527, 42538,\n 42539, 42560, 42606, 42623, 42647, 42656, 42735, 42775, 42783, 42786, 42888,\n 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43009, 43011, 43013, 43015,\n 43018, 43020, 43042, 43072, 43123, 43138, 43187, 43250, 43255, 43259, 43259,\n 43274, 43301, 43312, 43334, 43360, 43388, 43396, 43442, 43471, 43471, 43520,\n 43560, 43584, 43586, 43588, 43595, 43616, 43638, 43642, 43642, 43648, 43695,\n 43697, 43697, 43701, 43702, 43705, 43709, 43712, 43712, 43714, 43714, 43739,\n 43741, 43744, 43754, 43762, 43764, 43777, 43782, 43785, 43790, 43793, 43798,\n 43808, 43814, 43816, 43822, 43968, 44002, 44032, 55203, 55216, 55238, 55243,\n 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275, 64279, 64285, 64285,\n 64287, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321, 64323,\n 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008, 65019,\n 65136, 65140, 65142, 65276, 65313, 65338, 65345, 65370, 65382, 65470, 65474,\n 65479, 65482, 65487, 65490, 65495, 65498, 65500,\n];\nconst unicodeIdentifierPart: u16[] = [\n 170, 170, 181, 181, 186, 186, 192, 214, 216, 246, 248, 705, 710, 721, 736,\n 740, 748, 748, 750, 750, 768, 884, 886, 887, 890, 893, 902, 902, 904, 906,\n 908, 908, 910, 929, 931,\n 1013, 1015, 1153, 1155, 1159, 1162, 1319, 1329, 1366, 1369, 1369, 1377, 1415,\n 1425, 1469, 1471, 1471, 1473, 1474, 1476, 1477, 1479, 1479, 1488, 1514, 1520,\n 1522, 1552, 1562, 1568, 1641, 1646, 1747, 1749, 1756, 1759, 1768, 1770, 1788,\n 1791, 1791, 1808, 1866, 1869, 1969, 1984, 2037, 2042, 2042, 2048, 2093, 2112,\n 2139, 2208, 2208, 2210, 2220, 2276, 2302, 2304, 2403, 2406, 2415, 2417, 2423,\n 2425, 2431, 2433, 2435, 2437, 2444, 2447, 2448, 2451, 2472, 2474, 2480, 2482,\n 2482, 2486, 2489, 2492, 2500, 2503, 2504, 2507, 2510, 2519, 2519, 2524, 2525,\n 2527, 2531, 2534, 2545, 2561, 2563, 2565, 2570, 2575, 2576, 2579, 2600, 2602,\n 2608, 2610, 2611, 2613, 2614, 2616, 2617, 2620, 2620, 2622, 2626, 2631, 2632,\n 2635, 2637, 2641, 2641, 2649, 2652, 2654, 2654, 2662, 2677, 2689, 2691, 2693,\n 2701, 2703, 2705, 2707, 2728, 2730, 2736, 2738, 2739, 2741, 2745, 2748, 2757,\n 2759, 2761, 2763, 2765, 2768, 2768, 2784, 2787, 2790, 2799, 2817, 2819, 2821,\n 2828, 2831, 2832, 2835, 2856, 2858, 2864, 2866, 2867, 2869, 2873, 2876, 2884,\n 2887, 2888, 2891, 2893, 2902, 2903, 2908, 2909, 2911, 2915, 2918, 2927, 2929,\n 2929, 2946, 2947, 2949, 2954, 2958, 2960, 2962, 2965, 2969, 2970, 2972, 2972,\n 2974, 2975, 2979, 2980, 2984, 2986, 2990, 3001, 3006, 3010, 3014, 3016, 3018,\n 3021, 3024, 3024, 3031, 3031, 3046, 3055, 3073, 3075, 3077, 3084, 3086, 3088,\n 3090, 3112, 3114, 3123, 3125, 3129, 3133, 3140, 3142, 3144, 3146, 3149, 3157,\n 3158, 3160, 3161, 3168, 3171, 3174, 3183, 3202, 3203, 3205, 3212, 3214, 3216,\n 3218, 3240, 3242, 3251, 3253, 3257, 3260, 3268, 3270, 3272, 3274, 3277, 3285,\n 3286, 3294, 3294, 3296, 3299, 3302, 3311, 3313, 3314, 3330, 3331, 3333, 3340,\n 3342, 3344, 3346, 3386, 3389, 3396, 3398, 3400, 3402, 3406, 3415, 3415, 3424,\n 3427, 3430, 3439, 3450, 3455, 3458, 3459, 3461, 3478, 3482, 3505, 3507, 3515,\n 3517, 3517, 3520, 3526, 3530, 3530, 3535, 3540, 3542, 3542, 3544, 3551, 3570,\n 3571, 3585, 3642, 3648, 3662, 3664, 3673, 3713, 3714, 3716, 3716, 3719, 3720,\n 3722, 3722, 3725, 3725, 3732, 3735, 3737, 3743, 3745, 3747, 3749, 3749, 3751,\n 3751, 3754, 3755, 3757, 3769, 3771, 3773, 3776, 3780, 3782, 3782, 3784, 3789,\n 3792, 3801, 3804, 3807, 3840, 3840, 3864, 3865, 3872, 3881, 3893, 3893, 3895,\n 3895, 3897, 3897, 3902, 3911, 3913, 3948, 3953, 3972, 3974, 3991, 3993, 4028,\n 4038, 4038, 4096, 4169, 4176, 4253, 4256, 4293, 4295, 4295, 4301, 4301, 4304,\n 4346, 4348, 4680, 4682, 4685, 4688, 4694, 4696, 4696, 4698, 4701, 4704, 4744,\n 4746, 4749, 4752, 4784, 4786, 4789, 4792, 4798, 4800, 4800, 4802, 4805, 4808,\n 4822, 4824, 4880, 4882, 4885, 4888, 4954, 4957, 4959, 4992, 5007, 5024, 5108,\n 5121, 5740, 5743, 5759, 5761, 5786, 5792, 5866, 5870, 5872, 5888, 5900, 5902,\n 5908, 5920, 5940, 5952, 5971, 5984, 5996, 5998, 6000, 6002, 6003, 6016, 6099,\n 6103, 6103, 6108, 6109, 6112, 6121, 6155, 6157, 6160, 6169, 6176, 6263, 6272,\n 6314, 6320, 6389, 6400, 6428, 6432, 6443, 6448, 6459, 6470, 6509, 6512, 6516,\n 6528, 6571, 6576, 6601, 6608, 6617, 6656, 6683, 6688, 6750, 6752, 6780, 6783,\n 6793, 6800, 6809, 6823, 6823, 6912, 6987, 6992, 7001, 7019, 7027, 7040, 7155,\n 7168, 7223, 7232, 7241, 7245, 7293, 7376, 7378, 7380, 7414, 7424, 7654, 7676,\n 7957, 7960, 7965, 7968, 8005, 8008, 8013, 8016, 8023, 8025, 8025, 8027, 8027,\n 8029, 8029, 8031, 8061, 8064, 8116, 8118, 8124, 8126, 8126, 8130, 8132, 8134,\n 8140, 8144, 8147, 8150, 8155, 8160, 8172, 8178, 8180, 8182, 8188, 8204, 8205,\n 8255, 8256, 8276, 8276, 8305, 8305, 8319, 8319, 8336, 8348, 8400, 8412, 8417,\n 8417, 8421, 8432, 8450, 8450, 8455, 8455, 8458, 8467, 8469, 8469, 8473, 8477,\n 8484, 8484, 8486, 8486, 8488, 8488, 8490, 8493, 8495, 8505, 8508, 8511, 8517,\n 8521, 8526, 8526, 8544, 8584,\n 11264, 11310, 11312, 11358, 11360, 11492, 11499, 11507, 11520, 11557, 11559,\n 11559, 11565, 11565, 11568, 11623, 11631, 11631, 11647, 11670, 11680, 11686,\n 11688, 11694, 11696, 11702, 11704, 11710, 11712, 11718, 11720, 11726, 11728,\n 11734, 11736, 11742, 11744, 11775, 11823, 11823, 12293, 12295, 12321, 12335,\n 12337, 12341, 12344, 12348, 12353, 12438, 12441, 12442, 12445, 12447, 12449,\n 12538, 12540, 12543, 12549, 12589, 12593, 12686, 12704, 12730, 12784, 12799,\n 13312, 19893, 19968, 40908, 40960, 42124, 42192, 42237, 42240, 42508, 42512,\n 42539, 42560, 42607, 42612, 42621, 42623, 42647, 42655, 42737, 42775, 42783,\n 42786, 42888, 42891, 42894, 42896, 42899, 42912, 42922, 43000, 43047, 43072,\n 43123, 43136, 43204, 43216, 43225, 43232, 43255, 43259, 43259, 43264, 43309,\n 43312, 43347, 43360, 43388, 43392, 43456, 43471, 43481, 43520, 43574, 43584,\n 43597, 43600, 43609, 43616, 43638, 43642, 43643, 43648, 43714, 43739, 43741,\n 43744, 43759, 43762, 43766, 43777, 43782, 43785, 43790, 43793, 43798, 43808,\n 43814, 43816, 43822, 43968, 44010, 44012, 44013, 44016, 44025, 44032, 55203,\n 55216, 55238, 55243, 55291, 63744, 64109, 64112, 64217, 64256, 64262, 64275,\n 64279, 64285, 64296, 64298, 64310, 64312, 64316, 64318, 64318, 64320, 64321,\n 64323, 64324, 64326, 64433, 64467, 64829, 64848, 64911, 64914, 64967, 65008,\n 65019, 65024, 65039, 65056, 65062, 65075, 65076, 65101, 65103, 65136, 65140,\n 65142, 65276, 65296, 65305, 65313, 65338, 65343, 65343, 65345, 65370, 65382,\n 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500,\n];\n\nfunction lookupInUnicodeMap(code: u16, map: u16[]): bool {\n if (code < map[0]) return false;\n\n var lo = 0;\n var hi = map.length;\n var mid: i32;\n var midVal: u16;\n\n while (lo + 1 < hi) {\n mid = lo + ((hi - lo) >> 1);\n mid -= (mid & 1);\n midVal = map[mid];\n if (midVal <= code && code <= map[mid + 1]) {\n return true;\n }\n if (code < midVal) {\n hi = mid;\n } else {\n lo = mid + 2;\n }\n }\n return false;\n}\n\nfunction isUnicodeIdentifierStart(code: i32): bool {\n return code < 0 || code > 0xffff ? false\n : lookupInUnicodeMap(code as u16, unicodeIdentifierStart);\n}\n\nfunction isUnicodeIdentifierPart(code: i32): bool {\n return code < 0 || code > 0xffff ? false\n : lookupInUnicodeMap(code as u16, unicodeIdentifierPart);\n}\n","export function makeArray(original: Array | null = null): Array {\n if (original) {\n let cloned = new Array(original.length);\n for (let i = 0, k = original.length; i < k; ++i) unchecked(cloned[i] = original[i]);\n return cloned;\n }\n return new Array();\n}\n\nexport function makeSet(original: Set | null = null): Set {\n if (original) {\n let cloned = new Set();\n for (let v of original) cloned.add(v);\n return cloned;\n }\n return new Set();\n}\n\nexport function makeMap(original: Map | null = null, overrides: Map | null = null): Map {\n var cloned = new Map();\n if (original) {\n for (let [k, v] of original) cloned.set(k, v);\n if (overrides) for (let [k, v] of overrides) cloned.set(k, v);\n } else if (overrides) {\n for (let [k, v] of overrides) cloned.set(k, v);\n }\n return cloned;\n}\n","/** @module util *//***/\n\nimport {\n CharCode\n} from \"./charcode\";\n\nimport {\n PATH_DELIMITER\n} from \"../common\";\n\nconst separator = CharCode.SLASH;\n\n/**\n * Normalizes the specified path, removing interior placeholders.\n * Expects a posix-compatible relative path (not Windows compatible).\n */\nexport function normalizePath(path: string): string {\n var pos = 0;\n var len = path.length;\n\n // trim leading './'\n while (pos + 1 < len &&\n path.charCodeAt(pos) == CharCode.DOT &&\n path.charCodeAt(pos + 1) == separator\n ) {\n pos += 2;\n }\n\n if (pos > 0 || len < path.length) {\n path = path.substring(pos, len);\n len -= pos;\n pos = 0;\n }\n\n var atEnd: bool;\n while (pos + 1 < len) {\n atEnd = false;\n\n // we are only interested in '/.' sequences ...\n if (\n path.charCodeAt(pos) == separator &&\n path.charCodeAt(pos + 1) == CharCode.DOT\n ) {\n // '/.' ( '/' | $ )\n atEnd = pos + 2 == len;\n if (atEnd ||\n pos + 2 < len &&\n path.charCodeAt(pos + 2) == separator\n ) {\n path = atEnd\n ? path.substring(0, pos)\n : path.substring(0, pos) + path.substring(pos + 2);\n len -= 2;\n continue;\n }\n\n // '/.' ( './' | '.' $ )\n atEnd = pos + 3 == len;\n if (atEnd && path.charCodeAt(pos + 2) == CharCode.DOT ||\n pos + 3 < len &&\n path.charCodeAt(pos + 2) == CharCode.DOT &&\n path.charCodeAt(pos + 3) == separator\n ) {\n // find preceeding '/'\n let ipos = pos;\n while (--ipos >= 0) {\n if (path.charCodeAt(ipos) == separator) {\n if (pos - ipos != 3 ||\n path.charCodeAt(ipos + 1) != CharCode.DOT ||\n path.charCodeAt(ipos + 2) != CharCode.DOT\n ) { // exclude '..' itself\n path = atEnd\n ? path.substring(0, ipos)\n : path.substring(0, ipos) + path.substring(pos + 3);\n len -= pos + 3 - ipos;\n pos = ipos - 1; // incremented again at end of loop\n }\n break;\n }\n }\n\n // if there's no preceeding '/', trim start if non-empty\n if (ipos < 0 && pos > 0) {\n if (pos != 2 ||\n path.charCodeAt(0) != CharCode.DOT ||\n path.charCodeAt(1) != CharCode.DOT\n ) { // exclude '..' itself\n path = path.substring(pos + 4);\n len = path.length;\n continue;\n }\n }\n }\n }\n pos++;\n }\n return len > 0 ? path : \".\";\n}\n\n/** Resolves the specified path relative to the specified origin. */\nexport function resolvePath(normalizedPath: string, origin: string): string {\n if (normalizedPath.startsWith(\"std/\")) {\n return normalizedPath;\n }\n return normalizePath(\n dirname(origin) + PATH_DELIMITER + normalizedPath\n );\n}\n\n/** Obtains the directory portion of a normalized path. */\nexport function dirname(normalizedPath: string): string {\n var pos = normalizedPath.length;\n if (pos <= 1) {\n if (pos == 0) return \".\";\n if (normalizedPath.charCodeAt(0) == separator) {\n return normalizedPath;\n }\n }\n while (--pos > 0) {\n if (normalizedPath.charCodeAt(pos) == separator) {\n return normalizedPath.substring(0, pos);\n }\n }\n return \".\";\n}\n","/** @module util *//***/\n\nconst indentX1 = \" \";\nconst indentX2 = \" \";\nconst indentX4 = \" \";\n\n/** Creates an indentation matching the number of specified levels. */\nexport function indent(sb: string[], level: i32): void {\n while (level >= 4) {\n sb.push(indentX4);\n level -= 4;\n }\n if (level >= 2) {\n sb.push(indentX2);\n level -= 2;\n }\n if (level) {\n sb.push(indentX1);\n }\n}\n","/** @module util *//***/\n\n/** Reads an 8-bit integer from the specified buffer. */\nexport function readI8(buffer: Uint8Array, offset: i32): i32 {\n return buffer[offset];\n}\n\n/** Writes an 8-bit integer to the specified buffer. */\nexport function writeI8(value: i32, buffer: Uint8Array, offset: i32): void {\n buffer[offset] = value;\n}\n\n/** Reads a 16-bit integer from the specified buffer. */\nexport function readI16(buffer: Uint8Array, offset: i32): i32 {\n return buffer[offset ]\n | buffer[offset + 1] << 8;\n}\n\n/** Writes a 16-bit integer to the specified buffer. */\nexport function writeI16(value: i32, buffer: Uint8Array, offset: i32): void {\n buffer[offset ] = value;\n buffer[offset + 1] = value >>> 8;\n}\n\n/** Reads a 32-bit integer from the specified buffer. */\nexport function readI32(buffer: Uint8Array, offset: i32): i32 {\n return buffer[offset ]\n | buffer[offset + 1] << 8\n | buffer[offset + 2] << 16\n | buffer[offset + 3] << 24;\n}\n\n/** Writes a 32-bit integer to the specified buffer. */\nexport function writeI32(value: i32, buffer: Uint8Array, offset: i32): void {\n buffer[offset ] = value;\n buffer[offset + 1] = value >>> 8;\n buffer[offset + 2] = value >>> 16;\n buffer[offset + 3] = value >>> 24;\n}\n\n/** Reads a 64-bit integer from the specified buffer. */\nexport function readI64(buffer: Uint8Array, offset: i32): I64 {\n var lo = readI32(buffer, offset);\n var hi = readI32(buffer, offset + 4);\n return i64_new(lo, hi);\n}\n\n/** Writes a 64-bit integer to the specified buffer. */\nexport function writeI64(value: I64, buffer: Uint8Array, offset: i32): void {\n writeI32(i64_low(value), buffer, offset);\n writeI32(i64_high(value), buffer, offset + 4);\n}\n\n/** Reads a 32-bit float from the specified buffer. */\nexport function readF32(buffer: Uint8Array, offset: i32): f32 {\n return i32_as_f32(readI32(buffer, offset));\n}\n\n/** Writes a 32-bit float to the specified buffer. */\nexport function writeF32(value: f32, buffer: Uint8Array, offset: i32): void {\n writeI32(f32_as_i32(value), buffer, offset);\n}\n\n/** Reads a 64-bit float from the specified buffer. */\nexport function readF64(buffer: Uint8Array, offset: i32): f64 {\n return i64_as_f64(readI64(buffer, offset));\n}\n\n/** Writes a 64-bit float to the specified buffer. */\nexport function writeF64(value: f64, buffer: Uint8Array, offset: i32): void {\n var valueI64 = f64_as_i64(value);\n writeI32(i64_low(valueI64), buffer, offset);\n writeI32(i64_high(valueI64), buffer, offset + 4);\n}\n","/**\n * Low-level C-like compiler API.\n * @module index\n *//***/\n\nimport {\n Compiler,\n Options,\n Target,\n Feature\n} from \"./compiler\";\n\nimport {\n Decompiler\n} from \"./decompiler\";\n\nimport {\n IDLBuilder,\n TSDBuilder\n} from \"./definitions\";\n\nimport {\n DiagnosticMessage,\n DiagnosticCategory,\n formatDiagnosticMessage\n} from \"./diagnostics\";\n\nimport {\n Module\n} from \"./module\";\n\nimport {\n Parser\n} from \"./parser\";\n\nimport {\n Program\n} from \"./program\";\n\n/** Parses a source file. If `parser` has been omitted a new one is created. */\nexport function parseFile(text: string, path: string, isEntry: bool = false,\n parser: Parser | null = null\n): Parser {\n if (!parser) parser = new Parser();\n parser.parseFile(text, path, isEntry);\n return parser;\n}\n\n/** Obtains the next required file's path. Returns `null` once complete. */\nexport function nextFile(parser: Parser): string | null {\n return parser.nextFile();\n}\n\n/** Obtains the next diagnostic message. Returns `null` once complete. */\nexport function nextDiagnostic(parser: Parser): DiagnosticMessage | null {\n var program = parser.program;\n return program.diagnosticsOffset < program.diagnostics.length\n ? program.diagnostics[program.diagnosticsOffset++]\n : null;\n}\n\n/** Formats a diagnostic message to a string. */\nexport { formatDiagnosticMessage as formatDiagnostic };\n\n/** Tests whether a diagnostic is informatory. */\nexport function isInfo(message: DiagnosticMessage): bool {\n return message.category == DiagnosticCategory.INFO;\n}\n\n/** Tests whether a diagnostic is a warning. */\nexport function isWarning(message: DiagnosticMessage): bool {\n return message.category == DiagnosticCategory.WARNING;\n}\n\n/** Tests whether a diagnostic is an error. */\nexport function isError(message: DiagnosticMessage): bool {\n return message.category == DiagnosticCategory.ERROR;\n}\n\n/** Creates a new set of compiler options. */\nexport function createOptions(): Options {\n return new Options();\n}\n\n/** Sets the `target` option. */\nexport function setTarget(options: Options, target: Target): void {\n options.target = target;\n}\n\n/** Sets the `noAssert` option. */\nexport function setNoAssert(options: Options, noAssert: bool): void {\n options.noAssert = noAssert;\n}\n\n/** Sets the `importMemory` option. */\nexport function setImportMemory(options: Options, importMemory: bool): void {\n options.importMemory = importMemory;\n}\n\n/** Sets the `sharedMemory` option. */\nexport function setSharedMemory(options: Options, sharedMemory: i32): void {\n options.sharedMemory = sharedMemory;\n}\n\n/** Sets the `importTable` option. */\nexport function setImportTable(options: Options, importTable: bool): void {\n options.importTable = importTable;\n}\n\n/** Sets the `sourceMap` option. */\nexport function setSourceMap(options: Options, sourceMap: bool): void {\n options.sourceMap = sourceMap;\n}\n\n/** Sets the `memoryBase` option. */\nexport function setMemoryBase(options: Options, memoryBase: u32): void {\n options.memoryBase = memoryBase;\n}\n\n/** Sets a 'globalAliases' value. */\nexport function setGlobalAlias(options: Options, name: string, alias: string): void {\n var globalAliases = options.globalAliases;\n if (!globalAliases) options.globalAliases = globalAliases = new Map();\n globalAliases.set(name, alias);\n}\n\n/** Sign extension operations. */\nexport const FEATURE_SIGN_EXTENSION = Feature.SIGN_EXTENSION;\n/** Mutable global imports and exports. */\nexport const FEATURE_MUTABLE_GLOBAL = Feature.MUTABLE_GLOBAL;\n/** Bulk memory operations. */\nexport const FEATURE_BULK_MEMORY = Feature.BULK_MEMORY;\n/** SIMD types and operations. */\nexport const FEATURE_SIMD = Feature.SIMD;\n/** Threading and atomic operations. */\nexport const FEATURE_THREADS = Feature.THREADS;\n\n/** Enables a specific feature. */\nexport function enableFeature(options: Options, feature: Feature): void {\n options.features |= feature;\n}\n\n/** Gives the compiler a hint at the optimize levels that will be used later on. */\nexport function setOptimizeLevelHints(options: Options, optimizeLevel: i32, shrinkLevel: i32): void {\n options.optimizeLevelHint = optimizeLevel;\n options.shrinkLevelHint = shrinkLevel;\n}\n\n/** Finishes parsing. */\nexport function finishParsing(parser: Parser): Program {\n return parser.finish();\n}\n\n/** Compiles the sources computed by the parser to a module. */\nexport function compileProgram(program: Program, options: Options | null = null): Module {\n return new Compiler(program, options).compile();\n}\n\n/** Decompiles a module to its (low level) source. */\nexport function decompileModule(module: Module): string {\n var decompiler = new Decompiler();\n decompiler.decompile(module);\n return decompiler.finish();\n}\n\n/** Builds WebIDL definitions for the specified program. */\nexport function buildIDL(program: Program): string {\n return IDLBuilder.build(program);\n}\n\n/** Builds TypeScript definitions for the specified program. */\nexport function buildTSD(program: Program): string {\n return TSDBuilder.build(program);\n}\n\n/** Prefix indicating a library file. */\nexport { LIBRARY_PREFIX } from \"./common\";\n\n// Full API\nexport * from \"./ast\";\n// export * from \"./binary\";\nexport * from \"./common\";\nexport * from \"./compiler\";\nexport * from \"./decompiler\";\nexport * from \"./definitions\";\nexport * from \"./diagnosticMessages.generated\";\nexport * from \"./diagnostics\";\nexport * from \"./flow\";\nexport * from \"./module\";\nexport * from \"./parser\";\nexport * from \"./program\";\nexport * from \"./resolver\";\nexport * from \"./tokenizer\";\nexport * from \"./types\";\nexport * from \"./util\";\n"],"sourceRoot":""} \ No newline at end of file